eve 0.24.3 → 0.24.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 (214) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/src/channel/adapter.d.ts +4 -2
  3. package/dist/src/channel/adapter.js +1 -1
  4. package/dist/src/channel/session.d.ts +5 -1
  5. package/dist/src/channel/types.d.ts +20 -6
  6. package/dist/src/chunks/{use-eve-agent-dEGV09g_.js → use-eve-agent-8rerxDHY.js} +74 -10
  7. package/dist/src/chunks/{use-eve-agent-CFBTHlPx.js → use-eve-agent-DhgdHzDG.js} +74 -10
  8. package/dist/src/cli/commands/build.d.ts +14 -0
  9. package/dist/src/cli/commands/build.js +1 -0
  10. package/dist/src/cli/commands/channels.js +1 -1
  11. package/dist/src/cli/commands/link.d.ts +6 -5
  12. package/dist/src/cli/commands/link.js +1 -1
  13. package/dist/src/cli/dev/tui/runner.d.ts +2 -2
  14. package/dist/src/cli/dev/tui/runner.js +1 -1
  15. package/dist/src/cli/run.d.ts +3 -2
  16. package/dist/src/cli/run.js +1 -1
  17. package/dist/src/client/index.d.ts +2 -2
  18. package/dist/src/client/message-reducer.js +1 -1
  19. package/dist/src/client/ndjson.js +1 -1
  20. package/dist/src/client/open-stream.d.ts +3 -2
  21. package/dist/src/client/open-stream.js +1 -1
  22. package/dist/src/client/session-utils.js +1 -1
  23. package/dist/src/client/session.d.ts +19 -5
  24. package/dist/src/client/session.js +1 -1
  25. package/dist/src/client/types.d.ts +11 -2
  26. package/dist/src/compiled/.vendor-stamp.json +5 -5
  27. package/dist/src/compiled/@workflow/core/index.js +2 -2
  28. package/dist/src/compiled/@workflow/core/runtime/helpers.d.ts +55 -0
  29. package/dist/src/compiled/@workflow/core/runtime/run-id-time.d.ts +9 -0
  30. package/dist/src/compiled/@workflow/core/runtime/step-executor.d.ts +2 -0
  31. package/dist/src/compiled/@workflow/core/runtime/step-latency.d.ts +70 -4
  32. package/dist/src/compiled/@workflow/core/runtime/suspension-handler.d.ts +10 -1
  33. package/dist/src/compiled/@workflow/core/runtime.js +3 -3
  34. package/dist/src/compiled/@workflow/core/step/context-storage.d.ts +6 -0
  35. package/dist/src/compiled/@workflow/core/telemetry/semantic-conventions.d.ts +25 -0
  36. package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
  37. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  38. package/dist/src/compiled/@workflow/errors/index.d.ts +16 -0
  39. package/dist/src/compiled/@workflow/errors/index.js +1 -1
  40. package/dist/src/compiled/@workflow/world/attributes.d.ts +7 -0
  41. package/dist/src/compiled/@workflow/world/events.d.ts +16 -0
  42. package/dist/src/compiled/@workflow/world/index.d.ts +1 -1
  43. package/dist/src/compiled/@workflow/world-local/index.js +3 -3
  44. package/dist/src/compiled/@workflow/world-vercel/index.js +16 -16
  45. package/dist/src/compiled/_chunks/workflow/attribute-changes-DXbmITuI.js +20 -0
  46. package/dist/src/compiled/_chunks/workflow/{dist-DpDDcpTl.js → dist-BYo8Gno2.js} +1 -1
  47. package/dist/src/compiled/_chunks/workflow/{dist-Blxnyb7-.js → dist-CSfKNxQW.js} +1 -1
  48. package/dist/src/compiled/_chunks/workflow/resume-hook-DvvgYsRt.js +1 -0
  49. package/dist/src/compiled/_chunks/workflow/run-BdvQmV5a.js +1 -0
  50. package/dist/src/compiled/_chunks/workflow/run-id-BdE0MZz9.js +1 -0
  51. package/dist/src/compiled/_chunks/workflow/sleep-DzxrwWTs.js +1 -0
  52. package/dist/src/discover/filesystem.js +1 -1
  53. package/dist/src/evals/assertions/run.d.ts +3 -3
  54. package/dist/src/evals/context.js +1 -1
  55. package/dist/src/evals/index.d.ts +2 -1
  56. package/dist/src/evals/match.d.ts +4 -0
  57. package/dist/src/evals/match.js +1 -1
  58. package/dist/src/evals/runner/derive-run-facts.js +1 -1
  59. package/dist/src/evals/session.d.ts +10 -2
  60. package/dist/src/evals/session.js +1 -1
  61. package/dist/src/evals/target.js +1 -1
  62. package/dist/src/evals/types.d.ts +52 -2
  63. package/dist/src/execution/cancel-descendant-turns-step.d.ts +6 -0
  64. package/dist/src/execution/cancel-descendant-turns-step.js +1 -0
  65. package/dist/src/execution/create-session-step.js +1 -1
  66. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  67. package/dist/src/execution/dispatch-workflow-runtime-actions-step.js +1 -1
  68. package/dist/src/execution/durable-session-migrations/turn-workflow.d.ts +1 -0
  69. package/dist/src/execution/durable-session-migrations/turn-workflow.js +1 -1
  70. package/dist/src/execution/next-driver-action.d.ts +7 -0
  71. package/dist/src/execution/node-step.js +1 -1
  72. package/dist/src/execution/remote-agent-dispatch.d.ts +6 -0
  73. package/dist/src/execution/remote-agent-dispatch.js +1 -1
  74. package/dist/src/execution/settle-cancelled-turn-step.d.ts +16 -0
  75. package/dist/src/execution/settle-cancelled-turn-step.js +1 -0
  76. package/dist/src/execution/subagent-event-proxy-step.js +1 -1
  77. package/dist/src/execution/subagent-hitl-proxy.js +1 -1
  78. package/dist/src/execution/terminal-session-failure-step.d.ts +6 -0
  79. package/dist/src/execution/terminal-session-failure-step.js +1 -0
  80. package/dist/src/execution/turn-cancellation-control.d.ts +27 -0
  81. package/dist/src/execution/turn-cancellation-control.js +1 -0
  82. package/dist/src/execution/turn-cancellation-token.d.ts +9 -0
  83. package/dist/src/execution/turn-cancellation-token.js +1 -0
  84. package/dist/src/execution/turn-dispatch.d.ts +14 -1
  85. package/dist/src/execution/turn-dispatch.js +1 -1
  86. package/dist/src/execution/turn-execution-cursor.d.ts +2 -1
  87. package/dist/src/execution/turn-execution-cursor.js +1 -1
  88. package/dist/src/execution/turn-workflow.d.ts +9 -1
  89. package/dist/src/execution/turn-workflow.js +1 -1
  90. package/dist/src/execution/workflow-entry.js +1 -1
  91. package/dist/src/execution/workflow-runtime.d.ts +3 -1
  92. package/dist/src/execution/workflow-runtime.js +1 -1
  93. package/dist/src/execution/workflow-steps.d.ts +8 -6
  94. package/dist/src/execution/workflow-steps.js +1 -1
  95. package/dist/src/harness/active-turn-id.d.ts +11 -0
  96. package/dist/src/harness/active-turn-id.js +1 -0
  97. package/dist/src/harness/advertised-tools.js +1 -1
  98. package/dist/src/harness/cancelled-turn-emission.d.ts +11 -0
  99. package/dist/src/harness/cancelled-turn-emission.js +1 -0
  100. package/dist/src/harness/emission.d.ts +4 -2
  101. package/dist/src/harness/emission.js +1 -1
  102. package/dist/src/harness/execute-tool.d.ts +0 -1
  103. package/dist/src/harness/proxy-input-requests.d.ts +5 -0
  104. package/dist/src/harness/proxy-input-requests.js +1 -1
  105. package/dist/src/harness/runtime-actions.d.ts +16 -12
  106. package/dist/src/harness/runtime-actions.js +1 -1
  107. package/dist/src/harness/session-limit-enforcement.js +1 -1
  108. package/dist/src/harness/tool-loop.js +2 -2
  109. package/dist/src/internal/application/build-profile.d.ts +64 -0
  110. package/dist/src/internal/application/build-profile.js +1 -0
  111. package/dist/src/internal/application/compiled-artifacts.js +3 -2
  112. package/dist/src/internal/application/package.js +1 -1
  113. package/dist/src/internal/authored-module-loader.d.ts +10 -0
  114. package/dist/src/internal/authored-module-loader.js +3 -3
  115. package/dist/src/internal/authored-module-map-loader.js +1 -1
  116. package/dist/src/internal/bundler/nitro-rolldown.d.ts +18 -2
  117. package/dist/src/internal/bundler/nitro-rolldown.js +1 -1
  118. package/dist/src/internal/materialized-authored-modules.d.ts +2 -4
  119. package/dist/src/internal/materialized-authored-modules.js +1 -1
  120. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  121. package/dist/src/internal/nitro/dev-runtime-source-snapshot-copy.js +1 -1
  122. package/dist/src/internal/nitro/host/build-application.js +1 -1
  123. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  124. package/dist/src/internal/nitro/host/types.d.ts +2 -0
  125. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.js +1 -1
  126. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.d.ts +7 -1
  127. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
  128. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  129. package/dist/src/internal/nitro/routes/channel-route-context.d.ts +3 -0
  130. package/dist/src/internal/nitro/routes/channel-route-context.js +1 -1
  131. package/dist/src/internal/nitro/routes/runtime-stack.js +1 -1
  132. package/dist/src/internal/nitro/routes/schedule-task.js +1 -1
  133. package/dist/src/internal/workflow/development-world-client.js +1 -1
  134. package/dist/src/internal/workflow/development-world-server.js +1 -1
  135. package/dist/src/internal/workflow/local-world-data-directory.d.ts +2 -0
  136. package/dist/src/internal/workflow/local-world-data-directory.js +1 -0
  137. package/dist/src/internal/workflow-bundle/builder-support.js +3 -3
  138. package/dist/src/internal/workflow-bundle/builder.js +2 -2
  139. package/dist/src/internal/workflow-bundle/vercel-workflow-output.js +1 -1
  140. package/dist/src/protocol/cancel-turn.d.ts +11 -0
  141. package/dist/src/protocol/cancel-turn.js +1 -0
  142. package/dist/src/protocol/message.d.ts +23 -3
  143. package/dist/src/protocol/message.js +2 -2
  144. package/dist/src/protocol/routes.d.ts +10 -0
  145. package/dist/src/protocol/routes.js +1 -1
  146. package/dist/src/public/channels/discord/discordChannel.d.ts +1 -0
  147. package/dist/src/public/channels/eve.d.ts +2 -1
  148. package/dist/src/public/channels/eve.js +2 -2
  149. package/dist/src/public/channels/github/githubChannel.d.ts +1 -0
  150. package/dist/src/public/channels/linear/api.d.ts +0 -1
  151. package/dist/src/public/channels/linear/api.js +17 -22
  152. package/dist/src/public/channels/linear/linearChannel.d.ts +1 -0
  153. package/dist/src/public/channels/linear/linearChannel.js +1 -1
  154. package/dist/src/public/channels/slack/slackChannel.d.ts +1 -0
  155. package/dist/src/public/channels/teams/teamsChannel.d.ts +1 -0
  156. package/dist/src/public/channels/telegram/telegramChannel.d.ts +1 -0
  157. package/dist/src/public/channels/twilio/twilioChannel.d.ts +1 -0
  158. package/dist/src/public/definitions/channel.d.ts +25 -14
  159. package/dist/src/public/definitions/channel.js +1 -1
  160. package/dist/src/public/next/index.js +1 -1
  161. package/dist/src/public/next/resolve-eve-binary.d.ts +12 -0
  162. package/dist/src/public/next/resolve-eve-binary.js +1 -0
  163. package/dist/src/runtime/agent/mock-model-adapter.js +1 -1
  164. package/dist/src/runtime/framework-tools/agent.d.ts +13 -0
  165. package/dist/src/runtime/framework-tools/agent.js +1 -0
  166. package/dist/src/runtime/framework-tools/index.d.ts +7 -2
  167. package/dist/src/runtime/framework-tools/index.js +1 -1
  168. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  169. package/dist/src/runtime/types.d.ts +2 -1
  170. package/dist/src/services/dev-client/runtime-artifacts.d.ts +2 -2
  171. package/dist/src/services/dev-client.d.ts +10 -18
  172. package/dist/src/services/dev-client.js +1 -1
  173. package/dist/src/setup/boxes/reconcile-host-framework-preset.d.ts +26 -0
  174. package/dist/src/setup/boxes/reconcile-host-framework-preset.js +1 -0
  175. package/dist/src/setup/boxes/resolve-provisioning.js +1 -1
  176. package/dist/src/setup/index.js +1 -1
  177. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  178. package/dist/src/setup/scaffold/create/extension.js +0 -1
  179. package/dist/src/setup/scaffold/create/project.js +2 -4
  180. package/dist/src/setup/scaffold/index.d.ts +1 -1
  181. package/dist/src/setup/scaffold/index.js +1 -1
  182. package/dist/src/setup/scaffold/update/channels.d.ts +7 -1
  183. package/dist/src/setup/scaffold/update/channels.js +2 -2
  184. package/dist/src/setup/scaffold/update/connections.js +3 -3
  185. package/dist/src/setup/vercel-project-framework.d.ts +12 -0
  186. package/dist/src/setup/vercel-project-framework.js +1 -1
  187. package/dist/src/shared/continuation-token.d.ts +2 -0
  188. package/dist/src/shared/continuation-token.js +1 -0
  189. package/dist/src/svelte/index.js +1 -1
  190. package/dist/src/svelte/use-eve-agent.js +1 -1
  191. package/dist/src/vue/index.js +1 -1
  192. package/dist/src/vue/use-eve-agent.js +1 -1
  193. package/docs/channels/eve.mdx +11 -1
  194. package/docs/concepts/default-harness.md +2 -0
  195. package/docs/concepts/execution-model-and-durability.md +1 -1
  196. package/docs/concepts/sessions-runs-and-streaming.md +24 -4
  197. package/docs/evals/assertions.mdx +2 -2
  198. package/docs/evals/cases.mdx +31 -0
  199. package/docs/evals/overview.mdx +1 -1
  200. package/docs/evals/targets.mdx +2 -1
  201. package/docs/guides/client/continuations.mdx +16 -1
  202. package/docs/guides/client/streaming.mdx +31 -2
  203. package/docs/guides/deployment.md +1 -1
  204. package/docs/guides/frontend/overview.mdx +4 -2
  205. package/docs/guides/frontend/use-eve-agent-svelte.mdx +2 -2
  206. package/docs/guides/frontend/use-eve-agent-vue.mdx +2 -2
  207. package/docs/guides/remote-agents.md +2 -0
  208. package/docs/reference/cli.md +16 -3
  209. package/docs/subagents.mdx +10 -0
  210. package/package.json +6 -6
  211. package/dist/src/compiled/_chunks/workflow/attribute-changes-MGTOG_uX.js +0 -20
  212. package/dist/src/compiled/_chunks/workflow/resume-hook-DHP5ql3-.js +0 -1
  213. package/dist/src/compiled/_chunks/workflow/run-D8hv1ptT.js +0 -1
  214. package/dist/src/compiled/_chunks/workflow/sleep-uA9pS-PT.js +0 -1
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Owns one turn's cancellation surface inside the turn workflow: the
3
+ * session-scoped cancel hook and the durable `AbortController` whose
4
+ * signal is serialized into every `turnStep`. Must be created inside a
5
+ * `"use workflow"` body.
6
+ */
7
+ export interface TurnCancellationControl {
8
+ /** Turn signal to serialize into each `turnStep` input. */
9
+ readonly signal: AbortSignal;
10
+ /**
11
+ * Resolves `"cancel"` once a matching cancel payload is consumed and
12
+ * the signal aborted. Race it against turn-owned awaits — never
13
+ * `await` it alone.
14
+ */
15
+ readonly requested: Promise<"cancel">;
16
+ /** Disposes the hook, abandoning any outstanding read. Idempotent. */
17
+ dispose(): Promise<void>;
18
+ }
19
+ /**
20
+ * Creates and claims the session cancel hook for one turn workflow run.
21
+ * Returns `undefined` when the token is still claimed by a crashed prior
22
+ * run — the turn then runs uncancellable rather than failing.
23
+ */
24
+ export declare function createTurnCancellationControl(input: {
25
+ readonly expectedTurnId: string;
26
+ readonly sessionId: string;
27
+ }): Promise<TurnCancellationControl | undefined>;
@@ -0,0 +1 @@
1
+ import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{sessionCancelHookToken}from"#execution/turn-cancellation-token.js";import{TurnCancelledError}from"#harness/turn-cancellation.js";async function createTurnCancellationControl(r){let i=createHook({token:sessionCancelHookToken(r.sessionId)}),a=i[Symbol.asyncIterator]();try{await claimHookOwnership(i)}catch(e){if(isHookConflictError(e))return;throw e}let o=new AbortController,s=consumeMatchingCancel(a,r.expectedTurnId).then(()=>(o.abort(new TurnCancelledError),`cancel`)),c=!1;return{signal:o.signal,requested:s,async dispose(){c||(c=!0,await disposeHook(i))}}}async function consumeMatchingCancel(e,t){for(;;){let n=await e.next();if(n.done)return await new Promise(()=>{});if(matchesActiveTurn(n.value,t))return}}function matchesActiveTurn(e,t){if(typeof e!=`object`||!e)return!0;let n=e.turnId;return n===void 0||n===t}export{createTurnCancellationControl};
@@ -0,0 +1,9 @@
1
+ /** Derives the stable session-scoped cancellation hook token. */
2
+ export declare function sessionCancelHookToken(sessionId: string): string;
3
+ /**
4
+ * Payload accepted by the session cancel hook. A mismatched `turnId` is a
5
+ * benign no-op; omitting it targets whichever turn owns the hook.
6
+ */
7
+ export interface TurnCancelPayload {
8
+ readonly turnId?: string;
9
+ }
@@ -0,0 +1 @@
1
+ function sessionCancelHookToken(e){return`${e}:cancel`}export{sessionCancelHookToken};
@@ -3,6 +3,19 @@ import type { DurableSessionState } from "#execution/durable-session-store.js";
3
3
  import type { NextDriverAction } from "#execution/next-driver-action.js";
4
4
  import type { SessionDeliveryHook } from "#execution/session-delivery-hook.js";
5
5
  import type { RunMode } from "#shared/run-mode.js";
6
+ /** One settled turn: its terminal driver action plus deferred hook cleanup. */
7
+ export interface DispatchedTurn {
8
+ readonly action: NextDriverAction;
9
+ /**
10
+ * Disposes the turn's control hook. Deferred until the *next* turn
11
+ * settles (or the session ends): the turn run's final control send is
12
+ * at-least-once, and `sendTurnControlStep` does not treat
13
+ * `HookNotFoundError` as benign, so a late duplicate resume must land
14
+ * on a live hook. By the next settle, the previous run has completed
15
+ * and can no longer re-send.
16
+ */
17
+ dispose(): Promise<void>;
18
+ }
6
19
  /** Dispatches one turn and services its private-inbox control protocol until it terminates. */
7
20
  export declare function dispatchAndAwaitTurn(input: {
8
21
  readonly bufferedDeliveries: DeliverHookPayload[];
@@ -14,4 +27,4 @@ export declare function dispatchAndAwaitTurn(input: {
14
27
  readonly parentWritable: WritableStream<Uint8Array>;
15
28
  readonly serializedContext: Record<string, unknown>;
16
29
  readonly sessionState: DurableSessionState;
17
- }): Promise<NextDriverAction>;
30
+ }): Promise<DispatchedTurn>;
@@ -1 +1 @@
1
- import{dispatchTurnStep}from"#execution/workflow-steps.js";import{TurnControlReceiver}from"#execution/turn-control-receiver.js";async function dispatchAndAwaitTurn(e){let t=new TurnControlReceiver({bufferedDeliveries:e.bufferedDeliveries,deliveryHook:e.deliveryHook,token:e.controlToken});try{return await dispatchTurnStep({capabilities:e.capabilities,completionToken:t.token,delivery:e.delivery,mode:e.mode,parentWritable:e.parentWritable,serializedContext:e.serializedContext,sessionState:e.sessionState}),await t.waitForAction()}finally{await t.dispose()}}export{dispatchAndAwaitTurn};
1
+ import{dispatchTurnStep}from"#execution/workflow-steps.js";import{TurnControlReceiver}from"#execution/turn-control-receiver.js";async function dispatchAndAwaitTurn(t){let n=new TurnControlReceiver({bufferedDeliveries:t.bufferedDeliveries,deliveryHook:t.deliveryHook,token:t.controlToken});try{return await dispatchTurnStep({capabilities:t.capabilities,completionToken:n.token,delivery:t.delivery,mode:t.mode,parentWritable:t.parentWritable,serializedContext:t.serializedContext,sessionState:t.sessionState}),{action:await n.waitForAction(),dispose:()=>n.dispose()}}catch(e){throw await n.dispose(),e}}export{dispatchAndAwaitTurn};
@@ -14,6 +14,7 @@ type TurnTerminalAction = {
14
14
  readonly usage?: TokenUsage;
15
15
  } | {
16
16
  readonly authorizationNames?: readonly string[];
17
+ readonly cancelled?: true;
17
18
  readonly kind: "park";
18
19
  };
19
20
  /** Owns the mutable durable state cursor for one active turn workflow. */
@@ -36,7 +37,7 @@ export declare class TurnExecutionCursor {
36
37
  /** Adopts a state transition and reports any continuation-token change once. */
37
38
  adopt(transition: TurnTransition): Promise<void>;
38
39
  /** Builds the next atomic turn-step input from the cursor's current state. */
39
- createStepInput(input: HookPayload | undefined): TurnStepInput;
40
+ createStepInput(input: HookPayload | undefined, abortSignal?: AbortSignal): TurnStepInput;
40
41
  /**
41
42
  * Adopts a terminal turn transition and publishes it as the turn result.
42
43
  * The result already carries the final session state, so no separate
@@ -1 +1 @@
1
- import{sendTurnControlStep}from"#execution/turn-control-protocol.js";var TurnExecutionCursor=class{controlToken;parentWritable;currentSerializedContext;currentSessionState;lastReportedContinuationToken;constructor(e){this.controlToken=e.controlToken,this.currentSerializedContext=e.serializedContext,this.currentSessionState=e.sessionState,this.lastReportedContinuationToken=e.sessionState.continuationToken,this.parentWritable=e.parentWritable}get serializedContext(){return this.currentSerializedContext}get sessionState(){return this.currentSessionState}async adopt(e){this.setState(e);let t=e.sessionState.continuationToken;t===``||t===this.lastReportedContinuationToken||(this.lastReportedContinuationToken=t,await this.send({continuationToken:t,kind:`turn-continuation-token`}))}createStepInput(e){return{input:e,parentWritable:this.parentWritable,serializedContext:this.currentSerializedContext,sessionState:this.currentSessionState}}async finish(e,t,n){this.setState(e),await this.send({action:{...t,serializedContext:this.currentSerializedContext,sessionState:this.currentSessionState},bufferedDeliveries:n.length===0?void 0:[...n],kind:`turn-result`})}async send(t){await sendTurnControlStep({controlToken:this.controlToken,payload:t})}setState(e){this.currentSerializedContext=e.serializedContext??this.currentSerializedContext,this.currentSessionState=e.sessionState}};export{TurnExecutionCursor};
1
+ import{sendTurnControlStep}from"#execution/turn-control-protocol.js";var TurnExecutionCursor=class{controlToken;parentWritable;currentSerializedContext;currentSessionState;lastReportedContinuationToken;constructor(e){this.controlToken=e.controlToken,this.currentSerializedContext=e.serializedContext,this.currentSessionState=e.sessionState,this.lastReportedContinuationToken=e.sessionState.continuationToken,this.parentWritable=e.parentWritable}get serializedContext(){return this.currentSerializedContext}get sessionState(){return this.currentSessionState}async adopt(e){this.setState(e);let t=e.sessionState.continuationToken;t===``||t===this.lastReportedContinuationToken||(this.lastReportedContinuationToken=t,await this.send({continuationToken:t,kind:`turn-continuation-token`}))}createStepInput(e,t){return{abortSignal:t,input:e,parentWritable:this.parentWritable,serializedContext:this.currentSerializedContext,sessionState:this.currentSessionState}}async finish(e,t,n){this.setState(e),await this.send({action:{...t,serializedContext:this.currentSerializedContext,sessionState:this.currentSessionState},bufferedDeliveries:n.length===0?void 0:[...n],kind:`turn-result`})}async send(t){await sendTurnControlStep({controlToken:this.controlToken,payload:t})}setState(e){this.currentSerializedContext=e.serializedContext??this.currentSerializedContext,this.currentSessionState=e.sessionState}};export{TurnExecutionCursor};
@@ -1,4 +1,12 @@
1
1
  import { type TurnWorkflowInput } from "#execution/durable-session-migrations/turn-workflow.js";
2
2
  export type { TurnWorkflowInput };
3
- /** Runs one complete logical turn, including child-agent waits when supported. */
3
+ /**
4
+ * Runs one complete logical turn, including child-agent waits when supported.
5
+ *
6
+ * The turn-owned path also owns turn cancellation: resuming the
7
+ * session-scoped cancel hook (`{sessionId}:cancel`) mid-turn aborts the
8
+ * signal serialized into every `turnStep` and settles the turn as
9
+ * `turn.cancelled` → `session.waiting` — never as a failure. A late or
10
+ * guard-mismatched cancel is a benign no-op.
11
+ */
4
12
  export declare function turnWorkflow(rawInput: unknown): Promise<void>;
@@ -1 +1 @@
1
- import{resolveRuntimeActionResultsForKeys}from"#harness/runtime-actions.js";import{dispatchRuntimeActionsStep}from"#execution/dispatch-runtime-actions-step.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{turnStep}from"#execution/workflow-steps.js";import{createHook,getWorkflowMetadata}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,closeHookIterator,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{sendTurnControlStep}from"#execution/turn-control-protocol.js";import{dispatchWorkflowRuntimeActionsStep}from"#execution/dispatch-workflow-runtime-actions-step.js";import{migrateTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{runProxySubagentEventStep}from"#execution/subagent-event-proxy-step.js";import{TurnExecutionCursor}from"#execution/turn-execution-cursor.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(e){let s=createHook({token:`${e.completionToken}:inbox`}),c=s[Symbol.asyncIterator](),l=new TurnExecutionCursor({controlToken:e.completionToken,parentWritable:e.stepInput.parentWritable,serializedContext:e.stepInput.serializedContext,sessionState:e.stepInput.sessionState}),u=0,nextDeliveryRequestId=()=>`${s.token}:delivery:${String(u++)}`,d=[],f=e.stepInput.input,p=!1;try{try{await claimHookOwnership(s),p=!0}catch(e){if(isHookConflictError(e))return;throw e}for(;;){let i=await turnStep(l.createStepInput(f));if(i.action===`done`){await l.finish(i,{kind:`done`,output:i.output??``,isError:i.isError,usage:i.usage},d);return}let o=i.action===`dispatch-workflow-runtime-actions`||i.action===`park`?i.pendingRuntimeActionKeys:void 0;if(o!==void 0){await l.adopt(i);let e=await(i.action===`dispatch-workflow-runtime-actions`?dispatchWorkflowRuntimeActionsStep:dispatchRuntimeActionsStep)({callbackBaseUrl:resolveWorkflowCallbackBaseUrl(getWorkflowMetadata().url),parentContinuationToken:s.token,parentWritable:l.parentWritable,serializedContext:l.serializedContext,sessionState:l.sessionState});await l.adopt(e),f={kind:`runtime-action-result`,results:await waitForRuntimeActionResults({bufferedDeliveries:d,cursor:l,inboxToken:s.token,initialResults:e.results,iterator:c,nextDeliveryRequestId,pendingActionKeys:o})};continue}if(i.action===`park`){if(!(i.hasPendingAuthorization||i.hasPendingInputBatch&&e.capabilities?.requestInput===!0||e.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);await l.finish(i,{authorizationNames:i.authorizationNames,kind:`park`},d);return}await l.adopt(i),f=void 0}}catch(e){throw await l.send({error:normalizeSerializableError(e),kind:`turn-error`}),e}finally{await closeHookIterator(c),p&&await disposeHook(s)}}async function waitForRuntimeActionResults(t){let n,r=[...t.initialResults];for(;;){let i=resolveRuntimeActionResultsForKeys({pendingKeys:t.pendingActionKeys,results:r});if(i!==void 0)return n!==void 0&&await t.cursor.send({kind:`turn-delivery-cancelled`,requestId:n}),i;t.cursor.sessionState.hasProxyInputRequests&&n===void 0&&(n=t.nextDeliveryRequestId(),await t.cursor.send({continuationToken:t.cursor.sessionState.continuationToken,inboxToken:t.inboxToken,kind:`turn-delivery-request`,requestId:n}));let a=await t.iterator.next();if(a.done)throw Error(`Turn inbox closed before runtime actions completed.`);let o=a.value;if(o.kind===`runtime-action-result`){r.push(...o.results);continue}if(o.kind===`subagent-input-request`||o.kind===`subagent-authorization-event`){let e=await runProxySubagentEventStep({hookPayload:o,parentWritable:t.cursor.parentWritable,serializedContext:t.cursor.serializedContext,sessionState:t.cursor.sessionState});await t.cursor.adopt(e);continue}if(o.kind===`driver-delivery`&&o.requestId===n){await t.cursor.send({kind:`turn-delivery-accepted`,requestId:o.requestId}),n=void 0;let e=await routeDeliverToChildren({auth:o.delivery.auth,parentWritable:t.cursor.parentWritable,payloads:o.delivery.payloads,sessionState:t.cursor.sessionState});e!==void 0&&t.bufferedDeliveries.push({...o.delivery,payloads:[e]})}}}async function runLegacyTurnWorkflow(e){let t=e.stepInput;try{for(;;){let n=await turnStep(t);if(n.action===`done`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`done`,output:n.output??``,isError:n.isError,serializedContext:n.serializedContext,sessionState:n.sessionState,usage:n.usage},kind:`turn-result`}});return}if(n.action===`dispatch-workflow-runtime-actions`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`dispatch-workflow-runtime-actions`,pendingActionKeys:n.pendingRuntimeActionKeys,serializedContext:n.serializedContext,sessionState:n.sessionState},kind:`turn-result`}});return}if(n.action===`park`){let t=n.pendingRuntimeActionKeys;if(!(t!==void 0||n.hasPendingAuthorization||n.hasPendingInputBatch&&e.capabilities?.requestInput===!0||e.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);let r=t===void 0?{kind:`park`,serializedContext:n.serializedContext,sessionState:n.sessionState,authorizationNames:n.authorizationNames}:{kind:`dispatch-runtime-actions`,pendingActionKeys:t,serializedContext:n.serializedContext,sessionState:n.sessionState};await sendTurnControlStep({controlToken:e.completionToken,payload:{action:r,kind:`turn-result`}});return}t={input:void 0,parentWritable:t.parentWritable,serializedContext:n.serializedContext,sessionState:n.sessionState}}}catch(t){throw await sendTurnControlStep({controlToken:e.completionToken,payload:{error:normalizeSerializableError(t),kind:`turn-error`}}),t}}export{turnWorkflow};
1
+ import{resolveRuntimeActionResultsForKeys}from"#harness/runtime-actions.js";import{dispatchRuntimeActionsStep}from"#execution/dispatch-runtime-actions-step.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{turnStep}from"#execution/workflow-steps.js";import{createHook,getWorkflowMetadata}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{sendTurnControlStep}from"#execution/turn-control-protocol.js";import{cancelDescendantTurnsStep}from"#execution/cancel-descendant-turns-step.js";import{dispatchWorkflowRuntimeActionsStep}from"#execution/dispatch-workflow-runtime-actions-step.js";import{migrateTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{runProxySubagentEventStep}from"#execution/subagent-event-proxy-step.js";import{createTurnCancellationControl}from"#execution/turn-cancellation-control.js";import{TurnExecutionCursor}from"#execution/turn-execution-cursor.js";import{activeTurnId}from"#harness/active-turn-id.js";const TASK_MODE_WAIT_ERROR_MESSAGE="Task mode cannot wait for follow-up input (`next: null`).";function canSettleCancelledTurnAsPark(e){return e.mode===`conversation`||e.stepInput.sessionState.continuationToken!==``}async function turnWorkflow(e){"use workflow";let t=migrateTurnWorkflowInput(e);return t.driverCapabilities?.turnInbox===!0?runTurnOwnedWorkflow(t):runLegacyTurnWorkflow(t)}async function runTurnOwnedWorkflow(e){let c=createHook({token:`${e.completionToken}:inbox`}),l=c[Symbol.asyncIterator](),u=new TurnExecutionCursor({controlToken:e.completionToken,parentWritable:e.stepInput.parentWritable,serializedContext:e.stepInput.serializedContext,sessionState:e.stepInput.sessionState}),d=0,nextDeliveryRequestId=()=>`${c.token}:delivery:${String(d++)}`,f=[],p=e.stepInput.input,m=!1,h;try{try{await claimHookOwnership(c),m=!0}catch(e){if(isHookConflictError(e))return;throw e}for(e.driverCapabilities?.cancelledTurnSettle===!0&&canSettleCancelledTurnAsPark(e)&&(h=await createTurnCancellationControl({expectedTurnId:activeTurnId(e.stepInput.sessionState.emissionState),sessionId:e.stepInput.sessionState.sessionId}));;){let i=await turnStep(u.createStepInput(p,h?.signal));if(i.action===`cancelled`){await cancelDescendantTurnsStep({serializedContext:u.serializedContext,sessionState:u.sessionState}),await h?.dispose(),await u.finish({sessionState:u.sessionState},{cancelled:!0,kind:`park`},f);return}if(i.action===`done`){await h?.dispose(),await u.finish(i,{kind:`done`,output:i.output??``,isError:i.isError,usage:i.usage},f);return}let o=i.action===`dispatch-workflow-runtime-actions`||i.action===`park`?i.pendingRuntimeActionKeys:void 0;if(o!==void 0){await u.adopt(i);let e=await(i.action===`dispatch-workflow-runtime-actions`?dispatchWorkflowRuntimeActionsStep:dispatchRuntimeActionsStep)({callbackBaseUrl:resolveWorkflowCallbackBaseUrl(getWorkflowMetadata().url),parentContinuationToken:c.token,parentWritable:u.parentWritable,serializedContext:u.serializedContext,sessionState:u.sessionState});await u.adopt(e);let r=await waitForRuntimeActionResults({bufferedDeliveries:f,cancellation:h,cursor:u,inboxToken:c.token,initialResults:e.results,iterator:l,nextDeliveryRequestId,pendingActionKeys:o});if(r===`cancelled`){p=void 0;continue}p={kind:`runtime-action-result`,results:r};continue}if(i.action===`park`){if(!(i.hasPendingAuthorization||i.hasPendingInputBatch&&e.capabilities?.requestInput===!0||e.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);await h?.dispose(),await u.finish(i,{authorizationNames:i.authorizationNames,kind:`park`},f);return}await u.adopt(i),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(c)}}async function waitForRuntimeActionResults(t){let n,r=[...t.initialResults];for(;;){let i=resolveRuntimeActionResultsForKeys({pendingKeys:t.pendingActionKeys,results:r});if(i!==void 0)return n!==void 0&&await t.cursor.send({kind:`turn-delivery-cancelled`,requestId:n}),i;t.cursor.sessionState.hasProxyInputRequests&&n===void 0&&(n=t.nextDeliveryRequestId(),await t.cursor.send({continuationToken:t.cursor.sessionState.continuationToken,inboxToken:t.inboxToken,kind:`turn-delivery-request`,requestId:n}));let a=t.iterator.next();a.catch(()=>{});let o=await(t.cancellation===void 0?a:Promise.race([a,t.cancellation.requested]));if(o===`cancel`)return n!==void 0&&await t.cursor.send({kind:`turn-delivery-cancelled`,requestId:n}),`cancelled`;if(o.done)throw Error(`Turn inbox closed before runtime actions completed.`);let s=o.value;if(s.kind===`runtime-action-result`){r.push(...s.results);continue}if(s.kind===`subagent-input-request`||s.kind===`subagent-authorization-event`){let e=await runProxySubagentEventStep({hookPayload:s,parentWritable:t.cursor.parentWritable,serializedContext:t.cursor.serializedContext,sessionState:t.cursor.sessionState});await t.cursor.adopt(e);continue}if(s.kind===`driver-delivery`&&s.requestId===n){await t.cursor.send({kind:`turn-delivery-accepted`,requestId:s.requestId}),n=void 0;let e=await routeDeliverToChildren({auth:s.delivery.auth,parentWritable:t.cursor.parentWritable,payloads:s.delivery.payloads,sessionState:t.cursor.sessionState});e!==void 0&&t.bufferedDeliveries.push({...s.delivery,payloads:[e]})}}}async function runLegacyTurnWorkflow(e){let t=e.stepInput;try{for(;;){let n=await turnStep(t);if(n.action===`done`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`done`,output:n.output??``,isError:n.isError,serializedContext:n.serializedContext,sessionState:n.sessionState,usage:n.usage},kind:`turn-result`}});return}if(n.action===`dispatch-workflow-runtime-actions`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`dispatch-workflow-runtime-actions`,pendingActionKeys:n.pendingRuntimeActionKeys,serializedContext:n.serializedContext,sessionState:n.sessionState},kind:`turn-result`}});return}if(n.action===`park`){let t=n.pendingRuntimeActionKeys;if(!(t!==void 0||n.hasPendingAuthorization||n.hasPendingInputBatch&&e.capabilities?.requestInput===!0||e.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);let r=t===void 0?{kind:`park`,serializedContext:n.serializedContext,sessionState:n.sessionState,authorizationNames:n.authorizationNames}:{kind:`dispatch-runtime-actions`,pendingActionKeys:t,serializedContext:n.serializedContext,sessionState:n.sessionState};await sendTurnControlStep({controlToken:e.completionToken,payload:{action:r,kind:`turn-result`}});return}t={input:void 0,parentWritable:t.parentWritable,serializedContext:n.serializedContext,sessionState:n.sessionState}}}catch(t){throw await sendTurnControlStep({controlToken:e.completionToken,payload:{error:normalizeSerializableError(t),kind:`turn-error`}}),t}}export{turnWorkflow};
@@ -1 +1 @@
1
- import{readSerializedSubagentDepth}from"#harness/subagent-depth.js";import{emitTerminalSessionFailureStep}from"#execution/workflow-steps.js";import{createHook,getWorkflowMetadata,getWritable}from"#compiled/@workflow/core/index.js";import{closeHookIterator,disposeHook}from"#execution/hook-ownership.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{coalesceDeliveries}from"#harness/messages.js";import{readChannelRequestId,readRootSessionId}from"#execution/eve-workflow-attributes.js";import{notifyDelegatedParentStep}from"#execution/delegated-parent-notification.js";import{createDelegatedSubagentErrorResult,createDelegatedSubagentSuccessResult}from"#execution/delegated-parent-result.js";import{dispatchAndAwaitTurn}from"#execution/turn-dispatch.js";import{createSessionStep}from"#execution/create-session-step.js";import{fireSessionCallbackStep}from"#execution/session-callback-step.js";import{createSessionDeliveryHook}from"#execution/session-delivery-hook.js";async function workflowEntry(n){"use workflow";let{workflowRunId:a}=getWorkflowMetadata(),o=n.serializedContext[`eve.continuationToken`]||``,c=n.serializedContext[`eve.mode`],l=n.serializedContext[`eve.capabilities`],u=n.serializedContext[`eve.bundle`];n.serializedContext[`eve.sessionId`]=a;let d=getWritable();try{let t=readRootSessionId(n.serializedContext),r=readSerializedSubagentDepth(n.serializedContext),{state:i}=await createSessionStep({compiledArtifactsSource:u.source,continuationToken:o,inheritedLimits:n.limits,nodeId:u.nodeId,outputSchema:n.input.outputSchema,rootSessionId:t,sessionId:a,subagentDepth:r});return await runDriverLoop({capabilities:l,driverWritable:d,initialInput:{kind:`deliver`,payloads:[{message:n.input.message,context:n.input.context,outputSchema:n.input.outputSchema}],requestId:readChannelRequestId(n.serializedContext)},mode:c,serializedContext:n.serializedContext,sessionState:i})}catch(e){throw await emitTerminalSessionFailureStep({error:normalizeSerializableError(e),parentWritable:d,serializedContext:n.serializedContext}),await fireSessionCallbackStep({error:normalizeSerializableError(e),serializedContext:n.serializedContext,status:`failed`}),await notifyDelegatedParentStep({result:createDelegatedSubagentErrorResult(n.serializedContext,e),serializedContext:n.serializedContext}),e}}async function runDriverLoop(e){let t=createHook({token:`${e.sessionState.sessionId}:auth`}),r=t[Symbol.asyncIterator](),i=0,nextTurnControlToken=()=>`${e.sessionState.sessionId}:turn-control:${String(i++)}`,s=[],l=createSessionDeliveryHook(s);try{e.sessionState.continuationToken&&await l.rekey(e.sessionState.continuationToken);let t=await dispatchAndAwaitTurn({bufferedDeliveries:s,capabilities:e.capabilities,controlToken:nextTurnControlToken(),delivery:e.initialInput,deliveryHook:l,mode:e.mode,parentWritable:e.driverWritable,serializedContext:e.serializedContext,sessionState:e.sessionState});for(;;){if(t.kind===`done`)return await finalizeDone({action:t,driverWritable:e.driverWritable});if(t.kind!==`park`)throw Error(`Driver received unexpected turn action "${t.kind}".`);if(!t.sessionState.continuationToken)throw Error("Cannot park: no continuation token available. The channel must post the first message during the initial turn (anchoring the session) or `send()` must be called with an explicit continuationToken.");if(await l.rekey(t.sessionState.continuationToken),t.authorizationNames&&t.authorizationNames.length>0){let n=t.authorizationNames.length,i=[];for(;i.length<n;){let e=await r.next();if(e.done)break;e.value.kind===`deliver`&&i.push(...e.value.payloads)}t=await dispatchAndAwaitTurn({bufferedDeliveries:s,capabilities:e.capabilities,controlToken:nextTurnControlToken(),delivery:{kind:`deliver`,payloads:i},deliveryHook:l,mode:e.mode,parentWritable:e.driverWritable,serializedContext:t.serializedContext,sessionState:t.sessionState});continue}let n=await waitForNextDeliver({bufferedDeliveries:s,deliveryHook:l});if(n===null)return{output:``};let i=await routeDeliverToChildren({auth:n.auth,parentWritable:e.driverWritable,payloads:n.payloads,sessionState:t.sessionState});i!==void 0&&(t=await dispatchAndAwaitTurn({bufferedDeliveries:s,capabilities:e.capabilities,controlToken:nextTurnControlToken(),delivery:{auth:n.auth,kind:`deliver`,payloads:[i],requestId:n.requestId},deliveryHook:l,mode:e.mode,parentWritable:e.driverWritable,serializedContext:t.serializedContext,sessionState:t.sessionState}))}}finally{await l.dispose(),await closeHookIterator(r),await disposeHook(t)}}async function finalizeDone(e){let{output:t,serializedContext:n}=e.action,r=e.action.isError===!0;return await fireSessionCallbackStep({error:r?t:void 0,output:r?void 0:t,serializedContext:n,status:r?`failed`:`completed`,usage:r?void 0:e.action.usage}),await notifyDelegatedParentStep({result:r?createDelegatedSubagentErrorResult(n,t):createDelegatedSubagentSuccessResult(n,t),serializedContext:n,usage:r?void 0:e.action.usage}),{output:t}}async function waitForNextDeliver(e){if(e.bufferedDeliveries.length>0)return coalesceDeliveries(e.bufferedDeliveries.splice(0));for(;;){let t=await e.deliveryHook.next();if(e.deliveryHook.consumeNext(),t.done)return null;if(t.value.kind!==`deliver`)continue;let n=t.value;for(;;){let t=await takeReadyPayload(e.deliveryHook.next());if(t===NO_READY_MESSAGE||(e.deliveryHook.consumeNext(),t.done))break;t.value.kind===`deliver`&&(n=coalesceDeliveries([n,t.value]))}return n}}const NO_READY_MESSAGE=Symbol(`no-ready-message`);async function takeReadyPayload(e){return await Promise.resolve(),await Promise.race([e,Promise.resolve(NO_READY_MESSAGE)])}export{workflowEntry};
1
+ import{readSerializedSubagentDepth}from"#harness/subagent-depth.js";import{createHook,getWorkflowMetadata,getWritable}from"#compiled/@workflow/core/index.js";import{disposeHook}from"#execution/hook-ownership.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{coalesceDeliveries}from"#harness/messages.js";import{readChannelRequestId,readRootSessionId}from"#execution/eve-workflow-attributes.js";import{notifyDelegatedParentStep}from"#execution/delegated-parent-notification.js";import{createDelegatedSubagentErrorResult,createDelegatedSubagentSuccessResult}from"#execution/delegated-parent-result.js";import{dispatchAndAwaitTurn}from"#execution/turn-dispatch.js";import{createSessionStep}from"#execution/create-session-step.js";import{settleCancelledTurnStep}from"#execution/settle-cancelled-turn-step.js";import{emitTerminalSessionFailureStep}from"#execution/terminal-session-failure-step.js";import{fireSessionCallbackStep}from"#execution/session-callback-step.js";import{createSessionDeliveryHook}from"#execution/session-delivery-hook.js";async function workflowEntry(t){"use workflow";let{workflowRunId:i}=getWorkflowMetadata(),o=t.serializedContext[`eve.continuationToken`]||``,s=t.serializedContext[`eve.mode`],u=t.serializedContext[`eve.capabilities`],d=t.serializedContext[`eve.bundle`];t.serializedContext[`eve.sessionId`]=i;let f=getWritable();try{let n=readRootSessionId(t.serializedContext),r=readSerializedSubagentDepth(t.serializedContext),{state:a}=await createSessionStep({compiledArtifactsSource:d.source,continuationToken:o,inheritedLimits:t.limits,nodeId:d.nodeId,outputSchema:t.input.outputSchema,rootSessionId:n,sessionId:i,subagentDepth:r});return await runDriverLoop({capabilities:u,driverWritable:f,initialInput:{kind:`deliver`,payloads:[{message:t.input.message,context:t.input.context,outputSchema:t.input.outputSchema}],requestId:readChannelRequestId(t.serializedContext)},mode:s,serializedContext:t.serializedContext,sessionState:a})}catch(e){throw await emitTerminalSessionFailureStep({error:normalizeSerializableError(e),parentWritable:f,serializedContext:t.serializedContext}),await fireSessionCallbackStep({error:normalizeSerializableError(e),serializedContext:t.serializedContext,status:`failed`}),await notifyDelegatedParentStep({result:createDelegatedSubagentErrorResult(t.serializedContext,e),serializedContext:t.serializedContext}),e}}async function runDriverLoop(e){let n=createHook({token:`${e.sessionState.sessionId}:auth`}),r=n[Symbol.asyncIterator](),a=0,nextTurnControlToken=()=>`${e.sessionState.sessionId}:turn-control:${String(a++)}`,s=[],c=createSessionDeliveryHook(s),l,runTurn=async t=>{let n=await dispatchAndAwaitTurn({bufferedDeliveries:s,capabilities:e.capabilities,controlToken:nextTurnControlToken(),delivery:t.delivery,deliveryHook:c,mode:e.mode,parentWritable:e.driverWritable,serializedContext:t.serializedContext,sessionState:t.sessionState});return await l?.(),l=n.dispose,n.action};try{e.sessionState.continuationToken&&await c.rekey(e.sessionState.continuationToken);let t=await runTurn({delivery:e.initialInput,serializedContext:e.serializedContext,sessionState:e.sessionState});for(;;){if(t.kind===`done`)return await finalizeDone({action:t,driverWritable:e.driverWritable});if(t.kind!==`park`)throw Error(`Driver received unexpected turn action "${t.kind}".`);if(t.cancelled===!0){let n=await settleCancelledTurnStep({parentWritable:e.driverWritable,serializedContext:t.serializedContext,sessionState:t.sessionState});t={...t,serializedContext:n.serializedContext,sessionState:n.sessionState}}if(!t.sessionState.continuationToken)throw Error("Cannot park: no continuation token available. The channel must post the first message during the initial turn (anchoring the session) or `send()` must be called with an explicit continuationToken.");if(await c.rekey(t.sessionState.continuationToken),t.authorizationNames&&t.authorizationNames.length>0){let e=t.authorizationNames.length,n=[];for(;n.length<e;){let e=await r.next();if(e.done)break;e.value.kind===`deliver`&&n.push(...e.value.payloads)}t=await runTurn({delivery:{kind:`deliver`,payloads:n},serializedContext:t.serializedContext,sessionState:t.sessionState});continue}let n=await waitForNextDeliver({bufferedDeliveries:s,deliveryHook:c});if(n===null)return{output:``};let i=await routeDeliverToChildren({auth:n.auth,parentWritable:e.driverWritable,payloads:n.payloads,sessionState:t.sessionState});i!==void 0&&(t=await runTurn({delivery:{auth:n.auth,kind:`deliver`,payloads:[i],requestId:n.requestId},serializedContext:t.serializedContext,sessionState:t.sessionState}))}}finally{await l?.(),await c.dispose(),await disposeHook(n)}}async function finalizeDone(e){let{output:t,serializedContext:n}=e.action,r=e.action.isError===!0;return await fireSessionCallbackStep({error:r?t:void 0,output:r?void 0:t,serializedContext:n,status:r?`failed`:`completed`,usage:r?void 0:e.action.usage}),await notifyDelegatedParentStep({result:r?createDelegatedSubagentErrorResult(n,t):createDelegatedSubagentSuccessResult(n,t),serializedContext:n,usage:r?void 0:e.action.usage}),{output:t}}async function waitForNextDeliver(e){if(e.bufferedDeliveries.length>0)return coalesceDeliveries(e.bufferedDeliveries.splice(0));for(;;){let t=await e.deliveryHook.next();if(e.deliveryHook.consumeNext(),t.done)return null;if(t.value.kind!==`deliver`)continue;let n=t.value;for(;;){let t=await takeReadyPayload(e.deliveryHook.next());if(t===NO_READY_MESSAGE||(e.deliveryHook.consumeNext(),t.done))break;t.value.kind===`deliver`&&(n=coalesceDeliveries([n,t.value]))}return n}}const NO_READY_MESSAGE=Symbol(`no-ready-message`);async function takeReadyPayload(e){return await Promise.resolve(),await Promise.race([e,Promise.resolve(NO_READY_MESSAGE)])}export{workflowEntry};
@@ -1,4 +1,4 @@
1
- import type { Runtime } from "#channel/types.js";
1
+ import type { CancelTurnInput, CancelTurnResult, Runtime } from "#channel/types.js";
2
2
  import { type Run, type StartOptionsWithoutDeploymentId, type WorkflowFunction, type WorkflowMetadata } from "#internal/workflow/runtime.js";
3
3
  import type { RuntimeCompiledArtifactsSource } from "#runtime/compiled-artifacts-source.js";
4
4
  export declare const LATEST_DEPLOYMENT_UNSUPPORTED_MESSAGE = "deploymentId 'latest' requires a World that implements resolveLatestDeploymentId()";
@@ -40,6 +40,8 @@ export declare function createWorkflowRuntime(config: {
40
40
  readonly compiledArtifactsSource: RuntimeCompiledArtifactsSource;
41
41
  readonly nodeId?: string;
42
42
  }): Runtime;
43
+ /** Requests cancellation through a session's stable workflow hook. */
44
+ export declare function requestWorkflowTurnCancellation(input: CancelTurnInput): Promise<CancelTurnResult>;
43
45
  /**
44
46
  * Starts a workflow on the latest deployment when latest routing applies,
45
47
  * while preserving local/dev worlds that do not implement latest routing.
@@ -1 +1 @@
1
- import{createLogger,logError}from"#internal/logging.js";import{RuntimeNoActiveSessionError}from"#execution/runtime-errors.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";import{serializeContext}from"#context/serialize.js";import{getRun,resumeHook,start}from"#internal/workflow/runtime.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{buildSessionAttributes,buildSubagentRootAttributes,readParentLineage}from"#execution/eve-workflow-attributes.js";import{HookNotFoundError}from"#compiled/@workflow/errors/index.js";import{isEveDevEnvironment}from"#internal/application/dev-environment.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{buildRunContext}from"#execution/runtime-context.js";import{parseNdjsonStream}from"#execution/ndjson-stream.js";const WORKFLOW_ENTRY_NAME=`workflowEntry`,TURN_WORKFLOW_NAME=`turnWorkflow`,EVE_PACKAGE_INFO=resolveInstalledPackageInfo(),LATEST_DEPLOYMENT_UNSUPPORTED_MESSAGE=`deploymentId 'latest' requires a World that implements resolveLatestDeploymentId()`,STABLE_WORKFLOW_NAMES=new Set([WORKFLOW_ENTRY_NAME,TURN_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}`};function createWorkflowRuntime(e){return{async run(n){let r=await getCompiledRuntimeAgentBundle({compiledArtifactsSource:e.compiledArtifactsSource,nodeId:e.nodeId}),i=serializeContext(buildRunContext({bundle:r,run:n})),a=readParentLineage(i),o=a.sessionId===void 0?buildSessionAttributes({inputMessage:n.title??n.input.message,serializedContext:i}):buildSubagentRootAttributes({identity:{nodeId:r.nodeId??ROOT_RUNTIME_AGENT_NODE_ID},parentCallId:a.callId,parentSessionId:a.sessionId,parentTurnId:a.turnId,rootSessionId:a.rootSessionId??a.sessionId,serializedContext:i}),s;try{s=await startWorkflowPreferLatest(workflowEntryReference,[{input:n.input,limits:n.limits,serializedContext:i}],{allowReservedAttributes:!0,attributes:normalizeEveAttributes(o)})}catch(e){throw logError(log,`failed to start workflow run`,e,{continuationToken:n.continuationToken}),e}let c,getEvents=()=>(c??=parseNdjsonStream(()=>getRun(s.runId).getReadable()),c);return{continuationToken:n.continuationToken??s.runId,get events(){return getEvents()},sessionId:s.runId}},async deliver(e){let r={auth:e.auth,kind:`deliver`,payloads:[e.payload],requestId:e.requestId};try{return{sessionId:normalizeWorkflowHook(await resumeHook(e.continuationToken,r)).runId}}catch(r){throw HookNotFoundError.is(r)?new RuntimeNoActiveSessionError(e.continuationToken):(logError(log,`failed to deliver to active session`,r,{continuationToken:e.continuationToken}),r)}},async getEventStream(e,t){return parseNdjsonStream(()=>getRun(e).getReadable({startIndex:t?.startIndex}))}}}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}}export{LATEST_DEPLOYMENT_UNSUPPORTED_MESSAGE,STABLE_WORKFLOW_NAMES,createWorkflowRuntime,startWorkflowPreferLatest,turnWorkflowReference,workflowEntryReference};
1
+ import{createLogger,logError}from"#internal/logging.js";import{RuntimeNoActiveSessionError}from"#execution/runtime-errors.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{serializeContext}from"#context/serialize.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";import{getRun,resumeHook,start}from"#internal/workflow/runtime.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{sessionCancelHookToken}from"#execution/turn-cancellation-token.js";import{buildSessionAttributes,buildSubagentRootAttributes,readParentLineage}from"#execution/eve-workflow-attributes.js";import{EntityConflictError,HookNotFoundError,RunExpiredError,WorkflowRunNotFoundError}from"#compiled/@workflow/errors/index.js";import{isEveDevEnvironment}from"#internal/application/dev-environment.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{buildRunContext}from"#execution/runtime-context.js";import{parseNdjsonStream}from"#execution/ndjson-stream.js";const WORKFLOW_ENTRY_NAME=`workflowEntry`,TURN_WORKFLOW_NAME=`turnWorkflow`,EVE_PACKAGE_INFO=resolveInstalledPackageInfo(),LATEST_DEPLOYMENT_UNSUPPORTED_MESSAGE=`deploymentId 'latest' requires a World that implements resolveLatestDeploymentId()`,STABLE_WORKFLOW_NAMES=new Set([WORKFLOW_ENTRY_NAME,TURN_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}`};function createWorkflowRuntime(e){return{async run(n){let r=await getCompiledRuntimeAgentBundle({compiledArtifactsSource:e.compiledArtifactsSource,nodeId:e.nodeId}),i=serializeContext(buildRunContext({bundle:r,run:n})),a=readParentLineage(i),o=a.sessionId===void 0?buildSessionAttributes({inputMessage:n.title??n.input.message,serializedContext:i}):buildSubagentRootAttributes({identity:{nodeId:r.nodeId??ROOT_RUNTIME_AGENT_NODE_ID},parentCallId:a.callId,parentSessionId:a.sessionId,parentTurnId:a.turnId,rootSessionId:a.rootSessionId??a.sessionId,serializedContext:i}),s;try{s=await startWorkflowPreferLatest(workflowEntryReference,[{input:n.input,limits:n.limits,serializedContext:i}],{allowReservedAttributes:!0,attributes:normalizeEveAttributes(o)})}catch(e){throw logError(log,`failed to start workflow run`,e,{continuationToken:n.continuationToken}),e}let c,getEvents=()=>(c??=parseNdjsonStream(()=>getRun(s.runId).getReadable()),c);return{continuationToken:n.continuationToken??s.runId,get events(){return getEvents()},sessionId:s.runId}},async cancelTurn(e){return await requestWorkflowTurnCancellation(e)},async deliver(e){let r={auth:e.auth,kind:`deliver`,payloads:[e.payload],requestId:e.requestId};try{return{sessionId:normalizeWorkflowHook(await resumeHook(e.continuationToken,r)).runId}}catch(r){throw HookNotFoundError.is(r)?new RuntimeNoActiveSessionError(e.continuationToken):(logError(log,`failed to deliver to active session`,r,{continuationToken:e.continuationToken}),r)}},async getEventStream(e,t){return parseNdjsonStream(()=>getRun(e).getReadable({startIndex:t?.startIndex}))}}}async function requestWorkflowTurnCancellation(e){let t=e.turnId===void 0?{}:{turnId:e.turnId};try{return await resumeHook(sessionCancelHookToken(e.sessionId),t),{status:`accepted`}}catch(e){if(isInactiveCancelTarget(e))return{status:`no_active_turn`};throw e}}function isInactiveCancelTarget(e){return HookNotFoundError.is(e)||WorkflowRunNotFoundError.is(e)||RunExpiredError.is(e)||EntityConflictError.is(e)}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}}export{LATEST_DEPLOYMENT_UNSUPPORTED_MESSAGE,STABLE_WORKFLOW_NAMES,createWorkflowRuntime,requestWorkflowTurnCancellation,startWorkflowPreferLatest,turnWorkflowReference,workflowEntryReference};
@@ -12,6 +12,10 @@ import { type TurnStepInput, type TurnWorkflowDispatchInput } from "#execution/d
12
12
  * `pendingRuntimeActionKeys` so the turn workflow can pick the right
13
13
  * {@link import("#execution/next-driver-action.js").NextDriverAction}
14
14
  * arm without re-reading the session.
15
+ *
16
+ * `cancelled` converts the harness's cancellation throw into a *returned*
17
+ * result so workflow-core never classifies the abort as a step failure or
18
+ * retries it; the epilogue runs in `settleCancelledTurnStep`.
15
19
  */
16
20
  export type DurableStepResult = {
17
21
  readonly action: "continue" | "done";
@@ -21,6 +25,10 @@ export type DurableStepResult = {
21
25
  readonly sessionState: DurableSessionState;
22
26
  /** Session-total token usage; set on `done` when the session spent any. */
23
27
  readonly usage?: TokenUsage;
28
+ } | {
29
+ readonly action: "cancelled";
30
+ readonly serializedContext: Record<string, unknown>;
31
+ readonly sessionState: DurableSessionState;
24
32
  } | {
25
33
  readonly action: "park";
26
34
  readonly authorizationNames?: readonly string[];
@@ -58,12 +66,6 @@ export declare function resolveEffectiveOutputSchema(input: {
58
66
  readonly mode: RunMode;
59
67
  readonly session: HarnessSession;
60
68
  }): HarnessSession;
61
- /** Emits a terminal `session.failed` to the adapter and durable stream. */
62
- export declare function emitTerminalSessionFailureStep(input: {
63
- readonly error: unknown;
64
- readonly parentWritable: WritableStream<Uint8Array>;
65
- readonly serializedContext: Record<string, unknown>;
66
- }): Promise<void>;
67
69
  export interface RoutedDeliverResult {
68
70
  /** `undefined` when the entire payload was routed to descendants. */
69
71
  readonly remainder: DeliverPayload | undefined;
@@ -1 +1 @@
1
- import{createLogger,formatError}from"#internal/logging.js";import{callAdapterEventHandler,defaultDeliverResult}from"#channel/adapter.js";import{AuthKey,CapabilitiesKey,ModeKey}from"#context/keys.js";import{createAuthorizationCompletedEvent,createSessionFailedEvent,encodeMessageStreamEvent,timestampHandleMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState}from"#harness/emission.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{resumeHook}from"#internal/workflow/runtime.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{getPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{createWorkflowRuntime,startWorkflowPreferLatest,turnWorkflowReference}from"#execution/workflow-runtime.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{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{setChannelContext}from"#execution/channel-context.js";import{runStep}from"#context/run-step.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{routeDeliverPayload}from"#execution/subagent-hitl-proxy.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{createTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{coalesceTurnInputs}from"#harness/messages.js";import{buildTurnAttributes,readRootSessionId}from"#execution/eve-workflow-attributes.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{dispatchDynamicInstructionEvent}from"#context/dynamic-instruction-lifecycle.js";import{dispatchDynamicSkillEvent}from"#context/dynamic-skill-lifecycle.js";import{dispatchDynamicToolEvent}from"#context/dynamic-tool-lifecycle.js";import{hasPendingInputBatch}from"#harness/input-requests.js";import{getTurnUsageState,toUsage}from"#harness/turn-tag-state.js";import{getRuntimeActionRequestKey}from"#runtime/actions/keys.js";import{createExecutionNodeStep}from"#execution/node-step.js";import{recordSubagentUsageSpans}from"#execution/subagent-usage-span.js";import{resolveSessionSkillRoot}from"#execution/workflow-skill-root.js";async function turnStep(e){"use step";let t=e,c=await readDurableSession(t.sessionState),l=await deserializeContext(t.serializedContext),u=l.require(ChannelKey),d=l.require(BundleKey);try{let{getWorkflowMetadata:e}=await import(`#compiled/@workflow/core/index.js`),t=e();typeof t.url==`string`&&l.set(CallbackBaseUrlKey,resolveWorkflowCallbackBaseUrl(t.url))}catch{}let f=getPendingAuthorization(c.state),p;if(f&&t.input?.kind===`deliver`){let e=[],n=[],r=[];for(let i of t.input.payloads){let t=i.authorizationCallback;if(t){let r=f.challenges.find(e=>e.name===t.connectionName);r&&(e.push({name:r.name,resume:r.resume,callback:t.callback,hookUrl:r.hookUrl}),n.push({name:r.name,authorization:r.challenge}))}else r.push(i)}e.length>0&&(l.set(PendingAuthorizationResultKey,e),c={...c,state:clearPendingAuthorization(c.state,e.map(e=>e.name))},p=n,t=r.length>0?{...t,input:{...t.input,payloads:r}}:{...t,input:void 0})}t.input?.kind===`deliver`&&t.input.auth!==void 0&&l.set(AuthKey,t.input.auth??null);let m=hydrateDurableSession({compactionOverrides:{thresholdPercent:d.resolvedAgent.config.compaction?.thresholdPercent},durable:c,turnAgent:d.turnAgent}),h=buildAdapterContext(u,l),g;if(t.input?.kind===`deliver`){let e=[];for(let n of t.input.payloads){let t=u.deliver?await u.deliver(n,h):defaultDeliverResult(n);t!=null&&e.push(t)}g=e.length===0?void 0:e.reduce(coalesceTurnInputs)}else t.input?.kind===`runtime-action-result`&&(recordSubagentUsageSpans(t.input.results),g={runtimeActionResults:t.input.results});if(t.input?.kind===`deliver`&&setChannelContext(l,{...u,state:{...h.state}}),t.input?.kind===`deliver`&&g===void 0){let e=reconcileSessionContinuationToken(l,m),n=serializeContext(l),r=e===m?t.sessionState:createDurableSessionState({session:e});return{action:`park`,...derivePendingState(e),serializedContext:n,sessionState:r}}let _=t.parentWritable.getWriter(),v=d.hookRegistry,y=d.resolvedAgent.dynamicInstructionsResolvers??[],b=d.resolvedAgent.dynamicSkillResolvers??[],x=d.resolvedAgent.dynamicToolResolvers??[],emit=async e=>{let t=await callAdapterEventHandler(u,e,h);return setChannelContext(l,{...u,state:{...h.state}}),await _.write(encodeMessageStreamEvent(timestampHandleMessageStreamEvent(t))),t},handleEvent=async(e,t)=>{let n=await emit(e);await dispatchStreamEventHooks({ctx:l,registry:v,event:n}),n.type!==`step.started`&&await dispatchDynamicModelEvent({ctx:l,dynamicModel:d.turnAgent.dynamicModel,event:n,fallback:d.turnAgent.model,messages:t??[],scope:{moduleMap:d.moduleMap,nodeId:d.nodeId}}),await dispatchDynamicToolEvent({ctx:l,resolvers:x,event:n,messages:t??[]}),await dispatchDynamicSkillEvent({ctx:l,resolvers:b,event:n,messages:t??[]}),await dispatchDynamicInstructionEvent({ctx:l,resolvers:y,event:n,messages:t??[]})},S=l.require(ModeKey),C=await runStep(l,m,async e=>{let n=resolveEffectiveOutputSchema({agentOutputSchema:d.turnAgent.outputSchema,input:g,mode:S,session:e});if(p){let e=getHarnessEmissionState(n.state);for(let{name:t,authorization:n}of p)await handleEvent(createAuthorizationCompletedEvent({authorization:n,name:t,outcome:`authorized`,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId}))}let r=l.get(CapabilitiesKey);return(async(e,n)=>{let i=await resolveSessionSkillRoot({ctx:l,turnAgent:d.turnAgent}),a=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:d.resolvedAgent.config.compaction?.thresholdPercent},session:e,skillRoot:i,turnAgent:d.turnAgent});return createExecutionNodeStep({abortSignal:t.abortSignal,capabilities:r,createRuntime:createWorkflowRuntime,handleEvent,mode:S,modelResolutionScope:{moduleMap:d.moduleMap,nodeId:d.nodeId},node:d.graph.root,workflowMaxSubagents:a.workflowMaxSubagents})(a,n)})(n,g)}),w=reconcileSessionContinuationToken(l,C.session),T=serializeContext(l);C={...C,session:w};let E=createDurableSessionState({session:C.session});if(C.next!==null&&typeof C.next==`object`&&`done`in C.next){await _.close();let e=getTurnUsageState(C.session.state)?.session;return{action:`done`,output:C.next.output,isError:C.next.isError,serializedContext:T,sessionState:E,usage:e===void 0?void 0:toUsage(e)}}if(C.next===null){_.releaseLock();let e=getPendingWorkflowInterrupt(C.session.state);return e!==void 0&&isWorkflowRuntimeActionInterrupt(e.interrupt)?{action:`dispatch-workflow-runtime-actions`,pendingRuntimeActionKeys:getRuntimeActionKeysFromWorkflowInterrupt(e.interrupt),serializedContext:T,sessionState:E}:{action:`park`,...derivePendingState(C.session),serializedContext:T,sessionState:E}}return _.releaseLock(),{action:`continue`,serializedContext:T,sessionState:E}}function derivePendingState(e){let t=getPendingRuntimeActionBatch(e.state),n=getPendingAuthorization(e.state),r={authorizationNames:n?.challenges.map(e=>e.name),hasPendingAuthorization:n!==void 0,hasPendingInputBatch:hasPendingInputBatch(e.state)};return t===void 0?r:{...r,pendingRuntimeActionKeys:t.actions.map(e=>getRuntimeActionRequestKey(e))}}function resolveEffectiveOutputSchema(e){let{agentOutputSchema:t,input:n,mode:r,session:i}=e;return n?.outputSchema===void 0?r===`task`&&i.outputSchema===void 0&&t!==void 0?{...i,outputSchema:t}:i:{...i,outputSchema:n.outputSchema}}const log=createLogger(`execution.workflow-entry`);async function emitTerminalSessionFailureStep(e){"use step";let r=formatError(e.error),i=typeof r.name==`string`?r.name:`WORKFLOW_EXECUTION_FAILED`,a=typeof r.message==`string`?r.message:String(e.error),o=e.serializedContext[`eve.sessionId`]??``;log.error(`workflow loop threw — emitting terminal session.failed`,{sessionId:o,errorId:typeof r.errorId==`string`?r.errorId:void 0,code:i,message:a,detail:typeof r.detail==`string`?r.detail:void 0});let s=createSessionFailedEvent({code:i,details:r,message:a,sessionId:o});try{let t=await deserializeContext(e.serializedContext),r=t.get(ChannelKey);r!==void 0&&await callAdapterEventHandler(r,s,buildAdapterContext(r,t))}catch(e){log.error(`adapter failed to handle terminal session.failed event`,{errorId:typeof r.errorId==`string`?r.errorId:void 0,sessionId:o,error:e})}try{let t=e.parentWritable.getWriter();try{await t.write(encodeMessageStreamEvent(timestampHandleMessageStreamEvent(s)))}finally{t.releaseLock()}}catch(e){log.error(`failed to write terminal session.failed event to durable stream`,{errorId:typeof r.errorId==`string`?r.errorId:void 0,sessionId:o,error:e})}}async function routeProxiedDeliverStep(e){"use step";let t=await readDurableSession(e.sessionState),n=routeDeliverPayload({payload:e.payload,state:t.state});for(let t of n.forChildren)await resumeHook(t.childContinuationToken,{auth:e.auth,kind:`deliver`,payloads:[t.payload]});return{remainder:n.forSelf}}async function dispatchTurnStep(e){"use step";return{runId:(await startWorkflowPreferLatest(turnWorkflowReference,[createTurnWorkflowInput(e)],{allowReservedAttributes:!0,attributes:normalizeEveAttributes(buildTurnAttributes({parentSessionId:e.sessionState.sessionId,requestId:e.delivery.kind===`deliver`?e.delivery.requestId:void 0,rootSessionId:readRootSessionId(e.serializedContext)??e.sessionState.sessionId}))})).runId}}export{dispatchTurnStep,emitTerminalSessionFailureStep,resolveEffectiveOutputSchema,routeProxiedDeliverStep,turnStep};
1
+ import{callAdapterEventHandler,defaultDeliverResult}from"#channel/adapter.js";import{AuthKey,CapabilitiesKey,ModeKey}from"#context/keys.js";import{createAuthorizationCompletedEvent,encodeMessageStreamEvent,timestampHandleMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState}from"#harness/emission.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{createWorkflowRuntime,startWorkflowPreferLatest,turnWorkflowReference}from"#execution/workflow-runtime.js";import{getPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{resumeHook}from"#internal/workflow/runtime.js";import{buildAdapterContext}from"#channel/adapter-context.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{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{runStep}from"#context/run-step.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{routeDeliverPayload}from"#execution/subagent-hitl-proxy.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{createTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{coalesceTurnInputs}from"#harness/messages.js";import{buildTurnAttributes,readRootSessionId}from"#execution/eve-workflow-attributes.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{dispatchDynamicInstructionEvent}from"#context/dynamic-instruction-lifecycle.js";import{dispatchDynamicSkillEvent}from"#context/dynamic-skill-lifecycle.js";import{dispatchDynamicToolEvent}from"#context/dynamic-tool-lifecycle.js";import{hasPendingInputBatch}from"#harness/input-requests.js";import{getTurnUsageState,toUsage}from"#harness/turn-tag-state.js";import{getRuntimeActionRequestKey}from"#runtime/actions/keys.js";import{createExecutionNodeStep}from"#execution/node-step.js";import{recordSubagentUsageSpans}from"#execution/subagent-usage-span.js";import{resolveSessionSkillRoot}from"#execution/workflow-skill-root.js";async function turnStep(a){"use step";let o=a,s=await readDurableSession(o.sessionState),c=await deserializeContext(o.serializedContext),l=c.require(ChannelKey),u=c.require(BundleKey);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 d=getPendingAuthorization(s.state),f;if(d&&o.input?.kind===`deliver`){let e=[],t=[],n=[];for(let r of o.input.payloads){let i=r.authorizationCallback;if(i){let n=d.challenges.find(e=>e.name===i.connectionName);n&&(e.push({name:n.name,resume:n.resume,callback:i.callback,hookUrl:n.hookUrl}),t.push({name:n.name,authorization:n.challenge}))}else n.push(r)}e.length>0&&(c.set(PendingAuthorizationResultKey,e),s={...s,state:clearPendingAuthorization(s.state,e.map(e=>e.name))},f=t,o=n.length>0?{...o,input:{...o.input,payloads:n}}:{...o,input:void 0})}o.input?.kind===`deliver`&&o.input.auth!==void 0&&c.set(AuthKey,o.input.auth??null);let p=hydrateDurableSession({compactionOverrides:{thresholdPercent:u.resolvedAgent.config.compaction?.thresholdPercent},durable:s,turnAgent:u.turnAgent}),m=buildAdapterContext(l,c),h;if(o.input?.kind===`deliver`){let e=[];for(let n of o.input.payloads){let r=l.deliver?await l.deliver(n,m):defaultDeliverResult(n);r!=null&&e.push(r)}h=e.length===0?void 0:e.reduce(coalesceTurnInputs)}else o.input?.kind===`runtime-action-result`&&(recordSubagentUsageSpans(o.input.results),h={runtimeActionResults:o.input.results});if(o.input?.kind===`deliver`&&setChannelContext(c,{...l,state:{...m.state}}),o.input?.kind===`deliver`&&h===void 0){let e=reconcileSessionContinuationToken(c,p),t=serializeContext(c),n=e===p?o.sessionState:createDurableSessionState({session:e});return{action:`park`,...derivePendingState(e),serializedContext:t,sessionState:n}}let g=o.parentWritable.getWriter(),_=u.hookRegistry,v=u.resolvedAgent.dynamicInstructionsResolvers??[],y=u.resolvedAgent.dynamicSkillResolvers??[],b=u.resolvedAgent.dynamicToolResolvers??[],emit=async t=>{let n=await callAdapterEventHandler(l,t,m);return setChannelContext(c,{...l,state:{...m.state}}),await g.write(encodeMessageStreamEvent(timestampHandleMessageStreamEvent(n))),n},handleEvent=async(e,t)=>{let n=await emit(e);await dispatchStreamEventHooks({ctx:c,registry:_,event:n}),n.type!==`step.started`&&await dispatchDynamicModelEvent({ctx:c,dynamicModel:u.turnAgent.dynamicModel,event:n,fallback:u.turnAgent.model,messages:t??[],scope:{moduleMap:u.moduleMap,nodeId:u.nodeId}}),await dispatchDynamicToolEvent({ctx:c,resolvers:b,event:n,messages:t??[]}),await dispatchDynamicSkillEvent({ctx:c,resolvers:y,event:n,messages:t??[]}),await dispatchDynamicInstructionEvent({ctx:c,resolvers:v,event:n,messages:t??[]})},x=c.require(ModeKey),S;try{throwIfTurnAborted(o.abortSignal),S=await runStep(c,p,async e=>{let t=resolveEffectiveOutputSchema({agentOutputSchema:u.turnAgent.outputSchema,input:h,mode:x,session:e});if(f){let e=getHarnessEmissionState(t.state);for(let{name:t,authorization:n}of f)await handleEvent(createAuthorizationCompletedEvent({authorization:n,name:t,outcome:`authorized`,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId}))}let n=c.get(CapabilitiesKey);return(async(e,t)=>{let r=await resolveSessionSkillRoot({ctx:c,turnAgent:u.turnAgent}),i=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:u.resolvedAgent.config.compaction?.thresholdPercent},session:e,skillRoot:r,turnAgent:u.turnAgent});return createExecutionNodeStep({abortSignal:o.abortSignal,capabilities:n,createRuntime:createWorkflowRuntime,handleEvent,mode:x,modelResolutionScope:{moduleMap:u.moduleMap,nodeId:u.nodeId},node:u.graph.root,workflowMaxSubagents:i.workflowMaxSubagents})(i,t)})(t,h)})}catch(e){if(!isTurnCancellation(e))throw e;return g.releaseLock(),{action:`cancelled`,serializedContext:o.serializedContext,sessionState:o.sessionState}}let C=reconcileSessionContinuationToken(c,S.session),w=serializeContext(c);S={...S,session:C};let T=createDurableSessionState({session:S.session});if(S.next!==null&&typeof S.next==`object`&&`done`in S.next){await g.close();let e=getTurnUsageState(S.session.state)?.session;return{action:`done`,output:S.next.output,isError:S.next.isError,serializedContext:w,sessionState:T,usage:e===void 0?void 0:toUsage(e)}}if(S.next===null){g.releaseLock();let e=getPendingWorkflowInterrupt(S.session.state);return e!==void 0&&isWorkflowRuntimeActionInterrupt(e.interrupt)?{action:`dispatch-workflow-runtime-actions`,pendingRuntimeActionKeys:getRuntimeActionKeysFromWorkflowInterrupt(e.interrupt),serializedContext:w,sessionState:T}:{action:`park`,...derivePendingState(S.session),serializedContext:w,sessionState:T}}return g.releaseLock(),{action:`continue`,serializedContext:w,sessionState:T}}function derivePendingState(e){let t=getPendingRuntimeActionBatch(e.state),n=getPendingAuthorization(e.state),r={authorizationNames:n?.challenges.map(e=>e.name),hasPendingAuthorization:n!==void 0,hasPendingInputBatch:hasPendingInputBatch(e.state)};return t===void 0?r:{...r,pendingRuntimeActionKeys:t.actions.map(e=>getRuntimeActionRequestKey(e))}}function resolveEffectiveOutputSchema(e){let{agentOutputSchema:t,input:n,mode:r,session:i}=e;return n?.outputSchema===void 0?r===`task`&&i.outputSchema===void 0&&t!==void 0?{...i,outputSchema:t}:i:{...i,outputSchema:n.outputSchema}}async function routeProxiedDeliverStep(e){"use step";let t=await readDurableSession(e.sessionState),n=routeDeliverPayload({payload:e.payload,state:t.state});for(let t of n.forChildren)await resumeHook(t.childContinuationToken,{auth:e.auth,kind:`deliver`,payloads:[t.payload]});return{remainder:n.forSelf}}async function dispatchTurnStep(e){"use step";return{runId:(await startWorkflowPreferLatest(turnWorkflowReference,[createTurnWorkflowInput(e)],{allowReservedAttributes:!0,attributes:normalizeEveAttributes(buildTurnAttributes({parentSessionId:e.sessionState.sessionId,requestId:e.delivery.kind===`deliver`?e.delivery.requestId:void 0,rootSessionId:readRootSessionId(e.serializedContext)??e.sessionState.sessionId}))})).runId}}export{dispatchTurnStep,resolveEffectiveOutputSchema,routeProxiedDeliverStep,turnStep};
@@ -0,0 +1,11 @@
1
+ import type { HarnessEmissionState } from "#harness/emission.js";
2
+ /**
3
+ * Returns the id of the in-flight turn, or — between turns — the id the
4
+ * next turn will mint (`turn_${sequence}`, the same formula
5
+ * `emitTurnPreamble` uses).
6
+ *
7
+ * Lives in a leaf module so `"use workflow"` bodies can import it without
8
+ * pulling harness emission (and its Node builtins) into the workflow
9
+ * bundle.
10
+ */
11
+ export declare function activeTurnId(state: HarnessEmissionState): string;
@@ -0,0 +1 @@
1
+ function activeTurnId(e){return e.turnId===``?`turn_${e.sequence}`:e.turnId}export{activeTurnId};
@@ -1 +1 @@
1
- import{resolveSubagentDepth}from"#harness/subagent-depth.js";import{ensureWorkflowContinuationSecurity,getWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{applyWorkflowTool}from"#harness/workflow-sandbox.js";function getAdvertisedTools(e){return`modelTools`in e?getAdvertisedModelTools(e):isToolDefinitionList(e.tools)?filterUnavailableDelegationToolDefinitions(e.tools,e.session):filterUnavailableDelegationToolMap(e.tools,e.session)}async function getAdvertisedModelTools(e){let i=filterUnavailableDelegationToolMap(e.tools,e.session);if(e.workflow===void 0)return{harnessTools:i,modelTools:e.modelTools,session:e.session};let a=filterWorkflowHostToolsForRootSession(i,e.session);if(a.size===0)return{harnessTools:i,modelTools:e.modelTools,session:e.session};let o=ensureWorkflowContinuationSecurity(e.session),{modelTools:s}=await applyWorkflowTool({continuationSecurity:getWorkflowContinuationSecurity(o),harnessTools:a,lifecycle:e.workflow.lifecycle?.({session:o,tools:a}),maxSubagents:e.workflow.maxSubagents,tools:e.modelTools});return{harnessTools:i,modelTools:s,session:o}}function filterUnavailableDelegationToolDefinitions(e,t){let n=[];for(let r of e)shouldHideDelegationTool(r,t)||n.push(r);return n}function filterUnavailableDelegationToolMap(e,t){let n=new Map;for(let[r,i]of e)shouldHideDelegationTool(i,t)||n.set(r,i);return n}function filterWorkflowHostToolsForRootSession(t,n){let r=new Map,i=resolveSubagentDepth(n);if(n.rootSessionId!==void 0||i.currentDepth>0)return r;for(let[e,n]of t)isDelegatedRuntimeActionTool(n)&&r.set(e,n);return r}function isDelegatedRuntimeActionTool(e){let t=e.runtimeAction;return t?.kind===`subagent-call`||t?.kind===`remote-agent-call`}function shouldHideDelegationTool(t,n){return t.runtimeAction?.recursive===!0?n.rootSessionId!==void 0||resolveSubagentDepth(n).currentDepth>0:!1}function isToolDefinitionList(e){return Array.isArray(e)}export{getAdvertisedTools};
1
+ import{resolveSubagentDepth}from"#harness/subagent-depth.js";import{AGENT_TOOL_NAME}from"#runtime/framework-tools/agent.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{ensureWorkflowContinuationSecurity,getWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{applyWorkflowTool}from"#harness/workflow-sandbox.js";function getAdvertisedTools(e){return`modelTools`in e?getAdvertisedModelTools(e):isToolDefinitionList(e.tools)?filterUnavailableDelegationToolDefinitions(e.tools,e.session):filterUnavailableDelegationToolMap(e.tools,e.session)}async function getAdvertisedModelTools(e){let t=filterUnavailableDelegationToolMap(e.tools,e.session);if(e.workflow===void 0)return{harnessTools:t,modelTools:e.modelTools,session:e.session};let n=filterWorkflowHostToolsForRootSession(t,e.session);if(n.size===0)return{harnessTools:t,modelTools:e.modelTools,session:e.session};let a=ensureWorkflowContinuationSecurity(e.session),{modelTools:o}=await applyWorkflowTool({continuationSecurity:getWorkflowContinuationSecurity(a),harnessTools:n,lifecycle:e.workflow.lifecycle?.({session:a,tools:n}),maxSubagents:e.workflow.maxSubagents,tools:e.modelTools});return{harnessTools:t,modelTools:o,session:a}}function filterUnavailableDelegationToolDefinitions(e,t){let n=[];for(let r of e)shouldHideDelegationTool(r,t)||n.push(r);return n}function filterUnavailableDelegationToolMap(e,t){let n=new Map;for(let[r,i]of e)shouldHideDelegationTool(i,t)||n.set(r,i);return n}function filterWorkflowHostToolsForRootSession(t,n){let r=new Map,i=resolveSubagentDepth(n);if(n.rootSessionId!==void 0||i.currentDepth>0)return r;for(let[e,n]of t)isDelegatedRuntimeActionTool(n)&&r.set(e,n);return r}function isDelegatedRuntimeActionTool(e){let t=e.runtimeAction;return t?.kind===`subagent-call`||t?.kind===`remote-agent-call`}function shouldHideDelegationTool(r,i){return r.name!==AGENT_TOOL_NAME||r.runtimeAction?.kind!==`subagent-call`||r.runtimeAction.nodeId!==ROOT_RUNTIME_AGENT_NODE_ID?!1:i.rootSessionId!==void 0||resolveSubagentDepth(i).currentDepth>0}function isToolDefinitionList(e){return Array.isArray(e)}export{getAdvertisedTools};
@@ -0,0 +1,11 @@
1
+ import type { HarnessEmitFn } from "#harness/types.js";
2
+ import type { HarnessEmissionState } from "#harness/emission.js";
3
+ /**
4
+ * Emits the cancelled-turn epilogue: `turn.cancelled` → `session.waiting`
5
+ * (never a failure event) and returns the between-turns emission state.
6
+ *
7
+ * `state` is the last *persisted* emission state, which may predate the
8
+ * cancelled turn's preamble — the turn id is reconstructed via
9
+ * {@link activeTurnId} and `sessionStarted` is stamped `true`.
10
+ */
11
+ export declare function emitCancelledTurn(emitFn: HarnessEmitFn, state: HarnessEmissionState, continuationToken: string): Promise<HarnessEmissionState>;
@@ -0,0 +1 @@
1
+ import{createSessionWaitingEvent,createTurnCancelledEvent}from"#protocol/message.js";import{activeTurnId}from"#harness/active-turn-id.js";async function emitCancelledTurn(e,t,n){return await e(createTurnCancelledEvent({sequence:t.sequence,turnId:activeTurnId(t)})),await e(createSessionWaitingEvent(n)),{sessionStarted:!0,sequence:t.sequence+1,stepIndex:0,turnId:``}}export{emitCancelledTurn};
@@ -73,7 +73,9 @@ export declare function emitFailedStep(emitFn: HarnessEmitFn, state: HarnessEmis
73
73
  * Emits the recoverable failure cascade: `step.failed` →
74
74
  * `turn.failed` → `session.waiting`.
75
75
  */
76
- export declare function emitRecoverableFailedTurn(emitFn: HarnessEmitFn, state: HarnessEmissionState, input: FailedStepPayload): Promise<HarnessEmissionState>;
76
+ export declare function emitRecoverableFailedTurn(emitFn: HarnessEmitFn, state: HarnessEmissionState, input: FailedStepPayload & {
77
+ readonly continuationToken: string;
78
+ }): Promise<HarnessEmissionState>;
77
79
  /**
78
80
  * Returns updated emission state for the next step in the current turn.
79
81
  */
@@ -82,7 +84,7 @@ export declare function advanceStep(state: HarnessEmissionState): HarnessEmissio
82
84
  * Emits `turn.completed` and either `session.waiting` or `session.completed`.
83
85
  * Returns updated emission state with an incremented sequence.
84
86
  */
85
- export declare function emitTurnEpilogue(emitFn: HarnessEmitFn, state: HarnessEmissionState, mode: RunMode): Promise<HarnessEmissionState>;
87
+ export declare function emitTurnEpilogue(emitFn: HarnessEmitFn, state: HarnessEmissionState, mode: RunMode, continuationToken: string): Promise<HarnessEmissionState>;
86
88
  /**
87
89
  * Maps an AI SDK finish reason string to the eve-owned
88
90
  * {@link AssistantStepFinishReason} union. Unknown values become `"other"`.
@@ -1 +1 @@
1
- import{normalizeModelStreamError}from"#harness/model-call-error.js";import{createActionResultEvent,createActionsRequestedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepFailedEvent,createStepStartedEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent}from"#protocol/message.js";import{createRuntimeActionRequestFromToolCall,resolveToolCallInputObject}from"#harness/runtime-actions.js";import{hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{createRuntimeToolResultFromStepResult,createRuntimeToolResultFromToolError,createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{createInvalidToolCallInputError}from"#harness/tool-call-input-errors.js";import{createProviderStreamActionBatch}from"#harness/stream-actions.js";import{createOrderedStreamEmitter}from"#harness/ordered-stream-emitter.js";import{interruptStreamOnFailure}from"#harness/interruptible-stream.js";import{isInlineAuthorizationToolResult}from"#harness/inline-tool-authorization.js";const HARNESS_EMISSION_STATE_KEY=`eve.harness.emission`,DEFAULT_EMISSION_STATE={sessionStarted:!1,sequence:0,stepIndex:0,turnId:``};function getHarnessEmissionState(e){return e?.[HARNESS_EMISSION_STATE_KEY]??DEFAULT_EMISSION_STATE}function isHarnessBetweenTurns(e){return getHarnessEmissionState(e.state).turnId===``}function setHarnessEmissionState(e,t){return{...e,state:{...e.state,[HARNESS_EMISSION_STATE_KEY]:t}}}async function emitTurnPreamble(e,t,n,r){let i=`turn_${n.sequence}`;return n.sessionStarted||await e(createSessionStartedEvent({runtime:r})),await e(createTurnStartedEvent({sequence:n.sequence,turnId:i})),t.message!==void 0&&await e(createMessageReceivedEvent({message:t.message,sequence:n.sequence,turnId:i})),{sessionStarted:!0,sequence:n.sequence,stepIndex:0,turnId:i}}async function emitStepStarted(e,t,n){await e(createStepStartedEvent({sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}),n)}async function emitStepAndTurnFailed(e,t,n){await e(createStepFailedEvent({...n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),await e(createTurnFailedEvent({...n,sequence:t.sequence,turnId:t.turnId}))}async function emitFailedStep(e,t,n){await emitStepAndTurnFailed(e,t,n),await e(createSessionFailedEvent(n))}async function emitRecoverableFailedTurn(e,t,n){return await emitStepAndTurnFailed(e,t,n),await e(createSessionWaitingEvent()),{sessionStarted:t.sessionStarted,sequence:t.sequence+1,stepIndex:0,turnId:``}}function advanceStep(e){return{...e,stepIndex:e.stepIndex+1}}async function emitTurnEpilogue(e,t,n){return await e(createTurnCompletedEvent({sequence:t.sequence,turnId:t.turnId})),n===`conversation`?await e(createSessionWaitingEvent()):await e(createSessionCompletedEvent()),{sessionStarted:t.sessionStarted,sequence:t.sequence+1,stepIndex:0,turnId:``}}function normalizeAssistantStepFinishReason(e){switch(e){case`content-filter`:case`error`:case`length`:case`stop`:case`tool-calls`:return e;default:return`other`}}async function emitStreamContent(e,t,n,r){let i=createOrderedStreamEmitter(e),a=createProviderStreamActionBatch({emitFn:i.emit,state:t});try{return await consumeStreamContent(i.emit,t,interruptStreamOnFailure(n,i.failureSignal),a,r)}finally{try{await a.cancel()}finally{await i.closeAndDrain()}}}async function consumeStreamContent(a,o,s,c,l){let u=``,d=``,f=`stop`,p,m=new Set,h=new Set,g=new Set,_=new Set,v=new Set,y=new Set,b=[],x=[],flushCurrentMessage=async()=>{d.length!==0&&(await a(createMessageCompletedEvent({finishReason:`tool-calls`,message:d,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),d=``)},emitActionRequest=async e=>{h.has(e.callId)||(d.trim().length>0&&await flushCurrentMessage(),h.add(e.callId),await a(createActionsRequestedEvent({actions:[e],sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})))},collectProviderToolCall=async e=>{_.has(e.toolCallId)||(_.add(e.toolCallId),!h.has(e.toolCallId)&&(h.add(e.toolCallId),d.trim().length>0&&await flushCurrentMessage(),c.observe({callId:e.toolCallId,input:resolveToolCallInputObject(e.input,{callId:e.toolCallId,toolName:e.toolName}),kind:`tool-call`,toolName:e.toolName})))},emitActionResult=async e=>{g.has(e.callId)||(g.add(e.callId),await a(createActionResultEvent({result:e,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})))},emitToolCall=async e=>{if(!(l===void 0||e.invalid===!0||l.excludedActionToolNames.has(e.toolName)))try{await emitActionRequest(createRuntimeActionRequestFromToolCall({toolCall:e,tools:l.tools}))}catch(t){if(t instanceof TypeError){let n=createInvalidToolCallInputError({error:t,toolCall:e});y.add(e.toolCallId),d.trim().length>0&&await flushCurrentMessage(),await emitActionResult(createRuntimeToolResultFromToolError(n)),v.add(e.toolCallId),x.push(createToolResultMessagePartFromToolError(n));return}throw t}};for await(let t of s)if(p===void 0)switch(t.type){case`reasoning-delta`:await c.flush(),u+=t.text,await a(createReasoningAppendedEvent({reasoningDelta:t.text,reasoningSoFar:u,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));break;case`text-delta`:await c.flush(),u.trim().length>0&&(await a(createReasoningCompletedEvent({reasoning:u,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),u=``),d+=t.text,await a(createMessageAppendedEvent({messageDelta:t.text,messageSoFar:d,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));break;case`tool-call`:{let e=t;m.add(e.toolCallId),e.providerExecuted===!0?await collectProviderToolCall(e):(await c.flush(),await emitToolCall(e));break}case`tool-result`:{let e=t;if(e.preliminary===!0)break;if(e.providerExecuted===!0){await collectProviderToolCall({input:`input`in e?e.input:void 0,toolCallId:e.toolCallId,toolName:e.toolName}),await c.flush(),await emitActionResult(createRuntimeToolResultFromStepResult(e));break}if(m.has(t.toolCallId)){if(isInlineAuthorizationToolResult(e))break;h.has(t.toolCallId)&&(await emitActionResult(createRuntimeToolResultFromStepResult(e)),v.add(t.toolCallId));break}if(await c.flush(),await flushCurrentMessage(),isInlineAuthorizationToolResult(e)){v.add(t.toolCallId),b.push(e);break}await emitActionResult(createRuntimeToolResultFromStepResult(e)),v.add(t.toolCallId);break}case`tool-error`:{let e=t;e.providerExecuted===!0?(await collectProviderToolCall(e),await c.flush(),await emitActionResult(createRuntimeToolResultFromToolError(e))):h.has(e.toolCallId)&&(await emitActionResult(createRuntimeToolResultFromToolError(e)),v.add(e.toolCallId),x.push(createToolResultMessagePartFromToolError(e)));break}case`finish-step`:f=normalizeAssistantStepFinishReason(t.finishReason),await c.flush();break;case`error`:p=normalizeModelStreamError(t.error);break;case`abort`:throw new DOMException(t.reason??`The model stream was aborted.`,`AbortError`);default:break}if(await c.flush(),p!==void 0)throw p;return u.trim().length>0&&await a(createReasoningCompletedEvent({reasoning:u,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),f!==`tool-calls`&&hasEmptyDeliverySentinel(d)?await a(createMessageCompletedEvent({finishReason:f,message:null,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})):d.trim().length>0&&await a(createMessageCompletedEvent({finishReason:f,message:d,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),{emittedActionCallIds:h,handledInlineToolResultCallIds:v,invalidInputToolCallIds:y,inlineAuthorizationResults:b,trailingInlineToolResultParts:x}}export{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,isHarnessBetweenTurns,normalizeAssistantStepFinishReason,setHarnessEmissionState};
1
+ import{normalizeModelStreamError}from"#harness/model-call-error.js";import{createActionResultEvent,createActionsRequestedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepFailedEvent,createStepStartedEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent}from"#protocol/message.js";import{createRuntimeActionRequestFromToolCall,resolveToolCallInputObject}from"#harness/runtime-actions.js";import{hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{createRuntimeToolResultFromStepResult,createRuntimeToolResultFromToolError,createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{createInvalidToolCallInputError}from"#harness/tool-call-input-errors.js";import{createProviderStreamActionBatch}from"#harness/stream-actions.js";import{createOrderedStreamEmitter}from"#harness/ordered-stream-emitter.js";import{interruptStreamOnFailure}from"#harness/interruptible-stream.js";import{isInlineAuthorizationToolResult}from"#harness/inline-tool-authorization.js";const HARNESS_EMISSION_STATE_KEY=`eve.harness.emission`,DEFAULT_EMISSION_STATE={sessionStarted:!1,sequence:0,stepIndex:0,turnId:``};function getHarnessEmissionState(e){return e?.[HARNESS_EMISSION_STATE_KEY]??DEFAULT_EMISSION_STATE}function isHarnessBetweenTurns(e){return getHarnessEmissionState(e.state).turnId===``}function setHarnessEmissionState(e,t){return{...e,state:{...e.state,[HARNESS_EMISSION_STATE_KEY]:t}}}async function emitTurnPreamble(e,t,n,r){let i=`turn_${n.sequence}`;return n.sessionStarted||await e(createSessionStartedEvent({runtime:r})),await e(createTurnStartedEvent({sequence:n.sequence,turnId:i})),t.message!==void 0&&await e(createMessageReceivedEvent({message:t.message,sequence:n.sequence,turnId:i})),{sessionStarted:!0,sequence:n.sequence,stepIndex:0,turnId:i}}async function emitStepStarted(e,t,n){await e(createStepStartedEvent({sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}),n)}async function emitStepAndTurnFailed(e,t,n){await e(createStepFailedEvent({...n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),await e(createTurnFailedEvent({...n,sequence:t.sequence,turnId:t.turnId}))}async function emitFailedStep(e,t,n){await emitStepAndTurnFailed(e,t,n),await e(createSessionFailedEvent(n))}async function emitRecoverableFailedTurn(e,t,n){return await emitStepAndTurnFailed(e,t,n),await e(createSessionWaitingEvent(n.continuationToken)),{sessionStarted:t.sessionStarted,sequence:t.sequence+1,stepIndex:0,turnId:``}}function advanceStep(e){return{...e,stepIndex:e.stepIndex+1}}async function emitTurnEpilogue(e,t,n,r){return await e(createTurnCompletedEvent({sequence:t.sequence,turnId:t.turnId})),n===`conversation`?await e(createSessionWaitingEvent(r)):await e(createSessionCompletedEvent()),{sessionStarted:t.sessionStarted,sequence:t.sequence+1,stepIndex:0,turnId:``}}function normalizeAssistantStepFinishReason(e){switch(e){case`content-filter`:case`error`:case`length`:case`stop`:case`tool-calls`:return e;default:return`other`}}async function emitStreamContent(e,t,n,r){let i=createOrderedStreamEmitter(e),a=createProviderStreamActionBatch({emitFn:i.emit,state:t});try{return await consumeStreamContent(i.emit,t,interruptStreamOnFailure(n,i.failureSignal),a,r)}finally{try{await a.cancel()}finally{await i.closeAndDrain()}}}async function consumeStreamContent(a,o,s,c,l){let u=``,d=``,f=`stop`,p,m=new Set,h=new Set,g=new Set,_=new Set,v=new Set,y=new Set,b=[],x=[],flushCurrentMessage=async()=>{d.length!==0&&(await a(createMessageCompletedEvent({finishReason:`tool-calls`,message:d,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),d=``)},emitActionRequest=async e=>{h.has(e.callId)||(d.trim().length>0&&await flushCurrentMessage(),h.add(e.callId),await a(createActionsRequestedEvent({actions:[e],sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})))},collectProviderToolCall=async e=>{_.has(e.toolCallId)||(_.add(e.toolCallId),!h.has(e.toolCallId)&&(h.add(e.toolCallId),d.trim().length>0&&await flushCurrentMessage(),c.observe({callId:e.toolCallId,input:resolveToolCallInputObject(e.input,{callId:e.toolCallId,toolName:e.toolName}),kind:`tool-call`,toolName:e.toolName})))},emitActionResult=async e=>{g.has(e.callId)||(g.add(e.callId),await a(createActionResultEvent({result:e,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})))},emitToolCall=async e=>{if(!(l===void 0||e.invalid===!0||l.excludedActionToolNames.has(e.toolName)))try{await emitActionRequest(createRuntimeActionRequestFromToolCall({toolCall:e,tools:l.tools}))}catch(t){if(t instanceof TypeError){let n=createInvalidToolCallInputError({error:t,toolCall:e});y.add(e.toolCallId),d.trim().length>0&&await flushCurrentMessage(),await emitActionResult(createRuntimeToolResultFromToolError(n)),v.add(e.toolCallId),x.push(createToolResultMessagePartFromToolError(n));return}throw t}};for await(let t of s)if(p===void 0)switch(t.type){case`reasoning-delta`:await c.flush(),u+=t.text,await a(createReasoningAppendedEvent({reasoningDelta:t.text,reasoningSoFar:u,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));break;case`text-delta`:await c.flush(),u.trim().length>0&&(await a(createReasoningCompletedEvent({reasoning:u,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),u=``),d+=t.text,await a(createMessageAppendedEvent({messageDelta:t.text,messageSoFar:d,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));break;case`tool-call`:{let e=t;m.add(e.toolCallId),e.providerExecuted===!0?await collectProviderToolCall(e):(await c.flush(),await emitToolCall(e));break}case`tool-result`:{let e=t;if(e.preliminary===!0)break;if(e.providerExecuted===!0){await collectProviderToolCall({input:`input`in e?e.input:void 0,toolCallId:e.toolCallId,toolName:e.toolName}),await c.flush(),await emitActionResult(createRuntimeToolResultFromStepResult(e));break}if(m.has(t.toolCallId)){if(isInlineAuthorizationToolResult(e))break;h.has(t.toolCallId)&&(await emitActionResult(createRuntimeToolResultFromStepResult(e)),v.add(t.toolCallId));break}if(await c.flush(),await flushCurrentMessage(),isInlineAuthorizationToolResult(e)){v.add(t.toolCallId),b.push(e);break}await emitActionResult(createRuntimeToolResultFromStepResult(e)),v.add(t.toolCallId);break}case`tool-error`:{let e=t;e.providerExecuted===!0?(await collectProviderToolCall(e),await c.flush(),await emitActionResult(createRuntimeToolResultFromToolError(e))):h.has(e.toolCallId)&&(await emitActionResult(createRuntimeToolResultFromToolError(e)),v.add(e.toolCallId),x.push(createToolResultMessagePartFromToolError(e)));break}case`finish-step`:f=normalizeAssistantStepFinishReason(t.finishReason),await c.flush();break;case`error`:p=normalizeModelStreamError(t.error);break;case`abort`:throw new DOMException(t.reason??`The model stream was aborted.`,`AbortError`);default:break}if(await c.flush(),p!==void 0)throw p;return u.trim().length>0&&await a(createReasoningCompletedEvent({reasoning:u,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),f!==`tool-calls`&&hasEmptyDeliverySentinel(d)?await a(createMessageCompletedEvent({finishReason:f,message:null,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})):d.trim().length>0&&await a(createMessageCompletedEvent({finishReason:f,message:d,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),{emittedActionCallIds:h,handledInlineToolResultCallIds:v,invalidInputToolCallIds:y,inlineAuthorizationResults:b,trailingInlineToolResultParts:x}}export{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,isHarnessBetweenTurns,normalizeAssistantStepFinishReason,setHarnessEmissionState};
@@ -10,7 +10,6 @@ import type { ToolExecuteOptions } from "#shared/tool-definition.js";
10
10
  export type HarnessRuntimeActionDefinition = {
11
11
  readonly kind: "remote-agent-call" | "subagent-call";
12
12
  readonly nodeId: string;
13
- readonly recursive?: true;
14
13
  readonly remoteAgentName?: string;
15
14
  readonly subagentName: string;
16
15
  };
@@ -25,6 +25,11 @@ export declare function upsertProxyInputRequests(input: {
25
25
  * child subagent finishes so stale clicks no longer route to it.
26
26
  */
27
27
  export declare function clearProxyInputRequestsForChild(session: HarnessSession, childContinuationToken: string): HarnessSession;
28
+ /**
29
+ * Removes every proxy entry. Called when a cancelled turn orphans its
30
+ * descendants so stale HITL responses no longer route to them.
31
+ */
32
+ export declare function clearAllProxyInputRequests(session: HarnessSession): HarnessSession;
28
33
  /**
29
34
  * Projects a {@link SubagentInputRequestHookPayload} into the
30
35
  * `(requestId, childContinuationToken)` tuples the session stores.
@@ -1 +1 @@
1
- const PROXY_INPUT_REQUESTS_KEY=`eve.runtime.proxyInputRequests`;function getProxyInputRequests(e){return new Map(Object.entries(readMap(e)))}function hasProxyInputRequests(e){for(let t of Object.keys(readMap(e)))return!0;return!1}function upsertProxyInputRequests(e){let t={};for(let[n,r]of Object.entries(readMap(e.session.state)))r!==e.forChildContinuationToken&&(t[n]=r);for(let[n,r]of e.entries)t[n]=r;return writeMap(e.session,t)}function clearProxyInputRequestsForChild(e,t){let n=readMap(e.state),r={},i=!1;for(let[e,a]of Object.entries(n)){if(a===t){i=!0;continue}r[e]=a}return i?writeMap(e,r):e}function toProxyInputRequestEntries(e){return e.event.requests.map(t=>[t.requestId,e.childContinuationToken])}function readMap(t){let n=t?.[PROXY_INPUT_REQUESTS_KEY];if(typeof n!=`object`||!n||Array.isArray(n))return{};let r={};for(let[e,t]of Object.entries(n))typeof t==`string`&&(r[e]=t);return r}function writeMap(t,n){let r={...t.state};return Object.keys(n).length===0?(delete r[PROXY_INPUT_REQUESTS_KEY],{...t,state:Object.keys(r).length>0?r:void 0}):(r[PROXY_INPUT_REQUESTS_KEY]=n,{...t,state:r})}export{clearProxyInputRequestsForChild,getProxyInputRequests,hasProxyInputRequests,toProxyInputRequestEntries,upsertProxyInputRequests};
1
+ const PROXY_INPUT_REQUESTS_KEY=`eve.runtime.proxyInputRequests`;function getProxyInputRequests(e){return new Map(Object.entries(readMap(e)))}function hasProxyInputRequests(e){for(let t of Object.keys(readMap(e)))return!0;return!1}function upsertProxyInputRequests(e){let t={};for(let[n,r]of Object.entries(readMap(e.session.state)))r!==e.forChildContinuationToken&&(t[n]=r);for(let[n,r]of e.entries)t[n]=r;return writeMap(e.session,t)}function clearProxyInputRequestsForChild(e,t){let n=readMap(e.state),r={},i=!1;for(let[e,a]of Object.entries(n)){if(a===t){i=!0;continue}r[e]=a}return i?writeMap(e,r):e}function clearAllProxyInputRequests(e){return hasProxyInputRequests(e.state)?writeMap(e,{}):e}function toProxyInputRequestEntries(e){return e.event.requests.map(t=>[t.requestId,e.childContinuationToken])}function readMap(t){let n=t?.[PROXY_INPUT_REQUESTS_KEY];if(typeof n!=`object`||!n||Array.isArray(n))return{};let r={};for(let[e,t]of Object.entries(n))typeof t==`string`&&(r[e]=t);return r}function writeMap(t,n){let r={...t.state};return Object.keys(n).length===0?(delete r[PROXY_INPUT_REQUESTS_KEY],{...t,state:Object.keys(r).length>0?r:void 0}):(r[PROXY_INPUT_REQUESTS_KEY]=n,{...t,state:r})}export{clearAllProxyInputRequests,clearProxyInputRequestsForChild,getProxyInputRequests,hasProxyInputRequests,toProxyInputRequestEntries,upsertProxyInputRequests};
@@ -16,14 +16,14 @@ interface PendingRuntimeActionEventMetadata {
16
16
  /**
17
17
  * Serializable pending runtime-action batch stored on `session.state`.
18
18
  *
19
- * `childContinuationTokens` maps each `subagent-call` action's
20
- * `callId` to the deterministic child token minted by dispatch, so
21
- * the harness can clear proxy-input entries on result resolution
22
- * without re-deriving the token (keeps `harness/` runtime-agnostic).
19
+ * `childContinuationTokens` lets the harness clear local proxy-input entries
20
+ * on result resolution. `childSessionIds` lets the turn workflow cancel every
21
+ * successfully adopted local or remote child before dropping the batch.
23
22
  */
24
- interface PendingRuntimeActionBatch {
23
+ export interface PendingRuntimeActionBatch {
25
24
  readonly actions: readonly RuntimeActionRequest[];
26
25
  readonly childContinuationTokens?: Readonly<Record<string, string>>;
26
+ readonly childSessionIds?: Readonly<Record<string, string>>;
27
27
  readonly event: PendingRuntimeActionEventMetadata;
28
28
  readonly responseMessages: readonly ModelMessage[];
29
29
  }
@@ -51,14 +51,18 @@ export declare function setPendingRuntimeActionBatch(input: {
51
51
  readonly responseMessages: readonly ModelMessage[];
52
52
  readonly session: HarnessSession;
53
53
  }): HarnessSession;
54
- /**
55
- * Records the child continuation token for a dispatched subagent-call
56
- * so {@link resolvePendingRuntimeActions} can clear proxy-input
57
- * entries when the child finishes.
58
- */
59
- export declare function recordPendingSubagentChildToken(input: {
54
+ type PendingSubagentChildIdentity = {
55
+ readonly continuationToken: string;
56
+ readonly kind: "local";
57
+ readonly sessionId: string;
58
+ } | {
59
+ readonly kind: "remote";
60
+ readonly sessionId: string;
61
+ };
62
+ /** Records one successfully dispatched child's durable identities. */
63
+ export declare function recordPendingSubagentChild(input: {
60
64
  readonly callId: string;
61
- readonly childContinuationToken: string;
65
+ readonly child: PendingSubagentChildIdentity;
62
66
  readonly session: HarnessSession;
63
67
  }): HarnessSession;
64
68
  /** Returns results in pending-key order once every requested action has completed. */
@@ -1 +1 @@
1
- import{createActionResultEvent}from"#protocol/message.js";import{parseJsonObject}from"#shared/json.js";import{clearProxyInputRequestsForChild}from"#harness/proxy-input-requests.js";import{accumulateSessionUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{getRuntimeActionRequestKey,getRuntimeActionResultKey}from"#runtime/actions/keys.js";const PENDING_RUNTIME_ACTION_BATCH_KEY=`eve.runtime.pendingActionBatch`;function getPendingRuntimeActionBatch(e){let t=e?.[PENDING_RUNTIME_ACTION_BATCH_KEY];if(typeof t!=`object`||!t)return;let n=t;if(!(!Array.isArray(n.actions)||!Array.isArray(n.responseMessages)||typeof n.event!=`object`||n.event===null))return n}function hasPendingRuntimeActionBatch(e){return getPendingRuntimeActionBatch(e)!==void 0}function clearPendingRuntimeActionBatch(e){if(e.state?.[PENDING_RUNTIME_ACTION_BATCH_KEY]===void 0)return e;let t={...e.state};return delete t[PENDING_RUNTIME_ACTION_BATCH_KEY],{...e,state:Object.keys(t).length>0?t:void 0}}function setPendingRuntimeActionBatch(e){let t={...e.session.state};return t[PENDING_RUNTIME_ACTION_BATCH_KEY]={actions:[...e.actions],event:e.event,responseMessages:[...e.responseMessages]},{...e.session,state:t}}function recordPendingSubagentChildToken(e){let t=getPendingRuntimeActionBatch(e.session.state);if(t===void 0)return e.session;let n={...e.session.state};return n[PENDING_RUNTIME_ACTION_BATCH_KEY]={...t,childContinuationTokens:{...t.childContinuationTokens,[e.callId]:e.childContinuationToken}},{...e.session,state:n}}function resolveReadyRuntimeActionResults(e){let t=getPendingRuntimeActionBatch(e.session.state);if(t!==void 0)return resolveRuntimeActionResultsForBatch({batch:t,results:e.results})}function resolveRuntimeActionResultsForBatch(e){return resolveRuntimeActionResultsForKeys({pendingKeys:e.batch.actions.map(e=>getRuntimeActionRequestKey(e)),results:e.results})}function resolveRuntimeActionResultsForKeys(e){let t=new Set(e.pendingKeys),n=new Map;for(let r of e.results){let e=getRuntimeActionResultKey(r);t.has(e)&&n.set(e,r)}let r=[];for(let t of e.pendingKeys){let e=n.get(t);if(e===void 0)return;r.push(e)}return r}async function resolvePendingRuntimeActions(t){let i=getPendingRuntimeActionBatch(t.session.state);if(i===void 0)return{messages:[...t.session.history],outcome:`continue`,session:t.session};let a=resolveReadyRuntimeActionResults({results:t.stepInput?.runtimeActionResults??[],session:t.session});if(a===void 0)return{messages:[...t.session.history],outcome:`unresolved`,session:t.session};if(t.emit!==void 0)for(let n of a)n.kind===`subagent-result`&&n.isError!==!0&&await t.emit({data:{callId:n.callId,output:typeof n.output==`string`?n.output:JSON.stringify(n.output),subagentName:n.subagentName},type:`subagent.completed`}),await t.emit(createActionResultEvent({result:n,sequence:i.event.sequence,stepIndex:i.event.stepIndex,turnId:i.event.turnId}));let o={...t.session.state};delete o[PENDING_RUNTIME_ACTION_BATCH_KEY];let s={...t.session,state:Object.keys(o).length>0?o:void 0},c=i.childContinuationTokens;if(c!==void 0)for(let e of a){if(e.kind!==`subagent-result`)continue;let t=c[e.callId];t!==void 0&&(s=clearProxyInputRequestsForChild(s,t))}for(let e of a)e.kind!==`subagent-result`||e.usage===void 0||(s=setTurnUsageState(s,accumulateSessionUsage({previous:getTurnUsageState(s.state),usage:e.usage})));let l=a.map(e=>{switch(e.kind){case`load-skill-result`:return{output:toToolResultOutput(e),toolCallId:e.callId,toolName:`load_skill`,type:`tool-result`};case`subagent-result`:return{output:toToolResultOutput(e),toolCallId:e.callId,toolName:e.subagentName,type:`tool-result`};case`tool-result`:return{output:toToolResultOutput(e),toolCallId:e.callId,toolName:e.toolName,type:`tool-result`}}throw Error(`Unsupported runtime action result kind "${String(e)}".`)}),u=[...s.history,...i.responseMessages];return l.length>0&&u.push({content:l,role:`tool`}),{messages:u,outcome:`resolved`,session:s}}function createRuntimeActionRequestFromToolCall(e){let t=e.tools.get(e.toolCall.toolName);return t?.runtimeAction?.kind===`subagent-call`?{callId:e.toolCall.toolCallId,description:t.description,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`subagent-call`,name:t.name,nodeId:t.runtimeAction.nodeId,subagentName:t.runtimeAction.subagentName}:t?.runtimeAction?.kind===`remote-agent-call`?{callId:e.toolCall.toolCallId,description:t.description,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`remote-agent-call`,name:t.name,nodeId:t.runtimeAction.nodeId,remoteAgentName:t.runtimeAction.remoteAgentName??t.name}:{callId:e.toolCall.toolCallId,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`tool-call`,toolName:e.toolCall.toolName}}function resolveToolCallInputObject(e,n){if(e==null)return{};try{return parseJsonObject(e)}catch(e){let t=e instanceof Error?e.message:String(e);throw TypeError(`Failed to parse tool-call arguments for "${n.toolName}" (${n.callId}): ${t}`,{cause:e})}}function toToolResultOutput(e){return typeof e.output==`string`?e.isError===!0?{type:`error-text`,value:e.output}:{type:`text`,value:e.output}:e.isError===!0?{type:`error-json`,value:toMutableJsonValue(e.output)}:{type:`json`,value:toMutableJsonValue(e.output)}}function toMutableJsonValue(e){if(e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return e;if(Array.isArray(e))return e.map(e=>toMutableJsonValue(e));let t={};for(let[n,r]of Object.entries(e))t[n]=toMutableJsonValue(r);return t}export{clearPendingRuntimeActionBatch,createRuntimeActionRequestFromToolCall,getPendingRuntimeActionBatch,hasPendingRuntimeActionBatch,recordPendingSubagentChildToken,resolvePendingRuntimeActions,resolveRuntimeActionResultsForKeys,resolveToolCallInputObject,setPendingRuntimeActionBatch};
1
+ import{createActionResultEvent}from"#protocol/message.js";import{parseJsonObject}from"#shared/json.js";import{clearProxyInputRequestsForChild}from"#harness/proxy-input-requests.js";import{accumulateSessionUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{getRuntimeActionRequestKey,getRuntimeActionResultKey}from"#runtime/actions/keys.js";const PENDING_RUNTIME_ACTION_BATCH_KEY=`eve.runtime.pendingActionBatch`;function getPendingRuntimeActionBatch(e){let t=e?.[PENDING_RUNTIME_ACTION_BATCH_KEY];if(typeof t!=`object`||!t)return;let n=t;if(!(!Array.isArray(n.actions)||!Array.isArray(n.responseMessages)||typeof n.event!=`object`||n.event===null))return n}function hasPendingRuntimeActionBatch(e){return getPendingRuntimeActionBatch(e)!==void 0}function clearPendingRuntimeActionBatch(e){if(e.state?.[PENDING_RUNTIME_ACTION_BATCH_KEY]===void 0)return e;let t={...e.state};return delete t[PENDING_RUNTIME_ACTION_BATCH_KEY],{...e,state:Object.keys(t).length>0?t:void 0}}function setPendingRuntimeActionBatch(e){let t={...e.session.state};return t[PENDING_RUNTIME_ACTION_BATCH_KEY]={actions:[...e.actions],event:e.event,responseMessages:[...e.responseMessages]},{...e.session,state:t}}function recordPendingSubagentChild(e){let t=getPendingRuntimeActionBatch(e.session.state);if(t===void 0)return e.session;let n={...e.session.state};return n[PENDING_RUNTIME_ACTION_BATCH_KEY]={...t,...e.child.kind===`local`?{childContinuationTokens:{...t.childContinuationTokens,[e.callId]:e.child.continuationToken}}:{},childSessionIds:{...t.childSessionIds,[e.callId]:e.child.sessionId}},{...e.session,state:n}}function resolveReadyRuntimeActionResults(e){let t=getPendingRuntimeActionBatch(e.session.state);if(t!==void 0)return resolveRuntimeActionResultsForBatch({batch:t,results:e.results})}function resolveRuntimeActionResultsForBatch(e){return resolveRuntimeActionResultsForKeys({pendingKeys:e.batch.actions.map(e=>getRuntimeActionRequestKey(e)),results:e.results})}function resolveRuntimeActionResultsForKeys(e){let t=new Set(e.pendingKeys),n=new Map;for(let r of e.results){let e=getRuntimeActionResultKey(r);t.has(e)&&n.set(e,r)}let r=[];for(let t of e.pendingKeys){let e=n.get(t);if(e===void 0)return;r.push(e)}return r}async function resolvePendingRuntimeActions(t){let i=getPendingRuntimeActionBatch(t.session.state);if(i===void 0)return{messages:[...t.session.history],outcome:`continue`,session:t.session};let a=resolveReadyRuntimeActionResults({results:t.stepInput?.runtimeActionResults??[],session:t.session});if(a===void 0)return{messages:[...t.session.history],outcome:`unresolved`,session:t.session};if(t.emit!==void 0)for(let n of a)n.kind===`subagent-result`&&n.isError!==!0&&await t.emit({data:{callId:n.callId,output:typeof n.output==`string`?n.output:JSON.stringify(n.output),subagentName:n.subagentName},type:`subagent.completed`}),await t.emit(createActionResultEvent({result:n,sequence:i.event.sequence,stepIndex:i.event.stepIndex,turnId:i.event.turnId}));let o={...t.session.state};delete o[PENDING_RUNTIME_ACTION_BATCH_KEY];let s={...t.session,state:Object.keys(o).length>0?o:void 0},c=i.childContinuationTokens;if(c!==void 0)for(let e of a){if(e.kind!==`subagent-result`)continue;let t=c[e.callId];t!==void 0&&(s=clearProxyInputRequestsForChild(s,t))}for(let e of a)e.kind!==`subagent-result`||e.usage===void 0||(s=setTurnUsageState(s,accumulateSessionUsage({previous:getTurnUsageState(s.state),usage:e.usage})));let l=a.map(e=>{switch(e.kind){case`load-skill-result`:return{output:toToolResultOutput(e),toolCallId:e.callId,toolName:`load_skill`,type:`tool-result`};case`subagent-result`:return{output:toToolResultOutput(e),toolCallId:e.callId,toolName:e.subagentName,type:`tool-result`};case`tool-result`:return{output:toToolResultOutput(e),toolCallId:e.callId,toolName:e.toolName,type:`tool-result`}}throw Error(`Unsupported runtime action result kind "${String(e)}".`)}),u=[...s.history,...i.responseMessages];return l.length>0&&u.push({content:l,role:`tool`}),{messages:u,outcome:`resolved`,session:s}}function createRuntimeActionRequestFromToolCall(e){let t=e.tools.get(e.toolCall.toolName);return t?.runtimeAction?.kind===`subagent-call`?{callId:e.toolCall.toolCallId,description:t.description,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`subagent-call`,name:t.name,nodeId:t.runtimeAction.nodeId,subagentName:t.runtimeAction.subagentName}:t?.runtimeAction?.kind===`remote-agent-call`?{callId:e.toolCall.toolCallId,description:t.description,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`remote-agent-call`,name:t.name,nodeId:t.runtimeAction.nodeId,remoteAgentName:t.runtimeAction.remoteAgentName??t.name}:{callId:e.toolCall.toolCallId,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`tool-call`,toolName:e.toolCall.toolName}}function resolveToolCallInputObject(e,n){if(e==null)return{};try{return parseJsonObject(e)}catch(e){let t=e instanceof Error?e.message:String(e);throw TypeError(`Failed to parse tool-call arguments for "${n.toolName}" (${n.callId}): ${t}`,{cause:e})}}function toToolResultOutput(e){return typeof e.output==`string`?e.isError===!0?{type:`error-text`,value:e.output}:{type:`text`,value:e.output}:e.isError===!0?{type:`error-json`,value:toMutableJsonValue(e.output)}:{type:`json`,value:toMutableJsonValue(e.output)}}function toMutableJsonValue(e){if(e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return e;if(Array.isArray(e))return e.map(e=>toMutableJsonValue(e));let t={};for(let[n,r]of Object.entries(e))t[n]=toMutableJsonValue(r);return t}export{clearPendingRuntimeActionBatch,createRuntimeActionRequestFromToolCall,getPendingRuntimeActionBatch,hasPendingRuntimeActionBatch,recordPendingSubagentChild,resolvePendingRuntimeActions,resolveRuntimeActionResultsForKeys,resolveToolCallInputObject,setPendingRuntimeActionBatch};
@@ -1 +1 @@
1
- import{createInputRequestedEvent,createSessionCompletedEvent,createTurnCompletedEvent}from"#protocol/message.js";import{emitFailedStep,emitTurnEpilogue,setHarnessEmissionState}from"#harness/emission.js";import{setPendingInputBatch}from"#harness/input-requests.js";import{extendSessionTokenBudget,getSessionTokenLimitViolation,getSessionTokenUsage}from"#harness/turn-tag-state.js";import{createSessionLimitContinuationRequest}from"#harness/session-limit-continuation.js";async function applySessionLimitContinuation(e){if(e.limitContinuation===void 0)return{result:null,session:e.session};if(e.limitContinuation.granted)return{result:null,session:extendSessionTokenBudget(e.session)};let r=getSessionTokenLimitViolation(e.session);return r===null?{result:null,session:e.session}:e.config.mode===`task`?{result:await failSessionTokenLimit({...e,violation:r}),session:e.session}:(e.emit&&(await e.emit(createTurnCompletedEvent({sequence:e.emissionState.sequence,turnId:e.emissionState.turnId})),await e.emit(createSessionCompletedEvent())),{result:{next:{done:!0,output:``},session:e.session},session:e.session})}async function enforceSessionTokenLimit(e){let t=getSessionTokenLimitViolation(e.session);if(t===null)return null;let{emit:n}=e;return n!==void 0&&(e.config.mode===`conversation`||e.config.capabilities?.requestInput===!0)?parkOnSessionTokenLimit({...e,emit:n,violation:t}):failSessionTokenLimit({...e,violation:t})}async function parkOnSessionTokenLimit(t){let n=getSessionTokenUsage(t.session),r=createSessionLimitContinuationRequest({sessionId:t.session.sessionId,totalUsedTokens:t.violation.kind===`input`?n.inputTokens:n.outputTokens,violation:t.violation}),a=t.emissionState,o=setPendingInputBatch({event:{sequence:a.sequence,stepIndex:a.stepIndex,turnId:a.turnId},requests:[r],responseMessages:[],session:{...t.session,history:[...t.messages]}});return await t.emit(createInputRequestedEvent({requests:[r],sequence:a.sequence,stepIndex:a.stepIndex,turnId:a.turnId})),t.config.mode===`conversation`&&(a=await emitTurnEpilogue(t.emit,a,t.config.mode)),{next:null,session:setHarnessEmissionState(o,a)}}function formatSessionTokenLimitMessage(e){return`The session reached its configured ${e} token limit.`}async function failSessionTokenLimit(e){let t=getSessionTokenUsage(e.session),n=formatSessionTokenLimitMessage(e.violation.kind),i={inputTokens:t.inputTokens,kind:e.violation.kind,limit:e.violation.limit,outputTokens:t.outputTokens,usedTokens:e.violation.usedTokens};return e.emit&&await emitFailedStep(e.emit,e.emissionState,{code:`SESSION_TOKEN_LIMIT_REACHED`,details:i,message:n,sessionId:e.session.sessionId}),{next:{done:!0,isError:e.config.mode===`task`?!0:void 0,output:e.config.mode===`task`?n:``},session:e.session}}export{applySessionLimitContinuation,enforceSessionTokenLimit};
1
+ import{createInputRequestedEvent,createSessionCompletedEvent,createTurnCompletedEvent}from"#protocol/message.js";import{emitFailedStep,emitTurnEpilogue,setHarnessEmissionState}from"#harness/emission.js";import{setPendingInputBatch}from"#harness/input-requests.js";import{extendSessionTokenBudget,getSessionTokenLimitViolation,getSessionTokenUsage}from"#harness/turn-tag-state.js";import{createSessionLimitContinuationRequest}from"#harness/session-limit-continuation.js";async function applySessionLimitContinuation(e){if(e.limitContinuation===void 0)return{result:null,session:e.session};if(e.limitContinuation.granted)return{result:null,session:extendSessionTokenBudget(e.session)};let r=getSessionTokenLimitViolation(e.session);return r===null?{result:null,session:e.session}:e.config.mode===`task`?{result:await failSessionTokenLimit({...e,violation:r}),session:e.session}:(e.emit&&(await e.emit(createTurnCompletedEvent({sequence:e.emissionState.sequence,turnId:e.emissionState.turnId})),await e.emit(createSessionCompletedEvent())),{result:{next:{done:!0,output:``},session:e.session},session:e.session})}async function enforceSessionTokenLimit(e){let t=getSessionTokenLimitViolation(e.session);if(t===null)return null;let{emit:n}=e;return n!==void 0&&(e.config.mode===`conversation`||e.config.capabilities?.requestInput===!0)?parkOnSessionTokenLimit({...e,emit:n,violation:t}):failSessionTokenLimit({...e,violation:t})}async function parkOnSessionTokenLimit(t){let n=getSessionTokenUsage(t.session),r=createSessionLimitContinuationRequest({sessionId:t.session.sessionId,totalUsedTokens:t.violation.kind===`input`?n.inputTokens:n.outputTokens,violation:t.violation}),a=t.emissionState,o=setPendingInputBatch({event:{sequence:a.sequence,stepIndex:a.stepIndex,turnId:a.turnId},requests:[r],responseMessages:[],session:{...t.session,history:[...t.messages]}});return await t.emit(createInputRequestedEvent({requests:[r],sequence:a.sequence,stepIndex:a.stepIndex,turnId:a.turnId})),t.config.mode===`conversation`&&(a=await emitTurnEpilogue(t.emit,a,t.config.mode,o.continuationToken)),{next:null,session:setHarnessEmissionState(o,a)}}function formatSessionTokenLimitMessage(e){return`The session reached its configured ${e} token limit.`}async function failSessionTokenLimit(e){let t=getSessionTokenUsage(e.session),n=formatSessionTokenLimitMessage(e.violation.kind),i={inputTokens:t.inputTokens,kind:e.violation.kind,limit:e.violation.limit,outputTokens:t.outputTokens,usedTokens:e.violation.usedTokens};return e.emit&&await emitFailedStep(e.emit,e.emissionState,{code:`SESSION_TOKEN_LIMIT_REACHED`,details:i,message:n,sessionId:e.session.sessionId}),{next:{done:!0,isError:e.config.mode===`task`?!0:void 0,output:e.config.mode===`task`?n:``},session:e.session}}export{applySessionLimitContinuation,enforceSessionTokenLimit};