eve 0.17.0 → 0.17.2

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 (117) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/src/channel/types.d.ts +11 -0
  3. package/dist/src/chunks/{use-eve-agent-BEOUv37s.js → use-eve-agent-Bh1NmXO9.js} +8 -5
  4. package/dist/src/chunks/{use-eve-agent-C25KOe9i.js → use-eve-agent-Dvy_Wjvq.js} +8 -5
  5. package/dist/src/cli/dev/tui/status-line.d.ts +1 -1
  6. package/dist/src/cli/dev/tui/tui.d.ts +2 -0
  7. package/dist/src/cli/dev/tui/tui.js +1 -1
  8. package/dist/src/cli/dev/url-target.d.ts +14 -0
  9. package/dist/src/cli/dev/url-target.js +1 -0
  10. package/dist/src/cli/run.js +3 -3
  11. package/dist/src/client/client.js +1 -1
  12. package/dist/src/compiled/.vendor-stamp.json +4 -4
  13. package/dist/src/compiled/@chat-adapter/slack/api.d.ts +132 -0
  14. package/dist/src/compiled/@chat-adapter/slack/api.js +1 -0
  15. package/dist/src/compiled/@chat-adapter/slack/blocks.js +1 -1
  16. package/dist/src/compiled/@chat-adapter/slack/format.d.ts +33 -0
  17. package/dist/src/compiled/@chat-adapter/slack/format.js +1 -0
  18. package/dist/src/compiled/@chat-adapter/slack/index.js +28 -28
  19. package/dist/src/compiled/@chat-adapter/slack/types-AntsVifS.d.ts +187 -0
  20. package/dist/src/compiled/@chat-adapter/slack/webhook.d.ts +10 -0
  21. package/dist/src/compiled/@chat-adapter/slack/webhook.js +1 -0
  22. package/dist/src/compiled/@workflow/core/classify-error.d.ts +15 -0
  23. package/dist/src/compiled/@workflow/core/index.js +2 -2
  24. package/dist/src/compiled/@workflow/core/runtime.js +27 -27
  25. package/dist/src/compiled/@workflow/core/serialization.d.ts +12 -3
  26. package/dist/src/compiled/@workflow/core/step/context-storage.d.ts +10 -0
  27. package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
  28. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  29. package/dist/src/compiled/_chunks/node/chunk-AYN7QRWH-B__hKQV7.js +1 -0
  30. package/dist/src/compiled/_chunks/node/chunk-HFKBBKCJ-CWaVIQuL.js +1 -0
  31. package/dist/src/compiled/_chunks/workflow/{attribute-changes-DUxG-Gic.js → attribute-changes-zAifvEhb.js} +1 -1
  32. package/dist/src/compiled/_chunks/workflow/{resume-hook-CUCPW67D.js → resume-hook-C15uJ2ik.js} +1 -1
  33. package/dist/src/compiled/_chunks/workflow/run-BJUPZ0Ni.js +1 -0
  34. package/dist/src/compiled/_chunks/workflow/{sleep-Dxuzj5to.js → sleep-C8B-TYir.js} +1 -1
  35. package/dist/src/compiler/manifest.d.ts +2 -2
  36. package/dist/src/compiler/manifest.js +1 -1
  37. package/dist/src/compiler/normalize-agent-config.js +1 -1
  38. package/dist/src/context/keys.d.ts +2 -0
  39. package/dist/src/context/keys.js +1 -1
  40. package/dist/src/evals/assertions/run.js +2 -2
  41. package/dist/src/execution/create-session-step.d.ts +2 -0
  42. package/dist/src/execution/create-session-step.js +1 -1
  43. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  44. package/dist/src/execution/durable-session-store.d.ts +3 -0
  45. package/dist/src/execution/remote-agent-dispatch.js +1 -1
  46. package/dist/src/execution/runtime-context.js +1 -1
  47. package/dist/src/execution/session.d.ts +6 -1
  48. package/dist/src/execution/session.js +3 -3
  49. package/dist/src/execution/subagent-invocation.d.ts +20 -5
  50. package/dist/src/execution/subagent-invocation.js +2 -2
  51. package/dist/src/execution/subagent-tool.d.ts +7 -0
  52. package/dist/src/execution/subagent-tool.js +1 -1
  53. package/dist/src/execution/workflow-entry.js +1 -1
  54. package/dist/src/harness/advertised-tools.d.ts +33 -0
  55. package/dist/src/harness/advertised-tools.js +1 -0
  56. package/dist/src/harness/subagent-depth.d.ts +17 -0
  57. package/dist/src/harness/subagent-depth.js +1 -0
  58. package/dist/src/harness/tool-loop.js +1 -1
  59. package/dist/src/harness/turn-tag-state.d.ts +30 -22
  60. package/dist/src/harness/turn-tag-state.js +1 -1
  61. package/dist/src/harness/types.d.ts +28 -0
  62. package/dist/src/harness/workflow-continuation-security.d.ts +1 -0
  63. package/dist/src/harness/workflow-continuation-security.js +1 -1
  64. package/dist/src/internal/application/package.js +1 -1
  65. package/dist/src/internal/authored-definition/core.js +1 -1
  66. package/dist/src/internal/http/basic-auth.d.ts +1 -0
  67. package/dist/src/internal/http/basic-auth.js +1 -0
  68. package/dist/src/internal/nitro/host/configure-nitro-routes.js +2 -2
  69. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  70. package/dist/src/internal/nitro/routes/channel-route-context.d.ts +5 -0
  71. package/dist/src/internal/nitro/routes/channel-route-context.js +1 -0
  72. package/dist/src/internal/nitro/routes/info.d.ts +2 -6
  73. package/dist/src/internal/nitro/routes/info.js +1 -1
  74. package/dist/src/protocol/routes.d.ts +2 -4
  75. package/dist/src/public/channels/eve.d.ts +5 -4
  76. package/dist/src/public/channels/eve.js +1 -1
  77. package/dist/src/public/channels/slack/api.d.ts +3 -6
  78. package/dist/src/public/channels/slack/api.js +1 -1
  79. package/dist/src/public/channels/slack/inbound.d.ts +11 -9
  80. package/dist/src/public/channels/slack/inbound.js +1 -1
  81. package/dist/src/public/channels/slack/interactions.d.ts +2 -1
  82. package/dist/src/public/channels/slack/interactions.js +1 -1
  83. package/dist/src/public/channels/slack/mrkdwn.d.ts +3 -35
  84. package/dist/src/public/channels/slack/mrkdwn.js +1 -1
  85. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  86. package/dist/src/public/channels/slack/verify.d.ts +4 -42
  87. package/dist/src/public/channels/slack/verify.js +1 -1
  88. package/dist/src/public/definitions/agent.d.ts +1 -1
  89. package/dist/src/public/index.d.ts +1 -1
  90. package/dist/src/runtime/resolve-agent.js +1 -1
  91. package/dist/src/services/dev-client/client-options.d.ts +5 -1
  92. package/dist/src/services/dev-client/client-options.js +1 -1
  93. package/dist/src/setup/boxes/preflight.js +1 -1
  94. package/dist/src/setup/boxes/select-model.js +1 -1
  95. package/dist/src/setup/flows/model.js +1 -1
  96. package/dist/src/setup/scaffold/create/project.d.ts +1 -1
  97. package/dist/src/setup/scaffold/create/project.js +1 -1
  98. package/dist/src/setup/scaffold/create/web-template.d.ts +3 -0
  99. package/dist/src/setup/scaffold/create/web-template.js +1 -1
  100. package/dist/src/shared/agent-definition.d.ts +37 -0
  101. package/dist/src/shared/default-agent-model.d.ts +1 -1
  102. package/dist/src/shared/default-agent-model.js +1 -1
  103. package/dist/src/svelte/index.js +1 -1
  104. package/dist/src/svelte/use-eve-agent.js +1 -1
  105. package/dist/src/vue/index.js +1 -1
  106. package/dist/src/vue/use-eve-agent.js +1 -1
  107. package/docs/agent-config.md +35 -8
  108. package/docs/channels/eve.mdx +3 -2
  109. package/docs/concepts/sessions-runs-and-streaming.md +2 -2
  110. package/docs/getting-started.mdx +5 -5
  111. package/docs/guides/dev-tui.md +7 -1
  112. package/docs/reference/cli.md +10 -1
  113. package/docs/reference/typescript-api.md +1 -1
  114. package/docs/subagents.mdx +19 -0
  115. package/package.json +5 -5
  116. package/dist/src/compiled/_chunks/node/chunk-AYN7QRWH-Csu8sG38.js +0 -1
  117. package/dist/src/compiled/_chunks/workflow/run-CVlF84yI.js +0 -1
@@ -1,5 +1,5 @@
1
- function createCompactionConfig(e={}){let t=e.thresholdPercent??.9,n={recentWindowSize:10,threshold:e.contextWindowTokens===void 0?1e5:Math.max(1,Math.floor(e.contextWindowTokens*t))};return e.lastKnownInputTokens===void 0?n:{...n,lastKnownInputTokens:e.lastKnownInputTokens,lastKnownPromptMessageCount:e.lastKnownPromptMessageCount}}function createSession(e){let{turnAgent:t}=e,n=createSessionToolDefinitions(t),r={agent:{compactionModelReference:t.compactionModel,modelReference:t.model,reasoning:t.reasoning,system:t.instructions.join(`
1
+ const DEFAULT_ROOT_MAX_INPUT_TOKENS_PER_SESSION=4e7,DEFAULT_SUBAGENT_MAX_INPUT_TOKENS_PER_SESSION=5e6;function createCompactionConfig(e={}){let t=e.thresholdPercent??.9,n={recentWindowSize:10,threshold:e.contextWindowTokens===void 0?1e5:Math.max(1,Math.floor(e.contextWindowTokens*t))};return e.lastKnownInputTokens===void 0?n:{...n,lastKnownInputTokens:e.lastKnownInputTokens,lastKnownPromptMessageCount:e.lastKnownPromptMessageCount}}function createSession(e){let{turnAgent:t}=e,n=createSessionToolDefinitions(t),r={agent:{compactionModelReference:t.compactionModel,modelReference:t.model,reasoning:t.reasoning,system:t.instructions.join(`
2
2
 
3
- `),tools:n},compaction:createCompactionConfig({contextWindowTokens:t.model.contextWindowTokens,thresholdPercent:e.compactionOverrides?.thresholdPercent}),continuationToken:e.continuationToken,history:[],sessionId:e.sessionId};return e.rootSessionId!==void 0&&(r.rootSessionId=e.rootSessionId),e.outputSchema!==void 0&&(r.outputSchema=e.outputSchema),r}function refreshSessionFromTurnAgent(e){return{...e.session,agent:{compactionModelReference:e.turnAgent.compactionModel,modelReference:e.turnAgent.model,reasoning:e.turnAgent.reasoning,system:e.turnAgent.instructions.join(`
3
+ `),tools:n},compaction:createCompactionConfig({contextWindowTokens:t.model.contextWindowTokens,thresholdPercent:e.compactionOverrides?.thresholdPercent}),continuationToken:e.continuationToken,history:[],sessionId:e.sessionId};return e.rootSessionId!==void 0&&(r.rootSessionId=e.rootSessionId),r.limits=resolveSessionLimits(e),e.outputSchema!==void 0&&(r.outputSchema=e.outputSchema),e.subagentDepth!==void 0&&(r.subagentDepth=e.subagentDepth),e.subagentMaxDepth!==void 0&&(r.subagentMaxDepth=e.subagentMaxDepth),r}function refreshSessionFromTurnAgent(e){return{...e.session,agent:{compactionModelReference:e.turnAgent.compactionModel,modelReference:e.turnAgent.model,reasoning:e.turnAgent.reasoning,system:e.turnAgent.instructions.join(`
4
4
 
5
- `),tools:createSessionToolDefinitions(e.turnAgent)},compaction:createCompactionConfig({contextWindowTokens:e.turnAgent.model.contextWindowTokens,lastKnownInputTokens:e.session.compaction.lastKnownInputTokens,lastKnownPromptMessageCount:e.session.compaction.lastKnownPromptMessageCount,thresholdPercent:e.compactionOverrides?.thresholdPercent})}}function mintSubagentContinuationToken(e){return`subagent:${e??crypto.randomUUID()}`}function projectToDurableSession(e){let t={agent:{system:e.agent.system},continuationToken:e.continuationToken,history:e.history,sessionId:e.sessionId};return(e.compaction.lastKnownInputTokens!==void 0||e.compaction.lastKnownPromptMessageCount!==void 0)&&(t.compaction={lastKnownInputTokens:e.compaction.lastKnownInputTokens,lastKnownPromptMessageCount:e.compaction.lastKnownPromptMessageCount}),e.rootSessionId!==void 0&&(t.rootSessionId=e.rootSessionId),e.outputSchema!==void 0&&(t.outputSchema=e.outputSchema),e.sandboxState!==void 0&&(t.sandboxState=e.sandboxState),e.state!==void 0&&(t.state=e.state),t}function hydrateDurableSession(e){let{durable:t,turnAgent:n}=e,r=createSessionToolDefinitions(n),i={agent:{compactionModelReference:n.compactionModel,modelReference:n.model,reasoning:n.reasoning,system:t.agent.system,tools:r},compaction:createCompactionConfig({contextWindowTokens:n.model.contextWindowTokens,lastKnownInputTokens:t.compaction?.lastKnownInputTokens,lastKnownPromptMessageCount:t.compaction?.lastKnownPromptMessageCount,thresholdPercent:e.compactionOverrides?.thresholdPercent}),continuationToken:t.continuationToken,history:t.history,sessionId:t.sessionId};return t.rootSessionId!==void 0&&(i.rootSessionId=t.rootSessionId),t.outputSchema!==void 0&&(i.outputSchema=t.outputSchema),t.sandboxState!==void 0&&(i.sandboxState=t.sandboxState),t.state!==void 0&&(i.state=t.state),i}function createSessionToolDefinitions(e){return e.tools.map(e=>({description:e.description??``,inputSchema:e.inputSchema,name:e.name,outputSchema:e.outputSchema}))}export{createCompactionConfig,createSession,hydrateDurableSession,mintSubagentContinuationToken,projectToDurableSession,refreshSessionFromTurnAgent};
5
+ `),tools:createSessionToolDefinitions(e.turnAgent)},compaction:createCompactionConfig({contextWindowTokens:e.turnAgent.model.contextWindowTokens,lastKnownInputTokens:e.session.compaction.lastKnownInputTokens,lastKnownPromptMessageCount:e.session.compaction.lastKnownPromptMessageCount,thresholdPercent:e.compactionOverrides?.thresholdPercent})}}function mintSubagentContinuationToken(e){return`subagent:${e??crypto.randomUUID()}`}function projectToDurableSession(e){let t={agent:{system:e.agent.system},continuationToken:e.continuationToken,history:e.history,sessionId:e.sessionId};return(e.compaction.lastKnownInputTokens!==void 0||e.compaction.lastKnownPromptMessageCount!==void 0)&&(t.compaction={lastKnownInputTokens:e.compaction.lastKnownInputTokens,lastKnownPromptMessageCount:e.compaction.lastKnownPromptMessageCount}),e.rootSessionId!==void 0&&(t.rootSessionId=e.rootSessionId),e.limits!==void 0&&(t.limits=e.limits),e.outputSchema!==void 0&&(t.outputSchema=e.outputSchema),e.sandboxState!==void 0&&(t.sandboxState=e.sandboxState),e.state!==void 0&&(t.state=e.state),e.subagentDepth!==void 0&&(t.subagentDepth=e.subagentDepth),e.subagentMaxDepth!==void 0&&(t.subagentMaxDepth=e.subagentMaxDepth),t}function hydrateDurableSession(e){let{durable:t,turnAgent:n}=e,r=createSessionToolDefinitions(n),i={agent:{compactionModelReference:n.compactionModel,modelReference:n.model,reasoning:n.reasoning,system:t.agent.system,tools:r},compaction:createCompactionConfig({contextWindowTokens:n.model.contextWindowTokens,lastKnownInputTokens:t.compaction?.lastKnownInputTokens,lastKnownPromptMessageCount:t.compaction?.lastKnownPromptMessageCount,thresholdPercent:e.compactionOverrides?.thresholdPercent}),continuationToken:t.continuationToken,history:t.history,sessionId:t.sessionId};return t.rootSessionId!==void 0&&(i.rootSessionId=t.rootSessionId),i.limits=resolveSessionLimits(t),t.outputSchema!==void 0&&(i.outputSchema=t.outputSchema),t.sandboxState!==void 0&&(i.sandboxState=t.sandboxState),t.state!==void 0&&(i.state=t.state),t.subagentDepth!==void 0&&(i.subagentDepth=t.subagentDepth),t.subagentMaxDepth!==void 0&&(i.subagentMaxDepth=t.subagentMaxDepth),i}function createSessionToolDefinitions(e){return e.tools.map(e=>({description:e.description??``,inputSchema:e.inputSchema,name:e.name,outputSchema:e.outputSchema}))}function resolveSessionLimits(e){let t=e.limits?.maxInputTokensPerSession??(e.subagentDepth!==void 0&&e.subagentDepth>0?5e6:4e7);return e.limits?.maxOutputTokensPerSession===void 0?{maxInputTokensPerSession:t}:{maxInputTokensPerSession:t,maxOutputTokensPerSession:e.limits.maxOutputTokensPerSession}}export{DEFAULT_ROOT_MAX_INPUT_TOKENS_PER_SESSION,DEFAULT_SUBAGENT_MAX_INPUT_TOKENS_PER_SESSION,createCompactionConfig,createSession,hydrateDurableSession,mintSubagentContinuationToken,projectToDurableSession,refreshSessionFromTurnAgent};
@@ -6,11 +6,26 @@ import type { StepInput } from "#harness/types.js";
6
6
  export interface FormattedSubagentInvocation extends StepInput {
7
7
  readonly message: string;
8
8
  }
9
- /**
10
- * Formats the stable delegated input handed to one child agent invocation.
11
- */
12
- export declare function formatSubagentInvocation(input: {
9
+ type RuntimeSubagentInputFormatRequest = {
10
+ readonly message: string;
11
+ readonly name: string;
12
+ readonly type: "runtime";
13
+ };
14
+ type LocalSubagentInputFormatRequest = {
13
15
  readonly description: string;
14
16
  readonly message: string;
15
17
  readonly name: string;
16
- }): FormattedSubagentInvocation;
18
+ readonly type: "local";
19
+ };
20
+ type RemoteSubagentInputFormatRequest = {
21
+ readonly description: string;
22
+ readonly message: string;
23
+ readonly name: string;
24
+ readonly type: "remote";
25
+ };
26
+ type SubagentInputFormatRequest = RuntimeSubagentInputFormatRequest | LocalSubagentInputFormatRequest | RemoteSubagentInputFormatRequest;
27
+ /**
28
+ * Formats the stable delegated input handed to one child agent invocation.
29
+ */
30
+ export declare function formatSubagentInput(input: SubagentInputFormatRequest): FormattedSubagentInvocation;
31
+ export {};
@@ -1,2 +1,2 @@
1
- function formatSubagentInvocation(e){return{message:[`You are the subagent "${e.name}".`,`Description: ${e.description}`,``,`The caller delegated the following task to you. Complete it and return the final result directly.`,``,`Caller message:`,e.message].join(`
2
- `)}}export{formatSubagentInvocation};
1
+ const formatSubagentInputByType={runtime(e){return formatSubagentPrompt({descriptionLines:[],message:e.message,name:e.name})},local(e){return formatSubagentPrompt({descriptionLines:formatDescriptionLines(e.description),message:e.message,name:e.name})},remote(e){return formatSubagentPrompt({descriptionLines:formatDescriptionLines(e.description),message:e.message,name:e.name})}};function formatSubagentInput(t){switch(t.type){case`runtime`:return formatSubagentInputByType.runtime(t);case`local`:return formatSubagentInputByType.local(t);case`remote`:return formatSubagentInputByType.remote(t);default:return t}}function formatSubagentPrompt(e){return{message:[`You are the subagent "${e.name}".`,...e.descriptionLines,``,`The caller delegated the following task to you. Complete it and return the final result directly.`,``,`Caller message:`,e.message].join(`
2
+ `)}}function formatDescriptionLines(e){return e.trim().length>0?[`Description: ${e}`]:[]}export{formatSubagentInput};
@@ -8,6 +8,12 @@ interface BatchEventMetadata {
8
8
  readonly sequence: number;
9
9
  readonly turnId: string;
10
10
  }
11
+ export type SubagentInputSource = {
12
+ readonly description: string;
13
+ readonly type: "local";
14
+ } | {
15
+ readonly type: "runtime";
16
+ };
11
17
  /**
12
18
  * Result of {@link buildSubagentRunInput}.
13
19
  *
@@ -37,5 +43,6 @@ export declare function buildSubagentRunInput(input: {
37
43
  /** Hook token owned by the workflow currently waiting for this child. */
38
44
  readonly parentContinuationToken?: string;
39
45
  readonly session: HarnessSession;
46
+ readonly source: SubagentInputSource;
40
47
  }): SubagentRunInputBuild;
41
48
  export {};
@@ -1 +1 @@
1
- import{mintSubagentContinuationToken}from"#execution/session.js";import{SUBAGENT_ADAPTER_KIND}from"#execution/subagent-adapter.js";import{formatSubagentInvocation}from"#execution/subagent-invocation.js";function buildSubagentRunInput(n){let{action:r,auth:i,batchEvent:a,capabilities:o,channelMetadata:s,initiatorAuth:c,session:l}=n,u=mintSubagentContinuationToken(`${l.sessionId}:${r.callId}`),d=l.rootSessionId??l.sessionId;return{childContinuationToken:u,runInput:{adapter:{kind:SUBAGENT_ADAPTER_KIND,state:{callId:r.callId,parentContinuationToken:n.parentContinuationToken??l.continuationToken,parentSessionId:l.sessionId,subagentName:r.subagentName,...r.subagentName===`agent`&&l.sandboxState?{parentSandboxState:l.sandboxState,sandboxSessionId:l.sessionId}:{}}},auth:i,capabilities:o,channelMetadata:s,continuationToken:u,initiatorAuth:c,input:{message:formatSubagentCallInputMessage(r),outputSchema:r.input.outputSchema},mode:`task`,parent:{callId:r.callId,rootSessionId:d,sessionId:l.sessionId,turn:{id:a.turnId,sequence:a.sequence}}}}}function formatSubagentCallInputMessage(e){let{message:t}=e.input;return formatSubagentInvocation({description:e.description,message:t,name:e.subagentName}).message}export{buildSubagentRunInput};
1
+ import{mintSubagentContinuationToken}from"#execution/session.js";import{SUBAGENT_ADAPTER_KIND}from"#execution/subagent-adapter.js";import{resolveSubagentDelegationLimit}from"#harness/subagent-depth.js";import{formatSubagentInput}from"#execution/subagent-invocation.js";function buildSubagentRunInput(n){let{action:r,auth:i,batchEvent:a,capabilities:o,channelMetadata:s,initiatorAuth:c,session:l,source:u}=n,d=mintSubagentContinuationToken(`${l.sessionId}:${r.callId}`),f=l.rootSessionId??l.sessionId,p=resolveSubagentDelegationLimit(l);return{childContinuationToken:d,runInput:{adapter:{kind:SUBAGENT_ADAPTER_KIND,state:{callId:r.callId,parentContinuationToken:n.parentContinuationToken??l.continuationToken,parentSessionId:l.sessionId,subagentName:r.subagentName,...r.subagentName===`agent`&&l.sandboxState?{parentSandboxState:l.sandboxState,sandboxSessionId:l.sessionId}:{}}},auth:i,capabilities:o,channelMetadata:s,continuationToken:d,initiatorAuth:c,input:{message:formatSubagentCallInputMessage({action:r,source:u}),outputSchema:r.input.outputSchema},mode:`task`,parent:{callId:r.callId,rootSessionId:f,sessionId:l.sessionId,turn:{id:a.turnId,sequence:a.sequence}},subagentDepth:p.nextChildDepth,subagentMaxDepth:l.subagentMaxDepth}}}function formatSubagentCallInputMessage(e){let{message:t}=e.action.input;switch(e.source.type){case`local`:return formatSubagentInput({description:e.source.description,message:t,name:e.action.subagentName,type:`local`}).message;case`runtime`:return formatSubagentInput({message:t,name:e.action.subagentName,type:`runtime`}).message;default:return e.source}}export{buildSubagentRunInput};
@@ -1 +1 @@
1
- import{emitTerminalSessionFailureStep}from"#execution/workflow-steps.js";import{createHook,getWorkflowMetadata,getWritable}from"#compiled/@workflow/core/index.js";import{closeHookIterator,disposeHook}from"#execution/hook-ownership.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{coalesceDeliveries}from"#harness/messages.js";import{readChannelRequestId,readRootSessionId}from"#execution/eve-workflow-attributes.js";import{notifyDelegatedParentStep}from"#execution/delegated-parent-notification.js";import{createDelegatedSubagentErrorResult,createDelegatedSubagentSuccessResult}from"#execution/delegated-parent-result.js";import{dispatchAndAwaitTurn}from"#execution/turn-dispatch.js";import{createSessionStep}from"#execution/create-session-step.js";import{fireSessionCallbackStep}from"#execution/session-callback-step.js";import{createSessionDeliveryHook}from"#execution/session-delivery-hook.js";async function workflowEntry(t){"use workflow";let{workflowRunId:i}=getWorkflowMetadata(),a=t.serializedContext[`eve.continuationToken`]||``,s=t.serializedContext[`eve.mode`],c=t.serializedContext[`eve.capabilities`],u=t.serializedContext[`eve.bundle`];t.serializedContext[`eve.sessionId`]=i;let d=getWritable();try{let e=readRootSessionId(t.serializedContext),{state:n}=await createSessionStep({compiledArtifactsSource:u.source,continuationToken:a,nodeId:u.nodeId,outputSchema:t.input.outputSchema,rootSessionId:e,sessionId:i});return await runDriverLoop({capabilities:c,driverWritable:d,initialInput:{kind:`deliver`,payloads:[{message:t.input.message,context:t.input.context,outputSchema:t.input.outputSchema}],requestId:readChannelRequestId(t.serializedContext)},mode:s,serializedContext:t.serializedContext,sessionState:n})}catch(n){throw await emitTerminalSessionFailureStep({error:normalizeSerializableError(n),parentWritable:d,serializedContext:t.serializedContext}),await fireSessionCallbackStep({error:normalizeSerializableError(n),serializedContext:t.serializedContext,status:`failed`}),await notifyDelegatedParentStep({result:createDelegatedSubagentErrorResult(t.serializedContext,n),serializedContext:t.serializedContext}),n}}async function runDriverLoop(e){let n=createHook({token:`${e.sessionState.sessionId}:auth`}),r=n[Symbol.asyncIterator](),o=0,nextTurnControlToken=()=>`${e.sessionState.sessionId}:turn-control:${String(o++)}`,c=[],l=createSessionDeliveryHook(c);try{e.sessionState.continuationToken&&await l.rekey(e.sessionState.continuationToken);let t=await dispatchAndAwaitTurn({bufferedDeliveries:c,capabilities:e.capabilities,controlToken:nextTurnControlToken(),delivery:e.initialInput,deliveryHook:l,mode:e.mode,parentWritable:e.driverWritable,serializedContext:e.serializedContext,sessionState:e.sessionState});for(;;){if(t.kind===`done`)return await finalizeDone({action:t,driverWritable:e.driverWritable});if(t.kind!==`park`)throw Error(`Driver received unexpected turn action "${t.kind}".`);if(!t.sessionState.continuationToken)throw Error("Cannot park: no continuation token available. The channel must post the first message during the initial turn (anchoring the session) or `send()` must be called with an explicit continuationToken.");if(await l.rekey(t.sessionState.continuationToken),t.authorizationNames&&t.authorizationNames.length>0){let n=t.authorizationNames.length,i=[];for(;i.length<n;){let e=await r.next();if(e.done)break;e.value.kind===`deliver`&&i.push(...e.value.payloads)}t=await dispatchAndAwaitTurn({bufferedDeliveries:c,capabilities:e.capabilities,controlToken:nextTurnControlToken(),delivery:{kind:`deliver`,payloads:i},deliveryHook:l,mode:e.mode,parentWritable:e.driverWritable,serializedContext:t.serializedContext,sessionState:t.sessionState});continue}let n=await waitForNextDeliver({bufferedDeliveries:c,deliveryHook:l});if(n===null)return{output:``};let i=await routeDeliverToChildren({auth:n.auth,parentWritable:e.driverWritable,payloads:n.payloads,sessionState:t.sessionState});i!==void 0&&(t=await dispatchAndAwaitTurn({bufferedDeliveries:c,capabilities:e.capabilities,controlToken:nextTurnControlToken(),delivery:{auth:n.auth,kind:`deliver`,payloads:[i],requestId:n.requestId},deliveryHook:l,mode:e.mode,parentWritable:e.driverWritable,serializedContext:t.serializedContext,sessionState:t.sessionState}))}}finally{await l.dispose(),await closeHookIterator(r),await disposeHook(n)}}async function finalizeDone(e){let{output:t,serializedContext:n}=e.action,r=e.action.isError===!0;return await fireSessionCallbackStep({error:r?t:void 0,output:r?void 0:t,serializedContext:n,status:r?`failed`:`completed`}),await notifyDelegatedParentStep({result:r?createDelegatedSubagentErrorResult(n,t):createDelegatedSubagentSuccessResult(n,t),serializedContext:n}),{output:t}}async function waitForNextDeliver(e){if(e.bufferedDeliveries.length>0)return coalesceDeliveries(e.bufferedDeliveries.splice(0));for(;;){let t=await e.deliveryHook.next();if(e.deliveryHook.consumeNext(),t.done)return null;if(t.value.kind!==`deliver`)continue;let n=t.value;for(;;){let t=await takeReadyPayload(e.deliveryHook.next());if(t===NO_READY_MESSAGE||(e.deliveryHook.consumeNext(),t.done))break;t.value.kind===`deliver`&&(n=coalesceDeliveries([n,t.value]))}return n}}const NO_READY_MESSAGE=Symbol(`no-ready-message`);async function takeReadyPayload(e){return await Promise.resolve(),await Promise.race([e,Promise.resolve(NO_READY_MESSAGE)])}export{workflowEntry};
1
+ import{readSerializedSubagentSessionDepth}from"#harness/subagent-depth.js";import{emitTerminalSessionFailureStep}from"#execution/workflow-steps.js";import{createHook,getWorkflowMetadata,getWritable}from"#compiled/@workflow/core/index.js";import{closeHookIterator,disposeHook}from"#execution/hook-ownership.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{coalesceDeliveries}from"#harness/messages.js";import{readChannelRequestId,readRootSessionId}from"#execution/eve-workflow-attributes.js";import{notifyDelegatedParentStep}from"#execution/delegated-parent-notification.js";import{createDelegatedSubagentErrorResult,createDelegatedSubagentSuccessResult}from"#execution/delegated-parent-result.js";import{dispatchAndAwaitTurn}from"#execution/turn-dispatch.js";import{createSessionStep}from"#execution/create-session-step.js";import{fireSessionCallbackStep}from"#execution/session-callback-step.js";import{createSessionDeliveryHook}from"#execution/session-delivery-hook.js";async function workflowEntry(n){"use workflow";let{workflowRunId:a}=getWorkflowMetadata(),o=n.serializedContext[`eve.continuationToken`]||``,c=n.serializedContext[`eve.mode`],l=n.serializedContext[`eve.capabilities`],u=n.serializedContext[`eve.bundle`];n.serializedContext[`eve.sessionId`]=a;let d=getWritable();try{let t=readRootSessionId(n.serializedContext),{subagentDepth:r,subagentMaxDepth:i}=readSerializedSubagentSessionDepth(n.serializedContext),{state:s}=await createSessionStep({compiledArtifactsSource:u.source,continuationToken:o,nodeId:u.nodeId,outputSchema:n.input.outputSchema,rootSessionId:t,sessionId:a,subagentDepth:r,subagentMaxDepth:i});return await runDriverLoop({capabilities:l,driverWritable:d,initialInput:{kind:`deliver`,payloads:[{message:n.input.message,context:n.input.context,outputSchema:n.input.outputSchema}],requestId:readChannelRequestId(n.serializedContext)},mode:c,serializedContext:n.serializedContext,sessionState:s})}catch(e){throw await emitTerminalSessionFailureStep({error:normalizeSerializableError(e),parentWritable:d,serializedContext:n.serializedContext}),await fireSessionCallbackStep({error:normalizeSerializableError(e),serializedContext:n.serializedContext,status:`failed`}),await notifyDelegatedParentStep({result:createDelegatedSubagentErrorResult(n.serializedContext,e),serializedContext:n.serializedContext}),e}}async function runDriverLoop(e){let t=createHook({token:`${e.sessionState.sessionId}:auth`}),r=t[Symbol.asyncIterator](),i=0,nextTurnControlToken=()=>`${e.sessionState.sessionId}:turn-control:${String(i++)}`,s=[],l=createSessionDeliveryHook(s);try{e.sessionState.continuationToken&&await l.rekey(e.sessionState.continuationToken);let t=await dispatchAndAwaitTurn({bufferedDeliveries:s,capabilities:e.capabilities,controlToken:nextTurnControlToken(),delivery:e.initialInput,deliveryHook:l,mode:e.mode,parentWritable:e.driverWritable,serializedContext:e.serializedContext,sessionState:e.sessionState});for(;;){if(t.kind===`done`)return await finalizeDone({action:t,driverWritable:e.driverWritable});if(t.kind!==`park`)throw Error(`Driver received unexpected turn action "${t.kind}".`);if(!t.sessionState.continuationToken)throw Error("Cannot park: no continuation token available. The channel must post the first message during the initial turn (anchoring the session) or `send()` must be called with an explicit continuationToken.");if(await l.rekey(t.sessionState.continuationToken),t.authorizationNames&&t.authorizationNames.length>0){let n=t.authorizationNames.length,i=[];for(;i.length<n;){let e=await r.next();if(e.done)break;e.value.kind===`deliver`&&i.push(...e.value.payloads)}t=await dispatchAndAwaitTurn({bufferedDeliveries:s,capabilities:e.capabilities,controlToken:nextTurnControlToken(),delivery:{kind:`deliver`,payloads:i},deliveryHook:l,mode:e.mode,parentWritable:e.driverWritable,serializedContext:t.serializedContext,sessionState:t.sessionState});continue}let n=await waitForNextDeliver({bufferedDeliveries:s,deliveryHook:l});if(n===null)return{output:``};let i=await routeDeliverToChildren({auth:n.auth,parentWritable:e.driverWritable,payloads:n.payloads,sessionState:t.sessionState});i!==void 0&&(t=await dispatchAndAwaitTurn({bufferedDeliveries:s,capabilities:e.capabilities,controlToken:nextTurnControlToken(),delivery:{auth:n.auth,kind:`deliver`,payloads:[i],requestId:n.requestId},deliveryHook:l,mode:e.mode,parentWritable:e.driverWritable,serializedContext:t.serializedContext,sessionState:t.sessionState}))}}finally{await l.dispose(),await closeHookIterator(r),await disposeHook(t)}}async function finalizeDone(e){let{output:t,serializedContext:n}=e.action,r=e.action.isError===!0;return await fireSessionCallbackStep({error:r?t:void 0,output:r?void 0:t,serializedContext:n,status:r?`failed`:`completed`}),await notifyDelegatedParentStep({result:r?createDelegatedSubagentErrorResult(n,t):createDelegatedSubagentSuccessResult(n,t),serializedContext:n}),{output:t}}async function waitForNextDeliver(e){if(e.bufferedDeliveries.length>0)return coalesceDeliveries(e.bufferedDeliveries.splice(0));for(;;){let t=await e.deliveryHook.next();if(e.deliveryHook.consumeNext(),t.done)return null;if(t.value.kind!==`deliver`)continue;let n=t.value;for(;;){let t=await takeReadyPayload(e.deliveryHook.next());if(t===NO_READY_MESSAGE||(e.deliveryHook.consumeNext(),t.done))break;t.value.kind===`deliver`&&(n=coalesceDeliveries([n,t.value]))}return n}}const NO_READY_MESSAGE=Symbol(`no-ready-message`);async function takeReadyPayload(e){return await Promise.resolve(),await Promise.race([e,Promise.resolve(NO_READY_MESSAGE)])}export{workflowEntry};
@@ -0,0 +1,33 @@
1
+ import type { ToolSet } from "ai";
2
+ import type { HarnessToolDefinition } from "#harness/execute-tool.js";
3
+ import type { HarnessSession, HarnessToolMap } from "#harness/types.js";
4
+ import type { WorkflowSandboxLifecycle } from "#shared/workflow-sandbox.js";
5
+ type AdvertisedToolSession = Pick<HarnessSession, "rootSessionId" | "subagentDepth" | "subagentMaxDepth">;
6
+ type AdvertisedToolMapInput = {
7
+ readonly session: AdvertisedToolSession;
8
+ readonly tools: HarnessToolMap;
9
+ };
10
+ type AdvertisedToolDefinitionsInput = {
11
+ readonly session: AdvertisedToolSession;
12
+ readonly tools: readonly HarnessToolDefinition[];
13
+ };
14
+ type AdvertisedModelToolsInput = {
15
+ readonly modelTools: ToolSet;
16
+ readonly session: HarnessSession;
17
+ readonly tools: HarnessToolMap;
18
+ readonly workflow?: {
19
+ readonly lifecycle?: (input: {
20
+ readonly session: HarnessSession;
21
+ readonly tools: HarnessToolMap;
22
+ }) => WorkflowSandboxLifecycle | undefined;
23
+ };
24
+ };
25
+ type AdvertisedModelTools = {
26
+ readonly harnessTools: HarnessToolMap;
27
+ readonly modelTools: ToolSet;
28
+ readonly session: HarnessSession;
29
+ };
30
+ export declare function getAdvertisedTools(input: AdvertisedModelToolsInput): Promise<AdvertisedModelTools>;
31
+ export declare function getAdvertisedTools(input: AdvertisedToolMapInput): HarnessToolMap;
32
+ export declare function getAdvertisedTools(input: AdvertisedToolDefinitionsInput): readonly HarnessToolDefinition[];
33
+ export {};
@@ -0,0 +1 @@
1
+ import{resolveSubagentDelegationLimit}from"#harness/subagent-depth.js";import{ensureWorkflowContinuationSecurity,getWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{applyWorkflowTool}from"#harness/workflow-sandbox.js";function getAdvertisedTools(e){return`modelTools`in e?getAdvertisedModelTools(e):isToolDefinitionList(e.tools)?filterSubagentToolDefinitionsAtDepthLimit(e.tools,e.session):filterSubagentToolMapAtDepthLimit(e.tools,e.session)}async function getAdvertisedModelTools(e){let i=filterSubagentToolMapAtDepthLimit(e.tools,e.session);if(e.workflow===void 0)return{harnessTools:i,modelTools:e.modelTools,session:e.session};let a=filterWorkflowHostToolsForRootSession(i,e.session);if(a.size===0)return{harnessTools:i,modelTools:e.modelTools,session:e.session};let o=ensureWorkflowContinuationSecurity(e.session),{modelTools:s}=await applyWorkflowTool({continuationSecurity:getWorkflowContinuationSecurity(o),harnessTools:a,lifecycle:e.workflow.lifecycle?.({session:o,tools:a}),tools:e.modelTools});return{harnessTools:i,modelTools:s,session:o}}function filterSubagentToolDefinitionsAtDepthLimit(t,n){let r=resolveSubagentDelegationLimit(n),i=[];for(let e of t)r.reached&&isDelegatedRuntimeActionTool(e)||i.push(e);return i}function filterSubagentToolMapAtDepthLimit(t,n){let r=resolveSubagentDelegationLimit(n),i=new Map;for(let[e,n]of t)r.reached&&isDelegatedRuntimeActionTool(n)||i.set(e,n);return i}function filterWorkflowHostToolsForRootSession(t,n){let r=new Map,i=resolveSubagentDelegationLimit(n);if(n.rootSessionId!==void 0||i.currentDepth>0)return r;for(let[e,n]of t)isDelegatedRuntimeActionTool(n)&&r.set(e,n);return r}function isDelegatedRuntimeActionTool(e){let t=e.runtimeAction;return t?.kind===`subagent-call`||t?.kind===`remote-agent-call`}function isToolDefinitionList(e){return Array.isArray(e)}export{getAdvertisedTools};
@@ -0,0 +1,17 @@
1
+ import type { HarnessSession } from "#harness/types.js";
2
+ import type { RuntimeActionRequest, RuntimeRemoteAgentCallActionRequest, RuntimeSubagentCallActionRequest } from "#runtime/actions/types.js";
3
+ export declare const DEFAULT_SUBAGENT_MAX_DEPTH = 3;
4
+ export type DelegatedRuntimeActionRequest = RuntimeRemoteAgentCallActionRequest | RuntimeSubagentCallActionRequest;
5
+ export type SubagentDelegationLimit = {
6
+ readonly currentDepth: number;
7
+ readonly maxDepth: number;
8
+ readonly nextChildDepth: number;
9
+ readonly reached: boolean;
10
+ };
11
+ export declare function resolveSubagentDelegationLimit(session: Pick<HarnessSession, "subagentDepth" | "subagentMaxDepth">): SubagentDelegationLimit;
12
+ export declare function readSerializedSubagentSessionDepth(serializedContext: Readonly<Record<string, unknown>>): {
13
+ readonly subagentDepth?: number;
14
+ readonly subagentMaxDepth?: number;
15
+ };
16
+ export declare function isSubagentDelegationAction(action: RuntimeActionRequest): action is DelegatedRuntimeActionRequest;
17
+ export declare function getSubagentDelegationName(action: DelegatedRuntimeActionRequest): string;
@@ -0,0 +1 @@
1
+ import{SubagentDepthKey,SubagentMaxDepthKey}from"#context/keys.js";const DEFAULT_SUBAGENT_MAX_DEPTH=3;function resolveSubagentDelegationLimit(e){let t=parseSubagentDepth(e.subagentDepth),n=parseSubagentMaxDepth(e.subagentMaxDepth)??3;return{currentDepth:t,maxDepth:n,nextChildDepth:t+1,reached:t>=n}}function readSerializedSubagentSessionDepth(n){let r=parseSubagentDepth(n[SubagentDepthKey.name]),i=parseSubagentMaxDepth(n[SubagentMaxDepthKey.name]);return{subagentDepth:r===0?void 0:r,subagentMaxDepth:i}}function isSubagentDelegationAction(e){return e.kind===`subagent-call`||e.kind===`remote-agent-call`}function getSubagentDelegationName(e){switch(e.kind){case`remote-agent-call`:return e.remoteAgentName;case`subagent-call`:return e.subagentName;default:return e}}function parseSubagentDepth(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:0}function parseSubagentMaxDepth(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}export{DEFAULT_SUBAGENT_MAX_DEPTH,getSubagentDelegationName,isSubagentDelegationAction,readSerializedSubagentSessionDepth,resolveSubagentDelegationLimit};
@@ -1 +1 @@
1
- import{createErrorId,createLogger,formatError,logError,recordErrorOnSpan}from"#internal/logging.js";import{isScheduleAppAuth}from"#channel/schedule-auth.js";import{AuthKey,ParentSessionKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{EmptyModelResponseError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,isNoOutputGeneratedError,summarizeKnownModelCallConfigError,summarizeKnownModelCallRequestError}from"#harness/model-call-error.js";import{toErrorMessage}from"#shared/errors.js";import{createActionResultEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createInputRequestedEvent,createResultCompletedEvent}from"#protocol/message.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{contextStorage}from"#context/container.js";import{ToolLoopAgent,isStepCount}from"ai";import{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{createRuntimeActionRequestFromToolCall,resolvePendingRuntimeActions,setPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{clearPendingWorkflowInterrupt,getPendingWorkflowInterrupt,setPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowRuntimeActionInterrupts,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{isAuthorizationSignal,setPendingAuthorization}from"#harness/authorization.js";import{resolveAssistantStepText}from"#harness/messages.js";import{buildDynamicInstructionMessages}from"#context/dynamic-instruction-lifecycle.js";import{PendingSkillAnnouncementKey}from"#context/dynamic-skill-lifecycle.js";import{consumeDeferredStepInput,getApprovedTools,hasDeferredStepInput,hasStepInput,resolvePendingInput,setPendingInputBatch}from"#harness/input-requests.js";import{CONDITIONAL_DELIVERY_INSTRUCTION,EMPTY_DELIVERY_SENTINEL,hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{readToolInterrupt}from"#harness/tool-interrupts.js";import{ASK_QUESTION_TOOL_NAME}from"#runtime/framework-tools/ask-question.js";import{extractQuestionInputRequests,extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{applyLastToolCacheBreakpoint,applySystemCacheBreakpoint,detectPromptCachePath,getAnthropicCacheMarker}from"#harness/prompt-cache.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{buildDynamicTools}from"#context/build-dynamic-tools.js";import{hydrateSandboxAttachments,stageAttachmentsToSandbox}from"#harness/attachment-staging.js";import{applyWorkflowTool,buildWorkflowHostTools}from"#harness/workflow-sandbox.js";import{ensureWorkflowContinuationSecurity,getWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{createWorkflowLifecycle}from"#harness/workflow-lifecycle.js";import{compactMessages,getInputTokenCount,resolveCompactionModel,shouldCompact}from"#harness/compaction.js";import{accumulateTurnUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{buildTelemetryRuntimeContext}from"#harness/instrumentation-runtime-context.js";import{getInstrumentationConfig}from"#harness/instrumentation-config.js";import{normalizeProviderToolHistory}from"#harness/provider-tool-history.js";import{extractWorkflowStreamWriteErrorDetails}from"#harness/workflow-stream-error.js";import{ensureOtelIntegration}from"#harness/otel-integration.js";import{resolveFrameworkToolFromUpstreamType}from"#harness/provider-tools.js";import{buildStepHooks,emitStepActions,isInvalidToolCall}from"#harness/step-hooks.js";import{buildToolApproval,buildToolSetFromDefinitions,buildToolSetWithProviderTools}from"#harness/tools.js";import{continueWorkflowSandboxInterrupt,getWorkflowSandboxInterrupt,unwrapWorkflowSandboxResult}from"#shared/workflow-sandbox.js";import{FINAL_OUTPUT_TOOL_NAME,buildFinalOutputTool}from"#runtime/framework-tools/final-output.js";const environment=process.env.NODE_ENV??`unknown`,eveVersion=resolveInstalledPackageInfo().version,log=createLogger(`harness.tool-loop`);function logToolExecutionError(e){e.toolOutput.type===`tool-error`&&logError(log,`tool execution failed`,e.toolOutput.error,{toolName:e.toolCall.toolName,toolCallId:e.toolCall.toolCallId})}function enrichTelemetry(e,t,n){if(e===void 0)return;let r={};for(let e of Object.keys(n??{}))r[e]=!0;return{functionId:e.functionId??t,includeRuntimeContext:r,isEnabled:!0,recordInputs:e.recordInputs??!0,recordOutputs:e.recordOutputs??!0}}function buildGatewayAttributionHeaders(e,t){if(typeof e!=`string`)return;let n=t?.agentName??t?.agentId,r=process.env.VERCEL_PROJECT_PRODUCTION_URL||process.env.VERCEL_URL,i=r?`https://${r}`:void 0;if(!n&&!i)return;let a={};return n&&(a[`x-title`]=n),i&&(a[`http-referer`]=i),a}const TURN_TRACE_STATE_KEY=`eve.harness.turnTrace`;function getTurnTraceState(e){return e.state?.[TURN_TRACE_STATE_KEY]}function setTurnTraceState(e,t){let n={traceId:t.traceId,spanId:t.spanId,traceFlags:t.traceFlags};return{...e,state:{...e.state,[TURN_TRACE_STATE_KEY]:n}}}function resolveStepOtelContext(e,t,n){if(t)return trace.setSpan(context.active(),t);if(e){let e=getTurnTraceState(n);if(e){let t=trace.wrapSpanContext({traceId:e.traceId,spanId:e.spanId,traceFlags:e.traceFlags});return trace.setSpan(context.active(),t)}}}function createToolLoopHarness(t){let n=t.handleEvent,c=getInstrumentationConfig();c!==void 0&&ensureOtelIntegration();let f=c===void 0?void 0:trace.getTracer(`eve`),p=t.runtimeIdentity?.agentName;async function runStep(e,t){let n;if(f&&hasStepInput(t)){let t=c?.functionId??p,r={"eve.version":eveVersion,"eve.environment":environment,"eve.session.id":e.sessionId};t&&(r[`ai.telemetry.functionId`]=t),n=f.startSpan(`ai.eve.turn`,{attributes:r})}let r=resolveStepOtelContext(f,n,e),executeStep=()=>executeStepBody(e,t,n);try{return r?await context.with(r,executeStep):await executeStep()}finally{n?.end()}}async function executeStepBody(f,v,y){let b=f;y&&(b=setTurnTraceState(b,y.spanContext()));let x=getHarnessEmissionState(b.state),S=consumeDeferredStepInput({input:v,session:b});b=S.session;let D=await resolvePendingRuntimeActions({emit:n,session:b,stepInput:S.input});if(D.outcome===`unresolved`)return{next:null,session:D.session};b=D.session;let O=resolvePendingInput({history:D.messages,resolveApprovalKey:resolveApprovalKeyFromTools(t.tools),session:b,stepInput:S.input});if(O.outcome===`unresolved`)return n&&O.deferredMessage===!0&&hasStepInput(v)?(x=await emitTurnPreamble(n,v??{},x,t.runtimeIdentity),x=await emitTurnEpilogue(n,x,t.mode),{next:null,session:setHarnessEmissionState(O.session,x)}):{next:null,session:O.session};if(n&&O.rejectedActions)for(let e of O.rejectedActions.results)await n(createActionResultEvent({rejected:!0,result:e,sequence:O.rejectedActions.event.sequence,stepIndex:O.rejectedActions.event.stepIndex,turnId:O.rejectedActions.event.turnId}));n&&hasStepInput(v)&&(x=await emitTurnPreamble(n,v??{},x,t.runtimeIdentity),b=setHarnessEmissionState(b,x),y&&y.setAttribute(`eve.turn.id`,x.turnId)),b=O.session,t.workflow===!0&&(b=ensureWorkflowContinuationSecurity(b));let k=O.messages;if(S.input?.context!==void 0)for(let e of S.input.context)k.push({content:e,role:`user`});if(S.input?.message!==void 0&&!O.deferredMessage&&!O.consumedMessage){let e=await stageAttachmentsToSandbox(S.input.message);k.push({content:e,role:`user`})}let A=await t.resolveModel(b.agent.modelReference),j=detectPromptCachePath(A),M=j.kind===`anthropic-direct`?getAnthropicCacheMarker():void 0,N=buildGatewayAttributionHeaders(A,t.runtimeIdentity);({messages:k,session:b}=await maybeCompact({emit:n,emissionState:x,headers:N,messages:k,model:A,onCompaction:t.onCompaction,resolveModel:t.resolveModel,session:b,telemetry:enrichTelemetry(c,p)??void 0}));let P=getApprovedTools(b),F=contextStorage.getStore(),I=b.outputSchema===void 0&&F!==void 0&&isScheduleAppAuth(F.get(AuthKey))&&F.get(ParentSessionKey)===void 0,L=await hydrateSandboxAttachments(k),R=[],z=[];for(let e of L)e.role===`system`?R.push(e):z.push(e);if(F!==void 0){R.push(...buildDynamicInstructionMessages(F));let e=F.get(PendingSkillAnnouncementKey);e!==void 0&&e.length>0&&R.push({role:`system`,content:e})}I&&R.push({role:`system`,content:CONDITIONAL_DELIVERY_INSTRUCTION});let B=z,prepareModelCallInput=e=>{let t=e?[{role:`system`,content:e}]:[],n=b.agent.system?[{role:`system`,content:b.agent.system}]:[],r=R.length>0||t.length>0?[...t,...n,...R]:void 0,i=r!==void 0&&M?applySystemCacheBreakpoint(r,M):r??b.agent.system??void 0;return{instructions:i,telemetryRuntimeContext:buildTelemetryRuntimeContext({eveVersion,authored:c,emissionState:x,environment,modelInput:{instructions:i,messages:B},session:b})}},runOneModelCall=async e=>{let{instructions:i,telemetryRuntimeContext:a={}}=e.preparedInput??prepareModelCallInput(e.extraSystemNote);e.retryReason&&(a[`eve.retry.reason`]=e.retryReason);let o=e.trailingUserNote?[...B,{role:`user`,content:e.trailingUserNote}]:B,s=await buildToolSetWithProviderTools({approvedTools:P,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,modelReference:b.agent.modelReference,tools:t.tools});if(F!==void 0){let n=buildDynamicTools(F),r=buildToolSetFromDefinitions({approvedTools:P,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,tools:n});for(let[e,t]of Object.entries(r))s[e]=t}b.outputSchema!==void 0&&(s[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(b.outputSchema));let u=t.workflow===!0?(await applyWorkflowTool({continuationSecurity:getWorkflowContinuationSecurity(b),harnessTools:t.tools,lifecycle:n===void 0?void 0:createWorkflowLifecycle({emit:n,emissionState:x,tools:t.tools}),tools:s})).modelTools:s,d=M?applyLastToolCacheBreakpoint(u,M):u,f=buildStepHooks({cachePath:j,emit:n,emissionState:x,emitStepStarted:e.suppressStepStartedEmission!==!0,marker:M,session:b}),h=new ToolLoopAgent({headers:N,instructions:i,model:A,onToolExecutionEnd:logToolExecutionError,onError(e){summarizeKnownModelCallConfigError(e.error)===null&&logError(log,`tool-loop stream error`,e.error)},onStepFinish:f.onStepFinish,prepareStep:f.prepareStep,reasoning:b.agent.reasoning,runtimeContext:a,stopWhen:isStepCount(1),telemetry:enrichTelemetry(c,p,a),toolApproval:buildToolApproval(u),tools:d}),executeModelCall=async()=>{if(n){let e=new Set([ASK_QUESTION_TOOL_NAME,FINAL_OUTPUT_TOOL_NAME]),r=await h.stream({messages:o}),{emittedActionCallIds:i,handledInlineToolResultCallIds:a,inlineAuthorizationResults:s,inlineToolResultParts:c}=await emitStreamContent(n,x,r.fullStream,{excludedActionToolNames:e,tools:t.tools}),u=await f.stepResult;if(isEmptyModelResponse(u)&&c.length===0&&s.length===0)throw new EmptyModelResponseError;if(await emitStepActions(n,x,u,{emittedActionCallIds:i,excludedActionToolNames:e,handledInlineToolResultCallIds:a,tools:t.tools}),c.length>0||s.length>0){let e=u.toolResults,t=new Map(e.map(e=>[e.toolCallId,e]));for(let e of s)t.set(e.toolCallId,e);return{content:u.content,finishReason:u.finishReason,response:{...u.response,...c.length>0?{messages:[{role:`tool`,content:[...c]},...u.response.messages]}:{}},text:u.text,toolCalls:u.toolCalls,toolResults:[...t.values()],usage:u.usage}}return u}await h.generate({messages:o});let e=await f.stepResult;if(isEmptyModelResponse(e))throw new EmptyModelResponseError;return e};return runModelCallWithRetries(()=>executeModelCall().catch(rethrowNoOutputAsEmptyResponse),{sessionId:b.sessionId,turnId:x.turnId})},V=prepareModelCallInput();n&&await emitStepStarted(n,x,k);let H=await continuePendingWorkflowInterrupt({childResults:S.input?.runtimeActionResults,config:t,emit:n,emissionState:x,runStep,session:b});if(H!==null)return H;let U;try{U=await runOneModelCall({preparedInput:V,suppressStepStartedEmission:!0})}catch(r){let a=await runModelCallRecoveryPipeline({error:r,stages:[e=>attemptUnsupportedProviderToolRecovery({error:e.error,runOneModelCall,sessionId:b.sessionId,turnId:x.turnId}),e=>attemptEmptyResponseRecovery({emptyDeliveryEnabled:I,error:e.error,retryCallOptions:e.retryCallOptions,runOneModelCall,sessionId:b.sessionId,turnId:x.turnId})]});if(a.outcome===`recovered`)U=a.result;else{let r=a.error;if(y&&recordErrorOnSpan(y,r),!n)throw r;let o=extractWorkflowStreamWriteErrorDetails(r);if(o!==null){let t=createErrorId();return log.error(`workflow stream write failed — parking session for retry by the user`,{...o,errorId:t,error:r,sessionId:b.sessionId,turnId:x.turnId}),x=await emitRecoverableFailedTurn(n,x,{code:`WORKFLOW_STREAM_WRITE_FAILED`,details:{...o,errorId:t},message:toErrorMessage(r)}),{next:null,session:setHarnessEmissionState(b,x)}}let s=classifyModelCallError(r),c=createErrorId(),l=s===`terminal`?summarizeKnownModelCallConfigError(r):null,f=l===null?summarizeKnownModelCallRequestError(r):null,p=l?.message??f?.message??toErrorMessage(r),_=extractModelCallErrorDetails(r),v=buildModelCallFailureDetails({configSummary:l,error:r,errorId:c,modelCallDetails:_,requestSummary:f}),S=buildModelCallFailureLogFields({error:r,errorId:c,modelCallDetails:_,requestSummary:f,sessionId:b.sessionId,turnId:x.turnId});return s===`terminal`?(l===null?log.error(f?.message??`model call failed terminally`,S):log.error(`${l.name}: ${l.message}`,{errorId:c,sessionId:b.sessionId,turnId:x.turnId}),await emitFailedStep(n,x,{code:`MODEL_CALL_FAILED`,details:v,message:p,sessionId:b.sessionId}),{next:{done:!0,output:``},session:b}):t.mode===`task`?(log.error(f?.message??`model call failed; failing the task run`,S),await emitFailedStep(n,x,{code:`MODEL_CALL_FAILED`,details:v,message:p,sessionId:b.sessionId}),{next:{done:!0,isError:!0,output:p},session:b}):(log.error(f?.message??`model call failed — parking session for retry by the user`,S),x=await emitRecoverableFailedTurn(n,x,{code:`MODEL_CALL_FAILED`,details:v,message:p}),{next:null,session:setHarnessEmissionState(b,x)})}}let W=accumulateTurnUsage({previous:getTurnUsageState(b.state),turnId:x.turnId,usage:U.usage??{}});b=setTurnUsageState(b,W);let G;try{G=formatLanguageModelGatewayId(A)}catch{G=void 0}return await setEveAttributes({"$eve.model":G,"$eve.input_tokens":W.inputTokens,"$eve.output_tokens":W.outputTokens,"$eve.cache_read_tokens":W.cacheReadTokens,"$eve.cache_write_tokens":W.cacheWriteTokens,"$eve.tool_count":t.tools.size}),handleStepResult({config:t,emit:n,emissionState:x,promptMessages:k,result:U,runStep,session:b})}return runStep}function buildModelCallFailureDetails(e){let{configSummary:t,error:r,errorId:i,modelCallDetails:a,requestSummary:o}=e;return t===null?o===null?{...formatError(r,i),...a}:{errorId:i,message:toErrorMessage(r),name:o.name,...a}:{errorId:i,message:t.message,name:t.name,...a}}function buildModelCallFailureLogFields(e){let t={errorId:e.errorId,sessionId:e.sessionId,turnId:e.turnId};return e.requestSummary===null?{...t,error:e.error}:{...t,details:e.modelCallDetails}}async function runModelCallRecoveryPipeline(e){let t=e.error,n;for(let r of e.stages){let e=await r({error:t,retryCallOptions:n});if(e.outcome===`recovered`)return e;e.outcome===`failed`&&(t=e.error,n=e.retryCallOptions)}return{outcome:`failed`,error:t}}async function attemptUnsupportedProviderToolRecovery(e){let t=extractUnsupportedProviderToolTypes(e.error);if(t.length===0)return{outcome:`skipped`};let n=[];for(let e of t){let t=resolveFrameworkToolFromUpstreamType(e);t!==null&&!n.includes(t)&&n.push(t)}if(n.length===0)return{outcome:`skipped`};log.warn(`disabling unsupported provider tool(s); retrying step once`,{disabled:n,sessionId:e.sessionId,turnId:e.turnId,upstreamTypes:t});let r={disabledProviderTools:new Set(n),extraSystemNote:buildDisabledToolNote(n)};try{return{outcome:`recovered`,result:await e.runOneModelCall({...r,suppressStepStartedEmission:!0})}}catch(e){return{outcome:`failed`,error:e,retryCallOptions:r}}}function buildDisabledToolNote(e){let t=e.join(`, `);return`The following ${e.length===1?`tool is`:`tools are`} not available with the current model and has been removed: ${t}. Proceed using the remaining tools or your training knowledge.`}function isEmptyModelResponse(e){return e.toolCalls.length===0&&e.toolResults.length===0&&resolveAssistantStepText(e.response.messages,e.text)===null}function rethrowNoOutputAsEmptyResponse(e){throw isNoOutputGeneratedError(e)?new EmptyModelResponseError({cause:e}):e}const EMPTY_RESPONSE_NUDGE=`Your previous reply was empty and was not delivered. Answer now from the tool results above; do not re-run tools or mention this notice.`;function buildEmptyResponseNudge(e){return e?`${EMPTY_RESPONSE_NUDGE} If the current task explicitly requires conditional delivery and there is nothing to report, reply with exactly ${EMPTY_DELIVERY_SENTINEL}.`:EMPTY_RESPONSE_NUDGE}async function attemptEmptyResponseRecovery(e){if(!(e.error instanceof EmptyModelResponseError))return{outcome:`skipped`};log.warn(`empty model response; reissuing the model call once`,{sessionId:e.sessionId,turnId:e.turnId});try{return{outcome:`recovered`,result:await e.runOneModelCall({...e.retryCallOptions,retryReason:`empty-response`,suppressStepStartedEmission:!0,trailingUserNote:buildEmptyResponseNudge(e.emptyDeliveryEnabled)})}}catch(t){return{outcome:`failed`,error:t,retryCallOptions:e.retryCallOptions}}}async function handleStepResult(e){let{config:t,emit:n,promptMessages:r,result:i,runStep:a}=e,{emissionState:o,session:s}=e,c=resolveAssistantStepText(i.response.messages,i.text),l=i.finishReason!==`tool-calls`&&i.toolCalls.length===0&&hasEmptyDeliverySentinel(c),u=l?[]:i.response.messages,d=l?null:c,f=new Set;for(let e of[...i.content??[],...i.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&f.add(e.toolCallId);let p=normalizeProviderToolHistory({messages:u,providerExecutedOutcomeIds:f}),m=p.messages,h={...s,compaction:createNextCompactionConfig(s.compaction,r,i)};if(t.workflow===!0){let e=await getWorkflowSandboxInterrupt(i,getWorkflowContinuationSecurity(h));if(e!==void 0){if(!isWorkflowRuntimeActionInterrupt(e))throw Error(`Unsupported Workflow interrupt kind "${e.payload.kind}".`);return parkOnWorkflowInterrupt({baseSession:h,emissionState:o,interrupt:e,promptMessages:r,responseMessages:m})}}let g=extractToolApprovalInputRequests({content:i.content??[]}),_=new Set(g.map(e=>e.action.callId)),y=extractQuestionInputRequests({toolCalls:i.toolCalls,excludedCallIds:_}),b=[...g,...y],S=(i.toolCalls??[]).filter(e=>!isInvalidToolCall(e)).filter(e=>t.tools.get(e.toolName)?.runtimeAction!==void 0).map(e=>createRuntimeActionRequestFromToolCall({toolCall:e,tools:t.tools}));if(S.length>0)return{next:null,session:setHarnessEmissionState(setPendingRuntimeActionBatch({actions:S,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:m,session:{...h,history:[...r]}}),o)};if(b.length>0){let e=setPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:b,responseMessages:m,session:{...h,history:[...r]}});return n&&(await n(createInputRequestedEvent({requests:b,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode),e=setHarnessEmissionState(e,o))),{next:null,session:e}}let C=findAuthorizationSignalFromToolResults(i.toolResults);if(C){let{challenges:e}=C;if(n)for(let t of e)await n(createAuthorizationRequiredEvent({authorization:t.challenge,name:t.name,description:t.challenge.instructions??`Authorization required for ${t.name}`,webhookUrl:t.hookUrl,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));return{next:null,session:setHarnessEmissionState({...h,history:[...r],state:setPendingAuthorization(h.state,{challenges:e})},o)}}let w=m,T=[...r,...w],E={...h,history:T};return!(E.outputSchema!==void 0&&extractFinalOutput(i)!==void 0)&&(w.at(-1)?.role===`tool`||p.outcomeEndsResponse||hasDeferredStepInput(E))?(n&&(o=advanceStep(o),E=setHarnessEmissionState(E,o)),{next:a,session:E}):t.mode===`task`?finishTaskTurn({emissionState:o,emit:n,history:r,result:i,schema:E.outputSchema,session:E,stepOutput:d}):finishConversationTurn({emissionState:o,emit:n,history:r,result:i,schema:E.outputSchema,session:E})}const OUTPUT_SCHEMA_NOT_FULFILLED={code:`OUTPUT_SCHEMA_NOT_FULFILLED`,message:`The agent could not produce a result matching the requested schema.`};function extractFinalOutput(e){return(e.toolCalls??[]).find(e=>e.toolName===FINAL_OUTPUT_TOOL_NAME)?.input}function persistStructuredAssistantTurn(e,t,n){return{...e,history:[...t,{content:JSON.stringify(n),role:`assistant`}],outputSchema:void 0}}async function emitStructuredResult(e,t,n,r){return await e(createResultCompletedEvent({result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),emitTurnEpilogue(e,t,r)}async function finishTaskTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:a??``},session:s};let c=extractFinalOutput(r);return c===void 0?(t&&await emitFailedStep(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,sessionId:s.sessionId}),{next:{done:!0,isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message},session:s}):(s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:c},session:s})}async function finishConversationTurn(e){let{emit:t,history:n,result:r,schema:i}=e,{emissionState:a,session:o}=e;if(i===void 0)return t&&(a=await emitTurnEpilogue(t,a,`conversation`),o=setHarnessEmissionState(o,a)),{next:null,session:o};let s=extractFinalOutput(r);return s===void 0?(t&&(a=await emitRecoverableFailedTurn(t,a,OUTPUT_SCHEMA_NOT_FULFILLED),o=setHarnessEmissionState(o,a)),{next:null,session:o}):(o=persistStructuredAssistantTurn(o,n,s),t&&(a=await emitStructuredResult(t,a,s,`conversation`),o=setHarnessEmissionState(o,a)),{next:null,session:o})}async function continuePendingWorkflowInterrupt(e){let t=getPendingWorkflowInterrupt(e.session.state);if(t===void 0)return null;let n=t.interrupt;if(!isWorkflowRuntimeActionInterrupt(n))throw Error(`Unsupported Workflow interrupt kind "${n.payload.kind}".`);let i=e.emit===void 0?void 0:createWorkflowLifecycle({emit:e.emit,emissionState:e.emissionState,skipReplayed:!0,tools:e.config.tools}),a=getWorkflowContinuationSecurity(e.session),o;try{let t=buildWorkflowHostTools({tools:e.config.tools}),r=e.childResults??[],s=n,c=0;for(;;){o=await continueWorkflowSandboxInterrupt({continuationSecurity:a,interrupt:s,lifecycle:i,resolution:r[c]?.output,tools:t});let e=await unwrapWorkflowSandboxResult(o,a);if(e.status!==`interrupted`||!isWorkflowRuntimeActionInterrupt(e.interrupt)||c+1>=r.length)break;let n=getWorkflowRuntimeActionInterrupts(e.interrupt)[0];if(n===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);c++,s=n}}catch(e){logError(log,`Workflow interrupt continuation failed`,e),o={error:`workflow_continuation_failed`,message:toErrorMessage(e),retryable:!1}}let s=await unwrapWorkflowSandboxResult(o,a),c=s.status===`interrupted`?s.interrupt:s.output,l=replaceWorkflowToolResult([...e.session.history,...t.responseMessages],n.outerToolCallId,c),u=clearPendingWorkflowInterrupt({...e.session,history:l});if(s.status===`interrupted`){if(!isWorkflowRuntimeActionInterrupt(s.interrupt))throw Error(`Unsupported Workflow interrupt kind "${s.interrupt.payload.kind}".`);let t=e.session.history.length,n=l.slice(0,t),r=l.slice(t);return u={...u,history:n},parkOnWorkflowInterrupt({baseSession:u,emissionState:e.emissionState,interrupt:s.interrupt,promptMessages:n,responseMessages:r})}return{next:e.runStep,session:u}}function replaceWorkflowToolResult(e,t,n){if(t===void 0)return[...e];let r=typeof n==`string`?{type:`text`,value:n}:{type:`json`,value:n};return e.map(e=>{if(e.role!==`tool`)return e;let n=e.content.map(e=>e.type!==`tool-result`||e.toolCallId!==t?e:{...e,output:r});return{...e,content:n}})}function parkOnWorkflowInterrupt(e){let t=getWorkflowRuntimeActionInterrupts(e.interrupt)[0];if(t===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);let n={...e.baseSession,history:[...e.promptMessages]};return{next:null,session:setHarnessEmissionState(setPendingWorkflowInterrupt({interrupt:t,responseMessages:e.responseMessages,session:n}),e.emissionState)}}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold};return n.usage?.inputTokens!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t.length),r}async function maybeCompact(e){let{emit:t,emissionState:n}=e,r=e.messages,i=e.session;if(!shouldCompact(r,i.compaction))return{messages:r,session:i};let a=await resolveCompactionModel({compactionModelReference:i.agent.compactionModelReference,model:e.model,modelReference:i.agent.modelReference,resolveModel:e.resolveModel});if(t&&await t(createCompactionRequestedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId,usageInputTokens:getInputTokenCount(r,i.compaction)})),r=await compactMessages(r,a.model,i.compaction,a.providerOptions,e.telemetry,e.headers),e.onCompaction)for(let t of e.onCompaction())r.push(t);return t&&await t(createCompactionCompletedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId})),{messages:r,session:i}}function resolveApprovalKeyFromTools(e){return t=>{let n=e.get(t.action.toolName);if(n?.approvalKey!==void 0)return n.approvalKey(t.action.input)}}async function runModelCallWithRetries(e,t){for(let n=1;;n++)try{return await e()}catch(e){if(n===3||classifyModelCallError(e)!==`retry`)throw e;let r=500*2**(n-1)+Math.floor(Math.random()*250);log.warn(`model call failed transiently — retrying`,{attempt:n,delayMs:r,sessionId:t.sessionId,turnId:t.turnId,error:e}),await new Promise(e=>setTimeout(e,r))}}function findAuthorizationSignalFromToolResults(e){let t=contextStorage.getStore();if(t!==void 0)for(let n of e??[]){let e=readToolInterrupt(t,n.toolCallId);if(e!==void 0&&isAuthorizationSignal(e))return e}for(let t of e??[])if(isAuthorizationSignal(t.output))return t.output}export{createToolLoopHarness};
1
+ import{createErrorId,createLogger,formatError,logError,recordErrorOnSpan}from"#internal/logging.js";import{isScheduleAppAuth}from"#channel/schedule-auth.js";import{AuthKey,ParentSessionKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{EmptyModelResponseError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,isNoOutputGeneratedError,summarizeKnownModelCallConfigError,summarizeKnownModelCallRequestError}from"#harness/model-call-error.js";import{toErrorMessage}from"#shared/errors.js";import{createActionResultEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createInputRequestedEvent,createResultCompletedEvent}from"#protocol/message.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{contextStorage}from"#context/container.js";import{ToolLoopAgent,isStepCount}from"ai";import{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{createRuntimeActionRequestFromToolCall,resolvePendingRuntimeActions,setPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{clearPendingWorkflowInterrupt,getPendingWorkflowInterrupt,setPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowRuntimeActionInterrupts,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{isAuthorizationSignal,setPendingAuthorization}from"#harness/authorization.js";import{resolveAssistantStepText}from"#harness/messages.js";import{buildDynamicInstructionMessages}from"#context/dynamic-instruction-lifecycle.js";import{PendingSkillAnnouncementKey}from"#context/dynamic-skill-lifecycle.js";import{consumeDeferredStepInput,getApprovedTools,hasDeferredStepInput,hasStepInput,resolvePendingInput,setPendingInputBatch}from"#harness/input-requests.js";import{getWorkflowContinuationSecurity,readWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{buildWorkflowHostTools}from"#harness/workflow-sandbox.js";import{CONDITIONAL_DELIVERY_INSTRUCTION,EMPTY_DELIVERY_SENTINEL,hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{readToolInterrupt}from"#harness/tool-interrupts.js";import{ASK_QUESTION_TOOL_NAME}from"#runtime/framework-tools/ask-question.js";import{extractQuestionInputRequests,extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{applyLastToolCacheBreakpoint,applySystemCacheBreakpoint,detectPromptCachePath,getAnthropicCacheMarker}from"#harness/prompt-cache.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{buildDynamicTools}from"#context/build-dynamic-tools.js";import{hydrateSandboxAttachments,stageAttachmentsToSandbox}from"#harness/attachment-staging.js";import{createWorkflowLifecycle}from"#harness/workflow-lifecycle.js";import{compactMessages,getInputTokenCount,resolveCompactionModel,shouldCompact}from"#harness/compaction.js";import{accumulateTurnUsage,getSessionTokenLimitViolation,getSessionTokenUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{buildTelemetryRuntimeContext}from"#harness/instrumentation-runtime-context.js";import{getInstrumentationConfig}from"#harness/instrumentation-config.js";import{normalizeProviderToolHistory}from"#harness/provider-tool-history.js";import{extractWorkflowStreamWriteErrorDetails}from"#harness/workflow-stream-error.js";import{ensureOtelIntegration}from"#harness/otel-integration.js";import{getAdvertisedTools}from"#harness/advertised-tools.js";import{resolveFrameworkToolFromUpstreamType}from"#harness/provider-tools.js";import{buildStepHooks,emitStepActions,isInvalidToolCall}from"#harness/step-hooks.js";import{buildToolApproval,buildToolSetFromDefinitions,buildToolSetWithProviderTools}from"#harness/tools.js";import{continueWorkflowSandboxInterrupt,getWorkflowSandboxInterrupt,unwrapWorkflowSandboxResult}from"#shared/workflow-sandbox.js";import{FINAL_OUTPUT_TOOL_NAME,buildFinalOutputTool}from"#runtime/framework-tools/final-output.js";const environment=process.env.NODE_ENV??`unknown`,eveVersion=resolveInstalledPackageInfo().version,log=createLogger(`harness.tool-loop`);function logToolExecutionError(e){e.toolOutput.type===`tool-error`&&logError(log,`tool execution failed`,e.toolOutput.error,{toolName:e.toolCall.toolName,toolCallId:e.toolCall.toolCallId})}function enrichTelemetry(e,t,n){if(e===void 0)return;let r={};for(let e of Object.keys(n??{}))r[e]=!0;return{functionId:e.functionId??t,includeRuntimeContext:r,isEnabled:!0,recordInputs:e.recordInputs??!0,recordOutputs:e.recordOutputs??!0}}function buildGatewayAttributionHeaders(e,t){if(typeof e!=`string`)return;let n=t?.agentName??t?.agentId,r=process.env.VERCEL_PROJECT_PRODUCTION_URL||process.env.VERCEL_URL,i=r?`https://${r}`:void 0;if(!n&&!i)return;let a={};return n&&(a[`x-title`]=n),i&&(a[`http-referer`]=i),a}const TURN_TRACE_STATE_KEY=`eve.harness.turnTrace`;function getTurnTraceState(e){return e.state?.[TURN_TRACE_STATE_KEY]}function setTurnTraceState(e,t){let n={traceId:t.traceId,spanId:t.spanId,traceFlags:t.traceFlags};return{...e,state:{...e.state,[TURN_TRACE_STATE_KEY]:n}}}function resolveStepOtelContext(e,t,n){if(t)return trace.setSpan(context.active(),t);if(e){let e=getTurnTraceState(n);if(e){let t=trace.wrapSpanContext({traceId:e.traceId,spanId:e.spanId,traceFlags:e.traceFlags});return trace.setSpan(context.active(),t)}}}function createToolLoopHarness(t){let n=t.handleEvent,c=getInstrumentationConfig();c!==void 0&&ensureOtelIntegration();let f=c===void 0?void 0:trace.getTracer(`eve`),p=t.runtimeIdentity?.agentName;async function runStep(e,t){let n;if(f&&hasStepInput(t)){let t=c?.functionId??p,r={"eve.version":eveVersion,"eve.environment":environment,"eve.session.id":e.sessionId};t&&(r[`ai.telemetry.functionId`]=t),n=f.startSpan(`ai.eve.turn`,{attributes:r})}let r=resolveStepOtelContext(f,n,e),executeStep=()=>executeStepBody(e,t,n);try{return r?await context.with(r,executeStep):await executeStep()}finally{n?.end()}}async function executeStepBody(f,v,y){let b=f;y&&(b=setTurnTraceState(b,y.spanContext()));let x=getHarnessEmissionState(b.state),S=consumeDeferredStepInput({input:v,session:b});b=S.session;let D=await resolvePendingRuntimeActions({emit:n,session:b,stepInput:S.input});if(D.outcome===`unresolved`)return{next:null,session:D.session};b=D.session;let A=resolvePendingInput({history:D.messages,resolveApprovalKey:resolveApprovalKeyFromTools(t.tools),session:b,stepInput:S.input});if(A.outcome===`unresolved`)return n&&A.deferredMessage===!0&&hasStepInput(v)?(x=await emitTurnPreamble(n,v??{},x,t.runtimeIdentity),x=await emitTurnEpilogue(n,x,t.mode),{next:null,session:setHarnessEmissionState(A.session,x)}):{next:null,session:A.session};if(n&&A.rejectedActions)for(let e of A.rejectedActions.results)await n(createActionResultEvent({rejected:!0,result:e,sequence:A.rejectedActions.event.sequence,stepIndex:A.rejectedActions.event.stepIndex,turnId:A.rejectedActions.event.turnId}));n&&hasStepInput(v)&&(x=await emitTurnPreamble(n,v??{},x,t.runtimeIdentity),b=setHarnessEmissionState(b,x),y&&y.setAttribute(`eve.turn.id`,x.turnId)),b=A.session;let j=A.messages;if(S.input?.context!==void 0)for(let e of S.input.context)j.push({content:e,role:`user`});if(S.input?.message!==void 0&&!A.deferredMessage&&!A.consumedMessage){let e=await stageAttachmentsToSandbox(S.input.message);j.push({content:e,role:`user`})}let M=await t.resolveModel(b.agent.modelReference),N=detectPromptCachePath(M),P=N.kind===`anthropic-direct`?getAnthropicCacheMarker():void 0,F=buildGatewayAttributionHeaders(M,t.runtimeIdentity);({messages:j,session:b}=await maybeCompact({emit:n,emissionState:x,headers:F,messages:j,model:M,onCompaction:t.onCompaction,resolveModel:t.resolveModel,session:b,telemetry:enrichTelemetry(c,p)??void 0}));let I=getApprovedTools(b),L=contextStorage.getStore(),R=b.outputSchema===void 0&&L!==void 0&&isScheduleAppAuth(L.get(AuthKey))&&L.get(ParentSessionKey)===void 0,z=await hydrateSandboxAttachments(j),B=[],V=[];for(let e of z)e.role===`system`?B.push(e):V.push(e);if(L!==void 0){B.push(...buildDynamicInstructionMessages(L));let e=L.get(PendingSkillAnnouncementKey);e!==void 0&&e.length>0&&B.push({role:`system`,content:e})}R&&B.push({role:`system`,content:CONDITIONAL_DELIVERY_INSTRUCTION});let H=V,prepareModelCallInput=e=>{let t=e?[{role:`system`,content:e}]:[],n=b.agent.system?[{role:`system`,content:b.agent.system}]:[],r=B.length>0||t.length>0?[...t,...n,...B]:void 0,i=r!==void 0&&P?applySystemCacheBreakpoint(r,P):r??b.agent.system??void 0;return{instructions:i,telemetryRuntimeContext:buildTelemetryRuntimeContext({eveVersion,authored:c,emissionState:x,environment,modelInput:{instructions:i,messages:H},session:b})}},runOneModelCall=async e=>{let{instructions:i,telemetryRuntimeContext:a={}}=e.preparedInput??prepareModelCallInput(e.extraSystemNote);e.retryReason&&(a[`eve.retry.reason`]=e.retryReason);let o=e.trailingUserNote?[...H,{role:`user`,content:e.trailingUserNote}]:H,s=getAdvertisedTools({session:b,tools:t.tools}),u=await buildToolSetWithProviderTools({approvedTools:I,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,modelReference:b.agent.modelReference,tools:s});if(L!==void 0){let n=getAdvertisedTools({session:b,tools:buildDynamicTools(L)}),r=buildToolSetFromDefinitions({approvedTools:I,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,tools:n});for(let[e,t]of Object.entries(r))u[e]=t}b.outputSchema!==void 0&&(u[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(b.outputSchema));let d=n===void 0?void 0:({tools:e})=>createWorkflowLifecycle({emit:n,emissionState:x,tools:e}),f=t.workflow===!0?{lifecycle:d}:void 0,h=await getAdvertisedTools({modelTools:u,session:b,tools:s,workflow:f});b=h.session;let g=h.modelTools,_=P?applyLastToolCacheBreakpoint(g,P):g,v=buildStepHooks({cachePath:N,emit:n,emissionState:x,emitStepStarted:e.suppressStepStartedEmission!==!0,marker:P,session:b}),y=new ToolLoopAgent({headers:F,instructions:i,model:M,onToolExecutionEnd:logToolExecutionError,onError(e){summarizeKnownModelCallConfigError(e.error)===null&&logError(log,`tool-loop stream error`,e.error)},onStepFinish:v.onStepFinish,prepareStep:v.prepareStep,reasoning:b.agent.reasoning,runtimeContext:a,stopWhen:isStepCount(1),telemetry:enrichTelemetry(c,p,a),toolApproval:buildToolApproval(g),tools:_}),executeModelCall=async()=>{if(n){let e=[...t.tools].filter(([e,t])=>t.runtimeAction!==void 0&&s.get(e)===void 0).map(([e])=>e),r=new Set([ASK_QUESTION_TOOL_NAME,FINAL_OUTPUT_TOOL_NAME,...e]),i=await y.stream({messages:o}),{emittedActionCallIds:a,handledInlineToolResultCallIds:c,inlineAuthorizationResults:u,inlineToolResultParts:d}=await emitStreamContent(n,x,i.fullStream,{excludedActionToolNames:r,tools:t.tools}),f=await v.stepResult;if(isEmptyModelResponse(f)&&d.length===0&&u.length===0)throw new EmptyModelResponseError;if(await emitStepActions(n,x,f,{emittedActionCallIds:a,excludedActionToolNames:r,handledInlineToolResultCallIds:c,tools:s}),d.length>0||u.length>0){let e=f.toolResults,t=new Map(e.map(e=>[e.toolCallId,e]));for(let e of u)t.set(e.toolCallId,e);return{content:f.content,finishReason:f.finishReason,response:{...f.response,...d.length>0?{messages:[{role:`tool`,content:[...d]},...f.response.messages]}:{}},text:f.text,toolCalls:f.toolCalls,toolResults:[...t.values()],usage:f.usage}}return f}await y.generate({messages:o});let e=await v.stepResult;if(isEmptyModelResponse(e))throw new EmptyModelResponseError;return e};return runModelCallWithRetries(()=>executeModelCall().catch(rethrowNoOutputAsEmptyResponse),{sessionId:b.sessionId,turnId:x.turnId})},U=prepareModelCallInput();n&&await emitStepStarted(n,x,j);let W=await continuePendingWorkflowInterrupt({childResults:S.input?.runtimeActionResults,config:t,emit:n,emissionState:x,runStep,session:b});if(W!==null)return W;let G=getSessionTokenLimitViolation(b);if(G!==null)return failSessionTokenLimit({config:t,emit:n,emissionState:x,session:b,violation:G});let K;try{K=await runOneModelCall({preparedInput:U,suppressStepStartedEmission:!0})}catch(r){let a=await runModelCallRecoveryPipeline({error:r,stages:[e=>attemptUnsupportedProviderToolRecovery({error:e.error,runOneModelCall,sessionId:b.sessionId,turnId:x.turnId}),e=>attemptEmptyResponseRecovery({emptyDeliveryEnabled:R,error:e.error,retryCallOptions:e.retryCallOptions,runOneModelCall,sessionId:b.sessionId,turnId:x.turnId})]});if(a.outcome===`recovered`)K=a.result;else{let r=a.error;if(y&&recordErrorOnSpan(y,r),!n)throw r;let o=extractWorkflowStreamWriteErrorDetails(r);if(o!==null){let t=createErrorId();return log.error(`workflow stream write failed — parking session for retry by the user`,{...o,errorId:t,error:r,sessionId:b.sessionId,turnId:x.turnId}),x=await emitRecoverableFailedTurn(n,x,{code:`WORKFLOW_STREAM_WRITE_FAILED`,details:{...o,errorId:t},message:toErrorMessage(r)}),{next:null,session:setHarnessEmissionState(b,x)}}let s=classifyModelCallError(r),c=createErrorId(),l=s===`terminal`?summarizeKnownModelCallConfigError(r):null,f=l===null?summarizeKnownModelCallRequestError(r):null,p=l?.message??f?.message??toErrorMessage(r),_=extractModelCallErrorDetails(r),v=buildModelCallFailureDetails({configSummary:l,error:r,errorId:c,modelCallDetails:_,requestSummary:f}),S=buildModelCallFailureLogFields({error:r,errorId:c,modelCallDetails:_,requestSummary:f,sessionId:b.sessionId,turnId:x.turnId});return s===`terminal`?(l===null?log.error(f?.message??`model call failed terminally`,S):log.error(`${l.name}: ${l.message}`,{errorId:c,sessionId:b.sessionId,turnId:x.turnId}),await emitFailedStep(n,x,{code:`MODEL_CALL_FAILED`,details:v,message:p,sessionId:b.sessionId}),{next:{done:!0,output:``},session:b}):t.mode===`task`?(log.error(f?.message??`model call failed; failing the task run`,S),await emitFailedStep(n,x,{code:`MODEL_CALL_FAILED`,details:v,message:p,sessionId:b.sessionId}),{next:{done:!0,isError:!0,output:p},session:b}):(log.error(f?.message??`model call failed — parking session for retry by the user`,S),x=await emitRecoverableFailedTurn(n,x,{code:`MODEL_CALL_FAILED`,details:v,message:p}),{next:null,session:setHarnessEmissionState(b,x)})}}let q=accumulateTurnUsage({previous:getTurnUsageState(b.state),turnId:x.turnId,usage:extractTokenUsageDelta(K.usage)});b=setTurnUsageState(b,q);let J;try{J=formatLanguageModelGatewayId(M)}catch{J=void 0}return await setEveAttributes({"$eve.model":J,"$eve.input_tokens":q.inputTokens,"$eve.output_tokens":q.outputTokens,"$eve.cache_read_tokens":q.cacheReadTokens,"$eve.cache_write_tokens":q.cacheWriteTokens,"$eve.tool_count":t.tools.size}),handleStepResult({config:t,emit:n,emissionState:x,promptMessages:j,result:K,runStep,session:b})}return runStep}function extractTokenUsageDelta(e){if(e!==void 0)return{cacheReadTokens:e.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:e.inputTokenDetails?.cacheWriteTokens,inputTokens:e.inputTokens,outputTokens:e.outputTokens}}function formatSessionTokenLimitMessage(e){return`The session reached its configured ${e} token limit.`}async function failSessionTokenLimit(e){let t=getSessionTokenUsage(e.session),n=formatSessionTokenLimitMessage(e.violation.kind),r={inputTokens:t.inputTokens,kind:e.violation.kind,limit:e.violation.limit,outputTokens:t.outputTokens,usedTokens:e.violation.usedTokens};return e.emit&&await emitFailedStep(e.emit,e.emissionState,{code:`SESSION_TOKEN_LIMIT_REACHED`,details:r,message:n,sessionId:e.session.sessionId}),{next:{done:!0,isError:e.config.mode===`task`?!0:void 0,output:e.config.mode===`task`?n:``},session:e.session}}function buildModelCallFailureDetails(e){let{configSummary:t,error:r,errorId:i,modelCallDetails:a,requestSummary:o}=e;return t===null?o===null?{...formatError(r,i),...a}:{errorId:i,message:toErrorMessage(r),name:o.name,...a}:{errorId:i,message:t.message,name:t.name,...a}}function buildModelCallFailureLogFields(e){let t={errorId:e.errorId,sessionId:e.sessionId,turnId:e.turnId};return e.requestSummary===null?{...t,error:e.error}:{...t,details:e.modelCallDetails}}async function runModelCallRecoveryPipeline(e){let t=e.error,n;for(let r of e.stages){let e=await r({error:t,retryCallOptions:n});if(e.outcome===`recovered`)return e;e.outcome===`failed`&&(t=e.error,n=e.retryCallOptions)}return{outcome:`failed`,error:t}}async function attemptUnsupportedProviderToolRecovery(e){let t=extractUnsupportedProviderToolTypes(e.error);if(t.length===0)return{outcome:`skipped`};let n=[];for(let e of t){let t=resolveFrameworkToolFromUpstreamType(e);t!==null&&!n.includes(t)&&n.push(t)}if(n.length===0)return{outcome:`skipped`};log.warn(`disabling unsupported provider tool(s); retrying step once`,{disabled:n,sessionId:e.sessionId,turnId:e.turnId,upstreamTypes:t});let r={disabledProviderTools:new Set(n),extraSystemNote:buildDisabledToolNote(n)};try{return{outcome:`recovered`,result:await e.runOneModelCall({...r,suppressStepStartedEmission:!0})}}catch(e){return{outcome:`failed`,error:e,retryCallOptions:r}}}function buildDisabledToolNote(e){let t=e.join(`, `);return`The following ${e.length===1?`tool is`:`tools are`} not available with the current model and has been removed: ${t}. Proceed using the remaining tools or your training knowledge.`}function isEmptyModelResponse(e){return e.toolCalls.length===0&&e.toolResults.length===0&&resolveAssistantStepText(e.response.messages,e.text)===null}function rethrowNoOutputAsEmptyResponse(e){throw isNoOutputGeneratedError(e)?new EmptyModelResponseError({cause:e}):e}const EMPTY_RESPONSE_NUDGE=`Your previous reply was empty and was not delivered. Answer now from the tool results above; do not re-run tools or mention this notice.`;function buildEmptyResponseNudge(e){return e?`${EMPTY_RESPONSE_NUDGE} If the current task explicitly requires conditional delivery and there is nothing to report, reply with exactly ${EMPTY_DELIVERY_SENTINEL}.`:EMPTY_RESPONSE_NUDGE}async function attemptEmptyResponseRecovery(e){if(!(e.error instanceof EmptyModelResponseError))return{outcome:`skipped`};log.warn(`empty model response; reissuing the model call once`,{sessionId:e.sessionId,turnId:e.turnId});try{return{outcome:`recovered`,result:await e.runOneModelCall({...e.retryCallOptions,retryReason:`empty-response`,suppressStepStartedEmission:!0,trailingUserNote:buildEmptyResponseNudge(e.emptyDeliveryEnabled)})}}catch(t){return{outcome:`failed`,error:t,retryCallOptions:e.retryCallOptions}}}async function handleStepResult(e){let{config:t,emit:n,promptMessages:r,result:i,runStep:a}=e,{emissionState:o,session:s}=e,c=resolveAssistantStepText(i.response.messages,i.text),l=i.finishReason!==`tool-calls`&&i.toolCalls.length===0&&hasEmptyDeliverySentinel(c),u=l?[]:i.response.messages,d=l?null:c,f=new Set;for(let e of[...i.content??[],...i.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&f.add(e.toolCallId);let p=normalizeProviderToolHistory({messages:u,providerExecutedOutcomeIds:f}),m=p.messages,h={...s,compaction:createNextCompactionConfig(s.compaction,r,i)},g=t.workflow===!0?readWorkflowContinuationSecurity(h):void 0;if(g!==void 0){let e=await getWorkflowSandboxInterrupt(i,g);if(e!==void 0){if(!isWorkflowRuntimeActionInterrupt(e))throw Error(`Unsupported Workflow interrupt kind "${e.payload.kind}".`);return parkOnWorkflowInterrupt({baseSession:h,emissionState:o,interrupt:e,promptMessages:r,responseMessages:m})}}let _=extractToolApprovalInputRequests({content:i.content??[]}),y=new Set(_.map(e=>e.action.callId)),b=extractQuestionInputRequests({toolCalls:i.toolCalls,excludedCallIds:y}),S=[..._,...b],C=getAdvertisedTools({session:h,tools:t.tools}),w=(i.toolCalls??[]).filter(e=>!isInvalidToolCall(e)).filter(e=>t.tools.get(e.toolName)?.runtimeAction!==void 0).filter(e=>C.get(e.toolName)?.runtimeAction===void 0?(log.warn(`runtime action tool call blocked because tool is not advertised`,{callId:e.toolCallId,sessionId:h.sessionId,toolName:e.toolName}),!1):!0).map(e=>createRuntimeActionRequestFromToolCall({toolCall:e,tools:C}));if(w.length>0)return{next:null,session:setHarnessEmissionState(setPendingRuntimeActionBatch({actions:w,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:m,session:{...h,history:[...r]}}),o)};if(S.length>0){let e=setPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:S,responseMessages:m,session:{...h,history:[...r]}});return n&&(await n(createInputRequestedEvent({requests:S,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode),e=setHarnessEmissionState(e,o))),{next:null,session:e}}let T=findAuthorizationSignalFromToolResults(i.toolResults);if(T){let{challenges:e}=T;if(n)for(let t of e)await n(createAuthorizationRequiredEvent({authorization:t.challenge,name:t.name,description:t.challenge.instructions??`Authorization required for ${t.name}`,webhookUrl:t.hookUrl,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));return{next:null,session:setHarnessEmissionState({...h,history:[...r],state:setPendingAuthorization(h.state,{challenges:e})},o)}}let E=m,O=[...r,...E],k={...h,history:O};return!(k.outputSchema!==void 0&&extractFinalOutput(i)!==void 0)&&(E.at(-1)?.role===`tool`||p.outcomeEndsResponse||hasDeferredStepInput(k))?(n&&(o=advanceStep(o),k=setHarnessEmissionState(k,o)),{next:a,session:k}):t.mode===`task`?finishTaskTurn({emissionState:o,emit:n,history:r,result:i,schema:k.outputSchema,session:k,stepOutput:d}):finishConversationTurn({emissionState:o,emit:n,history:r,result:i,schema:k.outputSchema,session:k})}const OUTPUT_SCHEMA_NOT_FULFILLED={code:`OUTPUT_SCHEMA_NOT_FULFILLED`,message:`The agent could not produce a result matching the requested schema.`};function extractFinalOutput(e){return(e.toolCalls??[]).find(e=>e.toolName===FINAL_OUTPUT_TOOL_NAME)?.input}function persistStructuredAssistantTurn(e,t,n){return{...e,history:[...t,{content:JSON.stringify(n),role:`assistant`}],outputSchema:void 0}}async function emitStructuredResult(e,t,n,r){return await e(createResultCompletedEvent({result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),emitTurnEpilogue(e,t,r)}async function finishTaskTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:a??``},session:s};let c=extractFinalOutput(r);return c===void 0?(t&&await emitFailedStep(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,sessionId:s.sessionId}),{next:{done:!0,isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message},session:s}):(s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:c},session:s})}async function finishConversationTurn(e){let{emit:t,history:n,result:r,schema:i}=e,{emissionState:a,session:o}=e;if(i===void 0)return t&&(a=await emitTurnEpilogue(t,a,`conversation`),o=setHarnessEmissionState(o,a)),{next:null,session:o};let s=extractFinalOutput(r);return s===void 0?(t&&(a=await emitRecoverableFailedTurn(t,a,OUTPUT_SCHEMA_NOT_FULFILLED),o=setHarnessEmissionState(o,a)),{next:null,session:o}):(o=persistStructuredAssistantTurn(o,n,s),t&&(a=await emitStructuredResult(t,a,s,`conversation`),o=setHarnessEmissionState(o,a)),{next:null,session:o})}async function continuePendingWorkflowInterrupt(e){let t=getPendingWorkflowInterrupt(e.session.state);if(t===void 0)return null;let n=t.interrupt;if(!isWorkflowRuntimeActionInterrupt(n))throw Error(`Unsupported Workflow interrupt kind "${n.payload.kind}".`);let i=e.emit===void 0?void 0:createWorkflowLifecycle({emit:e.emit,emissionState:e.emissionState,skipReplayed:!0,tools:e.config.tools}),a=getWorkflowContinuationSecurity(e.session),o;try{let t=buildWorkflowHostTools({tools:e.config.tools}),r=e.childResults??[],s=n,c=0;for(;;){o=await continueWorkflowSandboxInterrupt({continuationSecurity:a,interrupt:s,lifecycle:i,resolution:r[c]?.output,tools:t});let e=await unwrapWorkflowSandboxResult(o,a);if(e.status!==`interrupted`||!isWorkflowRuntimeActionInterrupt(e.interrupt)||c+1>=r.length)break;let n=getWorkflowRuntimeActionInterrupts(e.interrupt)[0];if(n===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);c++,s=n}}catch(e){logError(log,`Workflow interrupt continuation failed`,e),o={error:`workflow_continuation_failed`,message:toErrorMessage(e),retryable:!1}}let s=await unwrapWorkflowSandboxResult(o,a),c=s.status===`interrupted`?s.interrupt:s.output,l=replaceWorkflowToolResult([...e.session.history,...t.responseMessages],n.outerToolCallId,c),u=clearPendingWorkflowInterrupt({...e.session,history:l});if(s.status===`interrupted`){if(!isWorkflowRuntimeActionInterrupt(s.interrupt))throw Error(`Unsupported Workflow interrupt kind "${s.interrupt.payload.kind}".`);let t=e.session.history.length,n=l.slice(0,t),r=l.slice(t);return u={...u,history:n},parkOnWorkflowInterrupt({baseSession:u,emissionState:e.emissionState,interrupt:s.interrupt,promptMessages:n,responseMessages:r})}return{next:e.runStep,session:u}}function replaceWorkflowToolResult(e,t,n){if(t===void 0)return[...e];let r=typeof n==`string`?{type:`text`,value:n}:{type:`json`,value:n};return e.map(e=>{if(e.role!==`tool`)return e;let n=e.content.map(e=>e.type!==`tool-result`||e.toolCallId!==t?e:{...e,output:r});return{...e,content:n}})}function parkOnWorkflowInterrupt(e){let t=getWorkflowRuntimeActionInterrupts(e.interrupt)[0];if(t===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);let n={...e.baseSession,history:[...e.promptMessages]};return{next:null,session:setHarnessEmissionState(setPendingWorkflowInterrupt({interrupt:t,responseMessages:e.responseMessages,session:n}),e.emissionState)}}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold};return n.usage?.inputTokens!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t.length),r}async function maybeCompact(e){let{emit:t,emissionState:n}=e,r=e.messages,i=e.session;if(!shouldCompact(r,i.compaction))return{messages:r,session:i};let a=await resolveCompactionModel({compactionModelReference:i.agent.compactionModelReference,model:e.model,modelReference:i.agent.modelReference,resolveModel:e.resolveModel});if(t&&await t(createCompactionRequestedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId,usageInputTokens:getInputTokenCount(r,i.compaction)})),r=await compactMessages(r,a.model,i.compaction,a.providerOptions,e.telemetry,e.headers),e.onCompaction)for(let t of e.onCompaction())r.push(t);return t&&await t(createCompactionCompletedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId})),{messages:r,session:i}}function resolveApprovalKeyFromTools(e){return t=>{let n=e.get(t.action.toolName);if(n?.approvalKey!==void 0)return n.approvalKey(t.action.input)}}async function runModelCallWithRetries(e,t){for(let n=1;;n++)try{return await e()}catch(e){if(n===3||classifyModelCallError(e)!==`retry`)throw e;let r=500*2**(n-1)+Math.floor(Math.random()*250);log.warn(`model call failed transiently — retrying`,{attempt:n,delayMs:r,sessionId:t.sessionId,turnId:t.turnId,error:e}),await new Promise(e=>setTimeout(e,r))}}function findAuthorizationSignalFromToolResults(e){let t=contextStorage.getStore();if(t!==void 0)for(let n of e??[]){let e=readToolInterrupt(t,n.toolCallId);if(e!==void 0&&isAuthorizationSignal(e))return e}for(let t of e??[])if(isAuthorizationSignal(t.output))return t.output}export{createToolLoopHarness};
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Per-turn rolling token-usage accumulator for `$eve.*` observability
3
- * tags. Lives on `session.state` so the totals survive workflow step
4
- * boundaries the way the rest of the harness state does.
2
+ * Token-usage accumulator for `$eve.*` observability tags and session limits.
3
+ * Lives on `session.state` so the totals survive workflow step boundaries the
4
+ * way the rest of the harness state does.
5
5
  *
6
6
  * The harness runs each turn as a sequence of `"use step"` invocations
7
7
  * (one per tool-loop iteration). Each step knows its own
@@ -11,27 +11,42 @@
11
11
  * `session.state`, add the new step's usage, write the running total
12
12
  * back. The most recent emit then carries the final per-turn total.
13
13
  *
14
- * `turnId` keys the state so a fresh turn starts at zero without
15
- * relying on a separate "reset" code path when the harness moves to
16
- * a new turn, the stale totals are discarded automatically.
14
+ * `turnId` keys the turn totals so a fresh turn starts at zero without relying
15
+ * on a separate "reset" code path. Session totals stay in the same state record
16
+ * and keep accumulating until the durable session ends.
17
17
  */
18
18
  import type { HarnessSession, SessionStateMap } from "#harness/types.js";
19
- /**
20
- * Rolling token usage for the in-flight turn.
21
- *
22
- * `turnId` is the in-flight turn's stable id; when the harness step
23
- * runs in a different turn (or with the empty-string between-turns
24
- * sentinel), totals are reset.
25
- */
26
- export interface TurnUsageState {
19
+ export interface TokenUsageTotals {
27
20
  readonly cacheReadTokens: number;
28
21
  readonly cacheWriteTokens: number;
29
22
  readonly inputTokens: number;
30
23
  readonly outputTokens: number;
24
+ }
25
+ export type TokenUsageDelta = Partial<TokenUsageTotals>;
26
+ /**
27
+ * Rolling token usage for the durable session and the in-flight turn.
28
+ *
29
+ * `turnId` is the in-flight turn's stable id; when the harness step
30
+ * runs in a different turn, the flat turn totals reset. The nested
31
+ * `session` totals do not reset.
32
+ */
33
+ export interface TurnUsageState extends TokenUsageTotals {
34
+ readonly session: TokenUsageTotals;
31
35
  readonly turnId: string;
32
36
  }
33
37
  /** Reads the stored per-turn token state, or `undefined` when absent. */
34
38
  export declare function getTurnUsageState(state: SessionStateMap | undefined): TurnUsageState | undefined;
39
+ export type SessionTokenLimitViolation = {
40
+ readonly kind: "input";
41
+ readonly limit: number;
42
+ readonly usedTokens: number;
43
+ } | {
44
+ readonly kind: "output";
45
+ readonly limit: number;
46
+ readonly usedTokens: number;
47
+ };
48
+ export declare function getSessionTokenUsage(session: Pick<HarnessSession, "state">): TokenUsageTotals;
49
+ export declare function getSessionTokenLimitViolation(session: Pick<HarnessSession, "limits" | "state">): SessionTokenLimitViolation | null;
35
50
  /** Writes per-turn token state onto a new copy of the session. */
36
51
  export declare function setTurnUsageState(session: HarnessSession, next: TurnUsageState): HarnessSession;
37
52
  /**
@@ -43,12 +58,5 @@ export declare function setTurnUsageState(session: HarnessSession, next: TurnUsa
43
58
  export declare function accumulateTurnUsage(input: {
44
59
  readonly previous: TurnUsageState | undefined;
45
60
  readonly turnId: string;
46
- readonly usage: {
47
- readonly cachedInputTokens?: number;
48
- readonly inputTokens?: number;
49
- readonly inputTokenDetails?: {
50
- readonly cacheWriteTokens?: number;
51
- };
52
- readonly outputTokens?: number;
53
- };
61
+ readonly usage: TokenUsageDelta | undefined;
54
62
  }): TurnUsageState;
@@ -1 +1 @@
1
- const HARNESS_TURN_USAGE_STATE_KEY=`eve.harness.turnUsage`,ZERO_USAGE={cacheReadTokens:0,cacheWriteTokens:0,inputTokens:0,outputTokens:0};function getTurnUsageState(t){return t?.[HARNESS_TURN_USAGE_STATE_KEY]}function setTurnUsageState(t,n){return{...t,state:{...t.state,[HARNESS_TURN_USAGE_STATE_KEY]:n}}}function accumulateTurnUsage(e){let n=e.previous!==void 0&&e.previous.turnId===e.turnId?e.previous:{...ZERO_USAGE,turnId:e.turnId};return{turnId:e.turnId,cacheReadTokens:n.cacheReadTokens+(e.usage.cachedInputTokens??0),cacheWriteTokens:n.cacheWriteTokens+(e.usage.inputTokenDetails?.cacheWriteTokens??0),inputTokens:n.inputTokens+(e.usage.inputTokens??0),outputTokens:n.outputTokens+(e.usage.outputTokens??0)}}export{accumulateTurnUsage,getTurnUsageState,setTurnUsageState};
1
+ const HARNESS_TURN_USAGE_STATE_KEY=`eve.harness.turnUsage`,ZERO_TOKEN_USAGE={cacheReadTokens:0,cacheWriteTokens:0,inputTokens:0,outputTokens:0};function getTurnUsageState(t){return t?.[HARNESS_TURN_USAGE_STATE_KEY]}function getSessionTokenUsage(e){return getTurnUsageState(e.state)?.session??ZERO_TOKEN_USAGE}function getSessionTokenLimitViolation(e){let t=getSessionTokenUsage(e),n=e.limits?.maxInputTokensPerSession,r=e.limits?.maxOutputTokensPerSession;return n!==void 0&&t.inputTokens>=n?{kind:`input`,limit:n,usedTokens:t.inputTokens}:r!==void 0&&t.outputTokens>=r?{kind:`output`,limit:r,usedTokens:t.outputTokens}:null}function setTurnUsageState(t,n){return{...t,state:{...t.state,[HARNESS_TURN_USAGE_STATE_KEY]:n}}}function accumulateTurnUsage(e){let n=toTokenUsageDelta(e.usage),r=e.previous?.session??ZERO_TOKEN_USAGE;return{...addTokenUsage(e.previous!==void 0&&e.previous.turnId===e.turnId?e.previous:ZERO_TOKEN_USAGE,n),turnId:e.turnId,session:addTokenUsage(r,n)}}function addTokenUsage(e,t){return{cacheReadTokens:e.cacheReadTokens+t.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens+t.cacheWriteTokens,inputTokens:e.inputTokens+t.inputTokens,outputTokens:e.outputTokens+t.outputTokens}}function toTokenUsageDelta(e){if(e===void 0)return ZERO_TOKEN_USAGE;let n=e.inputTokens??0,r=e.outputTokens??0;return{cacheReadTokens:e.cacheReadTokens??0,cacheWriteTokens:e.cacheWriteTokens??0,inputTokens:n,outputTokens:r}}export{accumulateTurnUsage,getSessionTokenLimitViolation,getSessionTokenUsage,getTurnUsageState,setTurnUsageState};
@@ -54,6 +54,7 @@ export interface HarnessSession {
54
54
  readonly compaction: CompactionConfig;
55
55
  readonly continuationToken: string;
56
56
  readonly history: ModelMessage[];
57
+ readonly limits?: SessionLimits;
57
58
  readonly outputSchema?: JsonObject;
58
59
  /**
59
60
  * Stable identifier of the top user-facing session in the dispatch
@@ -67,6 +68,33 @@ export interface HarnessSession {
67
68
  readonly sessionId: string;
68
69
  readonly sandboxState?: SandboxState;
69
70
  readonly state?: SessionStateMap;
71
+ /**
72
+ * Number of local delegated subagent hops from the root session to this
73
+ * session. Root sessions are depth 0. Used by the harness to cap recursive
74
+ * subagent delegation.
75
+ */
76
+ readonly subagentDepth?: number;
77
+ /**
78
+ * Maximum delegated child-session depth for this session. When omitted, the
79
+ * harness uses the framework default.
80
+ */
81
+ readonly subagentMaxDepth?: number;
82
+ }
83
+ /**
84
+ * Token limits stored on one durable session.
85
+ */
86
+ export interface SessionLimits {
87
+ /**
88
+ * Maximum provider-reported input tokens this durable session may spend before
89
+ * eve refuses to start another model call. Defaults to 40M for root sessions
90
+ * and 5M for delegated subagent sessions.
91
+ */
92
+ readonly maxInputTokensPerSession?: number;
93
+ /**
94
+ * Maximum provider-reported output tokens this durable session may spend before
95
+ * eve refuses to start another model call.
96
+ */
97
+ readonly maxOutputTokensPerSession?: number;
70
98
  }
71
99
  /**
72
100
  * Input payload for a harness turn.
@@ -1,4 +1,5 @@
1
1
  import type { HarnessSession } from "#harness/types.js";
2
2
  import type { WorkflowSandboxContinuationSecurity } from "#shared/workflow-sandbox.js";
3
3
  export declare function ensureWorkflowContinuationSecurity(session: HarnessSession): HarnessSession;
4
+ export declare function readWorkflowContinuationSecurity(session: HarnessSession): WorkflowSandboxContinuationSecurity | undefined;
4
5
  export declare function getWorkflowContinuationSecurity(session: HarnessSession): WorkflowSandboxContinuationSecurity;
@@ -1 +1 @@
1
- import{randomBytes}from"node:crypto";const WORKFLOW_CONTINUATION_SECURITY_KEY=`eve.harness.workflowContinuationSecurity`;function ensureWorkflowContinuationSecurity(t){return t.state?.[WORKFLOW_CONTINUATION_SECURITY_KEY]===void 0?{...t,state:{...t.state,[WORKFLOW_CONTINUATION_SECURITY_KEY]:{signingKey:randomBytes(32).toString(`base64url`),version:1}}}:(getWorkflowContinuationSecurity(t),t)}function getWorkflowContinuationSecurity(e){let t=e.state?.[WORKFLOW_CONTINUATION_SECURITY_KEY];if(typeof t!=`object`||!t||t.version!==1||typeof t.signingKey!=`string`||!/^[A-Za-z0-9_-]{43}$/.test(t.signingKey))throw Error(`Workflow continuation security state is missing or invalid.`);return{signingKey:t.signingKey,maxAgeMs:31536e6}}export{ensureWorkflowContinuationSecurity,getWorkflowContinuationSecurity};
1
+ import{randomBytes}from"node:crypto";const WORKFLOW_CONTINUATION_SECURITY_KEY=`eve.harness.workflowContinuationSecurity`;function ensureWorkflowContinuationSecurity(n){return n.state?.[WORKFLOW_CONTINUATION_SECURITY_KEY]===void 0?{...n,state:{...n.state,[WORKFLOW_CONTINUATION_SECURITY_KEY]:{signingKey:randomBytes(32).toString(`base64url`),version:1}}}:(getWorkflowContinuationSecurity(n),n)}function readWorkflowContinuationSecurity(e){let n=e.state?.[WORKFLOW_CONTINUATION_SECURITY_KEY];if(!(typeof n!=`object`||!n||n.version!==1||typeof n.signingKey!=`string`||!/^[A-Za-z0-9_-]{43}$/.test(n.signingKey)))return{signingKey:n.signingKey,maxAgeMs:31536e6}}function getWorkflowContinuationSecurity(e){let t=readWorkflowContinuationSecurity(e);if(t===void 0)throw Error(`Workflow continuation security state is missing or invalid.`);return t}export{ensureWorkflowContinuationSecurity,getWorkflowContinuationSecurity,readWorkflowContinuationSecurity};
@@ -1 +1 @@
1
- import{createRequire}from"node:module";import{existsSync,readFileSync,realpathSync}from"node:fs";import{basename,dirname,join}from"node:path";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";import{fileURLToPath}from"node:url";let cachedPackageInfo;const BUNDLED_FALLBACK_PACKAGE_VERSION=`0.17.0`,WORKFLOW_MODULE_ALIASES={"workflow/errors":`src/compiled/@workflow/errors/index.js`,"workflow/internal/private":`src/compiled/@workflow/core/private.js`};function resolveFallbackPackageVersion(){return BUNDLED_FALLBACK_PACKAGE_VERSION.startsWith(`__`)?`0.0.0`:BUNDLED_FALLBACK_PACKAGE_VERSION}const FALLBACK_PACKAGE_INFO={name:EVE_PACKAGE_NAME,version:resolveFallbackPackageVersion()};function resolveCurrentModulePath(){return typeof __filename==`string`?__filename:resolveCurrentModulePathFromStack()}function resolveCurrentModulePathFromStack(){let e=Error.prepareStackTrace;try{Error.prepareStackTrace=(e,t)=>t;let e=Error().stack?.[0]?.getFileName();if(typeof e!=`string`||e.length===0)throw Error(`Failed to resolve the current module path from the stack trace.`);return e.startsWith(`file:`)?fileURLToPath(e):e}finally{Error.prepareStackTrace=e}}const require=createRequire(resolveCurrentModulePath());function isBuildOutputPackageRoot(e){return basename(e)===`dist`&&existsSync(join(dirname(e),`package.json`))}function resolvePackageBuildRoot(){let e=dirname(realpathSync(resolveCurrentModulePath()));for(;;){if(isBuildOutputPackageRoot(e))return e;let t=dirname(e);if(t===e)return null;e=t}}function findNearestPackageRoot(e){let n=e;for(;;){if(existsSync(join(n,`package.json`))&&!isBuildOutputPackageRoot(n))return n;let r=dirname(n);if(r===n)throw Error(`Failed to resolve package root from "${e}".`);n=r}}function resolvePackageRoot(){return findNearestPackageRoot(dirname(realpathSync(resolveCurrentModulePath())))}function tryResolvePackageRoot(){try{return resolvePackageRoot()}catch{return}}function rewriteSourceFilePathForBuild(e){return e.replace(/\.[cm]?tsx?$/,`.js`)}function resolvePackageSourceFilePath(e){let t=resolvePackageBuildRoot();return t===null?join(resolvePackageRoot(),e):join(t,rewriteSourceFilePathForBuild(e))}function resolvePackageSourceDirectoryPath(e){let t=resolvePackageBuildRoot();return join(t===null?resolvePackageRoot():t,e)}function resolvePackageDependencyPath(e){return require.resolve(e)}function resolvePackageCompiledFilePath(e){let t=resolvePackageBuildRoot();return t===null?join(resolvePackageRoot(),`.generated`,`compiled`,e.replace(/^src\/compiled\//,``)):join(t,e)}function normalizeInstalledPackageInfo(e){let t=e;if(!(typeof t.name!=`string`||typeof t.version!=`string`))return{name:t.name,version:t.version}}function tryReadInstalledPackageInfo(e,t){let r=normalizeInstalledPackageInfo(JSON.parse(readFileSync(e,`utf8`)));if(r?.name===t)return r}function resolveInstalledPackageInfo(){if(cachedPackageInfo)return cachedPackageInfo;let e=tryResolvePackageRoot(),t=e===void 0?void 0:tryReadInstalledPackageInfo(join(e,`package.json`),EVE_PACKAGE_NAME);if(t)return cachedPackageInfo=t,cachedPackageInfo;try{let e=tryReadInstalledPackageInfo(require.resolve(`${EVE_PACKAGE_NAME}/package.json`),EVE_PACKAGE_NAME);if(e)return cachedPackageInfo=e,cachedPackageInfo}catch{}return cachedPackageInfo={...FALLBACK_PACKAGE_INFO},cachedPackageInfo}function readWorkflowVersionFromManifest(e){let t=e;for(let e of[t.devDependencies,t.dependencies,t.peerDependencies]){let t=e?.[`@workflow/core`];if(typeof t==`string`&&t.trim().length>0)return t}}function resolveExpectedWorkflowVersion(){let e=tryResolvePackageRoot();if(e!==void 0)try{return readWorkflowVersionFromManifest(JSON.parse(readFileSync(join(e,`package.json`),`utf8`)))}catch{}try{return readWorkflowVersionFromManifest(JSON.parse(readFileSync(require.resolve(`${EVE_PACKAGE_NAME}/package.json`),`utf8`)))}catch{return}}function resolveWorkflowModulePath(e){if(e===`workflow`)return resolvePackageSourceFilePath(`src/internal/workflow/index.ts`);if(e===`workflow/api`||e===`workflow/runtime`)return resolvePackageSourceFilePath(`src/internal/workflow/runtime.ts`);if(e===`workflow/internal/builtins`)return resolvePackageSourceFilePath(`src/internal/workflow/builtins.ts`);let t=WORKFLOW_MODULE_ALIASES[e];return t===void 0?require.resolve(e):resolvePackageCompiledFilePath(t)}export{resolveExpectedWorkflowVersion,resolveInstalledPackageInfo,resolvePackageDependencyPath,resolvePackageRoot,resolvePackageSourceDirectoryPath,resolvePackageSourceFilePath,resolveWorkflowModulePath};
1
+ import{createRequire}from"node:module";import{existsSync,readFileSync,realpathSync}from"node:fs";import{basename,dirname,join}from"node:path";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";import{fileURLToPath}from"node:url";let cachedPackageInfo;const BUNDLED_FALLBACK_PACKAGE_VERSION=`0.17.2`,WORKFLOW_MODULE_ALIASES={"workflow/errors":`src/compiled/@workflow/errors/index.js`,"workflow/internal/private":`src/compiled/@workflow/core/private.js`};function resolveFallbackPackageVersion(){return BUNDLED_FALLBACK_PACKAGE_VERSION.startsWith(`__`)?`0.0.0`:BUNDLED_FALLBACK_PACKAGE_VERSION}const FALLBACK_PACKAGE_INFO={name:EVE_PACKAGE_NAME,version:resolveFallbackPackageVersion()};function resolveCurrentModulePath(){return typeof __filename==`string`?__filename:resolveCurrentModulePathFromStack()}function resolveCurrentModulePathFromStack(){let e=Error.prepareStackTrace;try{Error.prepareStackTrace=(e,t)=>t;let e=Error().stack?.[0]?.getFileName();if(typeof e!=`string`||e.length===0)throw Error(`Failed to resolve the current module path from the stack trace.`);return e.startsWith(`file:`)?fileURLToPath(e):e}finally{Error.prepareStackTrace=e}}const require=createRequire(resolveCurrentModulePath());function isBuildOutputPackageRoot(e){return basename(e)===`dist`&&existsSync(join(dirname(e),`package.json`))}function resolvePackageBuildRoot(){let e=dirname(realpathSync(resolveCurrentModulePath()));for(;;){if(isBuildOutputPackageRoot(e))return e;let t=dirname(e);if(t===e)return null;e=t}}function findNearestPackageRoot(e){let n=e;for(;;){if(existsSync(join(n,`package.json`))&&!isBuildOutputPackageRoot(n))return n;let r=dirname(n);if(r===n)throw Error(`Failed to resolve package root from "${e}".`);n=r}}function resolvePackageRoot(){return findNearestPackageRoot(dirname(realpathSync(resolveCurrentModulePath())))}function tryResolvePackageRoot(){try{return resolvePackageRoot()}catch{return}}function rewriteSourceFilePathForBuild(e){return e.replace(/\.[cm]?tsx?$/,`.js`)}function resolvePackageSourceFilePath(e){let t=resolvePackageBuildRoot();return t===null?join(resolvePackageRoot(),e):join(t,rewriteSourceFilePathForBuild(e))}function resolvePackageSourceDirectoryPath(e){let t=resolvePackageBuildRoot();return join(t===null?resolvePackageRoot():t,e)}function resolvePackageDependencyPath(e){return require.resolve(e)}function resolvePackageCompiledFilePath(e){let t=resolvePackageBuildRoot();return t===null?join(resolvePackageRoot(),`.generated`,`compiled`,e.replace(/^src\/compiled\//,``)):join(t,e)}function normalizeInstalledPackageInfo(e){let t=e;if(!(typeof t.name!=`string`||typeof t.version!=`string`))return{name:t.name,version:t.version}}function tryReadInstalledPackageInfo(e,t){let r=normalizeInstalledPackageInfo(JSON.parse(readFileSync(e,`utf8`)));if(r?.name===t)return r}function resolveInstalledPackageInfo(){if(cachedPackageInfo)return cachedPackageInfo;let e=tryResolvePackageRoot(),t=e===void 0?void 0:tryReadInstalledPackageInfo(join(e,`package.json`),EVE_PACKAGE_NAME);if(t)return cachedPackageInfo=t,cachedPackageInfo;try{let e=tryReadInstalledPackageInfo(require.resolve(`${EVE_PACKAGE_NAME}/package.json`),EVE_PACKAGE_NAME);if(e)return cachedPackageInfo=e,cachedPackageInfo}catch{}return cachedPackageInfo={...FALLBACK_PACKAGE_INFO},cachedPackageInfo}function readWorkflowVersionFromManifest(e){let t=e;for(let e of[t.devDependencies,t.dependencies,t.peerDependencies]){let t=e?.[`@workflow/core`];if(typeof t==`string`&&t.trim().length>0)return t}}function resolveExpectedWorkflowVersion(){let e=tryResolvePackageRoot();if(e!==void 0)try{return readWorkflowVersionFromManifest(JSON.parse(readFileSync(join(e,`package.json`),`utf8`)))}catch{}try{return readWorkflowVersionFromManifest(JSON.parse(readFileSync(require.resolve(`${EVE_PACKAGE_NAME}/package.json`),`utf8`)))}catch{return}}function resolveWorkflowModulePath(e){if(e===`workflow`)return resolvePackageSourceFilePath(`src/internal/workflow/index.ts`);if(e===`workflow/api`||e===`workflow/runtime`)return resolvePackageSourceFilePath(`src/internal/workflow/runtime.ts`);if(e===`workflow/internal/builtins`)return resolvePackageSourceFilePath(`src/internal/workflow/builtins.ts`);let t=WORKFLOW_MODULE_ALIASES[e];return t===void 0?require.resolve(e):resolvePackageCompiledFilePath(t)}export{resolveExpectedWorkflowVersion,resolveInstalledPackageInfo,resolvePackageDependencyPath,resolvePackageRoot,resolvePackageSourceDirectoryPath,resolvePackageSourceFilePath,resolveWorkflowModulePath};
@@ -1 +1 @@
1
- import{expectFunction,expectObjectRecord,expectOnlyKnownKeys,expectProviderOptions,expectString,getOptionalStringRecordProperty}from"#internal/authored-module.js";function normalizeAgentDefinition(e,r){let a=expectObjectRecord(e,r);if(expectOnlyKnownKeys(a,[`build`,`compaction`,`description`,`experimental`,`model`,`modelContextWindowTokens`,`modelOptions`,`outputSchema`,`reasoning`],r),a.model===void 0)throw Error(`${r} The "model" field is required.`);let o={model:a.model};return a.description!==void 0&&(o.description=expectString(a.description,r)),a.compaction!==void 0&&(o.compaction=normalizeAgentCompactionDefinition(a.compaction,r)),a.build!==void 0&&(o.build=normalizeAgentBuildDefinition(a.build,r)),a.experimental!==void 0&&(o.experimental=normalizeAgentExperimentalDefinition(a.experimental,r)),a.modelOptions!==void 0&&(o.modelOptions=normalizeAgentModelOptions(a.modelOptions,r)),a.modelContextWindowTokens!==void 0&&(o.modelContextWindowTokens=expectPositiveInteger(a.modelContextWindowTokens,r)),a.outputSchema!==void 0&&(o.outputSchema=a.outputSchema),a.reasoning!==void 0&&(o.reasoning=normalizeAgentReasoningDefinition(a.reasoning,r)),o}function normalizeAgentReasoningDefinition(e,t){let n=expectString(e,t);switch(n){case`provider-default`:case`none`:case`minimal`:case`low`:case`medium`:case`high`:case`xhigh`:return n;default:throw Error(t)}}function expectPositiveInteger(e,t){if(typeof e!=`number`||!Number.isInteger(e)||e<=0)throw Error(t);return e}function normalizeAgentBuildDefinition(e,r){let a=expectObjectRecord(e,r);expectOnlyKnownKeys(a,[`externalDependencies`],r);let o={};if(a.externalDependencies!==void 0){if(!Array.isArray(a.externalDependencies))throw Error(r);o.externalDependencies=Object.freeze(a.externalDependencies.map(e=>expectString(e,r)))}return o}function normalizeAgentWorkflowDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`world`],r);let a={};return i.world!==void 0&&(a.world=normalizeAgentWorkflowWorldDefinition(i.world,r)),a}function normalizeAgentWorkflowWorldDefinition(e,t){let n=expectString(e,t);if(n.trim()===``)throw Error(`${t} "experimental.workflow.world" must be a non-empty package name.`);return n}function normalizeAgentExperimentalDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`workflow`],r);let a={};return i.workflow!==void 0&&(a.workflow=normalizeAgentWorkflowDefinition(i.workflow,r)),a}function normalizeAgentModelOptions(e,i){let a=expectObjectRecord(e,i);expectOnlyKnownKeys(a,[`providerOptions`],i);let o=a.providerOptions;return o===void 0?{}:{providerOptions:expectProviderOptions(o,i)}}function normalizeAgentCompactionDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`model`,`modelContextWindowTokens`,`thresholdPercent`],r);let a={};if(i.model!==void 0&&(a.model=i.model),i.modelContextWindowTokens!==void 0&&(a.modelContextWindowTokens=expectPositiveInteger(i.modelContextWindowTokens,r)),i.thresholdPercent!==void 0){let e=i.thresholdPercent;if(typeof e!=`number`||!Number.isFinite(e)||e<0||e>1)throw Error(r);a.thresholdPercent=e}return a}function normalizeInstructionsDefinition(e,r){let a=expectObjectRecord(e,r);return expectOnlyKnownKeys(a,[`markdown`],r),{markdown:expectString(a.markdown,r)}}function normalizeSkillDefinition(e,r){let o=expectObjectRecord(e,r);expectOnlyKnownKeys(o,[`description`,`files`,`license`,`markdown`,`metadata`],r);let s={description:expectString(o.description,r),markdown:expectString(o.markdown,r)},c=o.license,l=getOptionalStringRecordProperty(o,`metadata`,r);return c!==void 0&&(s.license=expectString(c,r)),l!==void 0&&(s.metadata=l),o.files!==void 0&&(s.files=normalizeSkillFiles(o.files,r)),s}function normalizeSkillFiles(e,n){let r=expectObjectRecord(e,n),i={};for(let[e,t]of Object.entries(r)){if(typeof t==`string`||t instanceof Uint8Array){i[e]=t;continue}throw Error(`${n} Expected skill file "${e}" to be a string or Uint8Array.`)}return i}function normalizeScheduleDefinition(r,a){let o=expectObjectRecord(r,a);expectOnlyKnownKeys(o,[`cron`,`markdown`,`run`],a);let s=expectString(o.cron,a),c=o.markdown!==void 0,l=o.run!==void 0;if(c&&l)throw Error(`${a} Pass either "markdown" (fire-and-forget) or "run" (handler) — not both.`);if(!c&&!l)throw Error(`${a} Must provide either "markdown" (fire-and-forget) or "run" (handler).`);let u={cron:s};return c?u.markdown=expectString(o.markdown,a):u.run=expectFunction(o.run,a),u}export{normalizeAgentDefinition,normalizeInstructionsDefinition,normalizeScheduleDefinition,normalizeSkillDefinition};
1
+ import{expectFunction,expectObjectRecord,expectOnlyKnownKeys,expectProviderOptions,expectString,getOptionalStringRecordProperty}from"#internal/authored-module.js";function normalizeAgentDefinition(e,r){let a=expectObjectRecord(e,r);if(expectOnlyKnownKeys(a,[`build`,`compaction`,`description`,`experimental`,`limits`,`model`,`modelContextWindowTokens`,`modelOptions`,`outputSchema`,`reasoning`],r),a.model===void 0)throw Error(`${r} The "model" field is required.`);let o={model:a.model};return a.description!==void 0&&(o.description=expectString(a.description,r)),a.compaction!==void 0&&(o.compaction=normalizeAgentCompactionDefinition(a.compaction,r)),a.build!==void 0&&(o.build=normalizeAgentBuildDefinition(a.build,r)),a.experimental!==void 0&&(o.experimental=normalizeAgentExperimentalDefinition(a.experimental,r)),a.modelOptions!==void 0&&(o.modelOptions=normalizeAgentModelOptions(a.modelOptions,r)),a.modelContextWindowTokens!==void 0&&(o.modelContextWindowTokens=expectPositiveInteger(a.modelContextWindowTokens,r)),a.outputSchema!==void 0&&(o.outputSchema=a.outputSchema),a.reasoning!==void 0&&(o.reasoning=normalizeAgentReasoningDefinition(a.reasoning,r)),a.limits!==void 0&&(o.limits=normalizeAgentLimitsDefinition(a.limits,r)),o}function normalizeAgentReasoningDefinition(e,t){let n=expectString(e,t);switch(n){case`provider-default`:case`none`:case`minimal`:case`low`:case`medium`:case`high`:case`xhigh`:return n;default:throw Error(t)}}function expectPositiveInteger(e,t){if(typeof e!=`number`||!Number.isInteger(e)||e<=0)throw Error(t);return e}function normalizeAgentLimitsDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`maxInputTokensPerSession`,`maxOutputTokensPerSession`,`maxSubagentDepth`],r);let a={};return i.maxInputTokensPerSession!==void 0&&(a.maxInputTokensPerSession=expectPositiveInteger(i.maxInputTokensPerSession,r)),i.maxOutputTokensPerSession!==void 0&&(a.maxOutputTokensPerSession=expectPositiveInteger(i.maxOutputTokensPerSession,r)),i.maxSubagentDepth!==void 0&&(a.maxSubagentDepth=expectPositiveInteger(i.maxSubagentDepth,r)),a}function normalizeAgentBuildDefinition(e,r){let a=expectObjectRecord(e,r);expectOnlyKnownKeys(a,[`externalDependencies`],r);let o={};if(a.externalDependencies!==void 0){if(!Array.isArray(a.externalDependencies))throw Error(r);o.externalDependencies=Object.freeze(a.externalDependencies.map(e=>expectString(e,r)))}return o}function normalizeAgentWorkflowDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`world`],r);let a={};return i.world!==void 0&&(a.world=normalizeAgentWorkflowWorldDefinition(i.world,r)),a}function normalizeAgentWorkflowWorldDefinition(e,t){let n=expectString(e,t);if(n.trim()===``)throw Error(`${t} "experimental.workflow.world" must be a non-empty package name.`);return n}function normalizeAgentExperimentalDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`workflow`],r);let a={};return i.workflow!==void 0&&(a.workflow=normalizeAgentWorkflowDefinition(i.workflow,r)),a}function normalizeAgentModelOptions(e,i){let a=expectObjectRecord(e,i);expectOnlyKnownKeys(a,[`providerOptions`],i);let o=a.providerOptions;return o===void 0?{}:{providerOptions:expectProviderOptions(o,i)}}function normalizeAgentCompactionDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`model`,`modelContextWindowTokens`,`thresholdPercent`],r);let a={};if(i.model!==void 0&&(a.model=i.model),i.modelContextWindowTokens!==void 0&&(a.modelContextWindowTokens=expectPositiveInteger(i.modelContextWindowTokens,r)),i.thresholdPercent!==void 0){let e=i.thresholdPercent;if(typeof e!=`number`||!Number.isFinite(e)||e<0||e>1)throw Error(r);a.thresholdPercent=e}return a}function normalizeInstructionsDefinition(e,r){let a=expectObjectRecord(e,r);return expectOnlyKnownKeys(a,[`markdown`],r),{markdown:expectString(a.markdown,r)}}function normalizeSkillDefinition(e,r){let o=expectObjectRecord(e,r);expectOnlyKnownKeys(o,[`description`,`files`,`license`,`markdown`,`metadata`],r);let s={description:expectString(o.description,r),markdown:expectString(o.markdown,r)},c=o.license,l=getOptionalStringRecordProperty(o,`metadata`,r);return c!==void 0&&(s.license=expectString(c,r)),l!==void 0&&(s.metadata=l),o.files!==void 0&&(s.files=normalizeSkillFiles(o.files,r)),s}function normalizeSkillFiles(e,n){let r=expectObjectRecord(e,n),i={};for(let[e,t]of Object.entries(r)){if(typeof t==`string`||t instanceof Uint8Array){i[e]=t;continue}throw Error(`${n} Expected skill file "${e}" to be a string or Uint8Array.`)}return i}function normalizeScheduleDefinition(r,a){let o=expectObjectRecord(r,a);expectOnlyKnownKeys(o,[`cron`,`markdown`,`run`],a);let s=expectString(o.cron,a),c=o.markdown!==void 0,l=o.run!==void 0;if(c&&l)throw Error(`${a} Pass either "markdown" (fire-and-forget) or "run" (handler) — not both.`);if(!c&&!l)throw Error(`${a} Must provide either "markdown" (fire-and-forget) or "run" (handler).`);let u={cron:s};return c?u.markdown=expectString(o.markdown,a):u.run=expectFunction(o.run,a),u}export{normalizeAgentDefinition,normalizeInstructionsDefinition,normalizeScheduleDefinition,normalizeSkillDefinition};
@@ -0,0 +1 @@
1
+ export declare function encodeBasicCredentials(username: string, password: string): string;
@@ -0,0 +1 @@
1
+ function encodeBasicCredentials(e,t){let n=new TextEncoder().encode(`${e}:${t}`),r=Array.from(n,e=>String.fromCodePoint(e)).join(``);return btoa(r)}export{encodeBasicCredentials};
@@ -1,4 +1,4 @@
1
- import{EVE_DEV_DISPATCH_SCHEDULE_ROUTE_PATTERN,EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH,EVE_HEALTH_ROUTE_PATH,EVE_INFO_ROUTE_PATH}from"#protocol/routes.js";import{resolvePackageRoot,resolvePackageSourceFilePath,resolveWorkflowModulePath}from"#internal/application/package.js";import{dirname,join,relative}from"node:path";import{mkdir,writeFile}from"node:fs/promises";import{isVercelBuildEnvironment}from"#internal/application/paths.js";import{normalizeEsmImportSpecifier,stringifyEsmImportSpecifier}from"#internal/application/import-specifier.js";import{WorkflowBundleBuilder}from"#internal/workflow-bundle/builder.js";import{createNitroArtifactsConfig}from"#internal/nitro/host/artifacts-config.js";import{deriveEveWorkflowQueuePrefix}from"#internal/workflow/queue-namespace.js";import{computeChannelRouteRegistrations,registerChannelVirtualHandlers}from"#internal/nitro/host/channel-routes.js";function includesApplicationRoutes(e){return e===`all`||e===`app`}function includesWorkflowBundles(e){return includesWorkflowRoute(e)}function includesWorkflowRoute(e){return e===`all`||e===`flow`}function registerHandler(e,t){let n=`#eve-route-handler/${t.method??`ALL`} ${t.route}`,r=stringifyEsmImportSpecifier(t.handlerPath);e.options.handlers.push({handler:n,method:t.method,route:t.route}),e.options.virtual[n]=[`import handler from ${r};`,`export default handler;`].join(`
1
+ import{EVE_DEV_DISPATCH_SCHEDULE_ROUTE_PATTERN,EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH,EVE_HEALTH_ROUTE_PATH}from"#protocol/routes.js";import{resolvePackageRoot,resolvePackageSourceFilePath,resolveWorkflowModulePath}from"#internal/application/package.js";import{dirname,join,relative}from"node:path";import{mkdir,writeFile}from"node:fs/promises";import{isVercelBuildEnvironment}from"#internal/application/paths.js";import{normalizeEsmImportSpecifier,stringifyEsmImportSpecifier}from"#internal/application/import-specifier.js";import{WorkflowBundleBuilder}from"#internal/workflow-bundle/builder.js";import{createNitroArtifactsConfig}from"#internal/nitro/host/artifacts-config.js";import{deriveEveWorkflowQueuePrefix}from"#internal/workflow/queue-namespace.js";import{computeChannelRouteRegistrations,registerChannelVirtualHandlers}from"#internal/nitro/host/channel-routes.js";function includesApplicationRoutes(e){return e===`all`||e===`app`}function includesWorkflowBundles(e){return includesWorkflowRoute(e)}function includesWorkflowRoute(e){return e===`all`||e===`flow`}function registerHandler(e,t){let n=`#eve-route-handler/${t.method??`ALL`} ${t.route}`,r=stringifyEsmImportSpecifier(t.handlerPath);e.options.handlers.push({handler:n,method:t.method,route:t.route}),e.options.virtual[n]=[`import handler from ${r};`,`export default handler;`].join(`
2
2
  `)}function resolveNitroWorkflowBuildDirectory(e){return join(e.options.buildDir,`workflow`)}function createRelativeImportSpecifier(e,t){let n=relative(e,t).replaceAll(`\\`,`/`);return n.startsWith(`.`)?n:`./${n}`}async function addWorkflowFileHandler(e,t){let n=join(resolveNitroWorkflowBuildDirectory(e),`${t.bundleName}-handler.mjs`),r=dirname(n),i=createRelativeImportSpecifier(r,t.bundlePath),a=(t.directHandlers??[]).map(e=>{let t=createRelativeImportSpecifier(r,e.bundlePath);return{importSpecifier:t,isOwnBundle:t===i,queuePrefix:e.queuePrefix}});await mkdir(r,{recursive:!0}),await writeFile(n,buildWorkflowFileHandlerSource({bundlePath:i,directHandlers:a,runtimeImportSpecifier:t.runtimeImportSpecifier})),e.options.handlers.push({handler:n,route:t.route})}function buildWorkflowFileHandlerSource(e){let t=[`// Generated by eve. Do not edit by hand.`,`import { POST } from ${JSON.stringify(e.bundlePath)};`];if(e.directHandlers.length>0&&e.runtimeImportSpecifier!==void 0){let n=0,r=e.directHandlers.map(e=>{if(e.isOwnBundle)return{...e,binding:`POST`};let t=`__eveWorkflowDirectHandler${n}`;return n+=1,{...e,binding:t}});for(let e of r)e.isOwnBundle||t.push(`import { POST as ${e.binding} } from ${JSON.stringify(e.importSpecifier)};`);t.push(`import { getWorld as __eveGetWorkflowWorld } from ${JSON.stringify(e.runtimeImportSpecifier)};`,``,`try {`,` const __eveWorkflowWorld = await __eveGetWorkflowWorld();`,` if (typeof __eveWorkflowWorld?.registerHandler === "function") {`);for(let e of r)t.push(` __eveWorkflowWorld.registerHandler(${JSON.stringify(e.queuePrefix)}, ${e.binding});`);t.push(` }`,`} catch (err) {`,` console.warn("[eve] Failed to register direct workflow queue handlers:", err);`,`}`)}return t.push(``,`export default async ({ req }) => {`,` return await POST(req);`,`};`,``),t.join(`
3
3
  `)}function addFrameworkVirtualHandler(e,t){let n=`#eve-route${t.route}`,r=stringifyEsmImportSpecifier(t.modulePath);e.options.handlers.push({handler:n,method:t.method,route:t.route}),e.options.virtual[n]=[`import { ${t.handlerExport} } from ${r};`,`export default async (event) => ${t.handlerExport}(${t.args}, event.req);`].join(`
4
- `)}async function configureNitroRoutes(o,s,c){if(includesWorkflowBundles(c.surface)){let e=resolvePackageRoot(),t=new WorkflowBundleBuilder({agentName:s.compileResult.manifest.config.name,appRoot:s.appRoot,compiledArtifactsBootstrapPath:s.compiledArtifacts.bootstrapPath,outDir:s.workflowBuildDir,rootDir:e,watch:o.options.dev}),n=Promise.resolve(),buildWorkflowArtifacts=async()=>{await t.build({nitroStepOutfile:includesWorkflowRoute(c.surface)?join(resolveNitroWorkflowBuildDirectory(o),`steps.mjs`):void 0,nitroWorkflowOutfile:o.options.dev&&includesWorkflowRoute(c.surface)?join(resolveNitroWorkflowBuildDirectory(o),`workflows.mjs`):void 0})},syncWorkflowArtifacts=async()=>{let e=n.then(buildWorkflowArtifacts);n=e.catch(()=>{}),await e},r=!0;await syncWorkflowArtifacts(),o.hooks.hook(`build:before`,async()=>{if(r){r=!1;return}await syncWorkflowArtifacts()}),o.options.dev&&o.hooks.hook(`dev:reload`,async()=>{await syncWorkflowArtifacts()})}let l=createNitroArtifactsConfig({appRoot:s.appRoot,dev:o.options.dev});if(includesApplicationRoutes(c.surface)){registerHandler(o,{handlerPath:resolvePackageSourceFilePath(`src/internal/nitro/routes/index.ts`),method:`GET`,route:`/`});for(let e of[`GET`,`HEAD`])registerHandler(o,{handlerPath:resolvePackageSourceFilePath(`src/internal/nitro/routes/health.ts`),method:e,route:EVE_HEALTH_ROUTE_PATH});addFrameworkVirtualHandler(o,{args:JSON.stringify({...l,mode:o.options.dev?`development`:`production`}),handlerExport:`handleAgentInfoRequest`,method:`GET`,modulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/info.ts`),route:EVE_INFO_ROUTE_PATH}),registerChannelVirtualHandlers(o,{artifactsConfig:l,registrations:computeChannelRouteRegistrations(s)}),o.options.dev&&(addFrameworkVirtualHandler(o,{args:JSON.stringify({appRoot:l.appRoot}),handlerExport:`handleDevRuntimeArtifactsRequest`,method:`GET`,modulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/dev-runtime-artifacts.ts`),route:EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH}),addFrameworkVirtualHandler(o,{args:JSON.stringify({appRoot:l.appRoot}),handlerExport:`handleDevScheduleDispatchRequest`,method:`POST`,modulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/dev-schedule-dispatch.ts`),route:EVE_DEV_DISPATCH_SCHEDULE_ROUTE_PATTERN}))}let u=resolveNitroWorkflowBuildDirectory(o),d=includesWorkflowRoute(c.surface)?o.options.dev?join(u,`workflows.mjs`):join(s.workflowBuildDir,`workflows.mjs`):void 0,f=s.compileResult.manifest.config.experimental?.workflow?.world!==void 0,p=(o.options.dev||!isVercelBuildEnvironment()&&f)&&d!==void 0?[{bundlePath:d,queuePrefix:deriveEveWorkflowQueuePrefix(s.compileResult.manifest.config.name)}]:[],m=p.length>0?normalizeEsmImportSpecifier(resolveWorkflowModulePath(`workflow/runtime`)):void 0;d&&await addWorkflowFileHandler(o,{bundleName:`workflows`,bundlePath:d,directHandlers:p,route:`/.well-known/workflow/v1/flow`,runtimeImportSpecifier:m}),o.routing.sync()}export{configureNitroRoutes};
4
+ `)}async function configureNitroRoutes(o,s,c){if(includesWorkflowBundles(c.surface)){let e=resolvePackageRoot(),t=new WorkflowBundleBuilder({agentName:s.compileResult.manifest.config.name,appRoot:s.appRoot,compiledArtifactsBootstrapPath:s.compiledArtifacts.bootstrapPath,outDir:s.workflowBuildDir,rootDir:e,watch:o.options.dev}),n=Promise.resolve(),buildWorkflowArtifacts=async()=>{await t.build({nitroStepOutfile:includesWorkflowRoute(c.surface)?join(resolveNitroWorkflowBuildDirectory(o),`steps.mjs`):void 0,nitroWorkflowOutfile:o.options.dev&&includesWorkflowRoute(c.surface)?join(resolveNitroWorkflowBuildDirectory(o),`workflows.mjs`):void 0})},syncWorkflowArtifacts=async()=>{let e=n.then(buildWorkflowArtifacts);n=e.catch(()=>{}),await e},i=!0;await syncWorkflowArtifacts(),o.hooks.hook(`build:before`,async()=>{if(i){i=!1;return}await syncWorkflowArtifacts()}),o.options.dev&&o.hooks.hook(`dev:reload`,async()=>{await syncWorkflowArtifacts()})}let l=createNitroArtifactsConfig({appRoot:s.appRoot,dev:o.options.dev});if(includesApplicationRoutes(c.surface)){registerHandler(o,{handlerPath:resolvePackageSourceFilePath(`src/internal/nitro/routes/index.ts`),method:`GET`,route:`/`});for(let e of[`GET`,`HEAD`])registerHandler(o,{handlerPath:resolvePackageSourceFilePath(`src/internal/nitro/routes/health.ts`),method:e,route:EVE_HEALTH_ROUTE_PATH});registerChannelVirtualHandlers(o,{artifactsConfig:l,registrations:computeChannelRouteRegistrations(s)}),o.options.dev&&(addFrameworkVirtualHandler(o,{args:JSON.stringify({appRoot:l.appRoot}),handlerExport:`handleDevRuntimeArtifactsRequest`,method:`GET`,modulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/dev-runtime-artifacts.ts`),route:EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH}),addFrameworkVirtualHandler(o,{args:JSON.stringify({appRoot:l.appRoot}),handlerExport:`handleDevScheduleDispatchRequest`,method:`POST`,modulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/dev-schedule-dispatch.ts`),route:EVE_DEV_DISPATCH_SCHEDULE_ROUTE_PATTERN}))}let u=resolveNitroWorkflowBuildDirectory(o),d=includesWorkflowRoute(c.surface)?o.options.dev?join(u,`workflows.mjs`):join(s.workflowBuildDir,`workflows.mjs`):void 0,f=s.compileResult.manifest.config.experimental?.workflow?.world!==void 0,p=(o.options.dev||!isVercelBuildEnvironment()&&f)&&d!==void 0?[{bundlePath:d,queuePrefix:deriveEveWorkflowQueuePrefix(s.compileResult.manifest.config.name)}]:[],m=p.length>0?normalizeEsmImportSpecifier(resolveWorkflowModulePath(`workflow/runtime`)):void 0;d&&await addWorkflowFileHandler(o,{bundleName:`workflows`,bundlePath:d,directHandlers:p,route:`/.well-known/workflow/v1/flow`,runtimeImportSpecifier:m}),o.routing.sync()}export{configureNitroRoutes};
@@ -1 +1 @@
1
- import{createGetSessionFn}from"#channel/session.js";import{createLogger,logError}from"#internal/logging.js";import{createSendFn}from"#channel/send.js";import{createCrossChannelReceiveFn,toCrossChannelTargets}from"#channel/cross-channel-receive.js";import{readVercelProjectLink}from"#internal/vercel/project-link.js";import{resolveNitroChannelRuntimeBundle}from"#internal/nitro/routes/runtime-stack.js";import{withVercelOidcProjectResolver}from"#runtime/governance/auth/vercel-oidc-project.js";const log=createLogger(`channel.dispatch`);async function dispatchChannelRequest(e,t,r){let i=await resolveNitroChannelRuntimeBundle(r),a=i.channels.find(e=>`${e.method.toUpperCase()} ${e.urlPath}`===t);if(a===void 0)return Response.json({error:`No matching channel for this request.`,ok:!1},{status:404});let o=buildRouteArgs(e,i,a.name),c;try{c=await withDevelopmentVercelOidcContext(r,e.req,async()=>{if(a.handler)return await a.handler(e.req,o.args);let t={agent:o.agent,waitUntil:o.args.waitUntil,params:o.args.params,requestIp:o.args.requestIp};return await a.fetch(e.req,t)})}catch(r){let i=logError(log,`channel handler threw`,r,{routeKey:t,channel:a.name});return flushBackgroundTasks(e,o.backgroundTasks,t,a.name),Response.json({error:`Channel handler failed.`,errorId:i,ok:!1},{status:500})}return flushBackgroundTasks(e,o.backgroundTasks,t,a.name),c}async function dispatchChannelWebSocketRequest(e,t,r){let i=await resolveNitroChannelRuntimeBundle(r),a=i.channels.find(e=>`${e.method.toUpperCase()} ${e.urlPath}`===t);if(a===void 0||a.websocket===void 0)return rejectWebSocketUpgrade({error:`No matching websocket channel for this request.`,ok:!1},404);let o=a.websocket,c=buildRouteArgs(e,i,a.name);try{let n=await withDevelopmentVercelOidcContext(r,e.req,async()=>await o(e.req,c.args));return flushBackgroundTasks(e,c.backgroundTasks,t,a.name),n}catch(r){let i=logError(log,`channel websocket handler threw`,r,{routeKey:t,channel:a.name});return flushBackgroundTasks(e,c.backgroundTasks,t,a.name),rejectWebSocketUpgrade({error:`Channel websocket handler failed.`,errorId:i,ok:!1},500)}}async function withDevelopmentVercelOidcContext(e,t,n){let r=e.appRoot;return e.dev!==!0||r===void 0?await n():await withVercelOidcProjectResolver({request:t,resolveCurrentProject:async()=>{let e=await readVercelProjectLink(r);return e===void 0?void 0:{environment:`development`,projectId:e.projectId}}},n)}function buildRouteArgs(t,n,o){let s=readVercelRequestId(t.req.headers),c=extractSocketIp(t),l=[],u=t.context.params??{},d={};for(let[e,t]of Object.entries(u))d[e]=decodeURIComponent(t);let waitUntil=e=>{l.push(e)},f=n.channels.find(e=>e.name===o)?.adapter??{kind:`channel`};return{agent:createRouteAgent(n.runtime,s),args:{send:createSendFn(n.runtime,f,o,{requestId:s}),getSession:createGetSessionFn(n.runtime),receive:createCrossChannelReceiveFn(n.runtime,toCrossChannelTargets(n.channels)),params:d,waitUntil,requestIp:c},backgroundTasks:l}}function createRouteAgent(e,t){return{async deliver(n){let r={...n,requestId:t};return await e.deliver(r)},async getEventStream(t,n){return await e.getEventStream(t,n)},async run(n){let r={...n,requestId:t};return await e.run(r)}}}function readVercelRequestId(e){let t=e.get(`x-vercel-id`)?.trim();return t===``?void 0:t}function rejectWebSocketUpgrade(e,t){return{upgrade(){throw Response.json(e,{status:t})}}}function flushBackgroundTasks(e,t,r,i){t.length!==0&&e.waitUntil(Promise.allSettled(t).then(e=>{for(let t of e)t.status===`rejected`&&logError(log,`channel background task failed`,t.reason,{routeKey:r,channel:i})}))}function extractSocketIp(e){let t=e.req.ip;return typeof t==`string`&&t.length>0?t:null}export{dispatchChannelRequest,dispatchChannelWebSocketRequest};
1
+ import{createGetSessionFn}from"#channel/session.js";import{createLogger,logError}from"#internal/logging.js";import{createSendFn}from"#channel/send.js";import{createCrossChannelReceiveFn,toCrossChannelTargets}from"#channel/cross-channel-receive.js";import{attachAgentInfoRouteResponse}from"#internal/nitro/routes/channel-route-context.js";import{resolveNitroChannelRuntimeBundle}from"#internal/nitro/routes/runtime-stack.js";import{readVercelProjectLink}from"#internal/vercel/project-link.js";import{withVercelOidcProjectResolver}from"#runtime/governance/auth/vercel-oidc-project.js";const log=createLogger(`channel.dispatch`);async function dispatchChannelRequest(e,t,r){let i=await resolveNitroChannelRuntimeBundle(r),a=i.channels.find(e=>`${e.method.toUpperCase()} ${e.urlPath}`===t);if(a===void 0)return Response.json({error:`No matching channel for this request.`,ok:!1},{status:404});let o=buildRouteArgs(e,i,a.name,r),c;try{c=await withDevelopmentVercelOidcContext(r,e.req,async()=>{if(a.handler)return await a.handler(e.req,o.args);let t={agent:o.agent,waitUntil:o.args.waitUntil,params:o.args.params,requestIp:o.args.requestIp};return await a.fetch(e.req,t)})}catch(r){let i=logError(log,`channel handler threw`,r,{routeKey:t,channel:a.name});return flushBackgroundTasks(e,o.backgroundTasks,t,a.name),Response.json({error:`Channel handler failed.`,errorId:i,ok:!1},{status:500})}return flushBackgroundTasks(e,o.backgroundTasks,t,a.name),c}async function dispatchChannelWebSocketRequest(e,t,r){let i=await resolveNitroChannelRuntimeBundle(r),a=i.channels.find(e=>`${e.method.toUpperCase()} ${e.urlPath}`===t);if(a===void 0||a.websocket===void 0)return rejectWebSocketUpgrade({error:`No matching websocket channel for this request.`,ok:!1},404);let o=a.websocket,c=buildRouteArgs(e,i,a.name,r);try{let n=await withDevelopmentVercelOidcContext(r,e.req,async()=>await o(e.req,c.args));return flushBackgroundTasks(e,c.backgroundTasks,t,a.name),n}catch(r){let i=logError(log,`channel websocket handler threw`,r,{routeKey:t,channel:a.name});return flushBackgroundTasks(e,c.backgroundTasks,t,a.name),rejectWebSocketUpgrade({error:`Channel websocket handler failed.`,errorId:i,ok:!1},500)}}async function withDevelopmentVercelOidcContext(e,t,n){let r=e.appRoot;return e.dev!==!0||r===void 0?await n():await withVercelOidcProjectResolver({request:t,resolveCurrentProject:async()=>{let e=await readVercelProjectLink(r);return e===void 0?void 0:{environment:`development`,projectId:e.projectId}}},n)}function buildRouteArgs(t,n,s,c){let l=readVercelRequestId(t.req.headers),u=extractSocketIp(t),d=[],f=t.context.params??{},p={};for(let[e,t]of Object.entries(f))p[e]=decodeURIComponent(t);let waitUntil=e=>{d.push(e)},m=n.channels.find(e=>e.name===s)?.adapter??{kind:`channel`};return{agent:createRouteAgent(n.runtime,l),args:attachAgentInfoRouteResponse({send:createSendFn(n.runtime,m,s,{requestId:l}),getSession:createGetSessionFn(n.runtime),receive:createCrossChannelReceiveFn(n.runtime,toCrossChannelTargets(n.channels)),params:p,waitUntil,requestIp:u},async()=>{let{handleAgentInfoRequest:e}=await import(`#internal/nitro/routes/info.js`);return await e(c)}),backgroundTasks:d}}function createRouteAgent(e,t){return{async deliver(n){let r={...n,requestId:t};return await e.deliver(r)},async getEventStream(t,n){return await e.getEventStream(t,n)},async run(n){let r={...n,requestId:t};return await e.run(r)}}}function readVercelRequestId(e){let t=e.get(`x-vercel-id`)?.trim();return t===``?void 0:t}function rejectWebSocketUpgrade(e,t){return{upgrade(){throw Response.json(e,{status:t})}}}function flushBackgroundTasks(e,t,r,i){t.length!==0&&e.waitUntil(Promise.allSettled(t).then(e=>{for(let t of e)t.status===`rejected`&&logError(log,`channel background task failed`,t.reason,{routeKey:r,channel:i})}))}function extractSocketIp(e){let t=e.req.ip;return typeof t==`string`&&t.length>0?t:null}export{dispatchChannelRequest,dispatchChannelWebSocketRequest};
@@ -0,0 +1,5 @@
1
+ import type { RouteHandlerArgs } from "#channel/routes.js";
2
+ type AgentInfoRouteResponse = () => Promise<Response>;
3
+ export declare function attachAgentInfoRouteResponse<TArgs extends RouteHandlerArgs>(args: TArgs, respond: AgentInfoRouteResponse): TArgs;
4
+ export declare function readAgentInfoRouteResponse(args: RouteHandlerArgs): AgentInfoRouteResponse | undefined;
5
+ export {};
@@ -0,0 +1 @@
1
+ const agentInfoRouteResponseKey=`__eveAgentInfoRouteResponse`;function attachAgentInfoRouteResponse(e,t){let n=e;return n[agentInfoRouteResponseKey]=t,e}function readAgentInfoRouteResponse(e){return e[agentInfoRouteResponseKey]}export{attachAgentInfoRouteResponse,readAgentInfoRouteResponse};