eve 0.63.0 → 0.64.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 (459) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/src/ai/evaluate.js +1 -1
  3. package/dist/src/channel/channel-address.d.ts +4 -1
  4. package/dist/src/channel/channel-address.js +1 -1
  5. package/dist/src/channel/channel-operations.d.ts +4 -1
  6. package/dist/src/channel/cross-channel-receive.d.ts +4 -1
  7. package/dist/src/channel/cross-channel-receive.js +1 -1
  8. package/dist/src/channel/session.d.ts +3 -1
  9. package/dist/src/channel/session.js +1 -1
  10. package/dist/src/channel/types.d.ts +7 -0
  11. package/dist/src/chunks/{use-eve-agent-C5-yqRuq.js → use-eve-agent-BdKlQF32.js} +8 -8
  12. package/dist/src/chunks/{use-eve-agent-CVWk5KKy.js → use-eve-agent-IIuxkn6y.js} +8 -8
  13. package/dist/src/cli/commands/build.js +1 -1
  14. package/dist/src/cli/commands/init-agent-workspace.d.ts +2 -0
  15. package/dist/src/cli/commands/init.js +1 -1
  16. package/dist/src/cli/dev/tui/line-editor.d.ts +11 -1
  17. package/dist/src/cli/dev/tui/line-editor.js +3 -3
  18. package/dist/src/cli/dev/tui/model-picker.d.ts +2 -0
  19. package/dist/src/cli/dev/tui/model-picker.js +1 -1
  20. package/dist/src/cli/dev/tui/setup-panel.js +1 -1
  21. package/dist/src/cli/dev/tui/setup-selection-input.js +1 -1
  22. package/dist/src/cli/dev/tui/stream-format.d.ts +6 -0
  23. package/dist/src/cli/dev/tui/stream-format.js +2 -2
  24. package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
  25. package/dist/src/cli/run.js +1 -1
  26. package/dist/src/client/agent-info-schema.d.ts +8 -14
  27. package/dist/src/client/agent-info-schema.js +1 -1
  28. package/dist/src/client/eve-agent-store.js +1 -1
  29. package/dist/src/client/session.js +1 -1
  30. package/dist/src/client/types.d.ts +4 -2
  31. package/dist/src/compiled/.vendor-stamp.json +11 -11
  32. package/dist/src/compiled/@chat-adapter/slack/_chat-adapter-shared.d.ts +1 -0
  33. package/dist/src/compiled/@chat-adapter/slack/api.d.ts +3 -2
  34. package/dist/src/compiled/@chat-adapter/slack/api.js +1 -1
  35. package/dist/src/compiled/@chat-adapter/slack/blocks.js +1 -1
  36. package/dist/src/compiled/@chat-adapter/slack/format.js +1 -1
  37. package/dist/src/compiled/@chat-adapter/slack/index.d.ts +410 -63
  38. package/dist/src/compiled/@chat-adapter/slack/index.js +47 -25
  39. package/dist/src/compiled/@chat-adapter/twilio/api.d.ts +5 -1
  40. package/dist/src/compiled/@chat-adapter/twilio/api.js +1 -1
  41. package/dist/src/compiled/@chat-adapter/twilio/index.d.ts +37 -3
  42. package/dist/src/compiled/@chat-adapter/twilio/index.js +5 -1
  43. package/dist/src/compiled/@chat-adapter/twilio/webhook.d.ts +2 -2
  44. package/dist/src/compiled/@chat-adapter/twilio/webhook.js +1 -1
  45. package/dist/src/compiled/@linqapp/chat-sdk-adapter/index.js +6 -6
  46. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/index.js +50 -50
  47. package/dist/src/compiled/@vercel/sandbox/index.js +4 -4
  48. package/dist/src/compiled/@workflow/core/attribute-changes.d.ts +2 -1
  49. package/dist/src/compiled/@workflow/core/events-consumer.d.ts +6 -3
  50. package/dist/src/compiled/@workflow/core/index.js +2 -2
  51. package/dist/src/compiled/@workflow/core/private.d.ts +37 -5
  52. package/dist/src/compiled/@workflow/core/private.js +1 -1
  53. package/dist/src/compiled/@workflow/core/runtime/deployment-guard.d.ts +2 -1
  54. package/dist/src/compiled/@workflow/core/runtime/helpers.js +1 -1
  55. package/dist/src/compiled/@workflow/core/runtime/invocations.d.ts +35 -0
  56. package/dist/src/compiled/@workflow/core/runtime/lifecycle-hooks.d.ts +90 -0
  57. package/dist/src/compiled/@workflow/core/runtime/quickjs-runtime.d.ts +2 -1
  58. package/dist/src/compiled/@workflow/core/runtime/resume-hook.d.ts +8 -6
  59. package/dist/src/compiled/@workflow/core/runtime/step-single-flight.d.ts +1 -1
  60. package/dist/src/compiled/@workflow/core/runtime.js +4 -4
  61. package/dist/src/compiled/@workflow/core/serialization.d.ts +5 -1
  62. package/dist/src/compiled/@workflow/core/serialization.js +1 -1
  63. package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
  64. package/dist/src/compiled/@workflow/core/workflow/set-attributes.d.ts +4 -0
  65. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  66. package/dist/src/compiled/@workflow/world/analytics.d.ts +1 -1
  67. package/dist/src/compiled/@workflow/world/attributes-validation.d.ts +5 -0
  68. package/dist/src/compiled/@workflow/world/events.d.ts +2 -2
  69. package/dist/src/compiled/@workflow/world/index.d.ts +2 -1
  70. package/dist/src/compiled/@workflow/world/interfaces.d.ts +12 -1
  71. package/dist/src/compiled/@workflow/world/invocation.d.ts +19 -0
  72. package/dist/src/compiled/@workflow/world/queue.d.ts +24 -3
  73. package/dist/src/compiled/@workflow/world-local/index.js +3 -3
  74. package/dist/src/compiled/@workflow/world-vercel/index.js +16 -16
  75. package/dist/src/compiled/_chunks/node/chunk-6QHBXN7B-gl4n6nmi.js +12 -0
  76. package/dist/src/compiled/_chunks/node/chunk-7WDLOIRP-B_IWkVtZ.js +1 -0
  77. package/dist/src/compiled/_chunks/node/chunk-KBOOTKHF-DJqFk2r1.js +1 -0
  78. package/dist/src/compiled/_chunks/node/chunk-TREVQR3E-CLsTAn-O.js +1 -0
  79. package/dist/src/compiled/_chunks/node/dist-DYDVZ-FS.js +98 -0
  80. package/dist/src/compiled/_chunks/node/dist-iEFkK9qw.js +6 -0
  81. package/dist/src/compiled/_chunks/workflow/attribute-changes-DFx4eluc.js +6 -0
  82. package/dist/src/compiled/_chunks/workflow/{dist-D38gP7YF.js → dist-DjECvUyK.js} +1 -1
  83. package/dist/src/compiled/_chunks/workflow/{frames-QcJfYHmh.js → frames-D_Q-7A1N.js} +2 -2
  84. package/dist/src/compiled/_chunks/workflow/{helpers-6kObVbfS.js → helpers-Bw52uyzw.js} +1 -1
  85. package/dist/src/compiled/_chunks/workflow/{logger-NN5YHpYy.js → logger-DFNCa8Nl.js} +1 -1
  86. package/dist/src/compiled/_chunks/workflow/resume-hook-BhA_nDEV.js +1 -0
  87. package/dist/src/compiled/_chunks/workflow/{run-DJevv8zz.js → run-BT6SQv5f.js} +1 -1
  88. package/dist/src/compiled/_chunks/workflow/{serialization-C5KgPESk.js → serialization-Cl0SYU0I.js} +3 -3
  89. package/dist/src/compiled/_chunks/workflow/sleep-DB4AH9-A.js +1 -0
  90. package/dist/src/compiled/_chunks/workflow/{wait-until-BMY_tOr-.js → wait-until-Dzhr6tzf.js} +1 -1
  91. package/dist/src/compiled/_chunks/workflow/{ws-transport-DSDcKH08.js → ws-transport-BpTMh40s.js} +1 -1
  92. package/dist/src/compiled/chat/index.d.ts +1 -725
  93. package/dist/src/compiled/chat/index.js +1 -1
  94. package/dist/src/compiler/artifacts.d.ts +1 -0
  95. package/dist/src/compiler/artifacts.js +1 -1
  96. package/dist/src/compiler/extension-compatibility.d.ts +23 -15
  97. package/dist/src/compiler/extension-compatibility.js +1 -1
  98. package/dist/src/compiler/manifest.d.ts +14 -18
  99. package/dist/src/compiler/manifest.js +1 -1
  100. package/dist/src/compiler/normalize-helpers.js +1 -1
  101. package/dist/src/compiler/normalize-sandbox.d.ts +2 -7
  102. package/dist/src/compiler/normalize-sandbox.js +1 -1
  103. package/dist/src/compiler/workspace-resources.js +1 -1
  104. package/dist/src/context/build-callback-context.d.ts +2 -0
  105. package/dist/src/context/build-callback-context.js +1 -1
  106. package/dist/src/context/container.d.ts +1 -1
  107. package/dist/src/context/container.js +1 -1
  108. package/dist/src/context/key-names.d.ts +1 -0
  109. package/dist/src/context/key-names.js +1 -1
  110. package/dist/src/context/keys.d.ts +7 -2
  111. package/dist/src/context/keys.js +1 -1
  112. package/dist/src/context/providers/sandbox.js +1 -1
  113. package/dist/src/context/providers/session.d.ts +19 -2
  114. package/dist/src/context/session-context.d.ts +1 -1
  115. package/dist/src/discover/sandbox.js +1 -1
  116. package/dist/src/evals/cli/eval.js +1 -1
  117. package/dist/src/evals/context.d.ts +1 -0
  118. package/dist/src/evals/context.js +1 -1
  119. package/dist/src/evals/define-eval-config.d.ts +7 -7
  120. package/dist/src/evals/define-eval-config.js +1 -1
  121. package/dist/src/evals/define-eval.d.ts +5 -2
  122. package/dist/src/evals/index.d.ts +1 -1
  123. package/dist/src/evals/runner/execute-eval.d.ts +2 -0
  124. package/dist/src/evals/runner/execute-eval.js +1 -1
  125. package/dist/src/evals/runner/execute-task.d.ts +2 -0
  126. package/dist/src/evals/runner/execute-task.js +1 -1
  127. package/dist/src/evals/runner/run-evals.d.ts +2 -0
  128. package/dist/src/evals/runner/run-evals.js +1 -1
  129. package/dist/src/evals/target.js +1 -1
  130. package/dist/src/evals/types.d.ts +22 -6
  131. package/dist/src/eve-channel/create-request.d.ts +2 -1
  132. package/dist/src/eve-channel/delivery-policy-request.d.ts +4 -0
  133. package/dist/src/eve-channel/delivery-policy-request.js +1 -0
  134. package/dist/src/eve-channel/index.js +1 -1
  135. package/dist/src/eve-channel/request.d.ts +2 -1
  136. package/dist/src/eve-channel/request.js +1 -1
  137. package/dist/src/execution/coordination-dispatch-shared.d.ts +2 -1
  138. package/dist/src/execution/coordination-dispatch-shared.js +1 -1
  139. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  140. package/dist/src/execution/runtime-context.js +1 -1
  141. package/dist/src/execution/sandbox/active-handles.d.ts +7 -8
  142. package/dist/src/execution/sandbox/active-handles.js +1 -1
  143. package/dist/src/execution/sandbox/bash.js +1 -1
  144. package/dist/src/execution/sandbox/bindings/docker-cli.d.ts +1 -1
  145. package/dist/src/execution/sandbox/bindings/docker-cli.js +1 -1
  146. package/dist/src/execution/sandbox/bindings/docker-container.d.ts +2 -2
  147. package/dist/src/execution/sandbox/bindings/docker-container.js +1 -1
  148. package/dist/src/execution/sandbox/bindings/docker-network.d.ts +1 -1
  149. package/dist/src/execution/sandbox/bindings/docker-network.js +1 -1
  150. package/dist/src/execution/sandbox/bindings/docker-options.d.ts +4 -5
  151. package/dist/src/execution/sandbox/bindings/docker-options.js +1 -1
  152. package/dist/src/execution/sandbox/bindings/docker-session.d.ts +0 -1
  153. package/dist/src/execution/sandbox/bindings/docker-session.js +2 -2
  154. package/dist/src/execution/sandbox/bindings/docker.d.ts +16 -18
  155. package/dist/src/execution/sandbox/bindings/docker.js +1 -1
  156. package/dist/src/execution/sandbox/bindings/immutable-resources.d.ts +21 -0
  157. package/dist/src/execution/sandbox/bindings/immutable-resources.js +2 -0
  158. package/dist/src/execution/sandbox/bindings/just-bash-runtime.d.ts +9 -5
  159. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
  160. package/dist/src/execution/sandbox/bindings/just-bash.d.ts +13 -26
  161. package/dist/src/execution/sandbox/bindings/just-bash.js +1 -1
  162. package/dist/src/execution/sandbox/bindings/{local-backend-utils.d.ts → local-provider-utils.d.ts} +7 -5
  163. package/dist/src/execution/sandbox/bindings/local-provider-utils.js +1 -0
  164. package/dist/src/execution/sandbox/bindings/local.d.ts +3 -3
  165. package/dist/src/execution/sandbox/bindings/local.js +1 -1
  166. package/dist/src/execution/sandbox/bindings/microsandbox-create.js +1 -1
  167. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.d.ts +30 -8
  168. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -1
  169. package/dist/src/execution/sandbox/bindings/microsandbox-metadata.d.ts +9 -1
  170. package/dist/src/execution/sandbox/bindings/microsandbox-metadata.js +1 -1
  171. package/dist/src/execution/sandbox/bindings/microsandbox-network.js +1 -1
  172. package/dist/src/execution/sandbox/bindings/microsandbox-options.d.ts +10 -4
  173. package/dist/src/execution/sandbox/bindings/microsandbox-options.js +1 -1
  174. package/dist/src/execution/sandbox/bindings/microsandbox-platform.js +1 -1
  175. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.d.ts +7 -5
  176. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -1
  177. package/dist/src/execution/sandbox/bindings/microsandbox-templates.js +1 -1
  178. package/dist/src/execution/sandbox/bindings/microsandbox.d.ts +11 -21
  179. package/dist/src/execution/sandbox/bindings/microsandbox.js +1 -1
  180. package/dist/src/execution/sandbox/bindings/vercel-base-runtime.js +2 -2
  181. package/dist/src/execution/sandbox/bindings/vercel-credentials.js +1 -1
  182. package/dist/src/execution/sandbox/bindings/vercel-errors.js +1 -1
  183. package/dist/src/execution/sandbox/bindings/vercel-lifecycle.d.ts +2 -2
  184. package/dist/src/execution/sandbox/bindings/vercel-lifecycle.js +1 -1
  185. package/dist/src/execution/sandbox/bindings/vercel-lookup.js +1 -1
  186. package/dist/src/execution/sandbox/bindings/vercel-options.d.ts +1 -2
  187. package/dist/src/execution/sandbox/bindings/vercel-options.js +1 -1
  188. package/dist/src/execution/sandbox/bindings/vercel.d.ts +20 -12
  189. package/dist/src/execution/sandbox/bindings/vercel.js +2 -2
  190. package/dist/src/execution/sandbox/development-cleanup.js +1 -1
  191. package/dist/src/execution/sandbox/development-prewarm.d.ts +5 -0
  192. package/dist/src/execution/sandbox/development-prewarm.js +1 -1
  193. package/dist/src/execution/sandbox/development-run.d.ts +2 -3
  194. package/dist/src/execution/sandbox/dockerfile.d.ts +25 -0
  195. package/dist/src/execution/sandbox/dockerfile.js +1 -0
  196. package/dist/src/execution/sandbox/ensure.d.ts +0 -17
  197. package/dist/src/execution/sandbox/ensure.js +1 -1
  198. package/dist/src/execution/sandbox/logging-session.js +1 -1
  199. package/dist/src/execution/sandbox/prewarm.d.ts +23 -27
  200. package/dist/src/execution/sandbox/prewarm.js +1 -2
  201. package/dist/src/execution/sandbox/provider-files.d.ts +2 -0
  202. package/dist/src/execution/sandbox/provider-files.js +1 -0
  203. package/dist/src/execution/sandbox/provider-host-development.d.ts +2 -0
  204. package/dist/src/execution/sandbox/provider-host-development.js +1 -0
  205. package/dist/src/execution/sandbox/provider-host.d.ts +2 -0
  206. package/dist/src/execution/sandbox/provider-host.js +1 -0
  207. package/dist/src/execution/sandbox/provider-identity.d.ts +1 -0
  208. package/dist/src/execution/sandbox/provider-identity.js +1 -0
  209. package/dist/src/execution/sandbox/ripgrep-probe.d.ts +0 -7
  210. package/dist/src/execution/sandbox/ripgrep-probe.js +1 -1
  211. package/dist/src/execution/sandbox/session.d.ts +8 -8
  212. package/dist/src/execution/sandbox/session.js +1 -1
  213. package/dist/src/execution/session/handoff-steps.js +1 -1
  214. package/dist/src/execution/session/handoff.d.ts +1 -1
  215. package/dist/src/execution/session/handoff.js +1 -1
  216. package/dist/src/execution/session/input-queue.d.ts +2 -1
  217. package/dist/src/execution/session/input-queue.js +1 -1
  218. package/dist/src/execution/session/next-input.js +1 -1
  219. package/dist/src/execution/session/program.js +1 -1
  220. package/dist/src/execution/session/turn-step.js +1 -1
  221. package/dist/src/execution/session-inbox/protocol.js +1 -1
  222. package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
  223. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  224. package/dist/src/execution/tools/sleep-workflow.js +1 -1
  225. package/dist/src/execution/tools/subagent/emit-event-step.js +1 -1
  226. package/dist/src/execution/tools/subagent/invoke-preparation.js +1 -1
  227. package/dist/src/execution/tools/subagent/start.d.ts +1 -0
  228. package/dist/src/framework/sources/modules/sandbox.d.ts +2 -1
  229. package/dist/src/framework/sources/modules/sandbox.js +1 -1
  230. package/dist/src/harness/approval-delivery-coordinator.js +1 -1
  231. package/dist/src/harness/hitl/approval-input-requests.d.ts +1 -1
  232. package/dist/src/harness/hitl/approval-input-requests.js +1 -1
  233. package/dist/src/harness/input-requests.d.ts +6 -0
  234. package/dist/src/harness/input-requests.js +1 -1
  235. package/dist/src/harness/messages.d.ts +2 -1
  236. package/dist/src/harness/messages.js +1 -1
  237. package/dist/src/harness/pending-input-batches.d.ts +1 -0
  238. package/dist/src/harness/pending-input-batches.js +1 -1
  239. package/dist/src/harness/tool-loop.js +2 -2
  240. package/dist/src/instrumentation/ai-sdk-warnings.d.ts +6 -0
  241. package/dist/src/instrumentation/ai-sdk-warnings.js +1 -0
  242. package/dist/src/instrumentation/runtime.d.ts +1 -0
  243. package/dist/src/instrumentation/runtime.js +1 -1
  244. package/dist/src/internal/application/compiled-artifacts.d.ts +2 -0
  245. package/dist/src/internal/application/compiled-artifacts.js +2 -2
  246. package/dist/src/internal/application/package.js +1 -1
  247. package/dist/src/internal/nitro/host/artifacts-config.d.ts +6 -1
  248. package/dist/src/internal/nitro/host/artifacts-config.js +1 -1
  249. package/dist/src/internal/nitro/host/build-application.js +1 -1
  250. package/dist/src/internal/nitro/host/compiled-sandbox-provider-prune-plugin.d.ts +16 -0
  251. package/dist/src/internal/nitro/host/compiled-sandbox-provider-prune-plugin.js +5 -0
  252. package/dist/src/internal/nitro/host/configure-nitro-routes.js +2 -2
  253. package/dist/src/internal/nitro/host/create-application-nitro.d.ts +3 -3
  254. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  255. package/dist/src/internal/nitro/host/dev-authored-rebuild-coordinator.js +1 -1
  256. package/dist/src/internal/nitro/host/dev-host-fingerprint.js +1 -1
  257. package/dist/src/internal/nitro/host/prepare-application-host.d.ts +1 -0
  258. package/dist/src/internal/nitro/host/prepare-application-host.js +1 -1
  259. package/dist/src/internal/nitro/host/sandbox-shutdown-plugin.js +1 -1
  260. package/dist/src/internal/nitro/host/start-development-server.js +2 -2
  261. package/dist/src/internal/nitro/host/start-production-server.js +2 -2
  262. package/dist/src/internal/nitro/host/types.d.ts +1 -1
  263. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
  264. package/dist/src/internal/nitro/routes/runtime-artifacts.d.ts +1 -0
  265. package/dist/src/internal/nitro/routes/runtime-artifacts.js +1 -1
  266. package/dist/src/internal/runtime-registry.d.ts +2 -2
  267. package/dist/src/internal/vercel/build-agent-workspace.d.ts +3 -1
  268. package/dist/src/internal/vercel/build-agent-workspace.js +1 -1
  269. package/dist/src/public/channels/chat-sdk/chatSdkChannel.d.ts +4 -5
  270. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +2 -2
  271. package/dist/src/public/channels/github/checkout.js +1 -1
  272. package/dist/src/public/channels/index.d.ts +1 -1
  273. package/dist/src/public/channels/slack/slackChannel.d.ts +3 -1
  274. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  275. package/dist/src/public/definitions/channel.d.ts +1 -1
  276. package/dist/src/public/definitions/sandbox.d.ts +5 -43
  277. package/dist/src/public/definitions/sandbox.js +1 -1
  278. package/dist/src/public/local-dev.d.ts +4 -5
  279. package/dist/src/public/sandbox/docker-sandbox.d.ts +16 -40
  280. package/dist/src/public/sandbox/docker.d.ts +2 -2
  281. package/dist/src/public/sandbox/docker.js +1 -1
  282. package/dist/src/public/sandbox/index.d.ts +4 -9
  283. package/dist/src/public/sandbox/index.js +1 -1
  284. package/dist/src/public/sandbox/just-bash-sandbox.d.ts +11 -6
  285. package/dist/src/public/sandbox/just-bash.d.ts +2 -2
  286. package/dist/src/public/sandbox/just-bash.js +1 -1
  287. package/dist/src/public/sandbox/microsandbox-sandbox.d.ts +11 -17
  288. package/dist/src/public/sandbox/microsandbox.d.ts +2 -2
  289. package/dist/src/public/sandbox/microsandbox.js +1 -1
  290. package/dist/src/public/sandbox/provider.d.ts +1 -0
  291. package/dist/src/public/sandbox/provider.js +1 -0
  292. package/dist/src/public/sandbox/vercel-sandbox.d.ts +10 -41
  293. package/dist/src/public/sandbox/vercel.d.ts +2 -2
  294. package/dist/src/public/sandbox/vercel.js +1 -1
  295. package/dist/src/runtime/cache-key.js +1 -1
  296. package/dist/src/runtime/compiled-artifacts-source.d.ts +6 -1
  297. package/dist/src/runtime/compiled-artifacts-source.js +1 -1
  298. package/dist/src/runtime/loaders/artifact-paths.d.ts +1 -0
  299. package/dist/src/runtime/loaders/artifact-paths.js +1 -1
  300. package/dist/src/runtime/loaders/bundled-artifacts.d.ts +3 -0
  301. package/dist/src/runtime/loaders/bundled-artifacts.js +1 -1
  302. package/dist/src/runtime/loaders/compile-metadata.js +1 -1
  303. package/dist/src/runtime/loaders/manifest.js +1 -1
  304. package/dist/src/runtime/loaders/module-map.js +1 -1
  305. package/dist/src/runtime/local-dev-capability.d.ts +14 -12
  306. package/dist/src/runtime/local-dev-capability.js +1 -1
  307. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  308. package/dist/src/runtime/resolve-sandbox.d.ts +1 -10
  309. package/dist/src/runtime/resolve-sandbox.js +1 -1
  310. package/dist/src/runtime/sandbox/prepared-artifacts.d.ts +13 -0
  311. package/dist/src/runtime/sandbox/prepared-artifacts.js +1 -0
  312. package/dist/src/runtime/sandbox/registry.d.ts +2 -9
  313. package/dist/src/runtime/sandbox/registry.js +1 -1
  314. package/dist/src/runtime/sessions/runtime-session.js +1 -1
  315. package/dist/src/runtime/types.d.ts +13 -26
  316. package/dist/src/runtime/workspace/types.d.ts +1 -1
  317. package/dist/src/sandbox/providers/default.d.ts +27 -0
  318. package/dist/src/sandbox/providers/default.js +1 -0
  319. package/dist/src/sandbox/providers/docker.d.ts +11 -0
  320. package/dist/src/sandbox/providers/docker.js +1 -0
  321. package/dist/src/sandbox/providers/just-bash.d.ts +4 -0
  322. package/dist/src/sandbox/providers/just-bash.js +1 -0
  323. package/dist/src/sandbox/providers/microsandbox.d.ts +12 -0
  324. package/dist/src/sandbox/providers/microsandbox.js +1 -0
  325. package/dist/src/sandbox/providers/vercel.d.ts +12 -0
  326. package/dist/src/sandbox/providers/vercel.js +1 -0
  327. package/dist/src/sandbox/providers.d.ts +5 -0
  328. package/dist/src/sandbox/providers.js +1 -0
  329. package/dist/src/sandbox/state.d.ts +6 -25
  330. package/dist/src/self-modification/extension/subagents/agent/agent.d.ts +1 -1
  331. package/dist/src/self-modification/extension/subagents/agent/agent.js +1 -1
  332. package/dist/src/self-modification/extension/subagents/agent/sandbox.d.ts +2 -25
  333. package/dist/src/self-modification/extension/subagents/agent/sandbox.js +1 -1
  334. package/dist/src/self-modification/extension/subagents/agent/tools/publish.js +1 -1
  335. package/dist/src/self-modification/extension/subagents/agent/tools/registry_add.js +1 -1
  336. package/dist/src/self-modification/filesystem.d.ts +3 -1
  337. package/dist/src/self-modification/filesystem.js +1 -1
  338. package/dist/src/self-modification/git-workspace.d.ts +1 -1
  339. package/dist/src/self-modification/git.d.ts +1 -1
  340. package/dist/src/self-modification/sandbox.d.ts +14 -9
  341. package/dist/src/self-modification/sandbox.js +1 -1
  342. package/dist/src/setup/boxes/select-model.js +1 -1
  343. package/dist/src/setup/cli/select-state.d.ts +4 -2
  344. package/dist/src/setup/cli/select-state.js +1 -1
  345. package/dist/src/setup/flows/model-login.js +1 -1
  346. package/dist/src/setup/primitives/pm/pnpm.js +3 -2
  347. package/dist/src/setup/scaffold/create/project.js +1 -1
  348. package/dist/src/shared/default-agent-model.d.ts +1 -1
  349. package/dist/src/shared/default-agent-model.js +1 -1
  350. package/dist/src/shared/sandbox-environment.d.ts +45 -0
  351. package/dist/src/shared/sandbox-environment.js +1 -0
  352. package/dist/src/shared/sandbox-network-policy.d.ts +8 -3
  353. package/dist/src/shared/sandbox-network-policy.js +1 -1
  354. package/dist/src/shared/sandbox-prepared-artifacts.d.ts +16 -0
  355. package/dist/src/shared/sandbox-prepared-artifacts.js +1 -0
  356. package/dist/src/shared/sandbox-provider.d.ts +110 -0
  357. package/dist/src/shared/sandbox-provider.js +1 -0
  358. package/dist/src/shared/sandbox-session.d.ts +18 -41
  359. package/dist/src/shared/sandbox-template-error.d.ts +9 -0
  360. package/dist/src/shared/sandbox-template-error.js +1 -0
  361. package/dist/src/subagents/tool.d.ts +1 -1
  362. package/dist/src/subagents/tool.js +1 -1
  363. package/dist/src/svelte/index.js +1 -1
  364. package/dist/src/svelte/use-eve-agent.js +1 -1
  365. package/dist/src/tasks/delivery-context.d.ts +6 -4
  366. package/dist/src/tasks/delivery-context.js +1 -1
  367. package/dist/src/tasks/delivery-policy.d.ts +2 -0
  368. package/dist/src/tasks/delivery-policy.js +1 -1
  369. package/dist/src/tools/framework/agent-contract.js +1 -1
  370. package/dist/src/vue/index.js +1 -1
  371. package/dist/src/vue/use-eve-agent.js +1 -1
  372. package/docs/README.md +40 -45
  373. package/docs/agent-config.md +2 -2
  374. package/docs/channels/eve.mdx +1 -1
  375. package/docs/channels/overview.mdx +48 -0
  376. package/docs/concepts/execution-model-and-durability.mdx +1 -1
  377. package/docs/concepts/sessions-runs-and-streaming.md +3 -3
  378. package/docs/dynamic-configuration/meta.json +5 -0
  379. package/docs/evals/overview.mdx +43 -0
  380. package/docs/getting-started.mdx +1 -1
  381. package/docs/guides/client/overview.mdx +1 -1
  382. package/docs/guides/deployment/overview.md +1 -1
  383. package/docs/guides/deployment/self-hosting.md +5 -5
  384. package/docs/guides/deployment/vercel.mdx +10 -12
  385. package/docs/guides/dev-tui.md +1 -1
  386. package/docs/guides/hooks.md +4 -0
  387. package/docs/memory/meta.json +1 -1
  388. package/docs/memory/overview.mdx +4 -0
  389. package/docs/meta.json +13 -16
  390. package/docs/patterns/meta.json +2 -2
  391. package/docs/protocols/acp.md +1 -1
  392. package/docs/protocols/ucp.mdx +1 -1
  393. package/docs/reference/cli.md +10 -9
  394. package/docs/reference/meta.json +4 -1
  395. package/docs/reference/typescript-api.md +1 -24
  396. package/docs/sandbox/default.mdx +17 -0
  397. package/docs/sandbox/docker.mdx +29 -0
  398. package/docs/sandbox/index.mdx +216 -0
  399. package/docs/sandbox/just-bash.mdx +18 -0
  400. package/docs/sandbox/meta.json +5 -0
  401. package/docs/sandbox/microsandbox.mdx +31 -0
  402. package/docs/sandbox/vercel.mdx +106 -0
  403. package/docs/schedules.mdx +35 -1
  404. package/docs/subagents/index.mdx +31 -13
  405. package/docs/subagents/meta.json +1 -1
  406. package/docs/tools/overview.mdx +14 -6
  407. package/docs/tutorial/run-analysis.mdx +6 -5
  408. package/package.json +20 -11
  409. package/dist/src/compiled/_chunks/node/chunk-5OX2R7AJ-CxVV-owP.js +0 -1
  410. package/dist/src/compiled/_chunks/node/chunk-AYN7QRWH-B__hKQV7.js +0 -1
  411. package/dist/src/compiled/_chunks/node/chunk-QZV7YRVM-Dzw4WEBv.js +0 -1
  412. package/dist/src/compiled/_chunks/node/dist-CweJdVFE.js +0 -6
  413. package/dist/src/compiled/_chunks/node/dist-Da54NuK8.js +0 -96
  414. package/dist/src/compiled/_chunks/workflow/attribute-changes-A6HfMNG3.js +0 -6
  415. package/dist/src/compiled/_chunks/workflow/resume-hook-CAqlhwic.js +0 -1
  416. package/dist/src/compiled/_chunks/workflow/sleep-CbUwdv6O.js +0 -1
  417. package/dist/src/compiled/chat/_mdast.d.ts +0 -24
  418. package/dist/src/compiled/chat/_workflow-serde.d.ts +0 -3
  419. package/dist/src/compiled/chat/jsx-runtime-_JEEAotp.d.ts +0 -907
  420. package/dist/src/execution/sandbox/bindings/local-backend-utils.js +0 -1
  421. package/dist/src/execution/sandbox/lazy-backend.d.ts +0 -15
  422. package/dist/src/execution/sandbox/lazy-backend.js +0 -1
  423. package/dist/src/execution/sandbox/template-prewarm-lock.d.ts +0 -8
  424. package/dist/src/execution/sandbox/template-prewarm-lock.js +0 -1
  425. package/dist/src/internal/authored-definition/sandbox.d.ts +0 -17
  426. package/dist/src/internal/authored-definition/sandbox.js +0 -1
  427. package/dist/src/internal/nitro/host/compiled-sandbox-backend-prune-plugin.d.ts +0 -16
  428. package/dist/src/internal/nitro/host/compiled-sandbox-backend-prune-plugin.js +0 -2
  429. package/dist/src/public/definitions/sandbox-backend.d.ts +0 -17
  430. package/dist/src/public/definitions/sandbox-backend.js +0 -1
  431. package/dist/src/public/sandbox/backends/default.d.ts +0 -1
  432. package/dist/src/public/sandbox/backends/default.js +0 -1
  433. package/dist/src/public/sandbox/backends/docker.d.ts +0 -1
  434. package/dist/src/public/sandbox/backends/docker.js +0 -1
  435. package/dist/src/public/sandbox/backends/just-bash.d.ts +0 -1
  436. package/dist/src/public/sandbox/backends/just-bash.js +0 -1
  437. package/dist/src/public/sandbox/backends/microsandbox.d.ts +0 -1
  438. package/dist/src/public/sandbox/backends/microsandbox.js +0 -1
  439. package/dist/src/public/sandbox/backends/vercel.d.ts +0 -1
  440. package/dist/src/public/sandbox/backends/vercel.js +0 -1
  441. package/dist/src/runtime/sandbox/keys.d.ts +0 -42
  442. package/dist/src/runtime/sandbox/keys.js +0 -1
  443. package/dist/src/runtime/sandbox/template-plan.d.ts +0 -24
  444. package/dist/src/runtime/sandbox/template-plan.js +0 -1
  445. package/dist/src/sandbox/backends/default.d.ts +0 -42
  446. package/dist/src/sandbox/backends/default.js +0 -1
  447. package/dist/src/sandbox/backends/docker.d.ts +0 -14
  448. package/dist/src/sandbox/backends/docker.js +0 -1
  449. package/dist/src/sandbox/backends/just-bash.d.ts +0 -17
  450. package/dist/src/sandbox/backends/just-bash.js +0 -1
  451. package/dist/src/sandbox/backends/microsandbox.d.ts +0 -17
  452. package/dist/src/sandbox/backends/microsandbox.js +0 -1
  453. package/dist/src/sandbox/backends/vercel.d.ts +0 -30
  454. package/dist/src/sandbox/backends/vercel.js +0 -1
  455. package/dist/src/shared/sandbox-backend.d.ts +0 -176
  456. package/dist/src/shared/sandbox-backend.js +0 -1
  457. package/dist/src/shared/sandbox-definition.d.ts +0 -112
  458. package/dist/src/shared/sandbox-definition.js +0 -1
  459. package/docs/sandbox.mdx +0 -342
@@ -1,7 +1,7 @@
1
1
  import type { UserContent } from "ai";
2
2
  import type { ChannelAddressDeliveryOptions } from "#channel/channel-address.js";
3
3
  import type { SendPayload } from "#channel/routes.js";
4
- import type { SessionAuthContext, TurnPolicy } from "#channel/types.js";
4
+ import type { SessionAuthContext, TurnPolicy, TaskDeliveryPolicy } from "#channel/types.js";
5
5
  import type { ActionEvent, Adapter, ChatConfig, SerializedThread, Thread, WebhookOptions } from "#compiled/chat/index.js";
6
6
  import { Chat } from "#compiled/chat/index.js";
7
7
  import { type Channel, type ChannelEvents, type ChannelContinuationOps, type Session } from "#public/definitions/channel.js";
@@ -67,14 +67,13 @@ export interface ChatSdkEventContext<TAdapters extends ChatSdkAdapters = ChatSdk
67
67
  * replaces the built-in default for that event.
68
68
  */
69
69
  export type ChatSdkChannelEvents<TAdapters extends ChatSdkAdapters = ChatSdkAdapters> = ChannelEvents<ChatSdkChannelContext<TAdapters>>;
70
- /**
71
- * Options for `bridge.send(...)` inside Chat SDK handlers. The `thread`
72
- * determines the eve continuation token and the persisted channel state.
73
- */
70
+ /** The thread determines the eve continuation token and persisted channel state. */
74
71
  export interface ChatSdkSendOptions {
75
72
  readonly auth?: SessionAuthContext | null;
76
73
  readonly callback?: ChannelAddressDeliveryOptions<ChatSdkChannelState>["callback"];
77
74
  readonly mode?: ChannelAddressDeliveryOptions<ChatSdkChannelState>["mode"];
75
+ /** Updates the session policy; omission preserves it. */
76
+ readonly taskDeliveryPolicy?: TaskDeliveryPolicy;
78
77
  readonly thread: SerializedThread | Thread | string;
79
78
  readonly title?: string;
80
79
  /**
@@ -1,3 +1,3 @@
1
- import{createLogger,extractErrorId,formatErrorHint}from"#internal/logging.js";import{normalizeSendInput}from"#channel/send-input.js";import{INTERNAL_CHANNEL_DELIVER}from"#channel/channel-operations.js";import{ContextContainer,contextStorage}from"#context/container.js";import{GET,POST,defineChannel}from"#public/definitions/channel.js";import{ContextKey}from"#context/key.js";import{isNotImplemented}from"#public/channels/chat-sdk/notImplemented.js";import{Actions,Button,Card,CardText,Chat,Message,ThreadImpl}from"#compiled/chat/index.js";import{defaultAuthorizationEvents}from"#public/channels/chat-sdk/authorization.js";import{chatSdkInstrumentation}from"#public/channels/chat-sdk/audience.js";const log=createLogger(`chat-sdk.channel`),streamTextByState=new WeakMap,ActiveWebhookKey=new ContextKey(`chat-sdk.active-webhook`);function chatSdkChannel(e){let t=new Chat(e),n=e.inputActionPrefix??`eve_input:`,r=e.streaming??!0,i=e.streamingEditIntervalMs??1e3,a={...defaultEvents(n),...e.events};return t.onAction(async r=>{let i=decodeInputAction(r.actionId,n,r.value);if(i){if(!r.thread)throw Error(`chatSdkChannel input actions require a thread on the Chat SDK action event.`);await bridgeSend(t,{inputResponses:[i]},{auth:e.resolveInputAuth?await e.resolveInputAuth(r):null,thread:r.thread})}}),{bot:t,channel:defineChannel({kindHint:`chat-sdk`,turnPolicy:e.turnPolicy,state:initialState(),...chatSdkInstrumentation,context(e){return{bot:t,state:e,streaming:r,streamingEditIntervalMs:i,thread:threadFromState(t,e)}},routes:adapterNames(e.adapters).flatMap(n=>{let r=routeForAdapter(n,e),handler=async(r,i)=>{let a=t.webhooks[n],o=new ContextContainer;return o.setVirtualContext(ActiveWebhookKey,{from:i.from}),contextStorage.run(o,()=>a(r,{...e.webhook,waitUntil(e){i.waitUntil(e)}}))};return[GET(r,handler),POST(r,handler)]}),async receive(e,{from:n}){let r=serializeReceiveTarget(t,e.target);return n(r.id).send(e.message,{auth:e.auth,state:{thread:r}})},events:a}),send(e,n){return bridgeSend(t,e,n)}}}function defaultEvents(e){return{...defaultAuthorizationEvents(),async"turn.started"(e,t,n){t.state.pendingToolCallMessage=null,clearStream(t.state),await safeStartTyping(t.thread,`Working...`)},async"actions.requested"(e,t,n){let r=t.state.pendingToolCallMessage;if(t.state.pendingToolCallMessage=null,r){await safeStartTyping(t.thread,truncate(r));return}let i=e.actions.map(e=>e.kind===`tool-call`?e.toolName:e.kind);await safeStartTyping(t.thread,truncate(`Running ${i.join(`, `)}...`))},async"message.appended"(e,t,n){if(!t.thread||!canStream(t))return;let r=((t.state.streamStepIndex===e.stepIndex?streamTextByState.get(t.state):void 0)??``)+e.messageDelta;if(!r)return;streamTextByState.set(t.state,r);let i=t.state.anchorMessageId;if(!i||t.state.streamStepIndex!==e.stepIndex){let n=await t.thread.post({markdown:r});t.state.anchorMessageId=n.id,t.state.streamStepIndex=e.stepIndex,t.state.lastEditAtMs=Date.now();return}let a=t.state.lastEditAtMs??0;if(!(Date.now()-a<t.streamingEditIntervalMs))try{await editMessage(t.thread,i,r),t.state.lastEditAtMs=Date.now()}catch(e){if(!isNotImplemented(e))throw e;t.state.editSupported=!1,clearStream(t.state)}},async"input.requested"(t,n,r){n.thread&&t.requests.length!==0&&await n.thread.post(renderInputRequests(t.requests,e))},async"message.completed"(e,t,n){if(e.finishReason===`tool-calls`){t.state.pendingToolCallMessage=e.message?firstNonEmptyLine(e.message)??null:null,e.message?await finalizeStreamedMessage(t,e.message,!1):clearStream(t.state);return}if(t.state.pendingToolCallMessage=null,!e.message){clearStream(t.state);return}await finalizeStreamedMessage(t,e.message,!0)},async"turn.failed"(e,t,n){await postFailure(t.thread,`I hit an error while handling your request`,e)},async"session.failed"(e,t){await postFailure(t.thread,`This session could not recover from an error`,e)}}}async function safeStartTyping(e,t){if(e)try{await e.startTyping(t)}catch(e){if(!isNotImplemented(e))throw e}}async function editMessage(e,t,n){await e.adapter.editMessage(e.id,t,{markdown:n})}async function finalizeStreamedMessage(e,t,n){let r=e.thread;if(!r){clearStream(e.state);return}let i=e.state.anchorMessageId;if(canStream(e)&&i)try{await editMessage(r,i,t)}catch(i){if(!isNotImplemented(i))throw i;e.state.editSupported=!1,n&&await r.post({markdown:t})}else n&&await r.post({markdown:t});clearStream(e.state)}function canStream(e){return e.streaming&&e.state.editSupported!==!1}function clearStream(e){e.anchorMessageId=null,e.lastEditAtMs=null,e.streamStepIndex=null,streamTextByState.delete(e)}function firstNonEmptyLine(e){for(let t of e.split(/\r?\n/u)){let e=t.trim();if(e.length>0)return e}}function truncate(e,t=80){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}function renderInputRequests(e,t){return Card({children:e.flatMap(e=>renderInputRequest(e,t))})}function renderInputRequest(e,t){let n=[CardText(e.prompt)];return e.options&&e.options.length>0?(n.push(Actions(e.options.map(n=>Button({id:encodeInputAction(t,e.requestId,n.id),label:n.label,style:n.style,value:n.id})))),n):(n.push(CardText(`This request needs a freeform answer. Continue from the eve session UI.`)),n)}async function postFailure(e,t,n){if(!e)return;let r=formatErrorHint(n),i=extractErrorId(n.details);await e.post([`${t}${r}.`,`Please try again, rephrase, or reach out if it keeps failing.`,...i?[`Error id: ${i}`]:[]].join(`
1
+ import{createLogger,extractErrorId,formatErrorHint}from"#internal/logging.js";import{normalizeSendInput}from"#channel/send-input.js";import{INTERNAL_CHANNEL_DELIVER}from"#channel/channel-operations.js";import{ContextContainer,contextStorage}from"#context/container.js";import{GET,POST,defineChannel}from"#public/definitions/channel.js";import{ContextKey}from"#context/key.js";import{isNotImplemented}from"#public/channels/chat-sdk/notImplemented.js";import{Actions,Button,Card,CardText,Chat,Message,ThreadImpl}from"#compiled/chat/index.js";import{defaultAuthorizationEvents}from"#public/channels/chat-sdk/authorization.js";import{chatSdkInstrumentation}from"#public/channels/chat-sdk/audience.js";const log=createLogger(`chat-sdk.channel`),streamTextByState=new WeakMap,ActiveWebhookKey=new ContextKey(`chat-sdk.active-webhook`);function chatSdkChannel(e){let t=new Chat(e),n=e.inputActionPrefix??`eve_input:`,r=e.streaming??!0,i=e.streamingEditIntervalMs??1e3,a={...defaultEvents(n),...e.events};return t.onAction(async r=>{let i=decodeInputAction(r.actionId,n,r.value);if(i){if(!r.thread)throw Error(`chatSdkChannel input actions require a thread on the Chat SDK action event.`);await bridgeSend(t,{inputResponses:[i]},{auth:e.resolveInputAuth?await e.resolveInputAuth(r):null,thread:r.thread.toJSON()})}}),{bot:t,channel:defineChannel({kindHint:`chat-sdk`,turnPolicy:e.turnPolicy,state:initialState(),...chatSdkInstrumentation,context(e){return{bot:t,state:e,streaming:r,streamingEditIntervalMs:i,thread:threadFromState(t,e)}},routes:adapterNames(e.adapters).flatMap(n=>{let r=routeForAdapter(n,e),handler=async(r,i)=>{let a=t.webhooks[n],o=new ContextContainer;return o.setVirtualContext(ActiveWebhookKey,{from:i.from}),contextStorage.run(o,()=>a(r,{...e.webhook,waitUntil(e){i.waitUntil(e)}}))};return[GET(r,handler),POST(r,handler)]}),async receive(e,{from:n}){let r=serializeReceiveTarget(t,e.target);return n(r.id).send(e.message,{auth:e.auth,state:{thread:r}})},events:a}),send(e,n){return bridgeSend(t,e,n)}}}function defaultEvents(e){return{...defaultAuthorizationEvents(),async"turn.started"(e,t,n){t.state.pendingToolCallMessage=null,clearStream(t.state),await safeStartTyping(t.thread,`Working...`)},async"actions.requested"(e,t,n){let r=t.state.pendingToolCallMessage;if(t.state.pendingToolCallMessage=null,r){await safeStartTyping(t.thread,truncate(r));return}let i=e.actions.map(e=>e.kind===`tool-call`?e.toolName:e.kind);await safeStartTyping(t.thread,truncate(`Running ${i.join(`, `)}...`))},async"message.appended"(e,t,n){if(!t.thread||!canStream(t))return;let r=((t.state.streamStepIndex===e.stepIndex?streamTextByState.get(t.state):void 0)??``)+e.messageDelta;if(!r)return;streamTextByState.set(t.state,r);let i=t.state.anchorMessageId;if(!i||t.state.streamStepIndex!==e.stepIndex){let n=await t.thread.post({markdown:r});t.state.anchorMessageId=n.id,t.state.streamStepIndex=e.stepIndex,t.state.lastEditAtMs=Date.now();return}let a=t.state.lastEditAtMs??0;if(!(Date.now()-a<t.streamingEditIntervalMs))try{await editMessage(t.thread,i,r),t.state.lastEditAtMs=Date.now()}catch(e){if(!isNotImplemented(e))throw e;t.state.editSupported=!1,clearStream(t.state)}},async"input.requested"(t,n,r){n.thread&&t.requests.length!==0&&await n.thread.post(renderInputRequests(t.requests,e))},async"message.completed"(e,t,n){if(e.finishReason===`tool-calls`){t.state.pendingToolCallMessage=e.message?firstNonEmptyLine(e.message)??null:null,e.message?await finalizeStreamedMessage(t,e.message,!1):clearStream(t.state);return}if(t.state.pendingToolCallMessage=null,!e.message){clearStream(t.state);return}await finalizeStreamedMessage(t,e.message,!0)},async"turn.failed"(e,t,n){await postFailure(t.thread,`I hit an error while handling your request`,e)},async"session.failed"(e,t){await postFailure(t.thread,`This session could not recover from an error`,e)}}}async function safeStartTyping(e,t){if(e)try{await e.startTyping(t)}catch(e){if(!isNotImplemented(e))throw e}}async function editMessage(e,t,n){await e.adapter.editMessage(e.id,t,{markdown:n})}async function finalizeStreamedMessage(e,t,n){let r=e.thread;if(!r){clearStream(e.state);return}let i=e.state.anchorMessageId;if(canStream(e)&&i)try{await editMessage(r,i,t)}catch(i){if(!isNotImplemented(i))throw i;e.state.editSupported=!1,n&&await r.post({markdown:t})}else n&&await r.post({markdown:t});clearStream(e.state)}function canStream(e){return e.streaming&&e.state.editSupported!==!1}function clearStream(e){e.anchorMessageId=null,e.lastEditAtMs=null,e.streamStepIndex=null,streamTextByState.delete(e)}function firstNonEmptyLine(e){for(let t of e.split(/\r?\n/u)){let e=t.trim();if(e.length>0)return e}}function truncate(e,t=80){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}function renderInputRequests(e,t){return Card({children:e.flatMap(e=>renderInputRequest(e,t))})}function renderInputRequest(e,t){let n=[CardText(e.prompt)];return e.options&&e.options.length>0?(n.push(Actions(e.options.map(n=>Button({id:encodeInputAction(t,e.requestId,n.id),label:n.label,style:n.style,value:n.id})))),n):(n.push(CardText(`This request needs a freeform answer. Continue from the eve session UI.`)),n)}async function postFailure(e,t,n){if(!e)return;let r=formatErrorHint(n),i=extractErrorId(n.details);await e.post([`${t}${r}.`,`Please try again, rephrase, or reach out if it keeps failing.`,...i?[`Error id: ${i}`]:[]].join(`
2
2
 
3
- `))}async function bridgeSend(e,t,n){let r=contextStorage.getStore()?.get(ActiveWebhookKey);if(!r)throw Error(`chatSdkChannel().send can only run during a Chat SDK webhook handler for this bridge.`);let i=serializeThread(e,n.thread,n.adapterName),a=normalizeSendInput(t),o={auth:n.auth??null,state:{thread:i}};return n.callback!==void 0&&(o.callback=n.callback),n.mode!==void 0&&(o.mode=n.mode),n.title!==void 0&&(o.title=n.title),n.turnPolicy!==void 0&&(o.turnPolicy=n.turnPolicy),r.from(i.id)[INTERNAL_CHANNEL_DELIVER](a,o)}function initialState(){return{pendingAuthMessageIds:{},thread:null}}function threadFromState(e,t){if(!t.thread)return null;try{let n=t.thread;return new ThreadImpl({adapter:e.getAdapter(n.adapterName),channelId:n.channelId,channelVisibility:n.channelVisibility,currentMessage:n.currentMessage?Message.fromJSON(n.currentMessage):void 0,id:n.id,isDM:n.isDM,stateAdapter:e.getState()})}catch(e){return log.warn(`failed to rebuild Chat SDK thread from channel state`,{error:e}),null}}function serializeReceiveTarget(e,t){if(t.thread)return t.thread;if(!t.threadId)throw Error(`chatSdkChannel().receive requires target.thread or target.threadId.`);return serializeThread(e,t.threadId,t.adapterName)}function serializeThread(e,t,n){if(typeof t==`string`){let r=n??inferAdapterName(t),i=e.getAdapter(r);return{_type:`chat:Thread`,adapterName:r,channelId:i.channelIdFromThreadId(t),channelVisibility:i.getChannelVisibility?.(t),id:t,isDM:!1}}return isSerializedThread(t)?t:t.toJSON()}function isSerializedThread(e){return`_type`in e&&e._type===`chat:Thread`}function inferAdapterName(e){let t=e.indexOf(`:`);if(t<=0)throw Error(`chatSdkChannel string thread references require options.adapterName.`);return e.slice(0,t)}function adapterNames(e){return Object.keys(e)}function routeForAdapter(e,t){return t.routes?.[e]||`${(t.route??`/eve/v1`).replace(/\/$/u,``)}/${e}`}function encodeInputAction(e,t,n){return`${e}${encodeURIComponent(t)}:${encodeURIComponent(n)}`}function decodeInputAction(e,t,n){if(!e.startsWith(t))return null;let r=e.slice(t.length),i=r.indexOf(`:`);if(i<=0)return null;try{let e=decodeURIComponent(r.slice(0,i));return{optionId:n??decodeURIComponent(r.slice(i+1)),requestId:e}}catch{return null}}export{chatSdkChannel};
3
+ `))}async function bridgeSend(e,t,n){let r=contextStorage.getStore()?.get(ActiveWebhookKey);if(!r)throw Error(`chatSdkChannel().send can only run during a Chat SDK webhook handler for this bridge.`);let i=serializeThread(e,n.thread,n.adapterName),a=normalizeSendInput(t),o={auth:n.auth??null,state:{thread:i}};return n.callback!==void 0&&(o.callback=n.callback),n.mode!==void 0&&(o.mode=n.mode),n.title!==void 0&&(o.title=n.title),n.turnPolicy!==void 0&&(o.turnPolicy=n.turnPolicy),n.taskDeliveryPolicy!==void 0&&(o.taskDeliveryPolicy=n.taskDeliveryPolicy),r.from(i.id)[INTERNAL_CHANNEL_DELIVER](a,o)}function initialState(){return{pendingAuthMessageIds:{},thread:null}}function threadFromState(e,t){if(!t.thread)return null;try{let n=t.thread;return new ThreadImpl({adapter:e.getAdapter(n.adapterName),channelId:n.channelId,channelVisibility:n.channelVisibility,currentMessage:n.currentMessage?Message.fromJSON(n.currentMessage):void 0,id:n.id,isDM:n.isDM,stateAdapter:e.getState()})}catch(e){return log.warn(`failed to rebuild Chat SDK thread from channel state`,{error:e}),null}}function serializeReceiveTarget(e,t){if(t.thread)return t.thread;if(!t.threadId)throw Error(`chatSdkChannel().receive requires target.thread or target.threadId.`);return serializeThread(e,t.threadId,t.adapterName)}function serializeThread(e,t,n){if(typeof t==`string`){let r=n??inferAdapterName(t),i=e.getAdapter(r);return{_type:`chat:Thread`,adapterName:r,channelId:i.channelIdFromThreadId(t),channelVisibility:i.getChannelVisibility?.(t),id:t,isDM:!1}}return isSerializedThread(t)?t:t.toJSON()}function isSerializedThread(e){return`_type`in e&&e._type===`chat:Thread`}function inferAdapterName(e){let t=e.indexOf(`:`);if(t<=0)throw Error(`chatSdkChannel string thread references require options.adapterName.`);return e.slice(0,t)}function adapterNames(e){return Object.keys(e)}function routeForAdapter(e,t){return t.routes?.[e]||`${(t.route??`/eve/v1`).replace(/\/$/u,``)}/${e}`}function encodeInputAction(e,t,n){return`${e}${encodeURIComponent(t)}:${encodeURIComponent(n)}`}function decodeInputAction(e,t,n){if(!e.startsWith(t))return null;let r=e.slice(t.length),i=r.indexOf(`:`);if(i<=0)return null;try{let e=decodeURIComponent(r.slice(0,i));return{optionId:n??decodeURIComponent(r.slice(i+1)),requestId:e}}catch{return null}}export{chatSdkChannel};
@@ -1 +1 @@
1
- import{shellQuote}from"#shared/shell-quote.js";import{resolveGitHubInstallationToken}from"#public/channels/github/auth.js";import{getGitHubPullRequest,getGitHubRepository}from"#public/channels/github/api.js";import{gitHubGitBrokerNetworkPolicy,gitHubRemoteUrl,isFullGitSha}from"#shared/git.js";async function checkoutGitHubRepository(e,t){let n=await resolveCheckoutDescriptor(t),r=e.resolvePath(t.path??`/workspace`),i=resolveCheckoutRef(t.ref,n);if(isFullGitSha(i)){let t=await readCheckoutHead(e,r);if(t===i)return{baseRef:n.baseRef,path:r,ref:i,sha:t}}let a=normalizeCheckoutDepth(t.depth),o=t.mode===`full`?``:` --depth ${a}`,s=await resolveGitHubInstallationToken({api:t.api,credentials:t.credentials,installationId:n.installationId}),c=gitHubRemoteUrl({owner:n.owner,repo:n.repo}),l=isFullGitSha(i)?i:`FETCH_HEAD`;await e.setNetworkPolicy(gitHubGitBrokerNetworkPolicy(s)),await runCheckoutCommand({command:`mkdir -p ${shellQuote(r)}`,label:`create checkout directory`,sandbox:e}),await runCheckoutCommand({command:`cd ${shellQuote(r)} && git init`,label:`initialize git repository`,sandbox:e}),await runCheckoutCommand({command:`cd ${shellQuote(r)} && git remote remove origin >/dev/null 2>&1 || true`,label:`reset git remote`,sandbox:e}),await runCheckoutCommand({command:`cd ${shellQuote(r)} && git remote add origin ${shellQuote(c)}`,label:`configure git remote`,sandbox:e}),await runCheckoutCommand({command:`cd ${shellQuote(r)} && GIT_TERMINAL_PROMPT=0 git fetch${o} origin ${shellQuote(i)}`,label:`fetch GitHub ref`,sandbox:e}),await runCheckoutCommand({command:`cd ${shellQuote(r)} && git checkout --detach ${shellQuote(l)}`,label:`checkout GitHub ref`,sandbox:e}),t.includeBase===!0&&n.baseSha!==null&&await runCheckoutCommand({command:`cd ${shellQuote(r)} && GIT_TERMINAL_PROMPT=0 git fetch${o} origin ${shellQuote(n.baseSha)}`,label:`fetch GitHub base ref`,sandbox:e});let u=(await runCheckoutCommand({command:`cd ${shellQuote(r)} && git rev-parse HEAD`,label:`resolve checked out commit`,sandbox:e})).stdout.trim()||n.headSha||i;return{baseRef:n.baseRef,path:r,ref:i,sha:u}}async function resolveCheckoutDescriptor(e){let t=readNonEmptyString(e.owner),n=readNonEmptyString(e.repo);if(t===void 0||n===void 0)throw Error(`GitHub checkout requires a repository owner and name.`);if(e.installationId===void 0||e.installationId===null)throw Error(`GitHub checkout requires a GitHub App installation id.`);let r=e.pullRequestNumber??null,i=readNonEmptyString(e.ref),a=null;r!==null&&(i===void 0&&((e.headSha===void 0||e.headSha===null)&&(e.headRef===void 0||e.headRef===null)||e.defaultBranch===void 0||e.defaultBranch===null)||e.includeBase===!0&&(e.baseSha===void 0||e.baseSha===null)||e.includeBase===!0&&(e.baseRef===void 0||e.baseRef===null))&&(a=await getGitHubPullRequest({api:e.api,credentials:e.credentials,installationId:e.installationId,owner:t,pullRequestNumber:r,repo:n}));let o=readNonEmptyString(e.defaultBranch)??a?.defaultBranch??await resolveRepositoryDefaultBranch(e,{owner:t,pullRequestNumber:r,repo:n});return{baseRef:e.baseRef??a?.base.ref??null,baseSha:e.baseSha??a?.base.sha??null,defaultBranch:o,headRef:e.headRef??a?.head.ref??null,headSha:e.headSha??a?.head.sha??null,installationId:e.installationId,owner:t,pullRequestNumber:r,repo:n}}async function resolveRepositoryDefaultBranch(e,t){return t.pullRequestNumber!==null||readNonEmptyString(e.ref)!==void 0||readNonEmptyString(e.headSha)!==void 0||readNonEmptyString(e.headRef)!==void 0?null:(await getGitHubRepository({api:e.api,credentials:e.credentials,installationId:e.installationId??void 0,owner:t.owner,repo:t.repo})).defaultBranch??null}function resolveCheckoutRef(e,t){if(e!==void 0&&e.trim().length>0)return e.trim();if(t.headSha!==null)return t.headSha;if(t.pullRequestNumber!==null)return`refs/pull/${t.pullRequestNumber}/head`;if(t.headRef!==null)return t.headRef;if(t.defaultBranch!==null)return t.defaultBranch;throw Error(`GitHub checkout could not resolve a ref to fetch.`)}async function readCheckoutHead(e,t){let n=await e.run({command:`cd ${shellQuote(t)} && git rev-parse HEAD 2>/dev/null`});if(n.exitCode!==0)return null;let r=String(n.stdout??``).trim();return isFullGitSha(r)?r:null}async function runCheckoutCommand(e){let t=await e.sandbox.run({command:e.command}),n=String(t.stderr??``),r=String(t.stdout??``);if(t.exitCode===0)return{stderr:n,stdout:r};throw Error([`GitHub checkout failed during ${e.label} (exit ${t.exitCode}).`,n?`stderr: ${n}`:void 0,r?`stdout: ${r}`:void 0,`Verify the GitHub App installation has access to this repository.`].filter(e=>e!==void 0).join(` `))}function normalizeCheckoutDepth(e){if(e===void 0)return 1;if(!Number.isFinite(e)||e<1)throw Error(`GitHub checkout depth must be a positive number.`);return Math.floor(e)}function readNonEmptyString(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}export{checkoutGitHubRepository};
1
+ import{shellQuote}from"#shared/shell-quote.js";import{resolveGitHubInstallationToken}from"#public/channels/github/auth.js";import{getGitHubPullRequest,getGitHubRepository}from"#public/channels/github/api.js";import{gitHubGitBrokerNetworkPolicy,gitHubRemoteUrl,isFullGitSha}from"#shared/git.js";async function checkoutGitHubRepository(e,t){let n=await resolveCheckoutDescriptor(t),r=e.resolvePath(t.path??`/workspace`),i=resolveCheckoutRef(t.ref,n);if(isFullGitSha(i)){let t=await readCheckoutHead(e,r);if(t===i)return{baseRef:n.baseRef,path:r,ref:i,sha:t}}let a=normalizeCheckoutDepth(t.depth),o=t.mode===`full`?``:` --depth ${a}`,s=await resolveGitHubInstallationToken({api:t.api,credentials:t.credentials,installationId:n.installationId}),c=gitHubRemoteUrl({owner:n.owner,repo:n.repo}),l=isFullGitSha(i)?i:`FETCH_HEAD`;if(e.setNetworkPolicy===void 0)throw Error(`GitHub checkout requires a sandbox provider with mutable network policy.`);await e.setNetworkPolicy(gitHubGitBrokerNetworkPolicy(s)),await runCheckoutCommand({command:`mkdir -p ${shellQuote(r)}`,label:`create checkout directory`,sandbox:e}),await runCheckoutCommand({command:`cd ${shellQuote(r)} && git init`,label:`initialize git repository`,sandbox:e}),await runCheckoutCommand({command:`cd ${shellQuote(r)} && git remote remove origin >/dev/null 2>&1 || true`,label:`reset git remote`,sandbox:e}),await runCheckoutCommand({command:`cd ${shellQuote(r)} && git remote add origin ${shellQuote(c)}`,label:`configure git remote`,sandbox:e}),await runCheckoutCommand({command:`cd ${shellQuote(r)} && GIT_TERMINAL_PROMPT=0 git fetch${o} origin ${shellQuote(i)}`,label:`fetch GitHub ref`,sandbox:e}),await runCheckoutCommand({command:`cd ${shellQuote(r)} && git checkout --detach ${shellQuote(l)}`,label:`checkout GitHub ref`,sandbox:e}),t.includeBase===!0&&n.baseSha!==null&&await runCheckoutCommand({command:`cd ${shellQuote(r)} && GIT_TERMINAL_PROMPT=0 git fetch${o} origin ${shellQuote(n.baseSha)}`,label:`fetch GitHub base ref`,sandbox:e});let u=(await runCheckoutCommand({command:`cd ${shellQuote(r)} && git rev-parse HEAD`,label:`resolve checked out commit`,sandbox:e})).stdout.trim()||n.headSha||i;return{baseRef:n.baseRef,path:r,ref:i,sha:u}}async function resolveCheckoutDescriptor(e){let t=readNonEmptyString(e.owner),n=readNonEmptyString(e.repo);if(t===void 0||n===void 0)throw Error(`GitHub checkout requires a repository owner and name.`);if(e.installationId===void 0||e.installationId===null)throw Error(`GitHub checkout requires a GitHub App installation id.`);let r=e.pullRequestNumber??null,i=readNonEmptyString(e.ref),a=null;r!==null&&(i===void 0&&((e.headSha===void 0||e.headSha===null)&&(e.headRef===void 0||e.headRef===null)||e.defaultBranch===void 0||e.defaultBranch===null)||e.includeBase===!0&&(e.baseSha===void 0||e.baseSha===null)||e.includeBase===!0&&(e.baseRef===void 0||e.baseRef===null))&&(a=await getGitHubPullRequest({api:e.api,credentials:e.credentials,installationId:e.installationId,owner:t,pullRequestNumber:r,repo:n}));let o=readNonEmptyString(e.defaultBranch)??a?.defaultBranch??await resolveRepositoryDefaultBranch(e,{owner:t,pullRequestNumber:r,repo:n});return{baseRef:e.baseRef??a?.base.ref??null,baseSha:e.baseSha??a?.base.sha??null,defaultBranch:o,headRef:e.headRef??a?.head.ref??null,headSha:e.headSha??a?.head.sha??null,installationId:e.installationId,owner:t,pullRequestNumber:r,repo:n}}async function resolveRepositoryDefaultBranch(e,t){return t.pullRequestNumber!==null||readNonEmptyString(e.ref)!==void 0||readNonEmptyString(e.headSha)!==void 0||readNonEmptyString(e.headRef)!==void 0?null:(await getGitHubRepository({api:e.api,credentials:e.credentials,installationId:e.installationId??void 0,owner:t.owner,repo:t.repo})).defaultBranch??null}function resolveCheckoutRef(e,t){if(e!==void 0&&e.trim().length>0)return e.trim();if(t.headSha!==null)return t.headSha;if(t.pullRequestNumber!==null)return`refs/pull/${t.pullRequestNumber}/head`;if(t.headRef!==null)return t.headRef;if(t.defaultBranch!==null)return t.defaultBranch;throw Error(`GitHub checkout could not resolve a ref to fetch.`)}async function readCheckoutHead(e,t){let n=await e.run({command:`cd ${shellQuote(t)} && git rev-parse HEAD 2>/dev/null`});if(n.exitCode!==0)return null;let r=String(n.stdout??``).trim();return isFullGitSha(r)?r:null}async function runCheckoutCommand(e){let t=await e.sandbox.run({command:e.command}),n=String(t.stderr??``),r=String(t.stdout??``);if(t.exitCode===0)return{stderr:n,stdout:r};throw Error([`GitHub checkout failed during ${e.label} (exit ${t.exitCode}).`,n?`stderr: ${n}`:void 0,r?`stdout: ${r}`:void 0,`Verify the GitHub App installation has access to this repository.`].filter(e=>e!==void 0).join(` `))}function normalizeCheckoutDepth(e){if(e===void 0)return 1;if(!Number.isFinite(e)||e<1)throw Error(`GitHub checkout depth must be a positive number.`);return Math.floor(e)}function readNonEmptyString(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}export{checkoutGitHubRepository};
@@ -1,4 +1,4 @@
1
- export { defineChannel, disableRoute, GET, HEAD, OPTIONS, POST, PUT, PATCH, DELETE, WS, type AttachSessionFn, type CancelTurnResult, type ClearSessionResult, type CompactSessionResult, type ResetSessionResult, type Channel, type ChannelAudience, type AudienceCaller, type AudienceContext, type AudienceInput, type AudiencePrincipal, type ConversationEnvironment, type ChannelFrom, type ChannelReceiveContext, type ChannelResolveSession, type ChannelRespondOptions, type ChannelSendOptions, type ChannelSource, type ChannelCors, type ChannelCorsOptions, type ChannelDefinition, type DisabledRouteSentinel, type ChannelContinuationOps, type ChannelEvents, type InferChannelMetadata, type Session, type SessionCallback, type SessionHandle, type SessionRespondOptions, type SessionSendOptions, type TurnPolicy, type RouteDefinition, type RouteHandlerArgs, type HttpRouteDefinition, type WebSocketMessage, type WebSocketPeer, type WebSocketRouteDefinition, type WebSocketRouteHandler, type WebSocketRouteHooks, type WebSocketUpgradeRequest, type WebSocketUpgradeResult, isDisabledRouteSentinel, } from "#public/definitions/channel.js";
1
+ export { defineChannel, disableRoute, GET, HEAD, OPTIONS, POST, PUT, PATCH, DELETE, WS, type AttachSessionFn, type CancelTurnResult, type ClearSessionResult, type CompactSessionResult, type ResetSessionResult, type Channel, type ChannelAudience, type AudienceCaller, type AudienceContext, type AudienceInput, type AudiencePrincipal, type ConversationEnvironment, type ChannelFrom, type ChannelReceiveContext, type ChannelResolveSession, type ChannelRespondOptions, type ChannelSendOptions, type ChannelSource, type ChannelCors, type ChannelCorsOptions, type ChannelDefinition, type DisabledRouteSentinel, type ChannelContinuationOps, type ChannelEvents, type InferChannelMetadata, type Session, type SessionCallback, type SessionHandle, type SessionRespondOptions, type SessionSendOptions, type TurnPolicy, type TaskDeliveryPolicy, type RouteDefinition, type RouteHandlerArgs, type HttpRouteDefinition, type WebSocketMessage, type WebSocketPeer, type WebSocketRouteDefinition, type WebSocketRouteHandler, type WebSocketRouteHooks, type WebSocketUpgradeRequest, type WebSocketUpgradeResult, isDisabledRouteSentinel, } from "#public/definitions/channel.js";
2
2
  export { createWebSocketUpgradeServer, type WebSocketUpgradeServerBridge, } from "#channel/websocket-upgrade-server.js";
3
3
  import type { Channel, InferChannelMetadata } from "#public/definitions/channel.js";
4
4
  /**
@@ -1,7 +1,7 @@
1
1
  import type { UserContent } from "ai";
2
2
  import type { ChannelResolveSession, ChannelSource } from "#channel/channel-operations.js";
3
3
  import type { Session } from "#channel/session.js";
4
- import type { SessionAuthContext, TurnPolicy } from "#channel/types.js";
4
+ import type { SessionAuthContext, TurnPolicy, TaskDeliveryPolicy } from "#channel/types.js";
5
5
  import type { CardElement } from "#compiled/chat/index.js";
6
6
  import type { SessionContext } from "#public/definitions/callback-context.js";
7
7
  import type { ChannelContinuationOps } from "#public/definitions/channel.js";
@@ -221,6 +221,8 @@ export interface SlackInitialMessage {
221
221
  * Options for one turn requested by a generic Slack event handler.
222
222
  */
223
223
  export interface SlackEventSendOptions {
224
+ /** Updates the session policy; omission preserves it. */
225
+ readonly taskDeliveryPolicy?: TaskDeliveryPolicy;
224
226
  readonly auth: SessionAuthContext | null;
225
227
  readonly target: SlackReceiveTarget;
226
228
  /** Overrides the workflow run title without changing the message sent to the model. */
@@ -1 +1 @@
1
- import{markEventHandled}from"./utils.js";import{createLogger,logError}from"#internal/logging.js";import{normalizeChannelAudience}from"#shared/channel-audience.js";import{setChannelActivityRenderers}from"#channel/compiled-channel.js";import{defaultDeliverResult}from"#channel/adapter.js";import{POST,defineChannel}from"#public/definitions/channel.js";import{mergeUploadPolicy}from"#public/channels/upload-policy.js";import{buildSlackBinding,buildSlackWorkspaceHandle,slackContinuationToken}from"#public/channels/slack/api.js";import{buildSlackAuthContext,slackUserIdFromAuthContext}from"#public/channels/slack/auth.js";import{defaultEvents,defaultInputRequestedHandler,defaultOnAppMention,defaultOnDirectMessage,postCompletedSlackReply}from"#public/channels/slack/defaults.js";import{buildSlackActivityRenderers,hasSlackActivityStatus}from"#public/channels/slack/activity.js";import{loadThreadContextMessages}from"#public/channels/slack/thread.js";import{parseSlackWebhookBody}from"#compiled/@chat-adapter/slack/webhook.js";import{bindSlackSessionOperations}from"#public/channels/slack/session-operations.js";import{buildSlackTurnMessage,collectInboundFileParts,createSlackFetchFile}from"#public/channels/slack/attachments.js";import{parseMessageEvent,parseSlackEventEnvelope,slackEventBotUserId,slackEventInstallationTeamId,slackEventReceivingBotUserId,slackMessageFromWebhookPayload}from"#public/channels/slack/inbound.js";import{formatSlackInboundMessage,formatSlackThreadContext}from"#public/channels/slack/model-context.js";import{isPrivateSlackConversation}from"#public/channels/slack/privacy.js";import{SLACK_CHANNEL_DEFAULT_ROUTE}from"#public/channels/slack/constants.js";import{handleInteractionPost}from"#public/channels/slack/interactions.js";import{verifySlackRequest as verifySlackRequest$1}from"#public/channels/slack/verify.js";const log=createLogger(`slack.channel`),ignoreSlackActivityEvent=async()=>void 0,activityOwnedMessageCompleted=async(e,t)=>{t.state.pendingToolCallMessage=null,e.finishReason!==`tool-calls`&&e.message&&await postCompletedSlackReply(t,e.message)},clearSlackTurnState=async(e,t)=>{t.state.pendingToolCallMessage=null,t.state.lastReasoningTypingAtMs=null,t.state.lastReasoningTypingStatus=null};function rebuildSlackContext(e,t,n){let{thread:r,slack:i}=buildSlackBinding({botToken:n?.botToken,channelId:e.channelId??``,threadTs:e.threadTs??``,installationTeamId:e.installationTeamId??void 0,teamId:e.teamId??void 0,onThreadTsChanged(n){e.threadTs=n,e.channelId&&t.continuation?.alias(slackContinuationToken(e.channelId,n))}});return{thread:r,slack:i,state:e}}function slackChannel(e={}){let t=mergeUploadPolicy(e.uploadPolicy),n=createSlackFetchFile({botToken:e.credentials?.botToken}),r=buildSlackActivityRenderers({botToken:e.credentials?.botToken,renderers:e.activity?.renderers??[]}),i=e.onInputResponse??defaultOnInputResponse,a=e.events?.[`authorization.required`],o=e.events?.[`approval.candidate`]??defaultEvents[`approval.candidate`],s=hasSlackActivityStatus(e.activity?.renderers),c=e.events?.[`turn.started`]??(s?clearSlackTurnState:defaultEvents[`turn.started`]),l=e.events?.[`reasoning.appended`]??(s?ignoreSlackActivityEvent:defaultEvents[`reasoning.appended`]),u=e.events?.[`actions.requested`]??(s?ignoreSlackActivityEvent:defaultEvents[`actions.requested`]),d=e.events?.[`message.completed`]??(s?activityOwnedMessageCompleted:defaultEvents[`message.completed`]),f=defaultInputRequestedHandler(e.approvalChannel),p=e.events?.[`input.requested`],m=p===void 0?f:async(e,t,n)=>p(e,t,n,async e=>{await f(e,t,n)}),h={...defaultEvents,...e.events,async"approval.candidate"(e,t,n){let r=t.state.approvalResponderUsers?.[e.responderPrincipalId];if(e.outcome===`pending`&&r!==void 0&&(t.state.pendingApprovalCandidateUsers={...t.state.pendingApprovalCandidateUsers,[e.candidateId]:r}),await o(e,t,n),e.outcome!==`pending`){let n={...t.state.pendingApprovalCandidateUsers};delete n[e.candidateId],t.state.pendingApprovalCandidateUsers=n}},async"turn.started"(e,t,n){let r=slackUserIdFromAuthContext(n.session.auth.current);r!==void 0&&(t.state.triggeringUserId=r),await c(e,t,n)},"reasoning.appended":l,"actions.requested":u,"message.completed":d,"input.requested":m,"authorization.required":a===void 0?defaultEvents[`authorization.required`]:constrainAuthorizationRequired(a)},g=new Set,_=defineChannel({kindHint:`slack`,turnPolicy:e.turnPolicy,state:{channelId:null,threadTs:null,teamId:null,installationTeamId:null,triggeringUserId:null,triggeringMessageTs:null,pendingToolCallMessage:null,lastReasoningTypingAtMs:null,lastReasoningTypingStatus:null,pendingAuthMessageTs:{},pendingApprovalCards:{},pendingApprovalCandidateUsers:{},approvalResponderUsers:{}},fetchFile:n,metadata(e){return{channelId:e.channelId,teamId:e.teamId,threadTs:e.threadTs,triggeringUserId:e.triggeringUserId??null}},audience:({state:e})=>e.audience??`unknown`,context(t,n){return rebuildSlackContext(t,n,e.credentials)},deliver(e,t){let n=e.pendingApprovalCards;typeof n==`object`&&n&&(t.state.pendingApprovalCards={...t.state.pendingApprovalCards,...n});let r=e.state?.approvalResponderUsers;return typeof r==`object`&&r&&(t.state.approvalResponderUsers={...t.state.approvalResponderUsers,...r}),defaultDeliverResult(e)},routes:[POST(e.route??SLACK_CHANNEL_DEFAULT_ROUTE,async(n,r)=>{let{waitUntil:a}=r,{from:o,resolveSession:s}=r,c=await verifyInbound(n,e.credentials);return c===null?new Response(`unauthorized`,{status:401}):shouldDropSlackHttpTimeoutRetry(n.headers)?new Response(`ok`):(n.headers.get(`content-type`)??``).includes(`application/x-www-form-urlencoded`)?handleInteractionPost(c,{from:o,resolveSession:s,waitUntil:a},{config:e,onInputResponse:i}):handleEventPost({body:c,from:o,resolveSession:s,waitUntil:a,config:e,uploadPolicy:t,handledEvents:g,headers:n.headers})})],receive(t,{from:n}){return receiveOnSlack(t,{from:n,credentials:e.credentials})},events:h});return setChannelActivityRenderers(_,{destination(e){let t=e;return{channelId:t?.channelId??null,installationTeamId:t?.installationTeamId??null,teamId:t?.teamId??null,threadTs:t?.threadTs??null,triggeringUserId:t?.triggeringUserId??null}},renderers:r}),_}function defaultOnInputResponse(e){return{auth:e.defaultAuth}}async function receiveOnSlack(e,t){let n=e.target,r=n.channelId;if(!r||typeof r!=`string`)throw Error(`slackChannel().receive requires target.channelId.`);let i=typeof n.threadTs==`string`?n.threadTs:``,a=typeof n.installationTeamId==`string`?n.installationTeamId:t.installationTeamId,o=n.initialMessage;if(o&&i.length>0)throw Error("slackChannel().receive: `threadTs` and `initialMessage` are mutually exclusive.");let s=i;if(o){let{thread:e}=buildSlackBinding({botToken:t.credentials?.botToken,channelId:r,threadTs:``,installationTeamId:a,teamId:t.teamId}),n={card:o.card};o.fallbackText!==void 0&&(n.fallbackText=o.fallbackText),s=(await e.post(n)).id}let c=s||crypto.randomUUID(),l=n.audience===void 0?void 0:normalizeChannelAudience(n.audience),u={channelId:r,installationTeamId:a??null,threadTs:s||null,teamId:t.teamId??null,triggeringUserId:t.triggeringUserId??null};return l!==void 0&&(u.audience=l),t.from(slackContinuationToken(r,c)).send(e.message,{auth:e.auth,state:u,title:e.title})}function constrainAuthorizationRequired(e){return(t,n,r)=>e(t,{postEphemeral:(e,t)=>n.thread.postEphemeral(e,t),postDirectMessage:(e,t)=>n.thread.postDirectMessage(e,t),state:n.state},r)}function shouldDropSlackHttpTimeoutRetry(e){return Number(e.get(`x-slack-retry-num`)??`0`)>=1&&e.get(`x-slack-retry-reason`)===`http_timeout`}async function handleEventPost(e){let{config:t}=e,n,r;try{n=parseSlackWebhookBody(e.body,{headers:e.headers}),r=parseSlackEventEnvelope(e.body)}catch(e){return log.warn(`inbound webhook body is not valid JSON`,{error:e}),new Response(`ok`)}if(n.kind===`url_verification`)return new Response(n.challenge,{status:200,headers:{"content-type":`text/plain`}});if(r===null)return new Response(`ok`);let i=typeof r.api_app_id==`string`?r.api_app_id:void 0,a=slackEventBotUserId(r),o=slackEventReceivingBotUserId(r),s=slackEventInstallationTeamId(r),dispatch=null,c=null;if(n.kind===`app_mention`||n.kind===`direct_message`){let r=n.kind,l=slackMessageFromWebhookPayload(n);if(l!==null&&!isSelfAuthoredSlackMessage({appId:i,botUserId:a},l)){let dispatchMessageWith=n=>()=>dispatchSlackMessage({appId:i,botUserId:a,receivingBotUserId:o,from:e.from,resolveSession:e.resolveSession,credentials:t.credentials,handler:n,installationTeamId:s,kind:r,message:l,threadContext:t.threadContext,uploadPolicy:e.uploadPolicy}),n=(r===`app_mention`?t.onAppMention:t.onDirectMessage)??t.onMessage;n===void 0?c=dispatchMessageWith(r===`app_mention`?defaultOnAppMention:defaultOnDirectMessage):dispatch=()=>dispatchSlackMessage({appId:i,botUserId:a,receivingBotUserId:o,from:e.from,resolveSession:e.resolveSession,credentials:t.credentials,handler:n,installationTeamId:s,kind:r,message:l,threadContext:t.threadContext,uploadPolicy:e.uploadPolicy})}}if(dispatch===null&&t.onMessage!==void 0){let n=parseMessageEvent(r);n!==null&&!isSelfAuthoredSlackMessage({appId:i,botUserId:a},n)&&(a===void 0||!n.text.includes(`<@${a}`))&&(dispatch=()=>dispatchSlackMessage({appId:i,botUserId:a,receivingBotUserId:o,from:e.from,resolveSession:e.resolveSession,credentials:t.credentials,handler:t.onMessage,installationTeamId:s,kind:`channel_message`,message:n,threadContext:t.threadContext,uploadPolicy:e.uploadPolicy}))}let l=t.onEvent;if(dispatch===null&&l!==void 0&&(dispatch=()=>dispatchSlackEvent({from:e.from,resolveSession:e.resolveSession,credentials:t.credentials,envelope:r,handler:l,installationTeamId:s})),dispatch??=c,dispatch===null)return new Response(`ok`);let u=r.event_id;if(u){if(e.handledEvents.has(u))return log.warn(`received a duplicate event`,{event_id:u,event_time:r.event_time,retry_num:n.retry?.num??`(null)`,retry_reason:n.retry?.reason??`(null)`}),new Response(`ok`);markEventHandled(u,e.handledEvents)}return e.waitUntil(dispatch()),new Response(`ok`)}function isSelfAuthoredSlackMessage(e,t){return e.botUserId!==void 0&&t.author?.userId===e.botUserId||e.appId!==void 0&&t.raw.app_id===e.appId}async function dispatchSlackMessage(e){let t=slackContinuationToken(e.message.channelId,e.message.threadTs),{thread:n,slack:r}=buildSlackBinding({appId:e.appId,botToken:e.credentials?.botToken,botUserId:e.botUserId,channelId:e.message.channelId,threadTs:e.message.threadTs,installationTeamId:e.installationTeamId,teamId:e.message.teamId}),i=e.message.author,a={channelId:e.message.channelId,installationTeamId:e.installationTeamId??null,teamId:e.message.teamId??null,threadTs:e.message.threadTs,triggeringMessageTs:e.message.ts,triggeringUserId:i?.userId??null},o=bindSlackSessionOperations({address:t,defaultAuth:i===void 0?null:buildSlackAuthContext({channelId:e.message.channelId,fullName:i.fullName,isBot:i.isBot,teamId:e.message.teamId,threadTs:e.message.threadTs,userId:i.userId,userName:i.userName}),from:e.from,resolveSession:e.resolveSession,state:a}),s,isDMOrPrivateChannel=()=>s??=isPrivateSlackConversation({channelId:e.message.channelId,raw:e.message.raw,request:r.request}),c=e.kind===`app_mention`||e.botUserId!==void 0&&e.message.text.includes(`<@${e.botUserId}`),l={...o,isBotMentioned:()=>c,isDMOrPrivateChannel,isSubscribed:async()=>await o.resolveSession()!==void 0,slack:r,thread:n},u;try{u=await e.handler(l,e.message)}catch(t){logError(log,`${e.kind} handler failed`,t,{channelId:e.message.channelId});return}if(u==null)return;let d=await isDMOrPrivateChannel();a.audience=e.kind===`direct_message`||d?`private`:`public`,await deliverSlackMessage({botUserId:e.receivingBotUserId,credentials:e.credentials,kind:e.kind,isPrivateConversation:d,isMentioned:c,message:e.message,result:u,sessionOperations:o,thread:n,threadContext:e.threadContext,uploadPolicy:e.uploadPolicy})}async function dispatchSlackEvent(e){let t=e.envelope.event.team_id,n=typeof t==`string`?t:typeof e.envelope.team_id==`string`?e.envelope.team_id:void 0,r=[],sourceFor=t=>e.from(slackContinuationToken(t.channelId,t.threadTs)),i={cancel:({target:e,turnId:t})=>sourceFor(e).cancel({turnId:t}),clear:({target:e})=>sourceFor(e).clear(),compact:({target:e})=>sourceFor(e).compact(),envelope:e.envelope,reset:({reason:e,target:t})=>sourceFor(t).reset({reason:e}),resolveSession:({target:t})=>e.resolveSession(slackContinuationToken(t.channelId,t.threadTs)),respond:(e,{auth:t,target:n})=>sourceFor(n).respond(e,{auth:t}),send:(t,{auth:r,target:i,title:a})=>receiveOnSlack({auth:r,message:t,target:i,title:a},{from:e.from,credentials:e.credentials,installationTeamId:e.installationTeamId,teamId:n,...typeof e.envelope.event.user==`string`?{triggeringUserId:e.envelope.event.user}:{}}),slack:buildSlackWorkspaceHandle({botToken:e.credentials?.botToken,installationTeamId:e.installationTeamId,teamId:n}),waitUntil(e){r.push(e)}};try{await e.handler(i,e.envelope.event)}catch(t){logError(log,`event handler failed`,t,{eventId:e.envelope.event_id,eventType:e.envelope.event.type})}await Promise.allSettled(r)}async function verifyInbound(e,t){try{return await verifySlackRequest$1(e,{signingSecret:t?.signingSecret??(t?.webhookVerifier?void 0:process.env.SLACK_SIGNING_SECRET),webhookVerifier:t?.webhookVerifier})}catch(e){return log.warn(`slack inbound verification failed`,{error:e}),null}}async function deliverSlackMessage(e){let{message:t,thread:n}=e;try{let r=e.threadContext===void 0?[]:await loadThreadContextMessages(n,t,e.threadContext),i=formatSlackThreadContext(r),a=await collectInboundFileParts({mention:t,thread:n,policy:e.uploadPolicy}),o={botUserId:e.botUserId,channelId:t.channelId,fullName:t.author?.fullName,isMentioned:e.isMentioned,teamId:t.teamId,threadTs:t.threadTs,userId:t.author?.userId??``,userName:t.author?.userName},s=formatSlackInboundMessage(o,t),c=buildSlackTurnMessage(i===void 0?s:`${i}\n\n${s}`,a),l=e.result.context??[],u=e.isPrivateConversation?`Private message`:e.result.title??t.markdown,d=l.length===0?{auth:e.result.auth,title:u}:{auth:e.result.auth,context:l,title:u};await e.sessionOperations.send(c,d)}catch(n){logError(log,`${e.kind} delivery failed`,n,{channelId:t.channelId})}}export{constrainAuthorizationRequired,slackChannel};
1
+ import{markEventHandled}from"./utils.js";import{createLogger,logError}from"#internal/logging.js";import{normalizeChannelAudience}from"#shared/channel-audience.js";import{setChannelActivityRenderers}from"#channel/compiled-channel.js";import{defaultDeliverResult}from"#channel/adapter.js";import{POST,defineChannel}from"#public/definitions/channel.js";import{mergeUploadPolicy}from"#public/channels/upload-policy.js";import{buildSlackBinding,buildSlackWorkspaceHandle,slackContinuationToken}from"#public/channels/slack/api.js";import{buildSlackAuthContext,slackUserIdFromAuthContext}from"#public/channels/slack/auth.js";import{defaultEvents,defaultInputRequestedHandler,defaultOnAppMention,defaultOnDirectMessage,postCompletedSlackReply}from"#public/channels/slack/defaults.js";import{buildSlackActivityRenderers,hasSlackActivityStatus}from"#public/channels/slack/activity.js";import{loadThreadContextMessages}from"#public/channels/slack/thread.js";import{parseSlackWebhookBody}from"#compiled/@chat-adapter/slack/webhook.js";import{bindSlackSessionOperations}from"#public/channels/slack/session-operations.js";import{buildSlackTurnMessage,collectInboundFileParts,createSlackFetchFile}from"#public/channels/slack/attachments.js";import{parseMessageEvent,parseSlackEventEnvelope,slackEventBotUserId,slackEventInstallationTeamId,slackEventReceivingBotUserId,slackMessageFromWebhookPayload}from"#public/channels/slack/inbound.js";import{formatSlackInboundMessage,formatSlackThreadContext}from"#public/channels/slack/model-context.js";import{isPrivateSlackConversation}from"#public/channels/slack/privacy.js";import{SLACK_CHANNEL_DEFAULT_ROUTE}from"#public/channels/slack/constants.js";import{handleInteractionPost}from"#public/channels/slack/interactions.js";import{verifySlackRequest as verifySlackRequest$1}from"#public/channels/slack/verify.js";const log=createLogger(`slack.channel`),ignoreSlackActivityEvent=async()=>void 0,activityOwnedMessageCompleted=async(e,t)=>{t.state.pendingToolCallMessage=null,e.finishReason!==`tool-calls`&&e.message&&await postCompletedSlackReply(t,e.message)},clearSlackTurnState=async(e,t)=>{t.state.pendingToolCallMessage=null,t.state.lastReasoningTypingAtMs=null,t.state.lastReasoningTypingStatus=null};function rebuildSlackContext(e,t,n){let{thread:r,slack:i}=buildSlackBinding({botToken:n?.botToken,channelId:e.channelId??``,threadTs:e.threadTs??``,installationTeamId:e.installationTeamId??void 0,teamId:e.teamId??void 0,onThreadTsChanged(n){e.threadTs=n,e.channelId&&t.continuation?.alias(slackContinuationToken(e.channelId,n))}});return{thread:r,slack:i,state:e}}function slackChannel(e={}){let t=mergeUploadPolicy(e.uploadPolicy),n=createSlackFetchFile({botToken:e.credentials?.botToken}),r=buildSlackActivityRenderers({botToken:e.credentials?.botToken,renderers:e.activity?.renderers??[]}),i=e.onInputResponse??defaultOnInputResponse,a=e.events?.[`authorization.required`],o=e.events?.[`approval.candidate`]??defaultEvents[`approval.candidate`],s=hasSlackActivityStatus(e.activity?.renderers),c=e.events?.[`turn.started`]??(s?clearSlackTurnState:defaultEvents[`turn.started`]),l=e.events?.[`reasoning.appended`]??(s?ignoreSlackActivityEvent:defaultEvents[`reasoning.appended`]),u=e.events?.[`actions.requested`]??(s?ignoreSlackActivityEvent:defaultEvents[`actions.requested`]),d=e.events?.[`message.completed`]??(s?activityOwnedMessageCompleted:defaultEvents[`message.completed`]),f=defaultInputRequestedHandler(e.approvalChannel),p=e.events?.[`input.requested`],m=p===void 0?f:async(e,t,n)=>p(e,t,n,async e=>{await f(e,t,n)}),h={...defaultEvents,...e.events,async"approval.candidate"(e,t,n){let r=t.state.approvalResponderUsers?.[e.responderPrincipalId];if(e.outcome===`pending`&&r!==void 0&&(t.state.pendingApprovalCandidateUsers={...t.state.pendingApprovalCandidateUsers,[e.candidateId]:r}),await o(e,t,n),e.outcome!==`pending`){let n={...t.state.pendingApprovalCandidateUsers};delete n[e.candidateId],t.state.pendingApprovalCandidateUsers=n}},async"turn.started"(e,t,n){let r=slackUserIdFromAuthContext(n.session.auth.current);r!==void 0&&(t.state.triggeringUserId=r),await c(e,t,n)},"reasoning.appended":l,"actions.requested":u,"message.completed":d,"input.requested":m,"authorization.required":a===void 0?defaultEvents[`authorization.required`]:constrainAuthorizationRequired(a)},g=new Set,_=defineChannel({kindHint:`slack`,turnPolicy:e.turnPolicy,state:{channelId:null,threadTs:null,teamId:null,installationTeamId:null,triggeringUserId:null,triggeringMessageTs:null,pendingToolCallMessage:null,lastReasoningTypingAtMs:null,lastReasoningTypingStatus:null,pendingAuthMessageTs:{},pendingApprovalCards:{},pendingApprovalCandidateUsers:{},approvalResponderUsers:{}},fetchFile:n,metadata(e){return{channelId:e.channelId,teamId:e.teamId,threadTs:e.threadTs,triggeringUserId:e.triggeringUserId??null}},audience:({state:e})=>e.audience??`unknown`,context(t,n){return rebuildSlackContext(t,n,e.credentials)},deliver(e,t){let n=e.pendingApprovalCards;typeof n==`object`&&n&&(t.state.pendingApprovalCards={...t.state.pendingApprovalCards,...n});let r=e.state?.approvalResponderUsers;return typeof r==`object`&&r&&(t.state.approvalResponderUsers={...t.state.approvalResponderUsers,...r}),defaultDeliverResult(e)},routes:[POST(e.route??SLACK_CHANNEL_DEFAULT_ROUTE,async(n,r)=>{let{waitUntil:a}=r,{from:o,resolveSession:s}=r,c=await verifyInbound(n,e.credentials);return c===null?new Response(`unauthorized`,{status:401}):shouldDropSlackHttpTimeoutRetry(n.headers)?new Response(`ok`):(n.headers.get(`content-type`)??``).includes(`application/x-www-form-urlencoded`)?handleInteractionPost(c,{from:o,resolveSession:s,waitUntil:a},{config:e,onInputResponse:i}):handleEventPost({body:c,from:o,resolveSession:s,waitUntil:a,config:e,uploadPolicy:t,handledEvents:g,headers:n.headers})})],receive(t,{from:n}){return receiveOnSlack(t,{from:n,credentials:e.credentials})},events:h});return setChannelActivityRenderers(_,{destination(e){let t=e;return{channelId:t?.channelId??null,installationTeamId:t?.installationTeamId??null,teamId:t?.teamId??null,threadTs:t?.threadTs??null,triggeringUserId:t?.triggeringUserId??null}},renderers:r}),_}function defaultOnInputResponse(e){return{auth:e.defaultAuth}}async function receiveOnSlack(e,t){let n=e.target,r=n.channelId;if(!r||typeof r!=`string`)throw Error(`slackChannel().receive requires target.channelId.`);let i=typeof n.threadTs==`string`?n.threadTs:``,a=typeof n.installationTeamId==`string`?n.installationTeamId:t.installationTeamId,o=n.initialMessage;if(o&&i.length>0)throw Error("slackChannel().receive: `threadTs` and `initialMessage` are mutually exclusive.");let s=i;if(o){let{thread:e}=buildSlackBinding({botToken:t.credentials?.botToken,channelId:r,threadTs:``,installationTeamId:a,teamId:t.teamId}),n={card:o.card};o.fallbackText!==void 0&&(n.fallbackText=o.fallbackText),s=(await e.post(n)).id}let c=s||crypto.randomUUID(),l=n.audience===void 0?void 0:normalizeChannelAudience(n.audience),u={channelId:r,installationTeamId:a??null,threadTs:s||null,teamId:t.teamId??null,triggeringUserId:t.triggeringUserId??null};return l!==void 0&&(u.audience=l),t.from(slackContinuationToken(r,c)).send(e.message,{auth:e.auth,state:u,title:e.title,taskDeliveryPolicy:e.taskDeliveryPolicy})}function constrainAuthorizationRequired(e){return(t,n,r)=>e(t,{postEphemeral:(e,t)=>n.thread.postEphemeral(e,t),postDirectMessage:(e,t)=>n.thread.postDirectMessage(e,t),state:n.state},r)}function shouldDropSlackHttpTimeoutRetry(e){return Number(e.get(`x-slack-retry-num`)??`0`)>=1&&e.get(`x-slack-retry-reason`)===`http_timeout`}async function handleEventPost(e){let{config:t}=e,n,r;try{n=parseSlackWebhookBody(e.body,{headers:e.headers}),r=parseSlackEventEnvelope(e.body)}catch(e){return log.warn(`inbound webhook body is not valid JSON`,{error:e}),new Response(`ok`)}if(n.kind===`url_verification`)return new Response(n.challenge,{status:200,headers:{"content-type":`text/plain`}});if(r===null)return new Response(`ok`);let i=typeof r.api_app_id==`string`?r.api_app_id:void 0,a=slackEventBotUserId(r),o=slackEventReceivingBotUserId(r),s=slackEventInstallationTeamId(r),dispatch=null,c=null;if(n.kind===`app_mention`||n.kind===`direct_message`){let r=n.kind,l=slackMessageFromWebhookPayload(n);if(l!==null&&!isSelfAuthoredSlackMessage({appId:i,botUserId:a},l)){let dispatchMessageWith=n=>()=>dispatchSlackMessage({appId:i,botUserId:a,receivingBotUserId:o,from:e.from,resolveSession:e.resolveSession,credentials:t.credentials,handler:n,installationTeamId:s,kind:r,message:l,threadContext:t.threadContext,uploadPolicy:e.uploadPolicy}),n=(r===`app_mention`?t.onAppMention:t.onDirectMessage)??t.onMessage;n===void 0?c=dispatchMessageWith(r===`app_mention`?defaultOnAppMention:defaultOnDirectMessage):dispatch=()=>dispatchSlackMessage({appId:i,botUserId:a,receivingBotUserId:o,from:e.from,resolveSession:e.resolveSession,credentials:t.credentials,handler:n,installationTeamId:s,kind:r,message:l,threadContext:t.threadContext,uploadPolicy:e.uploadPolicy})}}if(dispatch===null&&t.onMessage!==void 0){let n=parseMessageEvent(r);n!==null&&!isSelfAuthoredSlackMessage({appId:i,botUserId:a},n)&&(a===void 0||!n.text.includes(`<@${a}`))&&(dispatch=()=>dispatchSlackMessage({appId:i,botUserId:a,receivingBotUserId:o,from:e.from,resolveSession:e.resolveSession,credentials:t.credentials,handler:t.onMessage,installationTeamId:s,kind:`channel_message`,message:n,threadContext:t.threadContext,uploadPolicy:e.uploadPolicy}))}let l=t.onEvent;if(dispatch===null&&l!==void 0&&(dispatch=()=>dispatchSlackEvent({from:e.from,resolveSession:e.resolveSession,credentials:t.credentials,envelope:r,handler:l,installationTeamId:s})),dispatch??=c,dispatch===null)return new Response(`ok`);let u=r.event_id;if(u){if(e.handledEvents.has(u))return log.warn(`received a duplicate event`,{event_id:u,event_time:r.event_time,retry_num:n.retry?.num??`(null)`,retry_reason:n.retry?.reason??`(null)`}),new Response(`ok`);markEventHandled(u,e.handledEvents)}return e.waitUntil(dispatch()),new Response(`ok`)}function isSelfAuthoredSlackMessage(e,t){return e.botUserId!==void 0&&t.author?.userId===e.botUserId||e.appId!==void 0&&t.raw.app_id===e.appId}async function dispatchSlackMessage(e){let t=slackContinuationToken(e.message.channelId,e.message.threadTs),{thread:n,slack:r}=buildSlackBinding({appId:e.appId,botToken:e.credentials?.botToken,botUserId:e.botUserId,channelId:e.message.channelId,threadTs:e.message.threadTs,installationTeamId:e.installationTeamId,teamId:e.message.teamId}),i=e.message.author,a={channelId:e.message.channelId,installationTeamId:e.installationTeamId??null,teamId:e.message.teamId??null,threadTs:e.message.threadTs,triggeringMessageTs:e.message.ts,triggeringUserId:i?.userId??null},o=bindSlackSessionOperations({address:t,defaultAuth:i===void 0?null:buildSlackAuthContext({channelId:e.message.channelId,fullName:i.fullName,isBot:i.isBot,teamId:e.message.teamId,threadTs:e.message.threadTs,userId:i.userId,userName:i.userName}),from:e.from,resolveSession:e.resolveSession,state:a}),s,isDMOrPrivateChannel=()=>s??=isPrivateSlackConversation({channelId:e.message.channelId,raw:e.message.raw,request:r.request}),c=e.kind===`app_mention`||e.botUserId!==void 0&&e.message.text.includes(`<@${e.botUserId}`),l={...o,isBotMentioned:()=>c,isDMOrPrivateChannel,isSubscribed:async()=>await o.resolveSession()!==void 0,slack:r,thread:n},u;try{u=await e.handler(l,e.message)}catch(t){logError(log,`${e.kind} handler failed`,t,{channelId:e.message.channelId});return}if(u==null)return;let d=await isDMOrPrivateChannel();a.audience=e.kind===`direct_message`||d?`private`:`public`,await deliverSlackMessage({botUserId:e.receivingBotUserId,credentials:e.credentials,kind:e.kind,isPrivateConversation:d,isMentioned:c,message:e.message,result:u,sessionOperations:o,thread:n,threadContext:e.threadContext,uploadPolicy:e.uploadPolicy})}async function dispatchSlackEvent(e){let t=e.envelope.event.team_id,n=typeof t==`string`?t:typeof e.envelope.team_id==`string`?e.envelope.team_id:void 0,r=[],sourceFor=t=>e.from(slackContinuationToken(t.channelId,t.threadTs)),i={cancel:({target:e,turnId:t})=>sourceFor(e).cancel({turnId:t}),clear:({target:e})=>sourceFor(e).clear(),compact:({target:e})=>sourceFor(e).compact(),envelope:e.envelope,reset:({reason:e,target:t})=>sourceFor(t).reset({reason:e}),resolveSession:({target:t})=>e.resolveSession(slackContinuationToken(t.channelId,t.threadTs)),respond:(e,{auth:t,target:n})=>sourceFor(n).respond(e,{auth:t}),send:(t,{auth:r,target:i,title:a,taskDeliveryPolicy:o})=>receiveOnSlack({auth:r,message:t,target:i,title:a,taskDeliveryPolicy:o},{from:e.from,credentials:e.credentials,installationTeamId:e.installationTeamId,teamId:n,...typeof e.envelope.event.user==`string`?{triggeringUserId:e.envelope.event.user}:{}}),slack:buildSlackWorkspaceHandle({botToken:e.credentials?.botToken,installationTeamId:e.installationTeamId,teamId:n}),waitUntil(e){r.push(e)}};try{await e.handler(i,e.envelope.event)}catch(t){logError(log,`event handler failed`,t,{eventId:e.envelope.event_id,eventType:e.envelope.event.type})}await Promise.allSettled(r)}async function verifyInbound(e,t){try{return await verifySlackRequest$1(e,{signingSecret:t?.signingSecret??(t?.webhookVerifier?void 0:process.env.SLACK_SIGNING_SECRET),webhookVerifier:t?.webhookVerifier})}catch(e){return log.warn(`slack inbound verification failed`,{error:e}),null}}async function deliverSlackMessage(e){let{message:t,thread:n}=e;try{let r=e.threadContext===void 0?[]:await loadThreadContextMessages(n,t,e.threadContext),i=formatSlackThreadContext(r),a=await collectInboundFileParts({mention:t,thread:n,policy:e.uploadPolicy}),o={botUserId:e.botUserId,channelId:t.channelId,fullName:t.author?.fullName,isMentioned:e.isMentioned,teamId:t.teamId,threadTs:t.threadTs,userId:t.author?.userId??``,userName:t.author?.userName},s=formatSlackInboundMessage(o,t),c=buildSlackTurnMessage(i===void 0?s:`${i}\n\n${s}`,a),l=e.result.context??[],u=e.isPrivateConversation?`Private message`:e.result.title??t.markdown,d=l.length===0?{auth:e.result.auth,title:u}:{auth:e.result.auth,context:l,title:u};await e.sessionOperations.send(c,d)}catch(n){logError(log,`${e.kind} delivery failed`,n,{channelId:t.channelId})}}export{constrainAuthorizationRequired,slackChannel};
@@ -8,7 +8,7 @@ import type { UnstampedMessageStreamEvent } from "#protocol/message.js";
8
8
  import type { SessionContext } from "#public/definitions/callback-context.js";
9
9
  import type { GenericChannelDefinition, GenericReceiveInput } from "#shared/channel-definition.js";
10
10
  declare const CHANNEL_METADATA_TYPE: unique symbol;
11
- export type { CancelTurnResult, ClearSessionResult, CompactSessionResult, GetEventStreamOptions, ResetSessionResult, SessionCallback, TurnPolicy, } from "#channel/types.js";
11
+ export type { CancelTurnResult, ClearSessionResult, CompactSessionResult, GetEventStreamOptions, ResetSessionResult, SessionCallback, TurnPolicy, TaskDeliveryPolicy, } from "#channel/types.js";
12
12
  export type { Session, SessionHandle } from "#channel/session.js";
13
13
  export type { ChannelAudience } from "#shared/channel-audience.js";
14
14
  export type { AudienceCaller, AudienceContext, AudienceInput, AudiencePrincipal, ConversationEnvironment, } from "#shared/conversation-context.js";
@@ -1,43 +1,5 @@
1
- import type { Optional } from "#shared/optional.js";
2
- import type { SandboxDefinitionWithBootstrap as SharedSandboxDefinitionWithBootstrap, SandboxDefinitionWithoutBootstrap as SharedSandboxDefinitionWithoutBootstrap } from "#shared/sandbox-definition.js";
3
- export type { SandboxCommandResult, SandboxProcess, SandboxReadBinaryFileOptions, SandboxReadFileOptions, SandboxRemovePathOptions, SandboxReadTextFileOptions, SandboxRunOptions, SandboxSession, RuntimeSandboxSession, SandboxSpawnOptions, SandboxWriteBinaryFileOptions, SandboxWriteFileOptions, SandboxWriteTextFileOptions, } from "#shared/sandbox-session.js";
4
- export type { SandboxBootstrapUseFn, SandboxRevalidationKeyFn, SandboxSessionUseFn, SandboxBootstrapContext, SandboxSessionContext, } from "#shared/sandbox-definition.js";
5
- /** Opaque reference to an ancestor's durable sandbox. */
6
- export interface SandboxAncestorReference {
7
- readonly sandbox: SandboxParentValue;
8
- }
9
- /**
10
- * Opaque value returned from a sandbox definition to select its parent's
11
- * durable sandbox. It intentionally exposes no provider operations: authored
12
- * code can only return it to eve.
13
- */
14
- export interface SandboxParentValue {
15
- readonly __eveSandboxParentValue: unique symbol;
16
- }
17
- /** Runtime ancestry passed to a parent-selecting sandbox definition. */
18
- export interface SandboxParentDefinitionContext {
19
- readonly parent: SandboxAncestorReference | null;
20
- }
21
- /** A definition that selects the dispatching parent's exact sandbox. */
22
- export type SandboxParentDefinition = (context: SandboxParentDefinitionContext) => SandboxParentValue | Promise<SandboxParentValue>;
23
- /**
24
- * The shape passed to {@link defineSandbox}: a discriminated union over
25
- * whether a `bootstrap` hook is present. `backend` is optional here (it is
26
- * required on the shared base): when omitted, eve substitutes
27
- * `defaultBackend()` at runtime. `BO`/`SO` type the options for the
28
- * bootstrap-use and session-use functions respectively.
29
- */
30
- export type SandboxDefinition<BO = Record<string, never>, SO = Record<string, never>> = Optional<SharedSandboxDefinitionWithBootstrap<BO, SO>, "backend"> | Optional<SharedSandboxDefinitionWithoutBootstrap<BO, SO>, "backend">;
31
- /**
32
- * Defines the sandbox an agent (or subagent) runs in. Authored at the
33
- * path-derived location `agent/sandbox.ts` (or `agent/sandbox/sandbox.ts`
34
- * when paired with a `workspace/` folder); subagents use
35
- * `subagents/<name>/sandbox.ts`.
36
- *
37
- * Pass an object to define an independent sandbox. Passing a callback to
38
- * `defineSandbox` opts into sharing: return `parent.sandbox` to select the
39
- * dispatching parent's exact durable sandbox. It is intended for child-only
40
- * definitions; throw when `parent` is `null`.
41
- */
42
- export declare function defineSandbox(definition: SandboxParentDefinition): SandboxParentDefinition;
43
- export declare function defineSandbox<BO = Record<string, never>, SO = Record<string, never>>(definition: SandboxDefinition<BO, SO>): SandboxDefinition<BO, SO>;
1
+ import type { SandboxSelector } from "#shared/sandbox-environment.js";
2
+ export type { SandboxCommandResult, SandboxProcess, SandboxReadBinaryFileOptions, SandboxReadFileOptions, SandboxRemovePathOptions, SandboxReadTextFileOptions, FixedNetworkSandboxSession, MutableNetworkSandboxSession, SandboxRunOptions, SandboxSession, RuntimeSandboxSession, RuntimeSandboxSessionFor, SandboxSpawnOptions, SandboxWriteBinaryFileOptions, SandboxWriteFileOptions, SandboxWriteTextFileOptions, } from "#shared/sandbox-session.js";
3
+ export type { SandboxOpenArguments, SandboxEnvironment, SandboxSelector, SandboxSelectorContext, } from "#shared/sandbox-environment.js";
4
+ export declare function defineSandbox(definition: SandboxSelector): SandboxSelector;
5
+ export declare function defineParentSandbox(): SandboxSelector;
@@ -1 +1 @@
1
- const SANDBOX_PARENT_DEFINITION_MARKER=Symbol.for(`eve.sandbox-parent-definition`);function defineSandbox(e){return typeof e==`function`&&Object.defineProperty(e,SANDBOX_PARENT_DEFINITION_MARKER,{value:!0}),e}export{defineSandbox};
1
+ const SELECTOR=Symbol.for(`eve.sandbox-selector`),PARENT=Symbol.for(`eve.sandbox-parent-definition`);function defineSandbox(e){return Object.defineProperty(e,SELECTOR,{value:!0}),e}function defineParentSandbox(){let e=defineSandbox(async()=>{throw Error(`Parent sandbox selection is resolved by eve.`)});return Object.defineProperty(e,PARENT,{value:!0}),e}export{defineParentSandbox,defineSandbox};
@@ -1,9 +1,8 @@
1
1
  /**
2
- * Runtime capabilities available to authored code handling a same-machine
3
- * request to `eve dev`.
2
+ * Host facilities available to authored code running on an `eve dev` server.
4
3
  *
5
- * A deployed runtime and a client attached to a development server over the
6
- * network receive `undefined`. A local TUI attached to an existing headless
7
- * server receives the capability because authorization follows its requests.
4
+ * The capability is present when the executing host owns the authored root and
5
+ * watcher control origin. It is unavailable in deployed runtimes and does not
6
+ * vary by request or peer address.
8
7
  */
9
8
  export { getLocalDevCapability, type LocalDevCapability } from "#runtime/local-dev-capability.js";
@@ -1,46 +1,22 @@
1
- /**
2
- * Image pull behavior for the Docker sandbox backend.
3
- *
4
- * - `"if-not-present"` (default): pull the base image only when it is
5
- * missing from the local image store.
6
- * - `"always"`: pull before every template build so the image floats to
7
- * the registry's latest digest.
8
- * - `"never"`: never pull; fail when the image is missing locally.
9
- */
1
+ import type { SandboxSession } from "#shared/sandbox-session.js";
2
+ import type { SandboxNetworkOptions, SandboxNetworkPolicy } from "#shared/sandbox-network-policy.js";
3
+ /** Image pull behavior for Docker sandbox environments. */
10
4
  export type DockerSandboxPullPolicy = "if-not-present" | "always" | "never";
11
- /**
12
- * Initial network policy for sandboxes created by the Docker backend.
13
- * Docker supports coarse-grained egress control only: `"allow-all"`
14
- * attaches the container to the default bridge network, `"deny-all"`
15
- * runs it with networking disabled. Domain-level policies and
16
- * credential brokering require `vercel()`.
17
- */
18
- export type DockerSandboxNetworkPolicy = "allow-all" | "deny-all";
19
- /**
20
- * Options accepted by `docker(opts)`.
21
- */
22
- export interface DockerSandboxCreateOptions {
23
- /**
24
- * Base container image for templates and sessions. Defaults to eve's
25
- * published `ghcr.io/vercel/eve` image, tagged with the installed eve
26
- * version without build metadata or `EVE_SANDBOX_IMAGE_TAG` when set. Framework setup creates
27
- * `/workspace` and verifies Bash. Install
28
- * any authored runtime tools in sandbox bootstrap or provide them through a
29
- * custom image.
30
- */
5
+ /** Coarse-grained egress policy for one live Docker sandbox. */
6
+ export type DockerSandboxNetworkPolicy = Extract<SandboxNetworkPolicy, "allow-all" | "deny-all">;
7
+ /** Options shared by every sandbox created from one Docker environment. */
8
+ export interface DockerSandboxEnvironmentOptions {
9
+ /** Base container image. Defaults to eve's published sandbox image. */
31
10
  readonly image?: string;
32
- /**
33
- * Environment variables baked into every container the backend
34
- * creates (template builds and sessions).
35
- */
11
+ /** Environment variables baked into template builds and live containers. */
36
12
  readonly env?: Readonly<Record<string, string>>;
37
- /**
38
- * Base image pull behavior. Defaults to `"if-not-present"`.
39
- */
13
+ /** Base image pull behavior. @default "if-not-present" */
40
14
  readonly pullPolicy?: DockerSandboxPullPolicy;
41
- /**
42
- * Initial network policy for created containers. Defaults to
43
- * `"allow-all"`.
44
- */
15
+ /** Idempotent setup captured in the prepared image. */
16
+ readonly prepare?: (sandbox: SandboxSession) => Promise<void> | void;
17
+ }
18
+ /** Options applied when eve creates one live Docker sandbox. */
19
+ export interface DockerSandboxRuntimeOptions extends SandboxNetworkOptions {
20
+ /** Initial network policy for this container. @default "allow-all" */
45
21
  readonly networkPolicy?: DockerSandboxNetworkPolicy;
46
22
  }
@@ -1,2 +1,2 @@
1
- export { docker } from "#public/sandbox/backends/docker.js";
2
- export type { DockerSandboxCreateOptions, DockerSandboxNetworkPolicy, DockerSandboxPullPolicy, } from "#public/sandbox/docker-sandbox.js";
1
+ export { DockerSandbox, type DockerSandboxEnvironmentOptions, type DockerSandboxRuntimeOptions, } from "#sandbox/providers/docker.js";
2
+ export type { DockerSandboxNetworkPolicy, DockerSandboxPullPolicy, } from "#public/sandbox/docker-sandbox.js";
@@ -1 +1 @@
1
- import{docker}from"#public/sandbox/backends/docker.js";export{docker};
1
+ import{DockerSandbox}from"#sandbox/providers/docker.js";export{DockerSandbox};
@@ -1,9 +1,4 @@
1
- /**
2
- * Sandbox authoring helpers for `agent/sandbox.ts` (or
3
- * `agent/sandbox/sandbox.ts` when paired with a `workspace/` folder).
4
- */
5
- export { defineSandbox, type SandboxAncestorReference, type SandboxBootstrapContext, type SandboxBootstrapUseFn, type SandboxCommandResult, type SandboxDefinition, type SandboxParentDefinition, type SandboxParentDefinitionContext, type SandboxParentValue, type SandboxProcess, type SandboxReadBinaryFileOptions, type SandboxReadFileOptions, type SandboxReadTextFileOptions, type SandboxRevalidationKeyFn, type SandboxRunOptions, type SandboxSession, type RuntimeSandboxSession, type SandboxSpawnOptions, type SandboxSessionContext, type SandboxSessionUseFn, type SandboxWriteBinaryFileOptions, type SandboxWriteFileOptions, type SandboxWriteTextFileOptions, } from "#public/definitions/sandbox.js";
6
- export type { SandboxBackend, SandboxBackendCreateInput, SandboxBackendHandle, SandboxBackendPrewarmInput, SandboxBackendRuntimeContext, SandboxBackendSessionState, SandboxDeleteOptions, SandboxSeedFile, } from "#public/definitions/sandbox-backend.js";
7
- export type { SandboxNetworkPolicy } from "#shared/sandbox-network-policy.js";
8
- export { SandboxTemplateNotProvisionedError } from "#public/definitions/sandbox-backend.js";
9
- export { defaultSandbox as defaultBackend, type DefaultSandboxOptions as DefaultBackendOptions, } from "#public/sandbox/backends/default.js";
1
+ export { defineParentSandbox, defineSandbox, type SandboxOpenArguments, type SandboxEnvironment, type SandboxSelector, type SandboxSelectorContext, type SandboxCommandResult, type FixedNetworkSandboxSession, type MutableNetworkSandboxSession, type SandboxProcess, type SandboxReadBinaryFileOptions, type SandboxReadFileOptions, type SandboxReadTextFileOptions, type SandboxRunOptions, type SandboxSession, type RuntimeSandboxSession, type RuntimeSandboxSessionFor, type SandboxSpawnOptions, type SandboxWriteBinaryFileOptions, type SandboxWriteFileOptions, type SandboxWriteTextFileOptions, } from "#public/definitions/sandbox.js";
2
+ export { DefaultSandbox } from "#sandbox/providers/default.js";
3
+ export type { DefaultSandboxEnvironmentOptions } from "#sandbox/providers/default.js";
4
+ export type { SandboxNetworkOptions, SandboxNetworkPolicy, } from "#shared/sandbox-network-policy.js";
@@ -1 +1 @@
1
- import{SandboxTemplateNotProvisionedError}from"#public/definitions/sandbox-backend.js";import{defineSandbox}from"#public/definitions/sandbox.js";import{defaultSandbox as defaultBackend}from"#public/sandbox/backends/default.js";export{SandboxTemplateNotProvisionedError,defaultBackend,defineSandbox};
1
+ import{defineParentSandbox,defineSandbox}from"#public/definitions/sandbox.js";import{DefaultSandbox}from"#sandbox/providers/default.js";export{DefaultSandbox,defineParentSandbox,defineSandbox};
@@ -1,19 +1,22 @@
1
1
  import type { CustomCommand, IFileSystem } from "just-bash";
2
+ import type { SandboxSession } from "#shared/sandbox-session.js";
2
3
  /**
3
4
  * Context passed to a custom just-bash filesystem factory for each live handle.
4
5
  */
5
6
  export interface JustBashFilesystemContext {
6
- /** Stable application root for this backend create call. */
7
- readonly appRoot: string;
7
+ /** Resolves an application-relative path without exposing project layout. */
8
+ resolveProjectPath(path: string): string;
9
+ /** Stable provider-private storage directory for this sandbox. */
10
+ readonly storagePath: string;
8
11
  /** eve's durable, session-owned filesystem, including `/workspace`. */
9
12
  readonly defaultFilesystem: IFileSystem;
10
13
  /** The just-bash engine resolved by eve after its optional installation check. */
11
14
  readonly justBash: typeof import("just-bash");
12
15
  }
13
16
  /**
14
- * Options accepted by `justbash(opts)`.
17
+ * Options accepted by just-bash environment constructors.
15
18
  *
16
- * The just-bash backend runs the workspace under the pure-JS `just-bash`
19
+ * The just-bash provider runs the workspace under the pure-JS `just-bash`
17
20
  * interpreter with a virtual filesystem — no daemon or VM required, but
18
21
  * no real binaries either. The `just-bash` package is not bundled with
19
22
  * eve; it is loaded lazily from the application install.
@@ -31,7 +34,7 @@ export interface JustBashSandboxCreateOptions {
31
34
  * just-bash interpreter. Custom commands can participate in normal shell
32
35
  * composition, including pipelines and redirections.
33
36
  *
34
- * Custom commands are not available during template prewarming. They run in
37
+ * Custom commands are not available during environment preparation. They run in
35
38
  * eve's host process, outside the virtual filesystem security boundary, and
36
39
  * are responsible for validating their own inputs and cleaning up host
37
40
  * resources.
@@ -45,7 +48,9 @@ export interface JustBashSandboxCreateOptions {
45
48
  *
46
49
  * This just-bash-specific escape hatch requires the application to install
47
50
  * a compatible `just-bash` version. It is not invoked during template
48
- * prewarming.
51
+ * preparation.
49
52
  */
50
53
  readonly filesystem?: (context: JustBashFilesystemContext) => IFileSystem | Promise<IFileSystem>;
54
+ /** Idempotent setup captured in the prepared virtual filesystem. */
55
+ readonly prepare?: (sandbox: SandboxSession) => Promise<void> | void;
51
56
  }
@@ -1,2 +1,2 @@
1
- export { justbash } from "#public/sandbox/backends/just-bash.js";
2
- export type { JustBashFilesystemContext, JustBashSandboxCreateOptions, } from "#public/sandbox/just-bash-sandbox.js";
1
+ export { JustBashSandbox, type JustBashEnvironmentOptions } from "#sandbox/providers/just-bash.js";
2
+ export type { JustBashFilesystemContext } from "#public/sandbox/just-bash-sandbox.js";
@@ -1 +1 @@
1
- import{justbash}from"#public/sandbox/backends/just-bash.js";export{justbash};
1
+ import{JustBashSandbox}from"#sandbox/providers/just-bash.js";export{JustBashSandbox};
@@ -1,8 +1,9 @@
1
- import type { SandboxNetworkPolicy } from "#shared/sandbox-network-policy.js";
1
+ import type { SandboxSession } from "#shared/sandbox-session.js";
2
+ import type { SandboxNetworkOptions, SandboxNetworkPolicy } from "#shared/sandbox-network-policy.js";
2
3
  /**
3
- * Options accepted by `microsandbox(opts)`.
4
+ * Options accepted by microsandbox environment constructors.
4
5
  *
5
- * The microsandbox backend runs sandboxes in lightweight local VMs via
6
+ * The microsandbox provider runs sandboxes in lightweight local VMs via
6
7
  * [microsandbox](https://www.npmjs.com/package/microsandbox). Options
7
8
  * are eve-owned rather than a raw passthrough so the public surface can
8
9
  * stay stable while the underlying runtime evolves. Supported hosts:
@@ -12,8 +13,8 @@ export interface MicrosandboxSandboxCreateOptions {
12
13
  /**
13
14
  * OCI image used as the base runtime. eve prepares this image with
14
15
  * Bash, the framework workspace, and the sandbox user before authored
15
- * bootstrap code runs. Install authored runtime tools such as Node,
16
- * Python, or ripgrep in sandbox bootstrap or provide them through a
16
+ * environment preparation runs. Install authored runtime tools such as Node,
17
+ * Python, or ripgrep during preparation or provide them through a
17
18
  * custom image.
18
19
  *
19
20
  * @default The `ghcr.io/vercel/eve` tag matching the installed eve version without build metadata, or `EVE_SANDBOX_IMAGE_TAG` when set.
@@ -27,6 +28,8 @@ export interface MicrosandboxSandboxCreateOptions {
27
28
  readonly env?: Readonly<Record<string, string>>;
28
29
  /** OCI image pull policy. @default "if-missing" */
29
30
  readonly pullPolicy?: "always" | "if-missing" | "never";
31
+ /** Idempotent setup captured in the prepared VM snapshot. */
32
+ readonly prepare?: (sandbox: SandboxSession) => Promise<void> | void;
30
33
  /**
31
34
  * Installation behavior for the microsandbox npm package and its VM
32
35
  * runtime. By default eve installs both automatically when missing —
@@ -37,18 +40,9 @@ export interface MicrosandboxSandboxCreateOptions {
37
40
  readonly autoInstall?: boolean;
38
41
  readonly skipVerify?: boolean;
39
42
  };
40
- /** Initial network policy applied to sandboxes after framework setup. */
41
- readonly networkPolicy?: SandboxNetworkPolicy;
42
43
  }
43
- /**
44
- * Options accepted by the microsandbox backend's `bootstrap({ use })` hook.
45
- */
46
- export interface MicrosandboxBootstrapUseOptions {
47
- readonly networkPolicy?: SandboxNetworkPolicy;
48
- }
49
- /**
50
- * Options accepted by the microsandbox backend's `onSession({ use })` hook.
51
- */
52
- export interface MicrosandboxSessionUseOptions {
44
+ /** Options applied when eve creates one live microsandbox VM. */
45
+ export interface MicrosandboxSandboxRuntimeOptions extends SandboxNetworkOptions {
46
+ /** Initial network policy for this VM. @default "allow-all" */
53
47
  readonly networkPolicy?: SandboxNetworkPolicy;
54
48
  }
@@ -1,2 +1,2 @@
1
- export { microsandbox } from "#public/sandbox/backends/microsandbox.js";
2
- export type { MicrosandboxBootstrapUseOptions, MicrosandboxSandboxCreateOptions, MicrosandboxSessionUseOptions, } from "#public/sandbox/microsandbox-sandbox.js";
1
+ export { MicrosandboxSandbox, type MicrosandboxEnvironmentOptions, } from "#sandbox/providers/microsandbox.js";
2
+ export type { MicrosandboxSandboxRuntimeOptions } from "#public/sandbox/microsandbox-sandbox.js";
@@ -1 +1 @@
1
- import{microsandbox}from"#public/sandbox/backends/microsandbox.js";export{microsandbox};
1
+ import{MicrosandboxSandbox}from"#sandbox/providers/microsandbox.js";export{MicrosandboxSandbox};
@@ -0,0 +1 @@
1
+ export { defineSandboxProvider, type SandboxDeleteOptions, type SandboxPreparedArtifact, type SandboxProvider, type SandboxProviderDefinition, type SandboxProviderFiles, type SandboxProviderHandle, type SandboxProviderImplementation, type SandboxProviderPrepareContext, type SandboxProviderResourceFile, type SandboxProviderResources, type SandboxProviderResourceSource, type SandboxProviderResourceTree, type SandboxProviderSessionContext, type SandboxProviderTargetFile, } from "#shared/sandbox-provider.js";
@@ -0,0 +1 @@
1
+ import{defineSandboxProvider}from"#shared/sandbox-provider.js";export{defineSandboxProvider};
@@ -1,19 +1,19 @@
1
1
  import type * as Vercel from "#compiled/@vercel/sandbox/index.js";
2
+ import type { SandboxNetworkOptions } from "#shared/sandbox-network-policy.js";
2
3
  type VercelCreateOptions = NonNullable<Parameters<typeof Vercel.Sandbox.create>[0]>;
3
- type VercelUpdateOptions = Parameters<Vercel.Sandbox["update"]>[0];
4
4
  type VercelSandboxInternalCreateOptions = {
5
5
  readonly [key: `__${string}`]: unknown;
6
6
  };
7
7
  type VercelSandboxAuthorCreateOptions<T> = T extends unknown ? Omit<T, "mounts" | "name" | "onResume" | "persistent" | "runtime" | "signal"> & VercelSandboxInternalCreateOptions : never;
8
8
  /**
9
- * Options accepted by `vercel(opts)`. Forwarded to Vercel
9
+ * Options accepted by Vercel sandbox environment constructors. Forwarded to Vercel
10
10
  * Sandbox creation for every fresh sandbox the framework creates
11
- * (template at prewarm time, session at first-time session-create).
11
+ * (template during preparation, session at first creation).
12
12
  * Skipped on resume (`Sandbox.get`) since no create happens there.
13
13
  *
14
14
  * `networkPolicy` is deferred until after framework-owned base setup
15
15
  * for fresh templates and template-less sessions, so eve can install
16
- * required packages before authored bootstrap code runs. Template-backed
16
+ * required packages before authored environment preparation runs. Template-backed
17
17
  * session creates receive it at creation time because the template
18
18
  * already contains the prepared base runtime.
19
19
  *
@@ -22,7 +22,7 @@ type VercelSandboxAuthorCreateOptions<T> = T extends unknown ? Omit<T, "mounts"
22
22
  * author-supplied values.
23
23
  *
24
24
  * `runtime` is excluded: eve defaults to its published
25
- * `vcr.vercel.com/vercel/eve/base` image tagged with the installed eve version without build metadata
25
+ * `vcr.vercel.com/vercel/eve/base` image tagged with the installed eve version
26
26
  * or `EVE_SANDBOX_IMAGE_TAG` when `image` is not supplied. Both are mutually
27
27
  * exclusive with a stock runtime.
28
28
  *
@@ -30,9 +30,9 @@ type VercelSandboxAuthorCreateOptions<T> = T extends unknown ? Omit<T, "mounts"
30
30
  * snapshot `source` takes precedence because the Vercel SDK makes it mutually
31
31
  * exclusive with `image`.
32
32
  *
33
- * `source` is honored only on the template create at prewarm time, so
33
+ * `source` is honored only on the template creation during preparation, so
34
34
  * an author-supplied snapshot, git revision, or tarball becomes the
35
- * base layer for the template. Framework setup, bootstrap, and seed
35
+ * base layer for the template. Framework setup, preparation, and seed
36
36
  * files all run on top, and the resulting
37
37
  * framework-owned snapshot is what every later session derives from,
38
38
  * so `source` is stripped from the session-create path. eve does not
@@ -48,40 +48,9 @@ export type VercelSandboxMount = Vercel.SandboxMounts[string];
48
48
  /** Drive mounts keyed by absolute sandbox path. */
49
49
  export type VercelSandboxMounts = Vercel.SandboxMounts;
50
50
  /** Options resolved when eve creates a fresh live session sandbox. */
51
- export interface VercelSandboxSessionCreateOptions {
51
+ export interface VercelSandboxMountOptions {
52
52
  readonly mounts?: VercelSandboxMounts;
53
53
  }
54
- /** Context available while resolving fresh live-session creation options. */
55
- export interface VercelSandboxSessionCreateContext {
56
- readonly session: {
57
- readonly id: string;
58
- };
59
- }
60
- /** Options accepted by `vercel(opts)`. */
61
- export type VercelSandboxOptions = VercelSandboxCreateOptions & {
62
- /**
63
- * Resolves options that apply only to fresh live sessions. It is not called
64
- * while prewarming templates or resuming an existing sandbox.
65
- */
66
- readonly sessionCreateOptions?: (context: VercelSandboxSessionCreateContext) => Promise<VercelSandboxSessionCreateOptions> | VercelSandboxSessionCreateOptions;
67
- };
68
- /**
69
- * Options accepted by the Vercel backend's `bootstrap({ use })` hook.
70
- * Tracks the Vercel SDK's `Sandbox.update(...)` parameter because bootstrap
71
- * applies its options to the template via `sandbox.update(...)` after
72
- * `Sandbox.create()` and before the snapshot is captured. The Vercel
73
- * SDK persists `update`-d settings on the sandbox so they survive into
74
- * the snapshot, which becomes the seed for every later session.
75
- *
76
- * Today this is the same shape as
77
- * {@link VercelSandboxSessionUseOptions}; both are exposed as separate
78
- * named aliases so future divergence is non-breaking.
79
- */
80
- export type VercelSandboxBootstrapUseOptions = VercelUpdateOptions;
81
- /**
82
- * Options accepted by the Vercel backend's `onSession({ use })` hook.
83
- * Tracks the Vercel SDK's `Sandbox.update(...)` parameter; passed values are
84
- * applied to the live session via the SDK's `update`.
85
- */
86
- export type VercelSandboxSessionUseOptions = VercelUpdateOptions;
54
+ /** Options accepted when creating one live Vercel sandbox from an environment. */
55
+ export type VercelSandboxRuntimeOptions = Omit<VercelSandboxCreateOptions, "fetch" | "image" | "projectId" | "source" | "tags" | "teamId" | "token"> & SandboxNetworkOptions & VercelSandboxMountOptions;
87
56
  export {};