eve 0.27.12 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/src/channel/adapter.d.ts +5 -5
  3. package/dist/src/channel/session.d.ts +2 -2
  4. package/dist/src/channel/types.d.ts +10 -6
  5. package/dist/src/chunks/{use-eve-agent-CsSQOKnp.js → use-eve-agent-CZkX_ZTT.js} +90 -1
  6. package/dist/src/chunks/{use-eve-agent-CWYe-vqE.js → use-eve-agent-hdPX68_i.js} +90 -1
  7. package/dist/src/cli/commands/channels.js +1 -1
  8. package/dist/src/cli/commands/integration-setup.js +1 -1
  9. package/dist/src/cli/commands/register-registry-commands.js +1 -1
  10. package/dist/src/cli/commands/registry-setup-command.d.ts +5 -3
  11. package/dist/src/cli/commands/registry-setup-command.js +1 -1
  12. package/dist/src/cli/commands/registry.d.ts +9 -3
  13. package/dist/src/cli/commands/registry.js +1 -1
  14. package/dist/src/cli/dev/tui/runner.js +1 -1
  15. package/dist/src/cli/dev/tui/subagent-pump.d.ts +8 -2
  16. package/dist/src/cli/dev/tui/subagent-pump.js +1 -1
  17. package/dist/src/cli/invoke/result.d.ts +15 -0
  18. package/dist/src/cli/invoke/result.js +1 -1
  19. package/dist/src/client/eve-agent-store.d.ts +7 -4
  20. package/dist/src/client/eve-agent-store.js +1 -1
  21. package/dist/src/client/index.d.ts +3 -3
  22. package/dist/src/client/index.js +1 -1
  23. package/dist/src/client/message-action-parts.js +1 -1
  24. package/dist/src/client/message-reducer-types.d.ts +5 -3
  25. package/dist/src/client/message-response.d.ts +4 -4
  26. package/dist/src/client/ndjson.d.ts +3 -3
  27. package/dist/src/client/open-stream.d.ts +2 -2
  28. package/dist/src/client/output-schema.d.ts +2 -2
  29. package/dist/src/client/reducer.d.ts +2 -2
  30. package/dist/src/client/session-utils.d.ts +5 -5
  31. package/dist/src/client/session.d.ts +2 -2
  32. package/dist/src/client/types.d.ts +2 -2
  33. package/dist/src/compiler/compile-from-memory.d.ts +1 -0
  34. package/dist/src/compiler/extension-compatibility.d.ts +8 -8
  35. package/dist/src/compiler/extension-compatibility.js +1 -1
  36. package/dist/src/compiler/manifest.d.ts +2 -2
  37. package/dist/src/compiler/manifest.js +1 -1
  38. package/dist/src/compiler/normalize-agent-config.js +1 -1
  39. package/dist/src/context/dynamic-instruction-lifecycle.d.ts +2 -2
  40. package/dist/src/context/dynamic-model-lifecycle.d.ts +2 -2
  41. package/dist/src/context/dynamic-skill-lifecycle.d.ts +2 -2
  42. package/dist/src/context/dynamic-tool-lifecycle.d.ts +2 -2
  43. package/dist/src/context/hook-lifecycle.d.ts +2 -2
  44. package/dist/src/evals/assertions/run.d.ts +3 -3
  45. package/dist/src/evals/match.d.ts +4 -4
  46. package/dist/src/evals/runner/derive-run-facts.d.ts +2 -2
  47. package/dist/src/evals/session.d.ts +3 -3
  48. package/dist/src/evals/types.d.ts +12 -12
  49. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  50. package/dist/src/execution/route-child-delivery.d.ts +4 -3
  51. package/dist/src/execution/route-child-delivery.js +1 -1
  52. package/dist/src/execution/session-delivery-hook.d.ts +1 -0
  53. package/dist/src/execution/session-delivery-hook.js +1 -1
  54. package/dist/src/execution/session-timeout-control.d.ts +9 -0
  55. package/dist/src/execution/session-timeout-control.js +1 -0
  56. package/dist/src/execution/session-timeout-steps.d.ts +13 -0
  57. package/dist/src/execution/session-timeout-steps.js +1 -0
  58. package/dist/src/execution/session-timeout-workflow.d.ts +6 -0
  59. package/dist/src/execution/session-timeout-workflow.js +1 -0
  60. package/dist/src/execution/session-timeout.d.ts +2 -0
  61. package/dist/src/execution/session-timeout.js +1 -0
  62. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  63. package/dist/src/execution/subagent-event-proxy-step.js +1 -1
  64. package/dist/src/execution/subagent-hitl-proxy.d.ts +5 -1
  65. package/dist/src/execution/subagent-hitl-proxy.js +1 -1
  66. package/dist/src/execution/terminal-session-completion-step.d.ts +5 -0
  67. package/dist/src/execution/terminal-session-completion-step.js +1 -0
  68. package/dist/src/execution/terminal-session-failure-step.js +1 -1
  69. package/dist/src/execution/turn-workflow.js +1 -1
  70. package/dist/src/execution/workflow-entry.d.ts +1 -0
  71. package/dist/src/execution/workflow-entry.js +1 -1
  72. package/dist/src/execution/workflow-runtime.d.ts +4 -0
  73. package/dist/src/execution/workflow-runtime.js +1 -1
  74. package/dist/src/execution/workflow-steps.d.ts +5 -2
  75. package/dist/src/execution/workflow-steps.js +1 -1
  76. package/dist/src/harness/agent-otel-provider.js +1 -1
  77. package/dist/src/harness/ai-sdk-hook-bridge.js +1 -1
  78. package/dist/src/harness/input-extraction.js +1 -1
  79. package/dist/src/harness/input-request-class.d.ts +23 -0
  80. package/dist/src/harness/input-request-class.js +1 -0
  81. package/dist/src/harness/input-requests.d.ts +20 -9
  82. package/dist/src/harness/input-requests.js +1 -1
  83. package/dist/src/harness/instrumentation-lifecycle.d.ts +12 -1
  84. package/dist/src/harness/proxy-input-requests.d.ts +10 -4
  85. package/dist/src/harness/proxy-input-requests.js +1 -1
  86. package/dist/src/harness/session-limit-continuation.d.ts +0 -11
  87. package/dist/src/harness/session-limit-continuation.js +1 -1
  88. package/dist/src/harness/session-limit-enforcement.d.ts +3 -2
  89. package/dist/src/harness/session-limit-enforcement.js +1 -1
  90. package/dist/src/harness/session-token-limits.d.ts +41 -0
  91. package/dist/src/harness/session-token-limits.js +1 -0
  92. package/dist/src/harness/stale-input-responses.js +1 -1
  93. package/dist/src/harness/subagent-token-budget.d.ts +6 -4
  94. package/dist/src/harness/subagent-token-budget.js +1 -1
  95. package/dist/src/harness/tool-loop.js +1 -1
  96. package/dist/src/harness/turn-tag-state.d.ts +26 -17
  97. package/dist/src/harness/turn-tag-state.js +1 -1
  98. package/dist/src/harness/types.d.ts +4 -4
  99. package/dist/src/harness/workflow-lifecycle.d.ts +2 -2
  100. package/dist/src/internal/application/package.js +1 -1
  101. package/dist/src/internal/authored-definition/core.js +1 -1
  102. package/dist/src/internal/node-esm-compat-banner.js +1 -1
  103. package/dist/src/internal/workflow-bundle/workflow-core-shim.d.ts +1 -1
  104. package/dist/src/internal/workflow-bundle/workflow-core-shim.js +1 -1
  105. package/dist/src/protocol/event-dedupe.d.ts +25 -0
  106. package/dist/src/protocol/event-dedupe.js +1 -0
  107. package/dist/src/protocol/event-id.d.ts +16 -0
  108. package/dist/src/protocol/event-id.js +1 -0
  109. package/dist/src/protocol/message.d.ts +39 -23
  110. package/dist/src/protocol/message.js +2 -2
  111. package/dist/src/public/channels/discord/discordChannel.d.ts +3 -3
  112. package/dist/src/public/channels/github/githubChannel.d.ts +3 -3
  113. package/dist/src/public/channels/linear/defaults.js +4 -2
  114. package/dist/src/public/channels/linear/linearChannel.d.ts +3 -3
  115. package/dist/src/public/channels/slack/hitl.js +1 -1
  116. package/dist/src/public/channels/slack/slackChannel.d.ts +3 -3
  117. package/dist/src/public/channels/teams/hitl.js +1 -1
  118. package/dist/src/public/channels/teams/teamsChannel.d.ts +3 -3
  119. package/dist/src/public/channels/telegram/telegramChannel.d.ts +3 -3
  120. package/dist/src/public/channels/twilio/twilioChannel.d.ts +3 -3
  121. package/dist/src/public/definitions/channel.d.ts +4 -4
  122. package/dist/src/public/definitions/hook.d.ts +2 -2
  123. package/dist/src/react/use-eve-agent.d.ts +3 -2
  124. package/dist/src/runtime/framework-tools/ask-question.js +1 -1
  125. package/dist/src/runtime/hooks/registry.d.ts +2 -2
  126. package/dist/src/runtime/input/types.d.ts +19 -4
  127. package/dist/src/runtime/input/types.js +1 -1
  128. package/dist/src/runtime/resolve-agent.js +1 -1
  129. package/dist/src/runtime/types.d.ts +2 -2
  130. package/dist/src/setup/scaffold/create/project.js +1 -1
  131. package/dist/src/setup/scaffold/create/web-template.d.ts +1 -1
  132. package/dist/src/setup/scaffold/create/web-template.js +2 -2
  133. package/dist/src/shared/agent-definition.d.ts +12 -0
  134. package/dist/src/shared/dynamic-tool-definition.d.ts +2 -2
  135. package/dist/src/shared/ulid.d.ts +39 -0
  136. package/dist/src/shared/ulid.js +1 -0
  137. package/dist/src/svelte/index.js +1 -1
  138. package/dist/src/svelte/use-eve-agent.d.ts +4 -4
  139. package/dist/src/svelte/use-eve-agent.js +1 -1
  140. package/dist/src/vue/index.js +1 -1
  141. package/dist/src/vue/use-eve-agent.d.ts +4 -4
  142. package/dist/src/vue/use-eve-agent.js +1 -1
  143. package/docs/agent-config.md +28 -16
  144. package/docs/channels/linear.mdx +4 -0
  145. package/docs/concepts/execution-model-and-durability.mdx +1 -1
  146. package/docs/concepts/sessions-runs-and-streaming.md +61 -0
  147. package/docs/extensions.md +3 -1
  148. package/docs/guides/client/streaming.mdx +9 -3
  149. package/docs/guides/frontend/overview.mdx +4 -2
  150. package/docs/guides/frontend/use-eve-agent-svelte.mdx +1 -1
  151. package/docs/guides/frontend/use-eve-agent-vue.mdx +10 -10
  152. package/docs/guides/hooks.md +40 -2
  153. package/docs/guides/instrumentation.md +4 -0
  154. package/docs/install-integrations.mdx +76 -1
  155. package/docs/reference/cli.md +3 -0
  156. package/docs/tools/human-in-the-loop.md +5 -0
  157. package/package.json +1 -1
@@ -1,3 +1,3 @@
1
- import{appendUserContent,normalizeUserContent}from"#harness/messages.js";import{isApprovalRequest}from"#harness/input-requests.js";import{isSessionLimitContinuationRequestId}from"#harness/session-limit-continuation.js";import{extractHistoricalInputRequests}from"#harness/input-extraction.js";function dropStaleSessionLimitContinuationResponses(e){let t=e.stepInput?.inputResponses;if(e.stepInput===void 0||t===void 0||t.length===0)return e.stepInput;let n=t.filter(t=>e.pendingRequestIds.has(t.requestId)||!isSessionLimitContinuationRequestId(t.requestId));if(n.length===t.length)return e.stepInput;let{inputResponses:i,...a}=e.stepInput;return n.length===0?a:{...a,inputResponses:n}}function convertStaleResponsesToUserMessage(e){let t=e.stepInput?.inputResponses;if(e.stepInput===void 0||t===void 0||t.length===0)return{kind:`unchanged`,stepInput:e.stepInput};let n=[],r=[];for(let i of t)e.pendingRequestIds.has(i.requestId)?n.push(i):r.push(i);if(r.length===0)return{kind:`unchanged`,stepInput:e.stepInput};let a=extractHistoricalInputRequests({history:e.history,requestIds:new Set(r.map(e=>e.requestId))}),o=appendOptionalUserContent(e.stepInput.message,formatModelMessage(r,a)),s=appendOptionalUserContent(e.stepInput.message,formatDisplayMessage(r,a)),{inputResponses:c,...l}=e.stepInput,u={...l,message:o};return n.length>0&&(u.inputResponses=n),{displayMessage:s,kind:`converted`,stepInput:u}}function formatModelMessage(e,t){let r=e.map(e=>{let r=t.get(e.requestId),i=r?.options?.find(t=>t.id===e.optionId),a={};if(e.optionId!==void 0&&(a.optionId=e.optionId),i!==void 0){let e={id:i.id,label:i.label};i.description!==void 0&&(e.description=i.description),a.selectedOption=e}e.text!==void 0&&(a.text=e.text);let o={requestId:e.requestId,response:a};return r!==void 0&&(o.prompt=r.prompt,o.requestType=isApprovalRequest(r)?`approval`:`question`),o});return[`The user submitted the following response to an earlier interactive prompt.`,`Treat it as new input at the current point in the conversation and decide whether it is still relevant.${e.some(e=>{let r=t.get(e.requestId);return r===void 0||isApprovalRequest(r)})?` This does not authorize an earlier action; request approval again if that action is still needed.`:``}`,JSON.stringify(r,null,2)].join(`
1
+ import{appendUserContent,normalizeUserContent}from"#harness/messages.js";import{isSessionLimitContinuationRequestId}from"#harness/session-limit-continuation.js";import{isApprovalRequest}from"#harness/input-request-class.js";import{extractHistoricalInputRequests}from"#harness/input-extraction.js";function dropStaleSessionLimitContinuationResponses(e){let t=e.stepInput?.inputResponses;if(e.stepInput===void 0||t===void 0||t.length===0)return e.stepInput;let r=t.filter(t=>e.pendingRequestIds.has(t.requestId)||!isSessionLimitContinuationRequestId(t.requestId));if(r.length===t.length)return e.stepInput;let{inputResponses:i,...a}=e.stepInput;return r.length===0?a:{...a,inputResponses:r}}function convertStaleResponsesToUserMessage(e){let t=e.stepInput?.inputResponses;if(e.stepInput===void 0||t===void 0||t.length===0)return{kind:`unchanged`,stepInput:e.stepInput};let n=[],r=[];for(let i of t)e.pendingRequestIds.has(i.requestId)?n.push(i):r.push(i);if(r.length===0)return{kind:`unchanged`,stepInput:e.stepInput};let a=extractHistoricalInputRequests({history:e.history,requestIds:new Set(r.map(e=>e.requestId))}),o=appendOptionalUserContent(e.stepInput.message,formatModelMessage(r,a)),s=appendOptionalUserContent(e.stepInput.message,formatDisplayMessage(r,a)),{inputResponses:c,...l}=e.stepInput,u={...l,message:o};return n.length>0&&(u.inputResponses=n),{displayMessage:s,kind:`converted`,stepInput:u}}function formatModelMessage(e,t){let n=e.map(e=>{let n=t.get(e.requestId),i=n?.options?.find(t=>t.id===e.optionId),a={};if(e.optionId!==void 0&&(a.optionId=e.optionId),i!==void 0){let e={id:i.id,label:i.label};i.description!==void 0&&(e.description=i.description),a.selectedOption=e}e.text!==void 0&&(a.text=e.text);let o={requestId:e.requestId,response:a};return n!==void 0&&(o.prompt=n.prompt,o.requestType=isApprovalRequest(n)?`approval`:`question`),o});return[`The user submitted the following response to an earlier interactive prompt.`,`Treat it as new input at the current point in the conversation and decide whether it is still relevant.${e.some(e=>{let n=t.get(e.requestId);return n===void 0||isApprovalRequest(n)})?` This does not authorize an earlier action; request approval again if that action is still needed.`:``}`,JSON.stringify(n,null,2)].join(`
2
2
  `)}function formatDisplayMessage(e,t){return e.map(e=>e.text!==void 0&&e.text.length>0?e.text:t.get(e.requestId)?.options?.find(t=>t.id===e.optionId)?.label??e.optionId??`Response to an earlier interactive prompt`).join(`
3
3
  `)}function appendOptionalUserContent(n,r){let i=normalizeUserContent(n);return i===void 0?r:appendUserContent({appended:r,existing:i})}export{convertStaleResponsesToUserMessage,dropStaleSessionLimitContinuationResponses};
@@ -1,14 +1,16 @@
1
1
  import type { RunSessionLimits } from "#channel/types.js";
2
2
  import type { HarnessSession } from "#harness/types.js";
3
3
  /**
4
- * Computes the session token limits a delegated child inherits from its parent:
5
- * the remaining quota (configured limit minus accumulated usage) split evenly
6
- * across the batch's delegated calls, per axis, at dispatch time. `false`
7
- * marks an axis with no inherited cap.
4
+ * Computes the session token limits a delegated child inherits from its
5
+ * parent: the parent's remaining runtime-limit quota split evenly across the
6
+ * batch's delegated calls, per axis, at dispatch time. `false` marks an axis
7
+ * with no inherited cap.
8
8
  *
9
9
  * Splitting by `fanoutSize` makes one dispatch batch collectively
10
10
  * bounded by the parent's remainder. N parallel children cannot each spend
11
11
  * the full remainder. Sequential batches see the quota net of completed
12
12
  * children because their usage folds back into the parent's session totals.
13
+ * A granted continuation bumps the parent's runtime limit, so children
14
+ * dispatched after a grant draw from the fresh window.
13
15
  */
14
16
  export declare function resolveRemainingSessionTokenLimits(session: Pick<HarnessSession, "limits" | "state">, fanoutSize?: number): RunSessionLimits;
@@ -1 +1 @@
1
- import{getSessionTokenUsage}from"#harness/turn-tag-state.js";function resolveRemainingSessionTokenLimits(t,n=1){let r=Math.max(1,Math.floor(n)),i=getSessionTokenUsage(t);return{maxInputTokensPerSession:grantShare(remainingQuota(t.limits?.maxInputTokensPerSession,i.inputTokens),r),maxOutputTokensPerSession:grantShare(remainingQuota(t.limits?.maxOutputTokensPerSession,i.outputTokens),r)}}function remainingQuota(e,t){return e!==void 0&&Math.max(0,e-t)}function grantShare(e,t){return e!==!1&&Math.floor(e/t)}export{resolveRemainingSessionTokenLimits};
1
+ import{getSessionRemainingTokenQuota}from"#harness/turn-tag-state.js";function resolveRemainingSessionTokenLimits(t,n=1){let r=Math.max(1,Math.floor(n)),i=getSessionRemainingTokenQuota(t);return{maxInputTokensPerSession:grantShare(i.inputTokens,r),maxOutputTokensPerSession:grantShare(i.outputTokens,r)}}function grantShare(e,t){return e!==!1&&Math.floor(e/t)}export{resolveRemainingSessionTokenLimits};
@@ -1,3 +1,3 @@
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{toErrorMessage}from"#shared/errors.js";import{createActionResultEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createInputRequestedEvent,createResultCompletedEvent,createStepStartedEvent}from"#protocol/message.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{resolveProviderHeaders}from"#internal/gateway.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{contextStorage}from"#context/container.js";import{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{ToolLoopAgent,isStepCount}from"ai";import{createRuntimeActionRequestFromToolCall,resolvePendingRuntimeActions,setPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{normalizeUserContent,resolveAssistantStepText}from"#harness/messages.js";import{clearPendingWorkflowInterrupt,getPendingWorkflowInterrupt,setPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowRuntimeActionInterrupts,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{getActiveDynamicModelSelection}from"#context/dynamic-model-lifecycle.js";import{activeTurnId}from"#harness/active-turn-id.js";import{createInstrumentationHandleEvent}from"#harness/instrumentation-native-events.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{isAuthorizationSignal,setPendingAuthorization}from"#harness/authorization.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{buildDynamicInstructionMessages}from"#context/dynamic-instruction-lifecycle.js";import{PendingSkillAnnouncementKey}from"#context/dynamic-skill-lifecycle.js";import{consumeDeferredStepInput,getApprovedTools,getPendingInputRequestIds,hasDeferredStepInput,hasStepInput,resolvePendingInput,setPendingInputBatch}from"#harness/input-requests.js";import{accumulateTurnUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{getWorkflowContinuationSecurity,readWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{buildWorkflowHostTools,resolveWorkflowSandboxBridgeRequestLimit}from"#harness/workflow-sandbox.js";import{CONDITIONAL_DELIVERY_INSTRUCTION,EMPTY_DELIVERY_SENTINEL,hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{getInvalidToolCallInputError,isInvalidToolCall}from"#harness/tool-call-input-errors.js";import{EmptyModelResponseError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,extractUpstreamRejectionMessage,isNoOutputGeneratedError}from"#harness/model-call-error.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{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{applySessionLimitContinuation,enforceSessionTokenLimit}from"#harness/session-limit-enforcement.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{buildTelemetryRuntimeContext}from"#harness/instrumentation-runtime-context.js";import{createAiSdkHookBridge}from"#harness/ai-sdk-hook-bridge.js";import{convertStaleResponsesToUserMessage,dropStaleSessionLimitContinuationResponses}from"#harness/stale-input-responses.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{createOtelIntegration,ensureOtelIntegration}from"#harness/otel-integration.js";import{getAdvertisedTools}from"#harness/advertised-tools.js";import{resolveFrameworkToolFromUpstreamType}from"#harness/provider-tools.js";import{buildStepHooks,emitStepActions}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,r){if(e===void 0&&r===void 0)return;let i={};for(let e of Object.keys(n??{}))i[e]=!0;return{functionId:e?.functionId??t,includeRuntimeContext:i,integrations:r===void 0?void 0:e===void 0?[r]:[r,createOtelIntegration()],isEnabled:!0,recordInputs:e?.recordInputs??!0,recordOutputs:e?.recordOutputs??!0}}function mergeSystemInstructions(e){if(e.length===0)return;if(e.length===1)return{...e[0]};let t;for(let n of e)n.providerOptions!==void 0&&(t={...t,...n.providerOptions});let n={role:`system`,content:e.map(e=>e.content).join(`
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{toErrorMessage}from"#shared/errors.js";import{createActionResultEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createInputRequestedEvent,createResultCompletedEvent,createStepStartedEvent}from"#protocol/message.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{resolveProviderHeaders}from"#internal/gateway.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{contextStorage}from"#context/container.js";import{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{ToolLoopAgent,isStepCount}from"ai";import{createRuntimeActionRequestFromToolCall,resolvePendingRuntimeActions,setPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{normalizeUserContent,resolveAssistantStepText}from"#harness/messages.js";import{clearPendingWorkflowInterrupt,getPendingWorkflowInterrupt,setPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowRuntimeActionInterrupts,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{getActiveDynamicModelSelection}from"#context/dynamic-model-lifecycle.js";import{activeTurnId}from"#harness/active-turn-id.js";import{consumeDeferredStepInput,getApprovedTools,getPendingInputRequestIds,hasDeferredStepInput,hasStepInput,resolvePendingInput,setPendingInputBatch}from"#harness/input-requests.js";import{createInstrumentationHandleEvent}from"#harness/instrumentation-native-events.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{isAuthorizationSignal,setPendingAuthorization}from"#harness/authorization.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{buildDynamicInstructionMessages}from"#context/dynamic-instruction-lifecycle.js";import{PendingSkillAnnouncementKey}from"#context/dynamic-skill-lifecycle.js";import{accumulateTurnUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{getWorkflowContinuationSecurity,readWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{buildWorkflowHostTools,resolveWorkflowSandboxBridgeRequestLimit}from"#harness/workflow-sandbox.js";import{CONDITIONAL_DELIVERY_INSTRUCTION,EMPTY_DELIVERY_SENTINEL,hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{getInvalidToolCallInputError,isInvalidToolCall}from"#harness/tool-call-input-errors.js";import{EmptyModelResponseError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,extractUpstreamRejectionMessage,isNoOutputGeneratedError}from"#harness/model-call-error.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{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{applySessionLimitContinuation,enforceSessionTokenLimit}from"#harness/session-limit-enforcement.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{buildTelemetryRuntimeContext}from"#harness/instrumentation-runtime-context.js";import{createAiSdkHookBridge}from"#harness/ai-sdk-hook-bridge.js";import{convertStaleResponsesToUserMessage,dropStaleSessionLimitContinuationResponses}from"#harness/stale-input-responses.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{createOtelIntegration,ensureOtelIntegration}from"#harness/otel-integration.js";import{getAdvertisedTools}from"#harness/advertised-tools.js";import{resolveFrameworkToolFromUpstreamType}from"#harness/provider-tools.js";import{buildStepHooks,emitStepActions}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,r){if(e===void 0&&r===void 0)return;let i={};for(let e of Object.keys(n??{}))i[e]=!0;return{functionId:e?.functionId??t,includeRuntimeContext:i,integrations:r===void 0?void 0:e===void 0?[r]:[r,createOtelIntegration()],isEnabled:!0,recordInputs:e?.recordInputs??!0,recordOutputs:e?.recordOutputs??!0}}function mergeSystemInstructions(e){if(e.length===0)return;if(e.length===1)return{...e[0]};let t;for(let n of e)n.providerOptions!==void 0&&(t={...t,...n.providerOptions});let n={role:`system`,content:e.map(e=>e.content).join(`
2
2
 
3
3
  `)};return t!==void 0&&(n.providerOptions=t),n}function buildGatewayAttributionHeaders(e,t){let n=resolveProviderHeaders(e);if(n===void 0)return;let r=t?.agentName??t?.agentId,i=process.env.VERCEL_PROJECT_PRODUCTION_URL||process.env.VERCEL_URL,a=i?`https://${i}`:void 0,o={...n};return r&&(o[`x-title`]=r),a&&(o[`http-referer`]=a),o}async function resolveActiveRuntimeModel(e){if(e.ctx===void 0)return{model:await e.config.resolveModel(e.session.agent.modelReference),session:e.session};let t=e.session.agent.dynamicModelDefaultReference??e.session.agent.modelReference,n=getActiveDynamicModelSelection(e.ctx);return n===null?{model:await e.config.resolveModel(t),session:updateSessionModelReference(e.session,t)}:{model:n.model===void 0?await e.config.resolveModel(n.reference):n.model,session:updateSessionModelReference(e.session,n.reference)}}function updateSessionModelReference(e,t){let n=e.agent.modelReference;return{...e,agent:{...e.agent,modelReference:t},compaction:updateCompactionThresholdForModelReference({compaction:e.compaction,modelReference:t,priorReference:n})}}function updateCompactionThresholdForModelReference(e){if(e.modelReference.contextWindowTokens===void 0||e.priorReference.contextWindowTokens===void 0)return e.compaction;let t=e.compaction.threshold/e.priorReference.contextWindowTokens;return{...e.compaction,threshold:Math.max(1,Math.floor(e.modelReference.contextWindowTokens*t))}}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 d=c===void 0?void 0:trace.getTracer(`eve`),f=t.runtimeIdentity?.agentName;async function runStep(e,t){let n;if(d&&hasStepInput(t)){let t=c?.functionId??f,r={"eve.version":eveVersion,"eve.environment":environment,"eve.session.id":e.sessionId};t&&(r[`ai.telemetry.functionId`]=t),n=d.startSpan(`ai.eve.turn`,{attributes:r})}let r=resolveStepOtelContext(d,n,e),executeStep=()=>executeStepBody(e,t,n);try{return r?await context.with(r,executeStep):await executeStep()}finally{n?.end()}}async function executeStepBody(d,p,m){let h=d;m&&(h=setTurnTraceState(h,m.spanContext()));let _=getHarnessEmissionState(h.state),te=contextStorage.getStore()?.get(ParentSessionKey),O=createInstrumentationHandleEvent({agentName:t.runtimeIdentity?.agentName,handleEvent:n,hooks:t.instrumentation?.hooks,rootSessionId:te?.rootSessionId,sessionId:h.sessionId,turnId:activeTurnId(_)}),k=consumeDeferredStepInput({input:p,session:h});h=k.session;let j=await resolvePendingRuntimeActions({emit:O,session:h,stepInput:k.input});if(j.outcome===`unresolved`)return{next:null,session:j.session};h=j.session;let M=getPendingInputRequestIds(h.state),N=convertStaleResponsesToUserMessage({history:j.messages,pendingRequestIds:M,stepInput:dropStaleSessionLimitContinuationResponses({pendingRequestIds:M,stepInput:k.input})}),P=N.stepInput,F=N.kind===`converted`?{...P,message:N.displayMessage}:P,I=resolvePendingInput({history:j.messages,resolveApprovalKey:resolveApprovalKeyFromTools(t.tools),session:h,stepInput:P});if(I.outcome===`unresolved`)return O&&I.deferredMessage===!0&&hasStepInput(p)?(_=await emitTurnPreamble(O,F??{},_,t.runtimeIdentity),_=await emitTurnEpilogue(O,_,t.mode,I.session.continuationToken),{next:null,session:setHarnessEmissionState(I.session,_)}):{next:null,session:I.session};if(O&&I.rejectedActions)for(let e of I.rejectedActions.results)await O(createActionResultEvent({rejected:!0,result:e,sequence:I.rejectedActions.event.sequence,stepIndex:I.rejectedActions.event.stepIndex,turnId:I.rejectedActions.event.turnId}));O&&hasStepInput(p)&&(_=await emitTurnPreamble(O,F??{},_,t.runtimeIdentity),h=setHarnessEmissionState(h,_),m&&m.setAttribute(`eve.turn.id`,_.turnId)),h=I.session;let L=I.messages,R=await applySessionLimitContinuation({config:t,emit:O,emissionState:_,limitContinuation:I.limitContinuation,session:h});if(R.result!==null)return R.result;if(h=R.session,P?.context!==void 0&&I.deferredContext!==!0)for(let e of P.context)L.push({content:e,role:`user`});let z=normalizeUserContent(P?.message);if(z!==void 0&&!I.deferredMessage&&!I.consumedMessage){let e=await stageAttachmentsToSandbox(z);L.push({content:e,role:`user`})}let B=contextStorage.getStore();B!==void 0&&t.dispatchDynamicModelEvent!==void 0&&await t.dispatchDynamicModelEvent({ctx:B,event:createStepStartedEvent({sequence:_.sequence,stepIndex:_.stepIndex,turnId:_.turnId}),fallback:h.agent.dynamicModelDefaultReference??h.agent.modelReference,messages:L});let V=await resolveActiveRuntimeModel({config:t,ctx:B,session:h});h=V.session;let H=V.model,U=detectPromptCachePath(H),W=U.kind===`anthropic-direct`?getAnthropicCacheMarker():void 0,re=buildGatewayAttributionHeaders(H,t.runtimeIdentity);({messages:L,session:h}=await maybeCompact({abortSignal:t.abortSignal,emit:O,emissionState:_,messages:L,model:H,onCompaction:t.onCompaction,resolveModel:t.resolveModel,runtimeIdentity:t.runtimeIdentity,session:h,telemetry:enrichTelemetry(c,f)??void 0}));let G=getApprovedTools(h),K=h.outputSchema===void 0&&B!==void 0&&isScheduleAppAuth(B.get(AuthKey))&&B.get(ParentSessionKey)===void 0,ie=await hydrateSandboxAttachments(L),q=[],J=[];for(let e of ie)e.role===`system`?q.push(e):J.push(e);if(B!==void 0){q.push(...buildDynamicInstructionMessages(B));let e=B.get(PendingSkillAnnouncementKey);e!==void 0&&e.length>0&&q.push({role:`system`,content:e})}K&&q.push({role:`system`,content:CONDITIONAL_DELIVERY_INSTRUCTION});let Y=J,prepareModelCallInput=e=>{let t=e?[{role:`system`,content:e}]:[],n=h.agent.system?[{role:`system`,content:h.agent.system}]:[],r=q.length>0||t.length>0?[...t,...n,...q]:void 0,i=r!==void 0&&W?applySystemCacheBreakpoint(r,W):r,a=i===void 0?h.agent.system??void 0:mergeSystemInstructions(i);return{instructions:a,telemetryRuntimeContext:buildTelemetryRuntimeContext({eveVersion,authored:c,emissionState:_,environment,modelInput:{instructions:a,messages:Y},session:h})}},runSingleModelCall=async e=>{let{instructions:n,telemetryRuntimeContext:i={}}=e.preparedInput??prepareModelCallInput(e.extraSystemNote);e.retryReason&&(i[`eve.retry.reason`]=e.retryReason);let a=e.trailingUserNote?[...Y,{role:`user`,content:e.trailingUserNote}]:Y,o=getAdvertisedTools({session:h,tools:t.tools}),s=await buildToolSetWithProviderTools({approvedTools:G,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,modelReference:h.agent.modelReference,tools:o});if(B!==void 0){let n=getAdvertisedTools({session:h,tools:buildDynamicTools(B)}),r=buildToolSetFromDefinitions({approvedTools:G,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,tools:n});for(let[e,t]of Object.entries(r))s[e]=t}h.outputSchema!==void 0&&(s[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(h.outputSchema));let l=O===void 0?void 0:({tools:e})=>createWorkflowLifecycle({emit:O,emissionState:_,tools:e}),u=t.workflow===!0?{lifecycle:l,maxSubagents:t.workflowMaxSubagents}:void 0,d=await getAdvertisedTools({modelTools:s,session:h,tools:o,workflow:u});h=d.session;let p=d.modelTools,m=W?applyLastToolCacheBreakpoint(p,W):p,g=t.instrumentation?.hooks,v=activeTurnId(_),y=g===void 0?void 0:{attemptId:`${h.sessionId}:${v}:${_.stepIndex}:${e.attemptIndex}`,attemptIndex:e.attemptIndex,functionId:c?.functionId??f,rootSessionId:te?.rootSessionId??h.sessionId,sessionId:h.sessionId,stepIndex:_.stepIndex,turnId:v},b=y===void 0||g===void 0?void 0:createAiSdkHookBridge(y,g,t.instrumentation?.runInContext),x=buildStepHooks({cachePath:U,emit:O,emissionState:_,emitStepStarted:e.suppressStepStartedEmission!==!0,marker:W,session:h}),S=new ToolLoopAgent({headers:re,instructions:n,model:H,onToolExecutionEnd:logToolExecutionError,onError(e){summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepFinish:x.onStepFinish,prepareStep:x.prepareStep,reasoning:h.agent.reasoning,runtimeContext:i,stopWhen:isStepCount(1),telemetry:enrichTelemetry(c,f,i,b),toolApproval:buildToolApproval(p),tools:m}),executeModelCall=async()=>{if(O){let e=[...t.tools].filter(([e,t])=>t.runtimeAction!==void 0&&o.get(e)===void 0).map(([e])=>e),n=new Set([ASK_QUESTION_TOOL_NAME,FINAL_OUTPUT_TOOL_NAME,...e]),r=await S.stream({abortSignal:t.abortSignal,messages:a}),{emittedActionCallIds:i,handledInlineToolResultCallIds:s,invalidInputToolCallIds:c,inlineAuthorizationResults:l,trailingInlineToolResultParts:u}=await emitStreamContent(O,_,r.fullStream,{excludedActionToolNames:n,tools:t.tools});throwIfTurnAborted(t.abortSignal);let[d,f]=await Promise.all([x.stepResult,r.responseMessages]);if(isEmptyModelResponse(d)&&extractToolResultCallIds(f).size===0&&l.length===0&&u.length===0)throw new EmptyModelResponseError;await emitStepActions(O,_,d,{emittedActionCallIds:i,excludedActionCallIds:c,excludedActionToolNames:n,handledInlineToolResultCallIds:s,tools:o});let p=d.toolResults,m=new Map(p.map(e=>[e.toolCallId,e]));for(let e of l)m.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:c,responseMessages:appendMissingToolResultMessages({append:u,responseMessages:f}),stepResult:d,toolResults:[...m.values()]})}let e=await S.generate({abortSignal:t.abortSignal,messages:a});throwIfTurnAborted(t.abortSignal);let n=await x.stepResult;if(isEmptyModelResponse(n)&&extractToolResultCallIds(e.responseMessages).size===0)throw new EmptyModelResponseError;return withAccumulatedResponseMessages({responseMessages:e.responseMessages,stepResult:n})};try{let e=await executeModelCall();return y!==void 0&&await g?.publish({scope:y,type:`attempt.completed`}),e}catch(e){return y!==void 0&&await g?.publish({error:e,scope:y,type:`attempt.failed`}),rethrowNoOutputAsEmptyResponse(e)}},ae=0,runOneModelCall=async e=>runModelCallWithRetries(t=>runSingleModelCall({...e,attemptIndex:ae++,preparedInput:t===1?e.preparedInput:void 0,suppressStepStartedEmission:t!==1||e.suppressStepStartedEmission}),{sessionId:h.sessionId,turnId:_.turnId},t.abortSignal),oe=prepareModelCallInput();O&&await emitStepStarted(O,_,L);let X=await continuePendingWorkflowInterrupt({childResults:P?.runtimeActionResults,config:t,emit:O,emissionState:_,runStep,session:h});if(X!==null)return X;let se=await enforceSessionTokenLimit({config:t,emit:O,emissionState:_,messages:L,session:h});if(se!==null)return se;let Z;try{Z=await runOneModelCall({preparedInput:oe,suppressStepStartedEmission:!0})}catch(n){throwIfTurnAborted(t.abortSignal);let r=await runModelCallRecoveryPipeline({error:n,stages:[e=>attemptUnsupportedProviderToolRecovery({error:e.error,runOneModelCall,sessionId:h.sessionId,turnId:_.turnId}),e=>attemptEmptyResponseRecovery({emptyDeliveryEnabled:K,error:e.error,retryCallOptions:e.retryCallOptions,runOneModelCall,sessionId:h.sessionId,turnId:_.turnId})]});if(throwIfTurnAborted(t.abortSignal),r.outcome===`recovered`)Z=r.result;else{let n=r.error;if(m&&recordErrorOnSpan(m,n),!O)throw n;let a=extractWorkflowStreamWriteErrorDetails(n);if(a!==null){let t=createErrorId();return log.error(`workflow stream write failed — parking session for retry by the user`,{...a,errorId:t,error:n,sessionId:h.sessionId,turnId:_.turnId}),_=await emitRecoverableFailedTurn(O,_,{code:`WORKFLOW_STREAM_WRITE_FAILED`,continuationToken:h.continuationToken,details:{...a,errorId:t},message:toErrorMessage(n)}),{next:null,session:setHarnessEmissionState(h,_)}}let o=classifyModelCallError(n),s=createErrorId(),c=summarizeKnownError(n),u=c===null?extractUpstreamRejectionMessage(n):null,d=c?.message??u?.message??toErrorMessage(n),f=c?.hint===void 0?d:`${d} ${c.hint}`,p=extractModelCallErrorDetails(n),g=buildModelCallFailureDetails({catalogSummary:c,error:n,errorId:s,modelCallDetails:p,upstreamRejection:u}),v=buildModelCallFailureLogFields({error:n,errorId:s,modelCallDetails:p,recognized:c!==null||u!==null,sessionId:h.sessionId,turnId:_.turnId});if(o===`terminal`)return c===null?log.error(u?.message??`model call failed terminally`,v):log.error(`${c.name}: ${c.message}`,{errorId:s,hint:c.hint,sessionId:h.sessionId,turnId:_.turnId}),await emitFailedStep(O,_,{code:`MODEL_CALL_FAILED`,details:g,message:d,sessionId:h.sessionId}),{next:t.mode===`task`?{done:!0,isError:!0,output:f}:{done:!0,output:``},session:h};if(t.mode===`task`){if(o===`recoverable`&&!(n instanceof EmptyModelResponseError))throw log.warn(u?.message??`model call failed recoverably in task mode — rethrowing for durable step retry`,v),n;return log.error(u?.message??`model call failed; failing the task run`,v),await emitFailedStep(O,_,{code:`MODEL_CALL_FAILED`,details:g,message:d,sessionId:h.sessionId}),{next:{done:!0,isError:!0,output:f},session:h}}return log.error(u?.message??`model call failed — parking session for retry by the user`,v),_=await emitRecoverableFailedTurn(O,_,{code:`MODEL_CALL_FAILED`,continuationToken:h.continuationToken,details:g,message:d}),{next:null,session:setHarnessEmissionState(h,_)}}}let Q=accumulateTurnUsage({previous:getTurnUsageState(h.state),turnId:_.turnId,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(Z.providerMetadata),usage:Z.usage})});h=setTurnUsageState(h,Q);let $;try{$=formatLanguageModelGatewayId(H)}catch{$=void 0}return await setEveAttributes({"$eve.model":$,"$eve.input_tokens":Q.inputTokens,"$eve.output_tokens":Q.outputTokens,"$eve.cache_read_tokens":Q.cacheReadTokens,"$eve.cache_write_tokens":Q.cacheWriteTokens,"$eve.cost_usd":Q.sawCost?Q.costUsd:void 0,"$eve.tool_count":t.tools.size}),handleStepResult({config:t,emit:O,emissionState:_,promptMessages:L,result:Z,runStep,session:h})}return runStep}function extractTokenUsageDelta(e){let t=e.usage;if(!(t===void 0&&e.costUsd===void 0))return{cacheReadTokens:t?.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:t?.inputTokenDetails?.cacheWriteTokens,costUsd:e.costUsd,inputTokens:t?.inputTokens,outputTokens:t?.outputTokens}}function extractGatewayCostUsd(e){let t=readGatewayMetadata(e)?.cost;if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=Number(t);return Number.isFinite(e)?e:void 0}}function readGatewayMetadata(e){let t=e?.gateway;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}function buildModelCallFailureDetails(e){let{catalogSummary:t,error:r,errorId:i,modelCallDetails:a,upstreamRejection:o}=e;if(t!==null){let e={errorId:i,message:t.message,name:t.name,semanticErrorId:t.id,...a};return t.hint!==void 0&&(e.hint=t.hint),e}return o===null?{...formatError(r,i),...a}:{errorId:i,message:toErrorMessage(r),name:o.name,...a}}function buildModelCallFailureLogFields(e){let t={errorId:e.errorId,sessionId:e.sessionId,turnId:e.turnId};return e.recognized?{...t,details:e.modelCallDetails}:{...t,error:e.error}}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}}function withAccumulatedResponseMessages(e){let{stepResult:t}=e;return{content:t.content,finishReason:t.finishReason,...e.invalidInputToolCallIds===void 0?{}:{invalidInputToolCallIds:e.invalidInputToolCallIds},providerMetadata:t.providerMetadata,response:{...t.response,messages:[...e.responseMessages]},text:t.text,toolCalls:t.toolCalls,toolResults:e.toolResults===void 0?t.toolResults:[...e.toolResults],usage:t.usage}}function appendMissingToolResultMessages(e){let t=extractToolResultCallIds(e.responseMessages),n=e.append.filter(e=>!t.has(e.toolCallId));return[...e.responseMessages,...n.length>0?[{role:`tool`,content:[...n]}]:[]]}function getInvalidToolCallInputErrors(e){let t=[];for(let n of e.toolCalls){if(n.toolName===FINAL_OUTPUT_TOOL_NAME)continue;let e=getInvalidToolCallInputError({toolCall:n});e!==void 0&&t.push(e)}return t}function extractToolResultCallIds(e){let t=new Set;for(let n of e)if(!(n.role!==`tool`||!Array.isArray(n.content)))for(let e of n.content)e.type===`tool-result`&&t.add(e.toolCallId);return 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=getInvalidToolCallInputErrors({toolCalls:i.toolCalls}),f=new Set([...i.invalidInputToolCallIds??[],...i.toolCalls.filter(isInvalidToolCall).map(e=>e.toolCallId),...u.map(e=>e.toolCallId)]),p=l?[]:appendMissingToolResultMessages({append:u.map(e=>createToolResultMessagePartFromToolError(e)),responseMessages:i.response.messages}),h=l?null:c,g=new Set;for(let e of[...i.content??[],...i.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&g.add(e.toolCallId);let ee=normalizeProviderToolHistory({messages:p,providerExecutedOutcomeIds:g}),_=ee.messages,v={...s,compaction:createNextCompactionConfig(s.compaction,r,i)},y=t.workflow===!0?readWorkflowContinuationSecurity(v):void 0;if(y!==void 0){let e=await getWorkflowSandboxInterrupt(i,y);if(e!==void 0){if(!isWorkflowRuntimeActionInterrupt(e))throw Error(`Unsupported Workflow interrupt kind "${e.payload.kind}".`);return parkOnWorkflowInterrupt({baseSession:v,emissionState:o,interrupt:e,promptMessages:r,responseMessages:_})}}let b=extractToolApprovalInputRequests({content:i.content??[],excludedCallIds:f}),x=new Set(b.map(e=>e.action.callId)),S=extractQuestionInputRequests({toolCalls:i.toolCalls,excludedCallIds:new Set([...f,...x])}),C=[...b,...S],w=getAdvertisedTools({session:v,tools:t.tools}),T=(i.toolCalls??[]).filter(e=>!f.has(e.toolCallId)).filter(e=>t.tools.get(e.toolName)?.runtimeAction!==void 0).filter(e=>w.get(e.toolName)?.runtimeAction===void 0?(log.warn(`runtime action tool call blocked because tool is not advertised`,{callId:e.toolCallId,sessionId:v.sessionId,toolName:e.toolName}),!1):!0).map(e=>createRuntimeActionRequestFromToolCall({toolCall:e,tools:w}));if(T.length>0)return{next:null,session:setHarnessEmissionState(setPendingRuntimeActionBatch({actions:T,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:_,session:{...v,history:[...r]}}),o)};if(C.length>0){let e=setPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:C,responseMessages:_,session:{...v,history:[...r]}});return n&&(await n(createInputRequestedEvent({requests:C,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode,e.continuationToken),e=setHarnessEmissionState(e,o))),{next:null,session:e}}let E=findAuthorizationSignalFromToolResults(i.toolResults);if(E){let{challenges:e}=E;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({...v,history:[...r],state:setPendingAuthorization(v.state,{challenges:e})},o)}}let D=_,ne=[...r,...D],A={...v,history:ne};return!(A.outputSchema!==void 0&&extractFinalOutput(i)!==void 0)&&(D.at(-1)?.role===`tool`||ee.outcomeEndsResponse||hasDeferredStepInput(A))?(n&&(o=advanceStep(o),A=setHarnessEmissionState(A,o)),{next:a,session:A}):t.mode===`task`?finishTaskTurn({emissionState:o,emit:n,history:r,result:i,schema:A.outputSchema,session:A,stepOutput:h}):finishConversationTurn({emissionState:o,emit:n,history:r,result:i,schema:A.outputSchema,session:A})}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&&!isInvalidToolCall(e))?.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,i){return await e(createResultCompletedEvent({result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),emitTurnEpilogue(e,t,r,i)}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.continuationToken),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.continuationToken),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.continuationToken),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,continuationToken:o.continuationToken}),o=setHarnessEmissionState(o,a)),{next:null,session:o}):(o=persistStructuredAssistantTurn(o,n,s),t&&(a=await emitStructuredResult(t,a,s,`conversation`,o.continuationToken),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({bridgeRequestLimit:resolveWorkflowSandboxBridgeRequestLimit(e.config.workflowMaxSubagents),continuationSecurity:a,interrupt:s,lifecycle:i,resolution:r[c]?.output,tools:t});let n=await unwrapWorkflowSandboxResult(o,a);if(n.status!==`interrupted`||!isWorkflowRuntimeActionInterrupt(n.interrupt)||c+1>=r.length)break;let l=getWorkflowRuntimeActionInterrupts(n.interrupt)[0];if(l===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);c++,s=l}}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,u=replaceWorkflowToolResult([...e.session.history,...t.responseMessages],n.outerToolCallId,c),d=clearPendingWorkflowInterrupt({...e.session,history:u});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=u.slice(0,t),r=u.slice(t);return d={...d,history:n},parkOnWorkflowInterrupt({baseSession:d,emissionState:e.emissionState,interrupt:s.interrupt,promptMessages:n,responseMessages:r})}return{next:e.runStep,session:d}}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,buildGatewayAttributionHeaders(a.model,e.runtimeIdentity),e.abortSignal),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,n){for(let r=1;;r++){throwIfTurnAborted(n);try{return await e(r)}catch(e){if(throwIfTurnAborted(n),r===3||classifyModelCallError(e)!==`retry`)throw e;let i=500*2**(r-1)+Math.floor(Math.random()*250);log.warn(`model call failed transiently — retrying`,{attempt:r,delayMs:i,sessionId:t.sessionId,turnId:t.turnId,error:e}),await new Promise(e=>setTimeout(e,i))}}}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};
@@ -23,7 +23,9 @@
23
23
  * session total crosses into it.
24
24
  */
25
25
  import type { HarnessSession, SessionStateMap } from "#harness/types.js";
26
+ import { type SessionRuntimeTokenLimits, type SessionTokenLimitViolation } from "#harness/session-token-limits.js";
26
27
  import type { TokenUsage } from "#shared/token-usage.js";
28
+ export type { SessionRuntimeTokenLimits, SessionTokenLimitViolation };
27
29
  export interface TokenUsageTotals {
28
30
  readonly cacheReadTokens: number;
29
31
  readonly cacheWriteTokens: number;
@@ -46,28 +48,35 @@ export interface TurnUsageState extends TokenUsageTotals {
46
48
  }
47
49
  /** Reads the stored per-turn token state, or `undefined` when absent. */
48
50
  export declare function getTurnUsageState(state: SessionStateMap | undefined): TurnUsageState | undefined;
49
- export type SessionTokenLimitViolation = {
50
- readonly kind: "input";
51
- readonly limit: number;
52
- readonly usedTokens: number;
53
- } | {
54
- readonly kind: "output";
55
- readonly limit: number;
56
- readonly usedTokens: number;
57
- };
58
51
  export declare function getSessionTokenUsage(session: Pick<HarnessSession, "state">): TokenUsageTotals;
59
52
  /** Projects a {@link TokenUsageTotals} down to the cross-cutting {@link TokenUsage} shape. */
60
53
  export declare function toUsage(totals: TokenUsageTotals): TokenUsage;
61
54
  /**
62
- * Resets the session token budget windows to the current usage totals.
63
- *
64
- * Called when the user grants a continuation after a session token limit was
65
- * reached. The configured limits keep their values and act as the size of the
66
- * next budget window, measured from the moment of the grant. Both windows
67
- * reset together so a session near two limits gets one prompt, not two
68
- * back-to-back.
55
+ * The lifetime-usage ceilings currently in force, per axis. An axis is
56
+ * absent when the configured limit leaves it uncapped. Before any granted
57
+ * continuation the runtime limit equals the configured limit; each grant
58
+ * re-anchors it to `usage + configured limit` via
59
+ * {@link bumpSessionRuntimeTokenLimits}.
60
+ */
61
+ export declare function getSessionRuntimeTokenLimits(session: Pick<HarnessSession, "limits" | "state">): SessionRuntimeTokenLimits;
62
+ /**
63
+ * Bumps the runtime token limits after the user grants a continuation:
64
+ * each capped axis is re-anchored to `current usage + configured limit`, so
65
+ * one approval always buys one full configured window from the moment of
66
+ * the grant (even when the last model call overshot by more than a window).
67
+ * Both axes bump together so a session near two limits gets one prompt, not
68
+ * two back-to-back. The configured limits never change.
69
69
  */
70
- export declare function extendSessionTokenBudget(session: HarnessSession): HarnessSession;
70
+ export declare function bumpSessionRuntimeTokenLimits(session: HarnessSession): HarnessSession;
71
+ /**
72
+ * Remaining lifetime-token quota under the runtime limits, per axis.
73
+ * `false` marks an uncapped axis. This is the pool a delegated child's
74
+ * budget is granted from.
75
+ */
76
+ export declare function getSessionRemainingTokenQuota(session: Pick<HarnessSession, "limits" | "state">): {
77
+ inputTokens: number | false;
78
+ outputTokens: number | false;
79
+ };
71
80
  export declare function getSessionTokenLimitViolation(session: Pick<HarnessSession, "limits" | "state">): SessionTokenLimitViolation | null;
72
81
  /** Writes per-turn token state onto a new copy of the session. */
73
82
  export declare function setTurnUsageState(session: HarnessSession, next: TurnUsageState): HarnessSession;
@@ -1 +1 @@
1
- const HARNESS_TURN_USAGE_STATE_KEY=`eve.harness.turnUsage`,SESSION_TOKEN_BUDGET_BASELINE_KEY=`eve.harness.sessionTokenBudgetBaseline`,ZERO_TOKEN_USAGE={cacheReadTokens:0,cacheWriteTokens:0,costUsd:0,inputTokens:0,outputTokens:0,sawCost:!1};function getTurnUsageState(t){return t?.[HARNESS_TURN_USAGE_STATE_KEY]}function getSessionTokenUsage(e){return getTurnUsageState(e.state)?.session??ZERO_TOKEN_USAGE}function toUsage(e){return{cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens,inputTokens:e.inputTokens,outputTokens:e.outputTokens}}const ZERO_BUDGET_BASELINE={inputTokens:0,outputTokens:0};function getSessionTokenBudgetBaseline(e){return e?.[SESSION_TOKEN_BUDGET_BASELINE_KEY]??ZERO_BUDGET_BASELINE}function extendSessionTokenBudget(e){let n=getSessionTokenUsage(e);return{...e,state:{...e.state,[SESSION_TOKEN_BUDGET_BASELINE_KEY]:{inputTokens:n.inputTokens,outputTokens:n.outputTokens}}}}function getSessionTokenLimitViolation(e){let t=getSessionTokenUsage(e),n=getSessionTokenBudgetBaseline(e.state),r=e.limits?.maxInputTokensPerSession,i=e.limits?.maxOutputTokensPerSession,a=t.inputTokens-n.inputTokens,o=t.outputTokens-n.outputTokens;return r!==void 0&&a>=r?{kind:`input`,limit:r,usedTokens:a}:i!==void 0&&o>=i?{kind:`output`,limit:i,usedTokens:o}:null}function setTurnUsageState(t,n){return{...t,state:{...t.state,[HARNESS_TURN_USAGE_STATE_KEY]:n}}}function accumulateTurnUsage(e){let t=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,t),turnId:e.turnId,session:addTokenUsage(r,t)}}function accumulateSessionUsage(e){let t=toTokenUsageDelta(e.usage),r=e.previous??{...ZERO_TOKEN_USAGE,session:ZERO_TOKEN_USAGE,turnId:``};return{...r,session:addTokenUsage(r.session,t)}}function addTokenUsage(e,t){return{cacheReadTokens:e.cacheReadTokens+t.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens+t.cacheWriteTokens,costUsd:e.costUsd+t.costUsd,inputTokens:e.inputTokens+t.inputTokens,outputTokens:e.outputTokens+t.outputTokens,sawCost:e.sawCost||t.sawCost}}function toTokenUsageDelta(e){if(e===void 0)return ZERO_TOKEN_USAGE;let t=e.inputTokens??0,r=e.outputTokens??0;return{cacheReadTokens:e.cacheReadTokens??0,cacheWriteTokens:e.cacheWriteTokens??0,costUsd:e.costUsd??0,inputTokens:t,outputTokens:r,sawCost:e.costUsd!==void 0}}export{accumulateSessionUsage,accumulateTurnUsage,extendSessionTokenBudget,getSessionTokenLimitViolation,getSessionTokenUsage,getTurnUsageState,setTurnUsageState,toUsage};
1
+ import{findRuntimeTokenLimitViolation,grantRuntimeTokenLimits,remainingRuntimeTokenQuota,resolveRuntimeTokenLimits}from"#harness/session-token-limits.js";const HARNESS_TURN_USAGE_STATE_KEY=`eve.harness.turnUsage`,SESSION_RUNTIME_TOKEN_LIMIT_KEY=`eve.harness.sessionRuntimeTokenLimit`,ZERO_TOKEN_USAGE={cacheReadTokens:0,cacheWriteTokens:0,costUsd:0,inputTokens:0,outputTokens:0,sawCost:!1};function getTurnUsageState(e){return e?.[HARNESS_TURN_USAGE_STATE_KEY]}function getSessionTokenUsage(e){return getTurnUsageState(e.state)?.session??ZERO_TOKEN_USAGE}function toUsage(e){return{cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens,inputTokens:e.inputTokens,outputTokens:e.outputTokens}}function getSessionRuntimeTokenLimits(e){let t=e.state?.[SESSION_RUNTIME_TOKEN_LIMIT_KEY];return resolveRuntimeTokenLimits({configured:configuredSessionTokenLimits(e),stored:t})}function bumpSessionRuntimeTokenLimits(e){let n=getSessionTokenUsage(e),r=grantRuntimeTokenLimits({configured:configuredSessionTokenLimits(e),usage:n});return{...e,state:{...e.state,[SESSION_RUNTIME_TOKEN_LIMIT_KEY]:r}}}function getSessionRemainingTokenQuota(e){let t=getSessionTokenUsage(e);return remainingRuntimeTokenQuota({runtime:getSessionRuntimeTokenLimits(e),usage:t})}function getSessionTokenLimitViolation(t){let n=getSessionTokenUsage(t),r=getSessionRuntimeTokenLimits(t);return findRuntimeTokenLimitViolation({configured:configuredSessionTokenLimits(t),runtime:r,usage:n})}function configuredSessionTokenLimits(e){return{inputTokens:e.limits?.maxInputTokensPerSession,outputTokens:e.limits?.maxOutputTokensPerSession}}function setTurnUsageState(e,t){return{...e,state:{...e.state,[HARNESS_TURN_USAGE_STATE_KEY]:t}}}function accumulateTurnUsage(e){let t=toTokenUsageDelta(e.usage),n=e.previous?.session??ZERO_TOKEN_USAGE;return{...addTokenUsage(e.previous!==void 0&&e.previous.turnId===e.turnId?e.previous:ZERO_TOKEN_USAGE,t),turnId:e.turnId,session:addTokenUsage(n,t)}}function accumulateSessionUsage(e){let t=toTokenUsageDelta(e.usage),n=e.previous??{...ZERO_TOKEN_USAGE,session:ZERO_TOKEN_USAGE,turnId:``};return{...n,session:addTokenUsage(n.session,t)}}function addTokenUsage(e,t){return{cacheReadTokens:e.cacheReadTokens+t.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens+t.cacheWriteTokens,costUsd:e.costUsd+t.costUsd,inputTokens:e.inputTokens+t.inputTokens,outputTokens:e.outputTokens+t.outputTokens,sawCost:e.sawCost||t.sawCost}}function toTokenUsageDelta(e){if(e===void 0)return ZERO_TOKEN_USAGE;let t=e.inputTokens??0,n=e.outputTokens??0;return{cacheReadTokens:e.cacheReadTokens??0,cacheWriteTokens:e.cacheWriteTokens??0,costUsd:e.costUsd??0,inputTokens:t,outputTokens:n,sawCost:e.costUsd!==void 0}}export{accumulateSessionUsage,accumulateTurnUsage,bumpSessionRuntimeTokenLimits,getSessionRemainingTokenQuota,getSessionRuntimeTokenLimits,getSessionTokenLimitViolation,getSessionTokenUsage,getTurnUsageState,setTurnUsageState,toUsage};
@@ -1,7 +1,7 @@
1
1
  import type { LanguageModel, ModelMessage, UserContent } from "ai";
2
2
  import type { SessionCapabilities } from "#channel/types.js";
3
3
  import type { AlsContext } from "#context/container.js";
4
- import type { HandleMessageStreamEvent, RuntimeIdentity } from "#protocol/message.js";
4
+ import type { UnstampedMessageStreamEvent, RuntimeIdentity } from "#protocol/message.js";
5
5
  import type { RunMode } from "#shared/run-mode.js";
6
6
  import type { RuntimeActionResult } from "#runtime/actions/types.js";
7
7
  import type { RuntimeModelReference } from "#runtime/agent/bootstrap.js";
@@ -181,7 +181,7 @@ export type HarnessToolMap = ReadonlyMap<string, HarnessToolDefinition>;
181
181
  * event handler, then injected into the harness so it can emit lifecycle
182
182
  * events without knowing about writables or handlers.
183
183
  */
184
- export type HarnessEmitFn = (event: HandleMessageStreamEvent, messages?: readonly import("ai").ModelMessage[]) => Promise<void>;
184
+ export type HarnessEmitFn = (event: UnstampedMessageStreamEvent, messages?: readonly import("ai").ModelMessage[]) => Promise<void>;
185
185
  /**
186
186
  * Unified event handler: emits the event to the stream, then
187
187
  * dispatches to hook subscribers and dynamic tool resolvers.
@@ -190,7 +190,7 @@ export type HarnessEmitFn = (event: HandleMessageStreamEvent, messages?: readonl
190
190
  * every event goes through channel adapter, stream write, hooks,
191
191
  * and dynamic tool dispatch in one call.
192
192
  */
193
- export type HandleEventFn = (event: HandleMessageStreamEvent, messages?: readonly import("ai").ModelMessage[]) => Promise<void>;
193
+ export type HandleEventFn = (event: UnstampedMessageStreamEvent, messages?: readonly import("ai").ModelMessage[]) => Promise<void>;
194
194
  /**
195
195
  * Dependencies injected into the tool-loop harness at construction time.
196
196
  */
@@ -241,7 +241,7 @@ export interface ToolLoopHarnessConfig {
241
241
  readonly onCompaction?: () => readonly ModelMessage[];
242
242
  readonly dispatchDynamicModelEvent?: (input: {
243
243
  readonly ctx: AlsContext;
244
- readonly event: HandleMessageStreamEvent;
244
+ readonly event: UnstampedMessageStreamEvent;
245
245
  readonly fallback: RuntimeModelReference;
246
246
  readonly messages: readonly ModelMessage[];
247
247
  }) => Promise<void>;
@@ -1,8 +1,8 @@
1
1
  import type { HarnessEmissionState } from "#harness/emission.js";
2
2
  import type { HarnessToolMap } from "#harness/types.js";
3
- import { type HandleMessageStreamEvent } from "#protocol/message.js";
3
+ import { type UnstampedMessageStreamEvent } from "#protocol/message.js";
4
4
  import type { WorkflowSandboxLifecycle } from "#shared/workflow-sandbox.js";
5
- type EmitWorkflowLifecycleEvent = (event: HandleMessageStreamEvent) => Promise<void>;
5
+ type EmitWorkflowLifecycleEvent = (event: UnstampedMessageStreamEvent) => Promise<void>;
6
6
  /** Projects sandboxed subagent calls onto eve's existing action event stream. */
7
7
  export declare function createWorkflowLifecycle(input: {
8
8
  readonly emit: EmitWorkflowLifecycleEvent;
@@ -1 +1 @@
1
- import{createRequire}from"node:module";import{existsSync,readFileSync,realpathSync}from"node:fs";import{basename,dirname,join}from"node:path";import{fileURLToPath}from"node:url";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";let cachedPackageInfo,cachedPackageLocation;const BUNDLED_FALLBACK_PACKAGE_VERSION=`0.27.12`,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 tryResolveVerifiedPackageRoot(e){try{let t=realpathSync.native(e);return tryReadInstalledPackageInfo(t,EVE_PACKAGE_NAME)===void 0?void 0:dirname(t)}catch{return}}function findNearestVerifiedPackageRoot(e){let t=e;for(;;){let e=tryResolveVerifiedPackageRoot(join(t,`package.json`));if(e!==void 0)return e;let n=dirname(t);if(n===t)return;t=n}}function tryResolveDirectBuildLocation(e){let t=dirname(e);for(;;){if(basename(t)===`dist`){let e=tryResolveVerifiedPackageRoot(join(dirname(t),`package.json`));if(e!==void 0)return{packageBuildRoot:t,packageRoot:e}}let e=dirname(t);if(e===t)return;t=e}}function isSourceCheckout(e){return existsSync(join(e,`src`,`internal`,`application`,`package.ts`))}function tryCreatePackageLocation(e){if(isSourceCheckout(e))return{packageBuildRoot:null,packageRoot:e};let n=join(e,`dist`);if(existsSync(n))return{packageBuildRoot:n,packageRoot:e}}function resolveSelfPackageJsonPath(t){return createRequire(t).resolve(`${EVE_PACKAGE_NAME}/package.json`)}function resolvePackageLocationFromModulePath(e,t=resolveSelfPackageJsonPath){let n=realpathSync.native(e),i=tryResolveDirectBuildLocation(n);if(i!==void 0)return i;let a=findNearestVerifiedPackageRoot(dirname(n));if(a!==void 0&&isSourceCheckout(a))return{packageBuildRoot:null,packageRoot:a};try{let e=tryResolveVerifiedPackageRoot(t(n)),r=e===void 0?void 0:tryCreatePackageLocation(e);if(r!==void 0)return r}catch{}let o=a===void 0?void 0:tryCreatePackageLocation(a);if(o!==void 0)return o;throw Error(`Failed to resolve the eve package root from "${e}".`)}function resolvePackageLocation(){return cachedPackageLocation??=resolvePackageLocationFromModulePath(resolveCurrentModulePath()),cachedPackageLocation}function resolvePackageBuildRoot(){return resolvePackageLocation().packageBuildRoot}function resolvePackageRoot(){return resolvePackageLocation().packageRoot}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,resolvePackageCompiledFilePath,resolvePackageDependencyPath,resolvePackageLocationFromModulePath,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{fileURLToPath}from"node:url";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";let cachedPackageInfo,cachedPackageLocation;const BUNDLED_FALLBACK_PACKAGE_VERSION=`0.28.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 tryResolveVerifiedPackageRoot(e){try{let t=realpathSync.native(e);return tryReadInstalledPackageInfo(t,EVE_PACKAGE_NAME)===void 0?void 0:dirname(t)}catch{return}}function findNearestVerifiedPackageRoot(e){let t=e;for(;;){let e=tryResolveVerifiedPackageRoot(join(t,`package.json`));if(e!==void 0)return e;let n=dirname(t);if(n===t)return;t=n}}function tryResolveDirectBuildLocation(e){let t=dirname(e);for(;;){if(basename(t)===`dist`){let e=tryResolveVerifiedPackageRoot(join(dirname(t),`package.json`));if(e!==void 0)return{packageBuildRoot:t,packageRoot:e}}let e=dirname(t);if(e===t)return;t=e}}function isSourceCheckout(e){return existsSync(join(e,`src`,`internal`,`application`,`package.ts`))}function tryCreatePackageLocation(e){if(isSourceCheckout(e))return{packageBuildRoot:null,packageRoot:e};let n=join(e,`dist`);if(existsSync(n))return{packageBuildRoot:n,packageRoot:e}}function resolveSelfPackageJsonPath(t){return createRequire(t).resolve(`${EVE_PACKAGE_NAME}/package.json`)}function resolvePackageLocationFromModulePath(e,t=resolveSelfPackageJsonPath){let n=realpathSync.native(e),i=tryResolveDirectBuildLocation(n);if(i!==void 0)return i;let a=findNearestVerifiedPackageRoot(dirname(n));if(a!==void 0&&isSourceCheckout(a))return{packageBuildRoot:null,packageRoot:a};try{let e=tryResolveVerifiedPackageRoot(t(n)),r=e===void 0?void 0:tryCreatePackageLocation(e);if(r!==void 0)return r}catch{}let o=a===void 0?void 0:tryCreatePackageLocation(a);if(o!==void 0)return o;throw Error(`Failed to resolve the eve package root from "${e}".`)}function resolvePackageLocation(){return cachedPackageLocation??=resolvePackageLocationFromModulePath(resolveCurrentModulePath()),cachedPackageLocation}function resolvePackageBuildRoot(){return resolvePackageLocation().packageBuildRoot}function resolvePackageRoot(){return resolvePackageLocation().packageRoot}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,resolvePackageCompiledFilePath,resolvePackageDependencyPath,resolvePackageLocationFromModulePath,resolvePackageRoot,resolvePackageSourceDirectoryPath,resolvePackageSourceFilePath,resolveWorkflowModulePath};
@@ -1 +1 @@
1
- import{expectFunction,expectObjectRecord,expectOnlyKnownKeys,expectPositiveInteger,expectProviderOptions,expectString,getOptionalStringRecordProperty}from"#internal/authored-module.js";import{isDynamicSentinel}from"#shared/dynamic-tool-definition.js";function normalizeAgentDefinition(e,i){let o=expectObjectRecord(e,i);if(expectOnlyKnownKeys(o,[`build`,`compaction`,`description`,`experimental`,`limits`,`model`,`modelContextWindowTokens`,`modelOptions`,`outputSchema`,`reasoning`],i),o.model===void 0)throw Error(`${i} The "model" field is required.`);let s={model:normalizeAgentModelDefinition(o.model,i)};return o.description!==void 0&&(s.description=expectString(o.description,i)),o.compaction!==void 0&&(s.compaction=normalizeAgentCompactionDefinition(o.compaction,i)),o.build!==void 0&&(s.build=normalizeAgentBuildDefinition(o.build,i)),o.experimental!==void 0&&(s.experimental=normalizeAgentExperimentalDefinition(o.experimental,i)),o.modelOptions!==void 0&&(s.modelOptions=normalizeAgentModelOptions(o.modelOptions,i)),o.modelContextWindowTokens!==void 0&&(s.modelContextWindowTokens=expectPositiveInteger(o.modelContextWindowTokens,i)),o.outputSchema!==void 0&&(s.outputSchema=o.outputSchema),o.reasoning!==void 0&&(s.reasoning=normalizeAgentReasoningDefinition(o.reasoning,i)),o.limits!==void 0&&(s.limits=normalizeAgentLimitsDefinition(o.limits,i)),s}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 normalizeAgentModelDefinition(r,i){if(!isDynamicSentinel(r))return r;let a=expectObjectRecord(r,i);if(expectOnlyKnownKeys(a,[`events`,`fallback`,`kind`],i),a.fallback===void 0)throw Error(`${i} Dynamic model definitions must include a "fallback" model.`);let o=expectObjectRecord(a.events,i),c={};for(let[t,n]of Object.entries(o))c[t]=expectFunction(n,i);return{events:c,fallback:a.fallback,kind:a.kind}}function expectPositiveIntegerOrFalse(e,t){return e!==!1&&expectPositiveInteger(e,t)}function normalizeAgentLimitsDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`maxInputTokensPerSession`,`maxOutputTokensPerSession`],r);let a={};return i.maxInputTokensPerSession!==void 0&&(a.maxInputTokensPerSession=expectPositiveIntegerOrFalse(i.maxInputTokensPerSession,r)),i.maxOutputTokensPerSession!==void 0&&(a.maxOutputTokensPerSession=expectPositiveIntegerOrFalse(i.maxOutputTokensPerSession,r)),a}function normalizeAgentBuildDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`externalDependencies`],r);let o={};if(i.externalDependencies!==void 0){if(!Array.isArray(i.externalDependencies))throw Error(r);o.externalDependencies=Object.freeze(i.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,r){let a=expectObjectRecord(e,r);expectOnlyKnownKeys(a,[`providerOptions`],r);let o=a.providerOptions;return o===void 0?{}:{providerOptions:expectProviderOptions(o,r)}}function normalizeAgentCompactionDefinition(e,i){let a=expectObjectRecord(e,i);expectOnlyKnownKeys(a,[`model`,`modelContextWindowTokens`,`thresholdPercent`],i);let o={};if(a.model!==void 0){if(isDynamicSentinel(a.model))throw Error(`${i} "compaction.model" does not support defineDynamic — provide a static model.`);o.model=a.model}if(a.modelContextWindowTokens!==void 0&&(o.modelContextWindowTokens=expectPositiveInteger(a.modelContextWindowTokens,i)),a.thresholdPercent!==void 0){let e=a.thresholdPercent;if(typeof e!=`number`||!Number.isFinite(e)||e<0||e>1)throw Error(i);o.thresholdPercent=e}return o}function normalizeInstructionsDefinition(e,r){let i=expectObjectRecord(e,r);return expectOnlyKnownKeys(i,[`markdown`],r),{markdown:expectString(i.markdown,r)}}function normalizeSkillDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`description`,`files`,`license`,`markdown`,`metadata`],r);let s={description:expectString(i.description,r),markdown:expectString(i.markdown,r)},c=i.license,l=getOptionalStringRecordProperty(i,`metadata`,r);return c!==void 0&&(s.license=expectString(c,r)),l!==void 0&&(s.metadata=l),i.files!==void 0&&(s.files=normalizeSkillFiles(i.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,i){let o=expectObjectRecord(r,i);expectOnlyKnownKeys(o,[`cron`,`markdown`,`run`],i);let s=expectString(o.cron,i),c=o.markdown!==void 0,l=o.run!==void 0;if(c&&l)throw Error(`${i} Pass either "markdown" (fire-and-forget) or "run" (handler) — not both.`);if(!c&&!l)throw Error(`${i} Must provide either "markdown" (fire-and-forget) or "run" (handler).`);let u={cron:s};return c?u.markdown=expectString(o.markdown,i):u.run=expectFunction(o.run,i),u}export{normalizeAgentDefinition,normalizeInstructionsDefinition,normalizeScheduleDefinition,normalizeSkillDefinition};
1
+ import{expectFunction,expectObjectRecord,expectOnlyKnownKeys,expectPositiveInteger,expectProviderOptions,expectString,getOptionalStringRecordProperty}from"#internal/authored-module.js";import{isDynamicSentinel}from"#shared/dynamic-tool-definition.js";function normalizeAgentDefinition(e,i){let o=expectObjectRecord(e,i);if(expectOnlyKnownKeys(o,[`build`,`compaction`,`description`,`experimental`,`limits`,`model`,`modelContextWindowTokens`,`modelOptions`,`outputSchema`,`reasoning`],i),o.model===void 0)throw Error(`${i} The "model" field is required.`);let s={model:normalizeAgentModelDefinition(o.model,i)};return o.description!==void 0&&(s.description=expectString(o.description,i)),o.compaction!==void 0&&(s.compaction=normalizeAgentCompactionDefinition(o.compaction,i)),o.build!==void 0&&(s.build=normalizeAgentBuildDefinition(o.build,i)),o.experimental!==void 0&&(s.experimental=normalizeAgentExperimentalDefinition(o.experimental,i)),o.modelOptions!==void 0&&(s.modelOptions=normalizeAgentModelOptions(o.modelOptions,i)),o.modelContextWindowTokens!==void 0&&(s.modelContextWindowTokens=expectPositiveInteger(o.modelContextWindowTokens,i)),o.outputSchema!==void 0&&(s.outputSchema=o.outputSchema),o.reasoning!==void 0&&(s.reasoning=normalizeAgentReasoningDefinition(o.reasoning,i)),o.limits!==void 0&&(s.limits=normalizeAgentLimitsDefinition(o.limits,i)),s}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 normalizeAgentModelDefinition(r,i){if(!isDynamicSentinel(r))return r;let a=expectObjectRecord(r,i);if(expectOnlyKnownKeys(a,[`events`,`fallback`,`kind`],i),a.fallback===void 0)throw Error(`${i} Dynamic model definitions must include a "fallback" model.`);let o=expectObjectRecord(a.events,i),c={};for(let[t,n]of Object.entries(o))c[t]=expectFunction(n,i);return{events:c,fallback:a.fallback,kind:a.kind}}function expectPositiveIntegerOrFalse(e,t){return e!==!1&&expectPositiveInteger(e,t)}function normalizeAgentLimitsDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`maxInputTokensPerSession`,`maxOutputTokensPerSession`,`sessionTimeoutMs`],r);let a={};return i.sessionTimeoutMs!==void 0&&(a.sessionTimeoutMs=expectPositiveIntegerOrFalse(i.sessionTimeoutMs,r)),i.maxInputTokensPerSession!==void 0&&(a.maxInputTokensPerSession=expectPositiveIntegerOrFalse(i.maxInputTokensPerSession,r)),i.maxOutputTokensPerSession!==void 0&&(a.maxOutputTokensPerSession=expectPositiveIntegerOrFalse(i.maxOutputTokensPerSession,r)),a}function normalizeAgentBuildDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`externalDependencies`],r);let o={};if(i.externalDependencies!==void 0){if(!Array.isArray(i.externalDependencies))throw Error(r);o.externalDependencies=Object.freeze(i.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,r){let a=expectObjectRecord(e,r);expectOnlyKnownKeys(a,[`providerOptions`],r);let o=a.providerOptions;return o===void 0?{}:{providerOptions:expectProviderOptions(o,r)}}function normalizeAgentCompactionDefinition(e,i){let a=expectObjectRecord(e,i);expectOnlyKnownKeys(a,[`model`,`modelContextWindowTokens`,`thresholdPercent`],i);let o={};if(a.model!==void 0){if(isDynamicSentinel(a.model))throw Error(`${i} "compaction.model" does not support defineDynamic — provide a static model.`);o.model=a.model}if(a.modelContextWindowTokens!==void 0&&(o.modelContextWindowTokens=expectPositiveInteger(a.modelContextWindowTokens,i)),a.thresholdPercent!==void 0){let e=a.thresholdPercent;if(typeof e!=`number`||!Number.isFinite(e)||e<0||e>1)throw Error(i);o.thresholdPercent=e}return o}function normalizeInstructionsDefinition(e,r){let i=expectObjectRecord(e,r);return expectOnlyKnownKeys(i,[`markdown`],r),{markdown:expectString(i.markdown,r)}}function normalizeSkillDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`description`,`files`,`license`,`markdown`,`metadata`],r);let s={description:expectString(i.description,r),markdown:expectString(i.markdown,r)},c=i.license,l=getOptionalStringRecordProperty(i,`metadata`,r);return c!==void 0&&(s.license=expectString(c,r)),l!==void 0&&(s.metadata=l),i.files!==void 0&&(s.files=normalizeSkillFiles(i.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,i){let o=expectObjectRecord(r,i);expectOnlyKnownKeys(o,[`cron`,`markdown`,`run`],i);let s=expectString(o.cron,i),c=o.markdown!==void 0,l=o.run!==void 0;if(c&&l)throw Error(`${i} Pass either "markdown" (fire-and-forget) or "run" (handler) — not both.`);if(!c&&!l)throw Error(`${i} Must provide either "markdown" (fire-and-forget) or "run" (handler).`);let u={cron:s};return c?u.markdown=expectString(o.markdown,i):u.run=expectFunction(o.run,i),u}export{normalizeAgentDefinition,normalizeInstructionsDefinition,normalizeScheduleDefinition,normalizeSkillDefinition};
@@ -1,4 +1,4 @@
1
- const BANNER_LINES=[{importLine:`import { fileURLToPath as __eveFileURLToPath } from "node:url";`,declarationLine:`const __filename = __eveFileURLToPath(import.meta.url);`,bindingPattern:/^(?:const|let|var)\s+__filename(?![\w$])/m},{importLine:`import { dirname as __eveDirname } from "node:path";`,declarationLine:`const __dirname = __eveDirname(__filename);`,bindingPattern:/^(?:const|let|var)\s+__dirname(?![\w$])/m}],REQUIRE_LINE={importLine:`import { createRequire as __eveCreateRequire } from "node:module";`,declarationLine:`const require = __eveCreateRequire(import.meta.url);`,bindingPattern:/^(?:const|let|var)\s+require(?![\w$])/m};function buildNodeEsmCompatBanner(n,r={}){let i=[...BANNER_LINES];r.includeRequire===!0&&i.push(REQUIRE_LINE);let a=[],o=[];for(let e of i)e.bindingPattern.test(n)||(a.push(e.importLine),o.push(e.declarationLine));return o.length===0?``:[...a,...o].join(`
1
+ const BANNER_LINES=[{importLine:`import { fileURLToPath as __eveFileURLToPath } from "node:url";`,declarationLine:`const __filename = __eveFileURLToPath(import.meta.url);`,bindingPattern:/^(?:const|let|var)\s+__filename(?![\w$])/m},{importLine:`import { dirname as __eveDirname } from "node:path";`,declarationLine:`const __dirname = __eveDirname(__filename);`,bindingPattern:/^(?:const|let|var)\s+__dirname(?![\w$])/m}],FILENAME_BANNER_LINE=BANNER_LINES[0],DIRNAME_BANNER_LINE=BANNER_LINES[1],REQUIRE_LINE={importLine:`import { createRequire as __eveCreateRequire } from "node:module";`,declarationLine:`const require = __eveCreateRequire(import.meta.url);`,bindingPattern:/^(?:const|let|var)\s+require(?![\w$])/m};function buildNodeEsmCompatBanner(i,a={}){let o=[...BANNER_LINES];a.includeRequire===!0&&o.push(REQUIRE_LINE);let s=[],c=[],l=FILENAME_BANNER_LINE.bindingPattern.test(i),u=DIRNAME_BANNER_LINE.bindingPattern.test(i);for(let e of o)e.bindingPattern.test(i)||(s.push(e.importLine),c.push(e===DIRNAME_BANNER_LINE&&l?`const __dirname = __eveDirname(__eveFileURLToPath(import.meta.url));`:e.declarationLine));return l&&!u&&s.unshift(FILENAME_BANNER_LINE.importLine),c.length===0?``:[...s,...c].join(`
2
2
  `)}function createNodeEsmCompatBannerPlugin(e={}){return{name:`eve-node-esm-compat-banner`,renderChunk(t,n){let r=buildNodeEsmCompatBanner(t,e);return r===``?null:{code:`${r}\n${t}`,map:createPrependedLineSourceMap({insertedLineCount:r.split(`
3
3
  `).length,source:n?.fileName??`eve-node-esm-compat-banner-input`,sourceContent:t})}}}}function createPrependedLineSourceMap({insertedLineCount:e,source:t,sourceContent:n}){let r=n.split(`
4
4
  `).length,i=Array.from({length:r},(e,t)=>encodeVlqFields(t===0?[0,0,0,0]:[0,0,1,0]));return{version:3,sources:[t],sourcesContent:[n],names:[],mappings:`${`;`.repeat(e)}${i.join(`;`)}`}}function encodeVlqFields(e){return e.map(e=>encodeVlqInteger(e)).join(``)}function encodeVlqInteger(e){let t=e<0?(-e<<1)+1:e<<1,n=``;do{let e=t&31;t>>>=5,t>0&&(e|=32),n+=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`[e]}while(t>0);return n}export{buildNodeEsmCompatBanner,createNodeEsmCompatBannerPlugin};
@@ -38,7 +38,7 @@ export declare function defineHook<T = unknown>(): {
38
38
  /**
39
39
  * Sleeps from inside workflow-body code.
40
40
  */
41
- export declare function sleep(): never;
41
+ export declare function sleep(duration: string | number | Date): Promise<void>;
42
42
  /**
43
43
  * `resumeHook()` is an external/runtime API and must not run in workflow bodies.
44
44
  */
@@ -1 +1 @@
1
- const WORKFLOW_CONTEXT_SYMBOL=Symbol.for(`WORKFLOW_CONTEXT`),WORKFLOW_CREATE_HOOK=Symbol.for(`WORKFLOW_CREATE_HOOK`),WORKFLOW_GET_STREAM_ID=Symbol.for(`WORKFLOW_GET_STREAM_ID`),WORKFLOW_USE_STEP=Symbol.for(`WORKFLOW_USE_STEP`),STREAM_NAME_SYMBOL=Symbol.for(`WORKFLOW_STREAM_NAME`),workflowGlobal=globalThis;var RetryableError=class extends Error{},FatalError=class extends Error{};function createHook(e){let n=workflowGlobal[WORKFLOW_CREATE_HOOK];if(n===void 0)throw Error("`createHook()` can only be called inside a workflow function");return n(e)}function getWorkflowMetadata(){let t=workflowGlobal[WORKFLOW_CONTEXT_SYMBOL];if(t===void 0)throw Error("`getWorkflowMetadata()` can only be called inside a workflow or step function");return t}function getWritable(e={}){let t=workflowGlobal[WORKFLOW_GET_STREAM_ID];if(t===void 0)throw Error("`getWritable()` can only be called inside a workflow function");let r=t(e.namespace);return Object.create(globalThis.WritableStream.prototype,{[STREAM_NAME_SYMBOL]:{value:r,writable:!1}})}function createWebhook(e){let t=createHook(e),n=getWorkflowMetadata();return t.url=`${typeof n.url==`string`?n.url:``}/.well-known/workflow/v1/webhook/${encodeURIComponent(t.token)}`,t}function defineHook(){return{create:createHook,resume(){throw Error("`defineHook().resume()` can only be called from external contexts.")}}}function sleep(){throw Error("`sleep()` is not available in eve workflow body bundles")}function resumeHook(){throw Error("`resumeHook()` can only be called from outside a workflow function")}function getStepMetadata(){throw Error("`getStepMetadata()` can only be called inside a step function")}async function setAttributes(e,t={}){let n=Object.entries(e);if(n.length===0)return;let i=workflowGlobal[WORKFLOW_USE_STEP];if(i===void 0)throw Error("`setAttributes()` can only be called inside a workflow runtime context");let a=n.map(([e,t])=>({key:e,value:t===void 0?null:t})),o=t.allowReservedAttributes===!0?{allowReservedAttributes:!0}:{};await i(`__builtin_set_attributes`)(a,o)}export{FatalError,RetryableError,createHook,createWebhook,defineHook,getStepMetadata,getWorkflowMetadata,getWritable,resumeHook,setAttributes,sleep};
1
+ const WORKFLOW_CONTEXT_SYMBOL=Symbol.for(`WORKFLOW_CONTEXT`),WORKFLOW_CREATE_HOOK=Symbol.for(`WORKFLOW_CREATE_HOOK`),WORKFLOW_GET_STREAM_ID=Symbol.for(`WORKFLOW_GET_STREAM_ID`),WORKFLOW_SLEEP=Symbol.for(`WORKFLOW_SLEEP`),WORKFLOW_USE_STEP=Symbol.for(`WORKFLOW_USE_STEP`),STREAM_NAME_SYMBOL=Symbol.for(`WORKFLOW_STREAM_NAME`),workflowGlobal=globalThis;var RetryableError=class extends Error{},FatalError=class extends Error{};function createHook(e){let n=workflowGlobal[WORKFLOW_CREATE_HOOK];if(n===void 0)throw Error("`createHook()` can only be called inside a workflow function");return n(e)}function getWorkflowMetadata(){let t=workflowGlobal[WORKFLOW_CONTEXT_SYMBOL];if(t===void 0)throw Error("`getWorkflowMetadata()` can only be called inside a workflow or step function");return t}function getWritable(e={}){let t=workflowGlobal[WORKFLOW_GET_STREAM_ID];if(t===void 0)throw Error("`getWritable()` can only be called inside a workflow function");let r=t(e.namespace);return Object.create(globalThis.WritableStream.prototype,{[STREAM_NAME_SYMBOL]:{value:r,writable:!1}})}function createWebhook(e){let t=createHook(e),n=getWorkflowMetadata();return t.url=`${typeof n.url==`string`?n.url:``}/.well-known/workflow/v1/webhook/${encodeURIComponent(t.token)}`,t}function defineHook(){return{create:createHook,resume(){throw Error("`defineHook().resume()` can only be called from external contexts.")}}}function sleep(e){let t=workflowGlobal[WORKFLOW_SLEEP];if(t===void 0)throw Error("`sleep()` can only be called inside a workflow function");return t(e)}function resumeHook(){throw Error("`resumeHook()` can only be called from outside a workflow function")}function getStepMetadata(){throw Error("`getStepMetadata()` can only be called inside a step function")}async function setAttributes(e,t={}){let n=Object.entries(e);if(n.length===0)return;let r=workflowGlobal[WORKFLOW_USE_STEP];if(r===void 0)throw Error("`setAttributes()` can only be called inside a workflow runtime context");let i=n.map(([e,t])=>({key:e,value:t===void 0?null:t})),a=t.allowReservedAttributes===!0?{allowReservedAttributes:!0}:{};await r(`__builtin_set_attributes`)(i,a)}export{FatalError,RetryableError,createHook,createWebhook,defineHook,getStepMetadata,getWorkflowMetadata,getWritable,resumeHook,setAttributes,sleep};
@@ -0,0 +1,25 @@
1
+ import type { MessageStreamEvent } from "#protocol/message.js";
2
+ /** Remembers which session-stream events have already been consumed. */
3
+ export type EventDeduper = {
4
+ /**
5
+ * Records `event` and returns true when it is new — false when its id was
6
+ * already admitted, so the caller should drop it.
7
+ */
8
+ admit(event: MessageStreamEvent): boolean;
9
+ /** Number of ids currently remembered. */
10
+ readonly size: number;
11
+ };
12
+ /**
13
+ * Creates an {@link EventDeduper} keyed on the durable `meta.id`.
14
+ *
15
+ * Catches a reconnect that overlaps handled events, a rewind to an earlier
16
+ * `startIndex`, and a saved log merged with the prefix a live stream replays.
17
+ * A retried step is not a duplicate: it re-emits under new ids.
18
+ *
19
+ * The window is unbounded because a bounded one cannot survive a rewind past
20
+ * its capacity — the oldest id is already evicted, so re-admitting it evicts
21
+ * the next and the whole replay cascades back in. Callers here retain an
22
+ * object per event anyway; one that retains nothing should bound its reads
23
+ * with the `startIndex` cursor instead.
24
+ */
25
+ export declare function createEventDeduper(): EventDeduper;
@@ -0,0 +1 @@
1
+ function createEventDeduper(){let e=new Set;return{admit(t){let n=t.meta?.id;return n===void 0?!0:e.has(n)?!1:(e.add(n),!0)},get size(){return e.size}}}export{createEventDeduper};
@@ -0,0 +1,16 @@
1
+ /** Prefix stamped on every eve session stream event id. */
2
+ export declare const EVENT_ID_PREFIX = "evt_";
3
+ /**
4
+ * Mints the id carried on one session stream event's `meta.id`:
5
+ * {@link EVENT_ID_PREFIX} followed by a ULID.
6
+ *
7
+ * See `#shared/ulid.js` for the ordering guarantee — it holds within a
8
+ * process, not across the separate steps of one session.
9
+ */
10
+ export declare function createEventId(): string;
11
+ /**
12
+ * Returns true when `value` has the shape {@link createEventId} produces.
13
+ *
14
+ * Shape-only: this does not prove eve minted the id.
15
+ */
16
+ export declare function isEventId(value: string): boolean;
@@ -0,0 +1 @@
1
+ import{createUlid,isUlid}from"#shared/ulid.js";const EVENT_ID_PREFIX=`evt_`;function createEventId(){return`${EVENT_ID_PREFIX}${createUlid()}`}function isEventId(e){return e.startsWith(`evt_`)&&isUlid(e.slice(4))}export{EVENT_ID_PREFIX,createEventId,isEventId};
@@ -9,7 +9,7 @@ export declare const EVE_STREAM_TAIL_INDEX_HEADER = "x-eve-stream-tail-index";
9
9
  export declare const EVE_STREAM_VERSION_HEADER = "x-eve-stream-version";
10
10
  export declare const EVE_MESSAGE_STREAM_CONTENT_TYPE = "application/x-ndjson; charset=utf-8";
11
11
  export declare const EVE_MESSAGE_STREAM_FORMAT = "ndjson";
12
- export declare const EVE_MESSAGE_STREAM_VERSION = "19";
12
+ export declare const EVE_MESSAGE_STREAM_VERSION = "20";
13
13
  /**
14
14
  * eve-owned finish reason for one completed assistant step.
15
15
  *
@@ -28,11 +28,21 @@ export interface StepCompletedProviderMetadata {
28
28
  /**
29
29
  * Durable metadata attached to one persisted session stream event.
30
30
  *
31
- * Runtime code stamps this immediately before writing the event to the
32
- * workflow-owned stream so replay preserves the original timing.
31
+ * Stamped once, immediately before the event is written to the workflow-owned
32
+ * stream, and stored with it. Re-reading the stream — reconnecting, rewinding,
33
+ * or replaying a finished session — yields the same values every time.
33
34
  */
34
- export interface HandleMessageStreamEventMeta {
35
+ export interface MessageStreamEventMeta {
36
+ /** ISO-8601 emission time. */
35
37
  readonly at: string;
38
+ /**
39
+ * Unique, lexicographically sortable identifier for this event.
40
+ *
41
+ * Stamped from stream version 20 on: rewinding into a session that started
42
+ * before the upgrade yields events whose `id` is absent despite this type,
43
+ * and those cannot be deduplicated.
44
+ */
45
+ readonly id: string;
36
46
  }
37
47
  /**
38
48
  * Normalized completion status for one emitted runtime action result.
@@ -242,7 +252,7 @@ export interface SubagentStartedStreamEvent {
242
252
  export interface SubagentChildEventStreamEvent {
243
253
  data: {
244
254
  callId: string;
245
- event: HandleMessageStreamEvent;
255
+ event: UnstampedMessageStreamEvent;
246
256
  subagentName: string;
247
257
  };
248
258
  type: "subagent.event";
@@ -519,33 +529,40 @@ export interface SessionCompletedStreamEvent {
519
529
  type: "session.completed";
520
530
  }
521
531
  /**
522
- * Serializable stream event union for the durable message session flow.
532
+ * Serializable event before eve stamps the durable stream envelope.
533
+ *
534
+ * Internal emitters use this type while constructing events. Public stream
535
+ * consumers receive {@link MessageStreamEvent}.
523
536
  */
524
- export type HandleMessageStreamEvent = (CompactionCompletedStreamEvent | CompactionRequestedStreamEvent | AuthorizationCompletedStreamEvent | AuthorizationRequiredStreamEvent | MessageAppendedStreamEvent | MessageCompletedStreamEvent | MessageReceivedStreamEvent | ReasoningAppendedStreamEvent | SessionCompletedStreamEvent | SessionFailedStreamEvent | SessionStartedStreamEvent | SessionWaitingStreamEvent | ResultCompletedStreamEvent | SubagentCalledStreamEvent | SubagentChildEventStreamEvent | SubagentCompletedStreamEvent | SubagentStartedStreamEvent | ActionsRequestedStreamEvent | InputRequestedStreamEvent | ActionResultStreamEvent | ReasoningCompletedStreamEvent | StepCompletedStreamEvent | StepFailedStreamEvent | StepStartedStreamEvent | TurnCancelledStreamEvent | TurnCompletedStreamEvent | TurnFailedStreamEvent | TurnStartedStreamEvent) & {
525
- readonly meta?: HandleMessageStreamEventMeta;
526
- };
537
+ export type UnstampedMessageStreamEvent = CompactionCompletedStreamEvent | CompactionRequestedStreamEvent | AuthorizationCompletedStreamEvent | AuthorizationRequiredStreamEvent | MessageAppendedStreamEvent | MessageCompletedStreamEvent | MessageReceivedStreamEvent | ReasoningAppendedStreamEvent | SessionCompletedStreamEvent | SessionFailedStreamEvent | SessionStartedStreamEvent | SessionWaitingStreamEvent | ResultCompletedStreamEvent | SubagentCalledStreamEvent | SubagentChildEventStreamEvent | SubagentCompletedStreamEvent | SubagentStartedStreamEvent | ActionsRequestedStreamEvent | InputRequestedStreamEvent | ActionResultStreamEvent | ReasoningCompletedStreamEvent | StepCompletedStreamEvent | StepFailedStreamEvent | StepStartedStreamEvent | TurnCancelledStreamEvent | TurnCompletedStreamEvent | TurnFailedStreamEvent | TurnStartedStreamEvent;
527
538
  /**
528
539
  * Stream events that represent an unrecovered turn/session failure.
529
540
  */
530
541
  export type TurnFailureStreamEvent = SessionFailedStreamEvent | StepFailedStreamEvent | TurnFailedStreamEvent;
531
542
  /**
532
- * One public session stream event after runtime metadata has been stamped.
543
+ * One event read from an eve session stream.
533
544
  *
534
- * Runtime/execution code owns this stamping boundary. Replays must preserve the
535
- * original `meta.at` value instead of recomputing it.
545
+ * eve stamps the durable identity and emission time before writing the event.
536
546
  */
537
- export type TimedHandleMessageStreamEvent = HandleMessageStreamEvent & {
538
- readonly meta: HandleMessageStreamEventMeta;
547
+ export type MessageStreamEvent = UnstampedMessageStreamEvent & {
548
+ readonly meta: MessageStreamEventMeta;
539
549
  };
550
+ /**
551
+ * @deprecated Use {@link MessageStreamEvent}.
552
+ */
553
+ export type HandleMessageStreamEvent = MessageStreamEvent;
540
554
  /**
541
555
  * Returns true when the current stream has reached a turn boundary or terminal
542
556
  * session outcome.
543
557
  */
544
- export declare function isCurrentTurnBoundaryEvent(event: HandleMessageStreamEvent): boolean;
558
+ export declare function isCurrentTurnBoundaryEvent(event: UnstampedMessageStreamEvent): boolean;
545
559
  /**
546
560
  * Narrows a stream event to the failure events that terminate or poison a turn.
561
+ *
562
+ * Generic so narrowing keeps the input's stamping: a
563
+ * {@link MessageStreamEvent} narrows to a stamped failure event.
547
564
  */
548
- export declare function isTurnFailureEvent(event: HandleMessageStreamEvent): event is TurnFailureStreamEvent;
565
+ export declare function isTurnFailureEvent<TEvent extends UnstampedMessageStreamEvent>(event: TEvent): event is TEvent & TurnFailureStreamEvent;
549
566
  /**
550
567
  * Creates the `session.started` event for one session.
551
568
  */
@@ -798,16 +815,15 @@ export declare function createSessionFailedEvent(input: {
798
815
  */
799
816
  export declare function createSessionCompletedEvent(): SessionCompletedStreamEvent;
800
817
  /**
801
- * Stamps one session event with durable timing metadata immediately before it
802
- * is written to the workflow-owned stream.
818
+ * Stamps one session event with its durable identity and emission time.
803
819
  *
804
- * Only runtime/execution code should call this. Keeping one stamping seam
805
- * ensures every persisted event shares the same clock contract and replay never
806
- * invents new timestamps.
820
+ * Runtime/execution code only, once per event, immediately before the write.
821
+ * One stamping seam is what makes the persisted stream and authored hooks
822
+ * observe the same `meta.id`.
807
823
  */
808
- export declare function timestampHandleMessageStreamEvent(event: HandleMessageStreamEvent, at?: string): TimedHandleMessageStreamEvent;
824
+ export declare function stampMessageStreamEvent(event: UnstampedMessageStreamEvent): MessageStreamEvent;
809
825
  /**
810
826
  * Encodes one message stream event as newline-delimited JSON.
811
827
  */
812
- export declare function encodeMessageStreamEvent(event: TimedHandleMessageStreamEvent): Uint8Array;
828
+ export declare function encodeMessageStreamEvent(event: MessageStreamEvent): Uint8Array;
813
829
  export {};
@@ -1,2 +1,2 @@
1
- import{toChannelLocalContinuationToken}from"#shared/continuation-token.js";import{deserializeUrlFilePart,hasInternalRefScheme,isSerializedUrlFilePart}from"#internal/attachments/url-refs.js";import{decodeSandboxRef,isSandboxRefUrl}from"#internal/attachments/sandbox-refs.js";const EVE_SESSION_ID_HEADER=`x-eve-session-id`,EVE_STREAM_FORMAT_HEADER=`x-eve-stream-format`,EVE_STREAM_TAIL_INDEX_HEADER=`x-eve-stream-tail-index`,EVE_STREAM_VERSION_HEADER=`x-eve-stream-version`,EVE_MESSAGE_STREAM_CONTENT_TYPE=`application/x-ndjson; charset=utf-8`,EVE_MESSAGE_STREAM_FORMAT=`ndjson`,EVE_MESSAGE_STREAM_VERSION=`19`,textEncoder=new TextEncoder;function isCurrentTurnBoundaryEvent(e){return e.type===`session.completed`||e.type===`session.failed`||e.type===`session.waiting`}function isTurnFailureEvent(e){return e.type===`session.failed`||e.type===`step.failed`||e.type===`turn.failed`}function createSessionStartedEvent(e){let t={};return e?.invocation!==void 0&&(t.invocation=e.invocation),e?.runtime!==void 0&&(t.runtime=e.runtime),{data:t,type:`session.started`}}function createTurnStartedEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.started`}}function createMessageReceivedEvent(e){return{data:{message:summarizeUserContent(e.message),parts:projectUserContentParts(e.message),sequence:e.sequence,turnId:e.turnId},type:`message.received`}}function summarizeUserContent(e){if(typeof e==`string`)return e;let t=[];for(let n of e)if(n.type===`text`)t.push(n.text);else if(n.type===`file`){let e=n.filename??n.mediaType;t.push(`[file: ${e} (${n.mediaType})]`)}else n.type===`image`&&t.push(`[image: ${n.mediaType??`image`}]`);return t.join(`
2
- `)}function projectUserContentParts(e){if(typeof e==`string`)return[{text:e,type:`text`}];let t=[];for(let n of e)n.type===`text`?t.push({text:n.text,type:`text`}):n.type===`file`?t.push(projectFileLikePart(n.data,n.mediaType,n.filename)):n.type===`image`&&t.push(projectFileLikePart(n.image,n.mediaType??`application/octet-stream`,void 0));return t}function projectFileLikePart(e,t,n){if(isSandboxRefUrl(e)){let t=decodeSandboxRef(e);return createProjectedFilePart({filename:basenameOf(n??t.path),mediaType:t.mediaType,size:t.size})}let r=projectTaggedFileData(e,t,n);if(r!==void 0)return r;let i=byteLengthOf(e);return createProjectedFilePart(i===void 0?{filename:n,mediaType:t,...clientUrlFragment(e)}:{filename:n,mediaType:t,size:i})}function projectTaggedFileData(e,t,n){if(isTaggedFileData(e))switch(e.type){case`data`:{let r=byteLengthOf(e.data);return createProjectedFilePart(r===void 0?{filename:n,mediaType:t}:{filename:n,mediaType:t,size:r})}case`reference`:case`text`:return createProjectedFilePart({filename:n,mediaType:t});case`url`:return createProjectedFilePart({filename:n,mediaType:t,...clientUrlFragment(e.url)})}}function createProjectedFilePart(e){let t={mediaType:e.mediaType,type:`file`};return e.filename!==void 0&&(t.filename=e.filename),e.size!==void 0&&(t.size=e.size),e.url!==void 0&&(t.url=e.url),t}function isTaggedFileData(e){if(typeof e!=`object`||!e)return!1;let t=e.type;return t===`data`||t===`reference`||t===`text`||t===`url`}function byteLengthOf(e){if(e instanceof Uint8Array||e instanceof ArrayBuffer)return e.byteLength}function clientUrlFragment(e){if(isSerializedUrlFilePart(e))try{let n=deserializeUrlFilePart(e);return isClientResolvableUrl(n)?{url:n.href}:{}}catch{return{}}if(e instanceof URL)return isClientResolvableUrl(e)?{url:e.href}:{};if(typeof e!=`string`||hasInternalRefScheme(e))return{};if(e.startsWith(`data:`))return{url:e};try{let t=new URL(e);return isClientResolvableUrl(t)?{url:t.href}:{}}catch{return{}}}function isClientResolvableUrl(e){return e.protocol===`http:`||e.protocol===`https:`||e.protocol===`data:`}function basenameOf(e){let t=e.replaceAll(`\\`,`/`),n=t.slice(t.lastIndexOf(`/`)+1);return n.length>0?n:e}function createActionsRequestedEvent(e){return{data:{actions:e.actions,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`actions.requested`}}function createAuthorizationRequiredEvent(e){let t={description:e.description,name:e.name,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.authorization!==void 0&&(t.authorization=e.authorization),e.webhookUrl!==void 0&&(t.webhookUrl=e.webhookUrl),{data:t,type:`authorization.required`}}function createAuthorizationCompletedEvent(e){let t={name:e.name,outcome:e.outcome,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.authorization!==void 0&&(t.authorization=e.authorization),e.reason!==void 0&&(t.reason=e.reason),{data:t,type:`authorization.completed`}}function createInputRequestedEvent(e){return{data:{requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`input.requested`}}function createActionResultEvent(e){let t=e.rejected===!0?{error:buildActionResultError(e.result),status:`rejected`}:normalizeActionResultOutcome(e.result);return{data:{error:t.error,result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,status:t.status,turnId:e.turnId},type:`action.result`}}function createSubagentCalledEvent(e){return{data:{callId:e.callId,childSessionId:e.childSessionId,sessionId:e.sessionId,sequence:e.sequence,name:e.name,remote:e.remote,toolName:e.toolName,turnId:e.turnId,workflowId:e.workflowId},type:`subagent.called`}}function createMessageAppendedEvent(e){return{data:{messageDelta:e.messageDelta,messageSoFar:e.messageSoFar,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.appended`}}function createReasoningAppendedEvent(e){return{data:{reasoningDelta:e.reasoningDelta,reasoningSoFar:e.reasoningSoFar,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.appended`}}function createMessageCompletedEvent(e){return{data:{finishReason:e.finishReason??`stop`,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.completed`}}function createReasoningCompletedEvent(e){return{data:{reasoning:e.reasoning,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.completed`}}function createResultCompletedEvent(e){return{data:{result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`result.completed`}}function createStepStartedEvent(e){return{data:{sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.started`}}function createStepCompletedEvent(e){let t={finishReason:e.finishReason,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.usage!==void 0&&(t.usage=e.usage),e.providerMetadata!==void 0&&(t.providerMetadata=e.providerMetadata),{data:t,type:`step.completed`}}function createStepFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.failed`}}function createTurnCompletedEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.completed`}}function createTurnFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,turnId:e.turnId},type:`turn.failed`}}function createTurnCancelledEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.cancelled`}}function createCompactionRequestedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId,usageInputTokens:e.usageInputTokens??null},type:`compaction.requested`}}function createCompactionCompletedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId},type:`compaction.completed`}}function createSessionWaitingEvent(t){return{data:{continuationToken:toChannelLocalContinuationToken(t),wait:`next-user-message`},type:`session.waiting`}}function createSessionFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sessionId:e.sessionId},type:`session.failed`}}function createSessionCompletedEvent(){return{type:`session.completed`}}function timestampHandleMessageStreamEvent(e,t=new Date().toISOString()){return{...e,meta:{at:t}}}function encodeMessageStreamEvent(e){return textEncoder.encode(`${JSON.stringify(e)}\n`)}function normalizeActionResultOutcome(e){if(e.isError===!0)return{error:buildActionResultError(e),status:`failed`};let t=readActionResultOutputError(e.output);return t===void 0?{status:`completed`}:{error:t,status:`failed`}}function buildActionResultError(e){let t=readActionResultOutputError(e.output);return t===void 0?{code:`ACTION_RESULT_FAILED`,message:formatActionResultOutput(e.output)}:t}function readActionResultOutputError(e){let t=parseActionResultOutputRecord(e);if(t===void 0)return;let n=typeof t.code==`string`&&t.code.length>0?t.code:void 0,r=typeof t.message==`string`&&t.message.length>0?t.message:void 0;if(!(n===void 0||r===void 0))return{code:n,message:r}}function parseActionResultOutputRecord(e){if(typeof e==`object`&&e)return e;if(typeof e!=`string`)return;let t=e.trim();if(t.length!==0)try{let e=JSON.parse(t);if(typeof e==`object`&&e)return e}catch{return}}function formatActionResultOutput(e){if(typeof e==`string`)return e;let t=JSON.stringify(e);return typeof t==`string`&&t.length>0?t:`Action failed.`}export{EVE_MESSAGE_STREAM_CONTENT_TYPE,EVE_MESSAGE_STREAM_FORMAT,EVE_MESSAGE_STREAM_VERSION,EVE_SESSION_ID_HEADER,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_TAIL_INDEX_HEADER,EVE_STREAM_VERSION_HEADER,createActionResultEvent,createActionsRequestedEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createInputRequestedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepCompletedEvent,createStepFailedEvent,createStepStartedEvent,createSubagentCalledEvent,createTurnCancelledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,encodeMessageStreamEvent,isCurrentTurnBoundaryEvent,isTurnFailureEvent,timestampHandleMessageStreamEvent};
1
+ import{toChannelLocalContinuationToken}from"#shared/continuation-token.js";import{deserializeUrlFilePart,hasInternalRefScheme,isSerializedUrlFilePart}from"#internal/attachments/url-refs.js";import{decodeSandboxRef,isSandboxRefUrl}from"#internal/attachments/sandbox-refs.js";import{createEventId}from"#protocol/event-id.js";const EVE_SESSION_ID_HEADER=`x-eve-session-id`,EVE_STREAM_FORMAT_HEADER=`x-eve-stream-format`,EVE_STREAM_TAIL_INDEX_HEADER=`x-eve-stream-tail-index`,EVE_STREAM_VERSION_HEADER=`x-eve-stream-version`,EVE_MESSAGE_STREAM_CONTENT_TYPE=`application/x-ndjson; charset=utf-8`,EVE_MESSAGE_STREAM_FORMAT=`ndjson`,EVE_MESSAGE_STREAM_VERSION=`20`,textEncoder=new TextEncoder;function isCurrentTurnBoundaryEvent(e){return e.type===`session.completed`||e.type===`session.failed`||e.type===`session.waiting`}function isTurnFailureEvent(e){return e.type===`session.failed`||e.type===`step.failed`||e.type===`turn.failed`}function createSessionStartedEvent(e){let t={};return e?.invocation!==void 0&&(t.invocation=e.invocation),e?.runtime!==void 0&&(t.runtime=e.runtime),{data:t,type:`session.started`}}function createTurnStartedEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.started`}}function createMessageReceivedEvent(e){return{data:{message:summarizeUserContent(e.message),parts:projectUserContentParts(e.message),sequence:e.sequence,turnId:e.turnId},type:`message.received`}}function summarizeUserContent(e){if(typeof e==`string`)return e;let t=[];for(let n of e)if(n.type===`text`)t.push(n.text);else if(n.type===`file`){let e=n.filename??n.mediaType;t.push(`[file: ${e} (${n.mediaType})]`)}else n.type===`image`&&t.push(`[image: ${n.mediaType??`image`}]`);return t.join(`
2
+ `)}function projectUserContentParts(e){if(typeof e==`string`)return[{text:e,type:`text`}];let t=[];for(let n of e)n.type===`text`?t.push({text:n.text,type:`text`}):n.type===`file`?t.push(projectFileLikePart(n.data,n.mediaType,n.filename)):n.type===`image`&&t.push(projectFileLikePart(n.image,n.mediaType??`application/octet-stream`,void 0));return t}function projectFileLikePart(e,t,n){if(isSandboxRefUrl(e)){let t=decodeSandboxRef(e);return createProjectedFilePart({filename:basenameOf(n??t.path),mediaType:t.mediaType,size:t.size})}let r=projectTaggedFileData(e,t,n);if(r!==void 0)return r;let i=byteLengthOf(e);return createProjectedFilePart(i===void 0?{filename:n,mediaType:t,...clientUrlFragment(e)}:{filename:n,mediaType:t,size:i})}function projectTaggedFileData(e,t,n){if(isTaggedFileData(e))switch(e.type){case`data`:{let r=byteLengthOf(e.data);return createProjectedFilePart(r===void 0?{filename:n,mediaType:t}:{filename:n,mediaType:t,size:r})}case`reference`:case`text`:return createProjectedFilePart({filename:n,mediaType:t});case`url`:return createProjectedFilePart({filename:n,mediaType:t,...clientUrlFragment(e.url)})}}function createProjectedFilePart(e){let t={mediaType:e.mediaType,type:`file`};return e.filename!==void 0&&(t.filename=e.filename),e.size!==void 0&&(t.size=e.size),e.url!==void 0&&(t.url=e.url),t}function isTaggedFileData(e){if(typeof e!=`object`||!e)return!1;let t=e.type;return t===`data`||t===`reference`||t===`text`||t===`url`}function byteLengthOf(e){if(e instanceof Uint8Array||e instanceof ArrayBuffer)return e.byteLength}function clientUrlFragment(e){if(isSerializedUrlFilePart(e))try{let n=deserializeUrlFilePart(e);return isClientResolvableUrl(n)?{url:n.href}:{}}catch{return{}}if(e instanceof URL)return isClientResolvableUrl(e)?{url:e.href}:{};if(typeof e!=`string`||hasInternalRefScheme(e))return{};if(e.startsWith(`data:`))return{url:e};try{let t=new URL(e);return isClientResolvableUrl(t)?{url:t.href}:{}}catch{return{}}}function isClientResolvableUrl(e){return e.protocol===`http:`||e.protocol===`https:`||e.protocol===`data:`}function basenameOf(e){let t=e.replaceAll(`\\`,`/`),n=t.slice(t.lastIndexOf(`/`)+1);return n.length>0?n:e}function createActionsRequestedEvent(e){return{data:{actions:e.actions,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`actions.requested`}}function createAuthorizationRequiredEvent(e){let t={description:e.description,name:e.name,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.authorization!==void 0&&(t.authorization=e.authorization),e.webhookUrl!==void 0&&(t.webhookUrl=e.webhookUrl),{data:t,type:`authorization.required`}}function createAuthorizationCompletedEvent(e){let t={name:e.name,outcome:e.outcome,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.authorization!==void 0&&(t.authorization=e.authorization),e.reason!==void 0&&(t.reason=e.reason),{data:t,type:`authorization.completed`}}function createInputRequestedEvent(e){return{data:{requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`input.requested`}}function createActionResultEvent(e){let t=e.rejected===!0?{error:buildActionResultError(e.result),status:`rejected`}:normalizeActionResultOutcome(e.result);return{data:{error:t.error,result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,status:t.status,turnId:e.turnId},type:`action.result`}}function createSubagentCalledEvent(e){return{data:{callId:e.callId,childSessionId:e.childSessionId,sessionId:e.sessionId,sequence:e.sequence,name:e.name,remote:e.remote,toolName:e.toolName,turnId:e.turnId,workflowId:e.workflowId},type:`subagent.called`}}function createMessageAppendedEvent(e){return{data:{messageDelta:e.messageDelta,messageSoFar:e.messageSoFar,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.appended`}}function createReasoningAppendedEvent(e){return{data:{reasoningDelta:e.reasoningDelta,reasoningSoFar:e.reasoningSoFar,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.appended`}}function createMessageCompletedEvent(e){return{data:{finishReason:e.finishReason??`stop`,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.completed`}}function createReasoningCompletedEvent(e){return{data:{reasoning:e.reasoning,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.completed`}}function createResultCompletedEvent(e){return{data:{result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`result.completed`}}function createStepStartedEvent(e){return{data:{sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.started`}}function createStepCompletedEvent(e){let t={finishReason:e.finishReason,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.usage!==void 0&&(t.usage=e.usage),e.providerMetadata!==void 0&&(t.providerMetadata=e.providerMetadata),{data:t,type:`step.completed`}}function createStepFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.failed`}}function createTurnCompletedEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.completed`}}function createTurnFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,turnId:e.turnId},type:`turn.failed`}}function createTurnCancelledEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.cancelled`}}function createCompactionRequestedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId,usageInputTokens:e.usageInputTokens??null},type:`compaction.requested`}}function createCompactionCompletedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId},type:`compaction.completed`}}function createSessionWaitingEvent(t){return{data:{continuationToken:toChannelLocalContinuationToken(t),wait:`next-user-message`},type:`session.waiting`}}function createSessionFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sessionId:e.sessionId},type:`session.failed`}}function createSessionCompletedEvent(){return{type:`session.completed`}}function stampMessageStreamEvent(e){return{...e,meta:{at:new Date().toISOString(),id:createEventId()}}}function encodeMessageStreamEvent(e){return textEncoder.encode(`${JSON.stringify(e)}\n`)}function normalizeActionResultOutcome(e){if(e.isError===!0)return{error:buildActionResultError(e),status:`failed`};let t=readActionResultOutputError(e.output);return t===void 0?{status:`completed`}:{error:t,status:`failed`}}function buildActionResultError(e){let t=readActionResultOutputError(e.output);return t===void 0?{code:`ACTION_RESULT_FAILED`,message:formatActionResultOutput(e.output)}:t}function readActionResultOutputError(e){let t=parseActionResultOutputRecord(e);if(t===void 0)return;let n=typeof t.code==`string`&&t.code.length>0?t.code:void 0,r=typeof t.message==`string`&&t.message.length>0?t.message:void 0;if(!(n===void 0||r===void 0))return{code:n,message:r}}function parseActionResultOutputRecord(e){if(typeof e==`object`&&e)return e;if(typeof e!=`string`)return;let t=e.trim();if(t.length!==0)try{let e=JSON.parse(t);if(typeof e==`object`&&e)return e}catch{return}}function formatActionResultOutput(e){if(typeof e==`string`)return e;let t=JSON.stringify(e);return typeof t==`string`&&t.length>0?t:`Action failed.`}export{EVE_MESSAGE_STREAM_CONTENT_TYPE,EVE_MESSAGE_STREAM_FORMAT,EVE_MESSAGE_STREAM_VERSION,EVE_SESSION_ID_HEADER,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_TAIL_INDEX_HEADER,EVE_STREAM_VERSION_HEADER,createActionResultEvent,createActionsRequestedEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createInputRequestedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepCompletedEvent,createStepFailedEvent,createStepStartedEvent,createSubagentCalledEvent,createTurnCancelledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,encodeMessageStreamEvent,isCurrentTurnBoundaryEvent,isTurnFailureEvent,stampMessageStreamEvent};