eve 0.76.3 → 0.78.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 (209) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/src/channel/adapter.d.ts +13 -4
  3. package/dist/src/channel/channel-address.js +1 -1
  4. package/dist/src/channel/send-input.d.ts +6 -2
  5. package/dist/src/channel/send-input.js +1 -1
  6. package/dist/src/channel/session.js +1 -1
  7. package/dist/src/chunks/{use-eve-agent-BtKWTEpm.js → use-eve-agent-B8brxCk-.js} +46 -28
  8. package/dist/src/chunks/{use-eve-agent-jI6EsYAu.js → use-eve-agent-BSYe_Re7.js} +46 -28
  9. package/dist/src/cli/commands/vercel-non-interactive.d.ts +5 -3
  10. package/dist/src/cli/commands/vercel-non-interactive.js +1 -1
  11. package/dist/src/client/eve-agent-store.d.ts +2 -2
  12. package/dist/src/client/message-response.d.ts +2 -0
  13. package/dist/src/client/message-response.js +1 -1
  14. package/dist/src/client/session.js +1 -1
  15. package/dist/src/compiled/.vendor-stamp.json +9 -9
  16. package/dist/src/compiled/@ai-sdk/anthropic/index.d.ts +6 -1
  17. package/dist/src/compiled/@ai-sdk/anthropic/index.js +1 -1
  18. package/dist/src/compiled/@ai-sdk/google/index.d.ts +16 -3
  19. package/dist/src/compiled/@ai-sdk/google/index.js +6 -6
  20. package/dist/src/compiled/@ai-sdk/mcp/index.d.ts +681 -348
  21. package/dist/src/compiled/@ai-sdk/mcp/index.js +1 -1
  22. package/dist/src/compiled/@ai-sdk/openai/index.d.ts +56 -42
  23. package/dist/src/compiled/@ai-sdk/openai/index.js +5 -3
  24. package/dist/src/compiled/@ai-sdk/otel/index.js +3 -3
  25. package/dist/src/compiled/@ai-sdk/provider/index.d.ts +49 -15
  26. package/dist/src/compiled/@ai-sdk/provider/index.js +1 -1
  27. package/dist/src/compiled/@ai-sdk/provider-utils/index.d.ts +4 -1
  28. package/dist/src/compiled/_chunks/workflow/{dist-DXLdlucM.js → dist-C8k3N3BQ.js} +2 -4
  29. package/dist/src/compiled/_chunks/workflow/dist-DsNhwdzf.js +1 -0
  30. package/dist/src/compiled/_chunks/workflow/experimental-decision-DlvnsBD-.js +3 -0
  31. package/dist/src/compiler/extension-compatibility.d.ts +18 -18
  32. package/dist/src/compiler/extension-compatibility.js +1 -1
  33. package/dist/src/compiler/normalize-agent-config.js +1 -1
  34. package/dist/src/context/dynamic-model-lifecycle.js +1 -1
  35. package/dist/src/context/keys.d.ts +16 -0
  36. package/dist/src/context/keys.js +1 -1
  37. package/dist/src/evals/judge.js +1 -1
  38. package/dist/src/eve-channel/index.js +1 -1
  39. package/dist/src/eve-channel/types.d.ts +14 -1
  40. package/dist/src/execution/agent-sessions/steps.d.ts +2 -0
  41. package/dist/src/execution/agent-sessions/steps.js +1 -1
  42. package/dist/src/execution/cancelled-model-call-batch.js +1 -1
  43. package/dist/src/execution/catalog/connection-entry.js +1 -1
  44. package/dist/src/execution/catalog/search.js +1 -1
  45. package/dist/src/execution/catalog/step-catalog.d.ts +12 -3
  46. package/dist/src/execution/catalog/step-catalog.js +1 -1
  47. package/dist/src/execution/coordination-dispatch-shared.d.ts +1 -2
  48. package/dist/src/execution/coordination-dispatch-shared.js +1 -1
  49. package/dist/src/execution/coordination-dispatch-step.js +1 -1
  50. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  51. package/dist/src/execution/publish-session-events.js +1 -1
  52. package/dist/src/execution/sandbox/bindings/docker-container.js +1 -1
  53. package/dist/src/execution/sandbox/bindings/docker.js +1 -1
  54. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
  55. package/dist/src/execution/sandbox/bindings/just-bash.d.ts +1 -1
  56. package/dist/src/execution/sandbox/bindings/just-bash.js +1 -1
  57. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -1
  58. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -1
  59. package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
  60. package/dist/src/execution/sandbox/read-file.d.ts +5 -5
  61. package/dist/src/execution/sandbox/read-file.js +2 -2
  62. package/dist/src/execution/sandbox/session.d.ts +6 -0
  63. package/dist/src/execution/sandbox/session.js +2 -2
  64. package/dist/src/execution/session/active-turn.d.ts +9 -1
  65. package/dist/src/execution/session/active-turn.js +1 -1
  66. package/dist/src/execution/session/checkpoint-migrations.js +1 -1
  67. package/dist/src/execution/session/end-sandbox-step.js +1 -1
  68. package/dist/src/execution/session/handoff.d.ts +1 -1
  69. package/dist/src/execution/session/handoff.js +1 -1
  70. package/dist/src/execution/session/next-input.js +1 -1
  71. package/dist/src/execution/session/turn-step.js +1 -1
  72. package/dist/src/execution/session/turn.d.ts +11 -4
  73. package/dist/src/execution/session/turn.js +1 -1
  74. package/dist/src/execution/session-inbox/inbox.d.ts +3 -0
  75. package/dist/src/execution/session-inbox/inbox.js +1 -1
  76. package/dist/src/execution/session-workflow-tool-run.d.ts +14 -12
  77. package/dist/src/execution/session-workflow-tool-run.js +1 -1
  78. package/dist/src/execution/tasks/start.d.ts +14 -1
  79. package/dist/src/execution/tasks/start.js +1 -1
  80. package/dist/src/execution/tasks/steps.d.ts +7 -4
  81. package/dist/src/execution/tasks/steps.js +1 -1
  82. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  83. package/dist/src/execution/tools/workflow/apply-run-messages-step.d.ts +20 -0
  84. package/dist/src/execution/tools/workflow/apply-run-messages-step.js +1 -0
  85. package/dist/src/execution/tools/workflow/ask.d.ts +0 -1
  86. package/dist/src/execution/tools/workflow/ask.js +1 -1
  87. package/dist/src/execution/tools/workflow/interrupt.d.ts +5 -2
  88. package/dist/src/execution/tools/workflow/interrupt.js +1 -1
  89. package/dist/src/execution/tools/workflow/messages.d.ts +14 -0
  90. package/dist/src/execution/tools/workflow/messages.js +1 -1
  91. package/dist/src/execution/tools/workflow/owner.d.ts +18 -6
  92. package/dist/src/execution/tools/workflow/owner.js +1 -1
  93. package/dist/src/execution/tools/workflow/start.d.ts +10 -0
  94. package/dist/src/execution/tools/workflow/start.js +1 -1
  95. package/dist/src/execution/tools/workflow/step.js +1 -1
  96. package/dist/src/execution/tools/workflow/workflow-owner-blocking.d.ts +12 -0
  97. package/dist/src/execution/tools/workflow/workflow-owner-blocking.js +1 -1
  98. package/dist/src/execution/tools/workflow/workflow.js +1 -1
  99. package/dist/src/execution/web-fetch/request.js +1 -1
  100. package/dist/src/execution/workflow-runtime.d.ts +18 -3
  101. package/dist/src/execution/workflow-runtime.js +1 -1
  102. package/dist/src/harness/attachment-staging.d.ts +13 -12
  103. package/dist/src/harness/attachment-staging.js +1 -1
  104. package/dist/src/harness/compaction/step.js +1 -1
  105. package/dist/src/harness/emission.js +1 -1
  106. package/dist/src/harness/hitl/approvals.d.ts +4 -7
  107. package/dist/src/harness/hitl/approvals.js +1 -1
  108. package/dist/src/harness/hitl/approved-calls.d.ts +11 -0
  109. package/dist/src/harness/hitl/approved-calls.js +1 -1
  110. package/dist/src/harness/hitl/candidates.d.ts +0 -4
  111. package/dist/src/harness/hitl/candidates.js +1 -1
  112. package/dist/src/harness/hitl/delivery.d.ts +0 -1
  113. package/dist/src/harness/hitl/delivery.js +1 -1
  114. package/dist/src/harness/hitl/index.d.ts +2 -2
  115. package/dist/src/harness/hitl/index.js +1 -1
  116. package/dist/src/harness/hitl/intake.d.ts +2 -2
  117. package/dist/src/harness/hitl/intake.js +1 -1
  118. package/dist/src/harness/model-call/call.js +1 -1
  119. package/dist/src/harness/model-call/errors.d.ts +10 -0
  120. package/dist/src/harness/model-call/errors.js +1 -1
  121. package/dist/src/harness/model-call/run.js +1 -1
  122. package/dist/src/harness/session-machine/state.d.ts +0 -2
  123. package/dist/src/harness/session-machine/transitions.js +1 -1
  124. package/dist/src/harness/session-machine/view.d.ts +0 -3
  125. package/dist/src/harness/session-machine/view.js +1 -1
  126. package/dist/src/harness/step/after-model.js +1 -1
  127. package/dist/src/harness/token-estimate.js +1 -1
  128. package/dist/src/harness/tool-loop.js +1 -1
  129. package/dist/src/harness/tools.js +1 -1
  130. package/dist/src/internal/application/package.js +1 -1
  131. package/dist/src/internal/application/stamped-package-version.js +1 -1
  132. package/dist/src/internal/attachments/data.d.ts +29 -10
  133. package/dist/src/internal/attachments/data.js +1 -1
  134. package/dist/src/internal/attachments/errors.d.ts +2 -2
  135. package/dist/src/internal/attachments/media-metadata.d.ts +15 -0
  136. package/dist/src/internal/attachments/media-metadata.js +1 -1
  137. package/dist/src/internal/attachments/public-link.d.ts +5 -0
  138. package/dist/src/internal/attachments/public-link.js +1 -0
  139. package/dist/src/internal/attachments/sandbox-refs.d.ts +7 -6
  140. package/dist/src/internal/attachments/sandbox-refs.js +1 -1
  141. package/dist/src/internal/attachments/url-refs.js +1 -1
  142. package/dist/src/protocol/message.d.ts +7 -0
  143. package/dist/src/protocol/message.js +2 -2
  144. package/dist/src/public/channels/attachment-error.d.ts +14 -0
  145. package/dist/src/public/channels/attachment-error.js +1 -0
  146. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +1 -1
  147. package/dist/src/public/channels/discord/defaults.js +1 -1
  148. package/dist/src/public/channels/github/defaults.js +1 -1
  149. package/dist/src/public/channels/index.d.ts +2 -0
  150. package/dist/src/public/channels/index.js +1 -1
  151. package/dist/src/public/channels/linear/defaults.js +1 -1
  152. package/dist/src/public/channels/slack/api.d.ts +10 -0
  153. package/dist/src/public/channels/slack/api.js +1 -1
  154. package/dist/src/public/channels/slack/approval-cards.js +1 -1
  155. package/dist/src/public/channels/slack/attachments.d.ts +29 -19
  156. package/dist/src/public/channels/slack/attachments.js +1 -1
  157. package/dist/src/public/channels/slack/defaults.js +1 -1
  158. package/dist/src/public/channels/slack/inbound.d.ts +6 -0
  159. package/dist/src/public/channels/slack/inbound.js +1 -1
  160. package/dist/src/public/channels/slack/interaction-cards.d.ts +6 -0
  161. package/dist/src/public/channels/slack/interaction-cards.js +1 -1
  162. package/dist/src/public/channels/slack/interactions.js +1 -1
  163. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  164. package/dist/src/public/channels/teams/defaults.js +1 -1
  165. package/dist/src/public/channels/teams/teamsChannel.js +1 -1
  166. package/dist/src/public/channels/telegram/defaults.js +1 -1
  167. package/dist/src/public/channels/telegram/telegramChannel.js +1 -1
  168. package/dist/src/public/channels/twilio/defaults.js +1 -1
  169. package/dist/src/public/definitions/channel.js +1 -1
  170. package/dist/src/runtime/channels/registry.js +1 -1
  171. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  172. package/dist/src/setup/scaffold/create/project.js +2 -2
  173. package/dist/src/setup/scaffold/update/web-options.js +1 -1
  174. package/dist/src/shared/agent-definition.d.ts +2 -1
  175. package/dist/src/shared/channel-definition.d.ts +16 -4
  176. package/dist/src/svelte/index.d.ts +0 -1
  177. package/dist/src/svelte/index.js +1 -1
  178. package/dist/src/svelte/use-eve-agent.js +1 -1
  179. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  180. package/dist/src/tools/provided/read-file.d.ts +3 -2
  181. package/dist/src/tools/provided/read-file.js +2 -2
  182. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  183. package/dist/src/vue/index.d.ts +0 -1
  184. package/dist/src/vue/index.js +1 -1
  185. package/dist/src/vue/use-eve-agent.js +1 -1
  186. package/docs/agent-config.md +12 -4
  187. package/docs/channels/chat-sdk.mdx +1 -1
  188. package/docs/channels/custom.mdx +30 -3
  189. package/docs/channels/eve.mdx +34 -0
  190. package/docs/channels/slack.mdx +5 -1
  191. package/docs/concepts/built-in-tools.md +10 -10
  192. package/docs/concepts/sessions-runs-and-streaming.md +2 -2
  193. package/docs/evals/overview.mdx +1 -1
  194. package/docs/guides/client/streaming.mdx +1 -1
  195. package/docs/guides/dynamic-capabilities.md +6 -2
  196. package/docs/memory/custom-provider.md +3 -1
  197. package/docs/sandbox/index.mdx +10 -4
  198. package/docs/tools/human-in-the-loop.md +1 -1
  199. package/docs/tools/overview.mdx +1 -1
  200. package/package.json +11 -11
  201. package/dist/src/compiled/_chunks/workflow/experimental-decision-BrfWf6-n.js +0 -3
  202. package/dist/src/context/caller-scope.d.ts +0 -7
  203. package/dist/src/context/caller-scope.js +0 -1
  204. package/dist/src/execution/tools/workflow/emit-workflow-tool-run-report-step.d.ts +0 -13
  205. package/dist/src/execution/tools/workflow/emit-workflow-tool-run-report-step.js +0 -1
  206. package/dist/src/harness/hitl/approved-call-callers.d.ts +0 -14
  207. package/dist/src/harness/hitl/approved-call-callers.js +0 -1
  208. package/dist/src/internal/attachments/refs.d.ts +0 -55
  209. package/dist/src/internal/attachments/refs.js +0 -1
@@ -1 +1 @@
1
- import{isObject}from"#shared/guards.js";import{toError,walkCauseChain}from"#shared/errors.js";import{isTurnCancellation}from"#harness/turn-cancellation.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";const UNSUPPORTED_PROVIDER_TOOL_MATCHERS=[e=>/tool type ['"]([\w.-]+)['"] is not supported/i.exec(e)?.[1],e=>/Input tag ['"]([\w.-]+)['"] found using ['"]type['"] does not match/i.exec(e)?.[1],e=>/Invalid value: ['"]([\w.-]+)['"]/i.exec(e)?.[1],e=>/web search is not supported for this request/i.test(e)?`web_search`:void 0];function extractUpstreamRejectionMessage(e){let t=readModelCallErrorSignals(e);if(isTransientHttpStatus(t.statusCode??t.upstreamStatusCode))return null;let n=t.apiErrorMessage;if(n!==void 0)return{name:upstreamRejectionName(t),message:n};if(t.statusCode===400&&isGatewayErrorSignal(t))return{name:`AI Gateway model request rejected`,message:`AI Gateway rejected the model request before the agent produced a response.`};let r=formatApiCallErrorFallback(t);return r===void 0?null:{name:upstreamRejectionName(t),message:r}}function upstreamRejectionName(e){return isGatewayErrorSignal(e)?`AI Gateway model request rejected`:`Model provider API error`}function isTransientHttpStatus(e){return e===408||e===429||e!==void 0&&e>=500}function extractUnsupportedProviderToolTypes(e){let t=new Set;for(let n of walkCauseChain(e)){collectUnsupportedToolTypesFromValue(readObjectField(n,`data`),t);let e=readStringField(n,`responseBody`);if(e!==void 0)try{collectUnsupportedToolTypesFromValue(JSON.parse(e),t)}catch{collectUnsupportedToolTypes(e,t)}}return[...t]}function collectUnsupportedToolTypes(e,t){for(let n of UNSUPPORTED_PROVIDER_TOOL_MATCHERS){let r=n(e);r!==void 0&&t.add(r)}}function collectUnsupportedToolTypesFromValue(e,t){if(e!=null){if(typeof e==`string`){collectUnsupportedToolTypes(e,t);return}if(Array.isArray(e)){for(let n of e)collectUnsupportedToolTypesFromValue(n,t);return}if(isObject(e))for(let n of Object.values(e))collectUnsupportedToolTypesFromValue(n,t)}}function extractModelCallErrorDetails(e){let t=readModelCallErrorSignals(e),n={};return e instanceof ContentFilteredModelResponseError&&(n.finishReason=`content-filter`,appendJsonField(n,`generationId`,e.generationId)),appendJsonField(n,`apiErrorMessage`,t.apiErrorMessage),appendJsonField(n,`gatewayName`,t.gatewayName),appendJsonField(n,`gatewayType`,t.gatewayType),appendJsonField(n,`statusCode`,t.statusCode),appendJsonField(n,`generationId`,t.generationId),appendJsonField(n,`upstreamStatusCode`,t.upstreamStatusCode),appendJsonField(n,`upstreamType`,t.upstreamType),appendJsonField(n,`upstreamMessage`,t.upstreamMessage),appendJsonField(n,`responseBodySnippet`,t.responseBodySnippet),n}function readErrorName(e){if(e instanceof Error||isObject(e)&&typeof e.name==`string`)return e.name}function readErrorMessage(e){return e instanceof Error||isObject(e)&&typeof e.message==`string`?e.message:``}var EmptyModelResponseError=class extends Error{constructor(e){super(`The model did not return a response. Please try again.`,e),this.name=`EmptyModelResponseError`}},ContentFilteredModelResponseError=class extends Error{generationId;constructor(e){super(`The model provider filtered this response.`),this.name=`ContentFilteredModelResponseError`,this.generationId=e}};function normalizeModelStreamError(e){let t=toError(e);return t===e||Object.defineProperty(t,"cause",{configurable:!0,value:e}),t}function isNoOutputGeneratedError(e){for(let t of walkCauseChain(e))if(readErrorName(t)===`AI_NoOutputGeneratedError`)return!0;return!1}function classifyModelCallError(e){if(isTurnCancellation(e))return`terminal`;if(e instanceof EmptyModelResponseError)return`recoverable`;if(hasRetryableFlag(e))return`retry`;let t=summarizeKnownError(e);if(t?.tags.includes(`recoverable`)===!0)return`recoverable`;if(t?.tags.includes(`config`)===!0)return`terminal`;if(t?.tags.includes(`transient`)===!0)return`retry`;let n=readModelCallErrorSignals(e);if(n.statusCode===402)return`recoverable`;if(isRetryableGatewayType(n.upstreamType))return`retry`;if(isTerminalGatewayType(n.upstreamType)||n.gatewayType===`invalid_request_error`||n.gatewayName===`GatewayInvalidRequestError`)return`terminal`;let r=n.statusCode;if(r!==void 0){if(r===408||r===409||r===429||r>=500)return`retry`;if(isAmbiguousGatewayInternalBadRequest(n))return`recoverable`;if(r>=400&&r<500)return`terminal`}return`recoverable`}function hasRetryableFlag(e){for(let t of walkCauseChain(e))if(isObject(t)&&t.isRetryable===!0)return!0;return!1}function readModelCallErrorSignals(e){let t=findGatewayError(e),n=findUpstreamApiCallError(e),r=readStringField(n,`responseBody`),i=readGatewayErrorBody(n);return{apiCallError:n!==void 0,apiErrorMessage:i?.apiErrorMessage??firstInformativeApiMessage([readErrorMessage(n)]),gatewayName:readErrorName(t),gatewayType:readStringField(t,`type`),generationId:readStringField(t,`generationId`)??i?.generationId,responseBodySnippet:r===void 0?void 0:truncateSnippet(r,1e3),statusCode:readStatusCode(t)??readStatusCode(n)??findStatusCode(e),upstreamMessage:i?.message,upstreamStatusCode:readStatusCode(n),upstreamType:i?.type}}function findGatewayError(e){for(let t of walkCauseChain(e)){let e=readErrorName(t),n=readStringField(t,`type`);if(e?.startsWith(`Gateway`)||n?.endsWith(`_error`)||n===`rate_limit_exceeded`)return t}}function findUpstreamApiCallError(e){for(let t of walkCauseChain(e))if(readErrorName(t)===`AI_APICallError`||readStringField(t,`responseBody`)!==void 0||readObjectField(t,`data`)!==void 0||readObjectField(t,`requestBodyValues`)!==void 0)return t}function readGatewayErrorBody(e){let t=readGatewayErrorBodyFromValue(readObjectField(e,`data`));if(t!==void 0)return t;let n=readStringField(e,`responseBody`);if(n!==void 0)try{return readGatewayErrorBodyFromValue(JSON.parse(n))}catch{return}}function readGatewayErrorBodyFromValue(e){if(!isObject(e))return;let t=readObjectField(e,`error`),n=readStringField(e,`generationId`),r=readStringField(t,`message`)??readStringField(e,`message`),i=readStringField(t,`type`)??readStringField(e,`type`),a=firstInformativeApiMessage([r,...readNestedApiErrorMessages(t),...readNestedApiErrorMessages(e)]);return r===void 0&&i===void 0&&n===void 0&&a===void 0?void 0:{apiErrorMessage:a,generationId:n,message:r,type:i}}function readStatusCode(e){if(isObject(e))return typeof e.statusCode==`number`?e.statusCode:void 0}function findStatusCode(e){for(let t of walkCauseChain(e)){let e=readStatusCode(t);if(e!==void 0)return e}}function readStringField(e,t){if(!isObject(e))return;let n=e[t];return typeof n==`string`&&n.length>0?n:void 0}function readObjectField(e,t){if(!isObject(e))return;let n=e[t];return isObject(n)?n:void 0}function readNestedApiErrorMessages(e){if(!isObject(e))return[];let t=[];return appendString(t,readStringField(e,`message`)),appendString(t,readStringField(e,`error_description`)),appendNestedApiFieldMessages(t,e.error),appendNestedApiFieldMessages(t,e.code),t}function appendNestedApiFieldMessages(e,t){if(typeof t==`string`){appendString(e,t);return}isObject(t)&&(appendString(e,readStringField(t,`message`)),appendString(e,readStringField(t,`error`)),appendString(e,readStringField(t,`description`)),appendString(e,readStringField(t,`error_description`)),appendNestedApiFieldMessages(e,t.error))}function appendString(e,t){t!==void 0&&e.push(t)}function firstInformativeApiMessage(e){for(let t of e)if(t!==void 0&&isInformativeApiMessage(t))return truncateSnippet(t,800)}function isInformativeApiMessage(e){let t=e.trim();return t.length>0&&t!==`[object Object]`&&t!==`AI_APICallError`&&t!==`Bad Request`&&t!==`Internal Server Error`}function formatApiCallErrorFallback(e){if(!e.apiCallError)return;let t=e.statusCode??e.upstreamStatusCode,n=e.responseBodySnippet,r=e.upstreamType!==void 0&&isInformativeApiMessage(e.upstreamType)?e.upstreamType:void 0;if(t===void 0&&n===void 0&&r===void 0)return;let i=[t===void 0?void 0:`HTTP ${t}`,r].filter(e=>e!==void 0).join(`, `),a=i.length===0?`Model provider API request failed`:`Model provider API request failed (${i})`;return n===void 0?`${a}.`:`${a}: ${n}`}function isRetryableGatewayType(e){return e===`overloaded_error`||e===`rate_limit_exceeded`||e===`timeout_error`}function isTerminalGatewayType(e){return e===`authentication_error`||e===`invalid_request_error`||e===`model_not_found`}function isGatewayErrorSignal(e){return e.gatewayName!==void 0||e.gatewayType!==void 0}function isAmbiguousGatewayInternalBadRequest(e){return e.statusCode===400&&(e.gatewayName===`GatewayInternalServerError`||e.gatewayType===`internal_server_error`)&&(e.upstreamType===void 0||e.upstreamType===`internal_server_error`)}function appendJsonField(e,t,n){if(typeof n==`string`&&n.length>0){e[t]=n;return}typeof n==`number`&&Number.isFinite(n)&&(e[t]=n)}function truncateSnippet(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}export{ContentFilteredModelResponseError,EmptyModelResponseError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,extractUpstreamRejectionMessage,isNoOutputGeneratedError,normalizeModelStreamError};
1
+ import{isObject}from"#shared/guards.js";import{toError,walkCauseChain}from"#shared/errors.js";import{isTurnCancellation}from"#harness/turn-cancellation.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";const UNSUPPORTED_PROVIDER_TOOL_MATCHERS=[e=>/tool type ['"]([\w.-]+)['"] is not supported/i.exec(e)?.[1],e=>/Input tag ['"]([\w.-]+)['"] found using ['"]type['"] does not match/i.exec(e)?.[1],e=>/Invalid value: ['"]([\w.-]+)['"]/i.exec(e)?.[1],e=>/web search is not supported for this request/i.test(e)?`web_search`:void 0];function extractUpstreamRejectionMessage(e){let t=readModelCallErrorSignals(e);if(isTransientHttpStatus(t.statusCode??t.upstreamStatusCode))return null;let n=t.apiErrorMessage;if(n!==void 0)return{name:upstreamRejectionName(t),message:n};if(t.statusCode===400&&isGatewayErrorSignal(t))return{name:`AI Gateway model request rejected`,message:`AI Gateway rejected the model request before the agent produced a response.`};let r=formatApiCallErrorFallback(t);return r===void 0?null:{name:upstreamRejectionName(t),message:r}}function upstreamRejectionName(e){return isGatewayErrorSignal(e)?`AI Gateway model request rejected`:`Model provider API error`}function isTransientHttpStatus(e){return e===408||e===429||e!==void 0&&e>=500}function extractUnsupportedProviderToolTypes(e){let t=new Set;for(let n of walkCauseChain(e)){collectUnsupportedToolTypesFromValue(readObjectField(n,`data`),t);let e=readStringField(n,`responseBody`);if(e!==void 0)try{collectUnsupportedToolTypesFromValue(JSON.parse(e),t)}catch{collectUnsupportedToolTypes(e,t)}}return[...t]}function collectUnsupportedToolTypes(e,t){for(let n of UNSUPPORTED_PROVIDER_TOOL_MATCHERS){let r=n(e);r!==void 0&&t.add(r)}}function collectUnsupportedToolTypesFromValue(e,t){if(e!=null){if(typeof e==`string`){collectUnsupportedToolTypes(e,t);return}if(Array.isArray(e)){for(let n of e)collectUnsupportedToolTypesFromValue(n,t);return}if(isObject(e))for(let n of Object.values(e))collectUnsupportedToolTypesFromValue(n,t)}}function extractModelCallErrorDetails(e){let t=readModelCallErrorSignals(e),n={};return e instanceof ContentFilteredModelResponseError&&(n.finishReason=`content-filter`,appendJsonField(n,`generationId`,e.generationId)),appendJsonField(n,`apiErrorMessage`,t.apiErrorMessage),appendJsonField(n,`gatewayName`,t.gatewayName),appendJsonField(n,`gatewayType`,t.gatewayType),appendJsonField(n,`statusCode`,t.statusCode),appendJsonField(n,`generationId`,t.generationId),appendJsonField(n,`upstreamStatusCode`,t.upstreamStatusCode),appendJsonField(n,`upstreamType`,t.upstreamType),appendJsonField(n,`upstreamMessage`,t.upstreamMessage),appendJsonField(n,`responseBodySnippet`,t.responseBodySnippet),n}function readErrorName(e){if(e instanceof Error||isObject(e)&&typeof e.name==`string`)return e.name}function readErrorMessage(e){return e instanceof Error||isObject(e)&&typeof e.message==`string`?e.message:``}var EmptyModelResponseError=class extends Error{constructor(e){super(`The model did not return a response. Please try again.`,e),this.name=`EmptyModelResponseError`}},ModelStreamStalledError=class extends Error{isRetryable=!0;constructor(e){super(`The model stopped responding. Please try again.`,e),this.name=`ModelStreamStalledError`}},ContentFilteredModelResponseError=class extends Error{generationId;constructor(e){super(`The model provider filtered this response.`),this.name=`ContentFilteredModelResponseError`,this.generationId=e}};function normalizeModelStreamError(e){let t=toError(e);return t===e||Object.defineProperty(t,"cause",{configurable:!0,value:e}),t}function isNoOutputGeneratedError(e){for(let t of walkCauseChain(e))if(readErrorName(t)===`AI_NoOutputGeneratedError`)return!0;return!1}function classifyModelCallError(e){if(isTurnCancellation(e))return`terminal`;if(e instanceof EmptyModelResponseError)return`recoverable`;if(hasRetryableFlag(e))return`retry`;let t=summarizeKnownError(e);if(t?.tags.includes(`recoverable`)===!0)return`recoverable`;if(t?.tags.includes(`config`)===!0)return`terminal`;if(t?.tags.includes(`transient`)===!0)return`retry`;let n=readModelCallErrorSignals(e);if(n.statusCode===402)return`recoverable`;if(isRetryableGatewayType(n.upstreamType))return`retry`;if(isTerminalGatewayType(n.upstreamType)||n.gatewayType===`invalid_request_error`||n.gatewayName===`GatewayInvalidRequestError`)return`terminal`;let r=n.statusCode;if(r!==void 0){if(r===408||r===409||r===429||r>=500)return`retry`;if(isAmbiguousGatewayInternalBadRequest(n))return`recoverable`;if(r>=400&&r<500)return`terminal`}return`recoverable`}function hasRetryableFlag(e){for(let t of walkCauseChain(e))if(isObject(t)&&t.isRetryable===!0)return!0;return!1}function readModelCallErrorSignals(e){let t=findGatewayError(e),n=findUpstreamApiCallError(e),r=readStringField(n,`responseBody`),i=readGatewayErrorBody(n);return{apiCallError:n!==void 0,apiErrorMessage:i?.apiErrorMessage??firstInformativeApiMessage([readErrorMessage(n)]),gatewayName:readErrorName(t),gatewayType:readStringField(t,`type`),generationId:readStringField(t,`generationId`)??i?.generationId,responseBodySnippet:r===void 0?void 0:truncateSnippet(r,1e3),statusCode:readStatusCode(t)??readStatusCode(n)??findStatusCode(e),upstreamMessage:i?.message,upstreamStatusCode:readStatusCode(n),upstreamType:i?.type}}function findGatewayError(e){for(let t of walkCauseChain(e)){let e=readErrorName(t),n=readStringField(t,`type`);if(e?.startsWith(`Gateway`)||n?.endsWith(`_error`)||n===`rate_limit_exceeded`)return t}}function findUpstreamApiCallError(e){for(let t of walkCauseChain(e))if(readErrorName(t)===`AI_APICallError`||readStringField(t,`responseBody`)!==void 0||readObjectField(t,`data`)!==void 0||readObjectField(t,`requestBodyValues`)!==void 0)return t}function readGatewayErrorBody(e){let t=readGatewayErrorBodyFromValue(readObjectField(e,`data`));if(t!==void 0)return t;let n=readStringField(e,`responseBody`);if(n!==void 0)try{return readGatewayErrorBodyFromValue(JSON.parse(n))}catch{return}}function readGatewayErrorBodyFromValue(e){if(!isObject(e))return;let t=readObjectField(e,`error`),n=readStringField(e,`generationId`),r=readStringField(t,`message`)??readStringField(e,`message`),i=readStringField(t,`type`)??readStringField(e,`type`),a=firstInformativeApiMessage([r,...readNestedApiErrorMessages(t),...readNestedApiErrorMessages(e)]);return r===void 0&&i===void 0&&n===void 0&&a===void 0?void 0:{apiErrorMessage:a,generationId:n,message:r,type:i}}function readStatusCode(e){if(isObject(e))return typeof e.statusCode==`number`?e.statusCode:void 0}function findStatusCode(e){for(let t of walkCauseChain(e)){let e=readStatusCode(t);if(e!==void 0)return e}}function readStringField(e,t){if(!isObject(e))return;let n=e[t];return typeof n==`string`&&n.length>0?n:void 0}function readObjectField(e,t){if(!isObject(e))return;let n=e[t];return isObject(n)?n:void 0}function readNestedApiErrorMessages(e){if(!isObject(e))return[];let t=[];return appendString(t,readStringField(e,`message`)),appendString(t,readStringField(e,`error_description`)),appendNestedApiFieldMessages(t,e.error),appendNestedApiFieldMessages(t,e.code),t}function appendNestedApiFieldMessages(e,t){if(typeof t==`string`){appendString(e,t);return}isObject(t)&&(appendString(e,readStringField(t,`message`)),appendString(e,readStringField(t,`error`)),appendString(e,readStringField(t,`description`)),appendString(e,readStringField(t,`error_description`)),appendNestedApiFieldMessages(e,t.error))}function appendString(e,t){t!==void 0&&e.push(t)}function firstInformativeApiMessage(e){for(let t of e)if(t!==void 0&&isInformativeApiMessage(t))return truncateSnippet(t,800)}function isInformativeApiMessage(e){let t=e.trim();return t.length>0&&t!==`[object Object]`&&t!==`AI_APICallError`&&t!==`Bad Request`&&t!==`Internal Server Error`}function formatApiCallErrorFallback(e){if(!e.apiCallError)return;let t=e.statusCode??e.upstreamStatusCode,n=e.responseBodySnippet,r=e.upstreamType!==void 0&&isInformativeApiMessage(e.upstreamType)?e.upstreamType:void 0;if(t===void 0&&n===void 0&&r===void 0)return;let i=[t===void 0?void 0:`HTTP ${t}`,r].filter(e=>e!==void 0).join(`, `),a=i.length===0?`Model provider API request failed`:`Model provider API request failed (${i})`;return n===void 0?`${a}.`:`${a}: ${n}`}function isRetryableGatewayType(e){return e===`overloaded_error`||e===`rate_limit_exceeded`||e===`timeout_error`}function isTerminalGatewayType(e){return e===`authentication_error`||e===`invalid_request_error`||e===`model_not_found`}function isGatewayErrorSignal(e){return e.gatewayName!==void 0||e.gatewayType!==void 0}function isAmbiguousGatewayInternalBadRequest(e){return e.statusCode===400&&(e.gatewayName===`GatewayInternalServerError`||e.gatewayType===`internal_server_error`)&&(e.upstreamType===void 0||e.upstreamType===`internal_server_error`)}function appendJsonField(e,t,n){if(typeof n==`string`&&n.length>0){e[t]=n;return}typeof n==`number`&&Number.isFinite(n)&&(e[t]=n)}function truncateSnippet(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}export{ContentFilteredModelResponseError,EmptyModelResponseError,ModelStreamStalledError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,extractUpstreamRejectionMessage,isNoOutputGeneratedError,normalizeModelStreamError};
@@ -1 +1 @@
1
- import{resolveEffectiveRuntimeModel}from"./model.js";import{recoverModelCall}from"./recovery.js";import{endsTurnTools,frameworkToolNames}from"./tools.js";import{recordModelUsage}from"./usage.js";import{ModelCaller}from"./call.js";import{reportModelCallFailure}from"./failure.js";import{HistoryStateKey}from"#context/keys.js";import{validateHarnessModelMessages}from"#harness/messages.js";import{activeTurnId}from"#harness/session-machine/view.js";import{dispatchApprovedWorkflows,enforceBudget,hasApprovedWork,humanInputContext,runApprovedLocalCalls}from"#harness/hitl/index.js";import{startStep}from"#harness/session-machine/transitions.js";import{stepStartedForResolvers}from"#harness/session-machine/resolver-events.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{requireSessionModelReference}from"#harness/types.js";import{buildStepCatalog}from"#execution/catalog/step-catalog.js";import{failBoundaryEvent,failModelSelection}from"#harness/step/context.js";import{buildPrompt,previewPrompt,projectPrompt,withClientContext}from"#harness/step/prompt.js";async function runModelStep(e,t){let{generation:n}=t,r=hasApprovedWork(e),i=r?previewPrompt(e,t.turn):await buildPrompt(e,t.turn),a=await selectModel(e,i);if(!(`model`in a))return a.failed;let start=t=>e.apply(startStep(e.view(),{modelId:requireSessionModelReference(e.session).id}),t),o=projectPrompt(e,i);try{await start(o)}catch(t){return failBoundaryEvent(e,t)}if(r&&await dispatchApprovedWorkflows(e,t.approved))return{next:null,session:e.session};let s=await enforceBudget(e,i.messages);if(s!==void 0)return s;if(r){let n=await runApprovedLocalCalls(e,t.approved,t.setAttemptScope);if(n!==void 0)return n;i=await buildPrompt(e,t.turn),o=projectPrompt(e,i)}let c=!e.hasDelegatedCaller&&e.session.outputSchema===void 0,l=buildStepCatalog({agentTools:e.config.tools,ctx:e.ctx,endsTurn:c,session:e.session});e.frameworkToolNames=frameworkToolNames(l);let{approvedTools:u,pendingApprovalsNote:d}=humanInputContext(e,l),f=new ModelCaller(e,i,{approvedTools:u,catalog:l,generation:n,hidesHeldText:t.hidesHeldText,model:a.model,pendingApprovalsNote:d,projectedMessages:o,setAttemptScope:t.setAttemptScope,startStep:start,turnMessages:t.turn.messages}),p;try{p=await f.call({suppressStepStartedEmission:!0})}catch(t){if(f.throwIfCompactionFailed(),throwIfTurnAborted(e.config.abortSignal),n.interrupted)return f.steered();let r=await recoverModelCall({call:e=>f.call(e),error:t,sessionId:e.session.sessionId,turnId:e.position().turnId});if(f.throwIfCompactionFailed(),throwIfTurnAborted(e.config.abortSignal),n.interrupted)return f.steered();if(!(`result`in r))return reportModelCallFailure(e,r.error);p=r.result}await recordModelUsage(e,{model:a.model,result:p}),f.clearInterruptedUsage();let m;try{n.check(),m=await t.onResponse({catalog:l,durableModelPromptMessageCount:i.clientContext===void 0||i.clientContext.messages.length===0?f.modelMessages.length:void 0,endsTurnTools:endsTurnTools(l,c),promptMessages:f.request.history,requestEnvelopeTokens:f.requestEnvelopeTokens,result:p})}catch(t){if(throwIfTurnAborted(e.config.abortSignal),n.interrupted)return f.steered();throw t}return e.ctx?.set(HistoryStateKey,f.request.historyState),m}async function selectModel(e,t){let{config:n,ctx:r}=e;try{if(r!==void 0&&n.dispatchDynamicModelEvent!==void 0){let i=e.position();await n.dispatchDynamicModelEvent({ctx:r,event:stepStartedForResolvers({modelId:e.session.agent.modelReference?.id??`dynamic`,sequence:i.sequence,stepIndex:i.stepIndex,turnId:activeTurnId(i)}),messages:validateHarnessModelMessages(e.projectHistory(withClientContext(t)))})}let i=await resolveEffectiveRuntimeModel({config:n,ctx:r,session:e.session});return e.session=i.session,{model:i.model}}catch(t){return{failed:await failModelSelection(e,t)}}}export{runModelStep};
1
+ import{resolveEffectiveRuntimeModel}from"./model.js";import{recoverModelCall}from"./recovery.js";import{endsTurnTools,frameworkToolNames}from"./tools.js";import{recordModelUsage}from"./usage.js";import{ModelCaller}from"./call.js";import{reportModelCallFailure}from"./failure.js";import{HistoryStateKey}from"#context/keys.js";import{validateHarnessModelMessages}from"#harness/messages.js";import{activeTurnId}from"#harness/session-machine/view.js";import{dispatchApprovedWorkflows,enforceBudget,hasApprovedWork,humanInputContext,runApprovedLocalCalls}from"#harness/hitl/index.js";import{startStep}from"#harness/session-machine/transitions.js";import{stepStartedForResolvers}from"#harness/session-machine/resolver-events.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{requireSessionModelReference}from"#harness/types.js";import{buildStepCatalog,recordOfferedCatalogTools}from"#execution/catalog/step-catalog.js";import{buildPrompt,previewPrompt,projectPrompt,withClientContext}from"#harness/step/prompt.js";import{failBoundaryEvent,failModelSelection}from"#harness/step/context.js";async function runModelStep(e,t){let{generation:n}=t,r=hasApprovedWork(e),i=r?previewPrompt(e,t.turn):await buildPrompt(e,t.turn),a=await selectModel(e,i);if(!(`model`in a))return a.failed;let start=t=>e.apply(startStep(e.view(),{modelId:requireSessionModelReference(e.session).id}),t),o=projectPrompt(e,i);try{await start(o)}catch(t){return failBoundaryEvent(e,t)}if(r&&await dispatchApprovedWorkflows(e,t.approved))return{next:null,session:e.session};let s=await enforceBudget(e,i.messages);if(s!==void 0)return s;if(r){let n=await runApprovedLocalCalls(e,t.approved,t.setAttemptScope);if(n!==void 0)return n;i=await buildPrompt(e,t.turn),o=projectPrompt(e,i)}let c=!e.hasDelegatedCaller&&e.session.outputSchema===void 0,l=buildStepCatalog({agentTools:e.config.tools,ctx:e.ctx,endsTurn:c,session:e.session});recordOfferedCatalogTools(e.ctx,l),e.frameworkToolNames=frameworkToolNames(l);let{approvedTools:u,pendingApprovalsNote:d}=humanInputContext(e,l),f=new ModelCaller(e,i,{approvedTools:u,catalog:l,generation:n,hidesHeldText:t.hidesHeldText,model:a.model,pendingApprovalsNote:d,projectedMessages:o,setAttemptScope:t.setAttemptScope,startStep:start,turnMessages:t.turn.messages}),p;try{p=await f.call({suppressStepStartedEmission:!0})}catch(t){if(f.throwIfCompactionFailed(),throwIfTurnAborted(e.config.abortSignal),n.interrupted)return f.steered();let r=await recoverModelCall({call:e=>f.call(e),error:t,sessionId:e.session.sessionId,turnId:e.position().turnId});if(f.throwIfCompactionFailed(),throwIfTurnAborted(e.config.abortSignal),n.interrupted)return f.steered();if(!(`result`in r))return reportModelCallFailure(e,r.error);p=r.result}await recordModelUsage(e,{model:a.model,result:p}),f.clearInterruptedUsage();let m;try{n.check(),m=await t.onResponse({catalog:l,durableModelPromptMessageCount:i.clientContext===void 0||i.clientContext.messages.length===0?f.modelMessages.length:void 0,endsTurnTools:endsTurnTools(l,c),promptMessages:f.request.history,requestEnvelopeTokens:f.requestEnvelopeTokens,result:p})}catch(t){if(throwIfTurnAborted(e.config.abortSignal),n.interrupted)return f.steered();throw t}return e.ctx?.set(HistoryStateKey,f.request.historyState),m}async function selectModel(e,t){let{config:n,ctx:r}=e;try{if(r!==void 0&&n.dispatchDynamicModelEvent!==void 0){let i=e.position();await n.dispatchDynamicModelEvent({ctx:r,event:stepStartedForResolvers({modelId:e.session.agent.modelReference?.id??`dynamic`,sequence:i.sequence,stepIndex:i.stepIndex,turnId:activeTurnId(i)}),messages:validateHarnessModelMessages(e.projectHistory(withClientContext(t)))})}let i=await resolveEffectiveRuntimeModel({config:n,ctx:r,session:e.session});return e.session=i.session,{model:i.model}}catch(t){return{failed:await failModelSelection(e,t)}}}export{runModelStep};
@@ -27,8 +27,6 @@ export interface SuspendedStep {
27
27
  readonly approved?: readonly InputRequest[];
28
28
  /** Workflow and agent calls the runtime runs for the step. */
29
29
  readonly tasks: readonly RuntimeWorkflowTaskRequest[];
30
- /** Who approved each task an approval started, by call id: the task runs as them. */
31
- readonly approvers?: Readonly<Record<string, SessionAuthContext>>;
32
30
  readonly responseAuthRequiredRequestIds?: readonly string[];
33
31
  /** The caller whose turn parked the step; `null` when unauthenticated. */
34
32
  readonly requester?: SessionAuthContext | null;
@@ -1 +1 @@
1
- import{activeTurnId,answeredCallIds,nextStepIndex,runningTasks,turnPosition}from"./view.js";import{inputWithdrawn,signInWithdrawn}from"./events.js";import{openInputs,openSignIns,turnCoordinates}from"#protocol/session-projection.js";import{createActionResultEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createContextClearedEvent,createInputRequestedEvent,createInputResolvedEvent,createMessageReceivedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepFailedEvent,createStepStartedEvent,createTaskSettledEvent,createTaskStartedEvent,createTurnCancelledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,createTurnWaitingEvent}from"#protocol/message.js";import{authorizationEventFields}from"#harness/authorization-event-fields.js";const unchanged=(e,t)=>({events:t,turn:e.turn});function at(e){let t=turnPosition(e);return{sequence:t.sequence,stepIndex:t.stepIndex,turnId:activeTurnId(t)}}function receive(e,t){let n=turnPosition(e.projection),r=activeTurnId(n),i=[];return n.sessionStarted||i.push(createSessionStartedEvent({predecessor:t.predecessor,runtime:t.runtime,trace:t.trace})),n.turnId===``&&i.push(createTurnStartedEvent({sequence:n.sequence,trace:t.trace,turnId:r})),t.message!==void 0&&i.push(createMessageReceivedEvent({message:t.message,sequence:n.sequence,turnId:r})),unchanged(e,i)}function startStep(e,t){let{sequence:n,turnId:r}=at(e.projection);return unchanged(e,[createStepStartedEvent({modelId:t.modelId,sequence:n,stepIndex:nextStepIndex(e.projection),turnId:r})])}function hold(e,t){let{sequence:n,turnId:r}=turnPosition(e.projection);return r===``?unchanged(e,[]):unchanged(e,[createTurnWaitingEvent({on:t.on,sequence:n,turnId:r,usage:e.usage})])}function finishTurn(e,t={}){let{sequence:n,stepIndex:r,turnId:i}=at(e.projection),a=[];return t.result!==void 0&&a.push(createResultCompletedEvent({result:t.result,sequence:n,stepIndex:r,turnId:i})),e.projection.activeTurnId!==void 0&&a.push(createTurnCompletedEvent({sequence:n,turnId:i})),a.push(createSessionWaitingEvent(e.usage)),unchanged(e,a)}function fail(e,t){let{sequence:n,stepIndex:r,turnId:i}=at(e.projection),a=e.turn.suspended.filter(e=>(e.approved?.length??0)>0);return{commit:a.flatMap(cancelledTranscript),events:failedEvents(e,t,{sequence:n,stepIndex:r,turnId:i}),turn:{...e.turn,suspended:e.turn.suspended.filter(e=>!a.includes(e))}}}function failedEvents(e,t,n){let{sequence:r,stepIndex:i,turnId:a}=n,{code:o,details:s,message:c}=t;return[createStepFailedEvent({code:o,details:s,message:c,sequence:r,stepIndex:i,turnId:a}),createTurnFailedEvent({code:o,details:s,message:c,sequence:r,turnId:a}),t.terminal===void 0?createSessionWaitingEvent(e.usage):createSessionFailedEvent({code:o,details:s,message:c,sessionId:t.terminal.sessionId,usage:e.usage})]}function idle(e){return unchanged(e,[createSessionWaitingEvent(e.usage)])}function sessionCompleted(e){return createSessionCompletedEvent(e)}function sessionFailed(e){return createSessionFailedEvent(e)}function settle(e,t){let n=[],r=[...e.turn.suspended];for(let{part:e,result:i}of t.results){let t=r.findIndex(t=>stepCallIds(t).has(e.toolCallId)),a=r[t];a!==void 0&&(r[t]=withoutApproved({...a,messages:withResult(a.messages,e)},new Set([e.toolCallId])),i!==void 0&&n.push(createActionResultEvent({result:i,...a.event})))}for(let t of r)t.tasks.length!==0&&t.requests.length!==0&&(runningTasks(t).length>0||t.requests.some(t=>t.requestId in e.projection.inputs)||n.push(createInputRequestedEvent({requests:t.requests,...t.event})));let i=r.filter(isComplete);return{commit:i.flatMap(e=>e.messages),events:n,turn:{...e.turn,suspended:r.filter(e=>!i.includes(e))}}}const RETRIED_CALL_RESULT={code:`MODEL_CALL_ATTEMPT_RETRIED`,message:`The model call attempt was retried before this tool could run.`};function discardAttempt(e,t){let n=at(e.projection);return unchanged(e,t.calls.map(({callId:e,toolName:t})=>createActionResultEvent({...n,result:{callId:e,isError:!0,kind:`tool-result`,output:{...RETRIED_CALL_RESULT},toolName:t}})))}function suspendStep(e,t){return{events:[],turn:suspend(e.turn,{...t,requests:[]})}}function withoutApproved(e,t){if(e.approved===void 0)return e;let n=e.approved.filter(e=>!t.has(e.action.callId));if(n.length===e.approved.length)return e;let{approved:r,...i}=e;return n.length===0?i:{...i,approved:n}}function approvedCalls(e){return e.suspended.flatMap(e=>e.approved??[])}function suspend(e,t){return{...e,suspended:[...e.suspended,t]}}function stepCallIds(e){let t=new Set;for(let n of e.messages)if(n.role===`assistant`&&typeof n.content!=`string`)for(let e of n.content)e.type===`tool-call`&&e.providerExecuted!==!0&&t.add(e.toolCallId);return t}function isComplete(e){if(e.requests.length>0)return!1;let t=answeredCallIds(e.messages);return[...stepCallIds(e)].every(e=>t.has(e))}function withResult(e,t){let n=[...e],r=findCall(n,t.toolCallId);if(r===void 0)return n.push({content:[t],role:`tool`}),n;let i={...t,toolName:r.call.toolName},a=n[r.index+1];return a?.role===`tool`?n[r.index+1]={...a,content:[...a.content,i]}:n.splice(r.index+1,0,{content:[i],role:`tool`}),n}function findCall(e,t){for(let[n,r]of e.entries()){if(r.role!==`assistant`||typeof r.content==`string`)continue;let e=r.content.find(e=>e.type===`tool-call`&&e.toolCallId===t);if(e!==void 0)return{call:e,index:n}}}function startTask(e,t){return unchanged(e,[createTaskStartedEvent(t)])}function settleTask(e,t){let{outcome:n,task:r}=t;return unchanged(e,t.calls.map(e=>{let t={callId:e.callId,kind:r.kind,name:r.name,taskId:r.id,turnId:e.turnId};switch(n.status){case`completed`:return createTaskSettledEvent({...t,output:n.output,status:`completed`});case`failed`:return createTaskSettledEvent({...t,error:{message:n.error},status:`failed`});case`cancelled`:return createTaskSettledEvent(n.reason===void 0?{...t,status:`cancelled`}:{...t,cancel:{reason:n.reason},status:`cancelled`})}}))}function finishRun(e,t){let n=new Set(t.requestIds);return unchanged(e,openInputs(e.projection).filter(e=>n.has(e.request.requestId)||t.taskId!==void 0&&e.taskId===t.taskId).map(inputWithdrawn))}function relay(e,t){let{payload:n}=t,r=[...finishRun(e,{requestIds:t.replacedRequestIds}).events];if(n.kind===`subagent-input-request`){let{event:e}=n;r.push(createInputRequestedEvent({callId:n.callId,requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,taskId:e.taskId,turnId:e.turnId}))}else{let{event:t}=n;if(r.push(t),t.type!==`authorization.required`)return unchanged(e,r)}return r.push(...hold(e,{on:`input`}).events),unchanged(e,r)}function receiveRelayedAnswer(e){return createMessageReceivedEvent(e)}function routeAnswer(e,t){let n=t.children.filter(e=>e.resolutions.length>0).map(e=>createInputResolvedEvent({resolutions:e.resolutions,...e.event}));return unchanged(e,n)}function runSignIn(e,t,n){let r={...authorizationEventFields(t),sequence:e.sequence,stepIndex:e.stepIndex,taskId:e.taskId,turnId:e.turnId};return n===void 0?createAuthorizationRequiredEvent({...r,description:`Sign in to ${t.name} to continue.`,webhookUrl:t.hookUrl}):createAuthorizationCompletedEvent({...r,outcome:n})}function completeSignIn(e,t){let n=at(e.projection);return unchanged(e,t.completions.map(t=>{let r=t.attemptId===void 0?void 0:e.projection.authorizations[t.attemptId];return createAuthorizationCompletedEvent({...authorizationEventFields(t),outcome:`authorized`,sequence:r?.sequence??n.sequence,stepIndex:r?.stepIndex??n.stepIndex,turnId:r?.turnId??n.turnId})}))}function ownOpenRequestIds(e){return new Set(openInputs(e.projection).filter(t=>t.callId===void 0&&t.taskId===void 0&&!e.relayedRequestIds.has(t.request.requestId)).map(e=>e.request.requestId))}const CANCELLED_CALL_RESULT=`The turn was cancelled before this call finished.`;function cancel(e){let{projection:t}=e,n=t.activeTurnId,r=e.turn.suspended.filter(e=>n!==void 0&&e.event.turnId===n||e.tasks.some(t=>!answeredCallIds(e.messages).has(t.callId))||(e.approved?.length??0)>0),i=new Set(r.flatMap(e=>e.requests.map(e=>e.requestId))),a=[...openInputs(t).filter(t=>t.turnId===n||i.has(t.request.requestId)||e.relayedRequestIds.has(t.request.requestId)||t.request.kind===`session-limit`).map(inputWithdrawn),...openSignIns(t).filter(e=>e.turnId===n).map(e=>signInWithdrawn(e,`Cancelled.`))];if(n!==void 0){let{sequence:e}=turnCoordinates(t);a.push(createTurnCancelledEvent({sequence:e,turnId:n}))}return a.push(createSessionWaitingEvent(e.usage)),{commit:r.flatMap(cancelledTranscript),events:a,signIns:[],turn:{...e.turn,suspended:e.turn.suspended.filter(e=>!r.includes(e))}}}function cancelledTranscript(e){let t=answeredCallIds(e.messages),n=[...e.messages];for(let r of e.messages)if(r.role===`assistant`&&typeof r.content!=`string`)for(let e of r.content)e.type===`tool-call`&&e.providerExecuted!==!0&&(t.has(e.toolCallId)||(n=withResult(n,{output:{type:`text`,value:CANCELLED_CALL_RESULT},toolCallId:e.toolCallId,toolName:e.toolName,type:`tool-result`})));return n}function clear(e,t){let{projection:n}=e,{sequence:r,turnId:i}=turnCoordinates(n);return{clearsHistory:!0,events:[...openInputs(n).filter(t=>!e.relayedRequestIds.has(t.request.requestId)).map(inputWithdrawn),...openSignIns(n).map(e=>signInWithdrawn(e,`The context was cleared.`)),createContextClearedEvent({sequence:r,sessionId:t.sessionId,turnId:i}),createSessionWaitingEvent(e.usage)],turn:{grants:e.turn.grants,suspended:[]}}}export{CANCELLED_CALL_RESULT,approvedCalls,cancel,clear,completeSignIn,discardAttempt,fail,finishRun,finishTurn,hold,idle,ownOpenRequestIds,receive,receiveRelayedAnswer,relay,routeAnswer,runSignIn,sessionCompleted,sessionFailed,settle,settleTask,startStep,startTask,stepCallIds,suspend,suspendStep,withResult,withoutApproved};
1
+ import{activeTurnId,answeredCallIds,nextStepIndex,runningTasks,turnPosition}from"./view.js";import{inputWithdrawn,signInWithdrawn}from"./events.js";import{openInputs,openSignIns,turnCoordinates}from"#protocol/session-projection.js";import{createActionResultEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createContextClearedEvent,createInputRequestedEvent,createInputResolvedEvent,createMessageReceivedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepFailedEvent,createStepStartedEvent,createTaskSettledEvent,createTaskStartedEvent,createTurnCancelledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,createTurnWaitingEvent}from"#protocol/message.js";import{authorizationEventFields}from"#harness/authorization-event-fields.js";const unchanged=(e,t)=>({events:t,turn:e.turn});function at(e){let t=turnPosition(e);return{sequence:t.sequence,stepIndex:t.stepIndex,turnId:activeTurnId(t)}}function receive(e,t){let n=turnPosition(e.projection),r=activeTurnId(n),i=[];return n.sessionStarted||i.push(createSessionStartedEvent({predecessor:t.predecessor,runtime:t.runtime,trace:t.trace})),n.turnId===``&&i.push(createTurnStartedEvent({sequence:n.sequence,trace:t.trace,turnId:r})),t.message!==void 0&&i.push(createMessageReceivedEvent({message:t.message,sequence:n.sequence,turnId:r})),unchanged(e,i)}function startStep(e,t){let{sequence:n,turnId:r}=at(e.projection);return unchanged(e,[createStepStartedEvent({modelId:t.modelId,sequence:n,stepIndex:nextStepIndex(e.projection),turnId:r})])}function hold(e,t){let{sequence:n,turnId:r}=turnPosition(e.projection);return r===``?unchanged(e,[]):unchanged(e,[createTurnWaitingEvent({on:t.on,sequence:n,turnId:r,usage:e.usage})])}function finishTurn(e,t={}){let{sequence:n,stepIndex:r,turnId:i}=at(e.projection),a=[];return t.result!==void 0&&a.push(createResultCompletedEvent({result:t.result,sequence:n,stepIndex:r,turnId:i})),e.projection.activeTurnId!==void 0&&a.push(createTurnCompletedEvent({sequence:n,turnId:i})),a.push(createSessionWaitingEvent(e.usage)),unchanged(e,a)}function fail(e,t){let{sequence:n,stepIndex:r,turnId:i}=at(e.projection),a=e.turn.suspended.filter(e=>(e.approved?.length??0)>0);return{commit:a.flatMap(cancelledTranscript),events:failedEvents(e,t,{sequence:n,stepIndex:r,turnId:i}),turn:{...e.turn,suspended:e.turn.suspended.filter(e=>!a.includes(e))}}}function failedEvents(e,t,n){let{sequence:r,stepIndex:i,turnId:a}=n,{code:o,details:s,message:c}=t,l=t.terminal!==void 0;return[createStepFailedEvent({code:o,details:s,message:c,sequence:r,stepIndex:i,turnId:a}),createTurnFailedEvent({code:o,details:s,message:c,sequence:r,terminal:l,turnId:a}),t.terminal===void 0?createSessionWaitingEvent(e.usage):createSessionFailedEvent({code:o,details:s,message:c,sessionId:t.terminal.sessionId,usage:e.usage})]}function idle(e){return unchanged(e,[createSessionWaitingEvent(e.usage)])}function sessionCompleted(e){return createSessionCompletedEvent(e)}function sessionFailed(e){return createSessionFailedEvent(e)}function settle(e,t){let n=[],r=[...e.turn.suspended];for(let{part:e,result:i}of t.results){let t=r.findIndex(t=>stepCallIds(t).has(e.toolCallId)),a=r[t];a!==void 0&&(r[t]=withoutApproved({...a,messages:withResult(a.messages,e)},new Set([e.toolCallId])),i!==void 0&&n.push(createActionResultEvent({result:i,...a.event})))}for(let t of r)t.tasks.length!==0&&t.requests.length!==0&&(runningTasks(t).length>0||t.requests.some(t=>t.requestId in e.projection.inputs)||n.push(createInputRequestedEvent({requests:t.requests,...t.event})));let i=r.filter(isComplete);return{commit:i.flatMap(e=>e.messages),events:n,turn:{...e.turn,suspended:r.filter(e=>!i.includes(e))}}}const RETRIED_CALL_RESULT={code:`MODEL_CALL_ATTEMPT_RETRIED`,message:`The model call attempt was retried before this tool could run.`};function discardAttempt(e,t){let n=at(e.projection);return unchanged(e,t.calls.map(({callId:e,toolName:t})=>createActionResultEvent({...n,result:{callId:e,isError:!0,kind:`tool-result`,output:{...RETRIED_CALL_RESULT},toolName:t}})))}function suspendStep(e,t){return{events:[],turn:suspend(e.turn,{...t,requests:[]})}}function withoutApproved(e,t){if(e.approved===void 0)return e;let n=e.approved.filter(e=>!t.has(e.action.callId));if(n.length===e.approved.length)return e;let{approved:r,...i}=e;return n.length===0?i:{...i,approved:n}}function approvedCalls(e){return e.suspended.flatMap(e=>e.approved??[])}function suspend(e,t){return{...e,suspended:[...e.suspended,t]}}function stepCallIds(e){let t=new Set;for(let n of e.messages)if(n.role===`assistant`&&typeof n.content!=`string`)for(let e of n.content)e.type===`tool-call`&&e.providerExecuted!==!0&&t.add(e.toolCallId);return t}function isComplete(e){if(e.requests.length>0)return!1;let t=answeredCallIds(e.messages);return[...stepCallIds(e)].every(e=>t.has(e))}function withResult(e,t){let n=[...e],r=findCall(n,t.toolCallId);if(r===void 0)return n.push({content:[t],role:`tool`}),n;let i={...t,toolName:r.call.toolName},a=n[r.index+1];return a?.role===`tool`?n[r.index+1]={...a,content:[...a.content,i]}:n.splice(r.index+1,0,{content:[i],role:`tool`}),n}function findCall(e,t){for(let[n,r]of e.entries()){if(r.role!==`assistant`||typeof r.content==`string`)continue;let e=r.content.find(e=>e.type===`tool-call`&&e.toolCallId===t);if(e!==void 0)return{call:e,index:n}}}function startTask(e,t){return unchanged(e,[createTaskStartedEvent(t)])}function settleTask(e,t){let{outcome:n,task:r}=t;return unchanged(e,t.calls.map(e=>{let t={callId:e.callId,kind:r.kind,name:r.name,taskId:r.id,turnId:e.turnId};switch(n.status){case`completed`:return createTaskSettledEvent({...t,output:n.output,status:`completed`});case`failed`:return createTaskSettledEvent({...t,error:{message:n.error},status:`failed`});case`cancelled`:return createTaskSettledEvent(n.reason===void 0?{...t,status:`cancelled`}:{...t,cancel:{reason:n.reason},status:`cancelled`})}}))}function finishRun(e,t){let n=new Set(t.requestIds);return unchanged(e,openInputs(e.projection).filter(e=>n.has(e.request.requestId)||t.taskId!==void 0&&e.taskId===t.taskId).map(inputWithdrawn))}function relay(e,t){let{payload:n}=t,r=[...finishRun(e,{requestIds:t.replacedRequestIds}).events];if(n.kind===`subagent-input-request`){let{event:e}=n;r.push(createInputRequestedEvent({callId:n.callId,requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,taskId:e.taskId,turnId:e.turnId}))}else{let{event:t}=n;if(r.push(t),t.type!==`authorization.required`)return unchanged(e,r)}return r.push(...hold(e,{on:`input`}).events),unchanged(e,r)}function receiveRelayedAnswer(e){return createMessageReceivedEvent(e)}function routeAnswer(e,t){let n=t.children.filter(e=>e.resolutions.length>0).map(e=>createInputResolvedEvent({resolutions:e.resolutions,...e.event}));return unchanged(e,n)}function runSignIn(e,t,n){let r={...authorizationEventFields(t),sequence:e.sequence,stepIndex:e.stepIndex,taskId:e.taskId,turnId:e.turnId};return n===void 0?createAuthorizationRequiredEvent({...r,description:`Sign in to ${t.name} to continue.`,webhookUrl:t.hookUrl}):createAuthorizationCompletedEvent({...r,outcome:n})}function completeSignIn(e,t){let n=at(e.projection);return unchanged(e,t.completions.map(t=>{let r=t.attemptId===void 0?void 0:e.projection.authorizations[t.attemptId];return createAuthorizationCompletedEvent({...authorizationEventFields(t),outcome:`authorized`,sequence:r?.sequence??n.sequence,stepIndex:r?.stepIndex??n.stepIndex,turnId:r?.turnId??n.turnId})}))}function ownOpenRequestIds(e){return new Set(openInputs(e.projection).filter(t=>t.callId===void 0&&t.taskId===void 0&&!e.relayedRequestIds.has(t.request.requestId)).map(e=>e.request.requestId))}const CANCELLED_CALL_RESULT=`The turn was cancelled before this call finished.`;function cancel(e){let{projection:t}=e,n=t.activeTurnId,r=e.turn.suspended.filter(e=>n!==void 0&&e.event.turnId===n||e.tasks.some(t=>!answeredCallIds(e.messages).has(t.callId))||(e.approved?.length??0)>0),i=new Set(r.flatMap(e=>e.requests.map(e=>e.requestId))),a=[...openInputs(t).filter(t=>t.turnId===n||i.has(t.request.requestId)||e.relayedRequestIds.has(t.request.requestId)||t.request.kind===`session-limit`).map(inputWithdrawn),...openSignIns(t).filter(e=>e.turnId===n).map(e=>signInWithdrawn(e,`Cancelled.`))];if(n!==void 0){let{sequence:e}=turnCoordinates(t);a.push(createTurnCancelledEvent({sequence:e,turnId:n}))}return a.push(createSessionWaitingEvent(e.usage)),{commit:r.flatMap(cancelledTranscript),events:a,signIns:[],turn:{...e.turn,suspended:e.turn.suspended.filter(e=>!r.includes(e))}}}function cancelledTranscript(e){let t=answeredCallIds(e.messages),n=[...e.messages];for(let r of e.messages)if(r.role===`assistant`&&typeof r.content!=`string`)for(let e of r.content)e.type===`tool-call`&&e.providerExecuted!==!0&&(t.has(e.toolCallId)||(n=withResult(n,{output:{type:`text`,value:CANCELLED_CALL_RESULT},toolCallId:e.toolCallId,toolName:e.toolName,type:`tool-result`})));return n}function clear(e,t){let{projection:n}=e,{sequence:r,turnId:i}=turnCoordinates(n);return{clearsHistory:!0,events:[...openInputs(n).filter(t=>!e.relayedRequestIds.has(t.request.requestId)).map(inputWithdrawn),...openSignIns(n).map(e=>signInWithdrawn(e,`The context was cleared.`)),createContextClearedEvent({sequence:r,sessionId:t.sessionId,turnId:i}),createSessionWaitingEvent(e.usage)],turn:{grants:e.turn.grants,suspended:[]}}}export{CANCELLED_CALL_RESULT,approvedCalls,cancel,clear,completeSignIn,discardAttempt,fail,finishRun,finishTurn,hold,idle,ownOpenRequestIds,receive,receiveRelayedAnswer,relay,routeAnswer,runSignIn,sessionCompleted,sessionFailed,settle,settleTask,startStep,startTask,stepCallIds,suspend,suspendStep,withResult,withoutApproved};
@@ -1,4 +1,3 @@
1
- import type { SessionAuthContext } from "#channel/types.js";
2
1
  import type { TokenUsage } from "#shared/token-usage.js";
3
2
  import type { ModelMessage } from "ai";
4
3
  import type { AuthorizationChallenge } from "#harness/authorization.js";
@@ -51,8 +50,6 @@ export interface RuntimeWait {
51
50
  readonly callIds: readonly string[];
52
51
  readonly tasks: readonly RuntimeWorkflowTaskRequest[];
53
52
  readonly taskToolCalls: readonly TaskToolCall[];
54
- /** Who approved each task an approval started, by call id. */
55
- readonly approvers: Readonly<Record<string, SessionAuthContext>>;
56
53
  }
57
54
  /** The calls suspended steps wait on the runtime for, or `undefined` when none do. */
58
55
  export declare function runtimeWait(state: SessionStateMap | undefined): RuntimeWait | undefined;
@@ -1 +1 @@
1
- import{readTurnState}from"./state.js";import{initialSessionProjection,turnCoordinates}from"#protocol/session-projection.js";import{pendingTaskToolCalls}from"#execution/tasks/calls.js";const SESSION_PROJECTION_STATE_KEY=`eve.harness.sessionProjection`;function storedProjection(e){return e?.[`eve.harness.sessionProjection`]??initialSessionProjection()}function turnPosition(e){let{sequence:t,stepIndex:n}=turnCoordinates(e),r=e.activeTurnId===void 0?void 0:e.turns[e.activeTurnId],i={sessionStarted:e.started===!0,sequence:t,stepIndex:n,turnId:r?.turnId??``};return r?.outputStarted===!0&&(i.assistantOutputStarted=!0),i}function activeTurnId(e){return e.turnId===``?`turn_${e.sequence}`:e.turnId}function isBetweenTurns(e){return e.activeTurnId===void 0}function nextStepIndex(e){let t=e.activeTurnId===void 0?void 0:e.turns[e.activeTurnId];return t?.stepIndex===void 0?0:t.stepIndex+1}function queuedInput(e){return readTurnState(e).queued}function suspendedSteps(e){return readTurnState(e).suspended}function answeredCallIds(e){let t=new Set;for(let n of e)if((n.role===`tool`||n.role===`assistant`)&&typeof n.content!=`string`)for(let e of n.content)e.type===`tool-result`&&t.add(e.toolCallId);return t}function runningTasks(e){let t=answeredCallIds(e.messages);return e.tasks.filter(e=>!t.has(e.callId))}function runtimeWait(e){let t=suspendedSteps(e).flatMap(e=>{let t=runningTasks(e),n=pendingTaskToolCalls(e.messages);return t.length===0&&n.length===0?[]:[{step:e,tasks:t,taskToolCalls:n}]}),n=t[0];if(n===void 0)return;let r=t.flatMap(e=>e.tasks),i=t.flatMap(e=>e.taskToolCalls);return{approvers:Object.assign({},...t.map(e=>e.step.approvers)),callIds:[...r.map(e=>e.callId),...i.map(e=>e.callId)],event:n.step.event,taskToolCalls:i,tasks:r}}export{SESSION_PROJECTION_STATE_KEY,activeTurnId,answeredCallIds,isBetweenTurns,nextStepIndex,queuedInput,runningTasks,runtimeWait,storedProjection,suspendedSteps,turnPosition};
1
+ import{readTurnState}from"./state.js";import{initialSessionProjection,turnCoordinates}from"#protocol/session-projection.js";import{pendingTaskToolCalls}from"#execution/tasks/calls.js";const SESSION_PROJECTION_STATE_KEY=`eve.harness.sessionProjection`;function storedProjection(e){return e?.[`eve.harness.sessionProjection`]??initialSessionProjection()}function turnPosition(e){let{sequence:t,stepIndex:n}=turnCoordinates(e),r=e.activeTurnId===void 0?void 0:e.turns[e.activeTurnId],i={sessionStarted:e.started===!0,sequence:t,stepIndex:n,turnId:r?.turnId??``};return r?.outputStarted===!0&&(i.assistantOutputStarted=!0),i}function activeTurnId(e){return e.turnId===``?`turn_${e.sequence}`:e.turnId}function isBetweenTurns(e){return e.activeTurnId===void 0}function nextStepIndex(e){let t=e.activeTurnId===void 0?void 0:e.turns[e.activeTurnId];return t?.stepIndex===void 0?0:t.stepIndex+1}function queuedInput(e){return readTurnState(e).queued}function suspendedSteps(e){return readTurnState(e).suspended}function answeredCallIds(e){let t=new Set;for(let n of e)if((n.role===`tool`||n.role===`assistant`)&&typeof n.content!=`string`)for(let e of n.content)e.type===`tool-result`&&t.add(e.toolCallId);return t}function runningTasks(e){let t=answeredCallIds(e.messages);return e.tasks.filter(e=>!t.has(e.callId))}function runtimeWait(e){let t=suspendedSteps(e).flatMap(e=>{let t=runningTasks(e),n=pendingTaskToolCalls(e.messages);return t.length===0&&n.length===0?[]:[{step:e,tasks:t,taskToolCalls:n}]}),n=t[0];if(n===void 0)return;let r=t.flatMap(e=>e.tasks),i=t.flatMap(e=>e.taskToolCalls);return{callIds:[...r.map(e=>e.callId),...i.map(e=>e.callId)],event:n.step.event,taskToolCalls:i,tasks:r}}export{SESSION_PROJECTION_STATE_KEY,activeTurnId,answeredCallIds,isBetweenTurns,nextStepIndex,queuedInput,runningTasks,runtimeWait,storedProjection,suspendedSteps,turnPosition};
@@ -1 +1 @@
1
- import{createLogger}from"#internal/logging.js";import{REPLY_TOOL_NAME}from"#protocol/reply-tool.js";import{resolveAssistantStepText,validateHarnessModelMessages}from"#harness/messages.js";import{renderFinalOutputWhileWorkingError}from"#execution/tasks/render.js";import{extractToolApprovalInputRequests,hasRunnableQueue,parkOnApprovals,stopForToolSignIn}from"#harness/hitl/index.js";import{stageToolResultMedia}from"#harness/attachment-staging.js";import{isWorkflowTool,workingTaskIds}from"#execution/tasks/model-step.js";import{collectWorkflowCalls}from"#harness/coordination.js";import{fail,finishTurn,hold,suspendStep,withResult}from"#harness/session-machine/transitions.js";import{createToolResultMessagePartFromToolError,isToolResultError}from"#harness/action-result-helpers.js";import{setRequestEnvelopeTokens}from"#harness/request-envelope.js";import{getInvalidToolCallInputError,isInvalidToolCall}from"#harness/tool-call-input-errors.js";import{resolveInlineAuthorizationInterrupt}from"#harness/inline-tool-authorization.js";import{FINAL_OUTPUT_BESIDE_PENDING_CALLS}from"#harness/final-output.js";import{appendMissingToolResultMessages,extractToolResultCallIds}from"#harness/model-call/response.js";import{clearTurnClientContextState}from"#harness/turn-client-context.js";import{normalizeProviderToolHistory}from"#harness/provider-tool-history.js";const log=createLogger(`harness.tool-loop`);function getInvalidToolCallInputErrors(e){let t=[];for(let n of e.toolCalls){if(n.toolName===REPLY_TOOL_NAME)continue;let e=getInvalidToolCallInputError({toolCall:n});e!==void 0&&t.push(e)}return t}async function handleStepResult(e,t){let{promptMessages:n,result:r}=t,i=resolveAssistantStepText(r.response.messages,r.text),a=getInvalidToolCallInputErrors({toolCalls:r.toolCalls}),o=new Set([...r.invalidInputToolCallIds??[],...r.toolCalls.filter(isInvalidToolCall).map(e=>e.toolCallId),...a.map(e=>e.toolCallId)]),s=appendMissingToolResultMessages({append:a.map(e=>createToolResultMessagePartFromToolError(e)),responseMessages:r.response.messages}),c=new Set;for(let e of[...r.content??[],...r.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&c.add(e.toolCallId);let l=normalizeProviderToolHistory({messages:s,providerExecutedOutcomeIds:c}),u=await stageToolResultMedia(withoutApprovalParts(l.messages));e.session=setRequestEnvelopeTokens({...e.session,compaction:createNextCompactionConfig(e.session.compaction,t.durableModelPromptMessageCount,r)},r.usage?.inputTokens!==void 0&&t.durableModelPromptMessageCount!==void 0?t.requestEnvelopeTokens:void 0);let d=extractToolApprovalInputRequests({content:r.content??[],excludedCallIds:o,tools:t.catalog}),f=new Set([...d.map(e=>e.action.callId),...extractToolResultCallIds(u)]),p=(r.toolCalls??[]).filter(e=>!o.has(e.toolCallId)).filter(e=>!f.has(e.toolCallId)).filter(e=>isWorkflowTool(t.catalog.get(e.toolName)));if(p.length>0||d.length>0){let{sequence:i,stepIndex:a,turnId:o}=e.position(),s=collectWorkflowCalls({session:e.session,toolCalls:p,tools:t.catalog,turnId:o});e.session={...s.session,history:validateHarnessModelMessages(n)};let c={event:{sequence:i,stepIndex:a,turnId:o},messages:answerCallsThatWontRun(u,r),tasks:s.workflowRequests};return d.length>0?parkOnApprovals(e,{...c,requests:d,tools:t.catalog,waitsOnRuntime:p.length>0}):(await e.apply(suspendStep(e.view(),c)),{next:null,session:e.session})}let m=resolveInlineAuthorizationInterrupt({messages:[...n,...u],toolResults:r.toolResults});if(m)return stopForToolSignIn(e,m);e.session={...e.session,history:validateHarnessModelMessages([...n,...u])};let h=e.session.outputSchema!==void 0&&extractFinalOutput(r)!==void 0,g=workingTaskIds(e.session),_=h&&g.length>0,v=u;_&&(v=rejectFinalOutput(u,r,g),e.session={...e.session,history:validateHarnessModelMessages([...n,...v])});let y=await stepEndsTurn(r,u,t.endsTurnTools);return(!h||_)&&(v.at(-1)?.role===`tool`&&!y||l.outcomeEndsResponse||hasRunnableQueue(e.view()))?{next:e.runStep,session:e.session}:g.length>0?(await e.apply(hold(e.view(),{on:`tasks`})),{held:{kind:`tasks`,taskIds:g},next:null,session:e.session}):settleTurn(e,{history:n,result:r,stepOutput:y?null:i})}function answerCallsThatWontRun(e,t){let n=extractToolResultCallIds(e);return(t.toolCalls??[]).filter(e=>e.toolName===REPLY_TOOL_NAME).map(e=>({output:{type:`error-text`,value:FINAL_OUTPUT_BESIDE_PENDING_CALLS},toolCallId:e.toolCallId,toolName:e.toolName,type:`tool-result`})).filter(e=>!n.has(e.toolCallId)).reduce((e,t)=>withResult(e,t),[...e])}function withoutApprovalParts(e){return e.flatMap(e=>{if(e.role!==`assistant`&&e.role!==`tool`||!Array.isArray(e.content))return[e];let t=e.content.filter(e=>e.type!==`tool-approval-request`&&e.type!==`tool-approval-response`);return t.length===0?[]:[{...e,content:t}]})}async function stepEndsTurn(e,t,n){let r=e.toolCalls??[];if(r.length===0)return!1;let i=new Map;for(let e of t)if(e.role===`tool`)for(let t of e.content)t.type===`tool-result`&&i.set(t.toolCallId,t.output);if(!r.every(e=>{let t=i.get(e.toolCallId);return n.has(e.toolName)&&t!==void 0&&!isToolResultError(t)}))return!1;let a=new Map((e.toolResults??[]).map(e=>[e.toolCallId,e.output]));for(let e of r){let t=n.get(e.toolName);if(typeof t==`function`&&!await callEndsTurn(t,a.get(e.toolCallId),e))return!1}return!0}async function callEndsTurn(e,t,n){try{return await e(t)===!0}catch(e){return log.warn(`endsTurn threw; continuing the turn`,{callId:n.toolCallId,error:e,toolName:n.toolName}),!1}}function rejectFinalOutput(e,t,n){let r=(t.toolCalls??[]).find(e=>e.toolName===REPLY_TOOL_NAME);if(r===void 0)return[...e];let i={output:{type:`error-text`,value:renderFinalOutputWhileWorkingError(n)},toolCallId:r.toolCallId,toolName:REPLY_TOOL_NAME,type:`tool-result`};return[...e,{content:[i],role:`tool`}]}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===REPLY_TOOL_NAME&&!isInvalidToolCall(e))?.input}async function settleTurn(e,t){let{history:n,result:r,stepOutput:i}=t,a=e.session.outputSchema;if(e.session=clearTurnClientContextState(e.session),a===void 0)return await e.apply(finishTurn(e.view()),e.session.history),{next:null,session:e.session,settledTurn:{output:i??``}};let o=extractFinalOutput(r);return o===void 0?(e.session={...e.session,outputSchema:void 0},await e.apply(fail(e.view(),OUTPUT_SCHEMA_NOT_FULFILLED)),{next:null,session:e.session,settledTurn:{isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message}}):(e.session={...e.session,history:[...n,{content:JSON.stringify(o),role:`assistant`}],outputSchema:void 0},await e.apply(finishTurn(e.view(),{result:o}),e.session.history),{next:null,session:e.session,settledTurn:{output:o}})}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold,thresholdPercent:e.thresholdPercent};return n.usage?.inputTokens!==void 0&&t!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t),r}export{handleStepResult,withoutApprovalParts};
1
+ import{createLogger}from"#internal/logging.js";import{REPLY_TOOL_NAME}from"#protocol/reply-tool.js";import{resolveAssistantStepText,validateHarnessModelMessages}from"#harness/messages.js";import{renderFinalOutputWhileWorkingError}from"#execution/tasks/render.js";import{extractToolApprovalInputRequests,hasRunnableQueue,parkOnApprovals,stopForToolSignIn}from"#harness/hitl/index.js";import{stageToolResultMedia}from"#harness/attachment-staging.js";import{isWorkflowTool,workingTaskIds}from"#execution/tasks/model-step.js";import{collectWorkflowCalls}from"#harness/coordination.js";import{fail,finishTurn,hold,suspendStep,withResult}from"#harness/session-machine/transitions.js";import{createToolResultMessagePartFromToolError,isToolResultError}from"#harness/action-result-helpers.js";import{setRequestEnvelopeTokens}from"#harness/request-envelope.js";import{getInvalidToolCallInputError,isInvalidToolCall}from"#harness/tool-call-input-errors.js";import{resolveInlineAuthorizationInterrupt}from"#harness/inline-tool-authorization.js";import{FINAL_OUTPUT_BESIDE_PENDING_CALLS}from"#harness/final-output.js";import{appendMissingToolResultMessages,extractToolResultCallIds}from"#harness/model-call/response.js";import{clearTurnClientContextState}from"#harness/turn-client-context.js";import{normalizeProviderToolHistory}from"#harness/provider-tool-history.js";const log=createLogger(`harness.tool-loop`);function getInvalidToolCallInputErrors(e){let t=[];for(let n of e.toolCalls){if(n.toolName===REPLY_TOOL_NAME)continue;let e=getInvalidToolCallInputError({toolCall:n});e!==void 0&&t.push(e)}return t}async function handleStepResult(e,t){let{promptMessages:n,result:r}=t,i=resolveAssistantStepText(r.response.messages,r.text),a=getInvalidToolCallInputErrors({toolCalls:r.toolCalls}),o=new Set([...r.invalidInputToolCallIds??[],...r.toolCalls.filter(isInvalidToolCall).map(e=>e.toolCallId),...a.map(e=>e.toolCallId)]),s=appendMissingToolResultMessages({append:a.map(e=>createToolResultMessagePartFromToolError(e)),responseMessages:r.response.messages}),c=new Set;for(let e of[...r.content??[],...r.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&c.add(e.toolCallId);let l=normalizeProviderToolHistory({messages:s,providerExecutedOutcomeIds:c}),u=await stageToolResultMedia(withoutApprovalParts(l.messages));e.session=setRequestEnvelopeTokens({...e.session,compaction:createNextCompactionConfig(e.session.compaction,t.durableModelPromptMessageCount,r)},r.usage?.inputTokens!==void 0&&t.durableModelPromptMessageCount!==void 0?t.requestEnvelopeTokens:void 0);let d=extractToolApprovalInputRequests({content:r.content??[],excludedCallIds:o,tools:t.catalog}),f=new Set([...d.map(e=>e.action.callId),...extractToolResultCallIds(u)]),p=(r.toolCalls??[]).filter(e=>!o.has(e.toolCallId)).filter(e=>!f.has(e.toolCallId)).filter(e=>isWorkflowTool(t.catalog.get(e.toolName))),m=resolveInlineAuthorizationInterrupt({messages:[...n,...u],toolResults:r.toolResults});if(p.length>0||d.length>0){let{sequence:i,stepIndex:a,turnId:o}=e.position(),s=collectWorkflowCalls({session:e.session,toolCalls:p,tools:t.catalog,turnId:o});e.session={...s.session,history:validateHarnessModelMessages(n)};let c={event:{sequence:i,stepIndex:a,turnId:o},messages:answerCallsThatWontRun(u,r),tasks:s.workflowRequests};if(d.length>0){let n=await parkOnApprovals(e,{...c,requests:d,tools:t.catalog,waitsOn:m?`sign-in`:p.length>0?`runtime`:void 0});return m?stopForToolSignIn(e,{...m,history:e.session.history}):n}return await e.apply(suspendStep(e.view(),c)),m?stopForToolSignIn(e,{...m,history:e.session.history}):(s.workflowRequests.some(e=>e.entry.entryPoint===`execute`)&&await e.apply(hold(e.view(),{on:`tasks`})),{next:null,session:e.session})}if(m)return stopForToolSignIn(e,m);e.session={...e.session,history:validateHarnessModelMessages([...n,...u])};let h=e.session.outputSchema!==void 0&&extractFinalOutput(r)!==void 0,g=workingTaskIds(e.session),_=h&&g.length>0,v=u;_&&(v=rejectFinalOutput(u,r,g),e.session={...e.session,history:validateHarnessModelMessages([...n,...v])});let y=await stepEndsTurn(r,u,t.endsTurnTools);return(!h||_)&&(v.at(-1)?.role===`tool`&&!y||l.outcomeEndsResponse||hasRunnableQueue(e.view()))?{next:e.runStep,session:e.session}:g.length>0?(await e.apply(hold(e.view(),{on:`tasks`})),{held:{kind:`tasks`,taskIds:g},next:null,session:e.session}):settleTurn(e,{history:n,result:r,stepOutput:y?null:i})}function answerCallsThatWontRun(e,t){let n=extractToolResultCallIds(e);return(t.toolCalls??[]).filter(e=>e.toolName===REPLY_TOOL_NAME).map(e=>({output:{type:`error-text`,value:FINAL_OUTPUT_BESIDE_PENDING_CALLS},toolCallId:e.toolCallId,toolName:e.toolName,type:`tool-result`})).filter(e=>!n.has(e.toolCallId)).reduce((e,t)=>withResult(e,t),[...e])}function withoutApprovalParts(e){return e.flatMap(e=>{if(e.role!==`assistant`&&e.role!==`tool`||!Array.isArray(e.content))return[e];let t=e.content.filter(e=>e.type!==`tool-approval-request`&&e.type!==`tool-approval-response`);return t.length===0?[]:[{...e,content:t}]})}async function stepEndsTurn(e,t,n){let r=e.toolCalls??[];if(r.length===0)return!1;let i=new Map;for(let e of t)if(e.role===`tool`)for(let t of e.content)t.type===`tool-result`&&i.set(t.toolCallId,t.output);if(!r.every(e=>{let t=i.get(e.toolCallId);return n.has(e.toolName)&&t!==void 0&&!isToolResultError(t)}))return!1;let a=new Map((e.toolResults??[]).map(e=>[e.toolCallId,e.output]));for(let e of r){let t=n.get(e.toolName);if(typeof t==`function`&&!await callEndsTurn(t,a.get(e.toolCallId),e))return!1}return!0}async function callEndsTurn(e,t,n){try{return await e(t)===!0}catch(e){return log.warn(`endsTurn threw; continuing the turn`,{callId:n.toolCallId,error:e,toolName:n.toolName}),!1}}function rejectFinalOutput(e,t,n){let r=(t.toolCalls??[]).find(e=>e.toolName===REPLY_TOOL_NAME);if(r===void 0)return[...e];let i={output:{type:`error-text`,value:renderFinalOutputWhileWorkingError(n)},toolCallId:r.toolCallId,toolName:REPLY_TOOL_NAME,type:`tool-result`};return[...e,{content:[i],role:`tool`}]}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===REPLY_TOOL_NAME&&!isInvalidToolCall(e))?.input}async function settleTurn(e,t){let{history:n,result:r,stepOutput:i}=t,a=e.session.outputSchema;if(e.session=clearTurnClientContextState(e.session),a===void 0)return await e.apply(finishTurn(e.view()),e.session.history),{next:null,session:e.session,settledTurn:{output:i??``}};let o=extractFinalOutput(r);return o===void 0?(e.session={...e.session,outputSchema:void 0},await e.apply(fail(e.view(),OUTPUT_SCHEMA_NOT_FULFILLED)),{next:null,session:e.session,settledTurn:{isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message}}):(e.session={...e.session,history:[...n,{content:JSON.stringify(o),role:`assistant`}],outputSchema:void 0},await e.apply(finishTurn(e.view(),{result:o}),e.session.history),{next:null,session:e.session,settledTurn:{output:o}})}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold,thresholdPercent:e.thresholdPercent};return n.usage?.inputTokens!==void 0&&t!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t),r}export{handleStepResult,withoutApprovalParts};
@@ -1 +1 @@
1
- import{estimateMediaTokens,readMediaMetadata}from"#internal/attachments/media-metadata.js";import{decodeSandboxRef,inlinesSandboxRefAsBytes,isSandboxRefUrl}from"#internal/attachments/sandbox-refs.js";const REMOTE_URL=/^https?:\/\//i;function estimateTokens(e){let t=0,n=JSON.stringify(e,(e,n)=>{let r=estimateFilePartTokens(n);if(r===void 0)return n;t+=r;let{mediaType:i,type:a}=n;return{mediaType:i,type:a}});return Buffer.byteLength(n??``)/4+t}function estimateFilePartTokens(e){if(typeof e!=`object`||!e)return;let t=e;if(t.type===`image`&&t.image!==void 0)return estimateFileDataTokens(t.image,typeof t.mediaType==`string`?t.mediaType:`image/*`);if(!(t.type!==`file`&&t.type!==`media`||typeof t.mediaType!=`string`))return estimateFileDataTokens(t.data,t.mediaType)}function estimateFileDataTokens(e,t){if(isSandboxRefUrl(e)){let t=decodeSandboxRef(e);return inlinesSandboxRefAsBytes(t)?estimateMediaTokens(t):void 0}if(e instanceof URL)return estimateRemoteTokens(t);if(isTaggedFileData(e))switch(e.type){case`data`:return estimateInlineTokens(e.data,t);case`url`:return isSandboxRefUrl(e.url)?estimateMediaTokens(decodeSandboxRef(e.url)):estimateRemoteTokens(t);case`reference`:return estimateRemoteTokens(t);default:return}return estimateInlineTokens(e,t)}function isTaggedFileData(e){return typeof e==`object`&&!!e&&!(e instanceof Uint8Array)&&!(e instanceof ArrayBuffer)&&typeof e.type==`string`}function estimateRemoteTokens(e){return e.startsWith(`image/`)?estimateMediaTokens({mediaType:e,size:0}):void 0}function estimateInlineTokens(e,t){if(typeof e==`string`){if(REMOTE_URL.test(e))return estimateRemoteTokens(t);let n=e.startsWith(`data:`)?e.slice(e.indexOf(`,`)+1):e,r=Math.floor(n.length*3/4);return estimateMediaTokens(withHeaderMetadata(base64Header(n),t,r))}if(e instanceof Uint8Array||e instanceof ArrayBuffer){let n=e instanceof Uint8Array?e:new Uint8Array(e);return estimateMediaTokens(withHeaderMetadata(n,t,n.byteLength))}}function base64Header(e){return Buffer.from(e.slice(0,98304),`base64`)}function withHeaderMetadata(e,t,n){return t.startsWith(`image/`)?{...readMediaMetadata(e,t),size:n}:{mediaType:t,size:n}}export{estimateTokens};
1
+ import{estimateMediaTokens,readMediaMetadata}from"#internal/attachments/media-metadata.js";import{decodeSandboxRef,inlinesSandboxRefAsBytes,isSandboxRefUrl}from"#internal/attachments/sandbox-refs.js";const REMOTE_URL=/^https?:\/\//i;function estimateTokens(e){let t=0,n=JSON.stringify(e,(e,n)=>{let r=estimateFilePartTokens(n);if(r===void 0)return n;t+=r;let{mediaType:i,type:a}=n;return{mediaType:i,type:a}});return Buffer.byteLength(n??``)/4+t}function estimateFilePartTokens(e){if(typeof e!=`object`||!e)return;let t=e;if(t.type===`image`&&t.image!==void 0)return estimateFileDataTokens(t.image,typeof t.mediaType==`string`?t.mediaType:`image/*`);if(!(t.type!==`file`&&t.type!==`media`||typeof t.mediaType!=`string`))return estimateFileDataTokens(t.data,t.mediaType)}function estimateFileDataTokens(e,t){if(isSandboxRefUrl(e))return estimateSandboxRefTokens(e);if(e instanceof URL)return estimateRemoteTokens(t);if(isTaggedFileData(e))switch(e.type){case`data`:return estimateInlineTokens(e.data,t);case`url`:return isSandboxRefUrl(e.url)?estimateSandboxRefTokens(e.url):estimateRemoteTokens(t);case`reference`:return estimateRemoteTokens(t);default:return}return estimateInlineTokens(e,t)}function estimateSandboxRefTokens(e){let t=decodeSandboxRef(e);return inlinesSandboxRefAsBytes(t)?estimateMediaTokens(t):void 0}function isTaggedFileData(e){return typeof e==`object`&&!!e&&!(e instanceof Uint8Array)&&!(e instanceof ArrayBuffer)&&typeof e.type==`string`}function estimateRemoteTokens(e){return e.startsWith(`image/`)?estimateMediaTokens({mediaType:e,size:0}):void 0}function estimateInlineTokens(e,t){if(typeof e==`string`){if(REMOTE_URL.test(e))return estimateRemoteTokens(t);let n=e.startsWith(`data:`)?e.slice(e.indexOf(`,`)+1):e,r=Math.floor(n.length*3/4);return estimateMediaTokens(withHeaderMetadata(base64Header(n),t,r))}if(e instanceof Uint8Array||e instanceof ArrayBuffer){let n=e instanceof Uint8Array?e:new Uint8Array(e);return estimateMediaTokens(withHeaderMetadata(n,t,n.byteLength))}}function base64Header(e){return Buffer.from(e.slice(0,98304),`base64`)}function withHeaderMetadata(e,t,n){return t.startsWith(`image/`)?{...readMediaMetadata(e,t),size:n}:{mediaType:t,size:n}}export{estimateTokens};
@@ -1 +1 @@
1
- import{contextStorage}from"#context/container.js";import{saveProjection,stepProjection}from"#harness/session-machine/current.js";import{ScheduleIdKey,StaticModelReferenceKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{clearMemorySessionState}from"#shared/memory-state.js";import{activeTurnId,turnPosition}from"#harness/session-machine/view.js";import{acceptHumanInput,admitApprovedWork,discardClearedHumanInput}from"#harness/hitl/index.js";import{clear}from"#harness/session-machine/transitions.js";import{createHistoryViewPreparer}from"#shared/history-view.js";import{createStep,openTurn}from"#harness/step/context.js";import{prepareTurnInput,settleRuntimeWork}from"#harness/step/intake.js";import{compactHistory,replaceSessionHistory}from"#harness/compaction/step.js";import{GenerationSteering}from"#harness/generation-steering.js";import{runModelStep}from"#harness/model-call/run.js";import{handleStepResult}from"#harness/step/after-model.js";const environment=process.env.NODE_ENV??`unknown`,eveVersion=resolveInstalledPackageInfo().version;function createToolLoopHarness(e){e.instrumentation?.installAiSdkWarningLogger();async function runStep(t,n){let executeStep=async r=>{let i=r?.session??t,a=stepProjection(contextStorage.getStore(),i.state),o=new GenerationSteering({abortSignal:e.abortSignal,steeringSignal:e.steeringSignal,outputStarted:turnPosition(a.read()).assistantOutputStarted});try{let e=await executeStepBody(i,o,a,n,r);return{...e,session:saveProjection(e.session,a.read())}}finally{o.dispose()}};return e.instrumentation?.runStep({environment,eveVersion,hasInput:hasStepInput(n),session:t},executeStep)??executeStep()}async function executeStepBody(t,n,r,i,a){let o=createHistoryViewPreparer({previous:e.historyView,projector:e.historyProjector});o(t.history,t.state);let s=contextStorage.getStore();s!==void 0&&!s.has(StaticModelReferenceKey)&&s.setVirtualContext(StaticModelReferenceKey,t.agent.dynamicModel===!0?null:t.agent.modelReference??null);let c,l=a?.createHandleEvent({getAttemptScope:()=>c,isFrameworkTool:e=>u.frameworkToolNames.has(e),handleEvent:e.handleEvent,turnId:activeTurnId(turnPosition(r.read()))})??e.handleEvent,u=createStep({config:e,ctx:s,emit:l,instrumentation:a,live:r,prepareHistory:o,publish:async(e,t)=>{n.beforeEvent(e),l!==void 0&&await l(e,t),(l===void 0||s===void 0)&&r.record(e)},runStep,session:t});if(e.clearOnly===!0)return clearContext(u);if(e.compactOnly===!0)return compactHistory(u);let d=await settleRuntimeWork(u,i);if(d===void 0)return{next:null,session:u.session};let f=await acceptHumanInput(u,d.input,{takeQueued:!d.waited});if(f.kind===`stop`)return f.result;let p=await prepareTurnInput(u,f.input,{consumedMessage:f.consumedMessage});if(f.opensTurn){let e=await openTurn(u,{input:[...p.ephemeral,...p.messages],message:f.message});if(e!==void 0)return e}return await admitApprovedWork(u,f.approved),runModelStep(u,{approved:f.approved,onResponse:e=>handleStepResult(u,e),generation:n,hidesHeldText:u.hasDelegatedCaller||s?.get(ScheduleIdKey)!==void 0,setAttemptScope:e=>{c=e},turn:p})}return runStep}async function clearContext(e){await e.apply(clear(e.view(),{sessionId:e.session.sessionId}));let t=discardClearedHumanInput({...e.session,state:clearMemorySessionState(e.session.state)});return{next:null,session:replaceSessionHistory(t,[])}}function hasStepInput(e){return e===void 0?!1:e.message!==void 0||(e.inputResponses?.length??0)>0}export{createToolLoopHarness};
1
+ import{contextStorage}from"#context/container.js";import{saveProjection,stepProjection}from"#harness/session-machine/current.js";import{ScheduleIdKey,StaticModelReferenceKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{clearMemorySessionState}from"#shared/memory-state.js";import{activeTurnId,turnPosition}from"#harness/session-machine/view.js";import{acceptHumanInput,admitApprovedWork,discardClearedHumanInput}from"#harness/hitl/index.js";import{clear}from"#harness/session-machine/transitions.js";import{createHistoryViewPreparer}from"#shared/history-view.js";import{compactHistory,replaceSessionHistory}from"#harness/compaction/step.js";import{createStep,openTurn}from"#harness/step/context.js";import{GenerationSteering}from"#harness/generation-steering.js";import{runModelStep}from"#harness/model-call/run.js";import{handleStepResult}from"#harness/step/after-model.js";import{prepareTurnInput,settleRuntimeWork}from"#harness/step/intake.js";const environment=process.env.NODE_ENV??`unknown`,eveVersion=resolveInstalledPackageInfo().version;function createToolLoopHarness(e){e.instrumentation?.installAiSdkWarningLogger();async function runStep(t,n){let executeStep=async r=>{let i=r?.session??t,a=stepProjection(contextStorage.getStore(),i.state),o=new GenerationSteering({abortSignal:e.abortSignal,steeringSignal:e.steeringSignal,outputStarted:turnPosition(a.read()).assistantOutputStarted});try{let e=await executeStepBody(i,o,a,n,r);return{...e,session:saveProjection(e.session,a.read())}}finally{o.dispose()}};return e.instrumentation?.runStep({environment,eveVersion,hasInput:hasStepInput(n),session:t},executeStep)??executeStep()}async function executeStepBody(t,n,r,i,a){let o=createHistoryViewPreparer({previous:e.historyView,projector:e.historyProjector});o(t.history,t.state);let s=contextStorage.getStore();s!==void 0&&!s.has(StaticModelReferenceKey)&&s.setVirtualContext(StaticModelReferenceKey,t.agent.dynamicModel===!0?null:t.agent.modelReference??null);let c,l=a?.createHandleEvent({getAttemptScope:()=>c,isFrameworkTool:e=>u.frameworkToolNames.has(e),handleEvent:e.handleEvent,turnId:activeTurnId(turnPosition(r.read()))})??e.handleEvent,u=createStep({config:e,ctx:s,emit:l,instrumentation:a,live:r,prepareHistory:o,publish:async(e,t)=>{n.beforeEvent(e),l!==void 0&&await l(e,t),(l===void 0||s===void 0)&&r.record(e)},runStep,session:t});if(e.clearOnly===!0)return clearContext(u);if(e.compactOnly===!0)return compactHistory(u);let d=await settleRuntimeWork(u,i);if(d===void 0)return{next:null,session:u.session};let f=await acceptHumanInput(u,d.input,{takeQueued:!d.waited});if(f.kind===`stop`)return f.result;let p=await prepareTurnInput(u,f.input,{consumedMessage:f.consumedMessage});if(f.opensTurn){let e=await openTurn(u,{input:[...p.ephemeral,...p.messages],message:f.message});if(e!==void 0)return e}return await admitApprovedWork(u,f.approved),runModelStep(u,{approved:f.approved,onResponse:e=>handleStepResult(u,e),generation:n,hidesHeldText:u.hasDelegatedCaller||s?.get(ScheduleIdKey)!==void 0,setAttemptScope:e=>{c=e},turn:p})}return runStep}async function clearContext(e){await e.apply(clear(e.view(),{sessionId:e.session.sessionId}));let t=discardClearedHumanInput({...e.session,state:clearMemorySessionState(e.session.state)});return{next:null,session:replaceSessionHistory(t,[])}}function hasStepInput(e){return e===void 0?!1:e.message!==void 0||(e.inputResponses?.length??0)>0}export{createToolLoopHarness};
@@ -1 +1 @@
1
- import{tool}from"ai";import{createLogger}from"#internal/logging.js";import{isObject}from"#shared/guards.js";import{loadContext}from"#context/container.js";import{toModelSchema}from"#tools/schema.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{resolveApprovalPolicy}from"#approval/definition.js";import{isApprovedToolCall,markApprovalRecheck}from"#harness/approval-recheck.js";import{isAuthorizationSignal,modelFacingAuthorizationOutput}from"#harness/authorization.js";import{entryModelOutput,stubbedCall}from"#harness/execute-call.js";import{normalizeToolJsonOutput}from"#harness/tool-model-output.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{executeWithToolStub}from"#tool-stubs/execute.js";import{stashToolInterrupt}from"#harness/tool-interrupts.js";import{resolveWebSearchBackend,resolveWebSearchProviderTool}from"#harness/provider-tools.js";import{iterateAsApprover,runAsApprover}from"#harness/hitl/approved-call-callers.js";const log=createLogger(`harness.tools`);function buildToolSet(e){let t={},n=e.disabledProviderTools;for(let r of e.tools.values())n?.has(r.name)||(t[r.name]=tool({description:e.describe(r),execute:wrapToolExecute(r,e.resolve),inputSchema:toModelSchema(r.inputSchema,`input`),strict:!1,outputSchema:toModelSchema(r.outputSchema,`output`),...r.execute!==void 0||r.toModelOutput!==void 0?{toModelOutput:({input:t,output:n,toolCallId:i})=>entryModelOutput(e.resolve({input:t,toolName:r.name})?.definition??r,n,i)}:{}}));return t}function wrapToolExecute(e,t){let n=e.execute;if(n!==void 0)return(r,i)=>{let a={input:r,toolName:e.name},o=t?.(a),s=o?.definition.name??e.name,c=stubbedCall(a,o),run=()=>n(r,i),l;try{l=runAsApprover(i.toolCallId,()=>c===void 0?run():executeWithToolStub(c.toolName,c.input,i,run))}catch(e){return Promise.reject(e)}return isAsyncIterable(l)?normalizeToolExecuteIterable(iterateAsApprover(i.toolCallId,l),s,i):Promise.resolve(l).then(e=>normalizeToolExecuteOutput(e,s,i))}}async function*normalizeToolExecuteIterable(e,t,n){for await(let r of e)yield normalizeToolExecuteOutput(r,t,n)}function normalizeToolExecuteOutput(e,t,n){return isAuthorizationSignal(e)?(stashToolInterrupt(loadContext(),n.toolCallId,e),modelFacingAuthorizationOutput(e)):normalizeToolJsonOutput({boundary:`execute`,output:e,toolCallId:n.toolCallId,toolName:t})}async function buildToolSetWithProviderTools(e){let t=e.disabledProviderTools,n={...buildToolSet(e)};for(let r of e.tools.values()){let i=r.behavior?.handling;if(i?.kind===`provider-tool`&&r.execute===void 0&&!t?.has(r.name)){let t=resolveWebSearchBackend(e.profile,i);t===null?(log.debug(`model has no web search backend; leaving the tool out`,{gateway:e.profile.gateway,modelProvider:e.profile.provider,searchProvider:i.provider,tool:r.name}),delete n[r.name]):n[r.name]=await resolveWebSearchProviderTool(t)}}return n}function buildToolApproval(e){return async({toolCall:t,messages:n})=>{let r=e.resolve(t);if(r!==void 0)return await evaluateApproval(r.definition,{abortSignal:e.abortSignal,approvedTools:e.approvedTools,callId:t.toolCallId,input:r.call.input,recheck:isApprovedToolCall(n,t.toolCallId)})}}async function recheckApprovedCall(e,t){let n=await evaluateApproval(e,{...t,recheck:!0});return n===`denied`?{denied:!0}:typeof n==`object`&&n&&n.type===`denied`?{denied:!0,reason:n.reason}:{denied:!1}}async function evaluateApproval(e,t){if(e.approval===void 0)return;let n={...buildCallbackContext(),abortSignal:t.abortSignal??new AbortController().signal,approvedTools:t.approvedTools??new Set,callId:t.callId,toolInput:isObject(t.input)?t.input:void 0,toolName:e.name},r=await resolveApprovalPolicy(e.approval)(t.recheck?markApprovalRecheck(n):n);return typeof r==`boolean`?r?`user-approval`:`not-applicable`:r}export{buildToolApproval,buildToolSet,buildToolSetWithProviderTools,recheckApprovedCall,wrapToolExecute};
1
+ import{tool}from"ai";import{createLogger}from"#internal/logging.js";import{isObject}from"#shared/guards.js";import{loadContext}from"#context/container.js";import{toModelSchema}from"#tools/schema.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{resolveApprovalPolicy}from"#approval/definition.js";import{isApprovedToolCall,markApprovalRecheck}from"#harness/approval-recheck.js";import{isAuthorizationSignal,modelFacingAuthorizationOutput}from"#harness/authorization.js";import{entryModelOutput,stubbedCall}from"#harness/execute-call.js";import{normalizeToolJsonOutput}from"#harness/tool-model-output.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{executeWithToolStub}from"#tool-stubs/execute.js";import{stashToolInterrupt}from"#harness/tool-interrupts.js";import{resolveWebSearchBackend,resolveWebSearchProviderTool}from"#harness/provider-tools.js";const log=createLogger(`harness.tools`);function buildToolSet(e){let t={},n=e.disabledProviderTools;for(let r of e.tools.values())n?.has(r.name)||(t[r.name]=tool({description:e.describe(r),execute:wrapToolExecute(r,e.resolve),inputSchema:toModelSchema(r.inputSchema,`input`),strict:!1,outputSchema:toModelSchema(r.outputSchema,`output`),...r.execute!==void 0||r.toModelOutput!==void 0?{toModelOutput:({input:t,output:n,toolCallId:i})=>entryModelOutput(e.resolve({input:t,toolName:r.name})?.definition??r,n,i)}:{}}));return t}function wrapToolExecute(e,t){let n=e.execute;if(n!==void 0)return(r,i)=>{let a={input:r,toolName:e.name},o=t?.(a),s=o?.definition.name??e.name,c=stubbedCall(a,o),run=()=>n(r,i),l;try{l=c===void 0?run():executeWithToolStub(c.toolName,c.input,i,run)}catch(e){return Promise.reject(e)}return isAsyncIterable(l)?normalizeToolExecuteIterable(l,s,i):Promise.resolve(l).then(e=>normalizeToolExecuteOutput(e,s,i))}}async function*normalizeToolExecuteIterable(e,t,n){for await(let r of e)yield normalizeToolExecuteOutput(r,t,n)}function normalizeToolExecuteOutput(e,t,n){return isAuthorizationSignal(e)?(stashToolInterrupt(loadContext(),n.toolCallId,e),modelFacingAuthorizationOutput(e)):normalizeToolJsonOutput({boundary:`execute`,output:e,toolCallId:n.toolCallId,toolName:t})}async function buildToolSetWithProviderTools(e){let t=e.disabledProviderTools,n={...buildToolSet(e)};for(let r of e.tools.values()){let i=r.behavior?.handling;if(i?.kind===`provider-tool`&&r.execute===void 0&&!t?.has(r.name)){let t=resolveWebSearchBackend(e.profile,i);t===null?(log.debug(`model has no web search backend; leaving the tool out`,{gateway:e.profile.gateway,modelProvider:e.profile.provider,searchProvider:i.provider,tool:r.name}),delete n[r.name]):n[r.name]=await resolveWebSearchProviderTool(t)}}return n}function buildToolApproval(e){return async({toolCall:t,messages:n})=>{let r=e.resolve(t);if(r!==void 0)return await evaluateApproval(r.definition,{abortSignal:e.abortSignal,approvedTools:e.approvedTools,callId:t.toolCallId,input:r.call.input,recheck:isApprovedToolCall(n,t.toolCallId)})}}async function recheckApprovedCall(e,t){let n=await evaluateApproval(e,{...t,recheck:!0});return n===`denied`?{denied:!0}:typeof n==`object`&&n&&n.type===`denied`?{denied:!0,reason:n.reason}:{denied:!1}}async function evaluateApproval(e,t){if(e.approval===void 0)return;let n={...buildCallbackContext(),abortSignal:t.abortSignal??new AbortController().signal,approvedTools:t.approvedTools??new Set,callId:t.callId,toolInput:isObject(t.input)?t.input:void 0,toolName:e.name},r=await resolveApprovalPolicy(e.approval)(t.recheck?markApprovalRecheck(n):n);return typeof r==`boolean`?r?`user-approval`:`not-applicable`:r}export{buildToolApproval,buildToolSet,buildToolSetWithProviderTools,recheckApprovedCall,wrapToolExecute};
@@ -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";import{readStampedPackageVersion}from"#internal/application/stamped-package-version.js";let cachedPackageInfo,cachedPackageLocation;const WORKFLOW_MODULE_ALIASES={"workflow/errors":`src/compiled/@workflow/errors/index.js`,"workflow/internal/private":`src/compiled/@workflow/core/private.js`};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 packageRequire=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 findNearestSourceCheckoutRoot(e){let t=e;for(;;){if(isSourceCheckout(t))return t;let e=dirname(t);if(e===t)return;t=e}}function tryCreatePackageLocation(e){if(isSourceCheckout(e))return{packageBuildRoot:null,packageRoot:e};let t=join(e,`dist`);if(existsSync(t))return{packageBuildRoot:t,packageRoot:e}}function resolveSelfPackageJsonPath(e){return createRequire(e).resolve(`${EVE_PACKAGE_NAME}/package.json`)}function resolvePackageLocationFromModulePath(e,t=resolveSelfPackageJsonPath){let n=realpathSync.native(e),r=tryResolveDirectBuildLocation(n);if(r!==void 0)return r;let i=findNearestVerifiedPackageRoot(dirname(n));if(i!==void 0&&isSourceCheckout(i))return{packageBuildRoot:null,packageRoot:i};try{let e=tryResolveVerifiedPackageRoot(t(n)),r=e===void 0?void 0:tryCreatePackageLocation(e);if(r!==void 0)return r}catch{}let a=i===void 0?void 0:tryCreatePackageLocation(i);if(a!==void 0)return a;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 tryResolveLocalPackageRoot(e){try{let t=realpathSync.native(e),n=tryResolveDirectBuildLocation(t);if(n!==void 0)return n.packageRoot;let r=findNearestSourceCheckoutRoot(dirname(t));return r===void 0?void 0:tryResolveVerifiedPackageRoot(join(r,`package.json`))}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){try{return packageRequire.resolve(e)}catch(t){let n=tryResolvePackageRoot(),r=n===void 0||!isSourceCheckout(n)?void 0:resolveSourceCheckoutExport(n,e);if(r!==void 0)return r;throw t}}function resolveSourceCheckoutExport(e,t){if(t!==EVE_PACKAGE_NAME&&!t.startsWith(`${EVE_PACKAGE_NAME}/`))return;let n=t===EVE_PACKAGE_NAME?`.`:`.${t.slice(EVE_PACKAGE_NAME.length)}`;try{let t=JSON.parse(readFileSync(join(e,`package.json`),`utf8`)).exports?.[n],r=typeof t==`string`?t:t?.[`eve-source`]??t?.import??t?.default;if(r===void 0)return;let i=r.replace(/^\.\/dist\/src\//,`src/`).replace(/\.[cm]?js$/u,`.ts`),a=join(e,i);return existsSync(a)?a:void 0}catch{return}}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 n=normalizeInstalledPackageInfo(JSON.parse(readFileSync(e,`utf8`)));if(n?.name===t)return n}function tryResolveSelfPackageInfo(){try{return tryReadInstalledPackageInfo(packageRequire.resolve(`${EVE_PACKAGE_NAME}/package.json`),EVE_PACKAGE_NAME)}catch{return}}function resolveInstalledPackageInfo(){if(cachedPackageInfo)return cachedPackageInfo;let e=tryResolveLocalPackageRoot(resolveCurrentModulePath()),t=e===void 0?void 0:tryReadInstalledPackageInfo(join(e,`package.json`),EVE_PACKAGE_NAME);if(t)return cachedPackageInfo=t,cachedPackageInfo;let n=readStampedPackageVersion();return n===void 0?(cachedPackageInfo=tryResolveSelfPackageInfo()??{name:EVE_PACKAGE_NAME,version:`0.0.0`},cachedPackageInfo):(cachedPackageInfo={name:EVE_PACKAGE_NAME,version:n},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(packageRequire.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?packageRequire.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,isAbsolute,join}from"node:path";import{fileURLToPath}from"node:url";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";import{readStampedPackageVersion}from"#internal/application/stamped-package-version.js";let cachedPackageInfo,cachedPackageLocation;const WORKFLOW_MODULE_ALIASES={"workflow/errors":`src/compiled/@workflow/errors/index.js`,"workflow/internal/private":`src/compiled/@workflow/core/private.js`};function resolveCurrentModulePath(){return typeof __filename==`string`&&isAbsolute(__filename)?__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 packageRequire=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 findNearestSourceCheckoutRoot(e){let t=e;for(;;){if(isSourceCheckout(t))return t;let e=dirname(t);if(e===t)return;t=e}}function tryCreatePackageLocation(e){if(isSourceCheckout(e))return{packageBuildRoot:null,packageRoot:e};let t=join(e,`dist`);if(existsSync(t))return{packageBuildRoot:t,packageRoot:e}}function resolveSelfPackageJsonPath(e){return createRequire(e).resolve(`${EVE_PACKAGE_NAME}/package.json`)}function resolvePackageLocationFromModulePath(e,t=resolveSelfPackageJsonPath){let n=realpathSync.native(e),r=tryResolveDirectBuildLocation(n);if(r!==void 0)return r;let i=findNearestVerifiedPackageRoot(dirname(n));if(i!==void 0&&isSourceCheckout(i))return{packageBuildRoot:null,packageRoot:i};try{let e=tryResolveVerifiedPackageRoot(t(n)),r=e===void 0?void 0:tryCreatePackageLocation(e);if(r!==void 0)return r}catch{}let a=i===void 0?void 0:tryCreatePackageLocation(i);if(a!==void 0)return a;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 tryResolveLocalPackageRoot(e){try{let t=realpathSync.native(e),n=tryResolveDirectBuildLocation(t);if(n!==void 0)return n.packageRoot;let r=findNearestSourceCheckoutRoot(dirname(t));return r===void 0?void 0:tryResolveVerifiedPackageRoot(join(r,`package.json`))}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){try{return packageRequire.resolve(e)}catch(t){let n=tryResolvePackageRoot(),r=n===void 0||!isSourceCheckout(n)?void 0:resolveSourceCheckoutExport(n,e);if(r!==void 0)return r;throw t}}function resolveSourceCheckoutExport(e,t){if(t!==EVE_PACKAGE_NAME&&!t.startsWith(`${EVE_PACKAGE_NAME}/`))return;let n=t===EVE_PACKAGE_NAME?`.`:`.${t.slice(EVE_PACKAGE_NAME.length)}`;try{let t=JSON.parse(readFileSync(join(e,`package.json`),`utf8`)).exports?.[n],r=typeof t==`string`?t:t?.[`eve-source`]??t?.import??t?.default;if(r===void 0)return;let i=r.replace(/^\.\/dist\/src\//,`src/`).replace(/\.[cm]?js$/u,`.ts`),a=join(e,i);return existsSync(a)?a:void 0}catch{return}}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 n=normalizeInstalledPackageInfo(JSON.parse(readFileSync(e,`utf8`)));if(n?.name===t)return n}function tryResolveSelfPackageInfo(){try{return tryReadInstalledPackageInfo(packageRequire.resolve(`${EVE_PACKAGE_NAME}/package.json`),EVE_PACKAGE_NAME)}catch{return}}function resolveInstalledPackageInfo(){if(cachedPackageInfo)return cachedPackageInfo;let e=tryResolveLocalPackageRoot(resolveCurrentModulePath()),t=e===void 0?void 0:tryReadInstalledPackageInfo(join(e,`package.json`),EVE_PACKAGE_NAME);if(t)return cachedPackageInfo=t,cachedPackageInfo;let n=readStampedPackageVersion();return n===void 0?(cachedPackageInfo=tryResolveSelfPackageInfo()??{name:EVE_PACKAGE_NAME,version:`0.0.0`},cachedPackageInfo):(cachedPackageInfo={name:EVE_PACKAGE_NAME,version:n},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(packageRequire.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?packageRequire.resolve(e):resolvePackageCompiledFilePath(t)}export{resolveExpectedWorkflowVersion,resolveInstalledPackageInfo,resolvePackageCompiledFilePath,resolvePackageDependencyPath,resolvePackageLocationFromModulePath,resolvePackageRoot,resolvePackageSourceDirectoryPath,resolvePackageSourceFilePath,resolveWorkflowModulePath};
@@ -1 +1 @@
1
- const STAMPED_PACKAGE_VERSION=`0.76.3`;function readStampedPackageVersion(){return STAMPED_PACKAGE_VERSION.startsWith(`__`)?void 0:STAMPED_PACKAGE_VERSION}export{readStampedPackageVersion};
1
+ const STAMPED_PACKAGE_VERSION=`0.78.0`;function readStampedPackageVersion(){return STAMPED_PACKAGE_VERSION.startsWith(`__`)?void 0:STAMPED_PACKAGE_VERSION}export{readStampedPackageVersion};
@@ -1,18 +1,37 @@
1
1
  /**
2
- * Shared helpers for decoding AI SDK `FilePart.data` values into raw
3
- * bytes and inspecting their size without fetching remote resources.
2
+ * Shared helpers for reading AI SDK `FilePart.data` values without
3
+ * fetching remote resources.
4
4
  *
5
- * URL-shaped inputs that require IO return `null`; channel attachment
6
- * refs are resolved explicitly by the staging layer.
5
+ * Every value has one meaning: typed arrays, base64 strings, `data:` URLs,
6
+ * and tagged `data` or `text` shapes carry bytes; any other string or `URL`
7
+ * with a scheme is a link the staging layer resolves; a provider reference
8
+ * names a file the provider already holds. Anything else is unreadable.
7
9
  */
10
+ /** What a `FilePart.data` value carries. */
11
+ export type FileData = {
12
+ readonly kind: "bytes";
13
+ readonly bytes: Buffer;
14
+ } | {
15
+ readonly kind: "link";
16
+ readonly url: URL;
17
+ } | {
18
+ readonly kind: "reference";
19
+ } | {
20
+ readonly kind: "unreadable";
21
+ };
8
22
  /**
9
- * Converts any inline AI SDK `FilePart.data` value into raw bytes.
10
- *
11
- * Returns `null` for every URL-shaped input the caller is expected to
12
- * handle out-of-band, including `eve-attachment:` refs and remote URLs.
23
+ * Classifies one `FilePart.data` value. A string with a framework-internal
24
+ * scheme is unreadable: only eve mints those refs, so a caller-supplied one
25
+ * must never turn into a privileged read.
26
+ */
27
+ export declare function readFileData(data: unknown): FileData;
28
+ /**
29
+ * Whether `FilePart.data` is a link or unreadable, so eve must resolve it
30
+ * before a provider sees it. Never decodes the payload.
13
31
  */
14
- export declare function fileDataToBytes(data: unknown): Promise<Buffer | null>;
32
+ export declare function isUnresolvedFileData(data: unknown): boolean;
15
33
  /**
16
- * Returns the byte length of `FilePart.data` without performing any IO.
34
+ * Returns the byte length of `FilePart.data` without performing any IO, or
35
+ * `null` when only a fetch could tell.
17
36
  */
18
37
  export declare function getKnownByteLength(data: unknown): number | null;
@@ -1 +1 @@
1
- import{isAttachmentRefUrl,parseAttachmentRef}from"#internal/attachments/refs.js";async function fileDataToBytes(e){return typeof Buffer<`u`&&Buffer.isBuffer(e)?e:e instanceof Uint8Array?Buffer.from(e):e instanceof ArrayBuffer?Buffer.from(new Uint8Array(e)):typeof e==`string`?decodeStringData(e):e instanceof URL&&e.protocol===`data:`?decodeStringData(e.href):null}function getKnownByteLength(e){return typeof Buffer<`u`&&Buffer.isBuffer(e)||e instanceof Uint8Array||e instanceof ArrayBuffer?e.byteLength:typeof e==`string`?computeStringByteLength(e):isAttachmentRefUrl(e)?parseAttachmentRef(e).size??null:e instanceof URL&&e.protocol===`data:`?computeStringByteLength(e.href):null}function decodeStringData(e){if(e.startsWith(`data:`)){let t=e.indexOf(`,`);if(t===-1)return null;let n=e.slice(5,t),r=e.slice(t+1);return n.endsWith(`;base64`)?Buffer.from(r,`base64`):Buffer.from(decodeURIComponent(r),`utf8`)}return/^https?:\/\//.test(e)?null:Buffer.from(e,`base64`)}function computeStringByteLength(e){if(e.startsWith(`data:`)){let t=e.indexOf(`,`);if(t===-1)return null;let n=e.slice(5,t),r=e.slice(t+1);if(n.endsWith(`;base64`))return estimateBase64ByteLength(r);try{return Buffer.byteLength(decodeURIComponent(r),`utf8`)}catch{return Buffer.byteLength(r,`utf8`)}}return/^https?:\/\//.test(e)?null:estimateBase64ByteLength(e)}function estimateBase64ByteLength(e){let t=e.trimEnd();if(t.length===0)return 0;let n=0;return t.endsWith(`==`)?n=2:t.endsWith(`=`)&&(n=1),Math.max(0,Math.floor(t.length*3/4)-n)}export{fileDataToBytes,getKnownByteLength};
1
+ import{hasInternalRefScheme}from"#internal/attachments/url-refs.js";const SCHEME_PREFIX=/^[a-z][a-z\d+.-]*:/i,REFERENCE={kind:`reference`},UNREADABLE={kind:`unreadable`};function readFileData(e){if(e instanceof Uint8Array)return{bytes:Buffer.isBuffer(e)?e:Buffer.from(e),kind:`bytes`};if(e instanceof ArrayBuffer)return{bytes:Buffer.from(new Uint8Array(e)),kind:`bytes`};if(e instanceof URL)return e.protocol===`data:`?decodeDataUrl(e.href):{kind:`link`,url:e};if(typeof e==`string`)return readStringData(e);if(typeof e!=`object`||!e)return UNREADABLE;let t=e;switch(t.type){case`data`:return readFileData(t.data);case`url`:return t.url instanceof URL||typeof t.url==`string`?readFileData(t.url):UNREADABLE;case`text`:return typeof t.text==`string`?{bytes:Buffer.from(t.text,`utf8`),kind:`bytes`}:UNREADABLE;case`reference`:return REFERENCE;default:return isProviderReference(e)?REFERENCE:UNREADABLE}}function isUnresolvedFileData(e){if(e instanceof Uint8Array||e instanceof ArrayBuffer)return!1;if(typeof e==`string`)return SCHEME_PREFIX.test(e)&&!e.startsWith(`data:`);if(e instanceof URL)return e.protocol!==`data:`;if(typeof e!=`object`||!e)return!0;let t=e;switch(t.type){case`data`:return isUnresolvedFileData(t.data);case`url`:return!0;case`text`:return typeof t.text!=`string`;case`reference`:return!1;default:return!isProviderReference(e)}}function getKnownByteLength(e){return e instanceof Uint8Array||e instanceof ArrayBuffer?e.byteLength:e instanceof URL?e.protocol===`data:`?computeStringByteLength(e.href):null:typeof e==`string`?e.startsWith(`data:`)?computeStringByteLength(e):SCHEME_PREFIX.test(e)?null:estimateBase64ByteLength(e):null}function readStringData(e){if(e.startsWith(`data:`))return decodeDataUrl(e);if(SCHEME_PREFIX.test(e)){if(hasInternalRefScheme(e))return UNREADABLE;let t=URL.parse(e);return t===null?UNREADABLE:{kind:`link`,url:t}}return{bytes:Buffer.from(e,`base64`),kind:`bytes`}}function isProviderReference(e){let t=Object.values(e);return t.length>0&&t.every(e=>typeof e==`string`)}function decodeDataUrl(e){let t=e.indexOf(`,`);if(t===-1)return UNREADABLE;let n=e.slice(5,t),r=e.slice(t+1);if(n.endsWith(`;base64`))return{bytes:Buffer.from(r,`base64`),kind:`bytes`};try{return{bytes:Buffer.from(decodeURIComponent(r),`utf8`),kind:`bytes`}}catch{return UNREADABLE}}function computeStringByteLength(e){let t=e.indexOf(`,`);if(t===-1)return null;let n=e.slice(5,t),r=e.slice(t+1);if(n.endsWith(`;base64`))return estimateBase64ByteLength(r);try{return Buffer.byteLength(decodeURIComponent(r),`utf8`)}catch{return Buffer.byteLength(r,`utf8`)}}function estimateBase64ByteLength(e){let t=e.trimEnd();if(t.length===0)return 0;let n=0;return t.endsWith(`==`)?n=2:t.endsWith(`=`)&&(n=1),Math.max(0,Math.floor(t.length*3/4)-n)}export{getKnownByteLength,isUnresolvedFileData,readFileData};
@@ -20,8 +20,8 @@ interface EveAttachmentErrorInput {
20
20
  readonly cause?: unknown;
21
21
  }
22
22
  /**
23
- * Error surfaced when an attachment resolver fails to produce bytes for
24
- * an {@link AttachmentRef}.
23
+ * Error surfaced when a channel's `fetchFile` fails to produce bytes for an
24
+ * attachment URL.
25
25
  *
26
26
  * Channels can inspect the `.kind` discriminator to decide whether to
27
27
  * drop the attachment and continue the turn (the default posture for
@@ -18,6 +18,21 @@ export declare function readMediaMetadata(bytes: Uint8Array, mediaType: string):
18
18
  * base64 text, which is how text-only providers receive it.
19
19
  */
20
20
  export declare function estimateMediaTokens(metadata: MediaMetadata): number;
21
+ /**
22
+ * The media type a staged file carries: the format its bytes prove for an
23
+ * image, PDF, or untyped file, or the declared type otherwise. A declared
24
+ * PNG, JPEG, GIF, WebP, or PDF that the bytes don't confirm becomes
25
+ * `application/octet-stream`, so no provider receives bytes it would reject.
26
+ */
27
+ export declare function verifyMediaType(bytes: Uint8Array, declared: string): string;
28
+ /** The image formats eve can verify from bytes, and that every major provider reads. */
29
+ export declare const INLINE_IMAGE_MEDIA_TYPES: ReadonlySet<string>;
30
+ /**
31
+ * Whether the bytes start with a PDF header. The format allows leading bytes,
32
+ * but providers expect the header first, and a match deeper in would mark text
33
+ * that only mentions it.
34
+ */
35
+ export declare function hasPdfHeader(bytes: Uint8Array): boolean;
21
36
  /** Names the PNG, GIF, JPEG, or WebP format its leading bytes identify. */
22
37
  export declare function detectImageMediaType(bytes: Uint8Array): string | undefined;
23
38
  /** Reads PNG, GIF, JPEG, or WebP dimensions from the leading bytes. */
@@ -1 +1 @@
1
- const MAX_IMAGE_TOKENS=4784;function readMediaMetadata(e,t){let n={mediaType:t,size:e.byteLength};if(t.startsWith(`image/`)){let t=readImageDimensions(e);return t===void 0?n:{...n,...t}}if(t===`application/pdf`){let t=countPdfPages(e);return t===void 0?n:{...n,pages:t}}return n}function estimateMediaTokens(e){if(e.mediaType.startsWith(`image/`)){if(e.width===void 0||e.height===void 0)return MAX_IMAGE_TOKENS;let t=Math.ceil(e.width/28)*Math.ceil(e.height/28);return Math.min(t,MAX_IMAGE_TOKENS)}return e.mediaType===`application/pdf`&&e.pages!==void 0?e.pages*3e3:Math.ceil(e.size/3)}function detectImageMediaType(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),ascii=(t,n)=>readAscii(e,t,n);if(e.byteLength>=8&&t.getUint32(0)===2303741511&&t.getUint32(4)===218765834)return`image/png`;if(e.byteLength>=3&&t.getUint16(0)===65496&&e[2]===255)return`image/jpeg`;if(ascii(0,6)===`GIF87a`||ascii(0,6)===`GIF89a`)return`image/gif`;if(ascii(0,4)===`RIFF`&&ascii(8,12)===`WEBP`)return`image/webp`}function readImageDimensions(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),ascii=(t,n)=>readAscii(e,t,n);if(e.byteLength>=24&&t.getUint32(0)===2303741511)return dimensions(t.getUint32(16),t.getUint32(20));if(e.byteLength>=10&&ascii(0,4)===`GIF8`)return dimensions(t.getUint16(6,!0),t.getUint16(8,!0));if(e.byteLength>=4&&t.getUint16(0)===65496)return readJpegDimensions(e,t);if(e.byteLength>=30&&ascii(0,4)===`RIFF`&&ascii(8,12)===`WEBP`){let n=ascii(12,16);if(n===`VP8 `)return dimensions(t.getUint16(26,!0)&16383,t.getUint16(28,!0)&16383);if(n===`VP8L`){let e=t.getUint32(21,!0);return dimensions((e&16383)+1,(e>>>14&16383)+1)}if(n===`VP8X`)return dimensions(readUint24(e,24)+1,readUint24(e,27)+1)}}function readJpegDimensions(e,t){let n=2;for(;n+9<e.byteLength;){if(e[n]!==255)return;let r=e[n+1];if(r===255){n+=1;continue}if(r>=192&&r<=207&&r!==196&&r!==200&&r!==204)return dimensions(t.getUint16(n+7),t.getUint16(n+5));n+=2+t.getUint16(n+2)}}function countPdfPages(e){let t=Buffer.from(e.buffer,e.byteOffset,e.byteLength).toString(`latin1`).match(/\/Type\s*\/Page(?![A-Za-z])/g)?.length??0;return t>0?t:void 0}function readAscii(e,t,n){return String.fromCharCode(...e.subarray(t,Math.min(n,e.byteLength)))}function readUint24(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16}function dimensions(e,t){return e>0&&t>0?{height:t,width:e}:void 0}export{detectImageMediaType,estimateMediaTokens,readImageDimensions,readMediaMetadata};
1
+ const MAX_IMAGE_TOKENS=4784;function readMediaMetadata(e,t){let n={mediaType:t,size:e.byteLength};if(t.startsWith(`image/`)){let t=readImageDimensions(e);return t===void 0?n:{...n,...t}}if(t===`application/pdf`){let t=countPdfPages(e);return t===void 0?n:{...n,pages:t}}return n}function estimateMediaTokens(e){if(e.mediaType.startsWith(`image/`)){if(e.width===void 0||e.height===void 0)return MAX_IMAGE_TOKENS;let t=Math.ceil(e.width/28)*Math.ceil(e.height/28);return Math.min(t,MAX_IMAGE_TOKENS)}return e.mediaType===`application/pdf`&&e.pages!==void 0?e.pages*3e3:Math.ceil(e.size/3)}const GENERIC_MEDIA_TYPE=`application/octet-stream`,PDF_MEDIA_TYPE=`application/pdf`;function verifyMediaType(e,t){let n=t.toLowerCase();if(!(n.startsWith(`image/`)||n===PDF_MEDIA_TYPE||n===GENERIC_MEDIA_TYPE))return t;let r=detectImageMediaType(e)??(hasPdfHeader(e)?PDF_MEDIA_TYPE:void 0);return r===void 0?VERIFIABLE_MEDIA_TYPES.has(n)?GENERIC_MEDIA_TYPE:t:r}const INLINE_IMAGE_MEDIA_TYPES=new Set([`image/gif`,`image/jpeg`,`image/png`,`image/webp`]),VERIFIABLE_MEDIA_TYPES=new Set([...INLINE_IMAGE_MEDIA_TYPES,`image/jpg`,PDF_MEDIA_TYPE]);function hasPdfHeader(e){return readAscii(e,0,5)===`%PDF-`}function detectImageMediaType(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),ascii=(t,n)=>readAscii(e,t,n);if(e.byteLength>=8&&t.getUint32(0)===2303741511&&t.getUint32(4)===218765834)return`image/png`;if(e.byteLength>=3&&t.getUint16(0)===65496&&e[2]===255)return`image/jpeg`;if(ascii(0,6)===`GIF87a`||ascii(0,6)===`GIF89a`)return`image/gif`;if(ascii(0,4)===`RIFF`&&ascii(8,12)===`WEBP`)return`image/webp`}function readImageDimensions(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),ascii=(t,n)=>readAscii(e,t,n);if(e.byteLength>=24&&t.getUint32(0)===2303741511)return dimensions(t.getUint32(16),t.getUint32(20));if(e.byteLength>=10&&ascii(0,4)===`GIF8`)return dimensions(t.getUint16(6,!0),t.getUint16(8,!0));if(e.byteLength>=4&&t.getUint16(0)===65496)return readJpegDimensions(e,t);if(e.byteLength>=30&&ascii(0,4)===`RIFF`&&ascii(8,12)===`WEBP`){let n=ascii(12,16);if(n===`VP8 `)return dimensions(t.getUint16(26,!0)&16383,t.getUint16(28,!0)&16383);if(n===`VP8L`){let e=t.getUint32(21,!0);return dimensions((e&16383)+1,(e>>>14&16383)+1)}if(n===`VP8X`)return dimensions(readUint24(e,24)+1,readUint24(e,27)+1)}}function readJpegDimensions(e,t){let n=2;for(;n+9<e.byteLength;){if(e[n]!==255)return;let r=e[n+1];if(r===255){n+=1;continue}if(r>=192&&r<=207&&r!==196&&r!==200&&r!==204)return dimensions(t.getUint16(n+7),t.getUint16(n+5));n+=2+t.getUint16(n+2)}}function countPdfPages(e){let t=Buffer.from(e.buffer,e.byteOffset,e.byteLength).toString(`latin1`).match(/\/Type\s*\/Page(?![A-Za-z])/g)?.length??0;return t>0?t:void 0}function readAscii(e,t,n){return String.fromCharCode(...e.subarray(t,Math.min(n,e.byteLength)))}function readUint24(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16}function dimensions(e,t){return e>0&&t>0?{height:t,width:e}:void 0}export{INLINE_IMAGE_MEDIA_TYPES,detectImageMediaType,estimateMediaTokens,hasPdfHeader,readImageDimensions,readMediaMetadata,verifyMediaType};
@@ -0,0 +1,5 @@
1
+ import type { FetchFileResult } from "#channel/adapter.js";
2
+ /** Downloads one message's unclaimed links: at most {@link MAX_DOWNLOADS_PER_MESSAGE}, one at a time. */
3
+ export type PublicDownloads = (url: URL, adapterKind: string) => Promise<FetchFileResult>;
4
+ /** Starts the download budget for one message's attachments, each capped at `maxBytes`. */
5
+ export declare function createPublicDownloads(maxBytes: number): PublicDownloads;
@@ -0,0 +1 @@
1
+ import{requestPublicUrl}from"#execution/web-fetch/request.js";import{EveAttachmentError}from"#internal/attachments/errors.js";const GENERIC_MEDIA_TYPES=new Set([`application/octet-stream`,`binary/octet-stream`]);function createPublicDownloads(e){let t=0,n=Promise.resolve();return async(r,i)=>{if(r.protocol===`https:`&&++t>10)throw refusal(i,`eve downloads at most 10 links per message.`);let a=n.then(()=>fetchPublicAttachment(r,i,e));return n=a.catch(()=>void 0),await a}}async function fetchPublicAttachment(e,t,n){if(e.protocol!==`https:`)throw refusal(t,`eve downloads only public https:// links.`);let r;try{r=await requestPublicUrl(e.href,{headers:{},maxResponseSize:n,signal:AbortSignal.timeout(3e4)})}catch(e){throw refusal(t,`The link could not be downloaded.`,e)}if(!r.ok)throw refusal(t,`The link returned HTTP ${r.status}.`);let i=r.headers.get(`content-type`)?.split(`;`,1)[0]?.trim().toLowerCase();if(i===`text/html`)throw refusal(t,`The link returned a web page instead of a file.`);let a=Buffer.from(await r.arrayBuffer());return i===void 0||i===``||GENERIC_MEDIA_TYPES.has(i)?{bytes:a}:{bytes:a,mediaType:i}}function refusal(e,t,n){return new EveAttachmentError({adapterKind:e,cause:n,kind:`resolver-threw`,message:t})}export{createPublicDownloads};
@@ -8,7 +8,7 @@
8
8
  * eve-sandbox:?path=<urlencoded-resolved-path>&size=<bytes>&type=<mediaType>[&width=&height=][&pages=]
9
9
  * ```
10
10
  */
11
- import type { MediaMetadata } from "#internal/attachments/media-metadata.js";
11
+ import { type MediaMetadata } from "#internal/attachments/media-metadata.js";
12
12
  /**
13
13
  * Custom URL scheme used by every sandbox-resident attachment ref. The
14
14
  * trailing colon is part of the scheme per WHATWG URL semantics.
@@ -34,10 +34,11 @@ export declare function encodeSandboxRef(ref: SandboxRef): URL;
34
34
  */
35
35
  export declare function decodeSandboxRef(value: URL | string): SandboxRef;
36
36
  /**
37
- * Whether an inbound attachment ref reaches the model as bytes rather than a
38
- * text reference. Only shapes every major provider reads natively qualify:
39
- * images up to 3 MiB and PDFs up to 20 MiB. Pure in the ref, so a message
40
- * renders the same way on every model call.
37
+ * Whether an attachment ref reaches the model as bytes as well as its label.
38
+ * Only shapes every major provider reads natively qualify: PNG, JPEG, GIF,
39
+ * and WebP images up to 3 MiB and 8000 px per side, and PDFs up to 20 MiB.
40
+ * Staging verifies these media types from the bytes. Pure in the ref, so a
41
+ * message renders the same way on every model call.
41
42
  */
42
43
  export declare function inlinesSandboxRefAsBytes(ref: SandboxRef): boolean;
43
44
  /**
@@ -46,6 +47,6 @@ export declare function inlinesSandboxRefAsBytes(ref: SandboxRef): boolean;
46
47
  * Accepts `URL` instances with the `eve-sandbox:` scheme. Strings are
47
48
  * NOT accepted — the staging and hydration layers only inspect
48
49
  * URL-instance `FilePart.data` values, matching the existing
49
- * `data instanceof URL` branch in `fileDataToBytes`.
50
+ * `data instanceof URL` branch in `readFileData`.
50
51
  */
51
52
  export declare function isSandboxRefUrl(value: unknown): value is URL;
@@ -1 +1 @@
1
- const SANDBOX_URL_SCHEME=`eve-sandbox:`,PATH_QUERY_KEY=`path`,SIZE_QUERY_KEY=`size`,TYPE_QUERY_KEY=`type`,METADATA_QUERY_KEYS=[`width`,`height`,`pages`];function isValidSize(e){return Number.isFinite(e)&&Number.isInteger(e)&&e>=0}function encodeSandboxRef(e){if(typeof e.path!=`string`||e.path.length===0)throw RangeError(`SandboxRef.path must be a non-empty string.`);if(!isValidSize(e.size))throw RangeError(`SandboxRef.size must be a non-negative integer. Received: ${String(e.size)}.`);if(typeof e.mediaType!=`string`||e.mediaType.length===0)throw RangeError(`SandboxRef.mediaType must be a non-empty string.`);let t=new URL(SANDBOX_URL_SCHEME);t.searchParams.set(PATH_QUERY_KEY,e.path),t.searchParams.set(SIZE_QUERY_KEY,String(e.size)),t.searchParams.set(TYPE_QUERY_KEY,e.mediaType);for(let n of METADATA_QUERY_KEYS){let r=e[n];r!==void 0&&isValidSize(r)&&t.searchParams.set(n,String(r))}return t}function decodeSandboxRef(e){let t=e instanceof URL?e:new URL(e);if(t.protocol!==`eve-sandbox:`)throw Error(`SandboxRef URL must use scheme "${SANDBOX_URL_SCHEME}". Got: "${t.protocol}".`);let n=t.searchParams.get(PATH_QUERY_KEY);if(n===null||n===``)throw Error(`SandboxRef URL is missing the required "path" query param.`);let r=t.searchParams.get(SIZE_QUERY_KEY);if(r===null||r===``)throw Error(`SandboxRef URL is missing the required "size" query param.`);let i=Number(r);if(!isValidSize(i))throw Error(`SandboxRef URL "size" must be a non-negative integer. Got: ${JSON.stringify(r)}.`);let a=t.searchParams.get(TYPE_QUERY_KEY);if(a===null||a===``)throw Error(`SandboxRef URL is missing the required "type" query param.`);let o={mediaType:a,path:n,size:i};for(let e of METADATA_QUERY_KEYS){let n=Number(t.searchParams.get(e)??NaN);isValidSize(n)&&n>0&&(o[e]=n)}return o}function inlinesSandboxRefAsBytes(e){return e.mediaType.startsWith(`image/`)?e.size<=3145728:e.mediaType===`application/pdf`&&e.size<=20971520}function isSandboxRefUrl(e){return e instanceof URL&&e.protocol===`eve-sandbox:`}export{SANDBOX_URL_SCHEME,decodeSandboxRef,encodeSandboxRef,inlinesSandboxRefAsBytes,isSandboxRefUrl};
1
+ import{INLINE_IMAGE_MEDIA_TYPES}from"#internal/attachments/media-metadata.js";const SANDBOX_URL_SCHEME=`eve-sandbox:`,PATH_QUERY_KEY=`path`,SIZE_QUERY_KEY=`size`,TYPE_QUERY_KEY=`type`,METADATA_QUERY_KEYS=[`width`,`height`,`pages`],INLINE_IMAGE_MAX_SIDE_PX=8e3;function isValidSize(e){return Number.isFinite(e)&&Number.isInteger(e)&&e>=0}function encodeSandboxRef(e){if(typeof e.path!=`string`||e.path.length===0)throw RangeError(`SandboxRef.path must be a non-empty string.`);if(!isValidSize(e.size))throw RangeError(`SandboxRef.size must be a non-negative integer. Received: ${String(e.size)}.`);if(typeof e.mediaType!=`string`||e.mediaType.length===0)throw RangeError(`SandboxRef.mediaType must be a non-empty string.`);let t=new URL(SANDBOX_URL_SCHEME);t.searchParams.set(PATH_QUERY_KEY,e.path),t.searchParams.set(SIZE_QUERY_KEY,String(e.size)),t.searchParams.set(TYPE_QUERY_KEY,e.mediaType);for(let n of METADATA_QUERY_KEYS){let r=e[n];r!==void 0&&isValidSize(r)&&t.searchParams.set(n,String(r))}return t}function decodeSandboxRef(e){let t=e instanceof URL?e:new URL(e);if(t.protocol!==`eve-sandbox:`)throw Error(`SandboxRef URL must use scheme "${SANDBOX_URL_SCHEME}". Got: "${t.protocol}".`);let n=t.searchParams.get(PATH_QUERY_KEY);if(n===null||n===``)throw Error(`SandboxRef URL is missing the required "path" query param.`);let r=t.searchParams.get(SIZE_QUERY_KEY);if(r===null||r===``)throw Error(`SandboxRef URL is missing the required "size" query param.`);let i=Number(r);if(!isValidSize(i))throw Error(`SandboxRef URL "size" must be a non-negative integer. Got: ${JSON.stringify(r)}.`);let a=t.searchParams.get(TYPE_QUERY_KEY);if(a===null||a===``)throw Error(`SandboxRef URL is missing the required "type" query param.`);let o={mediaType:a,path:n,size:i};for(let e of METADATA_QUERY_KEYS){let n=Number(t.searchParams.get(e)??NaN);isValidSize(n)&&n>0&&(o[e]=n)}return o}function inlinesSandboxRefAsBytes(e){return INLINE_IMAGE_MEDIA_TYPES.has(e.mediaType)?e.size<=3145728&&(e.width??0)<=INLINE_IMAGE_MAX_SIDE_PX&&(e.height??0)<=INLINE_IMAGE_MAX_SIDE_PX:e.mediaType===`application/pdf`&&e.size<=20971520}function isSandboxRefUrl(e){return e instanceof URL&&e.protocol===`eve-sandbox:`}export{SANDBOX_URL_SCHEME,decodeSandboxRef,encodeSandboxRef,inlinesSandboxRefAsBytes,isSandboxRefUrl};
@@ -1 +1 @@
1
- import{SANDBOX_URL_SCHEME}from"#internal/attachments/sandbox-refs.js";import{ATTACHMENT_REF_SCHEME}from"#internal/attachments/refs.js";const EVE_URL_SCHEME=`eve-url:`;function serializeUrlFilePart(e){return`${EVE_URL_SCHEME}${e.href}`}function isSerializedUrlFilePart(e){return typeof e==`string`&&e.startsWith(EVE_URL_SCHEME)}function deserializeUrlFilePart(e){return new URL(e.slice(8))}const INTERNAL_REF_SCHEMES=[EVE_URL_SCHEME,SANDBOX_URL_SCHEME,ATTACHMENT_REF_SCHEME];function hasInternalRefScheme(e){return INTERNAL_REF_SCHEMES.some(t=>e.startsWith(t))}export{deserializeUrlFilePart,hasInternalRefScheme,isSerializedUrlFilePart,serializeUrlFilePart};
1
+ import{SANDBOX_URL_SCHEME}from"#internal/attachments/sandbox-refs.js";const EVE_URL_SCHEME=`eve-url:`;function serializeUrlFilePart(e){return`${EVE_URL_SCHEME}${e.href}`}function isSerializedUrlFilePart(e){return typeof e==`string`&&e.startsWith(EVE_URL_SCHEME)}function deserializeUrlFilePart(e){return new URL(e.slice(8))}const INTERNAL_REF_SCHEMES=[EVE_URL_SCHEME,SANDBOX_URL_SCHEME];function hasInternalRefScheme(e){return INTERNAL_REF_SCHEMES.some(t=>e.startsWith(t))}export{deserializeUrlFilePart,hasInternalRefScheme,isSerializedUrlFilePart,serializeUrlFilePart};
@@ -594,6 +594,12 @@ export interface TurnFailedStreamEvent {
594
594
  details?: JsonObject;
595
595
  message: string;
596
596
  sequence: number;
597
+ /**
598
+ * `true` when the failure ends the session and `session.failed` follows;
599
+ * `false` when `session.waiting` follows and the next message can retry.
600
+ * Absent on events from eve versions before it was added.
601
+ */
602
+ terminal?: boolean;
597
603
  turnId: string;
598
604
  };
599
605
  type: "turn.failed";
@@ -1065,6 +1071,7 @@ export declare function createTurnFailedEvent(input: {
1065
1071
  readonly details?: JsonObject;
1066
1072
  readonly message: string;
1067
1073
  readonly sequence: number;
1074
+ readonly terminal: boolean;
1068
1075
  readonly turnId: string;
1069
1076
  }): TurnFailedStreamEvent;
1070
1077
  /** Creates the `turn.cancelled` event for one cancelled turn. */
@@ -1,2 +1,2 @@
1
- import{deserializeUrlFilePart,hasInternalRefScheme,isSerializedUrlFilePart}from"#internal/attachments/url-refs.js";import{createEveSessionStreamRoutePath,createEveSubagentStreamRoutePath}from"#protocol/routes.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=`26`,EVE_STREAM_CONTROL_VERSION=`1`,EVE_STREAM_CONTROL_VERSION_QUERY=`streamControlVersion`,EVE_STREAM_LEASE_ENDED_CONTROL={$eve:`stream.lease-ended`,version:1},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?.predecessor!==void 0&&(t.predecessor=e.predecessor),e?.runtime!==void 0&&(t.runtime=e.runtime),e?.trace!==void 0&&(t.trace=e.trace),{data:t,type:`session.started`}}function createTurnStartedEvent(e){let t={sequence:e.sequence,turnId:e.turnId};return e.trace!==void 0&&(t.trace=e.trace),{data:t,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 t=deserializeUrlFilePart(e);return isClientResolvableUrl(t)?{url:t.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,...optionalPresentation(e.presentation),sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`actions.requested`}}function optionalPresentation(e){return e===void 0?{}:{presentation:e}}function createActionInputAppendedEvent(e){return{data:{callId:e.callId,inputTextDelta:e.inputTextDelta,sequence:e.sequence,stepIndex:e.stepIndex,toolName:e.toolName,turnId:e.turnId},type:`action.input.appended`}}function createAuthorizationRequiredEvent(e){let t={description:e.description,name:e.name,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.attemptId!==void 0&&(t.attemptId=e.attemptId),e.authorization!==void 0&&(t.authorization=e.authorization),e.candidateId!==void 0&&(t.candidateId=e.candidateId),e.principalId!==void 0&&(t.principalId=e.principalId),e.webhookUrl!==void 0&&(t.webhookUrl=e.webhookUrl),e.taskId!==void 0&&(t.taskId=e.taskId),{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.attemptId!==void 0&&(t.attemptId=e.attemptId),e.authorization!==void 0&&(t.authorization=e.authorization),e.candidateId!==void 0&&(t.candidateId=e.candidateId),e.principalId!==void 0&&(t.principalId=e.principalId),e.reason!==void 0&&(t.reason=e.reason),e.taskId!==void 0&&(t.taskId=e.taskId),{data:t,type:`authorization.completed`}}function createApprovalCandidateEvent(e){return{data:e,type:`approval.candidate`}}function createApprovalSettledEvent(e){return{data:e,type:`approval.settled`}}function createInputRequestedEvent(e){let t={requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.callId!==void 0&&(t.callId=e.callId),e.taskId!==void 0&&(t.taskId=e.taskId),{data:t,type:`input.requested`}}function createInputResolvedEvent(e){return{data:{resolutions:e.resolutions,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`input.resolved`}}function createActionResultEvent(e){let t=e.rejected===!0?{error:buildActionResultError(e.result),status:`rejected`}:normalizeActionResultOutcome(e.result);return{data:{error:t.error,...optionalPresentation(e.presentation),result:e.result,sequence:e.sequence,status:t.status,stepIndex:e.stepIndex,turnId:e.turnId},type:`action.result`}}function createActionPartialEvent(e){return{data:{...optionalPresentation(e.presentation),result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`action.partial`}}function createTaskStartedEvent(e){return{data:{callId:e.callId,kind:e.kind,name:e.name,taskId:e.taskId,turnId:e.turnId},type:`task.started`}}function createTaskSettledEvent(e){let t={callId:e.callId,...e.kind!==void 0&&{kind:e.kind},...e.name!==void 0&&{name:e.name},status:e.status,taskId:e.taskId,turnId:e.turnId};return e.output!==void 0&&(t.output=e.output),e.error!==void 0&&(t.error=e.error),e.cancel!==void 0&&(t.cancel=e.cancel),{data:t,type:`task.settled`}}function createAgentStartedEvent(e){let t={callId:e.callId,turnId:e.turnId,name:e.name,sessionId:e.sessionId,streamPath:createEveSessionStreamRoutePath(e.sessionId)};return e.taskId!==void 0&&(t.taskId=e.taskId),e.remote!==void 0&&(t.remote=e.remote,t.streamPath=createEveSubagentStreamRoutePath({callId:e.callId,childSessionId:e.sessionId,parentSessionId:e.parentSessionId})),{data:t,type:`agent.started`}}function createMessageAppendedEvent(e){return{data:{messageDelta:e.messageDelta,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.appended`}}function createReasoningAppendedEvent(e){return{data:{reasoningDelta:e.reasoningDelta,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:{modelId:e.modelId,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 createTurnWaitingEvent(e){return{data:{on:e.on,sequence:e.sequence,turnId:e.turnId,...e.usage!==void 0&&{usage:e.usage}},type:`turn.waiting`}}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 createContextClearedEvent(e){return{data:{sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId},type:`context.cleared`}}function createCompactionRequestedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,stepIndex:e.stepIndex,turnId:e.turnId,usageInputTokens:e.usageInputTokens??null},type:`compaction.requested`}}function createCompactionCompletedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,stepIndex:e.stepIndex,turnId:e.turnId},type:`compaction.completed`}}function createSessionWaitingEvent(e){return{data:{continuationToken:``,...e!==void 0&&{usage:e},wait:`next-user-message`},type:`session.waiting`}}function createSessionFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sessionId:e.sessionId,...e.usage!==void 0&&{usage:e.usage}},type:`session.failed`}}function createSessionCompletedEvent(e){return e===void 0?{type:`session.completed`}:{data:{usage:e},type:`session.completed`}}function stampMessageStreamEvent(e,t){let n={at:new Date().toISOString(),id:createEventId()};return t!==void 0&&t.length>0&&(n.deliveryIds=t),{...e,meta:n}}function encodeMessageStreamEvent(e){return textEncoder.encode(`${JSON.stringify(e)}\n`)}function normalizeActionResultOutcome(e){let t=readActionResultOutputError(e.output);return e.isError===!0?{error:buildActionResultError(e),status:`failed`}: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_CONTROL_VERSION,EVE_STREAM_CONTROL_VERSION_QUERY,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_LEASE_ENDED_CONTROL,EVE_STREAM_TAIL_INDEX_HEADER,EVE_STREAM_VERSION_HEADER,createActionInputAppendedEvent,createActionPartialEvent,createActionResultEvent,createActionsRequestedEvent,createAgentStartedEvent,createApprovalCandidateEvent,createApprovalSettledEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createContextClearedEvent,createInputRequestedEvent,createInputResolvedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepCompletedEvent,createStepFailedEvent,createStepStartedEvent,createTaskSettledEvent,createTaskStartedEvent,createTurnCancelledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,createTurnWaitingEvent,encodeMessageStreamEvent,isCurrentTurnBoundaryEvent,isTurnFailureEvent,stampMessageStreamEvent};
1
+ import{deserializeUrlFilePart,hasInternalRefScheme,isSerializedUrlFilePart}from"#internal/attachments/url-refs.js";import{createEveSessionStreamRoutePath,createEveSubagentStreamRoutePath}from"#protocol/routes.js";import{decodeSandboxRef,isSandboxRefUrl}from"#internal/attachments/sandbox-refs.js";import{getKnownByteLength}from"#internal/attachments/data.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=`26`,EVE_STREAM_CONTROL_VERSION=`1`,EVE_STREAM_CONTROL_VERSION_QUERY=`streamControlVersion`,EVE_STREAM_LEASE_ENDED_CONTROL={$eve:`stream.lease-ended`,version:1},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?.predecessor!==void 0&&(t.predecessor=e.predecessor),e?.runtime!==void 0&&(t.runtime=e.runtime),e?.trace!==void 0&&(t.trace=e.trace),{data:t,type:`session.started`}}function createTurnStartedEvent(e){let t={sequence:e.sequence,turnId:e.turnId};return e.trace!==void 0&&(t.trace=e.trace),{data:t,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=clientUrlFragment(e);if(i.url!==void 0)return createProjectedFilePart({filename:n,mediaType:t,...i});let a=getKnownByteLength(e);return createProjectedFilePart(a===null?{filename:n,mediaType:t}:{filename:n,mediaType:t,size:a})}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 t=deserializeUrlFilePart(e);return isClientResolvableUrl(t)?{url:t.href}:{}}catch{return{}}if(e instanceof URL)return isClientResolvableUrl(e)?{url:e.href}:{};if(typeof e!=`string`||hasInternalRefScheme(e))return{};try{let t=new URL(e);return isClientResolvableUrl(t)?{url:t.href}:{}}catch{return{}}}function isClientResolvableUrl(e){return e.protocol===`http:`||e.protocol===`https:`}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,...optionalPresentation(e.presentation),sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`actions.requested`}}function optionalPresentation(e){return e===void 0?{}:{presentation:e}}function createActionInputAppendedEvent(e){return{data:{callId:e.callId,inputTextDelta:e.inputTextDelta,sequence:e.sequence,stepIndex:e.stepIndex,toolName:e.toolName,turnId:e.turnId},type:`action.input.appended`}}function createAuthorizationRequiredEvent(e){let t={description:e.description,name:e.name,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.attemptId!==void 0&&(t.attemptId=e.attemptId),e.authorization!==void 0&&(t.authorization=e.authorization),e.candidateId!==void 0&&(t.candidateId=e.candidateId),e.principalId!==void 0&&(t.principalId=e.principalId),e.webhookUrl!==void 0&&(t.webhookUrl=e.webhookUrl),e.taskId!==void 0&&(t.taskId=e.taskId),{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.attemptId!==void 0&&(t.attemptId=e.attemptId),e.authorization!==void 0&&(t.authorization=e.authorization),e.candidateId!==void 0&&(t.candidateId=e.candidateId),e.principalId!==void 0&&(t.principalId=e.principalId),e.reason!==void 0&&(t.reason=e.reason),e.taskId!==void 0&&(t.taskId=e.taskId),{data:t,type:`authorization.completed`}}function createApprovalCandidateEvent(e){return{data:e,type:`approval.candidate`}}function createApprovalSettledEvent(e){return{data:e,type:`approval.settled`}}function createInputRequestedEvent(e){let t={requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.callId!==void 0&&(t.callId=e.callId),e.taskId!==void 0&&(t.taskId=e.taskId),{data:t,type:`input.requested`}}function createInputResolvedEvent(e){return{data:{resolutions:e.resolutions,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`input.resolved`}}function createActionResultEvent(e){let t=e.rejected===!0?{error:buildActionResultError(e.result),status:`rejected`}:normalizeActionResultOutcome(e.result);return{data:{error:t.error,...optionalPresentation(e.presentation),result:e.result,sequence:e.sequence,status:t.status,stepIndex:e.stepIndex,turnId:e.turnId},type:`action.result`}}function createActionPartialEvent(e){return{data:{...optionalPresentation(e.presentation),result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`action.partial`}}function createTaskStartedEvent(e){return{data:{callId:e.callId,kind:e.kind,name:e.name,taskId:e.taskId,turnId:e.turnId},type:`task.started`}}function createTaskSettledEvent(e){let t={callId:e.callId,...e.kind!==void 0&&{kind:e.kind},...e.name!==void 0&&{name:e.name},status:e.status,taskId:e.taskId,turnId:e.turnId};return e.output!==void 0&&(t.output=e.output),e.error!==void 0&&(t.error=e.error),e.cancel!==void 0&&(t.cancel=e.cancel),{data:t,type:`task.settled`}}function createAgentStartedEvent(e){let t={callId:e.callId,turnId:e.turnId,name:e.name,sessionId:e.sessionId,streamPath:createEveSessionStreamRoutePath(e.sessionId)};return e.taskId!==void 0&&(t.taskId=e.taskId),e.remote!==void 0&&(t.remote=e.remote,t.streamPath=createEveSubagentStreamRoutePath({callId:e.callId,childSessionId:e.sessionId,parentSessionId:e.parentSessionId})),{data:t,type:`agent.started`}}function createMessageAppendedEvent(e){return{data:{messageDelta:e.messageDelta,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.appended`}}function createReasoningAppendedEvent(e){return{data:{reasoningDelta:e.reasoningDelta,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:{modelId:e.modelId,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 createTurnWaitingEvent(e){return{data:{on:e.on,sequence:e.sequence,turnId:e.turnId,...e.usage!==void 0&&{usage:e.usage}},type:`turn.waiting`}}function createTurnFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,terminal:e.terminal,turnId:e.turnId},type:`turn.failed`}}function createTurnCancelledEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.cancelled`}}function createContextClearedEvent(e){return{data:{sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId},type:`context.cleared`}}function createCompactionRequestedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,stepIndex:e.stepIndex,turnId:e.turnId,usageInputTokens:e.usageInputTokens??null},type:`compaction.requested`}}function createCompactionCompletedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,stepIndex:e.stepIndex,turnId:e.turnId},type:`compaction.completed`}}function createSessionWaitingEvent(e){return{data:{continuationToken:``,...e!==void 0&&{usage:e},wait:`next-user-message`},type:`session.waiting`}}function createSessionFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sessionId:e.sessionId,...e.usage!==void 0&&{usage:e.usage}},type:`session.failed`}}function createSessionCompletedEvent(e){return e===void 0?{type:`session.completed`}:{data:{usage:e},type:`session.completed`}}function stampMessageStreamEvent(e,t){let n={at:new Date().toISOString(),id:createEventId()};return t!==void 0&&t.length>0&&(n.deliveryIds=t),{...e,meta:n}}function encodeMessageStreamEvent(e){return textEncoder.encode(`${JSON.stringify(e)}\n`)}function normalizeActionResultOutcome(e){let t=readActionResultOutputError(e.output);return e.isError===!0?{error:buildActionResultError(e),status:`failed`}: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_CONTROL_VERSION,EVE_STREAM_CONTROL_VERSION_QUERY,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_LEASE_ENDED_CONTROL,EVE_STREAM_TAIL_INDEX_HEADER,EVE_STREAM_VERSION_HEADER,createActionInputAppendedEvent,createActionPartialEvent,createActionResultEvent,createActionsRequestedEvent,createAgentStartedEvent,createApprovalCandidateEvent,createApprovalSettledEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createContextClearedEvent,createInputRequestedEvent,createInputResolvedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepCompletedEvent,createStepFailedEvent,createStepStartedEvent,createTaskSettledEvent,createTaskStartedEvent,createTurnCancelledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,createTurnWaitingEvent,encodeMessageStreamEvent,isCurrentTurnBoundaryEvent,isTurnFailureEvent,stampMessageStreamEvent};
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Builds the error a channel's `fetchFile` throws to tell the model why one
3
+ * attachment didn't arrive. eve replaces the attachment with
4
+ * `Attachment <name> could not be retrieved: <message>`, continues the turn,
5
+ * and keeps `cause` in operator logs.
6
+ *
7
+ * The model reads `message` as written. Name what the person can act on, such
8
+ * as a size limit or a missing permission, and never include URLs, tokens, or
9
+ * upstream response text. Any other error from `fetchFile` reaches the model as
10
+ * a generic note.
11
+ */
12
+ export declare function attachmentError(message: string, options?: {
13
+ readonly cause?: unknown;
14
+ }): Error;
@@ -0,0 +1 @@
1
+ import{EveAttachmentError}from"#internal/attachments/errors.js";function attachmentError(e,t){return new EveAttachmentError({cause:t?.cause,kind:`resolver-threw`,message:e})}export{attachmentError};