eve 0.19.0 → 0.21.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 (206) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/src/channel/types.d.ts +9 -5
  3. package/dist/src/chunks/{use-eve-agent-Dvy_Wjvq.js → use-eve-agent-CM24ZUEI.js} +48 -34
  4. package/dist/src/chunks/{use-eve-agent-Bh1NmXO9.js → use-eve-agent-CxcKypLZ.js} +48 -34
  5. package/dist/src/cli/dev/tui/setup-selection-input.js +1 -1
  6. package/dist/src/cli/dev/tui/stream-format.d.ts +4 -0
  7. package/dist/src/cli/dev/tui/stream-format.js +1 -1
  8. package/dist/src/cli/dev/tui/terminal-renderer.js +1 -1
  9. package/dist/src/cli/dev/tui/test/mock-terminal.d.ts +2 -0
  10. package/dist/src/cli/dev/tui/test/mock-terminal.js +1 -1
  11. package/dist/src/client/index.d.ts +1 -1
  12. package/dist/src/client/message-reducer-types.d.ts +11 -3
  13. package/dist/src/client/message-reducer.js +1 -1
  14. package/dist/src/compiler/manifest.js +1 -1
  15. package/dist/src/compiler/normalize-agent-config.js +1 -1
  16. package/dist/src/compiler/workspace-resources.js +1 -1
  17. package/dist/src/context/build-base-tool-context.d.ts +9 -0
  18. package/dist/src/context/build-base-tool-context.js +1 -0
  19. package/dist/src/context/build-dynamic-tools.js +1 -1
  20. package/dist/src/context/dynamic-skill-lifecycle.js +1 -1
  21. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  22. package/dist/src/context/keys.d.ts +0 -1
  23. package/dist/src/context/keys.js +1 -1
  24. package/dist/src/discover/sandbox.d.ts +0 -6
  25. package/dist/src/discover/sandbox.js +1 -1
  26. package/dist/src/evals/cli/eval.js +4 -1
  27. package/dist/src/evals/runner/discover.d.ts +10 -0
  28. package/dist/src/evals/runner/discover.js +1 -1
  29. package/dist/src/execution/create-session-step.d.ts +2 -1
  30. package/dist/src/execution/create-session-step.js +1 -1
  31. package/dist/src/execution/delegated-parent-notification.d.ts +6 -0
  32. package/dist/src/execution/delegated-parent-notification.js +1 -1
  33. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  34. package/dist/src/execution/dispatch-workflow-runtime-actions-step.js +1 -1
  35. package/dist/src/execution/durable-session-migrations/turn-workflow.d.ts +2 -0
  36. package/dist/src/execution/durable-session-store.d.ts +1 -0
  37. package/dist/src/execution/next-driver-action.d.ts +3 -0
  38. package/dist/src/execution/node-step.d.ts +8 -0
  39. package/dist/src/execution/node-step.js +1 -1
  40. package/dist/src/execution/run-session-limits.d.ts +21 -0
  41. package/dist/src/execution/run-session-limits.js +1 -0
  42. package/dist/src/execution/runtime-context.js +1 -1
  43. package/dist/src/execution/sandbox/abort-bound-session.d.ts +6 -0
  44. package/dist/src/execution/sandbox/abort-bound-session.js +1 -0
  45. package/dist/src/execution/sandbox/active-handles.d.ts +29 -0
  46. package/dist/src/execution/sandbox/active-handles.js +1 -0
  47. package/dist/src/execution/sandbox/bindings/docker.d.ts +2 -2
  48. package/dist/src/execution/sandbox/bindings/docker.js +1 -1
  49. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
  50. package/dist/src/execution/sandbox/bindings/local-backend-utils.d.ts +1 -1
  51. package/dist/src/execution/sandbox/bindings/local-backend-utils.js +1 -1
  52. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -1
  53. package/dist/src/execution/sandbox/bindings/microsandbox-provider-state.d.ts +11 -0
  54. package/dist/src/execution/sandbox/bindings/microsandbox-provider-state.js +1 -0
  55. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.d.ts +7 -4
  56. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -1
  57. package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
  58. package/dist/src/execution/sandbox/ensure.js +1 -1
  59. package/dist/src/execution/sandbox/prewarm.js +1 -1
  60. package/dist/src/execution/sandbox/require-sandbox.d.ts +3 -1
  61. package/dist/src/execution/sandbox/require-sandbox.js +1 -1
  62. package/dist/src/execution/session-callback-step.d.ts +6 -0
  63. package/dist/src/execution/session-callback-step.js +1 -1
  64. package/dist/src/execution/session.d.ts +14 -3
  65. package/dist/src/execution/session.js +2 -4
  66. package/dist/src/execution/skills/instructions.d.ts +8 -4
  67. package/dist/src/execution/skills/instructions.js +2 -2
  68. package/dist/src/execution/subagent-tool.d.ts +7 -0
  69. package/dist/src/execution/subagent-tool.js +1 -1
  70. package/dist/src/execution/subagent-usage-span.d.ts +9 -0
  71. package/dist/src/execution/subagent-usage-span.js +1 -0
  72. package/dist/src/execution/tool-auth.d.ts +2 -1
  73. package/dist/src/execution/tool-auth.js +1 -1
  74. package/dist/src/execution/turn-execution-cursor.d.ts +2 -0
  75. package/dist/src/execution/turn-workflow.js +1 -1
  76. package/dist/src/execution/web-fetch/tool.d.ts +6 -1
  77. package/dist/src/execution/web-fetch/tool.js +1 -1
  78. package/dist/src/execution/workflow-entry.d.ts +1 -0
  79. package/dist/src/execution/workflow-entry.js +1 -1
  80. package/dist/src/execution/workflow-runtime.js +1 -1
  81. package/dist/src/execution/workflow-skill-root.d.ts +6 -0
  82. package/dist/src/execution/workflow-skill-root.js +1 -0
  83. package/dist/src/execution/workflow-steps.d.ts +3 -0
  84. package/dist/src/execution/workflow-steps.js +1 -1
  85. package/dist/src/harness/advertised-tools.d.ts +1 -0
  86. package/dist/src/harness/advertised-tools.js +1 -1
  87. package/dist/src/harness/attachment-staging.js +1 -1
  88. package/dist/src/harness/compaction.d.ts +1 -1
  89. package/dist/src/harness/compaction.js +1 -1
  90. package/dist/src/harness/emission.js +1 -1
  91. package/dist/src/harness/execute-tool.d.ts +2 -1
  92. package/dist/src/harness/input-requests.d.ts +8 -0
  93. package/dist/src/harness/input-requests.js +1 -1
  94. package/dist/src/harness/model-call-error.js +1 -1
  95. package/dist/src/harness/runtime-actions.js +1 -1
  96. package/dist/src/harness/session-limit-continuation.d.ts +55 -0
  97. package/dist/src/harness/session-limit-continuation.js +1 -0
  98. package/dist/src/harness/session-limit-enforcement.d.ts +55 -0
  99. package/dist/src/harness/session-limit-enforcement.js +1 -0
  100. package/dist/src/harness/step-hooks.d.ts +1 -1
  101. package/dist/src/harness/step-hooks.js +1 -1
  102. package/dist/src/harness/subagent-depth.d.ts +1 -4
  103. package/dist/src/harness/subagent-depth.js +1 -1
  104. package/dist/src/harness/subagent-token-budget.d.ts +14 -0
  105. package/dist/src/harness/subagent-token-budget.js +1 -0
  106. package/dist/src/harness/tool-loop.js +1 -1
  107. package/dist/src/harness/tools.d.ts +2 -3
  108. package/dist/src/harness/tools.js +1 -1
  109. package/dist/src/harness/turn-cancellation.d.ts +8 -0
  110. package/dist/src/harness/turn-cancellation.js +1 -0
  111. package/dist/src/harness/turn-tag-state.d.ts +33 -0
  112. package/dist/src/harness/turn-tag-state.js +1 -1
  113. package/dist/src/harness/types.d.ts +23 -4
  114. package/dist/src/harness/workflow-sandbox.d.ts +1 -0
  115. package/dist/src/harness/workflow-sandbox.js +1 -1
  116. package/dist/src/harness/workflow-subagent-limit.d.ts +38 -0
  117. package/dist/src/harness/workflow-subagent-limit.js +1 -0
  118. package/dist/src/harness/workflow-tool-description.d.ts +6 -1
  119. package/dist/src/harness/workflow-tool-description.js +5 -3
  120. package/dist/src/internal/application/package.js +1 -1
  121. package/dist/src/internal/authored-definition/core.js +1 -1
  122. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  123. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  124. package/dist/src/internal/nitro/host/sandbox-shutdown-plugin.d.ts +40 -0
  125. package/dist/src/internal/nitro/host/sandbox-shutdown-plugin.js +1 -0
  126. package/dist/src/internal/nitro/host/start-production-server.js +1 -1
  127. package/dist/src/protocol/message.d.ts +31 -2
  128. package/dist/src/protocol/message.js +2 -2
  129. package/dist/src/public/channels/chat-sdk/chatSdkChannel.d.ts +34 -3
  130. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +2 -2
  131. package/dist/src/public/channels/chat-sdk/index.d.ts +2 -0
  132. package/dist/src/public/channels/chat-sdk/index.js +1 -1
  133. package/dist/src/public/channels/chat-sdk/messageToUserContent.d.ts +13 -0
  134. package/dist/src/public/channels/chat-sdk/messageToUserContent.js +1 -0
  135. package/dist/src/public/channels/chat-sdk/notImplemented.d.ts +7 -0
  136. package/dist/src/public/channels/chat-sdk/notImplemented.js +1 -0
  137. package/dist/src/public/channels/slack/api.d.ts +14 -12
  138. package/dist/src/public/channels/slack/api.js +1 -1
  139. package/dist/src/public/definitions/approval.d.ts +4 -1
  140. package/dist/src/public/definitions/tool.d.ts +44 -0
  141. package/dist/src/public/definitions/tool.js +1 -1
  142. package/dist/src/public/tools/index.d.ts +1 -1
  143. package/dist/src/public/tools/index.js +1 -1
  144. package/dist/src/public/tools/internal.d.ts +3 -2
  145. package/dist/src/public/tools/internal.js +1 -1
  146. package/dist/src/runtime/actions/types.d.ts +9 -0
  147. package/dist/src/runtime/actions/types.js +1 -1
  148. package/dist/src/runtime/agent/bootstrap.d.ts +2 -0
  149. package/dist/src/runtime/agent/bootstrap.js +1 -1
  150. package/dist/src/runtime/connections/mcp-client.d.ts +2 -2
  151. package/dist/src/runtime/connections/mcp-client.js +1 -1
  152. package/dist/src/runtime/connections/openapi-client.d.ts +2 -2
  153. package/dist/src/runtime/connections/openapi-client.js +1 -1
  154. package/dist/src/runtime/connections/types.d.ts +6 -1
  155. package/dist/src/runtime/framework-tools/bash.js +1 -1
  156. package/dist/src/runtime/framework-tools/connection-search-dynamic.js +1 -1
  157. package/dist/src/runtime/framework-tools/glob.js +1 -1
  158. package/dist/src/runtime/framework-tools/grep.js +1 -1
  159. package/dist/src/runtime/framework-tools/read-file.js +1 -1
  160. package/dist/src/runtime/framework-tools/web-fetch.js +1 -1
  161. package/dist/src/runtime/framework-tools/write-file.js +1 -1
  162. package/dist/src/runtime/resolve-agent.js +1 -1
  163. package/dist/src/runtime/sandbox/keys.js +1 -1
  164. package/dist/src/runtime/sandbox/template-plan.js +1 -1
  165. package/dist/src/runtime/session-callback-route.js +1 -1
  166. package/dist/src/runtime/skills/sandbox-access.d.ts +1 -1
  167. package/dist/src/runtime/skills/sandbox-access.js +1 -1
  168. package/dist/src/runtime/workspace/seed-files.js +1 -1
  169. package/dist/src/sandbox/state.d.ts +0 -1
  170. package/dist/src/setup/scaffold/create/project.js +1 -1
  171. package/dist/src/setup/scaffold/create/web-template.d.ts +2 -2
  172. package/dist/src/setup/scaffold/create/web-template.js +77 -3
  173. package/dist/src/shared/agent-definition.d.ts +31 -3
  174. package/dist/src/shared/dynamic-tool-definition.d.ts +4 -1
  175. package/dist/src/shared/sandbox-backend.d.ts +7 -1
  176. package/dist/src/shared/skill-package.d.ts +2 -2
  177. package/dist/src/shared/skill-package.js +1 -1
  178. package/dist/src/shared/skill-paths.d.ts +28 -0
  179. package/dist/src/shared/skill-paths.js +2 -0
  180. package/dist/src/shared/token-usage.d.ts +22 -0
  181. package/dist/src/shared/token-usage.js +1 -0
  182. package/dist/src/shared/tool-definition.d.ts +1 -1
  183. package/dist/src/svelte/index.js +1 -1
  184. package/dist/src/svelte/use-eve-agent.js +1 -1
  185. package/dist/src/vue/index.js +1 -1
  186. package/dist/src/vue/use-eve-agent.js +1 -1
  187. package/docs/agent-config.md +32 -15
  188. package/docs/channels/chat-sdk.mdx +209 -0
  189. package/docs/channels/meta.json +1 -0
  190. package/docs/concepts/context-control.md +2 -2
  191. package/docs/concepts/default-harness.md +10 -0
  192. package/docs/concepts/sessions-runs-and-streaming.md +1 -1
  193. package/docs/guides/client/messages.mdx +4 -0
  194. package/docs/guides/client/streaming.mdx +17 -12
  195. package/docs/guides/dynamic-workflows.md +87 -0
  196. package/docs/guides/frontend/overview.mdx +5 -1
  197. package/docs/guides/meta.json +1 -0
  198. package/docs/guides/remote-agents.md +1 -0
  199. package/docs/reference/project-layout.md +5 -4
  200. package/docs/reference/typescript-api.md +26 -26
  201. package/docs/sandbox.mdx +4 -2
  202. package/docs/skills.mdx +3 -1
  203. package/docs/subagents.mdx +2 -1
  204. package/docs/tools/human-in-the-loop.md +1 -1
  205. package/docs/tools/overview.mdx +2 -0
  206. package/package.json +1 -1
@@ -1 +1 @@
1
- import{resolvePackageSourceDirectoryPath,resolvePackageSourceFilePath,resolveWorkflowModulePath}from"#internal/application/package.js";import{dirname,isAbsolute,join,relative,resolve}from"node:path";import{readFile}from"node:fs/promises";import{resolveNitroBuildDirectory}from"#internal/application/paths.js";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";import{fileURLToPath}from"node:url";import{SERVER_EXTERNAL_PACKAGES}from"#internal/nitro/host/server-external-packages.js";import{createNitro}from"nitro/builder";import{prepareEveVersionedCacheDirectory,writeEveVersionedCacheMetadata}from"#internal/application/cache-metadata.js";import{captureDevLiveVirtualModules}from"#internal/nitro/host/dev-live-virtual-modules.js";import{createNitroArtifactsConfig}from"#internal/nitro/host/artifacts-config.js";import{createCompiledSandboxBackendPrunePlugin}from"#internal/nitro/host/compiled-sandbox-backend-prune-plugin.js";import{configureNitroRoutes}from"#internal/nitro/host/configure-nitro-routes.js";import{applyEveCronHandlerRoute}from"#internal/nitro/host/cron-handler-route.js";import{createNitroBundlerConfig}from"#internal/nitro/host/nitro-bundler-config.js";import{OPTIONAL_ENGINE_PACKAGES_BY_BACKEND_NAME,createOptionalEngineDependencyPlugin}from"#internal/nitro/host/optional-engine-dependency-plugin.js";import{addNitroRoutingImportSpecifierPlugin}from"#internal/nitro/host/nitro-routing-import-specifier-plugin.js";import{registerScheduleTaskHandlers}from"#internal/nitro/host/schedule-task-routes.js";import{createEveVercelOptions}from"#internal/nitro/host/vercel-build-output-config.js";import{applyWorkflowTransform}from"#internal/workflow-bundle/workflow-builders.js";import{transformDynamicToolExecute}from"#internal/workflow-bundle/dynamic-tool-transform.js";const WORKFLOW_ALIAS_SPECIFIERS=[`workflow`,`workflow/api`,`workflow/errors`,`workflow/internal/builtins`,`workflow/internal/private`,`workflow/runtime`],WORKFLOW_TRANSFORM_PATCHED=Symbol(`eve.workflow-transform-patched`),FRAMEWORK_HOSTED_EXTERNAL_PACKAGES=[`@napi-rs/keyring`],LOCAL_SANDBOX_BACKEND_NAMES=new Set([`docker`,...Object.keys(OPTIONAL_ENGINE_PACKAGES_BY_BACKEND_NAME)]);function resolveWorkflowAliases(){let e={};for(let t of WORKFLOW_ALIAS_SPECIFIERS)e[t]=resolveWorkflowModulePath(t);return e}function resolveNitroPreset(e){if(!e&&process.env.VERCEL)return`vercel`}function includesApplicationSurface(e){return e===`all`||e===`app`}function includesWorkflowSurface(e){return e===`all`||e===`flow`}function includesWorkflowStepRegistrations(e){return includesWorkflowSurface(e)}function manifestEnablesWorkflow(e){return[e,...e.subagents.map(e=>e.agent)].some(e=>e.workflowEnabled===!0)}function manifestHasWebSocketChannel(e){return e.channels.some(e=>e.kind===`channel`&&e.method===`WEBSOCKET`)}function resolveWorkflowStepEntrypointPath(e,t){return e.options.dev?join(e.options.buildDir,`workflow`,`steps.mjs`):join(t.workflowBuildDir,`steps.mjs`)}function collectHostedTraceDependencies(e,t){let n=[e.compileResult.manifest,...e.compileResult.manifest.subagents.map(e=>e.agent)].flatMap(e=>e.config.build?.externalDependencies??[]);return[...new Set([...FRAMEWORK_HOSTED_EXTERNAL_PACKAGES,...t,...SERVER_EXTERNAL_PACKAGES,...n])].filter(e=>e!==EVE_PACKAGE_NAME)}function collectConfiguredSandboxBackendNames(e){let t=[e,...e.subagents.map(e=>e.agent)];return new Set(t.map(e=>e.sandbox?.backendName).filter(e=>typeof e==`string`))}function shouldPruneLocalSandboxBackends(e){return e.preset===`vercel`&&![...e.configuredBackendNames].some(e=>LOCAL_SANDBOX_BACKEND_NAMES.has(e))}function createDevelopmentWatchOptions(e){if(e.length!==0)return{ignored:[e,join(e,`**`)]}}function normalizePath(e){return e.replaceAll(`\\`,`/`)}function stripPathQueryAndHash(e){let t=e.indexOf(`?`),n=e.indexOf(`#`),r=t===-1?n:n===-1?t:Math.min(t,n);return r===-1?e:e.slice(0,r)}function stripFileSystemPrefix(e){return e.startsWith(`/@fs/`)?e.slice(4):e}function resolveNitroModuleComparisonPath(e,t){return t.startsWith(`file://`)?normalizePath(stripFileSystemPrefix(stripPathQueryAndHash(fileURLToPath(t)))):isAbsolute(t)?normalizePath(stripFileSystemPrefix(stripPathQueryAndHash(t))):normalizePath(stripFileSystemPrefix(stripPathQueryAndHash(resolve(e,t))))}function isWorkflowBundlePath(e,t){let n=normalizePath(e);return n.startsWith(t)||n.includes(`/.eve/workflow-cache/`)}function normalizeStepTransformComparisonPath(e){let t=normalizePath(e);return process.platform===`win32`?t.toLowerCase():t}function parseImportedModuleSpecifiers(e){let t=/^\s*import\s+(?:.+?\s+from\s+)?["']([^"']+)["'];?\s*$/gm,n=[];for(let r of e.matchAll(t)){let e=r[1];e!==void 0&&n.push(e)}return n}function resolveNitroImportPath(e,t,i){return t.startsWith(`workflow`)?resolveWorkflowModulePath(t):t.startsWith(`.`)||t.startsWith(`/`)||t.startsWith(`file://`)?resolveNitroModuleComparisonPath(i===void 0?e:dirname(resolveNitroModuleComparisonPath(e,i)),t):null}async function collectNitroStepTransformTargets(e,t){let n=await readFile(e,`utf8`),r=new Set;for(let i of parseImportedModuleSpecifiers(n)){let n=resolveNitroImportPath(t,i,e);n!==null&&r.add(normalizeStepTransformComparisonPath(n))}return r}async function addNitroStepNoExternals(e,t){if(e.options.noExternals===!0)return;let n;try{n=await collectNitroStepTransformTargets(t,e.options.rootDir)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}let r=Array.isArray(e.options.noExternals)?[...e.options.noExternals]:[];e.options.noExternals=[...new Set([...r,...n])]}function createRelativeTransformFilename(e,t){let n=normalizePath(e).replace(/\/$/,``),r=normalizePath(t),i=n.toLowerCase(),a=r.toLowerCase();if(a.startsWith(`${i}/`))return r.slice(n.length+1);if(a===i)return`.`;let s=relative(n,r).replaceAll(`\\`,`/`);if(s.startsWith(`../`)&&(s=s.split(`/`).filter(e=>e!==`..`).join(`/`)),s.includes(`:`)||s.startsWith(`/`)){let e=r.split(`/`).pop();return e===void 0||e.length===0?`unknown.ts`:e}return s}function addWorkflowModuleSideEffectsPlugin(e,t){let n=[t,join(e.options.buildDir,`workflow`)].map(t=>resolveNitroModuleComparisonPath(e.options.rootDir,t));e.hooks.hook(`rollup:before`,(t,r)=>{Array.isArray(r.plugins)&&r.plugins.unshift({name:`eve:workflow-module-side-effects`,resolveId(t,r){let i=resolveNitroImportPath(e.options.rootDir,t,r)??resolveNitroModuleComparisonPath(e.options.rootDir,t);return n.some(e=>isWorkflowBundlePath(i,e))?{id:i,moduleSideEffects:`no-treeshake`}:null}})})}function addNitroStepModuleSideEffectsPlugin(e,t){let n=null,getStepTransformTargets=async()=>(n===null&&(n=await collectNitroStepTransformTargets(t.stepEntrypointPath,e.options.rootDir)),n);e.hooks.hook(`build:before`,()=>{n=null}),e.options.dev&&e.hooks.hook(`dev:reload`,()=>{n=null}),e.hooks.hook(`rollup:before`,(t,n)=>{Array.isArray(n.plugins)&&n.plugins.unshift({name:`eve:workflow-step-module-side-effects`,async resolveId(t,n){let r=resolveNitroImportPath(e.options.rootDir,t,n);return r===null||!(await getStepTransformTargets()).has(normalizeStepTransformComparisonPath(r))?null:{id:r,moduleSideEffects:`no-treeshake`}}})})}function addNitroStepTransformPlugin(e,t){let n=null,getStepTransformTargets=async()=>(n===null&&(n=await collectNitroStepTransformTargets(t.stepEntrypointPath,e.options.rootDir)),n);e.hooks.hook(`build:before`,()=>{n=null}),e.options.dev&&e.hooks.hook(`dev:reload`,()=>{n=null}),e.hooks.hook(`rollup:before`,(t,n)=>{Array.isArray(n.plugins)&&n.plugins.unshift({async transform(t,n){let r=await getStepTransformTargets(),i=resolveNitroModuleComparisonPath(e.options.rootDir,n);return r.has(normalizeStepTransformComparisonPath(i))?{code:(await applyWorkflowTransform(createRelativeTransformFilename(e.options.rootDir,i),t,`step`,i,e.options.rootDir)).code,map:null}:null},name:`eve:workflow-step-transform`})})}function addDynamicToolTransformPlugin(e){e.hooks.hook(`rollup:before`,(e,t)=>{Array.isArray(t.plugins)&&t.plugins.unshift({async transform(e,t){if(!t.includes(`/tools/`))return null;let n=await transformDynamicToolExecute(t,e);return n===null?null:{code:n.code,map:null}},name:`eve:dynamic-tool-transform`})})}function addInstrumentationModuleSideEffectsPlugin(e,t){let n=normalizePath(t);e.hooks.hook(`rollup:before`,(e,t)=>{Array.isArray(t.plugins)&&t.plugins.unshift({name:`eve:instrumentation-module-side-effects`,resolveId(e){return normalizePath(e)===n?{id:e,moduleSideEffects:`no-treeshake`}:null}})})}function patchWorkflowTransformExcludePath(e,t){let n=normalizePath(t);e.hooks.hook(`rollup:before`,(e,t)=>{if(Array.isArray(t.plugins))for(let e of t.plugins){if(typeof e!=`object`||!e)continue;let t=e;if(t.name!==`workflow:transform`||t[WORKFLOW_TRANSFORM_PATCHED]===!0||typeof t.transform!=`function`)continue;let r=t.transform;t.transform=function(e,t,...i){return isWorkflowBundlePath(t,n)?null:r.call(this,e,t,...i)},t[WORKFLOW_TRANSFORM_PATCHED]=!0}})}async function createApplicationNitro(n,r,i={}){let o=i.surface??`all`,s=!r&&includesApplicationSurface(o)&&n.scheduleRegistrations.length>0,c=resolveNitroPreset(r),l=collectConfiguredSandboxBackendNames(n.compileResult.manifest),u=shouldPruneLocalSandboxBackends({configuredBackendNames:l,preset:c})?createCompiledSandboxBackendPrunePlugin():null,d=[],f=[];for(let[e,t]of Object.entries(OPTIONAL_ENGINE_PACKAGES_BY_BACKEND_NAME))(l.has(e)?d:f).push(t);let p=[u,createOptionalEngineDependencyPlugin(f)].filter(e=>e!==null),m=createNitroBundlerConfig(p),h=createNitroBundlerConfig(p),g=collectHostedTraceDependencies(n,d),_=resolveNitroBuildDirectory(n.appRoot,o),v=includesApplicationSurface(o)&&(r||manifestHasWebSocketChannel(n.compileResult.manifest)),y=[];manifestEnablesWorkflow(n.compileResult.manifest)&&y.push(resolvePackageSourceFilePath(`src/internal/nitro/host/workflow-sandbox-runtime-plugin.ts`)),n.compiledArtifacts.instrumentationPluginPath!==void 0&&y.push(n.compiledArtifacts.instrumentationPluginPath),y.push(n.compiledArtifacts.bootstrapPath),await prepareEveVersionedCacheDirectory(_);let b=await createNitro({_cli:{command:r?`dev`:`build`},buildDir:_,dev:r,features:{websocket:v},logLevel:r?1:void 0,output:i.outputDir===void 0?void 0:{dir:i.outputDir},preset:c,plugins:y,publicAssets:[],scanDirs:includesWorkflowStepRegistrations(o)?[resolvePackageSourceDirectoryPath(`src/execution`)]:void 0,rolldownConfig:m,rollupConfig:h,rootDir:n.appRoot,serverDir:!1,traceDeps:g,vercel:createEveVercelOptions(c===`vercel`&&includesApplicationSurface(o)),watchOptions:r?createDevelopmentWatchOptions(n.appRoot):void 0},r?{watch:!0}:void 0);if(await writeEveVersionedCacheMetadata(_),addNitroRoutingImportSpecifierPlugin(b),r&&captureDevLiveVirtualModules(b),includesWorkflowSurface(o)){let e=resolveWorkflowAliases();for(let[t,n]of Object.entries(e))b.options.alias[t]=n;addWorkflowModuleSideEffectsPlugin(b,n.workflowBuildDir),patchWorkflowTransformExcludePath(b,n.workflowBuildDir)}if(includesWorkflowStepRegistrations(o)){let e=resolveWorkflowStepEntrypointPath(b,n);addNitroStepModuleSideEffectsPlugin(b,{stepEntrypointPath:e}),addNitroStepTransformPlugin(b,{stepEntrypointPath:e})}if(addDynamicToolTransformPlugin(b),n.compiledArtifacts.instrumentationSourcePath!==void 0&&addInstrumentationModuleSideEffectsPlugin(b,n.compiledArtifacts.instrumentationSourcePath),r&&includesWorkflowSurface(o)){let e=n.workflowBuildDir,t=new Set([normalizePath(join(e,`workflows.mjs`))]);b.hooks.hook(`rollup:before`,(e,n)=>{let r=n.external;n.external=(e,...n)=>{if(t.has(normalizePath(e)))return!0;if(typeof r==`function`)return r(e,...n)}})}return s&&(applyEveCronHandlerRoute(b),registerScheduleTaskHandlers(b,{artifactsConfig:createNitroArtifactsConfig({appRoot:n.appRoot,dev:b.options.dev}),dispatchModulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/schedule-task.ts`),registrations:n.scheduleRegistrations})),await configureNitroRoutes(b,n,{surface:o}),includesWorkflowStepRegistrations(o)&&await addNitroStepNoExternals(b,resolveWorkflowStepEntrypointPath(b,n)),b}export{createApplicationNitro,shouldPruneLocalSandboxBackends};
1
+ import{resolvePackageSourceDirectoryPath,resolvePackageSourceFilePath,resolveWorkflowModulePath}from"#internal/application/package.js";import{dirname,isAbsolute,join,relative,resolve}from"node:path";import{readFile}from"node:fs/promises";import{resolveNitroBuildDirectory}from"#internal/application/paths.js";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";import{fileURLToPath}from"node:url";import{SERVER_EXTERNAL_PACKAGES}from"#internal/nitro/host/server-external-packages.js";import{createNitro}from"nitro/builder";import{prepareEveVersionedCacheDirectory,writeEveVersionedCacheMetadata}from"#internal/application/cache-metadata.js";import{captureDevLiveVirtualModules}from"#internal/nitro/host/dev-live-virtual-modules.js";import{createNitroArtifactsConfig}from"#internal/nitro/host/artifacts-config.js";import{createCompiledSandboxBackendPrunePlugin}from"#internal/nitro/host/compiled-sandbox-backend-prune-plugin.js";import{configureNitroRoutes}from"#internal/nitro/host/configure-nitro-routes.js";import{applyEveCronHandlerRoute}from"#internal/nitro/host/cron-handler-route.js";import{createNitroBundlerConfig}from"#internal/nitro/host/nitro-bundler-config.js";import{OPTIONAL_ENGINE_PACKAGES_BY_BACKEND_NAME,createOptionalEngineDependencyPlugin}from"#internal/nitro/host/optional-engine-dependency-plugin.js";import{addNitroRoutingImportSpecifierPlugin}from"#internal/nitro/host/nitro-routing-import-specifier-plugin.js";import{registerScheduleTaskHandlers}from"#internal/nitro/host/schedule-task-routes.js";import{createEveVercelOptions}from"#internal/nitro/host/vercel-build-output-config.js";import{applyWorkflowTransform}from"#internal/workflow-bundle/workflow-builders.js";import{transformDynamicToolExecute}from"#internal/workflow-bundle/dynamic-tool-transform.js";const WORKFLOW_ALIAS_SPECIFIERS=[`workflow`,`workflow/api`,`workflow/errors`,`workflow/internal/builtins`,`workflow/internal/private`,`workflow/runtime`],WORKFLOW_TRANSFORM_PATCHED=Symbol(`eve.workflow-transform-patched`),FRAMEWORK_HOSTED_EXTERNAL_PACKAGES=[`@napi-rs/keyring`],LOCAL_SANDBOX_BACKEND_NAMES=new Set([`docker`,...Object.keys(OPTIONAL_ENGINE_PACKAGES_BY_BACKEND_NAME)]);function resolveWorkflowAliases(){let e={};for(let t of WORKFLOW_ALIAS_SPECIFIERS)e[t]=resolveWorkflowModulePath(t);return e}function resolveNitroPreset(e){if(!e&&process.env.VERCEL)return`vercel`}function includesApplicationSurface(e){return e===`all`||e===`app`}function includesWorkflowSurface(e){return e===`all`||e===`flow`}function includesWorkflowStepRegistrations(e){return includesWorkflowSurface(e)}function manifestEnablesWorkflow(e){return[e,...e.subagents.map(e=>e.agent)].some(e=>e.workflowEnabled===!0)}function manifestHasWebSocketChannel(e){return e.channels.some(e=>e.kind===`channel`&&e.method===`WEBSOCKET`)}function resolveWorkflowStepEntrypointPath(e,t){return e.options.dev?join(e.options.buildDir,`workflow`,`steps.mjs`):join(t.workflowBuildDir,`steps.mjs`)}function collectHostedTraceDependencies(e,t){let n=[e.compileResult.manifest,...e.compileResult.manifest.subagents.map(e=>e.agent)].flatMap(e=>e.config.build?.externalDependencies??[]);return[...new Set([...FRAMEWORK_HOSTED_EXTERNAL_PACKAGES,...t,...SERVER_EXTERNAL_PACKAGES,...n])].filter(e=>e!==EVE_PACKAGE_NAME)}function collectConfiguredSandboxBackendNames(e){let t=[e,...e.subagents.map(e=>e.agent)];return new Set(t.map(e=>e.sandbox?.backendName).filter(e=>typeof e==`string`))}function shouldPruneLocalSandboxBackends(e){return e.preset===`vercel`&&![...e.configuredBackendNames].some(e=>LOCAL_SANDBOX_BACKEND_NAMES.has(e))}function createDevelopmentWatchOptions(e){if(e.length!==0)return{ignored:[e,join(e,`**`)]}}function normalizePath(e){return e.replaceAll(`\\`,`/`)}function stripPathQueryAndHash(e){let t=e.indexOf(`?`),n=e.indexOf(`#`),r=t===-1?n:n===-1?t:Math.min(t,n);return r===-1?e:e.slice(0,r)}function stripFileSystemPrefix(e){return e.startsWith(`/@fs/`)?e.slice(4):e}function resolveNitroModuleComparisonPath(e,t){return t.startsWith(`file://`)?normalizePath(stripFileSystemPrefix(stripPathQueryAndHash(fileURLToPath(t)))):isAbsolute(t)?normalizePath(stripFileSystemPrefix(stripPathQueryAndHash(t))):normalizePath(stripFileSystemPrefix(stripPathQueryAndHash(resolve(e,t))))}function isWorkflowBundlePath(e,t){let n=normalizePath(e);return n.startsWith(t)||n.includes(`/.eve/workflow-cache/`)}function normalizeStepTransformComparisonPath(e){let t=normalizePath(e);return process.platform===`win32`?t.toLowerCase():t}function parseImportedModuleSpecifiers(e){let t=/^\s*import\s+(?:.+?\s+from\s+)?["']([^"']+)["'];?\s*$/gm,n=[];for(let r of e.matchAll(t)){let e=r[1];e!==void 0&&n.push(e)}return n}function resolveNitroImportPath(e,t,i){return t.startsWith(`workflow`)?resolveWorkflowModulePath(t):t.startsWith(`.`)||t.startsWith(`/`)||t.startsWith(`file://`)?resolveNitroModuleComparisonPath(i===void 0?e:dirname(resolveNitroModuleComparisonPath(e,i)),t):null}async function collectNitroStepTransformTargets(e,t){let n=await readFile(e,`utf8`),r=new Set;for(let i of parseImportedModuleSpecifiers(n)){let n=resolveNitroImportPath(t,i,e);n!==null&&r.add(normalizeStepTransformComparisonPath(n))}return r}async function addNitroStepNoExternals(e,t){if(e.options.noExternals===!0)return;let n;try{n=await collectNitroStepTransformTargets(t,e.options.rootDir)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}let r=Array.isArray(e.options.noExternals)?[...e.options.noExternals]:[];e.options.noExternals=[...new Set([...r,...n])]}function createRelativeTransformFilename(e,t){let n=normalizePath(e).replace(/\/$/,``),r=normalizePath(t),i=n.toLowerCase(),a=r.toLowerCase();if(a.startsWith(`${i}/`))return r.slice(n.length+1);if(a===i)return`.`;let s=relative(n,r).replaceAll(`\\`,`/`);if(s.startsWith(`../`)&&(s=s.split(`/`).filter(e=>e!==`..`).join(`/`)),s.includes(`:`)||s.startsWith(`/`)){let e=r.split(`/`).pop();return e===void 0||e.length===0?`unknown.ts`:e}return s}function addWorkflowModuleSideEffectsPlugin(e,t){let n=[t,join(e.options.buildDir,`workflow`)].map(t=>resolveNitroModuleComparisonPath(e.options.rootDir,t));e.hooks.hook(`rollup:before`,(t,r)=>{Array.isArray(r.plugins)&&r.plugins.unshift({name:`eve:workflow-module-side-effects`,resolveId(t,r){let i=resolveNitroImportPath(e.options.rootDir,t,r)??resolveNitroModuleComparisonPath(e.options.rootDir,t);return n.some(e=>isWorkflowBundlePath(i,e))?{id:i,moduleSideEffects:`no-treeshake`}:null}})})}function addNitroStepModuleSideEffectsPlugin(e,t){let n=null,getStepTransformTargets=async()=>(n===null&&(n=await collectNitroStepTransformTargets(t.stepEntrypointPath,e.options.rootDir)),n);e.hooks.hook(`build:before`,()=>{n=null}),e.options.dev&&e.hooks.hook(`dev:reload`,()=>{n=null}),e.hooks.hook(`rollup:before`,(t,n)=>{Array.isArray(n.plugins)&&n.plugins.unshift({name:`eve:workflow-step-module-side-effects`,async resolveId(t,n){let r=resolveNitroImportPath(e.options.rootDir,t,n);return r===null||!(await getStepTransformTargets()).has(normalizeStepTransformComparisonPath(r))?null:{id:r,moduleSideEffects:`no-treeshake`}}})})}function addNitroStepTransformPlugin(e,t){let n=null,getStepTransformTargets=async()=>(n===null&&(n=await collectNitroStepTransformTargets(t.stepEntrypointPath,e.options.rootDir)),n);e.hooks.hook(`build:before`,()=>{n=null}),e.options.dev&&e.hooks.hook(`dev:reload`,()=>{n=null}),e.hooks.hook(`rollup:before`,(t,n)=>{Array.isArray(n.plugins)&&n.plugins.unshift({async transform(t,n){let r=await getStepTransformTargets(),i=resolveNitroModuleComparisonPath(e.options.rootDir,n);return r.has(normalizeStepTransformComparisonPath(i))?{code:(await applyWorkflowTransform(createRelativeTransformFilename(e.options.rootDir,i),t,`step`,i,e.options.rootDir)).code,map:null}:null},name:`eve:workflow-step-transform`})})}function addDynamicToolTransformPlugin(e){e.hooks.hook(`rollup:before`,(e,t)=>{Array.isArray(t.plugins)&&t.plugins.unshift({async transform(e,t){if(!t.includes(`/tools/`))return null;let n=await transformDynamicToolExecute(t,e);return n===null?null:{code:n.code,map:null}},name:`eve:dynamic-tool-transform`})})}function addInstrumentationModuleSideEffectsPlugin(e,t){let n=normalizePath(t);e.hooks.hook(`rollup:before`,(e,t)=>{Array.isArray(t.plugins)&&t.plugins.unshift({name:`eve:instrumentation-module-side-effects`,resolveId(e){return normalizePath(e)===n?{id:e,moduleSideEffects:`no-treeshake`}:null}})})}function patchWorkflowTransformExcludePath(e,t){let n=normalizePath(t);e.hooks.hook(`rollup:before`,(e,t)=>{if(Array.isArray(t.plugins))for(let e of t.plugins){if(typeof e!=`object`||!e)continue;let t=e;if(t.name!==`workflow:transform`||t[WORKFLOW_TRANSFORM_PATCHED]===!0||typeof t.transform!=`function`)continue;let r=t.transform;t.transform=function(e,t,...i){return isWorkflowBundlePath(t,n)?null:r.call(this,e,t,...i)},t[WORKFLOW_TRANSFORM_PATCHED]=!0}})}async function createApplicationNitro(n,r,i={}){let o=i.surface??`all`,s=!r&&includesApplicationSurface(o)&&n.scheduleRegistrations.length>0,c=resolveNitroPreset(r),l=collectConfiguredSandboxBackendNames(n.compileResult.manifest),u=shouldPruneLocalSandboxBackends({configuredBackendNames:l,preset:c})?createCompiledSandboxBackendPrunePlugin():null,d=[],f=[];for(let[e,t]of Object.entries(OPTIONAL_ENGINE_PACKAGES_BY_BACKEND_NAME))(l.has(e)?d:f).push(t);let p=[u,createOptionalEngineDependencyPlugin(f)].filter(e=>e!==null),m=createNitroBundlerConfig(p),h=createNitroBundlerConfig(p),g=collectHostedTraceDependencies(n,d),_=resolveNitroBuildDirectory(n.appRoot,o),v=includesApplicationSurface(o)&&(r||manifestHasWebSocketChannel(n.compileResult.manifest)),y=[];r||y.push(resolvePackageSourceFilePath(`src/internal/nitro/host/sandbox-shutdown-plugin.ts`)),manifestEnablesWorkflow(n.compileResult.manifest)&&y.push(resolvePackageSourceFilePath(`src/internal/nitro/host/workflow-sandbox-runtime-plugin.ts`)),n.compiledArtifacts.instrumentationPluginPath!==void 0&&y.push(n.compiledArtifacts.instrumentationPluginPath),y.push(n.compiledArtifacts.bootstrapPath),await prepareEveVersionedCacheDirectory(_);let b=await createNitro({_cli:{command:r?`dev`:`build`},buildDir:_,dev:r,features:{websocket:v},logLevel:r?1:void 0,output:i.outputDir===void 0?void 0:{dir:i.outputDir},preset:c,plugins:y,publicAssets:[],scanDirs:includesWorkflowStepRegistrations(o)?[resolvePackageSourceDirectoryPath(`src/execution`)]:void 0,rolldownConfig:m,rollupConfig:h,rootDir:n.appRoot,serverDir:!1,traceDeps:g,vercel:createEveVercelOptions(c===`vercel`&&includesApplicationSurface(o)),watchOptions:r?createDevelopmentWatchOptions(n.appRoot):void 0},r?{watch:!0}:void 0);if(await writeEveVersionedCacheMetadata(_),addNitroRoutingImportSpecifierPlugin(b),r&&captureDevLiveVirtualModules(b),includesWorkflowSurface(o)){let e=resolveWorkflowAliases();for(let[t,n]of Object.entries(e))b.options.alias[t]=n;addWorkflowModuleSideEffectsPlugin(b,n.workflowBuildDir),patchWorkflowTransformExcludePath(b,n.workflowBuildDir)}if(includesWorkflowStepRegistrations(o)){let e=resolveWorkflowStepEntrypointPath(b,n);addNitroStepModuleSideEffectsPlugin(b,{stepEntrypointPath:e}),addNitroStepTransformPlugin(b,{stepEntrypointPath:e})}if(addDynamicToolTransformPlugin(b),n.compiledArtifacts.instrumentationSourcePath!==void 0&&addInstrumentationModuleSideEffectsPlugin(b,n.compiledArtifacts.instrumentationSourcePath),r&&includesWorkflowSurface(o)){let e=n.workflowBuildDir,t=new Set([normalizePath(join(e,`workflows.mjs`))]);b.hooks.hook(`rollup:before`,(e,n)=>{let r=n.external;n.external=(e,...n)=>{if(t.has(normalizePath(e)))return!0;if(typeof r==`function`)return r(e,...n)}})}return s&&(applyEveCronHandlerRoute(b),registerScheduleTaskHandlers(b,{artifactsConfig:createNitroArtifactsConfig({appRoot:n.appRoot,dev:b.options.dev}),dispatchModulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/schedule-task.ts`),registrations:n.scheduleRegistrations})),await configureNitroRoutes(b,n,{surface:o}),includesWorkflowStepRegistrations(o)&&await addNitroStepNoExternals(b,resolveWorkflowStepEntrypointPath(b,n)),b}export{createApplicationNitro,shouldPruneLocalSandboxBackends};
@@ -0,0 +1,40 @@
1
+ declare const SHUTDOWN_SIGNALS: readonly ["SIGINT", "SIGTERM"];
2
+ type ShutdownSignal = (typeof SHUTDOWN_SIGNALS)[number];
3
+ interface SandboxShutdownProcess {
4
+ readonly env: Record<string, string | undefined>;
5
+ exit(code?: number): void;
6
+ once(event: ShutdownSignal, listener: () => void): unknown;
7
+ }
8
+ interface NitroAppLike {
9
+ readonly hooks?: {
10
+ hook(name: "close", handler: () => Promise<void>): unknown;
11
+ };
12
+ }
13
+ /**
14
+ * Reports whether this server process owns sandbox shutdown.
15
+ *
16
+ * - `eve dev` workers are excluded: the dev CLI parent already stops
17
+ * dev-tagged sandboxes when the dev server closes.
18
+ * - Vercel serverless instances are excluded: instance recycling is not
19
+ * a server stop, and persistent session sandboxes must keep serving
20
+ * later invocations.
21
+ */
22
+ export declare function shouldInstallSandboxShutdown(env: Record<string, string | undefined>): boolean;
23
+ /**
24
+ * Stops all tracked sandboxes, bounded by
25
+ * {@link SANDBOX_SHUTDOWN_TIMEOUT_MS}. Never throws.
26
+ */
27
+ export declare function runSandboxShutdown(log: (message: string) => void): Promise<void>;
28
+ /**
29
+ * Wires sandbox shutdown into the server lifecycle: the nitro `close`
30
+ * hook plus SIGINT/SIGTERM, since the node-server preset installs no
31
+ * signal handling of its own. Exposed for tests; the plugin default
32
+ * export applies it to the real `process`.
33
+ */
34
+ export declare function installSandboxShutdownHandlers(input: {
35
+ readonly log: (message: string) => void;
36
+ readonly nitroApp?: NitroAppLike;
37
+ readonly process: SandboxShutdownProcess;
38
+ }): void;
39
+ export default function sandboxShutdownPlugin(nitroApp?: NitroAppLike): void;
40
+ export {};
@@ -0,0 +1 @@
1
+ import{isEveDevEnvironment}from"#internal/application/optional-package-install.js";import{shutdownActiveSandboxHandles}from"#execution/sandbox/active-handles.js";const SHUTDOWN_SIGNALS=[`SIGINT`,`SIGTERM`];let installed=!1;function shouldInstallSandboxShutdown(t){return!(isEveDevEnvironment()||t.EVE_DEVELOPMENT_SANDBOX_RUN_ID!==void 0||t.VERCEL!==void 0)}async function runSandboxShutdown(e){let n,r=new Promise(t=>{n=setTimeout(()=>{e(`eve: sandbox shutdown timed out; continuing exit`),t()},15e3),n.unref?.()});try{await Promise.race([shutdownActiveSandboxHandles({log:e}),r])}finally{clearTimeout(n)}}function exitCodeForSignal(e){return e===`SIGINT`?130:143}function installSandboxShutdownHandlers(e){if(shouldInstallSandboxShutdown(e.process.env)){e.nitroApp?.hooks?.hook(`close`,async()=>{await runSandboxShutdown(e.log)});for(let t of SHUTDOWN_SIGNALS)e.process.once(t,()=>{runSandboxShutdown(e.log).finally(()=>{e.process.exit(exitCodeForSignal(t))})})}}function sandboxShutdownPlugin(e){installed||(installed=!0,installSandboxShutdownHandlers({log:e=>console.error(e),nitroApp:e,process}))}export{sandboxShutdownPlugin as default,installSandboxShutdownHandlers,runSandboxShutdown,shouldInstallSandboxShutdown};
@@ -1,3 +1,3 @@
1
1
  import{EVE_HEALTH_ROUTE_PATH}from"#protocol/routes.js";import{existsSync}from"node:fs";import{join,resolve}from"node:path";import{spawn}from"node:child_process";import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{setTimeout}from"node:timers/promises";import{prewarmBuiltAppSandboxes}from"#execution/sandbox/prewarm.js";import{createServer}from"node:net";const HEALTH_TIMEOUT_MS=6e4,LOCAL_SERVER_URL_PATTERN=/https?:\/\/(?:\[[^\]\s]+\]|[^\s/:[\]]+)(?::\d+)?/,WILDCARD_LISTEN_HOSTNAMES=new Set([`[::]`,`::`,`0.0.0.0`]);function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function isAddressInUseError(e){return e instanceof Error&&`code`in e&&e.code===`EADDRINUSE`}function resolveOutputServerEntry(e){return join(resolve(e),`.output`,`server`,`index.mjs`)}function readEnvironmentPort(){let e=process.env.PORT;if(e===void 0||e.trim()===``)return;let t=Number(e);if(!Number.isInteger(t)||t<0||t>65535)throw Error(`Invalid PORT environment variable "${e}". Expected an integer between 0 and 65535.`);return t}function normalizeServerClientUrl(e){let t=new URL(e);return WILDCARD_LISTEN_HOSTNAMES.has(t.hostname)&&(t.hostname=`127.0.0.1`),t.toString()}function formatClientHost(e){return WILDCARD_LISTEN_HOSTNAMES.has(e)?`127.0.0.1`:e.includes(`:`)&&!e.startsWith(`[`)?`[${e}]`:e}function createKnownPortUrl(e){return`http://${formatClientHost(e.host)}:${String(e.port)}/`}async function resolveListenPort(e){if(e.port!==0)return e.port;let t=createServer();return await new Promise((n,r)=>{t.once(`error`,r),t.listen(0,e.host,()=>{let e=t.address();t.close(t=>{if(t){r(t);return}if(e===null||typeof e==`string`){r(Error(`Failed to resolve an available port for eve start.`));return}n(e.port)})})})}function parseServerUrlFromOutput(e){let t=LOCAL_SERVER_URL_PATTERN.exec(e);if(t!==null)return normalizeServerClientUrl(t[0])}async function waitForHealth(t){let{child:n,url:r}=t,i=new URL(EVE_HEALTH_ROUTE_PATH,r).toString(),a=Date.now()+HEALTH_TIMEOUT_MS;for(;Date.now()<a;){let e=t.getStartError();if(e!==void 0)throw e;if(n.exitCode!==null||n.signalCode!==null)throw Error(`Built server process exited (code=${String(n.exitCode)}, signal=${String(n.signalCode)}) before becoming healthy.`);try{if((await fetch(i,{signal:AbortSignal.timeout(2e3)})).ok)return new URL(r).toString()}catch(e){if(isAddressInUseError(e))throw e}await setTimeout(250)}throw Error(`Built server did not become healthy within ${HEALTH_TIMEOUT_MS/1e3}s at ${i}.`)}async function waitForReady(e){let t=Date.now()+HEALTH_TIMEOUT_MS;for(;Date.now()<t;){let t=e.getStartError();if(t!==void 0)throw t;let n=parseServerUrlFromOutput(e.getOutput())??e.knownUrl;if(n!==void 0)return await waitForHealth({child:e.child,getStartError:e.getStartError,url:n});if(e.child.exitCode!==null||e.child.signalCode!==null)throw Error(`Built server process exited (code=${String(e.child.exitCode)}, signal=${String(e.child.signalCode)}) before printing its URL.`);await setTimeout(250)}throw Error([`Built server did not become ready within ${HEALTH_TIMEOUT_MS/1e3}s.`,`Output:`,e.getOutput()].join(`
2
- `))}async function terminate(e){e.exitCode!==null||e.killed||(e.kill(`SIGTERM`),await Promise.race([once(e,`exit`),setTimeout(5e3).then(()=>`timeout`)])===`timeout`&&e.exitCode===null&&(e.kill(`SIGKILL`),await once(e,`exit`)),e.stdout?.destroy(),e.stderr?.destroy())}function once(e,t){return new Promise(n=>{e.once(t,()=>n())})}async function startProductionServer(e,n={}){let o=resolve(e),s=resolveOutputServerEntry(o);if(!existsSync(s))throw Error(`Missing eve build output at ${s}. Run "eve build" before "eve start".`);loadDevelopmentEnvironmentFiles(o),await prewarmBuiltAppSandboxes({appRoot:o,log:e=>console.log(e)});let c=n.host??`0.0.0.0`,l=await resolveListenPort({host:c,port:n.port??readEnvironmentPort()??3e3}),u=createKnownPortUrl({host:c,port:l}),d=``,f=!1,p,m=spawn(process.execPath,[s],{cwd:o,env:{...process.env,HOST:c,NITRO_HOST:c,NITRO_PORT:String(l),PORT:String(l)},stdio:[`ignore`,`pipe`,`pipe`]});m.stdout?.on(`data`,e=>{d+=e.toString(`utf8`),process.stdout.write(e)}),m.stderr?.on(`data`,e=>{d+=e.toString(`utf8`),process.stderr.write(e)});let h=new Promise((e,t)=>{m.once(`error`,e=>{p=e,t(e)}),m.once(`exit`,(n,r)=>{if(f||n===0){e();return}t(Error([`Built server process exited unexpectedly (code=${String(n)}, signal=${String(r)}).`,d].join(`
2
+ `))}async function terminate(e){e.exitCode!==null||e.killed||(e.kill(`SIGTERM`),await Promise.race([once(e,`exit`),setTimeout(2e4).then(()=>`timeout`)])===`timeout`&&e.exitCode===null&&(e.kill(`SIGKILL`),await once(e,`exit`)),e.stdout?.destroy(),e.stderr?.destroy())}function once(e,t){return new Promise(n=>{e.once(t,()=>n())})}async function startProductionServer(e,n={}){let o=resolve(e),s=resolveOutputServerEntry(o);if(!existsSync(s))throw Error(`Missing eve build output at ${s}. Run "eve build" before "eve start".`);loadDevelopmentEnvironmentFiles(o),await prewarmBuiltAppSandboxes({appRoot:o,log:e=>console.log(e)});let c=n.host??`0.0.0.0`,l=await resolveListenPort({host:c,port:n.port??readEnvironmentPort()??3e3}),u=createKnownPortUrl({host:c,port:l}),d=``,f=!1,p,m=spawn(process.execPath,[s],{cwd:o,env:{...process.env,HOST:c,NITRO_HOST:c,NITRO_PORT:String(l),PORT:String(l)},stdio:[`ignore`,`pipe`,`pipe`]});m.stdout?.on(`data`,e=>{d+=e.toString(`utf8`),process.stdout.write(e)}),m.stderr?.on(`data`,e=>{d+=e.toString(`utf8`),process.stderr.write(e)});let h=new Promise((e,t)=>{m.once(`error`,e=>{p=e,t(e)}),m.once(`exit`,(n,r)=>{if(f||n===0){e();return}t(Error([`Built server process exited unexpectedly (code=${String(n)}, signal=${String(r)}).`,d].join(`
3
3
  `)))})});h.catch(()=>void 0);try{return{async close(){f=!0,await terminate(m)},url:await waitForReady({child:m,getStartError:()=>p,getOutput:()=>d,knownUrl:u}),async wait(){await h}}}catch(e){throw f=!0,await terminate(m),isRecord(e)&&e.name===`AbortError`?Error(`Timed out waiting for built eve server to respond.`,{cause:e}):e}}export{startProductionServer};
@@ -1,5 +1,5 @@
1
+ import type { FileUIPart, ProviderMetadata, TextUIPart, UserContent } from "ai";
1
2
  import type { ConnectionAuthorizationChallenge } from "#public/connections/errors.js";
2
- import type { UserContent } from "ai";
3
3
  import type { RuntimeActionRequest, RuntimeActionResult } from "#runtime/actions/types.js";
4
4
  import type { InputRequest, InputResponse } from "#runtime/input/types.js";
5
5
  import type { JsonObject, JsonValue } from "#shared/json.js";
@@ -8,7 +8,7 @@ export declare const EVE_STREAM_FORMAT_HEADER = "x-eve-stream-format";
8
8
  export declare const EVE_STREAM_VERSION_HEADER = "x-eve-stream-version";
9
9
  export declare const EVE_MESSAGE_STREAM_CONTENT_TYPE = "application/x-ndjson; charset=utf-8";
10
10
  export declare const EVE_MESSAGE_STREAM_FORMAT = "ndjson";
11
- export declare const EVE_MESSAGE_STREAM_VERSION = "16";
11
+ export declare const EVE_MESSAGE_STREAM_VERSION = "18";
12
12
  /**
13
13
  * eve-owned finish reason for one completed assistant step.
14
14
  *
@@ -17,6 +17,13 @@ export declare const EVE_MESSAGE_STREAM_VERSION = "16";
17
17
  * current turn.
18
18
  */
19
19
  export type AssistantStepFinishReason = "content-filter" | "error" | "length" | "other" | "stop" | "tool-calls";
20
+ type ProviderMetadataEntry = NonNullable<ProviderMetadata[string]>;
21
+ type GatewayGenerationId = Extract<ProviderMetadataEntry["generationId"], string>;
22
+ export interface StepCompletedProviderMetadata {
23
+ readonly gateway: {
24
+ readonly generationId: GatewayGenerationId;
25
+ };
26
+ }
20
27
  /**
21
28
  * Durable metadata attached to one persisted session stream event.
22
29
  *
@@ -125,15 +132,32 @@ export interface TurnStartedStreamEvent {
125
132
  }
126
133
  /**
127
134
  * Stream event emitted when the runtime receives one normalized user message.
135
+ *
136
+ * `message` is the existing flattened text summary. `parts` carries the
137
+ * structured projection current emitters provide for clients that render
138
+ * attachments.
128
139
  */
129
140
  export interface MessageReceivedStreamEvent {
130
141
  data: {
131
142
  message: string;
143
+ parts?: readonly MessageReceivedPart[];
132
144
  sequence: number;
133
145
  turnId: string;
134
146
  };
135
147
  type: "message.received";
136
148
  }
149
+ /**
150
+ * One structured part of a received user message.
151
+ *
152
+ * This mirrors the AI SDK UI text/file part surface, narrowed to renderable
153
+ * metadata only. Raw bytes and framework-internal sandbox paths are never
154
+ * projected; `url` is optional because it is present only for client-resolvable
155
+ * `http(s)` and `data:` URLs.
156
+ */
157
+ export type MessageReceivedPart = Readonly<Pick<TextUIPart, "text" | "type">> | (Readonly<Pick<FileUIPart, "filename" | "mediaType" | "type">> & {
158
+ readonly size?: number;
159
+ readonly url?: FileUIPart["url"];
160
+ });
137
161
  /**
138
162
  * Stream event emitted when the model requests one or more actions.
139
163
  *
@@ -321,10 +345,12 @@ export interface StepStartedStreamEvent {
321
345
  export interface StepCompletedStreamEvent {
322
346
  data: {
323
347
  finishReason: AssistantStepFinishReason;
348
+ providerMetadata?: StepCompletedProviderMetadata;
324
349
  sequence: number;
325
350
  stepIndex: number;
326
351
  turnId: string;
327
352
  usage?: {
353
+ readonly costUsd?: number;
328
354
  readonly inputTokens?: number;
329
355
  readonly outputTokens?: number;
330
356
  readonly cacheReadTokens?: number;
@@ -672,10 +698,12 @@ export declare function createStepStartedEvent(input: {
672
698
  */
673
699
  export declare function createStepCompletedEvent(input: {
674
700
  readonly finishReason: AssistantStepFinishReason;
701
+ readonly providerMetadata?: StepCompletedProviderMetadata;
675
702
  readonly sequence: number;
676
703
  readonly stepIndex: number;
677
704
  readonly turnId: string;
678
705
  readonly usage?: {
706
+ readonly costUsd?: number;
679
707
  readonly inputTokens?: number;
680
708
  readonly outputTokens?: number;
681
709
  readonly cacheReadTokens?: number;
@@ -760,3 +788,4 @@ export declare function timestampHandleMessageStreamEvent(event: HandleMessageSt
760
788
  * Encodes one message stream event as newline-delimited JSON.
761
789
  */
762
790
  export declare function encodeMessageStreamEvent(event: TimedHandleMessageStreamEvent): Uint8Array;
791
+ export {};
@@ -1,2 +1,2 @@
1
- const EVE_SESSION_ID_HEADER=`x-eve-session-id`,EVE_STREAM_FORMAT_HEADER=`x-eve-stream-format`,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=`16`,textEncoder=new TextEncoder;function isCurrentTurnBoundaryEvent(e){return e.type===`session.completed`||e.type===`session.failed`||e.type===`session.waiting`}function isTurnFailureEvent(e){return e.type===`session.failed`||e.type===`step.failed`||e.type===`turn.failed`}function createSessionStartedEvent(e){let t={};return e?.invocation!==void 0&&(t.invocation=e.invocation),e?.runtime!==void 0&&(t.runtime=e.runtime),{data:t,type:`session.started`}}function createTurnStartedEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.started`}}function createMessageReceivedEvent(e){return{data:{message:summarizeUserContent(e.message),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 createActionsRequestedEvent(e){return{data:{actions:e.actions,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`actions.requested`}}function createAuthorizationRequiredEvent(e){let t={description:e.description,name:e.name,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.authorization!==void 0&&(t.authorization=e.authorization),e.webhookUrl!==void 0&&(t.webhookUrl=e.webhookUrl),{data:t,type:`authorization.required`}}function createAuthorizationCompletedEvent(e){let t={name:e.name,outcome:e.outcome,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.authorization!==void 0&&(t.authorization=e.authorization),e.reason!==void 0&&(t.reason=e.reason),{data:t,type:`authorization.completed`}}function createInputRequestedEvent(e){return{data:{requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`input.requested`}}function createActionResultEvent(e){let t=e.rejected===!0?{error:buildActionResultError(e.result),status:`rejected`}:normalizeActionResultOutcome(e.result);return{data:{error:t.error,result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,status:t.status,turnId:e.turnId},type:`action.result`}}function createSubagentCalledEvent(e){return{data:{callId:e.callId,childSessionId:e.childSessionId,sessionId:e.sessionId,sequence:e.sequence,name:e.name,remote:e.remote,toolName:e.toolName,turnId:e.turnId,workflowId:e.workflowId},type:`subagent.called`}}function createMessageAppendedEvent(e){return{data:{messageDelta:e.messageDelta,messageSoFar:e.messageSoFar,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.appended`}}function createReasoningAppendedEvent(e){return{data:{reasoningDelta:e.reasoningDelta,reasoningSoFar:e.reasoningSoFar,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.appended`}}function createMessageCompletedEvent(e){return{data:{finishReason:e.finishReason??`stop`,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.completed`}}function createReasoningCompletedEvent(e){return{data:{reasoning:e.reasoning,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.completed`}}function createResultCompletedEvent(e){return{data:{result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`result.completed`}}function createStepStartedEvent(e){return{data:{sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.started`}}function createStepCompletedEvent(e){let t={finishReason:e.finishReason,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.usage!==void 0&&(t.usage=e.usage),{data:t,type:`step.completed`}}function createStepFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.failed`}}function createTurnCompletedEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.completed`}}function createTurnFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,turnId:e.turnId},type:`turn.failed`}}function createCompactionRequestedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId,usageInputTokens:e.usageInputTokens??null},type:`compaction.requested`}}function createCompactionCompletedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId},type:`compaction.completed`}}function createSessionWaitingEvent(){return{data:{wait:`next-user-message`},type:`session.waiting`}}function createSessionFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sessionId:e.sessionId},type:`session.failed`}}function createSessionCompletedEvent(){return{type:`session.completed`}}function timestampHandleMessageStreamEvent(e,t=new Date().toISOString()){return{...e,meta:{at:t}}}function encodeMessageStreamEvent(e){return textEncoder.encode(`${JSON.stringify(e)}\n`)}function normalizeActionResultOutcome(e){if(e.isError===!0)return{error:buildActionResultError(e),status:`failed`};let t=readActionResultOutputError(e.output);return t===void 0?{status:`completed`}:{error:t,status:`failed`}}function buildActionResultError(e){let t=readActionResultOutputError(e.output);return t===void 0?{code:`ACTION_RESULT_FAILED`,message:formatActionResultOutput(e.output)}:t}function readActionResultOutputError(e){let t=parseActionResultOutputRecord(e);if(t===void 0)return;let n=typeof t.code==`string`&&t.code.length>0?t.code:void 0,r=typeof t.message==`string`&&t.message.length>0?t.message:void 0;if(!(n===void 0||r===void 0))return{code:n,message:r}}function parseActionResultOutputRecord(e){if(typeof e==`object`&&e)return e;if(typeof e!=`string`)return;let t=e.trim();if(t.length!==0)try{let e=JSON.parse(t);if(typeof e==`object`&&e)return e}catch{return}}function formatActionResultOutput(e){if(typeof e==`string`)return e;let t=JSON.stringify(e);return typeof t==`string`&&t.length>0?t:`Action failed.`}export{EVE_MESSAGE_STREAM_CONTENT_TYPE,EVE_MESSAGE_STREAM_FORMAT,EVE_MESSAGE_STREAM_VERSION,EVE_SESSION_ID_HEADER,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_VERSION_HEADER,createActionResultEvent,createActionsRequestedEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createInputRequestedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepCompletedEvent,createStepFailedEvent,createStepStartedEvent,createSubagentCalledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,encodeMessageStreamEvent,isCurrentTurnBoundaryEvent,isTurnFailureEvent,timestampHandleMessageStreamEvent};
1
+ import{deserializeUrlFilePart,hasInternalRefScheme,isSerializedUrlFilePart}from"#internal/attachments/url-refs.js";import{decodeSandboxRef,isSandboxRefUrl}from"#internal/attachments/sandbox-refs.js";const EVE_SESSION_ID_HEADER=`x-eve-session-id`,EVE_STREAM_FORMAT_HEADER=`x-eve-stream-format`,EVE_STREAM_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=`18`,textEncoder=new TextEncoder;function isCurrentTurnBoundaryEvent(e){return e.type===`session.completed`||e.type===`session.failed`||e.type===`session.waiting`}function isTurnFailureEvent(e){return e.type===`session.failed`||e.type===`step.failed`||e.type===`turn.failed`}function createSessionStartedEvent(e){let t={};return e?.invocation!==void 0&&(t.invocation=e.invocation),e?.runtime!==void 0&&(t.runtime=e.runtime),{data:t,type:`session.started`}}function createTurnStartedEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.started`}}function createMessageReceivedEvent(e){return{data:{message:summarizeUserContent(e.message),parts:projectUserContentParts(e.message),sequence:e.sequence,turnId:e.turnId},type:`message.received`}}function summarizeUserContent(e){if(typeof e==`string`)return e;let t=[];for(let n of e)if(n.type===`text`)t.push(n.text);else if(n.type===`file`){let e=n.filename??n.mediaType;t.push(`[file: ${e} (${n.mediaType})]`)}else n.type===`image`&&t.push(`[image: ${n.mediaType??`image`}]`);return t.join(`
2
+ `)}function projectUserContentParts(e){if(typeof e==`string`)return[{text:e,type:`text`}];let t=[];for(let n of e)n.type===`text`?t.push({text:n.text,type:`text`}):n.type===`file`?t.push(projectFileLikePart(n.data,n.mediaType,n.filename)):n.type===`image`&&t.push(projectFileLikePart(n.image,n.mediaType??`application/octet-stream`,void 0));return t}function projectFileLikePart(e,t,n){if(isSandboxRefUrl(e)){let t=decodeSandboxRef(e);return createProjectedFilePart({filename:basenameOf(n??t.path),mediaType:t.mediaType,size:t.size})}let i=projectTaggedFileData(e,t,n);if(i!==void 0)return i;let a=byteLengthOf(e);return createProjectedFilePart(a===void 0?{filename:n,mediaType:t,...clientUrlFragment(e)}:{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(r){if(isSerializedUrlFilePart(r))try{let t=deserializeUrlFilePart(r);return isClientResolvableUrl(t)?{url:t.href}:{}}catch{return{}}if(r instanceof URL)return isClientResolvableUrl(r)?{url:r.href}:{};if(typeof r!=`string`||hasInternalRefScheme(r))return{};if(r.startsWith(`data:`))return{url:r};try{let e=new URL(r);return isClientResolvableUrl(e)?{url:e.href}:{}}catch{return{}}}function isClientResolvableUrl(e){return e.protocol===`http:`||e.protocol===`https:`||e.protocol===`data:`}function basenameOf(e){let t=e.replaceAll(`\\`,`/`),n=t.slice(t.lastIndexOf(`/`)+1);return n.length>0?n:e}function createActionsRequestedEvent(e){return{data:{actions:e.actions,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`actions.requested`}}function createAuthorizationRequiredEvent(e){let t={description:e.description,name:e.name,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.authorization!==void 0&&(t.authorization=e.authorization),e.webhookUrl!==void 0&&(t.webhookUrl=e.webhookUrl),{data:t,type:`authorization.required`}}function createAuthorizationCompletedEvent(e){let t={name:e.name,outcome:e.outcome,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.authorization!==void 0&&(t.authorization=e.authorization),e.reason!==void 0&&(t.reason=e.reason),{data:t,type:`authorization.completed`}}function createInputRequestedEvent(e){return{data:{requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`input.requested`}}function createActionResultEvent(e){let t=e.rejected===!0?{error:buildActionResultError(e.result),status:`rejected`}:normalizeActionResultOutcome(e.result);return{data:{error:t.error,result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,status:t.status,turnId:e.turnId},type:`action.result`}}function createSubagentCalledEvent(e){return{data:{callId:e.callId,childSessionId:e.childSessionId,sessionId:e.sessionId,sequence:e.sequence,name:e.name,remote:e.remote,toolName:e.toolName,turnId:e.turnId,workflowId:e.workflowId},type:`subagent.called`}}function createMessageAppendedEvent(e){return{data:{messageDelta:e.messageDelta,messageSoFar:e.messageSoFar,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.appended`}}function createReasoningAppendedEvent(e){return{data:{reasoningDelta:e.reasoningDelta,reasoningSoFar:e.reasoningSoFar,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.appended`}}function createMessageCompletedEvent(e){return{data:{finishReason:e.finishReason??`stop`,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.completed`}}function createReasoningCompletedEvent(e){return{data:{reasoning:e.reasoning,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.completed`}}function createResultCompletedEvent(e){return{data:{result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`result.completed`}}function createStepStartedEvent(e){return{data:{sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.started`}}function createStepCompletedEvent(e){let t={finishReason:e.finishReason,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.usage!==void 0&&(t.usage=e.usage),e.providerMetadata!==void 0&&(t.providerMetadata=e.providerMetadata),{data:t,type:`step.completed`}}function createStepFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.failed`}}function createTurnCompletedEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.completed`}}function createTurnFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,turnId:e.turnId},type:`turn.failed`}}function createCompactionRequestedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId,usageInputTokens:e.usageInputTokens??null},type:`compaction.requested`}}function createCompactionCompletedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId},type:`compaction.completed`}}function createSessionWaitingEvent(){return{data:{wait:`next-user-message`},type:`session.waiting`}}function createSessionFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sessionId:e.sessionId},type:`session.failed`}}function createSessionCompletedEvent(){return{type:`session.completed`}}function timestampHandleMessageStreamEvent(e,t=new Date().toISOString()){return{...e,meta:{at:t}}}function encodeMessageStreamEvent(e){return textEncoder.encode(`${JSON.stringify(e)}\n`)}function normalizeActionResultOutcome(e){if(e.isError===!0)return{error:buildActionResultError(e),status:`failed`};let t=readActionResultOutputError(e.output);return t===void 0?{status:`completed`}:{error:t,status:`failed`}}function buildActionResultError(e){let t=readActionResultOutputError(e.output);return t===void 0?{code:`ACTION_RESULT_FAILED`,message:formatActionResultOutput(e.output)}:t}function readActionResultOutputError(e){let t=parseActionResultOutputRecord(e);if(t===void 0)return;let n=typeof t.code==`string`&&t.code.length>0?t.code:void 0,r=typeof t.message==`string`&&t.message.length>0?t.message:void 0;if(!(n===void 0||r===void 0))return{code:n,message:r}}function parseActionResultOutputRecord(e){if(typeof e==`object`&&e)return e;if(typeof e!=`string`)return;let t=e.trim();if(t.length!==0)try{let e=JSON.parse(t);if(typeof e==`object`&&e)return e}catch{return}}function formatActionResultOutput(e){if(typeof e==`string`)return e;let t=JSON.stringify(e);return typeof t==`string`&&t.length>0?t:`Action failed.`}export{EVE_MESSAGE_STREAM_CONTENT_TYPE,EVE_MESSAGE_STREAM_FORMAT,EVE_MESSAGE_STREAM_VERSION,EVE_SESSION_ID_HEADER,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_VERSION_HEADER,createActionResultEvent,createActionsRequestedEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createInputRequestedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepCompletedEvent,createStepFailedEvent,createStepStartedEvent,createSubagentCalledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,encodeMessageStreamEvent,isCurrentTurnBoundaryEvent,isTurnFailureEvent,timestampHandleMessageStreamEvent};
@@ -7,10 +7,25 @@ type ChatSdkSendInput = Parameters<SendFn<ChatSdkChannelState>>[0];
7
7
  /**
8
8
  * Durable channel state used by `chatSdkChannel`. Stores the last Chat SDK
9
9
  * thread for the Eve session so event handlers can post replies without
10
- * depending on hidden Chat SDK subscription state.
10
+ * depending on hidden Chat SDK subscription state, plus the bookkeeping the
11
+ * default handlers use to stream assistant output and surface typing status.
11
12
  */
12
13
  export interface ChatSdkChannelState extends Record<string, unknown> {
13
14
  thread: SerializedThread | null;
15
+ /** Message id of the in-flight streamed assistant post (edit fallback). */
16
+ anchorMessageId?: string | null;
17
+ /**
18
+ * Whether `adapter.editMessage` works for this session. Set to `false` once
19
+ * an edit throws {@link isNotImplemented}, which disables streaming edits for
20
+ * the rest of the session.
21
+ */
22
+ editSupported?: boolean;
23
+ /** Epoch ms of the last streaming edit, used to throttle edits. */
24
+ lastEditAtMs?: number | null;
25
+ /** Buffered first line of a tool-call message, surfaced as typing status. */
26
+ pendingToolCallMessage?: string | null;
27
+ /** Step index the current stream anchor belongs to (resets per step). */
28
+ streamStepIndex?: number | null;
14
29
  }
15
30
  /**
16
31
  * Thread selector accepted by `chatSdkChannel().receive`. Pass a serialized
@@ -40,6 +55,10 @@ export interface ChatSdkChannelContext<TAdapters extends ChatSdkAdapters = ChatS
40
55
  readonly bot: Chat<TAdapters>;
41
56
  readonly thread: Thread | null;
42
57
  state: ChatSdkChannelState;
58
+ /** Whether streamed deltas are delivered via a post+edit fallback. */
59
+ readonly streaming: boolean;
60
+ /** Minimum interval between streaming edits, in ms. */
61
+ readonly streamingEditIntervalMs: number;
43
62
  }
44
63
  /** Event-handler context for `chatSdkChannel`, including Eve session helpers. */
45
64
  export interface ChatSdkEventContext<TAdapters extends ChatSdkAdapters = ChatSdkAdapters> extends ChatSdkChannelContext<TAdapters>, ChannelSessionOps {
@@ -74,8 +93,8 @@ export interface ChatSdkChannelConfig<TAdapters extends ChatSdkAdapters = ChatSd
74
93
  /** Map of Chat SDK adapter name to adapter instance. */
75
94
  readonly adapters: TAdapters;
76
95
  /**
77
- * Base route for generated adapter webhooks. Defaults to `/eve/v1/chat`, so
78
- * an adapter named `slack` mounts at `/eve/v1/chat/slack`.
96
+ * Base route for generated adapter webhooks. Defaults to `/eve/v1`, so an
97
+ * adapter named `slack` mounts at `/eve/v1/slack`.
79
98
  */
80
99
  readonly route?: string;
81
100
  /**
@@ -98,6 +117,18 @@ export interface ChatSdkChannelConfig<TAdapters extends ChatSdkAdapters = ChatSd
98
117
  * resolver when continued sessions should keep user or tenant auth.
99
118
  */
100
119
  readonly resolveInputAuth?: (event: ActionEvent) => SessionAuthContext | null | Promise<SessionAuthContext | null>;
120
+ /**
121
+ * Whether the default handlers stream assistant output by posting an initial
122
+ * message and editing it as deltas arrive. Defaults to `true`. Set to `false`
123
+ * for adapters that only deliver a single message per turn (e.g. email), so
124
+ * replies post once on completion.
125
+ */
126
+ readonly streaming?: boolean;
127
+ /**
128
+ * Minimum interval between streaming edits, in ms. Defaults to `1000`. Only
129
+ * used when `streaming` is enabled and the adapter supports editing.
130
+ */
131
+ readonly streamingEditIntervalMs?: number;
101
132
  }
102
133
  /** Concrete channel value returned on `bridge.channel`. */
103
134
  export interface ChatSdkChannel extends Channel<ChatSdkChannelState, ChatSdkReceiveTarget, ChatSdkInstrumentationMetadata> {
@@ -1,3 +1,3 @@
1
- import{createLogger,extractErrorId,formatErrorHint}from"#internal/logging.js";import{ContextContainer,contextStorage}from"#context/container.js";import{ContextKey}from"#context/key.js";import{Actions,Button,Card,CardText,Chat,Message,ThreadImpl}from"#compiled/chat/index.js";import{POST,defineChannel}from"#public/definitions/defineChannel.js";const log=createLogger(`chat-sdk.channel`),ActiveWebhookKey=new ContextKey(`chat-sdk.active-webhook`);function chatSdkChannel(e){let t=new Chat(e),n=e.inputActionPrefix??`eve_input:`,a={...defaultEvents(n),...e.events};return t.onAction(async r=>{let i=decodeInputAction(r.actionId,n,r.value);if(i){if(!r.thread)throw Error(`chatSdkChannel input actions require a thread on the Chat SDK action event.`);await bridgeSend(t,{inputResponses:[i]},{auth:e.resolveInputAuth?await e.resolveInputAuth(r):null,thread:r.thread})}}),{bot:t,channel:defineChannel({kindHint:`chat-sdk`,state:initialState(),metadata:metadataFromState,context(e){return{bot:t,state:e,thread:threadFromState(t,e)}},routes:adapterNames(e.adapters).map(n=>POST(routeForAdapter(n,e),async(a,o)=>{let s=t.webhooks[n],c=new ContextContainer;return c.setVirtualContext(ActiveWebhookKey,{send:o.send}),contextStorage.run(c,()=>s(a,{...e.webhook,waitUntil(e){o.waitUntil(e)}}))})),async receive(e,{send:n}){let r=serializeReceiveTarget(t,e.target);return n(e.message,{auth:e.auth,continuationToken:r.id,state:{thread:r}})},events:a}),send(e,n){return bridgeSend(t,e,n)}}}function defaultEvents(e){return{async"turn.started"(e,t,n){await t.thread?.startTyping(`Working...`)},async"input.requested"(t,n,r){!n.thread||t.requests.length===0||await n.thread.post(renderInputRequests(t.requests,e))},async"message.completed"(e,t,n){e.finishReason===`tool-calls`||!e.message||!t.thread||await t.thread.post(e.message)},async"turn.failed"(e,t,n){await postFailure(t.thread,`I hit an error while handling your request`,e)},async"session.failed"(e,t){await postFailure(t.thread,`This session could not recover from an error`,e)}}}function renderInputRequests(e,t){return Card({children:e.flatMap(e=>renderInputRequest(e,t))})}function renderInputRequest(e,t){let n=[CardText(e.prompt)];return e.options&&e.options.length>0?(n.push(Actions(e.options.map(n=>Button({id:encodeInputAction(t,e.requestId,n.id),label:n.label,style:n.style,value:n.id})))),n):(n.push(CardText(`This request needs a freeform answer. Continue from the Eve session UI.`)),n)}async function postFailure(e,r,i){if(!e)return;let a=formatErrorHint(i),o=extractErrorId(i.details);await e.post([`${r}${a}.`,`Please try again, rephrase, or reach out if it keeps failing.`,...o?[`Error id: ${o}`]:[]].join(`
1
+ import{createLogger,extractErrorId,formatErrorHint}from"#internal/logging.js";import{ContextContainer,contextStorage}from"#context/container.js";import{ContextKey}from"#context/key.js";import{Actions,Button,Card,CardText,Chat,Message,ThreadImpl}from"#compiled/chat/index.js";import{isNotImplemented}from"#public/channels/chat-sdk/notImplemented.js";import{POST,defineChannel}from"#public/definitions/defineChannel.js";const log=createLogger(`chat-sdk.channel`),ActiveWebhookKey=new ContextKey(`chat-sdk.active-webhook`);function chatSdkChannel(e){let t=new Chat(e),n=e.inputActionPrefix??`eve_input:`,a=e.streaming??!0,o=e.streamingEditIntervalMs??1e3,s={...defaultEvents(n),...e.events};return t.onAction(async r=>{let i=decodeInputAction(r.actionId,n,r.value);if(i){if(!r.thread)throw Error(`chatSdkChannel input actions require a thread on the Chat SDK action event.`);await bridgeSend(t,{inputResponses:[i]},{auth:e.resolveInputAuth?await e.resolveInputAuth(r):null,thread:r.thread})}}),{bot:t,channel:defineChannel({kindHint:`chat-sdk`,state:initialState(),metadata:metadataFromState,context(e){return{bot:t,state:e,streaming:a,streamingEditIntervalMs:o,thread:threadFromState(t,e)}},routes:adapterNames(e.adapters).map(n=>POST(routeForAdapter(n,e),async(a,o)=>{let s=t.webhooks[n],c=new ContextContainer;return c.setVirtualContext(ActiveWebhookKey,{send:o.send}),contextStorage.run(c,()=>s(a,{...e.webhook,waitUntil(e){o.waitUntil(e)}}))})),async receive(e,{send:n}){let r=serializeReceiveTarget(t,e.target);return n(e.message,{auth:e.auth,continuationToken:r.id,state:{thread:r}})},events:s}),send(e,n){return bridgeSend(t,e,n)}}}function defaultEvents(e){return{async"turn.started"(e,t,n){t.state.pendingToolCallMessage=null,clearStream(t.state),await safeStartTyping(t.thread,`Working...`)},async"actions.requested"(e,t,n){let r=t.state.pendingToolCallMessage;if(t.state.pendingToolCallMessage=null,r){await safeStartTyping(t.thread,truncate(r));return}let i=e.actions.map(e=>e.kind===`tool-call`?e.toolName:e.kind);await safeStartTyping(t.thread,truncate(`Running ${i.join(`, `)}...`))},async"message.appended"(e,t,n){if(!t.thread||!e.messageSoFar||!canStream(t))return;let r=t.state.anchorMessageId;if(!r||t.state.streamStepIndex!==e.stepIndex){let n=await t.thread.post({markdown:e.messageSoFar});t.state.anchorMessageId=n.id,t.state.streamStepIndex=e.stepIndex,t.state.lastEditAtMs=Date.now();return}let i=t.state.lastEditAtMs??0;if(!(Date.now()-i<t.streamingEditIntervalMs))try{await editMessage(t.thread,r,e.messageSoFar),t.state.lastEditAtMs=Date.now()}catch(e){if(!isNotImplemented(e))throw e;t.state.editSupported=!1,clearStream(t.state)}},async"input.requested"(t,n,r){!n.thread||t.requests.length===0||await n.thread.post(renderInputRequests(t.requests,e))},async"message.completed"(e,t,n){if(e.finishReason===`tool-calls`){t.state.pendingToolCallMessage=e.message?firstNonEmptyLine(e.message)??null:null,e.message?await finalizeStreamedMessage(t,e.message,!1):clearStream(t.state);return}if(t.state.pendingToolCallMessage=null,!e.message){clearStream(t.state);return}await finalizeStreamedMessage(t,e.message,!0)},async"turn.failed"(e,t,n){await postFailure(t.thread,`I hit an error while handling your request`,e)},async"session.failed"(e,t){await postFailure(t.thread,`This session could not recover from an error`,e)}}}async function safeStartTyping(e,t){if(e)try{await e.startTyping(t)}catch(e){if(!isNotImplemented(e))throw e}}async function editMessage(e,t,n){await e.adapter.editMessage(e.id,t,{markdown:n})}async function finalizeStreamedMessage(e,t,n){let r=e.thread;if(!r){clearStream(e.state);return}let i=e.state.anchorMessageId;if(canStream(e)&&i)try{await editMessage(r,i,t)}catch(i){if(!isNotImplemented(i))throw i;e.state.editSupported=!1,n&&await r.post({markdown:t})}else n&&await r.post({markdown:t});clearStream(e.state)}function canStream(e){return e.streaming&&e.state.editSupported!==!1}function clearStream(e){e.anchorMessageId=null,e.lastEditAtMs=null,e.streamStepIndex=null}function firstNonEmptyLine(e){for(let t of e.split(/\r?\n/u)){let e=t.trim();if(e.length>0)return e}}function truncate(e,t=80){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}function renderInputRequests(e,t){return Card({children:e.flatMap(e=>renderInputRequest(e,t))})}function renderInputRequest(e,t){let n=[CardText(e.prompt)];return e.options&&e.options.length>0?(n.push(Actions(e.options.map(n=>Button({id:encodeInputAction(t,e.requestId,n.id),label:n.label,style:n.style,value:n.id})))),n):(n.push(CardText(`This request needs a freeform answer. Continue from the Eve session UI.`)),n)}async function postFailure(e,r,i){if(!e)return;let a=formatErrorHint(i),o=extractErrorId(i.details);await e.post([`${r}${a}.`,`Please try again, rephrase, or reach out if it keeps failing.`,...o?[`Error id: ${o}`]:[]].join(`
2
2
 
3
- `))}async function bridgeSend(e,t,n){let r=contextStorage.getStore()?.get(ActiveWebhookKey);if(!r)throw Error(`chatSdkChannel().send can only run during a Chat SDK webhook handler for this bridge.`);let a=serializeThread(e,n.thread,n.adapterName),o={auth:n.auth??null,continuationToken:a.id,state:{thread:a}};return n.callback&&(o.callback=n.callback),n.mode&&(o.mode=n.mode),n.title&&(o.title=n.title),r.send(t,o)}function initialState(){return{thread:null}}function metadataFromState(e){return{adapterName:e.thread?.adapterName??null,channelId:e.thread?.channelId??null,isDM:e.thread?.isDM??null,threadId:e.thread?.id??null}}function threadFromState(e,t){if(!t.thread)return null;try{let n=t.thread;return new ThreadImpl({adapter:e.getAdapter(n.adapterName),channelId:n.channelId,channelVisibility:n.channelVisibility,currentMessage:n.currentMessage?Message.fromJSON(n.currentMessage):void 0,id:n.id,isDM:n.isDM,stateAdapter:e.getState()})}catch(e){return log.warn(`failed to rebuild Chat SDK thread from channel state`,{error:e}),null}}function serializeReceiveTarget(e,t){if(t.thread)return t.thread;if(!t.threadId)throw Error(`chatSdkChannel().receive requires target.thread or target.threadId.`);return serializeThread(e,t.threadId,t.adapterName)}function serializeThread(e,t,n){if(typeof t==`string`){let r=n??inferAdapterName(t),i=e.getAdapter(r);return{_type:`chat:Thread`,adapterName:r,channelId:i.channelIdFromThreadId(t),channelVisibility:i.getChannelVisibility?.(t),id:t,isDM:!1}}return isSerializedThread(t)?t:t.toJSON()}function isSerializedThread(e){return`_type`in e&&e._type===`chat:Thread`}function inferAdapterName(e){let t=e.indexOf(`:`);if(t<=0)throw Error(`chatSdkChannel string thread references require options.adapterName.`);return e.slice(0,t)}function adapterNames(e){return Object.keys(e)}function routeForAdapter(e,t){return t.routes?.[e]||`${(t.route??`/eve/v1/chat`).replace(/\/$/u,``)}/${e}`}function encodeInputAction(e,t,n){return`${e}${encodeURIComponent(t)}:${encodeURIComponent(n)}`}function decodeInputAction(e,t,n){if(!e.startsWith(t))return null;let r=e.slice(t.length),i=r.indexOf(`:`);if(i<=0)return null;try{let e=decodeURIComponent(r.slice(0,i));return{optionId:n??decodeURIComponent(r.slice(i+1)),requestId:e}}catch{return null}}export{chatSdkChannel};
3
+ `))}async function bridgeSend(e,t,n){let r=contextStorage.getStore()?.get(ActiveWebhookKey);if(!r)throw Error(`chatSdkChannel().send can only run during a Chat SDK webhook handler for this bridge.`);let a=serializeThread(e,n.thread,n.adapterName),o={auth:n.auth??null,continuationToken:a.id,state:{thread:a}};return n.callback&&(o.callback=n.callback),n.mode&&(o.mode=n.mode),n.title&&(o.title=n.title),r.send(t,o)}function initialState(){return{thread:null}}function metadataFromState(e){return{adapterName:e.thread?.adapterName??null,channelId:e.thread?.channelId??null,isDM:e.thread?.isDM??null,threadId:e.thread?.id??null}}function threadFromState(e,t){if(!t.thread)return null;try{let n=t.thread;return new ThreadImpl({adapter:e.getAdapter(n.adapterName),channelId:n.channelId,channelVisibility:n.channelVisibility,currentMessage:n.currentMessage?Message.fromJSON(n.currentMessage):void 0,id:n.id,isDM:n.isDM,stateAdapter:e.getState()})}catch(e){return log.warn(`failed to rebuild Chat SDK thread from channel state`,{error:e}),null}}function serializeReceiveTarget(e,t){if(t.thread)return t.thread;if(!t.threadId)throw Error(`chatSdkChannel().receive requires target.thread or target.threadId.`);return serializeThread(e,t.threadId,t.adapterName)}function serializeThread(e,t,n){if(typeof t==`string`){let r=n??inferAdapterName(t),i=e.getAdapter(r);return{_type:`chat:Thread`,adapterName:r,channelId:i.channelIdFromThreadId(t),channelVisibility:i.getChannelVisibility?.(t),id:t,isDM:!1}}return isSerializedThread(t)?t:t.toJSON()}function isSerializedThread(e){return`_type`in e&&e._type===`chat:Thread`}function inferAdapterName(e){let t=e.indexOf(`:`);if(t<=0)throw Error(`chatSdkChannel string thread references require options.adapterName.`);return e.slice(0,t)}function adapterNames(e){return Object.keys(e)}function routeForAdapter(e,t){return t.routes?.[e]||`${(t.route??`/eve/v1`).replace(/\/$/u,``)}/${e}`}function encodeInputAction(e,t,n){return`${e}${encodeURIComponent(t)}:${encodeURIComponent(n)}`}function decodeInputAction(e,t,n){if(!e.startsWith(t))return null;let r=e.slice(t.length),i=r.indexOf(`:`);if(i<=0)return null;try{let e=decodeURIComponent(r.slice(0,i));return{optionId:n??decodeURIComponent(r.slice(i+1)),requestId:e}}catch{return null}}export{chatSdkChannel};
@@ -1 +1,3 @@
1
1
  export { chatSdkChannel, type ChatSdkChannel, type ChatSdkChannelBridge, type ChatSdkChannelConfig, type ChatSdkChannelContext, type ChatSdkChannelEvents, type ChatSdkChannelState, type ChatSdkEventContext, type ChatSdkInstrumentationMetadata, type ChatSdkReceiveTarget, type ChatSdkSendOptions, } from "#public/channels/chat-sdk/chatSdkChannel.js";
2
+ export { messageToUserContent } from "#public/channels/chat-sdk/messageToUserContent.js";
3
+ export { isNotImplemented } from "#public/channels/chat-sdk/notImplemented.js";
@@ -1 +1 @@
1
- import{chatSdkChannel}from"#public/channels/chat-sdk/chatSdkChannel.js";export{chatSdkChannel};
1
+ import{isNotImplemented}from"#public/channels/chat-sdk/notImplemented.js";import{chatSdkChannel}from"#public/channels/chat-sdk/chatSdkChannel.js";import{messageToUserContent}from"#public/channels/chat-sdk/messageToUserContent.js";export{chatSdkChannel,isNotImplemented,messageToUserContent};
@@ -0,0 +1,13 @@
1
+ import type { UserContent } from "ai";
2
+ import type { Message } from "#compiled/chat/index.js";
3
+ /**
4
+ * Converts a Chat SDK `Message` into the input shape `chatSdkChannel().send`
5
+ * accepts.
6
+ *
7
+ * Returns `message.text` when the message has no attachments. When attachments
8
+ * are present, returns an AI SDK `UserContent` array: the text (when non-empty)
9
+ * followed by one `file` part per attachment that exposes a URL. Attachments
10
+ * without a URL are skipped, and a message whose only attachments lack URLs
11
+ * falls back to `message.text`.
12
+ */
13
+ export declare function messageToUserContent(message: Message): string | UserContent;
@@ -0,0 +1 @@
1
+ function messageToUserContent(e){let t=e.attachments??[];if(t.length===0)return e.text;let n=[];e.text&&n.push({text:e.text,type:`text`});for(let e of t)e.url&&n.push({data:new URL(e.url),filename:e.name,mediaType:e.mimeType??`application/octet-stream`,type:`file`});return n.length>0?n:e.text}export{messageToUserContent};
@@ -0,0 +1,7 @@
1
+ /**
2
+ * True when `error` signals a Chat SDK operation the active adapter does not
3
+ * support. Matched by both `name` and `code` so optional capabilities such as
4
+ * typing indicators and streaming edits can degrade gracefully instead of
5
+ * failing the whole event handler.
6
+ */
7
+ export declare function isNotImplemented(error: unknown): boolean;
@@ -0,0 +1 @@
1
+ function isNotImplemented(e){return e instanceof Error&&(e.name===`NotImplementedError`||e.code===`NOT_IMPLEMENTED`)}export{isNotImplemented};
@@ -70,14 +70,15 @@ export interface SlackPostedMessage {
70
70
  * - The channel uploads each file via Slack's modern
71
71
  * `files.getUploadURLExternal` → POST bytes → `files.completeUploadExternal`
72
72
  * flow.
73
- * - For `{ markdown }` / `{ text }`: the text becomes the file post's
74
- * `initial_comment`, producing a single Slack message with text and
75
- * files.
76
- * - For `{ blocks }` / `{ card }`: the structured message lands first
77
- * via `chat.postMessage`, then the files are uploaded as a
73
+ * - For `{ text }`: the text becomes the file post's `initial_comment`,
74
+ * producing a single Slack message with text and files. Slack
75
+ * interprets `initial_comment` as mrkdwn.
76
+ * - For `{ markdown }` / `{ blocks }` / `{ card }`: the message lands
77
+ * first via `chat.postMessage`, then the files are uploaded as a
78
78
  * follow-up message in the same thread. Slack has no native way to
79
- * attach arbitrary files inside a Block Kit message, so the two
80
- * land as separate posts in the same thread.
79
+ * attach arbitrary files inside those message surfaces, and
80
+ * `initial_comment` cannot render Slack's full Markdown table/header
81
+ * support.
81
82
  */
82
83
  interface SlackPostWithFiles {
83
84
  readonly files?: readonly FileUpload[];
@@ -164,10 +165,10 @@ export interface SlackThread {
164
165
  * becomes `{ card }`. Otherwise pass a {@link SlackPostInput}
165
166
  * explicitly, any variant of which may carry `files`.
166
167
  *
167
- * With `files`, the channel runs Slack's three-step upload flow and
168
- * either attaches them to this message (markdown / text variants) or
169
- * posts them as a follow-up in the same thread (blocks / card
170
- * variants).
168
+ * With `files`, the channel runs Slack's three-step upload flow. The
169
+ * `{ text }` variant attaches files with the text as the upload
170
+ * comment; `{ markdown }`, `{ blocks }`, and `{ card }` post the
171
+ * message first and upload files as a follow-up in the same thread.
171
172
  */
172
173
  post(message: string | CardElement | SlackPostInput): Promise<SlackPostedMessage>;
173
174
  /**
@@ -251,7 +252,8 @@ interface SlackBinding {
251
252
  * Auto-anchor: when the binding starts without a `threadTs`, the first
252
253
  * `chat.postMessage` adopts its own `ts` as the thread root, updating the
253
254
  * live `threadTs` and firing `onThreadTsChanged` so the caller can
254
- * persist the anchor. Ephemerals and files-only posts do not anchor.
255
+ * persist the anchor. Ephemerals and upload-only file posts do not
256
+ * anchor.
255
257
  */
256
258
  export declare function buildSlackBinding(input: {
257
259
  readonly botToken: SlackBotToken | undefined;
@@ -1 +1 @@
1
- import{createLogger,logError}from"#internal/logging.js";import{isCardElement}from"#compiled/chat/index.js";import{callSlackApi as callSlackApi$1,fetchSlackThreadReplies,postSlackEphemeral,postSlackMessage,resolveSlackBotToken as resolveSlackBotToken$1,uploadSlackFiles}from"#compiled/@chat-adapter/slack/api.js";import{cardToBlocks,cardToFallbackText}from"#public/channels/slack/blocks.js";import{truncateTypingStatus}from"#public/channels/slack/limits.js";import{gfmToSlackMrkdwn,rewriteBareMentions,slackMrkdwnToGfm}from"#public/channels/slack/mrkdwn.js";const log=createLogger(`slack.api`);function slackContinuationToken(e,t){return`${e}:${t}`}async function resolveSlackBotToken(e){let t=e??process.env.SLACK_BOT_TOKEN;if(!t)throw Error(`SLACK_BOT_TOKEN is required.`);return resolveSlackBotToken$1(t)}async function callSlackApi(e){return callSlackApi$1(e.operation,normalizeSlackApiBody(e.body),createSlackApiOptions(e.botToken))}function createSlackRequester(e){return(t,n)=>callSlackApi({botToken:e,operation:t,body:n})}function buildSlackBinding(e){let n=createSlackRequester(e.botToken),r=[],s=e.threadTs;function handleMessageTs(t){s||t===s||(s=t,e.onThreadTsChanged?.(t))}async function uploadFiles(t,n){let r=n?.channelId??e.channelId,i=n?.threadTs??s;return uploadSlackFiles(t.map(toSlackFileUpload),{...createSlackApiOptions(e.botToken),channelId:r||void 0,initialComment:n?.initialComment,threadTs:i||void 0})}return{thread:{recentMessages:r,async post(t){let n=normalizePostInput(t),r=n.files??[],i=`blocks`in n||`card`in n;if(r.length>0&&!i){let e=await uploadFiles(r,{initialComment:`markdown`in n?rewriteBareMentions(gfmToSlackMrkdwn(n.markdown)):`text`in n?rewriteBareMentions(n.text):void 0});return{id:Array.isArray(e.raw.files)&&e.raw.files.length>0?String(e.raw.files[0].id??``):``,raw:e.raw}}let a=await postSlackMessage(buildPostMessageOptions(n,e.channelId,s,e.botToken)),c=a.id;if(handleMessageTs(c),r.length>0&&i)try{await uploadFiles(r)}catch(e){log.warn(`file upload after structured post failed`,{error:e})}return{id:c,raw:a.raw}},async postEphemeral(t,n){let r=await postSlackEphemeral({...buildPostMessageOptions(normalizePostInput(n),e.channelId,s,e.botToken),user:t});return{id:r.id,raw:r.raw}},async postDirectMessage(t,r){let i=await n(`conversations.open`,{users:t}),a=i.ok===!0?i.channel?.id:void 0;if(typeof a!=`string`||a.length===0)throw Error(`Slack conversations.open failed: ${i.error??`unknown_error`}`);let s=await postSlackMessage(buildPostMessageOptions(normalizePostInput(r),a,``,e.botToken));return{id:s.id,raw:s.raw}},async startTyping(r){if(!(!e.channelId||!s))try{let t=r===void 0?``:truncateTypingStatus(r),i={channel_id:e.channelId,thread_ts:s,status:t};t.length>0&&(i.loading_messages=[t]);let a=await n(`assistant.threads.setStatus`,i);a.ok!==!0&&log.warn(`assistant.threads.setStatus returned not-ok`,{error:a.error})}catch(n){logError(log,`startTyping threw — swallowed`,n,{channelId:e.channelId})}},async refresh(){if(r.length=0,!(!e.channelId||!s))try{let t=await fetchSlackThreadReplies({...createSlackApiOptions(e.botToken),channel:e.channelId,limit:50,ts:s});for(let e of t.messages)r.push(parseThreadMessage(e,s))}catch(n){logError(log,`refresh threw — swallowed`,n,{channelId:e.channelId})}},mentionUser(e){return`<@${e}>`}},slack:{channelId:e.channelId,get threadTs(){return s},teamId:e.teamId,request:n,uploadFiles}}}function normalizePostInput(e){return typeof e==`string`?{markdown:e}:isCardElement(e)?{card:e}:e}function buildPostMessageOptions(e,t,n,r){let i={...createSlackApiOptions(r),channel:t,threadTs:n||void 0,unfurlLinks:!1,unfurlMedia:!1};return`card`in e?(i.blocks=cardToBlocks(e.card),i.text=e.fallbackText??cardToFallbackText(e.card),i):`blocks`in e?(i.blocks=[...e.blocks],e.text!==void 0&&(i.text=e.text),i):`markdown`in e?(i.markdownText=rewriteBareMentions(e.markdown),i):(i.text=rewriteBareMentions(e.text),i)}function createSlackApiOptions(e){return{token:()=>resolveSlackBotToken(e)}}function normalizeSlackApiBody(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}function toSlackFileUpload(e){return{data:normalizeFileData(e.data),filename:e.filename}}function normalizeFileData(e){if(e instanceof ArrayBuffer||typeof Blob<`u`&&e instanceof Blob)return e;if(ArrayBuffer.isView(e)){let t=e;return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}return e}function parseThreadMessage(e,t){let n=typeof e.text==`string`?e.text:``,r=typeof e.ts==`string`?e.ts:``,i=typeof e.thread_ts==`string`?e.thread_ts:t,a=typeof e.user==`string`?e.user:void 0,o=typeof e.bot_id==`string`?e.bot_id:void 0;return{text:n,markdown:slackMrkdwnToGfm(n),user:a,botId:o,ts:r,threadTs:i,isMe:o!==void 0,raw:e}}export{buildSlackBinding,callSlackApi,resolveSlackBotToken,slackContinuationToken};
1
+ import{createLogger,logError}from"#internal/logging.js";import{isCardElement}from"#compiled/chat/index.js";import{callSlackApi as callSlackApi$1,fetchSlackThreadReplies,postSlackEphemeral,postSlackMessage,resolveSlackBotToken as resolveSlackBotToken$1,uploadSlackFiles}from"#compiled/@chat-adapter/slack/api.js";import{cardToBlocks,cardToFallbackText}from"#public/channels/slack/blocks.js";import{truncateTypingStatus}from"#public/channels/slack/limits.js";import{rewriteBareMentions,slackMrkdwnToGfm}from"#public/channels/slack/mrkdwn.js";const log=createLogger(`slack.api`);function slackContinuationToken(e,t){return`${e}:${t}`}async function resolveSlackBotToken(e){let t=e??process.env.SLACK_BOT_TOKEN;if(!t)throw Error(`SLACK_BOT_TOKEN is required.`);return resolveSlackBotToken$1(t)}async function callSlackApi(e){return callSlackApi$1(e.operation,normalizeSlackApiBody(e.body),createSlackApiOptions(e.botToken))}function createSlackRequester(e){return(t,n)=>callSlackApi({botToken:e,operation:t,body:n})}function buildSlackBinding(e){let n=createSlackRequester(e.botToken),r=[],s=e.threadTs;function handleMessageTs(t){s||t===s||(s=t,e.onThreadTsChanged?.(t))}async function uploadFiles(t,n){let r=n?.channelId??e.channelId,i=n?.threadTs??s;return uploadSlackFiles(t.map(toSlackFileUpload),{...createSlackApiOptions(e.botToken),channelId:r||void 0,initialComment:n?.initialComment,threadTs:i||void 0})}return{thread:{recentMessages:r,async post(t){let n=normalizePostInput(t),r=n.files??[],i=`blocks`in n||`card`in n||`markdown`in n;if(r.length>0&&!i){let e=await uploadFiles(r,{initialComment:`text`in n?rewriteBareMentions(n.text):void 0});return{id:Array.isArray(e.raw.files)&&e.raw.files.length>0?String(e.raw.files[0].id??``):``,raw:e.raw}}let a=await postSlackMessage(buildPostMessageOptions(n,e.channelId,s,e.botToken)),c=a.id;if(handleMessageTs(c),r.length>0&&i)try{await uploadFiles(r)}catch(e){log.warn(`file upload after message post failed`,{error:e})}return{id:c,raw:a.raw}},async postEphemeral(t,n){let r=await postSlackEphemeral({...buildPostMessageOptions(normalizePostInput(n),e.channelId,s,e.botToken),user:t});return{id:r.id,raw:r.raw}},async postDirectMessage(t,r){let i=await n(`conversations.open`,{users:t}),a=i.ok===!0?i.channel?.id:void 0;if(typeof a!=`string`||a.length===0)throw Error(`Slack conversations.open failed: ${i.error??`unknown_error`}`);let s=await postSlackMessage(buildPostMessageOptions(normalizePostInput(r),a,``,e.botToken));return{id:s.id,raw:s.raw}},async startTyping(r){if(!(!e.channelId||!s))try{let t=r===void 0?``:truncateTypingStatus(r),i={channel_id:e.channelId,thread_ts:s,status:t};t.length>0&&(i.loading_messages=[t]);let a=await n(`assistant.threads.setStatus`,i);a.ok!==!0&&log.warn(`assistant.threads.setStatus returned not-ok`,{error:a.error})}catch(n){logError(log,`startTyping threw — swallowed`,n,{channelId:e.channelId})}},async refresh(){if(r.length=0,!(!e.channelId||!s))try{let t=await fetchSlackThreadReplies({...createSlackApiOptions(e.botToken),channel:e.channelId,limit:50,ts:s});for(let e of t.messages)r.push(parseThreadMessage(e,s))}catch(n){logError(log,`refresh threw — swallowed`,n,{channelId:e.channelId})}},mentionUser(e){return`<@${e}>`}},slack:{channelId:e.channelId,get threadTs(){return s},teamId:e.teamId,request:n,uploadFiles}}}function normalizePostInput(e){return typeof e==`string`?{markdown:e}:isCardElement(e)?{card:e}:e}function buildPostMessageOptions(e,t,n,r){let i={...createSlackApiOptions(r),channel:t,threadTs:n||void 0,unfurlLinks:!1,unfurlMedia:!1};return`card`in e?(i.blocks=cardToBlocks(e.card),i.text=e.fallbackText??cardToFallbackText(e.card),i):`blocks`in e?(i.blocks=[...e.blocks],e.text!==void 0&&(i.text=e.text),i):`markdown`in e?(i.markdownText=rewriteBareMentions(e.markdown),i):(i.text=rewriteBareMentions(e.text),i)}function createSlackApiOptions(e){return{token:()=>resolveSlackBotToken(e)}}function normalizeSlackApiBody(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}function toSlackFileUpload(e){return{data:normalizeFileData(e.data),filename:e.filename}}function normalizeFileData(e){if(e instanceof ArrayBuffer||typeof Blob<`u`&&e instanceof Blob)return e;if(ArrayBuffer.isView(e)){let t=e;return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}return e}function parseThreadMessage(e,t){let n=typeof e.text==`string`?e.text:``,r=typeof e.ts==`string`?e.ts:``,i=typeof e.thread_ts==`string`?e.thread_ts:t,a=typeof e.user==`string`?e.user:void 0,o=typeof e.bot_id==`string`?e.bot_id:void 0;return{text:n,markdown:slackMrkdwnToGfm(n),user:a,botId:o,ts:r,threadTs:i,isMe:o!==void 0,raw:e}}export{buildSlackBinding,callSlackApi,resolveSlackBotToken,slackContinuationToken};
@@ -9,10 +9,13 @@ type ApprovalToolInput<TInput> = TInput extends object ? Readonly<TInput> : TInp
9
9
  * `approvedTools` is the set of tool names (or compound approval keys)
10
10
  * already approved at least once in the current session. `toolName` is the
11
11
  * runtime name of the tool being evaluated. `toolInput` is the raw input the
12
- * model passed, available for input-aware decisions.
12
+ * model passed, available for input-aware decisions. `callId` is the id of
13
+ * the call being evaluated — the same `callId` carried by the call's stream
14
+ * events and its `execute` context.
13
15
  */
14
16
  export interface ApprovalContext<TInput = Record<string, unknown>> extends SessionContext {
15
17
  readonly approvedTools: ReadonlySet<string>;
18
+ readonly callId: string;
16
19
  readonly toolInput?: ApprovalToolInput<TInput>;
17
20
  readonly toolName: string;
18
21
  }
@@ -52,6 +52,13 @@ export interface ToolAuthOptions {
52
52
  * resolves that provider inline, which lets one tool use multiple credentials.
53
53
  */
54
54
  export type ToolContext = SessionContext & {
55
+ /** Aborts when the active turn is cancelled. */
56
+ readonly abortSignal: AbortSignal;
57
+ /**
58
+ * Id of the current tool call — the same `callId` carried by the call's
59
+ * stream events and its {@link ApprovalContext}.
60
+ */
61
+ readonly callId: string;
55
62
  /**
56
63
  * Resolves the bearer token for an inline provider. This accepts the same
57
64
  * auth shapes as a connection's `auth` field, including `connect("...")`
@@ -209,3 +216,40 @@ export declare function disableTool(): DisabledToolSentinel;
209
216
  * produced by {@link disableTool}.
210
217
  */
211
218
  export declare function isDisabledToolSentinel(value: unknown): value is DisabledToolSentinel;
219
+ /**
220
+ * Marker discriminator written into the {@link ExperimentalWorkflow} opt-in
221
+ * sentinel.
222
+ */
223
+ declare const ENABLE_WORKFLOW_TOOL_SENTINEL_KIND = "eve:enable-workflow-tool";
224
+ /**
225
+ * Marker value re-exported as the default export of a file in `agent/tools/`
226
+ * (conventionally `agent/tools/workflow.ts`) to enable the framework `Workflow`
227
+ * orchestration tool. The tool is off unless this marker is present,
228
+ * mirroring the {@link disableTool} opt-out in reverse.
229
+ */
230
+ export interface EnableWorkflowToolSentinel {
231
+ readonly kind: typeof ENABLE_WORKFLOW_TOOL_SENTINEL_KIND;
232
+ }
233
+ /**
234
+ * Opt-in marker for the framework `Workflow` tool, an isolated JavaScript sandbox whose
235
+ * only callable operations are this agent's subagents and remote agents, for
236
+ * orchestrating them from model-authored JavaScript. Re-export it as the
237
+ * default export of `agent/tools/workflow.ts`:
238
+ *
239
+ * ```ts
240
+ * export { ExperimentalWorkflow as default } from "eve/tools";
241
+ * ```
242
+ *
243
+ * Only the root session sees the `Workflow` tool — delegated subagent sessions
244
+ * never get it — and one Workflow program may dispatch at most
245
+ * `limits.maxSubagents` subagent calls (default 100).
246
+ *
247
+ * The capability is experimental. The resulting model-facing tool is still
248
+ * called `Workflow`.
249
+ */
250
+ export declare const ExperimentalWorkflow: EnableWorkflowToolSentinel;
251
+ /**
252
+ * Type guard: returns whether `value` is the {@link ExperimentalWorkflow}
253
+ * opt-in sentinel.
254
+ */
255
+ export declare function isEnableWorkflowToolSentinel(value: unknown): value is EnableWorkflowToolSentinel;
@@ -1 +1 @@
1
- import{DYNAMIC_SENTINEL_KIND,TOOL_BRAND}from"#shared/dynamic-tool-definition.js";import{stampDefinitionKey}from"#public/tool-result-narrowing.js";function defineTool(e){if(e.auth!==void 0)throw Error(`defineTool: The "auth" field is no longer supported. Pass auth providers inline to ctx.getToken(provider) or ctx.requireAuth(provider).`);return Object.assign(e,{[TOOL_BRAND]:!0}),stampDefinitionKey(e,`tool:${e.description}`),e}function defineDynamic(t){let n={kind:DYNAMIC_SENTINEL_KIND,events:t.events};return stampDefinitionKey(n,`dynamic:${Object.keys(t.events).join(`,`)}`),n}const DISABLED_TOOL_SENTINEL_KIND=`eve:disabled-tool`;function disableTool(){return{kind:DISABLED_TOOL_SENTINEL_KIND}}function isDisabledToolSentinel(e){return typeof e==`object`&&!!e&&e.kind===DISABLED_TOOL_SENTINEL_KIND}export{defineDynamic,defineTool,disableTool,isDisabledToolSentinel};
1
+ import{DYNAMIC_SENTINEL_KIND,TOOL_BRAND}from"#shared/dynamic-tool-definition.js";import{stampDefinitionKey}from"#public/tool-result-narrowing.js";function defineTool(e){if(e.auth!==void 0)throw Error(`defineTool: The "auth" field is no longer supported. Pass auth providers inline to ctx.getToken(provider) or ctx.requireAuth(provider).`);return Object.assign(e,{[TOOL_BRAND]:!0}),stampDefinitionKey(e,`tool:${e.description}`),e}function defineDynamic(t){let n={kind:DYNAMIC_SENTINEL_KIND,events:t.events};return stampDefinitionKey(n,`dynamic:${Object.keys(t.events).join(`,`)}`),n}const DISABLED_TOOL_SENTINEL_KIND=`eve:disabled-tool`;function disableTool(){return{kind:DISABLED_TOOL_SENTINEL_KIND}}function isDisabledToolSentinel(e){return typeof e==`object`&&!!e&&e.kind===DISABLED_TOOL_SENTINEL_KIND}const ENABLE_WORKFLOW_TOOL_SENTINEL_KIND=`eve:enable-workflow-tool`,ExperimentalWorkflow=Object.freeze({kind:ENABLE_WORKFLOW_TOOL_SENTINEL_KIND});function isEnableWorkflowToolSentinel(e){return typeof e==`object`&&!!e&&e.kind===ENABLE_WORKFLOW_TOOL_SENTINEL_KIND}export{ExperimentalWorkflow,defineDynamic,defineTool,disableTool,isDisabledToolSentinel,isEnableWorkflowToolSentinel};
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Tool authoring helpers for `agent/tools/*.ts` files.
3
3
  */
4
- export { type DisabledToolSentinel, defineDynamic, defineTool, disableTool, isDisabledToolSentinel, type ToolAuthOptions, type ToolAuthProvider, type ToolDefinition, type ToolContext, type ToolModelOutput, } from "#public/definitions/tool.js";
4
+ export { type DisabledToolSentinel, type EnableWorkflowToolSentinel, defineDynamic, defineTool, disableTool, isDisabledToolSentinel, isEnableWorkflowToolSentinel, ExperimentalWorkflow, type ToolAuthOptions, type ToolAuthProvider, type ToolDefinition, type ToolContext, type ToolModelOutput, } from "#public/definitions/tool.js";
5
5
  export type { Approval, ApprovalContext, ApprovalStatus } from "#public/definitions/approval.js";
6
6
  export type { DynamicToolEntry, DynamicEvents, DynamicToolEvents, DynamicResolveContext, DynamicSentinel, DynamicToolSet, DynamicToolResult, } from "#shared/dynamic-tool-definition.js";
7
7
  export { type SessionContext } from "#public/definitions/callback-context.js";
@@ -1 +1 @@
1
- import{defineDynamic,defineTool,disableTool,isDisabledToolSentinel}from"#public/definitions/tool.js";import{toolResultFrom}from"#public/tool-result-narrowing.js";import{defineBashTool}from"#public/tools/define-bash-tool.js";import{defineGlobTool}from"#public/tools/define-glob-tool.js";import{defineGrepTool}from"#public/tools/define-grep-tool.js";import{defineReadFileTool}from"#public/tools/define-read-file-tool.js";import{defineWriteFileTool}from"#public/tools/define-write-file-tool.js";export{defineBashTool,defineDynamic,defineGlobTool,defineGrepTool,defineReadFileTool,defineTool,defineWriteFileTool,disableTool,isDisabledToolSentinel,toolResultFrom};
1
+ import{ExperimentalWorkflow,defineDynamic,defineTool,disableTool,isDisabledToolSentinel,isEnableWorkflowToolSentinel}from"#public/definitions/tool.js";import{toolResultFrom}from"#public/tool-result-narrowing.js";import{defineBashTool}from"#public/tools/define-bash-tool.js";import{defineGlobTool}from"#public/tools/define-glob-tool.js";import{defineGrepTool}from"#public/tools/define-grep-tool.js";import{defineReadFileTool}from"#public/tools/define-read-file-tool.js";import{defineWriteFileTool}from"#public/tools/define-write-file-tool.js";export{ExperimentalWorkflow,defineBashTool,defineDynamic,defineGlobTool,defineGrepTool,defineReadFileTool,defineTool,defineWriteFileTool,disableTool,isDisabledToolSentinel,isEnableWorkflowToolSentinel,toolResultFrom};
@@ -5,8 +5,9 @@ import type { ToolDefinition } from "#public/definitions/tool.js";
5
5
  * {@link ResolvedToolDefinition} so it can be re-exported as a public
6
6
  * {@link ToolDefinition}.
7
7
  *
8
- * Framework tools have the internal `(input) => output` signature.
8
+ * Framework tools have the internal `(input, options) => output` signature.
9
9
  * The public {@link ToolDefinition.execute} expects `(input, ctx)`.
10
- * This wrapper bridges the gap — `ctx` is trailing and omitted.
10
+ * This wrapper bridges the gap — the public `ctx` is mapped back onto the
11
+ * internal execute options.
11
12
  */
12
13
  export declare function toPublicToolDefinition(definition: ResolvedToolDefinition): ToolDefinition;
@@ -1 +1 @@
1
- function toPublicToolDefinition(e){if(!e.execute)throw Error(`Tool "${e.name}" is client-side and cannot be re-exported publicly.`);let t=e.execute,n=e.inputSchema,r={description:e.description,execute:e=>t(e),inputSchema:n??{},outputSchema:e.outputSchema};return e.approval!==void 0&&(r.approval=e.approval),r}export{toPublicToolDefinition};
1
+ function toPublicToolDefinition(e){if(!e.execute)throw Error(`Tool "${e.name}" is client-side and cannot be re-exported publicly.`);let t=e.execute,n=e.inputSchema,r={description:e.description,execute:(e,n)=>t(e,{abortSignal:n.abortSignal,messages:[],toolCallId:n.callId}),inputSchema:n??{},outputSchema:e.outputSchema};return e.approval!==void 0&&(r.approval=e.approval),r}export{toPublicToolDefinition};