eve 0.75.1 → 0.76.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (599) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/src/_virtual/_rolldown/runtime.js +1 -1
  3. package/dist/src/acp/adapter.js +1 -1
  4. package/dist/src/channel/task-card.js +1 -1
  5. package/dist/src/channel/tool-eligibility.d.ts +1 -2
  6. package/dist/src/chunks/{use-eve-agent-B2Kne9z6.js → use-eve-agent-D2V9UhLt.js} +68 -10
  7. package/dist/src/chunks/{use-eve-agent-DK_T88EP.js → use-eve-agent-QmriPA-w.js} +68 -10
  8. package/dist/src/cli/dev/environment.d.ts +0 -6
  9. package/dist/src/cli/dev/environment.js +1 -1
  10. package/dist/src/cli/dev/tui/conversation-view.js +1 -1
  11. package/dist/src/cli/dev/tui/runner.js +1 -1
  12. package/dist/src/cli/dev/tui/tool-presentation.js +1 -1
  13. package/dist/src/cli/dev/tui/transcript.js +1 -1
  14. package/dist/src/client/message-action-parts.d.ts +3 -0
  15. package/dist/src/client/message-action-parts.js +1 -1
  16. package/dist/src/client/message-reducer-types.d.ts +6 -1
  17. package/dist/src/client/message-reducer.js +1 -1
  18. package/dist/src/compiled/.vendor-stamp.json +3 -2
  19. package/dist/src/compiled/@eve/catalog/index.js +1 -1
  20. package/dist/src/compiled/@vercel/queue/index.d.ts +1066 -0
  21. package/dist/src/compiled/@vercel/queue/index.js +47 -0
  22. package/dist/src/compiler/connection-ownership.d.ts +6 -0
  23. package/dist/src/compiler/connection-ownership.js +1 -0
  24. package/dist/src/compiler/default-tool-policy.d.ts +0 -3
  25. package/dist/src/compiler/default-tool-policy.js +1 -1
  26. package/dist/src/compiler/extension-compatibility.d.ts +21 -20
  27. package/dist/src/compiler/extension-compatibility.js +1 -1
  28. package/dist/src/compiler/manifest.d.ts +9 -6
  29. package/dist/src/compiler/manifest.js +1 -1
  30. package/dist/src/compiler/normalize-connection.js +1 -1
  31. package/dist/src/compiler/normalize-manifest.js +1 -1
  32. package/dist/src/compiler/normalize-skill.d.ts +5 -0
  33. package/dist/src/compiler/normalize-skill.js +1 -1
  34. package/dist/src/compiler/normalize-subagent.d.ts +2 -1
  35. package/dist/src/compiler/normalize-subagent.js +1 -1
  36. package/dist/src/compiler/normalize-tool.js +1 -1
  37. package/dist/src/compiler/remote-agent-node.d.ts +2 -1
  38. package/dist/src/compiler/remote-agent-node.js +1 -1
  39. package/dist/src/connections/ownership.d.ts +18 -0
  40. package/dist/src/connections/ownership.js +1 -0
  41. package/dist/src/context/build-dynamic-tools.d.ts +3 -9
  42. package/dist/src/context/build-dynamic-tools.js +1 -1
  43. package/dist/src/context/dynamic-connection-lifecycle.js +1 -1
  44. package/dist/src/context/dynamic-skill-lifecycle.d.ts +2 -11
  45. package/dist/src/context/dynamic-skill-lifecycle.js +1 -1
  46. package/dist/src/context/dynamic-subagent-lifecycle.js +1 -1
  47. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  48. package/dist/src/context/dynamic-tool-metadata.d.ts +1 -0
  49. package/dist/src/context/keys.d.ts +5 -4
  50. package/dist/src/context/memory-tools.js +1 -1
  51. package/dist/src/context/schedule-collection-tools.js +1 -1
  52. package/dist/src/discover/grammar.d.ts +11 -0
  53. package/dist/src/discover/grammar.js +1 -1
  54. package/dist/src/discover/manifest.d.ts +1 -0
  55. package/dist/src/discover/manifest.js +1 -1
  56. package/dist/src/discover/skills.d.ts +1 -0
  57. package/dist/src/discover/skills.js +1 -1
  58. package/dist/src/dynamic/definition.d.ts +7 -5
  59. package/dist/src/evals/assertions/collector.d.ts +4 -0
  60. package/dist/src/evals/assertions/collector.js +1 -1
  61. package/dist/src/evals/assertions/run.d.ts +2 -3
  62. package/dist/src/evals/assertions/run.js +2 -2
  63. package/dist/src/evals/assertions/scoped.js +1 -1
  64. package/dist/src/evals/index.d.ts +1 -1
  65. package/dist/src/evals/match.d.ts +9 -6
  66. package/dist/src/evals/reported-tool-name.d.ts +9 -0
  67. package/dist/src/evals/reported-tool-name.js +1 -0
  68. package/dist/src/evals/runner/derive-run-facts.d.ts +3 -3
  69. package/dist/src/evals/runner/derive-run-facts.js +1 -1
  70. package/dist/src/evals/runner/execute-task.js +1 -1
  71. package/dist/src/evals/runner/reporters/braintrust.js +1 -1
  72. package/dist/src/evals/runner/reporters/datadog-runtime-trace-links.d.ts +11 -0
  73. package/dist/src/evals/runner/reporters/datadog-runtime-trace-links.js +1 -0
  74. package/dist/src/evals/runner/reporters/datadog.js +2 -2
  75. package/dist/src/evals/session.js +2 -2
  76. package/dist/src/evals/target.d.ts +7 -0
  77. package/dist/src/evals/target.js +1 -1
  78. package/dist/src/evals/types.d.ts +17 -1
  79. package/dist/src/execution/agent-sessions/remote.js +1 -1
  80. package/dist/src/execution/catalog/connection-auth.d.ts +41 -0
  81. package/dist/src/execution/catalog/connection-auth.js +1 -0
  82. package/dist/src/execution/catalog/connection-entry.d.ts +16 -0
  83. package/dist/src/execution/catalog/connection-entry.js +1 -0
  84. package/dist/src/execution/catalog/listing.d.ts +9 -0
  85. package/dist/src/execution/catalog/listing.js +3 -0
  86. package/dist/src/execution/catalog/rank.d.ts +44 -0
  87. package/dist/src/execution/catalog/rank.js +1 -0
  88. package/dist/src/execution/catalog/search.d.ts +28 -0
  89. package/dist/src/execution/catalog/search.js +1 -0
  90. package/dist/src/execution/catalog/signatures.d.ts +11 -0
  91. package/dist/src/execution/catalog/signatures.js +1 -0
  92. package/dist/src/execution/catalog/skills.d.ts +24 -0
  93. package/dist/src/execution/catalog/skills.js +1 -0
  94. package/dist/src/execution/catalog/step-catalog.d.ts +51 -0
  95. package/dist/src/execution/catalog/step-catalog.js +1 -0
  96. package/dist/src/execution/coordination-dispatch-shared.js +1 -1
  97. package/dist/src/execution/dynamic-connections.js +1 -1
  98. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  99. package/dist/src/execution/invoke-tool.js +1 -1
  100. package/dist/src/execution/node-step.js +1 -1
  101. package/dist/src/execution/session/active-turn.d.ts +1 -1
  102. package/dist/src/execution/session/pending-turn-state.js +1 -1
  103. package/dist/src/execution/session/turn-step.js +1 -1
  104. package/dist/src/execution/session/turn.d.ts +5 -5
  105. package/dist/src/execution/session/turn.js +1 -1
  106. package/dist/src/execution/session.js +1 -1
  107. package/dist/src/execution/skills/instructions.d.ts +20 -10
  108. package/dist/src/execution/skills/instructions.js +2 -2
  109. package/dist/src/execution/tasks/calls.d.ts +6 -5
  110. package/dist/src/execution/tasks/calls.js +1 -1
  111. package/dist/src/execution/tasks/model-step.d.ts +10 -10
  112. package/dist/src/execution/tasks/model-step.js +1 -1
  113. package/dist/src/execution/tasks/render.d.ts +3 -3
  114. package/dist/src/execution/tasks/render.js +3 -3
  115. package/dist/src/execution/tasks/session.d.ts +2 -1
  116. package/dist/src/execution/tasks/table.d.ts +1 -1
  117. package/dist/src/execution/tasks/tool-entry-point.d.ts +1 -1
  118. package/dist/src/execution/tool-auth.js +1 -1
  119. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  120. package/dist/src/execution/tools/workflow/harness-definition.js +1 -1
  121. package/dist/src/extensions/code/extension/extension.d.ts +4 -18
  122. package/dist/src/extensions/code/extension/instructions/github.d.ts +3 -0
  123. package/dist/src/extensions/code/extension/instructions/github.js +1 -0
  124. package/dist/src/extensions/code/extension/instructions.md +1 -13
  125. package/dist/src/extensions/code/extension/lib/diagnostics.d.ts +4 -2
  126. package/dist/src/extensions/code/extension/lib/diagnostics.js +3 -3
  127. package/dist/src/extensions/code/extension/lib/github-compat.d.ts +28 -0
  128. package/dist/src/extensions/code/extension/lib/github-compat.js +1 -0
  129. package/dist/src/extensions/code/extension/lib/grep-search.d.ts +3 -13
  130. package/dist/src/extensions/code/extension/lib/grep-search.js +2 -2
  131. package/dist/src/extensions/code/extension/lib/patch.d.ts +8 -2
  132. package/dist/src/extensions/code/extension/lib/patch.js +4 -4
  133. package/dist/src/extensions/code/extension/lib/repository-root.d.ts +3 -4
  134. package/dist/src/extensions/code/extension/lib/repository-root.js +1 -1
  135. package/dist/src/extensions/code/extension/lib/sandbox.d.ts +2 -1
  136. package/dist/src/extensions/code/extension/lib/sandbox.js +1 -1
  137. package/dist/src/extensions/code/extension/lib/tooling.d.ts +4 -4
  138. package/dist/src/extensions/code/extension/lib/tooling.js +7 -7
  139. package/dist/src/extensions/code/extension/lib/workspace-root.d.ts +31 -0
  140. package/dist/src/extensions/code/extension/lib/workspace-root.js +1 -0
  141. package/dist/src/extensions/code/extension/skills/pr.d.ts +6 -0
  142. package/dist/src/extensions/code/extension/skills/pr.js +1 -0
  143. package/dist/src/extensions/code/extension/tools/apply_patch.d.ts +2 -2
  144. package/dist/src/extensions/code/extension/tools/apply_patch.js +2 -2
  145. package/dist/src/extensions/code/extension/tools/gh.d.ts +4 -3
  146. package/dist/src/extensions/code/extension/tools/gh.js +1 -1
  147. package/dist/src/extensions/code/extension/tools/grep.js +1 -1
  148. package/dist/src/extensions/code/tools.d.ts +2 -1
  149. package/dist/src/extensions/code/tools.js +1 -1
  150. package/dist/src/extensions/git/extension/extension.d.ts +12 -0
  151. package/dist/src/extensions/git/extension/extension.js +1 -0
  152. package/dist/src/extensions/git/extension/instructions/github.d.ts +2 -0
  153. package/dist/src/extensions/git/extension/instructions/github.js +1 -0
  154. package/dist/src/extensions/git/extension/lib/gh-tool.d.ts +29 -0
  155. package/dist/src/extensions/git/extension/lib/gh-tool.js +1 -0
  156. package/dist/src/extensions/git/extension/lib/github-guidance.d.ts +3 -0
  157. package/dist/src/extensions/git/extension/lib/github-guidance.js +49 -0
  158. package/dist/src/extensions/{code → git}/extension/lib/github-shell.d.ts +1 -1
  159. package/dist/src/extensions/git/extension/lib/github-shell.js +1 -0
  160. package/dist/src/extensions/git/extension/lib/repository-root.d.ts +5 -0
  161. package/dist/src/extensions/git/extension/lib/repository-root.js +1 -0
  162. package/dist/src/extensions/git/extension/lib/sandbox.d.ts +6 -0
  163. package/dist/src/extensions/git/extension/lib/sandbox.js +1 -0
  164. package/dist/src/extensions/git/extension/lib/shell.d.ts +1 -0
  165. package/dist/src/extensions/git/extension/lib/shell.js +1 -0
  166. package/dist/src/extensions/git/extension/lib/tooling.d.ts +4 -0
  167. package/dist/src/extensions/git/extension/lib/tooling.js +1 -0
  168. package/dist/src/extensions/git/extension/skills/pr.d.ts +5 -0
  169. package/dist/src/extensions/git/extension/skills/pr.js +1 -0
  170. package/dist/src/extensions/git/extension/tools/gh.d.ts +28 -0
  171. package/dist/src/extensions/git/extension/tools/gh.js +1 -0
  172. package/dist/src/extensions/git/tools.d.ts +27 -0
  173. package/dist/src/extensions/git/tools.js +1 -0
  174. package/dist/src/framework/sources/registry.js +1 -1
  175. package/dist/src/harness/action-presentation.d.ts +2 -2
  176. package/dist/src/harness/action-result-helpers.d.ts +10 -2
  177. package/dist/src/harness/action-result-helpers.js +1 -1
  178. package/dist/src/harness/announcements.d.ts +2 -8
  179. package/dist/src/harness/announcements.js +1 -1
  180. package/dist/src/harness/coordination.d.ts +11 -11
  181. package/dist/src/harness/coordination.js +1 -1
  182. package/dist/src/harness/current-messages.d.ts +1 -5
  183. package/dist/src/harness/current-messages.js +1 -1
  184. package/dist/src/harness/emission.d.ts +2 -2
  185. package/dist/src/harness/emission.js +1 -1
  186. package/dist/src/harness/execute-call.d.ts +48 -0
  187. package/dist/src/harness/execute-call.js +1 -0
  188. package/dist/src/harness/execute-tool.d.ts +3 -1
  189. package/dist/src/harness/final-output.d.ts +2 -6
  190. package/dist/src/harness/final-output.js +1 -1
  191. package/dist/src/harness/hitl/approvals.d.ts +5 -0
  192. package/dist/src/harness/hitl/approvals.js +1 -1
  193. package/dist/src/harness/hitl/approved-calls.d.ts +3 -2
  194. package/dist/src/harness/hitl/approved-calls.js +1 -1
  195. package/dist/src/harness/hitl/candidates.d.ts +13 -2
  196. package/dist/src/harness/hitl/candidates.js +1 -1
  197. package/dist/src/harness/hitl/coordinator.d.ts +3 -3
  198. package/dist/src/harness/hitl/coordinator.js +1 -1
  199. package/dist/src/harness/hitl/index.d.ts +6 -4
  200. package/dist/src/harness/hitl/index.js +1 -1
  201. package/dist/src/harness/hitl/intake.d.ts +3 -3
  202. package/dist/src/harness/hitl/intake.js +1 -1
  203. package/dist/src/harness/input-extraction.d.ts +4 -1
  204. package/dist/src/harness/input-extraction.js +1 -1
  205. package/dist/src/harness/input-request-resolution.d.ts +15 -0
  206. package/dist/src/harness/input-request-resolution.js +1 -1
  207. package/dist/src/harness/model-call/call.d.ts +3 -5
  208. package/dist/src/harness/model-call/call.js +1 -1
  209. package/dist/src/harness/model-call/errors.js +1 -1
  210. package/dist/src/harness/model-call/request.d.ts +3 -2
  211. package/dist/src/harness/model-call/request.js +1 -1
  212. package/dist/src/harness/model-call/response.d.ts +2 -1
  213. package/dist/src/harness/model-call/response.js +1 -1
  214. package/dist/src/harness/model-call/run.d.ts +5 -3
  215. package/dist/src/harness/model-call/run.js +1 -1
  216. package/dist/src/harness/model-call/tools.d.ts +12 -21
  217. package/dist/src/harness/model-call/tools.js +1 -1
  218. package/dist/src/harness/model-profile.d.ts +5 -0
  219. package/dist/src/harness/model-profile.js +1 -1
  220. package/dist/src/harness/provider-tools.d.ts +6 -5
  221. package/dist/src/harness/provider-tools.js +1 -1
  222. package/dist/src/harness/session-machine/commit.js +1 -1
  223. package/dist/src/harness/session-machine/transitions.d.ts +5 -2
  224. package/dist/src/harness/session-machine/transitions.js +1 -1
  225. package/dist/src/harness/step/after-model.js +1 -1
  226. package/dist/src/harness/step-hooks.d.ts +4 -6
  227. package/dist/src/harness/step-hooks.js +1 -1
  228. package/dist/src/harness/tool-call-input-errors.d.ts +2 -2
  229. package/dist/src/harness/tool-call-io.d.ts +3 -0
  230. package/dist/src/harness/tool-call-io.js +1 -1
  231. package/dist/src/harness/tools.d.ts +22 -19
  232. package/dist/src/harness/tools.js +1 -1
  233. package/dist/src/harness/types.d.ts +14 -0
  234. package/dist/src/instrumentation/lifecycle.d.ts +0 -1
  235. package/dist/src/instrumentation/native-events.js +1 -1
  236. package/dist/src/instrumentation/runtime.d.ts +2 -1
  237. package/dist/src/internal/application/package.js +1 -1
  238. package/dist/src/internal/authored-definition/core.js +1 -1
  239. package/dist/src/internal/authored-definition/schedule-collection.js +1 -1
  240. package/dist/src/internal/authored-definition/schema-backed.d.ts +2 -2
  241. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  242. package/dist/src/internal/authored-module.d.ts +2 -1
  243. package/dist/src/internal/authored-module.js +1 -1
  244. package/dist/src/internal/helpers/markdown.js +1 -1
  245. package/dist/src/internal/mcp/skills.js +1 -1
  246. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  247. package/dist/src/internal/nitro/host/dev-host-fingerprint.js +1 -1
  248. package/dist/src/internal/nitro/host/local-schedules-runtime-plugin.d.ts +5 -0
  249. package/dist/src/internal/nitro/host/local-schedules-runtime-plugin.js +1 -0
  250. package/dist/src/internal/nitro/routes/schedule-collection-consumer.d.ts +6 -0
  251. package/dist/src/internal/nitro/routes/schedule-collection-consumer.js +1 -1
  252. package/dist/src/internal/schedules/consumer-route.d.ts +2 -0
  253. package/dist/src/internal/schedules/consumer-route.js +1 -1
  254. package/dist/src/internal/schedules/dev-environment.d.ts +2 -0
  255. package/dist/src/internal/schedules/dev-environment.js +1 -0
  256. package/dist/src/internal/vercel-agent-summary.d.ts +2 -2
  257. package/dist/src/internal/workflow/vercel-world-defaults.d.ts +1 -1
  258. package/dist/src/internal/workflow/vercel-world-defaults.js +1 -1
  259. package/dist/src/protocol/catalog-tools.d.ts +12 -0
  260. package/dist/src/protocol/catalog-tools.js +1 -0
  261. package/dist/src/protocol/message-version.js +1 -1
  262. package/dist/src/protocol/message.d.ts +1 -1
  263. package/dist/src/protocol/remote-agent-protocol.d.ts +2 -0
  264. package/dist/src/protocol/remote-agent-protocol.js +1 -1
  265. package/dist/src/protocol/reply-tool.d.ts +2 -0
  266. package/dist/src/protocol/reply-tool.js +1 -0
  267. package/dist/src/protocol/runtime-tools.d.ts +6 -0
  268. package/dist/src/protocol/runtime-tools.js +1 -0
  269. package/dist/src/protocol/session-projection.js +1 -1
  270. package/dist/src/protocol/task-tools.d.ts +4 -4
  271. package/dist/src/protocol/task-tools.js +1 -1
  272. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +1 -1
  273. package/dist/src/public/channels/linear/defaults.js +2 -2
  274. package/dist/src/public/channels/slack/action-status.d.ts +0 -9
  275. package/dist/src/public/channels/slack/action-status.js +1 -1
  276. package/dist/src/public/channels/slack/defaults.js +2 -2
  277. package/dist/src/public/channels/slack/task-card.d.ts +1 -1
  278. package/dist/src/public/definitions/connections/mcp.d.ts +4 -4
  279. package/dist/src/public/definitions/connections/openapi.d.ts +6 -7
  280. package/dist/src/public/definitions/remote-agent.d.ts +6 -3
  281. package/dist/src/public/definitions/workspace-agent.d.ts +6 -3
  282. package/dist/src/public/experimental/schedules/index.d.ts +1 -1
  283. package/dist/src/public/schedules/providers/in-memory.js +1 -1
  284. package/dist/src/public/schedules/providers/vercel.js +1 -1
  285. package/dist/src/public/schedules/subscription.d.ts +36 -16
  286. package/dist/src/public/tools/web-search.d.ts +1 -1
  287. package/dist/src/runtime/agent/bootstrap.d.ts +2 -1
  288. package/dist/src/runtime/agent/bootstrap.js +1 -1
  289. package/dist/src/runtime/agent/mock-model-adapter.js +2 -2
  290. package/dist/src/runtime/agent/mock-model-fixtures.js +2 -2
  291. package/dist/src/runtime/agent/mock-model-skill-selection.d.ts +2 -0
  292. package/dist/src/runtime/agent/mock-model-skill-selection.js +2 -2
  293. package/dist/src/runtime/agent/mock-structured-output.d.ts +1 -1
  294. package/dist/src/runtime/connections/mcp-client.js +1 -1
  295. package/dist/src/runtime/connections/registry.js +1 -1
  296. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  297. package/dist/src/runtime/connections/tool-result.d.ts +2 -2
  298. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  299. package/dist/src/runtime/resolve-tool.js +1 -1
  300. package/dist/src/runtime/schedules/collection-client.d.ts +12 -3
  301. package/dist/src/runtime/schedules/collection-client.js +1 -1
  302. package/dist/src/runtime/subagents/dynamic-agent-config.d.ts +2 -2
  303. package/dist/src/runtime/subagents/dynamic-remote-agent-config.d.ts +2 -1
  304. package/dist/src/runtime/subagents/dynamic-remote-agent-config.js +1 -1
  305. package/dist/src/runtime/subagents/registry.d.ts +2 -1
  306. package/dist/src/runtime/subagents/registry.js +1 -1
  307. package/dist/src/runtime/tools/registry.d.ts +2 -0
  308. package/dist/src/runtime/tools/registry.js +1 -1
  309. package/dist/src/runtime/types.d.ts +3 -3
  310. package/dist/src/setup/connection-connector.js +1 -2
  311. package/dist/src/setup/index.d.ts +1 -1
  312. package/dist/src/setup/index.js +1 -1
  313. package/dist/src/setup/integrations/slack/setup.d.ts +23 -3
  314. package/dist/src/setup/integrations/slack/setup.js +1 -1
  315. package/dist/src/setup/primitives/process-output.d.ts +5 -0
  316. package/dist/src/setup/primitives/process-output.js +2 -1
  317. package/dist/src/setup/scaffold/create/project.js +1 -1
  318. package/dist/src/setup/scaffold/create/web-template.d.ts +1 -1
  319. package/dist/src/setup/scaffold/create/web-template.js +1 -1
  320. package/dist/src/setup/scaffold/update/update-slack-channel.d.ts +17 -0
  321. package/dist/src/setup/scaffold/update/update-slack-channel.js +1 -1
  322. package/dist/src/setup/slack-connect-create.d.ts +10 -2
  323. package/dist/src/setup/slack-connect-create.js +1 -1
  324. package/dist/src/setup/slack-connect-lifecycle.d.ts +92 -44
  325. package/dist/src/setup/slack-connect-lifecycle.js +1 -1
  326. package/dist/src/setup/slack-connect.d.ts +30 -11
  327. package/dist/src/setup/slack-connect.js +1 -1
  328. package/dist/src/setup/slack-setup-plan.d.ts +72 -0
  329. package/dist/src/setup/slack-setup-plan.js +1 -0
  330. package/dist/src/setup/slackbot.d.ts +75 -35
  331. package/dist/src/setup/slackbot.js +2 -1
  332. package/dist/src/shared/action-label.d.ts +10 -0
  333. package/dist/src/shared/action-label.js +1 -0
  334. package/dist/src/shared/action-request-name.d.ts +3 -1
  335. package/dist/src/shared/action-request-name.js +1 -1
  336. package/dist/src/shared/action-types.d.ts +7 -8
  337. package/dist/src/shared/action-types.js +1 -1
  338. package/dist/src/shared/agent-definition.d.ts +11 -3
  339. package/dist/src/shared/development-env-files.d.ts +4 -0
  340. package/dist/src/shared/development-env-files.js +1 -0
  341. package/dist/src/shared/input.d.ts +0 -1
  342. package/dist/src/shared/map-with-concurrency.d.ts +2 -0
  343. package/dist/src/shared/map-with-concurrency.js +1 -0
  344. package/dist/src/shared/skill-definition.d.ts +6 -0
  345. package/dist/src/shared/skill-package.d.ts +1 -0
  346. package/dist/src/shared/skill-package.js +1 -1
  347. package/dist/src/shared/web-search.d.ts +15 -2
  348. package/dist/src/shared/web-search.js +1 -1
  349. package/dist/src/svelte/index.js +1 -1
  350. package/dist/src/svelte/use-eve-agent.js +1 -1
  351. package/dist/src/tool-stubs/execute.d.ts +0 -3
  352. package/dist/src/tool-stubs/execute.js +1 -1
  353. package/dist/src/tool-stubs/rules.js +1 -1
  354. package/dist/src/tool-stubs/validate-targets.js +1 -1
  355. package/dist/src/tools/behavior.d.ts +3 -6
  356. package/dist/src/tools/definition.d.ts +5 -0
  357. package/dist/src/tools/dynamic.d.ts +5 -2
  358. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  359. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  360. package/dist/src/tools/provided/task-cancel.d.ts +1 -1
  361. package/dist/src/tools/provided/task-wait.d.ts +1 -1
  362. package/dist/src/tools/provided/web-search.d.ts +20 -7
  363. package/dist/src/tools/provided/web-search.js +1 -1
  364. package/dist/src/tools/schema.d.ts +5 -0
  365. package/dist/src/tools/schema.js +1 -1
  366. package/dist/src/{runtime/connections/tool-signature.d.ts → tools/signature.d.ts} +2 -2
  367. package/dist/src/tools/workflow-definition.d.ts +1 -1
  368. package/dist/src/tracing/agent-approval-instrumentation.js +1 -1
  369. package/dist/src/tracing/agent-otel-provider.js +2 -2
  370. package/dist/src/tracing/agent-otel-runtime-context.d.ts +1 -0
  371. package/dist/src/tracing/agent-otel-runtime-context.js +1 -1
  372. package/dist/src/tracing/agent-otel-turn-state.d.ts +6 -0
  373. package/dist/src/tracing/agent-otel-turn-state.js +1 -0
  374. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  375. package/dist/src/tracing/agent-trace-context-codec.js +1 -1
  376. package/dist/src/tracing/agent-trace-state.d.ts +4 -1
  377. package/dist/src/vue/index.js +1 -1
  378. package/dist/src/vue/use-eve-agent.js +1 -1
  379. package/docs/agent-config.md +8 -8
  380. package/docs/channels/chat-sdk.mdx +1 -1
  381. package/docs/channels/slack.mdx +32 -82
  382. package/docs/code-extension.mdx +28 -7
  383. package/docs/concepts/built-in-tools.md +43 -43
  384. package/docs/concepts/context-control.md +1 -1
  385. package/docs/concepts/execution-model-and-durability.mdx +1 -1
  386. package/docs/concepts/sessions-runs-and-streaming.md +4 -4
  387. package/docs/connections/mcp.mdx +5 -5
  388. package/docs/connections/openapi.mdx +1 -1
  389. package/docs/connections/overview.mdx +4 -2
  390. package/docs/evals/assertions.mdx +5 -3
  391. package/docs/evals/reporters.mdx +3 -1
  392. package/docs/evals/tool-stubs.mdx +3 -1
  393. package/docs/extensions.md +2 -0
  394. package/docs/guides/dev-tui.md +2 -2
  395. package/docs/guides/dynamic-capabilities.md +14 -4
  396. package/docs/guides/frontend/overview.mdx +1 -1
  397. package/docs/guides/remote-agents.md +10 -3
  398. package/docs/instructions.mdx +5 -5
  399. package/docs/reference/cli.md +2 -2
  400. package/docs/reference/typescript-api.md +3 -3
  401. package/docs/skills.mdx +19 -4
  402. package/docs/subagents/index.mdx +5 -3
  403. package/docs/tools/overview.mdx +22 -1
  404. package/docs/tools/tasks-upgrade.md +1 -1
  405. package/docs/tools/tasks.md +32 -32
  406. package/docs/tools/workflows.mdx +6 -6
  407. package/docs/tutorial/team-playbooks.mdx +2 -2
  408. package/package.json +22 -6
  409. package/dist/src/execution/connection-announcement.d.ts +0 -7
  410. package/dist/src/execution/connection-announcement.js +0 -4
  411. package/dist/src/execution/tools/connection-approval.d.ts +0 -25
  412. package/dist/src/execution/tools/connection-approval.js +0 -1
  413. package/dist/src/execution/tools/connection-search-rank.d.ts +0 -21
  414. package/dist/src/execution/tools/connection-search-rank.js +0 -1
  415. package/dist/src/execution/tools/connection-target.d.ts +0 -18
  416. package/dist/src/execution/tools/connection-target.js +0 -1
  417. package/dist/src/execution/tools/connection-tools.d.ts +0 -4
  418. package/dist/src/execution/tools/connection-tools.js +0 -2
  419. package/dist/src/execution/tools/load-skill.d.ts +0 -10
  420. package/dist/src/execution/tools/load-skill.js +0 -1
  421. package/dist/src/extensions/code/extension/lib/github-shell.js +0 -1
  422. package/dist/src/extensions/code/extension/skills/pr/SKILL.md +0 -53
  423. package/dist/src/extensions/code/extension/subagents/worker/tools/load_skill.d.ts +0 -2
  424. package/dist/src/extensions/code/extension/subagents/worker/tools/load_skill.js +0 -1
  425. package/dist/src/harness/advertised-tools.d.ts +0 -26
  426. package/dist/src/harness/advertised-tools.js +0 -1
  427. package/dist/src/harness/nested-actions.d.ts +0 -23
  428. package/dist/src/harness/nested-actions.js +0 -1
  429. package/dist/src/node_modules/.pnpm/@vercel_cli-config@0.2.0/node_modules/@vercel/cli-config/dist/cli-config.js +0 -1
  430. package/dist/src/node_modules/.pnpm/@vercel_cli-config@0.2.0/node_modules/@vercel/cli-config/dist/cred-storage.js +0 -1
  431. package/dist/src/node_modules/.pnpm/@vercel_cli-config@0.2.0/node_modules/@vercel/cli-config/dist/index.js +0 -1
  432. package/dist/src/node_modules/.pnpm/@vercel_cli-config@0.2.0/node_modules/@vercel/cli-config/dist/schema.js +0 -1
  433. package/dist/src/node_modules/.pnpm/@vercel_cli-config@0.2.0/node_modules/@vercel/cli-config/dist/schema.zod.js +0 -1
  434. package/dist/src/node_modules/.pnpm/@vercel_cli-config@0.2.0/node_modules/@vercel/cli-config/dist/types.js +0 -1
  435. package/dist/src/node_modules/.pnpm/@vercel_cli-exec@1.0.0/node_modules/@vercel/cli-exec/dist/envpath.js +0 -1
  436. package/dist/src/node_modules/.pnpm/@vercel_cli-exec@1.0.0/node_modules/@vercel/cli-exec/dist/errors.js +0 -2
  437. package/dist/src/node_modules/.pnpm/@vercel_cli-exec@1.0.0/node_modules/@vercel/cli-exec/dist/errutils.js +0 -1
  438. package/dist/src/node_modules/.pnpm/@vercel_cli-exec@1.0.0/node_modules/@vercel/cli-exec/dist/exec.js +0 -1
  439. package/dist/src/node_modules/.pnpm/@vercel_cli-exec@1.0.0/node_modules/@vercel/cli-exec/dist/fsutils.js +0 -1
  440. package/dist/src/node_modules/.pnpm/@vercel_cli-exec@1.0.0/node_modules/@vercel/cli-exec/dist/index.js +0 -1
  441. package/dist/src/node_modules/.pnpm/@vercel_cli-exec@1.0.0/node_modules/@vercel/cli-exec/dist/lookup.js +0 -1
  442. package/dist/src/node_modules/.pnpm/@vercel_cli-exec@1.0.0/node_modules/@vercel/cli-exec/dist/safety.js +0 -1
  443. package/dist/src/node_modules/.pnpm/@vercel_oidc@3.8.0/node_modules/@vercel/oidc/dist/auth-errors.js +0 -1
  444. package/dist/src/node_modules/.pnpm/@vercel_oidc@3.8.0/node_modules/@vercel/oidc/dist/exchange-vercel-oidc-token.js +0 -1
  445. package/dist/src/node_modules/.pnpm/@vercel_oidc@3.8.0/node_modules/@vercel/oidc/dist/get-context.js +0 -1
  446. package/dist/src/node_modules/.pnpm/@vercel_oidc@3.8.0/node_modules/@vercel/oidc/dist/get-vercel-oidc-token-sync.js +0 -1
  447. package/dist/src/node_modules/.pnpm/@vercel_oidc@3.8.0/node_modules/@vercel/oidc/dist/get-vercel-oidc-token-with-refresh.js +0 -2
  448. package/dist/src/node_modules/.pnpm/@vercel_oidc@3.8.0/node_modules/@vercel/oidc/dist/index.js +0 -1
  449. package/dist/src/node_modules/.pnpm/@vercel_oidc@3.8.0/node_modules/@vercel/oidc/dist/oauth.js +0 -1
  450. package/dist/src/node_modules/.pnpm/@vercel_oidc@3.8.0/node_modules/@vercel/oidc/dist/token-error.js +0 -1
  451. package/dist/src/node_modules/.pnpm/@vercel_oidc@3.8.0/node_modules/@vercel/oidc/dist/token-io.js +0 -1
  452. package/dist/src/node_modules/.pnpm/@vercel_oidc@3.8.0/node_modules/@vercel/oidc/dist/token-util.js +0 -2
  453. package/dist/src/node_modules/.pnpm/@vercel_oidc@3.8.0/node_modules/@vercel/oidc/dist/token.js +0 -1
  454. package/dist/src/node_modules/.pnpm/@vercel_oidc@3.8.0/node_modules/@vercel/oidc/dist/verify-vercel-oidc-token.js +0 -1
  455. package/dist/src/node_modules/.pnpm/@vercel_oidc@3.8.0/node_modules/@vercel/oidc/dist/version.js +0 -1
  456. package/dist/src/node_modules/.pnpm/@vercel_queue@0.5.1_@opentelemetry_api@1.9.1/node_modules/@vercel/queue/dist/index.js +0 -36
  457. package/dist/src/node_modules/.pnpm/balanced-match@4.0.4/node_modules/balanced-match/dist/esm/index.js +0 -1
  458. package/dist/src/node_modules/.pnpm/brace-expansion@5.0.12/node_modules/brace-expansion/dist/esm/index.js +0 -1
  459. package/dist/src/node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/index.js +0 -1
  460. package/dist/src/node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/enoent.js +0 -1
  461. package/dist/src/node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/parse.js +0 -1
  462. package/dist/src/node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/escape.js +0 -1
  463. package/dist/src/node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/readShebang.js +0 -1
  464. package/dist/src/node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/resolveCommand.js +0 -1
  465. package/dist/src/node_modules/.pnpm/execa@5.1.1/node_modules/execa/index.js +0 -1
  466. package/dist/src/node_modules/.pnpm/execa@5.1.1/node_modules/execa/lib/command.js +0 -1
  467. package/dist/src/node_modules/.pnpm/execa@5.1.1/node_modules/execa/lib/error.js +0 -2
  468. package/dist/src/node_modules/.pnpm/execa@5.1.1/node_modules/execa/lib/kill.js +0 -1
  469. package/dist/src/node_modules/.pnpm/execa@5.1.1/node_modules/execa/lib/promise.js +0 -1
  470. package/dist/src/node_modules/.pnpm/execa@5.1.1/node_modules/execa/lib/stdio.js +0 -1
  471. package/dist/src/node_modules/.pnpm/execa@5.1.1/node_modules/execa/lib/stream.js +0 -1
  472. package/dist/src/node_modules/.pnpm/get-stream@6.0.1/node_modules/get-stream/buffer-stream.js +0 -1
  473. package/dist/src/node_modules/.pnpm/get-stream@6.0.1/node_modules/get-stream/index.js +0 -1
  474. package/dist/src/node_modules/.pnpm/human-signals@2.1.0/node_modules/human-signals/build/src/core.js +0 -1
  475. package/dist/src/node_modules/.pnpm/human-signals@2.1.0/node_modules/human-signals/build/src/main.js +0 -1
  476. package/dist/src/node_modules/.pnpm/human-signals@2.1.0/node_modules/human-signals/build/src/realtime.js +0 -1
  477. package/dist/src/node_modules/.pnpm/human-signals@2.1.0/node_modules/human-signals/build/src/signals.js +0 -1
  478. package/dist/src/node_modules/.pnpm/is-stream@2.0.1/node_modules/is-stream/index.js +0 -1
  479. package/dist/src/node_modules/.pnpm/isexe@2.0.0/node_modules/isexe/index.js +0 -1
  480. package/dist/src/node_modules/.pnpm/isexe@2.0.0/node_modules/isexe/mode.js +0 -1
  481. package/dist/src/node_modules/.pnpm/isexe@2.0.0/node_modules/isexe/windows.js +0 -1
  482. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/index.js +0 -1
  483. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jwe/compact/decrypt.js +0 -1
  484. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jwe/compact/encrypt.js +0 -1
  485. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jwe/flattened/decrypt.js +0 -1
  486. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jwe/flattened/encrypt.js +0 -1
  487. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jwe/general/decrypt.js +0 -1
  488. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jwe/general/encrypt.js +0 -1
  489. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jwk/embedded.js +0 -1
  490. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jwk/thumbprint.js +0 -1
  491. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jwks/local.js +0 -1
  492. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jwks/remote.js +0 -1
  493. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jws/compact/sign.js +0 -1
  494. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jws/compact/verify.js +0 -1
  495. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jws/flattened/sign.js +0 -1
  496. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jws/flattened/verify.js +0 -1
  497. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jws/general/sign.js +0 -1
  498. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jws/general/verify.js +0 -1
  499. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jwt/decrypt.js +0 -1
  500. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jwt/encrypt.js +0 -1
  501. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jwt/produce.js +0 -1
  502. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jwt/sign.js +0 -1
  503. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jwt/unsecured.js +0 -1
  504. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/jwt/verify.js +0 -1
  505. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/key/export.js +0 -1
  506. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/key/generate_key_pair.js +0 -1
  507. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/key/generate_secret.js +0 -1
  508. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/key/import.js +0 -1
  509. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/aesgcmkw.js +0 -1
  510. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/buffer_utils.js +0 -1
  511. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/cek.js +0 -1
  512. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/check_iv_length.js +0 -1
  513. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/check_key_type.js +0 -1
  514. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/check_p2s.js +0 -1
  515. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/crypto_key.js +0 -1
  516. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/decrypt_key_management.js +0 -1
  517. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/encrypt_key_management.js +0 -1
  518. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/epoch.js +0 -1
  519. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/invalid_key_input.js +0 -1
  520. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/is_disjoint.js +0 -1
  521. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/is_jwk.js +0 -1
  522. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/is_object.js +0 -1
  523. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/iv.js +0 -1
  524. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/jwt_claims_set.js +0 -1
  525. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/private_symbols.js +0 -1
  526. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/secs.js +0 -1
  527. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/validate_algorithms.js +0 -1
  528. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/lib/validate_crit.js +0 -1
  529. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/aeskw.js +0 -1
  530. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/asn1.js +0 -1
  531. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/base64url.js +0 -1
  532. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/cbc_tag.js +0 -1
  533. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/check_cek_length.js +0 -1
  534. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/check_key_length.js +0 -1
  535. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/ciphers.js +0 -1
  536. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/decrypt.js +0 -1
  537. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/digest.js +0 -1
  538. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/dsa_digest.js +0 -1
  539. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/ecdhes.js +0 -1
  540. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/encrypt.js +0 -1
  541. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/fetch_jwks.js +0 -1
  542. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/generate.js +0 -1
  543. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/get_named_curve.js +0 -1
  544. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/get_sign_verify_key.js +0 -1
  545. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/hmac_digest.js +0 -1
  546. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/is_key_like.js +0 -1
  547. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/is_key_object.js +0 -1
  548. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/jwk_to_key.js +0 -1
  549. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/key_to_jwk.js +0 -1
  550. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/node_key.js +0 -1
  551. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/normalize_key.js +0 -1
  552. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/pbes2kw.js +0 -1
  553. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/random.js +0 -1
  554. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/rsaes.js +0 -1
  555. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/runtime.js +0 -1
  556. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/sign.js +0 -1
  557. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/timing_safe_equal.js +0 -1
  558. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/verify.js +0 -1
  559. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/runtime/webcrypto.js +0 -1
  560. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/util/base64url.js +0 -1
  561. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/util/decode_jwt.js +0 -1
  562. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/util/decode_protected_header.js +0 -1
  563. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/util/errors.js +0 -1
  564. package/dist/src/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/cjs/util/runtime.js +0 -1
  565. package/dist/src/node_modules/.pnpm/merge-stream@2.0.0/node_modules/merge-stream/index.js +0 -1
  566. package/dist/src/node_modules/.pnpm/mimic-fn@2.1.0/node_modules/mimic-fn/index.js +0 -1
  567. package/dist/src/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/assert-valid-pattern.js +0 -1
  568. package/dist/src/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/ast.js +0 -1
  569. package/dist/src/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/brace-expressions.js +0 -1
  570. package/dist/src/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/escape.js +0 -1
  571. package/dist/src/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/index.js +0 -1
  572. package/dist/src/node_modules/.pnpm/minimatch@10.2.6/node_modules/minimatch/dist/esm/unescape.js +0 -1
  573. package/dist/src/node_modules/.pnpm/mixpart@0.0.6/node_modules/mixpart/dist/index.js +0 -7
  574. package/dist/src/node_modules/.pnpm/npm-run-path@4.0.1/node_modules/npm-run-path/index.js +0 -1
  575. package/dist/src/node_modules/.pnpm/onetime@5.1.2/node_modules/onetime/index.js +0 -1
  576. package/dist/src/node_modules/.pnpm/os-paths@4.4.0/node_modules/os-paths/src/lib/index.js +0 -1
  577. package/dist/src/node_modules/.pnpm/path-key@3.1.1/node_modules/path-key/index.js +0 -1
  578. package/dist/src/node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js +0 -1
  579. package/dist/src/node_modules/.pnpm/shebang-command@2.0.0/node_modules/shebang-command/index.js +0 -1
  580. package/dist/src/node_modules/.pnpm/shebang-regex@3.0.0/node_modules/shebang-regex/index.js +0 -1
  581. package/dist/src/node_modules/.pnpm/signal-exit@3.0.7/node_modules/signal-exit/index.js +0 -1
  582. package/dist/src/node_modules/.pnpm/signal-exit@3.0.7/node_modules/signal-exit/signals.js +0 -1
  583. package/dist/src/node_modules/.pnpm/strip-final-newline@2.0.0/node_modules/strip-final-newline/index.js +0 -2
  584. package/dist/src/node_modules/.pnpm/which@2.0.2/node_modules/which/which.js +0 -1
  585. package/dist/src/node_modules/.pnpm/xdg-app-paths@5.5.1/node_modules/xdg-app-paths/src/lib/index.js +0 -1
  586. package/dist/src/node_modules/.pnpm/xdg-portable@7.3.0/node_modules/xdg-portable/src/lib/index.js +0 -1
  587. package/dist/src/public/tools/load-skill.d.ts +0 -3
  588. package/dist/src/public/tools/load-skill.js +0 -1
  589. package/dist/src/runtime/skills/fragment-context.d.ts +0 -4
  590. package/dist/src/runtime/skills/fragment-context.js +0 -1
  591. package/dist/src/tools/framework/connection-tools.d.ts +0 -3
  592. package/dist/src/tools/framework/connection-tools.js +0 -1
  593. package/dist/src/tools/provided/load-skill.d.ts +0 -2
  594. package/dist/src/tools/provided/load-skill.js +0 -1
  595. /package/dist/src/extensions/{code → git}/extension/lib/github-shell-schema.d.ts +0 -0
  596. /package/dist/src/extensions/{code → git}/extension/lib/github-shell-schema.js +0 -0
  597. /package/dist/src/extensions/{code → git}/extension/lib/signed-commit.d.ts +0 -0
  598. /package/dist/src/extensions/{code → git}/extension/lib/signed-commit.js +0 -0
  599. /package/dist/src/{runtime/connections/tool-signature.js → tools/signature.js} +0 -0
@@ -1,9 +1,10 @@
1
+ import type { AgentToolExposure } from "#shared/agent-definition.js";
1
2
  export interface DynamicRemoteAgentConfig {
2
3
  readonly credentialsStepId?: string;
3
4
  readonly description: string;
4
5
  readonly forwardPrincipal?: boolean;
5
6
  readonly path: string;
6
- readonly tool?: boolean;
7
+ readonly tool?: AgentToolExposure;
7
8
  readonly url: string;
8
9
  }
9
10
  export declare function normalizeDynamicRemoteAgentConfig(input: {
@@ -1 +1 @@
1
- import{expectBoolean,expectFunction,expectObjectRecord,expectOnlyKnownKeys,expectString,getOptionalStringRecordProperty}from"#internal/authored-module.js";import{EVE_SESSION_ROUTE_PATH}from"#protocol/routes.js";async function normalizeDynamicRemoteAgentConfig(e){let t=`Dynamic subagent "${e.name}" must return defineAgent(...), defineRemoteAgent(...), or null.`,n=expectObjectRecord(e.value,t);if(expectOnlyKnownKeys(n,[`auth`,`description`,`forwardPrincipal`,`headers`,`kind`,`path`,`tool`,`url`],t),n.kind!==`remote`)throw Error(t);let r=await resolveUrl(n.url,t),i=readCredentialsStepId(n);if(validateCredentials(n,t),(n.auth!==void 0||n.headers!==void 0)&&i===void 0)throw Error(`${t} Dynamic remote auth and headers must be compiled by eve so credentials stay out of durable workflow state.`);let a={description:expectString(n.description,t),path:n.path===void 0?EVE_SESSION_ROUTE_PATH:expectString(n.path,t),url:r};return i!==void 0&&(a.credentialsStepId=i),n.forwardPrincipal!==void 0&&(a.forwardPrincipal=expectBoolean(n.forwardPrincipal,t)),n.tool!==void 0&&(a.tool=expectBoolean(n.tool,t)),a}async function resolveUrl(e,t){let n=typeof e==`function`?await expectFunction(e,t)():expectString(e,t);if(n.length===0)throw Error(`${t} The "url" field must resolve to a non-empty string.`);return n}function validateCredentials(e,t){e.auth!==void 0&&expectFunction(e.auth,t),e.headers!==void 0&&typeof e.headers!=`function`&&getOptionalStringRecordProperty(e,`headers`,t)}function readCredentialsStepId(e){let t=e.__eveResolveRemoteAgentCredentials;if(typeof t!=`function`)return;let n=t.stepId;return typeof n==`string`?n:void 0}export{normalizeDynamicRemoteAgentConfig};
1
+ import{expectAgentToolExposure,expectBoolean,expectFunction,expectObjectRecord,expectOnlyKnownKeys,expectString,getOptionalStringRecordProperty}from"#internal/authored-module.js";import{EVE_SESSION_ROUTE_PATH}from"#protocol/routes.js";async function normalizeDynamicRemoteAgentConfig(e){let t=`Dynamic subagent "${e.name}" must return defineAgent(...), defineRemoteAgent(...), or null.`,n=expectObjectRecord(e.value,t);if(expectOnlyKnownKeys(n,[`auth`,`description`,`forwardPrincipal`,`headers`,`kind`,`path`,`tool`,`url`],t),n.kind!==`remote`)throw Error(t);let r=await resolveUrl(n.url,t),i=readCredentialsStepId(n);if(validateCredentials(n,t),(n.auth!==void 0||n.headers!==void 0)&&i===void 0)throw Error(`${t} Dynamic remote auth and headers must be compiled by eve so credentials stay out of durable workflow state.`);let a={description:expectString(n.description,t),path:n.path===void 0?EVE_SESSION_ROUTE_PATH:expectString(n.path,t),url:r};return i!==void 0&&(a.credentialsStepId=i),n.forwardPrincipal!==void 0&&(a.forwardPrincipal=expectBoolean(n.forwardPrincipal,t)),n.tool!==void 0&&(a.tool=expectAgentToolExposure(n.tool,t)),a}async function resolveUrl(e,t){let n=typeof e==`function`?await expectFunction(e,t)():expectString(e,t);if(n.length===0)throw Error(`${t} The "url" field must resolve to a non-empty string.`);return n}function validateCredentials(e,t){e.auth!==void 0&&expectFunction(e.auth,t),e.headers!==void 0&&typeof e.headers!=`function`&&getOptionalStringRecordProperty(e,`headers`,t)}function readCredentialsStepId(e){let t=e.__eveResolveRemoteAgentCredentials;if(typeof t!=`function`)return;let n=t.stepId;return typeof n==`string`?n:void 0}export{normalizeDynamicRemoteAgentConfig};
@@ -1,6 +1,7 @@
1
1
  import type { PreparedRuntimeDelegationTool } from "#runtime/sessions/turn.js";
2
2
  import type { ResolvedDynamicSubagentDefinition, ResolvedRuntimeDelegationNode } from "#runtime/types.js";
3
3
  import type { JsonObject } from "#shared/json.js";
4
+ import type { AgentToolExposure } from "#shared/agent-definition.js";
4
5
  /**
5
6
  * One runtime-owned subagent tracked by the prepared registry.
6
7
  */
@@ -12,7 +13,7 @@ export interface ResolvedDynamicSubagentResolver extends ResolvedDynamicSubagent
12
13
  readonly kind: "subagent";
13
14
  readonly name: string;
14
15
  readonly nodeId: string;
15
- readonly tool?: boolean;
16
+ readonly tool?: AgentToolExposure;
16
17
  }
17
18
  /**
18
19
  * Runtime-owned registry that keeps all resolved subagents addressable while
@@ -1 +1 @@
1
- import{serializeInputSchema}from"#tools/schema.js";import{SUBAGENT_TOOL_INPUT_SCHEMA}from"#tools/framework/agent-contract.js";import{RuntimeRegistry,RuntimeRegistryError}from"#internal/runtime-registry.js";const SUBAGENT_TOOL_INPUT_JSON_SCHEMA=serializeInputSchema(SUBAGENT_TOOL_INPUT_SCHEMA);function createRuntimeSubagentRegistry(e){let t=[],n=new Set,r=[],i=new RuntimeRegistry(`subagent`),a=new Set(e.reservedToolNames??[]),o=new Set(e.disabledToolNames??[]),s=new Map;for(let c of e.subagents){let e={logicalPath:c.logicalPath,sourceId:c.sourceId};if(s.has(c.nodeId))throw new RuntimeRegistryError(`subagent`,`Found multiple runtime subagents mapped to node id "${c.nodeId}".`,{...e,entryName:c.name});let l,u=c.kind===`subagent`?c.dynamic:void 0;if(u===void 0){let n=createPreparedRuntimeSubagentTool(c,SUBAGENT_TOOL_INPUT_JSON_SCHEMA);l={definition:c,prepared:n},i.register(c.name,l,{location:e,duplicateMessage:`Found multiple subagents named "${c.name}". Subagent names must be unique at runtime.`});let r=c.tool!==!1&&!o.has(c.name);if(r&&a.has(c.name))throw new RuntimeRegistryError(`subagent`,`Subagent "${c.name}" collides with another runtime-visible tool name.`,{...e,entryName:c.name});r&&t.push(n)}else n.add(c.nodeId),r.push({...u,kind:`subagent`,logicalPath:c.logicalPath,name:c.name,nodeId:c.nodeId,sourceId:c.sourceId,sourceKind:`module`,tool:!o.has(c.name)&&void 0}),l={definition:c};s.set(c.nodeId,l)}return{dynamicNodeIds:n,dynamicResolvers:r,preparedTools:t,subagentsByName:i.asMap(),subagentsByNodeId:s}}function createPreparedRuntimeSubagentTool(e,t=SUBAGENT_TOOL_INPUT_JSON_SCHEMA){if(e.description===void 0)throw Error(`Static subagent "${e.name}" is missing a description.`);return{behavior:{availability:[],handling:{kind:`dispatch`,target:e.kind===`remote`?{kind:`remote-agent-call`,nodeId:e.nodeId,remoteAgentName:e.name}:{kind:`subagent-call`,nodeId:e.nodeId,subagentName:e.name}}},description:e.description,inputSchema:t,kind:e.kind,logicalPath:e.logicalPath,name:e.name,nodeId:e.nodeId,sourceId:e.sourceId}}export{createPreparedRuntimeSubagentTool,createRuntimeSubagentRegistry};
1
+ import{serializeInputSchema}from"#tools/schema.js";import{eveNamespaceReservation}from"#protocol/runtime-tools.js";import{SUBAGENT_TOOL_INPUT_SCHEMA}from"#tools/framework/agent-contract.js";import{RuntimeRegistry,RuntimeRegistryError}from"#internal/runtime-registry.js";const SUBAGENT_TOOL_INPUT_JSON_SCHEMA=serializeInputSchema(SUBAGENT_TOOL_INPUT_SCHEMA);function createRuntimeSubagentRegistry(e){let t=[],n=new Set,r=[],i=new RuntimeRegistry(`subagent`),a=new Set(e.reservedToolNames??[]),o=new Set(e.disabledToolNames??[]),s=new Map;for(let c of e.subagents){let e={logicalPath:c.logicalPath,sourceId:c.sourceId};if(s.has(c.nodeId))throw new RuntimeRegistryError(`subagent`,`Found multiple runtime subagents mapped to node id "${c.nodeId}".`,{...e,entryName:c.name});let l,u=c.kind===`subagent`?c.dynamic:void 0;if(u===void 0){let n=createPreparedRuntimeSubagentTool(c,SUBAGENT_TOOL_INPUT_JSON_SCHEMA);l={definition:c,prepared:n},i.register(c.name,l,{location:e,duplicateMessage:duplicateSubagentMessage(c.name)});let r=c.tool!==!1&&!o.has(c.name),s=eveNamespaceReservation(c.name);if(s!==void 0)throw new RuntimeRegistryError(`subagent`,`Subagent "${c.logicalPath}" uses the reserved name "${c.name}". Rename its path; ${s}.`,{...e,entryName:c.name});if(r&&a.has(c.name))throw new RuntimeRegistryError(`subagent`,`Subagent "${c.name}" collides with another runtime-visible tool name.`,{...e,entryName:c.name});r&&t.push(n)}else n.add(c.nodeId),r.push({...u,kind:`subagent`,logicalPath:c.logicalPath,name:c.name,nodeId:c.nodeId,sourceId:c.sourceId,sourceKind:`module`,tool:!o.has(c.name)&&void 0}),l={definition:c};s.set(c.nodeId,l)}return assertUniqueDynamicSubagentNames(r,i.asMap()),{dynamicNodeIds:n,dynamicResolvers:r,preparedTools:t,subagentsByName:i.asMap(),subagentsByNodeId:s}}function createPreparedRuntimeSubagentTool(e,t=SUBAGENT_TOOL_INPUT_JSON_SCHEMA){if(e.description===void 0)throw Error(`Static subagent "${e.name}" is missing a description.`);return{behavior:{availability:[],handling:{kind:`dispatch`,target:e.kind===`remote`?{kind:`remote-agent-call`,nodeId:e.nodeId,remoteAgentName:e.name}:{kind:`subagent-call`,nodeId:e.nodeId,subagentName:e.name}}},deferred:e.tool===`deferred`||void 0,description:e.description,inputSchema:t,kind:e.kind,logicalPath:e.logicalPath,name:e.name,nodeId:e.nodeId,sourceId:e.sourceId}}function duplicateSubagentMessage(e){return`Found multiple subagents named "${e}". Subagent names must be unique at runtime.`}function assertUniqueDynamicSubagentNames(e,t){let n=new Set(t.keys());for(let{logicalPath:t,name:r,sourceId:i}of e){if(n.has(r))throw new RuntimeRegistryError(`subagent`,duplicateSubagentMessage(r),{entryName:r,logicalPath:t,sourceId:i});n.add(r)}}export{createPreparedRuntimeSubagentTool,createRuntimeSubagentRegistry};
@@ -21,6 +21,8 @@ export interface RuntimeToolRegistry {
21
21
  export declare function createRuntimeToolRegistry(definitions: {
22
22
  readonly tools: readonly ResolvedToolDefinition[];
23
23
  }, input?: {
24
+ /** Set by `tool: "deferred"` on the agent, which defers its built-in `agent` tool. */
25
+ readonly deferSelfAgent?: boolean;
24
26
  readonly nodeId?: string;
25
27
  readonly reservedToolNames?: readonly string[];
26
28
  }): Promise<RuntimeToolRegistry>;
@@ -1 +1 @@
1
- import{serializeInputSchema,serializeOutputSchema}from"#tools/schema.js";import{AGENT_TOOL_NAME}from"#tools/framework/agent-contract.js";import{RuntimeRegistry}from"#internal/runtime-registry.js";async function createRuntimeToolRegistry(e,t={}){let n=[],r=new RuntimeRegistry(`tool`,t.reservedToolNames??[]);for(let i of e.tools){let e=await createPreparedRuntimeTool(i,t.nodeId);r.register(i.name,{definition:i,prepared:e},{location:{logicalPath:i.logicalPath,sourceId:i.sourceId},duplicateMessage:`Found multiple authored tools named "${i.name}". Tool names must be unique at runtime.`,reservedMessage:`Tool "${i.name}" collides with another runtime-visible tool name.`}),n.push(e)}return{preparedTools:n,toolsByName:r.asMap()}}function findRegisteredRuntimeTool(e,t){return e.toolsByName.get(t)??null}async function createPreparedRuntimeTool(e,t){let n=e.behavior?.handling?.kind===`dispatch`&&e.behavior.handling.action===`self-agent`;return{availableInSubagents:e.availableInSubagents,behavior:prepareToolBehavior(e.behavior,t),description:e.description,inputSchema:serializeInputSchema(e.inputSchema),kind:`authored-tool`,logicalPath:e.logicalPath,name:e.name,owner:e.owner,outputSchema:serializeOutputSchema(e.outputSchema),rootOnly:n||void 0,sourceId:e.sourceId}}function prepareToolBehavior(e,t){if(e===void 0)return;let n;if(e.handling?.kind===`dispatch`){if(t===void 0)throw Error(`The self-agent tool requires a concrete runtime node id.`);n={kind:`dispatch`,target:{kind:`self-agent-call`,nodeId:t,subagentName:AGENT_TOOL_NAME}}}else n=e.handling?.kind===`workflow-tool`?{kind:`dispatch`,target:{entryPoint:e.handling.entryPoint,kind:`workflow-tool-call`,workflowId:e.handling.workflowId}}:e.handling;return{availability:e.availability,handling:n,presentation:e.presentation}}export{createRuntimeToolRegistry,findRegisteredRuntimeTool};
1
+ import{serializeInputSchema,serializeOutputSchema}from"#tools/schema.js";import{AGENT_TOOL_NAME}from"#tools/framework/agent-contract.js";import{RuntimeRegistry}from"#internal/runtime-registry.js";async function createRuntimeToolRegistry(e,t={}){let n=[],r=new RuntimeRegistry(`tool`,t.reservedToolNames??[]);for(let i of e.tools){let e=await createPreparedRuntimeTool(i,t);r.register(i.name,{definition:i,prepared:e},{location:{logicalPath:i.logicalPath,sourceId:i.sourceId},duplicateMessage:`Found multiple authored tools named "${i.name}". Tool names must be unique at runtime.`,reservedMessage:`Tool "${i.name}" collides with another runtime-visible tool name.`}),n.push(e)}return{preparedTools:n,toolsByName:r.asMap()}}function findRegisteredRuntimeTool(e,t){return e.toolsByName.get(t)??null}async function createPreparedRuntimeTool(e,t){let n=e.behavior?.handling?.kind===`dispatch`&&e.behavior.handling.action===`self-agent`;return{availableInSubagents:e.availableInSubagents,behavior:prepareToolBehavior(e.behavior,t.nodeId),deferred:e.deferred??(n&&t.deferSelfAgent||void 0),description:e.description,inputSchema:serializeInputSchema(e.inputSchema),kind:`authored-tool`,logicalPath:e.logicalPath,name:e.name,owner:e.owner,outputSchema:serializeOutputSchema(e.outputSchema),rootOnly:n||void 0,sourceId:e.sourceId}}function prepareToolBehavior(e,t){if(e===void 0)return;let n;if(e.handling?.kind===`dispatch`){if(t===void 0)throw Error(`The self-agent tool requires a concrete runtime node id.`);n={kind:`dispatch`,target:{kind:`self-agent-call`,nodeId:t,subagentName:AGENT_TOOL_NAME}}}else n=e.handling?.kind===`workflow-tool`?{kind:`dispatch`,target:{entryPoint:e.handling.entryPoint,kind:`workflow-tool-call`,workflowId:e.handling.workflowId}}:e.handling;return{availability:e.availability,handling:n}}export{createRuntimeToolRegistry,findRegisteredRuntimeTool};
@@ -20,7 +20,7 @@ import type { Optional } from "#shared/optional.js";
20
20
  import type { Node } from "#shared/node.js";
21
21
  import type { SourceRef, ModuleSourceRef, SkillPackageSourceRef, MarkdownSourceRef } from "#shared/source-ref.js";
22
22
  import type { NamedSkillDefinition } from "#shared/skill-definition.js";
23
- import type { InternalAgentDefinition } from "#shared/agent-definition.js";
23
+ import type { InternalAgentDefinition, AgentToolExposure } from "#shared/agent-definition.js";
24
24
  import type { RuntimeDynamicModelReference } from "#runtime/agent/bootstrap.js";
25
25
  import type { InternalToolDefinitionWithExecuteFn } from "#tools/definition.js";
26
26
  import type { CompiledToolBehavior } from "#tools/behavior.js";
@@ -240,7 +240,7 @@ export interface ResolvedChannelDefinition extends ResolvedModuleSourceRef {
240
240
  export type ResolvedRuntimeSubagentNode = Readonly<ModuleSourceRef & Node & {
241
241
  kind: "subagent";
242
242
  name: string;
243
- tool?: boolean;
243
+ tool?: AgentToolExposure;
244
244
  } & ({
245
245
  description: string;
246
246
  dynamic?: never;
@@ -260,7 +260,7 @@ export type ResolvedRuntimeRemoteAgentNode = Readonly<ModuleSourceRef & Node & {
260
260
  kind: "remote";
261
261
  name: string;
262
262
  path: string;
263
- tool?: boolean;
263
+ tool?: AgentToolExposure;
264
264
  url: string;
265
265
  }>;
266
266
  /**
@@ -1,3 +1,2 @@
1
- import{readProjectLink}from"#setup/project-resolution.js";import{captureVercel,runVercel,runVercelCaptureStdout}from"#setup/primitives/run-vercel.js";import{createPromptCommandOutput,withPhase}from"#setup/cli/index.js";const CREATED_CONNECTOR=/\bConnector created:\s*(scl_[A-Za-z0-9_-]+)\b/u;function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function parseJson(e){try{return JSON.parse(e)}catch{return}}function connectorCreationFailure(e,t){let n=t?.split(`
2
- `).map(e=>e.trim()).filter(e=>e.length>0&&!e.startsWith(`Vercel CLI `)).at(-1);return n===void 0?`Could not create the ${e} connector.`:`Could not create the ${e} connector. Vercel returned: ${n}`}function parseConnectorRef(e){if(!isRecord(e)||typeof e.uid!=`string`||typeof e.id!=`string`)return;let t={uid:e.uid,id:e.id};return typeof e.name==`string`&&(t.name=e.name),t}function parseCreatedConnector(e,t=`user`){let n=parseJson(e),r=parseConnectorRef(n);if(!isRecord(n)||r===void 0)return;let i=n.supportedSubjectTypes;return Array.isArray(i)&&i.includes(t)?r:void 0}function parseConnectorList(e,t){let n=[];for(let r of e){if(!isRecord(r)||typeof r.service==`string`&&r.service!==t)continue;let e=parseConnectorRef(r);e!==void 0&&n.push(e)}return n}function parseConnectorListPage(e,t){if(!isRecord(e)||!Array.isArray(e.connectors))return;let n=typeof e.cursor==`string`?e.cursor:void 0;return n===void 0?{connectors:parseConnectorList(e.connectors,t)}:{connectors:parseConnectorList(e.connectors,t),cursor:n}}async function listConnectors(e,t,n){let r=[],i=new Set,a;do{let o=[`connect`,`list`,`-F`,`json`,`--all-projects`,`--service`,e.service,`--scope`,t.orgId];a!==void 0&&o.push(`--next`,a);let s=await captureVercel(o,{cwd:e.projectRoot,onOutput:n,signal:e.signal});if(!s.ok)throw Error(s.failure.message);let c=parseConnectorListPage(parseJson(s.stdout),e.service);if(c===void 0)throw Error(`Vercel returned an invalid connector list for ${e.service}.`);r.push(...c.connectors);let l=c.cursor;if(l!==void 0&&i.has(l))throw Error(`The connector list repeated cursor ${l}.`);l!==void 0&&i.add(l),a=l}while(a!==void 0);return r}async function supportsPrincipalType(e,t,n,r){let i=`/v1/connect/connectors/${encodeURIComponent(n.id)}`,a=await captureVercel([`api`,i,`--scope`,t.orgId,`--raw`],{cwd:e.projectRoot,onOutput:r,signal:e.signal});if(!a.ok)throw Error(`Could not verify connector ${n.uid}.`);let o=parseJson(a.stdout);if(!isRecord(o)||o.id!==n.id||o.uid!==n.uid||typeof o.service==`string`&&o.service!==e.service)throw Error(`Vercel returned invalid details for connector ${n.uid}.`);let s=o.supportedSubjectTypes;return Array.isArray(s)&&s.includes(e.principalType??`user`)}function connectorNames(e){let t=new Set;for(let n of e){n.name!==void 0&&t.add(n.name.toLowerCase());let e=n.uid.slice(n.uid.lastIndexOf(`/`)+1).trim();e.length>0&&t.add(e.toLowerCase())}return t}function connectorMatchesCanonicalName(e,t){let n=t.toLowerCase();return e.name?.toLowerCase()===n||e.uid.slice(e.uid.lastIndexOf(`/`)+1).trim().toLowerCase()===n}function nextConnectorName(e,t){if(!t.has(e.toLowerCase()))return e;let n=2;for(;t.has(`${e}-${n}`.toLowerCase());)n+=1;return`${e}-${n}`}async function cleanupCreatedConnectionConnector(e){let t=e.orgId??(await readProjectLink(e.projectRoot))?.orgId,n=[`connect`,`remove`,e.connectorId,`--disconnect-all`,`--yes`];if(t!==void 0&&n.push(`--scope`,t),!await runVercel(n,{cwd:e.projectRoot,onOutput:createPromptCommandOutput(e.log)}))throw Error(`Could not remove connector ${e.connectorId}; run \`vercel connect remove ${e.connectorId} --disconnect-all --yes\`.`)}async function attach(e,t,n,r){return runVercel([`connect`,`attach`,n,`--yes`,`--scope`,t.orgId],{cwd:e.projectRoot,onOutput:r,signal:e.signal})}async function resolveFallbackConnector(e,t,n,r,i){let a=e.principalType??`user`,o=i;for(;;){if(await e.prompter.select({message:`Which connector should ${e.slug} use?`,hintLayout:`inline`,notices:[{tone:`warning`,text:o}],options:[{value:`find`,label:`Find a new one`,hint:`Browse existing connectors`},{value:`create`,label:`Create a new one`,hint:`Register another connector`}]})===`find`){let i=[];for(let a of r)await supportsPrincipalType(e,t,a,n)&&i.push(a);if(i.length===0){o=`No existing ${e.service} connectors support ${a} credentials.`;continue}let s=new Map(i.map(e=>[e.uid,e])),c=await e.prompter.select({message:`Select a connector for ${e.slug}`,hintLayout:`inline`,search:!0,placeholder:`type to search connectors`,options:i.map(e=>({value:e.uid,label:e.uid,hint:e.name??e.id}))}),l=s.get(c);if(l===void 0)throw Error(`Connector ${c} is no longer available.`);return{kind:`existing`,connector:l}}let i=connectorNames(r),s=(await e.prompter.text({message:`New connector name`,defaultValue:nextConnectorName(e.slug,i),validate:e=>{let t=e.trim().toLowerCase();return t.length===0?`A name is required.`:i.has(t)?`A connector with this name already exists.`:void 0}})).trim(),c=[],createOutput=e=>{c.push(e.text),n(e)},l=await withPhase(e.log,`Waiting for you to complete setup in the browser…`,()=>runVercelCaptureStdout([`connect`,`create`,e.creationType??e.service,`--name`,s,...e.connectionMethod===void 0?[]:[`--connection-method`,e.connectionMethod],`-F`,`json`,`--scope`,t.orgId],{cwd:e.projectRoot,onOutput:createOutput,signal:e.signal})),u=parseConnectorRef(parseJson(l.stdout))?.id??CREATED_CONNECTOR.exec(c.join(`
1
+ import{readProjectLink}from"#setup/project-resolution.js";import{vercelErrorDetail}from"#setup/primitives/process-output.js";import{captureVercel,runVercel,runVercelCaptureStdout}from"#setup/primitives/run-vercel.js";import{createPromptCommandOutput,withPhase}from"#setup/cli/index.js";const CREATED_CONNECTOR=/\bConnector created:\s*(scl_[A-Za-z0-9_-]+)\b/u;function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function parseJson(e){try{return JSON.parse(e)}catch{return}}function connectorCreationFailure(e,t){let n=vercelErrorDetail(t);return n===void 0?`Could not create the ${e} connector.`:`Could not create the ${e} connector. Vercel returned: ${n}`}function parseConnectorRef(e){if(!isRecord(e)||typeof e.uid!=`string`||typeof e.id!=`string`)return;let t={uid:e.uid,id:e.id};return typeof e.name==`string`&&(t.name=e.name),t}function parseCreatedConnector(e,t=`user`){let n=parseJson(e),r=parseConnectorRef(n);if(!isRecord(n)||r===void 0)return;let i=n.supportedSubjectTypes;return Array.isArray(i)&&i.includes(t)?r:void 0}function parseConnectorList(e,t){let n=[];for(let r of e){if(!isRecord(r)||typeof r.service==`string`&&r.service!==t)continue;let e=parseConnectorRef(r);e!==void 0&&n.push(e)}return n}function parseConnectorListPage(e,t){if(!isRecord(e)||!Array.isArray(e.connectors))return;let n=typeof e.cursor==`string`?e.cursor:void 0;return n===void 0?{connectors:parseConnectorList(e.connectors,t)}:{connectors:parseConnectorList(e.connectors,t),cursor:n}}async function listConnectors(e,t,n){let r=[],i=new Set,a;do{let o=[`connect`,`list`,`-F`,`json`,`--all-projects`,`--service`,e.service,`--scope`,t.orgId];a!==void 0&&o.push(`--next`,a);let s=await captureVercel(o,{cwd:e.projectRoot,onOutput:n,signal:e.signal});if(!s.ok)throw Error(s.failure.message);let c=parseConnectorListPage(parseJson(s.stdout),e.service);if(c===void 0)throw Error(`Vercel returned an invalid connector list for ${e.service}.`);r.push(...c.connectors);let l=c.cursor;if(l!==void 0&&i.has(l))throw Error(`The connector list repeated cursor ${l}.`);l!==void 0&&i.add(l),a=l}while(a!==void 0);return r}async function supportsPrincipalType(e,t,n,r){let i=`/v1/connect/connectors/${encodeURIComponent(n.id)}`,a=await captureVercel([`api`,i,`--scope`,t.orgId,`--raw`],{cwd:e.projectRoot,onOutput:r,signal:e.signal});if(!a.ok)throw Error(`Could not verify connector ${n.uid}.`);let o=parseJson(a.stdout);if(!isRecord(o)||o.id!==n.id||o.uid!==n.uid||typeof o.service==`string`&&o.service!==e.service)throw Error(`Vercel returned invalid details for connector ${n.uid}.`);let s=o.supportedSubjectTypes;return Array.isArray(s)&&s.includes(e.principalType??`user`)}function connectorNames(e){let t=new Set;for(let n of e){n.name!==void 0&&t.add(n.name.toLowerCase());let e=n.uid.slice(n.uid.lastIndexOf(`/`)+1).trim();e.length>0&&t.add(e.toLowerCase())}return t}function connectorMatchesCanonicalName(e,t){let n=t.toLowerCase();return e.name?.toLowerCase()===n||e.uid.slice(e.uid.lastIndexOf(`/`)+1).trim().toLowerCase()===n}function nextConnectorName(e,t){if(!t.has(e.toLowerCase()))return e;let n=2;for(;t.has(`${e}-${n}`.toLowerCase());)n+=1;return`${e}-${n}`}async function cleanupCreatedConnectionConnector(e){let t=e.orgId??(await readProjectLink(e.projectRoot))?.orgId,n=[`connect`,`remove`,e.connectorId,`--disconnect-all`,`--yes`];if(t!==void 0&&n.push(`--scope`,t),!await runVercel(n,{cwd:e.projectRoot,onOutput:createPromptCommandOutput(e.log)}))throw Error(`Could not remove connector ${e.connectorId}; run \`vercel connect remove ${e.connectorId} --disconnect-all --yes\`.`)}async function attach(e,t,n,r){return runVercel([`connect`,`attach`,n,`--yes`,`--scope`,t.orgId],{cwd:e.projectRoot,onOutput:r,signal:e.signal})}async function resolveFallbackConnector(e,t,n,r,i){let a=e.principalType??`user`,o=i;for(;;){if(await e.prompter.select({message:`Which connector should ${e.slug} use?`,hintLayout:`inline`,notices:[{tone:`warning`,text:o}],options:[{value:`find`,label:`Find a new one`,hint:`Browse existing connectors`},{value:`create`,label:`Create a new one`,hint:`Register another connector`}]})===`find`){let i=[];for(let a of r)await supportsPrincipalType(e,t,a,n)&&i.push(a);if(i.length===0){o=`No existing ${e.service} connectors support ${a} credentials.`;continue}let s=new Map(i.map(e=>[e.uid,e])),c=await e.prompter.select({message:`Select a connector for ${e.slug}`,hintLayout:`inline`,search:!0,placeholder:`type to search connectors`,options:i.map(e=>({value:e.uid,label:e.uid,hint:e.name??e.id}))}),l=s.get(c);if(l===void 0)throw Error(`Connector ${c} is no longer available.`);return{kind:`existing`,connector:l}}let i=connectorNames(r),s=(await e.prompter.text({message:`New connector name`,defaultValue:nextConnectorName(e.slug,i),validate:e=>{let t=e.trim().toLowerCase();return t.length===0?`A name is required.`:i.has(t)?`A connector with this name already exists.`:void 0}})).trim(),c=[],createOutput=e=>{c.push(e.text),n(e)},l=await withPhase(e.log,`Waiting for you to complete setup in the browser…`,()=>runVercelCaptureStdout([`connect`,`create`,e.creationType??e.service,`--name`,s,...e.connectionMethod===void 0?[]:[`--connection-method`,e.connectionMethod],`-F`,`json`,`--scope`,t.orgId],{cwd:e.projectRoot,onOutput:createOutput,signal:e.signal})),u=parseConnectorRef(parseJson(l.stdout))?.id??CREATED_CONNECTOR.exec(c.join(`
3
2
  `))?.[1],d=l.ok?parseCreatedConnector(l.stdout,a):void 0;if(d!==void 0)return{kind:`created`,connector:d};let f=l.ok?`The ${e.service} connector does not support ${a} credentials.`:connectorCreationFailure(e.service,l.stderr);if(u!==void 0){try{await cleanupCreatedConnectionConnector({log:e.log,projectRoot:e.projectRoot,connectorId:u,orgId:t.orgId})}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`${f} ${t}`)}e.signal?.throwIfAborted()}throw Error(f)}}async function setupConnectionConnector(e){let t=e.principalType??`user`,n=createPromptCommandOutput(e.log),r=e.project,i=await listConnectors(e,r,n),a=i.find(t=>connectorMatchesCanonicalName(t,e.canonicalConnectorName)),o=`Could not find a connector named ${e.canonicalConnectorName}.`;if(a!==void 0){if(await supportsPrincipalType(e,r,a,n)){if(await attach(e,r,a.uid,n))return e.log.success(`Attached ${a.uid} connector`),{kind:`existing`,connectorUid:a.uid};e.signal?.throwIfAborted(),o=`Could not attach ${a.uid}.`}else o=`${a.uid} does not support ${t} credentials.`}let s=await resolveFallbackConnector(e,r,n,i,o);if(!await attach(e,r,s.connector.uid,n)){if(s.kind===`created`){let t=`Could not attach ${s.connector.uid} to the linked project.`;try{await cleanupCreatedConnectionConnector({log:e.log,projectRoot:e.projectRoot,connectorId:s.connector.id,orgId:r.orgId})}catch(e){let n=e instanceof Error?e.message:String(e);throw Error(`${t} ${n}`)}throw e.signal?.throwIfAborted(),Error(t)}throw Error(`Could not attach ${s.connector.uid} to the linked project.`)}return e.log.success(`Attached ${s.connector.uid} connector`),s.kind===`created`?{kind:`created`,connectorUid:s.connector.uid,connectorId:s.connector.id}:{kind:`existing`,connectorUid:s.connector.uid}}export{cleanupCreatedConnectionConnector,parseCreatedConnector,setupConnectionConnector};
@@ -8,7 +8,7 @@ export { createPromptCommandOutput, type PromptCommandLog } from "./cli/index.js
8
8
  export { getPackageManagerStrategy, runPackageManagerInstall, runPnpmInstall, runVercel, spawnPackageManager, spawnPnpm, type PackageManagerStrategy, type RunPackageManagerOptions, type RunPnpmOptions, type RunVercelOptions, } from "./primitives/index.js";
9
9
  export { detectDeployment, detectProjectResolution, projectProductionUrlFromResolution, type DeploymentInfo, type DeploymentState, type ProjectResolution, } from "./project-resolution.js";
10
10
  export { runVercelEnvPull } from "./run-vercel-link.js";
11
- export { provisionSlackbot, reconcileSlackUid, type ProvisionSlackbotResult } from "./slackbot.js";
11
+ export { inspectSlackbotConnectors, provisionSlackbot, reconcileSlackUid, type ProvisionSlackbotResult, type SlackbotConnectorInspection, type SlackConnectorCandidate, type SlackConnectorSelection, } from "./slackbot.js";
12
12
  export { runRemoteAuthFlow } from "../cli/dev/tui/remote-auth.js";
13
13
  export { inspectVerifiedRemoteAgent, type InspectVerifiedRemoteAgentDeps, type VerifiedRemoteAgentInspection, } from "./verified-remote-agent.js";
14
14
  export { setupConnectionConnector, type SetupConnectionConnectorOptions, type SetupConnectionConnectorResult, } from "./connection-connector.js";
@@ -1 +1 @@
1
- import{runRemoteAuthFlow}from"../cli/dev/tui/remote-auth.js";import{InteractionRequired}from"./ask-signals.js";import"./ask.js";import{runVercel}from"./primitives/run-vercel.js";import{detectDeployment,detectProjectResolution,projectProductionUrlFromResolution}from"./project-resolution.js";import{runVercelEnvPull}from"./run-vercel-link.js";import{createDefaultSetupState,requireProjectPath,snapshotSetupState}from"./state.js";import{getPackageManagerStrategy}from"./primitives/pm/index.js";import{linkProject,requireAuth,resolveProjectByNameOrId,resolveTeam}from"./vercel-project.js";import{createPromptCommandOutput}from"./cli/command-output.js";import"./cli/index.js";import{setupConnectionConnector}from"./connection-connector.js";import{WizardCancelledError}from"./step.js";import{runHeadless,runInteractive}from"./runner.js";import{HeadlessPromptError,createHeadlessPrompter,formatHeadlessEvent}from"./headless.js";import{createPrompter}from"./prompter.js";import{runPackageManagerInstall,runPnpmInstall,spawnPackageManager,spawnPnpm}from"./primitives/pm/run.js";import"./primitives/index.js";import{provisionSlackbot,reconcileSlackUid}from"./slackbot.js";import{inspectVerifiedRemoteAgent}from"./verified-remote-agent.js";export{HeadlessPromptError,InteractionRequired,WizardCancelledError,createDefaultSetupState,createHeadlessPrompter,createPromptCommandOutput,createPrompter,detectDeployment,detectProjectResolution,formatHeadlessEvent,getPackageManagerStrategy,inspectVerifiedRemoteAgent,linkProject,projectProductionUrlFromResolution,provisionSlackbot,reconcileSlackUid,requireAuth,requireProjectPath,resolveProjectByNameOrId,resolveTeam,runHeadless,runInteractive,runPackageManagerInstall,runPnpmInstall,runRemoteAuthFlow,runVercel,runVercelEnvPull,setupConnectionConnector,snapshotSetupState,spawnPackageManager,spawnPnpm};
1
+ import{runRemoteAuthFlow}from"../cli/dev/tui/remote-auth.js";import{InteractionRequired}from"./ask-signals.js";import"./ask.js";import{runVercel}from"./primitives/run-vercel.js";import{detectDeployment,detectProjectResolution,projectProductionUrlFromResolution}from"./project-resolution.js";import{runVercelEnvPull}from"./run-vercel-link.js";import{createDefaultSetupState,requireProjectPath,snapshotSetupState}from"./state.js";import{getPackageManagerStrategy}from"./primitives/pm/index.js";import{linkProject,requireAuth,resolveProjectByNameOrId,resolveTeam}from"./vercel-project.js";import{createPromptCommandOutput}from"./cli/command-output.js";import"./cli/index.js";import{setupConnectionConnector}from"./connection-connector.js";import{WizardCancelledError}from"./step.js";import{runHeadless,runInteractive}from"./runner.js";import{HeadlessPromptError,createHeadlessPrompter,formatHeadlessEvent}from"./headless.js";import{createPrompter}from"./prompter.js";import{runPackageManagerInstall,runPnpmInstall,spawnPackageManager,spawnPnpm}from"./primitives/pm/run.js";import"./primitives/index.js";import{inspectSlackbotConnectors,provisionSlackbot,reconcileSlackUid}from"./slackbot.js";import{inspectVerifiedRemoteAgent}from"./verified-remote-agent.js";export{HeadlessPromptError,InteractionRequired,WizardCancelledError,createDefaultSetupState,createHeadlessPrompter,createPromptCommandOutput,createPrompter,detectDeployment,detectProjectResolution,formatHeadlessEvent,getPackageManagerStrategy,inspectSlackbotConnectors,inspectVerifiedRemoteAgent,linkProject,projectProductionUrlFromResolution,provisionSlackbot,reconcileSlackUid,requireAuth,requireProjectPath,resolveProjectByNameOrId,resolveTeam,runHeadless,runInteractive,runPackageManagerInstall,runPnpmInstall,runRemoteAuthFlow,runVercel,runVercelEnvPull,setupConnectionConnector,snapshotSetupState,spawnPackageManager,spawnPnpm};
@@ -1,6 +1,6 @@
1
- import type { VercelProjectReference } from "#setup/project-resolution.js";
2
1
  import { deriveSlackConnectorSlug, ensureChannel, type SlackConnectorSlug } from "#setup/scaffold/index.js";
3
- import { inspectSlackbotConnectors, provisionSlackbot, reconcileSlackUid, type SlackConnectorSelection } from "#setup/slackbot.js";
2
+ import { readSlackChannelFile } from "#setup/scaffold/update/update-slack-channel.js";
3
+ import { inspectSlackbotConnectors, provisionSlackbot, reconcileSlackUid, type SlackbotConnectorInspection, type SlackConnectorSelection } from "#setup/slackbot.js";
4
4
  import { type SetupApplyContext, type SetupPrepareContext } from "../types.js";
5
5
  export interface SlackSetupDeps {
6
6
  deriveSlackConnectorSlug: typeof deriveSlackConnectorSlug;
@@ -8,18 +8,38 @@ export interface SlackSetupDeps {
8
8
  inspectConnectors: typeof inspectSlackbotConnectors;
9
9
  provisionSlackbot: typeof provisionSlackbot;
10
10
  reconcileSlackUid: typeof reconcileSlackUid;
11
+ readSlackChannelFile: typeof readSlackChannelFile;
12
+ missingSlackEnvironment: (environmentRoot: string) => Promise<string[]>;
11
13
  }
12
14
  type SlackSetupPlan = {
13
15
  credentials: "environment";
14
16
  slug: SlackConnectorSlug;
17
+ }
18
+ /** The channel file already exists and isn't Connect-backed; setup leaves it alone. */
19
+ | {
20
+ credentials: "existing-file";
21
+ file: "environment";
22
+ missing: readonly string[];
23
+ } | {
24
+ credentials: "existing-file";
25
+ file: "custom";
15
26
  } | {
16
27
  credentials: "vercel-connect";
17
28
  slug: SlackConnectorSlug;
18
- project: VercelProjectReference;
29
+ inspection: SlackbotConnectorInspection;
19
30
  connector: SlackConnectorSelection;
31
+ /** UID the existing channel file names; patched when another connector is chosen. */
32
+ channelConnectorUid: string | undefined;
20
33
  };
34
+ /**
35
+ * Reads what is already in place before asking anything, so a re-run only
36
+ * asks the questions an earlier attempt left open. A channel file that names
37
+ * a connector settles the credential and connector questions.
38
+ */
21
39
  export declare function prepareSlackSetup(context: SetupPrepareContext, deps?: SlackSetupDeps): Promise<SlackSetupPlan>;
22
40
  export declare function applySlackSetup(plan: SlackSetupPlan, context: SetupApplyContext, deps?: SlackSetupDeps): Promise<{
41
+ facts: never[];
42
+ } | {
23
43
  facts: {
24
44
  label: string;
25
45
  value: string;
@@ -1 +1 @@
1
- import{defineSetupIntegration}from"../types.js";import{installScaffoldDependencies,reportOverwrittenFiles}from"../shared/scaffold.js";import{deriveSlackConnectorSlug,ensureChannel}from"#setup/scaffold/index.js";import{WizardCancelledError}from"#setup/step.js";import{select}from"#setup/ask.js";import{inspectSlackbotConnectors,provisionSlackbot,reconcileSlackUid}from"#setup/slackbot.js";import{slackMessageDeepLink}from"#setup/slack-connect.js";function slackbotFailureCopy(e){switch(e.state){case`not-installed`:return{reason:`Slackbot is not connected to a Slack workspace. Slack channel was not added.`,followUp:"Re-run `eve add channel/slack` after the workspace install is complete."};case`cleanup-failed`:return{reason:`The abandoned Slack connector could not be removed. Slack channel was not added.`,followUp:`Resolve the cleanup warning above before trying again.`};case`connector-lookup-failed`:return{reason:`Existing Slack connectors could not be inspected. Slack channel was not added.`,followUp:"Restore Vercel CLI access, then re-run `eve add channel/slack`."};case`installation-check-failed`:return{reason:`Slack workspace installation could not be verified. Slack channel was not added.`,followUp:"Verify Vercel Connect is reachable, then re-run `eve add channel/slack`."};case`existing-not-installed`:return{reason:`The existing Slack connector is not connected to a Slack workspace. Slack channel was not added.`,followUp:`Resolve the existing connector warning above before trying again.`};case`detach-failed`:return{reason:`Slackbot provisioning could not replace the existing trigger destination. Slack channel was not added.`,followUp:"Run the `vercel connect detach` and `vercel connect attach` commands above."};case`attach-failed`:return{reason:`Slackbot provisioning did not attach this project. Slack channel was not added.`,followUp:"Finish event delivery with the `vercel connect attach` command above."};case`create-failed`:return{reason:`Slackbot creation failed.`,followUp:"Add it later with `eve add channel/slack`."}}}const defaultDeps={deriveSlackConnectorSlug,ensureChannel,inspectConnectors:inspectSlackbotConnectors,provisionSlackbot,reconcileSlackUid};async function chooseConnector(e,t,n){return t.length===0?`create`:e.asker.ask(select({key:`slack-connector`,message:`Which Slack app would you like to use?`,options:[...t.map(e=>({id:e.uid,value:e,label:`Use ${e.uid}`,hint:e.uid===n?.uid?`Matches this agent`:void 0})),{id:`create`,value:`create`,label:`Create a new Slack app`}],recommended:n??t[0]??`create`,required:!0}))}async function prepareSlackSetup(e,t=defaultDeps){let n=await e.asker.ask(select({key:`slack-credentials`,message:`How would you like to configure Slack?`,options:[{id:`vercel`,value:`vercel-connect`,label:`Set up Vercel Connect`,hint:`Use a linked Vercel project`},{id:`portable`,value:`environment`,label:`Use portable credentials`,hint:`Read Slack tokens from environment variables`}],recommended:`vercel-connect`,required:!0})),r=await t.deriveSlackConnectorSlug(e.appRoot);if(n===`environment`)return{credentials:n,slug:r};let i=await e.resolveVercelProject(`Slack`);if(i.projectId.length===0)throw Error(`Slack setup with Vercel Connect requires a linked Vercel project.`);let a=await t.inspectConnectors(e.presenter.log,e.projectRoot,r,e.signal);return{credentials:n,slug:r,project:i,connector:a.state===`found`?await chooseConnector(e,a.connectors,a.preferred):`create`}}async function applySlackSetup(e,t,n=defaultDeps){if(e.credentials===`environment`){let r=await n.ensureChannel({projectRoot:t.appRoot,environmentRoot:t.projectRoot,kind:`slack`,slackConnectorSlug:e.slug,slackCredentials:`environment`,force:t.force,skipDependencyMutation:!0});return reportOverwrittenFiles(t.presenter.log,r.filesOverwritten),t.presenter.log.success(`Scaffolded channel: slack`),t.presenter.nextSteps([`Set SLACK_BOT_TOKEN and SLACK_SIGNING_SECRET in .env.local (listed in .env.example).`,`Configure your Slack app to send events to /eve/v1/slack on your public agent URL.`]),{facts:[],deploymentRequired:!0}}let r=await n.provisionSlackbot(t.presenter.log,t.projectRoot,e.slug,void 0,{signal:t.signal,selectConnector:async()=>e.connector});if(t.signal?.throwIfAborted(),r.state===`cancelled`)throw new WizardCancelledError;if(r.state!==`attached`){let e=slackbotFailureCopy(r);throw Error(`${e.reason} ${e.followUp}`)}let i=await n.ensureChannel({projectRoot:t.appRoot,kind:`slack`,slackConnectorUid:r.connectorUid,slackConnectorSlug:e.slug,force:t.force,skipDependencyMutation:!0});if(reportOverwrittenFiles(t.presenter.log,i.filesOverwritten),i.action===`skipped`&&!await n.reconcileSlackUid(t.presenter.log,t.projectRoot,r,`slack/${e.slug}`))throw Error(`Slack connector UID update is required before deployment.`);return t.presenter.log.success(`Scaffolded channel: slack`),await installScaffoldDependencies({changed:i.packageJsonUpdated.length>0,log:t.presenter.log,projectPath:t.projectRoot,signal:t.signal}),{facts:r.chatUrl===void 0?[]:[{label:`Agent Slack DM`,value:slackMessageDeepLink(r.chatUrl),kind:`url`}],deploymentRequired:!0}}const SLACK_SETUP=defineSetupIntegration({kind:`slack`,label:`Slack`,hint:`Slack app mentions and DMs`,prepare:prepareSlackSetup,apply:applySlackSetup});export{SLACK_SETUP,applySlackSetup,prepareSlackSetup};
1
+ import{defineSetupIntegration}from"../types.js";import{installScaffoldDependencies,reportOverwrittenFiles}from"../shared/scaffold.js";import{join}from"node:path";import{deriveSlackConnectorSlug,ensureChannel}from"#setup/scaffold/index.js";import{WizardCancelledError}from"#setup/step.js";import{InvalidAnswerError,select}from"#setup/ask.js";import{readDevelopmentEnvironmentValues}from"#shared/development-env-files.js";import{readSlackChannelFile}from"#setup/scaffold/update/update-slack-channel.js";import{connectorInUseMessage,inspectSlackbotConnectors,provisionSlackbot,reconcileSlackUid}from"#setup/slackbot.js";import{slackMessageDeepLink}from"#setup/slack-connect.js";const SLACK_CHANNEL_PATH=`agent/channels/slack.ts`,SLACK_ENVIRONMENT_VARIABLES=[`SLACK_BOT_TOKEN`,`SLACK_SIGNING_SECRET`];function slackbotFailureCopy(e){switch(e.state){case`not-installed`:return{reason:`Slackbot is not connected to a Slack workspace. Slack channel was not added.`,followUp:"Re-run `eve add channel/slack` after the workspace install is complete."};case`cleanup-failed`:return e.connectorUids.length===0?{reason:`eve couldn't confirm that the Slack setup in your browser ended. Slack channel was not added.`,followUp:"Close the Slack setup page in your browser, wait a few minutes for the request to expire, then re-run `eve add channel/slack`."}:{reason:`eve could not remove the Slack connector this attempt may have created (${e.connectorUids.map(e=>`\`${e}\``).join(`, `)}). Slack channel was not added.`,followUp:"Check that no other project uses it, remove it with `vercel connect remove <uid> --disconnect-all --yes`, then re-run `eve add channel/slack`."};case`connector-lookup-failed`:return{reason:`Existing Slack connectors could not be inspected. Slack channel was not added.`,followUp:"Restore Vercel CLI access, then re-run `eve add channel/slack`."};case`installation-check-failed`:return{reason:`Slack workspace installation could not be verified. Slack channel was not added.`,followUp:"Verify Vercel Connect is reachable, then re-run `eve add channel/slack`."};case`existing-not-installed`:return{reason:`The Slack connector is not installed in a Slack workspace yet. Slack channel was not added.`,followUp:"Re-run `eve add channel/slack` to open its install page again."};case`connector-in-use`:return{reason:`${e.connectorUid} is used by another project. Slack channel was not added.`,followUp:"Re-run `eve add channel/slack` and create a new Slack app for this agent."};case`trigger-limit-reached`:return{reason:`${e.connectorUid} already has the maximum number of trigger destinations. Slack channel was not added.`,followUp:"Remove one destination in the Connect dashboard, then re-run `eve add channel/slack`."};case`attach-failed`:return{reason:`Slackbot provisioning did not finish event delivery for this project. Slack channel was not added.`,followUp:"Re-run `eve add channel/slack` to finish the remaining steps."};case`create-failed`:return e.detail===void 0?{reason:`Vercel could not create the Slack connector. Slack channel was not added.`,followUp:"Re-run `eve add channel/slack` to try again."}:{reason:`Vercel could not create the Slack connector: ${e.detail} Slack channel was not added.`,followUp:"Fix the problem Vercel reported, then re-run `eve add channel/slack`."}}}async function missingSlackEnvironment(e){let t=readDevelopmentEnvironmentValues(e);return SLACK_ENVIRONMENT_VARIABLES.filter(e=>!process.env[e]&&!t.get(e))}const defaultDeps={deriveSlackConnectorSlug,ensureChannel,inspectConnectors:inspectSlackbotConnectors,provisionSlackbot,reconcileSlackUid,readSlackChannelFile,missingSlackEnvironment};function connectorHint(e,t,n){let r=[];if(e.uid===n?r.push(`Named in ${SLACK_CHANNEL_PATH}`):e.uid===t?.uid&&r.push(`Matches this agent`),r.push(e.attached?`attached`:`eve will attach it to this project`),e.workspace===void 0&&r.push(`not installed in a Slack workspace`),e.otherProjects.length>0){let t=e.otherProjects.map(e=>e.name??e.id);r.push(`also used by ${t.join(`, `)}`)}return r.join(` · `)}async function chooseConnector(e,t,n,r,i){let{candidates:a,preferred:o}=t;if(a.length===0)return`create`;try{return await e.asker.ask(select({key:`slack-connector`,message:`Which Slack app would you like to use?`,options:[...a.map(e=>({id:e.uid,value:e,label:`Use ${e.uid}`,hint:connectorHint(e,o,r)})),{id:`create`,value:`create`,label:`Create a new Slack app`}],recommended:o??`create`,required:!0,search:a.length>7,placeholder:`type to search Slack apps`}))}catch(e){throw e instanceof InvalidAnswerError?new InvalidAnswerError(e.question,`${e.message} Searched Slack connectors in team ${n}. eve reuses a Slack app only when it is attached to this project, or named ${i} and unused by other projects.`):e}}async function askCredentials(e){return e.asker.ask(select({key:`slack-credentials`,message:`How would you like to configure Slack?`,options:[{id:`vercel`,value:`vercel-connect`,label:`Set up Vercel Connect`,hint:`Use a linked Vercel project`},{id:`portable`,value:`environment`,label:`Use portable credentials`,hint:`Read Slack tokens from environment variables`}],recommended:`vercel-connect`,required:!0}))}async function prepareSlackSetup(e,t=defaultDeps){let n=await t.readSlackChannelFile(join(e.appRoot,SLACK_CHANNEL_PATH));if(!e.force&&n.kind===`environment`)return{credentials:`existing-file`,file:`environment`,missing:await t.missingSlackEnvironment(e.projectRoot)};if(!e.force&&n.kind===`custom`)return{credentials:`existing-file`,file:`custom`};let r=n.kind===`connect`?n.connectorUid:void 0,i=!e.force&&r!==void 0;if(!i){let n=await askCredentials(e);if(n===`environment`)return{credentials:n,slug:await t.deriveSlackConnectorSlug(e.appRoot)}}let a=await t.deriveSlackConnectorSlug(e.appRoot),o=await e.resolveVercelProject(`Slack`);if(o.projectId.length===0)throw Error(`Slack setup with Vercel Connect requires a linked Vercel project.`);let s=await t.inspectConnectors(e.presenter.log,e.projectRoot,a,{signal:e.signal,channelConnectorUid:r}),c;if(i){let t=s.inUse.find(e=>e.uid===r);if(t!==void 0)throw Error(`${connectorInUseMessage(t)} To replace the connector ${SLACK_CHANNEL_PATH} names, re-run \`eve add channel/slack --overwrite\`.`);c=s.candidates.find(e=>e.uid===r),c===void 0&&e.presenter.log.warning(`${SLACK_CHANNEL_PATH} names \`${r}\`, which was not found in team ${o.orgId}. Choose a Slack app and eve will update the channel file.`)}return c??=await chooseConnector(e,s,o.orgId,r,`slack/${a}`),{credentials:`vercel-connect`,slug:a,inspection:s,connector:c,channelConnectorUid:r}}function reportExistingFile(e,t){let{log:n}=t.presenter;return e.file===`custom`?n.info(`${SLACK_CHANNEL_PATH} already configures its own Slack credentials, so eve left it unchanged. Re-run with \`--overwrite\` to replace it with a Vercel Connect channel.`):e.missing.length===0?n.success(`${SLACK_CHANNEL_PATH} already uses portable Slack credentials.`):(n.warning(`${SLACK_CHANNEL_PATH} reads Slack credentials from environment variables, but ${e.missing.join(` and `)} ${e.missing.length===1?`is`:`are`} not set. eve left the channel file unchanged.`),t.presenter.nextSteps([`Set ${e.missing.join(` and `)} in .env.local and in the deployment environment.`,"To switch to Vercel Connect instead, re-run `eve add channel/slack --overwrite`."])),{facts:[]}}async function applySlackSetup(e,t,n=defaultDeps){if(e.credentials===`existing-file`)return reportExistingFile(e,t);if(e.credentials===`environment`){let r=await n.ensureChannel({projectRoot:t.appRoot,environmentRoot:t.projectRoot,kind:`slack`,slackConnectorSlug:e.slug,slackCredentials:`environment`,force:t.force,skipDependencyMutation:!0});return reportOverwrittenFiles(t.presenter.log,r.filesOverwritten),t.presenter.log.success(`Scaffolded channel: slack`),t.presenter.nextSteps([`Set SLACK_BOT_TOKEN and SLACK_SIGNING_SECRET in .env.local (listed in .env.example).`,`Configure your Slack app to send events to /eve/v1/slack on your public agent URL.`]),{facts:[],deploymentRequired:!0}}let r=await n.provisionSlackbot(t.presenter.log,t.projectRoot,e.inspection,e.connector,void 0,{signal:t.signal});if(t.signal?.throwIfAborted(),r.state===`cancelled`)throw new WizardCancelledError;if(r.state!==`attached`&&r.state!==`already-configured`){let e=slackbotFailureCopy(r);throw Error(`${e.reason} ${e.followUp}`)}let i=await n.ensureChannel({projectRoot:t.appRoot,kind:`slack`,slackConnectorUid:r.connectorUid,slackConnectorSlug:e.slug,force:t.force,skipDependencyMutation:!0});reportOverwrittenFiles(t.presenter.log,i.filesOverwritten);let a=i.action===`skipped`&&r.state===`already-configured`&&r.connectorUid===e.channelConnectorUid;if(i.action===`skipped`&&!await n.reconcileSlackUid(t.presenter.log,t.appRoot,r,e.channelConnectorUid??`slack/${e.slug}`))throw Error(`Slack connector UID update is required before deployment.`);return t.presenter.log.success(a?`Slack is already set up with ${r.connectorUid}.`:`Scaffolded channel: slack`),await installScaffoldDependencies({changed:i.packageJsonUpdated.length>0,log:t.presenter.log,projectPath:t.projectRoot,signal:t.signal}),{facts:r.chatUrl===void 0?[]:[{label:`Agent Slack DM`,value:slackMessageDeepLink(r.chatUrl),kind:`url`}],deploymentRequired:!0}}const SLACK_SETUP=defineSetupIntegration({kind:`slack`,label:`Slack`,hint:`Slack app mentions and DMs`,prepare:prepareSlackSetup,apply:applySlackSetup});export{SLACK_SETUP,applySlackSetup,prepareSlackSetup};
@@ -17,4 +17,9 @@ interface ProcessOutputBuffer {
17
17
  * Carriage returns emitted by progress renderers become new parent-rendered lines.
18
18
  */
19
19
  export declare function createProcessOutputBuffer(onOutput: ProcessOutputHandler): ProcessOutputBuffer;
20
+ /**
21
+ * The last meaningful stderr line of a failed Vercel CLI run, which is where
22
+ * the CLI prints its `Error: …` message after any progress output.
23
+ */
24
+ export declare function vercelErrorDetail(stderr: string | undefined): string | undefined;
20
25
  export {};
@@ -1 +1,2 @@
1
- function createProcessOutputBuffer(e){let t={stdout:``,stderr:``};return{write(n,r){let i=`${t[n]}${r.toString(`utf8`)}`.split(/\r\n|\r|\n/);t[n]=i.pop()??``;for(let t of i)e({stream:n,text:t})},flush(){for(let n of[`stdout`,`stderr`]){let r=t[n];r!==``&&(e({stream:n,text:r}),t[n]=``)}}}}export{createProcessOutputBuffer};
1
+ function createProcessOutputBuffer(e){let t={stdout:``,stderr:``};return{write(n,r){let i=`${t[n]}${r.toString(`utf8`)}`.split(/\r\n|\r|\n/);t[n]=i.pop()??``;for(let t of i)e({stream:n,text:t})},flush(){for(let n of[`stdout`,`stderr`]){let r=t[n];r!==``&&(e({stream:n,text:r}),t[n]=``)}}}}function vercelErrorDetail(e){return e?.split(`
2
+ `).map(e=>e.trim()).filter(e=>e.length>0&&!e.startsWith(`Vercel CLI `)).at(-1)}export{createProcessOutputBuffer,vercelErrorDetail};
@@ -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.128`,DEFAULT_ZOD_PACKAGE_VERSION=`4.5.4`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.75.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";
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.76.0`,nodeEngine:`>=24`};function resolveEvePackageContract(e=DEFAULT_EVE_PACKAGE_CONTRACT){return{version:resolveVersionToken(`evePackage.version`,e.version),nodeEngine:resolveVersionToken(`evePackage.nodeEngine`,e.nodeEngine)}}function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e,t){return{[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__",
@@ -1,6 +1,6 @@
1
1
  export declare const WEB_APP_TEMPLATE_FILES: {
2
2
  readonly "app/_components/agent-chat.tsx": '"use client";\n\nimport type { UserContent } from "ai";\nimport { useEveAgent } from "eve/react";\nimport { AlertCircleIcon, BrainIcon, PlusIcon, SquareIcon } from "lucide-react";\nimport { useState } from "react";\nimport {\n Conversation,\n ConversationContent,\n ConversationScrollButton,\n ConversationTopFade,\n} from "@/components/ai-elements/conversation";\nimport { Message, MessageContent } from "@/components/ai-elements/message";\nimport {\n PromptInput,\n PromptInputButton,\n type PromptInputMessage,\n PromptInputSubmit,\n PromptInputTextarea,\n usePromptInputAttachments,\n} from "@/components/ai-elements/prompt-input";\nimport { Shimmer } from "@/components/ai-elements/shimmer";\nimport { Button } from "@/components/ui/button";\nimport { cn } from "@/lib/utils";\nimport { AgentMessage } from "./agent-message";\nimport { WEB_CHAT_AGENT } from "@/app/eve-agent";\n\nconst DEFAULT_AGENT_NAME = "__EVE_INIT_APP_NAME__";\nconst AGENT_NAME = WEB_CHAT_AGENT ?? DEFAULT_AGENT_NAME;\n\nexport function AgentChat({\n sessionId,\n sessionless = false,\n}: {\n readonly sessionId?: string;\n readonly sessionless?: boolean;\n}) {\n const [cancellationError, setCancellationError] = useState<string>();\n const [hasInputText, setHasInputText] = useState(false);\n const agent = useEveAgent({\n agent: WEB_CHAT_AGENT,\n initialSession:\n sessionId === undefined\n ? undefined\n : {\n sessionId,\n streamIndex: 0,\n },\n resume: sessionId !== undefined,\n onSessionChange(session) {\n if (sessionId === undefined && session !== undefined) {\n // Next patches window.history to navigate, which would detach the active stream.\n History.prototype.replaceState.call(\n window.history,\n window.history.state,\n "",\n `/s/${encodeURIComponent(session.sessionId)}`,\n );\n }\n },\n });\n\n const isBusy = agent.status === "submitted" || agent.status === "streaming";\n const isResuming = agent.status === "resuming";\n const isEmpty = agent.data.messages.length === 0;\n const lastMessage = agent.data.messages.at(-1);\n const isPendingAssistantShell =\n lastMessage?.role === "assistant" &&\n lastMessage.parts.every((part) => part.type === "step-start");\n const showPendingThinking =\n isBusy &&\n (agent.status === "submitted" || lastMessage?.role !== "assistant" || isPendingAssistantShell);\n const turnFailure = isBusy || isResuming ? undefined : getLatestTurnFailure(agent.events);\n const errorMessage = cancellationError ?? agent.error?.message ?? turnFailure;\n const hasConversationContent = sessionless || !isEmpty || errorMessage !== undefined;\n const showConversationLayout = isResuming || hasConversationContent;\n const activeSessionId = sessionId ?? agent.session?.sessionId;\n // Answers are accepted while work runs; the server\'s settlement closes each request.\n const canRespond = (requestId: string) =>\n !isResuming && agent.data.inputs[requestId]?.status === "open";\n // A tool call can ask several questions at once, and its message part holds only the latest.\n const questionsFor = (callId: string) =>\n Object.values(agent.data.inputs).filter(\n (input) => input.request.kind === "question" && input.request.action.callId === callId,\n );\n\n const requestCancellation = () => {\n setCancellationError(undefined);\n void agent.cancel().catch((error: unknown) => {\n setCancellationError(toErrorMessage(error));\n });\n };\n\n const handleSubmit = async (message: PromptInputMessage) => {\n const text = message.text.trim();\n if ((text.length === 0 && message.files.length === 0) || isResuming) return;\n\n setHasInputText(false);\n setCancellationError(undefined);\n const options = isBusy ? { turnPolicy: "steer" as const } : undefined;\n\n if (message.files.length === 0) {\n await agent.send(text, options);\n return;\n }\n\n const parts: UserContent = [];\n if (text.length > 0) {\n parts.push({ text, type: "text" });\n }\n for (const file of message.files) {\n parts.push({\n data: file.url,\n filename: file.filename,\n mediaType: file.mediaType,\n type: "file",\n });\n }\n\n await agent.send(parts, options);\n };\n\n const composer = (\n <PromptInput onSubmit={handleSubmit}>\n <PromptInputTextarea\n disabled={isResuming}\n onChange={(event) => setHasInputText(event.currentTarget.value.trim().length > 0)}\n placeholder="Send a message…"\n />\n <ComposerAction\n hasInputText={hasInputText}\n isBusy={isBusy}\n isResuming={isResuming}\n onCancel={requestCancellation}\n />\n </PromptInput>\n );\n\n return (\n <main className="flex h-dvh flex-col overflow-hidden bg-background text-foreground">\n {showConversationLayout ? (\n <ChatHeader canStartNewChat={activeSessionId !== undefined} />\n ) : null}\n\n {showConversationLayout ? (\n <Conversation\n className="min-h-0 flex-1"\n initial={sessionId === undefined ? undefined : false}\n resize={activeSessionId === undefined ? "smooth" : "instant"}\n scrollRestorationKey={\n isEmpty || activeSessionId === undefined\n ? undefined\n : `eve:web-chat-scroll:${activeSessionId}`\n }\n >\n <ConversationTopFade className="top-14" />\n <ConversationContent className="mx-auto w-full max-w-3xl gap-6 px-4 pt-20 pb-36 sm:px-6">\n {agent.data.messages.map((message, index) =>\n showPendingThinking &&\n isPendingAssistantShell &&\n message.id === lastMessage.id ? null : (\n <AgentMessage\n canRespond={canRespond}\n isStreaming={\n agent.status === "streaming" && index === agent.data.messages.length - 1\n }\n key={message.id}\n message={message}\n questionsFor={questionsFor}\n onInputResponses={(inputResponses) => {\n setCancellationError(undefined);\n return agent.respond(inputResponses);\n }}\n />\n ),\n )}\n {showPendingThinking ? <PendingThinking /> : null}\n {errorMessage ? <ErrorMessage message={errorMessage} /> : null}\n </ConversationContent>\n <ConversationScrollButton />\n </Conversation>\n ) : null}\n\n <div\n className={cn(\n "mx-auto w-full px-4 sm:px-6",\n showConversationLayout\n ? "fixed bottom-0 left-1/2 z-20 max-w-3xl -translate-x-1/2 bg-gradient-to-t from-background via-background to-transparent pt-4 pb-6"\n : "flex max-w-xl flex-1 flex-col items-center justify-center gap-8 pb-[10vh]",\n )}\n >\n {showConversationLayout ? null : (\n <div className="flex flex-col items-center gap-3 text-center">\n <h1 className="font-medium text-5xl tracking-tighter">{AGENT_NAME}</h1>\n </div>\n )}\n <div className="w-full">{composer}</div>\n </div>\n </main>\n );\n}\n\nfunction ComposerAction({\n hasInputText,\n isBusy,\n isResuming,\n onCancel,\n}: {\n readonly hasInputText: boolean;\n readonly isBusy: boolean;\n readonly isResuming: boolean;\n readonly onCancel: () => void;\n}) {\n const attachments = usePromptInputAttachments();\n const canSubmit = hasInputText || attachments.files.length > 0;\n\n if (!isBusy || canSubmit) {\n return <PromptInputSubmit disabled={isResuming} />;\n }\n\n return (\n <PromptInputButton\n aria-label="Stop"\n className="absolute right-2.5 bottom-2.5"\n onClick={onCancel}\n variant="outline"\n >\n <SquareIcon className="size-3 fill-current" />\n </PromptInputButton>\n );\n}\n\nfunction ErrorMessage({ message }: { readonly message: string }) {\n return (\n <Message className="max-w-full" from="assistant">\n <MessageContent>\n <div\n className="flex w-full items-start gap-3 rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2.5 text-sm"\n role="alert"\n >\n <AlertCircleIcon className="mt-0.5 size-4 shrink-0 text-destructive" />\n <div>\n <p className="font-medium">Request failed</p>\n <p className="mt-0.5 text-muted-foreground">{message}</p>\n </div>\n </div>\n </MessageContent>\n </Message>\n );\n}\n\nfunction ChatHeader({ canStartNewChat }: { readonly canStartNewChat: boolean }) {\n return (\n <header className="pointer-events-none fixed top-0 right-0 left-0 z-20 h-14">\n <div className="relative mx-auto flex h-full w-full max-w-3xl items-center justify-center bg-background px-24">\n <span className="truncate text-muted-foreground text-sm">{AGENT_NAME}</span>\n {canStartNewChat ? (\n <Button\n aria-label="Start a new chat"\n className="pointer-events-auto fixed top-3 right-6 pr-4"\n onClick={() => window.location.assign("/s")}\n size="sm"\n type="button"\n variant="ghost"\n >\n <PlusIcon className="size-4" />\n <span className="hidden font-normal text-sm sm:inline">New chat</span>\n </Button>\n ) : null}\n </div>\n </header>\n );\n}\n\nfunction PendingThinking() {\n return (\n <Message aria-live="polite" from="assistant">\n <MessageContent>\n <div className="mb-4 flex w-full items-center gap-2 text-muted-foreground text-sm">\n <BrainIcon className="size-4" />\n <Shimmer duration={1}>Thinking</Shimmer>\n </div>\n </MessageContent>\n </Message>\n );\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : "Unable to cancel the response.";\n}\n\nfunction getLatestTurnFailure(\n events: ReturnType<typeof useEveAgent>["events"],\n): string | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n\n if (event.type === "turn.failed") {\n return event.data.code === "MODEL_CALL_FAILED"\n ? "The model is temporarily unavailable. Please try again."\n : event.data.message;\n }\n\n if (event.type === "turn.completed" || event.type === "turn.cancelled") {\n return undefined;\n }\n\n if (event.type === "message.received") {\n return undefined;\n }\n }\n\n return undefined;\n}\n';
3
- readonly "app/_components/agent-message.tsx": '"use client";\n\nimport type {\n ConversationInput,\n EveAuthorizationPart,\n EveDynamicToolPart,\n EveMessage,\n EveMessageInputRequest,\n EveMessagePart,\n} from "eve/react";\nimport type { FormEvent } from "react";\nimport {\n CheckCircleIcon,\n ExternalLinkIcon,\n FileIcon,\n ImageIcon,\n KeyRoundIcon,\n XCircleIcon,\n} from "lucide-react";\nimport { Message, MessageContent, MessageResponse } from "@/components/ai-elements/message";\nimport { Reasoning, ReasoningContent, ReasoningTrigger } from "@/components/ai-elements/reasoning";\nimport {\n BashToolContent,\n Tool,\n ToolContent,\n ToolHeader,\n ToolInput,\n ToolOutput,\n} from "@/components/ai-elements/tool";\nimport { Button } from "@/components/ui/button";\nimport {\n Questionnaire,\n QuestionnaireActions,\n QuestionnaireChoice,\n QuestionnaireChoiceDescription,\n QuestionnaireChoices,\n QuestionnaireError,\n QuestionnaireInput,\n QuestionnaireItem,\n QuestionnaireSubmit,\n QuestionnaireTitle,\n} from "@/components/ui/questionnaire";\nimport { cn } from "@/lib/utils";\n\nexport type AgentInputResponse = {\n readonly optionId?: string;\n readonly requestId: string;\n readonly text?: string;\n};\n\ntype EveFilePart = Extract<EveMessagePart, { type: "file" }>;\n\nexport function AgentMessage({\n canRespond,\n isStreaming,\n message,\n onInputResponses,\n questionsFor,\n}: {\n readonly canRespond: (requestId: string) => boolean;\n readonly isStreaming: boolean;\n readonly message: EveMessage;\n readonly onInputResponses: (responses: readonly AgentInputResponse[]) => void | Promise<void>;\n readonly questionsFor: (callId: string) => readonly ConversationInput[];\n}) {\n const lastTextIndex = message.parts.reduce(\n (last, part, index) => (part.type === "text" ? index : last),\n -1,\n );\n const hasAssistantText =\n message.role === "assistant" &&\n message.parts.some((part) => part.type === "text" && part.text.length > 0);\n\n return (\n <Message\n data-optimistic={message.metadata?.optimistic ? "true" : undefined}\n from={message.role}\n >\n <MessageContent>\n {message.parts.map((part, index) =>\n hasAssistantText && part.type === "reasoning" ? null : (\n <AgentMessagePart\n canRespond={canRespond}\n key={partKey(part, index)}\n onInputResponses={onInputResponses}\n part={part}\n questionsFor={questionsFor}\n showCaret={isStreaming && message.role === "assistant" && index === lastTextIndex}\n />\n ),\n )}\n </MessageContent>\n </Message>\n );\n}\n\nfunction AgentMessagePart({\n canRespond,\n onInputResponses,\n part,\n questionsFor,\n showCaret,\n}: {\n readonly canRespond: (requestId: string) => boolean;\n readonly onInputResponses: (responses: readonly AgentInputResponse[]) => void | Promise<void>;\n readonly part: EveMessagePart;\n readonly questionsFor: (callId: string) => readonly ConversationInput[];\n readonly showCaret: boolean;\n}) {\n switch (part.type) {\n case "step-start":\n return null;\n case "text":\n return (\n <MessageResponse caret="block" isAnimating={showCaret}>\n {part.text}\n </MessageResponse>\n );\n case "reasoning":\n return (\n <Reasoning defaultOpen isStreaming={part.state === "streaming"}>\n <ReasoningTrigger />\n <ReasoningContent>{part.text}</ReasoningContent>\n </Reasoning>\n );\n case "file":\n return <AttachmentPart part={part} />;\n case "authorization":\n return <AuthorizationPrompt part={part} />;\n case "dynamic-tool": {\n const questions = questionsFor(part.toolCallId);\n if (questions.length > 0) {\n return (\n <div className="space-y-4">\n {questions.map(({ request, response }) => (\n <QuestionRequest\n canRespond={canRespond(request.requestId)}\n inputRequest={request}\n inputResponse={response}\n key={request.requestId}\n onInputResponses={onInputResponses}\n />\n ))}\n </div>\n );\n }\n\n return (\n <>\n <Tool>\n <ToolHeader\n state={part.state}\n title={part.toolName}\n toolName={part.toolName}\n type="dynamic-tool"\n />\n <ToolContent>\n {part.toolName === "bash" ? (\n <BashToolContent\n errorText={part.errorText}\n input={part.input}\n output={part.output}\n />\n ) : (\n <>\n <ToolInput input={part.input} />\n <ToolOutput errorText={part.errorText} output={part.output} />\n </>\n )}\n </ToolContent>\n </Tool>\n {/* Kept outside the collapsed card so a pending approval is always visible. */}\n <InputRequestActions\n canRespond={canRespond}\n part={part}\n onInputResponses={onInputResponses}\n />\n </>\n );\n }\n }\n}\n\nfunction QuestionRequest({\n canRespond,\n inputRequest,\n inputResponse,\n onInputResponses,\n}: {\n readonly canRespond: boolean;\n readonly inputRequest: EveMessageInputRequest;\n readonly inputResponse?: AgentInputResponse;\n readonly onInputResponses: (responses: readonly AgentInputResponse[]) => void | Promise<void>;\n}) {\n const options = inputRequest.options ?? [];\n const acceptsFreeform = inputRequest.allowFreeform === true || options.length === 0;\n const disabled = !canRespond || inputResponse !== undefined;\n\n const submitResponse = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const answer = new FormData(event.currentTarget).get(inputRequest.requestId);\n if (typeof answer !== "string") {\n return;\n }\n\n const option = options.find(({ id }) => id === answer);\n void onInputResponses([\n option === undefined\n ? { requestId: inputRequest.requestId, text: answer.trim() }\n : { optionId: option.id, requestId: inputRequest.requestId },\n ]);\n };\n\n return (\n <Questionnaire\n className="gap-4 rounded-xl border bg-card p-4"\n // Validation reads disabled answers as missing, so locking a submitted form in place would\n // flag it invalid. Remounting restores the answer from the response instead.\n key={disabled ? "locked" : "open"}\n onSubmit={submitResponse}\n shortcuts="numbers"\n >\n <QuestionnaireItem name={inputRequest.requestId} required>\n <QuestionnaireTitle className="text-sm font-medium">\n {inputRequest.prompt}\n </QuestionnaireTitle>\n <QuestionnaireChoices>\n {options.map((option) => (\n <QuestionnaireChoice\n className={cn(inputResponse?.optionId === option.id && "data-disabled:opacity-100")}\n defaultChecked={inputResponse?.optionId === option.id}\n disabled={disabled}\n key={option.id}\n value={option.id}\n >\n {option.label}\n {option.description ? (\n <QuestionnaireChoiceDescription>\n {option.description}\n </QuestionnaireChoiceDescription>\n ) : null}\n </QuestionnaireChoice>\n ))}\n {acceptsFreeform ? (\n <QuestionnaireInput\n aria-label="Answer"\n className={cn(inputResponse?.text !== undefined && "disabled:opacity-100")}\n defaultValue={inputResponse?.text}\n disabled={disabled}\n placeholder="Type your answer…"\n />\n ) : null}\n </QuestionnaireChoices>\n <QuestionnaireError />\n </QuestionnaireItem>\n {disabled ? null : (\n <QuestionnaireActions>\n <QuestionnaireSubmit size="sm">Answer</QuestionnaireSubmit>\n </QuestionnaireActions>\n )}\n </Questionnaire>\n );\n}\n\nfunction AttachmentPart({ part }: { readonly part: EveFilePart }) {\n const label = part.filename ?? "Attachment";\n const detail = [part.mediaType, formatBytes(part.size)].filter(Boolean).join(" - ");\n const isImage = part.mediaType.startsWith("image/") && part.url !== undefined;\n const Icon = isImage ? ImageIcon : FileIcon;\n const body = (\n <span className="flex max-w-sm items-center gap-3 rounded-md border bg-background/60 p-2 text-sm">\n {isImage ? (\n <img alt={label} className="size-12 shrink-0 rounded-sm object-cover" src={part.url} />\n ) : (\n <span className="flex size-10 shrink-0 items-center justify-center rounded-sm bg-muted text-muted-foreground">\n <Icon className="size-4" />\n </span>\n )}\n <span className="min-w-0 flex-1">\n <span className="block truncate font-medium">{label}</span>\n {detail ? <span className="block truncate text-muted-foreground">{detail}</span> : null}\n </span>\n {part.url ? <ExternalLinkIcon className="size-4 shrink-0 text-muted-foreground" /> : null}\n </span>\n );\n\n return part.url ? (\n <a href={part.url} rel="noreferrer" target="_blank">\n {body}\n </a>\n ) : (\n body\n );\n}\n\nfunction AuthorizationPrompt({ part }: { readonly part: EveAuthorizationPart }) {\n const isAuthorized = part.state === "completed" && part.outcome === "authorized";\n const isCompleted = part.state === "completed";\n const Icon = isAuthorized ? CheckCircleIcon : isCompleted ? XCircleIcon : KeyRoundIcon;\n const instructions = part.authorization?.instructions;\n const shouldShowInstructions = instructions !== undefined && instructions !== part.description;\n\n return (\n <div\n className={cn(\n "space-y-3 rounded-md border p-3",\n isAuthorized\n ? "border-emerald-500/30 bg-emerald-500/5"\n : isCompleted\n ? "border-destructive/30 bg-destructive/5"\n : "border-blue-500/30 bg-blue-500/5",\n )}\n >\n <div className="flex items-start gap-3">\n <span\n className={cn(\n "mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-full",\n isAuthorized\n ? "bg-emerald-500/10 text-emerald-700 dark:text-emerald-300"\n : isCompleted\n ? "bg-destructive/10 text-destructive"\n : "bg-blue-500/10 text-blue-700 dark:text-blue-300",\n )}\n >\n <Icon className="size-4" />\n </span>\n <div className="min-w-0 flex-1 space-y-2">\n <p className="font-medium text-sm">{authorizationTitle(part)}</p>\n <p className="text-muted-foreground text-sm">{authorizationDescription(part)}</p>\n {shouldShowInstructions ? (\n <p className="text-muted-foreground text-sm">{instructions}</p>\n ) : null}\n {part.state === "required" && part.authorization?.userCode ? (\n <div className="flex flex-wrap items-center gap-2 text-sm">\n <span className="text-muted-foreground">Code</span>\n <code className="rounded-md bg-background px-2 py-1 font-mono">\n {part.authorization.userCode}\n </code>\n </div>\n ) : null}\n {part.state === "required" && part.authorization?.url ? (\n <Button asChild size="sm">\n <a href={part.authorization.url} rel="noreferrer" target="_blank">\n <ExternalLinkIcon className="size-4" />\n Sign in with {part.displayName}\n </a>\n </Button>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n\nfunction authorizationTitle(part: EveAuthorizationPart): string {\n if (part.state === "required") {\n return `Connect ${part.displayName}`;\n }\n if (part.outcome === "authorized") {\n return `${part.displayName} connected`;\n }\n return `${part.displayName} authorization ${formatAuthorizationOutcome(part.outcome)}`;\n}\n\nfunction authorizationDescription(part: EveAuthorizationPart): string {\n if (part.state === "required") {\n return part.description;\n }\n if (part.outcome === "authorized") {\n return `${part.displayName} connected.`;\n }\n const tail = part.reason !== undefined ? ` (${part.reason})` : "";\n return `${part.displayName} authorization ${formatAuthorizationOutcome(part.outcome)}${tail}.`;\n}\n\nfunction formatAuthorizationOutcome(outcome: NonNullable<EveAuthorizationPart["outcome"]>): string {\n switch (outcome) {\n case "authorized":\n return "authorized";\n case "declined":\n return "declined";\n case "failed":\n return "failed";\n case "timed-out":\n return "timed out";\n }\n}\n\nfunction formatBytes(size: number | undefined): string | undefined {\n if (size === undefined) {\n return undefined;\n }\n if (size < 1024) {\n return `${size} B`;\n }\n if (size < 1024 * 1024) {\n return `${(size / 1024).toFixed(1)} KB`;\n }\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction InputRequestActions({\n canRespond,\n onInputResponses,\n part,\n}: {\n readonly canRespond: (requestId: string) => boolean;\n readonly onInputResponses: (responses: readonly AgentInputResponse[]) => void | Promise<void>;\n readonly part: EveDynamicToolPart;\n}) {\n const inputRequest = part.toolMetadata?.eve?.inputRequest;\n if (!inputRequest) {\n return null;\n }\n\n const inputResponse = part.toolMetadata?.eve?.inputResponse;\n const selectedOption = inputRequest.options?.find(\n (option) => option.id === inputResponse?.optionId,\n );\n // An approval can settle before its batch resolves, without an input response.\n const settledApproval =\n part.approval?.approved === undefined\n ? undefined\n : part.approval.approved\n ? "Approved"\n : "Denied";\n\n return (\n <div className="space-y-3 rounded-md border border-yellow-500/30 bg-yellow-500/5 p-3">\n <p className="text-muted-foreground text-sm">{inputRequest.prompt}</p>\n {inputResponse || settledApproval ? (\n <p className="font-medium text-sm">\n Responded:{" "}\n {selectedOption?.label ??\n inputResponse?.text ??\n inputResponse?.optionId ??\n settledApproval}\n </p>\n ) : (\n <div className="flex flex-wrap gap-2">\n {inputRequest.options?.map((option) => (\n <Button\n disabled={!canRespond(inputRequest.requestId)}\n key={option.id}\n onClick={() => {\n void onInputResponses([\n {\n optionId: option.id,\n requestId: inputRequest.requestId,\n },\n ]);\n }}\n size="sm"\n type="button"\n variant={option.style === "danger" ? "destructive" : "default"}\n >\n {option.label}\n </Button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction partKey(part: EveMessagePart, index: number): string {\n switch (part.type) {\n case "authorization":\n return part.attemptId === undefined\n ? `authorization:${part.turnId}:${part.stepIndex}:${part.name}`\n : `authorization:${part.attemptId}`;\n case "dynamic-tool":\n return part.toolCallId;\n case "reasoning":\n case "text":\n return `${part.type}:${part.id ?? index}`;\n default:\n return `${part.type}:${index}`;\n }\n}\n';
3
+ readonly "app/_components/agent-message.tsx": '"use client";\n\nimport type {\n ConversationInput,\n EveAuthorizationPart,\n EveDynamicToolPart,\n EveMessage,\n EveMessageInputRequest,\n EveMessagePart,\n} from "eve/react";\nimport type { FormEvent } from "react";\nimport {\n CheckCircleIcon,\n ExternalLinkIcon,\n FileIcon,\n ImageIcon,\n KeyRoundIcon,\n XCircleIcon,\n} from "lucide-react";\nimport { Message, MessageContent, MessageResponse } from "@/components/ai-elements/message";\nimport { Reasoning, ReasoningContent, ReasoningTrigger } from "@/components/ai-elements/reasoning";\nimport {\n BashToolContent,\n Tool,\n ToolContent,\n ToolHeader,\n ToolInput,\n ToolOutput,\n} from "@/components/ai-elements/tool";\nimport { Button } from "@/components/ui/button";\nimport {\n Questionnaire,\n QuestionnaireActions,\n QuestionnaireChoice,\n QuestionnaireChoiceDescription,\n QuestionnaireChoices,\n QuestionnaireError,\n QuestionnaireInput,\n QuestionnaireItem,\n QuestionnaireSubmit,\n QuestionnaireTitle,\n} from "@/components/ui/questionnaire";\nimport { cn } from "@/lib/utils";\n\nexport type AgentInputResponse = {\n readonly optionId?: string;\n readonly requestId: string;\n readonly text?: string;\n};\n\ntype EveFilePart = Extract<EveMessagePart, { type: "file" }>;\n\nexport function AgentMessage({\n canRespond,\n isStreaming,\n message,\n onInputResponses,\n questionsFor,\n}: {\n readonly canRespond: (requestId: string) => boolean;\n readonly isStreaming: boolean;\n readonly message: EveMessage;\n readonly onInputResponses: (responses: readonly AgentInputResponse[]) => void | Promise<void>;\n readonly questionsFor: (callId: string) => readonly ConversationInput[];\n}) {\n const lastTextIndex = message.parts.reduce(\n (last, part, index) => (part.type === "text" ? index : last),\n -1,\n );\n const hasAssistantText =\n message.role === "assistant" &&\n message.parts.some((part) => part.type === "text" && part.text.length > 0);\n\n return (\n <Message\n data-optimistic={message.metadata?.optimistic ? "true" : undefined}\n from={message.role}\n >\n <MessageContent>\n {message.parts.map((part, index) =>\n hasAssistantText && part.type === "reasoning" ? null : (\n <AgentMessagePart\n canRespond={canRespond}\n key={partKey(part, index)}\n onInputResponses={onInputResponses}\n part={part}\n questionsFor={questionsFor}\n showCaret={isStreaming && message.role === "assistant" && index === lastTextIndex}\n />\n ),\n )}\n </MessageContent>\n </Message>\n );\n}\n\nfunction AgentMessagePart({\n canRespond,\n onInputResponses,\n part,\n questionsFor,\n showCaret,\n}: {\n readonly canRespond: (requestId: string) => boolean;\n readonly onInputResponses: (responses: readonly AgentInputResponse[]) => void | Promise<void>;\n readonly part: EveMessagePart;\n readonly questionsFor: (callId: string) => readonly ConversationInput[];\n readonly showCaret: boolean;\n}) {\n switch (part.type) {\n case "step-start":\n return null;\n case "text":\n return (\n <MessageResponse caret="block" isAnimating={showCaret}>\n {part.text}\n </MessageResponse>\n );\n case "reasoning":\n return (\n <Reasoning defaultOpen isStreaming={part.state === "streaming"}>\n <ReasoningTrigger />\n <ReasoningContent>{part.text}</ReasoningContent>\n </Reasoning>\n );\n case "file":\n return <AttachmentPart part={part} />;\n case "authorization":\n return <AuthorizationPrompt part={part} />;\n case "dynamic-tool": {\n const questions = questionsFor(part.toolCallId);\n if (questions.length > 0) {\n return (\n <div className="space-y-4">\n {questions.map(({ request, response }) => (\n <QuestionRequest\n canRespond={canRespond(request.requestId)}\n inputRequest={request}\n inputResponse={response}\n key={request.requestId}\n onInputResponses={onInputResponses}\n />\n ))}\n </div>\n );\n }\n\n return (\n <>\n <Tool>\n <ToolHeader\n state={part.state}\n title={part.toolMetadata?.eve?.label ?? part.toolName}\n toolName={part.toolName}\n type="dynamic-tool"\n />\n <ToolContent>\n {part.toolName === "bash" ? (\n <BashToolContent\n errorText={part.errorText}\n input={part.input}\n output={part.output}\n />\n ) : (\n <>\n <ToolInput input={part.input} />\n <ToolOutput errorText={part.errorText} output={part.output} />\n </>\n )}\n </ToolContent>\n </Tool>\n {/* Kept outside the collapsed card so a pending approval is always visible. */}\n <InputRequestActions\n canRespond={canRespond}\n part={part}\n onInputResponses={onInputResponses}\n />\n </>\n );\n }\n }\n}\n\nfunction QuestionRequest({\n canRespond,\n inputRequest,\n inputResponse,\n onInputResponses,\n}: {\n readonly canRespond: boolean;\n readonly inputRequest: EveMessageInputRequest;\n readonly inputResponse?: AgentInputResponse;\n readonly onInputResponses: (responses: readonly AgentInputResponse[]) => void | Promise<void>;\n}) {\n const options = inputRequest.options ?? [];\n const acceptsFreeform = inputRequest.allowFreeform === true || options.length === 0;\n const disabled = !canRespond || inputResponse !== undefined;\n\n const submitResponse = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const answer = new FormData(event.currentTarget).get(inputRequest.requestId);\n if (typeof answer !== "string") {\n return;\n }\n\n const option = options.find(({ id }) => id === answer);\n void onInputResponses([\n option === undefined\n ? { requestId: inputRequest.requestId, text: answer.trim() }\n : { optionId: option.id, requestId: inputRequest.requestId },\n ]);\n };\n\n return (\n <Questionnaire\n className="gap-4 rounded-xl border bg-card p-4"\n // Validation reads disabled answers as missing, so locking a submitted form in place would\n // flag it invalid. Remounting restores the answer from the response instead.\n key={disabled ? "locked" : "open"}\n onSubmit={submitResponse}\n shortcuts="numbers"\n >\n <QuestionnaireItem name={inputRequest.requestId} required>\n <QuestionnaireTitle className="text-sm font-medium">\n {inputRequest.prompt}\n </QuestionnaireTitle>\n <QuestionnaireChoices>\n {options.map((option) => (\n <QuestionnaireChoice\n className={cn(inputResponse?.optionId === option.id && "data-disabled:opacity-100")}\n defaultChecked={inputResponse?.optionId === option.id}\n disabled={disabled}\n key={option.id}\n value={option.id}\n >\n {option.label}\n {option.description ? (\n <QuestionnaireChoiceDescription>\n {option.description}\n </QuestionnaireChoiceDescription>\n ) : null}\n </QuestionnaireChoice>\n ))}\n {acceptsFreeform ? (\n <QuestionnaireInput\n aria-label="Answer"\n className={cn(inputResponse?.text !== undefined && "disabled:opacity-100")}\n defaultValue={inputResponse?.text}\n disabled={disabled}\n placeholder="Type your answer…"\n />\n ) : null}\n </QuestionnaireChoices>\n <QuestionnaireError />\n </QuestionnaireItem>\n {disabled ? null : (\n <QuestionnaireActions>\n <QuestionnaireSubmit size="sm">Answer</QuestionnaireSubmit>\n </QuestionnaireActions>\n )}\n </Questionnaire>\n );\n}\n\nfunction AttachmentPart({ part }: { readonly part: EveFilePart }) {\n const label = part.filename ?? "Attachment";\n const detail = [part.mediaType, formatBytes(part.size)].filter(Boolean).join(" - ");\n const isImage = part.mediaType.startsWith("image/") && part.url !== undefined;\n const Icon = isImage ? ImageIcon : FileIcon;\n const body = (\n <span className="flex max-w-sm items-center gap-3 rounded-md border bg-background/60 p-2 text-sm">\n {isImage ? (\n <img alt={label} className="size-12 shrink-0 rounded-sm object-cover" src={part.url} />\n ) : (\n <span className="flex size-10 shrink-0 items-center justify-center rounded-sm bg-muted text-muted-foreground">\n <Icon className="size-4" />\n </span>\n )}\n <span className="min-w-0 flex-1">\n <span className="block truncate font-medium">{label}</span>\n {detail ? <span className="block truncate text-muted-foreground">{detail}</span> : null}\n </span>\n {part.url ? <ExternalLinkIcon className="size-4 shrink-0 text-muted-foreground" /> : null}\n </span>\n );\n\n return part.url ? (\n <a href={part.url} rel="noreferrer" target="_blank">\n {body}\n </a>\n ) : (\n body\n );\n}\n\nfunction AuthorizationPrompt({ part }: { readonly part: EveAuthorizationPart }) {\n const isAuthorized = part.state === "completed" && part.outcome === "authorized";\n const isCompleted = part.state === "completed";\n const Icon = isAuthorized ? CheckCircleIcon : isCompleted ? XCircleIcon : KeyRoundIcon;\n const instructions = part.authorization?.instructions;\n const shouldShowInstructions = instructions !== undefined && instructions !== part.description;\n\n return (\n <div\n className={cn(\n "space-y-3 rounded-md border p-3",\n isAuthorized\n ? "border-emerald-500/30 bg-emerald-500/5"\n : isCompleted\n ? "border-destructive/30 bg-destructive/5"\n : "border-blue-500/30 bg-blue-500/5",\n )}\n >\n <div className="flex items-start gap-3">\n <span\n className={cn(\n "mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-full",\n isAuthorized\n ? "bg-emerald-500/10 text-emerald-700 dark:text-emerald-300"\n : isCompleted\n ? "bg-destructive/10 text-destructive"\n : "bg-blue-500/10 text-blue-700 dark:text-blue-300",\n )}\n >\n <Icon className="size-4" />\n </span>\n <div className="min-w-0 flex-1 space-y-2">\n <p className="font-medium text-sm">{authorizationTitle(part)}</p>\n <p className="text-muted-foreground text-sm">{authorizationDescription(part)}</p>\n {shouldShowInstructions ? (\n <p className="text-muted-foreground text-sm">{instructions}</p>\n ) : null}\n {part.state === "required" && part.authorization?.userCode ? (\n <div className="flex flex-wrap items-center gap-2 text-sm">\n <span className="text-muted-foreground">Code</span>\n <code className="rounded-md bg-background px-2 py-1 font-mono">\n {part.authorization.userCode}\n </code>\n </div>\n ) : null}\n {part.state === "required" && part.authorization?.url ? (\n <Button asChild size="sm">\n <a href={part.authorization.url} rel="noreferrer" target="_blank">\n <ExternalLinkIcon className="size-4" />\n Sign in with {part.displayName}\n </a>\n </Button>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n\nfunction authorizationTitle(part: EveAuthorizationPart): string {\n if (part.state === "required") {\n return `Connect ${part.displayName}`;\n }\n if (part.outcome === "authorized") {\n return `${part.displayName} connected`;\n }\n return `${part.displayName} authorization ${formatAuthorizationOutcome(part.outcome)}`;\n}\n\nfunction authorizationDescription(part: EveAuthorizationPart): string {\n if (part.state === "required") {\n return part.description;\n }\n if (part.outcome === "authorized") {\n return `${part.displayName} connected.`;\n }\n const tail = part.reason !== undefined ? ` (${part.reason})` : "";\n return `${part.displayName} authorization ${formatAuthorizationOutcome(part.outcome)}${tail}.`;\n}\n\nfunction formatAuthorizationOutcome(outcome: NonNullable<EveAuthorizationPart["outcome"]>): string {\n switch (outcome) {\n case "authorized":\n return "authorized";\n case "declined":\n return "declined";\n case "failed":\n return "failed";\n case "timed-out":\n return "timed out";\n }\n}\n\nfunction formatBytes(size: number | undefined): string | undefined {\n if (size === undefined) {\n return undefined;\n }\n if (size < 1024) {\n return `${size} B`;\n }\n if (size < 1024 * 1024) {\n return `${(size / 1024).toFixed(1)} KB`;\n }\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction InputRequestActions({\n canRespond,\n onInputResponses,\n part,\n}: {\n readonly canRespond: (requestId: string) => boolean;\n readonly onInputResponses: (responses: readonly AgentInputResponse[]) => void | Promise<void>;\n readonly part: EveDynamicToolPart;\n}) {\n const inputRequest = part.toolMetadata?.eve?.inputRequest;\n if (!inputRequest) {\n return null;\n }\n\n const inputResponse = part.toolMetadata?.eve?.inputResponse;\n const selectedOption = inputRequest.options?.find(\n (option) => option.id === inputResponse?.optionId,\n );\n // An approval can settle before its batch resolves, without an input response.\n const settledApproval =\n part.approval?.approved === undefined\n ? undefined\n : part.approval.approved\n ? "Approved"\n : "Denied";\n\n return (\n <div className="space-y-3 rounded-md border border-yellow-500/30 bg-yellow-500/5 p-3">\n <p className="text-muted-foreground text-sm">{inputRequest.prompt}</p>\n {inputResponse || settledApproval ? (\n <p className="font-medium text-sm">\n Responded:{" "}\n {selectedOption?.label ??\n inputResponse?.text ??\n inputResponse?.optionId ??\n settledApproval}\n </p>\n ) : (\n <div className="flex flex-wrap gap-2">\n {inputRequest.options?.map((option) => (\n <Button\n disabled={!canRespond(inputRequest.requestId)}\n key={option.id}\n onClick={() => {\n void onInputResponses([\n {\n optionId: option.id,\n requestId: inputRequest.requestId,\n },\n ]);\n }}\n size="sm"\n type="button"\n variant={option.style === "danger" ? "destructive" : "default"}\n >\n {option.label}\n </Button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction partKey(part: EveMessagePart, index: number): string {\n switch (part.type) {\n case "authorization":\n return part.attemptId === undefined\n ? `authorization:${part.turnId}:${part.stepIndex}:${part.name}`\n : `authorization:${part.attemptId}`;\n case "dynamic-tool":\n return part.toolCallId;\n case "reasoning":\n case "text":\n return `${part.type}:${part.id ?? index}`;\n default:\n return `${part.type}:${index}`;\n }\n}\n';
4
4
  readonly "app/apple-icon.tsx": 'import { ImageResponse } from "next/og";\n\nexport const size = {\n width: 180,\n height: 180,\n};\n\nexport const contentType = "image/png";\n\nexport default function AppleIcon() {\n return new ImageResponse(\n <svg fill="none" viewBox="0 0 102 102" xmlns="http://www.w3.org/2000/svg">\n <path d="M0 0h102v102H0z" fill="#000" />\n <path\n d="M49.28 66.94 75.03 34.96h-6.89L47.91 60.11l-5.49 6.83h6.86ZM0 34.96h42.4v5.11H0zm0 13.32h27.66v5.11H0zm0 13.54h27.66v5.11H0zm69.63-26.86H102v5.11H69.63zm4.71 13.32H102v5.11H74.34zm0 13.54H102v5.11H74.34z"\n fill="#fff"\n />\n </svg>,\n size,\n );\n}\n';
5
5
  readonly "app/eve-agent.ts": '/** Named workspace agent selected by the Web Chat installer. */\nexport const WEB_CHAT_AGENT: string | undefined = undefined;\n';
6
6
  readonly "app/globals.css": '@import "tailwindcss";\n@source "../node_modules/streamdown/dist/*.js";\n\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --color-card: var(--card);\n --color-card-foreground: var(--card-foreground);\n --color-popover: var(--popover);\n --color-popover-foreground: var(--popover-foreground);\n --color-primary: var(--primary);\n --color-primary-foreground: var(--primary-foreground);\n --color-secondary: var(--secondary);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-muted: var(--muted);\n --color-muted-foreground: var(--muted-foreground);\n --color-accent: var(--accent);\n --color-accent-foreground: var(--accent-foreground);\n --color-destructive: var(--destructive);\n --color-border: var(--border);\n --color-input: var(--input);\n --color-ring: var(--ring);\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) + 4px);\n --font-sans: "Geist", "Geist Fallback", ui-sans-serif, system-ui, sans-serif;\n --font-mono: "Geist Mono", "Geist Mono Fallback", ui-monospace, monospace;\n}\n\n:root {\n color-scheme: light;\n /* Soft neutral page with white elevated surfaces so cards/composer pop. */\n --background: oklch(0.971 0 0);\n --foreground: oklch(0.16 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.16 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.16 0 0);\n --primary: oklch(0.19 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --secondary: oklch(0.94 0 0);\n --secondary-foreground: oklch(0.19 0 0);\n --muted: oklch(0.94 0 0);\n --muted-foreground: oklch(0.6 0 0);\n --accent: oklch(0.94 0 0);\n --accent-foreground: oklch(0.19 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --border: oklch(0.916 0 0);\n --input: oklch(0.916 0 0);\n --ring: oklch(0.708 0 0);\n --radius: 0.625rem;\n}\n\n@media (prefers-color-scheme: dark) {\n :root {\n color-scheme: dark;\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --card: oklch(0.205 0 0);\n --card-foreground: oklch(0.985 0 0);\n --popover: oklch(0.205 0 0);\n --popover-foreground: oklch(0.985 0 0);\n --primary: oklch(0.922 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --secondary: oklch(0.269 0 0);\n --secondary-foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --accent: oklch(0.269 0 0);\n --accent-foreground: oklch(0.985 0 0);\n --destructive: oklch(0.704 0.191 22.216);\n --border: oklch(1 0 0 / 10%);\n --input: oklch(1 0 0 / 15%);\n --ring: oklch(0.556 0 0);\n }\n}\n\n* {\n border-color: var(--border);\n}\n\nhtml {\n height: 100%;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\nbody {\n min-height: 100%;\n margin: 0;\n background: var(--background);\n font-family: var(--font-sans);\n}\n\nbutton,\ninput,\ntextarea {\n font: inherit;\n}\n';
@@ -464,7 +464,7 @@ function AgentMessagePart({
464
464
  <Tool>
465
465
  <ToolHeader
466
466
  state={part.state}
467
- title={part.toolName}
467
+ title={part.toolMetadata?.eve?.label ?? part.toolName}
468
468
  toolName={part.toolName}
469
469
  type="dynamic-tool"
470
470
  />
@@ -4,3 +4,20 @@
4
4
  export declare function updateSlackChannelConnectorUid(slackChannelPath: string, connectorUid: string): Promise<{
5
5
  patched: boolean;
6
6
  }>;
7
+ /**
8
+ * What an existing `agent/channels/slack.ts` already decides. `connect` names
9
+ * one connector UID literal; `environment` reads the default Slack environment
10
+ * variables; `custom` is hand-written credential wiring eve does not parse.
11
+ */
12
+ export type SlackChannelFileState = {
13
+ kind: "absent";
14
+ } | {
15
+ kind: "connect";
16
+ connectorUid: string;
17
+ } | {
18
+ kind: "environment";
19
+ } | {
20
+ kind: "custom";
21
+ };
22
+ /** Reads the Slack channel definition without changing it. */
23
+ export declare function readSlackChannelFile(slackChannelPath: string): Promise<SlackChannelFileState>;
@@ -1 +1 @@
1
- import{readFile,writeFile}from"node:fs/promises";const CONNECT_SLACK_CREDENTIALS_REGEX=/(connectSlackCredentials\(\s*)(["'`])([^"'`]+)\2/;async function updateSlackChannelConnectorUid(e,t){let n;try{n=await readFile(e,`utf8`)}catch{return{patched:!1}}if(!CONNECT_SLACK_CREDENTIALS_REGEX.test(n))return{patched:!1};let r=n.replace(CONNECT_SLACK_CREDENTIALS_REGEX,(e,n,r)=>`${n}${r}${t}${r}`);return await writeFile(e,r,`utf8`),{patched:!0}}export{updateSlackChannelConnectorUid};
1
+ import{readFile,writeFile}from"node:fs/promises";const CONNECT_SLACK_CREDENTIALS_REGEX=/(connectSlackCredentials\(\s*)(["'`])([^"'`]+)\2/;async function updateSlackChannelConnectorUid(e,t){let n;try{n=await readFile(e,`utf8`)}catch{return{patched:!1}}if(!CONNECT_SLACK_CREDENTIALS_REGEX.test(n))return{patched:!1};let r=n.replace(CONNECT_SLACK_CREDENTIALS_REGEX,(e,n,r)=>`${n}${r}${t}${r}`);return await writeFile(e,r,`utf8`),{patched:!0}}async function readSlackChannelFile(e){let t;try{t=await readFile(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return{kind:`absent`};throw e}let n=CONNECT_SLACK_CREDENTIALS_REGEX.exec(t)?.[3];return n!==void 0&&!n.includes("${")?{kind:`connect`,connectorUid:n}:/\bconnectSlackCredentials\b|\bcredentials\s*:/.test(t)?{kind:`custom`}:{kind:`environment`}}export{readSlackChannelFile,updateSlackChannelConnectorUid};
@@ -1,4 +1,4 @@
1
- import type { ProcessOutputHandler } from "#setup/primitives/process-output.js";
1
+ import { type ProcessOutputHandler } from "#setup/primitives/process-output.js";
2
2
  import type { captureVercel, runVercelCaptureStdout } from "#setup/primitives/run-vercel.js";
3
3
  import { type SlackConnectorRef, type SlackWorkspaceConnection } from "./slack-connect.js";
4
4
  export interface SlackConnectorCreateDeps {
@@ -16,8 +16,16 @@ type SlackConnectorCreateResult = {
16
16
  via: "workspace";
17
17
  ref: SlackConnectorRef;
18
18
  workspace: SlackWorkspaceConnection;
19
- } | {
19
+ }
20
+ /**
21
+ * `detail` is the CLI's own error line, when it printed one. `rejected`
22
+ * proves no connector exists: the CLI reported an error before it printed
23
+ * the browser URL, the only flow that can create a managed connector.
24
+ */
25
+ | {
20
26
  state: "failed";
27
+ detail?: string;
28
+ rejected: boolean;
21
29
  } | {
22
30
  state: "unresolved";
23
31
  };
@@ -1 +1 @@
1
- import{parseCreatedSlackConnector}from"./slack-connect.js";import{CONNECT_LOOKUP_TIMEOUT_MS,fetchSlackConnectorDetails}from"./slack-connect-lifecycle.js";import{performance}from"node:perf_hooks";import{setTimeout}from"node:timers/promises";const CREATED_CONNECTOR_PROGRESS=/\bConnector created:\s*(scl_[A-Za-z0-9]+)\b/,realDelay=(e,t)=>setTimeout(e,void 0,{signal:t}),monotonicNow=()=>performance.now();async function pollCreatedSlackConnector(e,t,n,r,i,a){let o=e.delay??realDelay,s=e.now??monotonicNow,c=s()+CONNECT_LOOKUP_TIMEOUT_MS;for(;;){a.throwIfAborted();let l=c-s();if(l<=0)return;let u=await fetchSlackConnectorDetails({deps:e,projectRoot:t,connectorId:n,orgId:r,onOutput:i,timeoutMs:Math.min(1e4,l),signal:a});if(a.throwIfAborted(),u.state===`found`)return u.details.ref;let d=c-s();if(d<=0)return;await o(Math.min(3e3,d),a)}}async function createSlackConnector(e){let t=new AbortController,n=new AbortController,r=new AbortController,i=e.signal?AbortSignal.any([e.signal,t.signal]):t.signal,a=e.signal?AbortSignal.any([e.signal,n.signal]):n.signal,o=e.signal?AbortSignal.any([e.signal,r.signal]):r.signal,s=!1,reportCreated=t=>{s||(s=!0,e.onCreated(t))},c,l,u=new Promise((e,t)=>{c=e,l=t}),d,f,startWorkspaceLookup=t=>{f===void 0&&(f=e.waitForWorkspace(t,o).catch(t=>{if(!(r.signal.aborted&&e.signal?.aborted!==!0))throw t}),f.then(e=>{e!==void 0&&c({ref:t,workspace:e})},l))},createOutput=t=>{e.onOutput(t);let r=t.text.match(CREATED_CONNECTOR_PROGRESS)?.[1];r!==void 0&&d===void 0&&(d=pollCreatedSlackConnector(e.deps,e.projectRoot,r,e.orgId,e.onOutput,a).catch(t=>{if(!(n.signal.aborted&&e.signal?.aborted!==!0))throw t}),d.then(e=>{e!==void 0&&(reportCreated(e),startWorkspaceLookup(e))},l))},p=e.phase(`Waiting for Slack setup to finish...`,()=>e.deps.runVercelCaptureStdout([`connect`,`create`,`slack`,`--triggers`,`--name`,e.slug,`-F`,`json`],{cwd:e.projectRoot,nonInteractive:!0,onOutput:createOutput,timeoutMs:6e5,signal:i})),m;try{m=await Promise.race([p.then(e=>({via:`cli`,result:e})),u.then(e=>({via:`workspace`,...e}))])}catch(e){throw n.abort(),r.abort(),await Promise.allSettled([d,f].filter(e=>e!==void 0)),e}if(m.via===`workspace`)return t.abort(),await p,e.signal?.throwIfAborted(),{state:`created`,via:`workspace`,ref:m.ref,workspace:m.workspace};if(!m.result.ok)return d!==void 0&&await d,r.abort(),f!==void 0&&await f,e.signal?.throwIfAborted(),{state:`failed`};let h=parseCreatedSlackConnector(m.result.stdout);if(h!==void 0)return reportCreated(h),n.abort(),r.abort(),d!==void 0&&await d,f!==void 0&&await f,e.signal?.throwIfAborted(),{state:`created`,via:`cli`,ref:h};let g=d===void 0?void 0:await d;return r.abort(),f!==void 0&&await f,e.signal?.throwIfAborted(),g===void 0?{state:`unresolved`}:{state:`created`,via:`cli`,ref:g}}export{createSlackConnector};
1
+ import{parseCreatedSlackConnector}from"./slack-connect.js";import{CONNECT_LOOKUP_TIMEOUT_MS,fetchSlackConnectorDetails}from"./slack-connect-lifecycle.js";import{performance}from"node:perf_hooks";import{vercelErrorDetail}from"#setup/primitives/process-output.js";import{setTimeout}from"node:timers/promises";const CREATED_CONNECTOR_PROGRESS=/\bConnector created:\s*(scl_[A-Za-z0-9]+)\b/,BROWSER_FLOW_STARTED=/^(Opening browser for |If the browser doesn't open, visit:)/,realDelay=(e,t)=>setTimeout(e,void 0,{signal:t}),monotonicNow=()=>performance.now();async function pollCreatedSlackConnector(e,t,n,r,i,a){let o=e.delay??realDelay,s=e.now??monotonicNow,c=s()+CONNECT_LOOKUP_TIMEOUT_MS;for(;;){a.throwIfAborted();let l=c-s();if(l<=0)return;let u=await fetchSlackConnectorDetails({deps:e,projectRoot:t,connectorId:n,orgId:r,onOutput:i,timeoutMs:Math.min(1e4,l),signal:a});if(a.throwIfAborted(),u.state===`found`)return u.details.ref;let d=c-s();if(d<=0)return;await o(Math.min(3e3,d),a)}}async function createSlackConnector(e){let t=new AbortController,n=new AbortController,r=new AbortController,i=e.signal?AbortSignal.any([e.signal,t.signal]):t.signal,a=e.signal?AbortSignal.any([e.signal,n.signal]):n.signal,o=e.signal?AbortSignal.any([e.signal,r.signal]):r.signal,s=!1,reportCreated=t=>{s||(s=!0,e.onCreated(t))},c,l,u=new Promise((e,t)=>{c=e,l=t}),d=!1,f,p,startWorkspaceLookup=t=>{p===void 0&&(p=e.waitForWorkspace(t,o).catch(t=>{if(!(r.signal.aborted&&e.signal?.aborted!==!0))throw t}),p.then(e=>{e!==void 0&&c({ref:t,workspace:e})},l))},createOutput=t=>{e.onOutput(t);let r=t.text.match(CREATED_CONNECTOR_PROGRESS)?.[1];(r!==void 0||BROWSER_FLOW_STARTED.test(t.text.trim()))&&(d=!0),r!==void 0&&f===void 0&&(f=pollCreatedSlackConnector(e.deps,e.projectRoot,r,e.orgId,e.onOutput,a).catch(t=>{if(!(n.signal.aborted&&e.signal?.aborted!==!0))throw t}),f.then(e=>{e!==void 0&&(reportCreated(e),startWorkspaceLookup(e))},l))},m=e.phase(`Waiting for Slack setup to finish...`,()=>e.deps.runVercelCaptureStdout([`connect`,`create`,`slack`,`--triggers`,`--name`,e.slug,`-F`,`json`],{cwd:e.projectRoot,nonInteractive:!0,onOutput:createOutput,timeoutMs:6e5,signal:i})),h;try{h=await Promise.race([m.then(e=>({via:`cli`,result:e})),u.then(e=>({via:`workspace`,...e}))])}catch(e){throw n.abort(),r.abort(),await Promise.allSettled([f,p].filter(e=>e!==void 0)),e}if(h.via===`workspace`)return t.abort(),await m,e.signal?.throwIfAborted(),{state:`created`,via:`workspace`,ref:h.ref,workspace:h.workspace};if(!h.result.ok){f!==void 0&&await f,r.abort(),p!==void 0&&await p,e.signal?.throwIfAborted();let t=vercelErrorDetail(h.result.stderr);return t===void 0?{state:`failed`,rejected:!1}:{state:`failed`,detail:t,rejected:!d}}let g=parseCreatedSlackConnector(h.result.stdout);if(g!==void 0)return reportCreated(g),n.abort(),r.abort(),f!==void 0&&await f,p!==void 0&&await p,e.signal?.throwIfAborted(),{state:`created`,via:`cli`,ref:g};let _=f===void 0?void 0:await f;return r.abort(),p!==void 0&&await p,e.signal?.throwIfAborted(),_===void 0?{state:`unresolved`}:{state:`created`,via:`cli`,ref:_}}export{createSlackConnector};