eve 0.31.3 → 0.33.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 (351) hide show
  1. package/CHANGELOG.md +36 -1
  2. package/README.md +8 -4
  3. package/dist/src/channel/channel-address.d.ts +4 -1
  4. package/dist/src/channel/channel-address.js +1 -1
  5. package/dist/src/channel/channel-operations.d.ts +3 -1
  6. package/dist/src/channel/compiled-channel.d.ts +2 -1
  7. package/dist/src/channel/cross-channel-receive.d.ts +5 -2
  8. package/dist/src/channel/cross-channel-receive.js +1 -1
  9. package/dist/src/channel/session.d.ts +6 -2
  10. package/dist/src/channel/session.js +1 -1
  11. package/dist/src/channel/types.d.ts +6 -0
  12. package/dist/src/channel/types.js +1 -1
  13. package/dist/src/chunks/{use-eve-agent-CF5D6jSV.js → use-eve-agent-3oBnxzhV.js} +57 -22
  14. package/dist/src/chunks/{use-eve-agent-DbYZLG0h.js → use-eve-agent-B-Hky2f4.js} +57 -22
  15. package/dist/src/cli/commands/agent-prompt/collect-intent.md +3 -0
  16. package/dist/src/cli/commands/agent-prompt/scaffold.md +4 -2
  17. package/dist/src/cli/commands/info.js +1 -1
  18. package/dist/src/cli/commands/init-repl.d.ts +1 -1
  19. package/dist/src/cli/commands/init-repl.js +1 -1
  20. package/dist/src/cli/commands/init.d.ts +7 -0
  21. package/dist/src/cli/commands/init.js +1 -1
  22. package/dist/src/cli/commands/integration-connect.d.ts +4 -3
  23. package/dist/src/cli/commands/integration-connect.js +1 -1
  24. package/dist/src/cli/commands/integration-setup.d.ts +4 -0
  25. package/dist/src/cli/commands/integration-setup.js +1 -1
  26. package/dist/src/cli/commands/register-integration-commands.js +1 -1
  27. package/dist/src/cli/commands/register-registry-commands.js +1 -1
  28. package/dist/src/cli/commands/registry-declared-setups.d.ts +23 -0
  29. package/dist/src/cli/commands/registry-declared-setups.js +1 -0
  30. package/dist/src/cli/commands/registry-metadata.d.ts +69 -0
  31. package/dist/src/cli/commands/registry-metadata.js +1 -1
  32. package/dist/src/cli/commands/registry-package.d.ts +3 -3
  33. package/dist/src/cli/commands/registry-package.js +1 -1
  34. package/dist/src/cli/commands/registry-presentation.d.ts +20 -0
  35. package/dist/src/cli/commands/registry-presentation.js +7 -0
  36. package/dist/src/cli/commands/registry-search-presentation.d.ts +16 -0
  37. package/dist/src/cli/commands/registry-search-presentation.js +6 -0
  38. package/dist/src/cli/commands/registry-setup-command.d.ts +5 -2
  39. package/dist/src/cli/commands/registry-setup-command.js +1 -2
  40. package/dist/src/cli/commands/registry.d.ts +16 -7
  41. package/dist/src/cli/commands/registry.js +1 -6
  42. package/dist/src/cli/commands/set.d.ts +20 -0
  43. package/dist/src/cli/commands/set.js +1 -0
  44. package/dist/src/cli/commands/setup-answers.d.ts +2 -0
  45. package/dist/src/cli/commands/setup-answers.js +1 -0
  46. package/dist/src/cli/commands/setup-headless.d.ts +79 -0
  47. package/dist/src/cli/commands/setup-headless.js +1 -0
  48. package/dist/src/cli/dev/tui/runner.js +1 -1
  49. package/dist/src/cli/dev/tui/setup-commands.js +3 -3
  50. package/dist/src/cli/dev/tui/setup-flow.d.ts +8 -1
  51. package/dist/src/cli/dev/tui/setup-issues.js +1 -1
  52. package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
  53. package/dist/src/cli/dev/tui/traces/trace-conversation.d.ts +1 -1
  54. package/dist/src/cli/dev/tui/tui-prompter.js +1 -1
  55. package/dist/src/cli/option-parsers.d.ts +3 -0
  56. package/dist/src/cli/option-parsers.js +1 -1
  57. package/dist/src/cli/run.js +1 -1
  58. package/dist/src/client/agent-info-schema.d.ts +28 -5
  59. package/dist/src/client/agent-info-schema.js +1 -1
  60. package/dist/src/client/session.js +1 -1
  61. package/dist/src/client/types.d.ts +3 -0
  62. package/dist/src/client/url.d.ts +5 -0
  63. package/dist/src/client/url.js +1 -1
  64. package/dist/src/compiled/.vendor-stamp.json +8 -8
  65. package/dist/src/compiled/@ai-sdk/anthropic/index.d.ts +33 -13
  66. package/dist/src/compiled/@ai-sdk/anthropic/index.js +4 -2
  67. package/dist/src/compiled/@ai-sdk/google/index.d.ts +50 -3
  68. package/dist/src/compiled/@ai-sdk/google/index.js +7 -7
  69. package/dist/src/compiled/@ai-sdk/mcp/index.d.ts +33 -3
  70. package/dist/src/compiled/@ai-sdk/mcp/index.js +1 -1
  71. package/dist/src/compiled/@ai-sdk/openai/index.d.ts +140 -9
  72. package/dist/src/compiled/@ai-sdk/openai/index.js +9 -6
  73. package/dist/src/compiled/@ai-sdk/otel/index.js +1 -1
  74. package/dist/src/compiled/@ai-sdk/provider/index.d.ts +300 -6
  75. package/dist/src/compiled/@ai-sdk/provider-utils/index.d.ts +70 -20
  76. package/dist/src/compiled/@opentelemetry/api/index.d.ts +2 -1
  77. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/index.js +1 -1
  78. package/dist/src/compiled/@vercel/otel/index.d.ts +6 -0
  79. package/dist/src/compiled/@vercel/sandbox/index.js +1 -1
  80. package/dist/src/compiled/_chunks/node/undici-CUIybhQ2.js +95 -0
  81. package/dist/src/compiled/_chunks/workflow/dist-eUxFublw.js +77 -0
  82. package/dist/src/compiled/shadcn-registry/index.js +309 -215
  83. package/dist/src/compiler/extension-compatibility.d.ts +25 -15
  84. package/dist/src/compiler/extension-compatibility.js +1 -1
  85. package/dist/src/compiler/manifest.d.ts +119 -19
  86. package/dist/src/compiler/manifest.js +1 -1
  87. package/dist/src/compiler/model-catalog.d.ts +2 -30
  88. package/dist/src/compiler/model-catalog.js +1 -1
  89. package/dist/src/compiler/module-map.d.ts +2 -2
  90. package/dist/src/compiler/module-map.js +2 -2
  91. package/dist/src/compiler/normalize-agent-config.js +1 -1
  92. package/dist/src/compiler/normalize-instructions.js +1 -1
  93. package/dist/src/compiler/normalize-manifest.js +2 -2
  94. package/dist/src/compiler/normalize-skill.js +1 -1
  95. package/dist/src/compiler/normalize-subagent.d.ts +5 -1
  96. package/dist/src/compiler/normalize-subagent.js +1 -1
  97. package/dist/src/compiler/remote-agent-node.d.ts +4 -1
  98. package/dist/src/compiler/workspace-resources.js +1 -1
  99. package/dist/src/context/build-callback-context.js +1 -1
  100. package/dist/src/context/dynamic-model-lifecycle.d.ts +7 -2
  101. package/dist/src/context/dynamic-model-lifecycle.js +1 -1
  102. package/dist/src/context/dynamic-subagent-lifecycle.js +1 -1
  103. package/dist/src/context/hook-lifecycle.js +1 -1
  104. package/dist/src/context/keys.d.ts +8 -0
  105. package/dist/src/context/keys.js +1 -1
  106. package/dist/src/evals/session.js +1 -1
  107. package/dist/src/execution/authorization-callback-match.d.ts +14 -0
  108. package/dist/src/execution/authorization-callback-match.js +1 -0
  109. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  110. package/dist/src/execution/effective-agent-config.js +1 -1
  111. package/dist/src/execution/next-driver-action.d.ts +1 -0
  112. package/dist/src/execution/node-step.js +1 -1
  113. package/dist/src/execution/parked-delivery-wait.d.ts +16 -1
  114. package/dist/src/execution/parked-delivery-wait.js +1 -1
  115. package/dist/src/execution/sandbox/abort-bound-session.d.ts +1 -1
  116. package/dist/src/execution/sandbox/bindings/docker.js +1 -1
  117. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
  118. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -1
  119. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.d.ts +1 -0
  120. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -1
  121. package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
  122. package/dist/src/execution/sandbox/ensure.js +1 -1
  123. package/dist/src/execution/session-command-inbox.d.ts +26 -1
  124. package/dist/src/execution/session-command-inbox.js +1 -1
  125. package/dist/src/execution/session-command-wire.js +1 -1
  126. package/dist/src/execution/session.d.ts +2 -0
  127. package/dist/src/execution/session.js +2 -2
  128. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  129. package/dist/src/execution/turn-control-receiver.d.ts +2 -0
  130. package/dist/src/execution/turn-control-receiver.js +1 -1
  131. package/dist/src/execution/turn-execution-cursor.d.ts +1 -0
  132. package/dist/src/execution/turn-workflow.js +1 -1
  133. package/dist/src/execution/workflow-entry.js +1 -1
  134. package/dist/src/execution/workflow-steps.d.ts +3 -4
  135. package/dist/src/execution/workflow-steps.js +1 -1
  136. package/dist/src/harness/authorization.d.ts +24 -11
  137. package/dist/src/harness/authorization.js +1 -1
  138. package/dist/src/harness/emission.d.ts +1 -1
  139. package/dist/src/harness/emission.js +1 -1
  140. package/dist/src/harness/input-extraction.js +1 -1
  141. package/dist/src/harness/input-requests.js +1 -1
  142. package/dist/src/harness/provider-tools.d.ts +1 -1
  143. package/dist/src/harness/provider-tools.js +1 -1
  144. package/dist/src/harness/step-hooks.d.ts +1 -1
  145. package/dist/src/harness/step-hooks.js +1 -1
  146. package/dist/src/harness/tool-loop.d.ts +1 -1
  147. package/dist/src/harness/tool-loop.js +2 -2
  148. package/dist/src/harness/types.d.ts +11 -5
  149. package/dist/src/harness/types.js +1 -1
  150. package/dist/src/internal/application/package.js +1 -1
  151. package/dist/src/internal/authored-definition/core.js +1 -1
  152. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  153. package/dist/src/internal/authored-module-loader.js +1 -1
  154. package/dist/src/internal/authored-module-map-loader.js +1 -1
  155. package/dist/src/internal/model-catalog.d.ts +46 -0
  156. package/dist/src/internal/model-catalog.js +1 -0
  157. package/dist/src/internal/nitro/host/build-vercel-agent-summary.js +1 -1
  158. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  159. package/dist/src/internal/nitro/host/dev-host-fingerprint.js +1 -1
  160. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.js +1 -1
  161. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.d.ts +20 -10
  162. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
  163. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  164. package/dist/src/internal/nitro/routes/info.js +1 -1
  165. package/dist/src/internal/vercel-agent-summary.d.ts +12 -3
  166. package/dist/src/internal/vercel-agent-summary.js +1 -1
  167. package/dist/src/packages/eve-catalog/src/index.js +1 -1
  168. package/dist/src/protocol/message.d.ts +2 -2
  169. package/dist/src/protocol/message.js +1 -1
  170. package/dist/src/protocol/routes.d.ts +8 -6
  171. package/dist/src/protocol/routes.js +1 -1
  172. package/dist/src/public/channels/chat-sdk/chatSdkChannel.d.ts +5 -5
  173. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +2 -2
  174. package/dist/src/public/channels/discord/discordChannel.d.ts +3 -1
  175. package/dist/src/public/channels/discord/discordChannel.js +1 -1
  176. package/dist/src/public/channels/eve.d.ts +3 -1
  177. package/dist/src/public/channels/eve.js +1 -1
  178. package/dist/src/public/channels/github/githubChannel.d.ts +3 -1
  179. package/dist/src/public/channels/github/githubChannel.js +1 -1
  180. package/dist/src/public/channels/index.d.ts +1 -1
  181. package/dist/src/public/channels/linear/linearChannel.d.ts +3 -1
  182. package/dist/src/public/channels/linear/linearChannel.js +1 -1
  183. package/dist/src/public/channels/photon/photonIMessageChannel.d.ts +3 -1
  184. package/dist/src/public/channels/photon/photonIMessageChannel.js +1 -1
  185. package/dist/src/public/channels/slack/attachments.js +1 -1
  186. package/dist/src/public/channels/slack/defaults.js +1 -1
  187. package/dist/src/public/channels/slack/hitl.d.ts +14 -1
  188. package/dist/src/public/channels/slack/hitl.js +2 -2
  189. package/dist/src/public/channels/slack/slackChannel.d.ts +3 -1
  190. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  191. package/dist/src/public/channels/teams/teamsChannel.d.ts +3 -1
  192. package/dist/src/public/channels/teams/teamsChannel.js +1 -1
  193. package/dist/src/public/channels/telegram/telegramChannel.d.ts +3 -1
  194. package/dist/src/public/channels/telegram/telegramChannel.js +1 -1
  195. package/dist/src/public/channels/twilio/twilioChannel.d.ts +3 -1
  196. package/dist/src/public/channels/twilio/twilioChannel.js +1 -1
  197. package/dist/src/public/definitions/agent.d.ts +5 -7
  198. package/dist/src/public/definitions/agent.js +1 -1
  199. package/dist/src/public/definitions/callback-context.d.ts +2 -2
  200. package/dist/src/public/definitions/channel.d.ts +3 -1
  201. package/dist/src/public/definitions/channel.js +1 -1
  202. package/dist/src/public/definitions/sandbox.d.ts +1 -1
  203. package/dist/src/public/definitions/tool.d.ts +10 -14
  204. package/dist/src/public/definitions/tool.js +1 -1
  205. package/dist/src/public/index.d.ts +1 -1
  206. package/dist/src/public/sandbox/index.d.ts +1 -1
  207. package/dist/src/public/tools/web-search.d.ts +2 -2
  208. package/dist/src/runtime/agent/bootstrap.d.ts +19 -6
  209. package/dist/src/runtime/agent/bootstrap.js +1 -1
  210. package/dist/src/runtime/agent/model-catalog.d.ts +10 -0
  211. package/dist/src/runtime/agent/model-catalog.js +1 -0
  212. package/dist/src/runtime/agent/resolve-model.d.ts +8 -4
  213. package/dist/src/runtime/agent/resolve-model.js +1 -1
  214. package/dist/src/runtime/connections/callback-route.d.ts +4 -5
  215. package/dist/src/runtime/connections/callback-route.js +1 -1
  216. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  217. package/dist/src/runtime/framework-channels/index.js +1 -1
  218. package/dist/src/runtime/framework-tools/connection-search-dynamic.js +2 -2
  219. package/dist/src/runtime/framework-tools/todo.js +1 -1
  220. package/dist/src/runtime/input/types.d.ts +1 -4
  221. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  222. package/dist/src/runtime/resolve-agent.d.ts +2 -2
  223. package/dist/src/runtime/resolve-agent.js +1 -1
  224. package/dist/src/runtime/resolve-channel.js +1 -1
  225. package/dist/src/runtime/resolve-dynamic-subagent.d.ts +2 -5
  226. package/dist/src/runtime/subagents/dynamic-agent-config.d.ts +8 -7
  227. package/dist/src/runtime/subagents/dynamic-agent-config.js +1 -1
  228. package/dist/src/runtime/types.d.ts +11 -4
  229. package/dist/src/sandbox/state.d.ts +1 -0
  230. package/dist/src/setup/ask-editable.d.ts +22 -0
  231. package/dist/src/setup/ask-editable.js +1 -0
  232. package/dist/src/setup/ask-signals.d.ts +23 -0
  233. package/dist/src/setup/ask-signals.js +1 -0
  234. package/dist/src/setup/ask.d.ts +24 -25
  235. package/dist/src/setup/ask.js +1 -1
  236. package/dist/src/setup/boxes/deploy-project.js +1 -1
  237. package/dist/src/setup/boxes/resolve-provisioning.js +1 -1
  238. package/dist/src/setup/connection-connector.js +3 -2
  239. package/dist/src/setup/flows/deploy.d.ts +5 -3
  240. package/dist/src/setup/flows/deploy.js +1 -1
  241. package/dist/src/setup/flows/ensure-vercel-project.d.ts +5 -1
  242. package/dist/src/setup/flows/ensure-vercel-project.js +1 -1
  243. package/dist/src/setup/flows/model-source-change.d.ts +1 -0
  244. package/dist/src/setup/flows/model-source-change.js +1 -1
  245. package/dist/src/setup/flows/registry-session.d.ts +33 -0
  246. package/dist/src/setup/flows/registry-session.js +1 -0
  247. package/dist/src/setup/flows/registry.d.ts +16 -0
  248. package/dist/src/setup/flows/registry.js +1 -1
  249. package/dist/src/setup/index.js +1 -1
  250. package/dist/src/setup/integrations/discord/setup.d.ts +19 -7
  251. package/dist/src/setup/integrations/discord/setup.js +4 -3
  252. package/dist/src/setup/integrations/github/setup.d.ts +36 -7
  253. package/dist/src/setup/integrations/github/setup.js +2 -2
  254. package/dist/src/setup/integrations/linear/setup.d.ts +21 -9
  255. package/dist/src/setup/integrations/linear/setup.js +2 -2
  256. package/dist/src/setup/integrations/photon/management.d.ts +8 -1
  257. package/dist/src/setup/integrations/photon/management.js +1 -1
  258. package/dist/src/setup/integrations/photon/setup-flow.d.ts +28 -24
  259. package/dist/src/setup/integrations/photon/setup-flow.js +3 -3
  260. package/dist/src/setup/integrations/photon/setup.d.ts +1 -3
  261. package/dist/src/setup/integrations/photon/setup.js +1 -1
  262. package/dist/src/setup/integrations/registry.d.ts +1 -1
  263. package/dist/src/setup/integrations/registry.js +1 -1
  264. package/dist/src/setup/integrations/runner.d.ts +14 -11
  265. package/dist/src/setup/integrations/runner.js +1 -1
  266. package/dist/src/setup/integrations/shared/prerequisite.d.ts +17 -0
  267. package/dist/src/setup/integrations/shared/prerequisite.js +1 -0
  268. package/dist/src/setup/integrations/shared/ui.d.ts +22 -15
  269. package/dist/src/setup/integrations/shared/ui.js +2 -2
  270. package/dist/src/setup/integrations/shared/vercel-project.d.ts +11 -0
  271. package/dist/src/setup/integrations/shared/vercel-project.js +1 -0
  272. package/dist/src/setup/integrations/slack/setup.d.ts +25 -10
  273. package/dist/src/setup/integrations/slack/setup.js +1 -1
  274. package/dist/src/setup/integrations/types.d.ts +43 -13
  275. package/dist/src/setup/integrations/types.js +1 -1
  276. package/dist/src/setup/integrations/web/setup.d.ts +22 -3
  277. package/dist/src/setup/integrations/web/setup.js +1 -1
  278. package/dist/src/setup/prompter.d.ts +8 -0
  279. package/dist/src/setup/question-options.d.ts +15 -0
  280. package/dist/src/setup/question-options.js +1 -0
  281. package/dist/src/setup/registry-setup-client.d.ts +3 -4
  282. package/dist/src/setup/registry-setup-client.js +2 -2
  283. package/dist/src/setup/registry-setup-completion.d.ts +3 -0
  284. package/dist/src/setup/registry-setup-completion.js +1 -0
  285. package/dist/src/setup/registry-setup-protocol.d.ts +22 -3
  286. package/dist/src/setup/registry-setup-protocol.js +1 -1
  287. package/dist/src/setup/scaffold/create/add-to-project.d.ts +2 -0
  288. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  289. package/dist/src/setup/scaffold/create/project.d.ts +3 -1
  290. package/dist/src/setup/scaffold/create/project.js +57 -5
  291. package/dist/src/setup/scaffold/update/channels.js +1 -1
  292. package/dist/src/setup/setup-question-wire.d.ts +48 -0
  293. package/dist/src/setup/setup-question-wire.js +1 -0
  294. package/dist/src/setup/slackbot.d.ts +5 -1
  295. package/dist/src/setup/slackbot.js +1 -1
  296. package/dist/src/setup/state.d.ts +2 -2
  297. package/dist/src/shared/agent-definition.d.ts +23 -23
  298. package/dist/src/shared/agent-definition.js +1 -1
  299. package/dist/src/shared/channel-definition.d.ts +3 -1
  300. package/dist/src/shared/dynamic-tool-definition.d.ts +4 -10
  301. package/dist/src/shared/dynamic-tool-definition.js +1 -1
  302. package/dist/src/shared/sandbox-backend.d.ts +6 -0
  303. package/dist/src/shared/sandbox-session.d.ts +15 -0
  304. package/dist/src/shared/tool-definition.d.ts +2 -2
  305. package/dist/src/shared/tool-schema.d.ts +5 -4
  306. package/dist/src/shared/tool-schema.js +1 -1
  307. package/dist/src/svelte/index.js +1 -1
  308. package/dist/src/svelte/use-eve-agent.js +1 -1
  309. package/dist/src/tracing/agent-otel-provider.d.ts +5 -38
  310. package/dist/src/tracing/agent-otel-provider.js +2 -2
  311. package/dist/src/tracing/agent-span-id-generator.d.ts +15 -0
  312. package/dist/src/tracing/agent-span-id-generator.js +1 -0
  313. package/dist/src/tracing/agent-trace-context-store.d.ts +1 -1
  314. package/dist/src/tracing/agent-trace-context-store.js +1 -1
  315. package/dist/src/tracing/agent-trace-state.d.ts +41 -0
  316. package/dist/src/tracing/agent-trace-state.js +1 -0
  317. package/dist/src/tracing/local-instrumentation-runtime.js +1 -1
  318. package/dist/src/vue/index.js +1 -1
  319. package/dist/src/vue/use-eve-agent.js +1 -1
  320. package/docs/agent-config.md +30 -19
  321. package/docs/channels/chat-sdk.mdx +6 -6
  322. package/docs/channels/custom.mdx +20 -0
  323. package/docs/channels/discord.mdx +1 -0
  324. package/docs/channels/eve.mdx +2 -0
  325. package/docs/channels/github.mdx +1 -1
  326. package/docs/channels/linear.mdx +1 -1
  327. package/docs/channels/overview.mdx +21 -2
  328. package/docs/channels/photon.mdx +5 -2
  329. package/docs/channels/slack.mdx +158 -50
  330. package/docs/concepts/default-harness.md +3 -3
  331. package/docs/concepts/execution-model-and-durability.mdx +5 -8
  332. package/docs/concepts/sessions-runs-and-streaming.md +3 -3
  333. package/docs/connections/mcp.mdx +6 -0
  334. package/docs/guides/dev-tui.md +58 -142
  335. package/docs/guides/dynamic-capabilities.md +24 -20
  336. package/docs/guides/dynamic-workflows.md +2 -0
  337. package/docs/guides/frontend/overview.mdx +4 -2
  338. package/docs/guides/hooks.md +25 -3
  339. package/docs/guides/session-context.md +18 -0
  340. package/docs/install-integrations.mdx +2 -0
  341. package/docs/installation.mdx +7 -1
  342. package/docs/reference/cli.md +37 -10
  343. package/docs/reference/typescript-api.md +1 -1
  344. package/docs/sandbox.mdx +25 -5
  345. package/docs/skills.mdx +12 -1
  346. package/docs/subagents.mdx +1 -1
  347. package/docs/tools/human-in-the-loop.md +1 -1
  348. package/docs/tutorial/ship-it.mdx +1 -1
  349. package/package.json +10 -10
  350. package/dist/src/compiled/_chunks/node/undici-DWL_MYmT.js +0 -95
  351. package/dist/src/compiled/_chunks/workflow/dist-CZxNEvEs.js +0 -79
@@ -1 +1 @@
1
- import{parseCreatedSlackConnector,parseSlackConnectorDetails,pickSlackConnector}from"./slack-connect.js";import{CONNECT_LOOKUP_TIMEOUT_MS,attachSlackConnector,cleanupCreatedAttempt,fetchSlackWorkspace,findSlackConnector,listSlackConnectors,readProjectLink}from"./slack-connect-lifecycle.js";import{createSlackConnector}from"./slack-connect-create.js";import{join}from"node:path";import{SLACK_CHANNEL_DEFAULT_ROUTE}from"#setup/scaffold/index.js";import{performance}from"node:perf_hooks";import{captureVercel,runVercel,runVercelCaptureStdout}from"#setup/primitives/run-vercel.js";import{setTimeout}from"node:timers/promises";import{createPromptCommandOutput,withPhase}from"#setup/cli/index.js";import{updateSlackChannelConnectorUid}from"#setup/scaffold/update/update-slack-channel.js";const defaultDeps={captureVercel,runVercel,runVercelCaptureStdout},realDelay=(e,t)=>setTimeout(e,void 0,{signal:t}),monotonicNow=()=>performance.now();async function pollSlackWorkspace(e,t,n,i,a,s){let c=e.delay??realDelay,l=e.now??monotonicNow,u=l()+3e5;for(;;){s?.throwIfAborted();let d=u-l();if(d<=0)return{state:`timed-out`};let f=await fetchSlackWorkspace({deps:e,projectRoot:t,connectorId:n,orgId:i,onOutput:a,timeoutMs:Math.min(CONNECT_LOOKUP_TIMEOUT_MS,d),signal:s});if(s?.throwIfAborted(),f.state!==`pending`)return f;let p=u-l();if(p<=0)return{state:`timed-out`};await c(Math.min(3e3,p),s)}}function isAbortFromSignal(e,t){return t?.aborted===!0&&(e===t.reason||e instanceof Error&&e.name===`AbortError`)}function cleanupFailureResult(e){return{state:`cleanup-failed`,connectorUids:e.connectorUids}}async function runAttempt(e){let{log:t,deps:n,projectRoot:r,orgId:a,onOutput:o,signal:s,phase:c}=e,l,d;if(e.source.state===`existing`)l=e.source.ref;else{let i=await createSlackConnector({deps:n,projectRoot:r,orgId:a,slug:e.slug,onOutput:o,signal:s,phase:c,onCreated:e.onCreated,waitForWorkspace:async(e,t)=>{let i=await pollSlackWorkspace(n,r,e.id,a,o,t);return i.state===`connected`?i.workspace:void 0}});if(i.state===`failed`)return{state:`create-failed`};if(i.state===`unresolved`)return t.warning(`Vercel did not return an exact Slack connector UID for this request, so eve cannot attach or remove it safely.`),{state:`unresolved`};l=i.ref,i.via===`workspace`&&(d=i.workspace)}if(e.source.state===`existing`&&d===void 0){let e=await c(`Waiting for the Slack workspace connection...`,()=>pollSlackWorkspace(n,r,l.id,a,o,s));if(e.state===`timed-out`)return{state:`timed-out`,ref:l};if(e.state===`failed`)return{state:`failed`,ref:l,message:e.message};d=e.workspace}let f=await c(`Configuring Slack event delivery for this agent...`,()=>attachSlackConnector(n,r,l,o,s));return s?.throwIfAborted(),f.state===`attached`?d===void 0?{state:`attached`,ref:l}:{state:`attached`,ref:l,workspace:d}:{state:f.state,ref:l}}async function raceAttemptAgainstChoice(e){let t=new AbortController,n=e.outerSignal?AbortSignal.any([e.outerSignal,t.signal]):t.signal,r=e.run(n);try{let i=await Promise.race([r.then(e=>({via:`work`,outcome:e})),e.prompt.choice.then(e=>({via:`choice`,choice:e}))]);if(i.via===`work`)return i;t.abort();let a;try{a=await r}catch(e){if(!isAbortFromSignal(e,n))throw e}return{via:`choice`,choice:i.choice,settled:a}}catch(e){t.abort();try{await r}catch{}throw e}finally{e.prompt.close()}}async function provisionSlackbot(e,t,n,r=defaultDeps,i={}){i.signal?.throwIfAborted();let o=createPromptCommandOutput(e),u={log:e,deps:r,projectRoot:t,onOutput:o},d=await(r.readProjectLink??readProjectLink)(t),p=d?.projectId,m=d?.orgId,h=`slack/${n}`,g=await withPhase(e,`Checking for an existing Slackbot...`,()=>findSlackConnector(r,t,p,h,o,i.signal));if(i.signal?.throwIfAborted(),g.state===`failed`)return e.warning(`Could not inspect existing Slack connectors, so eve did not create another one. ${g.message}`),{state:`connector-lookup-failed`};if(p===void 0&&g.connectorUids.size>0)return e.warning("Could not verify which Slack connectors belong to this Vercel project, so eve did not create another one. Restore `.vercel/project.json`, then try again."),{state:`connector-lookup-failed`};let finishOutcome=async(t,n,r)=>{let i=n.state===`new`;switch(t.state){case`create-failed`:if(i){let e=await r();if(e.state===`failed`)return cleanupFailureResult(e)}return{state:`create-failed`};case`unresolved`:if(i){let e=await r();if(e.state===`failed`)return cleanupFailureResult(e)}return{state:`create-failed`};case`detach-failed`:return e.warning(`Could not remove the connector's existing trigger destination. Run \`vercel connect detach ${t.ref.uid} --yes\`, then \`vercel connect attach ${t.ref.uid} --triggers --trigger-path ${SLACK_CHANNEL_DEFAULT_ROUTE} --yes\`.`),{state:`detach-failed`,connectorUid:t.ref.uid};case`attach-failed`:return e.warning(`Could not register this project as a trigger destination. Run \`vercel connect attach ${t.ref.uid} --triggers --trigger-path ${SLACK_CHANNEL_DEFAULT_ROUTE} --yes\` to enable event delivery.`),{state:`attach-failed`,connectorUid:t.ref.uid};case`attached`:return t.workspace===void 0?{state:`attached`,connectorUid:t.ref.uid}:{state:`attached`,connectorUid:t.ref.uid,chatUrl:t.workspace.workspaceUrl,workspaceName:t.workspace.workspaceName};case`failed`:return e.warning(`Could not verify the Slack workspace connection. ${t.message}`),{state:`installation-check-failed`,connectorUid:t.ref.uid};case`timed-out`:if(e.warning(`The Slackbot did not connect to a Slack workspace in time.`),i){let e=await r();if(e.state===`failed`)return cleanupFailureResult(e)}return{state:`not-installed`}}},cleanupNewAttempt=async(e,t)=>cleanupCreatedAttempt(u,{expectedUid:h,baselineConnectorUids:e.baselineConnectorUids,createdRef:t});function attemptInput(i,a){return{log:e,deps:r,projectRoot:t,orgId:m,slug:n,source:i,onOutput:o,onCreated:a}}async function runExistingConnector(t){let cleanupCurrentAttempt=async()=>({state:`clean`}),notInstalled=()=>(e.warning(`The existing Slack connector \`${t.ref.uid}\` is not connected to a Slack workspace. eve did not remove it because this run did not create it. If its original browser request is still open, complete it; otherwise run \`vercel connect remove ${t.ref.uid} --disconnect-all --yes\` before trying again.`),{state:`existing-not-installed`,connectorUid:t.ref.uid}),finishExistingOutcome=async e=>e.state===`timed-out`?notInstalled():finishOutcome(e,t,cleanupCurrentAttempt);if(i.awaitChoice!==void 0){let e=await raceAttemptAgainstChoice({prompt:i.awaitChoice({status:`Waiting for the existing Slack workspace connection...`,context:`Complete the original setup in the browser`,actions:[{value:`cancel`,label:`Stop waiting`}]}),outerSignal:i.signal,run:e=>runAttempt({...attemptInput(t,()=>{}),signal:e,phase:(e,t)=>t()})});return e.via===`work`?finishExistingOutcome(e.outcome):e.settled?.state===`attached`?finishExistingOutcome(e.settled):notInstalled()}return finishExistingOutcome(await runAttempt({...attemptInput(t,()=>{}),signal:i.signal,phase:(t,n)=>withPhase(e,t,n)}))}async function runUncontrolledAttempt(t){let n,cleanupCurrentAttempt=()=>cleanupNewAttempt(t,n),r=runAttempt({...attemptInput(t,e=>{n=e}),signal:i.signal,phase:(t,n)=>withPhase(e,t,n)});try{return await finishOutcome(await r,t,cleanupCurrentAttempt)}catch(e){throw i.signal?.aborted===!0&&await cleanupCurrentAttempt(),e}}async function runInteractiveAttempt(n,a){let s,cleanupCurrentAttempt=()=>cleanupNewAttempt(n,s),l=a({status:`Waiting for Slack setup to finish...`,context:`Complete setup in the browser, then wait while eve verifies the connection`,actions:[{value:`retry`,label:`Did your browser not open? Try again`},{value:`cancel`,label:`Cancel`}]}),u;try{u=await raceAttemptAgainstChoice({prompt:l,outerSignal:i.signal,run:t=>runAttempt({...attemptInput(n,e=>{s=e}),signal:t,phase:e.spinner===void 0?(e,t)=>t():(t,n)=>withPhase(e,t,n)})})}catch(e){throw await cleanupCurrentAttempt(),e}if(u.via===`work`)return{state:`finished`,result:await finishOutcome(u.outcome,n,cleanupCurrentAttempt)};if(u.settled?.state===`attached`)return{state:`finished`,result:await finishOutcome(u.settled,n,cleanupCurrentAttempt)};let d=await cleanupCurrentAttempt();if(d.state===`failed`)return{state:`finished`,result:cleanupFailureResult(d)};if(u.choice===`retry`){let n=await withPhase(e,`Checking existing Slack connectors...`,()=>listSlackConnectors(r,t,o,i.signal));return i.signal?.throwIfAborted(),n.state===`failed`?(e.warning(`Could not inspect existing Slack connectors, so eve did not create another one. ${n.message}`),{state:`finished`,result:{state:`connector-lookup-failed`}}):{state:`retry`,source:{state:`new`,baselineConnectorUids:new Set(n.connectors.map(e=>e.uid))}}}return{state:`finished`,result:{state:`cancelled`}}}if(g.state===`found`){let e=i.selectConnector===void 0?g.preferred??g.connectors[0]:await i.selectConnector(g.connectors,g.preferred);if(i.signal?.throwIfAborted(),e!==`create`)return runExistingConnector({state:`existing`,ref:e})}let _={state:`new`,baselineConnectorUids:g.connectorUids};if(i.awaitChoice===void 0)return runUncontrolledAttempt(_);for(;;){let e=await runInteractiveAttempt(_,i.awaitChoice);if(e.state===`finished`)return e.result;_=e.source}}async function reconcileSlackUid(e,t,n,r){if(n.state!==`attached`||n.connectorUid===r)return!0;let{patched:i}=await updateSlackChannelConnectorUid(join(t,`agent/channels/slack.ts`),n.connectorUid);return i?!0:(e.warning(`Could not patch agent/channels/slack.ts automatically. Update \`connectSlackCredentials("...")\` to \`"${n.connectorUid}"\` and run \`vercel deploy --prod\`.`),!1)}export{parseCreatedSlackConnector,parseSlackConnectorDetails,pickSlackConnector,provisionSlackbot,reconcileSlackUid};
1
+ import{parseCreatedSlackConnector,parseSlackConnectorDetails,pickSlackConnector}from"./slack-connect.js";import{CONNECT_LOOKUP_TIMEOUT_MS,attachSlackConnector,cleanupCreatedAttempt,fetchSlackWorkspace,findSlackConnector,listSlackConnectors,readProjectLink}from"./slack-connect-lifecycle.js";import{createSlackConnector}from"./slack-connect-create.js";import{join}from"node:path";import{SLACK_CHANNEL_DEFAULT_ROUTE}from"#setup/scaffold/index.js";import{performance}from"node:perf_hooks";import{captureVercel,runVercel,runVercelCaptureStdout}from"#setup/primitives/run-vercel.js";import{setTimeout}from"node:timers/promises";import{createPromptCommandOutput,withPhase}from"#setup/cli/index.js";import{updateSlackChannelConnectorUid}from"#setup/scaffold/update/update-slack-channel.js";const defaultDeps={captureVercel,runVercel,runVercelCaptureStdout},realDelay=(e,t)=>setTimeout(e,void 0,{signal:t}),monotonicNow=()=>performance.now();async function pollSlackWorkspace(e,t,n,i,a,s){let c=e.delay??realDelay,l=e.now??monotonicNow,u=l()+3e5;for(;;){s?.throwIfAborted();let d=u-l();if(d<=0)return{state:`timed-out`};let f=await fetchSlackWorkspace({deps:e,projectRoot:t,connectorId:n,orgId:i,onOutput:a,timeoutMs:Math.min(CONNECT_LOOKUP_TIMEOUT_MS,d),signal:s});if(s?.throwIfAborted(),f.state!==`pending`)return f;let p=u-l();if(p<=0)return{state:`timed-out`};await c(Math.min(3e3,p),s)}}function isAbortFromSignal(e,t){return t?.aborted===!0&&(e===t.reason||e instanceof Error&&e.name===`AbortError`)}function cleanupFailureResult(e){return{state:`cleanup-failed`,connectorUids:e.connectorUids}}async function runAttempt(e){let{log:t,deps:n,projectRoot:r,orgId:a,onOutput:o,signal:s,phase:c}=e,l,d;if(e.source.state===`existing`)l=e.source.ref;else{let i=await createSlackConnector({deps:n,projectRoot:r,orgId:a,slug:e.slug,onOutput:o,signal:s,phase:c,onCreated:e.onCreated,waitForWorkspace:async(e,t)=>{let i=await pollSlackWorkspace(n,r,e.id,a,o,t);return i.state===`connected`?i.workspace:void 0}});if(i.state===`failed`)return{state:`create-failed`};if(i.state===`unresolved`)return t.warning(`Vercel did not return an exact Slack connector UID for this request, so eve cannot attach or remove it safely.`),{state:`unresolved`};l=i.ref,i.via===`workspace`&&(d=i.workspace)}if(e.source.state===`existing`&&d===void 0){let e=await c(`Waiting for the Slack workspace connection...`,()=>pollSlackWorkspace(n,r,l.id,a,o,s));if(e.state===`timed-out`)return{state:`timed-out`,ref:l};if(e.state===`failed`)return{state:`failed`,ref:l,message:e.message};d=e.workspace}let f=await c(`Configuring Slack event delivery for this agent...`,()=>attachSlackConnector(n,r,l,o,s));return s?.throwIfAborted(),f.state===`attached`?d===void 0?{state:`attached`,ref:l}:{state:`attached`,ref:l,workspace:d}:{state:f.state,ref:l}}async function raceAttemptAgainstChoice(e){let t=new AbortController,n=e.outerSignal?AbortSignal.any([e.outerSignal,t.signal]):t.signal,r=e.run(n);try{let i=await Promise.race([r.then(e=>({via:`work`,outcome:e})),e.prompt.choice.then(e=>({via:`choice`,choice:e}))]);if(i.via===`work`)return i;t.abort();let a;try{a=await r}catch(e){if(!isAbortFromSignal(e,n))throw e}return{via:`choice`,choice:i.choice,settled:a}}catch(e){t.abort();try{await r}catch{}throw e}finally{e.prompt.close()}}async function inspectSlackbotConnectors(e,t,n,r,i=defaultDeps){let a=await findSlackConnector(i,t,(await(i.readProjectLink??readProjectLink)(t))?.projectId,`slack/${n}`,createPromptCommandOutput(e),r);if(a.state===`failed`)throw Error(a.message);return a}async function provisionSlackbot(e,t,n,r=defaultDeps,i={}){i.signal?.throwIfAborted();let o=createPromptCommandOutput(e),u={log:e,deps:r,projectRoot:t,onOutput:o},d=await(r.readProjectLink??readProjectLink)(t),p=d?.projectId,m=d?.orgId,h=`slack/${n}`,g=await withPhase(e,`Checking for an existing Slackbot...`,()=>findSlackConnector(r,t,p,h,o,i.signal));if(i.signal?.throwIfAborted(),g.state===`failed`)return e.warning(`Could not inspect existing Slack connectors, so eve did not create another one. ${g.message}`),{state:`connector-lookup-failed`};if(p===void 0&&g.connectorUids.size>0)return e.warning("Could not verify which Slack connectors belong to this Vercel project, so eve did not create another one. Restore `.vercel/project.json`, then try again."),{state:`connector-lookup-failed`};let finishOutcome=async(t,n,r)=>{let i=n.state===`new`;switch(t.state){case`create-failed`:if(i){let e=await r();if(e.state===`failed`)return cleanupFailureResult(e)}return{state:`create-failed`};case`unresolved`:if(i){let e=await r();if(e.state===`failed`)return cleanupFailureResult(e)}return{state:`create-failed`};case`detach-failed`:return e.warning(`Could not remove the connector's existing trigger destination. Run \`vercel connect detach ${t.ref.uid} --yes\`, then \`vercel connect attach ${t.ref.uid} --triggers --trigger-path ${SLACK_CHANNEL_DEFAULT_ROUTE} --yes\`.`),{state:`detach-failed`,connectorUid:t.ref.uid};case`attach-failed`:return e.warning(`Could not register this project as a trigger destination. Run \`vercel connect attach ${t.ref.uid} --triggers --trigger-path ${SLACK_CHANNEL_DEFAULT_ROUTE} --yes\` to enable event delivery.`),{state:`attach-failed`,connectorUid:t.ref.uid};case`attached`:return t.workspace===void 0?{state:`attached`,connectorUid:t.ref.uid}:{state:`attached`,connectorUid:t.ref.uid,chatUrl:t.workspace.workspaceUrl,workspaceName:t.workspace.workspaceName};case`failed`:return e.warning(`Could not verify the Slack workspace connection. ${t.message}`),{state:`installation-check-failed`,connectorUid:t.ref.uid};case`timed-out`:if(e.warning(`The Slackbot did not connect to a Slack workspace in time.`),i){let e=await r();if(e.state===`failed`)return cleanupFailureResult(e)}return{state:`not-installed`}}},cleanupNewAttempt=async(e,t)=>cleanupCreatedAttempt(u,{expectedUid:h,baselineConnectorUids:e.baselineConnectorUids,createdRef:t});function attemptInput(i,a){return{log:e,deps:r,projectRoot:t,orgId:m,slug:n,source:i,onOutput:o,onCreated:a}}async function runExistingConnector(t){let cleanupCurrentAttempt=async()=>({state:`clean`}),notInstalled=()=>(e.warning(`The existing Slack connector \`${t.ref.uid}\` is not connected to a Slack workspace. eve did not remove it because this run did not create it. If its original browser request is still open, complete it; otherwise run \`vercel connect remove ${t.ref.uid} --disconnect-all --yes\` before trying again.`),{state:`existing-not-installed`,connectorUid:t.ref.uid}),finishExistingOutcome=async e=>e.state===`timed-out`?notInstalled():finishOutcome(e,t,cleanupCurrentAttempt);if(i.awaitChoice!==void 0){let e=await raceAttemptAgainstChoice({prompt:i.awaitChoice({status:`Waiting for the existing Slack workspace connection...`,context:`Complete the original setup in the browser`,actions:[{value:`cancel`,label:`Stop waiting`}]}),outerSignal:i.signal,run:e=>runAttempt({...attemptInput(t,()=>{}),signal:e,phase:(e,t)=>t()})});return e.via===`work`?finishExistingOutcome(e.outcome):e.settled?.state===`attached`?finishExistingOutcome(e.settled):notInstalled()}return finishExistingOutcome(await runAttempt({...attemptInput(t,()=>{}),signal:i.signal,phase:(t,n)=>withPhase(e,t,n)}))}async function runUncontrolledAttempt(t){let n,cleanupCurrentAttempt=()=>cleanupNewAttempt(t,n),r=runAttempt({...attemptInput(t,e=>{n=e}),signal:i.signal,phase:(t,n)=>withPhase(e,t,n)});try{return await finishOutcome(await r,t,cleanupCurrentAttempt)}catch(e){throw i.signal?.aborted===!0&&await cleanupCurrentAttempt(),e}}async function runInteractiveAttempt(n,a){let s,cleanupCurrentAttempt=()=>cleanupNewAttempt(n,s),l=a({status:`Waiting for Slack setup to finish...`,context:`Complete setup in the browser, then wait while eve verifies the connection`,actions:[{value:`retry`,label:`Did your browser not open? Try again`},{value:`cancel`,label:`Cancel`}]}),u;try{u=await raceAttemptAgainstChoice({prompt:l,outerSignal:i.signal,run:t=>runAttempt({...attemptInput(n,e=>{s=e}),signal:t,phase:e.spinner===void 0?(e,t)=>t():(t,n)=>withPhase(e,t,n)})})}catch(e){throw await cleanupCurrentAttempt(),e}if(u.via===`work`)return{state:`finished`,result:await finishOutcome(u.outcome,n,cleanupCurrentAttempt)};if(u.settled?.state===`attached`)return{state:`finished`,result:await finishOutcome(u.settled,n,cleanupCurrentAttempt)};let d=await cleanupCurrentAttempt();if(d.state===`failed`)return{state:`finished`,result:cleanupFailureResult(d)};if(u.choice===`retry`){let n=await withPhase(e,`Checking existing Slack connectors...`,()=>listSlackConnectors(r,t,o,i.signal));return i.signal?.throwIfAborted(),n.state===`failed`?(e.warning(`Could not inspect existing Slack connectors, so eve did not create another one. ${n.message}`),{state:`finished`,result:{state:`connector-lookup-failed`}}):{state:`retry`,source:{state:`new`,baselineConnectorUids:new Set(n.connectors.map(e=>e.uid))}}}return{state:`finished`,result:{state:`cancelled`}}}if(g.state===`found`){let e=i.selectConnector===void 0?g.preferred??g.connectors[0]:await i.selectConnector(g.connectors,g.preferred);if(i.signal?.throwIfAborted(),e!==`create`)return runExistingConnector({state:`existing`,ref:e})}let _={state:`new`,baselineConnectorUids:g.connectorUids};if(i.awaitChoice===void 0)return runUncontrolledAttempt(_);for(;;){let e=await runInteractiveAttempt(_,i.awaitChoice);if(e.state===`finished`)return e.result;_=e.source}}async function reconcileSlackUid(e,t,n,r){if(n.state!==`attached`||n.connectorUid===r)return!0;let{patched:i}=await updateSlackChannelConnectorUid(join(t,`agent/channels/slack.ts`),n.connectorUid);return i?!0:(e.warning(`Could not patch agent/channels/slack.ts automatically. Update \`connectSlackCredentials("...")\` to \`"${n.connectorUid}"\` and run \`vercel deploy --prod\`.`),!1)}export{inspectSlackbotConnectors,parseCreatedSlackConnector,parseSlackConnectorDetails,pickSlackConnector,provisionSlackbot,reconcileSlackUid};
@@ -25,7 +25,7 @@ export type ResolvedProjectPath = {
25
25
  path: string;
26
26
  };
27
27
  /**
28
- * The `--headless` Vercel project flags. Read ONLY on the headless path (see
28
+ * The `--non-interactive` Vercel project flags. Read ONLY on the headless path (see
29
29
  * {@link ProvisioningMode}): an interactive run prompts for these decisions
30
30
  * instead, so the args never reach the prompt code.
31
31
  *
@@ -41,7 +41,7 @@ export interface ArgsHeadlessProject {
41
41
  project?: string;
42
42
  }
43
43
  /**
44
- * The `--headless` AI Gateway flags, read only on the headless path alongside
44
+ * The `--non-interactive` AI Gateway flags, read only on the headless path alongside
45
45
  * {@link ArgsHeadlessProject}.
46
46
  */
47
47
  export interface ArgsHeadlessAiGateway {
@@ -43,6 +43,7 @@ export type ModelRouting = {
43
43
  export type InternalAgentModelDefinition = {
44
44
  id: string;
45
45
  contextWindowTokens?: number;
46
+ maxOutputTokens?: number;
46
47
  source?: ModuleSourceRef;
47
48
  providerOptions?: Record<string, JsonObject>;
48
49
  };
@@ -55,17 +56,15 @@ export type PublicAgentStaticModelDefinition = string | LanguageModel;
55
56
  export type AgentModelResolveContext = DynamicResolveContext;
56
57
  export interface PublicAgentModelSelectionDefinition {
57
58
  readonly model: PublicAgentStaticModelDefinition;
58
- /** Context window of the selected model, in tokens; never inherited from the fallback. */
59
+ /** Context window of the selected model, in tokens. */
59
60
  readonly modelContextWindowTokens?: number;
60
- /** Provider options for the selected model; defaults to the agent-level `modelOptions`. */
61
+ /** Provider options for the selected model. */
61
62
  readonly modelOptions?: AgentModelOptionsDefinition;
62
63
  }
63
- export type PublicAgentDynamicModelResult = PublicAgentStaticModelDefinition | PublicAgentModelSelectionDefinition | null;
64
+ export type PublicAgentDynamicModelResult = PublicAgentStaticModelDefinition | PublicAgentModelSelectionDefinition;
64
65
  export type AgentModelResolver = (event: unknown, ctx: AgentModelResolveContext) => PublicAgentDynamicModelResult | Promise<PublicAgentDynamicModelResult>;
65
- export type PublicAgentDynamicModelDefinition = DynamicSentinel<PublicAgentDynamicModelResult, PublicAgentStaticModelDefinition>;
66
+ export type PublicAgentDynamicModelDefinition = DynamicSentinel<PublicAgentDynamicModelResult>;
66
67
  export interface PublicAgentDynamicModelDefinitionInput {
67
- /** Compiled static model: build-time metadata and the active model when no scope is set. */
68
- readonly fallback: PublicAgentStaticModelDefinition;
69
68
  readonly events: DynamicSentinel<PublicAgentDynamicModelResult>["events"];
70
69
  }
71
70
  export declare function isDynamicModelDefinition(value: unknown): value is PublicAgentDynamicModelDefinition;
@@ -237,7 +236,7 @@ export type InternalAgentDefinition = {
237
236
  * package name or app-root basename). Authored definitions do not carry
238
237
  * a `name` field.
239
238
  */
240
- export type PublicAgentDefinition = {
239
+ type PublicAgentDefinitionBase = {
241
240
  /**
242
241
  * Human-readable description of the agent's purpose. Required for
243
242
  * subagents (authored under `subagents/<id>/agent.ts`): surfaced to
@@ -251,22 +250,6 @@ export type PublicAgentDefinition = {
251
250
  * {@link AgentExperimentalDefinition}.
252
251
  */
253
252
  readonly experimental?: AgentExperimentalDefinition;
254
- /**
255
- * Language model used for agent turns. Accepts an AI Gateway model ID, any AI
256
- * SDK-compatible language model, or `defineDynamic({ fallback, events })` for
257
- * scoped dynamic model selection.
258
- */
259
- readonly model: PublicAgentModelDefinition;
260
- /**
261
- * Optional override for the primary model's context window size, in tokens.
262
- *
263
- * Escape hatch for cases where eve cannot resolve the model's metadata via
264
- * the AI Gateway model catalog (e.g. a custom or unlisted model id). When
265
- * set, eve uses this value verbatim and skips the AI Gateway lookup. Prefer
266
- * leaving this unset so eve can stay in sync with provider metadata.
267
- */
268
- readonly modelContextWindowTokens?: number;
269
- readonly modelOptions?: AgentModelOptionsDefinition;
270
253
  /**
271
254
  * Provider-agnostic reasoning effort for the agent's turn model calls.
272
255
  * Support for individual levels depends on the selected model and provider.
@@ -284,3 +267,20 @@ export type PublicAgentDefinition = {
284
267
  */
285
268
  readonly outputSchema?: StandardJSONSchemaV1<unknown, unknown> | JsonObject;
286
269
  };
270
+ /**
271
+ * Shared public definition for an agent. Static models may carry definition-level
272
+ * metadata; dynamic models must return metadata with each concrete selection.
273
+ */
274
+ export type PublicAgentDefinition = PublicAgentDefinitionBase & ({
275
+ /** Language model used for agent turns. */
276
+ readonly model: PublicAgentStaticModelDefinition;
277
+ /** Optional context-window override for the static model. */
278
+ readonly modelContextWindowTokens?: number;
279
+ readonly modelOptions?: AgentModelOptionsDefinition;
280
+ } | {
281
+ /** Resolver that must select a concrete model before model-dependent work. */
282
+ readonly model: PublicAgentDynamicModelDefinition;
283
+ readonly modelContextWindowTokens?: never;
284
+ readonly modelOptions?: never;
285
+ });
286
+ export {};
@@ -1 +1 @@
1
- import{isDynamicSentinel}from"#shared/dynamic-tool-definition.js";function isDynamicModelDefinition(e){return isDynamicSentinel(e)&&`fallback`in e}export{isDynamicModelDefinition};
1
+ import{isDynamicSentinel}from"#shared/dynamic-tool-definition.js";function isDynamicModelDefinition(e){return isDynamicSentinel(e)}export{isDynamicModelDefinition};
@@ -3,7 +3,7 @@ import type { UserContent } from "ai";
3
3
  import type { ChannelReceiveContext } from "#channel/channel-operations.js";
4
4
  import type { RouteDefinition } from "#channel/routes.js";
5
5
  import type { Session, SessionHandle } from "#channel/session.js";
6
- import type { SessionAuthContext } from "#channel/types.js";
6
+ import type { SessionAuthContext, TurnPolicy } from "#channel/types.js";
7
7
  /**
8
8
  * Enriched return shape from a channel's {@link ChannelAdapter.fetchFile}
9
9
  * function. Return a bare {@link Buffer} when only bytes are known, or
@@ -40,6 +40,8 @@ export interface GenericReceiveInput<TReceiveTarget = Record<string, unknown>> {
40
40
  * projection).
41
41
  */
42
42
  export interface GenericChannelDefinition<TEvents, TState = undefined, TCtx = void, TReceiveTarget = Record<string, unknown>, TMetadata extends Record<string, unknown> = Record<string, unknown>> {
43
+ /** Policy used by message sends that do not provide an explicit override. */
44
+ readonly turnPolicy?: TurnPolicy;
43
45
  readonly state?: TState;
44
46
  /**
45
47
  * CORS policy for this channel's HTTP routes. `true` enables H3/Nitro's
@@ -106,25 +106,19 @@ export type DynamicToolEvents = {
106
106
  export type DynamicEvents<TResult = unknown> = {
107
107
  readonly [K in DynamicToolEventName]?: (event: unknown, ctx: DynamicResolveContext) => TResult | Promise<TResult>;
108
108
  };
109
- export type DynamicEventsWithFallback<TResult = unknown> = {
110
- readonly [K in DynamicToolEventName]?: (event: unknown, ctx: DynamicResolveContext) => Exclude<TResult, undefined> | Promise<Exclude<TResult, undefined>>;
111
- };
112
109
  /**
113
110
  * Marker discriminator for a `defineDynamic({ events })` export.
114
111
  */
115
112
  export declare const DYNAMIC_SENTINEL_KIND: "eve:dynamic";
116
113
  /**
117
114
  * Return value of `defineDynamic`: the runtime shape of a dynamic export,
118
- * stamped with a sentinel kind the compiler/normalizer detects. `TFallback`
119
- * is used by dynamic agent models.
115
+ * stamped with a sentinel kind the compiler/normalizer detects.
120
116
  */
121
- export type DynamicSentinel<TResult = unknown, TFallback = never> = {
117
+ export type DynamicSentinel<TResult = unknown> = {
122
118
  readonly kind: typeof DYNAMIC_SENTINEL_KIND;
123
119
  readonly events: DynamicEvents<TResult>;
124
- } & ([TFallback] extends [never] ? object : {
125
- readonly fallback: TFallback;
126
- });
127
- export declare function rejectDynamicSentinelFallback(sentinel: DynamicSentinel, message: string): void;
120
+ };
121
+ export declare function assertResolverOnlyDynamicSentinel(sentinel: DynamicSentinel, message: string): void;
128
122
  export declare function isDynamicSentinel(value: unknown): value is DynamicSentinel;
129
123
  /**
130
124
  * Symbol-based brand stamped by `defineTool` on every entry. Invisible
@@ -1 +1 @@
1
- const ALLOWED_DYNAMIC_TOOL_EVENTS=new Set([`session.started`,`turn.started`,`step.started`]),ALLOWED_DYNAMIC_INSTRUCTION_EVENTS=new Set([`session.started`,`turn.started`]),ALLOWED_DYNAMIC_SKILL_EVENTS=new Set([`session.started`,`turn.started`]),DYNAMIC_SENTINEL_KIND=`eve:dynamic`;function rejectDynamicSentinelFallback(e,t){if(`fallback`in e)throw Error(`${t} "fallback" is only supported on a dynamic agent model. For dynamic tools, skills, instructions, and subagents, return null when the capability should be omitted.`)}function isDynamicSentinel(e){return typeof e==`object`&&!!e&&e.kind===`eve:dynamic`}const TOOL_BRAND=Symbol.for(`eve:tool-brand`);function isBrandedToolEntry(e){return typeof e==`object`&&!!e&&e[TOOL_BRAND]===!0}const INSTRUCTIONS_BRAND=Symbol.for(`eve:instructions-brand`);function isBrandedInstructionsEntry(e){return typeof e==`object`&&!!e&&e[INSTRUCTIONS_BRAND]===!0}const SKILL_BRAND=Symbol.for(`eve:skill-brand`);function isBrandedSkillEntry(e){return typeof e==`object`&&!!e&&e[SKILL_BRAND]===!0}export{ALLOWED_DYNAMIC_INSTRUCTION_EVENTS,ALLOWED_DYNAMIC_SKILL_EVENTS,ALLOWED_DYNAMIC_TOOL_EVENTS,DYNAMIC_SENTINEL_KIND,INSTRUCTIONS_BRAND,SKILL_BRAND,TOOL_BRAND,isBrandedInstructionsEntry,isBrandedSkillEntry,isBrandedToolEntry,isDynamicSentinel,rejectDynamicSentinelFallback};
1
+ const ALLOWED_DYNAMIC_TOOL_EVENTS=new Set([`session.started`,`turn.started`,`step.started`]),ALLOWED_DYNAMIC_INSTRUCTION_EVENTS=new Set([`session.started`,`turn.started`]),ALLOWED_DYNAMIC_SKILL_EVENTS=new Set([`session.started`,`turn.started`]),DYNAMIC_SENTINEL_KIND=`eve:dynamic`;function assertResolverOnlyDynamicSentinel(e,t){let n=Object.keys(e).filter(e=>e!==`events`&&e!==`kind`);if(n.length>0)throw Error(`${t} Unknown key(s): ${n.join(`, `)}.`)}function isDynamicSentinel(e){return typeof e==`object`&&!!e&&e.kind===`eve:dynamic`}const TOOL_BRAND=Symbol.for(`eve:tool-brand`);function isBrandedToolEntry(e){return typeof e==`object`&&!!e&&e[TOOL_BRAND]===!0}const INSTRUCTIONS_BRAND=Symbol.for(`eve:instructions-brand`);function isBrandedInstructionsEntry(e){return typeof e==`object`&&!!e&&e[INSTRUCTIONS_BRAND]===!0}const SKILL_BRAND=Symbol.for(`eve:skill-brand`);function isBrandedSkillEntry(e){return typeof e==`object`&&!!e&&e[SKILL_BRAND]===!0}export{ALLOWED_DYNAMIC_INSTRUCTION_EVENTS,ALLOWED_DYNAMIC_SKILL_EVENTS,ALLOWED_DYNAMIC_TOOL_EVENTS,DYNAMIC_SENTINEL_KIND,INSTRUCTIONS_BRAND,SKILL_BRAND,TOOL_BRAND,assertResolverOnlyDynamicSentinel,isBrandedInstructionsEntry,isBrandedSkillEntry,isBrandedToolEntry,isDynamicSentinel};
@@ -11,6 +11,12 @@ export interface SandboxBackendHandle<SO = Record<string, never>> {
11
11
  readonly session: SandboxSession;
12
12
  readonly useSessionFn: SandboxSessionUseFn<SO>;
13
13
  captureState(): Promise<SandboxBackendSessionState>;
14
+ /**
15
+ * Stops the underlying compute at an authored runtime boundary while
16
+ * preserving any backend state needed to reopen the durable session.
17
+ * Provider errors must reject this call.
18
+ */
19
+ stop(): Promise<void>;
14
20
  /**
15
21
  * Stops the underlying compute because the eve server is shutting
16
22
  * down; nothing may be left running afterwards. The session must
@@ -119,6 +119,21 @@ export interface SandboxSession extends Pick<AiSdkSandbox, "run" | "spawn" | "re
119
119
  */
120
120
  removePath(options: SandboxRemovePathOptions): Promise<void>;
121
121
  }
122
+ /**
123
+ * Sandbox session exposed to authored runtime callbacks through
124
+ * `ctx.getSandbox()`.
125
+ *
126
+ * Unlike the I/O-only session used during sandbox initialization, this handle
127
+ * always exposes a provider-backed `stop()` method.
128
+ */
129
+ export interface RuntimeSandboxSession extends SandboxSession {
130
+ /**
131
+ * Stops the backing sandbox compute while preserving the durable session.
132
+ * A later runtime callback reopens the session through its configured
133
+ * backend. Providers may also support resuming the same handle.
134
+ */
135
+ stop(): Promise<void>;
136
+ }
122
137
  /**
123
138
  * Internal sandbox session, used to construct the public {@link SandboxSession}.
124
139
  *
@@ -1,5 +1,5 @@
1
1
  import type { ToolExecutionOptions } from "ai";
2
- import type { StandardJSONSchemaV1 } from "#compiled/@standard-schema/spec/index.js";
2
+ import type { StandardJSONSchemaV1, StandardSchemaV1 } from "#compiled/@standard-schema/spec/index.js";
3
3
  import type { JsonObject } from "#shared/json.js";
4
4
  /**
5
5
  * Options forwarded from the AI SDK to the tool's {@link ToolDefinition.execute}
@@ -22,7 +22,7 @@ export interface InternalToolDefinition extends ToolDefinitionBase {
22
22
  inputSchema: JsonObject | null;
23
23
  outputSchema?: JsonObject;
24
24
  }
25
- export type PublicToolInputSchema<TInput = unknown> = StandardJSONSchemaV1<unknown, TInput> | JsonObject;
25
+ export type PublicToolInputSchema<TInput = unknown> = StandardSchemaV1<unknown, TInput> | StandardJSONSchemaV1<unknown, TInput> | JsonObject;
26
26
  export type PublicToolOutputSchema<TOutput = unknown> = StandardJSONSchemaV1<unknown, TOutput> | JsonObject;
27
27
  /**
28
28
  * Authored public tool definition shape. Identity is derived from the
@@ -7,11 +7,12 @@ import { type JsonObject } from "#shared/json.js";
7
7
  */
8
8
  export type ToolSchema<Input = unknown, Output = Input> = StandardSchemaV1<Input, Output> & StandardJSONSchemaV1<Input, Output>;
9
9
  /**
10
- * Any value accepted at a schema boundary: a live {@link ToolSchema}, a
11
- * JSON-Schema-capable Standard Schema, or plain JSON Schema data. Plain data
12
- * is runtime-validated by {@link parseJsonObject} during conversion.
10
+ * Any value accepted at a schema boundary: a live {@link ToolSchema}, a Zod 3
11
+ * Standard Schema, a JSON-Schema-capable Standard Schema, or plain JSON Schema
12
+ * data. Plain data is runtime-validated by {@link parseJsonObject} during
13
+ * conversion.
13
14
  */
14
- export type ToolSchemaSource = StandardJSONSchemaV1 | Record<string, unknown>;
15
+ export type ToolSchemaSource = StandardJSONSchemaV1 | StandardSchemaV1 | Record<string, unknown>;
15
16
  /** `null` and `undefined` pass through every conversion untouched. */
16
17
  type SchemaResult<TSource, TResult> = TSource extends null | undefined ? TSource : TResult;
17
18
  /**
@@ -1 +1 @@
1
- import{z}from"#compiled/zod/index.js";import{toErrorMessage}from"#shared/errors.js";import{parseJsonObject}from"#shared/json.js";const rehydratedSchemas={input:new WeakMap,output:new WeakMap};function toInputSchema(e){return toSchema(e,`input`)}function toOutputSchema(e){return toSchema(e,`output`)}function serializeInputSchema(e){return serializeSchema(e,`input`)}function serializeOutputSchema(e){return serializeSchema(e,`output`)}function isToolSchema(e){if(typeof e!=`object`||!e||!(`~standard`in e))return!1;let t=e[`~standard`];if(typeof t!=`object`||!t)return!1;let n=t,r=n.jsonSchema;return typeof n.validate==`function`&&typeof r==`object`&&!!r&&typeof r.input==`function`&&typeof r.output==`function`}const UNSPECIFIED_INPUT_SCHEMA=z.fromJSONSchema({});function toSchema(e,t){if(e==null||isToolSchema(e))return e;let n=rehydratedSchemas[t],i=n.get(e);return i===void 0&&(i=rehydrateJsonSchema(toJsonObject(e,t)),n.set(e,i)),i}function rehydrateJsonSchema(n){try{return z.fromJSONSchema(n,{defaultTarget:`draft-7`})}catch{}try{return z.fromJSONSchema(n,{defaultTarget:`draft-2020-12`})}catch(e){return console.warn(`[eve] Tool schema uses JSON Schema features outside local validation support; passing input through unvalidated: ${toErrorMessage(e)}`),toPassthroughSchema(n)}}function toPassthroughSchema(e){let emit=()=>structuredClone(e);return{"~standard":{version:1,vendor:`eve`,validate:e=>({value:e}),jsonSchema:{input:emit,output:emit}}}}function serializeSchema(e,t){return e==null?e:toJsonObject(e,t)}function toJsonObject(e,t){let{$schema:r,...i}=isStandardJsonSchema(e)?parseJsonObject(e[`~standard`].jsonSchema[t]({target:`draft-07`})):parseJsonObject(e);return i}function isStandardJsonSchema(e){return typeof e==`object`&&!!e&&`~standard`in e}export{UNSPECIFIED_INPUT_SCHEMA,isToolSchema,serializeInputSchema,serializeOutputSchema,toInputSchema,toOutputSchema};
1
+ import{z}from"#compiled/zod/index.js";import{toErrorMessage}from"#shared/errors.js";import{parseJsonObject}from"#shared/json.js";import{asSchema}from"ai";const rehydratedSchemas={input:new WeakMap,output:new WeakMap};function toInputSchema(e){return toSchema(e,`input`)}function toOutputSchema(e){return toSchema(e,`output`)}function serializeInputSchema(e){return serializeSchema(e,`input`)}function serializeOutputSchema(e){return serializeSchema(e,`output`)}function isToolSchema(e){let t=getStandardSchemaProperties(e);if(t===void 0)return!1;let n=t.jsonSchema;return typeof t.validate==`function`&&typeof n==`object`&&!!n&&typeof n.input==`function`&&typeof n.output==`function`}const UNSPECIFIED_INPUT_SCHEMA=z.fromJSONSchema({});function toSchema(e,t){if(e==null||isToolSchema(e))return e;let n=rehydratedSchemas[t],r=n.get(e);return r===void 0&&(r=rehydrateJsonSchema(toJsonObject(e,t)),n.set(e,r)),r}function rehydrateJsonSchema(n){try{return z.fromJSONSchema(n,{defaultTarget:`draft-7`})}catch{}try{return z.fromJSONSchema(n,{defaultTarget:`draft-2020-12`})}catch(e){return console.warn(`[eve] Tool schema uses JSON Schema features outside local validation support; passing input through unvalidated: ${toErrorMessage(e)}`),toPassthroughSchema(n)}}function toPassthroughSchema(e){let emit=()=>structuredClone(e);return{"~standard":{version:1,vendor:`eve`,validate:e=>({value:e}),jsonSchema:{input:emit,output:emit}}}}function serializeSchema(e,t){return e==null?e:toJsonObject(e,t)}function toJsonObject(e,t){let i=getStandardSchemaProperties(e),a=i?.jsonSchema,o=typeof a==`object`&&a?a[t]:void 0,s=typeof i?.vendor==`string`?i.vendor:`unknown`;if(i!==void 0&&typeof o!=`function`&&s===`zod`){if(t===`input`){let{$schema:t,...i}=parseJsonObject(asSchema(e).jsonSchema);return i}throw Error(`Zod 3 cannot emit an output JSON Schema. Upgrade to Zod 4 or provide a plain JSON Schema object.`)}if(i!==void 0&&typeof o!=`function`)throw Error(`Standard Schema vendor "${s}" does not support JSON Schema conversion. Provide a Standard Schema implementation with JSON Schema conversion or a plain JSON Schema object.`);let{$schema:c,...l}=parseJsonObject(i===void 0?e:o({target:`draft-07`}));return l}function getStandardSchemaProperties(e){if(typeof e!=`object`||!e||!(`~standard`in e))return;let t=e[`~standard`];return typeof t==`object`&&t?t:void 0}export{UNSPECIFIED_INPUT_SCHEMA,isToolSchema,serializeInputSchema,serializeOutputSchema,toInputSchema,toOutputSchema};
@@ -1,3 +1,3 @@
1
- import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-DbYZLG0h.js";
1
+ import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-B-Hky2f4.js";
2
2
 
3
3
  export { defaultMessageReducer, useEveAgent };
@@ -1,3 +1,3 @@
1
- import { t as useEveAgent } from "../chunks/use-eve-agent-DbYZLG0h.js";
1
+ import { t as useEveAgent } from "../chunks/use-eve-agent-B-Hky2f4.js";
2
2
 
3
3
  export { useEveAgent };
@@ -1,43 +1,9 @@
1
- import { type SpanContext, type Tracer } from "#compiled/@opentelemetry/api/index.js";
2
- import type { InstrumentationContextRunner, InstrumentationProviderDefinition, InstrumentationTurnTerminalEvent } from "#harness/instrumentation-lifecycle.js";
1
+ import { type Tracer } from "#compiled/@opentelemetry/api/index.js";
2
+ import type { AgentSpanIdGenerator } from "#tracing/agent-span-id-generator.js";
3
+ import type { AgentTraceStateStore } from "#tracing/agent-trace-state.js";
4
+ import type { InstrumentationContextRunner, InstrumentationProviderDefinition } from "#harness/instrumentation-lifecycle.js";
3
5
  /** Sized so an ordinary session stays one trace and only an outsized one rolls. */
4
6
  export declare const SESSION_WINDOW_TURN_LIMIT = 200;
5
- export interface AgentSessionTraceState {
6
- readonly agentName?: string;
7
- readonly channelKind?: string;
8
- readonly context: SpanContext;
9
- readonly rootSessionId: string;
10
- readonly turnsInWindow: number;
11
- readonly window: number;
12
- }
13
- export interface AgentTurnTraceState {
14
- readonly context: SpanContext;
15
- readonly rootSessionId: string;
16
- readonly sequence: number;
17
- readonly terminal?: {
18
- readonly error?: unknown;
19
- readonly type: InstrumentationTurnTerminalEvent["type"];
20
- };
21
- }
22
- /** Provider-owned serializable storage for durable agent trace state. */
23
- export interface AgentTraceStateStore {
24
- deleteSession(sessionId: string): void | PromiseLike<void>;
25
- deleteTurn(sessionId: string, turnId: string): void | PromiseLike<void>;
26
- getSession(sessionId: string): AgentSessionTraceState | undefined | PromiseLike<AgentSessionTraceState | undefined>;
27
- getTurn(sessionId: string, turnId: string): AgentTurnTraceState | undefined | PromiseLike<AgentTurnTraceState | undefined>;
28
- setSession(sessionId: string, state: AgentSessionTraceState): void | PromiseLike<void>;
29
- setTurn(sessionId: string, turnId: string, state: AgentTurnTraceState): void | PromiseLike<void>;
30
- }
31
- /** In-memory trace state used by tests and non-durable runtimes. */
32
- export declare class InMemoryAgentTraceStateStore implements AgentTraceStateStore {
33
- #private;
34
- deleteSession(sessionId: string): void;
35
- deleteTurn(sessionId: string, turnId: string): void;
36
- getSession(sessionId: string): AgentSessionTraceState | undefined;
37
- getTurn(sessionId: string, turnId: string): AgentTurnTraceState | undefined;
38
- setSession(sessionId: string, state: AgentSessionTraceState): void;
39
- setTurn(sessionId: string, turnId: string, state: AgentTurnTraceState): void;
40
- }
41
7
  export interface AgentOtelInstrumentationInput {
42
8
  /**
43
9
  * Capture model prompts/responses and tool call inputs/outputs as span
@@ -46,6 +12,7 @@ export interface AgentOtelInstrumentationInput {
46
12
  */
47
13
  readonly captureContent?: boolean;
48
14
  readonly frameworkVersion: string;
15
+ readonly idGenerator: AgentSpanIdGenerator;
49
16
  readonly stateStore: AgentTraceStateStore;
50
17
  readonly tracer: Tracer;
51
18
  }
@@ -1,2 +1,2 @@
1
- import{ROOT_CONTEXT,SpanStatusCode,context,trace}from"#compiled/@opentelemetry/api/index.js";import{contentAttribute,messagesContentAttribute,systemPromptAttribute,textContentAttribute,toolResultsContentAttribute}from"#tracing/agent-otel-content.js";const SESSION_WINDOW_TURN_LIMIT=200;var InMemoryAgentTraceStateStore=class{#e=new Map;#t=new Map;deleteSession(e){this.#e.delete(e)}deleteTurn(e,t){this.#t.delete(turnKey(e,t))}getSession(e){return this.#e.get(e)}getTurn(e,t){return this.#t.get(turnKey(e,t))}setSession(e,t){this.#e.set(e,t)}setTurn(e,t,n){this.#t.set(turnKey(e,t),n)}};function createAgentOtelInstrumentation(e){let t=e.captureContent??!0,l=new WeakMap,u=new WeakMap,onSessionStarted=async e=>{await ensureSessionContext(e)},onTurnStarted=async t=>{let n=advanceSessionWindow(t.sessionId,await ensureSessionContext({agentName:void 0,channelKind:void 0,parentTraceContext:t.parentTraceContext,rootSessionId:t.rootSessionId,sessionId:t.sessionId,type:`session.started`})),r=e.tracer.startSpan(`agent.turn`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.name":n.agentName,...parentLineageAttributes(t.parentLineage),"agent.root.session.id":t.rootSessionId,"agent.session.id":t.sessionId,"agent.session.window":n.window,"agent.turn.id":t.turnId,"agent.turn.sequence":t.sequence}},contextFromSpanContext(n.context));r.addEvent(`turn.started`),await e.stateStore.setSession(t.sessionId,{...n,turnsInWindow:n.turnsInWindow+1}),await e.stateStore.setTurn(t.sessionId,t.turnId,{context:r.spanContext(),rootSessionId:t.rootSessionId,sequence:t.sequence}),r.end()},onAttemptStarted=async t=>{let n=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);if(n===void 0)return;let i=contextFromSpanContext(n.context),a=e.tracer.startSpan(`agent.step`,{attributes:{"agent.session.id":t.scope.sessionId,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.root.session.id":t.scope.rootSessionId??t.scope.sessionId,"agent.step.attempt":t.scope.attemptIndex,"agent.step.index":t.scope.stepIndex,"agent.turn.id":t.scope.turnId,"agent.name":t.scope.functionId}},i);a.addEvent(`step.started`);let o=trace.setSpan(i,a),s=t.operation.operationId,c=e.tracer.startSpan(s,{attributes:{"gen_ai.operation.name":s,"gen_ai.provider.name":t.operation.provider,"gen_ai.request.model":t.operation.modelId}},o);u.set(t.scope,{operation:{context:trace.setSpan(o,c),name:s,span:c},step:{context:o,span:a}})},onAttemptTerminal=e=>{l.delete(e.scope);let t=u.get(e.scope);t!==void 0&&(t.step.span.addEvent(e.type===`attempt.completed`?`step.completed`:`step.failed`),e.type===`attempt.failed`&&(recordError(t.operation.span,e.error),recordError(t.step.span,e.error)),t.operation.span.end(),t.step.span.end(),u.delete(e.scope))},onTurnTerminal=async t=>{let n=await e.stateStore.getTurn(t.sessionId,t.turnId);n!==void 0&&await e.stateStore.setTurn(t.sessionId,t.turnId,{...n,terminal:{error:t.error,type:t.type}})},onSessionTransition=async t=>{if(t.turnId!==void 0){let n=await e.stateStore.getTurn(t.sessionId,t.turnId);if(n!==void 0){let r=e.tracer.startSpan(`agent.turn.terminal`,{attributes:{"agent.root.session.id":n.rootSessionId,"agent.session.id":t.sessionId,"agent.turn.id":t.turnId,"agent.turn.sequence":n.sequence}},contextFromSpanContext(n.context));n.terminal!==void 0&&(r.addEvent(n.terminal.type),n.terminal.type===`turn.failed`&&recordError(r,n.terminal.error)),r.addEvent(t.type),r.end(),await e.stateStore.deleteTurn(t.sessionId,t.turnId)}}(t.type===`session.completed`||t.type===`session.failed`)&&await e.stateStore.deleteSession(t.sessionId)},beforeModelCall=n=>{let i=u.get(n.scope);if(i===void 0)return;i.step.span.setAttribute(`agent.model.id`,n.source.modelId),i.step.span.setAttribute(`agent.model.provider`,n.source.provider);let s=e.tracer.startSpan(modelSpanName(i.operation.name),{attributes:{"gen_ai.operation.name":i.operation.name,"gen_ai.provider.name":n.source.provider,"gen_ai.request.model":n.source.modelId}},i.operation.context);if(t){let e=messagesContentAttribute(n.source.messages);e!==void 0&&s.setAttribute(`ai.prompt.messages`,e);let t=systemPromptAttribute(n.source.instructions);t!==void 0&&s.setAttribute(`ai.prompt.system`,t)}let c={context:trace.setSpan(i.operation.context,s),span:s};return getExecutionContexts(n.scope).models.set(n.id,c.context),c},afterModelCall=(e,n)=>{if(l.get(e.scope)?.models.delete(e.id),isSpanState(n)){if(e.type===`model.call.failed`)recordError(n.span,e.error);else{setUsage(n.span,e.source.usage);let r=u.get(e.scope);if(r!==void 0&&setUsage(r.step.span,e.source.usage),t){n.span.setAttribute(`ai.response.finish_reason`,e.source.finishReason);let t=textContentAttribute(e.source.content.filter(e=>e.type===`reasoning`).map(e=>e.text).filter(e=>e.trim().length>0).join(`
2
- `));t!==void 0&&n.span.setAttribute(`ai.response.reasoning`,t);let r=textContentAttribute(e.source.content.filter(e=>e.type===`text`).map(e=>e.text).join(``));r!==void 0&&n.span.setAttribute(`ai.response.text`,r);let a=e.source.content.filter(e=>e.type===`tool-call`).map(e=>({input:e.input,toolName:e.toolName}));if(a.length>0){let e=contentAttribute(a,!1);e!==void 0&&n.span.setAttribute(`ai.response.tool_calls`,e)}let o=e.source.content.filter(e=>e.type===`tool-result`||e.type===`tool-error`).map(e=>e.type===`tool-result`?{input:e.input,output:e.output,toolName:e.toolName}:{error:errorText(e.error),input:e.input,toolName:e.toolName});if(o.length>0){let e=toolResultsContentAttribute(o);e!==void 0&&n.span.setAttribute(`ai.response.tool_results`,e)}}}n.span.end()}},beforeToolCall=n=>{let a=u.get(n.scope);if(a===void 0)return;let o=e.tracer.startSpan(`agent.action`,{attributes:{"agent.action.call_id":n.source.toolCall.toolCallId,"agent.action.kind":`tool`,"agent.action.name":n.source.toolCall.toolName,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.root.session.id":n.scope.rootSessionId??n.scope.sessionId,"agent.session.id":n.scope.sessionId,"agent.step.attempt":n.scope.attemptIndex,"agent.step.index":n.scope.stepIndex,"agent.turn.id":n.scope.turnId}},a.step.context),s=trace.setSpan(a.step.context,o),c=e.tracer.startSpan(`ai.toolCall`,{attributes:{"gen_ai.operation.name":`execute_tool`,"gen_ai.tool.call.id":n.source.toolCall.toolCallId,"gen_ai.tool.name":n.source.toolCall.toolName}},s);if(t){let e=contentAttribute(n.source.toolCall.input,!1);e!==void 0&&c.setAttribute(`gen_ai.tool.call.arguments`,e)}let l={context:trace.setSpan(s,c),span:o,toolSpan:c};return getExecutionContexts(n.scope).tools.set(n.id,l.context),l},afterToolCall=(e,n)=>{if(l.get(e.scope)?.tools.delete(e.id),isToolSpanState(n)){if(e.type===`tool.call.failed`)recordError(n.toolSpan,e.error),recordError(n.span,e.error);else if(e.source.toolOutput.type!==`tool-result`)recordError(n.toolSpan,e.source.toolOutput.error),recordError(n.span,e.source.toolOutput.error);else if(t){let t=contentAttribute(e.source.toolOutput.output,!1);t!==void 0&&n.toolSpan.setAttribute(`gen_ai.tool.call.result`,t)}n.toolSpan.end(),n.span.end()}},openSessionWindow=t=>{let n=e.tracer.startSpan(`agent.session`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.name":t.agentName,"agent.root.session.id":t.rootSessionId,"agent.session.id":t.sessionId,"agent.session.window":t.index,...t.previousTraceId===void 0?{}:{"agent.session.window.previous.trace.id":t.previousTraceId}},root:!0});return n.addEvent(t.index===0?`session.started`:`session.window.opened`),n.end(),n.spanContext()},ensureSessionContext=async t=>{let n=await e.stateStore.getSession(t.sessionId);return n===void 0&&(n={agentName:t.agentName,channelKind:t.channelKind,context:t.parentTraceContext===void 0?openSessionWindow({agentName:t.agentName,index:0,rootSessionId:t.rootSessionId,sessionId:t.sessionId}):adoptedSpanContext(t.parentTraceContext),rootSessionId:t.rootSessionId,turnsInWindow:0,window:0},await e.stateStore.setSession(t.sessionId,n)),n},advanceSessionWindow=(e,t)=>{if(t.turnsInWindow<200)return t;let n=t.window+1;return{...t,context:openSessionWindow({agentName:t.agentName,index:n,previousTraceId:t.context.traceId,rootSessionId:t.rootSessionId,sessionId:e}),turnsInWindow:0,window:n}};return{hook:{events:{"attempt.completed":onAttemptTerminal,"attempt.failed":onAttemptTerminal,"attempt.metadata":e=>{let t=u.get(e.scope);if(t===void 0)return;let n=readGatewayCost(e.providerMetadata);if(n!==void 0)for(let[e,r]of Object.entries(n))t.step.span.setAttribute(e,r)},"attempt.started":onAttemptStarted,"model.call":{after:afterModelCall,before:beforeModelCall},"session.completed":onSessionTransition,"session.failed":onSessionTransition,"session.started":onSessionStarted,"session.waiting":onSessionTransition,"tool.call":{after:afterToolCall,before:beforeToolCall},"turn.cancelled":onTurnTerminal,"turn.completed":onTurnTerminal,"turn.failed":onTurnTerminal,"turn.started":onTurnStarted}},runInContext(e,t){let r=l.get(e.scope),i=e.type===`model.call`?r?.models.get(e.id):r?.tools.get(e.id);return i===void 0?t():context.with(i,t)}};function getExecutionContexts(e){let t=l.get(e);return t===void 0&&(t={models:new Map,tools:new Map},l.set(e,t)),t}}function turnKey(e,t){return`${e}:${t}`}function parentLineageAttributes(e){if(e===void 0)return{};let t={"agent.parent.call_id":e.callId,"agent.parent.session.id":e.sessionId,"agent.parent.turn.id":e.turnId};return e.subagentName!==void 0&&(t[`agent.subagent.name`]=e.subagentName),t}function adoptedSpanContext(e){return{isRemote:!1,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function contextFromSpanContext(t){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(t))}function readGatewayCost(e){let t=e.gateway;if(!isRecord(t))return;let n={},r=readUsd(t.cost);r!==void 0&&(n[`gen_ai.usage.cost`]=r);let i=readUsd(t.gatewayCost);i!==void 0&&(n[`gen_ai.usage.gateway_cost`]=i);let a=readUsd(t.inputInferenceCost);a!==void 0&&(n[`gen_ai.usage.input_cost`]=a);let o=readUsd(t.outputInferenceCost);return o!==void 0&&(n[`gen_ai.usage.output_cost`]=o),typeof t.generationId==`string`&&t.generationId.length>0&&(n[`gen_ai.generation.id`]=t.generationId),Object.keys(n).length===0?void 0:n}function readUsd(e){if(typeof e!=`string`)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function isSpanState(e){return typeof e==`object`&&!!e&&`context`in e&&`span`in e}function isToolSpanState(e){return isSpanState(e)&&`toolSpan`in e}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function modelSpanName(e){return e===`ai.generateText`?`ai.generateText.doGenerate`:`ai.streamText.doStream`}function setUsage(e,t){t.inputTokens!==void 0&&e.setAttribute(`agent.usage.input_tokens`,t.inputTokens),t.outputTokens!==void 0&&e.setAttribute(`agent.usage.output_tokens`,t.outputTokens);let n=t.inputTokenDetails;n?.cacheReadTokens!==void 0&&e.setAttribute(`gen_ai.usage.cache_read.input_tokens`,n.cacheReadTokens),n?.cacheWriteTokens!==void 0&&e.setAttribute(`gen_ai.usage.cache_creation.input_tokens`,n.cacheWriteTokens)}function errorText(e){return e instanceof Error?e.message:e}function recordError(e,n){n instanceof Error?(e.recordException(n),e.setStatus({code:SpanStatusCode.ERROR,message:n.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{InMemoryAgentTraceStateStore,SESSION_WINDOW_TURN_LIMIT,createAgentOtelInstrumentation};
1
+ import{ROOT_CONTEXT,SpanStatusCode,context,trace}from"#compiled/@opentelemetry/api/index.js";import{contentAttribute,messagesContentAttribute,systemPromptAttribute,textContentAttribute,toolResultsContentAttribute}from"#tracing/agent-otel-content.js";const SESSION_WINDOW_TURN_LIMIT=200;function createAgentOtelInstrumentation(e){let t=e.captureContent??!0,l=new WeakMap,u=new WeakMap,onSessionStarted=async e=>{await ensureSessionContext(e)},onTurnStarted=async t=>{let n=advanceSessionWindow(t.sessionId,await ensureSessionContext({agentName:void 0,channelKind:void 0,parentTraceContext:t.parentTraceContext,rootSessionId:t.rootSessionId,sessionId:t.sessionId,type:`session.started`})),r={isRemote:!1,spanId:e.idGenerator.allocateSpanId(),traceFlags:n.context.traceFlags,traceId:n.context.traceId};await e.stateStore.setSession(t.sessionId,{...n,turnsInWindow:n.turnsInWindow+1}),await e.stateStore.setTurn(t.sessionId,t.turnId,{context:r,lineage:t.parentLineage,parentSpanId:n.context.spanId,rootSessionId:t.rootSessionId,sequence:t.sequence,startTimeMs:Date.now()})},onAttemptStarted=async t=>{let n=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);if(n===void 0)return;let i=contextFromSpanContext(n.context),a=e.tracer.startSpan(`agent.step`,{attributes:{"agent.session.id":t.scope.sessionId,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.root.session.id":t.scope.rootSessionId??t.scope.sessionId,"agent.step.attempt":t.scope.attemptIndex,"agent.step.index":t.scope.stepIndex,"agent.turn.id":t.scope.turnId,"agent.name":t.scope.functionId}},i);a.addEvent(`step.started`);let o=trace.setSpan(i,a),s=t.operation.operationId,c=e.tracer.startSpan(s,{attributes:{"gen_ai.operation.name":s,"gen_ai.provider.name":t.operation.provider,"gen_ai.request.model":t.operation.modelId}},o);u.set(t.scope,{operation:{context:trace.setSpan(o,c),name:s,span:c},step:{context:o,span:a}})},onAttemptTerminal=e=>{l.delete(e.scope);let t=u.get(e.scope);t!==void 0&&(t.step.span.addEvent(e.type===`attempt.completed`?`step.completed`:`step.failed`),e.type===`attempt.failed`&&(recordError(t.operation.span,e.error),recordError(t.step.span,e.error)),t.operation.span.end(),t.step.span.end(),u.delete(e.scope))},onTurnTerminal=async t=>{let n=await e.stateStore.getTurn(t.sessionId,t.turnId);n!==void 0&&await e.stateStore.setTurn(t.sessionId,t.turnId,{...n,terminal:{error:t.error,type:t.type}})},onSessionTransition=async t=>{if(t.turnId!==void 0){let n=await e.stateStore.getTurn(t.sessionId,t.turnId);if(n!==void 0){let r=await e.stateStore.getSession(t.sessionId),i=e.idGenerator.withSpanId(n.context.spanId,()=>e.tracer.startSpan(`agent.turn`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.name":r?.agentName,...parentLineageAttributes(n.lineage),"agent.root.session.id":n.rootSessionId,"agent.session.id":t.sessionId,"agent.session.window":r?.window,"agent.turn.id":t.turnId,"agent.turn.sequence":n.sequence},startTime:n.startTimeMs},contextFromSpanContext({isRemote:!1,spanId:n.parentSpanId,traceFlags:n.context.traceFlags,traceId:n.context.traceId})));i.addEvent(`turn.started`,void 0,n.startTimeMs),n.terminal!==void 0&&(i.addEvent(n.terminal.type),n.terminal.type===`turn.failed`&&recordError(i,n.terminal.error)),i.addEvent(t.type),i.end(),await e.stateStore.deleteTurn(t.sessionId,t.turnId)}}(t.type===`session.completed`||t.type===`session.failed`)&&await e.stateStore.deleteSession(t.sessionId)},beforeModelCall=n=>{let i=u.get(n.scope);if(i===void 0)return;i.step.span.setAttribute(`agent.model.id`,n.source.modelId),i.step.span.setAttribute(`agent.model.provider`,n.source.provider);let s=e.tracer.startSpan(modelSpanName(i.operation.name),{attributes:{"gen_ai.operation.name":i.operation.name,"gen_ai.provider.name":n.source.provider,"gen_ai.request.model":n.source.modelId}},i.operation.context);if(t){let e=messagesContentAttribute(n.source.messages);e!==void 0&&s.setAttribute(`ai.prompt.messages`,e);let t=systemPromptAttribute(n.source.instructions);t!==void 0&&s.setAttribute(`ai.prompt.system`,t)}let c={context:trace.setSpan(i.operation.context,s),span:s};return getExecutionContexts(n.scope).models.set(n.id,c.context),c},afterModelCall=(e,n)=>{if(l.get(e.scope)?.models.delete(e.id),isSpanState(n)){if(e.type===`model.call.failed`)recordError(n.span,e.error);else{setUsage(n.span,e.source.usage);let r=u.get(e.scope);if(r!==void 0&&setUsage(r.step.span,e.source.usage),t){n.span.setAttribute(`ai.response.finish_reason`,e.source.finishReason);let t=textContentAttribute(e.source.content.filter(e=>e.type===`reasoning`).map(e=>e.text).filter(e=>e.trim().length>0).join(`
2
+ `));t!==void 0&&n.span.setAttribute(`ai.response.reasoning`,t);let r=textContentAttribute(e.source.content.filter(e=>e.type===`text`).map(e=>e.text).join(``));r!==void 0&&n.span.setAttribute(`ai.response.text`,r);let a=e.source.content.filter(e=>e.type===`tool-call`).map(e=>({input:e.input,toolName:e.toolName}));if(a.length>0){let e=contentAttribute(a,!1);e!==void 0&&n.span.setAttribute(`ai.response.tool_calls`,e)}let o=e.source.content.filter(e=>e.type===`tool-result`||e.type===`tool-error`).map(e=>e.type===`tool-result`?{input:e.input,output:e.output,toolName:e.toolName}:{error:errorText(e.error),input:e.input,toolName:e.toolName});if(o.length>0){let e=toolResultsContentAttribute(o);e!==void 0&&n.span.setAttribute(`ai.response.tool_results`,e)}}}n.span.end()}},beforeToolCall=n=>{let a=u.get(n.scope);if(a===void 0)return;let o=e.tracer.startSpan(`agent.action`,{attributes:{"agent.action.call_id":n.source.toolCall.toolCallId,"agent.action.kind":`tool`,"agent.action.name":n.source.toolCall.toolName,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.root.session.id":n.scope.rootSessionId??n.scope.sessionId,"agent.session.id":n.scope.sessionId,"agent.step.attempt":n.scope.attemptIndex,"agent.step.index":n.scope.stepIndex,"agent.turn.id":n.scope.turnId}},a.step.context),s=trace.setSpan(a.step.context,o),c=e.tracer.startSpan(`ai.toolCall`,{attributes:{"gen_ai.operation.name":`execute_tool`,"gen_ai.tool.call.id":n.source.toolCall.toolCallId,"gen_ai.tool.name":n.source.toolCall.toolName}},s);if(t){let e=contentAttribute(n.source.toolCall.input,!1);e!==void 0&&c.setAttribute(`gen_ai.tool.call.arguments`,e)}let l={context:trace.setSpan(s,c),span:o,toolSpan:c};return getExecutionContexts(n.scope).tools.set(n.id,l.context),l},afterToolCall=(e,n)=>{if(l.get(e.scope)?.tools.delete(e.id),isToolSpanState(n)){if(e.type===`tool.call.failed`)recordError(n.toolSpan,e.error),recordError(n.span,e.error);else if(e.source.toolOutput.type!==`tool-result`)recordError(n.toolSpan,e.source.toolOutput.error),recordError(n.span,e.source.toolOutput.error);else if(t){let t=contentAttribute(e.source.toolOutput.output,!1);t!==void 0&&n.toolSpan.setAttribute(`gen_ai.tool.call.result`,t)}n.toolSpan.end(),n.span.end()}},openSessionWindow=t=>{let n=e.tracer.startSpan(`agent.session`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.name":t.agentName,"agent.root.session.id":t.rootSessionId,"agent.session.id":t.sessionId,"agent.session.window":t.index,...t.previousTraceId===void 0?{}:{"agent.session.window.previous.trace.id":t.previousTraceId}},root:!0});return n.addEvent(t.index===0?`session.started`:`session.window.opened`),n.end(),n.spanContext()},ensureSessionContext=async t=>{let n=await e.stateStore.getSession(t.sessionId);return n===void 0&&(n={agentName:t.agentName,channelKind:t.channelKind,context:t.parentTraceContext===void 0?openSessionWindow({agentName:t.agentName,index:0,rootSessionId:t.rootSessionId,sessionId:t.sessionId}):adoptedSpanContext(t.parentTraceContext),rootSessionId:t.rootSessionId,turnsInWindow:0,window:0},await e.stateStore.setSession(t.sessionId,n)),n},advanceSessionWindow=(e,t)=>{if(t.turnsInWindow<200)return t;let n=t.window+1;return{...t,context:openSessionWindow({agentName:t.agentName,index:n,previousTraceId:t.context.traceId,rootSessionId:t.rootSessionId,sessionId:e}),turnsInWindow:0,window:n}};return{hook:{events:{"attempt.completed":onAttemptTerminal,"attempt.failed":onAttemptTerminal,"attempt.metadata":e=>{let t=u.get(e.scope);if(t===void 0)return;let n=readGatewayCost(e.providerMetadata);if(n!==void 0)for(let[e,r]of Object.entries(n))t.step.span.setAttribute(e,r)},"attempt.started":onAttemptStarted,"model.call":{after:afterModelCall,before:beforeModelCall},"session.completed":onSessionTransition,"session.failed":onSessionTransition,"session.started":onSessionStarted,"session.waiting":onSessionTransition,"tool.call":{after:afterToolCall,before:beforeToolCall},"turn.cancelled":onTurnTerminal,"turn.completed":onTurnTerminal,"turn.failed":onTurnTerminal,"turn.started":onTurnStarted}},runInContext(e,t){let r=l.get(e.scope),i=e.type===`model.call`?r?.models.get(e.id):r?.tools.get(e.id);return i===void 0?t():context.with(i,t)}};function getExecutionContexts(e){let t=l.get(e);return t===void 0&&(t={models:new Map,tools:new Map},l.set(e,t)),t}}function parentLineageAttributes(e){if(e===void 0)return{};let t={"agent.parent.call_id":e.callId,"agent.parent.session.id":e.sessionId,"agent.parent.turn.id":e.turnId};return e.subagentName!==void 0&&(t[`agent.subagent.name`]=e.subagentName),t}function adoptedSpanContext(e){return{isRemote:!1,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function contextFromSpanContext(t){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(t))}function readGatewayCost(e){let t=e.gateway;if(!isRecord(t))return;let n={},r=readUsd(t.cost);r!==void 0&&(n[`gen_ai.usage.cost`]=r);let i=readUsd(t.gatewayCost);i!==void 0&&(n[`gen_ai.usage.gateway_cost`]=i);let a=readUsd(t.inputInferenceCost);a!==void 0&&(n[`gen_ai.usage.input_cost`]=a);let o=readUsd(t.outputInferenceCost);return o!==void 0&&(n[`gen_ai.usage.output_cost`]=o),typeof t.generationId==`string`&&t.generationId.length>0&&(n[`gen_ai.generation.id`]=t.generationId),Object.keys(n).length===0?void 0:n}function readUsd(e){if(typeof e!=`string`)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function isSpanState(e){return typeof e==`object`&&!!e&&`context`in e&&`span`in e}function isToolSpanState(e){return isSpanState(e)&&`toolSpan`in e}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function modelSpanName(e){return e===`ai.generateText`?`ai.generateText.doGenerate`:`ai.streamText.doStream`}function setUsage(e,t){t.inputTokens!==void 0&&e.setAttribute(`agent.usage.input_tokens`,t.inputTokens),t.outputTokens!==void 0&&e.setAttribute(`agent.usage.output_tokens`,t.outputTokens);let n=t.inputTokenDetails;n?.cacheReadTokens!==void 0&&e.setAttribute(`gen_ai.usage.cache_read.input_tokens`,n.cacheReadTokens),n?.cacheWriteTokens!==void 0&&e.setAttribute(`gen_ai.usage.cache_creation.input_tokens`,n.cacheWriteTokens)}function errorText(e){return e instanceof Error?e.message:e}function recordError(e,n){n instanceof Error?(e.recordException(n),e.setStatus({code:SpanStatusCode.ERROR,message:n.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{SESSION_WINDOW_TURN_LIMIT,createAgentOtelInstrumentation};
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Id generator shared by `registerOTel` and the agent OTel provider. A span
3
+ * whose lifetime crosses durable worker boundaries (`agent.turn`) is emitted
4
+ * at its terminal; priming the next span id lets that span carry the
5
+ * pre-allocated id its descendants already parented to.
6
+ */
7
+ export declare class AgentSpanIdGenerator {
8
+ #private;
9
+ /** Reserves a span id for a span emitted later via {@link withSpanId}. */
10
+ allocateSpanId(): string;
11
+ generateSpanId(): string;
12
+ generateTraceId(): string;
13
+ /** Runs `startSpan` so the next span started carries `spanId`. */
14
+ withSpanId<T>(spanId: string, startSpan: () => T): T;
15
+ }
@@ -0,0 +1 @@
1
+ var AgentSpanIdGenerator=class{#e;allocateSpanId(){return randomHexId(16)}generateSpanId(){let e=this.#e;return e===void 0?randomHexId(16):(this.#e=void 0,e)}generateTraceId(){return randomHexId(32)}withSpanId(e,t){this.#e=e;try{return t()}finally{this.#e=void 0}}};function randomHexId(e){let t;do{t=``;for(let n=0;n<e;n+=1)t+=`0123456789abcdef`[Math.trunc(Math.random()*16)]}while(!/[1-9a-f]/u.test(t));return t}export{AgentSpanIdGenerator};
@@ -1,5 +1,5 @@
1
1
  import type { SpanContext } from "#compiled/@opentelemetry/api/index.js";
2
- import type { AgentSessionTraceState, AgentTraceStateStore, AgentTurnTraceState } from "#tracing/agent-otel-provider.js";
2
+ import type { AgentSessionTraceState, AgentTraceStateStore, AgentTurnTraceState } from "#tracing/agent-trace-state.js";
3
3
  /** Keeps only framework trace state from an interrupted step's context changes. */
4
4
  export declare function preserveSerializedAgentTraceState(original: Record<string, unknown>, interrupted: Record<string, unknown>): Record<string, unknown>;
5
5
  /**
@@ -1 +1 @@
1
- import{contextStorage,loadContext}from"#context/container.js";import{ContextKey}from"#context/key.js";const AgentTraceContextKey=new ContextKey(`eve.harness.agentTrace`,{codec:{deserialize:deserializeState,serialize:serializeState}});function preserveSerializedAgentTraceState(e,t){let n=t[AgentTraceContextKey.name];return n===void 0?e:{...e,[AgentTraceContextKey.name]:n}}function readSessionTraceContext(e,t){let n=e[AgentTraceContextKey.name];if(n!==void 0)return deserializeState(n).sessions[t]?.context}var ContextAgentTraceStateStore=class{deleteSession(e){updateState(t=>{let n={...t.sessions};return delete n[e],{...t,sessions:n}})}deleteTurn(e,t){updateState(n=>{let r={...n.turns};return delete r[turnKey(e,t)],{...n,turns:r}})}getSession(t){return contextStorage.getStore()?.get(AgentTraceContextKey)?.sessions[t]}getTurn(t,n){return contextStorage.getStore()?.get(AgentTraceContextKey)?.turns[turnKey(t,n)]}setSession(e,t){updateState(n=>({...n,sessions:{...n.sessions,[e]:t}}))}setTurn(e,t,n){updateState(r=>({...r,turns:{...r.turns,[turnKey(e,t)]:n}}))}};function updateState(e){loadContext().set(AgentTraceContextKey,t=>e(t??{sessions:{},turns:{}}))}function turnKey(e,t){return`${e}\0${t}`}function serializeState(e){return{sessions:Object.fromEntries(Object.entries(e.sessions).map(([e,t])=>[e,{...t,context:serializeSpanContext(t.context)}])),turns:Object.fromEntries(Object.entries(e.turns).map(([e,t])=>[e,{...t,context:serializeSpanContext(t.context),terminal:t.terminal===void 0?void 0:{error:serializeError(t.terminal.error),type:t.terminal.type}}]))}}function deserializeState(e){return isRecord(e)?{sessions:deserializeRecord(e.sessions,e=>{if(!(!isRecord(e)||!isSpanContext(e.context)))return{agentName:typeof e.agentName==`string`?e.agentName:void 0,channelKind:typeof e.channelKind==`string`?e.channelKind:void 0,context:e.context,rootSessionId:typeof e.rootSessionId==`string`?e.rootSessionId:``,turnsInWindow:typeof e.turnsInWindow==`number`?e.turnsInWindow:0,window:typeof e.window==`number`?e.window:0}}),turns:deserializeRecord(e.turns,e=>{if(!(!isRecord(e)||!isSpanContext(e.context)))return{context:e.context,rootSessionId:typeof e.rootSessionId==`string`?e.rootSessionId:``,sequence:typeof e.sequence==`number`?e.sequence:0,terminal:deserializeTerminal(e.terminal)}})}:{sessions:{},turns:{}}}function deserializeRecord(e,t){if(!isRecord(e))return{};let n={};for(let[r,i]of Object.entries(e)){let e=t(i);e!==void 0&&(n[r]=e)}return n}function deserializeTerminal(e){if(!isRecord(e)||typeof e.type!=`string`)return;let t=e.type;if(isTurnTerminalType(t))return{error:deserializeError(e.error),type:t}}function serializeSpanContext(e){return{isRemote:e.isRemote,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function isSpanContext(e){return isRecord(e)&&typeof e.spanId==`string`&&typeof e.traceFlags==`number`&&typeof e.traceId==`string`}function serializeError(e){return e instanceof Error?{message:e.message,name:e.name,stack:e.stack}:void 0}function deserializeError(e){if(!isRecord(e)||typeof e.message!=`string`)return;let t=Error(e.message);return typeof e.name==`string`&&(t.name=e.name),typeof e.stack==`string`&&(t.stack=e.stack),t}function isTurnTerminalType(e){return e===`turn.cancelled`||e===`turn.completed`||e===`turn.failed`}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{ContextAgentTraceStateStore,preserveSerializedAgentTraceState,readSessionTraceContext};
1
+ import{contextStorage,loadContext}from"#context/container.js";import{ContextKey}from"#context/key.js";const AgentTraceContextKey=new ContextKey(`eve.harness.agentTrace`,{codec:{deserialize:deserializeState,serialize:serializeState}});function preserveSerializedAgentTraceState(e,t){let n=t[AgentTraceContextKey.name];return n===void 0?e:{...e,[AgentTraceContextKey.name]:n}}function readSessionTraceContext(e,t){let n=e[AgentTraceContextKey.name];if(n!==void 0)return deserializeState(n).sessions[t]?.context}var ContextAgentTraceStateStore=class{deleteSession(e){updateState(t=>{let n={...t.sessions};return delete n[e],{...t,sessions:n}})}deleteTurn(e,t){updateState(n=>{let r={...n.turns};return delete r[turnKey(e,t)],{...n,turns:r}})}getSession(t){return contextStorage.getStore()?.get(AgentTraceContextKey)?.sessions[t]}getTurn(t,n){return contextStorage.getStore()?.get(AgentTraceContextKey)?.turns[turnKey(t,n)]}setSession(e,t){updateState(n=>({...n,sessions:{...n.sessions,[e]:t}}))}setTurn(e,t,n){updateState(r=>({...r,turns:{...r.turns,[turnKey(e,t)]:n}}))}};function updateState(e){loadContext().set(AgentTraceContextKey,t=>e(t??{sessions:{},turns:{}}))}function turnKey(e,t){return`${e}\0${t}`}function serializeState(e){return{sessions:Object.fromEntries(Object.entries(e.sessions).map(([e,t])=>[e,{...t,context:serializeSpanContext(t.context)}])),turns:Object.fromEntries(Object.entries(e.turns).map(([e,t])=>[e,{...t,context:serializeSpanContext(t.context),terminal:t.terminal===void 0?void 0:{error:serializeError(t.terminal.error),type:t.terminal.type}}]))}}function deserializeState(e){return isRecord(e)?{sessions:deserializeRecord(e.sessions,e=>{if(!(!isRecord(e)||!isSpanContext(e.context)))return{agentName:typeof e.agentName==`string`?e.agentName:void 0,channelKind:typeof e.channelKind==`string`?e.channelKind:void 0,context:e.context,rootSessionId:typeof e.rootSessionId==`string`?e.rootSessionId:``,turnsInWindow:typeof e.turnsInWindow==`number`?e.turnsInWindow:0,window:typeof e.window==`number`?e.window:0}}),turns:deserializeRecord(e.turns,e=>{if(!(!isRecord(e)||!isSpanContext(e.context))&&!(typeof e.parentSpanId!=`string`||typeof e.startTimeMs!=`number`))return{context:e.context,lineage:deserializeLineage(e.lineage),parentSpanId:e.parentSpanId,rootSessionId:typeof e.rootSessionId==`string`?e.rootSessionId:``,sequence:typeof e.sequence==`number`?e.sequence:0,startTimeMs:e.startTimeMs,terminal:deserializeTerminal(e.terminal)}})}:{sessions:{},turns:{}}}function deserializeRecord(e,t){if(!isRecord(e))return{};let n={};for(let[r,i]of Object.entries(e)){let e=t(i);e!==void 0&&(n[r]=e)}return n}function deserializeLineage(e){if(!(!isRecord(e)||typeof e.callId!=`string`||typeof e.sessionId!=`string`||typeof e.turnId!=`string`))return{callId:e.callId,sessionId:e.sessionId,subagentName:typeof e.subagentName==`string`?e.subagentName:void 0,turnId:e.turnId}}function deserializeTerminal(e){if(!isRecord(e)||typeof e.type!=`string`)return;let t=e.type;if(isTurnTerminalType(t))return{error:deserializeError(e.error),type:t}}function serializeSpanContext(e){return{isRemote:e.isRemote,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function isSpanContext(e){return isRecord(e)&&typeof e.spanId==`string`&&typeof e.traceFlags==`number`&&typeof e.traceId==`string`}function serializeError(e){return e instanceof Error?{message:e.message,name:e.name,stack:e.stack}:void 0}function deserializeError(e){if(!isRecord(e)||typeof e.message!=`string`)return;let t=Error(e.message);return typeof e.name==`string`&&(t.name=e.name),typeof e.stack==`string`&&(t.stack=e.stack),t}function isTurnTerminalType(e){return e===`turn.cancelled`||e===`turn.completed`||e===`turn.failed`}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{ContextAgentTraceStateStore,preserveSerializedAgentTraceState,readSessionTraceContext};
@@ -0,0 +1,41 @@
1
+ import type { SpanContext } from "#compiled/@opentelemetry/api/index.js";
2
+ import type { InstrumentationParentLineage, InstrumentationTurnTerminalEvent } from "#harness/instrumentation-lifecycle.js";
3
+ export interface AgentSessionTraceState {
4
+ readonly agentName?: string;
5
+ readonly channelKind?: string;
6
+ readonly context: SpanContext;
7
+ readonly rootSessionId: string;
8
+ readonly turnsInWindow: number;
9
+ readonly window: number;
10
+ }
11
+ export interface AgentTurnTraceState {
12
+ readonly context: SpanContext;
13
+ readonly lineage?: InstrumentationParentLineage;
14
+ readonly parentSpanId: string;
15
+ readonly rootSessionId: string;
16
+ readonly sequence: number;
17
+ readonly startTimeMs: number;
18
+ readonly terminal?: {
19
+ readonly error?: unknown;
20
+ readonly type: InstrumentationTurnTerminalEvent["type"];
21
+ };
22
+ }
23
+ /** Provider-owned serializable storage for durable agent trace state. */
24
+ export interface AgentTraceStateStore {
25
+ deleteSession(sessionId: string): void | PromiseLike<void>;
26
+ deleteTurn(sessionId: string, turnId: string): void | PromiseLike<void>;
27
+ getSession(sessionId: string): AgentSessionTraceState | undefined | PromiseLike<AgentSessionTraceState | undefined>;
28
+ getTurn(sessionId: string, turnId: string): AgentTurnTraceState | undefined | PromiseLike<AgentTurnTraceState | undefined>;
29
+ setSession(sessionId: string, state: AgentSessionTraceState): void | PromiseLike<void>;
30
+ setTurn(sessionId: string, turnId: string, state: AgentTurnTraceState): void | PromiseLike<void>;
31
+ }
32
+ /** In-memory trace state used by tests and non-durable runtimes. */
33
+ export declare class InMemoryAgentTraceStateStore implements AgentTraceStateStore {
34
+ #private;
35
+ deleteSession(sessionId: string): void;
36
+ deleteTurn(sessionId: string, turnId: string): void;
37
+ getSession(sessionId: string): AgentSessionTraceState | undefined;
38
+ getTurn(sessionId: string, turnId: string): AgentTurnTraceState | undefined;
39
+ setSession(sessionId: string, state: AgentSessionTraceState): void;
40
+ setTurn(sessionId: string, turnId: string, state: AgentTurnTraceState): void;
41
+ }
@@ -0,0 +1 @@
1
+ var InMemoryAgentTraceStateStore=class{#e=new Map;#t=new Map;deleteSession(e){this.#e.delete(e)}deleteTurn(e,t){this.#t.delete(turnKey(e,t))}getSession(e){return this.#e.get(e)}getTurn(e,t){return this.#t.get(turnKey(e,t))}setSession(e,t){this.#e.set(e,t)}setTurn(e,t,n){this.#t.set(turnKey(e,t),n)}};function turnKey(e,t){return`${e}:${t}`}export{InMemoryAgentTraceStateStore};
@@ -1 +1 @@
1
- import{ContextAgentTraceStateStore}from"#tracing/agent-trace-context-store.js";import{getInstrumentationRuntime,registerInstrumentationRuntime}from"#harness/instrumentation-runtime.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{registerOTel}from"#compiled/@vercel/otel/index.js";import{createAgentOtelInstrumentation}from"#tracing/agent-otel-provider.js";import{AgentTraceSpanProcessor}from"#tracing/agent-trace-span-processor.js";import{createInstrumentationHooks}from"#harness/instrumentation-lifecycle.js";import{requestLocalTraceStorePrune,resolveLocalTraceRetentionSettings}from"#tracing/local-trace-retention.js";import{LocalTraceSpanProcessor}from"#tracing/local-trace-span-processor.js";function installLocalInstrumentationRuntime(t){let n=getInstrumentationRuntime();if(n!==void 0)return n;let r=resolveLocalTraceRetentionSettings(),i=new AgentTraceSpanProcessor(r.enabled?[new LocalTraceSpanProcessor(t.appRoot)]:[]);registerOTel({autoDetectResources:!1,instrumentations:[],propagators:[`none`],serviceName:t.serviceName,spanProcessors:[i]});let a=trace.getTracer(`eve.registration`).startSpan(`eve.otel.registration`),o=trace.setSpan(context.active(),a),s=context.with(o,()=>trace.getActiveSpan()===a);if(a.end(),!i.isAttached()||!s)throw Error(`eve could not register OpenTelemetry because another runtime already exists.`);let c=createAgentOtelInstrumentation({captureContent:process.env.EVE_TRACES_CONTENT!==`off`,frameworkVersion:t.frameworkVersion,stateStore:new ContextAgentTraceStateStore,tracer:trace.getTracer(`eve.agent`,t.frameworkVersion)}),l={events:{"session.completed":releaseSessionTrace,"session.failed":releaseSessionTrace}};return requestPrune(),registerInstrumentationRuntime({forceFlush:()=>i.forceFlush(),hooks:createInstrumentationHooks([c.hook,l]),runInContext:c.runInContext});async function releaseSessionTrace(e){await i.forceFlush(),i.releaseSession(e.sessionId)&&requestPrune()}function requestPrune(){r.enabled&&requestLocalTraceStorePrune({activeTraceIds:i.activeTraceIds(),appRoot:t.appRoot,maxAgeMs:r.maxAgeMs,maxTotalBytes:r.maxTotalBytes,retainCount:r.retainCount})}}export{installLocalInstrumentationRuntime};
1
+ import{ContextAgentTraceStateStore}from"#tracing/agent-trace-context-store.js";import{getInstrumentationRuntime,registerInstrumentationRuntime}from"#harness/instrumentation-runtime.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{registerOTel}from"#compiled/@vercel/otel/index.js";import{createAgentOtelInstrumentation}from"#tracing/agent-otel-provider.js";import{AgentSpanIdGenerator}from"#tracing/agent-span-id-generator.js";import{AgentTraceSpanProcessor}from"#tracing/agent-trace-span-processor.js";import{createInstrumentationHooks}from"#harness/instrumentation-lifecycle.js";import{requestLocalTraceStorePrune,resolveLocalTraceRetentionSettings}from"#tracing/local-trace-retention.js";import{LocalTraceSpanProcessor}from"#tracing/local-trace-span-processor.js";function installLocalInstrumentationRuntime(t){let n=getInstrumentationRuntime();if(n!==void 0)return n;let r=resolveLocalTraceRetentionSettings(),i=new AgentTraceSpanProcessor(r.enabled?[new LocalTraceSpanProcessor(t.appRoot)]:[]),a=new AgentSpanIdGenerator;registerOTel({autoDetectResources:!1,idGenerator:a,instrumentations:[],propagators:[`none`],serviceName:t.serviceName,spanProcessors:[i]});let o=trace.getTracer(`eve.registration`).startSpan(`eve.otel.registration`),s=trace.setSpan(context.active(),o),c=context.with(s,()=>trace.getActiveSpan()===o);if(o.end(),!i.isAttached()||!c)throw Error(`eve could not register OpenTelemetry because another runtime already exists.`);let l=createAgentOtelInstrumentation({captureContent:process.env.EVE_TRACES_CONTENT!==`off`,frameworkVersion:t.frameworkVersion,idGenerator:a,stateStore:new ContextAgentTraceStateStore,tracer:trace.getTracer(`eve.agent`,t.frameworkVersion)}),u={events:{"session.completed":releaseSessionTrace,"session.failed":releaseSessionTrace}};return requestPrune(),registerInstrumentationRuntime({forceFlush:()=>i.forceFlush(),hooks:createInstrumentationHooks([l.hook,u]),runInContext:l.runInContext});async function releaseSessionTrace(e){await i.forceFlush(),i.releaseSession(e.sessionId)&&requestPrune()}function requestPrune(){r.enabled&&requestLocalTraceStorePrune({activeTraceIds:i.activeTraceIds(),appRoot:t.appRoot,maxAgeMs:r.maxAgeMs,maxTotalBytes:r.maxTotalBytes,retainCount:r.retainCount})}}export{installLocalInstrumentationRuntime};
@@ -1,3 +1,3 @@
1
- import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-CF5D6jSV.js";
1
+ import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-3oBnxzhV.js";
2
2
 
3
3
  export { defaultMessageReducer, useEveAgent };
@@ -1,3 +1,3 @@
1
- import { t as useEveAgent } from "../chunks/use-eve-agent-CF5D6jSV.js";
1
+ import { t as useEveAgent } from "../chunks/use-eve-agent-3oBnxzhV.js";
2
2
 
3
3
  export { useEveAgent };