eve 0.71.3 → 0.72.1

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 (440) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +22 -6
  3. package/dist/src/acp/adapter.js +1 -1
  4. package/dist/src/ai/decide.d.ts +7 -0
  5. package/dist/src/ai/decide.js +1 -0
  6. package/dist/src/chunks/{use-eve-agent-CFCaYnrI.js → use-eve-agent-C1GYGCtb.js} +698 -388
  7. package/dist/src/chunks/{use-eve-agent-DcDhXNv1.js → use-eve-agent-hZJ7CB8t.js} +698 -388
  8. package/dist/src/cli/commands/integration-setup.js +1 -1
  9. package/dist/src/cli/commands/registry.js +1 -1
  10. package/dist/src/cli/commands/trace-detail.d.ts +1 -1
  11. package/dist/src/cli/commands/trace-detail.js +1 -1
  12. package/dist/src/cli/dev/tui/runner.js +1 -1
  13. package/dist/src/cli/dev/tui/setup-flow.d.ts +1 -0
  14. package/dist/src/cli/dev/tui/setup-panel.d.ts +1 -0
  15. package/dist/src/cli/dev/tui/setup-panel.js +2 -1
  16. package/dist/src/cli/dev/tui/traces/trace-conversation.d.ts +2 -2
  17. package/dist/src/cli/dev/tui/traces/trace-conversation.js +2 -2
  18. package/dist/src/cli/dev/tui/transcript-parts.d.ts +2 -1
  19. package/dist/src/cli/dev/tui/transcript-parts.js +1 -1
  20. package/dist/src/cli/dev/tui/transcript.js +1 -1
  21. package/dist/src/cli/dev/tui/tui-prompter.js +1 -1
  22. package/dist/src/client/conversation-projection.d.ts +4 -0
  23. package/dist/src/client/conversation-projection.js +1 -0
  24. package/dist/src/client/conversation-reducer.js +1 -1
  25. package/dist/src/client/conversation-state.d.ts +5 -26
  26. package/dist/src/client/conversation-state.js +1 -1
  27. package/dist/src/client/index.d.ts +1 -0
  28. package/dist/src/client/index.js +1 -1
  29. package/dist/src/client/message-action-parts.d.ts +1 -11
  30. package/dist/src/client/message-action-parts.js +1 -1
  31. package/dist/src/client/message-reducer.d.ts +3 -1
  32. package/dist/src/client/message-reducer.js +1 -1
  33. package/dist/src/client/session-utils.js +1 -1
  34. package/dist/src/client/session.js +1 -1
  35. package/dist/src/client/tool-call-state.d.ts +23 -0
  36. package/dist/src/client/tool-call-state.js +1 -0
  37. package/dist/src/client/tool-part-state.d.ts +7 -0
  38. package/dist/src/client/tool-part-state.js +1 -0
  39. package/dist/src/compiled/.vendor-stamp.json +10 -10
  40. package/dist/src/compiled/@ai-sdk/anthropic/index.d.ts +1453 -1358
  41. package/dist/src/compiled/@ai-sdk/anthropic/index.js +1 -2
  42. package/dist/src/compiled/@ai-sdk/code-mode/index.d.ts +172 -163
  43. package/dist/src/compiled/@ai-sdk/code-mode/index.js +15 -20
  44. package/dist/src/compiled/@ai-sdk/google/index.d.ts +772 -733
  45. package/dist/src/compiled/@ai-sdk/google/index.js +6 -8
  46. package/dist/src/compiled/@ai-sdk/mcp/index.d.ts +887 -790
  47. package/dist/src/compiled/@ai-sdk/mcp/index.js +1 -1
  48. package/dist/src/compiled/@ai-sdk/openai/index.d.ts +1722 -1691
  49. package/dist/src/compiled/@ai-sdk/openai/index.js +3 -14
  50. package/dist/src/compiled/@ai-sdk/otel/index.d.ts +216 -159
  51. package/dist/src/compiled/@ai-sdk/otel/index.js +3 -3
  52. package/dist/src/compiled/@ai-sdk/provider/index.d.ts +7542 -7271
  53. package/dist/src/compiled/@ai-sdk/provider/index.js +1 -3
  54. package/dist/src/compiled/@ai-sdk/provider-utils/index.d.ts +1799 -1600
  55. package/dist/src/compiled/@eve/catalog/index.js +1 -1
  56. package/dist/src/compiled/_chunks/workflow/dist-DXLdlucM.js +15 -0
  57. package/dist/src/compiled/_chunks/workflow/experimental-decision-BrfWf6-n.js +3 -0
  58. package/dist/src/compiler/extension-compatibility.d.ts +36 -20
  59. package/dist/src/compiler/extension-compatibility.js +1 -1
  60. package/dist/src/compiler/manifest.js +1 -1
  61. package/dist/src/context/build-dynamic-tools.js +1 -1
  62. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  63. package/dist/src/context/dynamic-tool-metadata.d.ts +1 -0
  64. package/dist/src/context/providers/session.js +1 -1
  65. package/dist/src/evals/define-eval.d.ts +1 -1
  66. package/dist/src/evals/judge.d.ts +1 -1
  67. package/dist/src/evals/judge.js +2 -2
  68. package/dist/src/evals/mock-model.js +1 -1
  69. package/dist/src/evals/types.d.ts +8 -8
  70. package/dist/src/execution/cancel-descendant-turns-step.d.ts +1 -0
  71. package/dist/src/execution/cancel-descendant-turns-step.js +1 -1
  72. package/dist/src/execution/cancelled-model-call-batch.js +1 -1
  73. package/dist/src/execution/coordination-dispatch-shared.js +1 -1
  74. package/dist/src/execution/coordination-dispatch-step.js +1 -1
  75. package/dist/src/execution/durable-session-read.d.ts +5 -0
  76. package/dist/src/execution/durable-session-read.js +1 -0
  77. package/dist/src/execution/durable-session-store.d.ts +4 -10
  78. package/dist/src/execution/durable-session-store.js +1 -1
  79. package/dist/src/execution/dynamic-connections.d.ts +3 -3
  80. package/dist/src/execution/dynamic-connections.js +1 -1
  81. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  82. package/dist/src/execution/legacy-session/interrupt-step.js +1 -1
  83. package/dist/src/execution/legacy-session/snapshot.d.ts +3 -0
  84. package/dist/src/execution/legacy-session/snapshot.js +1 -1
  85. package/dist/src/execution/model-call-batching.js +1 -1
  86. package/dist/src/execution/node-step.d.ts +2 -0
  87. package/dist/src/execution/node-step.js +1 -1
  88. package/dist/src/execution/proxied-deliver-step.js +1 -1
  89. package/dist/src/execution/publish-session-events.d.ts +7 -2
  90. package/dist/src/execution/publish-session-events.js +1 -1
  91. package/dist/src/execution/session/active-turn.js +1 -1
  92. package/dist/src/execution/session/answer-caller.js +1 -1
  93. package/dist/src/execution/session/checkpoint-migrations.js +1 -1
  94. package/dist/src/execution/session/finalization.js +1 -1
  95. package/dist/src/execution/session/handoff-steps.d.ts +3 -1
  96. package/dist/src/execution/session/handoff-steps.js +1 -1
  97. package/dist/src/execution/session/handoff.d.ts +1 -1
  98. package/dist/src/execution/session/handoff.js +1 -1
  99. package/dist/src/execution/session/pending-turn-state.d.ts +8 -3
  100. package/dist/src/execution/session/pending-turn-state.js +1 -1
  101. package/dist/src/execution/session/task-tool-tracing-step.d.ts +5 -0
  102. package/dist/src/execution/session/task-tool-tracing-step.js +1 -0
  103. package/dist/src/execution/session/turn-step-result.js +1 -1
  104. package/dist/src/execution/session/turn-step.js +1 -1
  105. package/dist/src/execution/session/turn-waiting-step.js +1 -1
  106. package/dist/src/execution/session/turn.d.ts +1 -0
  107. package/dist/src/execution/session/turn.js +1 -1
  108. package/dist/src/execution/settle-cancelled-turn-step.d.ts +4 -6
  109. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  110. package/dist/src/execution/tasks/start.d.ts +3 -3
  111. package/dist/src/execution/tasks/start.js +1 -1
  112. package/dist/src/execution/tasks/steps.d.ts +1 -1
  113. package/dist/src/execution/tasks/steps.js +1 -1
  114. package/dist/src/execution/terminal-session-completion-step.d.ts +5 -1
  115. package/dist/src/execution/terminal-session-completion-step.js +1 -1
  116. package/dist/src/execution/terminal-session-failure-step.js +1 -1
  117. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  118. package/dist/src/execution/tools/connection-tools.js +2 -2
  119. package/dist/src/execution/tools/workflow/harness-definition.js +1 -1
  120. package/dist/src/execution/tools/workflow/step.js +1 -1
  121. package/dist/src/execution/tools/workflow/withdraw-step.d.ts +7 -9
  122. package/dist/src/execution/tools/workflow/withdraw-step.js +1 -1
  123. package/dist/src/execution/workflow-trace-context.d.ts +2 -2
  124. package/dist/src/harness/authorization.d.ts +4 -2
  125. package/dist/src/harness/authorization.js +1 -1
  126. package/dist/src/harness/{compaction.js → compaction/engine.js} +1 -1
  127. package/dist/src/harness/compaction/step.d.ts +46 -0
  128. package/dist/src/harness/compaction/step.js +1 -0
  129. package/dist/src/harness/coordination.d.ts +32 -68
  130. package/dist/src/harness/coordination.js +1 -1
  131. package/dist/src/harness/current-messages.d.ts +1 -3
  132. package/dist/src/harness/current-messages.js +1 -1
  133. package/dist/src/harness/emission.d.ts +4 -52
  134. package/dist/src/harness/emission.js +1 -1
  135. package/dist/src/harness/execute-tool.d.ts +1 -0
  136. package/dist/src/harness/final-output.d.ts +5 -0
  137. package/dist/src/harness/final-output.js +1 -1
  138. package/dist/src/harness/hitl/approvals.d.ts +115 -0
  139. package/dist/src/harness/hitl/approvals.js +1 -0
  140. package/dist/src/harness/hitl/approved-call-callers.d.ts +14 -0
  141. package/dist/src/harness/hitl/approved-call-callers.js +1 -0
  142. package/dist/src/harness/hitl/approved-calls.d.ts +37 -0
  143. package/dist/src/harness/hitl/approved-calls.js +1 -0
  144. package/dist/src/harness/hitl/budget.d.ts +21 -0
  145. package/dist/src/harness/hitl/budget.js +1 -0
  146. package/dist/src/harness/{approval-candidates.d.ts → hitl/candidates.d.ts} +9 -18
  147. package/dist/src/harness/hitl/candidates.js +1 -0
  148. package/dist/src/harness/hitl/coordinator.js +1 -0
  149. package/dist/src/harness/hitl/delivery.d.ts +37 -0
  150. package/dist/src/harness/hitl/delivery.js +1 -0
  151. package/dist/src/harness/hitl/index.d.ts +49 -0
  152. package/dist/src/harness/hitl/index.js +1 -0
  153. package/dist/src/harness/hitl/intake.d.ts +67 -0
  154. package/dist/src/harness/hitl/intake.js +1 -0
  155. package/dist/src/harness/{stale-input-responses.d.ts → hitl/stale-responses.d.ts} +5 -3
  156. package/dist/src/harness/hitl/stale-responses.js +3 -0
  157. package/dist/src/harness/inline-tool-authorization.d.ts +4 -0
  158. package/dist/src/harness/inline-tool-authorization.js +1 -1
  159. package/dist/src/harness/input-extraction.d.ts +1 -10
  160. package/dist/src/harness/input-extraction.js +1 -1
  161. package/dist/src/harness/input-request-resolution.d.ts +1 -5
  162. package/dist/src/harness/input-request-resolution.js +1 -1
  163. package/dist/src/harness/model-call/call.d.ts +78 -0
  164. package/dist/src/harness/model-call/call.js +1 -0
  165. package/dist/src/harness/{model-call-error.d.ts → model-call/errors.d.ts} +1 -1
  166. package/dist/src/harness/model-call/failure.d.ts +52 -0
  167. package/dist/src/harness/model-call/failure.js +1 -0
  168. package/dist/src/harness/model-call/model.d.ts +18 -0
  169. package/dist/src/harness/model-call/model.js +1 -0
  170. package/dist/src/harness/model-call/recovery.d.ts +52 -0
  171. package/dist/src/harness/model-call/recovery.js +1 -0
  172. package/dist/src/harness/model-call/request.d.ts +30 -0
  173. package/dist/src/harness/model-call/request.js +3 -0
  174. package/dist/src/harness/model-call/response.d.ts +39 -0
  175. package/dist/src/harness/model-call/response.js +1 -0
  176. package/dist/src/harness/model-call/retry.d.ts +11 -0
  177. package/dist/src/harness/model-call/retry.js +1 -0
  178. package/dist/src/harness/model-call/run.d.ts +38 -0
  179. package/dist/src/harness/model-call/run.js +1 -0
  180. package/dist/src/harness/model-call/tools.d.ts +48 -0
  181. package/dist/src/harness/model-call/tools.js +1 -0
  182. package/dist/src/harness/model-call/usage.d.ts +23 -0
  183. package/dist/src/harness/model-call/usage.js +1 -0
  184. package/dist/src/harness/nested-actions.d.ts +2 -2
  185. package/dist/src/harness/provider-tools.d.ts +2 -2
  186. package/dist/src/harness/provider-tools.js +1 -1
  187. package/dist/src/harness/proxy-input-requests.d.ts +4 -12
  188. package/dist/src/harness/proxy-input-requests.js +1 -1
  189. package/dist/src/harness/session-machine/commit.d.ts +28 -0
  190. package/dist/src/harness/session-machine/commit.js +1 -0
  191. package/dist/src/harness/session-machine/current.d.ts +29 -0
  192. package/dist/src/harness/session-machine/current.js +1 -0
  193. package/dist/src/harness/session-machine/events.d.ts +6 -0
  194. package/dist/src/harness/session-machine/events.js +1 -0
  195. package/dist/src/harness/session-machine/resolver-events.d.ts +12 -0
  196. package/dist/src/harness/session-machine/resolver-events.js +1 -0
  197. package/dist/src/harness/session-machine/state.d.ts +47 -0
  198. package/dist/src/harness/session-machine/state.js +1 -0
  199. package/dist/src/harness/session-machine/transitions.d.ts +188 -0
  200. package/dist/src/harness/session-machine/transitions.js +1 -0
  201. package/dist/src/harness/session-machine/view.d.ts +58 -0
  202. package/dist/src/harness/session-machine/view.js +1 -0
  203. package/dist/src/harness/step/after-model.d.ts +7 -0
  204. package/dist/src/harness/step/after-model.js +1 -0
  205. package/dist/src/harness/step/context.d.ts +59 -0
  206. package/dist/src/harness/step/context.js +1 -0
  207. package/dist/src/harness/step/intake.d.ts +34 -0
  208. package/dist/src/harness/step/intake.js +1 -0
  209. package/dist/src/harness/step/prompt.d.ts +37 -0
  210. package/dist/src/harness/step/prompt.js +1 -0
  211. package/dist/src/harness/step-hooks.d.ts +8 -13
  212. package/dist/src/harness/step-hooks.js +1 -1
  213. package/dist/src/harness/tool-loop.d.ts +7 -22
  214. package/dist/src/harness/tool-loop.js +1 -3
  215. package/dist/src/harness/tools.d.ts +13 -0
  216. package/dist/src/harness/tools.js +1 -1
  217. package/dist/src/harness/turn-tag-state.d.ts +1 -1
  218. package/dist/src/harness/types.d.ts +6 -0
  219. package/dist/src/instrumentation/ai-sdk-hook-bridge.d.ts +1 -1
  220. package/dist/src/instrumentation/ai-sdk-hook-bridge.js +1 -1
  221. package/dist/src/instrumentation/content.js +1 -1
  222. package/dist/src/instrumentation/dispatch.js +1 -1
  223. package/dist/src/instrumentation/lifecycle.d.ts +28 -56
  224. package/dist/src/instrumentation/native-events.d.ts +2 -1
  225. package/dist/src/instrumentation/native-events.js +1 -1
  226. package/dist/src/instrumentation/provider.d.ts +1 -1
  227. package/dist/src/instrumentation/runtime-context.d.ts +2 -3
  228. package/dist/src/instrumentation/runtime-context.js +1 -1
  229. package/dist/src/instrumentation/runtime.d.ts +11 -1
  230. package/dist/src/instrumentation/runtime.js +1 -1
  231. package/dist/src/instrumentation/state.d.ts +6 -1
  232. package/dist/src/instrumentation/state.js +1 -1
  233. package/dist/src/internal/application/package.js +1 -1
  234. package/dist/src/internal/attachments/limited-read.d.ts +16 -0
  235. package/dist/src/internal/attachments/limited-read.js +1 -0
  236. package/dist/src/internal/authored-definition/schema-backed.d.ts +2 -1
  237. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  238. package/dist/src/internal/mcp/published-tools.d.ts +13 -0
  239. package/dist/src/internal/mcp/published-tools.js +1 -0
  240. package/dist/src/internal/mcp/request-trace-context.d.ts +12 -0
  241. package/dist/src/internal/mcp/request-trace-context.js +1 -0
  242. package/dist/src/internal/mcp/streamable-http-server.d.ts +7 -3
  243. package/dist/src/internal/mcp/streamable-http-server.js +1 -1
  244. package/dist/src/internal/model-auth/transport.d.ts +3 -3
  245. package/dist/src/internal/model-auth/transport.js +1 -1
  246. package/dist/src/models/auto.d.ts +5 -5
  247. package/dist/src/models/auto.js +2 -2
  248. package/dist/src/protocol/message.d.ts +7 -0
  249. package/dist/src/protocol/message.js +1 -1
  250. package/dist/src/protocol/session-projection.d.ts +159 -0
  251. package/dist/src/protocol/session-projection.js +1 -0
  252. package/dist/src/public/ai/index.d.ts +1 -1
  253. package/dist/src/public/ai/index.js +1 -1
  254. package/dist/src/public/channels/chat-sdk/attachment-refs.d.ts +15 -0
  255. package/dist/src/public/channels/chat-sdk/attachment-refs.js +1 -0
  256. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +2 -2
  257. package/dist/src/public/channels/chat-sdk/messageToUserContent.d.ts +11 -5
  258. package/dist/src/public/channels/chat-sdk/messageToUserContent.js +1 -1
  259. package/dist/src/public/channels/discord/attachments.d.ts +15 -0
  260. package/dist/src/public/channels/discord/attachments.js +1 -0
  261. package/dist/src/public/channels/discord/discordChannel.js +1 -1
  262. package/dist/src/public/channels/discord/inbound.d.ts +13 -0
  263. package/dist/src/public/channels/discord/inbound.js +1 -1
  264. package/dist/src/public/channels/linear/inbound-uploads.d.ts +21 -0
  265. package/dist/src/public/channels/linear/inbound-uploads.js +1 -0
  266. package/dist/src/public/channels/linear/linearChannel.js +1 -1
  267. package/dist/src/public/channels/linq/inboundContent.d.ts +7 -1
  268. package/dist/src/public/channels/linq/inboundContent.js +1 -1
  269. package/dist/src/public/channels/linq/linqChannel.js +1 -1
  270. package/dist/src/public/channels/mcp.d.ts +17 -2
  271. package/dist/src/public/channels/mcp.js +1 -1
  272. package/dist/src/public/channels/photon/attachments.d.ts +21 -0
  273. package/dist/src/public/channels/photon/attachments.js +1 -0
  274. package/dist/src/public/channels/photon/photonIMessageChannel.js +1 -1
  275. package/dist/src/public/channels/slack/attachments.d.ts +3 -1
  276. package/dist/src/public/channels/slack/attachments.js +1 -1
  277. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  278. package/dist/src/public/channels/teams/attachments.d.ts +4 -4
  279. package/dist/src/public/channels/teams/attachments.js +1 -1
  280. package/dist/src/public/channels/telegram/attachments.js +1 -1
  281. package/dist/src/public/channels/twilio/api.d.ts +7 -0
  282. package/dist/src/public/channels/twilio/api.js +1 -1
  283. package/dist/src/public/channels/twilio/inbound.d.ts +7 -0
  284. package/dist/src/public/channels/twilio/inbound.js +2 -2
  285. package/dist/src/public/channels/twilio/twilioChannel.js +1 -1
  286. package/dist/src/public/definitions/connections/mcp.d.ts +1 -1
  287. package/dist/src/public/definitions/connections/openapi.d.ts +1 -1
  288. package/dist/src/react/index.d.ts +1 -0
  289. package/dist/src/react/index.js +1 -1
  290. package/dist/src/runtime/agent/mock-model-adapter.js +2 -2
  291. package/dist/src/runtime/connections/mcp-client.d.ts +18 -1
  292. package/dist/src/runtime/connections/mcp-client.js +1 -1
  293. package/dist/src/runtime/resolve-tool.js +1 -1
  294. package/dist/src/setup/boxes/resolve-provisioning.d.ts +2 -0
  295. package/dist/src/setup/boxes/resolve-provisioning.js +1 -1
  296. package/dist/src/setup/cli/prompt-ui.d.ts +3 -0
  297. package/dist/src/setup/cli/prompt-ui.js +3 -1
  298. package/dist/src/setup/cli/select-component.d.ts +1 -0
  299. package/dist/src/setup/cli/select-component.js +1 -1
  300. package/dist/src/setup/flows/ensure-vercel-project.d.ts +2 -0
  301. package/dist/src/setup/flows/ensure-vercel-project.js +1 -1
  302. package/dist/src/setup/integrations/discord/api.js +1 -1
  303. package/dist/src/setup/integrations/web/auth-options.d.ts +4 -0
  304. package/dist/src/setup/integrations/web/auth-options.js +1 -0
  305. package/dist/src/setup/integrations/web/auth-scaffold.d.ts +7 -0
  306. package/dist/src/setup/integrations/web/auth-scaffold.js +1 -0
  307. package/dist/src/setup/integrations/web/provision-auth.d.ts +3 -0
  308. package/dist/src/setup/integrations/web/provision-auth.js +1 -0
  309. package/dist/src/setup/integrations/web/setup.d.ts +11 -6
  310. package/dist/src/setup/integrations/web/setup.js +3 -3
  311. package/dist/src/setup/prompter.d.ts +2 -0
  312. package/dist/src/setup/prompter.js +1 -1
  313. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  314. package/dist/src/setup/scaffold/create/project.js +2 -2
  315. package/dist/src/setup/scaffold/create/web-template.d.ts +1 -1
  316. package/dist/src/setup/scaffold/create/web-template.js +1 -0
  317. package/dist/src/setup/scaffold/update/web-options.js +1 -1
  318. package/dist/src/setup/vercel-project-api.d.ts +9 -0
  319. package/dist/src/setup/vercel-project-api.js +1 -1
  320. package/dist/src/setup/vercel-project.d.ts +4 -2
  321. package/dist/src/setup/vercel-project.js +0 -0
  322. package/dist/src/shared/web-search.d.ts +1 -1
  323. package/dist/src/subagents/adapter.js +1 -1
  324. package/dist/src/subagents/event-proxy-step.js +1 -1
  325. package/dist/src/subagents/hitl-proxy.d.ts +4 -28
  326. package/dist/src/subagents/hitl-proxy.js +1 -1
  327. package/dist/src/svelte/index.d.ts +2 -0
  328. package/dist/src/svelte/index.js +39 -2
  329. package/dist/src/svelte/use-eve-agent.js +1 -1
  330. package/dist/src/tools/approval/policies.d.ts +5 -5
  331. package/dist/src/tools/approval/policies.js +1 -1
  332. package/dist/src/tools/framework/agent.js +1 -1
  333. package/dist/src/tools/provided/agent-router.js +1 -1
  334. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  335. package/dist/src/tools/provided/ask-question.js +2 -2
  336. package/dist/src/tools/provided/bash.js +1 -1
  337. package/dist/src/tools/provided/framework-tool.d.ts +3 -0
  338. package/dist/src/tools/provided/framework-tool.js +1 -0
  339. package/dist/src/tools/provided/glob.js +2 -2
  340. package/dist/src/tools/provided/grep.js +2 -2
  341. package/dist/src/tools/provided/load-skill.js +1 -1
  342. package/dist/src/tools/provided/no-reply.js +1 -1
  343. package/dist/src/tools/provided/read-file.js +2 -2
  344. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  345. package/dist/src/tools/provided/sleep.js +1 -1
  346. package/dist/src/tools/provided/task-cancel.js +1 -1
  347. package/dist/src/tools/provided/task-wait.js +1 -1
  348. package/dist/src/tools/provided/web-fetch.js +2 -2
  349. package/dist/src/tools/provided/web-search.js +1 -1
  350. package/dist/src/tools/provided/workflow.js +1 -1
  351. package/dist/src/tools/provided/write-file.js +2 -2
  352. package/dist/src/tracing/agent-approval-instrumentation.d.ts +2 -2
  353. package/dist/src/tracing/agent-approval-instrumentation.js +1 -1
  354. package/dist/src/tracing/agent-otel-provider.js +2 -2
  355. package/dist/src/tracing/agent-otel-usage.d.ts +1 -1
  356. package/dist/src/tracing/agent-otel-usage.js +1 -1
  357. package/dist/src/tracing/agent-span-contract.d.ts +0 -1
  358. package/dist/src/tracing/agent-span-contract.js +1 -1
  359. package/dist/src/tracing/agent-tool-instrumentation.d.ts +16 -6
  360. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  361. package/dist/src/tracing/agent-trace-context-codec.js +1 -1
  362. package/dist/src/tracing/agent-trace-state.d.ts +7 -3
  363. package/dist/src/tracing/invoke-tool-span.js +1 -1
  364. package/dist/src/tracing/local-trace-analysis.js +1 -1
  365. package/dist/src/vue/index.d.ts +2 -0
  366. package/dist/src/vue/index.js +39 -2
  367. package/dist/src/vue/use-eve-agent.js +1 -1
  368. package/docs/agent-config.md +2 -2
  369. package/docs/channels/chat-sdk.mdx +3 -1
  370. package/docs/channels/custom.mdx +2 -0
  371. package/docs/channels/discord.mdx +5 -4
  372. package/docs/channels/eve.mdx +65 -0
  373. package/docs/channels/linear.mdx +1 -1
  374. package/docs/channels/linq.mdx +2 -0
  375. package/docs/channels/mcp.mdx +39 -1
  376. package/docs/channels/photon.mdx +5 -0
  377. package/docs/channels/teams.mdx +4 -7
  378. package/docs/channels/twilio.mdx +1 -1
  379. package/docs/concepts/built-in-tools.md +14 -2
  380. package/docs/concepts/sessions-runs-and-streaming.md +3 -3
  381. package/docs/connections/mcp.mdx +11 -0
  382. package/docs/connections/overview.mdx +2 -2
  383. package/docs/dynamic-configuration/meta.json +1 -1
  384. package/docs/evals/judge.mdx +16 -16
  385. package/docs/evals/overview.mdx +1 -1
  386. package/docs/guides/{evaluate.md → decide.md} +35 -35
  387. package/docs/guides/dynamic-capabilities.md +1 -1
  388. package/docs/guides/frontend/overview.mdx +3 -1
  389. package/docs/guides/hooks.md +1 -1
  390. package/docs/guides/instrumentation/instrumentation.mdx +23 -22
  391. package/docs/guides/instrumentation/otel.mdx +13 -2
  392. package/docs/reference/cli.md +3 -3
  393. package/docs/reference/typescript-api.md +4 -2
  394. package/docs/tools/human-in-the-loop.md +6 -4
  395. package/docs/tools/workflows.mdx +4 -4
  396. package/package.json +11 -11
  397. package/dist/src/ai/evaluate.d.ts +0 -7
  398. package/dist/src/ai/evaluate.js +0 -1
  399. package/dist/src/client/message-task-parts.d.ts +0 -8
  400. package/dist/src/client/message-task-parts.js +0 -1
  401. package/dist/src/compiled/_chunks/workflow/dist-C3ZE62yI.js +0 -25
  402. package/dist/src/compiled/_chunks/workflow/experimental-evaluation-Dm32egEG.js +0 -5
  403. package/dist/src/harness/active-turn-id.d.ts +0 -11
  404. package/dist/src/harness/active-turn-id.js +0 -1
  405. package/dist/src/harness/approval-candidates.js +0 -1
  406. package/dist/src/harness/approval-delivery-coordinator.js +0 -1
  407. package/dist/src/harness/approved-call-callers.d.ts +0 -11
  408. package/dist/src/harness/approved-call-callers.js +0 -1
  409. package/dist/src/harness/cancelled-turn-emission.d.ts +0 -12
  410. package/dist/src/harness/cancelled-turn-emission.js +0 -1
  411. package/dist/src/harness/emission-state.d.ts +0 -36
  412. package/dist/src/harness/emission-state.js +0 -1
  413. package/dist/src/harness/held-requests.d.ts +0 -18
  414. package/dist/src/harness/held-requests.js +0 -1
  415. package/dist/src/harness/hitl/approval-input-requests.d.ts +0 -27
  416. package/dist/src/harness/hitl/approval-input-requests.js +0 -1
  417. package/dist/src/harness/hitl/pending-input-resolution.d.ts +0 -54
  418. package/dist/src/harness/hitl/pending-input-resolution.js +0 -1
  419. package/dist/src/harness/hitl/session-limit-input-requests.d.ts +0 -12
  420. package/dist/src/harness/hitl/session-limit-input-requests.js +0 -1
  421. package/dist/src/harness/input-requests.d.ts +0 -37
  422. package/dist/src/harness/input-requests.js +0 -1
  423. package/dist/src/harness/pending-input-batches.d.ts +0 -81
  424. package/dist/src/harness/pending-input-batches.js +0 -1
  425. package/dist/src/harness/session-limit-enforcement.d.ts +0 -45
  426. package/dist/src/harness/session-limit-enforcement.js +0 -1
  427. package/dist/src/harness/stale-input-responses.js +0 -3
  428. package/dist/src/harness/workflow-dispatch.d.ts +0 -30
  429. package/dist/src/harness/workflow-dispatch.js +0 -1
  430. package/dist/src/public/channels/linear/inbound-images.d.ts +0 -19
  431. package/dist/src/public/channels/linear/inbound-images.js +0 -1
  432. package/dist/src/tracing/agent-action-instrumentation.d.ts +0 -26
  433. package/dist/src/tracing/agent-action-instrumentation.js +0 -1
  434. /package/dist/src/harness/{compaction.d.ts → compaction/engine.d.ts} +0 -0
  435. /package/dist/src/harness/{compaction-prompt.d.ts → compaction/prompt.d.ts} +0 -0
  436. /package/dist/src/harness/{compaction-prompt.js → compaction/prompt.js} +0 -0
  437. /package/dist/src/harness/{session-limit-continuation.d.ts → hitl/budget-request.d.ts} +0 -0
  438. /package/dist/src/harness/{session-limit-continuation.js → hitl/budget-request.js} +0 -0
  439. /package/dist/src/harness/{approval-delivery-coordinator.d.ts → hitl/coordinator.d.ts} +0 -0
  440. /package/dist/src/harness/{model-call-error.js → model-call/errors.js} +0 -0
@@ -1,4 +1,4 @@
1
- import{z}from"#compiled/zod/index.js";import{LOAD_SKILL_TOOL_NAME}from"#runtime/skills/fragment-context.js";import{MockLanguageModelV3}from"ai/test";import{readTaskResults}from"#execution/tasks/render.js";import{FINAL_OUTPUT_TOOL_NAME}from"#harness/final-output.js";import{BOOTSTRAP_RUNTIME_MODEL_ID,BOOTSTRAP_RUNTIME_SYSTEM_PROMPT}from"#runtime/agent/bootstrap.js";import{createBootstrapGenerateResult,createBootstrapStreamResult,estimateTokenCount,getLastUserPromptText,getPromptContentText,getPromptText,isFrameworkAnnouncementText}from"#runtime/agent/bootstrap-model-utils.js";import{createMockAuthoredToolInput,formatToolOutput,resolveMockFixtureToken,resolveWeatherCity}from"#runtime/agent/mock-model-fixtures.js";import{findRelevantSkill,getActivatedSkillIds,getAvailableSkills}from"#runtime/agent/mock-model-skill-selection.js";import{createJsonSchemaSample}from"#runtime/agent/mock-structured-output.js";const authoredRuntimeModelMocks=new Map,bootstrapWeatherPayloadSchema=z.object({city:z.string(),condition:z.string(),summary:z.string(),temperatureF:z.number().finite()}).strict();function shouldMockAuthoredRuntimeModels(){return process.env.NODE_ENV===`test`||process.env.EVE_MOCK_AUTHORED_MODELS===`1`}function createMockAuthoredRuntimeModel(e){let t=authoredRuntimeModelMocks.get(e.id);if(t!==void 0)return t;let n=new MockLanguageModelV3({modelId:e.id,provider:`eve-runtime-mock`,doGenerate:async t=>createMockModelResult(t,e.id),doStream:async t=>createBootstrapStreamResult(createMockModelResult(t,e.id))});return authoredRuntimeModelMocks.set(e.id,n),n}function createMockModelResult(e,t){let n=getLastAuthoredToolResult(e.prompt);if(n!==null){let r=createFollowUpToolCallResult({modelId:t,options:e,result:n});if(r!==null)return r}else{let n=createParallelAuthoredToolCallsResult(e,t)??createSubagentDelegationResult(e,t)??createSkillLoadResult(e.prompt,t)??createAuthoredToolCallResult(e,t);if(n!==null)return n}let r=createFinalOutputResult(e,t);if(r!==null)return r;let i=n===null?createAssistantMessage(e.prompt):formatToolResultReply(n,e.prompt);return createBootstrapGenerateResult({inputTokens:estimateTokenCount(getPromptText(e.prompt)),modelId:t,outputTokens:estimateTokenCount(i),text:i})}function createFinalOutputResult(e,t){let n=getAvailableTools(e).find(e=>e.name===FINAL_OUTPUT_TOOL_NAME);if(n===void 0)return null;let r=createJsonSchemaSample(n.inputSchema);return createToolCallGenerateResult({input:r,inputTokens:estimateTokenCount(getPromptText(e.prompt)),modelId:t,outputTokens:estimateTokenCount(JSON.stringify(r)),toolCallId:createToolCallId(FINAL_OUTPUT_TOOL_NAME),toolName:FINAL_OUTPUT_TOOL_NAME})}function resolveMockAuthoredRuntimeModel(e){return!shouldMockAuthoredRuntimeModels()||e.id===BOOTSTRAP_RUNTIME_MODEL_ID?null:createMockAuthoredRuntimeModel(e)}function createSkillLoadResult(e,t){let n=getLastUserPromptText(e);if(n===null||getActivatedSkillIds(e).length>0)return null;let r=findRelevantSkill(getAvailableSkills(e),n);return r===null?null:createToolCallGenerateResult({input:{skill:r.name},inputTokens:estimateTokenCount(getPromptText(e)),modelId:t,outputTokens:estimateTokenCount(r.name),toolCallId:`call_load_skill`,toolName:LOAD_SKILL_TOOL_NAME})}const SUBAGENT_DELEGATION_DIRECTIVE=/\bdelegate\s+to\s+a\s+subagent\s*:\s*(.+)$/iu,PARALLEL_AUTHORED_TOOLS_DIRECTIVE=/^call tools in parallel:\s*(.+)$/imu;function createParallelAuthoredToolCallsResult(e,t){let n=getLastUserPromptText(e.prompt);if(n===null)return null;let r=PARALLEL_AUTHORED_TOOLS_DIRECTIVE.exec(n)?.[1]?.split(`,`).map(e=>e.trim()).filter(Boolean);if(r===void 0||r.length<2||new Set(r).size!==r.length)return null;let i=new Map(getAvailableTools(e).map(e=>[e.name,e])),a=[];for(let e of r){let t=i.get(e);if(t===void 0)return null;a.push(t)}let o=resolveWeatherCity(n);return createToolCallsGenerateResult({calls:a.map(e=>({input:createMockAuthoredToolInput(e,n,o),toolCallId:createToolCallId(e.name),toolName:e.name})),inputTokens:estimateTokenCount(getPromptText(e.prompt)),modelId:t,outputTokens:estimateTokenCount(n)})}function createSubagentDelegationResult(e,t){let n=getLastUserPromptText(e.prompt);if(n===null)return null;let r=SUBAGENT_DELEGATION_DIRECTIVE.exec(n);if(r?.[1]===void 0)return null;let i=`agent`;if(getAvailableTools(e).find(e=>e.name===i)===void 0)return null;let a=r[1].trim();return createToolCallGenerateResult({input:{message:a},inputTokens:estimateTokenCount(getPromptText(e.prompt)),modelId:t,outputTokens:estimateTokenCount(a),toolCallId:createToolCallId(i),toolName:i})}function createAuthoredToolCallResult(e,t){let n=getLastUserPromptText(e.prompt);if(n===null)return null;let r=findRelevantTool(getAvailableTools(e),n);if(r===null)return null;let i=resolveWeatherCity(n),a=createMockAuthoredToolInput(r,n,i);return createToolCallGenerateResult({input:a,inputTokens:estimateTokenCount(getPromptText(e.prompt)),modelId:t,outputTokens:estimateTokenCount(Object.values(a).join(` `)),toolCallId:createToolCallId(r.name),toolName:r.name})}function createFollowUpToolCallResult(e){let t=findNextExplicitToolAfterResult({previousToolName:e.result.toolName,prompt:e.options.prompt,tools:getAvailableTools(e.options)});if(t===null)return null;let n=createFollowUpToolInput(e.result.output);return n===null?null:createToolCallGenerateResult({input:n,inputTokens:estimateTokenCount(getPromptText(e.options.prompt)),modelId:e.modelId,outputTokens:estimateTokenCount(Object.values(n).join(` `)),toolCallId:createToolCallId(t.name),toolName:t.name})}function createAssistantMessage(e){let t=getLastUserPromptText(e)??`Hello from eve`,n=getSystemPromptLabels(e),r=resolveSystemProbe(e),i=resolveMockFixtureToken(e);return i===null?n.length>0?r===null?`Bootstrap reply [${n.join(`, `)}]: ${t}`:`Bootstrap reply [${n.join(`, `)}; probe=${r}]: ${t}`:r===null?`Bootstrap reply: ${t}`:`Bootstrap reply [probe=${r}]: ${t}`:i}function formatToolResultReply(e,t){if(e.isError)return`Local weather tool failed: ${formatToolOutput(e.output)}`;if(isWeatherPayload(e.output))return`Used local weather tool for ${e.output.city}: ${e.output.condition}, ${e.output.temperatureF}F. ${e.output.summary}`;let n=getLastUserPromptText(t)??`Hello from eve`;return`Used ${e.toolName} for "${n}": ${formatToolOutput(e.output)}`}function createToolCallGenerateResult(e){return createToolCallsGenerateResult({calls:[{input:e.input,toolCallId:e.toolCallId,toolName:e.toolName}],inputTokens:e.inputTokens,modelId:e.modelId,outputTokens:e.outputTokens})}function createToolCallsGenerateResult(e){return{content:e.calls.map(e=>({input:JSON.stringify(e.input),toolCallId:e.toolCallId,toolName:e.toolName,type:`tool-call`})),finishReason:{raw:void 0,unified:`tool-calls`},response:{id:`bootstrap-response`,modelId:e.modelId,timestamp:new Date(`2026-03-16T00:00:00.000Z`)},usage:{inputTokens:{cacheRead:0,cacheWrite:0,noCache:e.inputTokens,total:e.inputTokens},outputTokens:{reasoning:0,text:e.outputTokens,total:e.outputTokens}},warnings:[]}}function getAvailableTools(e){return(e.tools??[]).flatMap(e=>e.type===`function`?[{description:e.description,inputSchema:`inputSchema`in e?e.inputSchema:void 0,name:e.name,outputSchema:`outputSchema`in e?e.outputSchema:void 0}]:[])}function getLastAuthoredToolResult(e){for(let t of[...e].reverse()){if(t.role===`user`){let e=getPromptContentText(t.content).trim(),n=readTaskResults(e).at(-1);if(n!==void 0){let{body:e,taskId:t,tool:r}=n;return{isError:n.status===`failed`,output:e,toolCallId:t,toolName:r}}if(isFrameworkAnnouncementText(e))continue;return null}if(t.role===`tool`||t.role===`assistant`){for(let e of[...t.content].reverse())if(typeof e!=`string`&&e.type===`tool-result`&&e.toolName!==LOAD_SKILL_TOOL_NAME)return{isError:e.output.type===`error-json`||e.output.type===`error-text`||e.output.type===`execution-denied`,output:e.output.type===`execution-denied`?{reason:e.output.reason??null,type:e.output.type}:e.output.value,toolCallId:e.toolCallId,toolName:e.toolName}}}return null}function findNextExplicitToolAfterResult(e){let t=getLastUserPromptText(e.prompt);if(t===null)return null;let n=normalizeText(t),r=n.indexOf(normalizeText(e.previousToolName));return r<0?null:e.tools.filter(t=>t.name!==e.previousToolName).flatMap(e=>{let t=n.indexOf(normalizeText(e.name),r+1);return t<0?[]:[{index:t,tool:e}]}).sort((e,t)=>e.index-t.index)[0]?.tool??null}function createFollowUpToolInput(e){return isRecord(e)&&typeof e.stepKey==`string`?{stepKey:e.stepKey}:null}function getSystemPromptLabels(e){let t=e.filter(e=>e.role===`system`);if(t.length===0)return[];let n=t.flatMap(e=>{let t=getPromptContentText(e.content);if(t.startsWith(`Available skills
1
+ import{createHash}from"node:crypto";import{z}from"#compiled/zod/index.js";import{LOAD_SKILL_TOOL_NAME}from"#runtime/skills/fragment-context.js";import{MockLanguageModelV3}from"ai/test";import{readTaskResults}from"#execution/tasks/render.js";import{FINAL_OUTPUT_TOOL_NAME}from"#harness/final-output.js";import{BOOTSTRAP_RUNTIME_MODEL_ID,BOOTSTRAP_RUNTIME_SYSTEM_PROMPT}from"#runtime/agent/bootstrap.js";import{createBootstrapGenerateResult,createBootstrapStreamResult,estimateTokenCount,getLastUserPromptText,getPromptContentText,getPromptText,isFrameworkAnnouncementText}from"#runtime/agent/bootstrap-model-utils.js";import{createMockAuthoredToolInput,formatToolOutput,resolveMockFixtureToken,resolveWeatherCity}from"#runtime/agent/mock-model-fixtures.js";import{findRelevantSkill,getActivatedSkillIds,getAvailableSkills}from"#runtime/agent/mock-model-skill-selection.js";import{createJsonSchemaSample}from"#runtime/agent/mock-structured-output.js";const authoredRuntimeModelMocks=new Map,bootstrapWeatherPayloadSchema=z.object({city:z.string(),condition:z.string(),summary:z.string(),temperatureF:z.number().finite()}).strict();function shouldMockAuthoredRuntimeModels(){return process.env.NODE_ENV===`test`||process.env.EVE_MOCK_AUTHORED_MODELS===`1`}function createMockAuthoredRuntimeModel(e){let t=authoredRuntimeModelMocks.get(e.id);if(t!==void 0)return t;let n=new MockLanguageModelV3({modelId:e.id,provider:`eve-runtime-mock`,doGenerate:async t=>createMockModelResult(t,e.id),doStream:async t=>createBootstrapStreamResult(createMockModelResult(t,e.id))});return authoredRuntimeModelMocks.set(e.id,n),n}function createMockModelResult(e,t){let n=getLastAuthoredToolResult(e.prompt);if(n!==null){let r=createFollowUpToolCallResult({modelId:t,options:e,result:n});if(r!==null)return r}else{let n=createParallelAuthoredToolCallsResult(e,t)??createSubagentDelegationResult(e,t)??createSkillLoadResult(e.prompt,t)??createAuthoredToolCallResult(e,t);if(n!==null)return n}let r=createFinalOutputResult(e,t);if(r!==null)return r;let i=n===null?createAssistantMessage(e.prompt):formatToolResultReply(n,e.prompt);return createBootstrapGenerateResult({inputTokens:estimateTokenCount(getPromptText(e.prompt)),modelId:t,outputTokens:estimateTokenCount(i),text:i})}function createFinalOutputResult(e,t){let n=getAvailableTools(e).find(e=>e.name===FINAL_OUTPUT_TOOL_NAME);if(n===void 0)return null;let r=createJsonSchemaSample(n.inputSchema);return createToolCallGenerateResult({input:r,inputTokens:estimateTokenCount(getPromptText(e.prompt)),modelId:t,outputTokens:estimateTokenCount(JSON.stringify(r)),toolCallId:createToolCallId(FINAL_OUTPUT_TOOL_NAME),toolName:FINAL_OUTPUT_TOOL_NAME})}function resolveMockAuthoredRuntimeModel(e){return!shouldMockAuthoredRuntimeModels()||e.id===BOOTSTRAP_RUNTIME_MODEL_ID?null:createMockAuthoredRuntimeModel(e)}function createSkillLoadResult(e,t){let n=getLastUserPromptText(e);if(n===null||getActivatedSkillIds(e).length>0)return null;let r=findRelevantSkill(getAvailableSkills(e),n);return r===null?null:createToolCallGenerateResult({input:{skill:r.name},inputTokens:estimateTokenCount(getPromptText(e)),modelId:t,outputTokens:estimateTokenCount(r.name),toolCallId:`call_load_skill`,toolName:LOAD_SKILL_TOOL_NAME})}const SUBAGENT_DELEGATION_DIRECTIVE=/\bdelegate\s+to\s+a\s+subagent\s*:\s*(.+)$/iu,PARALLEL_AUTHORED_TOOLS_DIRECTIVE=/^call tools in parallel:\s*(.+)$/imu;function createParallelAuthoredToolCallsResult(e,t){let n=getLastUserPromptText(e.prompt);if(n===null)return null;let r=PARALLEL_AUTHORED_TOOLS_DIRECTIVE.exec(n)?.[1]?.split(`,`).map(e=>e.trim()).filter(Boolean);if(r===void 0||r.length<2||new Set(r).size!==r.length)return null;let i=new Map(getAvailableTools(e).map(e=>[e.name,e])),a=[];for(let e of r){let t=i.get(e);if(t===void 0)return null;a.push(t)}let o=resolveWeatherCity(n);return createToolCallsGenerateResult({calls:a.map(e=>({input:createMockAuthoredToolInput(e,n,o),toolCallId:createToolCallId(e.name),toolName:e.name})),inputTokens:estimateTokenCount(getPromptText(e.prompt)),modelId:t,outputTokens:estimateTokenCount(n)})}function createSubagentDelegationResult(e,t){let n=getLastUserPromptText(e.prompt);if(n===null)return null;let r=SUBAGENT_DELEGATION_DIRECTIVE.exec(n);if(r?.[1]===void 0)return null;let i=`agent`;if(getAvailableTools(e).find(e=>e.name===i)===void 0)return null;let a=r[1].trim();return createToolCallGenerateResult({input:{message:a},inputTokens:estimateTokenCount(getPromptText(e.prompt)),modelId:t,outputTokens:estimateTokenCount(a),toolCallId:createToolCallId(i),toolName:i})}function createAuthoredToolCallResult(e,t){let n=getLastUserPromptText(e.prompt);if(n===null)return null;let r=findRelevantTool(getAvailableTools(e),n);if(r===null)return null;let i=resolveWeatherCity(n),a=createMockAuthoredToolInput(r,n,i);return createToolCallGenerateResult({input:a,inputTokens:estimateTokenCount(getPromptText(e.prompt)),modelId:t,outputTokens:estimateTokenCount(Object.values(a).join(` `)),toolCallId:createToolCallId(r.name),toolName:r.name})}function createFollowUpToolCallResult(e){let t=findNextExplicitToolAfterResult({previousToolName:e.result.toolName,prompt:e.options.prompt,tools:getAvailableTools(e.options)});if(t===null)return null;let n=createFollowUpToolInput(e.result.output);return n===null?null:createToolCallGenerateResult({input:n,inputTokens:estimateTokenCount(getPromptText(e.options.prompt)),modelId:e.modelId,outputTokens:estimateTokenCount(Object.values(n).join(` `)),toolCallId:createToolCallId(t.name),toolName:t.name})}const LIST_ATTACHMENTS_DIRECTIVE=/\blist the attachments\b/iu;function createAssistantMessage(e){let t=getLastUserPromptText(e)??`Hello from eve`;if(LIST_ATTACHMENTS_DIRECTIVE.test(t))return`Attachments: ${JSON.stringify(listPromptAttachments(e))}`;let n=getSystemPromptLabels(e),r=resolveSystemProbe(e),i=resolveMockFixtureToken(e);return i===null?n.length>0?r===null?`Bootstrap reply [${n.join(`, `)}]: ${t}`:`Bootstrap reply [${n.join(`, `)}; probe=${r}]: ${t}`:r===null?`Bootstrap reply: ${t}`:`Bootstrap reply [probe=${r}]: ${t}`:i}function formatToolResultReply(e,t){if(e.isError)return`Local weather tool failed: ${formatToolOutput(e.output)}`;if(isWeatherPayload(e.output))return`Used local weather tool for ${e.output.city}: ${e.output.condition}, ${e.output.temperatureF}F. ${e.output.summary}`;let n=getLastUserPromptText(t)??`Hello from eve`;return`Used ${e.toolName} for "${n}": ${formatToolOutput(e.output)}`}function createToolCallGenerateResult(e){return createToolCallsGenerateResult({calls:[{input:e.input,toolCallId:e.toolCallId,toolName:e.toolName}],inputTokens:e.inputTokens,modelId:e.modelId,outputTokens:e.outputTokens})}function createToolCallsGenerateResult(e){return{content:e.calls.map(e=>({input:JSON.stringify(e.input),toolCallId:e.toolCallId,toolName:e.toolName,type:`tool-call`})),finishReason:{raw:void 0,unified:`tool-calls`},response:{id:`bootstrap-response`,modelId:e.modelId,timestamp:new Date(`2026-03-16T00:00:00.000Z`)},usage:{inputTokens:{cacheRead:0,cacheWrite:0,noCache:e.inputTokens,total:e.inputTokens},outputTokens:{reasoning:0,text:e.outputTokens,total:e.outputTokens}},warnings:[]}}function getAvailableTools(e){return(e.tools??[]).flatMap(e=>e.type===`function`?[{description:e.description,inputSchema:`inputSchema`in e?e.inputSchema:void 0,name:e.name,outputSchema:`outputSchema`in e?e.outputSchema:void 0}]:[])}function getLastAuthoredToolResult(e){for(let t of[...e].reverse()){if(t.role===`user`){let e=getPromptContentText(t.content).trim(),n=readTaskResults(e).at(-1);if(n!==void 0){let{body:e,taskId:t,tool:r}=n;return{isError:n.status===`failed`,output:e,toolCallId:t,toolName:r}}if(isFrameworkAnnouncementText(e))continue;return null}if(t.role===`tool`||t.role===`assistant`){for(let e of[...t.content].reverse())if(typeof e!=`string`&&e.type===`tool-result`&&e.toolName!==LOAD_SKILL_TOOL_NAME)return{isError:e.output.type===`error-json`||e.output.type===`error-text`||e.output.type===`execution-denied`,output:e.output.type===`execution-denied`?{reason:e.output.reason??null,type:e.output.type}:e.output.value,toolCallId:e.toolCallId,toolName:e.toolName}}}return null}function findNextExplicitToolAfterResult(e){let t=getLastUserPromptText(e.prompt);if(t===null)return null;let n=normalizeText(t),r=n.indexOf(normalizeText(e.previousToolName));return r<0?null:e.tools.filter(t=>t.name!==e.previousToolName).flatMap(e=>{let t=n.indexOf(normalizeText(e.name),r+1);return t<0?[]:[{index:t,tool:e}]}).sort((e,t)=>e.index-t.index)[0]?.tool??null}function createFollowUpToolInput(e){return isRecord(e)&&typeof e.stepKey==`string`?{stepKey:e.stepKey}:null}function getSystemPromptLabels(e){let t=e.filter(e=>e.role===`system`);if(t.length===0)return[];let n=t.flatMap(e=>{let t=getPromptContentText(e.content);if(t.startsWith(`Available skills
2
2
  `))return[];let n=t.split(`
3
3
  `).map(e=>e.trim()).filter(e=>e.length>0),r=[];for(let e of n){if(e===BOOTSTRAP_RUNTIME_SYSTEM_PROMPT||e===`Available skills`)continue;let t=/^System \((.+)\)$/.exec(e);if(t?.[1]){r.push(t[1]);continue}let n=/^Skill \((.+)\)$/.exec(e);n?.[1]&&r.push(n[1])}if(r.length>0)return r;let i=n.find(e=>e!==BOOTSTRAP_RUNTIME_SYSTEM_PROMPT&&e!==`Available skills`);return i===void 0?[]:[i]});return[...new Set(n)]}function findRelevantTool(e,t){let n=normalizeText(t),r=e.find(e=>e.name!==`agent`&&e.name!==LOAD_SKILL_TOOL_NAME&&n.includes(normalizeText(e.name)));return r===void 0?/\b(forecast|temperature|weather|wind|rain|snow)\b/u.test(n)?e.find(e=>/\b(forecast|temperature|weather|wind|rain|snow)\b/u.test(normalizeText(`${e.name} ${e.description??``}`)))??null:null:r}function normalizeText(e){return e.toLowerCase().replace(/[^a-z0-9]+/gu,` `).trim()}function createToolCallId(e){return`call_${e.toLowerCase().replace(/[^a-z0-9]+/gu,`_`).replace(/^_+|_+$/gu,``)||`tool`}`}function resolveSystemProbe(e){let t=e.filter(e=>e.role===`system`).map(e=>getPromptContentText(e.content)).join(`
4
- `);return/hmr-probe:\s*([^\n]+)/iu.exec(t)?.[1]?.trim()||null}function isWeatherPayload(e){return z.validate(bootstrapWeatherPayloadSchema,e)}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{createMockAuthoredRuntimeModel,resolveMockAuthoredRuntimeModel,shouldMockAuthoredRuntimeModels};
4
+ `);return/hmr-probe:\s*([^\n]+)/iu.exec(t)?.[1]?.trim()||null}function isWeatherPayload(e){return z.validate(bootstrapWeatherPayloadSchema,e)}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const ATTACHMENT_NOTE=/^Attachment\b/u;function listPromptAttachments(e){return e.flatMap(e=>e.role!==`user`||typeof e.content==`string`?[]:e.content.flatMap(e=>{if(typeof e==`string`)return[];if(e.type===`text`)return ATTACHMENT_NOTE.test(e.text)?[{note:e.text.replaceAll(`"`,`'`)}]:[];if(e.type!==`file`)return[];let t=e.filename?.split(`/`).at(-1)??null,n=fileData(e.data);if(n instanceof URL)return[{mediaType:e.mediaType,name:t,url:n.href}];if(n===void 0)return[{mediaType:e.mediaType,name:t}];let r=typeof n==`string`?Buffer.from(n,`base64`):Buffer.from(n);return[{bytes:r.length,mediaType:e.mediaType,name:t,sha256:createHash(`sha256`).update(r).digest(`hex`).slice(0,16)}]}))}function fileData(e){if(typeof e==`string`||e instanceof Uint8Array||e instanceof URL)return e;if(typeof e!=`object`||!e)return;let t=e;if(t.type===`url`&&t.url instanceof URL)return t.url;if(t.type===`data`)return fileData(t.data)}export{createMockAuthoredRuntimeModel,resolveMockAuthoredRuntimeModel,shouldMockAuthoredRuntimeModels};
@@ -6,6 +6,12 @@ import type { ConnectionClient, ConnectionToolExecuteOptions, ConnectionToolMeta
6
6
  *
7
7
  * Created lazily per-connection per-session. Caches tool metadata after
8
8
  * the first `getToolMetadata()` call.
9
+ *
10
+ * When the connection declares `authorization` but no token is available
11
+ * yet (`getToken` throws {@link ConnectionAuthorizationRequiredError}), the
12
+ * client connects anonymously instead of failing. Sign-in is only requested
13
+ * once the server asks for it: an HTTP `401` on any request, or a tool
14
+ * result that carries an `mcp/www_authenticate` challenge.
9
15
  */
10
16
  export declare class McpConnectionClient implements ConnectionClient {
11
17
  #private;
@@ -35,7 +41,8 @@ export declare class McpConnectionClient implements ConnectionClient {
35
41
  * A `401`/`invalid_token` from the remote server is translated into
36
42
  * {@link ConnectionAuthorizationRequiredError} via {@link #rethrowClassified}
37
43
  * so callers re-enter the authorization flow instead of surfacing an
38
- * opaque transport error.
44
+ * opaque transport error. A tool error result carrying an
45
+ * `_meta["mcp/www_authenticate"]` challenge is treated the same way.
39
46
  */
40
47
  executeTool(toolName: string, args: unknown, options: ConnectionToolExecuteOptions): Promise<unknown>;
41
48
  close(): Promise<void>;
@@ -49,6 +56,16 @@ export declare class McpConnectionClient implements ConnectionClient {
49
56
  * left to propagate, since re-running the same grant would not help.)
50
57
  */
51
58
  export declare function isMcpAuthRequiredError(error: unknown): boolean;
59
+ /** `_meta` key a tool result uses to ask for sign-in (OpenAI Apps SDK convention). */
60
+ export declare const MCP_WWW_AUTHENTICATE_META_KEY = "mcp/www_authenticate";
61
+ /**
62
+ * Returns `true` for a `tools/call` error result that asks the client to
63
+ * sign in: `isError: true` plus a non-empty `_meta["mcp/www_authenticate"]`
64
+ * (a `WWW-Authenticate` challenge string or list of them). Servers that
65
+ * accept anonymous `initialize`/`tools/list` use this to protect individual
66
+ * tools without failing the whole HTTP request.
67
+ */
68
+ export declare function isMcpAuthChallengeResult(result: unknown): boolean;
52
69
  /**
53
70
  * Returns `true` when a tool name passes the configured filter.
54
71
  */
@@ -1 +1 @@
1
- import{isObject}from"#shared/guards.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{ConnectionAuthorizationRequiredError}from"#connections/errors.js";import{evictScopedToken,resolveScopedToken}from"#runtime/connections/scoped-authorization.js";import{resolveConnectionAuthorization}from"#runtime/connections/resolve-authorization.js";import{createMCPClient}from"#compiled/@ai-sdk/mcp/index.js";import{omitProvidedArgumentsFromSchema,resolveProvidedArguments}from"#runtime/connections/provided-arguments.js";import{createMcpTraceFetch,withMcpToolCallSpan,withMcpToolsListSpan}from"#runtime/connections/mcp-tracing.js";var McpConnectionClient=class{#e;#t;#n;#r;#i;constructor(e){this.#i=e}async connect(){if(this.#t!==void 0)return this.#t;if(this.#e!==void 0)return this.#e;this.#e=this.#a();try{return this.#t=await this.#e,this.#t}catch(e){throw this.#e=void 0,e}}async#a(){let e=await resolveHeaders(this.#i),t=this.#i.url,n=createMcpTraceFetch({connectionName:this.#i.connectionName,getProtocolVersion:()=>this.#t?.initializeResult?.protocolVersion});try{return await createMCPClient({protocolVersionDiscovery:this.#i.protocolVersionDiscovery,transport:{fetch:n,headers:e,type:`http`,url:t}})}catch(r){if(!isMcpHttpFallbackRetryableError(r))throw r;return await createMCPClient({protocolVersionDiscovery:this.#i.protocolVersionDiscovery,transport:{fetch:n,headers:e,type:`sse`,url:t}})}}async getToolMetadata(){return(await this.#o()).metadata}async executeTool(e,t,n){try{let{tools:r}=await this.#o(),i=r[e];if(i?.execute===void 0)throw Error(`Tool "${e}" not found in connection "${this.#i.connectionName}".`);let a=i.execute,o=await resolveProvidedArguments({args:t,callId:n.callId,connection:this.#i,toolName:e});return await withMcpToolCallSpan({arguments:t,connectionName:this.#i.connectionName,execute:async()=>await a(o,{abortSignal:n.abortSignal}),protocolVersion:this.#t?.initializeResult?.protocolVersion,toolName:e})}catch(e){return await this.#l(e)}}async#o(){if(this.#r!==void 0)return this.#r;if(this.#n!==void 0)return this.#n;this.#n=this.#s();try{return this.#r=await this.#n,this.#r}catch(e){throw this.#n=void 0,e}}async#s(){try{return await this.#c()}catch(e){return await this.#l(e)}}async#c(){let e=await this.connect(),t=await withMcpToolsListSpan({connectionName:this.#i.connectionName,execute:()=>e.listTools(),protocolVersion:e.initializeResult?.protocolVersion}),n=this.#i.tools,r=n===void 0?t.tools:t.tools.filter(e=>passesToolFilter(e.name,n)),i=Object.keys(this.#i.toolCall?.providedArguments??{}),a=r.map(e=>({...e,inputSchema:omitProvidedArgumentsFromSchema(e.inputSchema,i)})),o=e.toolsFromDefinitions({tools:a});return{metadata:a.map(e=>({annotations:e.annotations,description:e.description??``,inputSchema:e.inputSchema??{},name:e.name,outputSchema:`outputSchema`in e&&e.outputSchema!==void 0?e.outputSchema:void 0})),tools:o}}async close(){this.#t!==void 0&&(await this.#t.close(),this.#t=void 0),this.#e=void 0,this.#n=void 0,this.#r=void 0}async#l(e){throw isMcpAuthRequiredError(e)?(await this.#u(),await this.close(),new ConnectionAuthorizationRequiredError(this.#i.connectionName,{message:`Connection "${this.#i.connectionName}" requires authorization (the server rejected the token).`})):e}async#u(){let e=await resolveConnectionAuthorization(this.#i);e!==void 0&&await evictScopedToken({authorization:e,connection:{url:this.#i.url},instanceId:this.#i.instanceId,scope:this.#i.connectionName})}};function isMcpAuthRequiredError(e){return readHttpStatus(e)===401}function isMcpHttpFallbackRetryableError(e){let t=readHttpStatus(e);return t===400||t===404||t===405}function readHttpStatus(e){for(let t of walkErrorChain(e)){if(!isObject(t))continue;let e=readStatusField(t);if(e!==void 0)return e;let n=t.response;if(isObject(n)){let e=readStatusField(n);if(e!==void 0)return e}if(typeof t.message==`string`){let e=/\bHTTP\s+(\d{3})\b/u.exec(t.message);if(e?.[1]!==void 0)return Number(e[1])}}}function readStatusField(e){if(typeof e.status==`number`)return e.status;if(typeof e.statusCode==`number`)return e.statusCode}function*walkErrorChain(e){let t=e,n=new Set;for(;t!=null&&!n.has(t);){if(n.add(t),yield t,!isObject(t)||!(`cause`in t))return;t=t.cause}}function passesToolFilter(e,t){return t===void 0?!0:`allow`in t?t.allow.includes(e):!t.block.includes(e)}async function resolveHeaders(e){let t={},n,getCallbackContext=()=>n??=buildCallbackContext(),r=await resolveConnectionAuthorization(e,typeof e.authorization==`function`?getCallbackContext():void 0);if(r!==void 0&&(t.Authorization=`Bearer ${(await resolveToken(e,r)).token}`),e.headers!==void 0){let n=await resolveHeadersDefinition(e.headers,getCallbackContext);for(let[i,a]of Object.entries(n)){if(r!==void 0&&i.toLowerCase()===`authorization`)throw Error(`Connection "${e.connectionName}" headers must not include an "Authorization" key when "authorization" is also provided.`);t[i]=a}}return t}async function resolveToken(e,t){return await resolveScopedToken({authorization:t,connection:{url:e.url},instanceId:e.instanceId,scope:e.connectionName})}async function resolveHeadersDefinition(e,t){if(typeof e==`function`)return{...await e(t())};let n={},r=Object.entries(e);for(let[e,i]of r)n[e]=await resolveHeaderValue(i,t);return n}async function resolveHeaderValue(e,t){return typeof e==`function`?await e(t()):await e}export{McpConnectionClient,isMcpAuthRequiredError,passesToolFilter,resolveHeaders};
1
+ import{isObject}from"#shared/guards.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{ConnectionAuthorizationRequiredError,isConnectionAuthorizationRequiredError}from"#connections/errors.js";import{evictScopedToken,resolveScopedToken}from"#runtime/connections/scoped-authorization.js";import{resolveConnectionAuthorization}from"#runtime/connections/resolve-authorization.js";import{createMCPClient}from"#compiled/@ai-sdk/mcp/index.js";import{omitProvidedArgumentsFromSchema,resolveProvidedArguments}from"#runtime/connections/provided-arguments.js";import{createMcpTraceFetch,withMcpToolCallSpan,withMcpToolsListSpan}from"#runtime/connections/mcp-tracing.js";var McpConnectionClient=class{#e;#t;#n;#r;#i;#a=!1;constructor(e){this.#i=e}async connect(){if(this.#t!==void 0)return this.#t;if(this.#e!==void 0)return this.#e;this.#e=this.#o();try{return this.#t=await this.#e,this.#t}catch(e){throw this.#e=void 0,e}}async#o(){let{anonymous:e,headers:t}=await resolveConnectionHeaders(this.#i,{anonymousWhenAuthorizationRequired:!0});this.#a=e;let n=this.#i.url,r=createMcpTraceFetch({connectionName:this.#i.connectionName,getProtocolVersion:()=>this.#t?.initializeResult?.protocolVersion});try{return await createMCPClient({protocolVersionDiscovery:this.#i.protocolVersionDiscovery,transport:{fetch:r,headers:t,type:`http`,url:n}})}catch(e){if(!isMcpHttpFallbackRetryableError(e))throw e;return await createMCPClient({protocolVersionDiscovery:this.#i.protocolVersionDiscovery,transport:{fetch:r,headers:t,type:`sse`,url:n}})}}async getToolMetadata(){return(await this.#s()).metadata}async executeTool(e,t,n){let r;try{let{tools:i}=await this.#s(),a=i[e];if(a?.execute===void 0)throw Error(`Tool "${e}" not found in connection "${this.#i.connectionName}".`);let o=a.execute,s=await resolveProvidedArguments({args:t,callId:n.callId,connection:this.#i,toolName:e});r=await withMcpToolCallSpan({arguments:t,connectionName:this.#i.connectionName,execute:async()=>await o(s,{abortSignal:n.abortSignal}),protocolVersion:this.#t?.initializeResult?.protocolVersion,toolName:e})}catch(e){return await this.#u(e)}return isMcpAuthChallengeResult(r)?await this.#d(`the server asked for sign-in to call "${e}"`):r}async#s(){if(this.#r!==void 0)return this.#r;if(this.#n!==void 0)return this.#n;this.#n=this.#c();try{return this.#r=await this.#n,this.#r}catch(e){throw this.#n=void 0,e}}async#c(){try{return await this.#l()}catch(e){return await this.#u(e)}}async#l(){let e=await this.connect(),t=await withMcpToolsListSpan({connectionName:this.#i.connectionName,execute:()=>e.listTools(),protocolVersion:e.initializeResult?.protocolVersion}),n=this.#i.tools,r=n===void 0?t.tools:t.tools.filter(e=>passesToolFilter(e.name,n)),i=Object.keys(this.#i.toolCall?.providedArguments??{}),a=r.map(e=>({...e,inputSchema:omitProvidedArgumentsFromSchema(e.inputSchema,i)})),o=e.toolsFromDefinitions({tools:a});return{metadata:a.map(e=>({annotations:e.annotations,description:e.description??``,inputSchema:e.inputSchema??{},name:e.name,outputSchema:`outputSchema`in e&&e.outputSchema!==void 0?e.outputSchema:void 0})),tools:o}}async close(){this.#t!==void 0&&(await this.#t.close(),this.#t=void 0),this.#e=void 0,this.#n=void 0,this.#r=void 0,this.#a=!1}async#u(e){if(!isMcpAuthRequiredError(e))throw e;return await this.#d(this.#a?`the server requires sign-in`:`the server rejected the token`)}async#d(e){throw this.#a||await this.#f(),await this.close(),new ConnectionAuthorizationRequiredError(this.#i.connectionName,{message:`Connection "${this.#i.connectionName}" requires authorization (${e}).`})}async#f(){let e=await resolveConnectionAuthorization(this.#i);e!==void 0&&await evictScopedToken({authorization:e,connection:{url:this.#i.url},instanceId:this.#i.instanceId,scope:this.#i.connectionName})}};function isMcpAuthRequiredError(e){return readHttpStatus(e)===401}const MCP_WWW_AUTHENTICATE_META_KEY=`mcp/www_authenticate`;function isMcpAuthChallengeResult(e){if(!isObject(e)||e.isError!==!0||!isObject(e._meta))return!1;let t=e._meta[MCP_WWW_AUTHENTICATE_META_KEY];return(typeof t==`string`||Array.isArray(t))&&t.length>0}function isMcpHttpFallbackRetryableError(e){let t=readHttpStatus(e);return t===400||t===404||t===405}function readHttpStatus(e){for(let t of walkErrorChain(e)){if(!isObject(t))continue;let e=readStatusField(t);if(e!==void 0)return e;let n=t.response;if(isObject(n)){let e=readStatusField(n);if(e!==void 0)return e}if(typeof t.message==`string`){let e=/\bHTTP\s+(\d{3})\b/u.exec(t.message);if(e?.[1]!==void 0)return Number(e[1])}}}function readStatusField(e){if(typeof e.status==`number`)return e.status;if(typeof e.statusCode==`number`)return e.statusCode}function*walkErrorChain(e){let t=e,n=new Set;for(;t!=null&&!n.has(t);){if(n.add(t),yield t,!isObject(t)||!(`cause`in t))return;t=t.cause}}function passesToolFilter(e,t){return t===void 0?!0:`allow`in t?t.allow.includes(e):!t.block.includes(e)}async function resolveHeaders(e){let{headers:t}=await resolveConnectionHeaders(e,{anonymousWhenAuthorizationRequired:!1});return t}async function resolveConnectionHeaders(e,t){let n={},r=!1,i,getCallbackContext=()=>i??=buildCallbackContext(),a=await resolveConnectionAuthorization(e,typeof e.authorization==`function`?getCallbackContext():void 0);if(a!==void 0)try{n.Authorization=`Bearer ${(await resolveToken(e,a)).token}`}catch(e){if(!t.anonymousWhenAuthorizationRequired||!isConnectionAuthorizationRequiredError(e))throw e;r=!0}if(e.headers!==void 0){let t=await resolveHeadersDefinition(e.headers,getCallbackContext);for(let[r,i]of Object.entries(t)){if(a!==void 0&&r.toLowerCase()===`authorization`)throw Error(`Connection "${e.connectionName}" headers must not include an "Authorization" key when "authorization" is also provided.`);n[r]=i}}return{anonymous:r,headers:n}}async function resolveToken(e,t){return await resolveScopedToken({authorization:t,connection:{url:e.url},instanceId:e.instanceId,scope:e.connectionName})}async function resolveHeadersDefinition(e,t){if(typeof e==`function`)return{...await e(t())};let n={},r=Object.entries(e);for(let[e,i]of r)n[e]=await resolveHeaderValue(i,t);return n}async function resolveHeaderValue(e,t){return typeof e==`function`?await e(t()):await e}export{MCP_WWW_AUTHENTICATE_META_KEY,McpConnectionClient,isMcpAuthChallengeResult,isMcpAuthRequiredError,passesToolFilter,resolveHeaders};
@@ -1 +1 @@
1
- import{expectFunction,expectObjectRecord}from"#internal/authored-module.js";import{toErrorMessage}from"#shared/errors.js";import{isToolSchema,toInputSchema,toOutputSchema}from"#tools/schema.js";import{registerDefinitionSource}from"#internal/authored-definition/source-identity.js";import{normalizeApproval}from"#internal/authored-definition/approval.js";import{createWorkflowProgramExecuteInput}from"#tools/workflow-program-input.js";import{ResolveAgentError,loadResolvedModuleExport}from"#runtime/resolve-helpers.js";async function resolveToolDefinition(e,t,n,r){if(!e.hasExecute)return{availableInSubagents:e.availableInSubagents,behavior:e.behavior,description:e.description,inputSchema:toInputSchema(e.inputSchema),logicalPath:e.logicalPath,name:e.name,outputSchema:toOutputSchema(e.outputSchema),owner:r,sourceId:e.sourceId,sourceKind:`module`};try{let i=await loadResolvedModuleExport({definition:e,kindLabel:`tool`,moduleMap:t,nodeId:n}),a=expectObjectRecord(i,describe(e,`to return an object`));registerDefinitionSource(a,{kind:`tool`,logicalPath:e.logicalPath,name:e.name},`tool:${a.description}`);let o=e.behavior?.handling?.kind===`workflow-tool`?void 0:expectFunction(a.execute,describe(e,`to provide an execute function`)),s=isToolSchema(a.inputSchema)?a.inputSchema:toInputSchema(e.inputSchema),c=isToolSchema(a.outputSchema)?a.outputSchema:toOutputSchema(e.outputSchema),l=e.workflowProgram,u=l===void 0?void 0:e=>createWorkflowProgramExecuteInput(l,e);return{availableInSubagents:e.availableInSubagents,behavior:e.behavior,description:e.description,execute:o,executeInput:u,exportName:e.exportName,inputSchema:s,logicalPath:e.logicalPath,name:e.name,owner:r,outputSchema:c,sourceId:e.sourceId,sourceKind:`module`,...extractOptionalHooks(a,e)}}catch(t){throw t instanceof ResolveAgentError?t:new ResolveAgentError(`Failed to attach the tool execute function from "${e.logicalPath}": ${toErrorMessage(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}function extractOptionalHooks(e,t){let n={};if(e.label!==void 0){let r=expectObjectRecord(e.label,describe(t,`to provide a valid label definition`));n.label={complete:r.complete===void 0?void 0:expectFunction(r.complete,describe(t,`to provide an label complete function`)),delta:r.delta===void 0?void 0:expectFunction(r.delta,describe(t,`to provide an label delta function`)),start:expectFunction(r.start,describe(t,`to provide a label start callback function`))}}return e.approval!==void 0&&(n.approval=normalizeApproval(e.approval,describe(t,`to provide a valid approval definition`))),e.approvalKey!==void 0&&(n.approvalKey=expectFunction(e.approvalKey,describe(t,`to provide an approvalKey function`))),e.endsTurn!==void 0&&(n.endsTurn=typeof e.endsTurn==`boolean`?e.endsTurn:expectFunction(e.endsTurn,describe(t,`to provide endsTurn as a boolean or a function`))),e.toModelOutput!==void 0&&(n.toModelOutput=expectFunction(e.toModelOutput,describe(t,`to provide a toModelOutput function`))),n}function describe(e,t){return`Expected the tool export "${e.exportName??`default`}" from "${e.logicalPath}" ${t}.`}export{resolveToolDefinition};
1
+ import{expectFunction,expectObjectRecord}from"#internal/authored-module.js";import{toErrorMessage}from"#shared/errors.js";import{isToolSchema,toInputSchema,toOutputSchema}from"#tools/schema.js";import{frameworkTool,isFrameworkTool}from"#tools/provided/framework-tool.js";import{registerDefinitionSource}from"#internal/authored-definition/source-identity.js";import{normalizeApproval}from"#internal/authored-definition/approval.js";import{createWorkflowProgramExecuteInput}from"#tools/workflow-program-input.js";import{ResolveAgentError,loadResolvedModuleExport}from"#runtime/resolve-helpers.js";async function resolveToolDefinition(e,t,n,r){if(!e.hasExecute){let t={availableInSubagents:e.availableInSubagents,behavior:e.behavior,description:e.description,inputSchema:toInputSchema(e.inputSchema),logicalPath:e.logicalPath,name:e.name,outputSchema:toOutputSchema(e.outputSchema),owner:r,sourceId:e.sourceId,sourceKind:`module`};return e.behavior?.handling?.kind===`provider-tool`?frameworkTool(t):t}try{let i=await loadResolvedModuleExport({definition:e,kindLabel:`tool`,moduleMap:t,nodeId:n}),a=expectObjectRecord(i,describe(e,`to return an object`));registerDefinitionSource(a,{kind:`tool`,logicalPath:e.logicalPath,name:e.name},`tool:${a.description}`);let o=e.behavior?.handling?.kind===`workflow-tool`?void 0:expectFunction(a.execute,describe(e,`to provide an execute function`)),s=isToolSchema(a.inputSchema)?a.inputSchema:toInputSchema(e.inputSchema),c=isToolSchema(a.outputSchema)?a.outputSchema:toOutputSchema(e.outputSchema),l=e.workflowProgram,u=l===void 0?void 0:e=>createWorkflowProgramExecuteInput(l,e),d={availableInSubagents:e.availableInSubagents,behavior:e.behavior,description:e.description,execute:o,executeInput:u,exportName:e.exportName,inputSchema:s,logicalPath:e.logicalPath,name:e.name,owner:r,outputSchema:c,sourceId:e.sourceId,sourceKind:`module`,...extractOptionalHooks(a,e)};return isFrameworkTool(a)?frameworkTool(d):d}catch(t){throw t instanceof ResolveAgentError?t:new ResolveAgentError(`Failed to attach the tool execute function from "${e.logicalPath}": ${toErrorMessage(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}function extractOptionalHooks(e,t){let n={};if(e.label!==void 0){let r=expectObjectRecord(e.label,describe(t,`to provide a valid label definition`));n.label={complete:r.complete===void 0?void 0:expectFunction(r.complete,describe(t,`to provide an label complete function`)),delta:r.delta===void 0?void 0:expectFunction(r.delta,describe(t,`to provide an label delta function`)),start:expectFunction(r.start,describe(t,`to provide a label start callback function`))}}return e.approval!==void 0&&(n.approval=normalizeApproval(e.approval,describe(t,`to provide a valid approval definition`))),e.approvalKey!==void 0&&(n.approvalKey=expectFunction(e.approvalKey,describe(t,`to provide an approvalKey function`))),e.endsTurn!==void 0&&(n.endsTurn=typeof e.endsTurn==`boolean`?e.endsTurn:expectFunction(e.endsTurn,describe(t,`to provide endsTurn as a boolean or a function`))),e.toModelOutput!==void 0&&(n.toModelOutput=expectFunction(e.toModelOutput,describe(t,`to provide a toModelOutput function`))),n}function describe(e,t){return`Expected the tool export "${e.exportName??`default`}" from "${e.logicalPath}" ${t}.`}export{resolveToolDefinition};
@@ -5,6 +5,7 @@ import type { Prompter } from "../prompter.js";
5
5
  import type { ProvisioningMode, ResolvedAiGateway, ResolvedVercelProject, SetupState, WiringMode } from "../state.js";
6
6
  import type { SetupBox } from "../step.js";
7
7
  import { assertNewProjectNameAvailable, isVercelAuthenticated, pickNewProjectName, pickProject, pickTeam, requireAuth, resolveProjectByNameOrId, resolveTeam, validateTeam } from "../vercel-project.js";
8
+ import type { VercelTeamRequirement } from "../vercel-project-api.js";
8
9
  /** Injected for tests; defaults to the real Vercel project and fs helpers. */
9
10
  export interface ResolveProvisioningDeps {
10
11
  requireAuth: typeof requireAuth;
@@ -47,6 +48,7 @@ export interface ResolveProvisioningOptions {
47
48
  */
48
49
  projectSelection?: "create-or-link" | "existing-only";
49
50
  teamSelectMessage?: (currentTeam: string) => string;
51
+ teamRequirement?: VercelTeamRequirement;
50
52
  deps?: ResolveProvisioningDeps;
51
53
  }
52
54
  /** Both provisioning plans plus the model wiring they imply. Input and payload. */
@@ -1 +1 @@
1
- import{select,text}from"../ask.js";import{detectProjectResolution,isProjectResolved,mergeProjectResolution}from"../project-resolution.js";import{withSpinner}from"../with-spinner.js";import{pathExists}from"../path-exists.js";import{assertNewProjectNameAvailable,isVercelAuthenticated,pickNewProjectName,pickProject,pickTeam,requireAuth,resolveProjectByNameOrId,resolveTeam,validateTeam}from"../vercel-project.js";import{join,resolve}from"node:path";import{byokProviderEnvVar}from"#setup/scaffold/index.js";import{whimsyFor}from"#setup/cli/index.js";function vercelDemands(e){return{connectSlugs:e.connectionSelection.filter(e=>e.entry.auth?.kind===`connect`).map(e=>e.slug)}}function connectClause(e){let t=e.length===1?`authenticates`:`authenticate`;return`${e.join(`, `)} ${t} through Vercel Connect`}function vercelRequirements(e){let t=[];return e.connectSlugs.length>0&&t.push(connectClause(e.connectSlugs)),t}function resolveProvisioning(e){let t=e.deps??{requireAuth,isVercelAuthenticated,detectProjectResolution,pathExists,validateTeam,resolveTeam,pickTeam,pickProject,pickNewProjectName,assertNewProjectNameAvailable,resolveProjectByNameOrId},parent=()=>resolve(e.targetDirectory??process.cwd());async function detectAdoptableLink(n,r){if(n.projectPath.kind!==`resolved`)return;let i=n.projectPath.path;if(await t.pathExists(join(i,`.vercel`,`project.json`)))return withSpinner(e.prompter,whimsyFor(`project-detect`),async()=>{let e=await t.detectProjectResolution(i,{signal:r});if(isProjectResolved(e)&&await t.isVercelAuthenticated(i,{signal:r}))return e})}async function plansFromFlags(n,r,i,a){if(r.skipVercel)return i.apiKey===void 0?{vercelProject:{kind:`none`},aiGateway:{kind:`byop`},modelWiring:`self`}:{vercelProject:{kind:`none`},aiGateway:{kind:`byok`,apiGatewayKey:i.apiKey},modelWiring:`gateway`};if(r.team===void 0||r.team.length===0)throw Error(`Headless Vercel provisioning requires --team <slug> or --scope <slug> so the current CLI scope is not applied silently.`);await t.requireAuth(parent(),void 0,{signal:a}),await t.validateTeam(e.prompter,parent(),r.team,{signal:a});let o=await t.resolveTeam(parent(),r.team,{signal:a}),s=i.apiKey===void 0?{kind:`inherit`}:{kind:`byok`,apiGatewayKey:i.apiKey},c;if(r.project===void 0)c={kind:`new`,project:n,team:o};else{let e=await t.resolveProjectByNameOrId(parent(),o,r.project,{signal:a});if(e===null)throw Error(`Vercel project "${r.project}" was not found in ${o}.`);c={kind:`existing`,project:e,team:o}}return c.kind===`new`&&await t.assertNewProjectNameAvailable(parent(),o,c.project,{signal:a}),{vercelProject:c,aiGateway:s,modelWiring:`gateway`}}async function promptPlans(n,r){let i=e.prompter,a=n.agentName,o=e.adoptExistingLink===!1?void 0:await detectAdoptableLink(n,r);if(o!==void 0)return i.log.info(`This directory is already linked to a Vercel project, so your agent will run there — the AI Gateway authenticates through your Vercel login.`),{vercelProject:{kind:`none`},aiGateway:{kind:`inherit`},modelWiring:`gateway`,project:o};let s=vercelRequirements(vercelDemands(n)),c=!0;if(s.length>0?i.log.info(`${s.join(` and `)}, so your agent will run on Vercel.`):c=await e.asker.ask(select({key:`deploy`,message:`Where should your agent run?`,options:[{id:`vercel`,value:!0,label:`On Vercel`,hint:`AI Gateway, Durable Workflow, Sandbox, and more`},{id:`local`,value:!1,label:`Locally for now`,hint:`run with eve dev, deploy any time later`}],recommended:!0,required:!0})),c){await t.requireAuth(parent(),i,{signal:r});let n={signal:r,selectMessage:e.teamSelectMessage},o=await t.pickTeam(i,parent(),void 0,n),s=[{value:`new`,label:`Create a new project`,hint:`Name: ${a}`},{value:`link`,label:`Link an existing project`}],c=e.projectSelection!==`existing-only`&&e.prompter.selectEditable?await e.prompter.selectEditable({message:`Vercel project`,options:s,initialValue:`new`,editable:{value:`new`,defaultValue:a,formatHint:e=>`Name: ${e}`,validate:e=>e.trim().length===0?`Project name cannot be empty.`:void 0}}):void 0;if((e.projectSelection===`existing-only`?`link`:c?.value??await e.asker.ask(select({key:`vercel-project`,message:`Vercel project`,options:[{id:`new`,value:`new`,label:`Create a new project`,hint:`Name: ${a}`},{id:`link`,value:`link`,label:`Link an existing project`}],recommended:`new`,required:!0})))===`new`){let e=c?.kind===`edited`?c.text:a;return{vercelProject:{kind:`new`,project:await t.pickNewProjectName(i,parent(),o,e,{signal:r}),team:o},aiGateway:{kind:`inherit`},modelWiring:`gateway`}}return{vercelProject:await t.pickProject(i,parent(),o,{allowCreateWhenEmpty:e.projectSelection!==`existing-only`,suggestedName:a,signal:r}),aiGateway:{kind:`inherit`},modelWiring:`gateway`}}return await e.asker.ask(select({key:`credential`,message:`How should your agent reach the model?`,options:[{id:`api-key`,value:`api-key`,label:`Use my own AI Gateway API key`,hint:`AI_GATEWAY_API_KEY`},{id:`local`,value:`local`,label:`Use my own provider API key`,hint:byokProviderEnvVar(n.modelId)}],recommended:`api-key`,required:!0}))===`api-key`?{vercelProject:{kind:`none`},aiGateway:{kind:`byok`,apiGatewayKey:await e.asker.ask(text({key:`gateway-api-key`,message:`Enter your AI_GATEWAY_API_KEY`,sensitive:!0,environment:`AI_GATEWAY_API_KEY`,validate:e=>e.trim().length===0?`API key cannot be empty.`:null,required:!0}))},modelWiring:`gateway`}:{vercelProject:{kind:`none`},aiGateway:{kind:`byop`},modelWiring:`self`}}return{id:`resolve-provisioning`,async gather({state:t,signal:n}){if(e.mode.headless){let r=await plansFromFlags(t.agentName,e.mode.project,e.mode.aiGateway,n);if(r.vercelProject.kind===`none`){let e=vercelDemands(t);if(e.connectSlugs.length>0)throw Error(`${connectClause(e.connectSlugs)}, which needs a Vercel project. Remove --skip-vercel to add ${e.connectSlugs.length===1?`it`:`them`}.`)}return r}return promptPlans(t,n)},async perform({input:e}){return e},apply(e,t){return{...e,vercelProject:t.vercelProject,aiGateway:t.aiGateway,modelWiring:t.modelWiring,project:t.project===void 0?e.project:mergeProjectResolution(e.project,t.project)}}}}export{resolveProvisioning};
1
+ import{select,text}from"../ask.js";import{detectProjectResolution,isProjectResolved,mergeProjectResolution}from"../project-resolution.js";import{withSpinner}from"../with-spinner.js";import{pathExists}from"../path-exists.js";import{assertNewProjectNameAvailable,isVercelAuthenticated,pickNewProjectName,pickProject,pickTeam,requireAuth,resolveProjectByNameOrId,resolveTeam,validateTeam}from"../vercel-project.js";import{join,resolve}from"node:path";import{byokProviderEnvVar}from"#setup/scaffold/index.js";import{whimsyFor}from"#setup/cli/index.js";function vercelDemands(e){return{connectSlugs:e.connectionSelection.filter(e=>e.entry.auth?.kind===`connect`).map(e=>e.slug)}}function connectClause(e){let t=e.length===1?`authenticates`:`authenticate`;return`${e.join(`, `)} ${t} through Vercel Connect`}function vercelRequirements(e){let t=[];return e.connectSlugs.length>0&&t.push(connectClause(e.connectSlugs)),t}function resolveProvisioning(e){let t=e.deps??{requireAuth,isVercelAuthenticated,detectProjectResolution,pathExists,validateTeam,resolveTeam,pickTeam,pickProject,pickNewProjectName,assertNewProjectNameAvailable,resolveProjectByNameOrId},parent=()=>resolve(e.targetDirectory??process.cwd());async function detectAdoptableLink(n,r){if(n.projectPath.kind!==`resolved`)return;let i=n.projectPath.path;if(await t.pathExists(join(i,`.vercel`,`project.json`)))return withSpinner(e.prompter,whimsyFor(`project-detect`),async()=>{let e=await t.detectProjectResolution(i,{signal:r});if(isProjectResolved(e)&&await t.isVercelAuthenticated(i,{signal:r}))return e})}async function plansFromFlags(n,r,i,a){if(r.skipVercel)return i.apiKey===void 0?{vercelProject:{kind:`none`},aiGateway:{kind:`byop`},modelWiring:`self`}:{vercelProject:{kind:`none`},aiGateway:{kind:`byok`,apiGatewayKey:i.apiKey},modelWiring:`gateway`};if(r.team===void 0||r.team.length===0)throw Error(`Headless Vercel provisioning requires --team <slug> or --scope <slug> so the current CLI scope is not applied silently.`);await t.requireAuth(parent(),void 0,{signal:a}),await t.validateTeam(e.prompter,parent(),r.team,{signal:a});let o=await t.resolveTeam(parent(),r.team,{signal:a}),s=i.apiKey===void 0?{kind:`inherit`}:{kind:`byok`,apiGatewayKey:i.apiKey},c;if(r.project===void 0)c={kind:`new`,project:n,team:o};else{let e=await t.resolveProjectByNameOrId(parent(),o,r.project,{signal:a});if(e===null)throw Error(`Vercel project "${r.project}" was not found in ${o}.`);c={kind:`existing`,project:e,team:o}}return c.kind===`new`&&await t.assertNewProjectNameAvailable(parent(),o,c.project,{signal:a}),{vercelProject:c,aiGateway:s,modelWiring:`gateway`}}async function promptPlans(n,r){let i=e.prompter,a=n.agentName,o=e.adoptExistingLink===!1?void 0:await detectAdoptableLink(n,r);if(o!==void 0)return i.log.info(`This directory is already linked to a Vercel project, so your agent will run there — the AI Gateway authenticates through your Vercel login.`),{vercelProject:{kind:`none`},aiGateway:{kind:`inherit`},modelWiring:`gateway`,project:o};let s=vercelRequirements(vercelDemands(n)),c=!0;if(s.length>0?i.log.info(`${s.join(` and `)}, so your agent will run on Vercel.`):c=await e.asker.ask(select({key:`deploy`,message:`Where should your agent run?`,options:[{id:`vercel`,value:!0,label:`On Vercel`,hint:`AI Gateway, Durable Workflow, Sandbox, and more`},{id:`local`,value:!1,label:`Locally for now`,hint:`run with eve dev, deploy any time later`}],recommended:!0,required:!0})),c){await t.requireAuth(parent(),i,{signal:r});let n={signal:r,selectMessage:e.teamSelectMessage,teamRequirement:e.teamRequirement},o=await t.pickTeam(i,parent(),void 0,n),s=[{value:`new`,label:`Create a new project`,hint:`Name: ${a}`},{value:`link`,label:`Link an existing project`}],c=e.projectSelection!==`existing-only`&&e.prompter.selectEditable?await e.prompter.selectEditable({message:`Vercel project`,options:s,initialValue:`new`,editable:{value:`new`,defaultValue:a,formatHint:e=>`Name: ${e}`,validate:e=>e.trim().length===0?`Project name cannot be empty.`:void 0}}):void 0;if((e.projectSelection===`existing-only`?`link`:c?.value??await e.asker.ask(select({key:`vercel-project`,message:`Vercel project`,options:[{id:`new`,value:`new`,label:`Create a new project`,hint:`Name: ${a}`},{id:`link`,value:`link`,label:`Link an existing project`}],recommended:`new`,required:!0})))===`new`){let e=c?.kind===`edited`?c.text:a;return{vercelProject:{kind:`new`,project:await t.pickNewProjectName(i,parent(),o,e,{signal:r}),team:o},aiGateway:{kind:`inherit`},modelWiring:`gateway`}}return{vercelProject:await t.pickProject(i,parent(),o,{allowCreateWhenEmpty:e.projectSelection!==`existing-only`,suggestedName:a,signal:r}),aiGateway:{kind:`inherit`},modelWiring:`gateway`}}return await e.asker.ask(select({key:`credential`,message:`How should your agent reach the model?`,options:[{id:`api-key`,value:`api-key`,label:`Use my own AI Gateway API key`,hint:`AI_GATEWAY_API_KEY`},{id:`local`,value:`local`,label:`Use my own provider API key`,hint:byokProviderEnvVar(n.modelId)}],recommended:`api-key`,required:!0}))===`api-key`?{vercelProject:{kind:`none`},aiGateway:{kind:`byok`,apiGatewayKey:await e.asker.ask(text({key:`gateway-api-key`,message:`Enter your AI_GATEWAY_API_KEY`,sensitive:!0,environment:`AI_GATEWAY_API_KEY`,validate:e=>e.trim().length===0?`API key cannot be empty.`:null,required:!0}))},modelWiring:`gateway`}:{vercelProject:{kind:`none`},aiGateway:{kind:`byop`},modelWiring:`self`}}return{id:`resolve-provisioning`,async gather({state:t,signal:n}){if(e.mode.headless){let r=await plansFromFlags(t.agentName,e.mode.project,e.mode.aiGateway,n);if(r.vercelProject.kind===`none`){let e=vercelDemands(t);if(e.connectSlugs.length>0)throw Error(`${connectClause(e.connectSlugs)}, which needs a Vercel project. Remove --skip-vercel to add ${e.connectSlugs.length===1?`it`:`them`}.`)}return r}return promptPlans(t,n)},async perform({input:e}){return e},apply(e,t){return{...e,vercelProject:t.vercelProject,aiGateway:t.aiGateway,modelWiring:t.modelWiring,project:t.project===void 0?e.project:mergeProjectResolution(e.project,t.project)}}}}export{resolveProvisioning};
@@ -111,6 +111,7 @@ export declare function renderMultiselectPrompt<T extends PromptValue>(input: {
111
111
  footerNote?: string;
112
112
  leadingRail?: "white" | "green";
113
113
  message: string;
114
+ helpText?: string;
114
115
  options: readonly PromptOption<T>[];
115
116
  selectedValues: readonly T[];
116
117
  state: PromptState;
@@ -125,6 +126,7 @@ export declare function renderSelectPrompt<T extends PromptValue>(input: {
125
126
  footerNote?: string;
126
127
  leadingRail?: "white" | "green";
127
128
  message: string;
129
+ helpText?: string;
128
130
  options: readonly PromptOption<T>[];
129
131
  state: PromptState;
130
132
  }): string;
@@ -143,6 +145,7 @@ export declare function renderSearchableSelect<T extends PromptValue>(input: {
143
145
  leadingRail?: "white" | "green";
144
146
  message: string;
145
147
  multiple: boolean;
148
+ helpText?: string;
146
149
  filter: string;
147
150
  placeholder?: string;
148
151
  options: readonly PromptOption<T>[];
@@ -2,4 +2,6 @@ import{UNICODE_ROW_GLYPHS,renderCursorRow,renderOptionRow,renderOptionRowContinu
2
2
  `);return`${t.green(`│`)}\n${t.green(`●`)} ${n}\n`}function formatPromptCancellation(e,t){let n=e.replace(/\n/g,`
3
3
  `);return`${t.red(`│`)}\n${t.red(`●`)} ${t.red(n)}\n`}function formatRailLine(e,t,n){if(e===``)return`${t.green(`│`)}\n`;let r=`${t.green(`│`)} `;return`${e.split(`
4
4
  `).map(e=>e===``?t.green(`│`):wrapTextWithPrefix(n,e,r)).join(`
5
- `)}\n`}function renderMultiselectPrompt(e){let t=railFor(e.state,e.colors),n=formatPromptHeader(e.state,e.message,{colors:e.colors,leadingRail:e.leadingRail}),r=new Set(e.selectedValues),i=e.options.some(e=>!e.disabled)?``:`\n${t}\n${t} ${e.colors.dim(`(no channels available to add)`)}`;switch(e.state){case`submit`:{let t=r.size===0?e.colors.dim(`(none selected)`):e.options.filter(e=>r.has(e.value)).map(e=>e.label).join(`, `);return formatPromptSubmission(e.state,e.message,t,{colors:e.colors,leadingRail:e.leadingRail})}case`cancel`:return`${n}${t} ${e.colors.strikethrough(e.colors.dim(`cancelled`))}\n${t}`;case`error`:{let r=renderMultiselectRows({...e,rail:t});return`${n.trim()}\n${t} ${r}${i}\n${cornerFor(e.state,e.colors)} ${e.colors.red(e.error??``)}\n`}case`initial`:case`active`:return`${n}${t} ${renderMultiselectRows({...e,rail:t})}${i}\n${cornerWithNote(cornerFor(e.state,e.colors),e.footerNote)}\n`}}function cornerWithNote(e,t){return t?`${e} ${t}`:e}function renderSelectPrompt(e){let t=railFor(e.state,e.colors),n=formatPromptHeader(e.state,e.message,{colors:e.colors,leadingRail:e.leadingRail}),r=e.options[e.cursor];switch(e.state){case`submit`:{let t=r?r.label:``;return formatPromptSubmission(e.state,e.message,t,{colors:e.colors,leadingRail:e.leadingRail})}case`cancel`:return`${n}${t} ${r?e.colors.strikethrough(e.colors.dim(r.label)):``}\n${t}`;case`initial`:case`active`:case`error`:{let r=labelColumnWidth(e.options);return`${n}${t} ${e.options.map((n,i)=>{let a=i===e.cursor;return`${optionRow(n,{colors:e.colors,isCursor:a,isChecked:!1,placeholder:!1,hintPadding:r-n.label.length})}${descriptionLine(n,a,t,e.colors)}`}).join(`\n${t} `)}\n${cornerWithNote(cornerFor(e.state,e.colors),e.footerNote)}\n`}}}function labelColumnWidth(e){return e.reduce((e,t)=>Math.max(e,t.label.length),0)}function optionRow(e,t){return renderOptionRow({colors:t.colors,glyphs:UNICODE_ROW_GLYPHS,label:e.label,hint:e.hint,focusHint:e.focusHint,accent:e.accent,isCursor:t.isCursor,state:resolveOptionRowState(e,t.isChecked),placeholder:t.placeholder,hintPadding:t.hintPadding})}function descriptionLine(e,t,n,r){return t&&e.description&&!e.disabled?`\n${n} ${renderOptionRowContinuation(r.dim(e.description))}`:``}function renderSubmitRow(e,t,n=`Submit`){let r=t.bold(n),i=e?`${UNICODE_ROW_GLYPHS.selectedPointer} ${r}`:` ${t.dim(r)}`;return`${renderCursorRow(i,e,t)} ${t.green(UNICODE_ROW_GLYPHS.success)}`}function renderMultiselectRows(e){let t=new Set(e.selectedValues),n=labelColumnWidth(e.options),r=e.options.map((r,i)=>{let a=i===e.cursor;return`${optionRow(r,{colors:e.colors,isCursor:a,isChecked:t.has(r.value),placeholder:!0,hintPadding:n-r.label.length})}${descriptionLine(r,a,e.rail,e.colors)}`}).join(`\n${e.rail} `),i=renderSubmitRow(e.cursor===e.options.length,e.colors,e.submitLabel);return`${r}\n${e.rail}\n${e.rail} ${i}`}function searchableHelpLine(e,t,n){let r=(n?[[t.cyan(`type`),`to filter`]]:[[t.cyan(`type`),`to filter`],[t.cyan(`enter`),`to select`]]).map(([e,n])=>`${e}${t.dim(` ${n}`)}`).join(t.dim(` · `));return`\n${e} ${t.dim(`(`)}${r}${t.dim(`)`)}`}function renderSearchableSelect(e){let{colors:t}=e,n=railFor(e.state,t),r=formatPromptHeader(e.state,e.message,{colors:t,leadingRail:e.leadingRail});if(e.state===`submit`)return formatPromptSubmission(e.state,e.message,e.submitDisplay,{colors:t,leadingRail:e.leadingRail});if(e.state===`cancel`)return`${r}${n} ${t.strikethrough(t.dim(e.filter))}${e.filter.trim()?`\n${n}`:``}`;let i=new Set(e.selectedValues),a=0;for(;e.options[a]?.featured;)a+=1;let o=e.viewSize??8,s=e.filter===``&&a>0?Math.min(a,o):o,c=e.multiple&&e.cursor>=e.options.length,l=!c&&e.cursor>=e.options.length?0:e.cursor,u=t.inverse(` `);e.filter.length>0?u=e.filter+t.inverse(` `):e.placeholder&&(u=t.dim(e.placeholder));let d=Math.max(0,Math.min(l-Math.floor(s/2),Math.max(0,e.options.length-s))),f=Math.min(d+s,e.options.length),p=e.options.slice(d,f),m=labelColumnWidth(p),h=p.length===0?t.dim(`(no matches)`):p.map((r,a)=>{let o=!c&&a+d===l;return`${optionRow(r,{colors:t,isCursor:o,isChecked:e.multiple&&i.has(r.value),placeholder:!1,hintPadding:m-r.label.length})}${descriptionLine(r,o,n,t)}`}).join(`\n${n} `),g=e.multiple?`\n${n}\n${n} ${renderSubmitRow(c,t,e.submitLabel)}`:``,_=e.options.length>p.length?`\n${n} ${t.dim(`↑↓ ${e.options.length} options, showing ${d+1}–${f}`)}`:``,v=searchableHelpLine(n,t,e.multiple),y=`${n} ${t.dim(` `)} ${u}\n${n} ${h}${g}${_}${v}`;return e.state===`error`?`${r.trim()}\n${y}\n${cornerFor(e.state,t)} ${t.red(e.error??``)}\n`:`${r}${y}\n${cornerWithNote(cornerFor(e.state,t),e.footerNote)}\n`}export{CORNER,RAIL,bulletFor,cornerFor,formatPromptCancellation,formatPromptHeader,formatPromptOpener,formatPromptOutro,formatPromptSubmission,formatRailLine,railFor,renderMultiselectPrompt,renderSearchableSelect,renderSelectPrompt};
5
+ `)}\n`}function renderMultiselectPrompt(e){let t=railFor(e.state,e.colors),n=formatPromptHeader(e.state,e.message,{colors:e.colors,leadingRail:e.leadingRail}),r=new Set(e.selectedValues),i=e.options.some(e=>!e.disabled)?``:`\n${t}\n${t} ${e.colors.dim(`(no channels available to add)`)}`;switch(e.state){case`submit`:{let t=r.size===0?e.colors.dim(`(none selected)`):e.options.filter(e=>r.has(e.value)).map(e=>e.label).join(`, `);return formatPromptSubmission(e.state,e.message,t,{colors:e.colors,leadingRail:e.leadingRail})}case`cancel`:return`${n}${t} ${e.colors.strikethrough(e.colors.dim(`cancelled`))}\n${t}`;case`error`:{let r=renderMultiselectRows({...e,rail:t});return`${n.trim()}\n${t} ${r}${i}${selectHelpText(e.helpText,t,e.colors)}\n${cornerFor(e.state,e.colors)} ${e.colors.red(e.error??``)}\n`}case`initial`:case`active`:{let r=renderMultiselectRows({...e,rail:t}),a=cornerWithNote(cornerFor(e.state,e.colors),e.footerNote);return`${n}${t} ${r}${i}${selectHelpText(e.helpText,t,e.colors)}\n${a}\n`}}}function selectHelpText(e,t,n){return e?`\n${t}\n${e.split(`
6
+ `).map(e=>wrapTextWithPrefix(process.stdout,n.dim(e),`${t} `)).join(`
7
+ `)}\n${t}`:``}function cornerWithNote(e,t){return t?`${e} ${t}`:e}function renderSelectPrompt(e){let t=railFor(e.state,e.colors),n=formatPromptHeader(e.state,e.message,{colors:e.colors,leadingRail:e.leadingRail}),r=e.options[e.cursor];switch(e.state){case`submit`:{let t=r?r.label:``;return formatPromptSubmission(e.state,e.message,t,{colors:e.colors,leadingRail:e.leadingRail})}case`cancel`:return`${n}${t} ${r?e.colors.strikethrough(e.colors.dim(r.label)):``}\n${t}`;case`initial`:case`active`:case`error`:{let r=labelColumnWidth(e.options),i=e.options.map((n,i)=>{let a=i===e.cursor;return`${optionRow(n,{colors:e.colors,isCursor:a,isChecked:!1,placeholder:!1,hintPadding:r-n.label.length})}${descriptionLine(n,a,t,e.colors)}`}).join(`\n${t} `),a=cornerWithNote(cornerFor(e.state,e.colors),e.footerNote);return`${n}${t} ${i}${selectHelpText(e.helpText,t,e.colors)}\n${a}\n`}}}function labelColumnWidth(e){return e.reduce((e,t)=>Math.max(e,t.label.length),0)}function optionRow(e,t){return renderOptionRow({colors:t.colors,glyphs:UNICODE_ROW_GLYPHS,label:e.label,hint:e.hint,focusHint:e.focusHint,accent:e.accent,isCursor:t.isCursor,state:resolveOptionRowState(e,t.isChecked),placeholder:t.placeholder,hintPadding:t.hintPadding})}function descriptionLine(e,t,n,r){return t&&e.description&&!e.disabled?`\n${n} ${renderOptionRowContinuation(r.dim(e.description))}`:``}function renderSubmitRow(e,t,n=`Submit`){let r=t.bold(n),i=e?`${UNICODE_ROW_GLYPHS.selectedPointer} ${r}`:` ${t.dim(r)}`;return`${renderCursorRow(i,e,t)} ${t.green(UNICODE_ROW_GLYPHS.success)}`}function renderMultiselectRows(e){let t=new Set(e.selectedValues),n=labelColumnWidth(e.options),r=e.options.map((r,i)=>{let a=i===e.cursor;return`${optionRow(r,{colors:e.colors,isCursor:a,isChecked:t.has(r.value),placeholder:!0,hintPadding:n-r.label.length})}${descriptionLine(r,a,e.rail,e.colors)}`}).join(`\n${e.rail} `),i=renderSubmitRow(e.cursor===e.options.length,e.colors,e.submitLabel);return`${r}\n${e.rail}\n${e.rail} ${i}`}function searchableHelpLine(e,t,n){let r=(n?[[t.cyan(`type`),`to filter`]]:[[t.cyan(`type`),`to filter`],[t.cyan(`enter`),`to select`]]).map(([e,n])=>`${e}${t.dim(` ${n}`)}`).join(t.dim(` · `));return`\n${e} ${t.dim(`(`)}${r}${t.dim(`)`)}`}function renderSearchableSelect(e){let{colors:t}=e,n=railFor(e.state,t),r=formatPromptHeader(e.state,e.message,{colors:t,leadingRail:e.leadingRail});if(e.state===`submit`)return formatPromptSubmission(e.state,e.message,e.submitDisplay,{colors:t,leadingRail:e.leadingRail});if(e.state===`cancel`)return`${r}${n} ${t.strikethrough(t.dim(e.filter))}${e.filter.trim()?`\n${n}`:``}`;let i=new Set(e.selectedValues),a=0;for(;e.options[a]?.featured;)a+=1;let o=e.viewSize??8,s=e.filter===``&&a>0?Math.min(a,o):o,c=e.multiple&&e.cursor>=e.options.length,l=!c&&e.cursor>=e.options.length?0:e.cursor,u=t.inverse(` `);e.filter.length>0?u=e.filter+t.inverse(` `):e.placeholder&&(u=t.dim(e.placeholder));let d=Math.max(0,Math.min(l-Math.floor(s/2),Math.max(0,e.options.length-s))),f=Math.min(d+s,e.options.length),p=e.options.slice(d,f),m=labelColumnWidth(p),h=p.length===0?t.dim(`(no matches)`):p.map((r,a)=>{let o=!c&&a+d===l;return`${optionRow(r,{colors:t,isCursor:o,isChecked:e.multiple&&i.has(r.value),placeholder:!1,hintPadding:m-r.label.length})}${descriptionLine(r,o,n,t)}`}).join(`\n${n} `),g=e.multiple?`\n${n}\n${n} ${renderSubmitRow(c,t,e.submitLabel)}`:``,_=e.options.length>p.length?`\n${n} ${t.dim(`↑↓ ${e.options.length} options, showing ${d+1}–${f}`)}`:``,v=searchableHelpLine(n,t,e.multiple),y=`${n} ${t.dim(` `)} ${u}\n${n} ${h}${g}${_}${selectHelpText(e.helpText,n,t)}${v}`;return e.state===`error`?`${r.trim()}\n${y}\n${cornerFor(e.state,t)} ${t.red(e.error??``)}\n`:`${r}${y}\n${cornerWithNote(cornerFor(e.state,t),e.footerNote)}\n`}export{CORNER,RAIL,bulletFor,cornerFor,formatPromptCancellation,formatPromptHeader,formatPromptOpener,formatPromptOutro,formatPromptSubmission,formatRailLine,railFor,renderMultiselectPrompt,renderSearchableSelect,renderSelectPrompt};
@@ -73,6 +73,7 @@ export declare class SelectComponent extends Prompt<string | string[]> {
73
73
  */
74
74
  export declare function runSelectComponent<T extends PromptValue>(input: {
75
75
  message: string;
76
+ helpText?: string;
76
77
  options: readonly PromptOption<T>[];
77
78
  multiple: boolean;
78
79
  search: boolean;
@@ -1 +1 @@
1
- import{renderMultiselectPrompt,renderSearchableSelect,renderSelectPrompt}from"./prompt-ui.js";import{createSelectOptionCodec}from"./select-option-codec.js";import{filterOptions,initialSelectState,orderedSelection,reduceSelect,searchActionQuery,selectValueAtCursor,submitRowIndex}from"./select-state.js";import pc from"#compiled/picocolors/index.js";import{Prompt,isCancel}from"#compiled/@clack/core/index.js";function toPromptState(e){return e}var SelectComponent=class extends Prompt{options;multiple;search;searchAction;required;filter=``;optionCursor=0;selectedSet=new Set;constructor(e){super({render:e.render,validate:()=>this.submitError()},!1),this.options=e.options,this.multiple=e.multiple,this.search=e.search,this.searchAction=e.searchAction,this.required=e.required,this.filter=e.initial.filter,this.optionCursor=e.initial.cursor,this.selectedSet=e.initial.selected,this.refreshValue(),this.on(`key`,(e,t)=>{if(this.multiple&&t?.name===`space`){this.apply({type:`toggle`});return}if(this.search){if(t?.name===`backspace`||e===``||e===`\b`){this.apply({type:`backspace`});return}e!==void 0&&e.length===1&&e>=` `&&e!==``&&this.apply({type:`char`,char:e})}}),this.on(`cursor`,e=>{e===`up`||e===`left`?this.apply({type:`up`}):(e===`down`||e===`right`)&&this.apply({type:`down`})})}visibleOptions(){return filterOptions(this.options,this.filter,this.searchAction)}onSubmitRow(){return this.multiple&&this.optionCursor===submitRowIndex(this.visibleOptions())}submitLabel(){if(this.required)return`Submit`;let e=new Set(this.options.filter(e=>e.locked).map(e=>e.value));return[...this.selectedSet].some(t=>!e.has(t))?`Submit`:`Skip`}_shouldSubmit(){return this.multiple?this.onSubmitRow()?!0:(this.apply({type:`toggle`}),!1):this.visibleOptions()[this.optionCursor]?.completed!==!0}selectedValues(){if(this.multiple)return orderedSelection(this.options,this.selectedSet);let e=selectValueAtCursor(this.visibleOptions(),this.optionCursor);return e===void 0?[]:[e]}submitDisplay(){if(this.multiple){let e=this.options.filter(e=>this.selectedSet.has(e.value)).map(e=>e.label);return e.length>0?e.join(`, `):pc.dim(`(none selected)`)}let e=selectValueAtCursor(this.visibleOptions(),this.optionCursor);return e===void 0?``:this.labelForValue(e)}labelForValue(e){let t=searchActionQuery(e);return t!==void 0&&this.searchAction!==void 0?this.searchAction.label(t):this.options.find(t=>t.value===e)?.label??e}submitError(){return this.multiple?this.required&&this.selectedSet.size===0?`Select at least one option, then press enter.`:void 0:selectValueAtCursor(this.visibleOptions(),this.optionCursor)===void 0?`Type to match an option, then press enter.`:void 0}apply(e){let t=reduceSelect({filter:this.filter,cursor:this.optionCursor,selected:this.selectedSet},e,{options:this.options,searchAction:this.searchAction,submitRow:this.multiple});this.filter=t.filter,this.optionCursor=t.cursor,this.selectedSet=t.selected,this.refreshValue()}refreshValue(){this.value=this.multiple?orderedSelection(this.options,this.selectedSet):selectValueAtCursor(this.visibleOptions(),this.optionCursor)}};function renderSelectComponent(e,t,n,r){let i=toPromptState(e.state);return e.search?renderSearchableSelect({colors:pc,state:i,leadingRail:n,message:t.message,multiple:e.multiple,filter:e.filter,placeholder:t.placeholder,options:e.visibleOptions(),cursor:e.optionCursor,selectedValues:e.selectedValues(),submitDisplay:e.submitDisplay(),footerNote:r,error:e.error,submitLabel:e.submitLabel()}):e.multiple?renderMultiselectPrompt({colors:pc,cursor:e.optionCursor,error:e.error,footerNote:r,leadingRail:n,message:t.message,options:e.options,selectedValues:e.selectedValues(),state:i,submitLabel:e.submitLabel()}):renderSelectPrompt({colors:pc,cursor:e.optionCursor,footerNote:r,leadingRail:n,message:t.message,options:e.options,state:i})}async function runSelectComponent(e){let t=createSelectOptionCodec(e.options),n=initialSelectState({options:t.options,defaultValue:e.defaultValue===void 0?void 0:t.encode(e.defaultValue),initialValues:e.initialValues?.map(e=>t.encode(e)),submitRow:e.multiple}),r,i,a=new SelectComponent({options:t.options,multiple:e.multiple,search:e.search,searchAction:e.searchAction===void 0?void 0:{label:e.searchAction.label},required:e.required,initial:n,render(){return r?renderSelectComponent(r,{message:e.message,placeholder:e.placeholder},e.leadingRail,i?.note()):``}});r=a,i=e.attachGuard?.(a);let o=await a.prompt();if(isCancel(o))return o;if(o===void 0)throw Error(`Select prompt returned no value.`);if(Array.isArray(o))return o.map(e=>t.decode(e));let s=searchActionQuery(o);return s!==void 0&&e.searchAction!==void 0?e.searchAction.value(s):t.decode(o)}export{SelectComponent,runSelectComponent};
1
+ import{renderMultiselectPrompt,renderSearchableSelect,renderSelectPrompt}from"./prompt-ui.js";import{createSelectOptionCodec}from"./select-option-codec.js";import{filterOptions,initialSelectState,orderedSelection,reduceSelect,searchActionQuery,selectValueAtCursor,submitRowIndex}from"./select-state.js";import pc from"#compiled/picocolors/index.js";import{Prompt,isCancel}from"#compiled/@clack/core/index.js";function toPromptState(e){return e}var SelectComponent=class extends Prompt{options;multiple;search;searchAction;required;filter=``;optionCursor=0;selectedSet=new Set;constructor(e){super({render:e.render,validate:()=>this.submitError()},!1),this.options=e.options,this.multiple=e.multiple,this.search=e.search,this.searchAction=e.searchAction,this.required=e.required,this.filter=e.initial.filter,this.optionCursor=e.initial.cursor,this.selectedSet=e.initial.selected,this.refreshValue(),this.on(`key`,(e,t)=>{if(this.multiple&&t?.name===`space`){this.apply({type:`toggle`});return}if(this.search){if(t?.name===`backspace`||e===``||e===`\b`){this.apply({type:`backspace`});return}e!==void 0&&e.length===1&&e>=` `&&e!==``&&this.apply({type:`char`,char:e})}}),this.on(`cursor`,e=>{e===`up`||e===`left`?this.apply({type:`up`}):(e===`down`||e===`right`)&&this.apply({type:`down`})})}visibleOptions(){return filterOptions(this.options,this.filter,this.searchAction)}onSubmitRow(){return this.multiple&&this.optionCursor===submitRowIndex(this.visibleOptions())}submitLabel(){if(this.required)return`Submit`;let e=new Set(this.options.filter(e=>e.locked).map(e=>e.value));return[...this.selectedSet].some(t=>!e.has(t))?`Submit`:`Skip`}_shouldSubmit(){return this.multiple?this.onSubmitRow()?!0:(this.apply({type:`toggle`}),!1):this.visibleOptions()[this.optionCursor]?.completed!==!0}selectedValues(){if(this.multiple)return orderedSelection(this.options,this.selectedSet);let e=selectValueAtCursor(this.visibleOptions(),this.optionCursor);return e===void 0?[]:[e]}submitDisplay(){if(this.multiple){let e=this.options.filter(e=>this.selectedSet.has(e.value)).map(e=>e.label);return e.length>0?e.join(`, `):pc.dim(`(none selected)`)}let e=selectValueAtCursor(this.visibleOptions(),this.optionCursor);return e===void 0?``:this.labelForValue(e)}labelForValue(e){let t=searchActionQuery(e);return t!==void 0&&this.searchAction!==void 0?this.searchAction.label(t):this.options.find(t=>t.value===e)?.label??e}submitError(){return this.multiple?this.required&&this.selectedSet.size===0?`Select at least one option, then press enter.`:void 0:selectValueAtCursor(this.visibleOptions(),this.optionCursor)===void 0?`Type to match an option, then press enter.`:void 0}apply(e){let t=reduceSelect({filter:this.filter,cursor:this.optionCursor,selected:this.selectedSet},e,{options:this.options,searchAction:this.searchAction,submitRow:this.multiple});this.filter=t.filter,this.optionCursor=t.cursor,this.selectedSet=t.selected,this.refreshValue()}refreshValue(){this.value=this.multiple?orderedSelection(this.options,this.selectedSet):selectValueAtCursor(this.visibleOptions(),this.optionCursor)}};function renderSelectComponent(e,t,n,r){let i=toPromptState(e.state);return e.search?renderSearchableSelect({colors:pc,state:i,leadingRail:n,message:t.message,helpText:t.helpText,multiple:e.multiple,filter:e.filter,placeholder:t.placeholder,options:e.visibleOptions(),cursor:e.optionCursor,selectedValues:e.selectedValues(),submitDisplay:e.submitDisplay(),footerNote:r,error:e.error,submitLabel:e.submitLabel()}):e.multiple?renderMultiselectPrompt({colors:pc,cursor:e.optionCursor,error:e.error,footerNote:r,leadingRail:n,message:t.message,helpText:t.helpText,options:e.options,selectedValues:e.selectedValues(),state:i,submitLabel:e.submitLabel()}):renderSelectPrompt({colors:pc,cursor:e.optionCursor,footerNote:r,leadingRail:n,message:t.message,helpText:t.helpText,options:e.options,state:i})}async function runSelectComponent(e){let t=createSelectOptionCodec(e.options),n=initialSelectState({options:t.options,defaultValue:e.defaultValue===void 0?void 0:t.encode(e.defaultValue),initialValues:e.initialValues?.map(e=>t.encode(e)),submitRow:e.multiple}),r,i,a=new SelectComponent({options:t.options,multiple:e.multiple,search:e.search,searchAction:e.searchAction===void 0?void 0:{label:e.searchAction.label},required:e.required,initial:n,render(){return r?renderSelectComponent(r,{message:e.message,placeholder:e.placeholder,helpText:e.helpText},e.leadingRail,i?.note()):``}});r=a,i=e.attachGuard?.(a);let o=await a.prompt();if(isCancel(o))return o;if(o===void 0)throw Error(`Select prompt returned no value.`);if(Array.isArray(o))return o.map(e=>t.decode(e));let s=searchActionQuery(o);return s!==void 0&&e.searchAction!==void 0?e.searchAction.value(s):t.decode(o)}export{SelectComponent,runSelectComponent};
@@ -3,6 +3,7 @@ import { type ResolveProvisioningDeps } from "../boxes/resolve-provisioning.js";
3
3
  import type { Prompter } from "../prompter.js";
4
4
  import { readProjectLink, type VercelProjectReference } from "../project-resolution.js";
5
5
  import { requireAuth } from "../vercel-project.js";
6
+ import { type VercelTeamRequirement } from "../vercel-project-api.js";
6
7
  import { runLoginFlow } from "./login.js";
7
8
  export interface EnsureVercelProjectDeps {
8
9
  resolveProvisioning?: ResolveProvisioningDeps;
@@ -17,5 +18,6 @@ export declare function ensureVercelProject(input: {
17
18
  prompter: Prompter;
18
19
  signal?: AbortSignal;
19
20
  teamSelectMessage?: (currentTeam: string) => string;
21
+ teamRequirement?: VercelTeamRequirement;
20
22
  deps?: Partial<EnsureVercelProjectDeps>;
21
23
  }): Promise<VercelProjectReference>;
@@ -1 +1 @@
1
- import{interactiveAsker,withAnswers}from"../ask.js";import{readProjectLink}from"../project-resolution.js";import{snapshotSetupState}from"../state.js";import{requireAuth}from"../vercel-project.js";import{linkVercelProject}from"../boxes/link-project.js";import{resolveProvisioning}from"../boxes/resolve-provisioning.js";import{WizardCancelledError}from"../step.js";import{runInteractive}from"../runner.js";import{inProjectSetupState,prompterSink}from"./in-project.js";import{runLoginFlow}from"./login.js";async function ensureVercelProject(e){let t=e.deps?.readProjectLink??readProjectLink,n=await(e.deps?.runLoginFlow??runLoginFlow)({appRoot:e.appRoot,prompter:e.prompter,signal:e.signal,allowLogin:!1});if(n.kind===`cancelled`)throw new WizardCancelledError;n.kind!==`already`&&n.kind!==`logged-in`&&await(e.deps?.requireAuth??requireAuth)(e.appRoot,e.prompter,{signal:e.signal});let r=await t(e.appRoot);if(r!==void 0)return r;let i=inProjectSetupState(e.appRoot,{kind:`unresolved`}),a=[resolveProvisioning({asker:withAnswers({deploy:`vercel`})(interactiveAsker(e.prompter)),prompter:e.prompter,targetDirectory:e.appRoot,mode:{headless:!1},adoptExistingLink:!1,projectSelection:`create-or-link`,teamSelectMessage:e.teamSelectMessage,deps:e.deps?.resolveProvisioning}),linkVercelProject({prompter:e.prompter,deps:e.deps?.linkProject})];if((await runInteractive(a,i,prompterSink(e.prompter),{snapshot:snapshotSetupState,signal:e.signal})).kind===`cancelled`)throw e.signal?.throwIfAborted(),new WizardCancelledError;let o=await t(e.appRoot);if(o===void 0)throw Error(`Vercel project linking failed.`);return o}export{ensureVercelProject};
1
+ import{interactiveAsker,withAnswers}from"../ask.js";import{readProjectLink}from"../project-resolution.js";import{snapshotSetupState}from"../state.js";import{checkTeamRequirement}from"../vercel-project-api.js";import{requireAuth}from"../vercel-project.js";import{linkVercelProject}from"../boxes/link-project.js";import{resolveProvisioning}from"../boxes/resolve-provisioning.js";import{WizardCancelledError}from"../step.js";import{runInteractive}from"../runner.js";import{inProjectSetupState,prompterSink}from"./in-project.js";import{runLoginFlow}from"./login.js";async function ensureVercelProject(e){let t=e.deps?.readProjectLink??readProjectLink,n=await(e.deps?.runLoginFlow??runLoginFlow)({appRoot:e.appRoot,prompter:e.prompter,signal:e.signal,allowLogin:!1});if(n.kind===`cancelled`)throw new WizardCancelledError;n.kind!==`already`&&n.kind!==`logged-in`&&await(e.deps?.requireAuth??requireAuth)(e.appRoot,e.prompter,{signal:e.signal});let r=await t(e.appRoot);if(r!==void 0){if(e.teamRequirement){let t=await checkTeamRequirement(e.appRoot,r.orgId,e.teamRequirement,{signal:e.signal});if(t)throw Error(`Cannot configure the linked Vercel team. ${t} Run \`eve link\` to choose another team, or ask its owner to finish setup.`)}return r}let i=inProjectSetupState(e.appRoot,{kind:`unresolved`}),a=[resolveProvisioning({asker:withAnswers({deploy:`vercel`})(interactiveAsker(e.prompter)),prompter:e.prompter,targetDirectory:e.appRoot,mode:{headless:!1},adoptExistingLink:!1,projectSelection:`create-or-link`,teamSelectMessage:e.teamSelectMessage,teamRequirement:e.teamRequirement,deps:e.deps?.resolveProvisioning}),linkVercelProject({prompter:e.prompter,deps:e.deps?.linkProject})];if((await runInteractive(a,i,prompterSink(e.prompter),{snapshot:snapshotSetupState,signal:e.signal})).kind===`cancelled`)throw e.signal?.throwIfAborted(),new WizardCancelledError;let o=await t(e.appRoot);if(o===void 0)throw Error(`Vercel project linking failed.`);return o}export{ensureVercelProject};
@@ -1 +1 @@
1
- import{z}from"#compiled/zod/index.js";const DiscordApplicationSchema=z.object({id:z.string(),name:z.string(),verify_key:z.string()});async function discordRequest(e,t,n,r){return r(`https://discord.com/api/v10${t}`,{...n,headers:{authorization:`Bot ${e}`,"content-type":`application/json`,...n.headers}})}async function resolveDiscordApplication(e,t=fetch){let n=await discordRequest(e,`/oauth2/applications/@me`,{method:`GET`},t);if(!n.ok)throw Error(`Discord rejected the bot token (HTTP ${n.status}).`);let r=DiscordApplicationSchema.safeParse(await n.json());if(!r.success)throw Error(`Discord returned incomplete application details.`);return{id:r.data.id,name:r.data.name,publicKey:r.data.verify_key}}async function registerDiscordCommand(e,t,n,r=fetch){let i=await discordRequest(t,`/applications/${encodeURIComponent(e)}/commands`,{method:`POST`,body:JSON.stringify({name:n.name,description:n.description,type:1,options:[{name:`message`,description:`What should the agent do?`,type:3,required:!0}]})},r);if(!i.ok)throw Error(`Discord command registration failed (HTTP ${i.status}).`)}async function configureDiscordInteractionsEndpoint(e,t,n=fetch){let r=await discordRequest(e,`/applications/@me`,{method:`PATCH`,body:JSON.stringify({interactions_endpoint_url:`https://connect.vercel.com/trigger/${encodeURIComponent(t)}`})},n);if(!r.ok)throw Error(`Discord rejected the interactions endpoint (HTTP ${r.status}).`)}export{configureDiscordInteractionsEndpoint,registerDiscordCommand,resolveDiscordApplication};
1
+ import{z}from"#compiled/zod/index.js";const DiscordApplicationSchema=z.object({id:z.string(),name:z.string(),verify_key:z.string()});async function discordRequest(e,t,n,r){return r(`https://discord.com/api/v10${t}`,{...n,headers:{authorization:`Bot ${e}`,"content-type":`application/json`,...n.headers}})}async function resolveDiscordApplication(e,t=fetch){let n=await discordRequest(e,`/oauth2/applications/@me`,{method:`GET`},t);if(!n.ok)throw Error(`Discord rejected the bot token (HTTP ${n.status}).`);let r=DiscordApplicationSchema.safeParse(await n.json());if(!r.success)throw Error(`Discord returned incomplete application details.`);return{id:r.data.id,name:r.data.name,publicKey:r.data.verify_key}}async function registerDiscordCommand(e,t,n,r=fetch){let i=await discordRequest(t,`/applications/${encodeURIComponent(e)}/commands`,{method:`POST`,body:JSON.stringify({name:n.name,description:n.description,type:1,options:[{name:`message`,description:`What should the agent do?`,type:3,required:!0},{name:`file`,description:`A file for the agent to read`,type:11,required:!1}]})},r);if(!i.ok)throw Error(`Discord command registration failed (HTTP ${i.status}).`)}async function configureDiscordInteractionsEndpoint(e,t,n=fetch){let r=await discordRequest(e,`/applications/@me`,{method:`PATCH`,body:JSON.stringify({interactions_endpoint_url:`https://connect.vercel.com/trigger/${encodeURIComponent(t)}`})},n);if(!r.ok)throw Error(`Discord rejected the interactions endpoint (HTTP ${r.status}).`)}export{configureDiscordInteractionsEndpoint,registerDiscordCommand,resolveDiscordApplication};
@@ -0,0 +1,4 @@
1
+ import type { VercelTeamRequirement } from "#setup/vercel-project-api.js";
2
+ export declare const WEB_CHAT_TEAM_REQUIREMENT: VercelTeamRequirement;
3
+ export type WebAuthenticationChoice = "vercel" | "custom";
4
+ export declare const WEB_AUTHENTICATION_QUESTION: import("#setup/ask.js").Question<WebAuthenticationChoice>;
@@ -0,0 +1 @@
1
+ import{select}from"#setup/ask.js";const WEB_CHAT_TEAM_REQUIREMENT={permissions:{oauth2Application:[`create`,`update`],projectEnvVars:[`create`],projectEnvVarsProduction:[`create`]},disabledReason:`Web Chat sign-in requires app and environment permissions; ask a team owner.`},WEB_AUTHENTICATION_QUESTION=select({key:`web-authentication`,message:`How should people sign in to Web Chat?`,options:[{id:`vercel`,label:`Sign in with Vercel`,hint:`Create a Vercel App for members of the linked project's team.`,value:`vercel`},{id:`custom`,label:`Configure authentication myself`,hint:`Keep the current channel auth; the default rejects production browser requests.`,value:`custom`}],recommended:`vercel`,required:!0});export{WEB_AUTHENTICATION_QUESTION,WEB_CHAT_TEAM_REQUIREMENT};
@@ -0,0 +1,7 @@
1
+ /** Checks authored files before provisioning, then returns the local scaffold operation. */
2
+ export declare function prepareWebAuthScaffold(input: {
3
+ environmentRoot: string;
4
+ agentAppRoot: string;
5
+ webRoot?: string;
6
+ force?: boolean;
7
+ }): Promise<() => Promise<void>>;
@@ -0,0 +1 @@
1
+ import{readFile}from"node:fs/promises";import{basename,dirname,join,relative,sep}from"node:path";import{writeTextFile}from"#setup/scaffold/files.js";import{WEB_APP_SIGN_IN_WITH_VERCEL_TEMPLATE_FILES,WEB_APP_TEMPLATE_FILES,WEB_CHANNEL_TEMPLATES}from"#setup/scaffold/create/web-template.js";import{appendEnv}from"#setup/append-env.js";import{resolveWebPackageVersions}from"#setup/scaffold/update/web-options.js";async function readOptional(e){try{return await readFile(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return;throw e}}async function prepareWebAuthScaffold(e){let t=e.webRoot??join(e.environmentRoot,`apps`,`web`),n=join(e.agentAppRoot,`agent`,`channels`,`eve.ts`),r=relative(dirname(n),join(t,`lib`,`auth.js`)).split(sep).join(`/`),i=WEB_CHANNEL_TEMPLATES[`sign-in-with-vercel`].replace(`"@/lib/auth"`,JSON.stringify(r.startsWith(`.`)?r:`./${r}`)),a=[...Object.entries(WEB_APP_SIGN_IN_WITH_VERCEL_TEMPLATE_FILES).filter(([e])=>e!==`app/layout.tsx`).map(([n,r])=>({path:join(t,n),source:r.replaceAll(`__EVE_INIT_APP_NAME__`,()=>JSON.stringify(basename(e.agentAppRoot)).slice(1,-1)),previous:WEB_APP_TEMPLATE_FILES[n]})),{path:n,source:i,previous:WEB_CHANNEL_TEMPLATES.default}];for(let t of a){let n=await readOptional(t.path);if(!e.force&&n!==void 0&&n!==t.source&&n!==t.previous)throw Error(`Could not add Sign in with Vercel because ${t.path} contains authored code. Preserve your changes and integrate auth manually, or retry setup with --overwrite.`)}let o=join(e.environmentRoot,`package.json`);return async()=>{let t=JSON.parse(await readFile(o,`utf8`));t.dependencies={...t.dependencies,"better-auth":t.dependencies?.[`better-auth`]??resolveWebPackageVersions(void 0,`sign-in-with-vercel`).betterAuthPackageVersion};for(let e of a)await writeTextFile(e.path,e.source,{force:!0});await writeTextFile(o,`${JSON.stringify(t,null,2)}\n`,{force:!0}),await appendEnv(join(e.environmentRoot,`.env.example`),{VERCEL_APP_CLIENT_ID:``,VERCEL_APP_CLIENT_SECRET:``,BETTER_AUTH_SECRET:``})}}export{prepareWebAuthScaffold};
@@ -0,0 +1,3 @@
1
+ import type { VercelProjectReference } from "#setup/project-resolution.js";
2
+ /** Provisions team-only browser sign-in without rotating existing project credentials. */
3
+ export declare function provisionWebChatAuth(project: VercelProjectReference, signal?: AbortSignal): Promise<void>;
@@ -0,0 +1 @@
1
+ import{randomBytes}from"node:crypto";import{z}from"#compiled/zod/index.js";import{readVercelCliToken}from"#internal/model-auth/vercel-cli.js";const APP_CONFLICT_RECOVERY="Rename the Vercel project in its settings, then retry `eve add channel/web --skip-install`.",CALLBACK_PATH=`/api/auth/callback/vercel`,TARGETS=[`production`,`preview`],KEYS=[`VERCEL_APP_CLIENT_ID`,`VERCEL_APP_CLIENT_SECRET`,`BETTER_AUTH_SECRET`],AppSchema=z.object({clientId:z.string().min(1),teamId:z.string(),signInFrom:z.string().optional(),scopes:z.array(z.string()),grantTypes:z.record(z.string(),z.boolean()).optional(),clientAuthenticationMethods:z.record(z.string(),z.boolean()).optional(),projectRedirectUris:z.array(z.object({projectId:z.string(),path:z.string()})).optional(),clientSecrets:z.array(z.object({lastFourChars:z.string()})).optional()}),EnvSchema=z.object({id:z.string(),key:z.string(),value:z.string().optional(),target:z.union([z.string(),z.array(z.string())]).optional(),gitBranch:z.string().nullable().optional(),customEnvironmentIds:z.array(z.string()).optional()});var AppApiError=class extends Error{status;code;constructor(e,t){super(e===401||e===403?"Vercel denied Web Chat auth setup. Run `vercel login` and check that you can manage apps and environment variables in this team, or ask a team owner to run setup.":t===`app_limit_reached`?`This team has reached its Vercel App limit. Remove an unused app in team settings and retry.`:t===`app_name_taken`||t===`app_slug_taken`?`A Vercel App with this name or slug already exists. ${APP_CONFLICT_RECOVERY}`:"Vercel could not configure Web Chat authentication. Retry `eve add channel/web --skip-install`."),this.status=e,this.code=t}};function assertMatchingApp(e,t,n){if(e.teamId!==t.orgId||e.signInFrom!==`owning-team`||!e.grantTypes?.authorization_code||!e.clientAuthenticationMethods?.client_secret_post||![`openid`,`email`,`profile`].every(t=>e.scopes.includes(t))||!e.projectRedirectUris?.some(e=>e.projectId===t.projectId&&e.path===CALLBACK_PATH))throw Error(`The existing Vercel App does not match this project's team-only Web Chat settings. ${n?`Check VERCEL_APP_CLIENT_ID and the app in team settings before retrying.`:APP_CONFLICT_RECOVERY}`)}async function provisionWebChatAuth(e,t){let n=await readVercelCliToken();if(!n)throw Error("Run `vercel login` before setting up Sign in with Vercel.");let r=new URLSearchParams({teamId:e.orgId}),request=async(e,i=`GET`,a)=>{let o={method:i,headers:{authorization:`Bearer ${n}`,"content-type":`application/json`},redirect:`error`,signal:t?AbortSignal.any([t,AbortSignal.timeout(15e3)]):AbortSignal.timeout(15e3)};a!==void 0&&(o.body=JSON.stringify(a));let s=await fetch(`https://api.vercel.com${e}?${r}`,o).catch(()=>{throw t?.throwIfAborted(),new AppApiError(0)});if(!s.ok){let e=z.object({error:z.object({code:z.string().optional()})}).safeParse(await s.json().catch(()=>void 0));throw new AppApiError(s.status,e.success?e.data.error.code:void 0)}if(s.status!==204)return s.json().catch(()=>{throw new AppApiError(s.status)})},getApp=async e=>{try{return z.object({app:AppSchema}).parse(await request(`/oauth-apps/${encodeURIComponent(e)}`)).app}catch(e){if(e instanceof AppApiError&&e.code===`invalid_client`)return;throw e}},i=`/v9/projects/${encodeURIComponent(e.projectId)}`,a=z.object({id:z.string(),accountId:z.string(),name:z.string()}).parse(await request(i));if(a.id!==e.projectId||a.accountId!==e.orgId)throw Error(`The linked Vercel project is not available in the selected team.`);let o=z.object({envs:z.array(EnvSchema)}).parse(await request(`${i}/env`)).envs.filter(e=>!e.gitBranch&&!e.customEnvironmentIds?.length),forTarget=(e,t)=>o.find(n=>n.key===e&&(typeof n.target==`string`?[n.target]:n.target??[]).includes(t)),s=new Set(TARGETS.map(e=>forTarget(KEYS[0],e)?.value).filter(Boolean));if(s.size>1||TARGETS.some(e=>(forTarget(KEYS[1],e)||forTarget(KEYS[0],e))&&!forTarget(KEYS[0],e)?.value))throw Error(`Web Chat has conflicting or incomplete Vercel App credentials. Check production and preview environment variables before retrying.`);let c=e.projectId.replace(/^prj_/,``).toLowerCase(),l=`${a.name.slice(0,100)}-web-chat-${c}`.toLowerCase().replace(/[^a-z0-9-]/g,`-`),u=[...s][0],d=await getApp(u??l);if(!d&&u)throw Error(`The configured Vercel App is unavailable. Check VERCEL_APP_CLIENT_ID before retrying.`);if(!d)try{d=AppSchema.parse(await request(`/oauth-apps`,`POST`,{name:`${a.name.slice(0,100)} Web Chat ${c}`,slug:l,projectRedirectUris:[{projectId:e.projectId,path:CALLBACK_PATH}],scopes:[`openid`,`email`,`profile`],grantTypes:{authorization_code:!0},clientAuthenticationMethods:{client_secret_post:!0},signInFrom:`owning-team`}))}catch(e){if(!(e instanceof AppApiError)||(t?.throwIfAborted(),d=await getApp(l).catch(()=>{throw t?.throwIfAborted(),e}),!d))throw e}assertMatchingApp(d,e,u!==void 0);let missingTargets=e=>TARGETS.filter(t=>!forTarget(e,t));if(KEYS.every(e=>missingTargets(e).length===0))return;let f=missingTargets(KEYS[1]);if(f.length&&(d.clientSecrets?.length??0)>=2)throw Error(`This Vercel App has reached its client secret limit. Remove an unused secret in team settings and retry.`);let p=f.length?z.object({clientSecret:z.string().min(4)}).parse(await request(`/v1/apps/${encodeURIComponent(d.clientId)}/secrets`,`POST`,{})).clientSecret:void 0,m={VERCEL_APP_CLIENT_ID:d.clientId,VERCEL_APP_CLIENT_SECRET:p,BETTER_AUTH_SECRET:randomBytes(32).toString(`base64url`)},rollback=async e=>{let t=await Promise.allSettled(e.map(e=>request(`${i}/env/${encodeURIComponent(e.id)}`,`DELETE`))),n=t.some((t,n)=>t.status===`rejected`&&e[n]?.key===KEYS[1]);if(p&&!n&&t.push(...await Promise.allSettled([request(`/oauth-apps/${encodeURIComponent(d.clientId)}/secret/${encodeURIComponent(p.slice(-4))}`,`DELETE`)])),t.some(e=>e.status===`rejected`))throw Error(`Could not save Web Chat auth environment variables. Cleanup was incomplete. Check the project's environment variables and Vercel App client secrets in team settings before retrying.`)},h=z.object({created:z.array(EnvSchema),failed:z.array(z.unknown())}).parse(await request(`/v10/projects/${encodeURIComponent(e.projectId)}/env`,`POST`,KEYS.filter(e=>missingTargets(e).length).map(e=>({key:e,value:m[e],target:missingTargets(e),type:e===KEYS[0]?`plain`:`sensitive`,visibility:e===KEYS[0]?`config`:`secret`}))).catch(async e=>{throw e instanceof AppApiError&&e.status>=400&&e.status<500&&e.status!==408&&e.status!==499&&await rollback([]),e}));if(h.failed.length!==0)throw await rollback(h.created),Error("Could not save Web Chat auth environment variables. Retry `eve add channel/web --skip-install`.")}export{provisionWebChatAuth};
@@ -1,4 +1,9 @@
1
1
  import { resolveEveProjectContext } from "#internal/project-context.js";
2
+ import type { RegistrySetupCompletion } from "#setup/registry-setup-protocol.js";
3
+ import type { VercelProjectReference } from "#setup/project-resolution.js";
4
+ import { installScaffoldDependencies } from "../shared/scaffold.js";
5
+ import { prepareWebAuthScaffold } from "./auth-scaffold.js";
6
+ import { provisionWebChatAuth } from "./provision-auth.js";
2
7
  import { detectPackageManager, type PackageManagerKind } from "#setup/package-manager.js";
3
8
  import { pathExists, writeTextFile } from "#setup/scaffold/files.js";
4
9
  import { type SetupApplyContext, type SetupPrepareContext } from "../types.js";
@@ -8,17 +13,17 @@ export interface WebSetupDeps {
8
13
  readTextFile(path: string): Promise<string>;
9
14
  resolveEveProjectContext: typeof resolveEveProjectContext;
10
15
  writeTextFile: typeof writeTextFile;
16
+ prepareWebAuthScaffold: typeof prepareWebAuthScaffold;
17
+ provisionWebChatAuth: typeof provisionWebChatAuth;
18
+ installScaffoldDependencies: typeof installScaffoldDependencies;
11
19
  }
12
20
  interface WebSetupPlan {
13
21
  hosting: "next" | "vercel";
14
22
  packageManager: PackageManagerKind;
23
+ authProject?: VercelProjectReference;
24
+ rootWebChat?: boolean;
15
25
  }
16
26
  export declare function prepareWebSetup(context: SetupPrepareContext, deps?: WebSetupDeps): Promise<WebSetupPlan>;
17
- export declare function applyWebSetup(plan: WebSetupPlan, context: SetupApplyContext, deps?: WebSetupDeps): Promise<{
18
- facts: {
19
- label: string;
20
- value: string;
21
- }[];
22
- }>;
27
+ export declare function applyWebSetup(plan: WebSetupPlan, context: SetupApplyContext, deps?: WebSetupDeps): Promise<RegistrySetupCompletion>;
23
28
  export declare const WEB_SETUP: import("../types.js").SetupIntegration;
24
29
  export {};
@@ -1,4 +1,4 @@
1
- import{defineSetupIntegration}from"../types.js";import{readFile}from"node:fs/promises";import{join}from"node:path";import{resolveEveProjectContext}from"#internal/project-context.js";import{detectPackageManager}from"#setup/package-manager.js";import{pathExists,writeTextFile}from"#setup/scaffold/files.js";import{select}from"#setup/ask.js";import{WEB_CHANNEL_TEMPLATES}from"#setup/scaffold/create/web-template.js";const NEXT_HOSTED_CONFIG=`import type { NextConfig } from "next";
1
+ import{defineSetupIntegration}from"../types.js";import{installScaffoldDependencies}from"../shared/scaffold.js";import{prepareWebAuthScaffold}from"./auth-scaffold.js";import{WEB_AUTHENTICATION_QUESTION}from"./auth-options.js";import{provisionWebChatAuth}from"./provision-auth.js";import{readFile}from"node:fs/promises";import{join}from"node:path";import{resolveEveProjectContext}from"#internal/project-context.js";import{detectPackageManager}from"#setup/package-manager.js";import{pathExists,writeTextFile}from"#setup/scaffold/files.js";import{select}from"#setup/ask.js";import{WEB_CHANNEL_TEMPLATES}from"#setup/scaffold/create/web-template.js";const NEXT_HOSTED_CONFIG=`import type { NextConfig } from "next";
2
2
  import { withEve } from "eve/next";
3
3
  import { fileURLToPath } from "node:url";
4
4
 
@@ -25,10 +25,10 @@ export default await withEve({
25
25
  { src: "^(.*)$", destination: { type: "service", service: "web" } },
26
26
  ],
27
27
  });
28
- `,defaultDeps={detectPackageManager,pathExists,readTextFile:e=>readFile(e,`utf8`),resolveEveProjectContext,writeTextFile};async function prepareWebSetup(e,t=defaultDeps){let n=await t.resolveEveProjectContext(e.appRoot);if(n.kind===`workspace`)throw Error(`Web Chat setup requires a selected workspace agent.`);return{hosting:await e.asker.ask(select({key:`web-hosting`,message:`How should Web Chat and your agents be deployed?`,options:[{id:`vercel`,label:`Vercel services`,hint:`(Recommended) Web Chat and agents deploy as separate services.`,value:`vercel`},{id:`next`,label:`Next.js`,hint:`One Next.js app serves Web Chat and routes agent requests.`,value:`next`}],recommended:`vercel`,required:!0})),packageManager:(await t.detectPackageManager(n.environmentRoot)).kind}}function runScriptCommand(e,t){switch(e){case`npm`:return`npm run ${t}`;case`pnpm`:return`pnpm ${t}`;case`yarn`:return`yarn ${t}`;case`bun`:return`bun run ${t}`}}async function configurePeerServiceScripts(e,t){let n=join(e,`package.json`),r=JSON.parse(await t.readTextFile(n)),i={...r.scripts};i.dev??=`eve dev`,i[`dev:eve`]??=`eve dev`,i[`dev:all`]??=`vercel dev --local`,await t.writeTextFile(n,`${JSON.stringify({...r,scripts:i},null,2)}\n`,{force:!0})}async function assertInstallerOwned(e,t){try{let n=await readFile(e,`utf8`);if(t.includes(n))return}catch(e){if(e.code===`ENOENT`)return;throw e}throw Error(`Could not configure Web Chat because ${e} contains authored configuration. Preserve it and compose the eve integration manually.`)}async function applyWebSetup(e,t,n=defaultDeps){let r=await n.resolveEveProjectContext(t.appRoot);if(r.kind===`workspace`)throw Error(`Web Chat setup requires a selected workspace agent.`);let i=r.kind===`workspace-member`?r.member.appRoot:r.appRoot,a=join(i,`agent`,`channels`,`eve.ts`);(t.force||!await n.pathExists(a))&&await n.writeTextFile(a,WEB_CHANNEL_TEMPLATES.default,{force:t.force});let o=r.kind===`workspace-member`?r.member.name:void 0,s=join(r.environmentRoot,`apps`,`web`);await n.writeTextFile(join(s,`app`,`eve-agent.ts`),`/** Named workspace agent selected by the Web Chat installer. */\nexport const WEB_CHAT_AGENT: string | undefined = ${o===void 0?`undefined`:JSON.stringify(o)};\n`,{force:!0});let c=join(s,`next.config.ts`);await assertInstallerOwned(c,[`import type { NextConfig } from "next";
28
+ `,defaultDeps={detectPackageManager,pathExists,readTextFile:e=>readFile(e,`utf8`),resolveEveProjectContext,writeTextFile,prepareWebAuthScaffold,provisionWebChatAuth,installScaffoldDependencies};async function prepareWebSetup(e,t=defaultDeps){let n=await t.resolveEveProjectContext(e.appRoot);if(n.kind===`workspace`)throw Error(`Web Chat setup requires a selected workspace agent.`);let r=await t.pathExists(join(n.environmentRoot,`app`,`eve-agent.ts`))&&!await t.pathExists(join(n.environmentRoot,`apps`,`web`,`app`,`eve-agent.ts`)),i=r?`next`:await e.asker.ask(select({key:`web-hosting`,message:`How should Web Chat and your agents be deployed?`,options:[{id:`vercel`,label:`Vercel services`,hint:`(Recommended) Web Chat and agents deploy as separate services.`,value:`vercel`},{id:`next`,label:`Next.js`,hint:`One Next.js app serves Web Chat and routes agent requests.`,value:`next`}],recommended:`vercel`,required:!0})),a=await e.asker.ask(WEB_AUTHENTICATION_QUESTION)===`vercel`?await e.resolveVercelProject(`Web Chat sign-in`):void 0,o={hosting:i,packageManager:(await t.detectPackageManager(n.environmentRoot)).kind};return a!==void 0&&(o.authProject=a),r&&(o.rootWebChat=!0),o}function runScriptCommand(e,t){switch(e){case`npm`:return`npm run ${t}`;case`pnpm`:return`pnpm ${t}`;case`yarn`:return`yarn ${t}`;case`bun`:return`bun run ${t}`}}async function configurePeerServiceScripts(e,t){let n=join(e,`package.json`),r=JSON.parse(await t.readTextFile(n)),i={...r.scripts};i.dev??=`eve dev`,i[`dev:eve`]??=`eve dev`,i[`dev:all`]??=`vercel dev --local`,await t.writeTextFile(n,`${JSON.stringify({...r,scripts:i},null,2)}\n`,{force:!0})}async function assertInstallerOwned(e,t){try{let n=await readFile(e,`utf8`);if(t.includes(n))return}catch(e){if(e.code===`ENOENT`)return;throw e}throw Error(`Could not configure Web Chat because ${e} contains authored configuration. Preserve it and compose the eve integration manually.`)}async function applyWebSetup(e,t,n=defaultDeps){let r=await n.resolveEveProjectContext(t.appRoot);if(r.kind===`workspace`)throw Error(`Web Chat setup requires a selected workspace agent.`);let i=r.kind===`workspace-member`?r.member.appRoot:r.appRoot,a=join(i,`agent`,`channels`,`eve.ts`),o=e.rootWebChat?r.environmentRoot:join(r.environmentRoot,`apps`,`web`),s=e.authProject===void 0?void 0:await n.prepareWebAuthScaffold({environmentRoot:r.environmentRoot,agentAppRoot:i,webRoot:o,force:t.force});s===void 0&&(t.force||!await n.pathExists(a))&&await n.writeTextFile(a,WEB_CHANNEL_TEMPLATES.default,{force:t.force});let c=r.kind===`workspace-member`?r.member.name:void 0;await n.writeTextFile(join(o,`app`,`eve-agent.ts`),`/** Named workspace agent selected by the Web Chat installer. */\nexport const WEB_CHAT_AGENT: string | undefined = ${c===void 0?`undefined`:JSON.stringify(c)};\n`,{force:!0});let l=join(o,`next.config.ts`),u=`import type { NextConfig } from "next";
29
29
  import { withEve } from "eve/next";
30
30
 
31
31
  const nextConfig: NextConfig = {};
32
32
 
33
33
  export default withEve(nextConfig);
34
- `,NEXT_HOSTED_CONFIG,PEER_SERVICE_NEXT_CONFIG]);let l;if(e.hosting===`vercel`){let e=join(r.environmentRoot,`vercel.ts`),t=join(r.environmentRoot,`vercel.json`);if(await assertInstallerOwned(e,[PEER_SERVICE_VERCEL_CONFIG,PEER_SERVICE_VERCEL_CONFIG.replace(/ web: \{[^}]+\},/,` web: { framework: "nextjs", root: "apps/web" },`)]),await n.pathExists(t))throw Error(`Could not configure Vercel services because ${t} already exists. Preserve it and compose eve/vercel manually.`);await n.writeTextFile(c,PEER_SERVICE_NEXT_CONFIG,{force:!0}),await n.writeTextFile(e,PEER_SERVICE_VERCEL_CONFIG,{force:!0}),await configurePeerServiceScripts(r.environmentRoot,n),l=`dev:all`}else await n.writeTextFile(c,NEXT_HOSTED_CONFIG,{force:!0}),l=`dev:web`;return t.presenter.log.success(`Configured channel: web`),{facts:[{label:``,value:`Start locally with \`${runScriptCommand(e.packageManager,l)}\`.`}]}}const WEB_SETUP=defineSetupIntegration({kind:`web`,label:`Web Chat`,hint:`Browser-based chat interface`,prepare:prepareWebSetup,apply:applyWebSetup});export{WEB_SETUP,applyWebSetup,prepareWebSetup};
34
+ `;await assertInstallerOwned(l,[u,NEXT_HOSTED_CONFIG,PEER_SERVICE_NEXT_CONFIG]);let d;if(e.hosting===`vercel`){let e=join(r.environmentRoot,`vercel.ts`),t=join(r.environmentRoot,`vercel.json`);if(await assertInstallerOwned(e,[PEER_SERVICE_VERCEL_CONFIG,PEER_SERVICE_VERCEL_CONFIG.replace(/ web: \{[^}]+\},/,` web: { framework: "nextjs", root: "apps/web" },`)]),await n.pathExists(t))throw Error(`Could not configure Vercel services because ${t} already exists. Preserve it and compose eve/vercel manually.`);await n.writeTextFile(l,PEER_SERVICE_NEXT_CONFIG,{force:!0}),await n.writeTextFile(e,PEER_SERVICE_VERCEL_CONFIG,{force:!0}),await configurePeerServiceScripts(r.environmentRoot,n),d=`dev:all`}else await n.writeTextFile(l,e.rootWebChat?u:NEXT_HOSTED_CONFIG,{force:!0}),d=e.rootWebChat?`dev`:`dev:web`;e.authProject!==void 0&&s!==void 0&&(await n.provisionWebChatAuth(e.authProject,t.signal),t.signal?.throwIfAborted(),await s(),await n.installScaffoldDependencies({changed:!0,log:t.presenter.log,projectPath:r.environmentRoot,signal:t.signal}),t.presenter.log.success(`Configured Sign in with Vercel for this project's team`),t.presenter.nextSteps(["Local setup is complete. Run `eve deploy` to publish these changes. Production and preview credentials are configured.",`Local development continues to use localDev() without signing in.`])),t.presenter.log.success(`Configured channel: web`);let f={facts:[{label:``,value:`Start locally with \`${runScriptCommand(e.packageManager,d)}\`.`}]};return e.authProject!==void 0&&(f.deploymentRequired=!0),f}const WEB_SETUP=defineSetupIntegration({kind:`web`,label:`Web Chat`,hint:`Browser-based chat interface`,prepare:prepareWebSetup,apply:applyWebSetup});export{WEB_SETUP,applyWebSetup,prepareWebSetup};
@@ -93,6 +93,8 @@ export interface SelectCommonOptions<T extends PrompterValue> {
93
93
  message: string;
94
94
  /** Inert context rendered beneath the question heading and above its options. */
95
95
  description?: string;
96
+ /** Shared guidance rendered below the options and above keyboard hints. */
97
+ helpText?: string;
96
98
  /** Labeled facts rendered beneath the description and above the options. */
97
99
  metadata?: readonly SelectMetadata[];
98
100
  options: SelectOption<T>[];
@@ -1 +1 @@
1
- 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";import{TextPrompt,isCancel,settings}from"#compiled/@clack/core/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(isCancel(e))throw process.stdout.write(formatPromptCancellation(`Setup cancelled.`,pc)),new WizardCancelledError;return e}let escapeCancelDisabled=!1;function disableEscapeCancel(){escapeCancelDisabled||=(settings.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(e,t){let n,r=new TextPrompt({validate:t.validate?e=>t.validate?.(e??``):void 0,placeholder:t.placeholder,defaultValue:t.defaultValue,initialValue:t.defaultValue,render(){let r=header(this.state,t.message,e),i=t.placeholder?pc.inverse(t.placeholder[0])+pc.dim(t.placeholder.slice(1)):pc.inverse(pc.hidden(`_`)),a=this.value?`•`.repeat(this.value.length):i,o=i;switch(t.mask?o=a:this.value&&(o=this.userInputWithCursor),this.state){case`error`:return`${r.trim()}\n${railForState(this.state)} ${o}\n${cornerForState(this.state)} ${pc.red(this.error)}\n`;case`submit`:{let n=this.value||t.placeholder||``;return t.mask&&(n=this.value?REDACTED_DISPLAY:t.placeholder??``),formatPromptSubmission(this.state,t.message,n,{colors:pc,leadingRail:e===0?`white`:`green`})}case`cancel`:return`${r}${railForState(this.state)} ${pc.strikethrough(pc.dim(t.mask&&this.value?REDACTED_DISPLAY:this.value??``))}${this.value?.trim()?`\n${railForState(this.state)}`:``}`;default:return`${r}${railForState(this.state)} ${o}\n${cornerForState(this.state)}${cornerNote(n?.note())}\n`}}});return n=attachQuitGuard(r),r.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
+ 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";import{TextPrompt,isCancel,settings}from"#compiled/@clack/core/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(isCancel(e))throw process.stdout.write(formatPromptCancellation(`Setup cancelled.`,pc)),new WizardCancelledError;return e}let escapeCancelDisabled=!1;function disableEscapeCancel(){escapeCancelDisabled||=(settings.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(e,t){let n,r=new TextPrompt({validate:t.validate?e=>t.validate?.(e??``):void 0,placeholder:t.placeholder,defaultValue:t.defaultValue,initialValue:t.defaultValue,render(){let r=header(this.state,t.message,e),i=t.placeholder?pc.inverse(t.placeholder[0])+pc.dim(t.placeholder.slice(1)):pc.inverse(pc.hidden(`_`)),a=this.value?`•`.repeat(this.value.length):i,o=i;switch(t.mask?o=a:this.value&&(o=this.userInputWithCursor),this.state){case`error`:return`${r.trim()}\n${railForState(this.state)} ${o}\n${cornerForState(this.state)} ${pc.red(this.error)}\n`;case`submit`:{let n=this.value||t.placeholder||``;return t.mask&&(n=this.value?REDACTED_DISPLAY:t.placeholder??``),formatPromptSubmission(this.state,t.message,n,{colors:pc,leadingRail:e===0?`white`:`green`})}case`cancel`:return`${r}${railForState(this.state)} ${pc.strikethrough(pc.dim(t.mask&&this.value?REDACTED_DISPLAY:this.value??``))}${this.value?.trim()?`\n${railForState(this.state)}`:``}`;default:return`${r}${railForState(this.state)} ${o}\n${cornerForState(this.state)}${cornerNote(n?.note())}\n`}}});return n=attachQuitGuard(r),r.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,helpText:n.helpText,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{pathExists,writeTextFile}from"../files.js";import{resolveVersionToken}from"../version-tokens.js";import{patchPackageJson}from"../update/package-json.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{agentTemplateFiles,formatEveDependencySpecifier,resolveEvePackageContract}from"./project.js";import{readFile}from"node:fs/promises";import{join}from"node:path";const DEPENDENCY_FIELDS=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`];function isJsonObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function hasDeclaredDependency(e,t){if(!isJsonObject(e))return!1;for(let n of DEPENDENCY_FIELDS){let r=e[n];if(isJsonObject(r)&&typeof r[t]==`string`)return!0}return!1}async function addAgentToProject(e){let t=e.packageManager??`pnpm`,n=join(e.projectRoot,`package.json`);if(!await pathExists(n))throw Error(`Cannot add an eve agent to "${e.projectRoot}" because it has no package.json. Run \`eve init <name>\` to create a new project instead.`);let r;try{r=JSON.parse(await readFile(n,`utf8`))}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Cannot add an eve agent because "${n}" is not valid JSON. No files were changed. Fix the file, then retry eve init. ${t}`)}let i=agentTemplateFiles(e.model,e.reasoning),a=[];for(let t of Object.keys(i))await pathExists(join(e.projectRoot,t))&&a.push(t);if(a.length===0&&await pathExists(join(e.projectRoot,`agent`))&&a.push(`agent/`),a.length>0)throw Error(`Cannot add an eve agent to "${e.projectRoot}" because it already has: ${a.join(`, `)}.`);let o=resolveEvePackageContract(e.evePackage),s=resolveVersionToken(`aiPackageVersion`,e.aiPackageVersion??`^7.0.105`),c=resolveVersionToken(`connectPackageVersion`,e.connectPackageVersion??`2.2.0`),l=resolveVersionToken(`zodPackageVersion`,e.zodPackageVersion??`4.5.4`),u=[];for(let[t,n]of Object.entries(i)){let r=join(e.projectRoot,t);await writeTextFile(r,n),u.push(r)}let d={"@vercel/connect":c,ai:s,eve:formatEveDependencySpecifier(o.version),zod:l},f={};for(let[e,t]of Object.entries(d))hasDeclaredDependency(r,e)||(f[e]=t);let p={};Object.keys(f).length>0&&(p.dependencies=f),isPackageManagerWorkspaceMember(t,e.projectRoot)||(p.nodeEngineRequirement=o.nodeEngine);let m=await patchPackageJson(n,p),h=await patchWorkspaceRootPackageJson(t,e.projectRoot,{nodeEngineRequirement:o.nodeEngine}),g=h.nodeEngineOverride??m.nodeEngineOverride,_=await applyPackageManagerWorkspaceConfiguration({packageManager:t,projectRoot:e.projectRoot});return{filesWritten:u,dependenciesAdded:Object.keys(f).sort(),nodeEngineOverride:g,configurationFilesChanged:[...m.changed?[n]:[],...h.changed&&h.path!==void 0?[h.path]:[],..._.filesWritten]}}export{addAgentToProject};
1
+ import{pathExists,writeTextFile}from"../files.js";import{resolveVersionToken}from"../version-tokens.js";import{patchPackageJson}from"../update/package-json.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{agentTemplateFiles,formatEveDependencySpecifier,resolveEvePackageContract}from"./project.js";import{readFile}from"node:fs/promises";import{join}from"node:path";const DEPENDENCY_FIELDS=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`];function isJsonObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function hasDeclaredDependency(e,t){if(!isJsonObject(e))return!1;for(let n of DEPENDENCY_FIELDS){let r=e[n];if(isJsonObject(r)&&typeof r[t]==`string`)return!0}return!1}async function addAgentToProject(e){let t=e.packageManager??`pnpm`,n=join(e.projectRoot,`package.json`);if(!await pathExists(n))throw Error(`Cannot add an eve agent to "${e.projectRoot}" because it has no package.json. Run \`eve init <name>\` to create a new project instead.`);let r;try{r=JSON.parse(await readFile(n,`utf8`))}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Cannot add an eve agent because "${n}" is not valid JSON. No files were changed. Fix the file, then retry eve init. ${t}`)}let i=agentTemplateFiles(e.model,e.reasoning),a=[];for(let t of Object.keys(i))await pathExists(join(e.projectRoot,t))&&a.push(t);if(a.length===0&&await pathExists(join(e.projectRoot,`agent`))&&a.push(`agent/`),a.length>0)throw Error(`Cannot add an eve agent to "${e.projectRoot}" because it already has: ${a.join(`, `)}.`);let o=resolveEvePackageContract(e.evePackage),s=resolveVersionToken(`aiPackageVersion`,e.aiPackageVersion??`^7.0.128`),c=resolveVersionToken(`connectPackageVersion`,e.connectPackageVersion??`2.2.0`),l=resolveVersionToken(`zodPackageVersion`,e.zodPackageVersion??`4.5.4`),u=[];for(let[t,n]of Object.entries(i)){let r=join(e.projectRoot,t);await writeTextFile(r,n),u.push(r)}let d={"@vercel/connect":c,ai:s,eve:formatEveDependencySpecifier(o.version),zod:l},f={};for(let[e,t]of Object.entries(d))hasDeclaredDependency(r,e)||(f[e]=t);let p={};Object.keys(f).length>0&&(p.dependencies=f),isPackageManagerWorkspaceMember(t,e.projectRoot)||(p.nodeEngineRequirement=o.nodeEngine);let m=await patchPackageJson(n,p),h=await patchWorkspaceRootPackageJson(t,e.projectRoot,{nodeEngineRequirement:o.nodeEngine}),g=h.nodeEngineOverride??m.nodeEngineOverride,_=await applyPackageManagerWorkspaceConfiguration({packageManager:t,projectRoot:e.projectRoot});return{filesWritten:u,dependenciesAdded:Object.keys(f).sort(),nodeEngineOverride:g,configurationFilesChanged:[...m.changed?[n]:[],...h.changed&&h.path!==void 0?[h.path]:[],..._.filesWritten]}}export{addAgentToProject};
@@ -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{DEFAULT_CONNECT_PACKAGE_VERSION,resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_CHANNEL_TEMPLATES}from"./web-template.js";import{AGENT_INSTRUCTIONS_TEMPLATE}from"./instructions-template.js";import{SCAFFOLDED_AGENT_PATHS}from"./agent-paths.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.105`,DEFAULT_ZOD_PACKAGE_VERSION=`4.5.4`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.71.3`,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{[SCAFFOLDED_AGENT_PATHS.config]:renderAgentTemplate(e,t),[SCAFFOLDED_AGENT_PATHS.channel]:WEB_CHANNEL_TEMPLATES.default,[SCAFFOLDED_AGENT_PATHS.instructions]:AGENT_INSTRUCTIONS_TEMPLATE}}function renderAgentTemplate(e,t){let n=parseChatGptModelSelection(e);return n===void 0?BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(t)):`import { defineAgent } from "eve";\nimport { chatgpt } from "eve/models/openai";\n\nexport default defineAgent({\n model: chatgpt(${JSON.stringify(n)}),\n${reasoningTemplateLine(t)}});\n`}function reasoningTemplateLine(e){return e===void 0||e===`provider-default`?``:` reasoning: "${e}",\n`}function renderTemplate(e,t){return e===BASE_AGENT_TEMPLATE&&parseChatGptModelSelection(t.model)!==void 0?renderAgentTemplate(t.model,t.reasoning):e.replaceAll(`__EVE_INIT_APP_NAME__`,t.appName).replaceAll(`__EVE_INIT_MODEL__`,t.model).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(t.reasoning)).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(t.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(t.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(t.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,t.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,t.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,t.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,t.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,t.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,t.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{DEFAULT_CONNECT_PACKAGE_VERSION,resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_CHANNEL_TEMPLATES}from"./web-template.js";import{AGENT_INSTRUCTIONS_TEMPLATE}from"./instructions-template.js";import{SCAFFOLDED_AGENT_PATHS}from"./agent-paths.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.128`,DEFAULT_ZOD_PACKAGE_VERSION=`4.5.4`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.72.1`,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{[SCAFFOLDED_AGENT_PATHS.config]:renderAgentTemplate(e,t),[SCAFFOLDED_AGENT_PATHS.channel]:WEB_CHANNEL_TEMPLATES.default,[SCAFFOLDED_AGENT_PATHS.instructions]:AGENT_INSTRUCTIONS_TEMPLATE}}function renderAgentTemplate(e,t){let n=parseChatGptModelSelection(e);return n===void 0?BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(t)):`import { defineAgent } from "eve";\nimport { chatgpt } from "eve/models/openai";\n\nexport default defineAgent({\n model: chatgpt(${JSON.stringify(n)}),\n${reasoningTemplateLine(t)}});\n`}function reasoningTemplateLine(e){return e===void 0||e===`provider-default`?``:` reasoning: "${e}",\n`}function renderTemplate(e,t){return e===BASE_AGENT_TEMPLATE&&parseChatGptModelSelection(t.model)!==void 0?renderAgentTemplate(t.model,t.reasoning):e.replaceAll(`__EVE_INIT_APP_NAME__`,t.appName).replaceAll(`__EVE_INIT_MODEL__`,t.model).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(t.reasoning)).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(t.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(t.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(t.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,t.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,t.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,t.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,t.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,t.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,t.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__",
@@ -114,4 +114,4 @@ __EVE_INIT_REASONING__ modelOptions: {
114
114
  },
115
115
  },
116
116
  });
117
- `:BASE_AGENT_TEMPLATE,...SHARED_TEMPLATE_FILES,"package.json":packageJsonTemplate(e.includeRootOnlyPackageJsonFields)}}async function assertCanCreateInPlace(e,t){if(!await pathExists(e))return;let n=await readdir(e),r=blockingCreateInPlaceEntries(n);if(r.length>0&&!t){let e=r.slice(0,5).join(`, `),t=r.length>5?`, and ${r.length-5} more`:``;throw Error(`Cannot create project in current directory because it is not empty. Found: ${e}${t}. Use an empty directory.`)}}async function scaffoldBaseProject(e){let t=resolve(e.targetDirectory??process.cwd(),e.projectName),n=e.projectName===`.`,r=e.overwriteExisting??!1,i=e.byokProvider??!1,a=e.packageManager??`pnpm`,o=resolveEvePackageContract(e.evePackage),s=pinnedNodeEngineMajor(o.nodeEngine),c=resolve(e.workspaceProbeDirectory??t),l=isPackageManagerWorkspaceMember(a,c);if(n)await assertCanCreateInPlace(t,r);else if(await pathExists(t))throw Error(`Cannot create project because "${t}" already exists.`);let u={appName:basename(t),model:e.model,reasoning:e.reasoning,eveVersion:o.version,aiPackageVersion:resolveVersionToken(`aiPackageVersion`,e.aiPackageVersion??`^7.0.105`),connectPackageVersion:resolveVersionToken(`connectPackageVersion`,e.connectPackageVersion??`2.2.0`),zodPackageVersion:resolveVersionToken(`zodPackageVersion`,e.zodPackageVersion??`4.5.4`),typescriptPackageVersion:resolveVersionToken(`typescriptPackageVersion`,e.typescriptPackageVersion??`7.0.2`),nodeTypesVersion:s,nodeEngine:s};await mkdir(t,{recursive:!0});for(let[a,o]of Object.entries(templateFiles({byokProvider:i,includeRootOnlyPackageJsonFields:!l}))){let i=`${t}/${a}`,s=await pathExists(i);await writeTextFile(i,renderTemplate(o,u),{force:n&&r}),s&&await e.onOverwriteFile?.(i)}return await applyPackageManagerWorkspaceConfiguration({packageManager:a,projectRoot:t,workspaceProbeRoot:c,onWorkspaceRootMutation:e.onWorkspaceRootMutation}),await patchWorkspaceRootPackageJson(a,c,{nodeEngineRequirement:o.nodeEngine,onWorkspaceRootMutation:e.onWorkspaceRootMutation}),t}async function isEveProject(e){for(let t of SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS)try{return await stat(join(e,`agent`,`agent${t}`)),!0}catch{}return!1}export{CURRENT_DIRECTORY_PROJECT_NAME,DEFAULT_AI_PACKAGE_VERSION,DEFAULT_CONNECT_PACKAGE_VERSION,DEFAULT_EVE_PACKAGE_CONTRACT,DEFAULT_ZOD_PACKAGE_VERSION,ROOT_ONLY_PACKAGE_JSON_TEMPLATE_SUFFIX,agentTemplateFiles,byokProviderEnvVar,formatEveDependencySpecifier,isEveProject,modelProviderSlug,resolveEvePackageContract,scaffoldBaseProject};
117
+ `:BASE_AGENT_TEMPLATE,...SHARED_TEMPLATE_FILES,"package.json":packageJsonTemplate(e.includeRootOnlyPackageJsonFields)}}async function assertCanCreateInPlace(e,t){if(!await pathExists(e))return;let n=await readdir(e),r=blockingCreateInPlaceEntries(n);if(r.length>0&&!t){let e=r.slice(0,5).join(`, `),t=r.length>5?`, and ${r.length-5} more`:``;throw Error(`Cannot create project in current directory because it is not empty. Found: ${e}${t}. Use an empty directory.`)}}async function scaffoldBaseProject(e){let t=resolve(e.targetDirectory??process.cwd(),e.projectName),n=e.projectName===`.`,r=e.overwriteExisting??!1,i=e.byokProvider??!1,a=e.packageManager??`pnpm`,o=resolveEvePackageContract(e.evePackage),s=pinnedNodeEngineMajor(o.nodeEngine),c=resolve(e.workspaceProbeDirectory??t),l=isPackageManagerWorkspaceMember(a,c);if(n)await assertCanCreateInPlace(t,r);else if(await pathExists(t))throw Error(`Cannot create project because "${t}" already exists.`);let u={appName:basename(t),model:e.model,reasoning:e.reasoning,eveVersion:o.version,aiPackageVersion:resolveVersionToken(`aiPackageVersion`,e.aiPackageVersion??`^7.0.128`),connectPackageVersion:resolveVersionToken(`connectPackageVersion`,e.connectPackageVersion??`2.2.0`),zodPackageVersion:resolveVersionToken(`zodPackageVersion`,e.zodPackageVersion??`4.5.4`),typescriptPackageVersion:resolveVersionToken(`typescriptPackageVersion`,e.typescriptPackageVersion??`7.0.2`),nodeTypesVersion:s,nodeEngine:s};await mkdir(t,{recursive:!0});for(let[a,o]of Object.entries(templateFiles({byokProvider:i,includeRootOnlyPackageJsonFields:!l}))){let i=`${t}/${a}`,s=await pathExists(i);await writeTextFile(i,renderTemplate(o,u),{force:n&&r}),s&&await e.onOverwriteFile?.(i)}return await applyPackageManagerWorkspaceConfiguration({packageManager:a,projectRoot:t,workspaceProbeRoot:c,onWorkspaceRootMutation:e.onWorkspaceRootMutation}),await patchWorkspaceRootPackageJson(a,c,{nodeEngineRequirement:o.nodeEngine,onWorkspaceRootMutation:e.onWorkspaceRootMutation}),t}async function isEveProject(e){for(let t of SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS)try{return await stat(join(e,`agent`,`agent${t}`)),!0}catch{}return!1}export{CURRENT_DIRECTORY_PROJECT_NAME,DEFAULT_AI_PACKAGE_VERSION,DEFAULT_CONNECT_PACKAGE_VERSION,DEFAULT_EVE_PACKAGE_CONTRACT,DEFAULT_ZOD_PACKAGE_VERSION,ROOT_ONLY_PACKAGE_JSON_TEMPLATE_SUFFIX,agentTemplateFiles,byokProviderEnvVar,formatEveDependencySpecifier,isEveProject,modelProviderSlug,resolveEvePackageContract,scaffoldBaseProject};
@@ -55,7 +55,7 @@ export declare const WEB_APP_SIGN_IN_WITH_VERCEL_TEMPLATE_FILES: {
55
55
  readonly "app/s/[sessionId]/page.tsx": 'import { AuthenticatedAgentChat } from "@/app/_components/authenticated-agent-chat";\n\nexport default async function SessionPage({\n params,\n}: {\n readonly params: Promise<{ readonly sessionId: string }>;\n}) {\n const { sessionId } = await params;\n return <AuthenticatedAgentChat sessionId={sessionId} />;\n}\n';
56
56
  readonly "app/s/page.tsx": 'import { AuthenticatedAgentChat } from "@/app/_components/authenticated-agent-chat";\n\nexport default function NewSessionPage() {\n return <AuthenticatedAgentChat sessionless />;\n}\n';
57
57
  readonly "lib/auth-client.ts": '"use client";\n\nimport { createAuthClient } from "better-auth/react";\n\nexport const authClient = createAuthClient();\n';
58
- readonly "lib/auth.ts": 'import { betterAuth } from "better-auth";\n\nconst SESSION_MAX_AGE_SECONDS = 8 * 60 * 60;\nconst DEVELOPMENT_ALLOWED_HOSTS = ["localhost:*", "127.0.0.1:*"];\n\nfunction getAllowedHosts(): string[] {\n if (process.env.NODE_ENV === "development") {\n return DEVELOPMENT_ALLOWED_HOSTS;\n }\n const deploymentHosts = [\n process.env.VERCEL_URL,\n process.env.VERCEL_BRANCH_URL,\n process.env.VERCEL_PROJECT_PRODUCTION_URL,\n ].filter((host): host is string => Boolean(host));\n if (deploymentHosts.length === 0) {\n throw new Error("No trusted deployment hosts are configured");\n }\n return Array.from(new Set(deploymentHosts));\n}\n\nfunction requireEnvironmentVariable(name: string): string {\n const value = process.env[name];\n if (value) return value;\n if (process.env.NODE_ENV === "development") return `development-${name}`;\n throw new Error(`Missing required environment variable: ${name}`);\n}\n\nexport const auth = betterAuth({\n baseURL: {\n allowedHosts: getAllowedHosts(),\n protocol: process.env.NODE_ENV === "development" ? "auto" : "https",\n },\n secret: requireEnvironmentVariable("BETTER_AUTH_SECRET"),\n session: {\n expiresIn: SESSION_MAX_AGE_SECONDS,\n disableSessionRefresh: true,\n cookieCache: {\n enabled: true,\n maxAge: SESSION_MAX_AGE_SECONDS,\n refreshCache: false,\n strategy: "jwe",\n },\n },\n socialProviders: {\n vercel: {\n clientId: requireEnvironmentVariable("VERCEL_APP_CLIENT_ID"),\n clientSecret: requireEnvironmentVariable("VERCEL_APP_CLIENT_SECRET"),\n },\n },\n});\n';
58
+ readonly "lib/auth.ts": 'import { betterAuth } from "better-auth";\n\nconst SESSION_MAX_AGE_SECONDS = 8 * 60 * 60;\nconst DEVELOPMENT_ALLOWED_HOSTS = ["localhost:*", "127.0.0.1:*"];\n\nfunction getAllowedHosts(): string[] {\n if (process.env.NODE_ENV === "development") {\n return DEVELOPMENT_ALLOWED_HOSTS;\n }\n const deploymentHosts = [\n process.env.VERCEL_URL,\n process.env.VERCEL_BRANCH_URL,\n process.env.VERCEL_PROJECT_PRODUCTION_URL,\n ].filter((host): host is string => Boolean(host));\n if (deploymentHosts.length === 0) {\n throw new Error("No trusted deployment hosts are configured");\n }\n return Array.from(new Set(deploymentHosts));\n}\n\nfunction requireEnvironmentVariable(name: string): string {\n const value = process.env[name];\n if (value) return value;\n if (process.env.NODE_ENV === "development") return `development-${name}`;\n throw new Error(`Missing required environment variable: ${name}`);\n}\n\nexport const auth = betterAuth({\n baseURL: {\n allowedHosts: getAllowedHosts(),\n protocol: process.env.NODE_ENV === "development" ? "auto" : "https",\n },\n secret: requireEnvironmentVariable("BETTER_AUTH_SECRET"),\n session: {\n expiresIn: SESSION_MAX_AGE_SECONDS,\n disableSessionRefresh: true,\n cookieCache: {\n enabled: true,\n maxAge: SESSION_MAX_AGE_SECONDS,\n refreshCache: false,\n strategy: "jwe",\n },\n },\n socialProviders: {\n vercel: {\n clientId: requireEnvironmentVariable("VERCEL_APP_CLIENT_ID"),\n clientSecret: requireEnvironmentVariable("VERCEL_APP_CLIENT_SECRET"),\n scope: ["openid", "email", "profile"],\n },\n },\n});\n';
59
59
  };
60
60
  export declare const WEB_APP_TEMPLATE_PACKAGE_JSON: {
61
61
  readonly scripts: {
@@ -6139,6 +6139,7 @@ export const auth = betterAuth({
6139
6139
  vercel: {
6140
6140
  clientId: requireEnvironmentVariable("VERCEL_APP_CLIENT_ID"),
6141
6141
  clientSecret: requireEnvironmentVariable("VERCEL_APP_CLIENT_SECRET"),
6142
+ scope: ["openid", "email", "profile"],
6142
6143
  },
6143
6144
  },
6144
6145
  });
@@ -1 +1 @@
1
- import{DEFAULT_EVE_PACKAGE_CONTRACT}from"../create/project.js";function resolveWebPackageVersions(e,t){return{evePackage:e?.evePackage??DEFAULT_EVE_PACKAGE_CONTRACT,aiPackageVersion:e?.aiPackageVersion??`^7.0.105`,betterAuthPackageVersion:e?.betterAuthPackageVersion??`1.6.26`,nextPackageVersion:e?.nextPackageVersion??(t===`sign-in-with-vercel`?`16.3.0`:`16.3.4`),reactPackageVersion:e?.reactPackageVersion??`19.2.6`,reactDomPackageVersion:e?.reactDomPackageVersion??`19.2.6`,streamdownPackageVersion:e?.streamdownPackageVersion??`2.5.0`,zodPackageVersion:e?.zodPackageVersion??`4.5.4`,typesReactPackageVersion:e?.typesReactPackageVersion??`19.2.15`,typesReactDomPackageVersion:e?.typesReactDomPackageVersion??`19.2.3`}}export{resolveWebPackageVersions};
1
+ import{DEFAULT_EVE_PACKAGE_CONTRACT}from"../create/project.js";function resolveWebPackageVersions(e,t){return{evePackage:e?.evePackage??DEFAULT_EVE_PACKAGE_CONTRACT,aiPackageVersion:e?.aiPackageVersion??`^7.0.128`,betterAuthPackageVersion:e?.betterAuthPackageVersion??`1.6.26`,nextPackageVersion:e?.nextPackageVersion??(t===`sign-in-with-vercel`?`16.3.0`:`16.3.4`),reactPackageVersion:e?.reactPackageVersion??`19.2.6`,reactDomPackageVersion:e?.reactDomPackageVersion??`19.2.6`,streamdownPackageVersion:e?.streamdownPackageVersion??`2.5.0`,zodPackageVersion:e?.zodPackageVersion??`4.5.4`,typesReactPackageVersion:e?.typesReactPackageVersion??`19.2.15`,typesReactDomPackageVersion:e?.typesReactDomPackageVersion??`19.2.3`}}export{resolveWebPackageVersions};