eve 0.82.0 → 0.83.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/NOTICE +1 -1
  3. package/dist/src/channel/pending-authorization.d.ts +5 -0
  4. package/dist/src/channel/pending-authorization.js +1 -1
  5. package/dist/src/channel/session.d.ts +2 -0
  6. package/dist/src/channel/session.js +1 -1
  7. package/dist/src/channel/types.d.ts +5 -0
  8. package/dist/src/chunks/{use-eve-agent-DTu78IAF.js → use-eve-agent-DnbG9c7c.js} +73 -14
  9. package/dist/src/chunks/{use-eve-agent-DlznYwQk.js → use-eve-agent-ZY7NQ2VW.js} +73 -14
  10. package/dist/src/cli/dev/local-server-child.js +1 -1
  11. package/dist/src/cli/dev/local-server-cleanup.js +1 -1
  12. package/dist/src/cli/dev/tui/question-panel.d.ts +4 -1
  13. package/dist/src/cli/dev/tui/question-panel.js +1 -1
  14. package/dist/src/cli/dev/tui/terminal-renderer.js +4 -4
  15. package/dist/src/cli/run.js +1 -1
  16. package/dist/src/client/eve-agent-store.d.ts +1 -1
  17. package/dist/src/client/eve-agent-store.js +1 -1
  18. package/dist/src/client/index.d.ts +1 -0
  19. package/dist/src/client/message-response.d.ts +18 -0
  20. package/dist/src/client/message-response.js +1 -1
  21. package/dist/src/client/session-controls.d.ts +6 -0
  22. package/dist/src/client/session-controls.js +1 -1
  23. package/dist/src/client/session.d.ts +4 -0
  24. package/dist/src/client/session.js +1 -1
  25. package/dist/src/compiled/.vendor-stamp.json +8 -8
  26. package/dist/src/compiled/@eve/catalog/index.js +1 -1
  27. package/dist/src/compiled/@workflow/core/events-consumer.d.ts +2 -0
  28. package/dist/src/compiled/@workflow/core/index.js +2 -2
  29. package/dist/src/compiled/@workflow/core/private.d.ts +5 -3
  30. package/dist/src/compiled/@workflow/core/private.js +1 -1
  31. package/dist/src/compiled/@workflow/core/runtime/constants.d.ts +1 -37
  32. package/dist/src/compiled/@workflow/core/runtime/event-limit-warning.d.ts +32 -0
  33. package/dist/src/compiled/@workflow/core/runtime/helpers.d.ts +5 -6
  34. package/dist/src/compiled/@workflow/core/runtime/helpers.js +1 -1
  35. package/dist/src/compiled/@workflow/core/runtime/runs.d.ts +8 -0
  36. package/dist/src/compiled/@workflow/core/runtime/start.d.ts +16 -0
  37. package/dist/src/compiled/@workflow/core/runtime/suspension-handler.d.ts +15 -18
  38. package/dist/src/compiled/@workflow/core/runtime/vm-mode.d.ts +20 -0
  39. package/dist/src/compiled/@workflow/core/runtime.js +4 -4
  40. package/dist/src/compiled/@workflow/core/seeded-nanoid.d.ts +2 -0
  41. package/dist/src/compiled/@workflow/core/serialization/compression.d.ts +14 -3
  42. package/dist/src/compiled/@workflow/core/serialization.d.ts +1 -1
  43. package/dist/src/compiled/@workflow/core/serialization.js +1 -1
  44. package/dist/src/compiled/@workflow/core/telemetry/semantic-conventions.d.ts +0 -18
  45. package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
  46. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  47. package/dist/src/compiled/@workflow/errors/index.d.ts +48 -0
  48. package/dist/src/compiled/@workflow/errors/index.js +1 -1
  49. package/dist/src/compiled/@workflow/world/env-config.d.ts +24 -0
  50. package/dist/src/compiled/@workflow/world/events.d.ts +126 -7
  51. package/dist/src/compiled/@workflow/world/index.d.ts +3 -3
  52. package/dist/src/compiled/@workflow/world/interfaces.d.ts +59 -8
  53. package/dist/src/compiled/@workflow/world/queue.d.ts +71 -9
  54. package/dist/src/compiled/@workflow/world/recovery.d.ts +6 -0
  55. package/dist/src/compiled/@workflow/world/test-support/duplicate-event-fixtures.d.ts +3 -0
  56. package/dist/src/compiled/@workflow/world/test-support/in-band-fence-conformance.d.ts +46 -0
  57. package/dist/src/compiled/@workflow/world-local/index.js +5 -5
  58. package/dist/src/compiled/@workflow/world-vercel/index.js +18 -18
  59. package/dist/src/compiled/_chunks/workflow/{attribute-changes-BW-kbMMn.js → attribute-changes-7se_SE2q.js} +3 -3
  60. package/dist/src/compiled/_chunks/workflow/dist-CcnNPAp4.js +1 -0
  61. package/dist/src/compiled/_chunks/workflow/dist-S9cZRway.js +3 -0
  62. package/dist/src/compiled/_chunks/workflow/helpers-CxNRXH0a.js +1 -0
  63. package/dist/src/compiled/_chunks/workflow/private-DLYTSBbu.js +1 -0
  64. package/dist/src/compiled/_chunks/workflow/resume-hook-CPiIfe8r.js +1 -0
  65. package/dist/src/compiled/_chunks/workflow/{run-DzdAqdb1.js → run-BJSLCXR4.js} +6 -6
  66. package/dist/src/compiled/_chunks/workflow/serialization-B9gneT9Z.js +15 -0
  67. package/dist/src/compiled/_chunks/workflow/sleep-BL0oQs3R.js +1 -0
  68. package/dist/src/compiled/_chunks/workflow/{wait-until-xbRRDuUf.js → wait-until-BPou0RGO.js} +1 -1
  69. package/dist/src/compiled/_chunks/workflow/workflow-routes-BaljomCk.js +1 -0
  70. package/dist/src/compiled/{@ai-sdk/code-mode → run}/LICENSE +1 -1
  71. package/dist/src/compiled/run/index.d.ts +384 -0
  72. package/dist/src/compiled/run/index.js +650 -0
  73. package/dist/src/compiler/extension-compatibility.d.ts +21 -14
  74. package/dist/src/compiler/extension-compatibility.js +1 -1
  75. package/dist/src/compiler/manifest.js +1 -1
  76. package/dist/src/compiler/normalize-agent-config.js +1 -1
  77. package/dist/src/compiler/normalize-manifest.js +1 -1
  78. package/dist/src/compiler/normalize-sandbox.js +1 -1
  79. package/dist/src/compiler/workspace-resources.js +1 -1
  80. package/dist/src/context/build-callback-context.js +1 -1
  81. package/dist/src/context/build-dynamic-tools.js +1 -1
  82. package/dist/src/context/dynamic-skill-lifecycle.d.ts +2 -2
  83. package/dist/src/context/dynamic-skill-lifecycle.js +1 -1
  84. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  85. package/dist/src/context/prewarm.d.ts +27 -0
  86. package/dist/src/context/prewarm.js +1 -0
  87. package/dist/src/context/providers/sandbox.d.ts +7 -0
  88. package/dist/src/context/providers/sandbox.js +1 -1
  89. package/dist/src/context/run-step.js +1 -1
  90. package/dist/src/discover/extension-specifier.d.ts +1 -0
  91. package/dist/src/discover/extension-specifier.js +1 -1
  92. package/dist/src/discover/lib.d.ts +4 -3
  93. package/dist/src/discover/lib.js +1 -1
  94. package/dist/src/discover/named-source-directory.d.ts +3 -2
  95. package/dist/src/evals/cli/eval.d.ts +2 -0
  96. package/dist/src/evals/cli/eval.js +2 -2
  97. package/dist/src/evals/define-eval-config.d.ts +5 -4
  98. package/dist/src/evals/define-eval-config.js +1 -1
  99. package/dist/src/evals/index.d.ts +1 -1
  100. package/dist/src/evals/runner/artifacts.js +2 -2
  101. package/dist/src/evals/runner/attempt-label.d.ts +2 -0
  102. package/dist/src/evals/runner/attempt-label.js +1 -0
  103. package/dist/src/evals/runner/derive-run-facts.d.ts +12 -0
  104. package/dist/src/evals/runner/derive-run-facts.js +1 -1
  105. package/dist/src/evals/runner/execute-task.js +1 -1
  106. package/dist/src/evals/runner/reporters/braintrust.js +1 -1
  107. package/dist/src/evals/runner/reporters/console.js +1 -1
  108. package/dist/src/evals/runner/reporters/datadog.js +1 -1
  109. package/dist/src/evals/runner/reporters/junit.js +2 -2
  110. package/dist/src/evals/runner/reporters/types.d.ts +2 -0
  111. package/dist/src/evals/runner/run-evals.d.ts +5 -0
  112. package/dist/src/evals/runner/run-evals.js +1 -1
  113. package/dist/src/evals/session-manager.js +1 -1
  114. package/dist/src/evals/session.d.ts +4 -1
  115. package/dist/src/evals/session.js +2 -2
  116. package/dist/src/evals/types.d.ts +39 -2
  117. package/dist/src/eve-channel/index.js +1 -1
  118. package/dist/src/eve-channel/request.d.ts +0 -1
  119. package/dist/src/eve-channel/request.js +2 -2
  120. package/dist/src/execution/agent-sessions/context.d.ts +1 -1
  121. package/dist/src/execution/agent-sessions/context.js +1 -1
  122. package/dist/src/execution/coordination-dispatch-shared.d.ts +3 -0
  123. package/dist/src/execution/coordination-dispatch-shared.js +1 -1
  124. package/dist/src/execution/dynamic-workflow/program-step.d.ts +7 -7
  125. package/dist/src/execution/dynamic-workflow/program-step.js +1 -1
  126. package/dist/src/execution/dynamic-workflow/schema.d.ts +18 -11
  127. package/dist/src/execution/dynamic-workflow/schema.js +1 -1
  128. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  129. package/dist/src/execution/dynamic-workflow/workflow.js +1 -1
  130. package/dist/src/execution/eve-workflow-attributes.d.ts +3 -1
  131. package/dist/src/execution/eve-workflow-attributes.js +1 -1
  132. package/dist/src/execution/invoke-tool.js +1 -1
  133. package/dist/src/execution/sandbox/abort-bound-session.js +1 -1
  134. package/dist/src/execution/sandbox/active-connections.d.ts +28 -0
  135. package/dist/src/execution/sandbox/active-connections.js +1 -0
  136. package/dist/src/execution/sandbox/bindings/docker-cli.d.ts +10 -2
  137. package/dist/src/execution/sandbox/bindings/docker-cli.js +2 -2
  138. package/dist/src/execution/sandbox/bindings/docker-connection.d.ts +15 -0
  139. package/dist/src/execution/sandbox/bindings/docker-connection.js +2 -0
  140. package/dist/src/execution/sandbox/bindings/docker-container.d.ts +2 -0
  141. package/dist/src/execution/sandbox/bindings/docker-container.js +1 -1
  142. package/dist/src/execution/sandbox/bindings/docker-network.d.ts +5 -0
  143. package/dist/src/execution/sandbox/bindings/docker-network.js +1 -1
  144. package/dist/src/execution/sandbox/bindings/docker-templates.js +1 -1
  145. package/dist/src/execution/sandbox/bindings/docker.d.ts +12 -15
  146. package/dist/src/execution/sandbox/bindings/docker.js +1 -1
  147. package/dist/src/execution/sandbox/bindings/just-bash-runtime.d.ts +19 -29
  148. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
  149. package/dist/src/execution/sandbox/bindings/just-bash.d.ts +2 -4
  150. package/dist/src/execution/sandbox/bindings/just-bash.js +1 -1
  151. package/dist/src/execution/sandbox/bindings/local-provider-utils.d.ts +0 -20
  152. package/dist/src/execution/sandbox/bindings/local-provider-utils.js +1 -1
  153. package/dist/src/execution/sandbox/bindings/local.d.ts +4 -6
  154. package/dist/src/execution/sandbox/bindings/local.js +1 -1
  155. package/dist/src/execution/sandbox/bindings/vercel-base-runtime.d.ts +2 -0
  156. package/dist/src/execution/sandbox/bindings/vercel-base-runtime.js +2 -2
  157. package/dist/src/execution/sandbox/bindings/vercel-errors.js +2 -2
  158. package/dist/src/execution/sandbox/bindings/vercel-lifecycle.d.ts +7 -5
  159. package/dist/src/execution/sandbox/bindings/vercel-lifecycle.js +1 -1
  160. package/dist/src/execution/sandbox/bindings/vercel.d.ts +5 -11
  161. package/dist/src/execution/sandbox/bindings/vercel.js +1 -2
  162. package/dist/src/execution/sandbox/development-cleanup.d.ts +0 -1
  163. package/dist/src/execution/sandbox/development-cleanup.js +1 -1
  164. package/dist/src/execution/sandbox/development-lazy-prewarm.js +1 -1
  165. package/dist/src/execution/sandbox/development-run.d.ts +0 -2
  166. package/dist/src/execution/sandbox/development-run.js +1 -1
  167. package/dist/src/execution/sandbox/dockerfile.d.ts +0 -4
  168. package/dist/src/execution/sandbox/dockerfile.js +1 -1
  169. package/dist/src/execution/sandbox/ensure.d.ts +31 -11
  170. package/dist/src/execution/sandbox/ensure.js +1 -1
  171. package/dist/src/execution/sandbox/glob-tool.js +3 -3
  172. package/dist/src/execution/sandbox/grep-tool.js +1 -1
  173. package/dist/src/execution/sandbox/logging-session.js +1 -1
  174. package/dist/src/execution/sandbox/prewarm.d.ts +23 -3
  175. package/dist/src/execution/sandbox/prewarm.js +2 -1
  176. package/dist/src/execution/sandbox/read-file.js +1 -1
  177. package/dist/src/execution/sandbox/require-sandbox.d.ts +3 -2
  178. package/dist/src/execution/sandbox/require-sandbox.js +1 -1
  179. package/dist/src/execution/sandbox/ripgrep-probe.js +1 -1
  180. package/dist/src/execution/sandbox/session.d.ts +10 -20
  181. package/dist/src/execution/sandbox/session.js +2 -2
  182. package/dist/src/execution/session/admission.js +1 -1
  183. package/dist/src/execution/session/checkpoint-migrations.js +1 -1
  184. package/dist/src/execution/session/entry-input.d.ts +5 -4
  185. package/dist/src/execution/session/entry.js +1 -1
  186. package/dist/src/execution/session/handoff-state.d.ts +5 -0
  187. package/dist/src/execution/session/handoff-state.js +1 -0
  188. package/dist/src/execution/session/handoff-steps.d.ts +1 -5
  189. package/dist/src/execution/session/handoff-steps.js +1 -1
  190. package/dist/src/execution/session/handoff.d.ts +2 -1
  191. package/dist/src/execution/session/handoff.js +1 -1
  192. package/dist/src/execution/session/handover-tracing.d.ts +3 -0
  193. package/dist/src/execution/session/handover-tracing.js +1 -0
  194. package/dist/src/execution/session/input-queue.d.ts +3 -0
  195. package/dist/src/execution/session/input-queue.js +1 -1
  196. package/dist/src/execution/session/next-input.d.ts +3 -0
  197. package/dist/src/execution/session/next-input.js +1 -1
  198. package/dist/src/execution/session/prewarm-step.d.ts +13 -0
  199. package/dist/src/execution/session/prewarm-step.js +1 -0
  200. package/dist/src/execution/session/program.d.ts +4 -1
  201. package/dist/src/execution/session/program.js +1 -1
  202. package/dist/src/execution/session/state-cursor.d.ts +11 -0
  203. package/dist/src/execution/session/state-cursor.js +1 -1
  204. package/dist/src/execution/session/timeout-control.d.ts +4 -0
  205. package/dist/src/execution/session/timeout-control.js +1 -1
  206. package/dist/src/execution/session/turn-control.d.ts +5 -2
  207. package/dist/src/execution/session/turn-control.js +1 -1
  208. package/dist/src/execution/session/turn-step-types.d.ts +2 -0
  209. package/dist/src/execution/session/turn-step.js +1 -1
  210. package/dist/src/execution/session/turn.d.ts +1 -0
  211. package/dist/src/execution/session/turn.js +1 -1
  212. package/dist/src/execution/session-inbox/inbox.d.ts +17 -1
  213. package/dist/src/execution/session-inbox/inbox.js +1 -1
  214. package/dist/src/execution/session-inbox/protocol.d.ts +2 -1
  215. package/dist/src/execution/session-inbox/protocol.js +1 -1
  216. package/dist/src/execution/session-inbox/resume.d.ts +2 -1
  217. package/dist/src/execution/session-inbox/resume.js +1 -1
  218. package/dist/src/execution/session-prewarm.d.ts +8 -0
  219. package/dist/src/execution/session-prewarm.js +1 -0
  220. package/dist/src/execution/skills/instructions.js +1 -1
  221. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  222. package/dist/src/execution/tools/workflow/body.js +1 -1
  223. package/dist/src/execution/tools/workflow/step-context.d.ts +11 -0
  224. package/dist/src/execution/tools/workflow/step-execution.js +1 -1
  225. package/dist/src/execution/tools/workflow/step.js +1 -1
  226. package/dist/src/execution/workflow-runtime.js +1 -1
  227. package/dist/src/extensions/git/extension/lib/github-shell-schema.js +1 -1
  228. package/dist/src/framework/sources/modules/sandbox.d.ts +1 -1
  229. package/dist/src/harness/attachment-staging.d.ts +3 -7
  230. package/dist/src/harness/attachment-staging.js +1 -1
  231. package/dist/src/harness/hitl/index.d.ts +2 -1
  232. package/dist/src/harness/hitl/index.js +1 -1
  233. package/dist/src/harness/hitl/view.d.ts +1 -0
  234. package/dist/src/harness/hitl/view.js +1 -0
  235. package/dist/src/harness/model-call/run.js +1 -1
  236. package/dist/src/harness/semantic-errors/rules/sandbox.d.ts +3 -5
  237. package/dist/src/harness/semantic-errors/rules/sandbox.js +1 -1
  238. package/dist/src/harness/step/prompt.js +1 -1
  239. package/dist/src/harness/tool-history-repair.d.ts +9 -0
  240. package/dist/src/harness/tool-history-repair.js +1 -0
  241. package/dist/src/harness/tool-model-output.d.ts +19 -3
  242. package/dist/src/harness/tool-model-output.js +1 -1
  243. package/dist/src/internal/application/compiled-artifacts.js +8 -4
  244. package/dist/src/internal/application/optional-package-import.d.ts +10 -0
  245. package/dist/src/internal/application/optional-package-import.js +1 -1
  246. package/dist/src/internal/application/stamped-package-version.js +1 -1
  247. package/dist/src/internal/attachments/limited-read.d.ts +2 -2
  248. package/dist/src/internal/authored-module-build-options.d.ts +6 -0
  249. package/dist/src/internal/authored-module-build-options.js +1 -1
  250. package/dist/src/internal/authored-module-cache.d.ts +10 -0
  251. package/dist/src/internal/authored-module-cache.js +1 -0
  252. package/dist/src/internal/authored-module-graph.js +1 -1
  253. package/dist/src/internal/authored-module-loader.js +1 -1
  254. package/dist/src/internal/authored-relative-extension-resolver.js +1 -1
  255. package/dist/src/internal/bundler/nitro-rolldown.d.ts +3 -1
  256. package/dist/src/internal/bundler/nitro-rolldown.js +1 -1
  257. package/dist/src/internal/bundler/pseudo-packages.d.ts +11 -0
  258. package/dist/src/internal/bundler/pseudo-packages.js +1 -0
  259. package/dist/src/internal/nitro/host/build-extension.d.ts +6 -0
  260. package/dist/src/internal/nitro/host/build-extension.js +2 -2
  261. package/dist/src/internal/nitro/host/compiled-sandbox-provider-prune-plugin.d.ts +3 -1
  262. package/dist/src/internal/nitro/host/compiled-sandbox-provider-prune-plugin.js +3 -5
  263. package/dist/src/internal/nitro/host/create-application-nitro.d.ts +2 -3
  264. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  265. package/dist/src/internal/nitro/host/dev-authored-rebuild-coordinator.d.ts +2 -0
  266. package/dist/src/internal/nitro/host/dev-authored-rebuild-coordinator.js +1 -1
  267. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  268. package/dist/src/internal/nitro/host/dev-build-host.d.ts +83 -0
  269. package/dist/src/internal/nitro/host/dev-build-host.js +1 -0
  270. package/dist/src/internal/nitro/host/dev-build-operations.d.ts +6 -0
  271. package/dist/src/internal/nitro/host/dev-build-operations.js +1 -0
  272. package/dist/src/internal/nitro/host/dev-build-process.d.ts +1 -0
  273. package/dist/src/internal/nitro/host/dev-build-process.js +1 -0
  274. package/dist/src/internal/nitro/host/development-runtime-prune-plugin.d.ts +4 -1
  275. package/dist/src/internal/nitro/host/development-runtime-prune-plugin.js +3 -2
  276. package/dist/src/internal/nitro/host/drained-nitro-dev-server.d.ts +13 -0
  277. package/dist/src/internal/nitro/host/drained-nitro-dev-server.js +1 -1
  278. package/dist/src/internal/nitro/host/optional-engine-dependency-plugin.js +1 -1
  279. package/dist/src/internal/nitro/host/prepare-application-host.d.ts +3 -0
  280. package/dist/src/internal/nitro/host/prepare-application-host.js +1 -1
  281. package/dist/src/internal/nitro/host/sandbox-shutdown-plugin.js +1 -1
  282. package/dist/src/internal/nitro/host/start-development-server.js +2 -2
  283. package/dist/src/internal/nitro/host/start-production-server.js +3 -3
  284. package/dist/src/internal/nitro/host/workflow-sandbox-runtime-plugin.js +1 -1
  285. package/dist/src/internal/nitro/host.js +1 -1
  286. package/dist/src/internal/workflow/local-world-delivery-auth.d.ts +17 -0
  287. package/dist/src/internal/workflow/local-world-delivery-auth.js +1 -0
  288. package/dist/src/internal/workflow/queue-namespace.d.ts +2 -0
  289. package/dist/src/internal/workflow/queue-namespace.js +1 -1
  290. package/dist/src/internal/workflow-bundle/builder-support.d.ts +0 -1
  291. package/dist/src/internal/workflow-bundle/builder-support.js +2 -2
  292. package/dist/src/internal/workflow-bundle/builder.js +2 -2
  293. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
  294. package/dist/src/internal/workflow-bundle/vercel-workflow-output.d.ts +1 -1
  295. package/dist/src/internal/workflow-bundle/vercel-workflow-output.js +1 -1
  296. package/dist/src/protocol/prewarm-session.d.ts +14 -0
  297. package/dist/src/protocol/prewarm-session.js +1 -0
  298. package/dist/src/protocol/routes.d.ts +2 -2
  299. package/dist/src/public/channels/discord/authorization.d.ts +45 -0
  300. package/dist/src/public/channels/discord/authorization.js +3 -0
  301. package/dist/src/public/channels/discord/defaults.d.ts +14 -3
  302. package/dist/src/public/channels/discord/defaults.js +2 -2
  303. package/dist/src/public/channels/discord/discordChannel.d.ts +15 -1
  304. package/dist/src/public/channels/discord/discordChannel.js +1 -1
  305. package/dist/src/public/channels/discord/gateway/connection.d.ts +26 -0
  306. package/dist/src/public/channels/discord/gateway/connection.js +1 -0
  307. package/dist/src/public/channels/discord/gateway/forwarder.d.ts +14 -0
  308. package/dist/src/public/channels/discord/gateway/forwarder.js +1 -0
  309. package/dist/src/public/channels/discord/gateway/index.d.ts +59 -0
  310. package/dist/src/public/channels/discord/gateway/index.js +1 -0
  311. package/dist/src/public/channels/discord/inbound.d.ts +10 -3
  312. package/dist/src/public/channels/discord/inbound.js +2 -2
  313. package/dist/src/public/channels/discord/index.d.ts +3 -2
  314. package/dist/src/public/channels/discord/index.js +1 -1
  315. package/dist/src/public/channels/discord/messages.d.ts +116 -0
  316. package/dist/src/public/channels/discord/messages.js +2 -0
  317. package/dist/src/public/channels/github/checkout.js +1 -1
  318. package/dist/src/public/channels/linq/linqChannel.d.ts +4 -1
  319. package/dist/src/public/channels/linq/linqChannel.js +1 -1
  320. package/dist/src/public/channels/photon/photonIMessageChannel.js +1 -1
  321. package/dist/src/public/channels/same-environment-oidc.d.ts +7 -0
  322. package/dist/src/public/channels/same-environment-oidc.js +1 -0
  323. package/dist/src/public/definitions/channel.js +1 -1
  324. package/dist/src/public/definitions/sandbox.d.ts +1 -1
  325. package/dist/src/public/next/server.js +1 -1
  326. package/dist/src/public/sandbox/docker-sandbox.d.ts +6 -1
  327. package/dist/src/public/sandbox/docker.d.ts +1 -8
  328. package/dist/src/public/sandbox/index.d.ts +3 -3
  329. package/dist/src/public/sandbox/just-bash-sandbox.d.ts +87 -7
  330. package/dist/src/public/sandbox/just-bash.d.ts +1 -1
  331. package/dist/src/public/sandbox/provider.d.ts +5 -1
  332. package/dist/src/public/sandbox/provider.js +1 -1
  333. package/dist/src/public/sandbox/vercel-sandbox.d.ts +16 -9
  334. package/dist/src/public/sandbox/vercel.d.ts +0 -1
  335. package/dist/src/public/sandbox/vercel.js +1 -1
  336. package/dist/src/public/tools/agent.d.ts +8 -1
  337. package/dist/src/public/tools/agent.js +1 -1
  338. package/dist/src/react/use-eve-agent.d.ts +1 -1
  339. package/dist/src/runtime/agent/resolve-model.js +1 -1
  340. package/dist/src/runtime/connections/openapi-client.d.ts +2 -0
  341. package/dist/src/runtime/connections/openapi-client.js +1 -1
  342. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  343. package/dist/src/runtime/resolve-agent.js +1 -1
  344. package/dist/src/runtime/resolve-channel.js +1 -1
  345. package/dist/src/runtime/resolve-sandbox.js +1 -1
  346. package/dist/src/runtime/sandbox/prepared-artifacts.js +1 -1
  347. package/dist/src/runtime/sandbox/registry.d.ts +2 -0
  348. package/dist/src/runtime/sandbox/registry.js +1 -1
  349. package/dist/src/runtime/subagents/workflow.d.ts +6 -0
  350. package/dist/src/runtime/subagents/workflow.js +1 -1
  351. package/dist/src/runtime/workspace/seed-files.d.ts +9 -12
  352. package/dist/src/runtime/workspace/seed-files.js +1 -1
  353. package/dist/src/runtime/workspace/spec.d.ts +1 -1
  354. package/dist/src/runtime/workspace/spec.js +1 -1
  355. package/dist/src/runtime/workspace/types.d.ts +2 -6
  356. package/dist/src/sandbox/provider.d.ts +185 -0
  357. package/dist/src/sandbox/provider.js +1 -0
  358. package/dist/src/sandbox/providers/default.d.ts +20 -19
  359. package/dist/src/sandbox/providers/default.js +1 -1
  360. package/dist/src/sandbox/providers/docker.d.ts +5 -2
  361. package/dist/src/sandbox/providers/docker.js +1 -1
  362. package/dist/src/sandbox/providers/just-bash.d.ts +4 -3
  363. package/dist/src/sandbox/providers/just-bash.js +1 -1
  364. package/dist/src/sandbox/providers/vercel.d.ts +4 -10
  365. package/dist/src/sandbox/providers/vercel.js +1 -1
  366. package/dist/src/sandbox/providers.d.ts +0 -1
  367. package/dist/src/sandbox/providers.js +1 -1
  368. package/dist/src/sandbox/state.d.ts +61 -0
  369. package/dist/src/sandbox/state.js +1 -1
  370. package/dist/src/self-modification/deployed-sandbox.d.ts +4 -9
  371. package/dist/src/self-modification/deployed-sandbox.js +1 -1
  372. package/dist/src/self-modification/filesystem.d.ts +3 -3
  373. package/dist/src/self-modification/remote/config.d.ts +2 -2
  374. package/dist/src/self-modification/remote/config.js +1 -1
  375. package/dist/src/self-modification/setup.d.ts +0 -1
  376. package/dist/src/self-modification/setup.js +8 -8
  377. package/dist/src/setup/integrations/discord/api.d.ts +7 -0
  378. package/dist/src/setup/integrations/discord/api.js +1 -1
  379. package/dist/src/setup/integrations/discord/daemon.d.ts +18 -0
  380. package/dist/src/setup/integrations/discord/daemon.js +21 -0
  381. package/dist/src/setup/integrations/discord/setup.d.ts +24 -4
  382. package/dist/src/setup/integrations/discord/setup.js +5 -4
  383. package/dist/src/setup/integrations/self-modification/setup.js +1 -1
  384. package/dist/src/setup/scaffold/create/project.js +1 -1
  385. package/dist/src/setup/scaffold/update/web-options.js +1 -1
  386. package/dist/src/setup/scaffold/version-tokens.d.ts +0 -1
  387. package/dist/src/setup/scaffold/version-tokens.js +1 -1
  388. package/dist/src/shared/agent-definition.d.ts +2 -0
  389. package/dist/src/shared/built-server-start-failure.d.ts +12 -0
  390. package/dist/src/shared/built-server-start-failure.js +3 -0
  391. package/dist/src/shared/framework-eve-server.d.ts +2 -0
  392. package/dist/src/shared/framework-eve-server.js +2 -2
  393. package/dist/src/shared/sandbox-environment.d.ts +4 -10
  394. package/dist/src/shared/sandbox-environment.js +1 -1
  395. package/dist/src/shared/sandbox-network-policy.d.ts +45 -9
  396. package/dist/src/shared/sandbox-provider.d.ts +0 -103
  397. package/dist/src/shared/sandbox-provider.js +1 -1
  398. package/dist/src/shared/sandbox-recorded-data-error.d.ts +4 -0
  399. package/dist/src/shared/sandbox-recorded-data-error.js +1 -0
  400. package/dist/src/shared/sandbox-session-gone-error.d.ts +12 -0
  401. package/dist/src/shared/sandbox-session-gone-error.js +1 -0
  402. package/dist/src/shared/sandbox-session.d.ts +97 -83
  403. package/dist/src/shared/sandbox-template-error.d.ts +19 -4
  404. package/dist/src/shared/sandbox-template-error.js +1 -1
  405. package/dist/src/shared/sandbox-tool-session-error.d.ts +4 -0
  406. package/dist/src/shared/sandbox-tool-session-error.js +1 -0
  407. package/dist/src/shared/skill-package.js +1 -1
  408. package/dist/src/shared/skill-paths.d.ts +4 -5
  409. package/dist/src/shared/skill-paths.js +2 -2
  410. package/dist/src/shared/workflow-sandbox.d.ts +4 -41
  411. package/dist/src/shared/workflow-sandbox.js +1 -1
  412. package/dist/src/svelte/index.js +1 -1
  413. package/dist/src/svelte/use-eve-agent.d.ts +1 -1
  414. package/dist/src/svelte/use-eve-agent.js +1 -1
  415. package/dist/src/tools/definition.js +1 -1
  416. package/dist/src/tools/durable-callbacks.d.ts +5 -1
  417. package/dist/src/tools/durable-callbacks.js +1 -1
  418. package/dist/src/tools/dynamic.d.ts +3 -3
  419. package/dist/src/tools/model-output.d.ts +23 -5
  420. package/dist/src/tools/model-output.js +1 -1
  421. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  422. package/dist/src/tools/provided/glob.js +1 -1
  423. package/dist/src/tools/provided/grep.js +1 -1
  424. package/dist/src/tools/provided/read-file.js +1 -1
  425. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  426. package/dist/src/tools/provided/workflow.js +1 -1
  427. package/dist/src/tools/provided/write-file.js +1 -1
  428. package/dist/src/tools/workflow-definition.d.ts +19 -4
  429. package/dist/src/vue/index.js +1 -1
  430. package/dist/src/vue/use-eve-agent.d.ts +1 -1
  431. package/dist/src/vue/use-eve-agent.js +1 -1
  432. package/docs/channels/custom.mdx +3 -3
  433. package/docs/channels/discord.mdx +279 -7
  434. package/docs/channels/eve.mdx +13 -2
  435. package/docs/channels/linq.mdx +2 -2
  436. package/docs/channels/mcp.mdx +2 -2
  437. package/docs/channels/overview.mdx +1 -1
  438. package/docs/channels/photon.mdx +1 -1
  439. package/docs/concepts/built-in-tools.md +31 -8
  440. package/docs/concepts/execution-model-and-durability.mdx +6 -101
  441. package/docs/concepts/security-model.md +2 -0
  442. package/docs/concepts/sessions-runs-and-streaming.md +44 -36
  443. package/docs/connections/openapi.mdx +2 -0
  444. package/docs/evals/overview.mdx +1 -1
  445. package/docs/evals/reporters.mdx +5 -5
  446. package/docs/evals/running.mdx +19 -1
  447. package/docs/guides/client/messages.mdx +1 -1
  448. package/docs/guides/deployment/overview.md +4 -4
  449. package/docs/guides/deployment/self-hosting.md +50 -1
  450. package/docs/guides/dev-tui.md +1 -1
  451. package/docs/guides/dynamic-capabilities.md +2 -2
  452. package/docs/guides/frontend/overview.mdx +34 -10
  453. package/docs/guides/instrumentation/agent-runs.mdx +16 -0
  454. package/docs/guides/instrumentation/otel.mdx +23 -0
  455. package/docs/guides/self-modification.md +1 -1
  456. package/docs/guides/session-context.md +1 -1
  457. package/docs/instructions.mdx +1 -1
  458. package/docs/meta.json +1 -0
  459. package/docs/reference/agent-files.md +4 -4
  460. package/docs/reference/cli.md +24 -17
  461. package/docs/reference/typescript-api.md +9 -3
  462. package/docs/sandbox/custom-providers.mdx +254 -0
  463. package/docs/sandbox/default.mdx +71 -4
  464. package/docs/sandbox/docker.mdx +15 -3
  465. package/docs/sandbox/index.mdx +32 -106
  466. package/docs/sandbox/just-bash.mdx +54 -0
  467. package/docs/sandbox/meta.json +9 -1
  468. package/docs/sandbox/troubleshooting.mdx +215 -0
  469. package/docs/sandbox/vercel.mdx +48 -7
  470. package/docs/skills.mdx +1 -1
  471. package/docs/subagents/index.mdx +2 -2
  472. package/docs/tools/overview.mdx +20 -1
  473. package/docs/tools/workflows.mdx +73 -5
  474. package/docs/tutorial/run-analysis.mdx +2 -2
  475. package/docs/use-cases.mdx +250 -0
  476. package/package.json +14 -20
  477. package/dist/src/compiled/@ai-sdk/code-mode/_run.d.ts +0 -1
  478. package/dist/src/compiled/@ai-sdk/code-mode/index.d.ts +0 -325
  479. package/dist/src/compiled/@ai-sdk/code-mode/index.js +0 -660
  480. package/dist/src/compiled/_chunks/workflow/dist-CyBgVS7g.js +0 -1
  481. package/dist/src/compiled/_chunks/workflow/dist-T5NnW-0k.js +0 -3
  482. package/dist/src/compiled/_chunks/workflow/helpers-DlLD3ov_.js +0 -1
  483. package/dist/src/compiled/_chunks/workflow/private-tQUuwBoQ.js +0 -1
  484. package/dist/src/compiled/_chunks/workflow/resume-hook-DMsV_b4n.js +0 -1
  485. package/dist/src/compiled/_chunks/workflow/serialization-DPdYS_w2.js +0 -16
  486. package/dist/src/compiled/_chunks/workflow/sleep-BY6leHh8.js +0 -1
  487. package/dist/src/compiled/_chunks/workflow/workflow-routes-CwqB063q.js +0 -1
  488. package/dist/src/execution/sandbox/active-handles.d.ts +0 -32
  489. package/dist/src/execution/sandbox/active-handles.js +0 -1
  490. package/dist/src/execution/sandbox/bindings/docker-session.d.ts +0 -6
  491. package/dist/src/execution/sandbox/bindings/docker-session.js +0 -2
  492. package/dist/src/execution/sandbox/bindings/immutable-resources.d.ts +0 -15
  493. package/dist/src/execution/sandbox/bindings/immutable-resources.js +0 -2
  494. package/dist/src/execution/sandbox/bindings/microsandbox-create.d.ts +0 -12
  495. package/dist/src/execution/sandbox/bindings/microsandbox-create.js +0 -1
  496. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.d.ts +0 -42
  497. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +0 -1
  498. package/dist/src/execution/sandbox/bindings/microsandbox-metadata.d.ts +0 -29
  499. package/dist/src/execution/sandbox/bindings/microsandbox-metadata.js +0 -1
  500. package/dist/src/execution/sandbox/bindings/microsandbox-network.d.ts +0 -18
  501. package/dist/src/execution/sandbox/bindings/microsandbox-network.js +0 -1
  502. package/dist/src/execution/sandbox/bindings/microsandbox-options.d.ts +0 -37
  503. package/dist/src/execution/sandbox/bindings/microsandbox-options.js +0 -1
  504. package/dist/src/execution/sandbox/bindings/microsandbox-platform.d.ts +0 -21
  505. package/dist/src/execution/sandbox/bindings/microsandbox-platform.js +0 -21
  506. package/dist/src/execution/sandbox/bindings/microsandbox-process.d.ts +0 -3
  507. package/dist/src/execution/sandbox/bindings/microsandbox-process.js +0 -1
  508. package/dist/src/execution/sandbox/bindings/microsandbox-provider-state.d.ts +0 -11
  509. package/dist/src/execution/sandbox/bindings/microsandbox-provider-state.js +0 -1
  510. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.d.ts +0 -82
  511. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +0 -1
  512. package/dist/src/execution/sandbox/bindings/microsandbox-templates.d.ts +0 -12
  513. package/dist/src/execution/sandbox/bindings/microsandbox-templates.js +0 -1
  514. package/dist/src/execution/sandbox/bindings/microsandbox.d.ts +0 -16
  515. package/dist/src/execution/sandbox/bindings/microsandbox.js +0 -1
  516. package/dist/src/execution/sandbox/provider-host-development.d.ts +0 -2
  517. package/dist/src/execution/sandbox/provider-host-development.js +0 -1
  518. package/dist/src/execution/sandbox/provider-host.d.ts +0 -2
  519. package/dist/src/execution/sandbox/provider-host.js +0 -1
  520. package/dist/src/execution/tool-session/sandbox.d.ts +0 -22
  521. package/dist/src/execution/tool-session/sandbox.js +0 -1
  522. package/dist/src/public/sandbox/microsandbox-sandbox.d.ts +0 -48
  523. package/dist/src/public/sandbox/microsandbox-sandbox.js +0 -1
  524. package/dist/src/public/sandbox/microsandbox.d.ts +0 -9
  525. package/dist/src/public/sandbox/microsandbox.js +0 -1
  526. package/dist/src/sandbox/providers/microsandbox.d.ts +0 -12
  527. package/dist/src/sandbox/providers/microsandbox.js +0 -1
  528. package/docs/sandbox/microsandbox.mdx +0 -31
@@ -0,0 +1,26 @@
1
+ import { type DiscordFetch } from "#public/channels/discord/api.js";
2
+ /** Raised when Discord refuses the bot outright, so reconnecting cannot help. */
3
+ export declare class DiscordGatewayFatalError extends Error {
4
+ }
5
+ /** A Gateway dispatch (op 0) as Discord sends it. */
6
+ export interface DiscordGatewayDispatch {
7
+ readonly op: 0;
8
+ readonly t: string;
9
+ readonly s: number;
10
+ readonly d: unknown;
11
+ }
12
+ export interface GatewayConnectionOptions {
13
+ readonly apiBaseUrl?: string;
14
+ readonly fetch?: DiscordFetch;
15
+ readonly intents: number;
16
+ readonly resolveToken: () => Promise<string>;
17
+ readonly onDispatch: (dispatch: DiscordGatewayDispatch) => void;
18
+ readonly signal: AbortSignal;
19
+ }
20
+ /**
21
+ * Holds one Discord Gateway session until `signal` aborts, resuming across
22
+ * reconnects so dispatches are not lost while the process lives.
23
+ */
24
+ export declare function runGatewayConnection(options: GatewayConnectionOptions): Promise<void>;
25
+ /** Resolves after `ms`, or as soon as `signal` aborts. */
26
+ export declare function sleep(ms: number, signal?: AbortSignal): Promise<void>;
@@ -0,0 +1 @@
1
+ import{createLogger}from"#internal/logging.js";import{isNonEmptyString,isObject}from"#shared/guards.js";import{callDiscordApi}from"#public/channels/discord/api.js";const log=createLogger(`discord.gateway`),RESUMABLE_CLOSE=4e3,FATAL_CLOSE_CODES=new Set([4004,4010,4011,4012,4013,4014]),SESSION_RESET_CLOSE_CODES=new Set([4007,4009]);var DiscordGatewayFatalError=class extends Error{};async function runGatewayConnection(e){let t,n=null,r=0,i;for(;!e.signal.aborted;){let a,o;try{if(a=await e.resolveToken(),t!==void 0)o=t.resumeUrl;else{let e=await discoverGatewayUrl(a);if(`fatal`in e)throw new DiscordGatewayFatalError(e.fatal);o=e.url}}catch(t){if(t instanceof DiscordGatewayFatalError)throw t;log.warn(`Discord Gateway connect failed`,{error:t}),await sleep(backoff(r++),e.signal);continue}if(e.signal.aborted)return;let s=await connect(o,a);if(e.signal.aborted)return;if(FATAL_CLOSE_CODES.has(s.code))throw new DiscordGatewayFatalError(`Discord closed the Gateway with ${s.code} (${s.reason}). Check the bot token and that every requested intent is enabled under Bot in the Discord Developer Portal.`);SESSION_RESET_CLOSE_CODES.has(s.code)&&(t=void 0,n=null);let c=i??backoff(r++);i=void 0,log.warn(`Discord Gateway closed`,{code:s.code,reason:s.reason,retryInMs:Math.round(c)}),await sleep(c,e.signal)}async function discoverGatewayUrl(t){let n=await callDiscordApi({apiBaseUrl:e.apiBaseUrl,botToken:t,fetch:e.fetch,method:`GET`,path:`/gateway/bot`});if(n.status===401)return{fatal:`Discord rejected the bot token while looking up the Gateway URL.`};if(!n.ok||!isObject(n.body)||!isNonEmptyString(n.body.url))throw Error(`Discord Gateway URL lookup failed with HTTP ${n.status}.`);return{url:n.body.url}}function connect(r,a){return new Promise(o=>{let s=new URL(r);s.searchParams.set(`v`,`10`),s.searchParams.set(`encoding`,`json`);let c=new WebSocket(s),l,u,d=!0,f=!1,settle=(t,n)=>{f||(f=!0,clearTimeout(l),clearTimeout(u),e.signal.removeEventListener(`abort`,onAbort),o({code:t,reason:n}))},send=e=>{c.readyState===WebSocket.OPEN&&c.send(JSON.stringify(e))},close=(e,t)=>{c.readyState!==WebSocket.CLOSING&&c.readyState!==WebSocket.CLOSED&&(c.close(e,t),u=setTimeout(()=>settle(e,t),3e3))},onAbort=()=>close(1e3,`shutdown`);e.signal.addEventListener(`abort`,onAbort,{once:!0});let heartbeat=e=>{if(!d){close(RESUMABLE_CLOSE,`heartbeat not acknowledged`);return}d=!1,send({op:1,d:n}),l=setTimeout(()=>heartbeat(e),e)},identifyOrResume=()=>{if(t!==void 0&&n!==null){send({op:6,d:{seq:n,session_id:t.id,token:a}});return}send({op:2,d:{intents:e.intents,properties:{browser:`eve`,device:`eve`,os:process.platform},token:a}})};c.addEventListener(`message`,e=>{if(f)return;let r;try{r=JSON.parse(String(e.data))}catch{log.warn(`Discord Gateway sent a payload that is not JSON`);return}switch(typeof r.s==`number`&&(n=r.s),r.op){case 0:onDispatch(r);return;case 1:send({op:1,d:n});return;case 7:i=0,close(RESUMABLE_CLOSE,`reconnect requested`);return;case 9:r.d!==!0&&(t=void 0,n=null),i=1e3+Math.random()*4e3,close(RESUMABLE_CLOSE,`invalid session`);return;case 10:{let e=Number(isObject(r.d)?r.d.heartbeat_interval:void 0);l=setTimeout(()=>heartbeat(e),e*Math.random()),identifyOrResume();return}case 11:d=!0;return}}),c.addEventListener(`close`,e=>settle(e.code,e.reason))})}function onDispatch(i){if(i.t===`READY`){let e=isObject(i.d)?i.d:{};isNonEmptyString(e.session_id)&&isNonEmptyString(e.resume_gateway_url)&&(t={id:e.session_id,resumeUrl:e.resume_gateway_url}),r=0,log.info(`Discord Gateway ready`,{sessionId:t?.id});return}if(i.t===`RESUMED`){r=0,log.info(`Discord Gateway resumed`,{sequence:n});return}typeof i.t==`string`&&typeof i.s==`number`&&e.onDispatch({d:i.d,op:0,s:i.s,t:i.t})}}function backoff(e){return Math.min(6e4,1e3*2**e)*(.5+Math.random()/2)}function sleep(e,t){return new Promise(n=>{let r=setTimeout(done,e);t?.addEventListener(`abort`,done,{once:!0});function done(){clearTimeout(r),t?.removeEventListener(`abort`,done),n()}})}export{DiscordGatewayFatalError,runGatewayConnection,sleep};
@@ -0,0 +1,14 @@
1
+ import type { DiscordGatewayDispatch } from "#public/channels/discord/gateway/connection.js";
2
+ export interface Forwarder {
3
+ enqueue(dispatch: DiscordGatewayDispatch): void;
4
+ /** Resolves once the backlog is delivered or `timeoutMs` elapses. */
5
+ drain(timeoutMs: number): Promise<void>;
6
+ }
7
+ /**
8
+ * Delivers dispatches to eve one at a time, in Gateway order. A bounded
9
+ * backlog keeps a long eve outage from growing the relay's memory without limit.
10
+ */
11
+ export declare function createForwarder(options: {
12
+ readonly url: URL;
13
+ readonly headers: () => Promise<Readonly<Record<string, string>>>;
14
+ }): Forwarder;
@@ -0,0 +1 @@
1
+ import{createLogger}from"#internal/logging.js";import{sleep}from"#public/channels/discord/gateway/connection.js";const log=createLogger(`discord.gateway`),UNSENT_ERROR_CODES=new Set([`ECONNREFUSED`,`ENOTFOUND`,`EAI_AGAIN`,`UND_ERR_CONNECT_TIMEOUT`]);function createForwarder(e){let t=Promise.resolve(),n=0;return{enqueue(e){if(n>=500){log.error(`Discord Gateway backlog is full; dropped a dispatch`,{event:e.t,sequence:e.s});return}n+=1,t=t.then(()=>deliver(e)).finally(()=>{--n})},async drain(e){if(n>0){let n=new AbortController;await Promise.race([t,sleep(e,n.signal)]),n.abort()}n>0&&log.warn(`Discord Gateway relay stopped with undelivered dispatches`,{pending:n})}};async function deliver(t){let n=JSON.stringify(t),r={event:t.t,sequence:t.s};for(let t=1;t<=5;t+=1){try{let i=await fetch(e.url,{body:n,headers:{"content-type":`application/json`,...await e.headers()},method:`POST`,signal:AbortSignal.timeout(3e4)});if(i.ok)return;let a=(await i.text()).slice(0,200);if(i.status>=500){log.error(`Gave up forwarding a Discord dispatch that eve may have received`,{...r,detail:a,status:i.status});return}if(i.status!==429){log.error(`eve rejected a forwarded Discord dispatch`,{...r,detail:a,hint:i.status===401||i.status===403?`eve did not accept the relay's credentials. On Vercel, check that the relay runs in the same project as the agent.`:`Check that ${e.url.href} is the agent's discordChannel({ gateway }) route.`,status:i.status});return}log.warn(`Retrying a forwarded Discord dispatch`,{...r,attempt:t,detail:a,status:i.status})}catch(e){if(!UNSENT_ERROR_CODES.has(errorCode(e))){log.error(`Gave up forwarding a Discord dispatch that eve may have received`,{...r,error:e});return}log.warn(`Retrying a forwarded Discord dispatch`,{...r,attempt:t,error:e})}t<5&&await sleep(Math.min(3e4,1e3*2**(t-1)))}log.error(`Gave up forwarding a Discord dispatch`,{...r,attempts:5})}}function errorCode(e){let t=(e instanceof Error?e.cause:void 0)?.code;return typeof t==`string`?t:``}export{createForwarder};
@@ -0,0 +1,59 @@
1
+ /**
2
+ * A long-running relay that holds a Discord Gateway connection and forwards
3
+ * message dispatches to an eve agent's `discordChannel({ gateway })` route.
4
+ * Run it in a process that stays up, such as a Vercel Daemon; it does not
5
+ * belong in the agent itself.
6
+ */
7
+ import { type OutboundAuthFn } from "#public/agents/auth.js";
8
+ import { type DiscordApiOptions, type DiscordBotToken } from "#public/channels/discord/api.js";
9
+ import { DiscordGatewayFatalError } from "#public/channels/discord/gateway/connection.js";
10
+ export { DiscordGatewayFatalError };
11
+ /** Options for {@link experimental_runDiscordGatewayRelay}. */
12
+ export interface DiscordGatewayRelayOptions {
13
+ /**
14
+ * Bot credentials. Pass the same object as the agent's `discordChannel`,
15
+ * such as `connectDiscordCredentials(...)`. `botToken` falls back to
16
+ * `DISCORD_BOT_TOKEN`.
17
+ */
18
+ readonly credentials?: {
19
+ readonly botToken?: DiscordBotToken;
20
+ };
21
+ /** Discord REST API overrides. */
22
+ readonly api?: Omit<DiscordApiOptions, "credentials">;
23
+ /**
24
+ * Base URL of the eve deployment. Defaults to
25
+ * `https://$VERCEL_PROJECT_PRODUCTION_URL`, which a Vercel Daemon has. Set it
26
+ * to `http://localhost:<port>` to relay to `eve dev`.
27
+ */
28
+ readonly url?: string | URL;
29
+ /** Path of the agent's Gateway route. Defaults to `/eve/v1/discord/gateway`. */
30
+ readonly route?: string;
31
+ /**
32
+ * Headers that authenticate each forwarded dispatch. Defaults to this
33
+ * project's Vercel OIDC token, which the route accepts by default. Without a
34
+ * token, as on a laptop, requests go out unauthenticated, which `eve dev`
35
+ * accepts.
36
+ */
37
+ readonly auth?: OutboundAuthFn;
38
+ /**
39
+ * Also request the privileged Message Content intent, so messages that do
40
+ * not mention the bot, such as thread follow-ups, arrive with their text.
41
+ * Enable it under Bot in the Discord Developer Portal first, or Discord
42
+ * refuses the connection.
43
+ */
44
+ readonly messageContent?: boolean;
45
+ /** Stops the relay. Defaults to the process's `SIGTERM` and `SIGINT`. */
46
+ readonly signal?: AbortSignal;
47
+ }
48
+ /**
49
+ * Connects to the Discord Gateway as the bot and forwards every
50
+ * `MESSAGE_CREATE` dispatch, unchanged and in order, to the agent's
51
+ * `discordChannel({ gateway })` route. Reconnects and resumes on its own.
52
+ * Resolves after `signal` aborts and in-flight deliveries drain; rejects with
53
+ * {@link DiscordGatewayFatalError} when Discord refuses the bot's token or
54
+ * intents.
55
+ *
56
+ * Run exactly one relay per bot: Discord sends every message to each
57
+ * connection, so a second relay makes the agent answer twice.
58
+ */
59
+ export declare function experimental_runDiscordGatewayRelay(options?: DiscordGatewayRelayOptions): Promise<void>;
@@ -0,0 +1 @@
1
+ import{createLogger}from"#internal/logging.js";import{resolveDiscordBotToken}from"#public/channels/discord/api.js";import{DiscordGatewayFatalError,runGatewayConnection}from"#public/channels/discord/gateway/connection.js";import{vercelOidc}from"#public/agents/auth.js";import{createForwarder}from"#public/channels/discord/gateway/forwarder.js";const log=createLogger(`discord.gateway`);async function experimental_runDiscordGatewayRelay(e={}){let t=new URL(e.route??`/eve/v1/discord/gateway`,resolveBaseUrl(e.url)),n=e.signal===void 0?listenForShutdown():void 0,r=e.signal??n.signal,i=createForwarder({headers:outboundHeaders(e.auth),url:t});log.info(`Discord Gateway relay started`,{target:t.href});try{await runGatewayConnection({apiBaseUrl:e.api?.apiBaseUrl,fetch:e.api?.fetch,intents:4608|(e.messageContent===!0?32768:0),onDispatch:e=>{e.t===`MESSAGE_CREATE`&&i.enqueue(e)},resolveToken:()=>resolveDiscordBotToken(e.credentials?.botToken),signal:r})}finally{n?.dispose(),await i.drain(8e3)}}function resolveBaseUrl(e){if(e!==void 0)return new URL(e);let t=process.env.VERCEL_PROJECT_PRODUCTION_URL?.trim();if(t)return new URL(`https://${t}`);throw Error("experimental_runDiscordGatewayRelay needs the eve deployment's URL: pass `url`, such as http://localhost:2000 for eve dev, or run it where VERCEL_PROJECT_PRODUCTION_URL is set.")}function outboundHeaders(e){if(e!==void 0)return async()=>(await e()).headers;let t=vercelOidc(),n=!1;return async()=>{try{return(await t()).headers}catch(e){return n||(n=!0,log.warn(`No Vercel OIDC token; forwarding without credentials`,{error:e})),{}}}}function listenForShutdown(){let e=new AbortController,t=[`SIGTERM`,`SIGINT`],onSignal=t=>{log.info(`Discord Gateway relay shutting down`,{signal:t}),e.abort()};for(let e of t)process.once(e,onSignal);return{signal:e.signal,dispose:()=>{for(let e of t)process.off(e,onSignal)}}}export{DiscordGatewayFatalError,experimental_runDiscordGatewayRelay};
@@ -101,15 +101,18 @@ export interface DiscordModalSubmitInteraction extends DiscordInteractionBase {
101
101
  export type DiscordInteraction = DiscordCommandInteraction | DiscordComponentInteraction | DiscordModalSubmitInteraction;
102
102
  /**
103
103
  * Fields rendered into the model-visible `<discord_context>` block by
104
- * {@link formatDiscordContextBlock}. The optional fields (username, guildId,
105
- * commandName) are omitted from the block when not provided.
104
+ * {@link formatDiscordContextBlock}. Optional fields are omitted from the
105
+ * block when not provided.
106
106
  */
107
107
  export interface DiscordInboundContext {
108
108
  readonly applicationId?: string;
109
109
  readonly channelId: string;
110
110
  readonly commandName?: string;
111
111
  readonly guildId?: string;
112
- readonly interactionId: string;
112
+ /** Set for interactions such as slash commands. */
113
+ readonly interactionId?: string;
114
+ /** Set for ordinary messages forwarded from the Discord Gateway. */
115
+ readonly messageId?: string;
113
116
  readonly userId: string;
114
117
  readonly username?: string;
115
118
  }
@@ -119,3 +122,7 @@ export declare function parseDiscordInteraction(value: unknown): DiscordInteract
119
122
  export declare function commandInteractionMessage(interaction: DiscordCommandInteraction): string;
120
123
  /** Renders one {@link DiscordInboundContext} as a deterministic context block. */
121
124
  export declare function formatDiscordContextBlock(context: DiscordInboundContext): string;
125
+ /** Parses a raw Discord user object, as interactions and Gateway messages carry it. */
126
+ export declare function parseDiscordUser(value: unknown): DiscordUser | null;
127
+ /** Parses a raw Discord attachment object, as Gateway messages and resolved command data carry it. */
128
+ export declare function parseDiscordAttachment(raw: unknown): DiscordAttachment | null;
@@ -1,2 +1,2 @@
1
- import{isNonEmptyString,isObject}from"#shared/guards.js";const DISCORD_INTERACTION_TYPE={APPLICATION_COMMAND:2,MESSAGE_COMPONENT:3,MODAL_SUBMIT:5,PING:1},DISCORD_INTERACTION_RESPONSE_TYPE={CHANNEL_MESSAGE_WITH_SOURCE:4,DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE:5,DEFERRED_UPDATE_MESSAGE:6,MODAL:9,PONG:1},DISCORD_EPHEMERAL_MESSAGE_FLAG=64;function parseDiscordInteraction(e){if(!isObject(e))return null;let t=e.type;return t===DISCORD_INTERACTION_TYPE.APPLICATION_COMMAND?parseCommandInteraction(e):t===DISCORD_INTERACTION_TYPE.MESSAGE_COMPONENT?parseComponentInteraction(e):t===DISCORD_INTERACTION_TYPE.MODAL_SUBMIT?parseModalSubmitInteraction(e):null}function commandInteractionMessage(e){let t=findOptionValue(e.options,`message`);if(typeof t==`string`&&t.trim().length>0)return t;let n=formatCommandOptions(e.options);return n?`/${e.commandName} ${n}`:`/${e.commandName}`}function formatDiscordContextBlock(e){return[`<discord_context>`,`response_medium: discord`,`response_instructions: Reply for Discord in concise Markdown. Avoid mass mentions, long tables, and messages that need more than a few short posts.`,...e.applicationId?[`application_id: ${e.applicationId}`]:[],`user_id: ${e.userId}`,...e.username?[`username: ${e.username}`]:[],`channel_id: ${e.channelId}`,...e.guildId?[`guild_id: ${e.guildId}`]:[],`interaction_id: ${e.interactionId}`,...e.commandName?[`command_name: ${e.commandName}`]:[],`</discord_context>`].join(`
2
- `)}function parseCommandInteraction(e){let t=parseInteractionBase(e),n=isObject(e.data)?e.data:null;if(!t||!n||!isNonEmptyString(n.name))return null;let r=parseOptions(n.options);return{...t,attachments:resolveAttachments(r,n.resolved),commandId:isNonEmptyString(n.id)?n.id:void 0,commandName:n.name,options:r,type:DISCORD_INTERACTION_TYPE.APPLICATION_COMMAND}}function parseComponentInteraction(e){let t=parseInteractionBase(e),n=isObject(e.data)?e.data:null,r=isObject(e.message)?e.message:null;if(!t||!n||!isNonEmptyString(n.custom_id))return null;let i=isNonEmptyString(r?.id)?r.id:``;return i?{...t,componentType:typeof n.component_type==`number`?n.component_type:0,customId:n.custom_id,messageId:i,type:DISCORD_INTERACTION_TYPE.MESSAGE_COMPONENT,values:Array.isArray(n.values)?n.values.filter(e=>typeof e==`string`):[]}:null}function parseModalSubmitInteraction(e){let t=parseInteractionBase(e),n=isObject(e.data)?e.data:null;if(!t||!n||!isNonEmptyString(n.custom_id))return null;let r=isObject(e.message)?e.message:null;return{...t,customId:n.custom_id,messageId:isNonEmptyString(r?.id)?r.id:void 0,textInputs:parseTextInputs(n.components),type:DISCORD_INTERACTION_TYPE.MODAL_SUBMIT}}function parseInteractionBase(e){if(!isNonEmptyString(e.id)||!isNonEmptyString(e.application_id)||!isNonEmptyString(e.channel_id)||!isNonEmptyString(e.token))return null;let t=parseInteractionUser(e);if(!t)return null;let n=isObject(e.channel)?e.channel:void 0;return{applicationId:e.application_id,channelId:e.channel_id,channelType:typeof n?.type==`number`?n.type:void 0,guildId:isNonEmptyString(e.guild_id)?e.guild_id:void 0,id:e.id,member:parseMember(e.member),raw:e,token:e.token,user:t}}function parseInteractionUser(e){return parseUser(e.user)||(parseMember(e.member)?.user??null)}function parseMember(e){if(!isObject(e))return;let t=parseUser(e.user);if(t)return{nick:isNonEmptyString(e.nick)?e.nick:void 0,roles:Array.isArray(e.roles)?e.roles.filter(e=>typeof e==`string`):[],user:t}}function parseUser(e){return!isObject(e)||!isNonEmptyString(e.id)||!isNonEmptyString(e.username)?null:{avatar:isNonEmptyString(e.avatar)?e.avatar:void 0,discriminator:isNonEmptyString(e.discriminator)?e.discriminator:void 0,globalName:isNonEmptyString(e.global_name)?e.global_name:void 0,id:e.id,isBot:e.bot===!0,username:e.username}}function parseOptions(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!isObject(n)||!isNonEmptyString(n.name))continue;let e={name:n.name,options:parseOptions(n.options),type:typeof n.type==`number`?n.type:void 0,value:parseOptionValue(n.value)};t.push(e)}return t}function resolveAttachments(e,t){let n=isObject(t)&&isObject(t.attachments)?t.attachments:void 0;return n===void 0?[]:attachmentOptionIds(e).flatMap(e=>{let t=n[e];return!isObject(t)||!isNonEmptyString(t.url)||!isNonEmptyString(t.filename)?[]:[{contentType:isNonEmptyString(t.content_type)?t.content_type:void 0,filename:t.filename,id:e,size:typeof t.size==`number`?t.size:void 0,url:t.url}]})}function attachmentOptionIds(e){return e.flatMap(e=>[...e.type===11&&typeof e.value==`string`?[e.value]:[],...attachmentOptionIds(e.options)])}function parseOptionValue(e){if(typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return e}function parseTextInputs(e){let t={};if(!Array.isArray(e))return t;for(let n of e)if(isObject(n)&&Array.isArray(n.components))for(let e of n.components)isObject(e)&&isNonEmptyString(e.custom_id)&&typeof e.value==`string`&&(t[e.custom_id]=e.value);return t}function findOptionValue(e,t){for(let n of e){if(n.name===t&&n.value!==void 0)return n.value;let e=findOptionValue(n.options,t);if(e!==void 0)return e}}function formatCommandOptions(e){return e.map(formatOption).filter(e=>e.length>0).join(` `)}function formatOption(e){if(e.type===11)return``;if(e.value!==void 0)return`${e.name}:${String(e.value)}`;let t=formatCommandOptions(e.options);return t?`${e.name} ${t}`:e.name}export{DISCORD_EPHEMERAL_MESSAGE_FLAG,DISCORD_INTERACTION_RESPONSE_TYPE,DISCORD_INTERACTION_TYPE,commandInteractionMessage,formatDiscordContextBlock,parseDiscordInteraction};
1
+ import{isNonEmptyString,isObject}from"#shared/guards.js";const DISCORD_INTERACTION_TYPE={APPLICATION_COMMAND:2,MESSAGE_COMPONENT:3,MODAL_SUBMIT:5,PING:1},DISCORD_INTERACTION_RESPONSE_TYPE={CHANNEL_MESSAGE_WITH_SOURCE:4,DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE:5,DEFERRED_UPDATE_MESSAGE:6,MODAL:9,PONG:1},DISCORD_EPHEMERAL_MESSAGE_FLAG=64;function parseDiscordInteraction(e){if(!isObject(e))return null;let t=e.type;return t===DISCORD_INTERACTION_TYPE.APPLICATION_COMMAND?parseCommandInteraction(e):t===DISCORD_INTERACTION_TYPE.MESSAGE_COMPONENT?parseComponentInteraction(e):t===DISCORD_INTERACTION_TYPE.MODAL_SUBMIT?parseModalSubmitInteraction(e):null}function commandInteractionMessage(e){let t=findOptionValue(e.options,`message`);if(typeof t==`string`&&t.trim().length>0)return t;let n=formatCommandOptions(e.options);return n?`/${e.commandName} ${n}`:`/${e.commandName}`}function formatDiscordContextBlock(e){return[`<discord_context>`,`response_medium: discord`,`response_instructions: Reply for Discord in concise Markdown. Avoid mass mentions, long tables, and messages that need more than a few short posts.`,...e.applicationId?[`application_id: ${e.applicationId}`]:[],`user_id: ${e.userId}`,...e.username?[`username: ${e.username}`]:[],`channel_id: ${e.channelId}`,...e.guildId?[`guild_id: ${e.guildId}`]:[],...e.interactionId?[`interaction_id: ${e.interactionId}`]:[],...e.messageId?[`message_id: ${e.messageId}`]:[],...e.commandName?[`command_name: ${e.commandName}`]:[],`</discord_context>`].join(`
2
+ `)}function parseCommandInteraction(e){let t=parseInteractionBase(e),n=isObject(e.data)?e.data:null;if(!t||!n||!isNonEmptyString(n.name))return null;let r=parseOptions(n.options);return{...t,attachments:resolveAttachments(r,n.resolved),commandId:isNonEmptyString(n.id)?n.id:void 0,commandName:n.name,options:r,type:DISCORD_INTERACTION_TYPE.APPLICATION_COMMAND}}function parseComponentInteraction(e){let t=parseInteractionBase(e),n=isObject(e.data)?e.data:null,r=isObject(e.message)?e.message:null;if(!t||!n||!isNonEmptyString(n.custom_id))return null;let i=isNonEmptyString(r?.id)?r.id:``;return i?{...t,componentType:typeof n.component_type==`number`?n.component_type:0,customId:n.custom_id,messageId:i,type:DISCORD_INTERACTION_TYPE.MESSAGE_COMPONENT,values:Array.isArray(n.values)?n.values.filter(e=>typeof e==`string`):[]}:null}function parseModalSubmitInteraction(e){let t=parseInteractionBase(e),n=isObject(e.data)?e.data:null;if(!t||!n||!isNonEmptyString(n.custom_id))return null;let r=isObject(e.message)?e.message:null;return{...t,customId:n.custom_id,messageId:isNonEmptyString(r?.id)?r.id:void 0,textInputs:parseTextInputs(n.components),type:DISCORD_INTERACTION_TYPE.MODAL_SUBMIT}}function parseInteractionBase(e){if(!isNonEmptyString(e.id)||!isNonEmptyString(e.application_id)||!isNonEmptyString(e.channel_id)||!isNonEmptyString(e.token))return null;let t=parseInteractionUser(e);if(!t)return null;let n=isObject(e.channel)?e.channel:void 0;return{applicationId:e.application_id,channelId:e.channel_id,channelType:typeof n?.type==`number`?n.type:void 0,guildId:isNonEmptyString(e.guild_id)?e.guild_id:void 0,id:e.id,member:parseMember(e.member),raw:e,token:e.token,user:t}}function parseInteractionUser(e){return parseDiscordUser(e.user)||(parseMember(e.member)?.user??null)}function parseMember(e){if(!isObject(e))return;let t=parseDiscordUser(e.user);if(t)return{nick:isNonEmptyString(e.nick)?e.nick:void 0,roles:Array.isArray(e.roles)?e.roles.filter(e=>typeof e==`string`):[],user:t}}function parseDiscordUser(e){return!isObject(e)||!isNonEmptyString(e.id)||!isNonEmptyString(e.username)?null:{avatar:isNonEmptyString(e.avatar)?e.avatar:void 0,discriminator:isNonEmptyString(e.discriminator)?e.discriminator:void 0,globalName:isNonEmptyString(e.global_name)?e.global_name:void 0,id:e.id,isBot:e.bot===!0,username:e.username}}function parseOptions(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!isObject(n)||!isNonEmptyString(n.name))continue;let e={name:n.name,options:parseOptions(n.options),type:typeof n.type==`number`?n.type:void 0,value:parseOptionValue(n.value)};t.push(e)}return t}function resolveAttachments(e,t){let n=isObject(t)&&isObject(t.attachments)?t.attachments:void 0;return n===void 0?[]:attachmentOptionIds(e).flatMap(e=>{let t=parseDiscordAttachment({...isObject(n[e])?n[e]:{},id:e});return t?[t]:[]})}function parseDiscordAttachment(e){return!isObject(e)||!isNonEmptyString(e.id)||!isNonEmptyString(e.url)||!isNonEmptyString(e.filename)?null:{contentType:isNonEmptyString(e.content_type)?e.content_type:void 0,filename:e.filename,id:e.id,size:typeof e.size==`number`?e.size:void 0,url:e.url}}function attachmentOptionIds(e){return e.flatMap(e=>[...e.type===11&&typeof e.value==`string`?[e.value]:[],...attachmentOptionIds(e.options)])}function parseOptionValue(e){if(typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return e}function parseTextInputs(e){let t={};if(!Array.isArray(e))return t;for(let n of e)if(isObject(n)&&Array.isArray(n.components))for(let e of n.components)isObject(e)&&isNonEmptyString(e.custom_id)&&typeof e.value==`string`&&(t[e.custom_id]=e.value);return t}function findOptionValue(e,t){for(let n of e){if(n.name===t&&n.value!==void 0)return n.value;let e=findOptionValue(n.options,t);if(e!==void 0)return e}}function formatCommandOptions(e){return e.map(formatOption).filter(e=>e.length>0).join(` `)}function formatOption(e){if(e.type===11)return``;if(e.value!==void 0)return`${e.name}:${String(e.value)}`;let t=formatCommandOptions(e.options);return t?`${e.name} ${t}`:e.name}export{DISCORD_EPHEMERAL_MESSAGE_FLAG,DISCORD_INTERACTION_RESPONSE_TYPE,DISCORD_INTERACTION_TYPE,commandInteractionMessage,formatDiscordContextBlock,parseDiscordAttachment,parseDiscordInteraction,parseDiscordUser};
@@ -17,7 +17,8 @@ export interface DiscordInstrumentationMetadata extends Record<string, unknown>
17
17
  }
18
18
  export { discordChannel, type DiscordChannel, type DiscordChannelConfig, type DiscordChannelCredentials, type DiscordChannelEvents, type DiscordChannelState, type DiscordCommandResult, type DiscordCommandResultOrPromise, type DiscordContext, type DiscordEventContext, type DiscordHandle, type DiscordInputResponseContext, type DiscordInputResponseInteraction, type DiscordInputResponseResult, type DiscordReceiveTarget, type DiscordRequestOptions, } from "#public/channels/discord/discordChannel.js";
19
19
  export { callDiscordApi, createDiscordFollowupMessage, discordContinuationToken, DISCORD_MESSAGE_CONTENT_MAX_LENGTH, DISCORD_NO_MENTIONS, editDiscordOriginalResponse, resolveDiscordApplicationId, resolveDiscordBotToken, resolveDiscordPublicKey, sendDiscordChannelMessage, splitDiscordMessageContent, triggerDiscordTypingIndicator, type DiscordApiOptions, type DiscordApiResponse, type DiscordApplicationId, type DiscordBotToken, type DiscordCredentials, type DiscordFetch, type DiscordMessageBody, type DiscordPostedMessage, } from "#public/channels/discord/api.js";
20
- export { DISCORD_EPHEMERAL_MESSAGE_FLAG, DISCORD_INTERACTION_RESPONSE_TYPE, DISCORD_INTERACTION_TYPE, commandInteractionMessage, formatDiscordContextBlock, parseDiscordInteraction, type DiscordCommandInteraction, type DiscordCommandOption, type DiscordComponentInteraction, type DiscordInboundContext, type DiscordInteraction, type DiscordInteractionBase, type DiscordMember, type DiscordModalSubmitInteraction, type DiscordUser, } from "#public/channels/discord/inbound.js";
20
+ export { DISCORD_EPHEMERAL_MESSAGE_FLAG, DISCORD_INTERACTION_RESPONSE_TYPE, DISCORD_INTERACTION_TYPE, commandInteractionMessage, formatDiscordContextBlock, parseDiscordInteraction, type DiscordAttachment, type DiscordCommandInteraction, type DiscordCommandOption, type DiscordComponentInteraction, type DiscordInboundContext, type DiscordInteraction, type DiscordInteractionBase, type DiscordMember, type DiscordModalSubmitInteraction, type DiscordUser, } from "#public/channels/discord/inbound.js";
21
21
  export { DISCORD_COMPONENT_TYPE, DISCORD_HITL_CUSTOM_ID_PREFIX, DISCORD_HITL_FREEFORM_CUSTOM_ID_PREFIX, DISCORD_HITL_FREEFORM_TEXT_INPUT_ID, buildFreeformModalResponse, deriveComponentInputResponses, deriveModalInputResponses, isDiscordFreeformComponent, renderInputRequestComponents, } from "#public/channels/discord/hitl.js";
22
- export { defaultDiscordAuth } from "#public/channels/discord/defaults.js";
22
+ export { defaultDiscordAuth, defaultDiscordMessageAuth, } from "#public/channels/discord/defaults.js";
23
+ export type { DiscordGatewayConfig, DiscordGatewayMessage, DiscordMessageResult, DiscordMessageResultOrPromise, DiscordStartThreadOptions, DiscordThreadAutoArchiveMinutes, } from "#public/channels/discord/messages.js";
23
24
  export { verifyDiscordRequest, verifyDiscordSignature, type DiscordPublicKey, type DiscordVerifyOptions, type DiscordWebhookVerifier, } from "#public/channels/discord/verify.js";
@@ -1 +1 @@
1
- import{verifyDiscordRequest,verifyDiscordSignature}from"#public/channels/discord/verify.js";import{DISCORD_MESSAGE_CONTENT_MAX_LENGTH,DISCORD_NO_MENTIONS,callDiscordApi,createDiscordFollowupMessage,discordContinuationToken,editDiscordOriginalResponse,resolveDiscordApplicationId,resolveDiscordBotToken,resolveDiscordPublicKey,sendDiscordChannelMessage,splitDiscordMessageContent,triggerDiscordTypingIndicator}from"#public/channels/discord/api.js";import{DISCORD_COMPONENT_TYPE,DISCORD_HITL_CUSTOM_ID_PREFIX,DISCORD_HITL_FREEFORM_CUSTOM_ID_PREFIX,DISCORD_HITL_FREEFORM_TEXT_INPUT_ID,buildFreeformModalResponse,deriveComponentInputResponses,deriveModalInputResponses,isDiscordFreeformComponent,renderInputRequestComponents}from"#public/channels/discord/hitl.js";import{defaultDiscordAuth}from"#public/channels/discord/defaults.js";import{DISCORD_EPHEMERAL_MESSAGE_FLAG,DISCORD_INTERACTION_RESPONSE_TYPE,DISCORD_INTERACTION_TYPE,commandInteractionMessage,formatDiscordContextBlock,parseDiscordInteraction}from"#public/channels/discord/inbound.js";import{discordChannel}from"#public/channels/discord/discordChannel.js";export{DISCORD_COMPONENT_TYPE,DISCORD_EPHEMERAL_MESSAGE_FLAG,DISCORD_HITL_CUSTOM_ID_PREFIX,DISCORD_HITL_FREEFORM_CUSTOM_ID_PREFIX,DISCORD_HITL_FREEFORM_TEXT_INPUT_ID,DISCORD_INTERACTION_RESPONSE_TYPE,DISCORD_INTERACTION_TYPE,DISCORD_MESSAGE_CONTENT_MAX_LENGTH,DISCORD_NO_MENTIONS,buildFreeformModalResponse,callDiscordApi,commandInteractionMessage,createDiscordFollowupMessage,defaultDiscordAuth,deriveComponentInputResponses,deriveModalInputResponses,discordChannel,discordContinuationToken,editDiscordOriginalResponse,formatDiscordContextBlock,isDiscordFreeformComponent,parseDiscordInteraction,renderInputRequestComponents,resolveDiscordApplicationId,resolveDiscordBotToken,resolveDiscordPublicKey,sendDiscordChannelMessage,splitDiscordMessageContent,triggerDiscordTypingIndicator,verifyDiscordRequest,verifyDiscordSignature};
1
+ import{verifyDiscordRequest,verifyDiscordSignature}from"#public/channels/discord/verify.js";import{DISCORD_COMPONENT_TYPE,DISCORD_HITL_CUSTOM_ID_PREFIX,DISCORD_HITL_FREEFORM_CUSTOM_ID_PREFIX,DISCORD_HITL_FREEFORM_TEXT_INPUT_ID,buildFreeformModalResponse,deriveComponentInputResponses,deriveModalInputResponses,isDiscordFreeformComponent,renderInputRequestComponents}from"#public/channels/discord/hitl.js";import{DISCORD_MESSAGE_CONTENT_MAX_LENGTH,DISCORD_NO_MENTIONS,callDiscordApi,createDiscordFollowupMessage,discordContinuationToken,editDiscordOriginalResponse,resolveDiscordApplicationId,resolveDiscordBotToken,resolveDiscordPublicKey,sendDiscordChannelMessage,splitDiscordMessageContent,triggerDiscordTypingIndicator}from"#public/channels/discord/api.js";import{defaultDiscordAuth,defaultDiscordMessageAuth}from"#public/channels/discord/defaults.js";import{DISCORD_EPHEMERAL_MESSAGE_FLAG,DISCORD_INTERACTION_RESPONSE_TYPE,DISCORD_INTERACTION_TYPE,commandInteractionMessage,formatDiscordContextBlock,parseDiscordInteraction}from"#public/channels/discord/inbound.js";import{discordChannel}from"#public/channels/discord/discordChannel.js";export{DISCORD_COMPONENT_TYPE,DISCORD_EPHEMERAL_MESSAGE_FLAG,DISCORD_HITL_CUSTOM_ID_PREFIX,DISCORD_HITL_FREEFORM_CUSTOM_ID_PREFIX,DISCORD_HITL_FREEFORM_TEXT_INPUT_ID,DISCORD_INTERACTION_RESPONSE_TYPE,DISCORD_INTERACTION_TYPE,DISCORD_MESSAGE_CONTENT_MAX_LENGTH,DISCORD_NO_MENTIONS,buildFreeformModalResponse,callDiscordApi,commandInteractionMessage,createDiscordFollowupMessage,defaultDiscordAuth,defaultDiscordMessageAuth,deriveComponentInputResponses,deriveModalInputResponses,discordChannel,discordContinuationToken,editDiscordOriginalResponse,formatDiscordContextBlock,isDiscordFreeformComponent,parseDiscordInteraction,renderInputRequestComponents,resolveDiscordApplicationId,resolveDiscordBotToken,resolveDiscordPublicKey,sendDiscordChannelMessage,splitDiscordMessageContent,triggerDiscordTypingIndicator,verifyDiscordRequest,verifyDiscordSignature};
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Ordinary Discord messages, which Discord delivers only over its Gateway
3
+ * WebSocket. A relay such as `experimental_runDiscordGatewayRelay` from
4
+ * `eve/channels/discord/gateway` holds that connection and forwards each
5
+ * dispatch, unchanged, to the route this module mounts.
6
+ */
7
+ import type { SessionAuthContext } from "#channel/types.js";
8
+ import { type AuthFn } from "#public/channels/auth.js";
9
+ import type { DiscordChannelConfig, DiscordChannelState, DiscordContext } from "#public/channels/discord/discordChannel.js";
10
+ import { type DiscordAttachment, type DiscordUser } from "#public/channels/discord/inbound.js";
11
+ import { type HttpRouteDefinition } from "#channel/routes.js";
12
+ /** An ordinary Discord message forwarded from the Gateway. */
13
+ export interface DiscordGatewayMessage {
14
+ readonly id: string;
15
+ readonly channelId: string;
16
+ /** Absent for direct messages. */
17
+ readonly guildId?: string;
18
+ /**
19
+ * Message text with the bot's own mention removed. Discord sends an empty
20
+ * string for messages that neither mention the bot nor arrive as a DM unless
21
+ * the bot has the Message Content intent.
22
+ */
23
+ readonly content: string;
24
+ readonly author: DiscordUser;
25
+ readonly attachments: readonly DiscordAttachment[];
26
+ /** ID of the message this one replies to, if any. */
27
+ readonly referencedMessageId?: string;
28
+ /**
29
+ * Whether the message is meant for the bot: a direct message, a mention, a
30
+ * reply to one of the bot's messages, or a message in a thread where the bot
31
+ * already has a conversation.
32
+ */
33
+ readonly addressed: boolean;
34
+ /** Discord's raw message object. */
35
+ readonly raw: Record<string, unknown>;
36
+ }
37
+ /** Minutes of inactivity before Discord archives a thread; the values Discord accepts. */
38
+ export type DiscordThreadAutoArchiveMinutes = 60 | 1440 | 4320 | 10080;
39
+ /** Options for starting a thread from a message; see {@link DiscordMessageResult.startThread}. */
40
+ export interface DiscordStartThreadOptions {
41
+ /** Thread name. Defaults to the message's first line, then its first attachment's filename. */
42
+ readonly name?: string;
43
+ /** Defaults to the channel's own setting. */
44
+ readonly autoArchiveMinutes?: DiscordThreadAutoArchiveMinutes;
45
+ }
46
+ /**
47
+ * Result of the Gateway message hook. Return `null` to ignore the message.
48
+ * - `auth`: session auth context for the dispatched turn, or `null` for anonymous.
49
+ * - `context`: model-visible context lines appended after the Discord context block.
50
+ * - `title`: workflow run title override that does not change model input.
51
+ * - `conversation`: which session in the channel the message joins; see
52
+ * {@link DiscordMessageResult.conversation}.
53
+ * - `startThread`: answer in a new thread off the message; see
54
+ * {@link DiscordMessageResult.startThread}.
55
+ */
56
+ export type DiscordMessageResult = {
57
+ readonly auth: SessionAuthContext | null;
58
+ readonly context?: readonly string[];
59
+ readonly title?: string;
60
+ /**
61
+ * Key of the session the message joins within its Discord channel. Messages
62
+ * with the same key share a session. A message ID is the key of the
63
+ * session that owns that message: the one it started, or the one whose bot
64
+ * reply it is. `"channel"` is one session for the whole channel. Any other
65
+ * string is your own grouping, such as `` `user:${message.author.id}` ``.
66
+ *
67
+ * Defaults to `"channel"` in DMs and threads, which includes the thread a
68
+ * text-channel mention starts; elsewhere, to the replied-to message's session
69
+ * when one owns it, or else a new session keyed by this message.
70
+ */
71
+ readonly conversation?: string;
72
+ /**
73
+ * Starts a thread from the message and moves the conversation into it, as
74
+ * one session for the thread. Applies only when the message would start a
75
+ * new session in a text channel: DMs, messages already in a thread, and
76
+ * replies that continue a session are left as they are. eve adds the author
77
+ * to the thread. When Discord refuses, for example because the bot lacks the
78
+ * Create Public Threads permission, the message is handled as if
79
+ * `startThread` were `false`. Defaults to `gateway.startThread`.
80
+ */
81
+ readonly startThread?: boolean | DiscordStartThreadOptions;
82
+ } | null;
83
+ /** Sync or async {@link DiscordMessageResult}. */
84
+ export type DiscordMessageResultOrPromise = DiscordMessageResult | Promise<DiscordMessageResult>;
85
+ /** Configuration for `discordChannel({ gateway })`. */
86
+ export interface DiscordGatewayConfig {
87
+ /** Override the route that accepts forwarded dispatches (`/eve/v1/discord/gateway`). */
88
+ readonly route?: string;
89
+ /**
90
+ * Authenticates the relay. The body names the message author, so whoever
91
+ * passes can act as any Discord user. Defaults to `localDev()` plus Vercel
92
+ * OIDC tokens from this project's own runtime in the same environment,
93
+ * which is what `experimental_runDiscordGatewayRelay` sends from a Vercel Daemon.
94
+ */
95
+ readonly auth?: AuthFn<Request> | readonly AuthFn<Request>[];
96
+ /**
97
+ * Decides whether a message dispatches, under what `auth`, and which
98
+ * session it joins. Called for every conversational message from a person;
99
+ * bot authors never reach it. Defaults to dispatching addressed messages
100
+ * with `defaultDiscordMessageAuth` and the default `conversation`.
101
+ */
102
+ onMessage?(ctx: DiscordContext, message: DiscordGatewayMessage): DiscordMessageResultOrPromise;
103
+ /**
104
+ * Default for each accepted message's `startThread`. Defaults to `true`, so
105
+ * the bot answers a mention in a text channel in a new thread; set `false`
106
+ * to answer in the channel, where replies continue the conversation. An
107
+ * `onMessage` result's own `startThread` overrides it.
108
+ */
109
+ readonly startThread?: boolean | DiscordStartThreadOptions;
110
+ }
111
+ /** Mounts the route that turns forwarded `MESSAGE_CREATE` dispatches into turns. */
112
+ export declare function createDiscordGatewayRoute(input: {
113
+ readonly config: DiscordChannelConfig;
114
+ readonly gateway: DiscordGatewayConfig;
115
+ readonly buildContext: (state: DiscordChannelState) => DiscordContext;
116
+ }): HttpRouteDefinition<DiscordChannelState>;
@@ -0,0 +1,2 @@
1
+ import{createLogger,logError}from"#internal/logging.js";import{isNonEmptyString,isObject}from"#shared/guards.js";import{localDev,routeAuth}from"#public/channels/auth.js";import{EveAttachmentError}from"#internal/attachments/errors.js";import{readLimitedBytes}from"#internal/attachments/limited-read.js";import{callDiscordApi,discordContinuationToken,resolveDiscordApplicationId,resolveDiscordBotToken}from"#public/channels/discord/api.js";import{defaultOnMessage}from"#public/channels/discord/defaults.js";import{formatDiscordContextBlock,parseDiscordAttachment,parseDiscordUser}from"#public/channels/discord/inbound.js";import{discordCommandContent}from"#public/channels/discord/attachments.js";import{sameEnvironmentVercelOidc}from"#public/channels/same-environment-oidc.js";import{discordAudience}from"#public/channels/discord/audience.js";import{POST}from"#channel/routes.js";const log=createLogger(`discord.gateway`),WHOLE_CHANNEL_CONVERSATION=`channel`,CONVERSATIONAL_MESSAGE_TYPES=new Set([0,19]),THREAD_CHANNEL_TYPES=new Set([10,11,12]);function createDiscordGatewayRoute(e){let{config:t,gateway:n}=e,r=n.auth??[localDev(),sameEnvironmentVercelOidc()],i=n.onMessage??defaultOnMessage;return POST(n.route??`/eve/v1/discord/gateway`,async(a,{from:o,resolveSession:s})=>{let c=await routeAuth(a,r);if(c instanceof Response)return c;let l;try{l=await readLimitedBytes(a,1048576,`discord`)}catch(e){if(!(e instanceof EveAttachmentError))throw e;return Response.json({error:`Body exceeds 1 MB.`},{status:413})}let u;try{u=JSON.parse(l.toString(`utf8`))}catch{return Response.json({error:`Body is not JSON.`},{status:400})}if(!isObject(u)||u.t!==`MESSAGE_CREATE`)return ignored(`unsupported_event`);let d=isObject(u.d)?u.d:null,f=d===null?null:parseGatewayMessage(d);if(f===null)return ignored(`invalid_message`);if(f.author.isBot)return ignored(`bot_author`);let p=await resolveDiscordApplicationId(t.credentials?.applicationId),m=stripMention(f.content,p);if(!m&&f.attachments.length===0)return ignored(`empty_message`);let h=f.guildId===void 0,g=h?void 0:await s(discordContinuationToken(f.channelId,WHOLE_CHANNEL_CONVERSATION)),_={...f,addressed:h||g!==void 0||mentions(f.raw,p)||repliesTo(f.raw,p),content:m},v={applicationId:p,channelId:_.channelId,conversationId:null,guildId:_.guildId??null,hasMessageAnchor:!0,initialResponseSent:!0,interactionToken:null};h&&(v.audience=discordAudience(1),v.directMessage=!0);let y;try{y=await i(e.buildContext(v),_)}catch(e){return logError(log,`Discord message handler failed`,e,{messageId:_.id}),Response.json({error:`The message handler failed.`},{status:500})}if(y===null)return ignored(`not_accepted`);let b=isNonEmptyString(y.conversation)?y.conversation:void 0,x=y.startThread??n.startThread??!0;v.conversationId=await routeMessage();async function routeMessage(){if(h||g!==void 0)return b??WHOLE_CHANNEL_CONVERSATION;if(b===void 0){let e=_.referencedMessageId;if(e!==void 0&&await s(discordContinuationToken(_.channelId,e))!==void 0)return e}else if(x===!1)return b;let e=await lookUpChannelType(t,_.channelId);if(e!==void 0&&(v.audience=discordAudience(e)),e!==void 0&&THREAD_CHANNEL_TYPES.has(e))return b??WHOLE_CHANNEL_CONVERSATION;if(x!==!1){let e=await startThreadFrom(t,_,x===!0?{}:x);if(e!==void 0)return v.channelId=e,v.audience=`unknown`,b??WHOLE_CHANNEL_CONVERSATION}return b??_.id}let S=formatDiscordContextBlock({applicationId:p,channelId:_.channelId,guildId:_.guildId,messageId:_.id,userId:_.author.id,username:_.author.username}),C=await o(discordContinuationToken(v.channelId??_.channelId,v.conversationId)).send(discordCommandContent(m,_.attachments),{auth:y.auth,context:[S,...y.context??[]],state:v,title:y.title});return Response.json({accepted:!0,sessionId:C.id},{status:202})})}function ignored(e){return Response.json({accepted:!1,reason:e})}function parseGatewayMessage(e){if(!isNonEmptyString(e.id)||!isNonEmptyString(e.channel_id)||typeof e.type==`number`&&!CONVERSATIONAL_MESSAGE_TYPES.has(e.type))return null;let t=parseDiscordUser(e.author);return t===null?null:{attachments:Array.isArray(e.attachments)?e.attachments.flatMap(e=>parseDiscordAttachment(e)??[]):[],author:t,channelId:e.channel_id,content:typeof e.content==`string`?e.content:``,guildId:isNonEmptyString(e.guild_id)?e.guild_id:void 0,id:e.id,raw:e,referencedMessageId:referencedMessageId(e)}}function referencedMessageId(e){let t=isObject(e.message_reference)?e.message_reference:null;if(!(t===null||t.type!==void 0&&t.type!==0))return isNonEmptyString(t.message_id)?t.message_id:void 0}function mentions(e,t){return Array.isArray(e.mentions)&&e.mentions.some(e=>isObject(e)&&e.id===t)}function repliesTo(e,t){let n=isObject(e.referenced_message)?e.referenced_message:null;return isObject(n?.author)&&n.author.id===t}function stripMention(e,t){return e.replaceAll(`<@${t}>`,``).replaceAll(`<@!${t}>`,``).trim()}async function startThreadFrom(e,t,n){let r={name:(n.name?.trim()||t.content.split(`
2
+ `,1)[0]?.trim()||t.attachments[0]?.filename||`Conversation`).slice(0,100)};n.autoArchiveMinutes!==void 0&&(r.auto_archive_duration=n.autoArchiveMinutes);try{let n=await resolveDiscordBotToken(e.credentials?.botToken),i={apiBaseUrl:e.api?.apiBaseUrl,botToken:n,fetch:e.api?.fetch},a=await callDiscordApi({...i,body:r,path:`/channels/${encodeURIComponent(t.channelId)}/messages/${encodeURIComponent(t.id)}/threads`}),o=isObject(a.body)?a.body.id:void 0;if(!a.ok||!isNonEmptyString(o)){log.warn(`Discord thread creation failed; answering in the channel`,{channelId:t.channelId,status:a.status});return}let s=await callDiscordApi({...i,method:`PUT`,path:`/channels/${encodeURIComponent(o)}/thread-members/${encodeURIComponent(t.author.id)}`});return s.ok||log.warn(`Adding the author to a Discord thread failed`,{status:s.status,threadId:o}),o}catch(e){log.warn(`Discord thread creation failed; answering in the channel`,{channelId:t.channelId,error:e});return}}async function lookUpChannelType(e,t){try{let n=await callDiscordApi({apiBaseUrl:e.api?.apiBaseUrl,botToken:await resolveDiscordBotToken(e.credentials?.botToken),fetch:e.api?.fetch,method:`GET`,path:`/channels/${encodeURIComponent(t)}`});if(n.ok&&isObject(n.body)&&typeof n.body.type==`number`)return n.body.type;log.warn(`Discord channel lookup failed; treating the channel as a non-thread`,{channelId:t,status:n.status})}catch(e){log.warn(`Discord channel lookup failed; treating the channel as a non-thread`,{channelId:t,error:e})}}export{createDiscordGatewayRoute};
@@ -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??`.`),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};
@@ -30,7 +30,10 @@ export interface LinqChannelCredentials {
30
30
  readonly apiKey?: LinqCredentialValue;
31
31
  /** Signing secret for direct Linq webhook delivery. */
32
32
  readonly signingSecret?: LinqCredentialValue;
33
- /** Trusted verifier for webhooks forwarded by a provider such as Vercel Connect. */
33
+ /**
34
+ * Trusted verifier for webhooks forwarded by a provider such as Vercel Connect.
35
+ * Return a falsy value or throw to reject the request.
36
+ */
34
37
  readonly webhookVerifier?: LinqWebhookVerifier;
35
38
  }
36
39
  /** Configuration for {@link linqChannel}. */
@@ -1 +1 @@
1
- import{vercelOidc}from"#public/channels/auth.js";import{chatSdkChannel}from"#public/channels/chat-sdk/index.js";import{dispatchIMessageTapbacks,iMessageTapbackTool}from"#public/channels/imessage-tapbacks.js";import{createMemoryState}from"#compiled/@chat-adapter/state-memory/index.js";import{createLinqAdapter}from"#compiled/@linqapp/chat-sdk-adapter/index.js";import{formatReplyContext}from"#public/channels/chat-sdk/reply-context.js";import{linqInboundContent,linqQuotedMessage,rehydrateLinqAttachment}from"#public/channels/linq/inboundContent.js";function linqChannel(e){let t=normalizeCredentials(e.credentials);e.baseURL!==void 0&&(t.baseURL=e.baseURL);let n=createLinqAdapter(t);n.rehydrateAttachment=rehydrateLinqAttachment;let r=chatSdkChannel({adapters:{linq:n},concurrency:`concurrent`,events:e.events,routes:{linq:e.route??`/eve/v1/linq`},state:createMemoryState(),streaming:!1,turnPolicy:e.turnPolicy,userName:e.userName??`eve`}),i=e.onMessage??defaultOnMessage;r.bot.onDirectMessage(async(e,t)=>{await dispatchMessage(r,i,e,t)}),r.bot.onNewMessage(/[\s\S]*/,async(e,t)=>{await dispatchMessage(r,i,e,t)}),e.onTapback&&dispatchIMessageTapbacks(r,e.onTapback);let a=Object.assign(r.channel,{tapbackTool:()=>iMessageTapbackTool({adapterName:`linq`,bot:r.bot,channel:a,channelLabel:`Linq`})});return a}function normalizeCredentials(e){let{apiKey:t,signingSecret:n,webhookVerifier:r}=e??{},i={};return t!==void 0&&(i.credentials=createCredentialProvider(t,n)),r===void 0?n===void 0&&(i.webhookVerifier=vercelOidc()):i.webhookVerifier=r,i}function createCredentialProvider(e,t){return async()=>{let n={apiKey:await resolveCredentialValue(e)};return t!==void 0&&(n.signingSecret=await resolveCredentialValue(t)),n}}async function resolveCredentialValue(e){return typeof e==`function`?await e():e}function defaultLinqAuth(e){let t={};return e.author.userName!==void 0&&(t.user_name=e.author.userName),{attributes:t,authenticator:`linq-message`,issuer:`linq`,principalId:`linq:${e.author.userId}`,principalType:e.author.isBot?`service`:`user`,subject:e.author.userId}}async function defaultOnMessage(e,t){return{auth:defaultLinqAuth(t)}}async function dispatchMessage(e,t,n,r){let i=await t({thread:n},r);if(i===null)return;let a=e.bot.getAdapter(`linq`),o=linqInboundContent(r),[,s]=await Promise.all([markReadBestEffort(a,n,r),o===void 0?void 0:linqQuotedMessage(a,r)]);o!==void 0&&await e.send(o,{auth:i.auth,context:[...i.context??[],...s?[formatReplyContext(s,r.text)]:[]],history:i.history,thread:n,title:i.title})}async function markReadBestEffort(e,t,n){try{await e.markRead(t.id,n.id)}catch{}}export{defaultLinqAuth,linqChannel};
1
+ import{sameEnvironmentVercelOidc}from"#public/channels/same-environment-oidc.js";import{chatSdkChannel}from"#public/channels/chat-sdk/index.js";import{dispatchIMessageTapbacks,iMessageTapbackTool}from"#public/channels/imessage-tapbacks.js";import{createMemoryState}from"#compiled/@chat-adapter/state-memory/index.js";import{createLinqAdapter}from"#compiled/@linqapp/chat-sdk-adapter/index.js";import{formatReplyContext}from"#public/channels/chat-sdk/reply-context.js";import{linqInboundContent,linqQuotedMessage,rehydrateLinqAttachment}from"#public/channels/linq/inboundContent.js";function linqChannel(e){let t=normalizeCredentials(e.credentials);e.baseURL!==void 0&&(t.baseURL=e.baseURL);let n=createLinqAdapter(t);n.rehydrateAttachment=rehydrateLinqAttachment;let r=chatSdkChannel({adapters:{linq:n},concurrency:`concurrent`,events:e.events,routes:{linq:e.route??`/eve/v1/linq`},state:createMemoryState(),streaming:!1,turnPolicy:e.turnPolicy,userName:e.userName??`eve`}),i=e.onMessage??defaultOnMessage;r.bot.onDirectMessage(async(e,t)=>{await dispatchMessage(r,i,e,t)}),r.bot.onNewMessage(/[\s\S]*/,async(e,t)=>{await dispatchMessage(r,i,e,t)}),e.onTapback&&dispatchIMessageTapbacks(r,e.onTapback);let a=Object.assign(r.channel,{tapbackTool:()=>iMessageTapbackTool({adapterName:`linq`,bot:r.bot,channel:a,channelLabel:`Linq`})});return a}function normalizeCredentials(e){let{apiKey:t,signingSecret:n,webhookVerifier:r}=e??{},i={};t!==void 0&&(i.credentials=createCredentialProvider(t,n));let a=r??(n===void 0?sameEnvironmentVercelOidc():void 0);return a!==void 0&&(i.webhookVerifier=rejectFalsyResults(a)),i}function rejectFalsyResults(e){return async(t,n)=>await e(t,n)||!1}function createCredentialProvider(e,t){return async()=>{let n={apiKey:await resolveCredentialValue(e)};return t!==void 0&&(n.signingSecret=await resolveCredentialValue(t)),n}}async function resolveCredentialValue(e){return typeof e==`function`?await e():e}function defaultLinqAuth(e){let t={};return e.author.userName!==void 0&&(t.user_name=e.author.userName),{attributes:t,authenticator:`linq-message`,issuer:`linq`,principalId:`linq:${e.author.userId}`,principalType:e.author.isBot?`service`:`user`,subject:e.author.userId}}async function defaultOnMessage(e,t){return{auth:defaultLinqAuth(t)}}async function dispatchMessage(e,t,n,r){let i=await t({thread:n},r);if(i===null)return;let a=e.bot.getAdapter(`linq`),o=linqInboundContent(r),[,s]=await Promise.all([markReadBestEffort(a,n,r),o===void 0?void 0:linqQuotedMessage(a,r)]);o!==void 0&&await e.send(o,{auth:i.auth,context:[...i.context??[],...s?[formatReplyContext(s,r.text)]:[]],history:i.history,thread:n,title:i.title})}async function markReadBestEffort(e,t,n){try{await e.markRead(t.id,n.id)}catch{}}export{defaultLinqAuth,linqChannel};
@@ -1 +1 @@
1
- import{vercelOidc}from"#public/channels/auth.js";import{chatSdkChannel}from"#public/channels/chat-sdk/index.js";import{dispatchIMessageTapbacks,iMessageTapbackTool}from"#public/channels/imessage-tapbacks.js";import{createMemoryState}from"#compiled/@chat-adapter/state-memory/index.js";import{formatReplyContext}from"#public/channels/chat-sdk/reply-context.js";import{createiMessageAdapter}from"#compiled/@photon-ai/chat-adapter-imessage/index.js";import{addPhotonAttachmentDownloads,addPhotonAttachmentRehydration}from"#public/channels/photon/attachments.js";import{photonInboundContent,photonQuotedMessage}from"#public/channels/photon/inboundContent.js";function photonIMessageChannel(e){let t=e.webhookSecret??process.env.IMESSAGE_WEBHOOK_SECRET,n=createiMessageAdapter({credentials:e.credentials,...e.webhookVerifier?{webhookVerifier:e.webhookVerifier}:t?{webhookSecret:t}:{webhookVerifier:vercelOidc()}});addPhotonAttachmentRehydration(n);let r=chatSdkChannel({adapters:{imessage:n},concurrency:`concurrent`,events:e.events,routes:{imessage:e.route??`/eve/v1/photon`},state:createMemoryState(),streaming:!1,turnPolicy:e.turnPolicy,userName:e.userName??`eve`}),i=e.onMessage??defaultOnMessage;r.bot.onDirectMessage(async(e,t)=>{await dispatchMessage(r,i,e,t)}),r.bot.onNewMessage(/[\s\S]*/,async(e,t)=>{await dispatchMessage(r,i,e,t)}),e.onTapback&&dispatchIMessageTapbacks(r,e.onTapback);let a=Object.assign(r.channel,{tapbackTool:()=>iMessageTapbackTool({adapterName:`imessage`,bot:r.bot,channel:a,channelLabel:`Photon iMessage`,sendEmoji:sendPhotonEmojiTapback})});return a}async function sendPhotonEmojiTapback(e,t,n,r){let i=(await e.fetchMessage?.(t,n))?.raw;if(typeof i?.react!=`function`)throw Error(`Photon could not find the message to react to.`);await i.react(r)}function defaultPhotonAuth(e){let t={};return e.author.userName!==void 0&&(t.user_name=e.author.userName),{attributes:t,authenticator:`photon-imessage`,issuer:`photon`,principalId:`photon:${e.author.userId}`,principalType:e.author.isBot?`service`:`user`,subject:e.author.userId}}async function defaultOnMessage(e,t){return{auth:defaultPhotonAuth(t)}}async function dispatchMessage(e,t,n,r){let i=await t({thread:n},r);if(i===null)return;let a=e.bot.getAdapter(`imessage`);await markReadBestEffort(a,n,r),await addPhotonAttachmentDownloads(r,a);let o=photonInboundContent(r);if(o===void 0)return;let s=photonQuotedMessage(r);await e.send(o,{idempotencyKey:r.id,auth:i.auth,context:[...i.context??[],...s?[formatReplyContext(s,r.text)]:[]],history:i.history,thread:n,title:i.title})}async function markReadBestEffort(e,t,n){try{await e.markRead(t.id,n.id)}catch{}}export{defaultPhotonAuth,photonIMessageChannel};
1
+ import{sameEnvironmentVercelOidc}from"#public/channels/same-environment-oidc.js";import{chatSdkChannel}from"#public/channels/chat-sdk/index.js";import{dispatchIMessageTapbacks,iMessageTapbackTool}from"#public/channels/imessage-tapbacks.js";import{createMemoryState}from"#compiled/@chat-adapter/state-memory/index.js";import{formatReplyContext}from"#public/channels/chat-sdk/reply-context.js";import{createiMessageAdapter}from"#compiled/@photon-ai/chat-adapter-imessage/index.js";import{addPhotonAttachmentDownloads,addPhotonAttachmentRehydration}from"#public/channels/photon/attachments.js";import{photonInboundContent,photonQuotedMessage}from"#public/channels/photon/inboundContent.js";function photonIMessageChannel(e){let t=e.webhookSecret??process.env.IMESSAGE_WEBHOOK_SECRET,n=createiMessageAdapter({credentials:e.credentials,...e.webhookVerifier?{webhookVerifier:e.webhookVerifier}:t?{webhookSecret:t}:{webhookVerifier:sameEnvironmentVercelOidc()}});addPhotonAttachmentRehydration(n);let r=chatSdkChannel({adapters:{imessage:n},concurrency:`concurrent`,events:e.events,routes:{imessage:e.route??`/eve/v1/photon`},state:createMemoryState(),streaming:!1,turnPolicy:e.turnPolicy,userName:e.userName??`eve`}),i=e.onMessage??defaultOnMessage;r.bot.onDirectMessage(async(e,t)=>{await dispatchMessage(r,i,e,t)}),r.bot.onNewMessage(/[\s\S]*/,async(e,t)=>{await dispatchMessage(r,i,e,t)}),e.onTapback&&dispatchIMessageTapbacks(r,e.onTapback);let a=Object.assign(r.channel,{tapbackTool:()=>iMessageTapbackTool({adapterName:`imessage`,bot:r.bot,channel:a,channelLabel:`Photon iMessage`,sendEmoji:sendPhotonEmojiTapback})});return a}async function sendPhotonEmojiTapback(e,t,n,r){let i=(await e.fetchMessage?.(t,n))?.raw;if(typeof i?.react!=`function`)throw Error(`Photon could not find the message to react to.`);await i.react(r)}function defaultPhotonAuth(e){let t={};return e.author.userName!==void 0&&(t.user_name=e.author.userName),{attributes:t,authenticator:`photon-imessage`,issuer:`photon`,principalId:`photon:${e.author.userId}`,principalType:e.author.isBot?`service`:`user`,subject:e.author.userId}}async function defaultOnMessage(e,t){return{auth:defaultPhotonAuth(t)}}async function dispatchMessage(e,t,n,r){let i=await t({thread:n},r);if(i===null)return;let a=e.bot.getAdapter(`imessage`);await markReadBestEffort(a,n,r),await addPhotonAttachmentDownloads(r,a);let o=photonInboundContent(r);if(o===void 0)return;let s=photonQuotedMessage(r);await e.send(o,{idempotencyKey:r.id,auth:i.auth,context:[...i.context??[],...s?[formatReplyContext(s,r.text)]:[]],history:i.history,thread:n,title:i.title})}async function markReadBestEffort(e,t,n){try{await e.markRead(t.id,n.id)}catch{}}export{defaultPhotonAuth,photonIMessageChannel};
@@ -0,0 +1,7 @@
1
+ import { type AuthFn } from "#public/channels/auth.js";
2
+ /**
3
+ * Vercel OIDC from this project in the current environment only. Tokens from
4
+ * the project's other environments, such as a preview deployment, authenticate
5
+ * as `service` and must not reach this deployment's inbound channel routes.
6
+ */
7
+ export declare function sameEnvironmentVercelOidc(): AuthFn<Request>;
@@ -0,0 +1 @@
1
+ import{vercelOidc}from"#public/channels/auth.js";function sameEnvironmentVercelOidc(){let e=vercelOidc();return async t=>{let n=await e(t);return n?.principalType===`runtime`?n:null}}export{sameEnvironmentVercelOidc};
@@ -1 +1 @@
1
- import{SessionStrandedError}from"#channel/session-stranded-error.js";import{createMetadataAudienceProjector}from"#channel/audience.js";import{CHANNEL_SENTINEL}from"#channel/compiled-channel.js";import{defaultDeliverResult}from"#channel/adapter.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{mergeUploadPolicy}from"#public/channels/upload-policy.js";import{normalizeChannelCors}from"#channel/cors.js";import{HTTP_ADAPTER_KIND}from"#channel/http.js";import{DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT,WS}from"#channel/routes.js";const DISABLED_ROUTE_SENTINEL_KIND=`eve:disabled-channel`;function disableRoute(){return{kind:DISABLED_ROUTE_SENTINEL_KIND}}function isDisabledRouteSentinel(e){return typeof e==`object`&&!!e&&e.kind===DISABLED_ROUTE_SENTINEL_KIND}function defineChannel(e){let t=buildAdapter(e),n=normalizeChannelCors(e.cors);return{__kind:CHANNEL_SENTINEL,routes:e.routes,adapter:t,cors:n,receive:e.receive,turnPolicy:e.turnPolicy}}const eventTypes=Object.keys({"approval.candidate":null,"approval.settled":null,"context.cleared":null,"compaction.requested":null,"compaction.completed":null,"turn.started":null,"actions.requested":null,"action.partial":null,"action.result":null,"message.completed":null,"message.appended":null,"reasoning.appended":null,"reasoning.completed":null,"step.started":null,"step.completed":null,"input.requested":null,"input.resolved":null,"task.started":null,"task.settled":null,"turn.waiting":null,"turn.failed":null,"turn.completed":null,"turn.cancelled":null,"session.failed":null,"session.completed":null,"session.waiting":null,"authorization.required":null,"authorization.completed":null});function buildAdapter(e){let t=e.state!=null,n=e.context!=null,r=e.fetchFile!==void 0,i=e.metadata,a=i!==void 0,o=e.audience,s=e.uploadPolicy===void 0?void 0:mergeUploadPolicy(e.uploadPolicy),c=t||n||a||s!==void 0,l={},u=!1,d={kind:e.kindHint??`defineChannel`},f=e.events;for(let e of eventTypes){let t=f?.[e];t&&(u=!0,l[e]=(n,r)=>{let{session:i,...a}=r,o={...a,continuation:i?.continuation===void 0?void 0:{token:i.continuation.token,alias:e=>i.continuation?.alias(e)}};if(e===`session.failed`)return t(n,o);let s=buildCallbackContext();return t(n,o,s)})}return!c&&!u&&!r?{kind:e.kindHint??HTTP_ADAPTER_KIND,...o===void 0?void 0:{instrumentation:{audience:o}}}:{kind:e.kindHint??`defineChannel`,state:t?{...e.state}:{},fetchFile:e.fetchFile,uploadPolicy:s,instrumentation:i===void 0&&o===void 0?void 0:{...i===void 0?void 0:{metadata(e){let{audience:t,...n}=i(e);return n}},...o===void 0?i===void 0?void 0:{audience:createMetadataAudienceProjector(d,i)}:{audience:o}},createAdapterContext(t){let r=t.state,i=t.session;return{...n?e.context(r,i):{},state:r,ctx:t.ctx,session:i}},deliver(t,n){return e.deliver===void 0?defaultDeliverResult(t):e.deliver(t,n)},...l}}export{DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT,SessionStrandedError,WS,defineChannel,disableRoute,isDisabledRouteSentinel};
1
+ import{SessionStrandedError}from"#channel/session-stranded-error.js";import{createMetadataAudienceProjector}from"#channel/audience.js";import{CHANNEL_SENTINEL}from"#channel/compiled-channel.js";import{defaultDeliverResult}from"#channel/adapter.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{mergeUploadPolicy}from"#public/channels/upload-policy.js";import{DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT,WS}from"#channel/routes.js";import{normalizeChannelCors}from"#channel/cors.js";import{HTTP_ADAPTER_KIND}from"#channel/http.js";const DISABLED_ROUTE_SENTINEL_KIND=`eve:disabled-channel`;function disableRoute(){return{kind:DISABLED_ROUTE_SENTINEL_KIND}}function isDisabledRouteSentinel(e){return typeof e==`object`&&!!e&&e.kind===DISABLED_ROUTE_SENTINEL_KIND}function defineChannel(e){let t=buildAdapter(e),n=normalizeChannelCors(e.cors);return{__kind:CHANNEL_SENTINEL,routes:e.routes,adapter:t,cors:n,receive:e.receive,turnPolicy:e.turnPolicy}}const eventTypes=Object.keys({"approval.candidate":null,"approval.settled":null,"context.cleared":null,"compaction.requested":null,"compaction.completed":null,"turn.started":null,"actions.requested":null,"action.partial":null,"action.result":null,"message.completed":null,"message.appended":null,"reasoning.appended":null,"reasoning.completed":null,"step.started":null,"step.completed":null,"input.requested":null,"input.resolved":null,"task.started":null,"task.settled":null,"turn.waiting":null,"turn.failed":null,"turn.completed":null,"turn.cancelled":null,"session.failed":null,"session.completed":null,"session.waiting":null,"authorization.required":null,"authorization.completed":null});function buildAdapter(e){let t=e.state!=null,n=e.context!=null,r=e.fetchFile!==void 0,i=e.metadata,a=i!==void 0,o=e.audience,s=e.uploadPolicy===void 0?void 0:mergeUploadPolicy(e.uploadPolicy),c=t||n||a||s!==void 0,l={},u=!1,d={kind:e.kindHint??`defineChannel`},f=e.events;for(let e of eventTypes){let t=f?.[e];t&&(u=!0,l[e]=(n,r)=>{let{session:i,...a}=r,o={...a,continuation:i?.continuation===void 0?void 0:{token:i.continuation.token,alias:e=>i.continuation?.alias(e)}};if(e===`session.failed`)return t(n,o);let s=buildCallbackContext();return t(n,o,s)})}return!c&&!u&&!r?{kind:e.kindHint??HTTP_ADAPTER_KIND,...o===void 0?void 0:{instrumentation:{audience:o}}}:{kind:e.kindHint??`defineChannel`,state:t?{...e.state}:{},fetchFile:e.fetchFile,uploadPolicy:s,instrumentation:i===void 0&&o===void 0?void 0:{...i===void 0?void 0:{metadata(e){let{audience:t,...n}=i(e);return n}},...o===void 0?i===void 0?void 0:{audience:createMetadataAudienceProjector(d,i)}:{audience:o}},createAdapterContext(t){let r=t.state,i=t.session;return{...n?e.context(r,i):{},state:r,ctx:t.ctx,session:i}},deliver(t,n){return e.deliver===void 0?defaultDeliverResult(t):e.deliver(t,n)},...l}}export{DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT,SessionStrandedError,WS,defineChannel,disableRoute,isDisabledRouteSentinel};
@@ -1,5 +1,5 @@
1
1
  import type { SandboxSelector } from "#shared/sandbox-environment.js";
2
- export type { SandboxCommandResult, SandboxProcess, SandboxReadBinaryFileOptions, SandboxReadFileOptions, SandboxRemovePathOptions, SandboxReadTextFileOptions, SandboxRunOptions, SandboxSession, RuntimeSandboxSession, RuntimeSandboxSessionFor, SandboxSpawnOptions, SandboxWriteBinaryFileOptions, SandboxWriteFileOptions, SandboxWriteTextFileOptions, } from "#shared/sandbox-session.js";
2
+ export type { SandboxCommandResult, SandboxProcess, SandboxReadBinaryFileOptions, SandboxReadFileOptions, SandboxRemovePathOptions, SandboxReadTextFileOptions, SandboxRunOptions, SandboxSession, RuntimeSandboxSession, RuntimeSandboxSessionFor, SandboxSpawnOptions, SandboxWriteBinaryFileOptions, SandboxWriteFileOptions, SandboxWriteFilesOptions, SandboxWriteTextFileOptions, } from "#shared/sandbox-session.js";
3
3
  export type { SandboxOpenArguments, SandboxEnvironment, SandboxSelector, SandboxSelectorContext, } from "#shared/sandbox-environment.js";
4
4
  export declare function defineSandbox(definition: SandboxSelector): SandboxSelector;
5
5
  export declare function defineParentSandbox(): SandboxSelector;
@@ -1 +1 @@
1
- import{resolveSharedEveDevServer,startEveProductionServer}from"#shared/framework-eve-server.js";const NEXT_PHASE_PRODUCTION_BUILD=`phase-production-build`,NEXT_PHASE_PRODUCTION_SERVER=`phase-production-server`,EVE_NEXT_HOST={label:`Next.js`,slug:`next`},globalStateSymbol=Symbol.for(`eve.next.state`);function getGlobalState(){let e=globalThis;return e[globalStateSymbol]??={servers:new Map},e[globalStateSymbol]}function readEveBaseUrlEnvironment(){let e=process.env.EVE_BASE_URL;if(e!==void 0&&e.trim().length!==0)return new URL(e).origin}async function ensureEveProductionServer(e){let t=getGlobalState(),n=`production:${e.appRoot}:${e.origin}`,r=t.servers.get(n);r===void 0&&(r=startEveProductionServer({appRoot:e.appRoot,host:EVE_NEXT_HOST,origin:e.origin}).catch(e=>{throw t.servers.delete(n),e}),t.servers.set(n,r)),await r}async function resolveEveDestinationPrefix(e){if(process.env.NODE_ENV===`production`)return e.productionDestinationPrefix;let t=readEveBaseUrlEnvironment();if(t!==void 0)return t;if(process.env.NODE_ENV!==`development`)return e.productionDestinationPrefix;let n=getGlobalState(),r=`dev:${e.appRoot}`,i=n.servers.get(r);return i===void 0&&(i=resolveSharedEveDevServer({appRoot:e.appRoot,host:EVE_NEXT_HOST,logLabel:e.logLabel,timeoutMs:e.devServerTimeoutMs,workspaceAgentName:e.workspaceAgentName}).catch(e=>{throw n.servers.delete(r),e}),n.servers.set(r,i)),(await i).origin}export{EVE_NEXT_HOST,NEXT_PHASE_PRODUCTION_BUILD,NEXT_PHASE_PRODUCTION_SERVER,ensureEveProductionServer,resolveEveDestinationPrefix};
1
+ import{resolveSharedEveDevServer,startEveProductionServer}from"#shared/framework-eve-server.js";const NEXT_PHASE_PRODUCTION_BUILD=`phase-production-build`,NEXT_PHASE_PRODUCTION_SERVER=`phase-production-server`,EVE_NEXT_HOST={label:`Next.js`,slug:`next`},globalStateSymbol=Symbol.for(`eve.next.state`);function getGlobalState(){let e=globalThis;return e[globalStateSymbol]??={servers:new Map},e[globalStateSymbol]}function readEveBaseUrlEnvironment(){let e=process.env.EVE_BASE_URL;if(e!==void 0&&e.trim().length!==0)return new URL(e).origin}async function ensureEveProductionServer(e){let t=getGlobalState(),n=`production:${e.appRoot}:${e.origin}`,r=t.servers.get(n);r===void 0&&(r=startEveProductionServer({appRoot:e.appRoot,host:EVE_NEXT_HOST,origin:e.origin,portRetryHint:`set EVE_NEXT_PRODUCTION_PORT to another port`}).catch(e=>{throw t.servers.delete(n),e}),t.servers.set(n,r)),await r}async function resolveEveDestinationPrefix(e){if(process.env.NODE_ENV===`production`)return e.productionDestinationPrefix;let t=readEveBaseUrlEnvironment();if(t!==void 0)return t;if(process.env.NODE_ENV!==`development`)return e.productionDestinationPrefix;let n=getGlobalState(),r=`dev:${e.appRoot}`,i=n.servers.get(r);return i===void 0&&(i=resolveSharedEveDevServer({appRoot:e.appRoot,host:EVE_NEXT_HOST,logLabel:e.logLabel,timeoutMs:e.devServerTimeoutMs,workspaceAgentName:e.workspaceAgentName}).catch(e=>{throw n.servers.delete(r),e}),n.servers.set(r,i)),(await i).origin}export{EVE_NEXT_HOST,NEXT_PHASE_PRODUCTION_BUILD,NEXT_PHASE_PRODUCTION_SERVER,ensureEveProductionServer,resolveEveDestinationPrefix};
@@ -4,6 +4,11 @@ import type { SandboxNetworkOptions, SandboxNetworkPolicy } from "#shared/sandbo
4
4
  export type DockerSandboxPullPolicy = "if-not-present" | "always" | "never";
5
5
  /** Coarse-grained egress policy for one live Docker sandbox. */
6
6
  export type DockerSandboxNetworkPolicy = Extract<SandboxNetworkPolicy, "allow-all" | "deny-all">;
7
+ /** Live sandbox capabilities exposed by a Docker environment. */
8
+ export interface DockerSandboxSession extends SandboxSession {
9
+ /** Applies a coarse egress policy to the live container. */
10
+ setNetworkPolicy(policy: DockerSandboxNetworkPolicy): Promise<void>;
11
+ }
7
12
  /** Options shared by every sandbox created from one Docker environment. */
8
13
  export interface DockerSandboxEnvironmentOptions {
9
14
  /** Base container image. Defaults to eve's published sandbox image. */
@@ -13,7 +18,7 @@ export interface DockerSandboxEnvironmentOptions {
13
18
  /** Base image pull behavior. @default "if-not-present" */
14
19
  readonly pullPolicy?: DockerSandboxPullPolicy;
15
20
  /** Idempotent setup captured in the prepared image. */
16
- readonly prepare?: (sandbox: SandboxSession) => Promise<void> | void;
21
+ readonly prepare?: (sandbox: DockerSandboxSession) => Promise<void> | void;
17
22
  }
18
23
  /** Options applied when eve creates one live Docker sandbox. */
19
24
  export interface DockerSandboxRuntimeOptions extends SandboxNetworkOptions {
@@ -1,9 +1,2 @@
1
- import type { SandboxSession } from "#shared/sandbox-session.js";
2
- import type { DockerSandboxNetworkPolicy } from "#public/sandbox/docker-sandbox.js";
3
- /** Live sandbox capabilities exposed by a Docker environment. */
4
- export interface DockerSandboxSession extends SandboxSession {
5
- /** Applies a coarse egress policy to the live container. */
6
- setNetworkPolicy(policy: DockerSandboxNetworkPolicy): Promise<void>;
7
- }
8
1
  export { DockerSandbox, type DockerSandboxEnvironmentOptions, type DockerSandboxRuntimeOptions, } from "#sandbox/providers/docker.js";
9
- export type { DockerSandboxNetworkPolicy, DockerSandboxPullPolicy, } from "#public/sandbox/docker-sandbox.js";
2
+ export type { DockerSandboxNetworkPolicy, DockerSandboxPullPolicy, DockerSandboxSession, } from "#public/sandbox/docker-sandbox.js";
@@ -1,4 +1,4 @@
1
- export { defineParentSandbox, defineSandbox, type SandboxOpenArguments, type SandboxEnvironment, type SandboxSelector, type SandboxSelectorContext, type SandboxCommandResult, 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";
1
+ export { defineParentSandbox, defineSandbox, type SandboxOpenArguments, type SandboxEnvironment, type SandboxSelector, type SandboxSelectorContext, type SandboxCommandResult, type SandboxProcess, type SandboxReadBinaryFileOptions, type SandboxReadFileOptions, type SandboxReadTextFileOptions, type SandboxRunOptions, type SandboxSession, type RuntimeSandboxSession, type RuntimeSandboxSessionFor, type SandboxSpawnOptions, type SandboxRemovePathOptions, type SandboxWriteBinaryFileOptions, type SandboxWriteFileOptions, type SandboxWriteFilesOptions, type SandboxWriteTextFileOptions, } from "#public/definitions/sandbox.js";
2
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";
3
+ export type { DefaultSandboxEnvironmentOptions, DefaultSandboxRuntimeOptions, DefaultSandboxSession, } from "#sandbox/providers/default.js";
4
+ export type { SandboxNetworkMatch, SandboxNetworkMatcher, SandboxNetworkOptions, SandboxNetworkPolicy, SandboxNetworkRule, } from "#shared/sandbox-network-policy.js";