eve 0.47.3 → 0.47.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/bin/eve.js +4 -0
  3. package/dist/src/cli/dev/tui/traces/trace-conversation.js +1 -1
  4. package/dist/src/compiled/.vendor-stamp.json +1 -1
  5. package/dist/src/compiled/@opentelemetry/api/index.d.ts +37 -0
  6. package/dist/src/compiled/@vercel/otel/index.d.ts +11 -0
  7. package/dist/src/compiler/extension-compatibility.d.ts +7 -5
  8. package/dist/src/compiler/extension-compatibility.js +1 -1
  9. package/dist/src/compiler/manifest.d.ts +14 -2
  10. package/dist/src/compiler/manifest.js +1 -1
  11. package/dist/src/compiler/normalize-connection.d.ts +9 -2
  12. package/dist/src/compiler/normalize-connection.js +1 -1
  13. package/dist/src/compiler/normalize-manifest.js +1 -1
  14. package/dist/src/compiler/validate-artifact.js +1 -1
  15. package/dist/src/context/dynamic-connection-lifecycle.d.ts +9 -0
  16. package/dist/src/context/dynamic-connection-lifecycle.js +1 -0
  17. package/dist/src/context/keys.d.ts +3 -1
  18. package/dist/src/context/memory-tools.js +1 -1
  19. package/dist/src/context/providers/connection.js +1 -1
  20. package/dist/src/dynamic/definition.d.ts +6 -3
  21. package/dist/src/dynamic/definition.js +1 -1
  22. package/dist/src/execution/authorization-callback-match.js +1 -1
  23. package/dist/src/execution/cancelled-turn-message.d.ts +2 -0
  24. package/dist/src/execution/cancelled-turn-message.js +1 -0
  25. package/dist/src/execution/dynamic-connections.d.ts +9 -0
  26. package/dist/src/execution/dynamic-connections.js +1 -0
  27. package/dist/src/execution/eve-workflow-attributes.js +1 -1
  28. package/dist/src/execution/node-step.d.ts +2 -0
  29. package/dist/src/execution/node-step.js +1 -1
  30. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  31. package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
  32. package/dist/src/execution/tools/connection-search.js +2 -2
  33. package/dist/src/execution/tools/load-skill.js +1 -1
  34. package/dist/src/execution/tools/subagent/local.js +1 -1
  35. package/dist/src/execution/turn-workflow.js +1 -1
  36. package/dist/src/execution/workflow-runtime.js +1 -1
  37. package/dist/src/execution/workflow-steps.js +1 -1
  38. package/dist/src/execution/workflow-trace-context.d.ts +3 -6
  39. package/dist/src/execution/workflow-trace-context.js +1 -1
  40. package/dist/src/harness/authorization.d.ts +11 -4
  41. package/dist/src/harness/authorization.js +1 -1
  42. package/dist/src/harness/inline-tool-authorization.d.ts +13 -1
  43. package/dist/src/harness/inline-tool-authorization.js +1 -1
  44. package/dist/src/harness/model-call-error.js +1 -1
  45. package/dist/src/harness/semantic-errors/rule.d.ts +5 -2
  46. package/dist/src/harness/semantic-errors/rules/gateway.js +1 -1
  47. package/dist/src/harness/tool-loop.js +2 -2
  48. package/dist/src/harness/turn-tag-state.d.ts +1 -1
  49. package/dist/src/harness/types.d.ts +2 -2
  50. package/dist/src/{harness → instrumentation}/ai-sdk-hook-bridge.d.ts +1 -1
  51. package/dist/src/instrumentation/ai-sdk-hook-bridge.js +1 -0
  52. package/dist/src/{harness/channel-delivery-instrumentation.d.ts → instrumentation/channel-delivery.d.ts} +5 -7
  53. package/dist/src/instrumentation/channel-delivery.js +1 -0
  54. package/dist/src/{harness/instrumentation → instrumentation}/config.d.ts +0 -10
  55. package/dist/src/instrumentation/config.js +1 -0
  56. package/dist/src/{harness/instrumentation → instrumentation}/content-policy.d.ts +1 -1
  57. package/dist/src/instrumentation/content-policy.js +1 -0
  58. package/dist/src/{harness/instrumentation → instrumentation}/content.d.ts +1 -1
  59. package/dist/src/{harness/instrumentation → instrumentation}/dispatch.d.ts +1 -1
  60. package/dist/src/instrumentation/dispatch.js +1 -0
  61. package/dist/src/{harness/instrumentation → instrumentation}/lifecycle.d.ts +26 -33
  62. package/dist/src/instrumentation/lifecycle.js +1 -0
  63. package/dist/src/{harness/instrumentation → instrumentation}/native-events.d.ts +1 -1
  64. package/dist/src/instrumentation/native-events.js +1 -0
  65. package/dist/src/{harness → instrumentation}/parent-lineage.d.ts +1 -1
  66. package/dist/src/{harness → instrumentation}/prepare-trace-context.d.ts +8 -5
  67. package/dist/src/instrumentation/prepare-trace-context.js +1 -0
  68. package/dist/src/instrumentation/provider.d.ts +13 -9
  69. package/dist/src/{harness/instrumentation → instrumentation}/providers.d.ts +1 -1
  70. package/dist/src/instrumentation/providers.js +1 -0
  71. package/dist/src/{harness/instrumentation → instrumentation}/runtime-context.d.ts +13 -2
  72. package/dist/src/instrumentation/runtime-context.js +1 -0
  73. package/dist/src/instrumentation/runtime.d.ts +100 -0
  74. package/dist/src/instrumentation/runtime.js +1 -0
  75. package/dist/src/{harness/instrumentation → instrumentation}/state.d.ts +2 -11
  76. package/dist/src/internal/application/compiled-artifacts.js +3 -3
  77. package/dist/src/internal/application/package.js +1 -1
  78. package/dist/src/internal/authored-definition/connection.js +1 -1
  79. package/dist/src/internal/instrumentation.d.ts +1 -1
  80. package/dist/src/internal/nitro/routes/channel-request-instrumentation.d.ts +4 -6
  81. package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
  82. package/dist/src/packages/eve-catalog/src/index.js +1 -1
  83. package/dist/src/public/channels/slack/defaults.js +6 -3
  84. package/dist/src/public/channels/slack/index.d.ts +1 -1
  85. package/dist/src/public/channels/slack/interactions.d.ts +8 -5
  86. package/dist/src/public/channels/slack/interactions.js +1 -1
  87. package/dist/src/public/channels/slack/slackChannel.d.ts +66 -1
  88. package/dist/src/public/channels/slack/slash-command.d.ts +9 -0
  89. package/dist/src/public/channels/slack/slash-command.js +1 -0
  90. package/dist/src/public/connections/index.d.ts +2 -0
  91. package/dist/src/public/connections/index.js +1 -1
  92. package/dist/src/public/definitions/connections/dynamic.d.ts +23 -0
  93. package/dist/src/public/definitions/connections/dynamic.js +1 -0
  94. package/dist/src/public/definitions/connections/mcp.d.ts +8 -0
  95. package/dist/src/public/definitions/connections/openapi.d.ts +8 -0
  96. package/dist/src/public/definitions/connections/protocol.d.ts +6 -0
  97. package/dist/src/public/definitions/connections/protocol.js +1 -1
  98. package/dist/src/runtime/connections/authorization-tokens.d.ts +11 -10
  99. package/dist/src/runtime/connections/instance-identity.d.ts +12 -0
  100. package/dist/src/runtime/connections/instance-identity.js +1 -0
  101. package/dist/src/runtime/connections/mcp-client.js +1 -1
  102. package/dist/src/runtime/connections/registry.d.ts +2 -0
  103. package/dist/src/runtime/connections/registry.js +1 -1
  104. package/dist/src/runtime/connections/scoped-authorization.d.ts +10 -6
  105. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  106. package/dist/src/runtime/resolve-agent.js +1 -1
  107. package/dist/src/runtime/resolve-connection.d.ts +5 -0
  108. package/dist/src/runtime/resolve-connection.js +1 -1
  109. package/dist/src/runtime/resolve-dynamic-connection.d.ts +5 -0
  110. package/dist/src/runtime/resolve-dynamic-connection.js +1 -0
  111. package/dist/src/runtime/types.d.ts +11 -0
  112. package/dist/src/setup/flows/registry.js +1 -1
  113. package/dist/src/setup/scaffold/create/project.js +1 -1
  114. package/dist/src/shared/trace-policy.d.ts +20 -0
  115. package/dist/src/shared/trace-policy.js +1 -0
  116. package/dist/src/tracing/agent-action-instrumentation.d.ts +1 -1
  117. package/dist/src/tracing/agent-action-instrumentation.js +1 -1
  118. package/dist/src/tracing/agent-approval-instrumentation.d.ts +1 -1
  119. package/dist/src/tracing/agent-channel-delivery-instrumentation.d.ts +1 -1
  120. package/dist/src/tracing/agent-channel-delivery-instrumentation.js +1 -1
  121. package/dist/src/tracing/agent-otel-provider.d.ts +2 -2
  122. package/dist/src/tracing/agent-otel-provider.js +2 -2
  123. package/dist/src/tracing/agent-otel-runtime-context.d.ts +5 -0
  124. package/dist/src/tracing/agent-otel-runtime-context.js +1 -0
  125. package/dist/src/tracing/agent-otel-session-context.d.ts +1 -1
  126. package/dist/src/tracing/agent-otel-session-context.js +1 -1
  127. package/dist/src/tracing/agent-otel-usage.d.ts +4 -2
  128. package/dist/src/tracing/agent-otel-usage.js +1 -1
  129. package/dist/src/tracing/agent-span-id-generator.d.ts +1 -1
  130. package/dist/src/tracing/agent-tool-instrumentation.d.ts +1 -1
  131. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  132. package/dist/src/tracing/agent-trace-context-store.d.ts +3 -0
  133. package/dist/src/tracing/agent-trace-context-store.js +1 -1
  134. package/dist/src/tracing/agent-trace-context.d.ts +3 -0
  135. package/dist/src/tracing/agent-trace-context.js +1 -0
  136. package/dist/src/tracing/agent-trace-state.d.ts +8 -1
  137. package/dist/src/tracing/agent-trace-state.js +1 -1
  138. package/dist/src/tracing/install-instrumentation-runtime.d.ts +3 -2
  139. package/dist/src/tracing/install-instrumentation-runtime.js +1 -1
  140. package/dist/src/tracing/local-instrumentation-runtime.d.ts +1 -1
  141. package/dist/src/tracing/local-instrumentation-runtime.js +1 -1
  142. package/dist/src/tracing/local-trace-reader.d.ts +1 -0
  143. package/dist/src/tracing/local-trace-reader.js +1 -1
  144. package/dist/src/tracing/otel-declaration.d.ts +13 -16
  145. package/dist/src/tracing/otel-declaration.js +1 -1
  146. package/dist/src/tracing/otel-registration.js +1 -1
  147. package/dist/src/tracing/sampled-trace.d.ts +1 -14
  148. package/dist/src/tracing/sampled-trace.js +1 -1
  149. package/docs/channels/slack.mdx +25 -5
  150. package/docs/connections/overview.mdx +46 -2
  151. package/docs/extensions.md +2 -2
  152. package/docs/getting-started.mdx +1 -1
  153. package/docs/guides/dynamic-capabilities.md +91 -5
  154. package/docs/memory.md +7 -4
  155. package/docs/reference/cli.md +4 -4
  156. package/docs/reference/typescript-api.md +32 -23
  157. package/package.json +1 -1
  158. package/dist/src/execution/subagent-usage-span.d.ts +0 -9
  159. package/dist/src/execution/subagent-usage-span.js +0 -1
  160. package/dist/src/harness/ai-sdk-hook-bridge.js +0 -1
  161. package/dist/src/harness/channel-delivery-instrumentation.js +0 -1
  162. package/dist/src/harness/instrumentation/config.js +0 -1
  163. package/dist/src/harness/instrumentation/content-policy.js +0 -1
  164. package/dist/src/harness/instrumentation/dispatch.js +0 -1
  165. package/dist/src/harness/instrumentation/lifecycle.js +0 -1
  166. package/dist/src/harness/instrumentation/native-events.js +0 -1
  167. package/dist/src/harness/instrumentation/providers.js +0 -1
  168. package/dist/src/harness/instrumentation/runtime-context.js +0 -1
  169. package/dist/src/harness/instrumentation/runtime.d.ts +0 -21
  170. package/dist/src/harness/instrumentation/runtime.js +0 -1
  171. package/dist/src/harness/prepare-trace-context.js +0 -1
  172. /package/dist/src/{harness → instrumentation}/ai-sdk-telemetry.d.ts +0 -0
  173. /package/dist/src/{harness → instrumentation}/ai-sdk-telemetry.js +0 -0
  174. /package/dist/src/{harness/instrumentation → instrumentation}/content.js +0 -0
  175. /package/dist/src/{harness → instrumentation}/parent-lineage.js +0 -0
  176. /package/dist/src/{harness/instrumentation → instrumentation}/setup-context.d.ts +0 -0
  177. /package/dist/src/{harness/instrumentation → instrumentation}/setup-context.js +0 -0
  178. /package/dist/src/{harness/instrumentation → instrumentation}/state.js +0 -0
@@ -1 +1 @@
1
- import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{ConnectionRegistryKey,ConnectionRegistryKey as ConnectionRegistryKey$1}from"#context/providers/connection-key.js";import{ConnectionRegistryImpl}from"#runtime/connections/registry.js";import{getActiveRuntimeNode}from"#context/node.js";const connectionProvider={key:ConnectionRegistryKey$1,create(e,t){if(e.get(BundleKey)===void 0)return;let n=getActiveRuntimeNode(e).agent?.connections;if(!(!n||n.length===0))return{value:new ConnectionRegistryImpl(n)}}};export{ConnectionRegistryKey,connectionProvider};
1
+ import{ConnectionRegistryKey,ConnectionRegistryKey as ConnectionRegistryKey$1}from"#context/providers/connection-key.js";import{ConnectionRegistryImpl}from"#runtime/connections/registry.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{getActiveRuntimeNode}from"#context/node.js";const connectionProvider={key:ConnectionRegistryKey$1,create(e,t){if(e.get(BundleKey)===void 0)return;let n=getActiveRuntimeNode(e).agent;if(n===void 0)return;let r=n.connections;if(!(r.length===0&&(n.dynamicConnectionResolvers?.length??0)===0))return{value:new ConnectionRegistryImpl(r)}}};export{ConnectionRegistryKey,connectionProvider};
@@ -15,6 +15,7 @@ export declare const ALLOWED_DYNAMIC_TOOL_EVENTS: ReadonlySet<string>;
15
15
  */
16
16
  export declare const ALLOWED_DYNAMIC_INSTRUCTION_EVENTS: ReadonlySet<string>;
17
17
  export declare const ALLOWED_DYNAMIC_SKILL_EVENTS: ReadonlySet<string>;
18
+ export declare const ALLOWED_DYNAMIC_CONNECTION_EVENTS: ReadonlySet<string>;
18
19
  /**
19
20
  * Context passed to a dynamic resolver's event handler.
20
21
  *
@@ -64,7 +65,7 @@ export type DynamicSentinel<TResult = unknown> = {
64
65
  };
65
66
  /**
66
67
  * Defines a dynamic resolver evaluated at runtime from stream-event
67
- * handlers. It is shared across tools, skills, and agent definitions;
68
+ * handlers. It is shared across tools, skills, connections, and agent definitions;
68
69
  * the directory it is authored in (not this function) decides what each
69
70
  * handler must return and which events are honored. The file's path-derived
70
71
  * slug names the single-entry case; a `Record<string, ...>` return names
@@ -75,12 +76,14 @@ export type DynamicSentinel<TResult = unknown> = {
75
76
  * `Record<string, defineTool(...)>`, or `null`.
76
77
  * - `agent/skills/`: return a single `defineSkill(...)`, a
77
78
  * `Record<string, defineSkill(...)>`, or `null`.
79
+ * - `agent/connections/`: return one connection definition, a
80
+ * `Record<string, connection definition>`, or `null`.
78
81
  * - `agent/subagents/<name>/agent.ts`: return `defineAgent(...)` to configure
79
82
  * and expose the subagent, or `null` to omit it.
80
83
  *
81
84
  * Per-slot events: tools resolvers run at `session.started`,
82
- * `turn.started`, and `step.started`. Skills resolvers run only at
83
- * `session.started` and `turn.started`; the runtime never invokes a
85
+ * `turn.started`, and `step.started`. Skills and connection resolvers run only
86
+ * at `session.started` and `turn.started`; the runtime never invokes a
84
87
  * handler keyed on `step.started` in that slot. Dynamic subagents run at
85
88
  * `session.started` and `turn.started` only.
86
89
  *
@@ -1 +1 @@
1
- import{stampDefinitionKey}from"#internal/authored-definition/source-identity.js";const ALLOWED_DYNAMIC_TOOL_EVENTS=new Set([`session.started`,`turn.started`,`step.started`]),ALLOWED_DYNAMIC_INSTRUCTION_EVENTS=new Set([`session.started`,`turn.started`]),ALLOWED_DYNAMIC_SKILL_EVENTS=new Set([`session.started`,`turn.started`]),DYNAMIC_SENTINEL_KIND=`eve:dynamic`;function defineDynamic(t){let n={kind:DYNAMIC_SENTINEL_KIND,events:t.events};return stampDefinitionKey(n,`dynamic:${Object.keys(t.events).join(`,`)}`),n}function assertResolverOnlyDynamicSentinel(e,t){let n=Object.keys(e).filter(e=>e!==`events`&&e!==`kind`);if(n.length>0)throw Error(`${t} Unknown key(s): ${n.join(`, `)}.`)}function isDynamicSentinel(e){return typeof e==`object`&&!!e&&e.kind===`eve:dynamic`}export{ALLOWED_DYNAMIC_INSTRUCTION_EVENTS,ALLOWED_DYNAMIC_SKILL_EVENTS,ALLOWED_DYNAMIC_TOOL_EVENTS,DYNAMIC_SENTINEL_KIND,assertResolverOnlyDynamicSentinel,defineDynamic,isDynamicSentinel};
1
+ import{stampDefinitionKey}from"#internal/authored-definition/source-identity.js";const ALLOWED_DYNAMIC_TOOL_EVENTS=new Set([`session.started`,`turn.started`,`step.started`]),ALLOWED_DYNAMIC_INSTRUCTION_EVENTS=new Set([`session.started`,`turn.started`]),ALLOWED_DYNAMIC_SKILL_EVENTS=new Set([`session.started`,`turn.started`]),ALLOWED_DYNAMIC_CONNECTION_EVENTS=new Set([`session.started`,`turn.started`]),DYNAMIC_SENTINEL_KIND=`eve:dynamic`;function defineDynamic(t){let n={kind:DYNAMIC_SENTINEL_KIND,events:t.events};return stampDefinitionKey(n,`dynamic:${Object.keys(t.events).join(`,`)}`),n}function assertResolverOnlyDynamicSentinel(e,t){let n=Object.keys(e).filter(e=>e!==`events`&&e!==`kind`);if(n.length>0)throw Error(`${t} Unknown key(s): ${n.join(`, `)}.`)}function isDynamicSentinel(e){return typeof e==`object`&&!!e&&e.kind===`eve:dynamic`}export{ALLOWED_DYNAMIC_CONNECTION_EVENTS,ALLOWED_DYNAMIC_INSTRUCTION_EVENTS,ALLOWED_DYNAMIC_SKILL_EVENTS,ALLOWED_DYNAMIC_TOOL_EVENTS,DYNAMIC_SENTINEL_KIND,assertResolverOnlyDynamicSentinel,defineDynamic,isDynamicSentinel};
@@ -1 +1 @@
1
- function matchAuthorizationCallbacks(e,t){let n=[],r=[],i=new Set;for(let a of t){let t=a.authorizationCallback;if(t===void 0){r.push(a);continue}let o=e.challenges.find(e=>e.name===t.connectionName?t.legacy===!0?e.attemptId===void 0:e.attemptId===t.attemptId:!1),s=o?.attemptId??o?.name;o===void 0||s===void 0||o.principal===void 0&&t.legacy!==!0||i.has(s)||(i.add(s),n.push({authorization:o.challenge,result:{attemptId:o.attemptId,callback:t.callback,hookUrl:o.hookUrl,name:o.name,principal:o.principal,resume:o.resume}}))}return{matches:n,remainingPayloads:r}}export{matchAuthorizationCallbacks};
1
+ function matchAuthorizationCallbacks(e,t){let n=[],r=[],i=new Set;for(let a of t){let t=a.authorizationCallback;if(t===void 0){r.push(a);continue}let o=e.challenges.find(e=>e.name===t.connectionName?t.legacy===!0?e.attemptId===void 0:e.attemptId===t.attemptId:!1),s=o?.attemptId??o?.name;o===void 0||s===void 0||o.principal===void 0&&t.legacy!==!0||i.has(s)||(i.add(s),n.push({authorization:o.challenge,result:{attemptId:o.attemptId,callback:t.callback,hookUrl:o.hookUrl,instanceId:o.instanceId,name:o.name,principal:o.principal,resume:o.resume}}))}return{matches:n,remainingPayloads:r}}export{matchAuthorizationCallbacks};
@@ -0,0 +1,2 @@
1
+ import type { HarnessSession, StepInput } from "#harness/types.js";
2
+ export declare function preserveCancelledTurnMessage(session: HarnessSession, input: StepInput | undefined): Promise<HarnessSession>;
@@ -0,0 +1 @@
1
+ import{stageAttachmentsToSandbox}from"#harness/attachment-staging.js";import{normalizeUserContent}from"#harness/messages.js";async function preserveCancelledTurnMessage(e,t){let n=normalizeUserContent(t?.message);if(n===void 0)return e;let r=await stageAttachmentsToSandbox(n);return{...e,history:[...e.history,{content:r,role:`user`}]}}export{preserveCancelledTurnMessage};
@@ -0,0 +1,9 @@
1
+ import type { ContextContainer } from "#context/container.js";
2
+ import type { HarnessEmissionState } from "#harness/emission.js";
3
+ import { type RuntimeIdentity, type UnstampedMessageStreamEvent } from "#protocol/message.js";
4
+ import type { ResolvedAgent } from "#runtime/types.js";
5
+ /** Binds dynamic connection lifecycle dispatch to one execution context. */
6
+ export declare function bindDynamicConnections(ctx: ContextContainer, agent: Pick<ResolvedAgent, "dynamicConnectionResolvers">): {
7
+ dispatch: (event: UnstampedMessageStreamEvent) => Promise<void>;
8
+ rehydrate(state: HarnessEmissionState, runtime: RuntimeIdentity, betweenTurns: boolean): Promise<void>;
9
+ };
@@ -0,0 +1 @@
1
+ import{createSessionStartedEvent,createTurnStartedEvent}from"#protocol/message.js";import{dispatchDynamicConnectionEvent}from"#context/dynamic-connection-lifecycle.js";import{activeTurnId}from"#harness/active-turn-id.js";function bindDynamicConnections(n,r){let i=r.dynamicConnectionResolvers??[],dispatch=e=>dispatchDynamicConnectionEvent({ctx:n,event:e,resolvers:i});return{dispatch,async rehydrate(t,n,r){t.sessionStarted&&(await dispatch(createSessionStartedEvent({runtime:n})),!r&&await dispatch(createTurnStartedEvent({sequence:t.sequence,turnId:activeTurnId(t)})))}}}export{bindDynamicConnections};
@@ -1 +1 @@
1
- import{normalizeChannelAudience}from"#shared/channel-audience.js";import{ChannelRequestIdKey,OtelTraceEnabledKey,ScheduleIdKey}from"#context/keys.js";import{isNonEmptyString}from"#shared/guards.js";import{CHANNEL_CONTEXT_KEY_NAME}from"#context/key-names.js";import{shouldCaptureInstrumentationContent}from"#shared/instrumentation-content.js";import{isSampledTrace}from"#tracing/sampled-trace.js";function readChannelKind(e){let t=e[CHANNEL_CONTEXT_KEY_NAME]?.kind;return isNonEmptyString(t)?t:void 0}function isWorkflowTraceContentVisible(t){let n=t[CHANNEL_CONTEXT_KEY_NAME];return shouldCaptureInstrumentationContent(normalizeChannelAudience(n?.audience))}function isWorkflowOtelTraceEnabled(e){return e[OtelTraceEnabledKey.name]===!0}function readSessionTraceId(e){let t=e[`eve.sessionTraceSeed`];if(!(t===void 0||!isSampledTrace(t)))return isNonEmptyString(t.traceId)?t.traceId:void 0}function readParentLineage(e){let t=e[`eve.parentSession`],n=t?.callId,r=t?.rootSessionId,i=t?.sessionId,a=t?.turn?.id;return{callId:isNonEmptyString(n)?n:void 0,rootSessionId:isNonEmptyString(r)?r:void 0,sessionId:isNonEmptyString(i)?i:void 0,turnId:isNonEmptyString(a)?a:void 0}}function readParentSessionId(e){return readParentLineage(e).sessionId}function readRootSessionId(e){return readParentLineage(e).rootSessionId}function readChannelRequestId(e){let n=e[ChannelRequestIdKey.name];return isNonEmptyString(n)?n:void 0}function readScheduleId(e){let t=e[ScheduleIdKey.name];return isNonEmptyString(t)?t:void 0}const EVE_SESSION_TITLE_MAX_CHARS=125;function deriveSessionTitle(e){let t=collectMessageText(e);if(t===void 0||t.length===0)return;let n=t.replace(/\s+/gu,` `).trim();if(n.length===0)return;let r=Array.from(n);return r.length<=125?n:`${r.slice(0,124).join(``)}…`}function collectMessageText(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return;let t=[];for(let n of e)n&&typeof n==`object`&&n.type===`text`&&typeof n.text==`string`&&t.push(n.text);return t.length>0?t.join(` `):void 0}function buildSessionAttributes(e){let t=isWorkflowTraceContentVisible(e.serializedContext),n=isWorkflowOtelTraceEnabled(e.serializedContext);return{"$eve.channel_request_id":readChannelRequestId(e.serializedContext),"$eve.schedule":readScheduleId(e.serializedContext),"$eve.is_otel_trace_enabled":n,"$eve.is_trace_content_visible":t,"$eve.trace_id":readSessionTraceId(e.serializedContext),"$eve.type":`session`,"$eve.trigger":readChannelKind(e.serializedContext),"$eve.title":deriveSessionTitle(e.inputMessage)}}function buildSubagentRootAttributes(e){return{"$eve.channel_request_id":readChannelRequestId(e.serializedContext),"$eve.is_otel_trace_enabled":isWorkflowOtelTraceEnabled(e.serializedContext),"$eve.is_trace_content_visible":isWorkflowTraceContentVisible(e.serializedContext),"$eve.trace_id":readSessionTraceId(e.serializedContext),"$eve.type":`subagent`,"$eve.parent":e.parentSessionId,"$eve.parent_call":e.parentCallId,"$eve.parent_turn":e.parentTurnId,"$eve.root":e.rootSessionId,"$eve.subagent":e.identity.nodeId,"$eve.trigger":readChannelKind(e.serializedContext)}}function buildTurnAttributes(e){return{"$eve.channel_request_id":e.requestId,"$eve.is_otel_trace_enabled":isWorkflowOtelTraceEnabled(e.serializedContext),"$eve.is_trace_content_visible":isWorkflowTraceContentVisible(e.serializedContext),"$eve.trace_id":readSessionTraceId(e.serializedContext),"$eve.type":`turn`,"$eve.parent":e.parentSessionId,"$eve.root":e.rootSessionId}}export{EVE_SESSION_TITLE_MAX_CHARS,buildSessionAttributes,buildSubagentRootAttributes,buildTurnAttributes,deriveSessionTitle,isWorkflowOtelTraceEnabled,isWorkflowTraceContentVisible,readChannelKind,readChannelRequestId,readParentLineage,readParentSessionId,readRootSessionId,readScheduleId,readSessionTraceId};
1
+ import{normalizeChannelAudience}from"#shared/channel-audience.js";import{ChannelRequestIdKey,OtelTraceEnabledKey,ScheduleIdKey,SessionTraceSeedKey}from"#context/keys.js";import{isNonEmptyString}from"#shared/guards.js";import{CHANNEL_CONTEXT_KEY_NAME}from"#context/key-names.js";import{shouldCaptureInstrumentationContent}from"#shared/instrumentation-content.js";import{isSampledTrace}from"#tracing/sampled-trace.js";function readChannelKind(e){let t=e[CHANNEL_CONTEXT_KEY_NAME]?.kind;return isNonEmptyString(t)?t:void 0}function isWorkflowTraceContentVisible(t){let n=t[CHANNEL_CONTEXT_KEY_NAME];return shouldCaptureInstrumentationContent(normalizeChannelAudience(n?.audience))}function isWorkflowOtelTraceEnabled(e){return e[OtelTraceEnabledKey.name]===!0}function readSessionTraceId(e){let t=e[SessionTraceSeedKey.name];if(!(t===void 0||!isSampledTrace(t)))return isNonEmptyString(t.traceId)?t.traceId:void 0}function readParentLineage(e){let t=e[`eve.parentSession`],n=t?.callId,r=t?.rootSessionId,i=t?.sessionId,a=t?.turn?.id;return{callId:isNonEmptyString(n)?n:void 0,rootSessionId:isNonEmptyString(r)?r:void 0,sessionId:isNonEmptyString(i)?i:void 0,turnId:isNonEmptyString(a)?a:void 0}}function readParentSessionId(e){return readParentLineage(e).sessionId}function readRootSessionId(e){return readParentLineage(e).rootSessionId}function readChannelRequestId(e){let n=e[ChannelRequestIdKey.name];return isNonEmptyString(n)?n:void 0}function readScheduleId(e){let t=e[ScheduleIdKey.name];return isNonEmptyString(t)?t:void 0}const EVE_SESSION_TITLE_MAX_CHARS=125;function deriveSessionTitle(e){let t=collectMessageText(e);if(t===void 0||t.length===0)return;let n=t.replace(/\s+/gu,` `).trim();if(n.length===0)return;let r=Array.from(n);return r.length<=125?n:`${r.slice(0,124).join(``)}…`}function collectMessageText(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return;let t=[];for(let n of e)n&&typeof n==`object`&&n.type===`text`&&typeof n.text==`string`&&t.push(n.text);return t.length>0?t.join(` `):void 0}function buildSessionAttributes(e){let t=isWorkflowTraceContentVisible(e.serializedContext),n=isWorkflowOtelTraceEnabled(e.serializedContext);return{"$eve.channel_request_id":readChannelRequestId(e.serializedContext),"$eve.schedule":readScheduleId(e.serializedContext),"$eve.is_otel_trace_enabled":n,"$eve.is_trace_content_visible":t,"$eve.trace_id":readSessionTraceId(e.serializedContext),"$eve.type":`session`,"$eve.trigger":readChannelKind(e.serializedContext),"$eve.title":deriveSessionTitle(e.inputMessage)}}function buildSubagentRootAttributes(e){return{"$eve.channel_request_id":readChannelRequestId(e.serializedContext),"$eve.is_otel_trace_enabled":isWorkflowOtelTraceEnabled(e.serializedContext),"$eve.is_trace_content_visible":isWorkflowTraceContentVisible(e.serializedContext),"$eve.trace_id":readSessionTraceId(e.serializedContext),"$eve.type":`subagent`,"$eve.parent":e.parentSessionId,"$eve.parent_call":e.parentCallId,"$eve.parent_turn":e.parentTurnId,"$eve.root":e.rootSessionId,"$eve.subagent":e.identity.nodeId,"$eve.trigger":readChannelKind(e.serializedContext)}}function buildTurnAttributes(e){return{"$eve.channel_request_id":e.requestId,"$eve.is_otel_trace_enabled":isWorkflowOtelTraceEnabled(e.serializedContext),"$eve.is_trace_content_visible":isWorkflowTraceContentVisible(e.serializedContext),"$eve.trace_id":readSessionTraceId(e.serializedContext),"$eve.type":`turn`,"$eve.parent":e.parentSessionId,"$eve.root":e.rootSessionId}}export{EVE_SESSION_TITLE_MAX_CHARS,buildSessionAttributes,buildSubagentRootAttributes,buildTurnAttributes,deriveSessionTitle,isWorkflowOtelTraceEnabled,isWorkflowTraceContentVisible,readChannelKind,readChannelRequestId,readParentLineage,readParentSessionId,readRootSessionId,readScheduleId,readSessionTraceId};
@@ -1,4 +1,5 @@
1
1
  import type { Runtime, SessionCapabilities } from "#channel/types.js";
2
+ import type { ExecutionInstrumentation } from "#instrumentation/runtime.js";
2
3
  import type { HandleEventFn, HarnessToolMap, StepFn } from "#harness/types.js";
3
4
  import type { RuntimeIdentity } from "#protocol/message.js";
4
5
  import type { RunMode } from "#shared/run-mode.js";
@@ -41,6 +42,7 @@ export interface CreateExecutionNodeStepInput {
41
42
  readonly handleEvent?: HandleEventFn;
42
43
  readonly historyProjector?: HistoryViewProjector;
43
44
  readonly historyView?: PreparedHistoryView;
45
+ readonly instrumentation: ExecutionInstrumentation | undefined;
44
46
  readonly mode: RunMode;
45
47
  readonly modelResolutionScope: RuntimeModelResolutionScope;
46
48
  readonly node: ResolvedRuntimeAgentNode;
@@ -1 +1 @@
1
- import{createLogger}from"#internal/logging.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{UNSPECIFIED_INPUT_SCHEMA}from"#tools/schema.js";import{createToolExecuteWithAuth}from"#execution/tool-auth.js";import{resolveRuntimeModelReference}from"#runtime/agent/resolve-model.js";import{createBackgroundSubagentHarnessDefinition,createHarnessDelegationToolDefinition}from"#execution/delegation-tool.js";import{LOAD_SKILL_TOOL_NAME}from"#runtime/skills/fragment-context.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{createToolLoopHarness}from"#harness/tool-loop.js";import{getInstrumentationRuntime}from"#harness/instrumentation/runtime.js";import{AGENT_TOOL_DESCRIPTION,AGENT_TOOL_NAME,SUBAGENT_TOOL_INPUT_SCHEMA}from"#tools/framework/agent-contract.js";import{createTaskToolHarnessDefinitions}from"#execution/tools/tasks.js";import{findRegisteredRuntimeTool}from"#runtime/tools/registry.js";import{preserveFrameworkStateOnCompaction}from"#execution/compaction.js";import{ASK_QUESTION_TOOL_NAME}from"#harness/request-input-tool.js";const log=createLogger(`execution.node-step`);function createExecutionNodeStep(e){let t=createRuntimeModelResolver(e.modelResolutionScope),n=e.node.turnAgent.dynamicModel===void 0?void 0:createRuntimeDynamicModelEventDispatcher(e.modelResolutionScope,e.node.turnAgent.dynamicModel),r=createNodeHarnessTools({node:e.node}),i=getInstrumentationRuntime(),a=createToolLoopHarness({abortSignal:e.abortSignal,capabilities:e.capabilities,clearOnly:e.clearOnly,compactOnly:e.compactOnly,workflow:e.node.agent.workflowTool!==void 0,workflowMaxSubagents:e.workflowMaxSubagents,webSearchProvider:e.node.agent.webSearchProvider,handleEvent:e.handleEvent,historyProjector:e.historyProjector,historyView:e.historyView,instrumentation:i,mode:e.mode,onCompaction:preserveFrameworkStateOnCompaction,dispatchDynamicModelEvent:n,resolveModel:t,runtimeIdentity:buildRuntimeIdentity(e.node),tools:r});return i===void 0?a:async(e,t)=>{try{return await a(e,t)}finally{await i.forceFlush()}}}function buildRuntimeIdentity(e){let n=resolveInstalledPackageInfo(),r={agentId:e.turnAgent.id,agentName:e.agent.config?.name,eveVersion:n.version},i=process.env.VERCEL_GIT_COMMIT_SHA?.trim(),a=process.env.VERCEL_GIT_COMMIT_REF?.trim(),o=process.env.VERCEL_DEPLOYMENT_CREATED_AT?.trim();return i||a||o?{...r,build:{deployedAt:o||void 0,gitBranch:a||void 0,gitSha:i||void 0}}:r}function createRuntimeModelResolver(e){return t=>resolveRuntimeModelReference(t,e)}function createRuntimeDynamicModelEventDispatcher(e,t){return n=>dispatchDynamicModelEvent({ctx:n.ctx,dynamicModel:t,event:n.event,messages:n.messages,scope:e})}function createNodeHarnessTools(e){let t=new Map,n=e.node.agent.config?.experimental?.tasks===!0;for(let r of e.node.turnAgent.tools){let i=resolveHarnessToolDefinition({node:e.node,tasksEnabled:n,tool:r});i!==null&&t.set(r.name,i)}return t}function resolveHarnessToolDefinition(e){if(e.tool.kind===`subagent`||e.tool.kind===`remote`)return e.tasksEnabled?createBackgroundSubagentHarnessDefinition(e.tool):createHarnessDelegationToolDefinition(e.tool);let t=findRegisteredRuntimeTool(e.node.toolRegistry,e.tool.name);if(t===null)return log.warn(`declared tool is not registered — omitting from toolset`,{toolName:e.tool.name,nodeId:e.node.nodeId}),null;let r=t.definition;if(r.owner.kind===`framework`&&r.name===AGENT_TOOL_NAME){let t={description:AGENT_TOOL_DESCRIPTION,inputSchema:SUBAGENT_TOOL_INPUT_SCHEMA,kind:`subagent`,name:AGENT_TOOL_NAME,nodeId:e.node.nodeId,rootOnly:!0};return e.tasksEnabled?createBackgroundSubagentHarnessDefinition(t):createHarnessDelegationToolDefinition(t)}if(r.owner.kind===`framework`){let t=createTaskToolHarnessDefinitions().find(e=>e.name===r.name);if(t!==void 0)return e.tasksEnabled?t:null}let i=r.execute,s=r.owner.kind===`framework`&&r.name===ASK_QUESTION_TOOL_NAME;return{approvalKey:r.approvalKey,description:r.description,execution:r.execution,execute:s?void 0:resolveAuthoredExecute({rawExecute:i,scope:r.name}),frameworkAction:r.owner.kind===`framework`&&r.name===LOAD_SKILL_TOOL_NAME?`load-skill`:void 0,inputSchema:r.inputSchema??UNSPECIFIED_INPUT_SCHEMA,name:r.name,approval:r.approval,outputSchema:r.outputSchema,toModelOutput:r.toModelOutput}}function resolveAuthoredExecute(e){let{rawExecute:t,scope:n}=e;return t===void 0?void 0:createToolExecuteWithAuth({execute:t,scope:n})}export{buildRuntimeIdentity,createExecutionNodeStep,createNodeHarnessTools};
1
+ import{createLogger}from"#internal/logging.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{UNSPECIFIED_INPUT_SCHEMA}from"#tools/schema.js";import{createToolExecuteWithAuth}from"#execution/tool-auth.js";import{resolveRuntimeModelReference}from"#runtime/agent/resolve-model.js";import{createBackgroundSubagentHarnessDefinition,createHarnessDelegationToolDefinition}from"#execution/delegation-tool.js";import{LOAD_SKILL_TOOL_NAME}from"#runtime/skills/fragment-context.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{createToolLoopHarness}from"#harness/tool-loop.js";import{AGENT_TOOL_DESCRIPTION,AGENT_TOOL_NAME,SUBAGENT_TOOL_INPUT_SCHEMA}from"#tools/framework/agent-contract.js";import{createTaskToolHarnessDefinitions}from"#execution/tools/tasks.js";import{findRegisteredRuntimeTool}from"#runtime/tools/registry.js";import{preserveFrameworkStateOnCompaction}from"#execution/compaction.js";import{ASK_QUESTION_TOOL_NAME}from"#harness/request-input-tool.js";const log=createLogger(`execution.node-step`);function createExecutionNodeStep(e){let t=createRuntimeModelResolver(e.modelResolutionScope),n=e.node.turnAgent.dynamicModel===void 0?void 0:createRuntimeDynamicModelEventDispatcher(e.modelResolutionScope,e.node.turnAgent.dynamicModel),r=createNodeHarnessTools({node:e.node}),i=e.instrumentation,a=i?.prepareExecution(),o=createToolLoopHarness({abortSignal:e.abortSignal,capabilities:e.capabilities,clearOnly:e.clearOnly,compactOnly:e.compactOnly,workflow:e.node.agent.workflowTool!==void 0,workflowMaxSubagents:e.workflowMaxSubagents,webSearchProvider:e.node.agent.webSearchProvider,handleEvent:e.handleEvent,historyProjector:e.historyProjector,historyView:e.historyView,instrumentation:a,mode:e.mode,onCompaction:preserveFrameworkStateOnCompaction,dispatchDynamicModelEvent:n,resolveModel:t,runtimeIdentity:buildRuntimeIdentity(e.node),tools:r});return i===void 0?o:async(e,t)=>{try{return await o(e,t)}finally{await i.flush()}}}function buildRuntimeIdentity(e){let n=resolveInstalledPackageInfo(),r={agentId:e.turnAgent.id,agentName:e.agent.config?.name,eveVersion:n.version},i=process.env.VERCEL_GIT_COMMIT_SHA?.trim(),a=process.env.VERCEL_GIT_COMMIT_REF?.trim(),o=process.env.VERCEL_DEPLOYMENT_CREATED_AT?.trim();return i||a||o?{...r,build:{deployedAt:o||void 0,gitBranch:a||void 0,gitSha:i||void 0}}:r}function createRuntimeModelResolver(e){return t=>resolveRuntimeModelReference(t,e)}function createRuntimeDynamicModelEventDispatcher(e,t){return n=>dispatchDynamicModelEvent({ctx:n.ctx,dynamicModel:t,event:n.event,messages:n.messages,scope:e})}function createNodeHarnessTools(e){let t=new Map,n=e.node.agent.config?.experimental?.tasks===!0;for(let r of e.node.turnAgent.tools){let i=resolveHarnessToolDefinition({node:e.node,tasksEnabled:n,tool:r});i!==null&&t.set(r.name,i)}return t}function resolveHarnessToolDefinition(e){if(e.tool.kind===`subagent`||e.tool.kind===`remote`)return e.tasksEnabled?createBackgroundSubagentHarnessDefinition(e.tool):createHarnessDelegationToolDefinition(e.tool);let t=findRegisteredRuntimeTool(e.node.toolRegistry,e.tool.name);if(t===null)return log.warn(`declared tool is not registered — omitting from toolset`,{toolName:e.tool.name,nodeId:e.node.nodeId}),null;let r=t.definition;if(r.owner.kind===`framework`&&r.name===AGENT_TOOL_NAME){let t={description:AGENT_TOOL_DESCRIPTION,inputSchema:SUBAGENT_TOOL_INPUT_SCHEMA,kind:`subagent`,name:AGENT_TOOL_NAME,nodeId:e.node.nodeId,rootOnly:!0};return e.tasksEnabled?createBackgroundSubagentHarnessDefinition(t):createHarnessDelegationToolDefinition(t)}if(r.owner.kind===`framework`){let t=createTaskToolHarnessDefinitions().find(e=>e.name===r.name);if(t!==void 0)return e.tasksEnabled?t:null}let i=r.execute,s=r.owner.kind===`framework`&&r.name===ASK_QUESTION_TOOL_NAME;return{approvalKey:r.approvalKey,description:r.description,execution:r.execution,execute:s?void 0:resolveAuthoredExecute({rawExecute:i,scope:r.name}),frameworkAction:r.owner.kind===`framework`&&r.name===LOAD_SKILL_TOOL_NAME?`load-skill`:void 0,inputSchema:r.inputSchema??UNSPECIFIED_INPUT_SCHEMA,name:r.name,approval:r.approval,outputSchema:r.outputSchema,toModelOutput:r.toModelOutput}}function resolveAuthoredExecute(e){let{rawExecute:t,scope:n}=e;return t===void 0?void 0:createToolExecuteWithAuth({execute:t,scope:n})}export{buildRuntimeIdentity,createExecutionNodeStep,createNodeHarnessTools};
@@ -1 +1 @@
1
- import{callAdapterEventHandler}from"#channel/adapter.js";import{ChannelInstrumentationKey}from"#context/keys.js";import{encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission.js";import{abandonRunningAgentTurns}from"#harness/handles/transitions.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{hydrateDurableSession}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{withContextScope}from"#context/run-step.js";import{clearPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{clearPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{clearAllProxyInputRequests,getProxyInputRequests,hasProxyInputRequests}from"#harness/proxy-input-requests.js";import{getInstrumentationRuntime}from"#harness/instrumentation/runtime.js";import{clearPendingSessionLimitPrompt}from"#harness/input-requests.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{observeSessionActivity}from"#execution/session-activity-projection.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{activeTurnId}from"#harness/active-turn-id.js";import{emitCancelledTurn}from"#harness/cancelled-turn-emission.js";import{createInstrumentationHandleEvent}from"#harness/instrumentation/native-events.js";import{getTurnUsageState,toUsage}from"#harness/turn-tag-state.js";async function settleCancelledTurnStep(a){"use step";let o=await readDurableSession(a.sessionState),s=await deserializeContext(a.serializedContext),c=s.require(ChannelKey),l=buildAdapterContext(c,s),u=s.require(BundleKey),d=resolveEffectiveAgentRuntime(u,s),f=getInstrumentationRuntime(),p=hydrateDurableSession({compactionOverrides:{thresholdPercent:d.thresholdPercent},durable:o,turnAgent:d.turnAgent}),m=getHarnessEmissionState(o.state),h=[...getProxyInputRequests(o.state).values()].some(e=>e.kind===`session-limit`);if(!(isHarnessBetweenTurns(p)&&hasProxyInputRequests(o.state)&&!h)){let n=a.parentWritable.getWriter();try{let r=await withContextScope(s,p,async r=>{let baseEmit=async t=>{let r=await callAdapterEventHandler(c,t,l);setChannelContext(s,{...c,state:{...l.state}});let i=stampMessageStreamEvent(r);await n.write(encodeMessageStreamEvent(i)),observeSessionActivity({ctx:s,event:i,sessionId:p.sessionId}),await dispatchStreamEventHooks({ctx:s,event:i,registry:u.hookRegistry})};return{result:await emitCancelledTurn(createInstrumentationHandleEvent({agentName:u.turnAgent.id,channelKind:s.get(ChannelInstrumentationKey)?.kind,handleEvent:baseEmit,hooks:f?.hooks,sessionId:p.sessionId,turnId:activeTurnId(m)})??baseEmit,m),session:r}});m=r.result,p=r.session}finally{await f?.forceFlush(),n.releaseLock()}}let g=reconcileSessionContinuationToken(s,setHarnessEmissionState(clearPendingSessionLimitPrompt(clearAllProxyInputRequests(clearPendingWorkflowInterrupt(clearPendingRuntimeActionBatch(abandonRunningAgentTurns({...p,outputSchema:void 0}))))),m)),_=getTurnUsageState(p.state)?.session,v={serializedContext:serializeContext(s),sessionState:createDurableSessionState({session:g})};return _===void 0?v:{...v,usage:toUsage(_)}}export{settleCancelledTurnStep};
1
+ import{callAdapterEventHandler}from"#channel/adapter.js";import{encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission.js";import{abandonRunningAgentTurns}from"#harness/handles/transitions.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{hydrateDurableSession}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{withContextScope}from"#context/run-step.js";import{clearPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{clearPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{clearAllProxyInputRequests,getProxyInputRequests,hasProxyInputRequests}from"#harness/proxy-input-requests.js";import{activeTurnId}from"#harness/active-turn-id.js";import{clearPendingSessionLimitPrompt}from"#harness/input-requests.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{observeSessionActivity}from"#execution/session-activity-projection.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{emitCancelledTurn}from"#harness/cancelled-turn-emission.js";import{bindSessionInstrumentation}from"#instrumentation/runtime.js";import{getTurnUsageState,toUsage}from"#harness/turn-tag-state.js";async function settleCancelledTurnStep(a){"use step";let o=await readDurableSession(a.sessionState),s=await deserializeContext(a.serializedContext),c=s.require(ChannelKey),l=buildAdapterContext(c,s),u=s.require(BundleKey),d=resolveEffectiveAgentRuntime(u,s),f=hydrateDurableSession({compactionOverrides:{thresholdPercent:d.thresholdPercent},durable:o,turnAgent:d.turnAgent}),p=bindSessionInstrumentation({agentName:d.turnAgent.id,ctx:s,rootSessionId:f.rootSessionId??f.sessionId,sessionId:f.sessionId}),m=getHarnessEmissionState(o.state),h=[...getProxyInputRequests(o.state).values()].some(e=>e.kind===`session-limit`);if(!(isHarnessBetweenTurns(f)&&hasProxyInputRequests(o.state)&&!h)){let t=a.parentWritable.getWriter();try{let n=await withContextScope(s,f,async n=>{let baseEmit=async n=>{let r=await callAdapterEventHandler(c,n,l);setChannelContext(s,{...c,state:{...l.state}});let i=stampMessageStreamEvent(r);await t.write(encodeMessageStreamEvent(i)),observeSessionActivity({ctx:s,event:i,sessionId:f.sessionId}),await dispatchStreamEventHooks({ctx:s,event:i,registry:u.hookRegistry})};return{result:await emitCancelledTurn(p?.createCancellationHandleEvent({handleEvent:baseEmit,turnId:activeTurnId(m)})??baseEmit,m),session:n}});m=n.result,f=n.session}finally{await p?.flush(),t.releaseLock()}}let g=reconcileSessionContinuationToken(s,setHarnessEmissionState(clearPendingSessionLimitPrompt(clearAllProxyInputRequests(clearPendingWorkflowInterrupt(clearPendingRuntimeActionBatch(abandonRunningAgentTurns({...f,outputSchema:void 0}))))),m)),_=getTurnUsageState(f.state)?.session,v={serializedContext:serializeContext(s),sessionState:createDurableSessionState({session:g})};return _===void 0?v:{...v,usage:toUsage(_)}}export{settleCancelledTurnStep};
@@ -1 +1 @@
1
- import{createEveCallbackRoutePath}from"#protocol/routes.js";import{loadContext}from"#context/container.js";import{parseJsonValue}from"#shared/json.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState}from"#harness/emission.js";import{recordTaskAgentAddress}from"#harness/handles/transitions.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{runStep}from"#context/run-step.js";import{propagateSubagentExecutorCancel}from"#execution/tasks/parent/dispatch.js";import{CallbackBaseUrlKey,isAuthorizationSignal}from"#harness/authorization.js";import{sendTaskCommand,sendTaskInboundPayload}from"#execution/tasks/parent/run-parent.js";import{recordSessionTask}from"#tasks/session-index.js";import{activeTurnId}from"#harness/active-turn-id.js";import{readSubagentExecutor}from"#tasks/types.js";import{beginBackgroundTask,rejectDelegatedDispatch}from"#execution/tasks/parent/delegate.js";import{isTurnCancellation}from"#harness/turn-cancellation.js";import{BackgroundToolExecutorKey}from"#harness/background-tools.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{createTaskDelegated,isTaskDelegated}from"#tools/task.js";function runBackgroundStep(e,t,n){return runStep(e,t,n,[backgroundToolExecutionProvider])}const backgroundToolExecutionProvider={key:BackgroundToolExecutorKey,create(e,t){return{value:new BackgroundToolExecutionScope(t,e.get(BundleKey))}},async commit(e,t){return await requireExecutionScope(e).commit(t)},async rollback(e,t){await requireExecutionScope(e).rollback(t)},decorateStepResult(e,t){return requireExecutionScope(e).decorate(t)}};function readRetainedBackgroundToolResult(e){let t=e.get(BackgroundToolExecutorKey);return t instanceof BackgroundToolExecutionScope?t.retainedResult():void 0}var BackgroundToolExecutionScope=class{bundle;executions=new Map;records=[];retained=!1;initialSession;constructor(e,t){this.bundle=t,this.initialSession=e}execute(e){let t=this.executions.get(e.options.toolCallId);if(t!==void 0)return t;if(!e.batch.calls.some(t=>t.callId===e.options.toolCallId))throw Error(`Background tool call "${e.options.toolCallId}" was not registered before execution.`);let n=this.start(e);return this.executions.set(e.options.toolCallId,n),n}async commit(e){let t=this.records.filter(e=>!e.settled);return t.length>0&&await compensateBackgroundToolExecution(t,Error(`Background tool execution did not delegate or complete its task.`),this.bundle),this.apply(e)}decorate(e){let t=this.resultFields();return t===void 0?e:{...e,...t}}async rollback(e){let t=this.records.filter(e=>e.settled),n=this.records.filter(e=>!e.settled);if(n.length>0&&await compensateBackgroundToolExecution(n,e,this.bundle),t.length!==0){if(isTurnCancellation(e)){this.retained=!0;return}await compensateBackgroundToolExecution(t,e,this.bundle)}}retainedResult(){return this.retained?this.resultFields():void 0}apply(e){let t=e;for(let e of this.records){if(!e.settled||e.task===void 0)continue;let n=readSubagentExecutor(e.task.executor);n!==void 0&&(t=recordTaskAgentAddress(t,n)),t=recordSessionTask(t,e.task)}return t}resultFields(){let e=this.records.flatMap(e=>e.settled&&e.task!==void 0?[e.task]:[]);if(e.length!==0)return{backgroundTaskSession:this.apply(this.initialSession),backgroundTasks:e.map(({taskInboxToken:e,taskId:t,taskRunId:n})=>({taskInboxToken:e,taskId:t,taskRunId:n}))}}async start(r){let a={settled:!1};this.records.push(a);let o=getHarnessEmissionState(this.initialSession.state),s=await beginBackgroundTask({callId:r.options.toolCallId,metadata:{kind:`tool`,name:r.definition.name},parentSessionId:this.initialSession.sessionId,parentStepIndex:o.stepIndex,parentTurnId:activeTurnId(o),session:this.initialSession});a.task=s;let c=loadContext().get(CallbackBaseUrlKey),l={taskId:s.taskId,token:s.taskInboxToken,...c===void 0?{}:{url:createWorkflowCallbackUrl(c,createEveCallbackRoutePath(s.taskInboxToken))}},u={batch:r.batch.calls,binding:l,delegated:({executor:e,receipt:t})=>createTaskDelegated({binding:l,executor:e,receipt:t}),send:createTaskSender(s,r.options.toolCallId),session:this.initialSession,task:s},d=r.definition.execute(r.toolInput,r.options,u);if(isAsyncIterable(d))throw Error(`Background tools cannot return AsyncIterable output.`);let f=await d;return isAuthorizationSignal(f)?f:isTaskDelegated(f)?(await deliverTaskCommand(s,{executor:f.executor,kind:`bind`}),a.task={...s,executor:f.executor},a.settled=!0,f.receipt):(await deliverTaskCommand(s,{data:parseJsonValue(f),kind:`complete`}),a.settled=!0,f)}};function requireExecutionScope(e){if(!(e instanceof BackgroundToolExecutionScope))throw Error(`The background tool executor is not owned by the task runtime.`);return e}async function deliverTaskCommand(e,t){if(await sendTaskCommand({command:t,taskInboxToken:e.taskInboxToken})!==`delivered`)throw Error(`Task run "${e.taskId}" did not accept "${t.kind}".`)}function createTaskSender(e,t){let n=0;return async r=>{if(r.kind!==`update`){await deliverTaskCommand(e,r);return}if(await sendTaskInboundPayload({payload:{callId:t,kind:`task-update`,message:r.message,updateEpoch:e.taskId,updateIndex:n++},taskInboxToken:e.taskInboxToken})!==`delivered`)throw Error(`Task run "${e.taskId}" did not accept "${r.kind}".`)}}async function compensateBackgroundToolExecution(e,t,n){let r=[];for(let i of e.toReversed()){if(i.task===void 0)continue;try{await rejectDelegatedDispatch({error:{code:`PARENT_STEP_FAILED`,message:t instanceof Error?t.message:String(t)},task:i.task})}catch(e){r.push(e)}let e=readSubagentExecutor(i.task.executor);e!==void 0&&await propagateSubagentExecutorCancel({bundle:n,executor:e,taskId:i.task.taskId})}if(r.length>0)throw AggregateError([t,...r],`Background tool execution failed and its tasks could not all be rejected.`,{cause:t})}export{backgroundToolExecutionProvider,readRetainedBackgroundToolResult,runBackgroundStep};
1
+ import{createEveCallbackRoutePath}from"#protocol/routes.js";import{loadContext}from"#context/container.js";import{parseJsonValue}from"#shared/json.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState}from"#harness/emission.js";import{recordTaskAgentAddress}from"#harness/handles/transitions.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{runStep}from"#context/run-step.js";import{propagateSubagentExecutorCancel}from"#execution/tasks/parent/dispatch.js";import{activeTurnId}from"#harness/active-turn-id.js";import{CallbackBaseUrlKey,isAuthorizationSignal}from"#harness/authorization.js";import{sendTaskCommand,sendTaskInboundPayload}from"#execution/tasks/parent/run-parent.js";import{recordSessionTask}from"#tasks/session-index.js";import{readSubagentExecutor}from"#tasks/types.js";import{beginBackgroundTask,rejectDelegatedDispatch}from"#execution/tasks/parent/delegate.js";import{isTurnCancellation}from"#harness/turn-cancellation.js";import{BackgroundToolExecutorKey}from"#harness/background-tools.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{createTaskDelegated,isTaskDelegated}from"#tools/task.js";function runBackgroundStep(e,t,n){return runStep(e,t,n,[backgroundToolExecutionProvider])}const backgroundToolExecutionProvider={key:BackgroundToolExecutorKey,create(e,t){return{value:new BackgroundToolExecutionScope(t,e.get(BundleKey))}},async commit(e,t){return await requireExecutionScope(e).commit(t)},async rollback(e,t){await requireExecutionScope(e).rollback(t)},decorateStepResult(e,t){return requireExecutionScope(e).decorate(t)}};function readRetainedBackgroundToolResult(e){let t=e.get(BackgroundToolExecutorKey);return t instanceof BackgroundToolExecutionScope?t.retainedResult():void 0}var BackgroundToolExecutionScope=class{bundle;executions=new Map;records=[];retained=!1;initialSession;constructor(e,t){this.bundle=t,this.initialSession=e}execute(e){let t=this.executions.get(e.options.toolCallId);if(t!==void 0)return t;if(!e.batch.calls.some(t=>t.callId===e.options.toolCallId))throw Error(`Background tool call "${e.options.toolCallId}" was not registered before execution.`);let n=this.start(e);return this.executions.set(e.options.toolCallId,n),n}async commit(e){let t=this.records.filter(e=>!e.settled);return t.length>0&&await compensateBackgroundToolExecution(t,Error(`Background tool execution did not delegate or complete its task.`),this.bundle),this.apply(e)}decorate(e){let t=this.resultFields();return t===void 0?e:{...e,...t}}async rollback(e){let t=this.records.filter(e=>e.settled),n=this.records.filter(e=>!e.settled);if(n.length>0&&await compensateBackgroundToolExecution(n,e,this.bundle),t.length!==0){if(isTurnCancellation(e)){this.retained=!0;return}await compensateBackgroundToolExecution(t,e,this.bundle)}}retainedResult(){return this.retained?this.resultFields():void 0}apply(e){let t=e;for(let e of this.records){if(!e.settled||e.task===void 0)continue;let n=readSubagentExecutor(e.task.executor);n!==void 0&&(t=recordTaskAgentAddress(t,n)),t=recordSessionTask(t,e.task)}return t}resultFields(){let e=this.records.flatMap(e=>e.settled&&e.task!==void 0?[e.task]:[]);if(e.length!==0)return{backgroundTaskSession:this.apply(this.initialSession),backgroundTasks:e.map(({taskInboxToken:e,taskId:t,taskRunId:n})=>({taskInboxToken:e,taskId:t,taskRunId:n}))}}async start(r){let a={settled:!1};this.records.push(a);let o=getHarnessEmissionState(this.initialSession.state),s=await beginBackgroundTask({callId:r.options.toolCallId,metadata:{kind:`tool`,name:r.definition.name},parentSessionId:this.initialSession.sessionId,parentStepIndex:o.stepIndex,parentTurnId:activeTurnId(o),session:this.initialSession});a.task=s;let c=loadContext().get(CallbackBaseUrlKey),l={taskId:s.taskId,token:s.taskInboxToken,...c===void 0?{}:{url:createWorkflowCallbackUrl(c,createEveCallbackRoutePath(s.taskInboxToken))}},u={batch:r.batch.calls,binding:l,delegated:({executor:e,receipt:t})=>createTaskDelegated({binding:l,executor:e,receipt:t}),send:createTaskSender(s,r.options.toolCallId),session:this.initialSession,task:s},d=r.definition.execute(r.toolInput,r.options,u);if(isAsyncIterable(d))throw Error(`Background tools cannot return AsyncIterable output.`);let f=await d;return isAuthorizationSignal(f)?f:isTaskDelegated(f)?(await deliverTaskCommand(s,{executor:f.executor,kind:`bind`}),a.task={...s,executor:f.executor},a.settled=!0,f.receipt):(await deliverTaskCommand(s,{data:parseJsonValue(f),kind:`complete`}),a.settled=!0,f)}};function requireExecutionScope(e){if(!(e instanceof BackgroundToolExecutionScope))throw Error(`The background tool executor is not owned by the task runtime.`);return e}async function deliverTaskCommand(e,t){if(await sendTaskCommand({command:t,taskInboxToken:e.taskInboxToken})!==`delivered`)throw Error(`Task run "${e.taskId}" did not accept "${t.kind}".`)}function createTaskSender(e,t){let n=0;return async r=>{if(r.kind!==`update`){await deliverTaskCommand(e,r);return}if(await sendTaskInboundPayload({payload:{callId:t,kind:`task-update`,message:r.message,updateEpoch:e.taskId,updateIndex:n++},taskInboxToken:e.taskInboxToken})!==`delivered`)throw Error(`Task run "${e.taskId}" did not accept "${r.kind}".`)}}async function compensateBackgroundToolExecution(e,t,n){let r=[];for(let i of e.toReversed()){if(i.task===void 0)continue;try{await rejectDelegatedDispatch({error:{code:`PARENT_STEP_FAILED`,message:t instanceof Error?t.message:String(t)},task:i.task})}catch(e){r.push(e)}let e=readSubagentExecutor(i.task.executor);e!==void 0&&await propagateSubagentExecutorCancel({bundle:n,executor:e,taskId:i.task.taskId})}if(r.length>0)throw AggregateError([t,...r],`Background tool execution failed and its tasks could not all be rejected.`,{cause:t})}export{backgroundToolExecutionProvider,readRetainedBackgroundToolResult,runBackgroundStep};
@@ -1,2 +1,2 @@
1
- import{z}from"#compiled/zod/index.js";import{createLogger}from"#internal/logging.js";import{loadContext}from"#context/container.js";import{toError}from"#shared/errors.js";import{defineTool}from"#tools/definition.js";import{stampDurableDynamicToolCallbacks}from"#tools/durable-callbacks.js";import{ContextKey}from"#context/key.js";import{resolveApprovalPolicy}from"#approval/definition.js";import{ConnectionRegistryKey}from"#context/providers/connection-key.js";import{consumeAuthorizationResult,createAuthorizationAttempt,requestAuthorization}from"#harness/authorization.js";import{ConnectionAuthorizationFailedError,isConnectionAuthorizationFailedError,isConnectionAuthorizationRequiredError}from"#connections/errors.js";import{supportsInteractiveAuthorization}from"#shared/connection-types.js";import{resolveAuthorizationCallbackUrl,stampChallengeDisplayName}from"#runtime/connections/scoped-authorization.js";import{writeCachedToken}from"#runtime/connections/authorization-tokens.js";import{principalKey,resolveConnectionPrincipal}from"#runtime/connections/principal.js";import{resolveConnectionAuthorization}from"#runtime/connections/resolve-authorization.js";const logger=createLogger(`framework.connection-search-dynamic`),CONNECTION_SEARCH_INPUT_SCHEMA=z.strictObject({connection:z.string().describe(`Optional: limit search to a specific connection name.`).optional(),keywords:z.string().describe(`Search keywords and expanded aliases. Distill intent into keywords; avoid stop words like 'a', 'the', 'in'.`),limit:z.number().describe(`Max results to return. Default 10.`).optional()}),connectionSchema=z.looseObject({}),CONNECTION_SEARCH_RESULT_ITEM_SCHEMA=z.strictObject({connection:z.string(),description:z.string(),error:z.string().optional(),inputSchema:connectionSchema.optional(),needsAuthorization:z.boolean().optional(),outputSchema:connectionSchema.optional(),qualifiedName:z.string().optional(),tool:z.string().optional()}),CONNECTION_SEARCH_OUTPUT_SCHEMA=z.array(CONNECTION_SEARCH_RESULT_ITEM_SCHEMA),ConnectionSearchResultsKey=new ContextKey(`eve.connectionSearchResults`);function qualifiedConnectionToolName(e,t){return`${e}__${t}`}function tokenize(e){return e.toLowerCase().split(/[\s_\-./]+/).filter(e=>e.length>1)}function scoreMatch(e,t){let n=tokenize(t.name),r=tokenize(t.description),i=0;for(let t of e){for(let e of n)(e.includes(t)||t.includes(e))&&(i+=3);for(let e of r)(e.includes(t)||t.includes(e))&&(i+=1)}return i}async function resolveInteractiveAuth(e,t){let n=e.getConnections().find(e=>e.connectionName===t);if(n===void 0)return;let r=await resolveConnectionAuthorization(n);if(supportsInteractiveAuthorization(r))return r}async function completePendingAuthorizations(e,t){let r=loadContext(),i=new Set;for(let n of t){let t=consumeAuthorizationResult(n.connectionName);if(!t)continue;let a=await resolveInteractiveAuth(e,n.connectionName);if(!a)continue;let o=t.principal??resolveConnectionPrincipal(n.connectionName,a),s=await a.completeAuthorization({callbackUrl:t.hookUrl,connection:{url:n.url??``},principal:o,resume:t.resume,callback:t.callback});writeCachedToken(r,n.connectionName,principalKey(o),s),i.add(n.connectionName)}return i}async function executeConnectionSearch(e){let t=loadContext(),i=t.get(ConnectionRegistryKey);if(i===void 0)return[];let a=e.limit??10,o=tokenize(e.keywords),s=[],l=[],u=e.connection!==void 0&&e.connection!==``?i.getConnections().filter(t=>t.connectionName===e.connection):i.getConnections();if(e.connection&&u.length===0)throw Error(`Connection "${e.connection}" is not registered. Available connections: ${i.getConnectionNames().join(`, `)}.`);let f=await completePendingAuthorizations(i,u),p=[];for(let e of u){let t;try{t=await i.getClient(e.connectionName).getToolMetadata()}catch(t){if(isConnectionAuthorizationRequiredError(t)){if(f.has(e.connectionName)){logger.warn(`connection still unauthorized after authorization`,{connection:e.connectionName}),l.push({connection:e.connectionName,description:e.description,error:`Authorization for "${e.connectionName}" did not take effect; the token was rejected after sign-in.`});continue}let t=await resolveInteractiveAuth(i,e.connectionName);if(t){let n=createAuthorizationAttempt(e.connectionName);if(n){let i=resolveConnectionPrincipal(e.connectionName,t),a=resolveAuthorizationCallbackUrl({authorization:t,callbackUrl:n.hookUrl});try{let{challenge:r,resume:o}=await t.startAuthorization({callbackUrl:a,connection:{url:e.url??``},principal:i});p.push({attemptId:n.attemptId,name:e.connectionName,challenge:stampChallengeDisplayName(r,t),hookUrl:a,principal:i,resume:o})}catch(t){let n=toError(t);logger.warn(`startAuthorization failed`,{connection:e.connectionName,error:n}),l.push({connection:e.connectionName,description:e.description,error:`Failed to start authorization for "${e.connectionName}": ${n.message}`});continue}}}l.push({connection:e.connectionName,description:e.description,needsAuthorization:!0});continue}if(isConnectionAuthorizationFailedError(t)){logger.warn(`connection authorization failed`,{connection:e.connectionName,reason:t.reason,retryable:t.retryable,error:t}),l.push({connection:e.connectionName,description:e.description,error:`Authorization failed for ${e.connectionName}: ${t.message}`});continue}let n=toError(t);logger.warn(`failed to load connection tools`,{connection:e.connectionName,error:n}),l.push({connection:e.connectionName,description:e.description,error:`Failed to load tools for "${e.connectionName}": ${n.message}`});continue}for(let n of t){let t=scoreMatch(o,n);t>0&&s.push({item:{connection:e.connectionName,description:n.description,inputSchema:n.inputSchema,outputSchema:n.outputSchema,qualifiedName:qualifiedConnectionToolName(e.connectionName,n.name),tool:n.name},score:t})}}if(p.length>0)return requestAuthorization(p);let m=l.filter(e=>e.error!==void 0);if(u.length>0&&m.length===u.length)throw Error(m.map(e=>e.error).join(`
2
- `));s.sort((e,t)=>t.score-e.score);let h=s.slice(0,a).map(e=>e.item);if(h.length>0){let e=[...h,...l],n=t.get(ConnectionSearchResultsKey)??[],r=new Map(n.map(e=>[e.qualifiedName,e]));for(let e of h)e.qualifiedName&&r.set(e.qualifiedName,e);return t.set(ConnectionSearchResultsKey,[...r.values()]),e}return u.map(e=>l.find(t=>t.connection===e.connectionName)||{connection:e.connectionName,description:e.description})}function readDiscoveredToolClosure(e){let t=e.connectionName,n=e.toolName;if(typeof t!=`string`||typeof n!=`string`)throw Error(`Discovered connection tool callback metadata is invalid.`);return{connectionName:t,toolName:n}}async function executeDiscoveredConnectionTool(e,t,r){let{connectionName:i,toolName:a}=readDiscoveredToolClosure(e),o=loadContext().get(ConnectionRegistryKey);if(o===void 0)throw Error(`Connection registry is unavailable while replaying a discovered tool.`);let s=o.getConnections().find(e=>e.connectionName===i),d=await resolveInteractiveAuth(o,i),f=!1;if(d){let e=consumeAuthorizationResult(i);if(e){f=!0;let t=loadContext(),r=e.principal??resolveConnectionPrincipal(i,d),a=await d.completeAuthorization({callbackUrl:e.hookUrl,connection:{url:s?.url??``},principal:r,resume:e.resume,callback:e.callback});writeCachedToken(t,i,principalKey(r),a)}}try{return await o.getClient(i).executeTool(a,t,{abortSignal:r.abortSignal,callId:r.callId})}catch(e){if(!isConnectionAuthorizationRequiredError(e)||!d)throw e;if(f)throw new ConnectionAuthorizationFailedError(i,{retryable:!1,reason:`token_rejected_after_authorization`,message:`Connection "${i}" rejected the token immediately after authorization.`});let t=createAuthorizationAttempt(i);if(!t)throw e;let n=resolveConnectionPrincipal(i,d),r=resolveAuthorizationCallbackUrl({authorization:d,callbackUrl:t.hookUrl}),{challenge:a,resume:o}=await d.startAuthorization({callbackUrl:r,connection:{url:s?.url??``},principal:n});return requestAuthorization([{attemptId:t.attemptId,name:i,challenge:stampChallengeDisplayName(a,d),hookUrl:r,principal:n,resume:o}])}}async function requestDiscoveredConnectionToolApproval(e,t){let{connectionName:r}=readDiscoveredToolClosure(e),i=loadContext().get(ConnectionRegistryKey)?.getConnectionApproval(r);return i===void 0?`not-applicable`:await resolveApprovalPolicy(i)(t)}async function authorizeDiscoveredConnectionToolApproval(e,t){let{connectionName:r}=readDiscoveredToolClosure(e),i=loadContext().get(ConnectionRegistryKey)?.getConnectionApproval(r),a=i===void 0||typeof i==`function`?void 0:i.response;return a===void 0?{reason:`Approval response authorization is unavailable.`,status:`rejected`}:await a(t)}async function resolveConnectionSearchDynamicTools(){let e=loadContext().get(ConnectionRegistryKey);if(!e||e.getConnections().length===0)return null;let t=e.getConnections().map(e=>e.connectionName),r=loadContext().get(ConnectionSearchResultsKey)??[],o={},s=defineTool({description:`Search for tools across your connections. Discovered tools become directly callable by their qualified name (e.g. \`linear__list_issues\`) in your next response. Available connections: ${t.join(`, `)}.`,inputSchema:CONNECTION_SEARCH_INPUT_SCHEMA,async execute(e){return executeConnectionSearch(e)},outputSchema:CONNECTION_SEARCH_OUTPUT_SCHEMA});stampDurableDynamicToolCallbacks(s,{execute:{callback:(e,t)=>executeConnectionSearch(t),closure:{}}}),o.connection_search=s;for(let t of r){let n=t.connection,r=t.tool,s=e.getConnectionApproval(n),c={connectionName:n,toolName:r},l=defineTool({description:t.description,inputSchema:t.inputSchema??{type:`object`},approval:s,outputSchema:t.outputSchema,async execute(e,t){return await executeDiscoveredConnectionTool(c,e,t)}});stampDurableDynamicToolCallbacks(l,{execute:{callback:executeDiscoveredConnectionTool,closure:c},...s===void 0?{}:{approvalRequest:{callback:requestDiscoveredConnectionToolApproval,closure:c}},...s===void 0||typeof s==`function`||s.response===void 0?{}:{approvalResponse:{callback:authorizeDiscoveredConnectionToolApproval,closure:c}}}),o[qualifiedConnectionToolName(n,r)]=l}return o}export{resolveConnectionSearchDynamicTools};
1
+ import{z}from"#compiled/zod/index.js";import{createLogger}from"#internal/logging.js";import{loadContext}from"#context/container.js";import{toError}from"#shared/errors.js";import{defineTool}from"#tools/definition.js";import{stampDurableDynamicToolCallbacks}from"#tools/durable-callbacks.js";import{ContextKey}from"#context/key.js";import{ConnectionRegistryKey}from"#context/providers/connection-key.js";import{resolveApprovalPolicy}from"#approval/definition.js";import{consumeAuthorizationResult,createAuthorizationAttempt,getAuthorizationResults,requestAuthorization}from"#harness/authorization.js";import{ConnectionAuthorizationFailedError,isConnectionAuthorizationFailedError,isConnectionAuthorizationRequiredError}from"#connections/errors.js";import{supportsInteractiveAuthorization}from"#shared/connection-types.js";import{resolveAuthorizationCallbackUrl,stampChallengeDisplayName}from"#runtime/connections/scoped-authorization.js";import{writeCachedToken}from"#runtime/connections/authorization-tokens.js";import{connectionAuthorizationScope}from"#runtime/connections/instance-identity.js";import{principalKey,resolveConnectionPrincipal}from"#runtime/connections/principal.js";import{resolveConnectionAuthorization}from"#runtime/connections/resolve-authorization.js";const logger=createLogger(`framework.connection-search-dynamic`),CONNECTION_SEARCH_INPUT_SCHEMA=z.strictObject({connection:z.string().describe(`Optional: limit search to a specific connection name.`).optional(),keywords:z.string().describe(`Search keywords and expanded aliases. Distill intent into keywords; avoid stop words like 'a', 'the', 'in'.`),limit:z.number().describe(`Max results to return. Default 10.`).optional()}),connectionSchema=z.looseObject({}),CONNECTION_SEARCH_RESULT_ITEM_SCHEMA=z.strictObject({connection:z.string(),description:z.string(),error:z.string().optional(),inputSchema:connectionSchema.optional(),needsAuthorization:z.boolean().optional(),outputSchema:connectionSchema.optional(),qualifiedName:z.string().optional(),tool:z.string().optional()}),CONNECTION_SEARCH_OUTPUT_SCHEMA=z.array(CONNECTION_SEARCH_RESULT_ITEM_SCHEMA),ConnectionSearchResultsKey=new ContextKey(`eve.connectionSearchResults`);function qualifiedConnectionToolName(e,t){return`${e}__${t}`}function tokenize(e){return e.toLowerCase().split(/[\s_\-./]+/).filter(e=>e.length>1)}function scoreMatch(e,t){let n=tokenize(t.name),r=tokenize(t.description),i=0;for(let t of e){for(let e of n)(e.includes(t)||t.includes(e))&&(i+=3);for(let e of r)(e.includes(t)||t.includes(e))&&(i+=1)}return i}async function resolveInteractiveAuth(e,t){let n=e.getConnections().find(e=>e.connectionName===t);if(n===void 0)return;let r=await resolveConnectionAuthorization(n);if(supportsInteractiveAuthorization(r))return r}async function completePendingAuthorizations(e,t){assertPendingConnectionAuthorizationInstances(e);let r=loadContext(),i=new Set;for(let n of t){let t=consumeAuthorizationResult(n.connectionName,n.instanceId);if(!t)continue;let a=await resolveInteractiveAuth(e,n.connectionName);if(!a)continue;let o=t.principal??resolveConnectionPrincipal(n.connectionName,a),s=await a.completeAuthorization({callbackUrl:t.hookUrl,connection:{url:n.url??``},principal:o,resume:t.resume,callback:t.callback});writeCachedToken(r,connectionAuthorizationScope(n),principalKey(o),s),i.add(n.connectionName)}return i}async function executeConnectionSearch(e){let t=loadContext(),i=t.get(ConnectionRegistryKey);if(i===void 0)return[];let a=e.limit??10,o=tokenize(e.keywords),c=[],l=[],u=e.connection!==void 0&&e.connection!==``?i.getConnections().filter(t=>t.connectionName===e.connection):i.getConnections();if(e.connection&&u.length===0)throw Error(`Connection "${e.connection}" is not registered. Available connections: ${i.getConnectionNames().join(`, `)}.`);let d=await completePendingAuthorizations(i,u),p=[];for(let e of u){let t;try{t=await i.getClient(e.connectionName).getToolMetadata()}catch(t){if(isConnectionAuthorizationRequiredError(t)){if(d.has(e.connectionName)){logger.warn(`connection still unauthorized after authorization`,{connection:e.connectionName}),l.push({connection:e.connectionName,description:e.description,error:`Authorization for "${e.connectionName}" did not take effect; the token was rejected after sign-in.`});continue}let t=await resolveInteractiveAuth(i,e.connectionName);if(t){let n=createAuthorizationAttempt(e.connectionName);if(n){let i=resolveConnectionPrincipal(e.connectionName,t),a=resolveAuthorizationCallbackUrl({authorization:t,callbackUrl:n.hookUrl});try{let{challenge:r,resume:o}=await t.startAuthorization({callbackUrl:a,connection:{url:e.url??``},principal:i});p.push({attemptId:n.attemptId,name:e.connectionName,challenge:stampChallengeDisplayName(r,t),hookUrl:a,instanceId:e.instanceId,principal:i,resume:o})}catch(t){let n=toError(t);logger.warn(`startAuthorization failed`,{connection:e.connectionName,error:n}),l.push({connection:e.connectionName,description:e.description,error:`Failed to start authorization for "${e.connectionName}": ${n.message}`});continue}}}l.push({connection:e.connectionName,description:e.description,needsAuthorization:!0});continue}if(isConnectionAuthorizationFailedError(t)){logger.warn(`connection authorization failed`,{connection:e.connectionName,reason:t.reason,retryable:t.retryable,error:t}),l.push({connection:e.connectionName,description:e.description,error:`Authorization failed for ${e.connectionName}: ${t.message}`});continue}let n=toError(t);logger.warn(`failed to load connection tools`,{connection:e.connectionName,error:n}),l.push({connection:e.connectionName,description:e.description,error:`Failed to load tools for "${e.connectionName}": ${n.message}`});continue}for(let n of t){let t=scoreMatch(o,n);t>0&&c.push({item:{connection:e.connectionName,description:n.description,inputSchema:n.inputSchema,outputSchema:n.outputSchema,qualifiedName:qualifiedConnectionToolName(e.connectionName,n.name),tool:n.name},score:t})}}if(p.length>0)return requestAuthorization(p);let m=l.filter(e=>e.error!==void 0);if(u.length>0&&m.length===u.length)throw Error(m.map(e=>e.error).join(`
2
+ `));c.sort((e,t)=>t.score-e.score);let h=c.slice(0,a).map(e=>e.item);if(h.length>0){let e=[...h,...l],n=t.get(ConnectionSearchResultsKey)??[],r=new Map(n.map(e=>[e.qualifiedName,e]));for(let e of h)e.qualifiedName&&r.set(e.qualifiedName,e);return t.set(ConnectionSearchResultsKey,[...r.values()]),e}return u.map(e=>l.find(t=>t.connection===e.connectionName)||{connection:e.connectionName,description:e.description})}function readDiscoveredToolClosure(e){let t=e.connectionName,n=e.toolName;if(typeof t!=`string`||typeof n!=`string`)throw Error(`Discovered connection tool callback metadata is invalid.`);return{connectionName:t,toolName:n}}async function executeDiscoveredConnectionTool(e,t,r){let{connectionName:i,toolName:a}=readDiscoveredToolClosure(e),o=loadContext().get(ConnectionRegistryKey);if(o===void 0)throw Error(`Connection registry is unavailable while replaying a discovered tool.`);let c=o.getConnections().find(e=>e.connectionName===i);assertPendingConnectionAuthorizationInstances(o);let u=await resolveInteractiveAuth(o,i),f=!1;if(u){let e=consumeAuthorizationResult(i,c?.instanceId);if(e){f=!0;let t=loadContext(),r=e.principal??resolveConnectionPrincipal(i,u),a=await u.completeAuthorization({callbackUrl:e.hookUrl,connection:{url:c?.url??``},principal:r,resume:e.resume,callback:e.callback});writeCachedToken(t,c===void 0?i:connectionAuthorizationScope(c),principalKey(r),a)}}try{return await o.getClient(i).executeTool(a,t,{abortSignal:r.abortSignal,callId:r.callId})}catch(e){if(!isConnectionAuthorizationRequiredError(e)||!u)throw e;if(f)throw new ConnectionAuthorizationFailedError(i,{retryable:!1,reason:`token_rejected_after_authorization`,message:`Connection "${i}" rejected the token immediately after authorization.`});let t=createAuthorizationAttempt(i);if(!t)throw e;let n=resolveConnectionPrincipal(i,u),r=resolveAuthorizationCallbackUrl({authorization:u,callbackUrl:t.hookUrl}),{challenge:a,resume:o}=await u.startAuthorization({callbackUrl:r,connection:{url:c?.url??``},principal:n});return requestAuthorization([{attemptId:t.attemptId,name:i,challenge:stampChallengeDisplayName(a,u),hookUrl:r,instanceId:c?.instanceId,principal:n,resume:o}])}}function assertPendingConnectionAuthorizationInstances(e){let t=new Map(e.getConnections().map(e=>[e.connectionName,e]));for(let e of getAuthorizationResults())if(e.instanceId!==void 0&&t.get(e.name)?.instanceId!==e.instanceId)throw Error(`Authorization for "${e.name}" cannot complete because its resolved connection changed while sign-in was pending. Start sign-in again.`)}async function requestDiscoveredConnectionToolApproval(e,t){let{connectionName:r}=readDiscoveredToolClosure(e),i=loadContext().get(ConnectionRegistryKey)?.getConnectionApproval(r);return i===void 0?`not-applicable`:await resolveApprovalPolicy(i)(t)}async function authorizeDiscoveredConnectionToolApproval(e,t){let{connectionName:r}=readDiscoveredToolClosure(e),i=loadContext().get(ConnectionRegistryKey)?.getConnectionApproval(r),a=i===void 0||typeof i==`function`?void 0:i.response;return a===void 0?{reason:`Approval response authorization is unavailable.`,status:`rejected`}:await a(t)}async function resolveConnectionSearchDynamicTools(){let e=loadContext().get(ConnectionRegistryKey);if(!e||e.getConnections().length===0)return null;let t=e.getConnections().map(e=>e.connectionName),r=new Set(t),o=(loadContext().get(ConnectionSearchResultsKey)??[]).filter(e=>r.has(e.connection)),c={},l=defineTool({description:`Search for tools across your connections. Discovered tools become directly callable by their qualified name (e.g. \`linear__list_issues\`) in your next response. Available connections: ${t.join(`, `)}.`,inputSchema:CONNECTION_SEARCH_INPUT_SCHEMA,async execute(e){return executeConnectionSearch(e)},outputSchema:CONNECTION_SEARCH_OUTPUT_SCHEMA});stampDurableDynamicToolCallbacks(l,{execute:{callback:(e,t)=>executeConnectionSearch(t),closure:{}}}),c.connection_search=l;for(let t of o){let n=t.connection,r=t.tool,o=e.getConnectionApproval(n),s={connectionName:n,toolName:r},l=defineTool({description:t.description,inputSchema:t.inputSchema??{type:`object`},approval:o,outputSchema:t.outputSchema,async execute(e,t){return await executeDiscoveredConnectionTool(s,e,t)}});stampDurableDynamicToolCallbacks(l,{execute:{callback:executeDiscoveredConnectionTool,closure:s},...o===void 0?{}:{approvalRequest:{callback:requestDiscoveredConnectionToolApproval,closure:s}},...o===void 0||typeof o==`function`||o.response===void 0?{}:{approvalResponse:{callback:authorizeDiscoveredConnectionToolApproval,closure:s}}}),c[qualifiedConnectionToolName(n,r)]=l}return c}export{resolveConnectionSearchDynamicTools};
@@ -1 +1 @@
1
- import{z}from"#compiled/zod/index.js";import{loadContext}from"#context/container.js";import{DynamicSkillManifestKey,SandboxKey}from"#context/keys.js";import{loadSkillFromSandbox}from"#runtime/skills/sandbox-access.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{ConnectionRegistryKey}from"#context/providers/connection-key.js";async function executeLoadSkillTool(e){let n=loadContext(),{skill:i}=e,a=n.require(BundleKey).resolvedAgent.skills,o=availableDynamicSkillNames(n),s=[...new Set([...a.map(e=>e.name),...o])].sort();try{if(o.includes(i)){let e=n.get(SandboxKey);if(e===void 0)throw Error(`The dynamic skill "${i}" requires sandbox access on the runtime context.`);return await loadSkillFromSandbox(e,i,s)}let e=a.find(e=>e.name===i);if(e!==void 0)return e.markdown;throw Error(formatSkillNotFoundError(i,s))}catch(e){let t=n.get(ConnectionRegistryKey)?.getConnectionNames().find(e=>e.toLowerCase()===i.toLowerCase());if(t===void 0||s.includes(i))throw e;let r=e instanceof Error?e.message:String(e);throw Error(`${r} "${t}" is an installed connection, not a skill. Use connection_search with connection "${t}" to find its tools.`,{cause:e})}}function availableDynamicSkillNames(e){let t=Object.values(e.get(DynamicSkillManifestKey)??{}).flat().map(e=>e.name);return[...new Set(t)].sort()}function formatSkillNotFoundError(e,t){return`No skill named "${e}".${t.length>0?` Available skills: ${t.join(`, `)}.`:``}`}const SKILL_INPUT_SCHEMA=z.strictObject({skill:z.string().describe(`Available skill name or id.`)}),SKILL_OUTPUT_SCHEMA=z.string();async function executeLoadSkill(e){return await executeLoadSkillTool(e)}export{SKILL_INPUT_SCHEMA,SKILL_OUTPUT_SCHEMA,executeLoadSkill};
1
+ import{z}from"#compiled/zod/index.js";import{loadContext}from"#context/container.js";import{DynamicSkillManifestKey,SandboxKey}from"#context/keys.js";import{loadSkillFromSandbox}from"#runtime/skills/sandbox-access.js";import{ConnectionRegistryKey}from"#context/providers/connection-key.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";async function executeLoadSkillTool(e){let n=loadContext(),{skill:i}=e,a=n.require(BundleKey).resolvedAgent.skills,o=availableDynamicSkillNames(n),s=[...new Set([...a.map(e=>e.name),...o])].sort();try{if(o.includes(i)){let e=n.get(SandboxKey);if(e===void 0)throw Error(`The dynamic skill "${i}" requires sandbox access on the runtime context.`);return await loadSkillFromSandbox(e,i,s)}let e=a.find(e=>e.name===i);if(e!==void 0)return e.markdown;throw Error(formatSkillNotFoundError(i,s))}catch(e){let t=n.get(ConnectionRegistryKey)?.getConnectionNames().find(e=>e.toLowerCase()===i.toLowerCase());if(t===void 0||s.includes(i))throw e;let r=e instanceof Error?e.message:String(e);throw Error(`${r} "${t}" is an installed connection, not a skill. Use connection_search with connection "${t}" to find its tools.`,{cause:e})}}function availableDynamicSkillNames(e){let t=Object.values(e.get(DynamicSkillManifestKey)??{}).flat().map(e=>e.name);return[...new Set(t)].sort()}function formatSkillNotFoundError(e,t){return`No skill named "${e}".${t.length>0?` Available skills: ${t.join(`, `)}.`:``}`}const SKILL_INPUT_SCHEMA=z.strictObject({skill:z.string().describe(`Available skill name or id.`)}),SKILL_OUTPUT_SCHEMA=z.string();async function executeLoadSkill(e){return await executeLoadSkillTool(e)}export{SKILL_INPUT_SCHEMA,SKILL_OUTPUT_SCHEMA,executeLoadSkill};
@@ -1 +1 @@
1
- import{createLogger,logError}from"#internal/logging.js";import{loadContext}from"#context/container.js";import{HandleEventKey}from"#context/keys.js";import{createSubagentCalledEvent}from"#protocol/message.js";import{defineTool}from"#tools/definition.js";import{parseJsonObject}from"#shared/json.js";import{getHarnessEmissionState}from"#harness/emission.js";import{workflowEntryReference}from"#execution/workflow-runtime.js";import{serializeContext}from"#context/serialize.js";import{createDurableSessionState}from"#execution/durable-session-store.js";import{SUBAGENT_TASK_RECEIPT_OUTPUT_SCHEMA}from"#tools/framework/task-contract.js";import{dispatchToTaskAgentAddress}from"#execution/agent-handle-dispatch.js";import{createAgentContinuationBundle}from"#execution/agent-continuation-bundle.js";import{prepareAgentActionDispatch,startSubagent}from"#execution/dispatch-runtime-actions-shared.js";import{deriveChildActivityObserverConfig}from"#execution/activity-work.js";import{SUBAGENT_TOOL_INPUT_SCHEMA}from"#tools/framework/agent-contract.js";import{CallbackBaseUrlKey}from"#harness/authorization.js";import{activeTurnId}from"#harness/active-turn-id.js";import{createSubagentExecutorBinding}from"#tasks/types.js";import{findTaskAgentAddress}from"#execution/tasks/parent/control-shared.js";import{checkTaskContinuationAvailability,createTaskContinuationBusyResult,describeTaskDispatch}from"#execution/tasks/parent/continuation-dispatch.js";const localSubagentExecutors=new WeakSet,batchAgentClaims=new WeakMap,log=createLogger(`runtime.framework-tools.subagent`);function defineSubagent(e){return defineTool({description:e.description,execution:`background`,inputSchema:SUBAGENT_TOOL_INPUT_SCHEMA,outputSchema:SUBAGENT_TASK_RECEIPT_OUTPUT_SCHEMA,execute:(t,n,r)=>executeSubagentTool({definition:e,kind:`local`,task:r,toolContext:n,toolInput:t})})}function registerLocalSubagentExecutor(e){localSubagentExecutors.add(e)}function countLocalSubagentCalls(e){return e.filter(e=>localSubagentExecutors.has(e.definition.execute)).length}async function executeSubagentTool(e){let t=loadContext(),{batch:r,session:i,task:a}=e.task,o=getHarnessEmissionState(i.state),s={callId:e.toolContext.callId,description:e.definition.description,input:parseJsonObject(SUBAGENT_TOOL_INPUT_SCHEMA.parse(e.toolInput)),name:e.definition.name,nodeId:e.definition.nodeId},c=await dispatchSubagent({action:e.kind===`remote`?{...s,kind:`remote-agent-call`,remoteAgentName:e.definition.name}:{...s,kind:`subagent-call`,subagentName:e.definition.name},batch:r,callbackBaseUrl:t.get(CallbackBaseUrlKey),ctx:t,event:{...o,turnId:activeTurnId(o)},localFanoutSize:countLocalSubagentCalls(r),serializedContext:serializeContext(t),sessionState:createDurableSessionState({session:i}),task:a}),l=findTaskAgentAddress(c.session,c.agentId);if(l===void 0)throw Error(`Subagent dispatch for "${c.agentId}" recorded no task agent address.`);let u=createSubagentExecutorBinding({address:l.address,identity:l.identity});await emitSubagentCalled$1({callId:e.toolContext.callId,childSessionId:c.address.sessionId,event:{...o,turnId:activeTurnId(o)},name:c.name,remote:c.remote,sessionId:i.sessionId,toolName:e.definition.name});let d=e.task.delegated({executor:u,receipt:{agentId:c.agentId}});return await emitSubagentCompleted({callId:e.toolContext.callId,output:JSON.stringify(d.receipt),subagentName:c.name,taskId:d.receipt.taskId}),d}async function dispatchSubagent(e){let t=await prepareAgentActionDispatch({action:e.action,ctx:e.ctx,event:e.event,localFanoutSize:e.localFanoutSize,serializedContext:e.serializedContext,sessionState:e.sessionState}),n=t.plan[0];if(n===void 0||n.kind===`task-control`)throw Error(`Subagent tool dispatch produced no executable plan entry.`);if(n.kind===`reject`)throw Error(JSON.stringify(n.result.output));if(n.kind===`resume`){let r=await checkTaskContinuationAvailability({action:n.action,agentId:n.agentId,parentStepIndex:e.event.stepIndex,parentTurnId:e.event.turnId,session:t.session});if(r!==void 0)throw Error(JSON.stringify(r.output));let i=claimBatchAgent(e.batch,n.agentId,e.task.taskId);if(i!==void 0){let e=createTaskContinuationBusyResult({action:n.action,agentId:n.agentId,status:`working`,taskId:i});throw Error(JSON.stringify(e.output))}}let r=n.kind===`resume`?await dispatchToTaskAgentAddress({action:n.action,activityObserver:t.activityObserver===void 0?void 0:deriveChildActivityObserverConfig({activityObserver:t.activityObserver,callId:n.action.callId,kind:`task`,name:n.action.name,parentSessionId:t.session.sessionId,parentTurnId:e.event.turnId}),agentId:n.agentId,auth:t.auth,bundle:createAgentContinuationBundle({action:n.action,bundle:t.bundle,dynamicRemoteAgent:n.dynamicRemoteAgent}),currentSession:t.session,parentToken:e.task.taskInboxToken}):await startSubagent({auth:t.auth,batchEvent:e.event,bundle:t.bundle,callbackBaseUrl:e.callbackBaseUrl,capabilities:t.capabilities,channelMetadata:t.channelMetadata,currentSession:t.session,fanoutSize:t.fanoutSize,initiatorAuth:t.initiatorAuth,parentContinuationToken:e.task.taskInboxToken,parentTraceContext:t.parentTraceContext,activityObserver:t.activityObserver,sandboxSessionId:t.sandboxSessionId,serializedContext:t.serializedContext,session:t.session,taskOwned:!0,target:n.target});if(r.kind===`error`)throw Error(JSON.stringify(r.result.output));let i=describeTaskDispatch({action:e.action,agentId:n.kind===`resume`?n.agentId:void 0,parentSessionId:t.session.sessionId,parentTurnId:e.event.turnId,session:r.session}),a=n.kind===`resume`?n.dynamicRemoteAgent:n.target.kind===`remote`?n.target.dynamicRemoteAgent:void 0;return{address:r.address,agentId:i.agentId,mode:i.mode,name:i.name,...r.address.kind===`agent/remote`?{remote:{resolverId:a?.credentialsStepId??e.action.nodeId,url:r.address.url}}:{},session:r.session}}function claimBatchAgent(e,t,n){let r=batchAgentClaims.get(e);r===void 0&&(r=new Map,batchAgentClaims.set(e,r));let i=r.get(t);if(i!==void 0)return i;r.set(t,n)}async function emitSubagentCalled$1(e){let a=loadContext().get(HandleEventKey);if(a!==void 0)try{await a(createSubagentCalledEvent({callId:e.callId,childSessionId:e.childSessionId,name:e.name,remote:e.remote,sequence:e.event.sequence,sessionId:e.sessionId,toolName:e.toolName,turnId:e.event.turnId,workflowId:workflowEntryReference.workflowId}))}catch(n){logError(log,`subagent.called emission failed`,n,{callId:e.callId,childSessionId:e.childSessionId,toolName:e.toolName})}}async function emitSubagentCompleted(e){let i=loadContext().get(HandleEventKey);if(i!==void 0)try{await i({data:{backgroundTask:{status:`working`,taskId:e.taskId},callId:e.callId,output:e.output,subagentName:e.subagentName},type:`subagent.completed`})}catch(n){logError(log,`subagent.completed emission failed`,n,{callId:e.callId,taskId:e.taskId})}}export{countLocalSubagentCalls,defineSubagent,executeSubagentTool,registerLocalSubagentExecutor};
1
+ import{createLogger,logError}from"#internal/logging.js";import{loadContext}from"#context/container.js";import{HandleEventKey}from"#context/keys.js";import{createSubagentCalledEvent}from"#protocol/message.js";import{defineTool}from"#tools/definition.js";import{parseJsonObject}from"#shared/json.js";import{getHarnessEmissionState}from"#harness/emission.js";import{workflowEntryReference}from"#execution/workflow-runtime.js";import{serializeContext}from"#context/serialize.js";import{createDurableSessionState}from"#execution/durable-session-store.js";import{SUBAGENT_TASK_RECEIPT_OUTPUT_SCHEMA}from"#tools/framework/task-contract.js";import{dispatchToTaskAgentAddress}from"#execution/agent-handle-dispatch.js";import{createAgentContinuationBundle}from"#execution/agent-continuation-bundle.js";import{prepareAgentActionDispatch,startSubagent}from"#execution/dispatch-runtime-actions-shared.js";import{deriveChildActivityObserverConfig}from"#execution/activity-work.js";import{activeTurnId}from"#harness/active-turn-id.js";import{SUBAGENT_TOOL_INPUT_SCHEMA}from"#tools/framework/agent-contract.js";import{CallbackBaseUrlKey}from"#harness/authorization.js";import{createSubagentExecutorBinding}from"#tasks/types.js";import{findTaskAgentAddress}from"#execution/tasks/parent/control-shared.js";import{checkTaskContinuationAvailability,createTaskContinuationBusyResult,describeTaskDispatch}from"#execution/tasks/parent/continuation-dispatch.js";const localSubagentExecutors=new WeakSet,batchAgentClaims=new WeakMap,log=createLogger(`runtime.framework-tools.subagent`);function defineSubagent(e){return defineTool({description:e.description,execution:`background`,inputSchema:SUBAGENT_TOOL_INPUT_SCHEMA,outputSchema:SUBAGENT_TASK_RECEIPT_OUTPUT_SCHEMA,execute:(t,n,r)=>executeSubagentTool({definition:e,kind:`local`,task:r,toolContext:n,toolInput:t})})}function registerLocalSubagentExecutor(e){localSubagentExecutors.add(e)}function countLocalSubagentCalls(e){return e.filter(e=>localSubagentExecutors.has(e.definition.execute)).length}async function executeSubagentTool(e){let t=loadContext(),{batch:r,session:i,task:a}=e.task,o=getHarnessEmissionState(i.state),s={callId:e.toolContext.callId,description:e.definition.description,input:parseJsonObject(SUBAGENT_TOOL_INPUT_SCHEMA.parse(e.toolInput)),name:e.definition.name,nodeId:e.definition.nodeId},c=await dispatchSubagent({action:e.kind===`remote`?{...s,kind:`remote-agent-call`,remoteAgentName:e.definition.name}:{...s,kind:`subagent-call`,subagentName:e.definition.name},batch:r,callbackBaseUrl:t.get(CallbackBaseUrlKey),ctx:t,event:{...o,turnId:activeTurnId(o)},localFanoutSize:countLocalSubagentCalls(r),serializedContext:serializeContext(t),sessionState:createDurableSessionState({session:i}),task:a}),l=findTaskAgentAddress(c.session,c.agentId);if(l===void 0)throw Error(`Subagent dispatch for "${c.agentId}" recorded no task agent address.`);let u=createSubagentExecutorBinding({address:l.address,identity:l.identity});await emitSubagentCalled$1({callId:e.toolContext.callId,childSessionId:c.address.sessionId,event:{...o,turnId:activeTurnId(o)},name:c.name,remote:c.remote,sessionId:i.sessionId,toolName:e.definition.name});let d=e.task.delegated({executor:u,receipt:{agentId:c.agentId}});return await emitSubagentCompleted({callId:e.toolContext.callId,output:JSON.stringify(d.receipt),subagentName:c.name,taskId:d.receipt.taskId}),d}async function dispatchSubagent(e){let t=await prepareAgentActionDispatch({action:e.action,ctx:e.ctx,event:e.event,localFanoutSize:e.localFanoutSize,serializedContext:e.serializedContext,sessionState:e.sessionState}),n=t.plan[0];if(n===void 0||n.kind===`task-control`)throw Error(`Subagent tool dispatch produced no executable plan entry.`);if(n.kind===`reject`)throw Error(JSON.stringify(n.result.output));if(n.kind===`resume`){let r=await checkTaskContinuationAvailability({action:n.action,agentId:n.agentId,parentStepIndex:e.event.stepIndex,parentTurnId:e.event.turnId,session:t.session});if(r!==void 0)throw Error(JSON.stringify(r.output));let i=claimBatchAgent(e.batch,n.agentId,e.task.taskId);if(i!==void 0){let e=createTaskContinuationBusyResult({action:n.action,agentId:n.agentId,status:`working`,taskId:i});throw Error(JSON.stringify(e.output))}}let r=n.kind===`resume`?await dispatchToTaskAgentAddress({action:n.action,activityObserver:t.activityObserver===void 0?void 0:deriveChildActivityObserverConfig({activityObserver:t.activityObserver,callId:n.action.callId,kind:`task`,name:n.action.name,parentSessionId:t.session.sessionId,parentTurnId:e.event.turnId}),agentId:n.agentId,auth:t.auth,bundle:createAgentContinuationBundle({action:n.action,bundle:t.bundle,dynamicRemoteAgent:n.dynamicRemoteAgent}),currentSession:t.session,parentToken:e.task.taskInboxToken}):await startSubagent({auth:t.auth,batchEvent:e.event,bundle:t.bundle,callbackBaseUrl:e.callbackBaseUrl,capabilities:t.capabilities,channelMetadata:t.channelMetadata,currentSession:t.session,fanoutSize:t.fanoutSize,initiatorAuth:t.initiatorAuth,parentContinuationToken:e.task.taskInboxToken,parentTraceContext:t.parentTraceContext,activityObserver:t.activityObserver,sandboxSessionId:t.sandboxSessionId,serializedContext:t.serializedContext,session:t.session,taskOwned:!0,target:n.target});if(r.kind===`error`)throw Error(JSON.stringify(r.result.output));let i=describeTaskDispatch({action:e.action,agentId:n.kind===`resume`?n.agentId:void 0,parentSessionId:t.session.sessionId,parentTurnId:e.event.turnId,session:r.session}),a=n.kind===`resume`?n.dynamicRemoteAgent:n.target.kind===`remote`?n.target.dynamicRemoteAgent:void 0;return{address:r.address,agentId:i.agentId,mode:i.mode,name:i.name,...r.address.kind===`agent/remote`?{remote:{resolverId:a?.credentialsStepId??e.action.nodeId,url:r.address.url}}:{},session:r.session}}function claimBatchAgent(e,t,n){let r=batchAgentClaims.get(e);r===void 0&&(r=new Map,batchAgentClaims.set(e,r));let i=r.get(t);if(i!==void 0)return i;r.set(t,n)}async function emitSubagentCalled$1(e){let a=loadContext().get(HandleEventKey);if(a!==void 0)try{await a(createSubagentCalledEvent({callId:e.callId,childSessionId:e.childSessionId,name:e.name,remote:e.remote,sequence:e.event.sequence,sessionId:e.sessionId,toolName:e.toolName,turnId:e.event.turnId,workflowId:workflowEntryReference.workflowId}))}catch(n){logError(log,`subagent.called emission failed`,n,{callId:e.callId,childSessionId:e.childSessionId,toolName:e.toolName})}}async function emitSubagentCompleted(e){let i=loadContext().get(HandleEventKey);if(i!==void 0)try{await i({data:{backgroundTask:{status:`working`,taskId:e.taskId},callId:e.callId,output:e.output,subagentName:e.subagentName},type:`subagent.completed`})}catch(n){logError(log,`subagent.completed emission failed`,n,{callId:e.callId,taskId:e.taskId})}}export{countLocalSubagentCalls,defineSubagent,executeSubagentTool,registerLocalSubagentExecutor};
@@ -1 +1 @@
1
- import{createHook,getWorkflowMetadata,sleep}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{migrateTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{dispatchRuntimeActionsStep}from"#execution/dispatch-runtime-actions-step.js";import{dispatchTaskStep}from"#execution/tasks/parent/dispatch-task-step.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{getRuntimeActionResultKey}from"#runtime/actions/keys.js";import{runProxySubagentEventStep}from"#execution/subagent-event-proxy-step.js";import{activeTurnId}from"#harness/active-turn-id.js";import{acknowledgeDelegatedTasksStep}from"#execution/tasks/parent/delegate.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{sendTurnControlStep}from"#execution/turn-control-protocol.js";import{isInboxSubagentResultFromRunningHandle}from"#harness/handles/query.js";import{preserveSerializedSessionDynamicModelSelection}from"#context/serialized-dynamic-model-selection.js";import{cancelDescendantTurnsStep}from"#execution/cancel-descendant-turns-step.js";import{dispatchWorkflowRuntimeActionsStep}from"#execution/dispatch-workflow-runtime-actions-step.js";import{createTurnCancellationControl}from"#execution/turn-cancellation-control.js";import{TurnExecutionCursor}from"#execution/turn-execution-cursor.js";import{turnStep}from"#execution/workflow-steps.js";import{resolveRuntimeActionResultsForKeys}from"#runtime/actions/results.js";const TASK_MODE_WAIT_ERROR_MESSAGE="Task mode cannot wait for follow-up input (`next: null`).";async function turnWorkflow(e){"use workflow";let t=migrateTurnWorkflowInput(e);return t.driverCapabilities?.turnInbox===!0?runTurnOwnedWorkflow(t):runLegacyTurnWorkflow(t)}async function runTurnOwnedWorkflow(n){let s=createHook({token:`${n.completionToken}:inbox`}),c=s[Symbol.asyncIterator](),l=new TurnExecutionCursor({controlToken:n.completionToken,parentWritable:n.stepInput.parentWritable,serializedContext:n.stepInput.serializedContext,sessionState:n.stepInput.sessionState}),u=0,nextDeliveryRequestId=()=>`${s.token}:delivery:${String(u++)}`,f=[],p=n.stepInput.input,m=!1,h;try{try{await claimHookOwnership(s),m=!0}catch(e){if(isHookConflictError(e))return;throw e}for(n.driverCapabilities?.cancelledTurnSettle===!0&&(h=await createTurnCancellationControl({controlToken:n.completionToken,expectedTurnId:activeTurnId(n.stepInput.sessionState.emissionState)}));;){let e={serializedContext:l.serializedContext,sessionState:l.sessionState},r=await turnStep(l.createStepInput(p,h?.signal)),i=r.action===`dispatch-workflow-runtime-actions`||r.action===`park`?r.pendingRuntimeActionKeys:void 0,a=(r.backgroundTasks?.length??0)>0;if(a){if(r.backgroundTaskState===void 0)throw Error(`Background tasks were returned without their committed session state.`);await l.adopt({serializedContext:e.serializedContext,sessionState:r.backgroundTaskState}),await acknowledgeDelegatedTasksStep({tasks:r.backgroundTasks??[]})}if(r.action===`cancelled`){await l.adopt({serializedContext:r.serializedContext,sessionState:r.backgroundTaskState??r.sessionState}),await finishCancelledTurn({bufferedDeliveries:f,cancellation:h,cursor:l});return}if(h?.signal.aborted===!0&&(i===void 0||a)){await l.adopt({serializedContext:preserveSerializedSessionDynamicModelSelection(e.serializedContext,r.serializedContext),sessionState:l.sessionState}),await finishCancelledTurn({bufferedDeliveries:f,cancellation:h,cursor:l});return}if(r.sleepDurationMs!==void 0&&await waitForTurnSleep(r.sleepDurationMs,h)===`cancel`){await finishCancelledTurn({bufferedDeliveries:f,cancellation:h,cursor:l});return}if(r.action===`done`){await h?.dispose(),await l.finish(r,{kind:`done`,output:r.output??``,isError:r.isError,usage:r.usage,usageDelta:r.usageDelta},f);return}if(i!==void 0){await l.adopt(r);let e=r.action===`park`&&r.tasksEnabled,n;n=r.action===`dispatch-workflow-runtime-actions`?dispatchWorkflowRuntimeActionsStep:e?dispatchTaskStep:dispatchRuntimeActionsStep;let a=await n({callbackBaseUrl:resolveWorkflowCallbackBaseUrl(getWorkflowMetadata().url),parentContinuationToken:s.token,parentWritable:l.parentWritable,serializedContext:l.serializedContext,sessionState:l.sessionState}),u=a.results.length===0?void 0:Date.now();await l.adopt(a),await acknowledgeDelegatedTasksStep({tasks:a.pendingTasks});let d=await waitForRuntimeActionResults({bufferedDeliveries:f,cancellation:h,cursor:l,inboxToken:s.token,initialAcceptedAtMs:u,initialResults:a.results,iterator:c,nextDeliveryRequestId,pendingActionKeys:i});if(d===`cancelled`){p=void 0;continue}if(d===`cancel-turn`){await finishCancelledTurn({bufferedDeliveries:f,cancellation:h,cursor:l});return}p={kind:`runtime-action-result`,...d};continue}if(r.action===`park`){if(!(r.hasPendingAuthorization||r.hasPendingInputBatch&&n.capabilities?.requestInput===!0||n.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);await h?.dispose(),await l.finish(r,{authorizationAttemptIds:r.authorizationAttemptIds,authorizationNames:r.authorizationNames,kind:`park`,settled:r.settled},f);return}await l.adopt(r),p=void 0}}catch(e){throw await l.send({error:normalizeSerializableError(e),kind:`turn-error`}),e}finally{h!==void 0&&await h.dispose(),m&&await disposeHook(s)}}async function finishCancelledTurn(e){await cancelDescendantTurnsStep({serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState}),await e.cancellation?.dispose(),await e.cursor.finish({sessionState:e.cursor.sessionState},{cancelled:!0,kind:`park`},e.bufferedDeliveries)}async function waitForTurnSleep(e,t){if(t?.signal.aborted===!0)return`cancel`;let r=sleep(e).then(()=>`slept`);return t===void 0?r:Promise.race([r,t.requested])}async function waitForRuntimeActionResults(e){let t,n=[...e.initialResults],r=new Map;if(e.initialAcceptedAtMs!==void 0)for(let t of e.initialResults)r.set(getRuntimeActionResultKey(t),e.initialAcceptedAtMs);for(;;){let i=resolveRuntimeActionResultsForKeys({pendingKeys:e.pendingActionKeys,results:n});if(i!==void 0)return t!==void 0&&await e.cursor.send({kind:`turn-delivery-cancelled`,requestId:t}),{acceptedAtMsByCallId:Object.fromEntries(i.map(e=>[e.callId,r.get(getRuntimeActionResultKey(e))])),results:i};e.cursor.sessionState.hasProxyInputRequests&&t===void 0&&(t=e.nextDeliveryRequestId(),await e.cursor.send({continuationToken:e.cursor.sessionState.continuationToken,inboxToken:e.inboxToken,kind:`turn-delivery-request`,requestId:t}));let a=e.iterator.next();a.catch(()=>{});let o=await(e.cancellation===void 0?a:Promise.race([a,e.cancellation.requested]));if(o===`cancel`)return t!==void 0&&await e.cursor.send({kind:`turn-delivery-cancelled`,requestId:t}),`cancelled`;if(o.done)throw Error(`Turn inbox closed before runtime actions completed.`);let s=o.value;if(s.kind===`runtime-action-result`){let t=e.cursor.sessionState.snapshot?.session.state,i=s.results.filter(e=>isInboxSubagentResultFromRunningHandle(t,e));if(i.length>0){let e=Date.now();n.push(...i);for(let t of i)r.set(getRuntimeActionResultKey(t),e)}continue}if(s.kind===`subagent-input-request`||s.kind===`subagent-authorization-event`){let t=await runProxySubagentEventStep({hookPayload:s,parentWritable:e.cursor.parentWritable,serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState});await e.cursor.adopt(t);continue}if(s.kind===`driver-delivery`&&s.requestId===t){await e.cursor.send({kind:`turn-delivery-accepted`,requestId:s.requestId}),t=void 0;let n=await routeDeliverToChildren({delivery:s.delivery,parentWritable:e.cursor.parentWritable,serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState});if(await e.cursor.adopt({serializedContext:n.serializedContext??e.cursor.serializedContext,sessionState:n.sessionState??e.cursor.sessionState}),n.kind===`cancel-turn`)return n.kind;n.remainder!==void 0&&e.bufferedDeliveries.push(n.remainder)}}}async function runLegacyTurnWorkflow(e){let t=e.stepInput;try{for(;;){let r=await turnStep(t);if(r.action!==`cancelled`&&r.sleepDurationMs!==void 0&&await sleep(r.sleepDurationMs),r.action===`done`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`done`,output:r.output??``,isError:r.isError,serializedContext:r.serializedContext,sessionState:r.sessionState,usage:r.usage,usageDelta:r.usageDelta},kind:`turn-result`}});return}if(r.action===`dispatch-workflow-runtime-actions`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`dispatch-workflow-runtime-actions`,pendingActionKeys:r.pendingRuntimeActionKeys,serializedContext:r.serializedContext,sessionState:r.sessionState},kind:`turn-result`}});return}if(r.action===`park`){let t=r.pendingRuntimeActionKeys;if(!(t!==void 0||r.hasPendingAuthorization||r.hasPendingInputBatch&&e.capabilities?.requestInput===!0||e.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);let n=t===void 0?{kind:`park`,serializedContext:r.serializedContext,sessionState:r.sessionState,authorizationAttemptIds:r.authorizationAttemptIds,authorizationNames:r.authorizationNames,settled:r.settled}:{kind:`dispatch-runtime-actions`,pendingActionKeys:t,serializedContext:r.serializedContext,sessionState:r.sessionState};await sendTurnControlStep({controlToken:e.completionToken,payload:{action:n,kind:`turn-result`}});return}t={input:void 0,parentWritable:t.parentWritable,serializedContext:r.serializedContext,sessionState:r.sessionState}}}catch(t){throw await sendTurnControlStep({controlToken:e.completionToken,payload:{error:normalizeSerializableError(t),kind:`turn-error`}}),t}}export{turnWorkflow};
1
+ import{createHook,getWorkflowMetadata,sleep}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{migrateTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{dispatchRuntimeActionsStep}from"#execution/dispatch-runtime-actions-step.js";import{dispatchTaskStep}from"#execution/tasks/parent/dispatch-task-step.js";import{activeTurnId}from"#harness/active-turn-id.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{getRuntimeActionResultKey}from"#runtime/actions/keys.js";import{runProxySubagentEventStep}from"#execution/subagent-event-proxy-step.js";import{acknowledgeDelegatedTasksStep}from"#execution/tasks/parent/delegate.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{sendTurnControlStep}from"#execution/turn-control-protocol.js";import{isInboxSubagentResultFromRunningHandle}from"#harness/handles/query.js";import{preserveSerializedSessionDynamicModelSelection}from"#context/serialized-dynamic-model-selection.js";import{cancelDescendantTurnsStep}from"#execution/cancel-descendant-turns-step.js";import{dispatchWorkflowRuntimeActionsStep}from"#execution/dispatch-workflow-runtime-actions-step.js";import{createTurnCancellationControl}from"#execution/turn-cancellation-control.js";import{TurnExecutionCursor}from"#execution/turn-execution-cursor.js";import{turnStep}from"#execution/workflow-steps.js";import{resolveRuntimeActionResultsForKeys}from"#runtime/actions/results.js";const TASK_MODE_WAIT_ERROR_MESSAGE="Task mode cannot wait for follow-up input (`next: null`).";async function turnWorkflow(e){"use workflow";let t=migrateTurnWorkflowInput(e);return t.driverCapabilities?.turnInbox===!0?runTurnOwnedWorkflow(t):runLegacyTurnWorkflow(t)}async function runTurnOwnedWorkflow(n){let s=createHook({token:`${n.completionToken}:inbox`}),l=s[Symbol.asyncIterator](),u=new TurnExecutionCursor({controlToken:n.completionToken,parentWritable:n.stepInput.parentWritable,serializedContext:n.stepInput.serializedContext,sessionState:n.stepInput.sessionState}),d=0,nextDeliveryRequestId=()=>`${s.token}:delivery:${String(d++)}`,f=[],p=n.stepInput.input,m=!1,h;try{try{await claimHookOwnership(s),m=!0}catch(e){if(isHookConflictError(e))return;throw e}for(n.driverCapabilities?.cancelledTurnSettle===!0&&(h=await createTurnCancellationControl({controlToken:n.completionToken,expectedTurnId:activeTurnId(n.stepInput.sessionState.emissionState)}));;){let e={serializedContext:u.serializedContext,sessionState:u.sessionState},r=await turnStep(u.createStepInput(p,h?.signal)),i=r.action===`dispatch-workflow-runtime-actions`||r.action===`park`?r.pendingRuntimeActionKeys:void 0,a=(r.backgroundTasks?.length??0)>0;if(a){if(r.backgroundTaskState===void 0)throw Error(`Background tasks were returned without their committed session state.`);await u.adopt({serializedContext:e.serializedContext,sessionState:r.backgroundTaskState}),await acknowledgeDelegatedTasksStep({tasks:r.backgroundTasks??[]})}if(r.action===`cancelled`){await u.adopt({serializedContext:r.serializedContext,sessionState:r.backgroundTaskState??r.sessionState}),await finishCancelledTurn({bufferedDeliveries:f,cancellation:h,cursor:u});return}if(h?.signal.aborted===!0&&(i===void 0||a)){await u.adopt({serializedContext:preserveSerializedSessionDynamicModelSelection(e.serializedContext,r.serializedContext),sessionState:u.sessionState}),await finishCancelledTurn({bufferedDeliveries:f,cancellation:h,cursor:u});return}if(r.sleepDurationMs!==void 0&&await waitForTurnSleep(r.sleepDurationMs,h)===`cancel`){await finishCancelledTurn({bufferedDeliveries:f,cancellation:h,cursor:u});return}if(r.action===`done`){await h?.dispose(),await u.finish(r,{kind:`done`,output:r.output??``,isError:r.isError,usage:r.usage,usageDelta:r.usageDelta},f);return}if(i!==void 0){await u.adopt(r);let e=r.action===`park`&&r.tasksEnabled,n;n=r.action===`dispatch-workflow-runtime-actions`?dispatchWorkflowRuntimeActionsStep:e?dispatchTaskStep:dispatchRuntimeActionsStep;let a=await n({callbackBaseUrl:resolveWorkflowCallbackBaseUrl(getWorkflowMetadata().url),parentContinuationToken:s.token,parentWritable:u.parentWritable,serializedContext:u.serializedContext,sessionState:u.sessionState}),c=a.results.length===0?void 0:Date.now();await u.adopt(a),await acknowledgeDelegatedTasksStep({tasks:a.pendingTasks});let d=await waitForRuntimeActionResults({bufferedDeliveries:f,cancellation:h,cursor:u,inboxToken:s.token,initialAcceptedAtMs:c,initialResults:a.results,iterator:l,nextDeliveryRequestId,pendingActionKeys:i});if(d===`cancelled`){p=void 0;continue}if(d===`cancel-turn`){await finishCancelledTurn({bufferedDeliveries:f,cancellation:h,cursor:u});return}p={kind:`runtime-action-result`,...d};continue}if(r.action===`park`){if(!(r.hasPendingAuthorization||r.hasPendingInputBatch&&n.capabilities?.requestInput===!0||n.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);await h?.dispose(),await u.finish(r,{authorizationAttemptIds:r.authorizationAttemptIds,authorizationNames:r.authorizationNames,kind:`park`,settled:r.settled},f);return}await u.adopt(r),p=void 0}}catch(e){throw await u.send({error:normalizeSerializableError(e),kind:`turn-error`}),e}finally{h!==void 0&&await h.dispose(),m&&await disposeHook(s)}}async function finishCancelledTurn(e){await cancelDescendantTurnsStep({serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState}),await e.cancellation?.dispose(),await e.cursor.finish({sessionState:e.cursor.sessionState},{cancelled:!0,kind:`park`},e.bufferedDeliveries)}async function waitForTurnSleep(e,t){if(t?.signal.aborted===!0)return`cancel`;let r=sleep(e).then(()=>`slept`);return t===void 0?r:Promise.race([r,t.requested])}async function waitForRuntimeActionResults(e){let t,n=[...e.initialResults],r=new Map;if(e.initialAcceptedAtMs!==void 0)for(let t of e.initialResults)r.set(getRuntimeActionResultKey(t),e.initialAcceptedAtMs);for(;;){let i=resolveRuntimeActionResultsForKeys({pendingKeys:e.pendingActionKeys,results:n});if(i!==void 0)return t!==void 0&&await e.cursor.send({kind:`turn-delivery-cancelled`,requestId:t}),{acceptedAtMsByCallId:Object.fromEntries(i.map(e=>[e.callId,r.get(getRuntimeActionResultKey(e))])),results:i};e.cursor.sessionState.hasProxyInputRequests&&t===void 0&&(t=e.nextDeliveryRequestId(),await e.cursor.send({continuationToken:e.cursor.sessionState.continuationToken,inboxToken:e.inboxToken,kind:`turn-delivery-request`,requestId:t}));let a=e.iterator.next();a.catch(()=>{});let o=await(e.cancellation===void 0?a:Promise.race([a,e.cancellation.requested]));if(o===`cancel`)return t!==void 0&&await e.cursor.send({kind:`turn-delivery-cancelled`,requestId:t}),`cancelled`;if(o.done)throw Error(`Turn inbox closed before runtime actions completed.`);let s=o.value;if(s.kind===`runtime-action-result`){let t=e.cursor.sessionState.snapshot?.session.state,i=s.results.filter(e=>isInboxSubagentResultFromRunningHandle(t,e));if(i.length>0){let e=Date.now();n.push(...i);for(let t of i)r.set(getRuntimeActionResultKey(t),e)}continue}if(s.kind===`subagent-input-request`||s.kind===`subagent-authorization-event`){let t=await runProxySubagentEventStep({hookPayload:s,parentWritable:e.cursor.parentWritable,serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState});await e.cursor.adopt(t);continue}if(s.kind===`driver-delivery`&&s.requestId===t){await e.cursor.send({kind:`turn-delivery-accepted`,requestId:s.requestId}),t=void 0;let n=await routeDeliverToChildren({delivery:s.delivery,parentWritable:e.cursor.parentWritable,serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState});if(await e.cursor.adopt({serializedContext:n.serializedContext??e.cursor.serializedContext,sessionState:n.sessionState??e.cursor.sessionState}),n.kind===`cancel-turn`)return n.kind;n.remainder!==void 0&&e.bufferedDeliveries.push(n.remainder)}}}async function runLegacyTurnWorkflow(e){let t=e.stepInput;try{for(;;){let r=await turnStep(t);if(r.action!==`cancelled`&&r.sleepDurationMs!==void 0&&await sleep(r.sleepDurationMs),r.action===`done`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`done`,output:r.output??``,isError:r.isError,serializedContext:r.serializedContext,sessionState:r.sessionState,usage:r.usage,usageDelta:r.usageDelta},kind:`turn-result`}});return}if(r.action===`dispatch-workflow-runtime-actions`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`dispatch-workflow-runtime-actions`,pendingActionKeys:r.pendingRuntimeActionKeys,serializedContext:r.serializedContext,sessionState:r.sessionState},kind:`turn-result`}});return}if(r.action===`park`){let t=r.pendingRuntimeActionKeys;if(!(t!==void 0||r.hasPendingAuthorization||r.hasPendingInputBatch&&e.capabilities?.requestInput===!0||e.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);let n=t===void 0?{kind:`park`,serializedContext:r.serializedContext,sessionState:r.sessionState,authorizationAttemptIds:r.authorizationAttemptIds,authorizationNames:r.authorizationNames,settled:r.settled}:{kind:`dispatch-runtime-actions`,pendingActionKeys:t,serializedContext:r.serializedContext,sessionState:r.sessionState};await sendTurnControlStep({controlToken:e.completionToken,payload:{action:n,kind:`turn-result`}});return}t={input:void 0,parentWritable:t.parentWritable,serializedContext:r.serializedContext,sessionState:r.sessionState}}}catch(t){throw await sendTurnControlStep({controlToken:e.completionToken,payload:{error:normalizeSerializableError(t),kind:`turn-error`}}),t}}export{turnWorkflow};
@@ -1 +1 @@
1
- import{randomBytes}from"node:crypto";import{createEveActivityRoutePath}from"#protocol/routes.js";import{createLogger,logError}from"#internal/logging.js";import{getChannelActivityPresentation}from"#channel/activity-renderer.js";import{RuntimeSessionOwnershipConflictError}from"#execution/runtime-errors.js";import{sessionCommandHookToken}from"#execution/session-command-token.js";import{normalizeChannelAudience}from"#shared/channel-audience.js";import{ActivityObserverKey,ChannelInstrumentationKey,OtelTraceEnabledKey,SessionTraceSeedKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{walkCauseChain}from"#shared/errors.js";import{isEveDevEnvironment}from"#internal/application/dev-environment.js";import{cancelRun,getHookByToken,getRun,getWorld,start}from"#internal/workflow/runtime.js";import{createWorkflowCallbackUrl,resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{serializeContext}from"#context/serialize.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{EntityConflictError,HookNotFoundError,RunExpiredError,WorkflowRunNotFoundError}from"#compiled/@workflow/errors/index.js";import{buildSessionAttributes,buildSubagentRootAttributes,readParentLineage}from"#execution/eve-workflow-attributes.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{isSampledTrace,resolveTracePolicy,resolveTracePolicyDecision}from"#tracing/sampled-trace.js";import{getInstrumentationRuntime}from"#harness/instrumentation/runtime.js";import{resumeSessionInbox}from"#execution/wire/session-inbox-resume.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{buildRunContext}from"#execution/runtime-context.js";import{parseNdjsonStream}from"#execution/ndjson-stream.js";import{buildInvocationAttributes}from"#internal/invocation/metadata.js";const WORKFLOW_ENTRY_NAME=`workflowEntry`,TURN_WORKFLOW_NAME=`turnWorkflow`,SESSION_TIMEOUT_WORKFLOW_NAME=`sessionTimeoutWorkflow`,TASK_RUN_WORKFLOW_NAME=`taskRunWorkflow`,ACTIVITY_COLLECTOR_WORKFLOW_NAME=`activityCollectorWorkflow`,EVE_PACKAGE_INFO=resolveInstalledPackageInfo(),COMMAND_HOOK_READY_TIMEOUT_MS=3e4,LATEST_DEPLOYMENT_UNSUPPORTED_MESSAGE=`deploymentId 'latest' requires a World that implements resolveLatestDeploymentId()`,STABLE_WORKFLOW_NAMES=new Set([WORKFLOW_ENTRY_NAME,TURN_WORKFLOW_NAME,SESSION_TIMEOUT_WORKFLOW_NAME,TASK_RUN_WORKFLOW_NAME,ACTIVITY_COLLECTOR_WORKFLOW_NAME]),STABLE_ID_BASE=EVE_PACKAGE_INFO.name,log=createLogger(`execution.workflow-runtime`),workflowEntryReference={workflowId:`workflow//${STABLE_ID_BASE}//${WORKFLOW_ENTRY_NAME}`},turnWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${TURN_WORKFLOW_NAME}`},sessionTimeoutWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${SESSION_TIMEOUT_WORKFLOW_NAME}`},taskRunWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${TASK_RUN_WORKFLOW_NAME}`},activityCollectorWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${ACTIVITY_COLLECTOR_WORKFLOW_NAME}`};function createWorkflowRuntime(n){return{async createSession(a){let o=await getCompiledRuntimeAgentBundle({compiledArtifactsSource:n.compiledArtifactsSource,nodeId:n.nodeId}),s=buildRunContext({bundle:o,dynamicSubagentAgentConfig:n.dynamicSubagentAgentConfig,run:a}),c=resolveEffectiveAgentRuntime(o,s),l=s.get(ChannelInstrumentationKey),u=allocateSessionTraceSeed({agentName:c.turnAgent.id,audience:normalizeChannelAudience(l?.metadata.audience),channelType:l?.channelType,parentTraceContext:a.parentTraceContext});u!==void 0&&s.set(SessionTraceSeedKey,u),s.set(OtelTraceEnabledKey,getInstrumentationRuntime()?.prepareSessionTrace!==void 0);let d=c.limits?.sessionTimeoutMs,f,p=a.activityObserver;if(a.parent===void 0&&p===void 0&&(getChannelActivityPresentation(a.adapter)?.renderers.length??0)>0){let n=serializeContext(s),r=randomBytes(32).toString(`base64url`),i={expiresAt:new Date(Date.now()+(typeof d==`number`?d:864e5)).toISOString(),serializedContext:n,token:r};try{f=(await startWorkflowPreferLatest(activityCollectorWorkflowReference,[i])).runId,p={sink:{url:createWorkflowCallbackUrl(resolveWorkflowCallbackBaseUrl(process.env.VERCEL_URL?`https://${process.env.VERCEL_URL}`:`http://localhost:3000`),createEveActivityRoutePath(r)),version:1}},s.set(ActivityObserverKey,p)}catch{await cancelActivityCollector(f),f=void 0,log.warn(`failed to start activity collector`)}}let m=serializeContext(s),h=readParentLineage(m),g={input:a.input,limits:a.limits,serializedContext:m};d!==void 0&&(g.sessionTimeoutMs=d);let _={...h.sessionId===void 0?buildSessionAttributes({inputMessage:a.title??a.input.message,serializedContext:m}):buildSubagentRootAttributes({identity:{nodeId:o.nodeId??ROOT_RUNTIME_AGENT_NODE_ID},parentCallId:h.callId,parentSessionId:h.sessionId,parentTurnId:h.turnId,rootSessionId:h.rootSessionId??h.sessionId,serializedContext:m}),...a.externalInvocation===void 0?{}:buildInvocationAttributes(a.externalInvocation)},v;try{v=await startWorkflowPreferLatest(workflowEntryReference,[g],{allowReservedAttributes:!0,attributes:normalizeEveAttributes(_)})}catch(e){throw await cancelActivityCollector(f),logError(log,`failed to start workflow run`,e,{continuationToken:a.continuationToken}),e}try{if(a.continuationToken){let e=await waitForCommandHookOwner(a.continuationToken);if(e.runId!==v.runId)throw new RuntimeSessionOwnershipConflictError({continuationToken:a.continuationToken,ownerSessionId:e.runId,sessionId:v.runId})}await waitForOwnedCommandHook(sessionCommandHookToken(v.runId),v.runId)}catch(e){throw await cancelActivityCollector(f),e}let y,getEvents=()=>(y??=parseNdjsonStream(()=>getRun(v.runId).getReadable()),y);return{get events(){return getEvents()},sessionId:v.runId}},async dispatchContinuation(e){return await dispatchWorkflowCommand(e.continuationToken,e.command)},async dispatchSession(e){return await dispatchWorkflowCommand(sessionCommandHookToken(e.sessionId),e.command)},async getEventStream(e,t){return parseNdjsonStream(()=>getRun(e).getReadable({startIndex:t?.startIndex}))},async getStreamTailIndex(e){let t=getRun(e).getReadable();try{return await t.getTailIndex()}finally{await t.cancel().catch(()=>{})}},async resolveContinuation(e){try{return{sessionId:(await getHookByToken(e)).runId}}catch(t){if(HookNotFoundError.is(t))return;throw logError(log,`failed to resolve session by continuation token`,t,{continuationToken:e}),t}}}}async function cancelActivityCollector(e){if(e!==void 0)try{await cancelRun(await getWorld(),e,{cancelReason:`Root session creation did not complete`})}catch{log.warn(`failed to cancel unowned activity collector`)}}async function dispatchWorkflowCommand(e,t){let n;try{n=normalizeWorkflowHook(await resumeSessionInbox(e,t))}catch(n){if(isInactiveCommandTarget(n))return inactiveCommandResult(t);throw logError(log,`failed to dispatch session command`,n,{command:t.kind,token:e}),n}return t.kind===`reset`&&await waitForCommandHookRelease(sessionCommandHookToken(n.runId),n.runId),activeCommandResult(t,n.runId)}function activeCommandResult(e,t){return e.kind===`reset`?{previousSessionId:t,status:`reset`}:(e.kind,{sessionId:t,status:`accepted`})}function inactiveCommandResult(e){return e.kind===`send`?{status:`session_not_active`}:e.kind===`cancel`?{status:`no_active_turn`}:{status:`no_active_session`}}async function requestWorkflowTurnCancellation(e){let t={kind:`cancel`};return e.taskId!==void 0&&(t.taskId=e.taskId),e.turnId!==void 0&&(t.turnId=e.turnId),await dispatchWorkflowCommand(sessionCommandHookToken(e.sessionId),t)}function isInactiveCommandTarget(e){if(HookNotFoundError.is(e))return!0;for(let t of walkCauseChain(e))if(WorkflowRunNotFoundError.is(t)||RunExpiredError.is(t)||EntityConflictError.is(t))return!0;return!1}async function waitForOwnedCommandHook(e,t){let n=await waitForCommandHookOwner(e);if(n.runId!==t)throw new RuntimeSessionOwnershipConflictError({continuationToken:e,ownerSessionId:n.runId,sessionId:t})}async function waitForCommandHookOwner(e){let t=Date.now()+COMMAND_HOOK_READY_TIMEOUT_MS;for(;;)try{return normalizeWorkflowHook(await getHookByToken(e))}catch(e){if(!HookNotFoundError.is(e)||Date.now()>=t)throw e;await new Promise(e=>setTimeout(e,20))}}async function waitForCommandHookRelease(e,t){let n=Date.now()+COMMAND_HOOK_READY_TIMEOUT_MS;for(;;){try{if(normalizeWorkflowHook(await getHookByToken(e)).runId!==t)return}catch(e){if(HookNotFoundError.is(e))return;throw e}if(Date.now()>=n)throw Error(`Timed out waiting for session "${t}" to release its command inbox.`);await new Promise(e=>setTimeout(e,20))}}async function startWorkflowPreferLatest(e,t,n){if(!shouldRouteToLatestDeployment())return n===void 0?await start(e,t):await start(e,t,n);try{return await start(e,t,{...n,deploymentId:`latest`})}catch(r){if(!isLatestDeploymentUnsupportedError(r))throw r;return n===void 0?await start(e,t):await start(e,t,n)}}function shouldRouteToLatestDeployment(){return process.env.VERCEL_ENV===`production`||isEveDevEnvironment()}function isLatestDeploymentUnsupportedError(e){return e instanceof Error&&e.message.includes(`deploymentId 'latest' requires a World that implements resolveLatestDeploymentId()`)}function normalizeWorkflowHook(e){if(typeof e!=`object`||!e||!(`runId`in e))throw Error(`Workflow hook did not include a run id.`);let t=e.runId;if(typeof t!=`string`||t.length===0)throw Error(`Workflow hook did not include a run id.`);return{runId:t}}function allocateSessionTraceSeed(e){if(e.parentTraceContext!==void 0)return{decision:e.parentTraceContext.decision??resolveTracePolicyDecision(isSampledTrace(e.parentTraceContext),e.audience),spanId:e.parentTraceContext.spanId,traceFlags:e.parentTraceContext.traceFlags,traceId:e.parentTraceContext.traceId};let t=getInstrumentationRuntime();if(t?.prepareSessionTrace===void 0||t.idGenerator===void 0)return;let n=resolveTracePolicy(t.otelSettings?.tracePolicy,{agentName:e.agentName,audience:e.audience,channelType:e.channelType});return{decision:n,spanId:t.idGenerator.allocateSpanId(),traceFlags:+(n.action===`record`),traceId:t.idGenerator.generateTraceId()}}export{LATEST_DEPLOYMENT_UNSUPPORTED_MESSAGE,STABLE_WORKFLOW_NAMES,activityCollectorWorkflowReference,createWorkflowRuntime,requestWorkflowTurnCancellation,sessionTimeoutWorkflowReference,startWorkflowPreferLatest,taskRunWorkflowReference,turnWorkflowReference,waitForCommandHookOwner,workflowEntryReference};
1
+ import{randomBytes}from"node:crypto";import{createEveActivityRoutePath}from"#protocol/routes.js";import{createLogger,logError}from"#internal/logging.js";import{getChannelActivityPresentation}from"#channel/activity-renderer.js";import{RuntimeSessionOwnershipConflictError}from"#execution/runtime-errors.js";import{sessionCommandHookToken}from"#execution/session-command-token.js";import{ActivityObserverKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{walkCauseChain}from"#shared/errors.js";import{isEveDevEnvironment}from"#internal/application/dev-environment.js";import{cancelRun,getHookByToken,getRun,getWorld,start}from"#internal/workflow/runtime.js";import{createWorkflowCallbackUrl,resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{serializeContext}from"#context/serialize.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{EntityConflictError,HookNotFoundError,RunExpiredError,WorkflowRunNotFoundError}from"#compiled/@workflow/errors/index.js";import{buildSessionAttributes,buildSubagentRootAttributes,readParentLineage}from"#execution/eve-workflow-attributes.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{resumeSessionInbox}from"#execution/wire/session-inbox-resume.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{initializeSessionInstrumentation}from"#instrumentation/runtime.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{buildRunContext}from"#execution/runtime-context.js";import{parseNdjsonStream}from"#execution/ndjson-stream.js";import{buildInvocationAttributes}from"#internal/invocation/metadata.js";import{isAgentTraceContext}from"#tracing/agent-trace-context.js";const WORKFLOW_ENTRY_NAME=`workflowEntry`,TURN_WORKFLOW_NAME=`turnWorkflow`,SESSION_TIMEOUT_WORKFLOW_NAME=`sessionTimeoutWorkflow`,TASK_RUN_WORKFLOW_NAME=`taskRunWorkflow`,ACTIVITY_COLLECTOR_WORKFLOW_NAME=`activityCollectorWorkflow`,EVE_PACKAGE_INFO=resolveInstalledPackageInfo(),COMMAND_HOOK_READY_TIMEOUT_MS=3e4,LATEST_DEPLOYMENT_UNSUPPORTED_MESSAGE=`deploymentId 'latest' requires a World that implements resolveLatestDeploymentId()`,STABLE_WORKFLOW_NAMES=new Set([WORKFLOW_ENTRY_NAME,TURN_WORKFLOW_NAME,SESSION_TIMEOUT_WORKFLOW_NAME,TASK_RUN_WORKFLOW_NAME,ACTIVITY_COLLECTOR_WORKFLOW_NAME]),STABLE_ID_BASE=EVE_PACKAGE_INFO.name,log=createLogger(`execution.workflow-runtime`),workflowEntryReference={workflowId:`workflow//${STABLE_ID_BASE}//${WORKFLOW_ENTRY_NAME}`},turnWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${TURN_WORKFLOW_NAME}`},sessionTimeoutWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${SESSION_TIMEOUT_WORKFLOW_NAME}`},taskRunWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${TASK_RUN_WORKFLOW_NAME}`},activityCollectorWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${ACTIVITY_COLLECTOR_WORKFLOW_NAME}`};function createWorkflowRuntime(n){return{async createSession(a){let o=await getCompiledRuntimeAgentBundle({compiledArtifactsSource:n.compiledArtifactsSource,nodeId:n.nodeId}),s=buildRunContext({bundle:o,dynamicSubagentAgentConfig:n.dynamicSubagentAgentConfig,run:a}),c=resolveEffectiveAgentRuntime(o,s);initializeSessionInstrumentation({agentName:c.turnAgent.id,ctx:s,parentTraceContext:a.parentTraceContext});let l=c.limits?.sessionTimeoutMs,u,d=a.activityObserver;if(a.parent===void 0&&d===void 0&&(getChannelActivityPresentation(a.adapter)?.renderers.length??0)>0){let n=serializeContext(s),r=randomBytes(32).toString(`base64url`),i={expiresAt:new Date(Date.now()+(typeof l==`number`?l:864e5)).toISOString(),serializedContext:n,token:r};try{u=(await startWorkflowPreferLatest(activityCollectorWorkflowReference,[i])).runId,d={sink:{url:createWorkflowCallbackUrl(resolveWorkflowCallbackBaseUrl(process.env.VERCEL_URL?`https://${process.env.VERCEL_URL}`:`http://localhost:3000`),createEveActivityRoutePath(r)),version:1}},s.set(ActivityObserverKey,d)}catch{await cancelActivityCollector(u),u=void 0,log.warn(`failed to start activity collector`)}}let f=serializeContext(s),p=readParentLineage(f),m={input:a.input,limits:a.limits,serializedContext:f};l!==void 0&&(m.sessionTimeoutMs=l);let h={...p.sessionId===void 0?buildSessionAttributes({inputMessage:a.title??a.input.message,serializedContext:f}):buildSubagentRootAttributes({identity:{nodeId:o.nodeId??ROOT_RUNTIME_AGENT_NODE_ID},parentCallId:p.callId,parentSessionId:p.sessionId,parentTurnId:p.turnId,rootSessionId:p.rootSessionId??p.sessionId,serializedContext:f}),...a.externalInvocation===void 0?{}:buildInvocationAttributes(a.externalInvocation)},g;try{g=await startWorkflowPreferLatest(workflowEntryReference,[m],{allowReservedAttributes:!0,attributes:normalizeEveAttributes(h)})}catch(e){throw await cancelActivityCollector(u),logError(log,`failed to start workflow run`,e,{continuationToken:a.continuationToken}),e}try{if(a.continuationToken){let e=await waitForCommandHookOwner(a.continuationToken);if(e.runId!==g.runId)throw new RuntimeSessionOwnershipConflictError({continuationToken:a.continuationToken,ownerSessionId:e.runId,sessionId:g.runId})}await waitForOwnedCommandHook(sessionCommandHookToken(g.runId),g.runId)}catch(e){throw await cancelActivityCollector(u),e}let _,getEvents=()=>(_??=parseNdjsonStream(()=>getRun(g.runId).getReadable()),_);return{get events(){return getEvents()},sessionId:g.runId}},async dispatchContinuation(e){return await dispatchWorkflowCommand(e.continuationToken,e.command)},async dispatchSession(e){return await dispatchWorkflowCommand(sessionCommandHookToken(e.sessionId),e.command)},async getEventStream(e,t){return parseNdjsonStream(()=>getRun(e).getReadable({startIndex:t?.startIndex}))},async getStreamTailIndex(e){let t=getRun(e).getReadable();try{return await t.getTailIndex()}finally{await t.cancel().catch(()=>{})}},async resolveContinuation(e){try{return{sessionId:(await getHookByToken(e)).runId}}catch(t){if(HookNotFoundError.is(t))return;throw logError(log,`failed to resolve session by continuation token`,t,{continuationToken:e}),t}}}}async function cancelActivityCollector(e){if(e!==void 0)try{await cancelRun(await getWorld(),e,{cancelReason:`Root session creation did not complete`})}catch{log.warn(`failed to cancel unowned activity collector`)}}async function dispatchWorkflowCommand(e,t){let n;try{n=normalizeWorkflowHook(await resumeSessionInbox(e,t))}catch(n){if(isInactiveCommandTarget(n))return inactiveCommandResult(t);throw logError(log,`failed to dispatch session command`,n,{command:t.kind,token:e}),n}return t.kind===`reset`&&await waitForCommandHookRelease(sessionCommandHookToken(n.runId),n.runId),activeCommandResult(t,n.runId)}function activeCommandResult(e,t){return e.kind===`reset`?{previousSessionId:t,status:`reset`}:(e.kind,{sessionId:t,status:`accepted`})}function inactiveCommandResult(e){return e.kind===`send`?{status:`session_not_active`}:e.kind===`cancel`?{status:`no_active_turn`}:{status:`no_active_session`}}async function requestWorkflowTurnCancellation(e){let t={kind:`cancel`};return e.taskId!==void 0&&(t.taskId=e.taskId),e.turnId!==void 0&&(t.turnId=e.turnId),await dispatchWorkflowCommand(sessionCommandHookToken(e.sessionId),t)}function isInactiveCommandTarget(e){if(HookNotFoundError.is(e))return!0;for(let t of walkCauseChain(e))if(WorkflowRunNotFoundError.is(t)||RunExpiredError.is(t)||EntityConflictError.is(t))return!0;return!1}async function waitForOwnedCommandHook(e,t){let n=await waitForCommandHookOwner(e);if(n.runId!==t)throw new RuntimeSessionOwnershipConflictError({continuationToken:e,ownerSessionId:n.runId,sessionId:t})}async function waitForCommandHookOwner(e){let t=Date.now()+COMMAND_HOOK_READY_TIMEOUT_MS;for(;;)try{return normalizeWorkflowHook(await getHookByToken(e))}catch(e){if(!HookNotFoundError.is(e)||Date.now()>=t)throw e;await new Promise(e=>setTimeout(e,20))}}async function waitForCommandHookRelease(e,t){let n=Date.now()+COMMAND_HOOK_READY_TIMEOUT_MS;for(;;){try{if(normalizeWorkflowHook(await getHookByToken(e)).runId!==t)return}catch(e){if(HookNotFoundError.is(e))return;throw e}if(Date.now()>=n)throw Error(`Timed out waiting for session "${t}" to release its command inbox.`);await new Promise(e=>setTimeout(e,20))}}async function startWorkflowPreferLatest(e,t,n){let r=context.active(),i=isAgentTraceContext(r)?trace.deleteSpan(r):r;return await context.with(i,async()=>{if(!shouldRouteToLatestDeployment())return n===void 0?await start(e,t):await start(e,t,n);try{return await start(e,t,{...n,deploymentId:`latest`})}catch(r){if(!isLatestDeploymentUnsupportedError(r))throw r;return n===void 0?await start(e,t):await start(e,t,n)}})}function shouldRouteToLatestDeployment(){return process.env.VERCEL_ENV===`production`||isEveDevEnvironment()}function isLatestDeploymentUnsupportedError(e){return e instanceof Error&&e.message.includes(`deploymentId 'latest' requires a World that implements resolveLatestDeploymentId()`)}function normalizeWorkflowHook(e){if(typeof e!=`object`||!e||!(`runId`in e))throw Error(`Workflow hook did not include a run id.`);let t=e.runId;if(typeof t!=`string`||t.length===0)throw Error(`Workflow hook did not include a run id.`);return{runId:t}}export{LATEST_DEPLOYMENT_UNSUPPORTED_MESSAGE,STABLE_WORKFLOW_NAMES,activityCollectorWorkflowReference,createWorkflowRuntime,requestWorkflowTurnCancellation,sessionTimeoutWorkflowReference,startWorkflowPreferLatest,taskRunWorkflowReference,turnWorkflowReference,waitForCommandHookOwner,workflowEntryReference};
@@ -1 +1 @@
1
- import{callAdapterEventHandler,defaultDeliverResult}from"#channel/adapter.js";import{contextStorage}from"#context/container.js";import{AuthKey,CapabilitiesKey,HandleEventKey,ModeKey,SessionDynamicSubagentRuntimeRevisionKey,SessionDynamicToolRuntimeRevisionKey,TasksEnabledKey,TurnTaskDeliveryKey,TurnTaskStateKey}from"#context/keys.js";import{createAuthorizationCompletedEvent,createSessionStartedEvent,createTurnStartedEvent,encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{emitTurnPreamble,getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission.js";import{createWorkflowRuntime}from"#execution/workflow-runtime.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{dispatchDynamicSubagentEvent,refreshDynamicSessionSubagentsForRuntimeRevision}from"#context/dynamic-subagent-lifecycle.js";import{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{TASK_UPDATE_SESSION_INSTRUCTION,isTaskOwnedSerializedContext}from"#execution/tasks/child/instructions.js";import{TASK_UPDATE_TOOL_NAME}from"#tools/framework/task-contract.js";import{coalesceTurnInputs,normalizeUserContent}from"#harness/messages.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{preserveSerializedAgentTraceState}from"#tracing/agent-trace-context-store.js";import{getPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getRuntimeActionKeysFromWorkflowInterrupt,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{getInstrumentationRuntime}from"#harness/instrumentation/runtime.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{hasPendingInputBatch}from"#harness/input-requests.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{observeSessionActivity}from"#execution/session-activity-projection.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{activeTurnId}from"#harness/active-turn-id.js";import{getTurnUsageState,takeSessionUsageDelta,toUsage}from"#harness/turn-tag-state.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{readTurnSleepDurationMs}from"#harness/turn-sleep.js";import{preserveSerializedSessionDynamicModelSelection}from"#context/serialized-dynamic-model-selection.js";import{dispatchDynamicInstructionEvent,drainDynamicInstructionUserMessages,prepareDynamicInstructionPreamble}from"#context/dynamic-instruction-lifecycle.js";import{dispatchDynamicSkillEvent}from"#context/dynamic-skill-lifecycle.js";import{dispatchDynamicToolEvent,rebindMissingCompiledDynamicToolCallbacks,refreshDynamicSessionToolsForRuntimeRevision}from"#context/dynamic-tool-lifecycle.js";import{dispatchMemoryLifecycleEvent}from"#context/memory-event-lifecycle.js";import{channelDeliveryErrorCode,instrumentChannelDelivery}from"#harness/channel-delivery-instrumentation.js";import{preserveSerializedInstrumentationState}from"#harness/instrumentation/state.js";import{RuntimeActionSettlementTimesKey}from"#harness/runtime-action-settlement-state.js";import{matchAuthorizationCallbacks}from"#execution/authorization-callback-match.js";import{derivePendingState}from"#execution/pending-turn-state.js";import{forwardTaskEventToSessionCallback}from"#execution/task-event-callback.js";import{resolveEffectiveOutputSchema}from"#execution/effective-output-schema.js";import{buildRuntimeIdentity,createExecutionNodeStep}from"#execution/node-step.js";import{appendTaskAgentAnnouncement}from"#execution/tasks/parent/agent-views.js";import{resolveInitiatingTaskContext,resolveTaskDeliveryContext}from"#tasks/delivery-context.js";import{readRetainedBackgroundToolResult,runBackgroundStep}from"#execution/tasks/parent/tool-execution.js";import{prepareWorkflowPreambleTrace}from"#execution/workflow-trace-context.js";import{recordSubagentUsageSpans}from"#execution/subagent-usage-span.js";import{createExecutionHistoryView}from"#execution/history-view.js";import{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";import{stageAttachmentsToSandbox}from"#harness/attachment-staging.js";async function turnStep(a){"use step";let o=a,s=await readDurableSession(o.sessionState),c=await deserializeContext(o.serializedContext);a.input?.kind===`deliver`&&(c.set(TurnTaskDeliveryKey,`none`),c.delete(TurnTaskStateKey));let l=c.require(ChannelKey),u=c.require(BundleKey),d=u.resolvedAgent.config?.experimental?.tasks===!0;c.set(TasksEnabledKey,d);let f=resolveEffectiveAgentRuntime(u,c),p=isTaskOwnedSerializedContext(o.serializedContext)&&d&&f.turnAgent.tools.some(e=>e.kind===`authored-tool`&&e.owner.kind===`framework`&&e.name===TASK_UPDATE_TOOL_NAME);try{let{getWorkflowMetadata:e}=await import(`#compiled/@workflow/core/index.js`),t=e();typeof t.url==`string`&&c.set(CallbackBaseUrlKey,resolveWorkflowCallbackBaseUrl(t.url))}catch{}let m=getPendingAuthorization(s.state),h;if(m&&o.input?.kind===`deliver`){let{matches:e,remainingPayloads:t}=matchAuthorizationCallbacks(m,o.input.payloads);if(o={...o,input:{...o.input,payloads:t}},e.length>0){let n=e.map(e=>e.result);c.set(PendingAuthorizationResultKey,n),s={...s,state:clearPendingAuthorization(s.state,n.map(e=>e.attemptId??e.name))},h=e,t.length===0&&(o={...o,input:void 0})}}o.input?.kind===`deliver`&&o.input.auth!==void 0&&c.set(AuthKey,o.input.auth??null);let g=hydrateDurableSession({compactionOverrides:{thresholdPercent:f.thresholdPercent},durable:s,turnAgent:f.turnAgent}),_=createExecutionHistoryView(g),v=getInstrumentationRuntime(),y=getHarnessEmissionState(g.state);a.input?.kind===`deliver`&&await contextStorage.run(c,()=>instrumentChannelDelivery({agentName:u.turnAgent.id,ctx:c,delivery:a.input,hooks:v?.hooks,rootSessionId:g.rootSessionId??g.sessionId,sequence:y.sequence,sessionId:g.sessionId,turnId:activeTurnId(y)}));let failChannelDeliveries=async e=>{await contextStorage.run(c,()=>instrumentChannelDelivery({ctx:c,error:e,errorCode:channelDeliveryErrorCode(e),hooks:v?.hooks,includeTurn:!1,outcome:`failed`})),await v?.forceFlush()},b=buildAdapterContext(l,c),x;if(o.input?.kind===`deliver`){let e=[];try{for(let n of o.input.payloads){let r=l.deliver?await l.deliver(n,b):defaultDeliverResult(n);r!=null&&e.push(r)}}catch(e){throw await failChannelDeliveries(e),e}x=e.length===0?void 0:e.reduce(coalesceTurnInputs)}else o.input?.kind===`runtime-action-result`&&(recordSubagentUsageSpans(o.input.results),o.input.acceptedAtMsByCallId!==void 0&&c.set(RuntimeActionSettlementTimesKey,o.input.acceptedAtMsByCallId),x={runtimeActionResults:o.input.results});if(x!==void 0&&a.input?.kind===`deliver`&&a.input.taskDeliveryId!==void 0){let e=resolveTaskDeliveryContext({state:s.state,taskDeliveryId:a.input.taskDeliveryId});e!==void 0&&(c.set(TurnTaskDeliveryKey,e.phase),x={...x,context:[...x.context??[],e.context]})}if(d&&c.get(TurnTaskDeliveryKey)===`none`){let e=resolveInitiatingTaskContext({state:s.state,turnId:activeTurnId(y)});e!==void 0&&(c.set(TurnTaskDeliveryKey,e.phase),c.set(TurnTaskStateKey,e.context))}if(o.input?.kind===`deliver`&&setChannelContext(c,{...l,state:{...b.state}}),o.input?.kind===`deliver`&&x===void 0){await contextStorage.run(c,()=>instrumentChannelDelivery({ctx:c,hooks:v?.hooks,includeTurn:!1,outcome:`completed`})),await v?.forceFlush();let e=reconcileSessionContinuationToken(c,g),t=serializeContext(c),r=e===g?o.sessionState:createDurableSessionState({session:e});return{action:`park`,...derivePendingState(e),serializedContext:t,sessionState:r,tasksEnabled:d}}let S=u.hookRegistry,C=u.resolvedAgent.dynamicInstructionsResolvers??[],w=u.resolvedAgent.dynamicSkillResolvers??[],T=u.subagentRegistry.dynamicResolvers??[],E=u.resolvedAgent.dynamicToolResolvers??[],D={...u.graph.root,turnAgent:f.turnAgent},O=buildRuntimeIdentity(D);try{let e=process.env.VERCEL_DEPLOYMENT_ID?.trim(),t=e?`deployment:${e}`:await resolveRuntimeCompiledArtifactsVersionedCacheKey(u.compiledArtifactsSource);if(!y.sessionStarted)c.set(SessionDynamicSubagentRuntimeRevisionKey,t),c.set(SessionDynamicToolRuntimeRevisionKey,t);else{let e=createSessionStartedEvent({runtime:O});await Promise.all([refreshDynamicSessionSubagentsForRuntimeRevision({ctx:c,resolvers:T,event:e,messages:_.initial.messages,runtimeRevision:t}),refreshDynamicSessionToolsForRuntimeRevision({ctx:c,resolvers:E,event:e,messages:_.initial.messages,runtimeRevision:t})]),await rebindMissingCompiledDynamicToolCallbacks({ctx:c,event:createTurnStartedEvent({sequence:y.sequence,turnId:activeTurnId(y)}),messages:_.initial.messages,resolvers:E})}}catch(e){throw await failChannelDeliveries(e),e}let k=o.parentWritable.getWriter(),emit=async t=>{let n=await callAdapterEventHandler(l,t,b);setChannelContext(c,{...l,state:{...b.state}});let r=stampMessageStreamEvent(n);return await k.write(encodeMessageStreamEvent(r)),r},handleEvent=async(e,t)=>{let n=await forwardTaskEventToSessionCallback(c,e)?stampMessageStreamEvent(e):await emit(e),r=await dispatchMemoryLifecycleEvent({abortSignal:o.abortSignal,appRoot:D.agent?.metadata?.appRoot??``,ctx:c,event:e,memories:D.agent?.memories??[],messages:t,nodeId:u.nodeId??`__root__`});observeSessionActivity({ctx:c,event:n,sessionId:g.sessionId}),await dispatchStreamEventHooks({ctx:c,registry:S,event:n}),n.type!==`step.started`&&await dispatchDynamicModelEvent({ctx:c,dynamicModel:f.turnAgent.dynamicModel,event:n,messages:r,scope:{moduleMap:u.moduleMap,nodeId:u.nodeId}}),await dispatchDynamicSubagentEvent({ctx:c,resolvers:T,event:n,messages:r}),await dispatchDynamicToolEvent({ctx:c,resolvers:E,event:n,messages:r}),await dispatchDynamicSkillEvent({ctx:c,resolvers:w,event:n,messages:r}),await dispatchDynamicInstructionEvent({ctx:c,resolvers:C,event:n,messages:r})},A=c.require(ModeKey),j;try{throwIfTurnAborted(o.abortSignal),j=await runBackgroundStep(c,g,async e=>{c.setVirtualContext(HandleEventKey,handleEvent);let t=resolveEffectiveOutputSchema({agentOutputSchema:f.turnAgent.outputSchema,input:x,mode:A,session:e});if(h){let e=getHarnessEmissionState(t.state);if(isHarnessBetweenTurns(t)){prepareDynamicInstructionPreamble(c,_.messages(t));let n=[],r=await prepareWorkflowPreambleTrace({ctx:c,emissionState:e,runtimeIdentity:O,session:t});try{e=await emitTurnPreamble(handleEvent,{},e,O,r)}finally{n=drainDynamicInstructionUserMessages(c),t={...t,history:[...t.history,...n]}}t=setHarnessEmissionState(t,e)}for(let{authorization:t,result:n}of h){let r=m?.challenges.find(e=>e.attemptId===n.attemptId)?.candidateId;await handleEvent(createAuthorizationCompletedEvent({attemptId:n.attemptId,authorization:t,candidateId:r,name:n.name,outcome:`authorized`,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId}))}}let n=c.get(CapabilitiesKey);return(async(e,t)=>{let r=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:f.thresholdPercent},session:e,systemPromptAdditions:p?[TASK_UPDATE_SESSION_INSTRUCTION]:void 0,turnAgent:f.turnAgent}),i=d?await appendTaskAgentAnnouncement(r,_.messages(r)):r;return createExecutionNodeStep({abortSignal:o.abortSignal,capabilities:n,clearOnly:o.input?.kind===`clear`,compactOnly:o.input?.kind===`compact`,createRuntime:createWorkflowRuntime,handleEvent,historyProjector:_.projector,historyView:_.prepare(i),mode:A,modelResolutionScope:{moduleMap:u.moduleMap,nodeId:u.nodeId},node:D,workflowMaxSubagents:r.workflowMaxSubagents})(i,t)})(t,x)})}catch(e){if(!isTurnCancellation(e))throw await failChannelDeliveries(e),e;k.releaseLock();let t=serializeContext(c),n=readRetainedBackgroundToolResult(c),r=await preserveCancelledTurnMessage(n?.backgroundTaskSession??g,x);return{action:`cancelled`,...n===void 0?{}:{backgroundTaskState:createDurableSessionState({session:r}),backgroundTasks:n.backgroundTasks},serializedContext:preserveSerializedInstrumentationState(preserveSerializedAgentTraceState(preserveSerializedSessionDynamicModelSelection(o.serializedContext,t),t),t),sessionState:createDurableSessionState({session:r})}}let M=reconcileSessionContinuationToken(c,j.session),N=serializeContext(c);j={...j,session:M};let P=createDurableSessionState({session:j.session}),F=readTurnSleepDurationMs(c),I=F===void 0?{}:{sleepDurationMs:F},L=j.backgroundTasks===void 0||j.backgroundTaskSession===void 0?{}:{backgroundTaskState:createDurableSessionState({session:j.backgroundTaskSession}),backgroundTasks:j.backgroundTasks};if(j.next!==null&&typeof j.next==`object`&&`done`in j.next){if(A===`task`&&hasPendingInputBatch(j.session.state))throw k.releaseLock(),Error(`Task mode cannot complete while input requests remain pending.`);await k.close();let e=getTurnUsageState(j.session.state)?.session;return{action:`done`,...L,output:j.next.output,isError:j.next.isError,...I,serializedContext:N,sessionState:P,usage:e===void 0?void 0:toUsage(e),usageDelta:takeSessionUsageDelta(j.session).delta}}if(j.next===null){k.releaseLock();let e=getPendingWorkflowInterrupt(j.session.state);if(e!==void 0&&isWorkflowRuntimeActionInterrupt(e.interrupt))return{action:`dispatch-workflow-runtime-actions`,...L,pendingRuntimeActionKeys:getRuntimeActionKeysFromWorkflowInterrupt(e.interrupt),...I,serializedContext:N,sessionState:P};let t=derivePendingState(j.session);if(j.settledTurn!==void 0){let{delta:e,session:n}=takeSessionUsageDelta(j.session);return{action:`park`,...L,...t,...I,serializedContext:N,sessionState:createDurableSessionState({session:n}),settled:{output:j.settledTurn.output,isError:j.settledTurn.isError,usage:e},tasksEnabled:d}}return{action:`park`,...L,...t,...I,serializedContext:N,sessionState:P,tasksEnabled:d}}return k.releaseLock(),{action:`continue`,...L,...I,serializedContext:N,sessionState:P}}async function preserveCancelledTurnMessage(e,t){let n=normalizeUserContent(t?.message);if(n===void 0)return e;let r=await stageAttachmentsToSandbox(n);return{...e,history:[...e.history,{content:r,role:`user`}]}}export{turnStep};
1
+ import{callAdapterEventHandler,defaultDeliverResult}from"#channel/adapter.js";import{contextStorage}from"#context/container.js";import{AuthKey,CapabilitiesKey,HandleEventKey,ModeKey,SessionDynamicSubagentRuntimeRevisionKey,SessionDynamicToolRuntimeRevisionKey,TasksEnabledKey,TurnTaskDeliveryKey,TurnTaskStateKey}from"#context/keys.js";import{createAuthorizationCompletedEvent,createSessionStartedEvent,createTurnStartedEvent,encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{emitTurnPreamble,getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission.js";import{createWorkflowRuntime}from"#execution/workflow-runtime.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{dispatchDynamicSubagentEvent,refreshDynamicSessionSubagentsForRuntimeRevision}from"#context/dynamic-subagent-lifecycle.js";import{coalesceTurnInputs}from"#harness/messages.js";import{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{TASK_UPDATE_SESSION_INSTRUCTION,isTaskOwnedSerializedContext}from"#execution/tasks/child/instructions.js";import{TASK_UPDATE_TOOL_NAME}from"#tools/framework/task-contract.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{preserveSerializedAgentTraceState}from"#tracing/agent-trace-context-store.js";import{getPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getRuntimeActionKeysFromWorkflowInterrupt,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{activeTurnId}from"#harness/active-turn-id.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{hasPendingInputBatch}from"#harness/input-requests.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{observeSessionActivity}from"#execution/session-activity-projection.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{bindSessionInstrumentation}from"#instrumentation/runtime.js";import{getTurnUsageState,takeSessionUsageDelta,toUsage}from"#harness/turn-tag-state.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{readTurnSleepDurationMs}from"#harness/turn-sleep.js";import{preserveSerializedSessionDynamicModelSelection}from"#context/serialized-dynamic-model-selection.js";import{dispatchDynamicInstructionEvent,drainDynamicInstructionUserMessages,prepareDynamicInstructionPreamble}from"#context/dynamic-instruction-lifecycle.js";import{dispatchDynamicSkillEvent}from"#context/dynamic-skill-lifecycle.js";import{dispatchDynamicToolEvent,rebindMissingCompiledDynamicToolCallbacks,refreshDynamicSessionToolsForRuntimeRevision}from"#context/dynamic-tool-lifecycle.js";import{dispatchMemoryLifecycleEvent}from"#context/memory-event-lifecycle.js";import{preserveSerializedInstrumentationState}from"#instrumentation/state.js";import{RuntimeActionSettlementTimesKey}from"#harness/runtime-action-settlement-state.js";import{matchAuthorizationCallbacks}from"#execution/authorization-callback-match.js";import{derivePendingState}from"#execution/pending-turn-state.js";import{forwardTaskEventToSessionCallback}from"#execution/task-event-callback.js";import{resolveEffectiveOutputSchema}from"#execution/effective-output-schema.js";import{buildRuntimeIdentity,createExecutionNodeStep}from"#execution/node-step.js";import{appendTaskAgentAnnouncement}from"#execution/tasks/parent/agent-views.js";import{resolveInitiatingTaskContext,resolveTaskDeliveryContext}from"#tasks/delivery-context.js";import{readRetainedBackgroundToolResult,runBackgroundStep}from"#execution/tasks/parent/tool-execution.js";import{prepareWorkflowPreambleTrace}from"#execution/workflow-trace-context.js";import{createExecutionHistoryView}from"#execution/history-view.js";import{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";import{bindDynamicConnections}from"#execution/dynamic-connections.js";import{preserveCancelledTurnMessage}from"#execution/cancelled-turn-message.js";function channelDeliveryErrorCode(e){if(typeof e==`object`&&e&&`code`in e){let t=e.code;if(typeof t==`string`&&t.length>0)return t}return`CHANNEL_DELIVERY_FAILED`}async function turnStep(a){"use step";let o=a,s=await readDurableSession(o.sessionState),c=await deserializeContext(o.serializedContext);a.input?.kind===`deliver`&&(c.set(TurnTaskDeliveryKey,`none`),c.delete(TurnTaskStateKey));let l=c.require(ChannelKey),u=c.require(BundleKey),d=u.resolvedAgent.config?.experimental?.tasks===!0;c.set(TasksEnabledKey,d);let f=resolveEffectiveAgentRuntime(u,c),p=isTaskOwnedSerializedContext(o.serializedContext)&&d&&f.turnAgent.tools.some(e=>e.kind===`authored-tool`&&e.owner.kind===`framework`&&e.name===TASK_UPDATE_TOOL_NAME);try{let{getWorkflowMetadata:e}=await import(`#compiled/@workflow/core/index.js`),t=e();typeof t.url==`string`&&c.set(CallbackBaseUrlKey,resolveWorkflowCallbackBaseUrl(t.url))}catch{}let m=getPendingAuthorization(s.state),h;if(m&&o.input?.kind===`deliver`){let{matches:e,remainingPayloads:t}=matchAuthorizationCallbacks(m,o.input.payloads);if(o={...o,input:{...o.input,payloads:t}},e.length>0){let n=e.map(e=>e.result);c.set(PendingAuthorizationResultKey,n),s={...s,state:clearPendingAuthorization(s.state,n.map(e=>e.attemptId??e.name))},h=e,t.length===0&&(o={...o,input:void 0})}}o.input?.kind===`deliver`&&o.input.auth!==void 0&&c.set(AuthKey,o.input.auth??null);let g=hydrateDurableSession({compactionOverrides:{thresholdPercent:f.thresholdPercent},durable:s,turnAgent:f.turnAgent}),_=createExecutionHistoryView(g),v=bindSessionInstrumentation({agentName:f.turnAgent.id,ctx:c,rootSessionId:g.rootSessionId??g.sessionId,sessionId:g.sessionId}),y=getHarnessEmissionState(g.state);a.input?.kind===`deliver`&&await contextStorage.run(c,()=>v?.instrumentChannelDelivery({agentName:u.turnAgent.id,ctx:c,delivery:a.input,rootSessionId:g.rootSessionId??g.sessionId,sequence:y.sequence,sessionId:g.sessionId,turnId:activeTurnId(y)}));let failChannelDeliveries=async e=>{await contextStorage.run(c,()=>v?.instrumentChannelDelivery({ctx:c,error:e,errorCode:channelDeliveryErrorCode(e),includeTurn:!1,outcome:`failed`})),await v?.flush()},b=buildAdapterContext(l,c),x;if(o.input?.kind===`deliver`){let e=[];try{for(let n of o.input.payloads){let r=l.deliver?await l.deliver(n,b):defaultDeliverResult(n);r!=null&&e.push(r)}}catch(e){throw await failChannelDeliveries(e),e}x=e.length===0?void 0:e.reduce(coalesceTurnInputs)}else o.input?.kind===`runtime-action-result`&&(o.input.acceptedAtMsByCallId!==void 0&&c.set(RuntimeActionSettlementTimesKey,o.input.acceptedAtMsByCallId),x={runtimeActionResults:o.input.results});if(x!==void 0&&a.input?.kind===`deliver`&&a.input.taskDeliveryId!==void 0){let e=resolveTaskDeliveryContext({state:s.state,taskDeliveryId:a.input.taskDeliveryId});e!==void 0&&(c.set(TurnTaskDeliveryKey,e.phase),x={...x,context:[...x.context??[],e.context]})}if(d&&c.get(TurnTaskDeliveryKey)===`none`){let e=resolveInitiatingTaskContext({state:s.state,turnId:activeTurnId(y)});e!==void 0&&(c.set(TurnTaskDeliveryKey,e.phase),c.set(TurnTaskStateKey,e.context))}if(o.input?.kind===`deliver`&&setChannelContext(c,{...l,state:{...b.state}}),o.input?.kind===`deliver`&&x===void 0){await contextStorage.run(c,()=>v?.instrumentChannelDelivery({ctx:c,includeTurn:!1,outcome:`completed`})),await v?.flush();let e=reconcileSessionContinuationToken(c,g),t=serializeContext(c),r=e===g?o.sessionState:createDurableSessionState({session:e});return{action:`park`,...derivePendingState(e),serializedContext:t,sessionState:r,tasksEnabled:d}}let S=u.hookRegistry,C=bindDynamicConnections(c,u.resolvedAgent),w=u.resolvedAgent.dynamicInstructionsResolvers??[],T=u.resolvedAgent.dynamicSkillResolvers??[],E=u.subagentRegistry.dynamicResolvers??[],D=u.resolvedAgent.dynamicToolResolvers??[],O={...u.graph.root,turnAgent:f.turnAgent},k=buildRuntimeIdentity(O);try{let e=process.env.VERCEL_DEPLOYMENT_ID?.trim(),t=e?`deployment:${e}`:await resolveRuntimeCompiledArtifactsVersionedCacheKey(u.compiledArtifactsSource);if(!y.sessionStarted)c.set(SessionDynamicSubagentRuntimeRevisionKey,t),c.set(SessionDynamicToolRuntimeRevisionKey,t);else{let e=createSessionStartedEvent({runtime:k});await Promise.all([refreshDynamicSessionSubagentsForRuntimeRevision({ctx:c,resolvers:E,event:e,messages:_.initial.messages,runtimeRevision:t}),refreshDynamicSessionToolsForRuntimeRevision({ctx:c,resolvers:D,event:e,messages:_.initial.messages,runtimeRevision:t})]),await rebindMissingCompiledDynamicToolCallbacks({ctx:c,event:createTurnStartedEvent({sequence:y.sequence,turnId:activeTurnId(y)}),messages:_.initial.messages,resolvers:D})}}catch(e){throw await failChannelDeliveries(e),e}let A=o.parentWritable.getWriter(),emit=async t=>{let n=await callAdapterEventHandler(l,t,b);setChannelContext(c,{...l,state:{...b.state}});let r=stampMessageStreamEvent(n);return await A.write(encodeMessageStreamEvent(r)),r},handleEvent=async(e,t)=>{let n=await forwardTaskEventToSessionCallback(c,e)?stampMessageStreamEvent(e):await emit(e),r=await dispatchMemoryLifecycleEvent({abortSignal:o.abortSignal,appRoot:O.agent?.metadata?.appRoot??``,ctx:c,event:e,memories:O.agent?.memories??[],messages:t,nodeId:u.nodeId??`__root__`});observeSessionActivity({ctx:c,event:n,sessionId:g.sessionId}),await dispatchStreamEventHooks({ctx:c,registry:S,event:n}),n.type!==`step.started`&&await dispatchDynamicModelEvent({ctx:c,dynamicModel:f.turnAgent.dynamicModel,event:n,messages:r,scope:{moduleMap:u.moduleMap,nodeId:u.nodeId}}),await C.dispatch(n),await dispatchDynamicSubagentEvent({ctx:c,resolvers:E,event:n,messages:r}),await dispatchDynamicToolEvent({ctx:c,resolvers:D,event:n,messages:r}),await dispatchDynamicSkillEvent({ctx:c,resolvers:T,event:n,messages:r}),await dispatchDynamicInstructionEvent({ctx:c,resolvers:w,event:n,messages:r})},j=c.require(ModeKey),M;try{throwIfTurnAborted(o.abortSignal),M=await runBackgroundStep(c,g,async e=>{c.setVirtualContext(HandleEventKey,handleEvent);let t=resolveEffectiveOutputSchema({agentOutputSchema:f.turnAgent.outputSchema,input:x,mode:j,session:e});if(await C.rehydrate(y,k,isHarnessBetweenTurns(t)),h){let e=getHarnessEmissionState(t.state);if(isHarnessBetweenTurns(t)){prepareDynamicInstructionPreamble(c,_.messages(t));let n=[],r=await prepareWorkflowPreambleTrace({emissionState:e,instrumentation:v});try{e=await emitTurnPreamble(handleEvent,{},e,k,r)}finally{n=drainDynamicInstructionUserMessages(c),t={...t,history:[...t.history,...n]}}t=setHarnessEmissionState(t,e)}for(let{authorization:t,result:n}of h){let r=m?.challenges.find(e=>e.attemptId===n.attemptId)?.candidateId;await handleEvent(createAuthorizationCompletedEvent({attemptId:n.attemptId,authorization:t,candidateId:r,name:n.name,outcome:`authorized`,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId}))}}let n=c.get(CapabilitiesKey);return(async(e,t)=>{let r=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:f.thresholdPercent},session:e,systemPromptAdditions:p?[TASK_UPDATE_SESSION_INSTRUCTION]:void 0,turnAgent:f.turnAgent}),i=d?await appendTaskAgentAnnouncement(r,_.messages(r)):r;return createExecutionNodeStep({abortSignal:o.abortSignal,capabilities:n,clearOnly:o.input?.kind===`clear`,compactOnly:o.input?.kind===`compact`,createRuntime:createWorkflowRuntime,handleEvent,historyProjector:_.projector,historyView:_.prepare(i),instrumentation:v,mode:j,modelResolutionScope:{moduleMap:u.moduleMap,nodeId:u.nodeId},node:O,workflowMaxSubagents:r.workflowMaxSubagents})(i,t)})(t,x)})}catch(e){if(!isTurnCancellation(e))throw await failChannelDeliveries(e),e;A.releaseLock();let t=serializeContext(c),n=readRetainedBackgroundToolResult(c),r=await preserveCancelledTurnMessage(n?.backgroundTaskSession??g,x);return{action:`cancelled`,...n===void 0?{}:{backgroundTaskState:createDurableSessionState({session:r}),backgroundTasks:n.backgroundTasks},serializedContext:preserveSerializedInstrumentationState(preserveSerializedAgentTraceState(preserveSerializedSessionDynamicModelSelection(o.serializedContext,t),t),t),sessionState:createDurableSessionState({session:r})}}let N=reconcileSessionContinuationToken(c,M.session),P=serializeContext(c);M={...M,session:N};let F=createDurableSessionState({session:M.session}),I=readTurnSleepDurationMs(c),L=I===void 0?{}:{sleepDurationMs:I},R=M.backgroundTasks===void 0||M.backgroundTaskSession===void 0?{}:{backgroundTaskState:createDurableSessionState({session:M.backgroundTaskSession}),backgroundTasks:M.backgroundTasks};if(M.next!==null&&typeof M.next==`object`&&`done`in M.next){if(j===`task`&&hasPendingInputBatch(M.session.state))throw A.releaseLock(),Error(`Task mode cannot complete while input requests remain pending.`);await A.close();let e=getTurnUsageState(M.session.state)?.session;return{action:`done`,...R,output:M.next.output,isError:M.next.isError,...L,serializedContext:P,sessionState:F,usage:e===void 0?void 0:toUsage(e),usageDelta:takeSessionUsageDelta(M.session).delta}}if(M.next===null){A.releaseLock();let e=getPendingWorkflowInterrupt(M.session.state);if(e!==void 0&&isWorkflowRuntimeActionInterrupt(e.interrupt))return{action:`dispatch-workflow-runtime-actions`,...R,pendingRuntimeActionKeys:getRuntimeActionKeysFromWorkflowInterrupt(e.interrupt),...L,serializedContext:P,sessionState:F};let t=derivePendingState(M.session);if(M.settledTurn!==void 0){let{delta:e,session:n}=takeSessionUsageDelta(M.session);return{action:`park`,...R,...t,...L,serializedContext:P,sessionState:createDurableSessionState({session:n}),settled:{output:M.settledTurn.output,isError:M.settledTurn.isError,usage:e},tasksEnabled:d}}return{action:`park`,...R,...t,...L,serializedContext:P,sessionState:F,tasksEnabled:d}}return A.releaseLock(),{action:`continue`,...R,...L,serializedContext:P,sessionState:F}}export{turnStep};
@@ -1,11 +1,8 @@
1
- import type { ContextContainer } from "#context/container.js";
2
1
  import type { HarnessEmissionState } from "#harness/emission.js";
3
- import type { HarnessSession } from "#harness/types.js";
4
- import type { RuntimeIdentity, RuntimeTraceContext } from "#protocol/message.js";
2
+ import type { ExecutionInstrumentation } from "#instrumentation/runtime.js";
3
+ import type { RuntimeTraceContext } from "#protocol/message.js";
5
4
  /** Prepares native tracing for workflow-owned preambles emitted outside the tool loop. */
6
5
  export declare function prepareWorkflowPreambleTrace(input: {
7
- readonly ctx: ContextContainer;
8
6
  readonly emissionState: HarnessEmissionState;
9
- readonly runtimeIdentity: RuntimeIdentity;
10
- readonly session: HarnessSession;
7
+ readonly instrumentation: ExecutionInstrumentation | undefined;
11
8
  }): Promise<RuntimeTraceContext | undefined>;
@@ -1 +1 @@
1
- import{normalizeChannelAudience}from"#shared/channel-audience.js";import{ChannelInstrumentationKey,ParentSessionKey,ParentTraceContextKey,SessionTraceSeedKey}from"#context/keys.js";import{ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{getInstrumentationRuntime}from"#harness/instrumentation/runtime.js";import{resolveParentLineage}from"#harness/parent-lineage.js";import{prepareTurnTraceContext}from"#harness/prepare-trace-context.js";async function prepareWorkflowPreambleTrace(e){let t=e.ctx.get(ParentSessionKey),n=e.ctx.get(ChannelInstrumentationKey);return await prepareTurnTraceContext({agentName:e.runtimeIdentity.agentName,channelAudience:normalizeChannelAudience(n?.metadata.audience),channelType:n?.channelType,instrumentation:getInstrumentationRuntime(),parentLineage:resolveParentLineage(t,e.ctx.get(ChannelKey)),parentTraceContext:e.ctx.get(ParentTraceContextKey),rootSessionId:t?.rootSessionId??e.session.rootSessionId??e.session.sessionId,sequence:e.emissionState.sequence,sessionId:e.session.sessionId,sessionStarted:e.emissionState.sessionStarted,traceSeed:e.ctx.get(SessionTraceSeedKey),turnId:`turn_${e.emissionState.sequence}`})}export{prepareWorkflowPreambleTrace};
1
+ async function prepareWorkflowPreambleTrace(e){return await e.instrumentation?.preparePreamble({sequence:e.emissionState.sequence,sessionStarted:e.emissionState.sessionStarted,turnId:`turn_${e.emissionState.sequence}`})}export{prepareWorkflowPreambleTrace};
@@ -40,6 +40,8 @@ export interface AuthorizationChallenge {
40
40
  /** Opaque identity of this exact authorization attempt. */
41
41
  readonly attemptId?: string;
42
42
  readonly candidateId?: string;
43
+ /** Opaque resolved connection identity; omitted for tool-hosted authorization. */
44
+ readonly instanceId?: string;
43
45
  readonly name: string;
44
46
  readonly challenge: ConnectionAuthorizationChallenge;
45
47
  readonly hookUrl: string;
@@ -65,6 +67,7 @@ export interface AuthorizationPendingModelOutput {
65
67
  }
66
68
  export interface AuthorizationResult {
67
69
  readonly attemptId?: string;
70
+ readonly instanceId?: string;
68
71
  readonly resume?: JsonValue;
69
72
  readonly callback: AuthorizationCallback;
70
73
  readonly hookUrl: string;
@@ -79,12 +82,12 @@ export interface AuthorizationResult {
79
82
  */
80
83
  export declare function requestAuthorization(challenges: readonly AuthorizationChallenge[]): AuthorizationSignal;
81
84
  /**
82
- * Returns a copy of `signal` with each challenge's `resume` value stripped.
85
+ * Returns a model-safe copy of `signal` with runtime-only challenge state stripped.
83
86
  *
84
87
  * Used for the copy the AI SDK records as a tool output. The shape stays a
85
88
  * valid {@link AuthorizationSignal} so every `isAuthorizationSignal` consumer
86
- * still detects it; the park detector reads the full challenges from the
87
- * harness's out-of-band stash.
89
+ * still detects it; the park detector reads the full resume, principal, and
90
+ * resolved-instance state from the harness's out-of-band stash.
88
91
  */
89
92
  export declare function redactSignalResume(signal: AuthorizationSignal): AuthorizationSignal;
90
93
  /**
@@ -95,6 +98,8 @@ export declare function redactSignalResume(signal: AuthorizationSignal): Authori
95
98
  * single-challenge tools).
96
99
  */
97
100
  export declare function getAuthorizationResult(name?: string): AuthorizationResult | undefined;
101
+ /** Returns every callback result available to the active step. */
102
+ export declare function getAuthorizationResults(): readonly NamedAuthorizationResult[];
98
103
  /**
99
104
  * Removes and returns one authorization callback result.
100
105
  *
@@ -102,7 +107,7 @@ export declare function getAuthorizationResult(name?: string): AuthorizationResu
102
107
  * before completion prevents a failed or replayed callback from poisoning
103
108
  * every later tool call in the same step.
104
109
  */
105
- export declare function consumeAuthorizationResult(name: string): AuthorizationResult | undefined;
110
+ export declare function consumeAuthorizationResult(name: string, instanceId?: string): AuthorizationResult | undefined;
106
111
  /**
107
112
  * Builds a callback URL for external systems. `name` and `attemptId` identify
108
113
  * the exact challenge in the URL path.
@@ -157,6 +162,8 @@ export interface PendingAuthorizationState {
157
162
  readonly challenges: readonly AuthorizationChallenge[];
158
163
  }
159
164
  export declare function setPendingAuthorization(sessionState: Record<string, unknown> | undefined, value: PendingAuthorizationState): Record<string, unknown>;
165
+ /** Keeps the last challenge for each authorization name and principal scope. */
166
+ export declare function resolveActiveAuthorizationChallenges(challenges: readonly AuthorizationChallenge[]): readonly AuthorizationChallenge[];
160
167
  /** Existing same-scope attempts replaced by newer attempts for the same principal. */
161
168
  export declare function getSupersededAuthorizationChallenges(sessionState: Record<string, unknown> | undefined, replacements: readonly AuthorizationChallenge[]): readonly AuthorizationChallenge[];
162
169
  export declare function clearPendingAuthorization(sessionState: Record<string, unknown> | undefined, attemptIds?: readonly string[]): Record<string, unknown> | undefined;
@@ -1 +1 @@
1
- import{createEveConnectionCallbackRoutePath}from"#protocol/routes.js";import{loadContext}from"#context/container.js";import{SessionIdKey}from"#context/keys.js";import{ContextKey}from"#context/key.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{createUlid}from"#shared/ulid.js";const AUTHORIZATION_BRAND=`__eveAuthorization`,AUTHORIZATION_PENDING_BRAND=`__eveAuthorizationPending`;function requestAuthorization(e){return{[AUTHORIZATION_BRAND]:!0,challenges:e}}function redactSignalResume(e){return requestAuthorization(e.challenges.map(e=>({attemptId:e.attemptId,candidateId:e.candidateId,name:e.name,challenge:e.challenge,hookUrl:e.hookUrl})))}function getAuthorizationResult(e){let n=loadContext().get(PendingAuthorizationResultKey);if(!(!n||n.length===0))return e===void 0?n[0]:n.find(t=>t.name===e)}function consumeAuthorizationResult(e){let n=loadContext(),r=n.get(PendingAuthorizationResultKey);if(!r||r.length===0)return;let i=r.findIndex(t=>t.name===e);if(i===-1)return;let a=r[i],o=r.filter((e,t)=>t!==i);return n.delete(PendingAuthorizationResultKey),o.length>0&&n.set(PendingAuthorizationResultKey,o),a}function getHookUrl(r,a){let o=loadContext(),s=o.get(SessionIdKey),c=o.get(CallbackBaseUrlKey);return!s||!c?void 0:createWorkflowCallbackUrl(c,createEveConnectionCallbackRoutePath(r,a,authHookToken(s)))}function createAuthorizationAttempt(e){let t=createUlid(),n=getHookUrl(e,t);return n===void 0?void 0:{attemptId:t,hookUrl:n}}function isAuthorizationSignal(e){return typeof e!=`object`||!e?!1:e[AUTHORIZATION_BRAND]===!0}function isAuthorizationPendingModelOutput(e){return typeof e!=`object`||!e?!1:e[AUTHORIZATION_PENDING_BRAND]===!0}function authorizationPendingAsJsonObject(e){return{[AUTHORIZATION_PENDING_BRAND]:!0,connections:[...e.connections]}}function modelFacingAuthorizationOutput(e){return authorizationPendingAsJsonObject({connections:e.challenges.map(e=>e.name)})}function authorizationPendingModelText(e){return e.length===0?`Authorization required. Waiting for the user to sign in.`:e.length===1?`Authorization required for ${e[0]}. Waiting for the user to sign in.`:`Authorization required for ${e.join(`, `)}. Waiting for the user to sign in.`}function isPendingAuthorizationToolOutput(e){return isAuthorizationPendingModelOutput(e)||isAuthorizationSignal(e)}function authHookToken(e){return`${e}:auth`}const PendingAuthorizationResultKey=new ContextKey(`eve.pendingAuthorizationResult`),CallbackBaseUrlKey=new ContextKey(`eve.callbackBaseUrl`),PENDING_AUTHORIZATION_KEY=`eve.runtime.pendingAuthorization`;function setPendingAuthorization(e,t){let n=getPendingAuthorization(e)?.challenges??[],r=getSupersededAuthorizationChallenges(e,t.challenges);return{...e,[PENDING_AUTHORIZATION_KEY]:{challenges:[...n.filter(e=>!r.includes(e)),...t.challenges]}}}function getSupersededAuthorizationChallenges(e,t){return(getPendingAuthorization(e)?.challenges??[]).filter(e=>t.some(t=>e.name===t.name&&samePrincipal(e.principal,t.principal)))}function samePrincipal(e,t){return e===void 0||t===void 0?e===t:e.type===`app`||t.type===`app`?e.type===t.type:e.id===t.id&&e.issuer===t.issuer}function clearPendingAuthorization(e,t){if(e===void 0||e[PENDING_AUTHORIZATION_KEY]===void 0)return e;if(t!==void 0){if(t.length===0)return e;let n=getPendingAuthorization(e);if(n!==void 0){let r=new Set(t),i=n.challenges.filter(e=>!r.has(e.attemptId??e.name));if(i.length>0)return{...e,[PENDING_AUTHORIZATION_KEY]:{challenges:i}}}}let n={...e};return delete n[PENDING_AUTHORIZATION_KEY],Object.keys(n).length>0?n:void 0}function getPendingAuthorization(e){if(!e)return;let t=e[PENDING_AUTHORIZATION_KEY];if(!(typeof t!=`object`||!t))return t}function hasPendingAuthorization(e){return getPendingAuthorization(e)!==void 0}export{CallbackBaseUrlKey,PendingAuthorizationResultKey,authHookToken,authorizationPendingAsJsonObject,authorizationPendingModelText,clearPendingAuthorization,consumeAuthorizationResult,createAuthorizationAttempt,getAuthorizationResult,getHookUrl,getPendingAuthorization,getSupersededAuthorizationChallenges,hasPendingAuthorization,isAuthorizationPendingModelOutput,isAuthorizationSignal,isPendingAuthorizationToolOutput,modelFacingAuthorizationOutput,redactSignalResume,requestAuthorization,setPendingAuthorization};
1
+ import{createEveConnectionCallbackRoutePath}from"#protocol/routes.js";import{loadContext}from"#context/container.js";import{SessionIdKey}from"#context/keys.js";import{ContextKey}from"#context/key.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{createUlid}from"#shared/ulid.js";const AUTHORIZATION_BRAND=`__eveAuthorization`,AUTHORIZATION_PENDING_BRAND=`__eveAuthorizationPending`;function requestAuthorization(e){return{[AUTHORIZATION_BRAND]:!0,challenges:e}}function redactSignalResume(e){return requestAuthorization(e.challenges.map(e=>({attemptId:e.attemptId,candidateId:e.candidateId,name:e.name,challenge:e.challenge,hookUrl:e.hookUrl})))}function getAuthorizationResult(e){let n=loadContext().get(PendingAuthorizationResultKey);if(!(!n||n.length===0))return e===void 0?n[0]:n.find(t=>t.name===e)}function getAuthorizationResults(){return loadContext().get(PendingAuthorizationResultKey)??[]}function consumeAuthorizationResult(e,n){let r=loadContext(),i=r.get(PendingAuthorizationResultKey);if(!i||i.length===0)return;let a=i.findIndex(t=>t.name===e&&t.instanceId===n);if(a===-1&&n!==void 0&&i.some(t=>t.name===e&&t.instanceId!==void 0))throw Error(`Authorization for "${e}" cannot complete because its resolved connection changed while sign-in was pending. Start sign-in again.`);if(a===-1)return;let o=i[a],s=i.filter((e,t)=>t!==a);return r.delete(PendingAuthorizationResultKey),s.length>0&&r.set(PendingAuthorizationResultKey,s),o}function getHookUrl(r,a){let o=loadContext(),s=o.get(SessionIdKey),c=o.get(CallbackBaseUrlKey);return!s||!c?void 0:createWorkflowCallbackUrl(c,createEveConnectionCallbackRoutePath(r,a,authHookToken(s)))}function createAuthorizationAttempt(e){let t=createUlid(),n=getHookUrl(e,t);return n===void 0?void 0:{attemptId:t,hookUrl:n}}function isAuthorizationSignal(e){return typeof e!=`object`||!e?!1:e[AUTHORIZATION_BRAND]===!0}function isAuthorizationPendingModelOutput(e){return typeof e!=`object`||!e?!1:e[AUTHORIZATION_PENDING_BRAND]===!0}function authorizationPendingAsJsonObject(e){return{[AUTHORIZATION_PENDING_BRAND]:!0,connections:[...e.connections]}}function modelFacingAuthorizationOutput(e){return authorizationPendingAsJsonObject({connections:e.challenges.map(e=>e.name)})}function authorizationPendingModelText(e){return e.length===0?`Authorization required. Waiting for the user to sign in.`:e.length===1?`Authorization required for ${e[0]}. Waiting for the user to sign in.`:`Authorization required for ${e.join(`, `)}. Waiting for the user to sign in.`}function isPendingAuthorizationToolOutput(e){return isAuthorizationPendingModelOutput(e)||isAuthorizationSignal(e)}function authHookToken(e){return`${e}:auth`}const PendingAuthorizationResultKey=new ContextKey(`eve.pendingAuthorizationResult`),CallbackBaseUrlKey=new ContextKey(`eve.callbackBaseUrl`),PENDING_AUTHORIZATION_KEY=`eve.runtime.pendingAuthorization`;function setPendingAuthorization(e,t){let n=resolveActiveAuthorizationChallenges(t.challenges),r=getPendingAuthorization(e)?.challenges??[],i=getSupersededAuthorizationChallenges(e,n);return{...e,[PENDING_AUTHORIZATION_KEY]:{challenges:[...r.filter(e=>!i.includes(e)),...n]}}}function resolveActiveAuthorizationChallenges(e){return e.filter((t,n)=>!e.slice(n+1).some(e=>t.name===e.name&&samePrincipal(t.principal,e.principal)))}function getSupersededAuthorizationChallenges(e,t){return(getPendingAuthorization(e)?.challenges??[]).filter(e=>t.some(t=>e.name===t.name&&samePrincipal(e.principal,t.principal)))}function samePrincipal(e,t){return e===void 0||t===void 0?e===t:e.type===`app`||t.type===`app`?e.type===t.type:e.id===t.id&&e.issuer===t.issuer}function clearPendingAuthorization(e,t){if(e===void 0||e[PENDING_AUTHORIZATION_KEY]===void 0)return e;if(t!==void 0){if(t.length===0)return e;let n=getPendingAuthorization(e);if(n!==void 0){let r=new Set(t),i=n.challenges.filter(e=>!r.has(e.attemptId??e.name));if(i.length>0)return{...e,[PENDING_AUTHORIZATION_KEY]:{challenges:i}}}}let n={...e};return delete n[PENDING_AUTHORIZATION_KEY],Object.keys(n).length>0?n:void 0}function getPendingAuthorization(e){if(!e)return;let t=e[PENDING_AUTHORIZATION_KEY];if(!(typeof t!=`object`||!t))return t}function hasPendingAuthorization(e){return getPendingAuthorization(e)!==void 0}export{CallbackBaseUrlKey,PendingAuthorizationResultKey,authHookToken,authorizationPendingAsJsonObject,authorizationPendingModelText,clearPendingAuthorization,consumeAuthorizationResult,createAuthorizationAttempt,getAuthorizationResult,getAuthorizationResults,getHookUrl,getPendingAuthorization,getSupersededAuthorizationChallenges,hasPendingAuthorization,isAuthorizationPendingModelOutput,isAuthorizationSignal,isPendingAuthorizationToolOutput,modelFacingAuthorizationOutput,redactSignalResume,requestAuthorization,resolveActiveAuthorizationChallenges,setPendingAuthorization};