eve 0.27.13 → 0.29.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 (347) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/src/channel/adapter.d.ts +5 -5
  3. package/dist/src/channel/session.d.ts +2 -2
  4. package/dist/src/channel/types.d.ts +16 -6
  5. package/dist/src/chunks/{use-eve-agent-CWYe-vqE.js → use-eve-agent-CyDt3Lny.js} +92 -1
  6. package/dist/src/chunks/{use-eve-agent-CsSQOKnp.js → use-eve-agent-DaH3cf8K.js} +92 -1
  7. package/dist/src/cli/commands/agent-prompt/collect-intent.md +1 -1
  8. package/dist/src/cli/commands/channels.d.ts +0 -17
  9. package/dist/src/cli/commands/channels.js +1 -1
  10. package/dist/src/cli/commands/deploy.js +1 -1
  11. package/dist/src/cli/commands/extension-init.js +1 -1
  12. package/dist/src/cli/commands/init.js +1 -1
  13. package/dist/src/cli/commands/integration-connect.d.ts +29 -0
  14. package/dist/src/cli/commands/integration-connect.js +1 -0
  15. package/dist/src/cli/commands/integration-setup.d.ts +2 -3
  16. package/dist/src/cli/commands/integration-setup.js +1 -1
  17. package/dist/src/cli/commands/register-integration-commands.js +1 -1
  18. package/dist/src/cli/commands/registry-setup-command.d.ts +13 -3
  19. package/dist/src/cli/commands/registry-setup-command.js +2 -1
  20. package/dist/src/cli/commands/registry.d.ts +35 -1
  21. package/dist/src/cli/commands/registry.js +1 -1
  22. package/dist/src/cli/commands/trace.js +1 -1
  23. package/dist/src/cli/dev/tui/agent-header.js +1 -1
  24. package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
  25. package/dist/src/cli/dev/tui/prompt-commands.d.ts +1 -1
  26. package/dist/src/cli/dev/tui/prompt-commands.js +1 -1
  27. package/dist/src/cli/dev/tui/remote-auth-command.js +1 -1
  28. package/dist/src/cli/dev/tui/runner.d.ts +8 -7
  29. package/dist/src/cli/dev/tui/runner.js +1 -1
  30. package/dist/src/cli/dev/tui/setup-commands.d.ts +8 -13
  31. package/dist/src/cli/dev/tui/setup-commands.js +3 -2
  32. package/dist/src/cli/dev/tui/setup-flow.d.ts +14 -5
  33. package/dist/src/cli/dev/tui/setup-panel.d.ts +5 -1
  34. package/dist/src/cli/dev/tui/setup-panel.js +2 -2
  35. package/dist/src/cli/dev/tui/status-line.d.ts +1 -1
  36. package/dist/src/cli/dev/tui/status-line.js +1 -1
  37. package/dist/src/cli/dev/tui/subagent-pump.d.ts +8 -2
  38. package/dist/src/cli/dev/tui/subagent-pump.js +1 -1
  39. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +2 -5
  40. package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
  41. package/dist/src/cli/dev/tui/test/fake-setup-flow-renderer.js +1 -1
  42. package/dist/src/cli/dev/tui/tui-prompter.js +1 -1
  43. package/dist/src/cli/dev/tui/tui.d.ts +2 -0
  44. package/dist/src/cli/dev/tui/tui.js +1 -1
  45. package/dist/src/cli/dev/tui/vercel-status.d.ts +1 -6
  46. package/dist/src/cli/dev/tui/vercel-status.js +1 -1
  47. package/dist/src/cli/invoke/result.d.ts +15 -0
  48. package/dist/src/cli/invoke/result.js +1 -1
  49. package/dist/src/cli/option-parsers.d.ts +11 -0
  50. package/dist/src/cli/option-parsers.js +1 -0
  51. package/dist/src/cli/run.d.ts +1 -12
  52. package/dist/src/cli/run.js +3 -3
  53. package/dist/src/cli/shutdown.d.ts +2 -0
  54. package/dist/src/cli/shutdown.js +1 -1
  55. package/dist/src/client/eve-agent-store.d.ts +7 -4
  56. package/dist/src/client/eve-agent-store.js +1 -1
  57. package/dist/src/client/index.d.ts +3 -3
  58. package/dist/src/client/index.js +1 -1
  59. package/dist/src/client/message-action-parts.js +1 -1
  60. package/dist/src/client/message-reducer-types.d.ts +5 -3
  61. package/dist/src/client/message-response.d.ts +4 -4
  62. package/dist/src/client/ndjson.d.ts +3 -3
  63. package/dist/src/client/open-stream.d.ts +2 -2
  64. package/dist/src/client/output-schema.d.ts +2 -2
  65. package/dist/src/client/reducer.d.ts +2 -2
  66. package/dist/src/client/session-utils.d.ts +5 -5
  67. package/dist/src/client/session.d.ts +2 -2
  68. package/dist/src/client/types.d.ts +2 -2
  69. package/dist/src/compiled/.vendor-stamp.json +5 -5
  70. package/dist/src/compiled/@workflow/core/index.js +1 -1
  71. package/dist/src/compiled/@workflow/core/private.d.ts +21 -5
  72. package/dist/src/compiled/@workflow/core/private.js +1 -1
  73. package/dist/src/compiled/@workflow/core/runtime/world.d.ts +10 -5
  74. package/dist/src/compiled/@workflow/core/runtime.js +3 -3
  75. package/dist/src/compiled/@workflow/core/telemetry/semantic-conventions.d.ts +2 -2
  76. package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
  77. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  78. package/dist/src/compiled/@workflow/world-local/index.js +3 -3
  79. package/dist/src/compiled/@workflow/world-vercel/index.js +13 -13
  80. package/dist/src/compiled/_chunks/workflow/{attribute-changes-DeZc2RZz.js → attribute-changes-1LmTKuTT.js} +1 -1
  81. package/dist/src/compiled/_chunks/workflow/{private-Cre8uYkA.js → private-BcwCGTV5.js} +1 -1
  82. package/dist/src/compiled/_chunks/workflow/{resume-hook-ip1hbn1b.js → resume-hook-D1_5NCZ6.js} +1 -1
  83. package/dist/src/compiled/_chunks/workflow/{run-CWytxfIp.js → run-C240Ctf4.js} +1 -1
  84. package/dist/src/compiled/_chunks/workflow/sleep-De802yfX.js +1 -0
  85. package/dist/src/compiled/_chunks/workflow/{wait-until-De9yESQN.js → wait-until-z48sPUjU.js} +2 -2
  86. package/dist/src/compiled/shadcn-registry/index.d.ts +1 -0
  87. package/dist/src/compiler/compile-from-memory.d.ts +1 -0
  88. package/dist/src/compiler/extension-compatibility.d.ts +8 -8
  89. package/dist/src/compiler/extension-compatibility.js +1 -1
  90. package/dist/src/compiler/manifest.d.ts +2 -2
  91. package/dist/src/compiler/manifest.js +1 -1
  92. package/dist/src/compiler/normalize-agent-config.js +1 -1
  93. package/dist/src/context/dynamic-instruction-lifecycle.d.ts +2 -2
  94. package/dist/src/context/dynamic-model-lifecycle.d.ts +2 -2
  95. package/dist/src/context/dynamic-skill-lifecycle.d.ts +2 -2
  96. package/dist/src/context/dynamic-tool-lifecycle.d.ts +2 -2
  97. package/dist/src/context/hook-lifecycle.d.ts +2 -2
  98. package/dist/src/evals/assertions/collector.d.ts +2 -10
  99. package/dist/src/evals/assertions/collector.js +1 -1
  100. package/dist/src/evals/assertions/run.d.ts +3 -3
  101. package/dist/src/evals/cli/eval.d.ts +6 -2
  102. package/dist/src/evals/cli/eval.js +2 -2
  103. package/dist/src/evals/cli/filter.d.ts +14 -0
  104. package/dist/src/evals/cli/filter.js +1 -0
  105. package/dist/src/evals/context.js +1 -1
  106. package/dist/src/evals/diagnostics.d.ts +8 -0
  107. package/dist/src/evals/diagnostics.js +1 -0
  108. package/dist/src/evals/expect/index.d.ts +1 -1
  109. package/dist/src/evals/expect/index.js +1 -1
  110. package/dist/src/evals/index.d.ts +1 -1
  111. package/dist/src/evals/judge.js +2 -1
  112. package/dist/src/evals/match.d.ts +4 -4
  113. package/dist/src/evals/runner/artifacts.js +1 -1
  114. package/dist/src/evals/runner/derive-run-facts.d.ts +2 -2
  115. package/dist/src/evals/runner/reporters/assertion-diagnostics.d.ts +3 -0
  116. package/dist/src/evals/runner/reporters/assertion-diagnostics.js +3 -0
  117. package/dist/src/evals/runner/reporters/braintrust.js +1 -1
  118. package/dist/src/evals/runner/reporters/console.js +1 -1
  119. package/dist/src/evals/runner/reporters/junit.js +2 -2
  120. package/dist/src/evals/session.d.ts +3 -3
  121. package/dist/src/evals/types.d.ts +33 -17
  122. package/dist/src/execution/cancel-descendant-turns-step.js +1 -1
  123. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  124. package/dist/src/execution/route-child-delivery.d.ts +4 -3
  125. package/dist/src/execution/route-child-delivery.js +1 -1
  126. package/dist/src/execution/session-delivery-hook.d.ts +1 -0
  127. package/dist/src/execution/session-delivery-hook.js +1 -1
  128. package/dist/src/execution/session-timeout-control.d.ts +9 -0
  129. package/dist/src/execution/session-timeout-control.js +1 -0
  130. package/dist/src/execution/session-timeout-steps.d.ts +13 -0
  131. package/dist/src/execution/session-timeout-steps.js +1 -0
  132. package/dist/src/execution/session-timeout-workflow.d.ts +6 -0
  133. package/dist/src/execution/session-timeout-workflow.js +1 -0
  134. package/dist/src/execution/session-timeout.d.ts +2 -0
  135. package/dist/src/execution/session-timeout.js +1 -0
  136. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  137. package/dist/src/execution/subagent-event-proxy-step.js +1 -1
  138. package/dist/src/execution/subagent-hitl-proxy.d.ts +5 -1
  139. package/dist/src/execution/subagent-hitl-proxy.js +1 -1
  140. package/dist/src/execution/terminal-session-completion-step.d.ts +5 -0
  141. package/dist/src/execution/terminal-session-completion-step.js +1 -0
  142. package/dist/src/execution/terminal-session-failure-step.js +1 -1
  143. package/dist/src/execution/turn-cancellation-control.js +1 -1
  144. package/dist/src/execution/turn-workflow.js +1 -1
  145. package/dist/src/execution/workflow-entry.d.ts +1 -0
  146. package/dist/src/execution/workflow-entry.js +1 -1
  147. package/dist/src/execution/workflow-runtime.d.ts +4 -0
  148. package/dist/src/execution/workflow-runtime.js +1 -1
  149. package/dist/src/execution/workflow-steps.d.ts +12 -2
  150. package/dist/src/execution/workflow-steps.js +1 -1
  151. package/dist/src/harness/agent-otel-provider.js +1 -1
  152. package/dist/src/harness/ai-sdk-hook-bridge.js +1 -1
  153. package/dist/src/harness/input-extraction.js +1 -1
  154. package/dist/src/harness/input-request-class.d.ts +23 -0
  155. package/dist/src/harness/input-request-class.js +1 -0
  156. package/dist/src/harness/input-requests.d.ts +20 -9
  157. package/dist/src/harness/input-requests.js +1 -1
  158. package/dist/src/harness/instrumentation-lifecycle.d.ts +12 -1
  159. package/dist/src/harness/proxy-input-requests.d.ts +10 -4
  160. package/dist/src/harness/proxy-input-requests.js +1 -1
  161. package/dist/src/harness/session-limit-continuation.d.ts +0 -11
  162. package/dist/src/harness/session-limit-continuation.js +1 -1
  163. package/dist/src/harness/session-limit-enforcement.d.ts +3 -2
  164. package/dist/src/harness/session-limit-enforcement.js +1 -1
  165. package/dist/src/harness/session-token-limits.d.ts +41 -0
  166. package/dist/src/harness/session-token-limits.js +1 -0
  167. package/dist/src/harness/stale-input-responses.js +1 -1
  168. package/dist/src/harness/subagent-token-budget.d.ts +6 -4
  169. package/dist/src/harness/subagent-token-budget.js +1 -1
  170. package/dist/src/harness/tool-loop.js +1 -1
  171. package/dist/src/harness/turn-sleep.d.ts +12 -0
  172. package/dist/src/harness/turn-sleep.js +1 -0
  173. package/dist/src/harness/turn-tag-state.d.ts +26 -17
  174. package/dist/src/harness/turn-tag-state.js +1 -1
  175. package/dist/src/harness/types.d.ts +4 -4
  176. package/dist/src/harness/workflow-lifecycle.d.ts +2 -2
  177. package/dist/src/internal/application/compiled-artifacts.js +7 -7
  178. package/dist/src/internal/application/package.js +1 -1
  179. package/dist/src/internal/authored-definition/core.js +1 -1
  180. package/dist/src/internal/nitro/host/dev-authored-source-watcher.d.ts +4 -0
  181. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  182. package/dist/src/internal/nitro/host/start-development-server.js +2 -2
  183. package/dist/src/internal/workflow/development-world-protocol.js +1 -1
  184. package/dist/src/internal/workflow/world-target.d.ts +7 -0
  185. package/dist/src/internal/workflow/world-target.js +1 -0
  186. package/dist/src/internal/workflow-bundle/workflow-core-shim.d.ts +1 -1
  187. package/dist/src/internal/workflow-bundle/workflow-core-shim.js +1 -1
  188. package/dist/src/protocol/event-dedupe.d.ts +25 -0
  189. package/dist/src/protocol/event-dedupe.js +1 -0
  190. package/dist/src/protocol/event-id.d.ts +16 -0
  191. package/dist/src/protocol/event-id.js +1 -0
  192. package/dist/src/protocol/message.d.ts +39 -23
  193. package/dist/src/protocol/message.js +2 -2
  194. package/dist/src/protocol/routes.d.ts +4 -0
  195. package/dist/src/protocol/routes.js +1 -1
  196. package/dist/src/public/channels/discord/discordChannel.d.ts +3 -3
  197. package/dist/src/public/channels/github/githubChannel.d.ts +3 -3
  198. package/dist/src/public/channels/linear/linearChannel.d.ts +3 -3
  199. package/dist/src/public/channels/slack/hitl.js +1 -1
  200. package/dist/src/public/channels/slack/slackChannel.d.ts +3 -3
  201. package/dist/src/public/channels/teams/hitl.js +1 -1
  202. package/dist/src/public/channels/teams/teamsChannel.d.ts +3 -3
  203. package/dist/src/public/channels/telegram/telegramChannel.d.ts +3 -3
  204. package/dist/src/public/channels/twilio/twilioChannel.d.ts +3 -3
  205. package/dist/src/public/definitions/channel.d.ts +4 -4
  206. package/dist/src/public/definitions/hook.d.ts +2 -2
  207. package/dist/src/public/tools/sleep/index.d.ts +18 -0
  208. package/dist/src/public/tools/sleep/index.js +1 -0
  209. package/dist/src/react/use-eve-agent.d.ts +3 -2
  210. package/dist/src/runtime/framework-tools/ask-question.js +1 -1
  211. package/dist/src/runtime/framework-tools/sleep.d.ts +15 -0
  212. package/dist/src/runtime/framework-tools/sleep.js +1 -0
  213. package/dist/src/runtime/hooks/registry.d.ts +2 -2
  214. package/dist/src/runtime/input/types.d.ts +19 -4
  215. package/dist/src/runtime/input/types.js +1 -1
  216. package/dist/src/runtime/resolve-agent.js +1 -1
  217. package/dist/src/runtime/types.d.ts +2 -2
  218. package/dist/src/services/dev-client/runtime-artifacts.d.ts +7 -0
  219. package/dist/src/services/dev-client/runtime-artifacts.js +1 -1
  220. package/dist/src/setup/boxes/apply-ai-gateway-credential.js +1 -1
  221. package/dist/src/setup/boxes/deploy-project.d.ts +3 -3
  222. package/dist/src/setup/flows/deploy.js +1 -1
  223. package/dist/src/setup/flows/ensure-vercel-project.d.ts +17 -0
  224. package/dist/src/setup/flows/ensure-vercel-project.js +1 -0
  225. package/dist/src/setup/flows/in-project.d.ts +1 -1
  226. package/dist/src/setup/flows/link.js +1 -1
  227. package/dist/src/setup/flows/model.js +1 -1
  228. package/dist/src/setup/flows/provider.js +1 -1
  229. package/dist/src/setup/flows/registry.d.ts +20 -0
  230. package/dist/src/setup/flows/registry.js +1 -0
  231. package/dist/src/setup/index.d.ts +0 -1
  232. package/dist/src/setup/index.js +1 -1
  233. package/dist/src/setup/{channel-setup-environment.d.ts → integrations/channels/environment.d.ts} +2 -2
  234. package/dist/src/setup/integrations/channels/environment.js +1 -0
  235. package/dist/src/setup/{channel-setup-integrations.d.ts → integrations/channels/index.d.ts} +3 -3
  236. package/dist/src/setup/integrations/channels/index.js +1 -0
  237. package/dist/src/setup/{channel-setup-runner.d.ts → integrations/channels/runner.d.ts} +1 -1
  238. package/dist/src/setup/integrations/channels/runner.js +1 -0
  239. package/dist/src/setup/{boxes/add-channels.d.ts → integrations/channels/setup.d.ts} +32 -22
  240. package/dist/src/setup/integrations/channels/setup.js +2 -0
  241. package/dist/src/setup/{channel-setup-slack.d.ts → integrations/channels/slack.d.ts} +1 -1
  242. package/dist/src/setup/integrations/channels/slack.js +1 -0
  243. package/dist/src/setup/{channel-setup-integration.d.ts → integrations/channels/types.d.ts} +23 -7
  244. package/dist/src/setup/{channel-setup-ui.d.ts → integrations/channels/ui.d.ts} +2 -2
  245. package/dist/src/setup/integrations/channels/ui.js +2 -0
  246. package/dist/src/setup/{channel-setup-web.d.ts → integrations/channels/web.d.ts} +1 -1
  247. package/dist/src/setup/integrations/channels/web.js +1 -0
  248. package/dist/src/setup/primitives/run-vercel.d.ts +1 -0
  249. package/dist/src/setup/primitives/run-vercel.js +1 -1
  250. package/dist/src/setup/prompter.d.ts +16 -3
  251. package/dist/src/setup/prompter.js +1 -1
  252. package/dist/src/setup/registry-setup-client.d.ts +18 -0
  253. package/dist/src/setup/registry-setup-client.js +2 -0
  254. package/dist/src/setup/registry-setup-protocol.d.ts +93 -0
  255. package/dist/src/setup/registry-setup-protocol.js +1 -0
  256. package/dist/src/setup/scaffold/channels-catalog.d.ts +1 -1
  257. package/dist/src/setup/scaffold/create/extension.js +2 -2
  258. package/dist/src/setup/scaffold/create/project.js +2 -2
  259. package/dist/src/setup/scaffold/create/web-template.d.ts +1 -1
  260. package/dist/src/setup/scaffold/create/web-template.js +2 -2
  261. package/dist/src/setup/scaffold/create-in-place.d.ts +1 -0
  262. package/dist/src/setup/scaffold/create-in-place.js +1 -0
  263. package/dist/src/setup/scaffold/index.js +1 -1
  264. package/dist/src/setup/scaffold/update/connections.js +3 -3
  265. package/dist/src/setup/scaffold/update/update-connection-connector.js +1 -1
  266. package/dist/src/setup/vercel-project-framework.d.ts +1 -1
  267. package/dist/src/setup/vercel-project-framework.js +1 -1
  268. package/dist/src/setup/vercel-project.d.ts +17 -2
  269. package/dist/src/setup/vercel-project.js +0 -0
  270. package/dist/src/shared/agent-definition.d.ts +12 -0
  271. package/dist/src/shared/dynamic-tool-definition.d.ts +2 -2
  272. package/dist/src/shared/ulid.d.ts +39 -0
  273. package/dist/src/shared/ulid.js +1 -0
  274. package/dist/src/svelte/index.js +1 -1
  275. package/dist/src/svelte/use-eve-agent.d.ts +4 -4
  276. package/dist/src/svelte/use-eve-agent.js +1 -1
  277. package/dist/src/vue/index.js +1 -1
  278. package/dist/src/vue/use-eve-agent.d.ts +4 -4
  279. package/dist/src/vue/use-eve-agent.js +1 -1
  280. package/docs/agent-config.md +28 -16
  281. package/docs/channels/overview.mdx +1 -1
  282. package/docs/channels/slack.mdx +2 -2
  283. package/docs/concepts/default-harness.md +12 -0
  284. package/docs/concepts/execution-model-and-durability.mdx +1 -1
  285. package/docs/concepts/sessions-runs-and-streaming.md +61 -0
  286. package/docs/evals/assertions.mdx +8 -1
  287. package/docs/evals/judge.mdx +11 -1
  288. package/docs/evals/reporters.mdx +1 -1
  289. package/docs/evals/running.mdx +3 -0
  290. package/docs/guides/client/streaming.mdx +9 -3
  291. package/docs/guides/dev-tui.md +9 -14
  292. package/docs/guides/frontend/overview.mdx +4 -2
  293. package/docs/guides/frontend/use-eve-agent-svelte.mdx +1 -1
  294. package/docs/guides/frontend/use-eve-agent-vue.mdx +10 -10
  295. package/docs/guides/hooks.md +40 -2
  296. package/docs/guides/instrumentation.md +5 -1
  297. package/docs/reference/cli.md +25 -38
  298. package/docs/reference/typescript-api.md +2 -1
  299. package/docs/tools/human-in-the-loop.md +5 -0
  300. package/docs/tutorial/ship-it.mdx +2 -2
  301. package/package.json +11 -6
  302. package/dist/src/compiled/@workflow/core/runtime/world-target.d.ts +0 -11
  303. package/dist/src/compiled/_chunks/workflow/sleep-BjrUxUcs.js +0 -1
  304. package/dist/src/node_modules/.pnpm/@workflow_utils@5.0.0-beta.7/node_modules/@workflow/utils/dist/index.js +0 -1
  305. package/dist/src/node_modules/.pnpm/@workflow_utils@5.0.0-beta.7/node_modules/@workflow/utils/dist/parse-name.js +0 -1
  306. package/dist/src/node_modules/.pnpm/@workflow_utils@5.0.0-beta.7/node_modules/@workflow/utils/dist/promise.js +0 -1
  307. package/dist/src/node_modules/.pnpm/@workflow_utils@5.0.0-beta.7/node_modules/@workflow/utils/dist/time.js +0 -1
  308. package/dist/src/node_modules/.pnpm/@workflow_utils@5.0.0-beta.7/node_modules/@workflow/utils/dist/workflow-routes.js +0 -1
  309. package/dist/src/node_modules/.pnpm/@workflow_utils@5.0.0-beta.7/node_modules/@workflow/utils/dist/world-target.js +0 -1
  310. package/dist/src/node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js +0 -1
  311. package/dist/src/setup/boxes/add-channels.js +0 -2
  312. package/dist/src/setup/boxes/add-connections.d.ts +0 -26
  313. package/dist/src/setup/boxes/add-connections.js +0 -1
  314. package/dist/src/setup/boxes/install-channel-registry-items.d.ts +0 -8
  315. package/dist/src/setup/boxes/install-channel-registry-items.js +0 -1
  316. package/dist/src/setup/boxes/one-shot-next-steps.d.ts +0 -18
  317. package/dist/src/setup/boxes/one-shot-next-steps.js +0 -2
  318. package/dist/src/setup/boxes/preflight.d.ts +0 -37
  319. package/dist/src/setup/boxes/preflight.js +0 -1
  320. package/dist/src/setup/boxes/resolve-target.d.ts +0 -58
  321. package/dist/src/setup/boxes/resolve-target.js +0 -1
  322. package/dist/src/setup/boxes/scaffold.d.ts +0 -40
  323. package/dist/src/setup/boxes/scaffold.js +0 -1
  324. package/dist/src/setup/boxes/select-channels.d.ts +0 -49
  325. package/dist/src/setup/boxes/select-channels.js +0 -1
  326. package/dist/src/setup/boxes/select-chat.d.ts +0 -38
  327. package/dist/src/setup/boxes/select-chat.js +0 -1
  328. package/dist/src/setup/boxes/select-connections.d.ts +0 -30
  329. package/dist/src/setup/boxes/select-connections.js +0 -1
  330. package/dist/src/setup/boxes/select-setup-mode.d.ts +0 -32
  331. package/dist/src/setup/boxes/select-setup-mode.js +0 -1
  332. package/dist/src/setup/channel-setup-deployment.d.ts +0 -11
  333. package/dist/src/setup/channel-setup-deployment.js +0 -1
  334. package/dist/src/setup/channel-setup-environment.js +0 -1
  335. package/dist/src/setup/channel-setup-integration.js +0 -1
  336. package/dist/src/setup/channel-setup-integrations.js +0 -1
  337. package/dist/src/setup/channel-setup-runner.js +0 -1
  338. package/dist/src/setup/channel-setup-slack.js +0 -1
  339. package/dist/src/setup/channel-setup-ui.js +0 -2
  340. package/dist/src/setup/channel-setup-web.js +0 -1
  341. package/dist/src/setup/flows/channels.d.ts +0 -57
  342. package/dist/src/setup/flows/channels.js +0 -1
  343. package/dist/src/setup/flows/connections.d.ts +0 -37
  344. package/dist/src/setup/flows/connections.js +0 -3
  345. package/dist/src/setup/onboarding.d.ts +0 -60
  346. package/dist/src/setup/onboarding.js +0 -1
  347. /package/dist/src/{node_modules/.pnpm/@workflow_utils@5.0.0-beta.7/node_modules/@workflow/utils/dist/pluralize.js → setup/integrations/channels/types.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  export declare const WEB_APP_TEMPLATE_FILES: {
2
2
  readonly "agent/channels/eve.ts": 'import { eveChannel } from "eve/channels/eve";\nimport { localDev, placeholderAuth, vercelOidc } from "eve/channels/auth";\n\nexport default eveChannel({\n auth: [\n // Lets the eve TUI and your Vercel deployments reach the deployed agent.\n vercelOidc(),\n // Open on localhost for `eve dev` and the REPL; ignored in production.\n localDev(),\n // This placeholder will not allow browser requests in production.\n // Replace it with your app\'s auth provider, like Auth.js or Clerk,\n // or use none() for a public demo.\n placeholderAuth(),\n ],\n});\n';
3
- readonly "app/_components/agent-chat.tsx": '"use client";\n\nimport type { UserContent } from "ai";\nimport { Client, type HandleMessageStreamEvent } from "eve/client";\nimport { useEveAgent } from "eve/react";\nimport { AlertCircleIcon } from "lucide-react";\nimport { useCallback, useRef, useState } from "react";\nimport {\n Conversation,\n ConversationContent,\n ConversationScrollButton,\n} from "@/components/ai-elements/conversation";\nimport {\n PromptInput,\n type PromptInputMessage,\n PromptInputSubmit,\n PromptInputTextarea,\n} from "@/components/ai-elements/prompt-input";\nimport { cn } from "@/lib/utils";\nimport { AgentMessage } from "./agent-message";\n\nconst AGENT_NAME = "__EVE_INIT_APP_NAME__";\n\ntype AgentStatus = ReturnType<typeof useEveAgent>["status"];\ntype CancellationState = "idle" | "requested" | "cancelling";\n\ntype Cancellation = {\n requested: boolean;\n sentTurnId?: string;\n turnId?: string;\n};\n\nexport function AgentChat() {\n const [session] = useState(() =>\n new Client({ host: "", preserveCompletedSessions: true }).session(),\n );\n const cancellationRef = useRef<Cancellation>({ requested: false });\n const [cancellationError, setCancellationError] = useState<string>();\n const [cancellationState, setCancellationState] = useState<CancellationState>("idle");\n\n const cancelTurn = useCallback(\n (turnId: string) => {\n const cancellation = cancellationRef.current;\n if (!cancellation.requested || cancellation.sentTurnId === turnId) {\n return;\n }\n\n cancellation.sentTurnId = turnId;\n setCancellationState("cancelling");\n\n void session.cancel({ turnId }).catch((error: unknown) => {\n if (cancellationRef.current !== cancellation) {\n return;\n }\n\n cancellation.requested = false;\n cancellation.sentTurnId = undefined;\n setCancellationError(toErrorMessage(error));\n setCancellationState("idle");\n });\n },\n [session],\n );\n\n const handleEvent = useCallback(\n (event: HandleMessageStreamEvent) => {\n if (event.type !== "turn.started") {\n return;\n }\n\n const cancellation = cancellationRef.current;\n cancellation.turnId = event.data.turnId;\n cancelTurn(event.data.turnId);\n },\n [cancelTurn],\n );\n\n const agent = useEveAgent({ onEvent: handleEvent, session });\n const isBusy = agent.status === "submitted" || agent.status === "streaming";\n const isEmpty = agent.data.messages.length === 0;\n const errorMessage = cancellationError ?? agent.error?.message;\n const submitStatus = isBusy && cancellationState !== "idle" ? "submitted" : agent.status;\n\n const prepareTurn = () => {\n cancellationRef.current = { requested: false };\n setCancellationError(undefined);\n setCancellationState("idle");\n };\n\n const requestCancellation = () => {\n if (!isBusy || cancellationState !== "idle") {\n return;\n }\n\n const cancellation = cancellationRef.current;\n cancellation.requested = true;\n setCancellationError(undefined);\n setCancellationState("requested");\n\n if (cancellation.turnId !== undefined) {\n cancelTurn(cancellation.turnId);\n }\n };\n\n const handleSubmit = async (message: PromptInputMessage) => {\n const text = message.text.trim();\n if ((text.length === 0 && message.files.length === 0) || isBusy) return;\n\n prepareTurn();\n\n if (message.files.length === 0) {\n await agent.send({ message: text });\n return;\n }\n\n const parts: UserContent = [];\n if (text.length > 0) {\n parts.push({ text, type: "text" });\n }\n for (const file of message.files) {\n parts.push({\n data: file.url,\n filename: file.filename,\n mediaType: file.mediaType,\n type: "file",\n });\n }\n\n await agent.send({ message: parts });\n };\n\n const composer = (\n <PromptInput onSubmit={handleSubmit}>\n <PromptInputTextarea placeholder="Send a message…" />\n <PromptInputSubmit onStop={requestCancellation} status={submitStatus} />\n </PromptInput>\n );\n\n return (\n <main className="flex h-dvh flex-col overflow-hidden bg-background text-foreground">\n {isEmpty ? null : (\n <header className="flex h-14 shrink-0 items-center justify-center gap-3 pl-4 pr-2">\n <span className="flex min-w-0 items-center gap-2">\n <span className="truncate text-muted-foreground text-sm">{AGENT_NAME}</span>\n <StatusDot status={agent.status} />\n </span>\n </header>\n )}\n\n {errorMessage ? (\n <div className="mx-auto w-full max-w-3xl shrink-0 px-4 pt-2 sm:px-6">\n <div className="flex items-start gap-3 rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2.5 text-sm">\n <AlertCircleIcon className="mt-0.5 size-4 shrink-0 text-destructive" />\n <div>\n <p className="font-medium">Request failed</p>\n <p className="mt-0.5 text-muted-foreground">{errorMessage}</p>\n </div>\n </div>\n </div>\n ) : null}\n\n {isEmpty ? null : (\n <Conversation className="min-h-0 flex-1">\n <ConversationContent className="mx-auto w-full max-w-3xl gap-6 px-4 py-6 sm:px-6">\n {agent.data.messages.map((message, index) => (\n <AgentMessage\n canRespond={!isBusy}\n isStreaming={\n agent.status === "streaming" && index === agent.data.messages.length - 1\n }\n key={message.id}\n message={message}\n onInputResponses={(inputResponses) => {\n prepareTurn();\n return agent.send({ inputResponses });\n }}\n />\n ))}\n </ConversationContent>\n <ConversationScrollButton />\n </Conversation>\n )}\n\n <div\n className={cn(\n "mx-auto w-full px-4 sm:px-6",\n isEmpty\n ? "flex max-w-xl flex-1 flex-col items-center justify-center gap-8 pb-[10vh]"\n : "max-w-3xl shrink-0 pb-6",\n )}\n >\n {isEmpty ? (\n <div className="flex flex-col items-center gap-3 text-center">\n <h1 className="font-medium text-5xl tracking-tighter">{AGENT_NAME}</h1>\n </div>\n ) : null}\n <div className="w-full">{composer}</div>\n </div>\n </main>\n );\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : "Unable to cancel the response.";\n}\n\nfunction StatusDot({ status }: { readonly status: AgentStatus }) {\n const isLive = status === "submitted" || status === "streaming";\n const tone =\n status === "error"\n ? "bg-destructive"\n : isLive\n ? "bg-emerald-500"\n : status === "ready"\n ? "bg-muted-foreground"\n : "bg-muted-foreground/50";\n\n return (\n <span className="relative flex size-1">\n {isLive ? (\n <span\n className={cn(\n "absolute inline-flex size-full animate-ping rounded-full opacity-75",\n tone,\n )}\n />\n ) : null}\n <span className={cn("relative inline-flex size-1 rounded-full transition-colors", tone)} />\n </span>\n );\n}\n';
3
+ readonly "app/_components/agent-chat.tsx": '"use client";\n\nimport type { UserContent } from "ai";\nimport { Client, type MessageStreamEvent } from "eve/client";\nimport { useEveAgent } from "eve/react";\nimport { AlertCircleIcon } from "lucide-react";\nimport { useCallback, useRef, useState } from "react";\nimport {\n Conversation,\n ConversationContent,\n ConversationScrollButton,\n} from "@/components/ai-elements/conversation";\nimport {\n PromptInput,\n type PromptInputMessage,\n PromptInputSubmit,\n PromptInputTextarea,\n} from "@/components/ai-elements/prompt-input";\nimport { cn } from "@/lib/utils";\nimport { AgentMessage } from "./agent-message";\n\nconst AGENT_NAME = "__EVE_INIT_APP_NAME__";\n\ntype AgentStatus = ReturnType<typeof useEveAgent>["status"];\ntype CancellationState = "idle" | "requested" | "cancelling";\n\ntype Cancellation = {\n requested: boolean;\n sentTurnId?: string;\n turnId?: string;\n};\n\nexport function AgentChat() {\n const [session] = useState(() =>\n new Client({ host: "", preserveCompletedSessions: true }).session(),\n );\n const cancellationRef = useRef<Cancellation>({ requested: false });\n const [cancellationError, setCancellationError] = useState<string>();\n const [cancellationState, setCancellationState] = useState<CancellationState>("idle");\n\n const cancelTurn = useCallback(\n (turnId: string) => {\n const cancellation = cancellationRef.current;\n if (!cancellation.requested || cancellation.sentTurnId === turnId) {\n return;\n }\n\n cancellation.sentTurnId = turnId;\n setCancellationState("cancelling");\n\n void session.cancel({ turnId }).catch((error: unknown) => {\n if (cancellationRef.current !== cancellation) {\n return;\n }\n\n cancellation.requested = false;\n cancellation.sentTurnId = undefined;\n setCancellationError(toErrorMessage(error));\n setCancellationState("idle");\n });\n },\n [session],\n );\n\n const handleEvent = useCallback(\n (event: MessageStreamEvent) => {\n if (event.type !== "turn.started") {\n return;\n }\n\n const cancellation = cancellationRef.current;\n cancellation.turnId = event.data.turnId;\n cancelTurn(event.data.turnId);\n },\n [cancelTurn],\n );\n\n const agent = useEveAgent({ onEvent: handleEvent, session });\n const isBusy = agent.status === "submitted" || agent.status === "streaming";\n const isEmpty = agent.data.messages.length === 0;\n const errorMessage = cancellationError ?? agent.error?.message;\n const submitStatus = isBusy && cancellationState !== "idle" ? "submitted" : agent.status;\n\n const prepareTurn = () => {\n cancellationRef.current = { requested: false };\n setCancellationError(undefined);\n setCancellationState("idle");\n };\n\n const requestCancellation = () => {\n if (!isBusy || cancellationState !== "idle") {\n return;\n }\n\n const cancellation = cancellationRef.current;\n cancellation.requested = true;\n setCancellationError(undefined);\n setCancellationState("requested");\n\n if (cancellation.turnId !== undefined) {\n cancelTurn(cancellation.turnId);\n }\n };\n\n const handleSubmit = async (message: PromptInputMessage) => {\n const text = message.text.trim();\n if ((text.length === 0 && message.files.length === 0) || isBusy) return;\n\n prepareTurn();\n\n if (message.files.length === 0) {\n await agent.send({ message: text });\n return;\n }\n\n const parts: UserContent = [];\n if (text.length > 0) {\n parts.push({ text, type: "text" });\n }\n for (const file of message.files) {\n parts.push({\n data: file.url,\n filename: file.filename,\n mediaType: file.mediaType,\n type: "file",\n });\n }\n\n await agent.send({ message: parts });\n };\n\n const composer = (\n <PromptInput onSubmit={handleSubmit}>\n <PromptInputTextarea placeholder="Send a message…" />\n <PromptInputSubmit onStop={requestCancellation} status={submitStatus} />\n </PromptInput>\n );\n\n return (\n <main className="flex h-dvh flex-col overflow-hidden bg-background text-foreground">\n {isEmpty ? null : (\n <header className="flex h-14 shrink-0 items-center justify-center gap-3 pl-4 pr-2">\n <span className="flex min-w-0 items-center gap-2">\n <span className="truncate text-muted-foreground text-sm">{AGENT_NAME}</span>\n <StatusDot status={agent.status} />\n </span>\n </header>\n )}\n\n {errorMessage ? (\n <div className="mx-auto w-full max-w-3xl shrink-0 px-4 pt-2 sm:px-6">\n <div className="flex items-start gap-3 rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2.5 text-sm">\n <AlertCircleIcon className="mt-0.5 size-4 shrink-0 text-destructive" />\n <div>\n <p className="font-medium">Request failed</p>\n <p className="mt-0.5 text-muted-foreground">{errorMessage}</p>\n </div>\n </div>\n </div>\n ) : null}\n\n {isEmpty ? null : (\n <Conversation className="min-h-0 flex-1">\n <ConversationContent className="mx-auto w-full max-w-3xl gap-6 px-4 py-6 sm:px-6">\n {agent.data.messages.map((message, index) => (\n <AgentMessage\n canRespond={!isBusy}\n isStreaming={\n agent.status === "streaming" && index === agent.data.messages.length - 1\n }\n key={message.id}\n message={message}\n onInputResponses={(inputResponses) => {\n prepareTurn();\n return agent.send({ inputResponses });\n }}\n />\n ))}\n </ConversationContent>\n <ConversationScrollButton />\n </Conversation>\n )}\n\n <div\n className={cn(\n "mx-auto w-full px-4 sm:px-6",\n isEmpty\n ? "flex max-w-xl flex-1 flex-col items-center justify-center gap-8 pb-[10vh]"\n : "max-w-3xl shrink-0 pb-6",\n )}\n >\n {isEmpty ? (\n <div className="flex flex-col items-center gap-3 text-center">\n <h1 className="font-medium text-5xl tracking-tighter">{AGENT_NAME}</h1>\n </div>\n ) : null}\n <div className="w-full">{composer}</div>\n </div>\n </main>\n );\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : "Unable to cancel the response.";\n}\n\nfunction StatusDot({ status }: { readonly status: AgentStatus }) {\n const isLive = status === "submitted" || status === "streaming";\n const tone =\n status === "error"\n ? "bg-destructive"\n : isLive\n ? "bg-emerald-500"\n : status === "ready"\n ? "bg-muted-foreground"\n : "bg-muted-foreground/50";\n\n return (\n <span className="relative flex size-1">\n {isLive ? (\n <span\n className={cn(\n "absolute inline-flex size-full animate-ping rounded-full opacity-75",\n tone,\n )}\n />\n ) : null}\n <span className={cn("relative inline-flex size-1 rounded-full transition-colors", tone)} />\n </span>\n );\n}\n';
4
4
  readonly "app/_components/agent-message.tsx": '"use client";\n\nimport type {\n EveAuthorizationPart,\n EveDynamicToolPart,\n EveMessage,\n EveMessagePart,\n} from "eve/react";\nimport {\n CheckCircleIcon,\n ExternalLinkIcon,\n FileIcon,\n ImageIcon,\n KeyRoundIcon,\n XCircleIcon,\n} from "lucide-react";\nimport { Message, MessageContent, MessageResponse } from "@/components/ai-elements/message";\nimport { Reasoning, ReasoningContent, ReasoningTrigger } from "@/components/ai-elements/reasoning";\nimport {\n Tool,\n ToolContent,\n ToolHeader,\n ToolInput,\n ToolOutput,\n} from "@/components/ai-elements/tool";\nimport { Button } from "@/components/ui/button";\nimport { cn } from "@/lib/utils";\n\nexport type AgentInputResponse = {\n readonly optionId?: string;\n readonly requestId: string;\n readonly text?: string;\n};\n\ntype EveFilePart = Extract<EveMessagePart, { type: "file" }>;\n\nexport function AgentMessage({\n canRespond,\n isStreaming,\n message,\n onInputResponses,\n}: {\n readonly canRespond: boolean;\n readonly isStreaming: boolean;\n readonly message: EveMessage;\n readonly onInputResponses: (responses: readonly AgentInputResponse[]) => void | Promise<void>;\n}) {\n const lastTextIndex = message.parts.reduce(\n (last, part, index) => (part.type === "text" ? index : last),\n -1,\n );\n\n return (\n <Message\n data-optimistic={message.metadata?.optimistic ? "true" : undefined}\n from={message.role}\n >\n <MessageContent>\n {message.parts.map((part, index) => (\n <AgentMessagePart\n canRespond={canRespond}\n key={partKey(part, index)}\n onInputResponses={onInputResponses}\n part={part}\n showCaret={isStreaming && message.role === "assistant" && index === lastTextIndex}\n />\n ))}\n </MessageContent>\n </Message>\n );\n}\n\nfunction AgentMessagePart({\n canRespond,\n onInputResponses,\n part,\n showCaret,\n}: {\n readonly canRespond: boolean;\n readonly onInputResponses: (responses: readonly AgentInputResponse[]) => void | Promise<void>;\n readonly part: EveMessagePart;\n readonly showCaret: boolean;\n}) {\n switch (part.type) {\n case "step-start":\n return null;\n case "text":\n return (\n <MessageResponse caret="block" isAnimating={showCaret}>\n {part.text}\n </MessageResponse>\n );\n case "reasoning":\n return (\n <Reasoning defaultOpen isStreaming={part.state === "streaming"}>\n <ReasoningTrigger />\n <ReasoningContent>{part.text}</ReasoningContent>\n </Reasoning>\n );\n case "file":\n return <AttachmentPart part={part} />;\n case "authorization":\n return <AuthorizationPrompt part={part} />;\n case "dynamic-tool":\n return (\n <Tool\n defaultOpen={part.state === "approval-requested" || part.state === "approval-responded"}\n >\n <ToolHeader\n state={part.state}\n title={part.toolName}\n toolName={part.toolName}\n type="dynamic-tool"\n />\n <ToolContent>\n <ToolInput input={part.input} />\n <InputRequestActions\n canRespond={canRespond}\n part={part}\n onInputResponses={onInputResponses}\n />\n <ToolOutput errorText={part.errorText} output={part.output} />\n </ToolContent>\n </Tool>\n );\n }\n}\n\nfunction AttachmentPart({ part }: { readonly part: EveFilePart }) {\n const label = part.filename ?? "Attachment";\n const detail = [part.mediaType, formatBytes(part.size)].filter(Boolean).join(" - ");\n const isImage = part.mediaType.startsWith("image/") && part.url !== undefined;\n const Icon = isImage ? ImageIcon : FileIcon;\n const body = (\n <span className="flex max-w-sm items-center gap-3 rounded-md border bg-background/60 p-2 text-sm">\n {isImage ? (\n <img alt={label} className="size-12 shrink-0 rounded-sm object-cover" src={part.url} />\n ) : (\n <span className="flex size-10 shrink-0 items-center justify-center rounded-sm bg-muted text-muted-foreground">\n <Icon className="size-4" />\n </span>\n )}\n <span className="min-w-0 flex-1">\n <span className="block truncate font-medium">{label}</span>\n {detail ? <span className="block truncate text-muted-foreground">{detail}</span> : null}\n </span>\n {part.url ? <ExternalLinkIcon className="size-4 shrink-0 text-muted-foreground" /> : null}\n </span>\n );\n\n return part.url ? (\n <a href={part.url} rel="noreferrer" target="_blank">\n {body}\n </a>\n ) : (\n body\n );\n}\n\nfunction AuthorizationPrompt({ part }: { readonly part: EveAuthorizationPart }) {\n const isAuthorized = part.state === "completed" && part.outcome === "authorized";\n const isCompleted = part.state === "completed";\n const Icon = isAuthorized ? CheckCircleIcon : isCompleted ? XCircleIcon : KeyRoundIcon;\n const instructions = part.authorization?.instructions;\n const shouldShowInstructions = instructions !== undefined && instructions !== part.description;\n\n return (\n <div\n className={cn(\n "space-y-3 rounded-md border p-3",\n isAuthorized\n ? "border-emerald-500/30 bg-emerald-500/5"\n : isCompleted\n ? "border-destructive/30 bg-destructive/5"\n : "border-blue-500/30 bg-blue-500/5",\n )}\n >\n <div className="flex items-start gap-3">\n <span\n className={cn(\n "mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-full",\n isAuthorized\n ? "bg-emerald-500/10 text-emerald-700 dark:text-emerald-300"\n : isCompleted\n ? "bg-destructive/10 text-destructive"\n : "bg-blue-500/10 text-blue-700 dark:text-blue-300",\n )}\n >\n <Icon className="size-4" />\n </span>\n <div className="min-w-0 flex-1 space-y-2">\n <p className="font-medium text-sm">{authorizationTitle(part)}</p>\n <p className="text-muted-foreground text-sm">{authorizationDescription(part)}</p>\n {shouldShowInstructions ? (\n <p className="text-muted-foreground text-sm">{instructions}</p>\n ) : null}\n {part.state === "required" && part.authorization?.userCode ? (\n <div className="flex flex-wrap items-center gap-2 text-sm">\n <span className="text-muted-foreground">Code</span>\n <code className="rounded-md bg-background px-2 py-1 font-mono">\n {part.authorization.userCode}\n </code>\n </div>\n ) : null}\n {part.state === "required" && part.authorization?.url ? (\n <Button asChild size="sm">\n <a href={part.authorization.url} rel="noreferrer" target="_blank">\n <ExternalLinkIcon className="size-4" />\n Sign in with {part.displayName}\n </a>\n </Button>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n\nfunction authorizationTitle(part: EveAuthorizationPart): string {\n if (part.state === "required") {\n return `Connect ${part.displayName}`;\n }\n if (part.outcome === "authorized") {\n return `${part.displayName} connected`;\n }\n return `${part.displayName} authorization ${formatAuthorizationOutcome(part.outcome)}`;\n}\n\nfunction authorizationDescription(part: EveAuthorizationPart): string {\n if (part.state === "required") {\n return part.description;\n }\n if (part.outcome === "authorized") {\n return `${part.displayName} connected.`;\n }\n const tail = part.reason !== undefined ? ` (${part.reason})` : "";\n return `${part.displayName} authorization ${formatAuthorizationOutcome(part.outcome)}${tail}.`;\n}\n\nfunction formatAuthorizationOutcome(outcome: NonNullable<EveAuthorizationPart["outcome"]>): string {\n switch (outcome) {\n case "authorized":\n return "authorized";\n case "declined":\n return "declined";\n case "failed":\n return "failed";\n case "timed-out":\n return "timed out";\n }\n}\n\nfunction formatBytes(size: number | undefined): string | undefined {\n if (size === undefined) {\n return undefined;\n }\n if (size < 1024) {\n return `${size} B`;\n }\n if (size < 1024 * 1024) {\n return `${(size / 1024).toFixed(1)} KB`;\n }\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction InputRequestActions({\n canRespond,\n onInputResponses,\n part,\n}: {\n readonly canRespond: boolean;\n readonly onInputResponses: (responses: readonly AgentInputResponse[]) => void | Promise<void>;\n readonly part: EveDynamicToolPart;\n}) {\n const inputRequest = part.toolMetadata?.eve?.inputRequest;\n if (!inputRequest) {\n return null;\n }\n\n const inputResponse = part.toolMetadata?.eve?.inputResponse;\n const selectedOption = inputRequest.options?.find(\n (option) => option.id === inputResponse?.optionId,\n );\n\n return (\n <div className="space-y-3 rounded-md border border-yellow-500/30 bg-yellow-500/5 p-3">\n <p className="text-muted-foreground text-sm">{inputRequest.prompt}</p>\n {inputResponse ? (\n <p className="font-medium text-sm">\n Responded: {selectedOption?.label ?? inputResponse.text ?? inputResponse.optionId}\n </p>\n ) : (\n <div className="flex flex-wrap gap-2">\n {inputRequest.options?.map((option) => (\n <Button\n disabled={!canRespond}\n key={option.id}\n onClick={() => {\n void onInputResponses([\n {\n optionId: option.id,\n requestId: inputRequest.requestId,\n },\n ]);\n }}\n size="sm"\n type="button"\n variant={option.style === "danger" ? "destructive" : "default"}\n >\n {option.label}\n </Button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction partKey(part: EveMessagePart, index: number): string {\n switch (part.type) {\n case "authorization":\n return `authorization:${part.turnId}:${part.stepIndex}:${part.name}`;\n case "dynamic-tool":\n return part.toolCallId;\n default:\n return `${part.type}:${index}`;\n }\n}\n';
5
5
  readonly "app/globals.css": '@import "tailwindcss";\n@source "../node_modules/streamdown/dist/*.js";\n\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --color-card: var(--card);\n --color-card-foreground: var(--card-foreground);\n --color-popover: var(--popover);\n --color-popover-foreground: var(--popover-foreground);\n --color-primary: var(--primary);\n --color-primary-foreground: var(--primary-foreground);\n --color-secondary: var(--secondary);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-muted: var(--muted);\n --color-muted-foreground: var(--muted-foreground);\n --color-accent: var(--accent);\n --color-accent-foreground: var(--accent-foreground);\n --color-destructive: var(--destructive);\n --color-border: var(--border);\n --color-input: var(--input);\n --color-ring: var(--ring);\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) + 4px);\n --font-sans: "Geist", "Geist Fallback", ui-sans-serif, system-ui, sans-serif;\n --font-mono: "Geist Mono", "Geist Mono Fallback", ui-monospace, monospace;\n}\n\n:root {\n color-scheme: light;\n /* Soft neutral page with white elevated surfaces so cards/composer pop. */\n --background: oklch(0.971 0 0);\n --foreground: oklch(0.16 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.16 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.16 0 0);\n --primary: oklch(0.19 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --secondary: oklch(0.94 0 0);\n --secondary-foreground: oklch(0.19 0 0);\n --muted: oklch(0.94 0 0);\n --muted-foreground: oklch(0.6 0 0);\n --accent: oklch(0.94 0 0);\n --accent-foreground: oklch(0.19 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --border: oklch(0.916 0 0);\n --input: oklch(0.916 0 0);\n --ring: oklch(0.708 0 0);\n --radius: 0.625rem;\n}\n\n@media (prefers-color-scheme: dark) {\n :root {\n color-scheme: dark;\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --card: oklch(0.205 0 0);\n --card-foreground: oklch(0.985 0 0);\n --popover: oklch(0.205 0 0);\n --popover-foreground: oklch(0.985 0 0);\n --primary: oklch(0.922 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --secondary: oklch(0.269 0 0);\n --secondary-foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --accent: oklch(0.269 0 0);\n --accent-foreground: oklch(0.985 0 0);\n --destructive: oklch(0.704 0.191 22.216);\n --border: oklch(1 0 0 / 10%);\n --input: oklch(1 0 0 / 15%);\n --ring: oklch(0.556 0 0);\n }\n}\n\n* {\n border-color: var(--border);\n}\n\nhtml {\n height: 100%;\n}\n\nbody {\n min-height: 100%;\n margin: 0;\n background: var(--background);\n font-family: var(--font-sans);\n}\n\nbutton,\ninput,\ntextarea {\n font: inherit;\n}\n';
6
6
  readonly "app/layout.tsx": 'import type { Metadata } from "next";\nimport { Geist, Geist_Mono } from "next/font/google";\nimport type { ReactNode } from "react";\nimport { TooltipProvider } from "@/components/ui/tooltip";\nimport { cn } from "@/lib/utils";\nimport "./globals.css";\n\nconst sans = Geist({\n variable: "--font-sans",\n subsets: ["latin"],\n weight: "variable",\n display: "swap",\n});\n\nconst mono = Geist_Mono({\n variable: "--font-mono",\n subsets: ["latin"],\n weight: "variable",\n display: "swap",\n});\n\nexport const metadata: Metadata = {\n title: "__EVE_INIT_APP_NAME__",\n description: "A Next.js starter for eve agents with AI Elements.",\n};\n\nexport default function RootLayout({ children }: { readonly children: ReactNode }) {\n return (\n <html className={cn(sans.variable, mono.variable)} lang="en">\n <body>\n <TooltipProvider>{children}</TooltipProvider>\n </body>\n </html>\n );\n}\n';
@@ -16,7 +16,7 @@ export default eveChannel({
16
16
  `,"app/_components/agent-chat.tsx":`"use client";
17
17
 
18
18
  import type { UserContent } from "ai";
19
- import { Client, type HandleMessageStreamEvent } from "eve/client";
19
+ import { Client, type MessageStreamEvent } from "eve/client";
20
20
  import { useEveAgent } from "eve/react";
21
21
  import { AlertCircleIcon } from "lucide-react";
22
22
  import { useCallback, useRef, useState } from "react";
@@ -78,7 +78,7 @@ export function AgentChat() {
78
78
  );
79
79
 
80
80
  const handleEvent = useCallback(
81
- (event: HandleMessageStreamEvent) => {
81
+ (event: MessageStreamEvent) => {
82
82
  if (event.type !== "turn.started") {
83
83
  return;
84
84
  }
@@ -0,0 +1 @@
1
+ export declare function blockingCreateInPlaceEntries(entries: readonly string[]): string[];
@@ -0,0 +1 @@
1
+ const ALLOWED_CREATE_IN_PLACE_ENTRIES=new Set([`.DS_Store`,`.git`,`.gitkeep`,`.hg`,`.node-version`,`.nvmrc`,`.protolock`,`.prototools`,`.tool-versions`,`devenv.lock`,`devenv.nix`,`devenv.yaml`,`devbox.json`,`devbox.lock`,`flake.lock`,`flake.nix`]);function isSharedMiseEntry(e){let t=(e.startsWith(`.`)?e.slice(1):e).split(`.`),n=t.at(-1),r=t.slice(1,-1);return t[0]===`mise`&&(n===`toml`||n===`lock`)&&r.every(e=>e!==``&&e!==`local`)}function blockingCreateInPlaceEntries(t){return t.filter(t=>!ALLOWED_CREATE_IN_PLACE_ENTRIES.has(t)&&!isSharedMiseEntry(t))}export{blockingCreateInPlaceEntries};
@@ -1 +1 @@
1
- import{CONNECTION_CATALOG,CUSTOM_CONNECTION_SLUG,SUPPORTED_PROTOCOLS,catalogSlugs,effectiveProtocols,endpointForProtocol,getCatalogEntry,isValidConnectionSlug}from"./connections/catalog.js";import{WriteFileExistsError}from"./files.js";import{CURRENT_DIRECTORY_PROJECT_NAME,byokProviderEnvVar,isEveProject,scaffoldBaseProject}from"./create/project.js";import{scaffoldExtensionProject}from"./create/extension.js";import{DEFAULT_SLACK_CONNECTOR_SLUG,SLACK_CHANNEL_DEFAULT_ROUTE,deriveSlackConnectorSlug,ensureChannel,hasVercelHostFramework,isNextJsProject,listAuthoredChannels,normalizeSlackConnectorSlug,resolveVercelHostFrameworkPreset}from"./update/channels.js";import{SCAFFOLDABLE_CHANNELS}from"./channels-catalog.js";import{ensureConnection,ensureConnectionDependencies,listAuthoredConnections}from"./update/connections.js";import{HumanActionRequiredError}from"../human-action.js";export{CONNECTION_CATALOG,CURRENT_DIRECTORY_PROJECT_NAME,CUSTOM_CONNECTION_SLUG,DEFAULT_SLACK_CONNECTOR_SLUG,HumanActionRequiredError,SCAFFOLDABLE_CHANNELS,SLACK_CHANNEL_DEFAULT_ROUTE,SUPPORTED_PROTOCOLS,WriteFileExistsError,byokProviderEnvVar,catalogSlugs,deriveSlackConnectorSlug,effectiveProtocols,endpointForProtocol,ensureChannel,ensureConnection,ensureConnectionDependencies,getCatalogEntry,hasVercelHostFramework,isEveProject,isNextJsProject,isValidConnectionSlug,listAuthoredChannels,listAuthoredConnections,normalizeSlackConnectorSlug,resolveVercelHostFrameworkPreset,scaffoldBaseProject,scaffoldExtensionProject};
1
+ import{WriteFileExistsError}from"./files.js";import{CURRENT_DIRECTORY_PROJECT_NAME,byokProviderEnvVar,isEveProject,scaffoldBaseProject}from"./create/project.js";import{scaffoldExtensionProject}from"./create/extension.js";import{DEFAULT_SLACK_CONNECTOR_SLUG,SLACK_CHANNEL_DEFAULT_ROUTE,deriveSlackConnectorSlug,ensureChannel,hasVercelHostFramework,isNextJsProject,listAuthoredChannels,normalizeSlackConnectorSlug,resolveVercelHostFrameworkPreset}from"./update/channels.js";import{SCAFFOLDABLE_CHANNELS}from"./channels-catalog.js";import{CONNECTION_CATALOG,CUSTOM_CONNECTION_SLUG,SUPPORTED_PROTOCOLS,catalogSlugs,effectiveProtocols,endpointForProtocol,getCatalogEntry,isValidConnectionSlug}from"./connections/catalog.js";import{ensureConnection,ensureConnectionDependencies,listAuthoredConnections}from"./update/connections.js";import{HumanActionRequiredError}from"../human-action.js";export{CONNECTION_CATALOG,CURRENT_DIRECTORY_PROJECT_NAME,CUSTOM_CONNECTION_SLUG,DEFAULT_SLACK_CONNECTOR_SLUG,HumanActionRequiredError,SCAFFOLDABLE_CHANNELS,SLACK_CHANNEL_DEFAULT_ROUTE,SUPPORTED_PROTOCOLS,WriteFileExistsError,byokProviderEnvVar,catalogSlugs,deriveSlackConnectorSlug,effectiveProtocols,endpointForProtocol,ensureChannel,ensureConnection,ensureConnectionDependencies,getCatalogEntry,hasVercelHostFramework,isEveProject,isNextJsProject,isValidConnectionSlug,listAuthoredChannels,listAuthoredConnections,normalizeSlackConnectorSlug,resolveVercelHostFrameworkPreset,scaffoldBaseProject,scaffoldExtensionProject};
@@ -1,4 +1,4 @@
1
- import{endpointForProtocol}from"../connections/catalog.js";import{getSupportedModuleBaseName,matchesSupportedModuleBaseName}from"./module-files.js";import{pathExists,writeTextFile}from"../files.js";import{resolveVersionToken}from"../version-tokens.js";import{patchPackageJson}from"./package-json.js";import{join}from"node:path";import{readFile,readdir,writeFile}from"node:fs/promises";const DEFAULT_CONNECT_PACKAGE_VERSION=`0.4.2`,CONNECT_PACKAGE_NAME=`@vercel/connect`,USER_AUTHORED_CONNECTION_DIR=`agent/connections`;function resolveAuth(e){return e.auth??{kind:`none`}}function envKeysForAuth(e){switch(e.kind){case`bearer-env`:return[e.envVar];case`header`:return e.headers.map(e=>e.envVar);case`connect`:case`none`:return[]}}function authBlock(e){switch(e.kind){case`connect`:return` auth: connect("${e.connector}"),\n`;case`bearer-env`:return` auth: { getToken: async () => ({ token: process.env.${e.envVar}! }) },\n`;case`header`:return` headers: () => ({\n${e.headers.map(e=>` "${e.header}": process.env.${e.envVar}!,`).join(`
1
+ import{getSupportedModuleBaseName,matchesSupportedModuleBaseName}from"./module-files.js";import{pathExists,writeTextFile}from"../files.js";import{resolveVersionToken}from"../version-tokens.js";import{patchPackageJson}from"./package-json.js";import{endpointForProtocol}from"../connections/catalog.js";import{join}from"node:path";import{readFile,readdir,writeFile}from"node:fs/promises";const DEFAULT_CONNECT_PACKAGE_VERSION=`0.4.2`,CONNECT_PACKAGE_NAME=`@vercel/connect`,USER_AUTHORED_CONNECTION_DIR=`agent/connections`;function resolveAuth(e){return e.auth??{kind:`none`}}function envKeysForAuth(e){switch(e.kind){case`bearer-env`:return[e.envVar];case`header`:return e.headers.map(e=>e.envVar);case`connect`:case`none`:return[]}}function authBlock(e){switch(e.kind){case`connect`:return` auth: connect("${e.connector}"),\n`;case`bearer-env`:return` auth: { getToken: async () => ({ token: process.env.${e.envVar}! }) },\n`;case`header`:return` headers: () => ({\n${e.headers.map(e=>` "${e.header}": process.env.${e.envVar}!,`).join(`
2
2
  `)}\n }),\n`;case`none`:return``}}function renderMcpTemplate(e,t,n){return`${n.kind===`connect`?`import { connect } from "@vercel/connect/eve";
3
3
  import { defineMcpClientConnection } from "eve/connections";
4
4
  `:`import { defineMcpClientConnection } from "eve/connections";
@@ -15,7 +15,7 @@ export default defineOpenAPIConnection({
15
15
  spec: "${e.spec}",
16
16
  ${i} description: "${t}",
17
17
  ${authBlock(n)}});
18
- `}function renderTemplate(e,t,n,r){return e===`mcp`?renderMcpTemplate(t,n,r):renderOpenApiTemplate(t,n,r)}function isJsonObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function ensureConnectDependency(e,t){if(!await pathExists(e))return[];let n=JSON.parse(await readFile(e,`utf8`));return(isJsonObject(n)&&isJsonObject(n.dependencies)?n.dependencies[CONNECT_PACKAGE_NAME]:void 0)===t?[]:(await patchPackageJson(e,{dependencies:{[CONNECT_PACKAGE_NAME]:t}}),[{path:e,dependencies:[CONNECT_PACKAGE_NAME],devDependencies:[],scripts:[]}])}async function ensureConnectionDependencies(e){let t=resolveVersionToken(`connectPackageVersion`,e.connectPackageVersion??DEFAULT_CONNECT_PACKAGE_VERSION);return ensureConnectDependency(join(e.projectRoot,`package.json`),t)}function envKeyPresent(e,t){return RegExp(`^\\s*(?:export\\s+)?${t}\\s*=`,`m`).test(e)}async function seedEnvPlaceholders(e,t){if(t.length===0)return[];let n=``;await pathExists(e)&&(n=await readFile(e,`utf8`));let i=t.filter(e=>!envKeyPresent(n,e));if(i.length===0)return[];let a=`${n.length>0&&!n.endsWith(`
18
+ `}function renderTemplate(e,t,n,r){return e===`mcp`?renderMcpTemplate(t,n,r):renderOpenApiTemplate(t,n,r)}function isJsonObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function ensureConnectDependency(e,t){if(!await pathExists(e))return[];let r=JSON.parse(await readFile(e,`utf8`));return(isJsonObject(r)&&isJsonObject(r.dependencies)?r.dependencies[CONNECT_PACKAGE_NAME]:void 0)===t?[]:(await patchPackageJson(e,{dependencies:{[CONNECT_PACKAGE_NAME]:t}}),[{path:e,dependencies:[CONNECT_PACKAGE_NAME],devDependencies:[],scripts:[]}])}async function ensureConnectionDependencies(e){let t=resolveVersionToken(`connectPackageVersion`,e.connectPackageVersion??DEFAULT_CONNECT_PACKAGE_VERSION);return ensureConnectDependency(join(e.projectRoot,`package.json`),t)}function envKeyPresent(e,t){return RegExp(`^\\s*(?:export\\s+)?${t}\\s*=`,`m`).test(e)}async function seedEnvPlaceholders(e,t){if(t.length===0)return[];let r=``;await pathExists(e)&&(r=await readFile(e,`utf8`));let i=t.filter(e=>!envKeyPresent(r,e));if(i.length===0)return[];let a=`${r.length>0&&!r.endsWith(`
19
19
  `)?`
20
20
  `:``}${i.map(e=>`${e}=`).join(`
21
- `)}\n`;return await writeFile(e,n+a,`utf8`),i}async function ensureConnection(t){let n=t.slug??t.entry.slug,o=resolveAuth(t.entry),s=endpointForProtocol(t.entry,t.protocol);if(s===null)throw Error(`Connection "${n}" is missing a ${t.protocol===`mcp`?`mcp.url`:`openapi.spec`} endpoint for protocol "${t.protocol}".`);let c=join(t.projectRoot,USER_AUTHORED_CONNECTION_DIR,`${n}.ts`),l=envKeysForAuth(o),u=await pathExists(c);if(!t.force&&u)return{slug:n,protocol:t.protocol,action:`skipped`,filePath:c,filesWritten:[],filesSkipped:[c],packageJsonUpdated:[],envKeysAdded:[],envKeysRequired:l};let d=[];if(o.kind===`connect`){let e=resolveVersionToken(`connectPackageVersion`,t.connectPackageVersion??DEFAULT_CONNECT_PACKAGE_VERSION);d.push(...await ensureConnectDependency(join(t.projectRoot,`package.json`),e))}await writeTextFile(c,renderTemplate(t.protocol,s,t.entry.description,o),{force:!0});let f=await seedEnvPlaceholders(join(t.projectRoot,`.env.local`),l),p={slug:n,protocol:t.protocol,action:u?`overwritten`:`created`,filePath:c,filesWritten:[c],filesSkipped:[],packageJsonUpdated:d,envKeysAdded:f,envKeysRequired:l};return u&&(p.filesOverwritten=[c]),p}async function listAuthoredConnections(e){let r=join(e,USER_AUTHORED_CONNECTION_DIR),i;try{i=await readdir(r,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}let a=[];for(let e of i){if(e.isFile()){let n=getSupportedModuleBaseName(e.name);n!==null&&a.push(n);continue}if(e.isDirectory())try{(await readdir(join(r,e.name))).some(e=>matchesSupportedModuleBaseName(e,`connection`))&&a.push(e.name)}catch{}}return a.sort()}export{ensureConnection,ensureConnectionDependencies,listAuthoredConnections};
21
+ `)}\n`;return await writeFile(e,r+a,`utf8`),i}async function ensureConnection(e){let t=e.slug??e.entry.slug,a=resolveAuth(e.entry),o=endpointForProtocol(e.entry,e.protocol);if(o===null)throw Error(`Connection "${t}" is missing a ${e.protocol===`mcp`?`mcp.url`:`openapi.spec`} endpoint for protocol "${e.protocol}".`);let s=join(e.projectRoot,USER_AUTHORED_CONNECTION_DIR,`${t}.ts`),c=envKeysForAuth(a),l=await pathExists(s);if(!e.force&&l)return{slug:t,protocol:e.protocol,action:`skipped`,filePath:s,filesWritten:[],filesSkipped:[s],packageJsonUpdated:[],envKeysAdded:[],envKeysRequired:c};let u=[];if(a.kind===`connect`){let t=resolveVersionToken(`connectPackageVersion`,e.connectPackageVersion??DEFAULT_CONNECT_PACKAGE_VERSION);u.push(...await ensureConnectDependency(join(e.projectRoot,`package.json`),t))}await writeTextFile(s,renderTemplate(e.protocol,o,e.entry.description,a),{force:!0});let d=await seedEnvPlaceholders(join(e.projectRoot,`.env.local`),c),f={slug:t,protocol:e.protocol,action:l?`overwritten`:`created`,filePath:s,filesWritten:[s],filesSkipped:[],packageJsonUpdated:u,envKeysAdded:d,envKeysRequired:c};return l&&(f.filesOverwritten=[s]),f}async function listAuthoredConnections(n){let r=join(n,USER_AUTHORED_CONNECTION_DIR),i;try{i=await readdir(r,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}let a=[];for(let n of i){if(n.isFile()){let t=getSupportedModuleBaseName(n.name);t!==null&&a.push(t);continue}if(n.isDirectory())try{(await readdir(join(r,n.name))).some(e=>matchesSupportedModuleBaseName(e,`connection`))&&a.push(n.name)}catch{}}return a.sort()}export{ensureConnection,ensureConnectionDependencies,listAuthoredConnections};
@@ -1 +1 @@
1
- import{readFile,writeFile}from"node:fs/promises";const CONNECT_CONNECTOR_REGEX=/(\bconnect\(\s*)(["'`])([^"'`]+)\2/;async function updateConnectionConnectorUid(r,i){let a;try{a=await readFile(r,`utf8`)}catch{return{patched:!1}}return CONNECT_CONNECTOR_REGEX.test(a)?(await writeFile(r,a.replace(CONNECT_CONNECTOR_REGEX,(e,t,n)=>`${t}${n}${i}${n}`),`utf8`),{patched:!0}):{patched:!1}}export{updateConnectionConnectorUid};
1
+ import{readFile,writeFile}from"node:fs/promises";const CONNECT_CONNECTOR_REGEX=/(\bconnect\(\s*)(["'`])([^"'`]+)\2/,CONNECT_OBJECT_CONNECTOR_REGEX=/(\bconnector\s*:\s*)(["'`])([^"'`]+)\2/;async function updateConnectionConnectorUid(r,i){let a;try{a=await readFile(r,`utf8`)}catch{return{patched:!1}}let o=CONNECT_CONNECTOR_REGEX.test(a)?CONNECT_CONNECTOR_REGEX:CONNECT_OBJECT_CONNECTOR_REGEX.test(a)?CONNECT_OBJECT_CONNECTOR_REGEX:void 0;return o===void 0?{patched:!1}:(await writeFile(r,a.replace(o,(e,t,n)=>`${t}${n}${i}${n}`),`utf8`),{patched:!0})}export{updateConnectionConnectorUid};
@@ -12,7 +12,7 @@ export interface CreatedProjectFrameworkOptions extends VercelProjectOperationOp
12
12
  * host framework the project declares on disk (e.g. Next.js).
13
13
  *
14
14
  * A project created as a standalone eve agent keeps the `eve` preset; adding a
15
- * host framework via `eve channels add web` leaves it stale, so the deploy would
15
+ * host framework via `eve add channel/web` leaves it stale, so the deploy would
16
16
  * build the agent instead of the host app. Since that command already deploys on
17
17
  * the user's behalf, this switches the preset directly (no prompt) and notes the
18
18
  * change. No host framework, an unlinked directory, or an already-correct preset
@@ -1 +1 @@
1
- import{object,string}from"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/schemas.js";import"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/index.js";import{readProjectLink}from"./project-resolution.js";import{isForbiddenApiFailure,normalizeVercelApiResult}from"./vercel-api-failure.js";import{VERCEL_PROJECT_REQUEST_TIMEOUT_MS,parseVercelJson,requireVercelTeamAccess}from"./vercel-project-api.js";import{resolveVercelHostFrameworkPreset}from"./scaffold/update/channels.js";import"./scaffold/index.js";import{extname,join}from"node:path";import*as fs from"node:fs/promises";import{captureVercel}from"#setup/primitives/index.js";import"#setup/cli/index.js";const VercelProjectFrameworkSchema=object({framework:string().min(1).nullish()}),EVE_FRAMEWORK_INTEGRATIONS={nextjs:{label:`Next.js`,importSpecifier:`eve/next`},nuxt:{label:`Nuxt`,importSpecifier:`eve/nuxt`},nuxtjs:{label:`Nuxt`,importSpecifier:`eve/nuxt`},sveltekit:{label:`SvelteKit`,importSpecifier:`eve/sveltekit`}},FRAMEWORK_INTEGRATION_SOURCE_EXTENSIONS=new Set([`.cjs`,`.cts`,`.js`,`.json`,`.jsx`,`.mjs`,`.mts`,`.svelte`,`.ts`,`.tsx`,`.vue`]),FRAMEWORK_INTEGRATION_IGNORED_DIRECTORIES=new Set([`.eve`,`.git`,`.next`,`.nuxt`,`.output`,`.svelte-kit`,`.turbo`,`.vercel`,`build`,`coverage`,`dist`,`node_modules`]);function parseProjectFramework(e,t){let n=VercelProjectFrameworkSchema.safeParse(parseVercelJson(e,t));if(!n.success)throw Error(`Could not read Vercel project framework from ${t}.`);return n.data.framework??void 0}async function fetchProjectFramework(e,t,n,o){let c=normalizeVercelApiResult(await captureVercel([`api`,`/v9/projects/${n}`,`--scope`,t,`--raw`],{cwd:e,signal:o.signal,timeoutMs:VERCEL_PROJECT_REQUEST_TIMEOUT_MS}));if(c.ok)return parseProjectFramework(c.stdout,`project ${n}`);throw isForbiddenApiFailure(c.failure)&&requireVercelTeamAccess(c.failure),Error(`Could not inspect Vercel project "${n}". ${c.failure.message}`)}async function setProjectFramework(e,t,n,o,c,l){let u=normalizeVercelApiResult(await captureVercel([`api`,`/v9/projects/${n}`,`--scope`,t,`--method`,`PATCH`,`--raw-field`,`framework=${o}`,`--raw`],{cwd:e,onOutput:c,signal:l.signal,timeoutMs:VERCEL_PROJECT_REQUEST_TIMEOUT_MS}));if(!u.ok)throw isForbiddenApiFailure(u.failure)&&requireVercelTeamAccess(u.failure),Error(`Could not set Vercel project "${n}" framework to ${o}. ${u.failure.message}`)}async function confirmDetectedFramework(e,t,n){return await e.select({message:`Vercel detected ${n.label}. Is this project using ${n.importSpecifier}?`,options:[{value:!0,label:`Yes, keep ${t}`,hint:`Use this for a host app that integrates eve through ${n.importSpecifier}.`},{value:!1,label:`No, switch to eve`,hint:`Use this for a standalone eve agent.`}]})?`keep`:`switch-to-eve`}function sourceMentionsPackageSpecifier(e,t){return e.includes(`"${t}"`)||e.includes(`'${t}'`)||e.includes(`\`${t}\``)}async function directoryContainsPackageSpecifier(e,t){let n;try{n=await fs.readdir(e,{encoding:`utf8`,withFileTypes:!0})}catch{return!1}for(let r of n){let n=join(e,r.name);if(r.isDirectory()){if(FRAMEWORK_INTEGRATION_IGNORED_DIRECTORIES.has(r.name))continue;if(await directoryContainsPackageSpecifier(n,t))return!0;continue}if(!(!r.isFile()||!FRAMEWORK_INTEGRATION_SOURCE_EXTENSIONS.has(extname(r.name))))try{if(sourceMentionsPackageSpecifier(await fs.readFile(n,`utf8`),t))return!0}catch{continue}}return!1}async function detectFrameworkIntegrationImport(e,t){return directoryContainsPackageSpecifier(e,t)}async function resolveDetectedFrameworkAction(e,t,n,r){let i=EVE_FRAMEWORK_INTEGRATIONS[n];return i===void 0?`switch-to-eve`:await(r.detectFrameworkIntegrationImport??detectFrameworkIntegrationImport)(t,i.importSpecifier)?`keep`:r.headless?`switch-to-eve`:confirmDetectedFramework(e,n,i)}function frameworkPresetLabel(e){return EVE_FRAMEWORK_INTEGRATIONS[e]?.label??e}function describeError(e){return e instanceof Error?e.message:String(e)}async function syncHostFrameworkPreset(e,t,r,i){let a=await resolveVercelHostFrameworkPreset(t);if(a===void 0)return;let o=await readProjectLink(t);if(o===void 0)return;let s=frameworkPresetLabel(a),l;try{l=await fetchProjectFramework(t,o.orgId,o.projectId,i)}catch(t){if(i.signal?.aborted)throw t;e.log.warning(`Could not check this Vercel project's Framework Preset (${describeError(t)}). If it is not already ${s}, set it under Project Settings → Build and Deployment → Framework Settings before deploying.`);return}if(l===a)return;let u=l===void 0?void 0:frameworkPresetLabel(l),d=u===void 0?`had no Framework Preset set`:`was set to "${u}"`;try{await setProjectFramework(t,o.orgId,o.projectId,a,r,i)}catch(t){if(i.signal?.aborted)throw t;e.log.warning(`${describeError(t)} Set this Vercel project's Framework Preset to ${s} (Project Settings → Build and Deployment → Framework Settings) before deploying, or the deployment will not build your ${s} app.`);return}e.log.info(`This project uses ${s}, but its Vercel Framework Preset ${d}; switched it to ${s} so the deployment builds your app.`)}async function ensureCreatedProjectFramework(e,t,n,r,i,a){let o=await fetchProjectFramework(t,n,r,a);o!==`eve`&&(o===void 0?`switch-to-eve`:await resolveDetectedFrameworkAction(e,t,o,a))===`switch-to-eve`&&await setProjectFramework(t,n,r,`eve`,i,a)}export{ensureCreatedProjectFramework,syncHostFrameworkPreset};
1
+ import{object,string}from"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/schemas.js";import"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/index.js";import{readProjectLink}from"./project-resolution.js";import{resolveVercelHostFrameworkPreset}from"./scaffold/update/channels.js";import"./scaffold/index.js";import{isForbiddenApiFailure,normalizeVercelApiResult}from"./vercel-api-failure.js";import{VERCEL_PROJECT_REQUEST_TIMEOUT_MS,parseVercelJson,requireVercelTeamAccess}from"./vercel-project-api.js";import{extname,join}from"node:path";import*as fs from"node:fs/promises";import{captureVercel}from"#setup/primitives/index.js";import"#setup/cli/index.js";const VercelProjectFrameworkSchema=object({framework:string().min(1).nullish()}),EVE_FRAMEWORK_INTEGRATIONS={nextjs:{label:`Next.js`,importSpecifier:`eve/next`},nuxt:{label:`Nuxt`,importSpecifier:`eve/nuxt`},nuxtjs:{label:`Nuxt`,importSpecifier:`eve/nuxt`},sveltekit:{label:`SvelteKit`,importSpecifier:`eve/sveltekit`}},FRAMEWORK_INTEGRATION_SOURCE_EXTENSIONS=new Set([`.cjs`,`.cts`,`.js`,`.json`,`.jsx`,`.mjs`,`.mts`,`.svelte`,`.ts`,`.tsx`,`.vue`]),FRAMEWORK_INTEGRATION_IGNORED_DIRECTORIES=new Set([`.eve`,`.git`,`.next`,`.nuxt`,`.output`,`.svelte-kit`,`.turbo`,`.vercel`,`build`,`coverage`,`dist`,`node_modules`]);function parseProjectFramework(e,t){let n=VercelProjectFrameworkSchema.safeParse(parseVercelJson(e,t));if(!n.success)throw Error(`Could not read Vercel project framework from ${t}.`);return n.data.framework??void 0}async function fetchProjectFramework(e,t,n,r){let s=normalizeVercelApiResult(await captureVercel([`api`,`/v9/projects/${n}`,`--scope`,t,`--raw`],{cwd:e,signal:r.signal,timeoutMs:VERCEL_PROJECT_REQUEST_TIMEOUT_MS}));if(s.ok)return parseProjectFramework(s.stdout,`project ${n}`);throw isForbiddenApiFailure(s.failure)&&requireVercelTeamAccess(s.failure),Error(`Could not inspect Vercel project "${n}". ${s.failure.message}`)}async function setProjectFramework(e,t,n,r,s,l){let u=normalizeVercelApiResult(await captureVercel([`api`,`/v9/projects/${n}`,`--scope`,t,`--method`,`PATCH`,`--raw-field`,`framework=${r}`,`--raw`],{cwd:e,onOutput:s,signal:l.signal,timeoutMs:VERCEL_PROJECT_REQUEST_TIMEOUT_MS}));if(!u.ok)throw isForbiddenApiFailure(u.failure)&&requireVercelTeamAccess(u.failure),Error(`Could not set Vercel project "${n}" framework to ${r}. ${u.failure.message}`)}async function confirmDetectedFramework(e,t,n){return await e.select({message:`Vercel detected ${n.label}. Is this project using ${n.importSpecifier}?`,options:[{value:!0,label:`Yes, keep ${t}`,hint:`Use this for a host app that integrates eve through ${n.importSpecifier}.`},{value:!1,label:`No, switch to eve`,hint:`Use this for a standalone eve agent.`}]})?`keep`:`switch-to-eve`}function sourceMentionsPackageSpecifier(e,t){return e.includes(`"${t}"`)||e.includes(`'${t}'`)||e.includes(`\`${t}\``)}async function directoryContainsPackageSpecifier(e,t){let n;try{n=await fs.readdir(e,{encoding:`utf8`,withFileTypes:!0})}catch{return!1}for(let r of n){let n=join(e,r.name);if(r.isDirectory()){if(FRAMEWORK_INTEGRATION_IGNORED_DIRECTORIES.has(r.name))continue;if(await directoryContainsPackageSpecifier(n,t))return!0;continue}if(!(!r.isFile()||!FRAMEWORK_INTEGRATION_SOURCE_EXTENSIONS.has(extname(r.name))))try{if(sourceMentionsPackageSpecifier(await fs.readFile(n,`utf8`),t))return!0}catch{continue}}return!1}async function detectFrameworkIntegrationImport(e,t){return directoryContainsPackageSpecifier(e,t)}async function resolveDetectedFrameworkAction(e,t,n,r){let i=EVE_FRAMEWORK_INTEGRATIONS[n];return i===void 0?`switch-to-eve`:await(r.detectFrameworkIntegrationImport??detectFrameworkIntegrationImport)(t,i.importSpecifier)?`keep`:r.headless?`switch-to-eve`:confirmDetectedFramework(e,n,i)}function frameworkPresetLabel(e){return EVE_FRAMEWORK_INTEGRATIONS[e]?.label??e}function describeError(e){return e instanceof Error?e.message:String(e)}async function syncHostFrameworkPreset(e,t,i,a){let o=await resolveVercelHostFrameworkPreset(t);if(o===void 0)return;let s=await readProjectLink(t);if(s===void 0)return;let c=frameworkPresetLabel(o),l;try{l=await fetchProjectFramework(t,s.orgId,s.projectId,a)}catch(t){if(a.signal?.aborted)throw t;e.log.warning(`Could not check this Vercel project's Framework Preset (${describeError(t)}). If it is not already ${c}, set it under Project Settings → Build and Deployment → Framework Settings before deploying.`);return}if(l===o)return;let u=l===void 0?void 0:frameworkPresetLabel(l),d=u===void 0?`had no Framework Preset set`:`was set to "${u}"`;try{await setProjectFramework(t,s.orgId,s.projectId,o,i,a)}catch(t){if(a.signal?.aborted)throw t;e.log.warning(`${describeError(t)} Set this Vercel project's Framework Preset to ${c} (Project Settings → Build and Deployment → Framework Settings) before deploying, or the deployment will not build your ${c} app.`);return}e.log.info(`This project uses ${c}, but its Vercel Framework Preset ${d}; switched it to ${c} so the deployment builds your app.`)}async function ensureCreatedProjectFramework(e,t,n,r,i,a){let o=await fetchProjectFramework(t,n,r,a);o!==`eve`&&(o===void 0?`switch-to-eve`:await resolveDetectedFrameworkAction(e,t,o,a))===`switch-to-eve`&&await setProjectFramework(t,n,r,`eve`,i,a)}export{ensureCreatedProjectFramework,syncHostFrameworkPreset};
@@ -1,6 +1,6 @@
1
1
  import { createPromptCommandOutput } from "#setup/cli/index.js";
2
- import { type VercelCaptureFailure } from "#setup/primitives/index.js";
3
- import { type ProjectResolution } from "./project-resolution.js";
2
+ import { runVercel, type VercelCaptureFailure } from "#setup/primitives/index.js";
3
+ import { readProjectLink, type ProjectResolution } from "./project-resolution.js";
4
4
  import type { Prompter } from "./prompter.js";
5
5
  import type { ResolvedVercelProjectSpec, VercelProjectIdentity } from "./state.js";
6
6
  import { type VercelProjectOperationOptions } from "./vercel-project-api.js";
@@ -21,6 +21,21 @@ export interface PickTeamOptions extends VercelProjectOperationOptions {
21
21
  }
22
22
  export interface LinkProjectOperationOptions extends CreatedProjectFrameworkOptions {
23
23
  }
24
+ /** Effects used to ensure an interactive Vercel project link. */
25
+ export interface EnsureLinkedVercelProjectDeps {
26
+ readProjectLink: typeof readProjectLink;
27
+ runVercel: typeof runVercel;
28
+ }
29
+ /**
30
+ * Returns the existing Vercel project link or creates one through the Vercel
31
+ * CLI's interactive flow. The CLI owns team and project selection.
32
+ */
33
+ export declare function ensureLinkedVercelProject(input: {
34
+ projectRoot: string;
35
+ prompter: Prompter;
36
+ signal?: AbortSignal;
37
+ deps?: EnsureLinkedVercelProjectDeps;
38
+ }): Promise<NonNullable<Awaited<ReturnType<typeof readProjectLink>>>>;
24
39
  export declare function unresolvedProject(): ProjectResolution;
25
40
  /** Resolves the linked project id from a resolution, if any. */
26
41
  export declare function projectIdFromResolution(project: ProjectResolution): string | undefined;
Binary file
@@ -119,6 +119,18 @@ export interface PublicAgentCompactionDefinition {
119
119
  * Configures framework-owned runtime limits for this agent's runs.
120
120
  */
121
121
  export interface AgentLimitsDefinition {
122
+ /**
123
+ * Maximum lifetime of one durable session, in milliseconds.
124
+ *
125
+ * The deadline starts when the session is created and survives process
126
+ * restarts and redeployments. If it elapses during an active turn, eve lets
127
+ * that turn settle before completing the session normally.
128
+ *
129
+ * `false` disables the timeout.
130
+ *
131
+ * @default 2_592_000_000 (30 days)
132
+ */
133
+ readonly sessionTimeoutMs?: number | false;
122
134
  /**
123
135
  * Maximum provider-reported input tokens accumulated by one durable session.
124
136
  *
@@ -3,13 +3,13 @@ import type { PublicToolInputSchema, PublicToolOutputSchema, ToolModelOutput } f
3
3
  import type { Approval } from "#public/definitions/approval.js";
4
4
  import type { ToolContext } from "#public/definitions/tool.js";
5
5
  import type { SessionAuth } from "#context/keys.js";
6
- import type { HandleMessageStreamEvent } from "#protocol/message.js";
6
+ import type { UnstampedMessageStreamEvent } from "#protocol/message.js";
7
7
  /**
8
8
  * Stream event types allowed for dynamic tool resolvers. Dispatch
9
9
  * supports any event; this extract restricts the public surface until
10
10
  * more events are validated.
11
11
  */
12
- export type DynamicToolEventName = Extract<HandleMessageStreamEvent["type"], "session.started" | "turn.started" | "step.started">;
12
+ export type DynamicToolEventName = Extract<UnstampedMessageStreamEvent["type"], "session.started" | "turn.started" | "step.started">;
13
13
  export declare const ALLOWED_DYNAMIC_TOOL_EVENTS: ReadonlySet<string>;
14
14
  /**
15
15
  * Instructions and skills are restricted to session/turn boundaries.
@@ -0,0 +1,39 @@
1
+ /**
2
+ * ULID-compatible generation, vendored rather than taken from npm: the
3
+ * `ulid` package's Node build hard-imports `node:crypto`, and this module is
4
+ * bundled into browser clients, the Nitro server, and the workflow step
5
+ * sandbox. `ulid.test.ts` pins the encoding against the reference
6
+ * implementation's golden vectors.
7
+ */
8
+ /** Character count of a ULID: a 10-char timestamp then a 16-char random tail. */
9
+ export declare const ULID_LENGTH: number;
10
+ /** Mints one ULID. See {@link createUlidFactory}. */
11
+ export type UlidFactory = () => string;
12
+ /**
13
+ * Creates an independent ULID generator with its own monotonic state.
14
+ *
15
+ * Prefer {@link createUlid} unless a caller needs a sequence that unrelated
16
+ * code cannot perturb. Ids sort in the order one generator produced them:
17
+ * those minted within a millisecond increment the random tail, and a
18
+ * backwards clock pins to the last millisecond observed.
19
+ */
20
+ export declare function createUlidFactory(): UlidFactory;
21
+ /**
22
+ * Mints a ULID from the process-wide generator: a 48-bit millisecond
23
+ * timestamp then 80 bits of randomness, in Crockford base32.
24
+ *
25
+ * Ids lead with their timestamp, so they are broadly time-ordered. Ordering
26
+ * holds within one process only — separate processes have independent clocks
27
+ * and random tails — so a ULID is not a lossless pagination cursor.
28
+ *
29
+ * Throws when the clock is outside the 48-bit timestamp range or Web Crypto
30
+ * is unavailable rather than weakening the randomness.
31
+ */
32
+ export declare const createUlid: UlidFactory;
33
+ /**
34
+ * Returns true when `value` is shaped like a ULID: {@link ULID_LENGTH}
35
+ * characters drawn from the Crockford base32 alphabet.
36
+ *
37
+ * Shape-only — this does not prove the value was minted here.
38
+ */
39
+ export declare function isUlid(value: string): boolean;
@@ -0,0 +1 @@
1
+ const ENCODING=`0123456789ABCDEFGHJKMNPQRSTVWXYZ`,TIME_MAX=2**48-1,ULID_LENGTH=26;function createUlidFactory(){let e=-1,n=new Uint8Array(10);return function(){let r=Date.now();if(!Number.isInteger(r)||r<0||r>TIME_MAX)throw Error(`Cannot mint a ULID: timestamp must be an integer from 0 to ${TIME_MAX}.`);if(r>e)e=r,randomFill(n);else if(!incrementRandom(n)){if(e===TIME_MAX)throw Error(`Cannot mint a ULID: random component overflowed at the maximum timestamp.`);e+=1,randomFill(n)}return`${encodeTime(e)}${encodeRandom(n)}`}}const createUlid=createUlidFactory();function isUlid(t){if(t.length!==26||ENCODING.indexOf(t[0]??``)>7)return!1;for(let n of t)if(!ENCODING.includes(n))return!1;return!0}function randomFill(e){let t=globalThis.crypto;if(typeof t?.getRandomValues!=`function`)throw Error(`Cannot mint a ULID: globalThis.crypto.getRandomValues is unavailable.`);t.getRandomValues(e)}function encodeTime(t){let n=t,r=``;for(let t=0;t<10;t+=1)r=ENCODING[n%32]+r,n=Math.floor(n/32);return r}function encodeRandom(t){let n=0,r=0,i=``;for(let a of t){for(n=n<<8|a,r+=8;r>=5;)r-=5,i+=ENCODING[n>>>r&31];n&=(1<<r)-1}return i}function incrementRandom(e){for(let t=e.length-1;t>=0;--t){let n=e[t]??0;if(n<255)return e[t]=n+1,e.fill(0,t+1),!0}return!1}export{ULID_LENGTH,createUlid,createUlidFactory,isUlid};
@@ -1,3 +1,3 @@
1
- import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-CsSQOKnp.js";
1
+ import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-DaH3cf8K.js";
2
2
 
3
3
  export { defaultMessageReducer, useEveAgent };
@@ -3,7 +3,7 @@ import { type EveMessageData } from "#client/message-reducer.js";
3
3
  import type { EveAgentReducer } from "#client/reducer.js";
4
4
  import type { ClientSession } from "#client/session.js";
5
5
  import type { ClientAuth, HeadersValue, SendTurnPayload, SessionState } from "#client/types.js";
6
- import type { HandleMessageStreamEvent } from "#protocol/message.js";
6
+ import type { MessageStreamEvent } from "#protocol/message.js";
7
7
  export type { PrepareSend };
8
8
  /**
9
9
  * Session lifecycle phase: `"ready"` (idle), `"submitted"` (request sent,
@@ -30,7 +30,7 @@ export interface UseEveAgentReturn<TData> {
30
30
  /** Last transport-level error, or `undefined` when healthy. */
31
31
  readonly error: Error | undefined;
32
32
  /** Raw server events received during this session (authoritative stream). */
33
- readonly events: readonly HandleMessageStreamEvent[];
33
+ readonly events: readonly MessageStreamEvent[];
34
34
  /** Clear all state and start a new session. */
35
35
  readonly reset: () => void;
36
36
  /** Send a turn with full structured input (message, attachments, input responses). */
@@ -76,8 +76,8 @@ export interface UseEveAgentOptions<TData> extends EveAgentStoreCallbacks<TData>
76
76
  * @default ""
77
77
  */
78
78
  readonly host?: string;
79
- /** Seed events for resuming a prior conversation. */
80
- readonly initialEvents?: readonly HandleMessageStreamEvent[];
79
+ /** Ordered prefix of the session stream used to rehydrate projected state. */
80
+ readonly initialEvents?: readonly MessageStreamEvent[];
81
81
  /** Seed session identity and stream cursor for resuming a prior conversation. */
82
82
  readonly initialSession?: SessionState;
83
83
  /**
@@ -1,3 +1,3 @@
1
- import { t as useEveAgent } from "../chunks/use-eve-agent-CsSQOKnp.js";
1
+ import { t as useEveAgent } from "../chunks/use-eve-agent-DaH3cf8K.js";
2
2
 
3
3
  export { useEveAgent };
@@ -1,3 +1,3 @@
1
- import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-CWYe-vqE.js";
1
+ import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-CyDt3Lny.js";
2
2
 
3
3
  export { defaultMessageReducer, useEveAgent };
@@ -3,7 +3,7 @@ import { type EveAgentStoreCallbacks, type EveAgentStoreSnapshot, type EveAgentS
3
3
  import type { EveAgentReducer } from "#client/reducer.js";
4
4
  import type { ClientSession } from "#client/session.js";
5
5
  import { type EveMessageData } from "#client/message-reducer.js";
6
- import type { HandleMessageStreamEvent } from "#protocol/message.js";
6
+ import type { MessageStreamEvent } from "#protocol/message.js";
7
7
  import type { ClientAuth, HeadersValue, SendTurnPayload, SessionState } from "#client/types.js";
8
8
  export type { PrepareSend };
9
9
  /**
@@ -29,7 +29,7 @@ export interface UseEveAgentReturn<TData> {
29
29
  /** Last transport-level error, or `undefined` when healthy. */
30
30
  readonly error: ComputedRef<Error | undefined>;
31
31
  /** Raw server events from this session (authoritative stream). */
32
- readonly events: ComputedRef<readonly HandleMessageStreamEvent[]>;
32
+ readonly events: ComputedRef<readonly MessageStreamEvent[]>;
33
33
  /** Clear all state and start a new session. */
34
34
  readonly reset: () => void;
35
35
  /** Send a turn with full structured input (message, attachments, input responses). */
@@ -75,8 +75,8 @@ export interface UseEveAgentOptions<TData> extends EveAgentStoreCallbacks<TData>
75
75
  * @default ""
76
76
  */
77
77
  readonly host?: string;
78
- /** Prior stream events to rehydrate the projected state from on mount. */
79
- readonly initialEvents?: readonly HandleMessageStreamEvent[];
78
+ /** Ordered prefix of the session stream used to rehydrate projected state. */
79
+ readonly initialEvents?: readonly MessageStreamEvent[];
80
80
  /** Prior session cursor to resume from on mount. */
81
81
  readonly initialSession?: SessionState;
82
82
  /**
@@ -1,3 +1,3 @@
1
- import { t as useEveAgent } from "../chunks/use-eve-agent-CWYe-vqE.js";
1
+ import { t as useEveAgent } from "../chunks/use-eve-agent-CyDt3Lny.js";
2
2
 
3
3
  export { useEveAgent };
@@ -131,10 +131,18 @@ export default defineAgent({
131
131
  limits: {
132
132
  maxInputTokensPerSession: 200_000,
133
133
  maxOutputTokensPerSession: 20_000,
134
+ sessionTimeoutMs: 7 * 24 * 60 * 60 * 1_000,
134
135
  },
135
136
  });
136
137
  ```
137
138
 
139
+ `sessionTimeoutMs` sets an absolute lifetime for every session, including
140
+ delegated sessions. It defaults to 30 days, starts at creation, and survives
141
+ restarts and redeployments. At the deadline, eve lets an active turn settle,
142
+ then emits `session.completed` and releases the continuation; the next
143
+ qualifying channel message starts fresh. Set it to `false` to disable the
144
+ timeout. Expiration does not delete stored session data.
145
+
138
146
  Input and output budgets are checked independently. The model call that crosses
139
147
  either limit is allowed to finish because providers only report exact token
140
148
  usage after a call completes. Before the next model call, eve pauses the
@@ -147,12 +155,14 @@ still over budget, the next message re-raises the prompt. Declining a
147
155
  delegated child's prompt cancels the root turn, which cascades to the whole
148
156
  delegation tree — the delegating parent never receives an error result it
149
157
  could retry against a fresh quota share. A reply that answers neither option
150
- re-raises the prompt; the reply stays in history and is processed once the
151
- budget is granted.
158
+ is queued while the existing prompt stays pending; eve does not raise another
159
+ copy. The reply is processed once the budget is granted.
152
160
 
153
161
  Sessions that cannot reach a human — task-mode runs such as schedules and
154
162
  subagents without input proxying — skip the prompt and fail the next model
155
- call with `SESSION_TOKEN_LIMIT_REACHED`.
163
+ call with `SESSION_TOKEN_LIMIT_REACHED`. A delegated task with no inherited
164
+ quota also fails instead of raising a continuation prompt that could only
165
+ grant another zero-token window.
156
166
 
157
167
  When `maxInputTokensPerSession` is omitted, root sessions apply a default
158
168
  input budget of `40_000_000` provider-reported input tokens.
@@ -161,11 +171,13 @@ to `false` uncaps that axis — the session never stops on it.
161
171
 
162
172
  Delegated subagent sessions have no fixed default. Each child receives a
163
173
  share of the delegating parent's remaining quota at dispatch time — the
164
- remainder (limit minus accumulated usage) split evenly across the batch's
165
- local subagent calls — and a completed child's usage counts against the
166
- parent's quota, so a delegation tree can never outspend the budget configured
167
- at its root. An authored child limit applies only when it is tighter than the
168
- parent's grant; an uncapped parent delegates uncapped children.
174
+ remainder in the current budget window split evenly across the batch's local
175
+ subagent calls — and a completed child's usage counts against the parent's
176
+ quota, so a delegation tree can never outspend the budget configured at its
177
+ root. Approving a continuation opens a fresh parent window for later child
178
+ grants without erasing lifetime usage. An authored child limit applies only
179
+ when it is tighter than the parent's grant; an uncapped parent delegates
180
+ uncapped children.
169
181
 
170
182
  ## Workflow world
171
183
 
@@ -208,14 +220,14 @@ installed package must stay external in hosted output, list it in
208
220
 
209
221
  `defineAgent` takes a few more fields, all optional. For the exported types, see the [TypeScript API](./reference/typescript-api).
210
222
 
211
- | Field | Type | Default | Description |
212
- | -------------- | --------------------------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
213
- | `reasoning` | `AgentReasoningDefinition` | provider default | Provider-agnostic reasoning effort forwarded to the agent's turn model calls. |
214
- | `modelOptions` | `AgentModelOptionsDefinition` | none | Provider option overrides forwarded to the model call. |
215
- | `limits` | `AgentLimitsDefinition` | field-specific | Framework-owned runtime limits. `maxInputTokensPerSession` defaults to `40_000_000` for root sessions, and delegated subagent sessions inherit the parent's remaining quota; `maxOutputTokensPerSession` is unset unless configured; `false` uncaps a session token limit. |
216
- | `experimental` | `{ workflow?: { world?: string } }` | unset | Opt-in settings that can change or disappear in any release. Treat them as unstable. `workflow.world` selects the Workflow world package backing session state, queues, hooks, and streams on the root agent. |
217
- | `outputSchema` | Standard Schema or a JSON Schema object | none | Structured return type for task-mode runs (a subagent, schedule, or remote job). Interactive conversation turns ignore it unless the client supplies a per-message schema. |
218
- | `build` | `{ externalDependencies?: string[] }` | none | Hosted-build packaging controls. `externalDependencies` keeps listed packages external while eve compiles authored modules such as tools and channels, and traces those packages into the hosted output. |
223
+ | Field | Type | Default | Description |
224
+ | -------------- | --------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
225
+ | `reasoning` | `AgentReasoningDefinition` | provider default | Provider-agnostic reasoning effort forwarded to the agent's turn model calls. |
226
+ | `modelOptions` | `AgentModelOptionsDefinition` | none | Provider option overrides forwarded to the model call. |
227
+ | `limits` | `AgentLimitsDefinition` | field-specific | Framework-owned runtime limits. Sessions complete after 30 days by default; token-limit defaults and inheritance are described above. Set a limit to `false` to disable it. |
228
+ | `experimental` | `{ workflow?: { world?: string } }` | unset | Opt-in settings that can change or disappear in any release. Treat them as unstable. `workflow.world` selects the Workflow world package backing session state, queues, hooks, and streams on the root agent. |
229
+ | `outputSchema` | Standard Schema or a JSON Schema object | none | Structured return type for task-mode runs (a subagent, schedule, or remote job). Interactive conversation turns ignore it unless the client supplies a per-message schema. |
230
+ | `build` | `{ externalDependencies?: string[] }` | none | Hosted-build packaging controls. `externalDependencies` keeps listed packages external while eve compiles authored modules such as tools and channels, and traces those packages into the hosted output. |
219
231
 
220
232
  `externalDependencies` is a packaging control only. It keeps selected packages as runtime dependencies in the hosted output; it does not authorize, configure, or review any third-party service those packages may call.
221
233
 
@@ -28,7 +28,7 @@ agent/
28
28
  intake.ts
29
29
  ```
30
30
 
31
- Scaffold a channel file with `eve channels add` (interactive), or pass a kind: `eve channels add slack` or `eve channels add web`. You can also author the file by hand.
31
+ Install a built-in channel with `eve add channel/slack` or `eve add channel/web`. You can also author the file by hand.
32
32
 
33
33
  ## The eve HTTP channel (default)
34
34
 
@@ -21,7 +21,7 @@ The `create` step provisions a destination at the default Connect path. `detach`
21
21
 
22
22
  ## Add the channel
23
23
 
24
- Scaffold the channel and its dependency with `eve channels add slack`, or set it up by hand:
24
+ Scaffold the channel and its dependency with `eve add channel/slack`, or set it up by hand:
25
25
 
26
26
  ```bash
27
27
  npm install @vercel/connect
@@ -38,7 +38,7 @@ export default slackChannel({
38
38
 
39
39
  `connectSlackCredentials` returns `{ botToken, webhookVerifier }`, keeping token rotation, multi-workspace tenancy, and request verification inside Connect rather than your code.
40
40
 
41
- If eve cannot find an authenticated Vercel session, `eve channels add slack` asks whether to set up Vercel Connect or use portable environment credentials. The portable option adds the required names to `.env.example`. Before deploying, appropriate values must be supplied to your runtime environment.
41
+ If eve cannot find an authenticated Vercel session, `eve add channel/slack` asks whether to set up Vercel Connect or use portable environment credentials. The portable option adds the required names to `.env.example`. Before deploying, appropriate values must be supplied to your runtime environment.
42
42
 
43
43
  ### Deploy
44
44
 
@@ -103,6 +103,18 @@ export default experimental_workflow({ maxSubagents: 100 });
103
103
 
104
104
  With it on, the model can orchestrate the agent's own subagents from model-authored JavaScript, all as one durable step. The tool is root-only — delegated subagent sessions never see it — and one program may dispatch at most the configured `maxSubagents` calls (default 100). See [Dynamic workflows](../guides/dynamic-workflows).
105
105
 
106
+ ## The opt-in `sleep` tool
107
+
108
+ The framework also ships a durable `sleep` tool, but does not add it to agents by default. Enable it with `agent/tools/sleep.ts`:
109
+
110
+ ```ts
111
+ import { sleep } from "eve/tools/sleep";
112
+
113
+ export default sleep();
114
+ ```
115
+
116
+ The model calls it with `{ seconds }` when it is useful to wait before checking progress or status again. The pause sleeps the durable turn workflow, so it does not hold an application runtime open, and the same turn continues automatically when the duration elapses. If one model response makes concurrent `sleep` calls, eve waits for the longest requested duration.
117
+
106
118
  ## What to read next
107
119
 
108
120
  - [Tools](../tools): define your own tools, gate them on approval, and shape their output with `toModelOutput`
@@ -56,7 +56,7 @@ Provider keys, tool secrets, and MCP, OpenAPI, and connection credentials stay i
56
56
 
57
57
  ## Resuming after a crash
58
58
 
59
- Crash the process, hit a timeout, or redeploy mid-turn, and the run picks up from the last completed step rather than replaying the whole turn. Completed steps never re-run; eve replays the recorded result. A step interrupted mid-execution re-runs, so make non-idempotent side effects like charges or emails idempotent, or gate them with approval.
59
+ Crash the process, hit a timeout, or redeploy mid-turn, and the run picks up from the last completed step rather than replaying the whole turn. Completed steps never re-run; eve replays the recorded result. A step interrupted mid-execution re-runs, so make non-idempotent side effects like charges or emails idempotent, or gate them with approval. Whatever that step already wrote to the session stream stays there, and the re-run emits its events again under new ids, so a stream consumer sees both attempts — see [the event envelope](./sessions-runs-and-streaming#the-event-envelope).
60
60
 
61
61
  There's nothing to configure. eve owns the workflow lifecycle, and sessions are durable by default.
62
62