UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

485 lines (484 loc) 26.3 kB
import { n as resolveGlobalMap } from "./global-singleton-Dc_stLtU.js"; import { l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js"; import { At as boolean, Bt as discriminatedUnion, Et as array, Rn as string, Tn as object, Xn as union, Zn as unknown, dn as literal, wn as number, yt as _enum } from "./schemas-zxit8y5H.js"; import { n as normalizeAgentId } from "./agent-id-CeT3w4ap.js"; import "./session-key-BnWWjqNc.js"; import { r as normalizeOptionalAccountId } from "./account-id-CETVCrTz.js"; import { t as safeEqualSecret } from "./secret-equal-DRsL8lKD.js"; import { T as validateAgentRunDelegatedAuthority, s as getActiveAgentRunDelegatedAuthority } from "./agent-run-registry-CKYKdfNd.js"; import { t as normalizeChatType } from "./chat-type-CG0X_HJM.js"; import { o as parseExecutionIdentityAdmissionToken } from "./execution-identity-admission-Ch95Lxwv.js"; import "./exec-approvals-BSZ-fPIY.js"; import { i as loadExecApprovalsAsync, n as ensureExecApprovalsSnapshot } from "./exec-approvals-store-DBR0neS0.js"; import { r as resolveMessageActionTurnCapability } from "./message-action-turn-capability-CpL-pT1E.js"; import { createHmac, randomUUID } from "node:crypto"; //#region src/gateway/agent-runtime-execution-lineage.ts const AGENT_RUNTIME_EXECUTION_LINEAGE = Symbol("agentRuntimeExecutionLineage"); const AGENT_RUNTIME_EXECUTION_LINEAGE_REDEMPTION = Symbol("agentRuntimeExecutionLineageRedemption"); const EXECUTION_LINEAGE_HANDOFF_TTL_MS = 6e4; const MAX_EXECUTION_LINEAGE_HANDOFFS = 256; function hasAgentRuntimeExecutionLineageRedemption(identity) { return AGENT_RUNTIME_EXECUTION_LINEAGE_REDEMPTION in identity; } const executionLineageHandoffs = resolveGlobalMap(Symbol.for("openclaw.agentRuntimeExecutionLineageHandoffs"), (handoffs) => handoffs.clear()); function sameOperationalRunInstance(left, right) { return left.instanceId === right.instanceId && left.runId === right.runId; } function pruneExecutionLineageHandoffs(nowMs) { for (const [id, handoff] of executionLineageHandoffs) if (handoff.expiresAtMs <= nowMs || !validateAgentRunDelegatedAuthority(handoff.delegatedAuthority)) executionLineageHandoffs.delete(id); while (executionLineageHandoffs.size >= MAX_EXECUTION_LINEAGE_HANDOFFS) { const oldest = executionLineageHandoffs.keys().next().value; if (typeof oldest !== "string") break; executionLineageHandoffs.delete(oldest); } } /** Add process-local lineage without expanding or serializing the spawn context. */ function withAgentRuntimeExecutionLineage(context, lineage) { return { ...context, [AGENT_RUNTIME_EXECUTION_LINEAGE]: lineage }; } function readAgentRuntimeExecutionLineage(context) { return context?.[AGENT_RUNTIME_EXECUTION_LINEAGE]; } /** Register a local one-shot handoff; its opaque id is correlation, never authority. */ function createAgentRuntimeExecutionLineageHandoff(params) { if (!readAgentRuntimeExecutionLineage(params.sessionSpawnContext) || !validateAgentRunDelegatedAuthority(params.delegatedAuthority)) return; if (!sameOperationalRunInstance(params.operationalRunInstance, params.delegatedAuthority.operationalRunInstance) || params.executionIdentity !== void 0 && params.executionIdentity.runId !== params.operationalRunInstance.runId) throw new Error("execution lineage handoff disagrees with its parent admission"); const nowMs = Date.now(); pruneExecutionLineageHandoffs(nowMs); const id = randomUUID(); executionLineageHandoffs.set(id, Object.freeze({ agentId: params.agentId, sessionKey: params.sessionKey, operationalRunInstance: params.operationalRunInstance, delegatedAuthority: params.delegatedAuthority, ...params.executionIdentity ? { executionIdentity: params.executionIdentity } : {}, sessionSpawnContext: params.sessionSpawnContext, expiresAtMs: nowMs + EXECUTION_LINEAGE_HANDOFF_TTL_MS })); return Object.freeze({ id, revoke: () => { executionLineageHandoffs.delete(id); } }); } /** Redeem the host-owned handoff while binding it to the exact signed parent owner. */ function redeemAgentRuntimeExecutionLineageHandoff(params) { const handoff = executionLineageHandoffs.get(params.id); executionLineageHandoffs.delete(params.id); if (!handoff || handoff.expiresAtMs <= Date.now() || handoff.agentId !== params.agentId || handoff.sessionKey !== params.sessionKey || !sameOperationalRunInstance(handoff.operationalRunInstance, params.operationalRunInstance) || handoff.delegatedAuthority.claimId !== params.delegatedAuthority.claimId || handoff.delegatedAuthority.lifecycleGeneration !== params.delegatedAuthority.lifecycleGeneration || !validateAgentRunDelegatedAuthority(handoff.delegatedAuthority)) return; let consumed = false; return Object.freeze({ ...handoff.executionIdentity ? { executionIdentity: handoff.executionIdentity } : {}, sessionSpawnContext: handoff.sessionSpawnContext, redemption: Object.freeze({ consume: () => { if (consumed || !validateAgentRunDelegatedAuthority(handoff.delegatedAuthority)) return false; consumed = true; return true; } }) }); } function withAgentRuntimeExecutionLineageRedemption(identity, redemption) { return { ...identity, [AGENT_RUNTIME_EXECUTION_LINEAGE_REDEMPTION]: redemption }; } /** Direct in-process lineage needs no redemption; handed-off lineage is one-shot. */ function consumeAgentRuntimeExecutionLineage(identity) { return hasAgentRuntimeExecutionLineageRedemption(identity) ? identity[AGENT_RUNTIME_EXECUTION_LINEAGE_REDEMPTION].consume() : true; } //#endregion //#region src/gateway/agent-runtime-identity-token.ts const AGENT_RUNTIME_IDENTITY_TOKEN_CONTEXT = "openclaw:gateway-agent-runtime-identity-token:v1"; const AGENT_RUNTIME_IDENTITY_TOKEN_KIND = "agent-runtime"; const MESSAGE_ACTION_TOKEN_TTL_MS = 6e4; const CRON_SELF_MANAGEMENT_TOKEN_TTL_MS = 6e4; const normalizedRequiredStringSchema = string().transform(normalizeOptionalString).pipe(string()); const ignoredOptionalStringSchema = unknown().transform(normalizeOptionalString).optional(); const safeNonNegativeIntegerSchema = number().refine(Number.isSafeInteger).refine((value) => value >= 0); const operationalRunInstanceSchema = object({ instanceId: normalizedRequiredStringSchema, runId: normalizedRequiredStringSchema }); const workerTurnClaimSchema = object({ sessionId: normalizedRequiredStringSchema, claimId: normalizedRequiredStringSchema, runId: normalizedRequiredStringSchema, placementGeneration: safeNonNegativeIntegerSchema, owner: object({ kind: literal("worker"), environmentId: normalizedRequiredStringSchema, ownerEpoch: safeNonNegativeIntegerSchema }) }).transform((claim) => ({ sessionId: claim.sessionId, claimId: claim.claimId, runId: claim.runId, placementGeneration: claim.placementGeneration, owner: claim.owner })); const delegatedAuthoritySchema = discriminatedUnion("kind", [object({ kind: literal("local"), lifecycleGeneration: normalizedRequiredStringSchema, claimId: normalizedRequiredStringSchema, operationalRunInstance: operationalRunInstanceSchema }), object({ kind: literal("worker"), lifecycleGeneration: normalizedRequiredStringSchema, claimId: normalizedRequiredStringSchema, operationalRunInstance: operationalRunInstanceSchema, turnClaim: workerTurnClaimSchema })]); const stringListSchema = array(string()).transform((entries) => entries.map((entry) => entry.trim()).filter(Boolean)); const sessionSpawnContextSchema = object({ completionOwnerSessionKey: normalizedRequiredStringSchema.optional(), inheritedToolPolicy: object({ version: literal(1), allow: stringListSchema, deny: stringListSchema }) }).transform((context) => ({ ...context.completionOwnerSessionKey ? { completionOwnerSessionKey: context.completionOwnerSessionKey } : {}, inheritedToolPolicy: context.inheritedToolPolicy })); const cronCreatorAuthorityGrantSchema = object({ runId: normalizedRequiredStringSchema, token: normalizedRequiredStringSchema }).transform((grant) => grant); const messageActionToolContextSchema = object({ currentChannelId: ignoredOptionalStringSchema, currentChatType: unknown().transform((value) => normalizeChatType(typeof value === "string" ? value : void 0)).optional(), currentMessagingTarget: ignoredOptionalStringSchema, currentGraphChannelId: ignoredOptionalStringSchema, currentChannelProvider: ignoredOptionalStringSchema, currentThreadTs: ignoredOptionalStringSchema, currentMessageId: union([string(), number()]).optional(), currentSourceTurnId: ignoredOptionalStringSchema, replyToMode: _enum([ "off", "first", "all", "batched" ]).optional(), hasRepliedRef: object({ value: boolean() }).optional(), sameChannelThreadRequired: boolean().optional().catch(void 0), skipCrossContextDecoration: boolean().optional().catch(void 0) }).transform((context) => ({ ...context, currentChannelProvider: context.currentChannelProvider })); const messageActionContextSchema = object({ expiresAtMs: number().finite(), turnCapability: normalizedRequiredStringSchema.optional(), sourceReplyFinal: boolean().optional(), sourceReplyToolCallId: normalizedRequiredStringSchema.optional(), sessionId: ignoredOptionalStringSchema, sourceReplySessionKey: ignoredOptionalStringSchema, requesterAccountId: ignoredOptionalStringSchema, requesterSenderId: ignoredOptionalStringSchema, requesterSenderName: ignoredOptionalStringSchema, requesterSenderUsername: ignoredOptionalStringSchema, requesterSenderE164: ignoredOptionalStringSchema, toolContext: messageActionToolContextSchema.optional() }); const cronSelfManagementContextSchema = object({ jobId: normalizedRequiredStringSchema, expiresAtMs: number().finite() }); const agentRuntimeIdentityTokenPayloadSchema = object({ kind: literal(AGENT_RUNTIME_IDENTITY_TOKEN_KIND), agentId: string(), sessionKey: string(), operationalRunInstance: operationalRunInstanceSchema, delegatedAuthority: delegatedAuthoritySchema, approvalOwnerPluginId: string().optional().catch(void 0), executionIdentity: unknown().optional(), turnSourceChannel: string().optional().catch(void 0), turnSourceLocal: literal(true).optional(), turnSourceTo: string().optional().catch(void 0), turnSourceAccountId: string().optional().catch(void 0), turnSourceThreadId: union([string(), number()]).optional().catch(void 0), messageActionContext: messageActionContextSchema.optional(), cronSelfManagementContext: cronSelfManagementContextSchema.optional(), cronToolsAllowCapture: literal("final-executable-surface").optional(), cronExecToolTarget: object({ host: literal("gateway"), ask: literal("always").optional() }).optional(), cronCreatorAuthorityGrant: cronCreatorAuthorityGrantSchema.optional(), cronManagementGrant: cronCreatorAuthorityGrantSchema.optional(), sessionSpawnContext: sessionSpawnContextSchema.optional(), executionLineageHandoffId: normalizedRequiredStringSchema.optional() }); function decodeDelegatedAuthority(value, operationalRunInstance) { const { lifecycleGeneration, claimId } = value; const { instanceId, runId } = value.operationalRunInstance; if (!lifecycleGeneration || !claimId || instanceId !== operationalRunInstance.instanceId || runId !== operationalRunInstance.runId) return; const owner = { operationalRunInstance, lifecycleGeneration, claimId }; if (value.kind === "local") return { kind: "local", ...owner }; return value.turnClaim.runId === operationalRunInstance.runId ? { kind: "worker", ...owner, turnClaim: value.turnClaim } : void 0; } async function readSharedAgentRuntimeIdentitySecret() { return (await loadExecApprovalsAsync()).socket?.token?.trim() || null; } async function requireSharedAgentRuntimeIdentitySecret() { const token = (await ensureExecApprovalsSnapshot()).file.socket?.token?.trim(); if (!token) throw new Error("Unable to mint agent runtime identity token without local socket credentials."); return token; } function signPayload(secret, payload) { return createHmac("sha256", secret).update(AGENT_RUNTIME_IDENTITY_TOKEN_CONTEXT).update("\0").update(payload).digest("base64url"); } function encodePayload(payload) { return Buffer.from(JSON.stringify(payload), "utf8").toString("base64url"); } function decodeMessageActionContext(value, nowMs) { if (nowMs >= value.expiresAtMs) return; const context = { expiresAtMs: value.expiresAtMs, turnCapability: value.turnCapability, sessionId: value.sessionId, sourceReplySessionKey: value.sourceReplySessionKey, requesterAccountId: value.requesterAccountId, requesterSenderId: value.requesterSenderId, requesterSenderName: value.requesterSenderName, requesterSenderUsername: value.requesterSenderUsername, requesterSenderE164: value.requesterSenderE164, toolContext: value.toolContext }; if (value.sourceReplyFinal === true) { if (!value.sourceReplyToolCallId) return; return { ...context, sourceReplyFinal: true, sourceReplyToolCallId: value.sourceReplyToolCallId }; } return { ...context, ...value.sourceReplyFinal === false ? { sourceReplyFinal: false } : {}, ...value.sourceReplyToolCallId ? { sourceReplyToolCallId: value.sourceReplyToolCallId } : {} }; } function decodePayload(value, nowMs) { try { const parsed = JSON.parse(Buffer.from(value, "base64url").toString("utf8")); const result = agentRuntimeIdentityTokenPayloadSchema.safeParse(parsed); if (!result.success) return; const raw = result.data; const agentId = normalizeAgentId(raw.agentId); const sessionKey = raw.sessionKey.trim(); const approvalOwnerPluginId = normalizeOptionalString(raw.approvalOwnerPluginId); const operationalInstanceId = raw.operationalRunInstance.instanceId; const operationalRunId = raw.operationalRunInstance.runId; const turnSourceAccountId = normalizeOptionalAccountId(raw.turnSourceAccountId); const turnSourceChannel = normalizeOptionalString(raw.turnSourceChannel); const turnSourceLocal = raw.turnSourceLocal; if (turnSourceLocal && turnSourceChannel) return; const turnSourceTo = normalizeOptionalString(raw.turnSourceTo); const turnSourceThreadId = raw.turnSourceThreadId; if (!agentId || !sessionKey || !operationalInstanceId || !operationalRunId) return; const operationalRunInstance = Object.freeze({ instanceId: operationalInstanceId, runId: operationalRunId }); const delegatedAuthority = decodeDelegatedAuthority(raw.delegatedAuthority, operationalRunInstance); if (!delegatedAuthority) return; const messageActionContext = raw.messageActionContext ? decodeMessageActionContext(raw.messageActionContext, nowMs) : void 0; if (raw.messageActionContext !== void 0 && !messageActionContext) return; const cronSelfManagementContext = raw.cronSelfManagementContext && nowMs < raw.cronSelfManagementContext.expiresAtMs ? raw.cronSelfManagementContext : void 0; if (raw.cronSelfManagementContext !== void 0 && !cronSelfManagementContext) return; const sessionSpawnContext = raw.sessionSpawnContext; const executionLineageHandoffId = raw.executionLineageHandoffId; const cronToolsAllowCapture = raw.cronToolsAllowCapture; const cronExecToolTarget = cronToolsAllowCapture ? raw.cronExecToolTarget : void 0; const cronCreatorAuthorityGrant = raw.cronCreatorAuthorityGrant; if (cronCreatorAuthorityGrant && !cronToolsAllowCapture) return; let executionIdentity; if (raw.executionIdentity !== void 0) try { executionIdentity = parseExecutionIdentityAdmissionToken(raw.executionIdentity); } catch { return; } if (executionIdentity?.runId !== operationalRunId) executionIdentity = void 0; return { kind: AGENT_RUNTIME_IDENTITY_TOKEN_KIND, agentId, sessionKey, operationalRunInstance, delegatedAuthority, ...approvalOwnerPluginId ? { approvalOwnerPluginId } : {}, ...turnSourceChannel ? { turnSourceChannel } : {}, ...turnSourceLocal ? { turnSourceLocal } : {}, ...turnSourceTo ? { turnSourceTo } : {}, ...turnSourceAccountId ? { turnSourceAccountId } : {}, ...turnSourceThreadId !== void 0 ? { turnSourceThreadId } : {}, ...messageActionContext ? { messageActionContext } : {}, ...cronSelfManagementContext ? { cronSelfManagementContext } : {}, ...sessionSpawnContext ? { sessionSpawnContext } : {}, ...executionLineageHandoffId ? { executionLineageHandoffId } : {}, ...cronToolsAllowCapture ? { cronToolsAllowCapture } : {}, ...cronExecToolTarget ? { cronExecToolTarget } : {}, ...cronCreatorAuthorityGrant ? { cronCreatorAuthorityGrant } : {}, ...raw.cronManagementGrant ? { cronManagementGrant: raw.cronManagementGrant } : {}, ...executionIdentity ? { executionIdentity } : {} }; } catch { return; } } function prepareAgentRuntimeIdentityTokenPayload(params) { const operationalInstanceId = normalizeOptionalString(params.operationalRunInstance.instanceId); const operationalRunId = normalizeOptionalString(params.operationalRunInstance.runId); if (!operationalInstanceId || !operationalRunId) throw new Error("agent runtime identity requires an operational run instance"); const parsedSessionSpawnContext = params.sessionSpawnContext ? sessionSpawnContextSchema.safeParse(params.sessionSpawnContext) : void 0; if (parsedSessionSpawnContext && !parsedSessionSpawnContext.success) throw new Error("agent runtime session spawn context violates its bounded contract"); const sessionSpawnContext = parsedSessionSpawnContext?.data; const executionLineageHandoffId = normalizeOptionalString(params.executionLineageHandoffId); if (executionLineageHandoffId && (sessionSpawnContext || params.executionIdentityToken)) throw new Error("execution lineage handoff cannot duplicate private spawn facts"); const activeAuthority = getActiveAgentRunDelegatedAuthority({ instanceId: operationalInstanceId, runId: operationalRunId }); if (!activeAuthority) throw new Error("agent runtime identity requires active delegated run authority"); if (params.workerTurnClaim && (params.workerTurnClaim.owner.kind !== "worker" || params.workerTurnClaim.runId !== operationalRunId)) throw new Error("worker delegated authority disagrees with the operational run"); const approvalAuthority = params.approvalAuthority ?? activeAuthority; if (approvalAuthority.operationalRunInstance.instanceId !== operationalInstanceId || approvalAuthority.operationalRunInstance.runId !== operationalRunId || !validateAgentRunDelegatedAuthority(approvalAuthority)) throw new Error("agent runtime approval authority is no longer active"); const delegatedAuthority = params.workerTurnClaim ? { kind: "worker", ...approvalAuthority, turnClaim: params.workerTurnClaim } : { kind: "local", ...approvalAuthority }; if (params.cronCreatorAuthorityGrant && params.cronToolsAllowCapture !== "final-executable-surface") throw new Error("cron creator authority grants require final tool-surface provenance"); if (params.messageActionContext?.sourceReplyFinal === true && !normalizeOptionalString(params.messageActionContext.sourceReplyToolCallId)) throw new Error("terminal source reply requires tool-call correlation"); const messageActionContext = params.messageActionContext ? { ...params.messageActionContext, expiresAtMs: Math.min(params.messageActionContext.expiresAtMs, Date.now() + MESSAGE_ACTION_TOKEN_TTL_MS) } : void 0; const turnSourceAccountId = normalizeOptionalAccountId(params.turnSourceAccountId); const turnSourceChannel = normalizeOptionalString(params.turnSourceChannel); if (params.turnSourceLocal === true && turnSourceChannel) throw new Error("agent runtime turn source cannot be both local and channel-bound"); const turnSourceTo = normalizeOptionalString(params.turnSourceTo); const turnSourceThreadId = typeof params.turnSourceThreadId === "string" ? normalizeOptionalString(params.turnSourceThreadId) : params.turnSourceThreadId; const cronSelfManagementJobId = normalizeOptionalString(params.cronSelfManagementJobId); const cronSelfManagementContext = cronSelfManagementJobId ? { jobId: cronSelfManagementJobId, expiresAtMs: Date.now() + CRON_SELF_MANAGEMENT_TOKEN_TTL_MS } : void 0; return encodePayload({ kind: AGENT_RUNTIME_IDENTITY_TOKEN_KIND, agentId: normalizeAgentId(params.agentId), sessionKey: params.sessionKey.trim(), operationalRunInstance: { instanceId: operationalInstanceId, runId: operationalRunId }, delegatedAuthority, ...normalizeOptionalString(params.approvalOwnerPluginId) ? { approvalOwnerPluginId: normalizeOptionalString(params.approvalOwnerPluginId) } : {}, ...turnSourceChannel ? { turnSourceChannel } : {}, ...params.turnSourceLocal === true ? { turnSourceLocal: true } : {}, ...turnSourceTo ? { turnSourceTo } : {}, ...turnSourceAccountId ? { turnSourceAccountId } : {}, ...turnSourceThreadId !== void 0 ? { turnSourceThreadId } : {}, ...messageActionContext ? { messageActionContext } : {}, ...cronSelfManagementContext ? { cronSelfManagementContext } : {}, ...params.cronToolsAllowCapture === "final-executable-surface" ? { cronToolsAllowCapture: params.cronToolsAllowCapture } : {}, ...params.cronToolsAllowCapture === "final-executable-surface" && params.cronExecToolTarget?.host === "gateway" ? { cronExecToolTarget: { ...params.cronExecToolTarget } } : {}, ...params.cronCreatorAuthorityGrant ? { cronCreatorAuthorityGrant: params.cronCreatorAuthorityGrant } : {}, ...params.cronManagementGrant ? { cronManagementGrant: params.cronManagementGrant } : {}, ...sessionSpawnContext ? { sessionSpawnContext } : {}, ...executionLineageHandoffId ? { executionLineageHandoffId } : {}, ...params.executionIdentityToken?.runId === operationalRunId ? { executionIdentity: params.executionIdentityToken } : {} }); } /** Measure the exact ASCII token size without reading signing credentials or minting a bearer. */ function measureAgentRuntimeIdentityTokenBytes(params) { const payload = prepareAgentRuntimeIdentityTokenPayload(params); return Buffer.byteLength(`${payload}.${signPayload("", payload)}`, "utf8"); } /** Mint an opaque token that lets trusted local agent-tool clients identify their agent. */ async function mintAgentRuntimeIdentityToken(params) { const payload = prepareAgentRuntimeIdentityTokenPayload(params); return `${payload}.${signPayload(await requireSharedAgentRuntimeIdentitySecret(), payload)}`; } /** Validate a presented agent runtime token and return the internal caller identity. */ async function verifyAgentRuntimeIdentityToken(value, nowMs) { const token = value?.trim(); if (!token) return; const [payloadPart, signature, ...extra] = token.split("."); if (!payloadPart || !signature || extra.length > 0) return; const sharedSecret = await readSharedAgentRuntimeIdentitySecret(); if (!sharedSecret || !safeEqualSecret(signature, signPayload(sharedSecret, payloadPart))) return; const payload = decodePayload(payloadPart, nowMs ?? Date.now()); if (!payload) return; const handoff = payload.executionLineageHandoffId ? redeemAgentRuntimeExecutionLineageHandoff({ id: payload.executionLineageHandoffId, agentId: payload.agentId, sessionKey: payload.sessionKey, operationalRunInstance: payload.operationalRunInstance, delegatedAuthority: payload.delegatedAuthority }) : void 0; if (payload.executionLineageHandoffId && !handoff) return; const identity = { kind: "agentRuntime", agentId: payload.agentId, sessionKey: payload.sessionKey, operationalRunInstance: payload.operationalRunInstance, delegatedAuthority: payload.delegatedAuthority, ...payload.approvalOwnerPluginId ? { approvalOwnerPluginId: payload.approvalOwnerPluginId } : {}, ...handoff?.executionIdentity ? { executionIdentity: handoff.executionIdentity } : payload.executionIdentity ? { executionIdentity: payload.executionIdentity } : {}, ...payload.turnSourceChannel ? { turnSourceChannel: payload.turnSourceChannel } : {}, ...payload.turnSourceLocal === true ? { turnSourceLocal: true } : {}, ...payload.turnSourceTo ? { turnSourceTo: payload.turnSourceTo } : {}, ...payload.turnSourceAccountId ? { turnSourceAccountId: payload.turnSourceAccountId } : {}, ...payload.turnSourceThreadId !== void 0 ? { turnSourceThreadId: payload.turnSourceThreadId } : {}, ...payload.messageActionContext ? { messageActionContext: payload.messageActionContext } : {}, ...payload.cronSelfManagementContext ? { cronSelfManagementContext: payload.cronSelfManagementContext } : {}, ...payload.cronToolsAllowCapture ? { cronToolsAllowCapture: payload.cronToolsAllowCapture } : {}, ...payload.cronExecToolTarget ? { cronExecToolTarget: payload.cronExecToolTarget } : {}, ...payload.cronManagementGrant ? { cronManagementGrant: payload.cronManagementGrant } : {}, ...payload.cronCreatorAuthorityGrant ? { cronCreatorAuthorityGrant: payload.cronCreatorAuthorityGrant } : {}, ...handoff?.sessionSpawnContext ? { sessionSpawnContext: handoff.sessionSpawnContext } : payload.sessionSpawnContext ? { sessionSpawnContext: payload.sessionSpawnContext } : {} }; return handoff ? withAgentRuntimeExecutionLineageRedemption(identity, handoff.redemption) : identity; } function validateAgentRuntimeDelegatedAuthority(authority, placements) { if (!validateAgentRunDelegatedAuthority(authority)) return false; return authority.kind === "local" ? true : placements?.validateTurnClaim?.(authority.turnClaim) === true; } /** Builds the use-time approval gate from the run owner and canonical worker store. */ function createAgentRuntimeApprovalAuthorityValidator(placements) { return (identity) => { if (!validateAgentRuntimeDelegatedAuthority(identity.delegatedAuthority, placements)) return false; const messageActionContext = identity.messageActionContext; if (!messageActionContext) return true; if (!messageActionContext.turnCapability) return false; return Boolean(resolveMessageActionTurnCapability({ token: messageActionContext.turnCapability, agentId: identity.agentId, runId: identity.operationalRunInstance.runId, sessionKey: identity.sessionKey, sessionId: messageActionContext.sessionId })); }; } //#endregion export { consumeAgentRuntimeExecutionLineage as a, withAgentRuntimeExecutionLineage as c, verifyAgentRuntimeIdentityToken as i, measureAgentRuntimeIdentityTokenBytes as n, createAgentRuntimeExecutionLineageHandoff as o, mintAgentRuntimeIdentityToken as r, readAgentRuntimeExecutionLineage as s, createAgentRuntimeApprovalAuthorityValidator as t };