eve 0.47.7 → 0.49.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 (429) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/src/channel/channel-address.js +1 -1
  3. package/dist/src/channel/delivery-metadata.d.ts +1 -0
  4. package/dist/src/channel/delivery-metadata.js +1 -1
  5. package/dist/src/channel/types.d.ts +20 -8
  6. package/dist/src/chunks/{use-eve-agent-Dg5S44kG.js → use-eve-agent-BZnOzAVd.js} +25 -5
  7. package/dist/src/chunks/{use-eve-agent-B5zw1dwj.js → use-eve-agent-Bgp6INfi.js} +25 -5
  8. package/dist/src/cli/commands/init.js +1 -1
  9. package/dist/src/cli/commands/integration-connect.d.ts +2 -1
  10. package/dist/src/cli/commands/integration-connect.js +1 -1
  11. package/dist/src/cli/commands/register-integration-commands.d.ts +3 -1
  12. package/dist/src/cli/commands/register-integration-commands.js +1 -1
  13. package/dist/src/cli/commands/registry-metadata.d.ts +30 -0
  14. package/dist/src/cli/commands/registry-metadata.js +1 -1
  15. package/dist/src/cli/commands/registry-package.d.ts +6 -0
  16. package/dist/src/cli/commands/registry-package.js +1 -1
  17. package/dist/src/cli/commands/registry-pnpm-build-policy-flow.d.ts +30 -0
  18. package/dist/src/cli/commands/registry-pnpm-build-policy-flow.js +1 -0
  19. package/dist/src/cli/commands/registry-pnpm-build-policy.d.ts +12 -0
  20. package/dist/src/cli/commands/registry-pnpm-build-policy.js +6 -0
  21. package/dist/src/cli/commands/registry-recovery.d.ts +4 -0
  22. package/dist/src/cli/commands/registry-recovery.js +1 -1
  23. package/dist/src/cli/commands/registry.d.ts +1 -1
  24. package/dist/src/cli/commands/registry.js +1 -1
  25. package/dist/src/cli/dev/command-options.d.ts +2 -0
  26. package/dist/src/cli/dev/run-interactive-ui.js +1 -1
  27. package/dist/src/cli/dev/tui/blocks.js +1 -1
  28. package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
  29. package/dist/src/cli/dev/tui/registry-result-message.d.ts +17 -0
  30. package/dist/src/cli/dev/tui/registry-result-message.js +3 -0
  31. package/dist/src/cli/dev/tui/runner.d.ts +11 -4
  32. package/dist/src/cli/dev/tui/runner.js +1 -1
  33. package/dist/src/cli/dev/tui/setup-commands.d.ts +9 -3
  34. package/dist/src/cli/dev/tui/setup-commands.js +2 -3
  35. package/dist/src/cli/dev/tui/setup-flow.d.ts +15 -5
  36. package/dist/src/cli/dev/tui/setup-panel.d.ts +6 -1
  37. package/dist/src/cli/dev/tui/setup-panel.js +4 -4
  38. package/dist/src/cli/dev/tui/setup-selection-input.d.ts +1 -0
  39. package/dist/src/cli/dev/tui/setup-selection-input.js +1 -1
  40. package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
  41. package/dist/src/cli/dev/tui/tui-prompter.js +1 -1
  42. package/dist/src/cli/dev/tui/tui.d.ts +3 -4
  43. package/dist/src/cli/dev/tui/tui.js +1 -1
  44. package/dist/src/cli/run.js +2 -2
  45. package/dist/src/client/agent-info-schema.d.ts +1 -0
  46. package/dist/src/client/agent-info-schema.js +1 -1
  47. package/dist/src/client/open-stream.d.ts +1 -0
  48. package/dist/src/client/open-stream.js +1 -1
  49. package/dist/src/client/session.js +1 -1
  50. package/dist/src/compiled/.vendor-stamp.json +7 -6
  51. package/dist/src/compiled/@opentelemetry/api/index.d.ts +6 -0
  52. package/dist/src/compiled/@workflow/builders/LICENSE.md +201 -0
  53. package/dist/src/compiled/@workflow/builders/index.d.ts +62 -0
  54. package/dist/src/compiled/@workflow/builders/index.js +1 -0
  55. package/dist/src/compiled/@workflow/core/attribute-changes.d.ts +2 -4
  56. package/dist/src/compiled/@workflow/core/capabilities.d.ts +10 -9
  57. package/dist/src/compiled/@workflow/core/capture-stack.d.ts +1 -1
  58. package/dist/src/compiled/@workflow/core/class-serialization.d.ts +8 -8
  59. package/dist/src/compiled/@workflow/core/context-violation-error.d.ts +5 -5
  60. package/dist/src/compiled/@workflow/core/create-hook.d.ts +2 -2
  61. package/dist/src/compiled/@workflow/core/describe-error.d.ts +7 -7
  62. package/dist/src/compiled/@workflow/core/encryption.d.ts +5 -5
  63. package/dist/src/compiled/@workflow/core/events-consumer.d.ts +49 -14
  64. package/dist/src/compiled/@workflow/core/flushable-stream.d.ts +4 -4
  65. package/dist/src/compiled/@workflow/core/global.d.ts +4 -2
  66. package/dist/src/compiled/@workflow/core/index.d.ts +1 -1
  67. package/dist/src/compiled/@workflow/core/index.js +2 -2
  68. package/dist/src/compiled/@workflow/core/log-format.d.ts +2 -2
  69. package/dist/src/compiled/@workflow/core/private.d.ts +40 -78
  70. package/dist/src/compiled/@workflow/core/private.js +1 -1
  71. package/dist/src/compiled/@workflow/core/replay-payload-cache.d.ts +13 -17
  72. package/dist/src/compiled/@workflow/core/runtime/compute-instance.d.ts +4 -3
  73. package/dist/src/compiled/@workflow/core/runtime/constants.d.ts +27 -27
  74. package/dist/src/compiled/@workflow/core/runtime/count-step-started-events.d.ts +7 -7
  75. package/dist/src/compiled/@workflow/core/runtime/deployment-guard.d.ts +7 -7
  76. package/dist/src/compiled/@workflow/core/runtime/get-port-lazy.d.ts +2 -2
  77. package/dist/src/compiled/@workflow/core/runtime/get-world-lazy.d.ts +2 -2
  78. package/dist/src/compiled/@workflow/core/runtime/helpers.d.ts +30 -49
  79. package/dist/src/compiled/@workflow/core/runtime/quickjs-entrypoint.d.ts +21 -10
  80. package/dist/src/compiled/@workflow/core/runtime/quickjs-runtime.d.ts +31 -15
  81. package/dist/src/compiled/@workflow/core/runtime/quickjs-serde.d.ts +10 -10
  82. package/dist/src/compiled/@workflow/core/runtime/replay-budget.d.ts +4 -4
  83. package/dist/src/compiled/@workflow/core/runtime/replay-recovery-reporter.d.ts +1 -1
  84. package/dist/src/compiled/@workflow/core/runtime/resume-hook.d.ts +20 -12
  85. package/dist/src/compiled/@workflow/core/runtime/resume-latency.d.ts +37 -30
  86. package/dist/src/compiled/@workflow/core/runtime/run-id-time.d.ts +2 -2
  87. package/dist/src/compiled/@workflow/core/runtime/run.d.ts +22 -5
  88. package/dist/src/compiled/@workflow/core/runtime/runs.d.ts +4 -4
  89. package/dist/src/compiled/@workflow/core/runtime/start.d.ts +3 -3
  90. package/dist/src/compiled/@workflow/core/runtime/step-executor.d.ts +14 -14
  91. package/dist/src/compiled/@workflow/core/runtime/step-latency.d.ts +42 -25
  92. package/dist/src/compiled/@workflow/core/runtime/step-ownership.d.ts +6 -6
  93. package/dist/src/compiled/@workflow/core/runtime/step-single-flight.d.ts +1 -1
  94. package/dist/src/compiled/@workflow/core/runtime/suspension-handler.d.ts +38 -24
  95. package/dist/src/compiled/@workflow/core/runtime/unserializable-step.d.ts +34 -0
  96. package/dist/src/compiled/@workflow/core/runtime/vm-mode.d.ts +2 -2
  97. package/dist/src/compiled/@workflow/core/runtime/wait-continuation.d.ts +31 -9
  98. package/dist/src/compiled/@workflow/core/runtime/wait-until.d.ts +1 -1
  99. package/dist/src/compiled/@workflow/core/runtime/world-compatibility.d.ts +20 -9
  100. package/dist/src/compiled/@workflow/core/runtime/world-init.d.ts +5 -5
  101. package/dist/src/compiled/@workflow/core/runtime.js +3 -3
  102. package/dist/src/compiled/@workflow/core/sealed-box.d.ts +7 -7
  103. package/dist/src/compiled/@workflow/core/serialization/codec-devalue-vm.d.ts +1 -1
  104. package/dist/src/compiled/@workflow/core/serialization/codec-devalue.d.ts +1 -1
  105. package/dist/src/compiled/@workflow/core/serialization/codec.d.ts +4 -4
  106. package/dist/src/compiled/@workflow/core/serialization/compression.d.ts +12 -11
  107. package/dist/src/compiled/@workflow/core/serialization/encryption.d.ts +7 -7
  108. package/dist/src/compiled/@workflow/core/serialization/format.d.ts +6 -6
  109. package/dist/src/compiled/@workflow/core/serialization/hardened.d.ts +23 -22
  110. package/dist/src/compiled/@workflow/core/serialization/index.d.ts +1 -1
  111. package/dist/src/compiled/@workflow/core/serialization/reducers/class-vm.d.ts +1 -1
  112. package/dist/src/compiled/@workflow/core/serialization/reducers/step-function-vm.d.ts +1 -1
  113. package/dist/src/compiled/@workflow/core/serialization/types.d.ts +5 -5
  114. package/dist/src/compiled/@workflow/core/serialization/workflow-vm.d.ts +1 -1
  115. package/dist/src/compiled/@workflow/core/serialization-format.d.ts +11 -11
  116. package/dist/src/compiled/@workflow/core/serialization.d.ts +18 -19
  117. package/dist/src/compiled/@workflow/core/source-map.d.ts +1 -1
  118. package/dist/src/compiled/@workflow/core/step/context-storage.d.ts +5 -5
  119. package/dist/src/compiled/@workflow/core/step/writable-stream.d.ts +3 -3
  120. package/dist/src/compiled/@workflow/core/symbols.d.ts +2 -2
  121. package/dist/src/compiled/@workflow/core/telemetry/semantic-conventions.d.ts +71 -20
  122. package/dist/src/compiled/@workflow/core/telemetry.d.ts +15 -3
  123. package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
  124. package/dist/src/compiled/@workflow/core/vm/script-cache.d.ts +9 -11
  125. package/dist/src/compiled/@workflow/core/workflow/abort-controller.d.ts +1 -1
  126. package/dist/src/compiled/@workflow/core/workflow/set-attributes.d.ts +1 -1
  127. package/dist/src/compiled/@workflow/core/workflow/world-init-stub.d.ts +1 -1
  128. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  129. package/dist/src/compiled/@workflow/errors/index.d.ts +18 -18
  130. package/dist/src/compiled/@workflow/errors/index.js +1 -1
  131. package/dist/src/compiled/@workflow/world/analytics.d.ts +3 -2
  132. package/dist/src/compiled/@workflow/world/attributes-validation.d.ts +28 -0
  133. package/dist/src/compiled/@workflow/world/attributes.d.ts +8 -107
  134. package/dist/src/compiled/@workflow/world/env-config.d.ts +5 -5
  135. package/dist/src/compiled/@workflow/world/event-metadata.d.ts +132 -0
  136. package/dist/src/compiled/@workflow/world/events.d.ts +42 -96
  137. package/dist/src/compiled/@workflow/world/hooks.d.ts +12 -11
  138. package/dist/src/compiled/@workflow/world/index.d.ts +3 -3
  139. package/dist/src/compiled/@workflow/world/interfaces.d.ts +94 -39
  140. package/dist/src/compiled/@workflow/world/queue.d.ts +29 -22
  141. package/dist/src/compiled/@workflow/world/runs.d.ts +20 -0
  142. package/dist/src/compiled/@workflow/world/slot-identity.d.ts +3 -3
  143. package/dist/src/compiled/@workflow/world/spec-version.d.ts +82 -15
  144. package/dist/src/compiled/@workflow/world/ulid.d.ts +2 -2
  145. package/dist/src/compiled/@workflow/world-local/index.js +5 -5
  146. package/dist/src/compiled/@workflow/world-vercel/index.js +12 -12
  147. package/dist/src/compiled/_chunks/workflow/{attribute-changes-DXbpwBdw.js → attribute-changes-BwAadFfB.js} +3 -3
  148. package/dist/src/compiled/_chunks/workflow/debug-log-CVPstO1D.js +1 -0
  149. package/dist/src/compiled/_chunks/workflow/dist-CgbVZs5l.js +40 -0
  150. package/dist/src/compiled/_chunks/workflow/dist-DjojkP5e.js +3 -0
  151. package/dist/src/compiled/_chunks/workflow/frames-CZ9eHShe.js +3 -0
  152. package/dist/src/compiled/_chunks/workflow/global-singleton-BNinwFrL.js +1 -0
  153. package/dist/src/compiled/_chunks/workflow/private-CZFMABEf.js +1 -0
  154. package/dist/src/compiled/_chunks/workflow/resume-hook-BToMtPbH.js +1 -0
  155. package/dist/src/compiled/_chunks/workflow/run-DzyAoGh4.js +1 -0
  156. package/dist/src/compiled/_chunks/workflow/sleep-3_A5uOp-.js +1 -0
  157. package/dist/src/compiled/_chunks/workflow/undici-DfxNX5og.js +95 -0
  158. package/dist/src/compiled/_chunks/workflow/wait-until-BtySPYD0.js +15 -0
  159. package/dist/src/compiled/_chunks/workflow/ws-transport-PnVVxT0R.js +1 -0
  160. package/dist/src/compiler/extension-compatibility.d.ts +2 -2
  161. package/dist/src/compiler/extension-compatibility.js +1 -1
  162. package/dist/src/compiler/manifest.d.ts +2 -2
  163. package/dist/src/compiler/manifest.js +1 -1
  164. package/dist/src/compiler/normalize-tool.js +1 -1
  165. package/dist/src/context/keys.d.ts +3 -8
  166. package/dist/src/eve-channel/index.js +1 -1
  167. package/dist/src/eve-channel/types.d.ts +7 -7
  168. package/dist/src/execution/accepted-delivery-deployment.d.ts +7 -0
  169. package/dist/src/execution/accepted-delivery-deployment.js +1 -0
  170. package/dist/src/execution/agent-handle-dispatch.js +1 -1
  171. package/dist/src/execution/cancel-descendant-turns-step.d.ts +4 -1
  172. package/dist/src/execution/cancel-descendant-turns-step.js +1 -1
  173. package/dist/src/execution/continuation-conflict-step.d.ts +10 -0
  174. package/dist/src/execution/continuation-conflict-step.js +1 -0
  175. package/dist/src/execution/delegated-parent-notification.js +1 -1
  176. package/dist/src/execution/delegation-tool.js +1 -1
  177. package/dist/src/execution/dispatch-runtime-actions-shared.d.ts +14 -31
  178. package/dist/src/execution/dispatch-runtime-actions-shared.js +1 -1
  179. package/dist/src/execution/dispatch-runtime-actions-start.d.ts +33 -0
  180. package/dist/src/execution/dispatch-runtime-actions-start.js +1 -0
  181. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  182. package/dist/src/execution/dispatch-turn-step.js +1 -1
  183. package/dist/src/execution/durable-session-migrations/turn-workflow-v1-to-v2.d.ts +2 -0
  184. package/dist/src/execution/durable-session-migrations/turn-workflow-v1-to-v2.js +1 -0
  185. package/dist/src/execution/durable-session-migrations/turn-workflow.d.ts +25 -3
  186. package/dist/src/execution/durable-session-migrations/turn-workflow.js +1 -1
  187. package/dist/src/execution/dynamic-connections.js +1 -1
  188. package/dist/src/execution/eve-workflow-attributes.js +1 -1
  189. package/dist/src/execution/finalize-terminal-session.d.ts +17 -0
  190. package/dist/src/execution/finalize-terminal-session.js +1 -0
  191. package/dist/src/execution/inline-turn.d.ts +29 -0
  192. package/dist/src/execution/inline-turn.js +1 -0
  193. package/dist/src/execution/next-driver-action.d.ts +9 -4
  194. package/dist/src/execution/node-step.js +1 -1
  195. package/dist/src/execution/parked-delivery-wait.js +1 -1
  196. package/dist/src/execution/pending-turn-state.d.ts +1 -0
  197. package/dist/src/execution/pending-turn-state.js +1 -1
  198. package/dist/src/execution/proxied-deliver-step.js +1 -1
  199. package/dist/src/execution/remote-agent-dispatch.d.ts +2 -0
  200. package/dist/src/execution/remote-agent-dispatch.js +1 -1
  201. package/dist/src/execution/runtime-errors.d.ts +0 -12
  202. package/dist/src/execution/runtime-errors.js +1 -1
  203. package/dist/src/execution/session-command-token.d.ts +2 -0
  204. package/dist/src/execution/session-command-token.js +1 -1
  205. package/dist/src/execution/session-timeout-steps.js +1 -1
  206. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  207. package/dist/src/execution/stable-workflow-names.d.ts +12 -0
  208. package/dist/src/execution/stable-workflow-names.js +1 -0
  209. package/dist/src/execution/subagent-event-proxy-step.d.ts +3 -0
  210. package/dist/src/execution/subagent-event-proxy-step.js +1 -1
  211. package/dist/src/execution/subagent-hitl-proxy.d.ts +2 -1
  212. package/dist/src/execution/subagent-hitl-proxy.js +1 -1
  213. package/dist/src/execution/subagent-start-local.js +1 -1
  214. package/dist/src/execution/subagent-start-remote.d.ts +2 -0
  215. package/dist/src/execution/subagent-start-remote.js +1 -1
  216. package/dist/src/execution/tasks/child/steps.d.ts +2 -0
  217. package/dist/src/execution/tasks/child/steps.js +1 -1
  218. package/dist/src/execution/tasks/child/workflow.js +1 -1
  219. package/dist/src/execution/tasks/parent/dispatch-task-step.js +1 -1
  220. package/dist/src/execution/tasks/parent/dispatch.js +1 -1
  221. package/dist/src/execution/tasks/parent/hitl-proxy-steps.js +1 -1
  222. package/dist/src/execution/tasks/parent/run-parent.js +1 -1
  223. package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
  224. package/dist/src/execution/terminal-session-completion-step.js +1 -1
  225. package/dist/src/execution/terminal-session-event.d.ts +13 -0
  226. package/dist/src/execution/terminal-session-event.js +1 -0
  227. package/dist/src/execution/terminal-session-failure-step.d.ts +1 -0
  228. package/dist/src/execution/terminal-session-failure-step.js +1 -1
  229. package/dist/src/execution/tool-run/answer.d.ts +3 -0
  230. package/dist/src/execution/tool-run/answer.js +1 -0
  231. package/dist/src/execution/tool-run/background.d.ts +14 -0
  232. package/dist/src/execution/tool-run/background.js +1 -0
  233. package/dist/src/execution/tool-run/cancel.d.ts +7 -0
  234. package/dist/src/execution/tool-run/cancel.js +1 -0
  235. package/dist/src/execution/tool-run/dispatch.d.ts +24 -0
  236. package/dist/src/execution/tool-run/dispatch.js +1 -0
  237. package/dist/src/execution/tool-run/emit-run-report-step.d.ts +7 -0
  238. package/dist/src/execution/tool-run/emit-run-report-step.js +1 -0
  239. package/dist/src/execution/tool-run/messages.d.ts +70 -0
  240. package/dist/src/execution/tool-run/messages.js +1 -0
  241. package/dist/src/execution/tool-run/owner-channels.d.ts +29 -0
  242. package/dist/src/execution/tool-run/owner-channels.js +1 -0
  243. package/dist/src/execution/tool-run/owner-inbox.d.ts +11 -0
  244. package/dist/src/execution/tool-run/owner-inbox.js +1 -0
  245. package/dist/src/execution/tool-run/owner.d.ts +13 -0
  246. package/dist/src/execution/tool-run/owner.js +1 -0
  247. package/dist/src/execution/tool-run/resume-hook-step.d.ts +4 -0
  248. package/dist/src/execution/tool-run/resume-hook-step.js +1 -0
  249. package/dist/src/execution/tool-run/run-control.d.ts +18 -0
  250. package/dist/src/execution/tool-run/run-control.js +1 -0
  251. package/dist/src/execution/tool-run/start.d.ts +11 -0
  252. package/dist/src/execution/tool-run/start.js +1 -0
  253. package/dist/src/execution/tool-run/types.d.ts +21 -0
  254. package/dist/src/execution/tool-run/types.js +1 -0
  255. package/dist/src/execution/tool-run/workflow.d.ts +9 -0
  256. package/dist/src/execution/tool-run/workflow.js +1 -0
  257. package/dist/src/execution/tools/subagent/local.js +1 -1
  258. package/dist/src/execution/turn-cancellation-control.d.ts +2 -0
  259. package/dist/src/execution/turn-cancellation-control.js +1 -1
  260. package/dist/src/execution/turn-control-receiver.js +1 -1
  261. package/dist/src/execution/turn-dispatch.d.ts +4 -2
  262. package/dist/src/execution/turn-dispatch.js +1 -1
  263. package/dist/src/execution/turn-execution-cursor.js +1 -1
  264. package/dist/src/execution/turn-workflow.js +1 -1
  265. package/dist/src/execution/wire/session-inbox-contract.d.ts +2 -2
  266. package/dist/src/execution/wire/session-inbox-contract.js +1 -1
  267. package/dist/src/execution/wire/session-inbox-encoder.d.ts +6 -2
  268. package/dist/src/execution/wire/session-inbox-encoder.js +1 -1
  269. package/dist/src/execution/wire/session-inbox-resume.js +1 -1
  270. package/dist/src/execution/wire/session-inbox-wire.js +1 -1
  271. package/dist/src/execution/wire/session-inbox-wire.v1.js +1 -1
  272. package/dist/src/execution/wire/session-inbox-wire.v2-migration.d.ts +0 -2
  273. package/dist/src/execution/wire/session-inbox-wire.v2-migration.js +1 -1
  274. package/dist/src/execution/wire/session-inbox-wire.v2.migration.d.ts +3 -0
  275. package/dist/src/execution/wire/session-inbox-wire.v2.migration.js +1 -0
  276. package/dist/src/execution/wire/session-inbox-wire.v3.d.ts +480 -0
  277. package/dist/src/execution/wire/session-inbox-wire.v3.js +1 -0
  278. package/dist/src/execution/wire/session-inbox-wire.v3.migration.d.ts +3 -0
  279. package/dist/src/execution/wire/session-inbox-wire.v3.migration.js +1 -0
  280. package/dist/src/execution/workflow-entry-finalization.js +1 -1
  281. package/dist/src/execution/workflow-entry.d.ts +5 -1
  282. package/dist/src/execution/workflow-entry.js +1 -1
  283. package/dist/src/execution/workflow-registry.d.ts +5 -0
  284. package/dist/src/execution/workflow-registry.js +1 -0
  285. package/dist/src/execution/workflow-runtime.d.ts +17 -19
  286. package/dist/src/execution/workflow-runtime.js +1 -1
  287. package/dist/src/execution/workflow-steps.js +1 -1
  288. package/dist/src/execution/workflow-webhook-route.d.ts +4 -0
  289. package/dist/src/execution/workflow-webhook-route.js +1 -0
  290. package/dist/src/harness/attachment-staging.js +1 -1
  291. package/dist/src/harness/emission.js +1 -1
  292. package/dist/src/harness/proxy-input-requests.d.ts +10 -0
  293. package/dist/src/harness/proxy-input-requests.js +1 -1
  294. package/dist/src/harness/runtime-actions.d.ts +2 -0
  295. package/dist/src/harness/runtime-actions.js +1 -1
  296. package/dist/src/harness/session-limit-enforcement.js +1 -1
  297. package/dist/src/harness/tool-loop.js +2 -2
  298. package/dist/src/harness/tool-runs.d.ts +21 -0
  299. package/dist/src/harness/tool-runs.js +1 -0
  300. package/dist/src/harness/tools.js +1 -1
  301. package/dist/src/instrumentation/content-policy.d.ts +3 -1
  302. package/dist/src/instrumentation/content-policy.js +1 -1
  303. package/dist/src/instrumentation/runtime.d.ts +2 -2
  304. package/dist/src/instrumentation/runtime.js +1 -1
  305. package/dist/src/internal/application/package.js +1 -1
  306. package/dist/src/internal/attachments/errors.d.ts +3 -0
  307. package/dist/src/internal/authored-module-loader.d.ts +7 -1
  308. package/dist/src/internal/authored-module-loader.js +3 -3
  309. package/dist/src/internal/authored-package-boundary.js +1 -1
  310. package/dist/src/internal/authored-runtime-modules.d.ts +2 -0
  311. package/dist/src/internal/authored-runtime-modules.js +1 -1
  312. package/dist/src/internal/nitro/development-generation.d.ts +2 -0
  313. package/dist/src/internal/nitro/development-generation.js +1 -1
  314. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  315. package/dist/src/internal/nitro/host/dev-host-fingerprint.js +1 -1
  316. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
  317. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  318. package/dist/src/internal/workflow/development-world-client.js +1 -1
  319. package/dist/src/internal/workflow-bundle/authored-workflow-directives.d.ts +17 -0
  320. package/dist/src/internal/workflow-bundle/authored-workflow-directives.js +1 -0
  321. package/dist/src/internal/workflow-bundle/authored-workflow-modules.d.ts +19 -0
  322. package/dist/src/internal/workflow-bundle/authored-workflow-modules.js +1 -0
  323. package/dist/src/internal/workflow-bundle/builder-support.d.ts +17 -2
  324. package/dist/src/internal/workflow-bundle/builder-support.js +4 -3
  325. package/dist/src/internal/workflow-bundle/builder.d.ts +2 -2
  326. package/dist/src/internal/workflow-bundle/builder.js +2 -2
  327. package/dist/src/internal/workflow-bundle/dynamic-capability-transform-plugin.d.ts +2 -0
  328. package/dist/src/internal/workflow-bundle/dynamic-capability-transform-plugin.js +1 -1
  329. package/dist/src/internal/workflow-bundle/dynamic-tool-ast-references.d.ts +3 -0
  330. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.d.ts +1 -1
  331. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
  332. package/dist/src/internal/workflow-bundle/workflow-builders.d.ts +6 -2
  333. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  334. package/dist/src/internal/workflow-bundle/workflow-core-shim.d.ts +3 -0
  335. package/dist/src/internal/workflow-bundle/workflow-core-shim.js +1 -1
  336. package/dist/src/internal/workflow-bundle/workflow-directive-ast.d.ts +7 -0
  337. package/dist/src/internal/workflow-bundle/workflow-directive-ast.js +1 -0
  338. package/dist/src/internal/workflow-bundle/workflow-transformer.d.ts +15 -1
  339. package/dist/src/internal/workflow-bundle/workflow-transformer.js +4 -4
  340. package/dist/src/packages/eve-catalog/src/index.js +1 -1
  341. package/dist/src/protocol/baggage.d.ts +6 -0
  342. package/dist/src/protocol/baggage.js +1 -0
  343. package/dist/src/public/channels/slack/attachments.js +1 -1
  344. package/dist/src/public/channels/slack/slackChannel.d.ts +7 -1
  345. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  346. package/dist/src/public/channels/teams/attachments.d.ts +2 -2
  347. package/dist/src/public/channels/teams/attachments.js +1 -1
  348. package/dist/src/public/channels/teams/teamsChannel.js +1 -1
  349. package/dist/src/public/channels/telegram/attachments.js +1 -1
  350. package/dist/src/public/definitions/remote-agent.d.ts +6 -3
  351. package/dist/src/public/workflow/index.d.ts +3 -0
  352. package/dist/src/public/workflow/index.js +1 -0
  353. package/dist/src/public/workflow-modules.d.js +1 -0
  354. package/dist/src/public/workflow-modules.d.ts +11 -0
  355. package/dist/src/runtime/actions/keys.js +1 -1
  356. package/dist/src/runtime/tools/registry.js +1 -1
  357. package/dist/src/setup/connection-connector.d.ts +4 -2
  358. package/dist/src/setup/connection-connector.js +2 -2
  359. package/dist/src/setup/flows/login.js +1 -1
  360. package/dist/src/setup/flows/model.js +1 -1
  361. package/dist/src/setup/flows/provider.d.ts +5 -0
  362. package/dist/src/setup/flows/provider.js +4 -4
  363. package/dist/src/setup/flows/registry-session.d.ts +24 -7
  364. package/dist/src/setup/flows/registry-session.js +1 -1
  365. package/dist/src/setup/flows/registry.d.ts +35 -29
  366. package/dist/src/setup/flows/registry.js +2 -1
  367. package/dist/src/setup/integrations/web/setup.d.ts +0 -2
  368. package/dist/src/setup/integrations/web/setup.js +1 -1
  369. package/dist/src/setup/prompter.d.ts +24 -4
  370. package/dist/src/setup/prompter.js +1 -1
  371. package/dist/src/setup/scaffold/connections/catalog.js +1 -1
  372. package/dist/src/setup/scaffold/create/project.js +2 -2
  373. package/dist/src/setup/vercel-project.js +0 -0
  374. package/dist/src/shared/dispatch-action.d.ts +6 -0
  375. package/dist/src/shared/forwarded-trace-policy.d.ts +28 -0
  376. package/dist/src/shared/forwarded-trace-policy.js +1 -0
  377. package/dist/src/shared/instrumentation-decision.d.ts +3 -0
  378. package/dist/src/shared/instrumentation-decision.js +1 -1
  379. package/dist/src/svelte/index.js +1 -1
  380. package/dist/src/svelte/use-eve-agent.js +1 -1
  381. package/dist/src/tools/behavior.d.ts +6 -0
  382. package/dist/src/tools/definition.d.ts +39 -3
  383. package/dist/src/tracing/agent-otel-provider.js +2 -2
  384. package/dist/src/tracing/agent-otel-session-context.js +1 -1
  385. package/dist/src/tracing/agent-trace-context-store.d.ts +1 -1
  386. package/dist/src/tracing/agent-trace-context-store.js +1 -1
  387. package/dist/src/tracing/otel-declaration.d.ts +5 -3
  388. package/dist/src/tracing/otel-registration.d.ts +1 -1
  389. package/dist/src/tracing/otel-registration.js +1 -1
  390. package/dist/src/vue/index.js +1 -1
  391. package/dist/src/vue/use-eve-agent.js +1 -1
  392. package/docs/channels/custom.mdx +6 -0
  393. package/docs/channels/eve.mdx +14 -6
  394. package/docs/channels/mcp.mdx +4 -1
  395. package/docs/channels/teams.mdx +6 -1
  396. package/docs/concepts/sessions-runs-and-streaming.md +4 -2
  397. package/docs/guides/auth-and-route-protection.md +5 -1
  398. package/docs/guides/client/messages.mdx +6 -0
  399. package/docs/guides/dev-tui.md +30 -18
  400. package/docs/guides/instrumentation.md +1 -1
  401. package/docs/guides/remote-agents.md +25 -0
  402. package/docs/install-integrations.mdx +2 -0
  403. package/docs/instructions.mdx +1 -1
  404. package/docs/memory/custom-provider.md +214 -0
  405. package/docs/memory/file.md +129 -0
  406. package/docs/memory/meta.json +5 -0
  407. package/docs/memory/overview.mdx +282 -0
  408. package/docs/patterns/multi-tenant-memory.md +12 -20
  409. package/docs/reference/cli.md +2 -2
  410. package/docs/tools/meta.json +1 -1
  411. package/docs/tools/overview.mdx +7 -0
  412. package/docs/tools/workflows.mdx +288 -0
  413. package/package.json +18 -7
  414. package/dist/src/compiled/_chunks/workflow/dist-CqvWKNQv.js +0 -3
  415. package/dist/src/compiled/_chunks/workflow/dist-Dk0aQqFO.js +0 -40
  416. package/dist/src/compiled/_chunks/workflow/dist-DpYyXbJv.js +0 -1
  417. package/dist/src/compiled/_chunks/workflow/env-config-L94XftKz.js +0 -1
  418. package/dist/src/compiled/_chunks/workflow/frames-Dl2Hcma4.js +0 -3
  419. package/dist/src/compiled/_chunks/workflow/private-CuQ4HTFC.js +0 -1
  420. package/dist/src/compiled/_chunks/workflow/resume-hook-E-Nkx8q_.js +0 -1
  421. package/dist/src/compiled/_chunks/workflow/run-cIeex2KF.js +0 -1
  422. package/dist/src/compiled/_chunks/workflow/sleep-CxFsdxB_.js +0 -1
  423. package/dist/src/compiled/_chunks/workflow/spec-version-DBUVfF_R.js +0 -1
  424. package/dist/src/compiled/_chunks/workflow/undici-DznrXKcM.js +0 -95
  425. package/dist/src/compiled/_chunks/workflow/wait-until-BZHmJCAW.js +0 -15
  426. package/dist/src/compiled/_chunks/workflow/ws-transport-Ct6yyRWZ.js +0 -1
  427. package/dist/src/internal/authored-directive-prologue.d.ts +0 -4
  428. package/dist/src/internal/authored-directive-prologue.js +0 -1
  429. package/docs/memory.md +0 -408
@@ -1 +1 @@
1
- import{AI_GATEWAY_API_KEY_ENV_VAR}from"../ai-gateway-api-key.js";import{withSpinner}from"../with-spinner.js";import{gatewayModelCapabilities}from"../boxes/model-capabilities.js";import{fetchGatewayCatalog,modelOptionsFromCatalog}from"../boxes/select-model.js";import{ensureChatGptAuth}from"./chatgpt-auth.js";import{WizardCancelledError}from"../step.js";import{changeAgentModelSettings,formatApplyModelSettingsOutcome}from"./model-source-change.js";import{runProviderFlow}from"./provider.js";import pc from"#compiled/picocolors/index.js";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{inspectApplication}from"#services/inspect-application.js";import{readProviderSelection,resolveAvailableProviders,writeProviderSelection}from"#setup/provider-settings.js";import{formatModelSummary}from"#shared/model-summary.js";import{readGatewayServiceTier}from"#shared/gateway-service-tier.js";import{DEFAULT_CHATGPT_MODEL_SELECTION,isChatGptModelRouting,parseChatGptModelSelection}from"#shared/chatgpt-model.js";const MODEL_MENU_MESSAGE=``;function providerSelectionHint(t,n){return t===`chatgpt`?n===void 0?`ChatGPT subscription`:`ChatGPT subscription (${n})`:t===`ai-gateway-project`?`AI Gateway via Project`:`AI Gateway via ${AI_GATEWAY_API_KEY_ENV_VAR}`}function modelListRows(e){return modelOptionsFromCatalog(e).map(e=>{let t={value:e.value,label:e.value};return e.featured===!0&&(t.featured=!0),t})}function formatModelDraftHint(e,t,n){let r={model:e};return t!==null&&(r.reasoning=t),n.kind===`priority`&&(r.fastGlyph=`↯`),formatModelSummary(r)}function modelMenuRows(e,t,n,r,i,a,o,s,c){let l;s||c?(l={value:`model`,label:`Change model`,description:s?`The model, its reasoning effort, and the Gateway service tier`:`Reasoning and service tier; the model itself is an SDK model call in agent.ts`},e!==null&&(l.hint=formatModelDraftHint(e,t,n))):l={value:`model`,label:`Change model`,disabled:!0,description:`Set via an SDK model call in agent.ts; edit the source to change it`};let d;return d=o?.kind===`external`&&!isChatGptModelRouting(o)?{disabled:!0,value:`provider`,label:`Change provider`,description:`Disabled in external endpoint mode`}:i?{value:`provider`,label:`Change provider`,hint:providerSelectionHint(r,a),description:`How your agent reaches the model provider`}:{value:`provider`,label:pc.bold(`Configure model access`),hint:pc.yellow(`Not configured`),description:`How your agent reaches the model provider`,accent:`warning`},[l,d,{value:`done`,label:`Done`}]}async function runModelFlow(e){let{appRoot:i,prompter:u,signal:f}=e,p={readCurrentModel:readCurrentAgentModel,applySettings:changeAgentModelSettings,resolveAvailableProviders,readProviderSelection,runProviderFlow,ensureChatGptAuth,writeProviderSelection,...e.deps},m=p.selectModel?.fetchModels??fetchGatewayCatalog,[h,g,_,v]=await withSpinner(u,`Checking the project…`,()=>Promise.all([p.readCurrentModel(i),p.resolveAvailableProviders(i,f===void 0?{env:process.env}:{signal:f,env:process.env}),p.readProviderSelection(i),m(f).catch(()=>void 0)]));f?.throwIfAborted();let{id:y,routing:b,serviceTier:x,editable:S,settingsEditable:C}=h,w=h.reasoning===`provider-default`?null:h.reasoning,T=_??(g.includes(`ai-gateway-key`)?`ai-gateway-key`:`ai-gateway-project`),E=g.includes(T),D,O={model:{kind:`keep`},reasoning:{kind:`keep`},gatewayServiceTier:{kind:`keep`}},k,A,j=!1,M=!1,N=b?.kind===`external`&&!isChatGptModelRouting(b),P=N?{tone:`warning`,text:"`agent.ts` specifies the model provider directly. Model, provider, and service-tier changes stay source-owned; reasoning remains configurable here."}:void 0,F=!E&&b?.kind!==`external`?`provider`:S||C?`model`:`provider`,I=b?.kind!==`external`&&(e.initialStep===`provider`||!E);for(;;){let t;if(I)I=!1,t=`provider`;else try{t=await u.select({message:``,options:modelMenuRows(y,w,isChatGptModelRouting(b)?{kind:`standard`}:x,T,E,e.chatGptAccountLabel,b,S,C),hintLayout:`stacked`,initialValue:F,notices:P===void 0?[]:[P]})}catch(e){if(!(e instanceof WizardCancelledError))throw e;if(hasModelSettingsChanges(O))return{kind:`cancelled`,discardedDraft:!0};break}if(t===`done`){M=!0;break}if(t===`model`){let e=p.pickModelSettings;if(e===void 0)throw Error(`runModelFlow requires a pickModelSettings dep to open the model screen.`);let t=await e({model:S?{kind:`pick`,options:modelListRows(v),current:y}:{kind:`fixed`,current:y,reason:`Set via an SDK model call in agent.ts; edit the source to change it`},reasoning:w,serviceTier:isChatGptModelRouting(b)?{kind:`standard`}:x,settingsEditable:C,externalRouting:N,capabilitiesFor:e=>gatewayModelCapabilities(v,e)});if(f?.throwIfAborted(),t===void 0){F=`model`;continue}t.model!==void 0&&(y=t.model,b=routingForModelSelection(t.model),O.model={kind:`set`,value:t.model}),t.reasoning!==void 0&&(w=t.reasoning==="default"?null:t.reasoning,O.reasoning=w===null?{kind:`remove`}:{kind:`set`,value:w}),t.serviceTier!==void 0&&!isChatGptModelRouting(b)&&(x=t.serviceTier===`priority`?{kind:`priority`}:{kind:`standard`},O.gatewayServiceTier=t.serviceTier===`priority`?{kind:`set`,value:`priority`}:{kind:`remove`}),F=`done`;continue}let r=await p.runProviderFlow({appRoot:i,prompter:u,signal:f,availableProviders:g,selectedProvider:T});if(r.kind===`cancelled`){if(f?.aborted)return{kind:`cancelled`};F=`provider`;continue}if(r.kind===`external-provider`){if(f?.aborted)return{kind:`cancelled`};F=`done`;continue}D=r.kind,D===`chatgpt`?(j=!0,isChatGptModelRouting(b)||(O.model={kind:`set`,value:DEFAULT_CHATGPT_MODEL_SELECTION},O.gatewayServiceTier={kind:`remove`})):isChatGptModelRouting(b)&&(O.model={kind:`set`,value:DEFAULT_AGENT_MODEL_ID}),M=!0;break}let L=O.model.kind===`set`&&parseChatGptModelSelection(O.model.value)!==void 0;if(M&&L&&(O.gatewayServiceTier={kind:`remove`},j=!0),M&&j&&await authenticateChatGpt(p,e.withExclusiveTerminal),M&&hasModelSettingsChanges(O)&&(k=await p.applySettings({appRoot:i,patch:O})),M&&D!==void 0&&k?.kind!==`rejected`&&(await p.writeProviderSelection(i,D),A=D),k!==void 0&&A===void 0&&f?.throwIfAborted(),k===void 0&&A===void 0&&!j)return{kind:`cancelled`};let R={kind:`done`,accessChanged:k?.kind===`changed`||A!==void 0||j};return k===void 0?j&&(R.modelMessage=`ChatGPT login ready.`):R.modelMessage=formatApplyModelSettingsOutcome(k),A!==void 0&&(R.providerSelection=A),R}function routingForModelSelection(e){return parseChatGptModelSelection(e)===void 0?{kind:`gateway`,target:e.split(`/`)[0]??``}:{kind:`external`,provider:`codex`}}async function authenticateChatGpt(e,t){let authenticate=()=>e.ensureChatGptAuth();await(t===void 0?authenticate():t(authenticate))}function hasModelSettingsChanges(e){return e.model.kind!==`keep`||e.reasoning.kind!==`keep`||e.gatewayServiceTier.kind!==`keep`}async function readCurrentAgentModel(e){try{let{compiledState:t}=await inspectApplication(e),n=t?.manifest.config,r=n?.model,i=isChatGptModelRouting(r?.routing);return{id:i&&r!==void 0?`chatgpt/${r.id}`:r?.id??null,routing:r?.routing??null,reasoning:n?.reasoning??null,serviceTier:readGatewayServiceTier(r?.providerOptions),editable:r!==void 0&&(r.source===void 0||i),settingsEditable:n?.source!==void 0}}catch{return{id:null,routing:null,reasoning:null,serviceTier:{kind:`standard`},editable:!1,settingsEditable:!1}}}async function modelChangeRefusalForUneditableModel(e){let{editable:t,routing:n}=await readCurrentAgentModel(e);return t?null:`Model is set via ${n?.kind===`external`?`the external provider \`${n.provider}\``:`an SDK model call`} in agent.ts, not a string literal; /model can't rewrite it. Edit \`model\` in agent.ts.`}export{MODEL_MENU_MESSAGE,modelChangeRefusalForUneditableModel,runModelFlow};
1
+ import{AI_GATEWAY_API_KEY_ENV_VAR}from"../ai-gateway-api-key.js";import{withSpinner}from"../with-spinner.js";import{gatewayModelCapabilities}from"../boxes/model-capabilities.js";import{fetchGatewayCatalog,modelOptionsFromCatalog}from"../boxes/select-model.js";import{ensureChatGptAuth}from"./chatgpt-auth.js";import{WizardCancelledError}from"../step.js";import{changeAgentModelSettings,formatApplyModelSettingsOutcome}from"./model-source-change.js";import{runProviderFlow}from"./provider.js";import pc from"#compiled/picocolors/index.js";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{inspectApplication}from"#services/inspect-application.js";import{readProviderSelection,resolveAvailableProviders,writeProviderSelection}from"#setup/provider-settings.js";import{formatModelSummary}from"#shared/model-summary.js";import{readGatewayServiceTier}from"#shared/gateway-service-tier.js";import{DEFAULT_CHATGPT_MODEL_SELECTION,isChatGptModelRouting,parseChatGptModelSelection}from"#shared/chatgpt-model.js";const MODEL_MENU_MESSAGE=``;function providerSelectionHint(t,n){return t===`chatgpt`?n===void 0?`ChatGPT subscription`:`ChatGPT subscription (${n})`:t===`ai-gateway-project`?`AI Gateway via Project`:`AI Gateway via ${AI_GATEWAY_API_KEY_ENV_VAR}`}function modelListRows(e){return modelOptionsFromCatalog(e).map(e=>{let t={value:e.value,label:e.value};return e.featured===!0&&(t.featured=!0),t})}function formatModelDraftHint(e,t,n){let r={model:e};return t!==null&&(r.reasoning=t),n.kind===`priority`&&(r.fastGlyph=`↯`),formatModelSummary(r)}function modelMenuRows(e,t,n,r,i,a,o,s,c){let l;s||c?(l={value:`model`,label:`Change model`,description:s?`The model, its reasoning effort, and the Gateway service tier`:`Reasoning and service tier; the model itself is an SDK model call in agent.ts`},e!==null&&(l.hint=formatModelDraftHint(e,t,n))):l={value:`model`,label:`Change model`,disabled:!0,description:`Set via an SDK model call in agent.ts; edit the source to change it`};let d;return d=o?.kind===`external`&&!isChatGptModelRouting(o)?{disabled:!0,value:`provider`,label:`Change provider`,description:`Disabled in external endpoint mode`}:i?{value:`provider`,label:`Change provider`,hint:providerSelectionHint(r,a),description:`How your agent reaches the model provider`}:{value:`provider`,label:pc.bold(`Configure model access`),hint:pc.yellow(`Not configured`),description:`How your agent reaches the model provider`,accent:`warning`},[l,d,{value:`done`,label:`Done`}]}async function runModelFlow(e){let{appRoot:i,prompter:u,signal:f}=e,p={readCurrentModel:readCurrentAgentModel,applySettings:changeAgentModelSettings,resolveAvailableProviders,readProviderSelection,runProviderFlow,ensureChatGptAuth,writeProviderSelection,...e.deps},m=p.selectModel?.fetchModels??fetchGatewayCatalog,[h,g,_,v]=await withSpinner(u,`Checking the project…`,()=>Promise.all([p.readCurrentModel(i),p.resolveAvailableProviders(i,f===void 0?{env:process.env}:{signal:f,env:process.env}),p.readProviderSelection(i),m(f).catch(()=>void 0)]));f?.throwIfAborted();let{id:y,routing:b,serviceTier:x,editable:S,settingsEditable:C}=h,w=h.reasoning===`provider-default`?null:h.reasoning,T=_??(g.includes(`ai-gateway-key`)?`ai-gateway-key`:`ai-gateway-project`),E=g.includes(T),D,O={model:{kind:`keep`},reasoning:{kind:`keep`},gatewayServiceTier:{kind:`keep`}},k,A,j=!1,M=!1,N=!1,P=b?.kind===`external`&&!isChatGptModelRouting(b),F=P?{tone:`warning`,text:"`agent.ts` specifies the model provider directly. Model, provider, and service-tier changes stay source-owned; reasoning remains configurable here."}:void 0,I=!E&&b?.kind!==`external`?`provider`:S||C?`model`:`provider`,L=b?.kind!==`external`&&(e.initialStep===`provider`||!E);for(;;){let t;if(L)L=!1,t=`provider`;else try{t=await u.select({message:``,options:modelMenuRows(y,w,isChatGptModelRouting(b)?{kind:`standard`}:x,T,E,e.chatGptAccountLabel,b,S,C),hintLayout:`stacked`,initialValue:I,notices:F===void 0?[]:[F]})}catch(e){if(!(e instanceof WizardCancelledError))throw e;if(hasModelSettingsChanges(O))return{kind:`cancelled`,discardedDraft:!0};break}if(t===`done`){M=!0,N=!0;break}if(t===`model`){let e=p.pickModelSettings;if(e===void 0)throw Error(`runModelFlow requires a pickModelSettings dep to open the model screen.`);let t=await e({model:S?{kind:`pick`,options:modelListRows(v),current:y}:{kind:`fixed`,current:y,reason:`Set via an SDK model call in agent.ts; edit the source to change it`},reasoning:w,serviceTier:isChatGptModelRouting(b)?{kind:`standard`}:x,settingsEditable:C,externalRouting:P,capabilitiesFor:e=>gatewayModelCapabilities(v,e)});if(f?.throwIfAborted(),t===void 0){I=`model`;continue}t.model!==void 0&&(y=t.model,b=routingForModelSelection(t.model),O.model={kind:`set`,value:t.model}),t.reasoning!==void 0&&(w=t.reasoning==="default"?null:t.reasoning,O.reasoning=w===null?{kind:`remove`}:{kind:`set`,value:w}),t.serviceTier!==void 0&&!isChatGptModelRouting(b)&&(x=t.serviceTier===`priority`?{kind:`priority`}:{kind:`standard`},O.gatewayServiceTier=t.serviceTier===`priority`?{kind:`set`,value:`priority`}:{kind:`remove`}),I=`done`;continue}let r=await p.runProviderFlow({appRoot:i,prompter:u,signal:f,availableProviders:g,selectedProvider:T});if(r.kind===`cancelled`){if(f?.aborted)return{kind:`cancelled`};I=`provider`;continue}if(r.kind===`external-provider`){if(f?.aborted)return{kind:`cancelled`};I=`done`;continue}D=r.kind,D===`chatgpt`?(j=!0,isChatGptModelRouting(b)||(O.model={kind:`set`,value:DEFAULT_CHATGPT_MODEL_SELECTION},O.gatewayServiceTier={kind:`remove`})):isChatGptModelRouting(b)&&(O.model={kind:`set`,value:DEFAULT_AGENT_MODEL_ID}),N=!0;break}let R=O.model.kind===`set`&&parseChatGptModelSelection(O.model.value)!==void 0;if(N&&R&&(O.gatewayServiceTier={kind:`remove`},j=!0),N&&j&&await authenticateChatGpt(p,e.withExclusiveTerminal),N&&hasModelSettingsChanges(O)&&(k=await p.applySettings({appRoot:i,patch:O})),N&&D!==void 0&&k?.kind!==`rejected`&&(await p.writeProviderSelection(i,D),A=D),k!==void 0&&A===void 0&&f?.throwIfAborted(),k===void 0&&A===void 0&&!j)return M?{kind:`done`,accessChanged:!1}:{kind:`cancelled`};let z={kind:`done`,accessChanged:k?.kind===`changed`||A!==void 0||j};return k===void 0?j&&(z.modelMessage=`ChatGPT login ready.`):z.modelMessage=formatApplyModelSettingsOutcome(k),A!==void 0&&(z.providerSelection=A),z}function routingForModelSelection(e){return parseChatGptModelSelection(e)===void 0?{kind:`gateway`,target:e.split(`/`)[0]??``}:{kind:`external`,provider:`codex`}}async function authenticateChatGpt(e,t){let authenticate=()=>e.ensureChatGptAuth();await(t===void 0?authenticate():t(authenticate))}function hasModelSettingsChanges(e){return e.model.kind!==`keep`||e.reasoning.kind!==`keep`||e.gatewayServiceTier.kind!==`keep`}async function readCurrentAgentModel(e){try{let{compiledState:t}=await inspectApplication(e),n=t?.manifest.config,r=n?.model,i=isChatGptModelRouting(r?.routing);return{id:i&&r!==void 0?`chatgpt/${r.id}`:r?.id??null,routing:r?.routing??null,reasoning:n?.reasoning??null,serviceTier:readGatewayServiceTier(r?.providerOptions),editable:r!==void 0&&(r.source===void 0||i),settingsEditable:n?.source!==void 0}}catch{return{id:null,routing:null,reasoning:null,serviceTier:{kind:`standard`},editable:!1,settingsEditable:!1}}}async function modelChangeRefusalForUneditableModel(e){let{editable:t,routing:n}=await readCurrentAgentModel(e);return t?null:`Model is set via ${n?.kind===`external`?`the external provider \`${n.provider}\``:`an SDK model call`} in agent.ts, not a string literal; /model can't rewrite it. Edit \`model\` in agent.ts.`}export{MODEL_MENU_MESSAGE,modelChangeRefusalForUneditableModel,runModelFlow};
@@ -3,6 +3,7 @@ import type { Prompter, SelectOption } from "../prompter.js";
3
3
  import { validateGatewayApiKey, type GatewayKeyValidation } from "../validate-gateway-key.js";
4
4
  import { getVercelAuthStatus } from "../vercel-project.js";
5
5
  import type { ProviderSelection } from "#setup/provider-settings.js";
6
+ import { HumanActionRequiredError } from "#setup/human-action.js";
6
7
  import { runLinkFlow } from "./link.js";
7
8
  export type ProviderConnection = ProviderSelection | "external";
8
9
  export declare const PROVIDER_QUESTION = "Which model provider do you want to use?";
@@ -60,6 +61,10 @@ export declare function runProviderFlow(input: {
60
61
  availableProviders: readonly ProviderSelection[];
61
62
  /** The current provider selection. */
62
63
  selectedProvider: ProviderSelection;
64
+ /** Whether that selection was explicitly persisted rather than inferred from available access. */
65
+ selectionExplicit?: boolean;
66
+ /** Interactive caller recovery that resumes project linking after Vercel repair. */
67
+ recoverHumanAction?: (error: HumanActionRequiredError) => Promise<"retry" | "cancel">;
63
68
  deps?: Partial<ProviderFlowDeps>;
64
69
  }): Promise<ProviderFlowResult>;
65
70
  export {};
@@ -1,4 +1,4 @@
1
- import{appendEnv}from"../append-env.js";import{AI_GATEWAY_API_KEY_ENV_FILE,AI_GATEWAY_API_KEY_ENV_VAR,writeAiGatewayApiKey}from"../ai-gateway-api-key.js";import{withSpinner}from"../with-spinner.js";import{getVercelAuthStatus,vercelAuthBlockerReason}from"../vercel-project.js";import{WizardCancelledError}from"../step.js";import{runLinkFlow}from"./link.js";import{validateGatewayApiKey}from"../validate-gateway-key.js";const PROVIDER_QUESTION=`Which model provider do you want to use?`,EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE=`Using another model provider`,EXTERNAL_PROVIDER_INSTRUCTIONS=[`Set your provider's API key in ${AI_GATEWAY_API_KEY_ENV_FILE} — e.g. ANTHROPIC_API_KEY or OPENAI_API_KEY.`,'In agent/agent.ts, set `model` to a provider-authored model — e.g. `anthropic("claude-opus-4.8")` from `@ai-sdk/anthropic`.',`See https://eve.dev/docs/agent-config for details.`,"A running `eve dev` reloads env files automatically — no restart needed."];function projectConnectionOption(e){let t={value:`ai-gateway-project`,label:`AI Gateway via Project`,hint:`Authenticates with AI Gateway automatically
2
- in a new or existing project. No keys to manage.`},n=e===void 0?void 0:vercelAuthBlockerReason(e);return n===void 0?t:{...t,disabled:!0,disabledReason:n,disabledReasonTone:`warning`}}function providerOptions(e,t){let r=projectConnectionOption(e);t===`ai-gateway-project`&&(r={...r,checked:!0,hint:`Current`});let i={value:`ai-gateway-key`,label:`AI Gateway via ${AI_GATEWAY_API_KEY_ENV_VAR}`,hint:`⎿ type your key`};return t===`ai-gateway-key`&&(i={...i,checked:!0,hint:`Current`}),[r,i,{value:`chatgpt`,label:`ChatGPT subscription`,hint:t===`chatgpt`?`Current`:`Authenticate through the Codex CLI`,checked:t===`chatgpt`||void 0},{value:`external`,label:`Other providers`,hint:`Connect directly to a model provider
3
- via OPENAI_API_KEY or ANTHROPIC_API_KEY.`}]}async function selectProvider(e){let t={message:PROVIDER_QUESTION,options:e.options,initialValue:e.initialValue,validateInlineKey:e.validateInlineKey};if(e.picker===void 0)throw Error(`The provider flow requires the Dev TUI provider picker.`);let n=await e.picker(t);if(n===void 0)throw new WizardCancelledError;return n}async function runProviderFlow(t){let{appRoot:n,prompter:o,signal:s}=t,c={getVercelAuthStatus,runLinkFlow,appendEnv,validateGatewayApiKey,...t.deps},l,{availableProviders:u,selectedProvider:d}=t,f=d,p;try{for(;;){let e=await selectProvider({picker:t.picker,options:providerOptions(l,d),initialValue:f,validateInlineKey:(e,t)=>c.validateGatewayApiKey(e,s===void 0?t:AbortSignal.any([s,t]))});if(e.kind===`external`)return o.acknowledge?await o.acknowledge({message:EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE,lines:EXTERNAL_PROVIDER_INSTRUCTIONS}):o.note(EXTERNAL_PROVIDER_INSTRUCTIONS.join(`
4
- `),EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE),{kind:`external-provider`};if(e.kind===`chatgpt`)return e;if(e.kind===`ai-gateway-key`){p=e;break}if(d!==`ai-gateway-project`&&u.includes(`ai-gateway-project`))return e;let r=await withSpinner(o,`Checking your Vercel login…`,()=>c.getVercelAuthStatus(n,{signal:s}));if(s?.throwIfAborted(),l=r,vercelAuthBlockerReason(l)!==void 0){f=`ai-gateway-key`;continue}let a=await c.runLinkFlow({appRoot:n,prompter:o,signal:s,projectSelection:`create-or-link`});return a.kind===`cancelled`?a:{kind:`ai-gateway-project`}}}catch(e){if(e instanceof WizardCancelledError)return{kind:`cancelled`};throw e}let m=p.key.trim(),h=p.validation;s?.throwIfAborted(),h.kind===`inconclusive`&&o.log.warning(`Couldn't reach the gateway to validate (${h.message}). Saving the key anyway.`);let g=await writeAiGatewayApiKey({projectRoot:n,apiKey:m,appendEnv:c.appendEnv});return o.log.success(`${g.envKey} set.`),{kind:`ai-gateway-key`}}export{EXTERNAL_PROVIDER_INSTRUCTIONS,EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE,PROVIDER_QUESTION,runProviderFlow};
1
+ import{appendEnv}from"../append-env.js";import{AI_GATEWAY_API_KEY_ENV_FILE,AI_GATEWAY_API_KEY_ENV_VAR,writeAiGatewayApiKey}from"../ai-gateway-api-key.js";import{withSpinner}from"../with-spinner.js";import{getVercelAuthStatus,vercelAuthBlockerReason}from"../vercel-project.js";import{WizardCancelledError}from"../step.js";import{runLinkFlow}from"./link.js";import{validateGatewayApiKey}from"../validate-gateway-key.js";import{HumanActionRequiredError}from"#setup/human-action.js";const PROVIDER_QUESTION=`Which model provider do you want to use?`,EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE=`Using another model provider`,EXTERNAL_PROVIDER_INSTRUCTIONS=[`Set your provider's API key in ${AI_GATEWAY_API_KEY_ENV_FILE} — e.g. ANTHROPIC_API_KEY or OPENAI_API_KEY.`,'In agent/agent.ts, set `model` to a provider-authored model — e.g. `anthropic("claude-opus-4.8")` from `@ai-sdk/anthropic`.',`See https://eve.dev/docs/agent-config for details.`,"A running `eve dev` reloads env files automatically — no restart needed."];function projectConnectionOption(e,t){let n={value:`ai-gateway-project`,label:`AI Gateway via Project`,hint:`Authenticates with AI Gateway automatically
2
+ in a new or existing project. No keys to manage.`};if(e===`unavailable`)return{...n,hint:`Couldn't reach Vercel — select to retry`};if(t&&e===`logged-out`)return{...n,hint:`Log in to Vercel — select to retry`};if(t&&e===`cli-missing`)return{...n,hint:`Install the Vercel CLI — select to retry`};let r=e===void 0?void 0:vercelAuthBlockerReason(e);return r===void 0?n:{...n,disabled:!0,disabledReason:r,disabledReasonTone:`warning`}}function providerOptions(e,t,r,i){let a=projectConnectionOption(e,i);r&&t===`ai-gateway-project`&&e!==`unavailable`&&!(i&&(e===`logged-out`||e===`cli-missing`))&&(a={...a,checked:!0,hint:`Current`});let o={value:`ai-gateway-key`,label:`AI Gateway via ${AI_GATEWAY_API_KEY_ENV_VAR}`,hint:`⎿ type your key`};return r&&t===`ai-gateway-key`&&(o={...o,checked:!0,hint:`Current`}),[a,o,{value:`chatgpt`,label:`ChatGPT subscription`,hint:r&&t===`chatgpt`?`Current`:`Authenticate through the Codex CLI`,checked:r&&t===`chatgpt`||void 0},{value:`external`,label:`Other providers`,hint:`Connect directly to a model provider
3
+ via OPENAI_API_KEY or ANTHROPIC_API_KEY.`}]}async function selectProvider(e){let t={message:PROVIDER_QUESTION,options:e.options,initialValue:e.initialValue,validateInlineKey:e.validateInlineKey};if(e.picker===void 0)throw Error(`The provider flow requires the Dev TUI provider picker.`);let n=await e.picker(t);if(n===void 0)throw new WizardCancelledError;return n}async function runProviderFlow(t){let{appRoot:n,prompter:o,signal:s}=t,c={getVercelAuthStatus,runLinkFlow,appendEnv,validateGatewayApiKey,...t.deps},l,{availableProviders:u,selectedProvider:d}=t,f=d,p;try{for(;;){let e=await selectProvider({picker:t.picker,options:providerOptions(l,d,t.selectionExplicit!==!1,t.recoverHumanAction!==void 0),initialValue:f,validateInlineKey:(e,t)=>c.validateGatewayApiKey(e,s===void 0?t:AbortSignal.any([s,t]))});if(e.kind===`external`)return o.acknowledge?await o.acknowledge({message:EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE,lines:EXTERNAL_PROVIDER_INSTRUCTIONS}):o.note(EXTERNAL_PROVIDER_INSTRUCTIONS.join(`
4
+ `),EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE),{kind:`external-provider`};if(e.kind===`chatgpt`)return e;if(e.kind===`ai-gateway-key`){p=e;break}if(d!==`ai-gateway-project`&&u.includes(`ai-gateway-project`))return e;for(;;){let e=await withSpinner(o,`Checking your Vercel login…`,()=>c.getVercelAuthStatus(n,{signal:s}));if(s?.throwIfAborted(),l=e,e===`authenticated`)break;let r=e===`cli-missing`?`vercel-cli-missing`:e===`logged-out`?`vercel-login`:void 0;if(r===void 0||t.recoverHumanAction===void 0){f=e===`unavailable`?`ai-gateway-project`:`ai-gateway-key`;break}if(await t.recoverHumanAction(new HumanActionRequiredError({kind:r,command:e===`cli-missing`?`npm i -g vercel@latest`:`vercel login`,reason:e===`cli-missing`?`AI Gateway via Project requires the Vercel CLI.`:`AI Gateway via Project requires a Vercel login.`}))===`cancel`){f=`ai-gateway-project`;break}}if(l===`authenticated`)for(;;)try{let e=await c.runLinkFlow({appRoot:n,prompter:o,signal:s,projectSelection:`create-or-link`});return e.kind===`cancelled`?e:{kind:`ai-gateway-project`}}catch(e){if(!(e instanceof HumanActionRequiredError)||t.recoverHumanAction===void 0)throw e;if(await t.recoverHumanAction(e)===`cancel`){f=`ai-gateway-key`;break}}}}catch(e){if(e instanceof WizardCancelledError)return{kind:`cancelled`};throw e}let m=p.key.trim(),h=p.validation;s?.throwIfAborted(),h.kind===`inconclusive`&&o.log.warning(`Couldn't reach the gateway to validate (${h.message}). Saving the key anyway.`);let g=await writeAiGatewayApiKey({projectRoot:n,apiKey:m,appendEnv:c.appendEnv});return o.log.success(`${g.envKey} set.`),{kind:`ai-gateway-key`}}export{EXTERNAL_PROVIDER_INSTRUCTIONS,EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE,PROVIDER_QUESTION,runProviderFlow};
@@ -7,27 +7,44 @@ export interface RegistrySessionDeps {
7
7
  runDeployFlow: typeof runDeployFlow;
8
8
  }
9
9
  export interface RegistrySessionItemResult {
10
- address: string;
11
10
  title: string;
12
11
  facts: readonly RegistrySetupFact[];
13
12
  output: readonly string[];
14
13
  }
14
+ /** An item the user chose to skip after its installation could not complete. */
15
+ export interface RegistrySessionItemFailure {
16
+ title: string;
17
+ /** User-facing installation error, including any actionable follow-up lines. */
18
+ message: string;
19
+ }
20
+ export type RegistrySessionOutcome = ({
21
+ kind: "installed";
22
+ } & RegistrySessionItemResult) | ({
23
+ kind: "failed";
24
+ } & RegistrySessionItemFailure) | {
25
+ kind: "cancelled";
26
+ title: string;
27
+ };
15
28
  export interface RegistrySessionResult {
16
- kind: "done";
17
- addedItems: readonly string[];
18
29
  items: readonly RegistrySessionItemResult[];
19
- facts: readonly RegistrySetupFact[];
20
- output: readonly string[];
30
+ /** Installation failures retained when a user skips an item. */
31
+ failures: readonly RegistrySessionItemFailure[];
32
+ /** Every item outcome in installation order. */
33
+ outcomes?: readonly RegistrySessionOutcome[];
34
+ /** Setup stopped outside an individual item after preserving settled results. */
35
+ cancelled?: true;
21
36
  deployed?: "production";
22
37
  }
23
38
  export interface RegistrySession {
24
- add(item: string, title: string, output: readonly string[], setup?: RegistrySetupCompletion): void;
39
+ add(title: string, output: readonly string[], setup?: RegistrySetupCompletion): void;
40
+ addFailure(title: string, message: string): void;
41
+ addCancellation(title: string): void;
25
42
  result(deployed?: "production"): RegistrySessionResult;
26
43
  continueAfterInstall(input: {
27
44
  appRoot: string;
28
45
  prompter: Prompter;
29
46
  signal?: AbortSignal;
30
- }): Promise<"add-more" | RegistrySessionResult>;
47
+ }): Promise<RegistrySessionResult>;
31
48
  }
32
49
  /** Owns the accumulated output and deployment decision for one `/add` session. */
33
50
  export declare function createRegistrySession(deps: RegistrySessionDeps): RegistrySession;
@@ -1 +1 @@
1
- import"./deploy.js";import"#setup/project-resolution.js";import{mergeRegistrySetupCompletions}from"#setup/registry-setup-completion.js";function createRegistrySession(t){let n=[],r=[],i=[],a={facts:[]},o=``,s=[];function result(e){let t={kind:`done`,addedItems:n,items:r,facts:a.facts,output:i};return e!==void 0&&(t.deployed=e),t}return{add(t,c,l,u={facts:[]}){n.push(t),r.push({address:t,title:c,facts:u.facts,output:l}),i.push(...l),o=c,s=u.facts,a=mergeRegistrySetupCompletions(a,u)},result,async continueAfterInstall(e){if(a.deploymentRequired!==!0)return result();let n=await t.detectDeployment(e.appRoot,{signal:e.signal}),r=n.state===`linked`||n.state===`deployed`;for(e.prompter.replaceContent?.({headline:`Added ${o}`,facts:s});;){let n=await e.prompter.select({message:`What would you like to do next?`,initialValue:`add-more`,hintLayout:`inline`,options:[{value:`add-more`,label:`Add more`},...r?[{value:`deploy`,label:`Deploy`}]:[],{value:`finish`,label:`Finish`}]});if(n===`add-more`)return e.prompter.replaceContent?.(),`add-more`;if(n===`finish`)return result();if(await e.prompter.select({message:`Deploy to prod?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`back`,label:`Back`}]})!==`back`)return result((await t.runDeployFlow({appRoot:e.appRoot,prompter:e.prompter,signal:e.signal,interactive:!0})).kind===`deployed`?`production`:void 0)}}}}export{createRegistrySession};
1
+ import"./deploy.js";import"#setup/project-resolution.js";function createRegistrySession(e){let t=[],n=!1;function result(e){let n={items:t.flatMap(e=>e.kind===`installed`?[{title:e.title,facts:e.facts,output:e.output}]:[]),failures:t.flatMap(e=>e.kind===`failed`?[{title:e.title,message:e.message}]:[])};return t.some(e=>e.kind!==`installed`)&&(n.outcomes=t),e!==void 0&&(n.deployed=e),n}return{add(e,r,i={facts:[]}){t.push({kind:`installed`,title:e,facts:i.facts,output:r}),n||=i.deploymentRequired===!0},addFailure(e,n){t.push({kind:`failed`,title:e,message:n})},addCancellation(e){t.push({kind:`cancelled`,title:e})},result,async continueAfterInstall(t){if(!n)return result();let r=await e.detectDeployment(t.appRoot,{signal:t.signal}),i=r.state===`linked`||r.state===`deployed`;for(t.prompter.replaceContent?.();;){if(await t.prompter.select({message:`What would you like to do next?`,initialValue:`finish`,hintLayout:`inline`,options:[...i?[{value:`deploy`,label:`Deploy`}]:[],{value:`finish`,label:`Start chatting`}]})===`finish`)return result();if(await t.prompter.select({message:`Deploy to prod?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`back`,label:`Back`}]})!==`back`)return result((await e.runDeployFlow({appRoot:t.appRoot,prompter:t.prompter,signal:t.signal,interactive:!0})).kind===`deployed`?`production`:void 0)}}}}export{createRegistrySession};
@@ -1,42 +1,48 @@
1
+ import type { RegistryCatalogItem } from "#cli/commands/registry.js";
1
2
  import type { Prompter } from "#setup/prompter.js";
2
- import { runDeployFlow } from "#setup/flows/deploy.js";
3
- import { detectDeployment } from "#setup/project-resolution.js";
4
- import type { RegistrySetupFact } from "#setup/registry-setup-protocol.js";
3
+ import { type RegistrySessionResult } from "./registry-session.js";
4
+ type Item = RegistryCatalogItem;
5
+ export interface RegistryPlannerContext {
6
+ /** Steps owned by an enclosing journey, rendered before the registry steps. */
7
+ prefixSteps?: readonly {
8
+ label: string;
9
+ complete?: boolean;
10
+ }[];
11
+ /** Facts owned by the enclosing journey, rendered before registry selections. */
12
+ reviewMetadata?: readonly {
13
+ label: string;
14
+ value: string;
15
+ }[];
16
+ reviewMessage?: string;
17
+ primaryActionLabel?: string;
18
+ emptyActionLabel?: string;
19
+ }
5
20
  export interface RegistryFlowDeps {
6
21
  browseRegistryCatalog: (typeof import("#cli/commands/registry.js"))["browseRegistryCatalog"];
7
- detectDeployment: typeof detectDeployment;
8
- getRegistryItemManifest: (typeof import("#cli/commands/registry.js"))["getRegistryItemManifest"];
9
22
  installRegistryItem: (typeof import("#cli/commands/registry.js"))["installRegistryItem"];
10
- runDeployFlow: typeof runDeployFlow;
23
+ detectDeployment: (typeof import("#setup/project-resolution.js"))["detectDeployment"];
24
+ runDeployFlow: (typeof import("./deploy.js"))["runDeployFlow"];
11
25
  }
12
- export type RegistryFlowResult = {
13
- kind: "done";
14
- addedItems: readonly string[];
15
- items: readonly import("./registry-session.js").RegistrySessionItemResult[];
16
- facts: readonly RegistrySetupFact[];
17
- output?: readonly string[];
18
- deployed?: "production";
19
- } | {
20
- kind: "cancelled";
21
- };
22
26
  export declare class RegistryFlowFailedError extends Error {
23
- readonly completed: Extract<RegistryFlowResult, {
24
- kind: "done";
25
- }>;
26
- constructor(error: unknown, completed: Extract<RegistryFlowResult, {
27
- kind: "done";
28
- }>);
27
+ readonly completed: RegistrySessionResult;
28
+ constructor(error: unknown, completed: RegistrySessionResult);
29
29
  }
30
- /**
31
- * Runs the categorized interactive registry catalog used by the dev TUI's
32
- * `/add`. `initialAddress` — `/add channel/slack` — skips the category and
33
- * search screens and opens that item's confirmation directly; backing out of it
34
- * lands on the same category hub the browser starts from.
35
- */
30
+ /** Collects a channel and integration plan, then installs every chosen item in order. */
36
31
  export declare function runRegistryFlow(input: {
37
32
  appRoot: string;
38
33
  prompter: Prompter;
39
34
  signal?: AbortSignal;
35
+ /** Registry item supplied by `/add <item>`, confirmed and installed directly. */
40
36
  initialAddress?: string;
37
+ plannerContext?: RegistryPlannerContext;
38
+ onItemStart?: (item: Item, index: number, total: number) => void;
39
+ /** Gives each installation its own cancellation boundary without ending the batch. */
40
+ runItem?<T>(task: (signal?: AbortSignal) => Promise<T>): Promise<T>;
41
41
  deps?: Partial<RegistryFlowDeps>;
42
- }): Promise<RegistryFlowResult>;
42
+ }): Promise<{
43
+ kind: "done";
44
+ result: RegistrySessionResult;
45
+ } | {
46
+ kind: "cancelled";
47
+ }>;
48
+ export {};
@@ -1 +1,2 @@
1
- import{createRegistrySession}from"./registry-session.js";import{z}from"#compiled/zod/index.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{WizardCancelledError}from"#setup/step.js";import{detectDeployment}from"#setup/project-resolution.js";import{withSpinner}from"#setup/with-spinner.js";const ADDRESS_PREFIX=`address:`,BACK=`action:back`,DONE=`action:done`,ALL=`category:all`,REGISTRY_CATEGORIES=[{value:`category:channel`,prefix:`channel/`,label:`Channels`,hint:`Where people talk to your agent — Web, Slack, Discord, Teams`,browseLabel:`Browse channels`},{value:`category:connection`,prefix:`connection/`,label:`MCP connections`,hint:`Connect services like Linear, Notion, GitHub, and Vercel`,browseLabel:`Browse MCP connections`},{value:`category:extension`,prefix:`extension/`,label:`Extensions`,hint:`Add browser automation, memory, and developer tools`,browseLabel:`Browse extensions`},{value:`category:memory`,prefix:`memory/`,label:`Memory providers`,hint:`Retain and recall scoped context across sessions`,browseLabel:`Browse memory providers`},{value:`category:instrumentation`,prefix:`instrumentation/`,label:`Observability`,hint:`Trace, evaluate, and monitor your agent`,browseLabel:`Browse observability integrations`}];var RegistryFlowFailedError=class extends Error{completed;constructor(e,t){super(e instanceof Error?e.message:String(e),{cause:e}),this.name=`RegistryFlowFailedError`,this.completed=t}};function itemLabel(e){return e.title===void 0?(e.name.split(`/`).at(-1)??e.name).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `):e.title}function itemRows(e){return e.map((e,t)=>({value:`item:${t}`,label:itemLabel(e),hint:e.description??e.type}))}function categoryRows(){return[...REGISTRY_CATEGORIES.map(e=>({value:e.value,label:e.label,hint:e.hint})),{value:ALL,label:`Browse all`,hint:`Search every integration or enter an item address`},{value:DONE,label:`Return to chat`,trailingAction:!0}]}function categoryFor(e){return REGISTRY_CATEGORIES.find(t=>t.value===e)}function itemsForCategory(e,t){if(t===ALL)return e;let n=categoryFor(t);return n===void 0?e:e.filter(e=>e.address.startsWith(n.prefix)||e.name.startsWith(n.prefix))}function stringArray(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function itemSource(e){if(e.startsWith(`@`))return e.split(`/`)[0]??e;if(/^https?:\/\//u.test(e))try{return new URL(e).host}catch{return e}return`Vercel`}function manifestRecord(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:{}}const RegistryDocumentationSchema=z.object({meta:z.object({eve:z.object({docs:z.string().min(1).optional()}).optional()}).optional()});function documentationLink(e){let t=RegistryDocumentationSchema.safeParse(e).data?.meta?.eve?.docs;if(t!==void 0)return t.startsWith(`/`)?`https://eve.dev${t}`:t}function summarizeDetails(e,t=3){let n=e.slice(0,t),r=e.length-n.length;return r>0?`${n.join(`, `)} … (+${r} more)`:n.join(`, `)}function environmentVariables(e){let t=e.envVars;return typeof t==`object`&&t&&!Array.isArray(t)?Object.keys(t):[]}function itemDetails(e,t){let n=[{label:`Source`,value:e.source}],r=[...stringArray(t.dependencies),...stringArray(t.devDependencies),...stringArray(t.registryDependencies)];r.length>0&&n.push({label:`Packages`,value:summarizeDetails(r)});let i=environmentVariables(t);i.length>0&&n.push({label:`Environment`,value:summarizeDetails(i)});let a=(Array.isArray(t.files)?t.files:[]).flatMap(e=>{if(typeof e!=`object`||!e||Array.isArray(e))return[];let t=e.target;return typeof t==`string`?[t]:[]});return a.length>0&&n.push({label:`Files`,value:summarizeDetails(a)}),n}async function inspectItem(e,t,n,r,i,o){let s=i??manifestRecord(await withSpinner(e,`Loading registry item…`,()=>t.getRegistryItemManifest(n,r.address)));for(;;){let i={message:typeof s.title==`string`?s.title:r.name,metadata:itemDetails(r,s),options:[{value:`add`,label:`Add to project`},{value:`back`,label:`Back`}]},a=typeof s.description==`string`?s.description:r.description;if(a!==void 0&&(i.description=a),await e.select(i)===`back`)return{kind:`back`};let c=e.log.spinner?.(`Installing ${itemLabel(r)} and dependencies…`);try{c?.stop();let install=()=>t.installRegistryItem(n,r.address,{silent:!0,prompter:e,signal:o}),i=await(e.withExclusiveTerminal?.(install)??install());return{kind:`added`,documentation:documentationLink(s),environment:environmentVariables(s),...i}}finally{c?.stop()}}}async function resolveAddressItem(e,t,n,r){let i=manifestRecord(await withSpinner(e,`Loading registry item…`,()=>t.getRegistryItemManifest(n,r))),o={address:r,name:typeof i.name==`string`?i.name:r,source:itemSource(r)};return typeof i.type==`string`&&(o.type=i.type),typeof i.description==`string`&&(o.description=i.description),{item:o,manifest:i}}async function offerItem(e,t,n,r,i){let a=await inspectItem(e.prompter,t,e.appRoot,r,i,e.signal);if(a.kind!==`added`)return;let o=[...a.output];a.environment!==void 0&&a.environment.length>0&&o.push(`Environment: ${a.environment.join(`, `)}`),a.documentation!==void 0&&o.push(`Setup: ${a.documentation}`),n.add(r.address,itemLabel(r),o,a.setup);let s=await n.continueAfterInstall({appRoot:e.appRoot,prompter:e.prompter,signal:e.signal});return s===`add-more`?void 0:s}async function runRegistryFlow(t){let l;(t.deps?.browseRegistryCatalog===void 0||t.deps.getRegistryItemManifest===void 0||t.deps.installRegistryItem===void 0)&&(l=await import(`#cli/commands/registry.js`));let u={browseRegistryCatalog:t.deps?.browseRegistryCatalog??l.browseRegistryCatalog,detectDeployment:t.deps?.detectDeployment??detectDeployment,getRegistryItemManifest:t.deps?.getRegistryItemManifest??l.getRegistryItemManifest,installRegistryItem:t.deps?.installRegistryItem??l.installRegistryItem,runDeployFlow:t.deps?.runDeployFlow??runDeployFlow},d=[],f=createRegistrySession(u),p=t.initialAddress?.trim(),m=p===``?void 0:p;try{for(;;){if(t.signal?.throwIfAborted(),m!==void 0){let e=m;m=void 0;let n=await resolveAddressItem(t.prompter,u,t.appRoot,e),r=await offerItem(t,u,f,n.item,n.manifest);if(r!==void 0)return r;continue}let e=await withSpinner(t.prompter,`Loading registry…`,()=>u.browseRegistryCatalog(t.appRoot));d=[...d,...e.errors.map(e=>({tone:`warning`,text:`${e.registry}: ${e.message}`}))];let n=await t.prompter.select({message:`Add an integration`,options:categoryRows(),hintLayout:`inline`,notices:d});if(d=[],n===DONE)return f.result();let r=itemsForCategory(e.items,n),i=itemRows(r);i.push({value:BACK,label:`Back`,trailingAction:!0});let l=await t.prompter.select({message:categoryFor(n)?.browseLabel??`Browse integrations`,options:i,search:!0,placeholder:`Search integrations or enter an item address`,searchAction:{label:e=>`Add “${e}”`,value:e=>`${ADDRESS_PREFIX}${e.trim()}`},hintLayout:`inline`});if(l===BACK)continue;let p=l.startsWith(ADDRESS_PREFIX)?await resolveAddressItem(t.prompter,u,t.appRoot,l.slice(8)):{item:r[Number(l.slice(5))]};if(p.item===void 0)throw Error(`The selected registry item is no longer available.`);let h=await offerItem(t,u,f,p.item,`manifest`in p?p.manifest:void 0);if(h!==void 0)return h}}catch(e){if(e instanceof WizardCancelledError)return{kind:`cancelled`};let t=f.result();throw t.addedItems.length>0?new RegistryFlowFailedError(e,t):e}}export{RegistryFlowFailedError,runRegistryFlow};
1
+ import{createRegistrySession}from"./registry-session.js";import{PlannerNavigationError}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{HumanActionRequiredError}from"#setup/human-action.js";import{withSpinner}from"#setup/with-spinner.js";const PLANNER_STEPS=[`Channels`,`Integrations`,`Review`];var RegistryFlowFailedError=class extends Error{completed;constructor(e,t){super(e instanceof Error?e.message:String(e),{cause:e}),this.name=`RegistryFlowFailedError`,this.completed=t}};const SECTIONS={channels:{title:`Where should people reach your agent?`,description:`You can add more later with /add.`,featured:[`channel/web`,`channel/slack`,`channel/github`,`channel/linear-agent`,`channel/photon-imessage`],includes:e=>e.name.startsWith(`channel/`)},integrations:{title:`What should your agent be able to work with?`,featured:[`extension/github-tools`,`connection/linear`,`connection/notion`,`connection/vercel`,`extension/agent-browser`,`experimental/self-modification`],includes:e=>!e.name.startsWith(`channel/`)}};function label(e){return e.title??e.name.split(`/`).at(-1)??e.name}function isPlannerItem(e,t){return t.name.includes(`/`)&&SECTIONS[e].includes(t)}function orderedSectionItems(e,t){let n=t.filter(t=>isPlannerItem(e,t)),r=SECTIONS[e].featured.map(e=>n.find(t=>t.name===e)).filter(e=>e!==void 0),i=new Set(r.map(e=>e.address));return[...r,...n.filter(e=>!i.has(e.address))]}function plannerLabel(e){return e.name===`connection/linear`?`Linear MCP`:label(e)}function sectionRows(e,t){return orderedSectionItems(e,t).map(e=>({value:e.address,label:plannerLabel(e),hint:e.description}))}function selectedInSection(e,t,n){return t.filter(t=>isPlannerItem(e,t)&&n.has(t.address)).map(e=>e.address)}function plannerNavigation(e,t){let n=(t.plannerContext?.prefixSteps??[]).map(e=>({label:e.label,complete:e.complete}));return{kind:`planner`,activeStep:n.length+e,firstNavigableStep:n.length,steps:[...n,...PLANNER_STEPS.map((e,n)=>{if(n===2)return{label:e};let r=selectedInSection(n===0?`channels`:`integrations`,t.catalog,t.selected).length;return r===0?{label:e}:{label:e,count:r}})]}}function replaceSectionSelection(e){for(let t of e.catalog)isPlannerItem(e.section,t)&&e.selected.delete(t.address);for(let t of e.addresses)e.selected.add(t)}async function editSection(e){let{section:n,catalog:r,prompter:i,selected:a}=e,s={message:SECTIONS[n].title,multiple:!0,search:!0,placeholder:n===`channels`?`Search channels`:`Search integrations`,navigation:plannerNavigation(n===`channels`?0:1,e),initialValues:selectedInSection(n,r,a),options:sectionRows(n,r)};n===`channels`&&(s.description=SECTIONS.channels.description),e.notices!==void 0&&(s.notices=e.notices);try{return replaceSectionSelection({section:n,catalog:r,selected:a,addresses:await i.select(s)}),`forward`}catch(e){if(!(e instanceof PlannerNavigationError))throw e;return replaceSectionSelection({section:n,catalog:r,selected:a,addresses:e.values.map(e=>{if(typeof e!=`string`)throw Error(`Registry planner returned a non-string item.`);return e})}),e.direction}}async function editPlan(e){let r=`channels`,i=e.notices;for(;;){if(r!==`review`){try{let t=await editSection({...e,section:r,notices:i});i=void 0,t===`back`?r===`integrations`&&(r=`channels`):r=r===`channels`?`integrations`:`review`}catch(e){if(!(e instanceof WizardCancelledError))throw e;return`cancelled`}continue}try{let t=e.selected.size>0,n=[...e.selected].map(t=>{let n=e.itemsByAddress.get(t);if(n===void 0)throw Error(`Registry item "${t}" is no longer available.`);return n}),r=n.filter(e=>e.name.startsWith(`channel/`)),a=n.filter(e=>!e.name.startsWith(`channel/`)),o=[...r.length===0?[]:[{label:`Channels`,value:r.map(label).join(`, `)}],...a.length===0?[]:[{label:`Integrations`,value:a.map(label).join(`, `)}]],s={message:e.plannerContext?.reviewMessage??`Review additions`,metadata:[...e.plannerContext?.reviewMetadata??[],...o],navigation:plannerNavigation(2,e),options:[{value:`install`,label:t?e.plannerContext?.primaryActionLabel??`Install and set up`:e.plannerContext?.emptyActionLabel??`Finish without adding`},{value:`back`,label:`Back`}]};t||(s.description=`No channels or integrations selected.`),i!==void 0&&(s.notices=i);let c=await e.prompter.select(s);if(i=void 0,c===`install`)return`install`}catch(e){if(e instanceof PlannerNavigationError&&e.direction===`back`){r=`integrations`;continue}if(!(e instanceof WizardCancelledError))throw e;return`cancelled`}r=`integrations`}}function hasSettledOutcomes(e){return e!==void 0&&(e.items.length>0||e.failures.length>0||e.outcomes!==void 0)}async function runRegistryFlow(t){let a;try{let o=t.initialAddress?.trim(),s;if(o!==void 0&&o!==``){if(await t.prompter.select({message:`Add ${o}?`,options:[{value:`install`,label:`Install and set up`},{value:`cancel`,label:`Cancel`}]})===`cancel`)return{kind:`cancelled`};s=[{address:o,name:o,source:`Registry`}]}else{let e=t.deps?.browseRegistryCatalog??(await import(`#cli/commands/registry.js`)).browseRegistryCatalog,n=await withSpinner(t.prompter,`Loading registry…`,()=>e(t.appRoot)),r=[...n.items],a=new Set,o=n.errors.map(e=>({tone:`warning`,text:`${e.registry}: ${e.message}`})),c=new Map(r.map(e=>[e.address,e]));if(await editPlan({prompter:t.prompter,catalog:r,itemsByAddress:c,selected:a,notices:o,plannerContext:t.plannerContext})!==`install`)return{kind:`cancelled`};s=[...a].map(e=>{let t=c.get(e);if(t===void 0)throw Error(`Registry item "${e}" is no longer available.`);return t})}let c=t.deps?.installRegistryItem??(await import(`#cli/commands/registry.js`)).installRegistryItem;a=createRegistrySession({detectDeployment:t.deps?.detectDeployment??(await import(`#setup/project-resolution.js`)).detectDeployment,runDeployFlow:t.deps?.runDeployFlow??(await import(`./deploy.js`)).runDeployFlow});let l=a;for(let[e,i]of s.entries()){t.signal?.throwIfAborted(),t.onItemStart?.(i,e,s.length);try{let install=(e=t.signal)=>c(t.appRoot,i.address,{silent:!0,prompter:t.prompter,signal:e}),run=()=>t.runItem===void 0?install():t.runItem(install),e=await(t.prompter.withExclusiveTerminal?.(run)??run());l.add(label(i),e.output,e.setup)}catch(e){if(t.signal?.throwIfAborted(),e instanceof WizardCancelledError){l.addCancellation(label(i));continue}if(e instanceof HumanActionRequiredError)throw e;let a=(e instanceof Error?e.message:String(e)).trim()||`Installation failed.`,o=a.split(`
2
+ `).find(e=>e.trim()!==``);l.addFailure(label(i),a);let s={message:`Couldn't add ${label(i)}`,options:[{value:`skip`,label:`Skip ${label(i)}`},{value:`cancel`,label:`Cancel setup`}]};if(o!==void 0&&(s.description=o),await t.prompter.select(s)===`cancel`)return{kind:`done`,result:{...l.result(),cancelled:!0}}}}return{kind:`done`,result:await l.continueAfterInstall({appRoot:t.appRoot,prompter:t.prompter,signal:t.signal})}}catch(e){if(e instanceof WizardCancelledError){let e=a?.result();return hasSettledOutcomes(e)?{kind:`done`,result:{...e,cancelled:!0}}:{kind:`cancelled`}}let t=a?.result();throw hasSettledOutcomes(t)?new RegistryFlowFailedError(e,t):e}}export{RegistryFlowFailedError,runRegistryFlow};
@@ -1,11 +1,9 @@
1
1
  import { detectPackageManager } from "#setup/package-manager.js";
2
2
  import { ensureChannel } from "#setup/scaffold/index.js";
3
- import { installScaffoldDependencies } from "../shared/scaffold.js";
4
3
  import { type SetupApplyContext, type SetupPrepareContext } from "../types.js";
5
4
  export interface WebSetupDeps {
6
5
  detectPackageManager: typeof detectPackageManager;
7
6
  ensureChannel: typeof ensureChannel;
8
- installScaffoldDependencies: typeof installScaffoldDependencies;
9
7
  }
10
8
  export interface WebSetupPlan {
11
9
  configureVercelServices: boolean;
@@ -1 +1 @@
1
- import{defineSetupIntegration}from"../types.js";import{installScaffoldDependencies,reportOverwrittenFiles}from"../shared/scaffold.js";import{ensureChannel}from"#setup/scaffold/index.js";import{formatNodeEngineOverrideWarning}from"#setup/node-engine.js";import{detectPackageManager}from"#setup/package-manager.js";function reportCompetingNextConfigFiles(e,t){for(let n of t??[])e.warning(`Found competing Next.js config at ${n}; merge any needed settings into next.config.ts and remove it before starting the preview, or Next.js may ignore the generated eve rewrite.`)}const defaultDeps={detectPackageManager,ensureChannel,installScaffoldDependencies};async function prepareWebSetup(e,t=defaultDeps){return{packageManager:(await t.detectPackageManager(e.appRoot)).kind,configureVercelServices:e.environment.vercel.kind===`available`}}async function applyWebSetup(e,t,r=defaultDeps){t.presenter.log.message(`Scaffolding Web Chat channel files...`);let i={projectRoot:t.appRoot,kind:`web`,packageManager:e.packageManager,configureVercelServices:e.configureVercelServices,force:t.force,skipDependencyMutation:!0},a=await r.ensureChannel(i);return reportOverwrittenFiles(t.presenter.log,a.filesOverwritten),a.kind===`web`&&a.action!==`skipped`&&a.nodeEngineOverride!==void 0&&t.presenter.log.warning(formatNodeEngineOverrideWarning(a.nodeEngineOverride)),reportCompetingNextConfigFiles(t.presenter.log,`competingNextConfigFiles`in a?a.competingNextConfigFiles:void 0),a.action===`skipped`?(t.presenter.log.info(`Next.js project detected. Skipping Web Chat scaffolding.`),{facts:[]}):(t.presenter.log.success(`Scaffolded channel: web`),await r.installScaffoldDependencies({changed:a.packageJsonUpdated.length>0,log:t.presenter.log,projectPath:t.appRoot,signal:t.signal}),{facts:[],deploymentRequired:!0})}const WEB_SETUP=defineSetupIntegration({kind:`web`,label:`Web Chat`,hint:`Browser-based chat interface`,prepare:prepareWebSetup,apply:applyWebSetup});export{WEB_SETUP,applyWebSetup,prepareWebSetup};
1
+ import{defineSetupIntegration}from"../types.js";import{reportOverwrittenFiles}from"../shared/scaffold.js";import{ensureChannel}from"#setup/scaffold/index.js";import{formatNodeEngineOverrideWarning}from"#setup/node-engine.js";import{detectPackageManager}from"#setup/package-manager.js";function reportCompetingNextConfigFiles(e,t){for(let n of t??[])e.warning(`Found competing Next.js config at ${n}; merge any needed settings into next.config.ts and remove it before starting the preview, or Next.js may ignore the generated eve rewrite.`)}const defaultDeps={detectPackageManager,ensureChannel};async function prepareWebSetup(e,t=defaultDeps){return{packageManager:(await t.detectPackageManager(e.appRoot)).kind,configureVercelServices:e.environment.vercel.kind===`available`}}async function applyWebSetup(e,n,r=defaultDeps){n.presenter.log.message(`Scaffolding Web Chat channel files...`);let i={projectRoot:n.appRoot,kind:`web`,packageManager:e.packageManager,configureVercelServices:e.configureVercelServices,force:n.force,skipDependencyMutation:!0},a=await r.ensureChannel(i);return reportOverwrittenFiles(n.presenter.log,a.filesOverwritten),a.kind===`web`&&a.action!==`skipped`&&a.nodeEngineOverride!==void 0&&n.presenter.log.warning(formatNodeEngineOverrideWarning(a.nodeEngineOverride)),reportCompetingNextConfigFiles(n.presenter.log,`competingNextConfigFiles`in a?a.competingNextConfigFiles:void 0),a.action===`skipped`?(n.presenter.log.info(`Next.js project detected. Skipping Web Chat scaffolding.`),{facts:[]}):(n.presenter.log.success(`Scaffolded channel: web`),{facts:[],deploymentRequired:!0})}const WEB_SETUP=defineSetupIntegration({kind:`web`,label:`Web Chat`,hint:`Browser-based chat interface`,prepare:prepareWebSetup,apply:applyWebSetup});export{WEB_SETUP,applyWebSetup,prepareWebSetup};
@@ -68,6 +68,24 @@ export interface SelectMetadata {
68
68
  label: string;
69
69
  value: string;
70
70
  }
71
+ /** Directional transition requested from a batch-planner step. */
72
+ export declare class PlannerNavigationError extends Error {
73
+ readonly direction: "back" | "forward";
74
+ readonly values: readonly PrompterValue[];
75
+ constructor(direction: "back" | "forward", values: readonly PrompterValue[]);
76
+ }
77
+ /** Progress rail and directional controls for a multi-step picker. */
78
+ export interface PlannerNavigation {
79
+ kind: "planner";
80
+ activeStep: number;
81
+ /** Earliest step reachable with Left Arrow; defaults to the first step. */
82
+ firstNavigableStep?: number;
83
+ steps: readonly {
84
+ label: string;
85
+ count?: number;
86
+ complete?: boolean;
87
+ }[];
88
+ }
71
89
  /** Options common to every {@link Prompter.select} call. */
72
90
  export interface SelectCommonOptions<T extends PrompterValue> {
73
91
  message: string;
@@ -92,14 +110,16 @@ export interface SelectCommonOptions<T extends PrompterValue> {
92
110
  /**
93
111
  * How option hints are laid out in the dev TUI panel (the CLI prompter ignores
94
112
  * it and keeps its default inline, unnumbered rendering). "stacked" renders
95
- * each hint on its own line below the label with a blank line between options —
96
- * for small action menus whose hints carry current values. "inline" keeps hints
97
- * on the label row, suppresses numeric shortcuts, and separates the trailing
98
- * completion action (e.g. the `/add` task list).
113
+ * each hint on its own line below the label with a blank line between options;
114
+ * it works for both action menus and checklists. "inline" keeps hints on the
115
+ * label row, suppresses numeric shortcuts, and separates a trailing completion
116
+ * action.
99
117
  */
100
118
  hintLayout?: "stacked" | "inline";
101
119
  /** Outcome lines from earlier laps of a looping menu. */
102
120
  notices?: readonly SelectNotice[];
121
+ /** Optional batch-planner navigation grammar. */
122
+ navigation?: PlannerNavigation;
103
123
  }
104
124
  /** A selectable action appended after local matches for a non-empty query. */
105
125
  export interface SearchAction<T extends PrompterValue> {
@@ -1 +1 @@
1
- import{TextPrompt as ht,isCancel as q,settings as h}from"../node_modules/.pnpm/@clack_core@1.3.1/node_modules/@clack/core/dist/index.js";import{WizardCancelledError}from"./step.js";import{initialQuitGuardState,quitHintNote,reduceQuitGuard}from"./quit-guard.js";import pc from"#compiled/picocolors/index.js";import{cornerFor,createRailLog,formatPromptCancellation,formatPromptHeader,formatPromptOpener,formatPromptOutro,formatPromptSubmission,formatRailLine,railFor,runSelectComponent}from"#setup/cli/index.js";function guardCancel(e){if(q(e))throw process.stdout.write(formatPromptCancellation(`Setup cancelled.`,pc)),new WizardCancelledError;return e}let escapeCancelDisabled=!1;function disableEscapeCancel(){escapeCancelDisabled||=(h.aliases.delete(`escape`),!0)}function attachQuitGuard(e){let t=initialQuitGuardState;return e.on(`key`,(n,r)=>{let{state:i,action:a}=reduceQuitGuard(t,r?.name===`escape`?{type:`escape`}:{type:`other-key`});t=i,a===`quit`&&(e.state=`cancel`)}),{note:()=>quitHintNote(t,pc)}}function toPromptState(e){return e}function railForState(e){return railFor(toPromptState(e),pc)}function cornerForState(e){return cornerFor(toPromptState(e),pc)}function header(e,t,n){return formatPromptHeader(toPromptState(e),t,{colors:pc,leadingRail:n===0?`white`:`green`})}const REDACTED_DISPLAY=`••••••••`;function textPrompt(t,n){let r,i=new ht({validate:n.validate?e=>n.validate?.(e??``):void 0,placeholder:n.placeholder,defaultValue:n.defaultValue,initialValue:n.defaultValue,render(){let e=header(this.state,n.message,t),i=n.placeholder?pc.inverse(n.placeholder[0])+pc.dim(n.placeholder.slice(1)):pc.inverse(pc.hidden(`_`)),a=this.value?`•`.repeat(this.value.length):i,o=i;switch(n.mask?o=a:this.value&&(o=this.userInputWithCursor),this.state){case`error`:return`${e.trim()}\n${railForState(this.state)} ${o}\n${cornerForState(this.state)} ${pc.red(this.error)}\n`;case`submit`:{let e=this.value||n.placeholder||``;return n.mask&&(e=this.value?REDACTED_DISPLAY:n.placeholder??``),formatPromptSubmission(this.state,n.message,e,{colors:pc,leadingRail:t===0?`white`:`green`})}case`cancel`:return`${e}${railForState(this.state)} ${pc.strikethrough(pc.dim(n.mask&&this.value?REDACTED_DISPLAY:this.value??``))}${this.value?.trim()?`\n${railForState(this.state)}`:``}`;default:return`${e}${railForState(this.state)} ${o}\n${cornerForState(this.state)}${cornerNote(r?.note())}\n`}}});return r=attachQuitGuard(i),i.prompt()}function cornerNote(e){return e?` ${e}`:``}function createPrompter(){disableEscapeCancel();let e=0,t=createRailLog({colors:pc,output:process.stdout});function printNotices(e){for(let n of e??[])n.tone===`success`?t.success(n.text):n.tone===`warning`?t.warning(n.text):n.tone===`error`?t.error(n.text):t.message(n.text)}return{async text(n){t.settle(),printNotices(n.notices);let r=guardCancel(await textPrompt(e,n));return e+=1,r??``},async password(n){t.settle();let r=guardCancel(await textPrompt(e,{message:n.message,mask:!0,validate:n.validate}));return e+=1,r??``},async select(n){t.settle(),printNotices(n.notices),n.description!==void 0&&process.stdout.write(formatRailLine(pc.dim(n.description),pc,process.stdout));for(let{label:e,value:t}of n.metadata??[])process.stdout.write(formatRailLine(`${pc.dim(`${e}:`)} ${t}`,pc,process.stdout));let r=guardCancel(await runSelectComponent({message:n.message,options:n.options,multiple:n.multiple===!0,search:n.search??!1,searchAction:n.multiple===!0?void 0:n.searchAction,required:n.required??!1,placeholder:n.placeholder,defaultValue:n.multiple===!0?void 0:n.initialValue,initialValues:n.multiple===!0?n.initialValues:void 0,leadingRail:e===0?`white`:`green`,attachGuard:e=>attachQuitGuard(e)}));return e+=1,r},async acknowledge(e){t.settle(),process.stdout.write(formatRailLine(pc.bold(e.message),pc,process.stdout));for(let t of e.lines??[])process.stdout.write(formatRailLine(pc.dim(t),pc,process.stdout))},note(e,n,r){t.settle();let i=r?.tone===`success`?pc.green:pc.red;n&&process.stdout.write(formatRailLine(i(pc.bold(n)),pc,process.stdout)),process.stdout.write(formatRailLine(i(e),pc,process.stdout))},intro(e,n=`Production-grade agent framework.`){t.settle(),process.stdout.write(formatPromptOpener(e,n,pc))},outro(e){t.settle(),process.stdout.write(formatPromptOutro(e,pc))},log:t}}export{createPrompter};
1
+ import{TextPrompt as ht,isCancel as q,settings as h}from"../node_modules/.pnpm/@clack_core@1.3.1/node_modules/@clack/core/dist/index.js";import{WizardCancelledError}from"./step.js";import{initialQuitGuardState,quitHintNote,reduceQuitGuard}from"./quit-guard.js";import pc from"#compiled/picocolors/index.js";import{cornerFor,createRailLog,formatPromptCancellation,formatPromptHeader,formatPromptOpener,formatPromptOutro,formatPromptSubmission,formatRailLine,railFor,runSelectComponent}from"#setup/cli/index.js";var PlannerNavigationError=class extends Error{direction;values;constructor(e,t){super(`Planner requested ${e} navigation.`),this.name=`PlannerNavigationError`,this.direction=e,this.values=t}};function guardCancel(e){if(q(e))throw process.stdout.write(formatPromptCancellation(`Setup cancelled.`,pc)),new WizardCancelledError;return e}let escapeCancelDisabled=!1;function disableEscapeCancel(){escapeCancelDisabled||=(h.aliases.delete(`escape`),!0)}function attachQuitGuard(e){let t=initialQuitGuardState;return e.on(`key`,(n,r)=>{let{state:i,action:a}=reduceQuitGuard(t,r?.name===`escape`?{type:`escape`}:{type:`other-key`});t=i,a===`quit`&&(e.state=`cancel`)}),{note:()=>quitHintNote(t,pc)}}function toPromptState(e){return e}function railForState(e){return railFor(toPromptState(e),pc)}function cornerForState(e){return cornerFor(toPromptState(e),pc)}function header(e,t,n){return formatPromptHeader(toPromptState(e),t,{colors:pc,leadingRail:n===0?`white`:`green`})}const REDACTED_DISPLAY=`••••••••`;function textPrompt(t,n){let r,i=new ht({validate:n.validate?e=>n.validate?.(e??``):void 0,placeholder:n.placeholder,defaultValue:n.defaultValue,initialValue:n.defaultValue,render(){let e=header(this.state,n.message,t),i=n.placeholder?pc.inverse(n.placeholder[0])+pc.dim(n.placeholder.slice(1)):pc.inverse(pc.hidden(`_`)),a=this.value?`•`.repeat(this.value.length):i,o=i;switch(n.mask?o=a:this.value&&(o=this.userInputWithCursor),this.state){case`error`:return`${e.trim()}\n${railForState(this.state)} ${o}\n${cornerForState(this.state)} ${pc.red(this.error)}\n`;case`submit`:{let e=this.value||n.placeholder||``;return n.mask&&(e=this.value?REDACTED_DISPLAY:n.placeholder??``),formatPromptSubmission(this.state,n.message,e,{colors:pc,leadingRail:t===0?`white`:`green`})}case`cancel`:return`${e}${railForState(this.state)} ${pc.strikethrough(pc.dim(n.mask&&this.value?REDACTED_DISPLAY:this.value??``))}${this.value?.trim()?`\n${railForState(this.state)}`:``}`;default:return`${e}${railForState(this.state)} ${o}\n${cornerForState(this.state)}${cornerNote(r?.note())}\n`}}});return r=attachQuitGuard(i),i.prompt()}function cornerNote(e){return e?` ${e}`:``}function createPrompter(){disableEscapeCancel();let e=0,t=createRailLog({colors:pc,output:process.stdout});function printNotices(e){for(let n of e??[])n.tone===`success`?t.success(n.text):n.tone===`warning`?t.warning(n.text):n.tone===`error`?t.error(n.text):t.message(n.text)}return{async text(n){t.settle(),printNotices(n.notices);let r=guardCancel(await textPrompt(e,n));return e+=1,r??``},async password(n){t.settle();let r=guardCancel(await textPrompt(e,{message:n.message,mask:!0,validate:n.validate}));return e+=1,r??``},async select(n){t.settle(),printNotices(n.notices),n.description!==void 0&&process.stdout.write(formatRailLine(pc.dim(n.description),pc,process.stdout));for(let{label:e,value:t}of n.metadata??[])process.stdout.write(formatRailLine(`${pc.dim(`${e}:`)} ${t}`,pc,process.stdout));let r=guardCancel(await runSelectComponent({message:n.message,options:n.options,multiple:n.multiple===!0,search:n.search??!1,searchAction:n.multiple===!0?void 0:n.searchAction,required:n.required??!1,placeholder:n.placeholder,defaultValue:n.multiple===!0?void 0:n.initialValue,initialValues:n.multiple===!0?n.initialValues:void 0,leadingRail:e===0?`white`:`green`,attachGuard:e=>attachQuitGuard(e)}));return e+=1,r},async acknowledge(e){t.settle(),process.stdout.write(formatRailLine(pc.bold(e.message),pc,process.stdout));for(let t of e.lines??[])process.stdout.write(formatRailLine(pc.dim(t),pc,process.stdout))},note(e,n,r){t.settle();let i=r?.tone===`success`?pc.green:pc.red;n&&process.stdout.write(formatRailLine(i(pc.bold(n)),pc,process.stdout)),process.stdout.write(formatRailLine(i(e),pc,process.stdout))},intro(e,n=`Production-grade agent framework.`){t.settle(),process.stdout.write(formatPromptOpener(e,n,pc))},outro(e){t.settle(),process.stdout.write(formatPromptOutro(e,pc))},log:t}}export{PlannerNavigationError,createPrompter};
@@ -1 +1 @@
1
- import{connectionEntries,connectionProtocols}from"../../../packages/eve-catalog/src/index.js";const SUPPORTED_PROTOCOLS=[`mcp`],CUSTOM_CONNECTION_SLUG=`custom`,CONNECTION_AUTH={linear:{kind:`connect`,connector:`linear`,service:`mcp.linear.app`},notion:{kind:`connect`,connector:`notion`,service:`mcp.notion.com`},datadog:{kind:`connect`,connector:`datadog`,service:`mcp.datadoghq.com`},honeycomb:{kind:`connect`,connector:`honeycomb`,service:`mcp.honeycomb.io`}};function buildCatalogEntry(e,n,r){let i=CONNECTION_AUTH[e];if(i===void 0)throw Error(`Connection "${e}" is in the catalog but has no scaffolder auth overlay.`);let a={slug:e,label:n,protocols:connectionProtocols(r),description:r.description,auth:i};return r.mcp&&(a.mcp={url:r.mcp.url}),r.openapi&&(a.openapi={spec:r.openapi.spec,baseUrl:r.openapi.baseUrl}),a}const CONNECTION_CATALOG=connectionEntries().filter(e=>e.surfaces.scaffoldable).map(e=>{if(e.connection===void 0)throw Error(`Catalog connection "${e.slug}" is missing its connection identity.`);return buildCatalogEntry(e.slug,e.name,e.connection)}),CATALOG_BY_SLUG=new Map(CONNECTION_CATALOG.map(e=>[e.slug,e]));function getCatalogEntry(e){return CATALOG_BY_SLUG.get(e)}function catalogSlugs(){return CONNECTION_CATALOG.map(e=>e.slug)}function effectiveProtocols(e){let t=e===void 0||e.length===0?SUPPORTED_PROTOCOLS:e;return SUPPORTED_PROTOCOLS.filter(e=>t.includes(e))}const CONNECTION_SLUG_PATTERN=/^[a-z][a-z0-9-]{0,63}$/;function isValidConnectionSlug(e){return CONNECTION_SLUG_PATTERN.test(e)}function connectorServiceForEntry(e){if(e.auth.kind===`connect`)return e.auth.service?e.auth.service:mcpServiceHost(e.mcp?.url)}function canonicalConnectorNameForEntry(e){if(e.auth?.kind!==`connect`)return;let t=e.auth.connector.trim();return t.length>0?t:void 0}function mcpServiceHost(e){if(e)try{return new URL(e).host||void 0}catch{return}}function endpointForProtocol(e,t){return t===`mcp`?e.mcp??null:e.openapi??null}export{CONNECTION_CATALOG,CUSTOM_CONNECTION_SLUG,SUPPORTED_PROTOCOLS,canonicalConnectorNameForEntry,catalogSlugs,connectorServiceForEntry,effectiveProtocols,endpointForProtocol,getCatalogEntry,isValidConnectionSlug,mcpServiceHost};
1
+ import{connectionEntries,connectionProtocols}from"../../../packages/eve-catalog/src/index.js";const SUPPORTED_PROTOCOLS=[`mcp`],CUSTOM_CONNECTION_SLUG=`custom`,CONNECTION_AUTH={"browser-use":{kind:`header`,headers:[{header:`x-browser-use-api-key`,envVar:`BROWSER_USE_API_KEY`}]},linear:{kind:`connect`,connector:`linear`,service:`mcp.linear.app`},notion:{kind:`connect`,connector:`notion`,service:`mcp.notion.com`},datadog:{kind:`connect`,connector:`datadog`,service:`mcp.datadoghq.com`},honeycomb:{kind:`connect`,connector:`honeycomb`,service:`mcp.honeycomb.io`}};function buildCatalogEntry(e,n,r){let i=CONNECTION_AUTH[e];if(i===void 0)throw Error(`Connection "${e}" is in the catalog but has no scaffolder auth overlay.`);let a={slug:e,label:n,protocols:connectionProtocols(r),description:r.description,auth:i};return r.mcp&&(a.mcp={url:r.mcp.url}),r.openapi&&(a.openapi={spec:r.openapi.spec,baseUrl:r.openapi.baseUrl}),a}const CONNECTION_CATALOG=connectionEntries().filter(e=>e.surfaces.scaffoldable).map(e=>{if(e.connection===void 0)throw Error(`Catalog connection "${e.slug}" is missing its connection identity.`);return buildCatalogEntry(e.slug,e.name,e.connection)}),CATALOG_BY_SLUG=new Map(CONNECTION_CATALOG.map(e=>[e.slug,e]));function getCatalogEntry(e){return CATALOG_BY_SLUG.get(e)}function catalogSlugs(){return CONNECTION_CATALOG.map(e=>e.slug)}function effectiveProtocols(e){let t=e===void 0||e.length===0?SUPPORTED_PROTOCOLS:e;return SUPPORTED_PROTOCOLS.filter(e=>t.includes(e))}const CONNECTION_SLUG_PATTERN=/^[a-z][a-z0-9-]{0,63}$/;function isValidConnectionSlug(e){return CONNECTION_SLUG_PATTERN.test(e)}function connectorServiceForEntry(e){if(e.auth.kind===`connect`)return e.auth.service?e.auth.service:mcpServiceHost(e.mcp?.url)}function canonicalConnectorNameForEntry(e){if(e.auth?.kind!==`connect`)return;let t=e.auth.connector.trim();return t.length>0?t:void 0}function mcpServiceHost(e){if(e)try{return new URL(e).host||void 0}catch{return}}function endpointForProtocol(e,t){return t===`mcp`?e.mcp??null:e.openapi??null}export{CONNECTION_CATALOG,CUSTOM_CONNECTION_SLUG,SUPPORTED_PROTOCOLS,canonicalConnectorNameForEntry,catalogSlugs,connectorServiceForEntry,effectiveProtocols,endpointForProtocol,getCatalogEntry,isValidConnectionSlug,mcpServiceHost};
@@ -1,4 +1,4 @@
1
- import{pinnedNodeEngineMajor}from"../../node-engine.js";import{parseChatGptModelSelection}from"../../../shared/chatgpt-model.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{blockingCreateInPlaceEntries}from"../create-in-place.js";import{resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{mkdir,readdir,stat}from"node:fs/promises";import{basename,join,resolve}from"node:path";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,DEFAULT_AI_PACKAGE_VERSION=`^7.0.82`,DEFAULT_CONNECT_PACKAGE_VERSION=`1.0.0`,DEFAULT_ZOD_PACKAGE_VERSION=`4.5.4`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.47.7`,nodeEngine:`>=24`};function resolveEvePackageContract(e=DEFAULT_EVE_PACKAGE_CONTRACT){return{version:resolveVersionToken(`evePackage.version`,e.version),nodeEngine:resolveVersionToken(`evePackage.nodeEngine`,e.nodeEngine)}}function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e,t){return{"agent/agent.ts":renderAgentTemplate(e,t),"agent/channels/eve.ts":WEB_APP_TEMPLATE_FILES[`agent/channels/eve.ts`],"agent/instructions.md":AGENT_INSTRUCTIONS_TEMPLATE}}function renderAgentTemplate(e,n){let r=parseChatGptModelSelection(e);return r===void 0?BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(n)):`import { defineAgent } from "eve";\nimport { chatgpt } from "eve/models/openai";\n\nexport default defineAgent({\n model: chatgpt(${JSON.stringify(r)}),\n${reasoningTemplateLine(n)}});\n`}function reasoningTemplateLine(e){return e===void 0||e===`provider-default`?``:` reasoning: "${e}",\n`}function renderTemplate(e,n){return e===BASE_AGENT_TEMPLATE&&parseChatGptModelSelection(n.model)!==void 0?renderAgentTemplate(n.model,n.reasoning):e.replaceAll(`__EVE_INIT_APP_NAME__`,n.appName).replaceAll(`__EVE_INIT_MODEL__`,n.model).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(n.reasoning)).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(n.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(n.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(n.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,n.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,n.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,n.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,n.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,n.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,n.nodeEngine)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
1
+ import{pinnedNodeEngineMajor}from"../../node-engine.js";import{parseChatGptModelSelection}from"../../../shared/chatgpt-model.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{blockingCreateInPlaceEntries}from"../create-in-place.js";import{resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{mkdir,readdir,stat}from"node:fs/promises";import{basename,join,resolve}from"node:path";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,DEFAULT_AI_PACKAGE_VERSION=`^7.0.82`,DEFAULT_CONNECT_PACKAGE_VERSION=`1.0.0`,DEFAULT_ZOD_PACKAGE_VERSION=`4.5.4`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.49.0`,nodeEngine:`>=24`};function resolveEvePackageContract(e=DEFAULT_EVE_PACKAGE_CONTRACT){return{version:resolveVersionToken(`evePackage.version`,e.version),nodeEngine:resolveVersionToken(`evePackage.nodeEngine`,e.nodeEngine)}}function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e,t){return{"agent/agent.ts":renderAgentTemplate(e,t),"agent/channels/eve.ts":WEB_APP_TEMPLATE_FILES[`agent/channels/eve.ts`],"agent/instructions.md":AGENT_INSTRUCTIONS_TEMPLATE}}function renderAgentTemplate(e,n){let r=parseChatGptModelSelection(e);return r===void 0?BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(n)):`import { defineAgent } from "eve";\nimport { chatgpt } from "eve/models/openai";\n\nexport default defineAgent({\n model: chatgpt(${JSON.stringify(r)}),\n${reasoningTemplateLine(n)}});\n`}function reasoningTemplateLine(e){return e===void 0||e===`provider-default`?``:` reasoning: "${e}",\n`}function renderTemplate(e,n){return e===BASE_AGENT_TEMPLATE&&parseChatGptModelSelection(n.model)!==void 0?renderAgentTemplate(n.model,n.reasoning):e.replaceAll(`__EVE_INIT_APP_NAME__`,n.appName).replaceAll(`__EVE_INIT_MODEL__`,n.model).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(n.reasoning)).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(n.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(n.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(n.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,n.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,n.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,n.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,n.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,n.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,n.nodeEngine)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
2
2
 
3
3
  export default defineAgent({
4
4
  model: "__EVE_INIT_MODEL__",
@@ -77,7 +77,7 @@ eve deploy
77
77
  "target": "ES2022",
78
78
  "module": "esnext",
79
79
  "moduleResolution": "bundler",
80
- "types": ["node"],
80
+ "types": ["node", "eve/workflow-modules"],
81
81
  "strict": true,
82
82
  "esModuleInterop": true,
83
83
  "skipLibCheck": true,
Binary file
@@ -20,5 +20,11 @@ export type PendingTaskControlAction = PendingDispatchAction & {
20
20
  readonly kind: "task-cancel" | "task-update";
21
21
  }>;
22
22
  };
23
+ /** Pending action that runs a tool's execute body as a durable workflow. */
24
+ export type PendingWorkflowToolAction = PendingDispatchAction & {
25
+ readonly target: Extract<PreparedDispatchTarget, {
26
+ readonly kind: "workflow-tool-call";
27
+ }>;
28
+ };
23
29
  /** Fields common to task-control dispatch and its result projection helpers. */
24
30
  export type TaskControlInvocation = Pick<PendingDispatchAction, "callId" | "input" | "toolName">;
@@ -0,0 +1,28 @@
1
+ import type { ChannelAudience } from "#shared/channel-audience.js";
2
+ import type { InstrumentationDecision } from "#shared/instrumentation-decision.js";
3
+ export declare const FAIL_CLOSED_FORWARDED_TRACE_ASSERTION: ForwardedTraceAssertion;
4
+ export interface TraceContentCeiling {
5
+ readonly recordInputs: boolean;
6
+ readonly recordOutputs: boolean;
7
+ }
8
+ export interface ForwardedTraceAssertion {
9
+ readonly ceiling: TraceContentCeiling;
10
+ readonly originAudience: ChannelAudience;
11
+ }
12
+ export interface ResolvedForwardedTraceState {
13
+ readonly decision?: InstrumentationDecision;
14
+ readonly forwardedTracePolicy?: ForwardedTraceAssertion;
15
+ readonly traceFlags: number;
16
+ }
17
+ export interface ForwardedTraceSeedState {
18
+ readonly decision?: unknown;
19
+ readonly forwardedTracePolicy?: unknown;
20
+ readonly traceFlags: number;
21
+ }
22
+ export declare function decisionToTraceContentCeiling(value: unknown): TraceContentCeiling | undefined;
23
+ export declare function traceContentCeilingToDecision(ceiling: TraceContentCeiling): InstrumentationDecision;
24
+ export declare function formatTraceContentCeiling(ceiling: TraceContentCeiling): string;
25
+ /** Applies a distinct live delivery audience without re-capping callback or origin delivery. */
26
+ export declare function applyLiveDeliveryAudienceCeiling(decision: InstrumentationDecision, liveAudience: ChannelAudience, forwardedTracePolicy: ForwardedTraceAssertion | undefined): InstrumentationDecision;
27
+ export declare function readForwardedTraceAssertion(value: unknown): ForwardedTraceAssertion | undefined;
28
+ export declare function resolveForwardedTraceSeed(seed: ForwardedTraceSeedState | undefined, fallbackPolicy?: ForwardedTraceAssertion): ResolvedForwardedTraceState | undefined;
@@ -0,0 +1 @@
1
+ import{applyAudienceCeiling}from"#shared/instrumentation-content.js";import{DROP_INSTRUMENTATION,intersectInstrumentationDecisions,readInstrumentationDecision}from"#shared/instrumentation-decision.js";const FAIL_CLOSED_FORWARDED_TRACE_ASSERTION={ceiling:{recordInputs:!1,recordOutputs:!1},originAudience:`unknown`};function decisionToTraceContentCeiling(e){let t=readInstrumentationDecision(e);return t?.action===`record`?{recordInputs:t.recordInputs,recordOutputs:t.recordOutputs}:void 0}function traceContentCeilingToDecision(e){return{action:`record`,...e}}function formatTraceContentCeiling(e){return`i${e.recordInputs?`1`:`0`}o${e.recordOutputs?`1`:`0`}`}function applyLiveDeliveryAudienceCeiling(t,n,r){return r!==void 0&&(n===`unknown`||n===r.originAudience)?t:applyAudienceCeiling(t,n)}function readForwardedTraceAssertion(e){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return FAIL_CLOSED_FORWARDED_TRACE_ASSERTION;let t=e,n=t.ceiling;return typeof n!=`object`||!n||typeof n.recordInputs!=`boolean`||typeof n.recordOutputs!=`boolean`||t.originAudience!==`public`&&t.originAudience!==`private`&&t.originAudience!==`unknown`?FAIL_CLOSED_FORWARDED_TRACE_ASSERTION:{ceiling:{recordInputs:n.recordInputs,recordOutputs:n.recordOutputs},originAudience:t.originAudience}}function resolveForwardedTraceState(e){let i=readForwardedTraceAssertion(e.forwardedTracePolicy),a=readInstrumentationDecision(e.decision);if(i!==void 0){let e=traceContentCeilingToDecision(i.ceiling);a=a===void 0?DROP_INSTRUMENTATION:intersectInstrumentationDecisions(a,e)}return{decision:a,forwardedTracePolicy:i,traceFlags:a?.action===`drop`?e.traceFlags&-2:e.traceFlags}}function resolveForwardedTraceSeed(e,t){if(e===void 0)return;let n=Object.prototype.hasOwnProperty.call(e,`forwardedTracePolicy`);return resolveForwardedTraceState({decision:e.decision,forwardedTracePolicy:n?e.forwardedTracePolicy:t,traceFlags:e.traceFlags})}export{FAIL_CLOSED_FORWARDED_TRACE_ASSERTION,applyLiveDeliveryAudienceCeiling,decisionToTraceContentCeiling,formatTraceContentCeiling,readForwardedTraceAssertion,resolveForwardedTraceSeed,traceContentCeilingToDecision};
@@ -6,3 +6,6 @@ export type InstrumentationDecision = {
6
6
  readonly recordOutputs: boolean;
7
7
  };
8
8
  export declare const DROP_INSTRUMENTATION: InstrumentationDecision;
9
+ /** Reads durable decision state, treating malformed persisted values as drop. */
10
+ export declare function readInstrumentationDecision(value: unknown): InstrumentationDecision | undefined;
11
+ export declare function intersectInstrumentationDecisions(left: InstrumentationDecision, right: InstrumentationDecision): InstrumentationDecision;
@@ -1 +1 @@
1
- const DROP_INSTRUMENTATION={action:`drop`};export{DROP_INSTRUMENTATION};
1
+ const DROP_INSTRUMENTATION={action:`drop`};function readInstrumentationDecision(e){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return DROP_INSTRUMENTATION;let t=e;return t.action===`drop`?DROP_INSTRUMENTATION:t.action===`record`&&typeof t.recordInputs==`boolean`&&typeof t.recordOutputs==`boolean`?{action:`record`,recordInputs:t.recordInputs,recordOutputs:t.recordOutputs}:DROP_INSTRUMENTATION}function intersectInstrumentationDecisions(e,t){return e.action===`drop`||t.action===`drop`?DROP_INSTRUMENTATION:{action:`record`,recordInputs:e.recordInputs&&t.recordInputs,recordOutputs:e.recordOutputs&&t.recordOutputs}}export{DROP_INSTRUMENTATION,intersectInstrumentationDecisions,readInstrumentationDecision};
@@ -1,3 +1,3 @@
1
- import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-Dg5S44kG.js";
1
+ import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-BZnOzAVd.js";
2
2
 
3
3
  export { defaultMessageReducer, useEveAgent };
@@ -1,3 +1,3 @@
1
- import { t as useEveAgent } from "../chunks/use-eve-agent-Dg5S44kG.js";
1
+ import { t as useEveAgent } from "../chunks/use-eve-agent-BZnOzAVd.js";
2
2
 
3
3
  export { useEveAgent };
@@ -11,6 +11,9 @@ export type CompiledToolHandling = {
11
11
  } | {
12
12
  readonly kind: "request-input";
13
13
  readonly request: "question";
14
+ } | {
15
+ readonly kind: "workflow-tool";
16
+ readonly workflowId: string;
14
17
  };
15
18
  /** Closed, serializable behavior carried by one selected compiled tool. */
16
19
  export interface CompiledToolBehavior {
@@ -35,6 +38,9 @@ export type PreparedDispatchTarget = {
35
38
  readonly kind: "task-cancel";
36
39
  } | {
37
40
  readonly kind: "task-update";
41
+ } | {
42
+ readonly kind: "workflow-tool-call";
43
+ readonly workflowId: string;
38
44
  };
39
45
  /** Runtime-prepared handling consumed by the harness and execution boundary. */
40
46
  export type PreparedToolHandling = {
@@ -5,6 +5,7 @@ import type { SessionContext } from "#context/session-context.js";
5
5
  import type { JsonObject } from "#shared/json.js";
6
6
  import type { TokenResult } from "#shared/connection-types.js";
7
7
  import type { ToolAuthOptions, ToolAuthProvider } from "#tools/auth.js";
8
+ import type { InputOption } from "#shared/input.js";
8
9
  import type { ToolModelOutput } from "#tools/model-output.js";
9
10
  import type { TaskDelegated, TaskExec, TaskReceipt } from "#tools/task.js";
10
11
  type ApprovalContextInput<TInput> = unknown extends TInput ? Record<string, unknown> : TInput;
@@ -50,15 +51,50 @@ export interface InternalToolDefinitionWithExecuteFn<TInput = unknown, TOutput =
50
51
  export interface PublicToolDefinitionWithExecuteFn<TInput = unknown, TOutput = unknown> extends PublicToolDefinition<TInput, TOutput> {
51
52
  execute: ToolExecuteFn<TInput, TOutput>;
52
53
  }
54
+ /**
55
+ * A question a workflow tool asks the human on the session's channel, sent
56
+ * with `ask` from `eve/workflow`. Channels render it the way they render
57
+ * `ask_question` and tool approvals.
58
+ */
59
+ export interface ToolInputRequest {
60
+ /**
61
+ * Whether the user may answer with free text instead of one of the
62
+ * {@link options}.
63
+ */
64
+ readonly allowFreeform?: boolean;
65
+ /** Rendering hint: confirmation buttons, a selection list, or a text field. */
66
+ readonly display?: "confirmation" | "select" | "text";
67
+ /** Selectable answers. */
68
+ readonly options?: readonly InputOption[];
69
+ readonly prompt: string;
70
+ }
71
+ /** The human's answer to a {@link ToolInputRequest}. */
72
+ export interface ToolInputResponse {
73
+ /** The selected option's `id`, when the user picked one. */
74
+ readonly optionId?: string;
75
+ /** Free text, when the user typed an answer. */
76
+ readonly text?: string;
77
+ }
53
78
  /**
54
79
  * Authored tool context. Passed as the last argument to
55
80
  * {@link ToolDefinition.execute}.
56
81
  *
57
82
  * Extends {@link SessionContext} with token accessors. Passing a provider
58
83
  * resolves that provider inline, which lets one tool use multiple credentials.
84
+ *
85
+ * A tool whose `execute` is a workflow (`"use workflow"`) receives the same
86
+ * context inside its durable body, except that `getSandbox`, `getSkill`,
87
+ * `getToken`, and `requireAuth` are unavailable there and throw when touched —
88
+ * read credentials inside a `"use step"` function instead.
59
89
  */
60
90
  export type ToolContext = SessionContext & {
61
- /** Aborts when the active turn is cancelled. */
91
+ /**
92
+ * Aborts when the work this tool is doing is cancelled: the active turn
93
+ * for an ordinary tool, the durable run for a workflow tool. In a workflow
94
+ * body the signal is durable — it survives replay and steps that receive it
95
+ * observe the abort — and the run waits a grace period for the body to
96
+ * unwind through `finally` before it ends.
97
+ */
62
98
  readonly abortSignal: AbortSignal;
63
99
  /**
64
100
  * Id of the current tool call — the same `callId` carried by the call's
@@ -118,7 +154,7 @@ export interface ToolDefinition<TInput = unknown, TOutput = unknown> extends Pub
118
154
  /** A tool whose executor can outlive the model tool-call phase as a durable task. */
119
155
  export interface BackgroundToolDefinition<TInput = unknown, TOutput = unknown> extends PublicToolDefinition<TInput, TOutput> {
120
156
  readonly execution: "background";
121
- execute(input: TInput, ctx: ToolContext, task: TaskExec): Promise<TaskDelegated | TOutput> | TaskDelegated | TOutput;
157
+ execute(input: TInput, ctx: ToolContext, task: TaskExec): Promise<TaskDelegated | TOutput> | TaskDelegated | TOutput | AsyncIterable<TOutput>;
122
158
  approval?: Approval<ApprovalContextInput<TInput>>;
123
159
  toModelOutput?: (output: TOutput) => ToolModelOutput | Promise<ToolModelOutput>;
124
160
  }
@@ -143,7 +179,7 @@ export declare function defineTool<TSchema extends StandardSchemaV1<unknown, unk
143
179
  execution: "background";
144
180
  inputSchema: TSchema;
145
181
  outputSchema?: PublicToolDefinition<unknown, BackgroundToolOutputFromExecuteReturn<TReturn>>["outputSchema"];
146
- execute(input: StandardSchemaV1.InferOutput<TSchema>, ctx: ToolContext, task: TaskExec): TReturn extends AsyncIterable<unknown> ? never : TReturn;
182
+ execute(input: StandardSchemaV1.InferOutput<TSchema>, ctx: ToolContext, task: TaskExec): TReturn;
147
183
  approval?: BackgroundToolDefinition<StandardSchemaV1.InferOutput<TSchema>, unknown>["approval"];
148
184
  toModelOutput?: BackgroundToolDefinition<unknown, BackgroundToolOutputFromExecuteReturn<TReturn>>["toModelOutput"];
149
185
  }): BackgroundToolDefinitionWithExecuteReturn<StandardSchemaV1.InferOutput<TSchema>, BackgroundToolOutputFromExecuteReturn<TReturn>, TReturn>;