eve 0.51.1 → 0.52.0

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 (123) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/src/cli/dev/boot-progress.d.ts +3 -0
  3. package/dist/src/cli/dev/boot-progress.js +1 -0
  4. package/dist/src/cli/run.d.ts +4 -0
  5. package/dist/src/cli/run.js +3 -3
  6. package/dist/src/cli/telemetry/command.d.ts +9 -0
  7. package/dist/src/cli/telemetry/command.js +1 -0
  8. package/dist/src/cli/telemetry/flush.d.ts +2 -0
  9. package/dist/src/cli/telemetry/flush.js +1 -0
  10. package/dist/src/cli/telemetry/identity.d.ts +13 -0
  11. package/dist/src/cli/telemetry/identity.js +1 -0
  12. package/dist/src/cli/telemetry/index.d.ts +25 -0
  13. package/dist/src/cli/telemetry/index.js +3 -0
  14. package/dist/src/cli/telemetry/preference.d.ts +9 -0
  15. package/dist/src/cli/telemetry/preference.js +1 -0
  16. package/dist/src/client/types.d.ts +3 -2
  17. package/dist/src/compiled/.vendor-stamp.json +2 -2
  18. package/dist/src/compiled/@eve/catalog/index.js +1 -1
  19. package/dist/src/compiled/@modelcontextprotocol/server/index.d.ts +1 -0
  20. package/dist/src/compiler/extension-compatibility.d.ts +22 -4
  21. package/dist/src/compiler/extension-compatibility.js +1 -1
  22. package/dist/src/compiler/manifest.js +1 -1
  23. package/dist/src/compiler/normalize-channel.js +1 -1
  24. package/dist/src/compiler/normalize-schedule.js +1 -1
  25. package/dist/src/compiler/normalize-tool.js +1 -1
  26. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  27. package/dist/src/execution/activity-collector.js +1 -1
  28. package/dist/src/execution/continuation-conflict-step.js +1 -1
  29. package/dist/src/execution/coordination-dispatch-shared.d.ts +2 -2
  30. package/dist/src/execution/coordination-dispatch-step.js +1 -1
  31. package/dist/src/execution/durable-session-migrations/turn-workflow.d.ts +1 -1
  32. package/dist/src/execution/inline-turn.d.ts +2 -2
  33. package/dist/src/execution/inline-turn.js +1 -1
  34. package/dist/src/execution/tasks/child/steps.d.ts +11 -1
  35. package/dist/src/execution/tasks/child/steps.js +1 -1
  36. package/dist/src/execution/tasks/child/workflow.js +1 -1
  37. package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
  38. package/dist/src/execution/tools/sleep-workflow.js +1 -1
  39. package/dist/src/execution/tools/subagent/invoke-agent.d.ts +1 -7
  40. package/dist/src/execution/tools/subagent/invoke-agent.js +1 -1
  41. package/dist/src/execution/tools/workflow/ask.d.ts +1 -2
  42. package/dist/src/execution/tools/workflow/ask.js +1 -1
  43. package/dist/src/execution/tools/workflow/body.d.ts +6 -1
  44. package/dist/src/execution/tools/workflow/body.js +1 -1
  45. package/dist/src/execution/tools/workflow/cancel.js +1 -1
  46. package/dist/src/execution/tools/workflow/messages.d.ts +9 -8
  47. package/dist/src/execution/tools/workflow/messages.js +1 -1
  48. package/dist/src/execution/tools/workflow/owner-inbox.d.ts +2 -2
  49. package/dist/src/execution/tools/workflow/owner-inbox.js +1 -1
  50. package/dist/src/execution/tools/workflow/owner.d.ts +5 -11
  51. package/dist/src/execution/tools/workflow/owner.js +1 -1
  52. package/dist/src/execution/tools/workflow/run-control.d.ts +0 -4
  53. package/dist/src/execution/tools/workflow/run-control.js +1 -1
  54. package/dist/src/execution/tools/workflow/start.d.ts +5 -14
  55. package/dist/src/execution/tools/workflow/start.js +1 -1
  56. package/dist/src/execution/tools/workflow/workflow.d.ts +1 -1
  57. package/dist/src/execution/tools/workflow/workflow.js +1 -1
  58. package/dist/src/execution/turn-dispatch.js +1 -1
  59. package/dist/src/execution/turn-workflow-tool-run.d.ts +2 -8
  60. package/dist/src/execution/turn-workflow-tool-run.js +1 -1
  61. package/dist/src/execution/turn-workflow.d.ts +1 -0
  62. package/dist/src/execution/turn-workflow.js +1 -1
  63. package/dist/src/execution/wire/session-inbox-resume.js +1 -1
  64. package/dist/src/execution/workflow-runtime.js +1 -1
  65. package/dist/src/execution/workflow-steps.js +1 -1
  66. package/dist/src/harness/emission-state.js +1 -1
  67. package/dist/src/harness/tool-loop.js +2 -2
  68. package/dist/src/harness/turn-client-context.d.ts +9 -0
  69. package/dist/src/harness/turn-client-context.js +1 -0
  70. package/dist/src/harness/workflow-tool-runs.d.ts +0 -1
  71. package/dist/src/harness/workflow-tool-runs.js +1 -1
  72. package/dist/src/internal/application/package.js +1 -1
  73. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  74. package/dist/src/internal/invocation/workflow-execution.js +1 -1
  75. package/dist/src/internal/mcp/streamable-http-server.d.ts +29 -1
  76. package/dist/src/internal/mcp/streamable-http-server.js +1 -1
  77. package/dist/src/internal/nitro/host/build-application.js +1 -1
  78. package/dist/src/internal/workflow/runtime.d.ts +6 -0
  79. package/dist/src/internal/workflow/runtime.js +1 -1
  80. package/dist/src/internal/workflow-bundle/authored-workflow-directives.d.ts +1 -3
  81. package/dist/src/internal/workflow-bundle/authored-workflow-directives.js +1 -1
  82. package/dist/src/internal/workflow-bundle/authored-workflow-modules.d.ts +1 -2
  83. package/dist/src/internal/workflow-bundle/authored-workflow-modules.js +1 -1
  84. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
  85. package/dist/src/internal/workflow-bundle/workflow-builders.d.ts +0 -2
  86. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  87. package/dist/src/internal/workflow-bundle/workflow-transformer.js +1 -1
  88. package/dist/src/protocol/message.d.ts +3 -2
  89. package/dist/src/public/channels/mcp.js +1 -1
  90. package/dist/src/public/models/openai/chatgpt/model.js +2 -2
  91. package/dist/src/public/models/openai/chatgpt/transport.js +1 -1
  92. package/dist/src/public/tools/index.d.ts +3 -1
  93. package/dist/src/public/tools/index.js +1 -1
  94. package/dist/src/setup/scaffold/create/project.js +1 -1
  95. package/dist/src/shared/workflow-tool-context.d.ts +2 -0
  96. package/dist/src/shared/workflow-tool-context.js +1 -0
  97. package/dist/src/tasks/types.d.ts +17 -1
  98. package/dist/src/tasks/types.js +1 -1
  99. package/dist/src/tools/behavior.d.ts +5 -0
  100. package/dist/src/tools/definition.d.ts +16 -12
  101. package/dist/src/tools/definition.js +1 -1
  102. package/dist/src/tools/dynamic.d.ts +2 -2
  103. package/dist/src/tools/provided/sleep.d.ts +2 -2
  104. package/dist/src/tools/provided/sleep.js +1 -1
  105. package/dist/src/tools/task.d.ts +28 -80
  106. package/dist/src/tools/task.js +1 -1
  107. package/dist/src/tools/workflow-definition.d.ts +60 -0
  108. package/dist/src/tools/workflow-definition.js +1 -0
  109. package/docs/channels/mcp.mdx +25 -3
  110. package/docs/concepts/execution-model-and-durability.mdx +13 -2
  111. package/docs/guides/client/messages.mdx +1 -1
  112. package/docs/guides/deployment/vercel.mdx +2 -0
  113. package/docs/guides/frontend/overview.mdx +1 -1
  114. package/docs/memory/overview.mdx +40 -11
  115. package/docs/reference/cli.md +31 -33
  116. package/docs/reference/meta.json +1 -4
  117. package/docs/reference/telemetry.md +56 -0
  118. package/docs/reference/typescript-api.md +38 -35
  119. package/docs/tools/overview.mdx +59 -18
  120. package/docs/tools/workflows.mdx +146 -70
  121. package/package.json +1 -7
  122. package/dist/src/public/workflow/index.d.ts +0 -5
  123. package/dist/src/public/workflow/index.js +0 -1
@@ -1 +1 @@
1
- import{stripLogicalPathExtension}from"#discover/filesystem.js";import{normalizeScheduleDefinition}from"#internal/authored-definition/core.js";import{loadModuleBackedDefinition,requireModuleBackedDefinitionLoadOptions}from"#compiler/normalize-helpers.js";async function compileScheduleDefinition(e,n,r){let i=n.sourceKind===`markdown`?normalizeScheduleDefinition(n.definition,`Expected the compiled schedule definition at "${n.logicalPath}" to match the public eve shape.`):normalizeScheduleDefinition(await loadModuleBackedDefinition({...requireModuleBackedDefinitionLoadOptions(r,n.logicalPath),kind:`schedule`,source:n}),`Expected the schedule export "${n.exportName??`default`}" from "${n.logicalPath}" to match the public eve shape.`),a={cron:i.cron,hasRun:i.run!==void 0,logicalPath:n.logicalPath,name:deriveScheduleName(n.logicalPath),sourceId:n.sourceId,sourceKind:n.sourceKind},o=i.markdown===void 0?a:{...a,markdown:i.markdown.trim()};return n.sourceKind===`module`?{...o,sourceKind:`module`}:{...o,owner:r.owner,sourceKind:`markdown`}}function deriveScheduleName(t){return stripLogicalPathExtension(t).replace(/^schedules\//,``)}export{compileScheduleDefinition};
1
+ import{stripLogicalPathExtension}from"#discover/filesystem.js";import{normalizeScheduleDefinition}from"#internal/authored-definition/core.js";import{loadModuleBackedDefinition,requireModuleBackedDefinitionLoadOptions}from"#compiler/normalize-helpers.js";import{readWorkflowFunctionId}from"#internal/workflow/reference.js";import{workflowCallbackErrorMessage}from"#shared/workflow-tool-context.js";async function compileScheduleDefinition(e,n,r){let i=n.sourceKind===`markdown`?normalizeScheduleDefinition(n.definition,`Expected the compiled schedule definition at "${n.logicalPath}" to match the public eve shape.`):normalizeScheduleDefinition(await loadModuleBackedDefinition({...requireModuleBackedDefinitionLoadOptions(r,n.logicalPath),kind:`schedule`,source:n}),`Expected the schedule export "${n.exportName??`default`}" from "${n.logicalPath}" to match the public eve shape.`);if(readWorkflowFunctionId(i.run)!==void 0)throw Error(`${n.logicalPath}: ${workflowCallbackErrorMessage(`schedule`)}`);let a={cron:i.cron,hasRun:i.run!==void 0,logicalPath:n.logicalPath,name:deriveScheduleName(n.logicalPath),sourceId:n.sourceId,sourceKind:n.sourceKind},o=i.markdown===void 0?a:{...a,markdown:i.markdown.trim()};return n.sourceKind===`module`?{...o,sourceKind:`module`}:{...o,owner:r.owner,sourceKind:`markdown`}}function deriveScheduleName(t){return stripLogicalPathExtension(t).replace(/^schedules\//,``)}export{compileScheduleDefinition};
@@ -1 +1 @@
1
- import{stripLogicalPathExtension}from"#discover/filesystem.js";import{loadModuleBackedDefinition}from"#compiler/normalize-helpers.js";import{normalizeToolDefinition}from"#internal/authored-definition/schema-backed.js";import{readWorkflowFunctionId}from"#internal/workflow/reference.js";async function compileToolEntry(e,t,n){let r=normalizeToolDefinition(await loadModuleBackedDefinition({binding:n.binding,kind:`tool`,loadNamespace:n.loadNamespace,source:t}),`Expected the tool export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public eve shape.`),i=stripLogicalPathExtension(t.logicalPath).replace(/^tools\//,``).replaceAll(`/`,`-`);if(r.kind===`disabled`)return{kind:`disabled`,name:i};if(r.kind===`workflow-tool`)return{kind:`workflow-tool`,maxSubagents:r.maxSubagents};if(r.kind===`web-search-tool`){if(i!==`web_search`)throw Error(`The webSearch() definition must be exported from "tools/web_search.ts", not "${t.logicalPath}".`);return{definition:{behavior:{availability:[],handling:{kind:`provider-tool`,provider:r.provider}},description:`Search the web for real-time information. Use this to find up-to-date information about current events, recent developments, or topics that may have changed since the knowledge cutoff.`,exportName:t.exportName,hasExecute:!1,hasModelOutputProjection:!1,inputSchema:null,logicalPath:t.logicalPath,name:i,sourceId:t.sourceId,sourceKind:`module`,requiresApproval:!1},kind:`web-search-tool`}}if(r.kind===`dynamic-tool`)return{kind:`dynamic-tool`,definition:{eventNames:[...r.eventNames],exportName:t.exportName,logicalPath:t.logicalPath,rebindMissingCallbacks:r.rebindMissingCallbacks||void 0,slug:i,sourceId:t.sourceId,sourceKind:`module`}};let a=readWorkflowFunctionId(r.definition.execute);return{kind:`tool`,definition:{behavior:a===void 0?r.definition.behavior:{availability:[],handling:{kind:`workflow-tool`,workflowId:a}},description:r.definition.description,execution:r.definition.execution,exportName:t.exportName,hasExecute:r.definition.hasExecute,hasModelOutputProjection:r.definition.hasModelOutputProjection,inputSchema:r.definition.inputSchema??null,logicalPath:t.logicalPath,name:i,outputSchema:r.definition.outputSchema,requiresApproval:r.definition.hasApproval,sourceId:t.sourceId,sourceKind:`module`}}}export{compileToolEntry};
1
+ import{stripLogicalPathExtension}from"#discover/filesystem.js";import{loadModuleBackedDefinition}from"#compiler/normalize-helpers.js";import{readWorkflowFunctionId}from"#internal/workflow/reference.js";import{normalizeToolDefinition}from"#internal/authored-definition/schema-backed.js";async function compileToolEntry(e,t,n){let r=normalizeToolDefinition(await loadModuleBackedDefinition({binding:n.binding,kind:`tool`,loadNamespace:n.loadNamespace,source:t}),`Expected the tool export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public eve shape.`),i=stripLogicalPathExtension(t.logicalPath).replace(/^tools\//,``).replaceAll(`/`,`-`);if(r.kind===`disabled`)return{kind:`disabled`,name:i};if(r.kind===`workflow-tool`)return{kind:`workflow-tool`,maxSubagents:r.maxSubagents};if(r.kind===`web-search-tool`){if(i!==`web_search`)throw Error(`The webSearch() definition must be exported from "tools/web_search.ts", not "${t.logicalPath}".`);return{definition:{behavior:{availability:[],handling:{kind:`provider-tool`,provider:r.provider}},description:`Search the web for real-time information. Use this to find up-to-date information about current events, recent developments, or topics that may have changed since the knowledge cutoff.`,exportName:t.exportName,hasExecute:!1,hasModelOutputProjection:!1,inputSchema:null,logicalPath:t.logicalPath,name:i,sourceId:t.sourceId,sourceKind:`module`,requiresApproval:!1},kind:`web-search-tool`}}if(r.kind===`dynamic-tool`)return{kind:`dynamic-tool`,definition:{eventNames:[...r.eventNames],exportName:t.exportName,logicalPath:t.logicalPath,rebindMissingCallbacks:r.rebindMissingCallbacks||void 0,slug:i,sourceId:t.sourceId,sourceKind:`module`}};let a=readWorkflowFunctionId(r.definition.execute),o={lifetime:r.definition.execution===`background`?`task`:`step`,suspend:a===void 0?`none`:`workflow`};return{kind:`tool`,definition:{behavior:a===void 0?r.definition.behavior===void 0?{availability:[],shape:o}:{...r.definition.behavior,shape:o}:{availability:[],handling:{kind:`workflow-tool`,workflowId:a},shape:o},description:r.definition.description,execution:r.definition.execution,exportName:t.exportName,hasExecute:r.definition.hasExecute,hasModelOutputProjection:r.definition.hasModelOutputProjection,inputSchema:r.definition.inputSchema??null,logicalPath:t.logicalPath,name:i,outputSchema:r.definition.outputSchema,requiresApproval:r.definition.hasApproval,sourceId:t.sourceId,sourceKind:`module`}}}export{compileToolEntry};
@@ -1 +1 @@
1
- import{createLogger}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{SessionDynamicToolMetadataKey,SessionDynamicToolRuntimeRevisionKey,StepDynamicToolMetadataKey,TurnDynamicToolMetadataKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{serializeInputSchema,serializeOutputSchema}from"#tools/schema.js";import{parseJsonObject}from"#shared/json.js";import{ALLOWED_DYNAMIC_TOOL_EVENTS}from"#dynamic/definition.js";import{isCurrentDynamicToolMetadata,toCurrentDynamicToolMetadataList}from"#context/dynamic-tool-metadata.js";import{hasUnregisteredDurableDynamicCallbacks,readDurableDynamicToolCallbacks,registerDurableDynamicCallback}from"#tools/durable-callbacks.js";import{buildResolveContext}from"#context/dynamic-resolve-context.js";import{replayDynamicTools}from"#context/build-dynamic-tools.js";import{isBrandedToolEntry}from"#tools/dynamic.js";const log=createLogger(`dynamic-tools`);function qualifyDynamicToolNames(e,t,n){let r=Object.keys(n);if(r.length===0)return[];if(t){let t=r[0];return[{name:e.slug,entryKey:t,entry:n[t]}]}let i=e.extensionNamespace===void 0?``:`${e.extensionNamespace}__`;return r.map(e=>({entry:n[e],entryKey:e,name:`${i}${e}`}))}function replayDynamicSessionTools(e,t){return replayDynamicTools(e)}function durableKeyForEvent(e){switch(e){case`session.started`:return SessionDynamicToolMetadataKey;case`turn.started`:return TurnDynamicToolMetadataKey;case`step.started`:return StepDynamicToolMetadataKey;default:return}}function readDynamicToolResult(e,t){if(isBrandedToolEntry(t))return{entries:{_single:t},isSingle:!0};if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`Dynamic tool resolver "${e.logicalPath}" must return defineTool(), a map of defineTool() values, or null.`);let n={};for(let[r,i]of Object.entries(t)){if(!isBrandedToolEntry(i))throw Error(`Dynamic tool resolver "${e.logicalPath}" returned "${r}" without defineTool(). Wrap every dynamic tool entry in defineTool().`);n[r]=i}return{entries:n,isSingle:!1}}function validateReference(e){if(e.stamped===void 0){if(e.required)throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" does not have a durable descriptor. Author the callback inline in transformed source or use an eve durable callback helper.`);return}let t=Object.keys(e.stamped).filter(e=>e!==`closure`&&e!==`callback`);if(t.includes(`stepId`))throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" was persisted by a pre-release eve version that identified callbacks by build offset. Start a new session to re-resolve it.`);if(t.length>0)throw Error(`Dynamic tool "${e.name}" has invalid ${e.phase} callback metadata: unknown key(s) ${t.join(`, `)}.`);if(typeof e.stamped.callback!=`function`)throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" does not have a durable descriptor. Author the callback inline in transformed source or use an eve durable callback helper.`);let n;try{n=parseJsonObject(e.stamped.closure)}catch(t){throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" has a non-serializable capture. ${toErrorMessage(t)}`)}return registerDurableDynamicCallback({callback:e.stamped.callback,phase:e.phase,toolName:e.name}),{closure:n}}function validateDurableDynamicToolCallbacks(e,t){let n=readDurableDynamicToolCallbacks(t)??{},r=Object.keys(n).filter(e=>e!==`execute`&&e!==`approvalRequest`&&e!==`approvalResponse`&&e!==`toModelOutput`);if(r.length>0)throw Error(`Dynamic tool "${e}" has unknown durable callback phase(s): ${r.join(`, `)}.`);let i=t.approval!==void 0,a=t.approval!==void 0&&typeof t.approval!=`function`&&t.approval.response!==void 0,o=validateReference({name:e,phase:`execute`,stamped:n.execute,required:!0}),s=validateReference({name:e,phase:`approvalRequest`,stamped:n.approvalRequest,required:i}),c=validateReference({name:e,phase:`approvalResponse`,stamped:n.approvalResponse,required:a}),l=validateReference({name:e,phase:`toModelOutput`,stamped:n.toModelOutput,required:t.toModelOutput!==void 0}),u={execute:o};return s!==void 0&&(u.approvalRequest=s),c!==void 0&&(u.approvalResponse=c),l!==void 0&&(u.toModelOutput=l),u}function createMetadata(e){return{callbacks:validateDurableDynamicToolCallbacks(e.name,e.entry),description:e.entry.description,execution:e.entry.execution===`background`?`background`:void 0,entryKey:e.entryKey,inputSchema:serializeInputSchema(e.entry.inputSchema),name:e.name,outputSchema:serializeOutputSchema(e.entry.outputSchema),resolverSlug:e.resolver.slug}}async function resolveToolsFromEvent(e,t,n,r){let i=await Promise.allSettled(t.map(async t=>{let i=t.events[n.type];if(i===void 0)return null;let a=await i(n,buildResolveContext(e,r));if(a==null)return null;let{entries:o,isSingle:s}=readDynamicToolResult(t,a);return{metadata:qualifyDynamicToolNames(t,s,o).map(({name:e,entryKey:n,entry:r})=>createMetadata({entry:r,entryKey:n,name:e,resolver:t})),resolver:t}})),a=[],s=new Map;for(let e of i){if(e.status===`rejected`){log.error(`Dynamic tool resolver (${n.type}) failed — skipping its complete result.`,{error:toErrorMessage(e.reason)});continue}if(e.value!==null){for(let t of e.value.metadata){let n=s.get(t.name);if(n!==void 0&&n!==e.value.resolver.slug)throw Error(`Dynamic tool "${t.name}" from resolver "${e.value.resolver.slug}" collides with dynamic resolver "${n}". Namespace the map key manually.`);s.set(t.name,e.value.resolver.slug)}a.push(...e.value.metadata)}}return{metadata:a}}const resolvedStepTools=new WeakMap;function stepCoordinate(e){return`${e.data.turnId}:${String(e.data.stepIndex)}`}function storeResolvedStepTools(e){e.ctx.set(StepDynamicToolMetadataKey,e.metadata);let t=stepCoordinate(e.event);resolvedStepTools.set(e.ctx,{coordinate:t,metadata:e.metadata})}async function resolveStepDynamicTools(e){let t=stepCoordinate(e.event),n=resolvedStepTools.get(e.ctx);if(n?.coordinate===t){e.ctx.set(StepDynamicToolMetadataKey,n.metadata);return}let r=e.resolvers.filter(e=>e.eventNames.includes(`step.started`)),{metadata:a}=r.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,r,e.event,e.messages);storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:a})}async function preparePersistedStepDynamicToolMetadata(e){let t=e.ctx.get(StepDynamicToolMetadataKey)??[],n=t.filter(isCurrentDynamicToolMetadata);if(n.length===t.length&&!hasUnregisteredDurableDynamicCallbacks(n)){n.length>0&&storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:n});return}await resolveStepDynamicTools(e);let r=e.ctx.get(StepDynamicToolMetadataKey)??[];storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:toCurrentDynamicToolMetadataList(t,r.filter(isCurrentDynamicToolMetadata))})}async function dispatchDynamicToolEvent(e){if(!ALLOWED_DYNAMIC_TOOL_EVENTS.has(e.event.type))return;if(e.event.type===`step.started`){await resolveStepDynamicTools({...e,event:e.event});return}e.event.type===`turn.started`&&e.ctx.set(StepDynamicToolMetadataKey,[]);let t=e.resolvers.filter(t=>t.eventNames.includes(e.event.type)),{metadata:r}=t.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,t,e.event,e.messages),a=durableKeyForEvent(e.event.type);if(a===void 0)return;if(e.event.type===`session.started`){e.ctx.set(SessionDynamicToolMetadataKey,r);return}let o=new Set(t.map(e=>e.slug)),s=(e.ctx.get(a)??[]).filter(e=>!o.has(e.resolverSlug));e.ctx.set(a,[...s,...r])}async function refreshDynamicSessionToolsForRuntimeRevision(e){let t=e.ctx.get(SessionDynamicToolMetadataKey)??[],i=t.filter(isCurrentDynamicToolMetadata),a=i.length!==t.length,o=e.ctx.get(SessionDynamicToolRuntimeRevisionKey)!==e.runtimeRevision;if(!o&&!a&&!hasUnregisteredDurableDynamicCallbacks(i))return;let s=e.resolvers.filter(e=>e.eventNames.includes(`session.started`)),{metadata:c}=s.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,s,e.event,e.messages);e.ctx.set(SessionDynamicToolMetadataKey,o?c:toCurrentDynamicToolMetadataList(t,c)),e.ctx.set(SessionDynamicToolRuntimeRevisionKey,e.runtimeRevision)}async function rebindMissingCompiledDynamicToolCallbacks(e){let n=e.ctx.get(TurnDynamicToolMetadataKey)??[],r=n.filter(e=>!isCurrentDynamicToolMetadata(e)||hasUnregisteredDurableDynamicCallbacks([e]));if(r.length===0)return;let i=new Set(r.map(e=>e.resolverSlug)),o=new Set(n.filter(e=>!isCurrentDynamicToolMetadata(e)).map(e=>e.resolverSlug)),s=e.resolvers.filter(e=>i.has(e.slug)&&(o.has(e.slug)||e.rebindMissingCallbacks===!0));if(s.length===0){e.ctx.set(TurnDynamicToolMetadataKey,toCurrentDynamicToolMetadataList(n));return}let c=toCurrentDynamicToolMetadataList(n,(await contextStorage.run(e.ctx,async()=>await resolveToolsFromEvent(e.ctx,s,e.event,e.messages))).metadata);e.ctx.set(TurnDynamicToolMetadataKey,c);let l=c.filter(e=>r.some(t=>t.resolverSlug===e.resolverSlug&&t.name===e.name)&&hasUnregisteredDurableDynamicCallbacks([e]));if(l.length>0)throw Error(`Dynamic tool callback rebind did not restore: ${l.map(e=>e.name).join(`, `)}. The tool may have been renamed or removed.`)}export{dispatchDynamicToolEvent,preparePersistedStepDynamicToolMetadata,rebindMissingCompiledDynamicToolCallbacks,refreshDynamicSessionToolsForRuntimeRevision,replayDynamicSessionTools,resolveStepDynamicTools,validateDurableDynamicToolCallbacks};
1
+ import{createLogger}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{SessionDynamicToolMetadataKey,SessionDynamicToolRuntimeRevisionKey,StepDynamicToolMetadataKey,TurnDynamicToolMetadataKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{serializeInputSchema,serializeOutputSchema}from"#tools/schema.js";import{parseJsonObject}from"#shared/json.js";import{ALLOWED_DYNAMIC_TOOL_EVENTS}from"#dynamic/definition.js";import{isCurrentDynamicToolMetadata,toCurrentDynamicToolMetadataList}from"#context/dynamic-tool-metadata.js";import{hasUnregisteredDurableDynamicCallbacks,readDurableDynamicToolCallbacks,registerDurableDynamicCallback}from"#tools/durable-callbacks.js";import{buildResolveContext}from"#context/dynamic-resolve-context.js";import{isWorkflowToolDefinition}from"#tools/workflow-definition.js";import{replayDynamicTools}from"#context/build-dynamic-tools.js";import{isBrandedToolEntry}from"#tools/dynamic.js";const log=createLogger(`dynamic-tools`);function qualifyDynamicToolNames(e,t,n){let r=Object.keys(n);if(r.length===0)return[];if(t){let t=r[0];return[{name:e.slug,entryKey:t,entry:n[t]}]}let i=e.extensionNamespace===void 0?``:`${e.extensionNamespace}__`;return r.map(e=>({entry:n[e],entryKey:e,name:`${i}${e}`}))}function replayDynamicSessionTools(e,t){return replayDynamicTools(e)}function durableKeyForEvent(e){switch(e){case`session.started`:return SessionDynamicToolMetadataKey;case`turn.started`:return TurnDynamicToolMetadataKey;case`step.started`:return StepDynamicToolMetadataKey;default:return}}function readDynamicToolResult(e,t){let assertOrdinaryTool=t=>{if(isWorkflowToolDefinition(t))throw Error(`Dynamic tool resolver "${e.logicalPath}" cannot return defineWorkflowTool(). Workflow tools must be static tools; use defineTool() for dynamic entries.`)};if(assertOrdinaryTool(t),isBrandedToolEntry(t))return{entries:{_single:t},isSingle:!0};if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`Dynamic tool resolver "${e.logicalPath}" must return defineTool(), a map of defineTool() values, or null.`);let n={};for(let[r,i]of Object.entries(t)){if(assertOrdinaryTool(i),!isBrandedToolEntry(i))throw Error(`Dynamic tool resolver "${e.logicalPath}" returned "${r}" without defineTool(). Wrap every dynamic tool entry in defineTool().`);n[r]=i}return{entries:n,isSingle:!1}}function validateReference(e){if(e.stamped===void 0){if(e.required)throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" does not have a durable descriptor. Author the callback inline in transformed source or use an eve durable callback helper.`);return}let t=Object.keys(e.stamped).filter(e=>e!==`closure`&&e!==`callback`);if(t.includes(`stepId`))throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" was persisted by a pre-release eve version that identified callbacks by build offset. Start a new session to re-resolve it.`);if(t.length>0)throw Error(`Dynamic tool "${e.name}" has invalid ${e.phase} callback metadata: unknown key(s) ${t.join(`, `)}.`);if(typeof e.stamped.callback!=`function`)throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" does not have a durable descriptor. Author the callback inline in transformed source or use an eve durable callback helper.`);let n;try{n=parseJsonObject(e.stamped.closure)}catch(t){throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" has a non-serializable capture. ${toErrorMessage(t)}`)}return registerDurableDynamicCallback({callback:e.stamped.callback,phase:e.phase,toolName:e.name}),{closure:n}}function validateDurableDynamicToolCallbacks(e,t){let n=readDurableDynamicToolCallbacks(t)??{},r=Object.keys(n).filter(e=>e!==`execute`&&e!==`approvalRequest`&&e!==`approvalResponse`&&e!==`toModelOutput`);if(r.length>0)throw Error(`Dynamic tool "${e}" has unknown durable callback phase(s): ${r.join(`, `)}.`);let i=t.approval!==void 0,a=t.approval!==void 0&&typeof t.approval!=`function`&&t.approval.response!==void 0,o=validateReference({name:e,phase:`execute`,stamped:n.execute,required:!0}),s=validateReference({name:e,phase:`approvalRequest`,stamped:n.approvalRequest,required:i}),c=validateReference({name:e,phase:`approvalResponse`,stamped:n.approvalResponse,required:a}),l=validateReference({name:e,phase:`toModelOutput`,stamped:n.toModelOutput,required:t.toModelOutput!==void 0}),u={execute:o};return s!==void 0&&(u.approvalRequest=s),c!==void 0&&(u.approvalResponse=c),l!==void 0&&(u.toModelOutput=l),u}function createMetadata(e){return{callbacks:validateDurableDynamicToolCallbacks(e.name,e.entry),description:e.entry.description,execution:e.entry.execution===`background`?`background`:void 0,entryKey:e.entryKey,inputSchema:serializeInputSchema(e.entry.inputSchema),name:e.name,outputSchema:serializeOutputSchema(e.entry.outputSchema),resolverSlug:e.resolver.slug}}async function resolveToolsFromEvent(e,t,n,r){let i=await Promise.allSettled(t.map(async t=>{let i=t.events[n.type];if(i===void 0)return null;let a=await i(n,buildResolveContext(e,r));if(a==null)return null;let{entries:o,isSingle:s}=readDynamicToolResult(t,a);return{metadata:qualifyDynamicToolNames(t,s,o).map(({name:e,entryKey:n,entry:r})=>createMetadata({entry:r,entryKey:n,name:e,resolver:t})),resolver:t}})),a=[],s=new Map;for(let e of i){if(e.status===`rejected`){log.error(`Dynamic tool resolver (${n.type}) failed — skipping its complete result.`,{error:toErrorMessage(e.reason)});continue}if(e.value!==null){for(let t of e.value.metadata){let n=s.get(t.name);if(n!==void 0&&n!==e.value.resolver.slug)throw Error(`Dynamic tool "${t.name}" from resolver "${e.value.resolver.slug}" collides with dynamic resolver "${n}". Namespace the map key manually.`);s.set(t.name,e.value.resolver.slug)}a.push(...e.value.metadata)}}return{metadata:a}}const resolvedStepTools=new WeakMap;function stepCoordinate(e){return`${e.data.turnId}:${String(e.data.stepIndex)}`}function storeResolvedStepTools(e){e.ctx.set(StepDynamicToolMetadataKey,e.metadata);let t=stepCoordinate(e.event);resolvedStepTools.set(e.ctx,{coordinate:t,metadata:e.metadata})}async function resolveStepDynamicTools(e){let t=stepCoordinate(e.event),n=resolvedStepTools.get(e.ctx);if(n?.coordinate===t){e.ctx.set(StepDynamicToolMetadataKey,n.metadata);return}let r=e.resolvers.filter(e=>e.eventNames.includes(`step.started`)),{metadata:a}=r.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,r,e.event,e.messages);storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:a})}async function preparePersistedStepDynamicToolMetadata(e){let t=e.ctx.get(StepDynamicToolMetadataKey)??[],n=t.filter(isCurrentDynamicToolMetadata);if(n.length===t.length&&!hasUnregisteredDurableDynamicCallbacks(n)){n.length>0&&storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:n});return}await resolveStepDynamicTools(e);let r=e.ctx.get(StepDynamicToolMetadataKey)??[];storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:toCurrentDynamicToolMetadataList(t,r.filter(isCurrentDynamicToolMetadata))})}async function dispatchDynamicToolEvent(e){if(!ALLOWED_DYNAMIC_TOOL_EVENTS.has(e.event.type))return;if(e.event.type===`step.started`){await resolveStepDynamicTools({...e,event:e.event});return}e.event.type===`turn.started`&&e.ctx.set(StepDynamicToolMetadataKey,[]);let t=e.resolvers.filter(t=>t.eventNames.includes(e.event.type)),{metadata:r}=t.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,t,e.event,e.messages),a=durableKeyForEvent(e.event.type);if(a===void 0)return;if(e.event.type===`session.started`){e.ctx.set(SessionDynamicToolMetadataKey,r);return}let o=new Set(t.map(e=>e.slug)),s=(e.ctx.get(a)??[]).filter(e=>!o.has(e.resolverSlug));e.ctx.set(a,[...s,...r])}async function refreshDynamicSessionToolsForRuntimeRevision(e){let t=e.ctx.get(SessionDynamicToolMetadataKey)??[],i=t.filter(isCurrentDynamicToolMetadata),a=i.length!==t.length,o=e.ctx.get(SessionDynamicToolRuntimeRevisionKey)!==e.runtimeRevision;if(!o&&!a&&!hasUnregisteredDurableDynamicCallbacks(i))return;let s=e.resolvers.filter(e=>e.eventNames.includes(`session.started`)),{metadata:c}=s.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,s,e.event,e.messages);e.ctx.set(SessionDynamicToolMetadataKey,o?c:toCurrentDynamicToolMetadataList(t,c)),e.ctx.set(SessionDynamicToolRuntimeRevisionKey,e.runtimeRevision)}async function rebindMissingCompiledDynamicToolCallbacks(e){let n=e.ctx.get(TurnDynamicToolMetadataKey)??[],r=n.filter(e=>!isCurrentDynamicToolMetadata(e)||hasUnregisteredDurableDynamicCallbacks([e]));if(r.length===0)return;let i=new Set(r.map(e=>e.resolverSlug)),o=new Set(n.filter(e=>!isCurrentDynamicToolMetadata(e)).map(e=>e.resolverSlug)),s=e.resolvers.filter(e=>i.has(e.slug)&&(o.has(e.slug)||e.rebindMissingCallbacks===!0));if(s.length===0){e.ctx.set(TurnDynamicToolMetadataKey,toCurrentDynamicToolMetadataList(n));return}let c=toCurrentDynamicToolMetadataList(n,(await contextStorage.run(e.ctx,async()=>await resolveToolsFromEvent(e.ctx,s,e.event,e.messages))).metadata);e.ctx.set(TurnDynamicToolMetadataKey,c);let l=c.filter(e=>r.some(t=>t.resolverSlug===e.resolverSlug&&t.name===e.name)&&hasUnregisteredDurableDynamicCallbacks([e]));if(l.length>0)throw Error(`Dynamic tool callback rebind did not restore: ${l.map(e=>e.name).join(`, `)}. The tool may have been renamed or removed.`)}export{dispatchDynamicToolEvent,preparePersistedStepDynamicToolMetadata,rebindMissingCompiledDynamicToolCallbacks,refreshDynamicSessionToolsForRuntimeRevision,replayDynamicSessionTools,resolveStepDynamicTools,validateDurableDynamicToolCallbacks};
@@ -1 +1 @@
1
- import{createHook,sleep}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,closeHookIterator,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{createActivitySnapshot,reduceActivityBatch}from"#execution/session-activity.js";import{disposeSessionActivityStep,renderSessionActivityStep}from"#execution/session-activity-renderer-step.js";async function activityCollectorWorkflow(i){"use workflow";let a=createHook({token:i.token}),o=a[Symbol.asyncIterator](),s=!1,c,l=sleep(new Date(i.expiresAt)).then(()=>({kind:`expired`})),u=createActivitySnapshot(),d={};try{try{await claimHookOwnership(a),s=!0}catch(e){if(isHookConflictError(e))return;throw e}for(;;){c??=o.next();let e=await Promise.race([c.then(e=>({kind:`batch`,value:e})),l]);if(e.kind===`expired`||e.value.done===!0)break;c=void 0;let n=reduceCollectorActivity(u,e.value.value);if(u=n.snapshot,!n.presentationChanged)continue;let r=sleep(350).then(()=>({kind:`render`}));for(;;){c??=o.next();let e=await Promise.race([c.then(e=>({kind:`batch`,value:e})),r,l]);if(e.kind===`expired`)return;if(e.kind===`render`)break;if(e.value.done===!0)return;c=void 0,u=reduceActivityBatch(u,e.value.value)}d=(await renderSessionActivityStep({rendererStates:d,serializedContext:i.serializedContext,snapshot:u})).rendererStates}}finally{s&&(await closeHookIterator(o).catch(()=>{}),await disposeHook(a).catch(()=>{}),await disposeSessionActivityStep({rendererStates:d,serializedContext:i.serializedContext}).catch(()=>{}))}}function reduceCollectorActivity(e,t){let n=e.revision,r=reduceActivityBatch(e,t);return{presentationChanged:r.revision!==n,snapshot:r}}activityCollectorWorkflow.workflowId=`workflow//eve//activityCollectorWorkflow`;export{activityCollectorWorkflow,reduceCollectorActivity};
1
+ import{createHook,sleep}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,isHookConflictError}from"#execution/hook-ownership.js";import{createActivitySnapshot,reduceActivityBatch}from"#execution/session-activity.js";import{disposeSessionActivityStep,renderSessionActivityStep}from"#execution/session-activity-renderer-step.js";async function activityCollectorWorkflow(i){"use workflow";let a=createHook({token:i.token}),o=a[Symbol.asyncIterator](),s,c=sleep(new Date(i.expiresAt)).then(()=>({kind:`expired`})),l=createActivitySnapshot(),u={};try{await claimHookOwnership(a)}catch(e){if(isHookConflictError(e))return;throw e}try{for(;;){s??=o.next();let e=await Promise.race([s.then(e=>({kind:`batch`,value:e})),c]);if(e.kind===`expired`||e.value.done===!0)break;s=void 0;let n=reduceCollectorActivity(l,e.value.value);if(l=n.snapshot,!n.presentationChanged)continue;let r=sleep(350).then(()=>({kind:`render`}));for(;;){s??=o.next();let e=await Promise.race([s.then(e=>({kind:`batch`,value:e})),r,c]);if(e.kind===`expired`)return;if(e.kind===`render`)break;if(e.value.done===!0)return;s=void 0,l=reduceActivityBatch(l,e.value.value)}u=(await renderSessionActivityStep({rendererStates:u,serializedContext:i.serializedContext,snapshot:l})).rendererStates}}finally{await disposeSessionActivityStep({rendererStates:u,serializedContext:i.serializedContext}).catch(()=>{})}}function reduceCollectorActivity(e,t){let n=e.revision,r=reduceActivityBatch(e,t);return{presentationChanged:r.revision!==n,snapshot:r}}activityCollectorWorkflow.workflowId=`workflow//eve//activityCollectorWorkflow`;export{activityCollectorWorkflow,reduceCollectorActivity};
@@ -1 +1 @@
1
- import{sessionCommandHookToken}from"#execution/session-command-token.js";import{walkCauseChain}from"#shared/errors.js";import{cancelRun,getHookByToken,getWorld}from"#internal/workflow/runtime.js";import{EntityConflictError,HookNotFoundError,RunExpiredError,WorkflowRunNotFoundError}from"#compiled/@workflow/errors/index.js";import{resumeSessionInbox}from"#execution/wire/session-inbox-resume.js";async function settleContinuationConflictStep(e){"use step";try{e.command!==void 0&&await forwardCommand({command:e.command,continuationToken:e.continuationToken,ownerSessionId:e.ownerSessionId})}finally{e.activityCollectorRunId!==void 0&&await cancelCollector(e.activityCollectorRunId)}}async function forwardCommand(t){try{await resumeSessionInbox(t.continuationToken,t.command)}catch(n){if(!HookNotFoundError.is(n))throw n;await resumeSessionInbox(sessionCommandHookToken(await resolveOwnerSessionId(t)),t.command)}}async function resolveOwnerSessionId(e){if(e.ownerSessionId!==void 0)return e.ownerSessionId;try{let t=await getHookByToken(e.continuationToken);if(typeof t.runId==`string`&&t.runId.length>0)return t.runId}catch(e){if(!HookNotFoundError.is(e))throw e}let t=e.command.requestId===void 0?``:` ${JSON.stringify(e.command.requestId)}`;throw Error(`Unable to forward losing candidate delivery${t}: continuation owner could not be resolved.`)}async function cancelCollector(e){try{await cancelRun(await getWorld(),e,{cancelReason:`Session candidate did not acquire continuation ownership`})}catch(e){if(!isInactiveRun(e))throw e}}function isInactiveRun(e){for(let n of walkCauseChain(e))if(WorkflowRunNotFoundError.is(n)||RunExpiredError.is(n)||EntityConflictError.is(n))return!0;return!1}export{settleContinuationConflictStep};
1
+ import{sessionCommandHookToken}from"#execution/session-command-token.js";import{walkCauseChain}from"#shared/errors.js";import{cancelRun,getRawHookByToken,getWorld}from"#internal/workflow/runtime.js";import{EntityConflictError,HookNotFoundError,RunExpiredError,WorkflowRunNotFoundError}from"#compiled/@workflow/errors/index.js";import{resumeSessionInbox}from"#execution/wire/session-inbox-resume.js";async function settleContinuationConflictStep(e){"use step";try{e.command!==void 0&&await forwardCommand({command:e.command,continuationToken:e.continuationToken,ownerSessionId:e.ownerSessionId})}finally{e.activityCollectorRunId!==void 0&&await cancelCollector(e.activityCollectorRunId)}}async function forwardCommand(t){try{await resumeSessionInbox(t.continuationToken,t.command)}catch(n){if(!HookNotFoundError.is(n))throw n;await resumeSessionInbox(sessionCommandHookToken(await resolveOwnerSessionId(t)),t.command)}}async function resolveOwnerSessionId(e){if(e.ownerSessionId!==void 0)return e.ownerSessionId;try{let t=await getRawHookByToken(e.continuationToken);if(typeof t.runId==`string`&&t.runId.length>0)return t.runId}catch(e){if(!HookNotFoundError.is(e))throw e}let t=e.command.requestId===void 0?``:` ${JSON.stringify(e.command.requestId)}`;throw Error(`Unable to forward losing candidate delivery${t}: continuation owner could not be resolved.`)}async function cancelCollector(e){try{await cancelRun(await getWorld(),e,{cancelReason:`Session candidate did not acquire continuation ownership`})}catch(e){if(!isInactiveRun(e))throw e}}function isInactiveRun(e){for(let n of walkCauseChain(e))if(WorkflowRunNotFoundError.is(n)||RunExpiredError.is(n)||EntityConflictError.is(n))return!0;return!1}export{settleContinuationConflictStep};
@@ -10,6 +10,7 @@ import type { RuntimeActionResult, RuntimeToolCallActionRequest, RuntimeWorkflow
10
10
  import type { SessionParent } from "#channel/types.js";
11
11
  import { type DurableSessionState, readDurableSession } from "#execution/durable-session-store.js";
12
12
  import { buildSubagentRunInput } from "#subagents/tool.js";
13
+ import type { WorkflowToolRunOwner } from "#execution/tools/workflow/messages.js";
13
14
  export type DispatchPlanEntry = {
14
15
  readonly kind: "task-control";
15
16
  readonly action: RuntimeToolCallActionRequest;
@@ -20,8 +21,7 @@ export type DispatchPlanEntry = {
20
21
  /** Input shared by direct and Workflow-originated owner-side dispatch. */
21
22
  export interface CoordinationDispatchInput {
22
23
  readonly callbackBaseUrl?: string;
23
- /** Internal hook that receives child completion and HITL payloads. */
24
- readonly parentContinuationToken?: string;
24
+ readonly workflowToolRunOwner: WorkflowToolRunOwner;
25
25
  readonly parentWritable: WritableStream<Uint8Array>;
26
26
  readonly serializedContext: Record<string, unknown>;
27
27
  readonly sessionState: DurableSessionState;
@@ -1 +1 @@
1
- import{createLogger}from"#internal/logging.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{deserializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{hydrateDurableSession}from"#execution/session.js";import{executeTaskControlAction}from"#execution/tasks/parent/dispatch.js";import{cancelBackgroundAgentTask}from"#execution/tools/subagent/task-cancel.js";import{setPendingCoordinationBatch}from"#harness/coordination.js";import{prepareCoordinationDispatch}from"#execution/coordination-dispatch-shared.js";import{deliverTaskUpdate}from"#execution/tasks/child/update.js";import{startWorkflowTask}from"#execution/tools/workflow/start.js";import{getPendingWorkflowInterrupt,setPendingWorkflowUsedCalls}from"#harness/workflow-interrupt-state.js";import{planWorkflowSubagentDispatch}from"#harness/workflow-subagent-limit.js";import{buildWorkflowTasksFromInterrupt}from"#harness/workflow-task-state.js";const workflowTaskLog=createLogger(`execution.dispatch-workflow-tasks`);async function dispatchCoordinationStep(e){"use step";let t=e.action===`dispatch-workflow-tasks`?await normalizeWorkflowTaskInterrupt(e):{results:[],sessionState:e.sessionState},n=await prepareCoordinationDispatch({serializedContext:e.serializedContext,sessionState:t.sessionState});if(n===void 0)return{results:t.results,sessionState:t.sessionState,pendingTasks:[]};let{batch:i,session:a}=n,o=a,l=[],p=[];for(let t of n.plan){if(t.kind===`workflow-task`){let r=await startWorkflowTask({auth:n.auth,batchEvent:i.event,initiatorAuth:n.initiatorAuth,parentContinuationToken:e.parentContinuationToken??a.continuationToken,parentSession:n.parentSession,session:o,task:t.task});o=r.session,r.result!==void 0&&l.push(r.result);continue}if(t.kind===`task-control`){let e=await executeTaskControlAction({action:t.action,adapter:n.adapter,bundle:n.bundle,cancelOwnedWork:cancelBackgroundAgentTask,deliverUpdate:deliverTaskUpdate,parentStepIndex:i.event.stepIndex,parentTurnId:i.event.turnId,serializedContext:n.serializedContext,session:o});o=e.session,e.pendingTask!==void 0&&p.push(e.pendingTask),l.push(e.result);continue}}return{results:[...l,...t.results],sessionState:o===a?n.sessionState:createDurableSessionState({session:o}),pendingTasks:p}}async function normalizeWorkflowTaskInterrupt(e){let s=await readDurableSession(e.sessionState),c=getPendingWorkflowInterrupt(s.state);if(c===void 0)return{results:[],sessionState:e.sessionState};let u=buildWorkflowTasksFromInterrupt(c.interrupt);if(u.length===0)return{results:[],sessionState:e.sessionState};let d=await deserializeContext(e.serializedContext),f=resolveEffectiveAgentRuntime(d.require(BundleKey),d),m=planWorkflowSubagentDispatch({tasks:u,maxSubagents:s.workflowMaxSubagents,usedCalls:c.usedCalls}),h=m.blocked.map(e=>(workflowTaskLog.warn(`workflow subagent limit reached; blocking delegated call`,{callId:e.callId,maxSubagents:m.maxSubagents,subagentName:getWorkflowTaskName(e),usedCalls:m.usedCalls}),createWorkflowSubagentLimitResult({action:e,plan:m})));if(m.allowed.length===0)return{results:h,sessionState:e.sessionState};let g=setPendingWorkflowUsedCalls({session:hydrateDurableSession({compactionOverrides:{thresholdPercent:f.thresholdPercent},durable:s,turnAgent:f.turnAgent}),usedCalls:c.usedCalls+m.allowed.filter(e=>e.resultKind===`subagent`).length});return{results:h,sessionState:createDurableSessionState({session:setPendingCoordinationBatch({runtimeActions:[],tasks:m.allowed,event:{sequence:0,stepIndex:0,turnId:`workflow-dispatch`},responseMessages:[],session:g})})}}function createWorkflowSubagentLimitResult(e){let t=getWorkflowTaskName(e.action);return{callId:e.action.callId,isError:!0,kind:`subagent-result`,origin:`dispatch`,output:{code:`WORKFLOW_SUBAGENT_LIMIT_REACHED`,maxSubagents:e.plan.maxSubagents,message:`Workflow subagent limit reached (${String(e.plan.maxSubagents)}); "${t}" was not called.`},subagentName:t}}function getWorkflowTaskName(e){return e.resultKind===`subagent`?e.toolName:e.kind}export{dispatchCoordinationStep};
1
+ import{createLogger}from"#internal/logging.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{deserializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{hydrateDurableSession}from"#execution/session.js";import{executeTaskControlAction}from"#execution/tasks/parent/dispatch.js";import{cancelBackgroundAgentTask}from"#execution/tools/subagent/task-cancel.js";import{setPendingCoordinationBatch}from"#harness/coordination.js";import{prepareCoordinationDispatch}from"#execution/coordination-dispatch-shared.js";import{deliverTaskUpdate}from"#execution/tasks/child/update.js";import{startWorkflowTask}from"#execution/tools/workflow/start.js";import{getPendingWorkflowInterrupt,setPendingWorkflowUsedCalls}from"#harness/workflow-interrupt-state.js";import{planWorkflowSubagentDispatch}from"#harness/workflow-subagent-limit.js";import{buildWorkflowTasksFromInterrupt}from"#harness/workflow-task-state.js";const workflowTaskLog=createLogger(`execution.dispatch-workflow-tasks`);async function dispatchCoordinationStep(e){"use step";let t=e.action===`dispatch-workflow-tasks`?await normalizeWorkflowTaskInterrupt(e):{results:[],sessionState:e.sessionState},n=await prepareCoordinationDispatch({serializedContext:e.serializedContext,sessionState:t.sessionState});if(n===void 0)return{results:t.results,sessionState:t.sessionState,pendingTasks:[]};let{batch:i,session:a}=n,o=a,l=[],p=[];for(let t of n.plan){if(t.kind===`workflow-task`){let r=await startWorkflowTask({auth:n.auth,batchEvent:i.event,initiatorAuth:n.initiatorAuth,owner:e.workflowToolRunOwner,parentSession:n.parentSession,session:o,task:t.task});o=r.session,r.result!==void 0&&l.push(r.result);continue}if(t.kind===`task-control`){let e=await executeTaskControlAction({action:t.action,adapter:n.adapter,bundle:n.bundle,cancelOwnedWork:cancelBackgroundAgentTask,deliverUpdate:deliverTaskUpdate,parentStepIndex:i.event.stepIndex,parentTurnId:i.event.turnId,serializedContext:n.serializedContext,session:o});o=e.session,e.pendingTask!==void 0&&p.push(e.pendingTask),l.push(e.result);continue}}return{results:[...l,...t.results],sessionState:o===a?n.sessionState:createDurableSessionState({session:o}),pendingTasks:p}}async function normalizeWorkflowTaskInterrupt(e){let s=await readDurableSession(e.sessionState),c=getPendingWorkflowInterrupt(s.state);if(c===void 0)return{results:[],sessionState:e.sessionState};let u=buildWorkflowTasksFromInterrupt(c.interrupt);if(u.length===0)return{results:[],sessionState:e.sessionState};let d=await deserializeContext(e.serializedContext),f=resolveEffectiveAgentRuntime(d.require(BundleKey),d),m=planWorkflowSubagentDispatch({tasks:u,maxSubagents:s.workflowMaxSubagents,usedCalls:c.usedCalls}),h=m.blocked.map(e=>(workflowTaskLog.warn(`workflow subagent limit reached; blocking delegated call`,{callId:e.callId,maxSubagents:m.maxSubagents,subagentName:getWorkflowTaskName(e),usedCalls:m.usedCalls}),createWorkflowSubagentLimitResult({action:e,plan:m})));if(m.allowed.length===0)return{results:h,sessionState:e.sessionState};let g=setPendingWorkflowUsedCalls({session:hydrateDurableSession({compactionOverrides:{thresholdPercent:f.thresholdPercent},durable:s,turnAgent:f.turnAgent}),usedCalls:c.usedCalls+m.allowed.filter(e=>e.resultKind===`subagent`).length});return{results:h,sessionState:createDurableSessionState({session:setPendingCoordinationBatch({runtimeActions:[],tasks:m.allowed,event:{sequence:0,stepIndex:0,turnId:`workflow-dispatch`},responseMessages:[],session:g})})}}function createWorkflowSubagentLimitResult(e){let t=getWorkflowTaskName(e.action);return{callId:e.action.callId,isError:!0,kind:`subagent-result`,origin:`dispatch`,output:{code:`WORKFLOW_SUBAGENT_LIMIT_REACHED`,maxSubagents:e.plan.maxSubagents,message:`Workflow subagent limit reached (${String(e.plan.maxSubagents)}); "${t}" was not called.`},subagentName:t}}function getWorkflowTaskName(e){return e.resultKind===`subagent`?e.toolName:e.kind}export{dispatchCoordinationStep};
@@ -48,7 +48,7 @@ interface TurnWorkflowInputBase {
48
48
  readonly mode: RunMode;
49
49
  readonly stepInput: TurnStepInput;
50
50
  }
51
- /** A step completed inline before the turn needed its child workflow. */
51
+ /** A step completed inline before the turn needed the shared turn runner. */
52
52
  export interface InitialTurnStep {
53
53
  readonly beforeStep: {
54
54
  readonly serializedContext: Record<string, unknown>;
@@ -9,12 +9,12 @@ import type { RunMode } from "#shared/run-mode.js";
9
9
  export type InlineTurnOutcome = {
10
10
  readonly initialCancellation?: TurnCancelPayload;
11
11
  readonly initialStep?: InitialTurnStep;
12
- readonly kind: "child";
12
+ readonly kind: "child" | "continue";
13
13
  } | {
14
14
  readonly action: NextDriverAction;
15
15
  readonly kind: "result";
16
16
  };
17
- /** Runs ordinary same-deployment turn steps inline and hands complex work to the child path. */
17
+ /** Runs same-deployment steps directly until they need the shared turn runner. */
18
18
  export declare function runInlineTurn(input: {
19
19
  readonly bufferedDeliveries: DeliverHookPayload[];
20
20
  readonly bufferedSessionControls: Array<"clear" | "compact" | "expired" | "reset">;
@@ -1 +1 @@
1
- import{activeTurnId}from"#harness/active-turn-id.js";import{readAcceptedDeploymentId}from"#execution/accepted-delivery-deployment.js";import{cancelAllIndexedSessionTasksStep}from"#execution/cancel-indexed-session-tasks-step.js";import{reportDroppedWirePayloadStep}from"#execution/report-dropped-wire-payload-step.js";import{SessionStateCursor}from"#execution/session-state-cursor.js";import{SessionInboxWireError,sessionInboxWire}from"#execution/wire/session-inbox-wire.js";import{turnStep}from"#execution/workflow-steps.js";import{TurnCancelledError}from"#harness/turn-cancellation.js";async function runInlineTurn(n){let r=readAcceptedDeploymentId(n.delivery);if(r===void 0)return{kind:`child`};let a=n.stateCursor??new SessionStateCursor({serializedContext:n.serializedContext,sessionState:n.sessionState}),o=new InlineTurnControl({bufferedDeliveries:n.bufferedDeliveries,bufferedSessionControls:n.bufferedSessionControls,cancelledTaskIds:n.cancelledTaskIds,commandInbox:n.commandInbox,expectedTurnId:activeTurnId(n.sessionState.emissionState),seenTaskDeliveries:n.seenTaskDeliveries,stateCursor:a}),s=n.delivery;for(;;){let e={serializedContext:a.serializedContext,sessionState:a.sessionState},t=await o.waitForStep(turnStep({abortSignal:o.signal,acceptedDeploymentId:r,input:s,parentWritable:n.parentWritable,serializedContext:a.serializedContext,sessionState:a.sessionState}));if(t.requiresChildDispatch===!0)return childOutcome(o);let i={beforeStep:e,result:t};if(o.initialCancellation!==void 0||t.action===`cancelled`||(t.backgroundTasks?.length??0)>0)return childOutcome(o,i);if(t.action===`done`)return{action:{isError:t.isError,kind:`done`,output:t.output??``,serializedContext:t.serializedContext,sessionState:t.sessionState,usage:t.usage,usageDelta:t.usageDelta},kind:`result`};if(t.action===`dispatch-workflow-tasks`||t.action===`park`&&t.pendingCoordinationCallIds!==void 0)return childOutcome(o,i);if(t.action===`park`)return t.hasPendingAuthorization||t.hasPendingInputBatch&&n.capabilities?.requestInput===!0||n.mode===`conversation`?{action:{authorizationAttemptIds:t.authorizationAttemptIds,authorizationNames:t.authorizationNames,kind:`park`,serializedContext:t.serializedContext,sessionState:t.sessionState,settled:t.settled},kind:`result`}:childOutcome(o,i);let c=a.sessionState.continuationToken;a.adoptState(t),a.sessionState.continuationToken!==``&&a.sessionState.continuationToken!==c&&await n.commandInbox.rekeyContinuation(a.sessionState.continuationToken),s=void 0}}function childOutcome(e,t){return{initialCancellation:e.initialCancellation,initialStep:t,kind:`child`}}var InlineTurnControl=class{bufferedDeliveries;bufferedSessionControls;cancelledTaskIds;commandInbox;controller=new AbortController;expectedTurnId;seenTaskDeliveries;stateCursor;cancellation;constructor(e){this.bufferedDeliveries=e.bufferedDeliveries,this.bufferedSessionControls=e.bufferedSessionControls,this.cancelledTaskIds=e.cancelledTaskIds??new Set,this.commandInbox=e.commandInbox,this.expectedTurnId=e.expectedTurnId,this.seenTaskDeliveries=e.seenTaskDeliveries??new Set,this.stateCursor=e.stateCursor}get initialCancellation(){return this.cancellation}get signal(){return this.controller.signal}async waitForStep(e){let t=e.then(e=>({kind:`step`,result:e}));for(;;){let e=await Promise.race([t,this.commandInbox.next().then(e=>({kind:`command`,result:e}))]);if(e.kind===`step`)return e.result;if(e.result.done)throw Error(`Session command inbox closed before the inline turn step settled.`);this.commandInbox.consumeNext(),await this.handle(e.result.value)}}abort(e){this.controller.signal.aborted||(this.cancellation=e,this.controller.abort(new TurnCancelledError))}acceptTaskDelivery(e){let t=e.taskDeliveryId??e.caller?.taskId;return t===void 0?!0:this.originatesFromCancelledTask(t)||this.seenTaskDeliveries.has(t)?!1:(this.seenTaskDeliveries.add(t),!0)}async handle(e){if(e.kind===`runtime-action-result`)return;let t;try{t=sessionInboxWire.decode(e)}catch(e){if(!(e instanceof SessionInboxWireError))throw e;await reportDroppedWirePayloadStep({detail:e.message,family:`session-inbox`});return}if(t.kind===`deliver`){if(!this.acceptTaskDelivery(t))return;this.bufferedDeliveries.push(t),t.turnPolicy===`steer`&&deliveryHasMessage(t)&&this.abort({});return}if(t.kind===`clear`||t.kind===`compact`){this.bufferedSessionControls.push(t.kind);return}if(t.kind===`session-timeout`){this.bufferedSessionControls.push(`expired`);return}if(t.kind===`reset`){this.bufferedSessionControls.push(`reset`),this.abort({});return}if(t.kind===`cancel`){`tasks`in t&&t.tasks===!0&&await cancelAllIndexedSessionTasksStep({serializedContext:this.stateCursor.serializedContext,sessionState:this.stateCursor.sessionState}),t.taskId!==void 0&&this.discardTaskDeliveries(t.taskId);let e=t.taskId!==void 0&&t.turnId!==void 0&&t.turnId!==this.expectedTurnId?void 0:t.turnId;if(e===void 0||e===this.expectedTurnId){let n=e===void 0?{tasks:t.tasks}:{tasks:t.tasks,turnId:e};this.abort(n)}}}discardTaskDeliveries(e){this.cancelledTaskIds.add(e);let t=this.bufferedDeliveries.filter(e=>!this.shouldDiscard(e));this.bufferedDeliveries.splice(0,this.bufferedDeliveries.length,...t)}originatesFromCancelledTask(e){return[...this.cancelledTaskIds].some(t=>e===t||e.startsWith(`${t}:`))}shouldDiscard(e){let t=e.taskDeliveryId??e.caller?.taskId;return t!==void 0&&this.originatesFromCancelledTask(t)}};function deliveryHasMessage(e){return e.payloads.some(e=>e.message!==void 0)}export{runInlineTurn};
1
+ import{activeTurnId}from"#harness/active-turn-id.js";import{readAcceptedDeploymentId}from"#execution/accepted-delivery-deployment.js";import{cancelAllIndexedSessionTasksStep}from"#execution/cancel-indexed-session-tasks-step.js";import{reportDroppedWirePayloadStep}from"#execution/report-dropped-wire-payload-step.js";import{SessionStateCursor}from"#execution/session-state-cursor.js";import{SessionInboxWireError,sessionInboxWire}from"#execution/wire/session-inbox-wire.js";import{turnStep}from"#execution/workflow-steps.js";import{TurnCancelledError}from"#harness/turn-cancellation.js";async function runInlineTurn(n){let r=readAcceptedDeploymentId(n.delivery);if(r===void 0)return{kind:`child`};let a=n.stateCursor??new SessionStateCursor({serializedContext:n.serializedContext,sessionState:n.sessionState}),o=new InlineTurnControl({bufferedDeliveries:n.bufferedDeliveries,bufferedSessionControls:n.bufferedSessionControls,cancelledTaskIds:n.cancelledTaskIds,commandInbox:n.commandInbox,expectedTurnId:activeTurnId(n.sessionState.emissionState),seenTaskDeliveries:n.seenTaskDeliveries,stateCursor:a}),s=n.delivery;for(;;){let e={serializedContext:a.serializedContext,sessionState:a.sessionState},t=await o.waitForStep(turnStep({abortSignal:o.signal,acceptedDeploymentId:r,input:s,parentWritable:n.parentWritable,serializedContext:a.serializedContext,sessionState:a.sessionState}));if(t.requiresChildDispatch===!0)return{initialCancellation:o.initialCancellation,kind:`child`};let i={beforeStep:e,result:t};if(o.initialCancellation!==void 0||t.action===`cancelled`||(t.backgroundTasks?.length??0)>0)return continueOutcome(o,i);if(t.action===`done`)return{action:{isError:t.isError,kind:`done`,output:t.output??``,serializedContext:t.serializedContext,sessionState:t.sessionState,usage:t.usage,usageDelta:t.usageDelta},kind:`result`};if(t.action===`dispatch-workflow-tasks`||t.action===`park`&&t.pendingCoordinationCallIds!==void 0)return continueOutcome(o,i);if(t.action===`park`)return t.hasPendingAuthorization||t.hasPendingInputBatch&&n.capabilities?.requestInput===!0||n.mode===`conversation`?{action:{authorizationAttemptIds:t.authorizationAttemptIds,authorizationNames:t.authorizationNames,kind:`park`,serializedContext:t.serializedContext,sessionState:t.sessionState,settled:t.settled},kind:`result`}:continueOutcome(o,i);let c=a.sessionState.continuationToken;a.adoptState(t),a.sessionState.continuationToken!==``&&a.sessionState.continuationToken!==c&&await n.commandInbox.rekeyContinuation(a.sessionState.continuationToken),s=void 0}}function continueOutcome(e,t){return{initialCancellation:e.initialCancellation,initialStep:t,kind:`continue`}}var InlineTurnControl=class{bufferedDeliveries;bufferedSessionControls;cancelledTaskIds;commandInbox;controller=new AbortController;expectedTurnId;seenTaskDeliveries;stateCursor;cancellation;constructor(e){this.bufferedDeliveries=e.bufferedDeliveries,this.bufferedSessionControls=e.bufferedSessionControls,this.cancelledTaskIds=e.cancelledTaskIds??new Set,this.commandInbox=e.commandInbox,this.expectedTurnId=e.expectedTurnId,this.seenTaskDeliveries=e.seenTaskDeliveries??new Set,this.stateCursor=e.stateCursor}get initialCancellation(){return this.cancellation}get signal(){return this.controller.signal}async waitForStep(e){let t=e.then(e=>({kind:`step`,result:e}));for(;;){let e=await Promise.race([t,this.commandInbox.next().then(e=>({kind:`command`,result:e}))]);if(e.kind===`step`)return e.result;if(e.result.done)throw Error(`Session command inbox closed before the inline turn step settled.`);this.commandInbox.consumeNext(),await this.handle(e.result.value)}}abort(e){this.controller.signal.aborted||(this.cancellation=e,this.controller.abort(new TurnCancelledError))}acceptTaskDelivery(e){let t=e.taskDeliveryId??e.caller?.taskId;return t===void 0?!0:this.originatesFromCancelledTask(t)||this.seenTaskDeliveries.has(t)?!1:(this.seenTaskDeliveries.add(t),!0)}async handle(e){if(e.kind===`runtime-action-result`)return;let t;try{t=sessionInboxWire.decode(e)}catch(e){if(!(e instanceof SessionInboxWireError))throw e;await reportDroppedWirePayloadStep({detail:e.message,family:`session-inbox`});return}if(t.kind===`deliver`){if(!this.acceptTaskDelivery(t))return;this.bufferedDeliveries.push(t),t.turnPolicy===`steer`&&deliveryHasMessage(t)&&this.abort({});return}if(t.kind===`clear`||t.kind===`compact`){this.bufferedSessionControls.push(t.kind);return}if(t.kind===`session-timeout`){this.bufferedSessionControls.push(`expired`);return}if(t.kind===`reset`){this.bufferedSessionControls.push(`reset`),this.abort({});return}if(t.kind===`cancel`){`tasks`in t&&t.tasks===!0&&await cancelAllIndexedSessionTasksStep({serializedContext:this.stateCursor.serializedContext,sessionState:this.stateCursor.sessionState}),t.taskId!==void 0&&this.discardTaskDeliveries(t.taskId);let e=t.taskId!==void 0&&t.turnId!==void 0&&t.turnId!==this.expectedTurnId?void 0:t.turnId;if(e===void 0||e===this.expectedTurnId){let n=e===void 0?{tasks:t.tasks}:{tasks:t.tasks,turnId:e};this.abort(n)}}}discardTaskDeliveries(e){this.cancelledTaskIds.add(e);let t=this.bufferedDeliveries.filter(e=>!this.shouldDiscard(e));this.bufferedDeliveries.splice(0,this.bufferedDeliveries.length,...t)}originatesFromCancelledTask(e){return[...this.cancelledTaskIds].some(t=>e===t||e.startsWith(`${t}:`))}shouldDiscard(e){let t=e.taskDeliveryId??e.caller?.taskId;return t!==void 0&&this.originatesFromCancelledTask(t)}};function deliveryHasMessage(e){return e.payloads.some(e=>e.message!==void 0)}export{runInlineTurn};
@@ -3,7 +3,7 @@ import type { WorkflowToolAuthorizationRequest, WorkflowToolRunRequestMessage }
3
3
  import type { WorkflowToolRunTaskInputRequest } from "./workflow.js";
4
4
  import type { AnswerHookRoute } from "#harness/proxy-input-requests.js";
5
5
  import type { ActivityEventV1 } from "#protocol/activity.js";
6
- import { type TaskInboundAnswerInput, type TaskInboundUpdate, type TaskView } from "#tasks/types.js";
6
+ import { type TaskInboundAnswerInput, type TaskInboundMessage, type TaskInboundUpdate, type TaskProgress, type TaskView } from "#tasks/types.js";
7
7
  /**
8
8
  * Appends one full task view to the owning task run's `eve.task`
9
9
  * stream. Only the task run workflow calls this, which is what makes
@@ -18,6 +18,10 @@ export declare function projectTaskActivity(input: {
18
18
  readonly settledAt: string;
19
19
  readonly view: TaskView;
20
20
  }): readonly ActivityEventV1[];
21
+ /** Appends task progress without starting a parent turn. */
22
+ export declare function appendTaskProgressStep(input: {
23
+ readonly progress: TaskProgress;
24
+ }): Promise<void>;
21
25
  /**
22
26
  * Wakes the parent session with a framework task notification.
23
27
  *
@@ -36,6 +40,12 @@ export declare function wakeTaskUpdateParentStep(input: {
36
40
  readonly update: TaskInboundUpdate;
37
41
  readonly view: TaskView;
38
42
  }): Promise<void>;
43
+ /** Delivers one task-authored message to the parent as a new turn. */
44
+ export declare function wakeTaskMessageParentStep(input: {
45
+ readonly message: TaskInboundMessage;
46
+ readonly taskId: string;
47
+ readonly token: string;
48
+ }): Promise<void>;
39
49
  /** Forwards one agent spawn or settlement request to the parent session. */
40
50
  export declare function wakeTaskAgentRequestParentStep(input: {
41
51
  readonly request: WorkflowToolRunRequestMessage;
@@ -1 +1 @@
1
- import{createLogger}from"#internal/logging.js";import{getWritable}from"#compiled/@workflow/core/index.js";import{resumeSessionInbox}from"#execution/wire/session-inbox-resume.js";import{resumeWorkflowToolRunAnswers}from"#execution/tools/workflow/answer.js";import{submitActivity}from"#execution/submit-activity.js";import{isTaskWorkflowTargetGone}from"#execution/tasks/workflow-target.js";import{TASK_VIEW_STREAM_NAMESPACE,isTerminalTaskStatus,taskAuthorizationRequestId}from"#tasks/types.js";const log=createLogger(`execution.tasks.run`);async function appendTaskViewStep(e){"use step";let n=getWritable({namespace:TASK_VIEW_STREAM_NAMESPACE}).getWriter();try{await n.write(e.view)}finally{n.releaseLock()}submitActivity({events:projectTaskActivity({activityObserver:e.activityObserver,settledAt:new Date().toISOString(),view:e.view}),sink:e.activityObserver?.sink})}function projectTaskActivity(e){let t=e.activityObserver?.workIdentity;if(t===void 0)return[];let n=e.view.status;return n===`working`?[{eventId:`${t.id}:started`,kind:`work.started`,startedAt:e.settledAt,work:t}]:n!==`completed`&&n!==`failed`&&n!==`cancelled`?[]:[{eventId:`${t.id}:settled:${n}`,kind:`work.settled`,outcome:n,settledAt:e.settledAt,workId:t.id}]}async function wakeTaskParentStep(e){"use step";let t={message:formatTaskNotification(e.view)};isTerminalTaskStatus(e.view.status)&&(t.task={views:[e.view]});let r={kind:`send`,payload:t,taskDeliveryId:`${e.view.taskId}:ready:${e.view.status}`};try{await resumeSessionInbox(e.token,r)}catch(t){if(isTaskWorkflowTargetGone(t)){log.warn(`task wake target is gone; the parent session already ended`,{status:e.view.status,taskId:e.view.taskId});return}throw t}}async function wakeTaskUpdateParentStep(e){"use step";let t={kind:`send`,payload:{message:`Background task ${e.view.taskId} (${e.view.metadata.name}) update: ${e.update.message}`},taskDeliveryId:`${e.view.taskId}:update:${e.update.updateEpoch}:${e.update.updateIndex}:${e.update.callId}`};try{await resumeSessionInbox(e.token,t)}catch(e){if(isTaskWorkflowTargetGone(e))return;throw e}}async function wakeTaskAgentRequestParentStep(e){"use step";let t=e.request.request;if(t.kind!==`agent-invoke`&&t.kind!==`agent-settled`)throw Error(`Cannot forward task input as an agent request.`);let r={replyTo:e.request.replyTo,request:t,taskId:e.taskId},i=t.kind===`agent-invoke`?t.invocationId:`${t.result.callId}:settled`,a={kind:`send`,payload:{task:{agentRequests:[r]}},taskDeliveryId:`${e.taskId}:agent:${e.request.from.runId}:${i}`};try{await resumeSessionInbox(e.token,a)}catch(e){if(!isTaskWorkflowTargetGone(e))throw e}}async function wakeTaskAuthorizationParentStep(e){"use step";let{event:t}=e.request,r=t.event.data,i={task:{authorizationEvents:[{hookPayload:t,taskId:e.taskId}]}};t.event.type===`authorization.required`&&(i.message=`Background task ${e.taskId} needs authorization.`);let a={kind:`send`,payload:i,taskDeliveryId:`${e.taskId}:authorization:${t.event.type}:${r.turnId}:${r.stepIndex}:${r.sequence}:${taskAuthorizationRequestId(t.event)}`};try{await resumeSessionInbox(e.token,a)}catch(e){if(!isTaskWorkflowTargetGone(e))throw e}}async function wakeWorkflowTaskInputRequestParentStep(e){"use step";let t={kind:`send`,payload:{task:{inputRequests:[e.request.requests===void 0?{replyTo:e.request.replyTo,request:e.request.request,sequence:e.request.sequence,stepIndex:e.request.stepIndex,taskId:e.taskId,turnId:e.request.turnId}:{replyTo:e.request.replyTo,requests:e.request.requests,sequence:e.request.sequence,stepIndex:e.request.stepIndex,taskId:e.taskId,turnId:e.request.turnId}]}},taskDeliveryId:`${e.taskId}:input:${e.request.turnId}:${e.request.stepIndex}:${e.request.sequence}`};try{await resumeSessionInbox(e.token,t)}catch(e){if(!isTaskWorkflowTargetGone(e))throw e}}async function deliverTaskInputResponsesStep(e){"use step";let t=new Set(e.requestIds),i={auth:e.answer.auth,kind:`send`,payload:{inputResponses:e.answer.inputResponses.filter(e=>t.has(e.requestId))},taskDeliveryId:`${e.answer.taskId}:${[...e.requestIds].sort().join(`,`)}`};try{if(e.answer.childResponseUrl!==void 0){let t=await fetch(e.answer.childResponseUrl,{body:JSON.stringify({inputResponses:i.payload.inputResponses}),headers:{"content-type":`application/json`},method:`POST`,redirect:`error`});if(t.status===404)return`unreachable`;if(!t.ok)throw Error(`Remote task input delivery failed with HTTP ${t.status}.`)}else e.answerHook===void 0?await resumeSessionInbox(e.answer.childContinuationToken,i):await resumeWorkflowToolRunAnswers(e.answer.childContinuationToken,i.payload.inputResponses);return`delivered`}catch(t){if(isTaskWorkflowTargetGone(t))return log.warn(`task input answer target is gone; the child turn already ended`,{taskId:e.answer.taskId}),`unreachable`;throw t}}function formatTaskNotification(e){let t=`Background task ${e.taskId} (${e.metadata.name})`;return e.status===`input_required`?`${t} needs input.`:e.status===`completed`?`${t} is completed.\n\nResult:\n${formatTaskOutput(e.lastOutput.data)}`:e.status===`failed`?`${t} failed.\n\nError:\n${formatTaskOutput(e.lastOutput.data)}`:`${t} is cancelled.`}function formatTaskOutput(e){return typeof e==`string`?e:JSON.stringify(e)??`null`}export{appendTaskViewStep,deliverTaskInputResponsesStep,formatTaskNotification,projectTaskActivity,wakeTaskAgentRequestParentStep,wakeTaskAuthorizationParentStep,wakeTaskParentStep,wakeTaskUpdateParentStep,wakeWorkflowTaskInputRequestParentStep};
1
+ import{createLogger}from"#internal/logging.js";import{getWritable}from"#compiled/@workflow/core/index.js";import{resumeSessionInbox}from"#execution/wire/session-inbox-resume.js";import{resumeWorkflowToolRunAnswers}from"#execution/tools/workflow/answer.js";import{submitActivity}from"#execution/submit-activity.js";import{isTaskWorkflowTargetGone}from"#execution/tasks/workflow-target.js";import{TASK_PROGRESS_STREAM_NAMESPACE,TASK_VIEW_STREAM_NAMESPACE,isTerminalTaskStatus,taskAuthorizationRequestId}from"#tasks/types.js";const log=createLogger(`execution.tasks.run`);async function appendTaskViewStep(e){"use step";let n=getWritable({namespace:TASK_VIEW_STREAM_NAMESPACE}).getWriter();try{await n.write(e.view)}finally{n.releaseLock()}submitActivity({events:projectTaskActivity({activityObserver:e.activityObserver,settledAt:new Date().toISOString(),view:e.view}),sink:e.activityObserver?.sink})}function projectTaskActivity(e){let t=e.activityObserver?.workIdentity;if(t===void 0)return[];let n=e.view.status;return n===`working`?[{eventId:`${t.id}:started`,kind:`work.started`,startedAt:e.settledAt,work:t}]:n!==`completed`&&n!==`failed`&&n!==`cancelled`?[]:[{eventId:`${t.id}:settled:${n}`,kind:`work.settled`,outcome:n,settledAt:e.settledAt,workId:t.id}]}async function appendTaskProgressStep(e){"use step";let n=getWritable({namespace:TASK_PROGRESS_STREAM_NAMESPACE}).getWriter();try{await n.write(e.progress)}finally{n.releaseLock()}}async function wakeTaskParentStep(e){"use step";let t={message:formatTaskNotification(e.view)};isTerminalTaskStatus(e.view.status)&&(t.task={views:[e.view]});let r={kind:`send`,payload:t,taskDeliveryId:`${e.view.taskId}:ready:${e.view.status}`};try{await resumeSessionInbox(e.token,r)}catch(t){if(isTaskWorkflowTargetGone(t)){log.warn(`task wake target is gone; the parent session already ended`,{status:e.view.status,taskId:e.view.taskId});return}throw t}}async function wakeTaskUpdateParentStep(e){"use step";let t={kind:`send`,payload:{message:`Background task ${e.view.taskId} (${e.view.metadata.name}) update: ${e.update.message}`},taskDeliveryId:`${e.view.taskId}:update:${e.update.updateEpoch}:${e.update.updateIndex}:${e.update.callId}`};try{await resumeSessionInbox(e.token,t)}catch(e){if(isTaskWorkflowTargetGone(e))return;throw e}}async function wakeTaskMessageParentStep(e){"use step";let t={kind:`send`,payload:{message:e.message.message},taskDeliveryId:`${e.taskId}:message:${e.message.messageEpoch}:${e.message.messageIndex}:${e.message.callId}`};try{await resumeSessionInbox(e.token,t)}catch(e){if(isTaskWorkflowTargetGone(e))return;throw e}}async function wakeTaskAgentRequestParentStep(e){"use step";let t=e.request.request;if(t.kind!==`agent-invoke`&&t.kind!==`agent-settled`)throw Error(`Cannot forward task input as an agent request.`);let r={replyTo:e.request.replyTo,request:t,taskId:e.taskId},i=t.kind===`agent-invoke`?t.invocationId:`${t.result.callId}:settled`,a={kind:`send`,payload:{task:{agentRequests:[r]}},taskDeliveryId:`${e.taskId}:agent:${e.request.from.runId}:${i}`};try{await resumeSessionInbox(e.token,a)}catch(e){if(!isTaskWorkflowTargetGone(e))throw e}}async function wakeTaskAuthorizationParentStep(e){"use step";let{event:t}=e.request,r=t.event.data,i={task:{authorizationEvents:[{hookPayload:t,taskId:e.taskId}]}};t.event.type===`authorization.required`&&(i.message=`Background task ${e.taskId} needs authorization.`);let a={kind:`send`,payload:i,taskDeliveryId:`${e.taskId}:authorization:${t.event.type}:${r.turnId}:${r.stepIndex}:${r.sequence}:${taskAuthorizationRequestId(t.event)}`};try{await resumeSessionInbox(e.token,a)}catch(e){if(!isTaskWorkflowTargetGone(e))throw e}}async function wakeWorkflowTaskInputRequestParentStep(e){"use step";let t={kind:`send`,payload:{task:{inputRequests:[e.request.requests===void 0?{replyTo:e.request.replyTo,request:e.request.request,sequence:e.request.sequence,stepIndex:e.request.stepIndex,taskId:e.taskId,turnId:e.request.turnId}:{replyTo:e.request.replyTo,requests:e.request.requests,sequence:e.request.sequence,stepIndex:e.request.stepIndex,taskId:e.taskId,turnId:e.request.turnId}]}},taskDeliveryId:`${e.taskId}:input:${e.request.turnId}:${e.request.stepIndex}:${e.request.sequence}`};try{await resumeSessionInbox(e.token,t)}catch(e){if(!isTaskWorkflowTargetGone(e))throw e}}async function deliverTaskInputResponsesStep(e){"use step";let t=new Set(e.requestIds),i={auth:e.answer.auth,kind:`send`,payload:{inputResponses:e.answer.inputResponses.filter(e=>t.has(e.requestId))},taskDeliveryId:`${e.answer.taskId}:${[...e.requestIds].sort().join(`,`)}`};try{if(e.answer.childResponseUrl!==void 0){let t=await fetch(e.answer.childResponseUrl,{body:JSON.stringify({inputResponses:i.payload.inputResponses}),headers:{"content-type":`application/json`},method:`POST`,redirect:`error`});if(t.status===404)return`unreachable`;if(!t.ok)throw Error(`Remote task input delivery failed with HTTP ${t.status}.`)}else e.answerHook===void 0?await resumeSessionInbox(e.answer.childContinuationToken,i):await resumeWorkflowToolRunAnswers(e.answer.childContinuationToken,i.payload.inputResponses);return`delivered`}catch(t){if(isTaskWorkflowTargetGone(t))return log.warn(`task input answer target is gone; the child turn already ended`,{taskId:e.answer.taskId}),`unreachable`;throw t}}function formatTaskNotification(e){let t=`Background task ${e.taskId} (${e.metadata.name})`;return e.status===`input_required`?`${t} needs input.`:e.status===`completed`?`${t} is completed.\n\nResult:\n${formatTaskOutput(e.lastOutput.data)}`:e.status===`failed`?`${t} failed.\n\nError:\n${formatTaskOutput(e.lastOutput.data)}`:`${t} is cancelled.`}function formatTaskOutput(e){return typeof e==`string`?e:JSON.stringify(e)??`null`}export{appendTaskProgressStep,appendTaskViewStep,deliverTaskInputResponsesStep,formatTaskNotification,projectTaskActivity,wakeTaskAgentRequestParentStep,wakeTaskAuthorizationParentStep,wakeTaskMessageParentStep,wakeTaskParentStep,wakeTaskUpdateParentStep,wakeWorkflowTaskInputRequestParentStep};
@@ -1 +1 @@
1
- import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{isReadyTaskStatus,isTerminalTaskStatus,readTaskInputRequestId}from"#tasks/types.js";import{appendTaskViewStep,deliverTaskInputResponsesStep,wakeTaskAgentRequestParentStep,wakeTaskAuthorizationParentStep,wakeTaskParentStep,wakeTaskUpdateParentStep,wakeWorkflowTaskInputRequestParentStep}from"#execution/tasks/child/steps.js";import{createWorkflowBodyRef,executeWorkflowBody}from"#execution/tools/workflow/body.js";import{deriveWorkflowToolRunOwner}from"#execution/tools/workflow/messages.js";import{createChannelReader,raceChannelReads}from"#execution/tools/workflow/owner-channels.js";import{openWorkflowToolRunOwnerChannels}from"#execution/tools/workflow/owner.js";import{workflowToolRunOutcomeToTaskCommand,workflowToolRunReportToTaskUpdate,workflowToolRunRequestToTaskInputRequest}from"#execution/tools/workflow/owner-inbox.js";import{applyTaskTransition}from"#tasks/transitions.js";async function taskRunWorkflow(a){"use workflow";let o=createHook({token:a.taskInboxToken}),c=openWorkflowToolRunOwnerChannels(a.taskInboxToken),l=[...c.readers,createChannelReader(`commands`,o)],u=!1,d=a.initialView,f=!1,p=!1,m,h=[],g=0,_={ownerRequests:[]},v=new Map,y=new AbortController,b,x=a.workflow===void 0;try{try{await claimHookOwnership(o),u=!0}catch(e){if(isHookConflictError(e))return;throw e}for(await appendTaskViewStep({activityObserver:a.activityObserver,view:d});!isFinished();){let e=await raceChannelReads(b===void 0?l:[...l,b]);if(e.channel===`body`){if(x=!0,b=void 0,e.next.done)continue;await applyPayload({command:workflowToolRunOutcomeToTaskCommand({from:createWorkflowBodyRef({...a.workflow,execution:`background`}),result:e.next.value}),kind:`task-command`}),d.status===`cancelled`&&f&&!p&&await wakeTaskParentStep({token:a.parentContinuationToken,view:d});continue}if(e.next.done)return;if(e.channel===`report`){await applyPayload(workflowToolRunReportToTaskUpdate(e.next.value,d.taskId,g++));continue}if(e.channel===`outcome`){await applyPayload({command:workflowToolRunOutcomeToTaskCommand(e.next.value),kind:`task-command`});continue}if(e.channel===`request`){let t=e.next.value,n=t.request.kind;if(n===`agent-invoke`||n===`agent-settled`||n===`authorization-request`){await handleOwnerRequest(t);continue}t.requestCoordinates===void 0&&v.set(t.replyTo,{runId:t.from.runId}),await applyPayload(workflowToolRunRequestToTaskInputRequest(t));continue}await applyPayload(e.next.value)}}finally{u&&(await c.dispose(),await disposeHook(o))}function isFinished(){return isTerminalTaskStatus(d.status)&&f&&x}async function handleUpdate(e){f&&!isTerminalTaskStatus(d.status)?await wakeTaskUpdateParentStep({token:a.parentContinuationToken,update:e,view:d}):h.push(e)}async function applyPayload(e){let t=e.kind===`task-command`&&e.command.kind===`ready`,n=e.kind===`task-command`&&e.command.kind===`reject-dispatch`;if((t||n)&&(f=!0),n&&(p=!0),(t||n)&&(n||isTerminalTaskStatus(d.status)?x=!0:a.workflow!==void 0&&b===void 0&&!x&&(b=createChannelReader(`body`,awaitBodyResult(executeWorkflowBody({...a.workflow,execution:`background`,owner:deriveWorkflowToolRunOwner(a.taskInboxToken)},y.signal)))),await flushPendingTraffic()),e.kind===`task-input-request`&&(m=e),e.kind===`task-update`){await handleUpdate(e);return}let r;if(e.kind===`input-response`)r=d.status===`input_required`?await resolveAnsweredCommand(d,e,v.get(e.childContinuationToken)):void 0;else if(e.kind===`task-input-request`)r={inputRequests:e.requests??[e.request],kind:`require-input`};else if(e.kind===`task-command`)r=e.command;else return;if(r===void 0)return;if(t&&isTerminalTaskStatus(d.status)){await flushUpdates(!0),await wakeTaskParentStep({token:a.parentContinuationToken,view:d});return}let o=d,s=applyTaskTransition(d,r);s.action===`accepted`&&(d=s.view,await appendTaskViewStep({activityObserver:a.activityObserver,view:d}),r.kind===`cancel`&&(y.abort(Error(`Task ${d.taskId} was cancelled.`)),b===void 0&&(x=!0)),isTerminalTaskStatus(d.status)||await flushUpdates(),m!==void 0&&f&&d.status===`input_required`?(await wakeWorkflowTaskInputRequestParentStep({request:m,taskId:d.taskId,token:a.parentContinuationToken}),m=void 0):!p&&f&&(r.kind!==`cancel`||x)&&(!isTerminalTaskStatus(o.status)&&isTerminalTaskStatus(d.status)||!isReadyTaskStatus(o.status)&&isReadyTaskStatus(d.status)&&m===void 0)&&await wakeTaskParentStep({token:a.parentContinuationToken,view:d}),d.status!==`input_required`&&(m=void 0))}async function flushUpdates(e=!1){if(!(!f||isTerminalTaskStatus(d.status)&&!e)){for(let e of h)await wakeTaskUpdateParentStep({token:a.parentContinuationToken,update:e,view:d});h=[]}}async function handleOwnerRequest(e){if(!(p||isTerminalTaskStatus(d.status))){if(!f){_.ownerRequests.push(e);return}await wakeTaskOwnerRequestParent(e)}}async function flushPendingTraffic(){if(!p)for(let e of _.ownerRequests)await wakeTaskOwnerRequestParent(e);_.ownerRequests.length=0}async function wakeTaskOwnerRequestParent(e){if(e.request.kind===`authorization-request`){await wakeTaskAuthorizationParentStep({request:e.request,taskId:d.taskId,token:a.parentContinuationToken});return}await wakeTaskAgentRequestParentStep({request:e,taskId:d.taskId,token:a.parentContinuationToken})}}async function*awaitBodyResult(e){yield await e}async function resolveAnsweredCommand(e,t,n){if(t.taskId!==e.taskId)return;let r=new Set(e.inputRequests.flatMap(e=>{let t=readTaskInputRequestId(e);return t===void 0?[]:[t]})),i=t.inputResponses.map(e=>e.requestId).filter(e=>r.has(e));if(i.length!==0)return await deliverTaskInputResponsesStep({answer:t,answerHook:n,requestIds:i})===`delivered`?{kind:`answered`,requestIds:i}:void 0}taskRunWorkflow.workflowId=`workflow//eve//taskRunWorkflow`;export{taskRunWorkflow};
1
+ import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,isHookConflictError}from"#execution/hook-ownership.js";import{isReadyTaskStatus,isTerminalTaskStatus,readTaskInputRequestId}from"#tasks/types.js";import{appendTaskProgressStep,appendTaskViewStep,deliverTaskInputResponsesStep,wakeTaskAgentRequestParentStep,wakeTaskAuthorizationParentStep,wakeTaskMessageParentStep,wakeTaskParentStep,wakeTaskUpdateParentStep,wakeWorkflowTaskInputRequestParentStep}from"#execution/tasks/child/steps.js";import{createWorkflowBodyRef,executeWorkflowBody}from"#execution/tools/workflow/body.js";import{createChannelReader,raceChannelReads}from"#execution/tools/workflow/owner-channels.js";import{openWorkflowToolRunOwnerInbox}from"#execution/tools/workflow/owner.js";import{workflowToolRunOutcomeToTaskCommand,workflowToolRunReportToTaskPayload,workflowToolRunRequestToTaskInputRequest}from"#execution/tools/workflow/owner-inbox.js";import{applyTaskTransition}from"#tasks/transitions.js";async function taskRunWorkflow(a){"use workflow";let s=createHook({token:a.taskInboxToken}),l=openWorkflowToolRunOwnerInbox(),u=[l.reader,createChannelReader(`commands`,s)],d=a.initialView,f=!1,p=!1,m,h=[],g=0,_={messages:[],ownerRequests:[]},v=new Map,y=new AbortController,b,x=a.workflow===void 0,S;try{await claimHookOwnership(s)}catch(e){if(isHookConflictError(e))return;throw e}for(await appendTaskViewStep({activityObserver:a.activityObserver,view:d});S!==void 0&&g>=S.reportCount&&(x=!0,await applyPayload({command:workflowToolRunOutcomeToTaskCommand({from:createWorkflowBodyRef({...a.workflow,execution:`background`}),result:S.outcome}),kind:`task-command`}),S=void 0,d.status===`cancelled`&&f&&!p&&await wakeTaskParentStep({token:a.parentContinuationToken,view:d})),!isFinished();){let e=await raceChannelReads(b===void 0?u:[...u,b]);if(e.channel===`body`){if(b=void 0,e.next.done)continue;S=e.next.value;continue}if(e.next.done)return;if(e.channel===`workflow`){let t=e.next.value;if(t.kind===`report`){await applyPayload(workflowToolRunReportToTaskPayload(t,d.taskId,g++));continue}if(t.kind===`outcome`){await applyPayload({command:workflowToolRunOutcomeToTaskCommand(t),kind:`task-command`});continue}let n=t,r=n.request.kind;if(r===`agent-invoke`||r===`agent-settled`||r===`authorization-request`){await handleOwnerRequest(n);continue}n.requestCoordinates===void 0&&v.set(n.replyTo,{runId:n.from.runId}),await applyPayload(workflowToolRunRequestToTaskInputRequest(n));continue}await applyPayload(e.next.value)}function isFinished(){return isTerminalTaskStatus(d.status)&&f&&x}async function handleUpdate(e){if(d.metadata.kind===`subagent`){if(p)return;f&&!isTerminalTaskStatus(d.status)?await wakeTaskUpdateParentStep({token:a.parentContinuationToken,update:e,view:d}):h.push(e);return}await appendTaskProgressStep({progress:{callId:e.callId,kind:`task-progress`,taskId:d.taskId,update:e.message,updateIndex:e.updateIndex}})}async function handleMessage(e){if(!(p||isTerminalTaskStatus(d.status))){if(!f){_.messages.push(e);return}await wakeTaskMessageParentStep({message:e,taskId:d.taskId,token:a.parentContinuationToken})}}async function applyPayload(e){let t=e.kind===`task-command`&&e.command.kind===`ready`,n=e.kind===`task-command`&&e.command.kind===`reject-dispatch`;if((t||n)&&(f=!0),n&&(p=!0),(t||n)&&(n||isTerminalTaskStatus(d.status)?x=!0:a.workflow!==void 0&&b===void 0&&S===void 0&&!x&&(b=createChannelReader(`body`,awaitBodyResult(executeWorkflowBody({...a.workflow,execution:`background`,owner:l.owner},y.signal)))),await flushPendingTraffic()),e.kind===`task-input-request`&&(m=e),e.kind===`task-message`){await handleMessage(e);return}if(e.kind===`task-update`){await handleUpdate(e);return}let o;if(e.kind===`input-response`)o=d.status===`input_required`?await resolveAnsweredCommand(d,e,v.get(e.childContinuationToken)):void 0;else if(e.kind===`task-input-request`)o={inputRequests:e.requests??[e.request],kind:`require-input`};else if(e.kind===`task-command`)o=e.command;else return;if(o===void 0)return;if(t&&isTerminalTaskStatus(d.status)){await flushUpdates(!0),await wakeTaskParentStep({token:a.parentContinuationToken,view:d});return}let s=d,c=applyTaskTransition(d,o);c.action===`accepted`&&(d=c.view,await appendTaskViewStep({activityObserver:a.activityObserver,view:d}),o.kind===`cancel`&&(y.abort(Error(`Task ${d.taskId} was cancelled.`)),b===void 0&&(x=!0)),isTerminalTaskStatus(d.status)||await flushUpdates(),m!==void 0&&f&&d.status===`input_required`?(await wakeWorkflowTaskInputRequestParentStep({request:m,taskId:d.taskId,token:a.parentContinuationToken}),m=void 0):!p&&f&&(o.kind!==`cancel`||x)&&(!isTerminalTaskStatus(s.status)&&isTerminalTaskStatus(d.status)||!isReadyTaskStatus(s.status)&&isReadyTaskStatus(d.status)&&m===void 0)&&await wakeTaskParentStep({token:a.parentContinuationToken,view:d}),d.status!==`input_required`&&(m=void 0))}async function flushUpdates(e=!1){if(!(!f||isTerminalTaskStatus(d.status)&&!e)){for(let e of h)await wakeTaskUpdateParentStep({token:a.parentContinuationToken,update:e,view:d});h=[]}}async function handleOwnerRequest(e){if(!(p||isTerminalTaskStatus(d.status))){if(!f){_.ownerRequests.push(e);return}await wakeTaskOwnerRequestParent(e)}}async function flushPendingTraffic(){if(!p){for(let e of _.messages)await wakeTaskMessageParentStep({message:e,taskId:d.taskId,token:a.parentContinuationToken});for(let e of _.ownerRequests)await wakeTaskOwnerRequestParent(e)}_.messages.length=0,_.ownerRequests.length=0}async function wakeTaskOwnerRequestParent(e){if(e.request.kind===`authorization-request`){await wakeTaskAuthorizationParentStep({request:e.request,taskId:d.taskId,token:a.parentContinuationToken});return}await wakeTaskAgentRequestParentStep({request:e,taskId:d.taskId,token:a.parentContinuationToken})}}async function*awaitBodyResult(e){yield await e}async function resolveAnsweredCommand(e,t,n){if(t.taskId!==e.taskId)return;let r=new Set(e.inputRequests.flatMap(e=>{let t=readTaskInputRequestId(e);return t===void 0?[]:[t]})),i=t.inputResponses.map(e=>e.requestId).filter(e=>r.has(e));if(i.length!==0)return await deliverTaskInputResponsesStep({answer:t,answerHook:n,requestIds:i})===`delivered`?{kind:`answered`,requestIds:i}:void 0}taskRunWorkflow.workflowId=`workflow//eve//taskRunWorkflow`;export{taskRunWorkflow};
@@ -1 +1 @@
1
- import{createEveCallbackRoutePath}from"#protocol/routes.js";import{sessionCommandHookToken}from"#execution/session-command-token.js";import{loadContext}from"#context/container.js";import{ActivityObserverKey}from"#context/keys.js";import{parseJsonValue}from"#shared/json.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{parseWorkflowToolInput}from"#execution/tools/workflow/background.js";import{getHarnessEmissionState}from"#harness/emission.js";import{deriveAgentOperationId}from"#subagents/handles/operation-id.js";import{getAgentHandleStore,writeHandles}from"#subagents/handles/store.js";import{recordSessionTask}from"#tasks/session-index.js";import{runStep}from"#context/run-step.js";import{activeTurnId}from"#harness/active-turn-id.js";import{AGENT_BUSY,AGENT_MISMATCH,AGENT_UNREACHABLE,formatAgentBusyMessage}from"#subagents/agent-handle-errors.js";import{isTurnCancellation}from"#harness/turn-cancellation.js";import{CallbackBaseUrlKey,isAuthorizationSignal}from"#harness/authorization.js";import{sendTaskCommand,sendTaskInboundPayload,startTaskRun,waitForTaskCommandOwner}from"#execution/tasks/parent/run-parent.js";import{applyTaskAgentHandleCommand}from"#subagents/handles/transitions.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{BackgroundToolExecutorKey}from"#harness/background-tools.js";import{deriveBackgroundTaskActivityObserver}from"#execution/activity-work.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{createTaskDelegated,isTaskDelegated}from"#tools/task.js";import{beginBackgroundTask,prepareBackgroundTask,rejectDelegatedDispatch}from"#execution/tasks/parent/delegate.js";import{projectSubagentTask}from"#execution/tasks/parent/subagent-task-projection.js";const IN_PROCESS_WORKFLOW_EXECUTOR={data:{},kind:`workflow-task`};function runBackgroundStep(e,t,n){return runStep(e,t,n,[backgroundToolExecutionProvider])}const backgroundToolExecutionProvider={key:BackgroundToolExecutorKey,create(e,t){return{value:new BackgroundToolExecutionScope(t)}},async commit(e,t){return await requireExecutionScope(e).commit(t)},async rollback(e,t){await requireExecutionScope(e).rollback(t)},decorateStepResult(e,t){return requireExecutionScope(e).decorate(t)}};function readRetainedBackgroundToolResult(e){let t=e.get(BackgroundToolExecutorKey);return t instanceof BackgroundToolExecutionScope?t.retainedResult():void 0}var BackgroundToolExecutionScope=class{executions=new Map;records=[];agentHandleSession;agentHandlesChanged=!1;retained=!1;initialSession;constructor(e){this.initialSession=e,this.agentHandleSession=e}execute(e){let t=this.executions.get(e.options.toolCallId);if(t!==void 0)return t;if(!e.batch.calls.some(t=>t.callId===e.options.toolCallId))throw Error(`Background tool call "${e.options.toolCallId}" was not registered before execution.`);let n=this.start(e);return this.executions.set(e.options.toolCallId,n),n}async readAgentViews(){return(getAgentHandleStore(this.agentHandleSession.state)?.handles??[]).flatMap(e=>e.phase===`reserved`?[]:e.phase===`available`?[{availability:`available`,id:e.identity.id,name:e.identity.name}]:e.phase===`claimed`?[{availability:`busy`,id:e.identity.id,name:e.identity.name,taskId:e.ownerId,taskStatus:`working`}]:[])}async commit(e){let t=this.records.filter(e=>!e.settled);return t.length>0&&await this.compensate(t,Error(`Background tool execution did not delegate or complete its task.`)),this.apply(e)}decorate(e){let t=this.resultFields();return t===void 0?e:{...e,...t}}async rollback(e){let t=this.records.filter(e=>e.settled),n=this.records.filter(e=>!e.settled);if(n.length>0&&await this.compensate(n,e),t.length!==0){if(isTurnCancellation(e)){this.retained=!0;return}await this.compensate(t,e)}}retainedResult(){return this.retained?this.resultFields():void 0}apply(e){let t=e;for(let e of this.records)!e.settled||e.task===void 0||(t=recordSessionTask(t,e.task));return this.agentHandlesChanged&&(t=writeHandles(t,getAgentHandleStore(this.agentHandleSession.state)?.handles??[])),t}resultFields(){let e=this.records.flatMap(e=>e.settled&&e.task!==void 0?[e.task]:[]);if(e.length!==0)return{backgroundTaskSession:this.apply(this.initialSession),backgroundTasks:e.map(({taskInboxToken:e,taskId:t,taskRunId:n})=>({taskInboxToken:e,taskId:t,taskRunId:n}))}}async start(t){let r={settled:!1};this.records.push(r);let a=getHarnessEmissionState(this.initialSession.state),o=loadContext(),c=await this.startTask({ctx:o,emission:a,input:t,record:r}),l=c.task;r.task=l;let u=o.get(CallbackBaseUrlKey),d={taskId:l.taskId,token:l.taskInboxToken,...u===void 0?{}:{url:createWorkflowCallbackUrl(u,createEveCallbackRoutePath(l.taskInboxToken))}},f={batch:t.batch.calls,binding:d,delegated:({executor:e,receipt:t})=>createTaskDelegated({binding:d,executor:e,receipt:t}),send:createTaskSender(l,t.options.toolCallId),session:this.initialSession,task:l};if(t.definition.workflowId!==void 0)return r.settled=!0,{...c.receipt,status:`working`,taskId:l.taskId};let p=t.definition.execute(t.toolInput,t.options,f);if(isAsyncIterable(p))throw Error(`Background tools cannot return AsyncIterable output.`);let m=await p;return isAuthorizationSignal(m)?m:isTaskDelegated(m)?(m.executor!==void 0&&(await deliverTaskCommand(l,{executor:m.executor,kind:`bind`}),r.task={...l,executor:m.executor}),r.settled=!0,c.receipt===void 0?m.receipt:{...m.receipt,...c.receipt}):(await deliverTaskCommand(l,{data:parseJsonValue(m),kind:`complete`}),r.settled=!0,m)}async startTask(e){let n=e.input.definition.workflowId===void 0?void 0:{...e.input.definition,workflowId:e.input.definition.workflowId},i=n===void 0?void 0:parseWorkflowToolInput(e.input.toolInput,e.input.definition.name),s=activeTurnId(e.emission),l=n?.resultKind===`subagent`&&i!==void 0?projectSubagentTask({ctx:e.ctx,input:i,name:e.input.definition.name,nodeId:n.nodeId??e.input.definition.name,taskInput:{callId:e.input.options.toolCallId,parentSessionId:this.initialSession.sessionId,parentTurnId:s}}):void 0;if(l!==void 0&&l.identity===void 0&&!hasAgentHandle(this.agentHandleSession,l.metadata.agentId)){let{agentId:t,...r}=i;i=r,l=projectSubagentTask({ctx:e.ctx,input:r,name:e.input.definition.name,nodeId:n.nodeId??e.input.definition.name,taskInput:{callId:e.input.options.toolCallId,parentSessionId:this.initialSession.sessionId,parentTurnId:s}})}let u=l?.metadata??{kind:`tool`,name:e.input.definition.name},d={activityObserver:deriveBackgroundTaskActivityObserver({activityObserver:e.ctx.get(ActivityObserverKey),callId:e.input.options.toolCallId,name:u.name,parentSessionId:this.initialSession.sessionId,parentTurnId:s,rootSessionId:this.initialSession.rootSessionId??this.initialSession.sessionId}),callId:e.input.options.toolCallId,metadata:u,parentSessionId:this.initialSession.sessionId,parentStepIndex:e.emission.stepIndex,parentTurnId:s,session:this.initialSession};if(n===void 0)return{task:await beginBackgroundTask({activityObserver:d.activityObserver,callId:d.callId,metadata:d.metadata,parentSessionId:d.parentSessionId,parentStepIndex:d.parentStepIndex,parentTurnId:d.parentTurnId,session:d.session})};if(i===void 0)throw Error(`Background workflow tool "${e.input.definition.name}" has no input.`);let f=prepareBackgroundTask(d);if(n.resultKind===`subagent`&&l!==void 0&&l.identity!==void 0){let t=l.identity;if(this.applyAgentHandleCommand({identity:t.identity,callId:d.callId,kind:`reserve`,operationId:t.operation.id,ownerId:f.taskId}).kind!==`ready`)throw Error(`Agent handle store rejected start operation "${t.operation.id}".`);e.record.reservation={agentId:t.identity.id,operationId:t.operation.id}}if(n.resultKind===`subagent`&&l!==void 0&&l.identity===void 0){let t=deriveAgentOperationId({callId:d.callId,parentSessionId:d.parentSessionId,parentTurnId:s}),n=this.applyAgentHandleCommand({agentId:l.metadata.agentId,callId:d.callId,expectedTarget:l.metadata.mode,invokedName:l.metadata.name,kind:`claim`,operationId:t,ownerId:f.taskId});readClaimedHandle(n)?e.record.claim={operationId:t,taskId:f.taskId}:throwAgentClaimError(l.metadata.agentId,n)}await startTaskRun({activityObserver:d.activityObserver,initialView:{metadata:f.metadata,status:`working`,taskId:f.taskId},parentContinuationToken:sessionCommandHookToken(this.initialSession.sessionId),taskInboxToken:f.taskInboxToken,workflow:{callId:d.callId,executeInput:n.executeInput?.(i),input:i,resultKind:n.resultKind,session:buildCallbackContext().session,stepIndex:e.emission.stepIndex,toolName:e.input.definition.name,workflowId:n.workflowId}});let m=await waitForTaskCommandOwner({taskInboxToken:f.taskInboxToken}),h={...f,executor:IN_PROCESS_WORKFLOW_EXECUTOR,taskRunId:m.runId};return e.record.task=h,n.resultKind!==`subagent`||l===void 0?{task:h}:(l.identity,{receipt:l.receipt,task:h})}applyAgentHandleCommand(e){let t=applyTaskAgentHandleCommand(this.agentHandleSession,e);return t.session!==this.agentHandleSession&&(this.agentHandleSession=t.session,this.agentHandlesChanged=!0),t.result}async compensate(e,t){let n=[];for(let r of e.toReversed()){if(r.task!==void 0)try{await rejectDelegatedDispatch({error:{code:`PARENT_STEP_FAILED`,message:t instanceof Error?t.message:String(t)},task:r.task})}catch(e){n.push(e)}r.claim!==void 0&&this.applyAgentHandleCommand({kind:`release-owner`,ownerId:r.claim.taskId}),r.reservation!==void 0&&r.task!==void 0&&this.applyAgentHandleCommand({agentId:r.reservation.agentId,kind:`remove`,ownerId:r.task.taskId})}if(n.length>0)throw AggregateError([t,...n],`Background tool execution failed and its tasks could not all be rejected.`,{cause:t})}};function hasAgentHandle(e,t){return getAgentHandleStore(e.state)?.handles.some(e=>e.identity.id===t)===!0}function requireExecutionScope(e){if(!(e instanceof BackgroundToolExecutionScope))throw Error(`The background tool executor is not owned by the task runtime.`);return e}async function deliverTaskCommand(e,t){if(await sendTaskCommand({command:t,taskInboxToken:e.taskInboxToken})!==`delivered`)throw Error(`Task run "${e.taskId}" did not accept "${t.kind}".`)}function createTaskSender(e,t){let n=0;return async r=>{if(r.kind!==`update`){await deliverTaskCommand(e,r);return}if(await sendTaskInboundPayload({payload:{callId:t,kind:`task-update`,message:r.message,updateEpoch:e.taskId,updateIndex:n++},taskInboxToken:e.taskInboxToken})!==`delivered`)throw Error(`Task run "${e.taskId}" did not accept "${r.kind}".`)}}function readClaimedHandle(e){return e.kind===`ready`&&e.handle?.phase===`claimed`}function throwAgentClaimError(e,t){throw t.kind===`mismatch`?Error(JSON.stringify({code:AGENT_MISMATCH,message:`Agent "${e}" no longer matches this subagent definition. Start a new agent instead.`})):t.kind===`busy`?Error(JSON.stringify({code:AGENT_BUSY,message:formatAgentBusyMessage({agentId:e,agentName:t.handle.identity.name,ownerId:`ownerId`in t.handle?t.handle.ownerId:void 0})})):Error(JSON.stringify({code:AGENT_UNREACHABLE,message:`Agent with id "${e}" is no longer reachable.`}))}export{backgroundToolExecutionProvider,readRetainedBackgroundToolResult,runBackgroundStep};
1
+ import{sessionCommandHookToken}from"#execution/session-command-token.js";import{loadContext}from"#context/container.js";import{ActivityObserverKey}from"#context/keys.js";import{parseJsonValue}from"#shared/json.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{parseWorkflowToolInput}from"#execution/tools/workflow/background.js";import{getHarnessEmissionState}from"#harness/emission.js";import{deriveAgentOperationId}from"#subagents/handles/operation-id.js";import{getAgentHandleStore,writeHandles}from"#subagents/handles/store.js";import{recordSessionTask}from"#tasks/session-index.js";import{runStep}from"#context/run-step.js";import{activeTurnId}from"#harness/active-turn-id.js";import{AGENT_BUSY,AGENT_MISMATCH,AGENT_UNREACHABLE,formatAgentBusyMessage}from"#subagents/agent-handle-errors.js";import{isTurnCancellation}from"#harness/turn-cancellation.js";import{isAuthorizationSignal}from"#harness/authorization.js";import{sendTaskCommand,sendTaskInboundPayload,startTaskRun,waitForTaskCommandOwner}from"#execution/tasks/parent/run-parent.js";import{applyTaskAgentHandleCommand}from"#subagents/handles/transitions.js";import{BackgroundToolExecutorKey}from"#harness/background-tools.js";import{deriveBackgroundTaskActivityObserver}from"#execution/activity-work.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{createTaskMessage,isTaskMessage}from"#tools/task.js";import{beginBackgroundTask,prepareBackgroundTask,rejectDelegatedDispatch}from"#execution/tasks/parent/delegate.js";import{projectSubagentTask}from"#execution/tasks/parent/subagent-task-projection.js";const IN_PROCESS_WORKFLOW_EXECUTOR={data:{},kind:`workflow-task`};function runBackgroundStep(e,t,n){return runStep(e,t,n,[backgroundToolExecutionProvider])}const backgroundToolExecutionProvider={key:BackgroundToolExecutorKey,create(e,t){return{value:new BackgroundToolExecutionScope(t)}},async commit(e,t){return await requireExecutionScope(e).commit(t)},async rollback(e,t){await requireExecutionScope(e).rollback(t)},decorateStepResult(e,t){return requireExecutionScope(e).decorate(t)}};function readRetainedBackgroundToolResult(e){let t=e.get(BackgroundToolExecutorKey);return t instanceof BackgroundToolExecutionScope?t.retainedResult():void 0}var BackgroundToolExecutionScope=class{executions=new Map;records=[];agentHandleSession;agentHandlesChanged=!1;retained=!1;initialSession;constructor(e){this.initialSession=e,this.agentHandleSession=e}execute(e){let t=this.executions.get(e.options.toolCallId);if(t!==void 0)return t;if(!e.batch.calls.some(t=>t.callId===e.options.toolCallId))throw Error(`Background tool call "${e.options.toolCallId}" was not registered before execution.`);let n=this.start(e);return this.executions.set(e.options.toolCallId,n),n}async readAgentViews(){return(getAgentHandleStore(this.agentHandleSession.state)?.handles??[]).flatMap(e=>e.phase===`reserved`?[]:e.phase===`available`?[{availability:`available`,id:e.identity.id,name:e.identity.name}]:e.phase===`claimed`?[{availability:`busy`,id:e.identity.id,name:e.identity.name,taskId:e.ownerId,taskStatus:`working`}]:[])}async commit(e){let t=this.records.filter(e=>!e.settled);return t.length>0&&await this.compensate(t,Error(`Background tool execution did not delegate or complete its task.`)),this.apply(e)}decorate(e){let t=this.resultFields();return t===void 0?e:{...e,...t}}async rollback(e){let t=this.records.filter(e=>e.settled),n=this.records.filter(e=>!e.settled);if(n.length>0&&await this.compensate(n,e),t.length!==0){if(isTurnCancellation(e)){this.retained=!0;return}await this.compensate(t,e)}}retainedResult(){return this.retained?this.resultFields():void 0}apply(e){let t=e;for(let e of this.records)!e.settled||e.task===void 0||(t=recordSessionTask(t,e.task));return this.agentHandlesChanged&&(t=writeHandles(t,getAgentHandleStore(this.agentHandleSession.state)?.handles??[])),t}resultFields(){let e=this.records.flatMap(e=>e.settled&&e.task!==void 0?[e.task]:[]);if(e.length!==0)return{backgroundTaskSession:this.apply(this.initialSession),backgroundTasks:e.map(({taskInboxToken:e,taskId:t,taskRunId:n})=>({taskInboxToken:e,taskId:t,taskRunId:n}))}}async start(e){let n={settled:!1};this.records.push(n);let i=getHarnessEmissionState(this.initialSession.state),a=loadContext(),s=await this.startTask({ctx:a,emission:i,input:e,record:n}),c=s.task;n.task=c;let l={binding:{taskId:c.taskId,token:c.taskInboxToken},postMessage:createTaskMessage,send(){throw Error(`task.send() was replaced by yielded task descriptors.`)},session:this.initialSession,task:c,taskId:c.taskId};if(e.definition.workflowId!==void 0)return n.settled=!0,{...s.receipt,status:`working`,taskId:c.taskId};let u=e.definition.execute(e.toolInput,e.options,l),d=isAsyncIterable(u)?await executeBackgroundIterable({callId:e.options.toolCallId,output:u,task:c}):await u;return isAuthorizationSignal(d)?d:(await deliverTaskCommand(c,{data:parseJsonValue(d),kind:`complete`}),n.settled=!0,{status:`working`,taskId:c.taskId})}async startTask(t){let r=t.input.definition.workflowId===void 0?void 0:{...t.input.definition,workflowId:t.input.definition.workflowId},o=r===void 0?void 0:parseWorkflowToolInput(t.input.toolInput,t.input.definition.name),c=activeTurnId(t.emission),l=r?.resultKind===`subagent`&&o!==void 0?projectSubagentTask({ctx:t.ctx,input:o,name:t.input.definition.name,nodeId:r.nodeId??t.input.definition.name,taskInput:{callId:t.input.options.toolCallId,parentSessionId:this.initialSession.sessionId,parentTurnId:c}}):void 0;if(l!==void 0&&l.identity===void 0&&!hasAgentHandle(this.agentHandleSession,l.metadata.agentId)){let{agentId:e,...n}=o;o=n,l=projectSubagentTask({ctx:t.ctx,input:n,name:t.input.definition.name,nodeId:r.nodeId??t.input.definition.name,taskInput:{callId:t.input.options.toolCallId,parentSessionId:this.initialSession.sessionId,parentTurnId:c}})}let u=l?.metadata??{kind:`tool`,name:t.input.definition.name},d={activityObserver:deriveBackgroundTaskActivityObserver({activityObserver:t.ctx.get(ActivityObserverKey),callId:t.input.options.toolCallId,name:u.name,parentSessionId:this.initialSession.sessionId,parentTurnId:c,rootSessionId:this.initialSession.rootSessionId??this.initialSession.sessionId}),callId:t.input.options.toolCallId,metadata:u,parentSessionId:this.initialSession.sessionId,parentStepIndex:t.emission.stepIndex,parentTurnId:c,session:this.initialSession};if(r===void 0)return{task:await beginBackgroundTask({activityObserver:d.activityObserver,callId:d.callId,metadata:d.metadata,parentSessionId:d.parentSessionId,parentStepIndex:d.parentStepIndex,parentTurnId:d.parentTurnId,session:d.session})};if(o===void 0)throw Error(`Background workflow tool "${t.input.definition.name}" has no input.`);let f=prepareBackgroundTask(d);if(r.resultKind===`subagent`&&l!==void 0&&l.identity!==void 0){let e=l.identity;if(this.applyAgentHandleCommand({identity:e.identity,callId:d.callId,kind:`reserve`,operationId:e.operation.id,ownerId:f.taskId}).kind!==`ready`)throw Error(`Agent handle store rejected start operation "${e.operation.id}".`);t.record.reservation={agentId:e.identity.id,operationId:e.operation.id}}if(r.resultKind===`subagent`&&l!==void 0&&l.identity===void 0){let e=deriveAgentOperationId({callId:d.callId,parentSessionId:d.parentSessionId,parentTurnId:c}),n=this.applyAgentHandleCommand({agentId:l.metadata.agentId,callId:d.callId,expectedTarget:l.metadata.mode,invokedName:l.metadata.name,kind:`claim`,operationId:e,ownerId:f.taskId});readClaimedHandle(n)?t.record.claim={operationId:e,taskId:f.taskId}:throwAgentClaimError(l.metadata.agentId,n)}await startTaskRun({activityObserver:d.activityObserver,initialView:{metadata:f.metadata,status:`working`,taskId:f.taskId},parentContinuationToken:sessionCommandHookToken(this.initialSession.sessionId),taskInboxToken:f.taskInboxToken,workflow:{callId:d.callId,executeInput:r.executeInput?.(o),input:o,resultKind:r.resultKind,session:buildCallbackContext().session,stepIndex:t.emission.stepIndex,toolName:t.input.definition.name,taskId:f.taskId,workflowId:r.workflowId}});let p=await waitForTaskCommandOwner({taskInboxToken:f.taskInboxToken}),m={...f,executor:IN_PROCESS_WORKFLOW_EXECUTOR,taskRunId:p.runId};return t.record.task=m,r.resultKind!==`subagent`||l===void 0?{task:m}:(l.identity,{receipt:l.receipt,task:m})}applyAgentHandleCommand(e){let t=applyTaskAgentHandleCommand(this.agentHandleSession,e);return t.session!==this.agentHandleSession&&(this.agentHandleSession=t.session,this.agentHandlesChanged=!0),t.result}async compensate(e,t){let n=[];for(let r of e.toReversed()){if(r.task!==void 0)try{await rejectDelegatedDispatch({error:{code:`PARENT_STEP_FAILED`,message:t instanceof Error?t.message:String(t)},task:r.task})}catch(e){n.push(e)}r.claim!==void 0&&this.applyAgentHandleCommand({kind:`release-owner`,ownerId:r.claim.taskId}),r.reservation!==void 0&&r.task!==void 0&&this.applyAgentHandleCommand({agentId:r.reservation.agentId,kind:`remove`,ownerId:r.task.taskId})}if(n.length>0)throw AggregateError([t,...n],`Background tool execution failed and its tasks could not all be rejected.`,{cause:t})}};async function executeBackgroundIterable(e){let t=e.output[Symbol.asyncIterator](),n=0,r=await t.next();for(;!r.done;){let i=isTaskMessage(r.value)?{callId:e.callId,kind:`task-message`,message:r.value.message,messageEpoch:e.task.taskId,messageIndex:n++}:{callId:e.callId,kind:`task-update`,message:typeof r.value==`string`?r.value:JSON.stringify(r.value),updateEpoch:e.task.taskId,updateIndex:n++};if(await sendTaskInboundPayload({payload:i,taskInboxToken:e.task.taskInboxToken})!==`delivered`)throw Error(`Task run "${e.task.taskId}" did not accept "${i.kind}".`);r=await t.next()}return r.value??null}function hasAgentHandle(e,t){return getAgentHandleStore(e.state)?.handles.some(e=>e.identity.id===t)===!0}function requireExecutionScope(e){if(!(e instanceof BackgroundToolExecutionScope))throw Error(`The background tool executor is not owned by the task runtime.`);return e}async function deliverTaskCommand(e,t){if(await sendTaskCommand({command:t,taskInboxToken:e.taskInboxToken})!==`delivered`)throw Error(`Task run "${e.taskId}" did not accept "${t.kind}".`)}function readClaimedHandle(e){return e.kind===`ready`&&e.handle?.phase===`claimed`}function throwAgentClaimError(e,t){throw t.kind===`mismatch`?Error(JSON.stringify({code:AGENT_MISMATCH,message:`Agent "${e}" no longer matches this subagent definition. Start a new agent instead.`})):t.kind===`busy`?Error(JSON.stringify({code:AGENT_BUSY,message:formatAgentBusyMessage({agentId:e,agentName:t.handle.identity.name,ownerId:`ownerId`in t.handle?t.handle.ownerId:void 0})})):Error(JSON.stringify({code:AGENT_UNREACHABLE,message:`Agent with id "${e}" is no longer reachable.`}))}export{backgroundToolExecutionProvider,readRetainedBackgroundToolResult,runBackgroundStep};
@@ -1 +1 @@
1
- import{sleep}from"#compiled/@workflow/core/index.js";async function executeSleepTool(e){"use workflow";return await sleep(Math.ceil(e.seconds*1e3)),{waitedSeconds:e.seconds}}executeSleepTool.workflowId=`workflow//eve@0.51.1//executeSleepTool`;export{executeSleepTool};
1
+ import{sleep}from"#compiled/@workflow/core/index.js";async function executeSleepTool(e){"use workflow";return await sleep(Math.ceil(e.seconds*1e3)),{waitedSeconds:e.seconds}}executeSleepTool.workflowId=`workflow//eve@0.52.0//executeSleepTool`;export{executeSleepTool};
@@ -2,6 +2,7 @@ import type { RuntimeActionResultHookPayload, SubagentAuthorizationEventHookPayl
2
2
  import type { RuntimeSubagentChildResult, RuntimeSubagentResult } from "#shared/action-types.js";
3
3
  import type { JsonValue } from "#shared/json.js";
4
4
  import type { JsonObject } from "#shared/json.js";
5
+ import type { AgentInput } from "#tools/workflow-definition.js";
5
6
  import type { ToolContext } from "#tools/definition.js";
6
7
  import type { TaskInboundUpdate } from "#tasks/types.js";
7
8
  export type InternalAgentInput = {
@@ -10,13 +11,6 @@ export type InternalAgentInput = {
10
11
  readonly outputSchema?: JsonObject;
11
12
  readonly target: string;
12
13
  };
13
- export interface AgentInput {
14
- readonly agentId?: string;
15
- readonly key: string;
16
- readonly message: string;
17
- readonly outputSchema?: JsonObject;
18
- readonly target: string;
19
- }
20
14
  /**
21
15
  * Asks the owning session to spawn an agent for a workflow tool run. Spawning
22
16
  * needs owner-held material (auth, capabilities, admission, the agent handle
@@ -1 +1 @@
1
- import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook}from"#execution/hook-ownership.js";import{readWorkflowToolRunAdmission,readWorkflowToolRunOwner,readWorkflowToolRunRef}from"#execution/tools/workflow/ask.js";import{resumeHookStep}from"#execution/tools/workflow/resume-hook-step.js";const AGENT_INVOCATION_IDS=Symbol.for(`eve.workflow-tool-run.agent-invocation-ids`);async function agent(e,t){return validateAgentInput(t,!0),await invokeAgent(e,{agentId:t.agentId,message:t.message,outputSchema:t.outputSchema,target:t.target},{invocationId:`${e.callId}:${t.key}`})}async function invokeAgent(i,a,o){validateAgentInput(a,!1);let s=readWorkflowToolRunRef(i),c=readWorkflowToolRunOwner(i),l=readWorkflowToolRunAdmission(i);claimInvocationId(i,o.invocationId);let u=createHook(),d=!1;try{if(await claimHookOwnership(u),d=!0,l!==void 0){let e=await l;if(e.status===`rejected`)throw Error(e.reason)}await resumeHookStep(c.request,{from:s,replyTo:u.token,request:{input:a,invocationId:o.invocationId,kind:`agent-invoke`}});let e=u[Symbol.asyncIterator]();for(;;){let t=await nextAgentReply(e,i.abortSignal);if(t.done)break;let n=t.value;if(n.kind===`runtime-action-result`){let e=n.results.find(e=>e.kind===`subagent-result`&&e.callId===o.invocationId);if(e!==void 0){if(e.origin===`child`&&await resumeHookStep(c.request,{from:s,replyTo:u.token,request:{kind:`agent-settled`,result:e}}),o.returnResult===!0&&s.execution===`blocking`)return e;if(e.isError===!0)throw e.output;return e.output}continue}if(n.kind===`subagent-input-request`){await resumeHookStep(c.request,{from:s,replyTo:n.childContinuationToken,request:{kind:`input-batch`,requests:n.event.requests},requestCoordinates:{sequence:n.event.sequence,stepIndex:n.event.stepIndex,turnId:n.event.turnId}});continue}if(n.kind===`task-update`){await resumeHookStep(c.report,{from:s,update:n.message});continue}await resumeHookStep(c.request,{from:s,replyTo:u.token,request:{event:n,kind:`authorization-request`}})}}finally{if(d)try{await disposeHook(u)}catch{}}throw Error(`Agent "${a.target}" closed without a result.`)}async function nextAgentReply(e,t){if(t===void 0)return await e.next();if(t.aborted)throw t.reason;let n,r=new Promise((e,t)=>{n=t}),abort=()=>n?.(t.reason);t.addEventListener(`abort`,abort,{once:!0});try{return await Promise.race([e.next(),r])}finally{t.removeEventListener(`abort`,abort)}}function validateAgentInput(e,t){if(t&&(typeof e.key!=`string`||e.key.trim()===``))throw TypeError("agent() requires a non-empty `key`.");if(typeof e.target!=`string`||e.target.trim()===``)throw TypeError("agent() requires a non-empty `target`.");if(typeof e.message!=`string`||e.message.trim()===``)throw TypeError("agent() requires a non-empty `message`.")}function claimInvocationId(e,t){let n=e,r=n[AGENT_INVOCATION_IDS]??new Set;if(r.has(t)){let e=t.lastIndexOf(`:`),n=e<0?t:t.slice(e+1);throw TypeError(`agent() invocation key "${n}" was already used in this run; keys must be unique per run.`)}r.add(t),n[AGENT_INVOCATION_IDS]===void 0&&Object.defineProperty(n,AGENT_INVOCATION_IDS,{enumerable:!1,value:r})}export{agent,invokeAgent,validateAgentInput};
1
+ import{createHook}from"#compiled/@workflow/core/index.js";import{disposeHook}from"#execution/hook-ownership.js";import{readWorkflowToolRunAdmission,readWorkflowToolRunOwner,readWorkflowToolRunRef}from"#execution/tools/workflow/ask.js";import{resumeHookStep}from"#execution/tools/workflow/resume-hook-step.js";const AGENT_INVOCATION_IDS=Symbol.for(`eve.workflow-tool-run.agent-invocation-ids`);async function agent(e,t){return validateAgentInput(t,!0),readWorkflowToolRunRef(e),await invokeAgent(e,{agentId:t.agentId,message:t.message,outputSchema:t.outputSchema,target:t.target},{invocationId:`${e.callId}:${t.key}`})}async function invokeAgent(i,a,o){validateAgentInput(a,!1);let s=readWorkflowToolRunRef(i),c=readWorkflowToolRunOwner(i),l=readWorkflowToolRunAdmission(i);if(claimInvocationId(i,o.invocationId),l!==void 0){let e=await l;if(e.status===`rejected`)throw Error(e.reason)}let u=createHook();try{await resumeHookStep(c.inbox,{kind:`request`,from:s,replyTo:u.token,request:{input:a,invocationId:o.invocationId,kind:`agent-invoke`}});let e=u[Symbol.asyncIterator]();for(;;){let t=await nextAgentReply(e,i.abortSignal);if(t.done)break;let n=t.value;if(n.kind===`runtime-action-result`){let e=n.results.find(e=>e.kind===`subagent-result`&&e.callId===o.invocationId);if(e!==void 0){if(e.origin===`child`&&await resumeHookStep(c.inbox,{kind:`request`,from:s,replyTo:u.token,request:{kind:`agent-settled`,result:e}}),o.returnResult===!0&&s.execution===`blocking`)return e;if(e.isError===!0)throw e.output;return e.output}continue}if(n.kind===`subagent-input-request`){await resumeHookStep(c.inbox,{kind:`request`,from:s,replyTo:n.childContinuationToken,request:{kind:`input-batch`,requests:n.event.requests},requestCoordinates:{sequence:n.event.sequence,stepIndex:n.event.stepIndex,turnId:n.event.turnId}});continue}if(n.kind===`task-update`){await resumeHookStep(c.inbox,{kind:`report`,from:s,update:n.message});continue}await resumeHookStep(c.inbox,{kind:`request`,from:s,replyTo:u.token,request:{event:n,kind:`authorization-request`}})}}finally{try{await disposeHook(u)}catch{}}throw Error(`Agent "${a.target}" closed without a result.`)}async function nextAgentReply(e,t){if(t===void 0)return await e.next();if(t.aborted)throw t.reason;let n,r=new Promise((e,t)=>{n=t}),abort=()=>n?.(t.reason);t.addEventListener(`abort`,abort,{once:!0});try{return await Promise.race([e.next(),r])}finally{t.removeEventListener(`abort`,abort)}}function validateAgentInput(e,t){if(t&&(typeof e.key!=`string`||e.key.trim()===``))throw TypeError("agent() requires a non-empty `key`.");if(typeof e.target!=`string`||e.target.trim()===``)throw TypeError("agent() requires a non-empty `target`.");if(typeof e.message!=`string`||e.message.trim()===``)throw TypeError("agent() requires a non-empty `message`.")}function claimInvocationId(e,t){let n=e,r=n[AGENT_INVOCATION_IDS]??new Set;if(r.has(t)){let e=t.lastIndexOf(`:`),n=e<0?t:t.slice(e+1);throw TypeError(`agent() invocation key "${n}" was already used in this run; keys must be unique per run.`)}r.add(t),n[AGENT_INVOCATION_IDS]===void 0&&Object.defineProperty(n,AGENT_INVOCATION_IDS,{enumerable:!1,value:r})}export{agent,invokeAgent,validateAgentInput};
@@ -9,11 +9,10 @@ interface WorkflowToolRunContext {
9
9
  readonly status: "rejected";
10
10
  readonly reason: string;
11
11
  }>;
12
- answerSeq: number;
13
12
  readonly from: WorkflowToolRunRef;
14
13
  readonly owner: WorkflowToolRunOwner;
15
14
  }
16
- export declare function attachWorkflowToolRunContext(ctx: ToolContext, context: Omit<WorkflowToolRunContext, "answerSeq">): void;
15
+ export declare function attachWorkflowToolRunContext(ctx: ToolContext, context: WorkflowToolRunContext): void;
17
16
  export declare function readWorkflowToolRunRef(ctx: ToolContext): WorkflowToolRunRef;
18
17
  export declare function readWorkflowToolRunOwner(ctx: ToolContext): WorkflowToolRunOwner;
19
18
  export declare function readWorkflowToolRunAdmission(ctx: ToolContext): WorkflowToolRunContext["admission"];
@@ -1 +1 @@
1
- import{createHook}from"#compiled/@workflow/core/index.js";import{workflowToolRunAnswerToken}from"#harness/workflow-tool-runs.js";import{resumeHookStep}from"#execution/tools/workflow/resume-hook-step.js";const WORKFLOW_TOOL_RUN_CONTEXT=Symbol.for(`eve.workflow-tool-run.context`);function attachWorkflowToolRunContext(e,t){Object.defineProperty(e,WORKFLOW_TOOL_RUN_CONTEXT,{enumerable:!1,value:{...t,answerSeq:0}})}function readWorkflowToolRunContext(e){let t=e[WORKFLOW_TOOL_RUN_CONTEXT];if(t===void 0)throw Error(`This function must be called with the context of a workflow tool body ("use workflow").`);return t}function readWorkflowToolRunRef(e){return readWorkflowToolRunContext(e).from}function readWorkflowToolRunOwner(e){return readWorkflowToolRunContext(e).owner}function readWorkflowToolRunAdmission(e){return readWorkflowToolRunContext(e).admission}function ask(n,r){let i=readWorkflowToolRunContext(n),a=createHook({token:workflowToolRunAnswerToken(i.from.runId,i.answerSeq++)});return resumeHookStep(i.owner.request,{from:i.from,replyTo:a.token,request:{kind:`ask`,request:r}}),a}export{ask,attachWorkflowToolRunContext,readWorkflowToolRunAdmission,readWorkflowToolRunOwner,readWorkflowToolRunRef};
1
+ import{workflowToolContextErrorMessage}from"#shared/workflow-tool-context.js";import{createHook}from"#compiled/@workflow/core/index.js";import{resumeHookStep}from"#execution/tools/workflow/resume-hook-step.js";const WORKFLOW_TOOL_RUN_CONTEXT=Symbol.for(`eve.workflow-tool-run.context`);function attachWorkflowToolRunContext(e,t){Object.defineProperty(e,WORKFLOW_TOOL_RUN_CONTEXT,{enumerable:!1,value:t})}function readWorkflowToolRunContext(t,n){let i=t?.[WORKFLOW_TOOL_RUN_CONTEXT];if(i===void 0)throw Error(workflowToolContextErrorMessage(n));return i}function readWorkflowToolRunRef(e){return readWorkflowToolRunContext(e,`agent`).from}function readWorkflowToolRunOwner(e){return readWorkflowToolRunContext(e,`agent`).owner}function readWorkflowToolRunAdmission(e){return readWorkflowToolRunContext(e,`agent`).admission}function ask(e,r){let i=readWorkflowToolRunContext(e,`ask`),a=createHook();return resumeHookStep(i.owner.inbox,{kind:`request`,from:i.from,replyTo:a.token,request:{kind:`ask`,request:r}}),a}export{ask,attachWorkflowToolRunContext,readWorkflowToolRunAdmission,readWorkflowToolRunOwner,readWorkflowToolRunRef};
@@ -8,17 +8,22 @@ export interface WorkflowBodyDefinition {
8
8
  readonly resultKind?: "subagent" | "tool";
9
9
  readonly session: SessionContext["session"];
10
10
  readonly stepIndex: number;
11
+ readonly taskId?: string;
11
12
  readonly toolName: string;
12
13
  readonly workflowId: string;
13
14
  }
14
15
  export interface WorkflowBodyInput extends WorkflowBodyDefinition {
15
16
  readonly owner: WorkflowToolRunOwner;
16
17
  }
18
+ export interface WorkflowBodyResult {
19
+ readonly outcome: WorkflowToolRunOutcome;
20
+ readonly reportCount: number;
21
+ }
17
22
  /** Executes one registered workflow body and reports progress to its owner. */
18
23
  export declare function executeWorkflowBody(input: WorkflowBodyInput & {
19
24
  readonly execution: "background" | "blocking";
20
25
  readonly runId?: string;
21
- }, signal: AbortSignal): Promise<WorkflowToolRunOutcome>;
26
+ }, signal: AbortSignal): Promise<WorkflowBodyResult>;
22
27
  export declare function createWorkflowBodyRef(input: WorkflowBodyDefinition & {
23
28
  readonly execution: "background" | "blocking";
24
29
  readonly runId?: string;
@@ -1 +1 @@
1
- import{getWorkflowMetadata}from"#compiled/@workflow/core/index.js";import"#execution/tools/workflow/messages.js";import{attachWorkflowToolRunContext}from"#execution/tools/workflow/ask.js";import{resumeHookStep}from"#execution/tools/workflow/resume-hook-step.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{readRegisteredWorkflow}from"#execution/workflow-registry.js";async function executeWorkflowBody(e,i){let a=createWorkflowBodyRef(e),o=createWorkflowBodyContext(e,i);attachWorkflowToolRunContext(o,{from:a,owner:e.owner});try{let t=resolveWorkflowToolExecute(e)(e.executeInput??e.input,o),r;if(!isAsyncIterable(t))r=await t;else{let i=t[Symbol.asyncIterator](),o,s=await i.next();for(;s.done!==!0;){o=s.value;let t={from:a,update:s.value};await resumeHookStep(e.owner.report,t),s=await i.next()}r=s.value??o??null}return{output:r,status:`completed`}}catch(e){return i.aborted?{reason:i.reason instanceof Error?i.reason.message:String(i.reason??``),status:`cancelled`}:{error:normalizeSerializableError(e),status:`failed`}}}function createWorkflowBodyRef(t){return{callId:t.callId,execution:t.execution,input:t.input,resultKind:t.resultKind,runId:t.runId??getWorkflowMetadata().workflowRunId,sequence:t.session.turn.sequence,stepIndex:t.stepIndex,toolName:t.toolName,turnId:t.session.turn.id}}function resolveWorkflowToolExecute(e){let t=readRegisteredWorkflow(e.workflowId);if(typeof t!=`function`)throw Error(`Tool "${e.toolName}" is not registered as a workflow in this deployment (${e.workflowId}). The tool was renamed or removed after this run started.`);return t}function createWorkflowBodyContext(e,t){let unavailable=(t,n)=>{throw Error(`ctx.${t} is not available inside a workflow tool; ${n}. Tool "${e.toolName}" runs as a durable workflow body, which only replays deterministic code.`)};return{abortSignal:t,callId:e.callId,getSandbox:()=>unavailable(`getSandbox()`,`the session sandbox belongs to the turn`),getSkill:()=>unavailable(`getSkill()`,`skills are read through the session sandbox`),getToken:()=>unavailable(`getToken()`,`read credentials from the environment inside a "use step" helper`),requireAuth:()=>unavailable(`requireAuth()`,`a workflow body cannot park on authorization`),session:e.session,toolName:e.toolName}}function isAsyncIterable(e){return typeof e==`object`&&!!e&&typeof e[Symbol.asyncIterator]==`function`}export{createWorkflowBodyRef,executeWorkflowBody};
1
+ import{getWorkflowMetadata}from"#compiled/@workflow/core/index.js";import{createTaskMessage}from"#tools/task.js";import{ask,attachWorkflowToolRunContext}from"#execution/tools/workflow/ask.js";import{resumeHookStep}from"#execution/tools/workflow/resume-hook-step.js";import{agent}from"#execution/tools/subagent/invoke-agent.js";import"#execution/tools/workflow/messages.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{readRegisteredWorkflow}from"#execution/workflow-registry.js";async function executeWorkflowBody(e,t){let n=createWorkflowBodyRef(e),i=createWorkflowBodyContext(e,t);attachWorkflowToolRunContext(i,{from:n,owner:e.owner});let o=0;try{let t=resolveWorkflowToolExecute(e),r=e.execution===`background`?createWorkflowTaskExec(e):void 0,a=t(e.executeInput??e.input,i,r),s;if(!isAsyncIterable(a))s=await a;else{let t=a[Symbol.asyncIterator](),r,i=await t.next();for(;i.done!==!0;){r=i.value;let a={from:n,update:i.value};await resumeHookStep(e.owner.inbox,{kind:`report`,...a}),o+=1,i=await t.next()}s=i.value??(e.execution===`blocking`?r:void 0)??null}return{outcome:{output:s,status:`completed`},reportCount:o}}catch(e){return t.aborted?{outcome:{reason:t.reason instanceof Error?t.reason.message:String(t.reason??``),status:`cancelled`},reportCount:o}:{outcome:{error:normalizeSerializableError(e),status:`failed`},reportCount:o}}}function createWorkflowBodyRef(t){return{callId:t.callId,execution:t.execution,input:t.input,resultKind:t.resultKind,runId:t.runId??getWorkflowMetadata().workflowRunId,sequence:t.session.turn.sequence,stepIndex:t.stepIndex,toolName:t.toolName,turnId:t.session.turn.id}}function resolveWorkflowToolExecute(e){let t=readRegisteredWorkflow(e.workflowId);if(typeof t!=`function`)throw Error(`Tool "${e.toolName}" is not registered as a workflow in this deployment (${e.workflowId}). The tool was renamed or removed after this run started.`);return t}function createWorkflowBodyContext(e,t){let unavailable=(t,n)=>{throw Error(`ctx.${t} is not available inside a workflow tool; ${n}. Tool "${e.toolName}" runs as a durable workflow body, which only replays deterministic code.`)},r={agent:e=>agent(r,e),ask:e=>ask(r,e),abortSignal:t,callId:e.callId,getSandbox:()=>unavailable(`getSandbox()`,`the session sandbox belongs to the turn`),getSkill:()=>unavailable(`getSkill()`,`skills are read through the session sandbox`),getToken:()=>unavailable(`getToken()`,`read credentials from the environment inside a "use step" helper`),requireAuth:()=>unavailable(`requireAuth()`,`a workflow body cannot park on authorization`),session:e.session,toolName:e.toolName};return r}function createWorkflowTaskExec(e){if(e.taskId===void 0)throw Error(`Background workflow tool "${e.toolName}" has no task id.`);return{binding:{taskId:e.taskId,token:e.taskId},postMessage:createTaskMessage,send(){throw Error(`task.send() was replaced by yielded task descriptors.`)},session:void 0,task:void 0,taskId:e.taskId}}function isAsyncIterable(e){return typeof e==`object`&&!!e&&typeof e[Symbol.asyncIterator]==`function`}export{createWorkflowBodyRef,executeWorkflowBody};
@@ -1 +1 @@
1
- import{createLogger,logError}from"#internal/logging.js";import{cancelRun,getWorld,resumeHook}from"#internal/workflow/runtime.js";import{isTaskWorkflowTargetGone}from"#execution/tasks/workflow-target.js";const log=createLogger(`execution.workflow-tool-run`);async function cancelWorkflowToolRun(e,n){let r={kind:`cancel`,reason:n};try{await resumeHook(e.hookToken,r);return}catch(t){if(isTaskWorkflowTargetGone(t))return;logError(log,`failed to signal a workflow tool run to cancel; cancelling it outright`,t,{runId:e.runId})}try{await cancelRun(await getWorld(),e.runId,{cancelReason:n})}catch(t){if(isTaskWorkflowTargetGone(t))return;logError(log,`failed to cancel workflow tool run; it may run to completion`,t,{runId:e.runId})}}async function cancelWorkflowToolRunStep(e){"use step";await cancelWorkflowToolRun(e.run,e.reason)}export{cancelWorkflowToolRun,cancelWorkflowToolRunStep};
1
+ import{createLogger,logError}from"#internal/logging.js";import{cancelRun,getWorld,resumeHook}from"#internal/workflow/runtime.js";import{isTaskWorkflowTargetGone}from"#execution/tasks/workflow-target.js";const log=createLogger(`execution.workflow-tool-run`);async function cancelWorkflowToolRun(e,n){let r={kind:`cancel`,reason:n};try{await resumeHook(e.hookToken,r);return}catch(t){isTaskWorkflowTargetGone(t)||logError(log,`failed to signal a workflow tool run to cancel; cancelling it outright`,t,{runId:e.runId})}try{await cancelRun(await getWorld(),e.runId,{cancelReason:n})}catch(t){if(isTaskWorkflowTargetGone(t))return;logError(log,`failed to cancel workflow tool run; it may run to completion`,t,{runId:e.runId})}}async function cancelWorkflowToolRunStep(e){"use step";await cancelWorkflowToolRun(e.run,e.reason)}export{cancelWorkflowToolRun,cancelWorkflowToolRunStep};
@@ -4,10 +4,7 @@ import type { InputRequest } from "#shared/input.js";
4
4
  import type { JsonObject, JsonValue } from "#shared/json.js";
5
5
  import type { ToolInputRequest } from "#tools/definition.js";
6
6
  export interface WorkflowToolRunOwner {
7
- readonly admission: string;
8
- readonly outcome: string;
9
- readonly report: string;
10
- readonly request: string;
7
+ readonly inbox: string;
11
8
  }
12
9
  /**
13
10
  * Requests the owner must apply on the run's behalf because they touch
@@ -77,10 +74,14 @@ export interface WorkflowToolRunOutcomeMessage {
77
74
  readonly from: WorkflowToolRunRef;
78
75
  readonly result: WorkflowToolRunOutcome;
79
76
  }
80
- export declare const workflowToolRunReportHook: import("#compiled/@workflow/core/index.js").TypedHook<WorkflowToolRunReport, WorkflowToolRunReport>;
81
- export declare const workflowToolRunRequestHook: import("#compiled/@workflow/core/index.js").TypedHook<WorkflowToolRunRequestMessage, WorkflowToolRunRequestMessage>;
82
- export declare const workflowToolRunOutcomeHook: import("#compiled/@workflow/core/index.js").TypedHook<WorkflowToolRunOutcomeMessage, WorkflowToolRunOutcomeMessage>;
83
- export declare function deriveWorkflowToolRunOwner(inboxToken: string): WorkflowToolRunOwner;
77
+ export type WorkflowToolRunMessage = ({
78
+ readonly kind: "report";
79
+ } & WorkflowToolRunReport) | ({
80
+ readonly kind: "request";
81
+ } & WorkflowToolRunRequestMessage) | ({
82
+ readonly kind: "outcome";
83
+ } & WorkflowToolRunOutcomeMessage);
84
+ export declare const workflowToolRunHook: import("#compiled/@workflow/core/index.js").TypedHook<WorkflowToolRunMessage, WorkflowToolRunMessage>;
84
85
  export type WorkflowToolRunControlMessage = {
85
86
  readonly kind: "cancel";
86
87
  readonly reason: string;
@@ -1 +1 @@
1
- import{defineHook}from"#compiled/@workflow/core/index.js";const workflowToolRunReportHook=defineHook(),workflowToolRunRequestHook=defineHook(),workflowToolRunOutcomeHook=defineHook();function deriveWorkflowToolRunOwner(e){return{admission:`${e}:admission`,outcome:`${e}:outcome`,report:`${e}:report`,request:`${e}:request`}}function isWorkflowToolRunControlMessage(e){if(typeof e!=`object`||!e)return!1;let{kind:t,reason:n}=e;return t===`cancel`&&typeof n==`string`}export{deriveWorkflowToolRunOwner,isWorkflowToolRunControlMessage,workflowToolRunOutcomeHook,workflowToolRunReportHook,workflowToolRunRequestHook};
1
+ import{defineHook}from"#compiled/@workflow/core/index.js";const workflowToolRunHook=defineHook();function isWorkflowToolRunControlMessage(e){if(typeof e!=`object`||!e)return!1;let{kind:t,reason:n}=e;return t===`cancel`&&typeof n==`string`}export{isWorkflowToolRunControlMessage,workflowToolRunHook};
@@ -3,11 +3,11 @@ import type { WorkflowToolRunOutcomeMessage, WorkflowToolRunReport, WorkflowTool
3
3
  import type { RuntimeToolResultActionResult } from "#shared/action-types.js";
4
4
  import type { RuntimeSubagentResult } from "#shared/action-types.js";
5
5
  import type { WorkflowToolRunTaskInputRequest } from "#execution/tasks/child/workflow.js";
6
- import type { TaskCommand, TaskInboundUpdate } from "#tasks/types.js";
6
+ import type { TaskCommand, TaskInboundMessage, TaskInboundUpdate } from "#tasks/types.js";
7
7
  export declare function workflowToolRunOutcomeToToolResult(message: WorkflowToolRunOutcomeMessage): RuntimeToolResultActionResult;
8
8
  /** Reads a blocking agent result returned through an ordinary run outcome. */
9
9
  export declare function workflowToolRunOutcomeToSubagentResult(message: WorkflowToolRunOutcomeMessage): RuntimeSubagentResult;
10
10
  export declare function workflowToolRunOutcomeToTaskCommand(message: WorkflowToolRunOutcomeMessage): TaskCommand;
11
- export declare function workflowToolRunReportToTaskUpdate(report: WorkflowToolRunReport, taskId: string, updateIndex: number): TaskInboundUpdate;
11
+ export declare function workflowToolRunReportToTaskPayload(report: WorkflowToolRunReport, taskId: string, updateIndex: number): TaskInboundMessage | TaskInboundUpdate;
12
12
  export declare function workflowToolRunRequestToInputRequestPayload(message: WorkflowToolRunRequestMessage): SubagentInputRequestHookPayload;
13
13
  export declare function workflowToolRunRequestToTaskInputRequest(message: WorkflowToolRunRequestMessage): WorkflowToolRunTaskInputRequest;
@@ -1 +1 @@
1
- import{parseJsonValue}from"#shared/json.js";import{SUBAGENT_EXECUTION_FAILED}from"#subagents/agent-handle-errors.js";function workflowToolRunOutcomeToToolResult(e){let{from:t,result:n}=e;return n.status===`completed`?{callId:t.callId,kind:`tool-result`,output:n.output,toolName:t.toolName}:{callId:t.callId,isError:!0,kind:`tool-result`,output:n.status===`failed`?errorMessage(n.error):n.reason??`The workflow tool run was cancelled.`,toolName:t.toolName}}function workflowToolRunOutcomeToSubagentResult(e){if(e.result.status===`completed`&&isRuntimeSubagentResult(e.result.output))return e.result.output;let t=e.result.status===`failed`?errorMessage(e.result.error):e.result.status===`cancelled`?e.result.reason??`The agent invocation was cancelled.`:`The agent invocation returned an invalid result.`;return{callId:e.from.callId,isError:!0,kind:`subagent-result`,origin:`dispatch`,output:t,subagentName:e.from.toolName}}function workflowToolRunOutcomeToTaskCommand(e){return e.result.status===`completed`?{data:e.result.output,kind:`complete`}:e.result.status===`failed`?{data:e.from.resultKind===`subagent`?subagentFailureOutput(e.result.error):errorMessage(e.result.error),kind:`fail`}:{kind:`cancel`}}function subagentFailureOutput(e){let n=parseJsonValueOrUndefined(e);return n!==void 0&&typeof n==`object`&&n&&!Array.isArray(n)&&typeof Reflect.get(n,`code`)==`string`?n:{code:SUBAGENT_EXECUTION_FAILED,message:errorMessage(e)}}function workflowToolRunReportToTaskUpdate(e,t,n){return{callId:e.from.callId,kind:`task-update`,message:typeof e.update==`string`?e.update:JSON.stringify(e.update),updateEpoch:t,updateIndex:n}}function isRuntimeSubagentResult(e){if(typeof e!=`object`||!e)return!1;let t=Reflect.get(e,`origin`);return Reflect.get(e,`kind`)===`subagent-result`&&(t===`child`||t===`dispatch`)}function errorMessage(e){if(typeof e==`object`&&e&&`message`in e){let t=e.message;if(typeof t==`string`)return t}return String(e)}function parseJsonValueOrUndefined(t){try{return parseJsonValue(t)}catch{return}}function workflowToolRunRequestToInputRequestPayload(e){let{from:t,replyTo:n,request:r,requestCoordinates:i}=e;return{callId:t.callId,childContinuationToken:n,childSessionId:t.runId,event:{requests:r.kind===`input-batch`?r.requests:[normalizeInputRequest(r,t,n)],sequence:i?.sequence??t.sequence,stepIndex:i?.stepIndex??t.stepIndex,turnId:i?.turnId??t.turnId},kind:`subagent-input-request`,subagentName:t.toolName}}function workflowToolRunRequestToTaskInputRequest(e){let{from:t,replyTo:n,request:r,requestCoordinates:i}=e,a={kind:`task-input-request`,replyTo:n,sequence:i?.sequence??t.sequence,stepIndex:i?.stepIndex??t.stepIndex,turnId:i?.turnId??t.turnId};return r.kind===`input-batch`?{...a,requests:r.requests}:{...a,request:normalizeInputRequest(r,t,n)}}function normalizeInputRequest(e,t,n){switch(e.kind){case`agent-invoke`:case`agent-settled`:throw TypeError(`A workflow agent request cannot be normalized as human input.`);case`authorization-request`:throw TypeError(`A workflow authorization event cannot be normalized as human input.`);case`ask`:return normalizeAskRequest(e.request,t,n);default:return e}}function normalizeAskRequest(e,t,n){if(typeof e.prompt!=`string`||e.prompt.length===0)throw TypeError("A workflow tool run request needs a non-empty `prompt`.");let r={action:{callId:t.callId,input:t.input,kind:`tool-call`,toolName:t.toolName},kind:`question`,prompt:e.prompt,requestId:n};return e.allowFreeform!==void 0&&(r.allowFreeform=e.allowFreeform),e.display!==void 0&&(r.display=e.display),e.options!==void 0&&(r.options=[...e.options]),r}export{workflowToolRunOutcomeToSubagentResult,workflowToolRunOutcomeToTaskCommand,workflowToolRunOutcomeToToolResult,workflowToolRunReportToTaskUpdate,workflowToolRunRequestToInputRequestPayload,workflowToolRunRequestToTaskInputRequest};
1
+ import{parseJsonValue}from"#shared/json.js";import{SUBAGENT_EXECUTION_FAILED}from"#subagents/agent-handle-errors.js";import{isTaskMessage}from"#tools/task.js";function workflowToolRunOutcomeToToolResult(e){let{from:t,result:n}=e;return n.status===`completed`?{callId:t.callId,kind:`tool-result`,output:n.output,toolName:t.toolName}:{callId:t.callId,isError:!0,kind:`tool-result`,output:n.status===`failed`?errorMessage(n.error):n.reason??`The workflow tool run was cancelled.`,toolName:t.toolName}}function workflowToolRunOutcomeToSubagentResult(e){if(e.result.status===`completed`&&isRuntimeSubagentResult(e.result.output))return e.result.output;let t=e.result.status===`failed`?errorMessage(e.result.error):e.result.status===`cancelled`?e.result.reason??`The agent invocation was cancelled.`:`The agent invocation returned an invalid result.`;return{callId:e.from.callId,isError:!0,kind:`subagent-result`,origin:`dispatch`,output:t,subagentName:e.from.toolName}}function workflowToolRunOutcomeToTaskCommand(e){return e.result.status===`completed`?{data:e.result.output,kind:`complete`}:e.result.status===`failed`?{data:e.from.resultKind===`subagent`?subagentFailureOutput(e.result.error):errorMessage(e.result.error),kind:`fail`}:{kind:`cancel`}}function subagentFailureOutput(e){let n=parseJsonValueOrUndefined(e);return n!==void 0&&typeof n==`object`&&n&&!Array.isArray(n)&&typeof Reflect.get(n,`code`)==`string`?n:{code:SUBAGENT_EXECUTION_FAILED,message:errorMessage(e)}}function workflowToolRunReportToTaskPayload(e,t,r){return isTaskMessage(e.update)?{callId:e.from.callId,kind:`task-message`,message:e.update.message,messageEpoch:t,messageIndex:r}:{callId:e.from.callId,kind:`task-update`,message:typeof e.update==`string`?e.update:JSON.stringify(e.update),updateEpoch:t,updateIndex:r}}function isRuntimeSubagentResult(e){if(typeof e!=`object`||!e)return!1;let t=Reflect.get(e,`origin`);return Reflect.get(e,`kind`)===`subagent-result`&&(t===`child`||t===`dispatch`)}function errorMessage(e){if(typeof e==`object`&&e&&`message`in e){let t=e.message;if(typeof t==`string`)return t}return String(e)}function parseJsonValueOrUndefined(t){try{return parseJsonValue(t)}catch{return}}function workflowToolRunRequestToInputRequestPayload(e){let{from:t,replyTo:n,request:r,requestCoordinates:i}=e;return{callId:t.callId,childContinuationToken:n,childSessionId:t.runId,event:{requests:r.kind===`input-batch`?r.requests:[normalizeInputRequest(r,t,n)],sequence:i?.sequence??t.sequence,stepIndex:i?.stepIndex??t.stepIndex,turnId:i?.turnId??t.turnId},kind:`subagent-input-request`,subagentName:t.toolName}}function workflowToolRunRequestToTaskInputRequest(e){let{from:t,replyTo:n,request:r,requestCoordinates:i}=e,a={kind:`task-input-request`,replyTo:n,sequence:i?.sequence??t.sequence,stepIndex:i?.stepIndex??t.stepIndex,turnId:i?.turnId??t.turnId};return r.kind===`input-batch`?{...a,requests:r.requests}:{...a,request:normalizeInputRequest(r,t,n)}}function normalizeInputRequest(e,t,n){switch(e.kind){case`agent-invoke`:case`agent-settled`:throw TypeError(`A workflow agent request cannot be normalized as human input.`);case`authorization-request`:throw TypeError(`A workflow authorization event cannot be normalized as human input.`);case`ask`:return normalizeAskRequest(e.request,t,n);default:return e}}function normalizeAskRequest(e,t,n){if(typeof e.prompt!=`string`||e.prompt.length===0)throw TypeError("A workflow tool run request needs a non-empty `prompt`.");let r={action:{callId:t.callId,input:t.input,kind:`tool-call`,toolName:t.toolName},kind:`question`,prompt:e.prompt,requestId:n};return e.allowFreeform!==void 0&&(r.allowFreeform=e.allowFreeform),e.display!==void 0&&(r.display=e.display),e.options!==void 0&&(r.options=[...e.options]),r}export{workflowToolRunOutcomeToSubagentResult,workflowToolRunOutcomeToTaskCommand,workflowToolRunOutcomeToToolResult,workflowToolRunReportToTaskPayload,workflowToolRunRequestToInputRequestPayload,workflowToolRunRequestToTaskInputRequest};
@@ -1,13 +1,7 @@
1
- import { type WorkflowToolRunOutcomeMessage, type WorkflowToolRunReport, type WorkflowToolRunRequestMessage } from "#execution/tools/workflow/messages.js";
1
+ import { type WorkflowToolRunMessage, type WorkflowToolRunOwner } from "#execution/tools/workflow/messages.js";
2
2
  import { type ChannelReader } from "#execution/tools/workflow/owner-channels.js";
3
- /** In read priority: what a workflow tool run said before its outcome lands first. */
4
- export type WorkflowToolRunOwnerReaders = readonly [
5
- ChannelReader<"report", WorkflowToolRunReport>,
6
- ChannelReader<"request", WorkflowToolRunRequestMessage>,
7
- ChannelReader<"outcome", WorkflowToolRunOutcomeMessage>
8
- ];
9
- export interface WorkflowToolRunOwnerChannels {
10
- readonly readers: WorkflowToolRunOwnerReaders;
11
- dispose(): Promise<void>;
3
+ export interface WorkflowToolRunOwnerInbox {
4
+ readonly owner: WorkflowToolRunOwner;
5
+ readonly reader: ChannelReader<"workflow", WorkflowToolRunMessage>;
12
6
  }
13
- export declare function openWorkflowToolRunOwnerChannels(inboxToken: string): WorkflowToolRunOwnerChannels;
7
+ export declare function openWorkflowToolRunOwnerInbox(): WorkflowToolRunOwnerInbox;
@@ -1 +1 @@
1
- import{disposeHook}from"#execution/hook-ownership.js";import{deriveWorkflowToolRunOwner,workflowToolRunOutcomeHook,workflowToolRunReportHook,workflowToolRunRequestHook}from"#execution/tools/workflow/messages.js";import{createChannelReader}from"#execution/tools/workflow/owner-channels.js";function openWorkflowToolRunOwnerChannels(e){let t=deriveWorkflowToolRunOwner(e),n=workflowToolRunReportHook.create({token:t.report}),r=workflowToolRunRequestHook.create({token:t.request}),i=workflowToolRunOutcomeHook.create({token:t.outcome});return{readers:[createChannelReader(`report`,n),createChannelReader(`request`,r),createChannelReader(`outcome`,i)],async dispose(){await disposeHook(n),await disposeHook(r),await disposeHook(i)}}}export{openWorkflowToolRunOwnerChannels};
1
+ import{createChannelReader}from"#execution/tools/workflow/owner-channels.js";import{workflowToolRunHook}from"#execution/tools/workflow/messages.js";function openWorkflowToolRunOwnerInbox(){let e=workflowToolRunHook.create();return{owner:{inbox:e.token},reader:createChannelReader(`workflow`,e)}}export{openWorkflowToolRunOwnerInbox};