eve 0.81.1 → 0.83.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (687) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/NOTICE +1 -1
  3. package/dist/src/channel/channel-address.d.ts +21 -2
  4. package/dist/src/channel/channel-address.js +1 -1
  5. package/dist/src/channel/channel-operations.d.ts +32 -1
  6. package/dist/src/channel/channel-operations.js +1 -1
  7. package/dist/src/channel/delivery-idempotency.d.ts +4 -0
  8. package/dist/src/channel/delivery-idempotency.js +1 -0
  9. package/dist/src/channel/pending-authorization.d.ts +5 -0
  10. package/dist/src/channel/pending-authorization.js +1 -1
  11. package/dist/src/channel/routes.d.ts +6 -0
  12. package/dist/src/channel/session.d.ts +7 -0
  13. package/dist/src/channel/session.js +1 -1
  14. package/dist/src/channel/types.d.ts +19 -11
  15. package/dist/src/chunks/{use-eve-agent-DLkjJIm3.js → use-eve-agent-3-WRmJkd.js} +76 -5
  16. package/dist/src/chunks/{use-eve-agent-Bp6nbhfV.js → use-eve-agent-Ci5dr0aR.js} +76 -5
  17. package/dist/src/cli/dev/command-options.d.ts +1 -0
  18. package/dist/src/cli/dev/diagnostic-dump.js +1 -1
  19. package/dist/src/cli/dev/local-server-child.js +1 -1
  20. package/dist/src/cli/dev/local-server-cleanup.js +1 -1
  21. package/dist/src/cli/dev/tui/question-panel.d.ts +4 -1
  22. package/dist/src/cli/dev/tui/question-panel.js +1 -1
  23. package/dist/src/cli/dev/tui/terminal-renderer.js +4 -4
  24. package/dist/src/cli/run.d.ts +1 -0
  25. package/dist/src/cli/run.js +1 -1
  26. package/dist/src/client/eve-agent-store.d.ts +1 -1
  27. package/dist/src/client/eve-agent-store.js +1 -1
  28. package/dist/src/client/index.d.ts +2 -1
  29. package/dist/src/client/message-reducer-types.d.ts +7 -3
  30. package/dist/src/client/message-reducer.js +1 -1
  31. package/dist/src/client/session-controls.d.ts +6 -0
  32. package/dist/src/client/session-controls.js +1 -1
  33. package/dist/src/client/session.d.ts +4 -0
  34. package/dist/src/client/session.js +1 -1
  35. package/dist/src/client/transcript-reducer.d.ts +6 -3
  36. package/dist/src/client/transcript-reducer.js +1 -1
  37. package/dist/src/compiled/.vendor-stamp.json +8 -8
  38. package/dist/src/compiled/@eve/catalog/index.js +1 -1
  39. package/dist/src/compiled/@workflow/core/events-consumer.d.ts +2 -0
  40. package/dist/src/compiled/@workflow/core/index.js +2 -2
  41. package/dist/src/compiled/@workflow/core/private.d.ts +5 -3
  42. package/dist/src/compiled/@workflow/core/private.js +1 -1
  43. package/dist/src/compiled/@workflow/core/runtime/constants.d.ts +1 -37
  44. package/dist/src/compiled/@workflow/core/runtime/event-limit-warning.d.ts +32 -0
  45. package/dist/src/compiled/@workflow/core/runtime/helpers.d.ts +5 -6
  46. package/dist/src/compiled/@workflow/core/runtime/helpers.js +1 -1
  47. package/dist/src/compiled/@workflow/core/runtime/runs.d.ts +8 -0
  48. package/dist/src/compiled/@workflow/core/runtime/start.d.ts +16 -0
  49. package/dist/src/compiled/@workflow/core/runtime/suspension-handler.d.ts +15 -18
  50. package/dist/src/compiled/@workflow/core/runtime/vm-mode.d.ts +20 -0
  51. package/dist/src/compiled/@workflow/core/runtime.js +4 -4
  52. package/dist/src/compiled/@workflow/core/seeded-nanoid.d.ts +2 -0
  53. package/dist/src/compiled/@workflow/core/serialization/compression.d.ts +14 -3
  54. package/dist/src/compiled/@workflow/core/serialization.d.ts +1 -1
  55. package/dist/src/compiled/@workflow/core/serialization.js +1 -1
  56. package/dist/src/compiled/@workflow/core/telemetry/semantic-conventions.d.ts +0 -18
  57. package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
  58. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  59. package/dist/src/compiled/@workflow/errors/index.d.ts +48 -0
  60. package/dist/src/compiled/@workflow/errors/index.js +1 -1
  61. package/dist/src/compiled/@workflow/world/env-config.d.ts +24 -0
  62. package/dist/src/compiled/@workflow/world/events.d.ts +126 -7
  63. package/dist/src/compiled/@workflow/world/index.d.ts +3 -3
  64. package/dist/src/compiled/@workflow/world/interfaces.d.ts +59 -8
  65. package/dist/src/compiled/@workflow/world/queue.d.ts +71 -9
  66. package/dist/src/compiled/@workflow/world/recovery.d.ts +6 -0
  67. package/dist/src/compiled/@workflow/world/test-support/duplicate-event-fixtures.d.ts +3 -0
  68. package/dist/src/compiled/@workflow/world/test-support/in-band-fence-conformance.d.ts +46 -0
  69. package/dist/src/compiled/@workflow/world-local/index.js +5 -5
  70. package/dist/src/compiled/@workflow/world-vercel/index.js +18 -18
  71. package/dist/src/compiled/_chunks/workflow/{attribute-changes-BW-kbMMn.js → attribute-changes-7se_SE2q.js} +3 -3
  72. package/dist/src/compiled/_chunks/workflow/dist-CcnNPAp4.js +1 -0
  73. package/dist/src/compiled/_chunks/workflow/dist-S9cZRway.js +3 -0
  74. package/dist/src/compiled/_chunks/workflow/helpers-CxNRXH0a.js +1 -0
  75. package/dist/src/compiled/_chunks/workflow/private-DLYTSBbu.js +1 -0
  76. package/dist/src/compiled/_chunks/workflow/resume-hook-CPiIfe8r.js +1 -0
  77. package/dist/src/compiled/_chunks/workflow/{run-DzdAqdb1.js → run-BJSLCXR4.js} +6 -6
  78. package/dist/src/compiled/_chunks/workflow/serialization-B9gneT9Z.js +15 -0
  79. package/dist/src/compiled/_chunks/workflow/sleep-BL0oQs3R.js +1 -0
  80. package/dist/src/compiled/_chunks/workflow/{wait-until-xbRRDuUf.js → wait-until-BPou0RGO.js} +1 -1
  81. package/dist/src/compiled/_chunks/workflow/workflow-routes-BaljomCk.js +1 -0
  82. package/dist/src/compiled/{@ai-sdk/code-mode → run}/LICENSE +1 -1
  83. package/dist/src/compiled/run/index.d.ts +384 -0
  84. package/dist/src/compiled/run/index.js +650 -0
  85. package/dist/src/compiler/extension-compatibility.d.ts +28 -20
  86. package/dist/src/compiler/extension-compatibility.js +1 -1
  87. package/dist/src/compiler/load-binding-namespace.d.ts +2 -0
  88. package/dist/src/compiler/load-binding-namespace.js +1 -1
  89. package/dist/src/compiler/manifest.js +1 -1
  90. package/dist/src/compiler/module-lifecycle.d.ts +1 -1
  91. package/dist/src/compiler/module-lifecycle.js +1 -1
  92. package/dist/src/compiler/module-map.js +1 -1
  93. package/dist/src/compiler/normalize-agent-config.js +1 -1
  94. package/dist/src/compiler/normalize-manifest.js +1 -1
  95. package/dist/src/compiler/normalize-sandbox.js +1 -1
  96. package/dist/src/compiler/project-sources.d.ts +6 -0
  97. package/dist/src/compiler/project-sources.js +1 -1
  98. package/dist/src/compiler/workspace-resources.js +1 -1
  99. package/dist/src/context/build-callback-context.js +1 -1
  100. package/dist/src/context/dynamic-skill-lifecycle.js +1 -1
  101. package/dist/src/context/keys.d.ts +2 -0
  102. package/dist/src/context/keys.js +1 -1
  103. package/dist/src/context/providers/sandbox.js +1 -1
  104. package/dist/src/discover/extension-specifier.d.ts +1 -0
  105. package/dist/src/discover/extension-specifier.js +1 -1
  106. package/dist/src/evals/cli/eval-state-directory.d.ts +7 -0
  107. package/dist/src/evals/cli/eval-state-directory.js +1 -0
  108. package/dist/src/evals/cli/eval.js +2 -2
  109. package/dist/src/evals/runner/artifacts.js +1 -1
  110. package/dist/src/evals/runner/derive-run-facts.d.ts +12 -0
  111. package/dist/src/evals/runner/derive-run-facts.js +1 -1
  112. package/dist/src/evals/runner/execute-task.js +1 -1
  113. package/dist/src/evals/types.d.ts +3 -2
  114. package/dist/src/eve-channel/index.js +1 -1
  115. package/dist/src/eve-channel/request.d.ts +0 -1
  116. package/dist/src/eve-channel/request.js +2 -2
  117. package/dist/src/eve-channel/support.d.ts +2 -0
  118. package/dist/src/eve-channel/support.js +1 -1
  119. package/dist/src/eve-channel/types.d.ts +7 -0
  120. package/dist/src/execution/agent-sessions/context.d.ts +3 -14
  121. package/dist/src/execution/agent-sessions/context.js +1 -1
  122. package/dist/src/execution/agent-sessions/runtime-overrides.d.ts +5 -0
  123. package/dist/src/execution/agent-sessions/session.d.ts +2 -2
  124. package/dist/src/execution/agent-sessions/session.js +1 -1
  125. package/dist/src/execution/agent-sessions/steps.d.ts +2 -0
  126. package/dist/src/execution/agent-sessions/steps.js +1 -1
  127. package/dist/src/execution/coordination-dispatch-shared.d.ts +8 -5
  128. package/dist/src/execution/coordination-dispatch-shared.js +1 -1
  129. package/dist/src/execution/coordination-dispatch-step.d.ts +17 -2
  130. package/dist/src/execution/coordination-dispatch-step.js +1 -1
  131. package/dist/src/execution/create-session-step.d.ts +5 -2
  132. package/dist/src/execution/create-session-step.js +1 -1
  133. package/dist/src/execution/deliver-payloads.js +1 -1
  134. package/dist/src/execution/durable-session-store.d.ts +0 -1
  135. package/dist/src/execution/dynamic-connection-recovery.js +1 -1
  136. package/dist/src/execution/dynamic-workflow/program-step.d.ts +7 -7
  137. package/dist/src/execution/dynamic-workflow/program-step.js +1 -1
  138. package/dist/src/execution/dynamic-workflow/schema.d.ts +18 -11
  139. package/dist/src/execution/dynamic-workflow/schema.js +1 -1
  140. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  141. package/dist/src/execution/dynamic-workflow/workflow.js +1 -1
  142. package/dist/src/execution/effective-agent-config.d.ts +8 -2
  143. package/dist/src/execution/effective-agent-config.js +1 -1
  144. package/dist/src/execution/eve-workflow-attributes.d.ts +3 -1
  145. package/dist/src/execution/eve-workflow-attributes.js +1 -1
  146. package/dist/src/execution/install-workflow-deployment-id.d.ts +3 -0
  147. package/dist/src/execution/install-workflow-deployment-id.js +1 -0
  148. package/dist/src/execution/invoke-tool.js +1 -1
  149. package/dist/src/execution/legacy-session/turn-workflow.js +1 -1
  150. package/dist/src/execution/node-step.d.ts +1 -0
  151. package/dist/src/execution/node-step.js +1 -1
  152. package/dist/src/execution/runtime-context.d.ts +2 -0
  153. package/dist/src/execution/runtime-context.js +1 -1
  154. package/dist/src/execution/sandbox/abort-bound-session.js +1 -1
  155. package/dist/src/execution/sandbox/active-connections.d.ts +28 -0
  156. package/dist/src/execution/sandbox/active-connections.js +1 -0
  157. package/dist/src/execution/sandbox/bindings/docker-cli.d.ts +10 -2
  158. package/dist/src/execution/sandbox/bindings/docker-cli.js +2 -2
  159. package/dist/src/execution/sandbox/bindings/docker-connection.d.ts +15 -0
  160. package/dist/src/execution/sandbox/bindings/docker-connection.js +2 -0
  161. package/dist/src/execution/sandbox/bindings/docker-container.d.ts +2 -0
  162. package/dist/src/execution/sandbox/bindings/docker-container.js +1 -1
  163. package/dist/src/execution/sandbox/bindings/docker-network.d.ts +5 -0
  164. package/dist/src/execution/sandbox/bindings/docker-network.js +1 -1
  165. package/dist/src/execution/sandbox/bindings/docker-templates.js +1 -1
  166. package/dist/src/execution/sandbox/bindings/docker.d.ts +12 -15
  167. package/dist/src/execution/sandbox/bindings/docker.js +1 -1
  168. package/dist/src/execution/sandbox/bindings/just-bash-runtime.d.ts +19 -29
  169. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
  170. package/dist/src/execution/sandbox/bindings/just-bash.d.ts +2 -4
  171. package/dist/src/execution/sandbox/bindings/just-bash.js +1 -1
  172. package/dist/src/execution/sandbox/bindings/local-provider-utils.d.ts +0 -20
  173. package/dist/src/execution/sandbox/bindings/local-provider-utils.js +1 -1
  174. package/dist/src/execution/sandbox/bindings/local.d.ts +4 -6
  175. package/dist/src/execution/sandbox/bindings/local.js +1 -1
  176. package/dist/src/execution/sandbox/bindings/vercel-base-runtime.d.ts +2 -0
  177. package/dist/src/execution/sandbox/bindings/vercel-base-runtime.js +2 -2
  178. package/dist/src/execution/sandbox/bindings/vercel-errors.js +2 -2
  179. package/dist/src/execution/sandbox/bindings/vercel-lifecycle.d.ts +7 -5
  180. package/dist/src/execution/sandbox/bindings/vercel-lifecycle.js +1 -1
  181. package/dist/src/execution/sandbox/bindings/vercel.d.ts +5 -11
  182. package/dist/src/execution/sandbox/bindings/vercel.js +1 -2
  183. package/dist/src/execution/sandbox/development-cleanup.d.ts +0 -1
  184. package/dist/src/execution/sandbox/development-cleanup.js +1 -1
  185. package/dist/src/execution/sandbox/development-lazy-prewarm.js +1 -1
  186. package/dist/src/execution/sandbox/development-run.d.ts +0 -2
  187. package/dist/src/execution/sandbox/development-run.js +1 -1
  188. package/dist/src/execution/sandbox/dockerfile.d.ts +0 -4
  189. package/dist/src/execution/sandbox/dockerfile.js +1 -1
  190. package/dist/src/execution/sandbox/ensure.d.ts +23 -11
  191. package/dist/src/execution/sandbox/ensure.js +1 -1
  192. package/dist/src/execution/sandbox/glob-tool.js +3 -3
  193. package/dist/src/execution/sandbox/grep-tool.js +1 -1
  194. package/dist/src/execution/sandbox/logging-session.js +1 -1
  195. package/dist/src/execution/sandbox/prewarm.d.ts +23 -3
  196. package/dist/src/execution/sandbox/prewarm.js +2 -1
  197. package/dist/src/execution/sandbox/read-file.js +1 -1
  198. package/dist/src/execution/sandbox/require-sandbox.d.ts +3 -2
  199. package/dist/src/execution/sandbox/require-sandbox.js +1 -1
  200. package/dist/src/execution/sandbox/ripgrep-probe.js +1 -1
  201. package/dist/src/execution/sandbox/session.d.ts +10 -20
  202. package/dist/src/execution/sandbox/session.js +2 -2
  203. package/dist/src/execution/session/active-turn.js +1 -1
  204. package/dist/src/execution/session/admission.js +1 -1
  205. package/dist/src/execution/session/checkpoint-migrations.js +1 -1
  206. package/dist/src/execution/session/entry-input.d.ts +5 -6
  207. package/dist/src/execution/session/entry.js +1 -1
  208. package/dist/src/execution/session/finalization.js +1 -1
  209. package/dist/src/execution/session/handoff-state.d.ts +5 -0
  210. package/dist/src/execution/session/handoff-state.js +1 -0
  211. package/dist/src/execution/session/handoff-steps.d.ts +0 -5
  212. package/dist/src/execution/session/handoff-steps.js +1 -1
  213. package/dist/src/execution/session/handoff.d.ts +7 -9
  214. package/dist/src/execution/session/handoff.js +1 -1
  215. package/dist/src/execution/session/input-queue.d.ts +8 -1
  216. package/dist/src/execution/session/input-queue.js +1 -1
  217. package/dist/src/execution/session/next-input.d.ts +3 -0
  218. package/dist/src/execution/session/next-input.js +1 -1
  219. package/dist/src/execution/session/pending-history.d.ts +5 -0
  220. package/dist/src/execution/session/pending-history.js +1 -0
  221. package/dist/src/execution/session/pending-turn-state.js +1 -1
  222. package/dist/src/execution/session/program.d.ts +1 -1
  223. package/dist/src/execution/session/program.js +1 -1
  224. package/dist/src/execution/session/timeout-control.d.ts +22 -4
  225. package/dist/src/execution/session/timeout-control.js +1 -1
  226. package/dist/src/execution/session/timeout.d.ts +1 -2
  227. package/dist/src/execution/session/timeout.js +1 -1
  228. package/dist/src/execution/session/turn-control.d.ts +5 -2
  229. package/dist/src/execution/session/turn-control.js +1 -1
  230. package/dist/src/execution/session/turn-event-handler.js +1 -1
  231. package/dist/src/execution/session/turn-step-result.js +1 -1
  232. package/dist/src/execution/session/turn-step.js +1 -1
  233. package/dist/src/execution/session/turn-waiting-step.js +1 -1
  234. package/dist/src/execution/session/turn.js +1 -1
  235. package/dist/src/execution/session-inbox/inbox.d.ts +9 -1
  236. package/dist/src/execution/session-inbox/inbox.js +1 -1
  237. package/dist/src/execution/session-inbox/protocol.d.ts +2 -1
  238. package/dist/src/execution/session-inbox/protocol.js +1 -1
  239. package/dist/src/execution/session-inbox/resume.d.ts +2 -1
  240. package/dist/src/execution/session-inbox/resume.js +1 -1
  241. package/dist/src/execution/session-prewarm.d.ts +8 -0
  242. package/dist/src/execution/session-prewarm.js +1 -0
  243. package/dist/src/execution/session.d.ts +0 -12
  244. package/dist/src/execution/session.js +2 -2
  245. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  246. package/dist/src/execution/skills/instructions.js +1 -1
  247. package/dist/src/execution/tasks/model-step.js +1 -1
  248. package/dist/src/execution/tasks/start.d.ts +4 -4
  249. package/dist/src/execution/tasks/start.js +1 -1
  250. package/dist/src/execution/tasks/steps.js +1 -1
  251. package/dist/src/execution/terminate-child-sessions-step.js +1 -1
  252. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  253. package/dist/src/execution/tools/workflow/body.d.ts +2 -2
  254. package/dist/src/execution/tools/workflow/body.js +1 -1
  255. package/dist/src/execution/tools/workflow/step-context.d.ts +11 -0
  256. package/dist/src/execution/tools/workflow/step-execution.js +1 -1
  257. package/dist/src/execution/tools/workflow/step.js +1 -1
  258. package/dist/src/execution/workflow-runtime.d.ts +5 -1
  259. package/dist/src/execution/workflow-runtime.js +1 -1
  260. package/dist/src/extensions/git/extension/lib/github-shell-schema.js +1 -1
  261. package/dist/src/framework/sources/modules/sandbox.d.ts +1 -1
  262. package/dist/src/harness/attachment-staging.d.ts +0 -7
  263. package/dist/src/harness/attachment-staging.js +1 -1
  264. package/dist/src/harness/hitl/approvals.js +1 -1
  265. package/dist/src/harness/hitl/budget-request.d.ts +12 -6
  266. package/dist/src/harness/hitl/budget-request.js +1 -1
  267. package/dist/src/harness/hitl/budget.d.ts +7 -1
  268. package/dist/src/harness/hitl/budget.js +1 -1
  269. package/dist/src/harness/hitl/coordinator.js +1 -1
  270. package/dist/src/harness/hitl/delivery.d.ts +1 -1
  271. package/dist/src/harness/hitl/delivery.js +1 -1
  272. package/dist/src/harness/hitl/index.d.ts +2 -1
  273. package/dist/src/harness/hitl/index.js +1 -1
  274. package/dist/src/harness/hitl/intake.d.ts +2 -2
  275. package/dist/src/harness/hitl/intake.js +1 -1
  276. package/dist/src/harness/hitl/view.d.ts +1 -0
  277. package/dist/src/harness/hitl/view.js +1 -0
  278. package/dist/src/harness/messages.d.ts +5 -0
  279. package/dist/src/harness/messages.js +1 -1
  280. package/dist/src/harness/model-call/call.d.ts +2 -2
  281. package/dist/src/harness/model-call/request.d.ts +2 -2
  282. package/dist/src/harness/model-call/run.js +1 -1
  283. package/dist/src/harness/semantic-errors/rules/sandbox.d.ts +3 -5
  284. package/dist/src/harness/semantic-errors/rules/sandbox.js +1 -1
  285. package/dist/src/harness/session-machine/transitions.d.ts +3 -1
  286. package/dist/src/harness/session-machine/transitions.js +1 -1
  287. package/dist/src/harness/step/context.d.ts +3 -0
  288. package/dist/src/harness/step/context.js +1 -1
  289. package/dist/src/harness/step/intake.d.ts +5 -2
  290. package/dist/src/harness/step/intake.js +1 -1
  291. package/dist/src/harness/step/prompt.js +1 -1
  292. package/dist/src/harness/tool-history-repair.d.ts +9 -0
  293. package/dist/src/harness/tool-history-repair.js +1 -0
  294. package/dist/src/harness/tool-loop.js +1 -1
  295. package/dist/src/harness/tool-model-output.d.ts +19 -3
  296. package/dist/src/harness/tool-model-output.js +1 -1
  297. package/dist/src/harness/turn-tag-state.d.ts +7 -26
  298. package/dist/src/harness/turn-tag-state.js +1 -1
  299. package/dist/src/harness/types.d.ts +10 -25
  300. package/dist/src/internal/application/build-profile.d.ts +3 -0
  301. package/dist/src/internal/application/build-profile.js +1 -1
  302. package/dist/src/internal/application/compiled-artifacts.js +10 -6
  303. package/dist/src/internal/application/dev-environment.d.ts +13 -0
  304. package/dist/src/internal/application/dev-environment.js +1 -1
  305. package/dist/src/internal/application/optional-package-import.d.ts +10 -0
  306. package/dist/src/internal/application/optional-package-import.js +1 -1
  307. package/dist/src/internal/application/stamped-package-version.js +1 -1
  308. package/dist/src/internal/attachments/limited-read.d.ts +2 -2
  309. package/dist/src/internal/authored-definition/core.js +1 -1
  310. package/dist/src/internal/authored-module-build-options.d.ts +13 -0
  311. package/dist/src/internal/authored-module-build-options.js +1 -0
  312. package/dist/src/internal/authored-module-cache.d.ts +10 -0
  313. package/dist/src/internal/authored-module-cache.js +1 -0
  314. package/dist/src/internal/authored-module-graph.d.ts +13 -0
  315. package/dist/src/internal/authored-module-graph.js +1 -0
  316. package/dist/src/internal/authored-module-loader.d.ts +22 -1
  317. package/dist/src/internal/authored-module-loader.js +1 -3
  318. package/dist/src/internal/authored-module.d.ts +7 -0
  319. package/dist/src/internal/authored-module.js +1 -1
  320. package/dist/src/internal/authored-package-boundary.js +1 -1
  321. package/dist/src/internal/authored-relative-extension-resolver.js +1 -1
  322. package/dist/src/internal/bundler/nitro-rolldown.d.ts +8 -2
  323. package/dist/src/internal/bundler/nitro-rolldown.js +1 -1
  324. package/dist/src/internal/bundler/pseudo-packages.d.ts +11 -0
  325. package/dist/src/internal/bundler/pseudo-packages.js +1 -0
  326. package/dist/src/internal/development-programmatic-source-loader.d.ts +1 -0
  327. package/dist/src/internal/development-programmatic-source-loader.js +1 -1
  328. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  329. package/dist/src/internal/nitro/dev-runtime-generation-metadata.js +1 -1
  330. package/dist/src/internal/nitro/host/build-application.js +1 -1
  331. package/dist/src/internal/nitro/host/build-deployment-id.d.ts +8 -0
  332. package/dist/src/internal/nitro/host/build-deployment-id.js +1 -0
  333. package/dist/src/internal/nitro/host/build-extension.d.ts +6 -0
  334. package/dist/src/internal/nitro/host/build-extension.js +2 -2
  335. package/dist/src/internal/nitro/host/compiled-sandbox-provider-prune-plugin.d.ts +3 -1
  336. package/dist/src/internal/nitro/host/compiled-sandbox-provider-prune-plugin.js +3 -5
  337. package/dist/src/internal/nitro/host/create-application-nitro.d.ts +2 -3
  338. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  339. package/dist/src/internal/nitro/host/dev-authored-rebuild-coordinator.d.ts +2 -0
  340. package/dist/src/internal/nitro/host/dev-authored-rebuild-coordinator.js +1 -1
  341. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  342. package/dist/src/internal/nitro/host/dev-build-host.d.ts +83 -0
  343. package/dist/src/internal/nitro/host/dev-build-host.js +1 -0
  344. package/dist/src/internal/nitro/host/dev-build-operations.d.ts +6 -0
  345. package/dist/src/internal/nitro/host/dev-build-operations.js +1 -0
  346. package/dist/src/internal/nitro/host/dev-build-process.d.ts +1 -0
  347. package/dist/src/internal/nitro/host/dev-build-process.js +1 -0
  348. package/dist/src/internal/nitro/host/dev-server-state.js +1 -1
  349. package/dist/src/internal/nitro/host/development-runtime-prune-plugin.d.ts +4 -1
  350. package/dist/src/internal/nitro/host/development-runtime-prune-plugin.js +3 -2
  351. package/dist/src/internal/nitro/host/drained-nitro-dev-server.d.ts +13 -0
  352. package/dist/src/internal/nitro/host/drained-nitro-dev-server.js +1 -1
  353. package/dist/src/internal/nitro/host/optional-engine-dependency-plugin.js +1 -1
  354. package/dist/src/internal/nitro/host/prepare-application-host.d.ts +3 -0
  355. package/dist/src/internal/nitro/host/prepare-application-host.js +1 -1
  356. package/dist/src/internal/nitro/host/sandbox-shutdown-plugin.js +1 -1
  357. package/dist/src/internal/nitro/host/skill-server-assets.js +1 -1
  358. package/dist/src/internal/nitro/host/stage-build-deployment-id.d.ts +2 -0
  359. package/dist/src/internal/nitro/host/stage-build-deployment-id.js +1 -0
  360. package/dist/src/internal/nitro/host/start-development-server.js +2 -2
  361. package/dist/src/internal/nitro/host/start-production-server.d.ts +1 -0
  362. package/dist/src/internal/nitro/host/start-production-server.js +3 -3
  363. package/dist/src/internal/nitro/host/workflow-sandbox-runtime-plugin.js +1 -1
  364. package/dist/src/internal/nitro/host.js +1 -1
  365. package/dist/src/internal/nitro/routes/schedule-task.d.ts +3 -0
  366. package/dist/src/internal/nitro/routes/schedule-task.js +1 -1
  367. package/dist/src/internal/programmatic-source-loader.d.ts +1 -0
  368. package/dist/src/internal/programmatic-source-loader.js +1 -1
  369. package/dist/src/internal/schedules/disabled.d.ts +2 -0
  370. package/dist/src/internal/schedules/disabled.js +1 -0
  371. package/dist/src/internal/workflow/development-world-server.js +1 -1
  372. package/dist/src/internal/workflow/local-world-data-directory.d.ts +2 -1
  373. package/dist/src/internal/workflow/local-world-data-directory.js +1 -1
  374. package/dist/src/internal/workflow/local-world-delivery-auth.d.ts +17 -0
  375. package/dist/src/internal/workflow/local-world-delivery-auth.js +1 -0
  376. package/dist/src/internal/workflow/queue-namespace.d.ts +2 -0
  377. package/dist/src/internal/workflow/queue-namespace.js +1 -1
  378. package/dist/src/internal/workflow-bundle/builder-support.d.ts +0 -1
  379. package/dist/src/internal/workflow-bundle/builder-support.js +2 -2
  380. package/dist/src/internal/workflow-bundle/builder.js +2 -2
  381. package/dist/src/internal/workflow-bundle/vercel-workflow-output.d.ts +1 -1
  382. package/dist/src/internal/workflow-bundle/vercel-workflow-output.js +1 -1
  383. package/dist/src/protocol/message.d.ts +27 -1
  384. package/dist/src/protocol/message.js +2 -2
  385. package/dist/src/protocol/prewarm-session.d.ts +14 -0
  386. package/dist/src/protocol/prewarm-session.js +1 -0
  387. package/dist/src/protocol/routes.d.ts +2 -2
  388. package/dist/src/public/channels/chat-sdk/chatSdkChannel.d.ts +13 -0
  389. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +2 -2
  390. package/dist/src/public/channels/chat-sdk/fetch-message.d.ts +10 -0
  391. package/dist/src/public/channels/chat-sdk/fetch-message.js +1 -0
  392. package/dist/src/public/channels/chat-sdk/index.d.ts +1 -1
  393. package/dist/src/public/channels/chat-sdk/reply-context.d.ts +15 -0
  394. package/dist/src/public/channels/chat-sdk/reply-context.js +2 -0
  395. package/dist/src/public/channels/discord/authorization.d.ts +45 -0
  396. package/dist/src/public/channels/discord/authorization.js +3 -0
  397. package/dist/src/public/channels/discord/defaults.d.ts +14 -3
  398. package/dist/src/public/channels/discord/defaults.js +2 -2
  399. package/dist/src/public/channels/discord/discordChannel.d.ts +18 -1
  400. package/dist/src/public/channels/discord/discordChannel.js +1 -1
  401. package/dist/src/public/channels/discord/gateway/connection.d.ts +26 -0
  402. package/dist/src/public/channels/discord/gateway/connection.js +1 -0
  403. package/dist/src/public/channels/discord/gateway/forwarder.d.ts +14 -0
  404. package/dist/src/public/channels/discord/gateway/forwarder.js +1 -0
  405. package/dist/src/public/channels/discord/gateway/index.d.ts +59 -0
  406. package/dist/src/public/channels/discord/gateway/index.js +1 -0
  407. package/dist/src/public/channels/discord/inbound.d.ts +10 -3
  408. package/dist/src/public/channels/discord/inbound.js +2 -2
  409. package/dist/src/public/channels/discord/index.d.ts +3 -2
  410. package/dist/src/public/channels/discord/index.js +1 -1
  411. package/dist/src/public/channels/discord/messages.d.ts +116 -0
  412. package/dist/src/public/channels/discord/messages.js +2 -0
  413. package/dist/src/public/channels/github/checkout.js +1 -1
  414. package/dist/src/public/channels/github/dispatch.js +1 -1
  415. package/dist/src/public/channels/github/githubChannel.d.ts +3 -0
  416. package/dist/src/public/channels/imessage-tapbacks.d.ts +74 -0
  417. package/dist/src/public/channels/imessage-tapbacks.js +1 -0
  418. package/dist/src/public/channels/index.d.ts +2 -1
  419. package/dist/src/public/channels/index.js +1 -1
  420. package/dist/src/public/channels/linear/linearChannel.d.ts +3 -0
  421. package/dist/src/public/channels/linear/linearChannel.js +1 -1
  422. package/dist/src/public/channels/linq/inboundContent.d.ts +7 -0
  423. package/dist/src/public/channels/linq/inboundContent.js +1 -1
  424. package/dist/src/public/channels/linq/index.d.ts +1 -0
  425. package/dist/src/public/channels/linq/index.js +1 -1
  426. package/dist/src/public/channels/linq/linqChannel.d.ts +21 -2
  427. package/dist/src/public/channels/linq/linqChannel.js +1 -1
  428. package/dist/src/public/channels/photon/inboundContent.d.ts +7 -0
  429. package/dist/src/public/channels/photon/inboundContent.js +2 -1
  430. package/dist/src/public/channels/photon/index.d.ts +1 -0
  431. package/dist/src/public/channels/photon/index.js +1 -1
  432. package/dist/src/public/channels/photon/photonIMessageChannel.d.ts +17 -1
  433. package/dist/src/public/channels/photon/photonIMessageChannel.js +1 -1
  434. package/dist/src/public/channels/same-environment-oidc.d.ts +7 -0
  435. package/dist/src/public/channels/same-environment-oidc.js +1 -0
  436. package/dist/src/public/channels/slack/api.d.ts +6 -0
  437. package/dist/src/public/channels/slack/api.js +1 -1
  438. package/dist/src/public/channels/slack/model-context.d.ts +7 -0
  439. package/dist/src/public/channels/slack/model-context.js +1 -1
  440. package/dist/src/public/channels/slack/reply-delivery.d.ts +5 -0
  441. package/dist/src/public/channels/slack/reply-delivery.js +1 -1
  442. package/dist/src/public/channels/slack/slackChannel.d.ts +17 -3
  443. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  444. package/dist/src/public/channels/teams/teamsChannel.d.ts +3 -0
  445. package/dist/src/public/channels/teams/teamsChannel.js +1 -1
  446. package/dist/src/public/channels/telegram/telegramChannel.d.ts +3 -0
  447. package/dist/src/public/channels/telegram/telegramChannel.js +1 -1
  448. package/dist/src/public/definitions/agent.d.ts +1 -1
  449. package/dist/src/public/definitions/channel.d.ts +2 -2
  450. package/dist/src/public/definitions/channel.js +1 -1
  451. package/dist/src/public/definitions/hook.d.ts +1 -0
  452. package/dist/src/public/definitions/sandbox.d.ts +1 -1
  453. package/dist/src/public/index.d.ts +1 -1
  454. package/dist/src/public/next/server.js +1 -1
  455. package/dist/src/public/sandbox/docker-sandbox.d.ts +6 -1
  456. package/dist/src/public/sandbox/docker.d.ts +1 -8
  457. package/dist/src/public/sandbox/index.d.ts +3 -3
  458. package/dist/src/public/sandbox/just-bash-sandbox.d.ts +87 -7
  459. package/dist/src/public/sandbox/just-bash.d.ts +1 -1
  460. package/dist/src/public/sandbox/provider.d.ts +5 -1
  461. package/dist/src/public/sandbox/provider.js +1 -1
  462. package/dist/src/public/sandbox/vercel-sandbox.d.ts +16 -9
  463. package/dist/src/public/sandbox/vercel.d.ts +0 -1
  464. package/dist/src/public/sandbox/vercel.js +1 -1
  465. package/dist/src/public/tools/agent.d.ts +8 -1
  466. package/dist/src/public/tools/agent.js +1 -1
  467. package/dist/src/public/tools/index.d.ts +1 -1
  468. package/dist/src/react/use-eve-agent.d.ts +1 -1
  469. package/dist/src/runtime/agent/resolve-model.d.ts +4 -0
  470. package/dist/src/runtime/agent/resolve-model.js +1 -1
  471. package/dist/src/runtime/connections/openapi-client.d.ts +2 -0
  472. package/dist/src/runtime/connections/openapi-client.js +1 -1
  473. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  474. package/dist/src/runtime/resolve-agent.js +1 -1
  475. package/dist/src/runtime/resolve-channel.js +1 -1
  476. package/dist/src/runtime/resolve-sandbox.js +1 -1
  477. package/dist/src/runtime/sandbox/prepared-artifacts.js +1 -1
  478. package/dist/src/runtime/sandbox/registry.d.ts +2 -0
  479. package/dist/src/runtime/sandbox/registry.js +1 -1
  480. package/dist/src/runtime/sessions/compiled-agent-cache.js +1 -1
  481. package/dist/src/runtime/subagents/dynamic-agent-config.d.ts +2 -1
  482. package/dist/src/runtime/subagents/dynamic-agent-config.js +1 -1
  483. package/dist/src/runtime/subagents/workflow.d.ts +6 -0
  484. package/dist/src/runtime/subagents/workflow.js +1 -1
  485. package/dist/src/runtime/types.d.ts +3 -2
  486. package/dist/src/runtime/workspace/seed-files.d.ts +9 -12
  487. package/dist/src/runtime/workspace/seed-files.js +1 -1
  488. package/dist/src/runtime/workspace/spec.d.ts +1 -1
  489. package/dist/src/runtime/workspace/spec.js +1 -1
  490. package/dist/src/runtime/workspace/types.d.ts +2 -6
  491. package/dist/src/sandbox/provider.d.ts +185 -0
  492. package/dist/src/sandbox/provider.js +1 -0
  493. package/dist/src/sandbox/providers/default.d.ts +20 -19
  494. package/dist/src/sandbox/providers/default.js +1 -1
  495. package/dist/src/sandbox/providers/docker.d.ts +5 -2
  496. package/dist/src/sandbox/providers/docker.js +1 -1
  497. package/dist/src/sandbox/providers/just-bash.d.ts +4 -3
  498. package/dist/src/sandbox/providers/just-bash.js +1 -1
  499. package/dist/src/sandbox/providers/vercel.d.ts +4 -10
  500. package/dist/src/sandbox/providers/vercel.js +1 -1
  501. package/dist/src/sandbox/providers.d.ts +0 -1
  502. package/dist/src/sandbox/providers.js +1 -1
  503. package/dist/src/sandbox/state.d.ts +44 -0
  504. package/dist/src/sandbox/state.js +1 -1
  505. package/dist/src/self-modification/deployed-sandbox.d.ts +4 -9
  506. package/dist/src/self-modification/deployed-sandbox.js +1 -1
  507. package/dist/src/self-modification/filesystem.d.ts +3 -3
  508. package/dist/src/self-modification/remote/config.d.ts +2 -2
  509. package/dist/src/self-modification/remote/config.js +1 -1
  510. package/dist/src/self-modification/setup.d.ts +0 -1
  511. package/dist/src/self-modification/setup.js +8 -8
  512. package/dist/src/setup/integrations/discord/api.d.ts +7 -0
  513. package/dist/src/setup/integrations/discord/api.js +1 -1
  514. package/dist/src/setup/integrations/discord/daemon.d.ts +18 -0
  515. package/dist/src/setup/integrations/discord/daemon.js +21 -0
  516. package/dist/src/setup/integrations/discord/setup.d.ts +24 -4
  517. package/dist/src/setup/integrations/discord/setup.js +5 -4
  518. package/dist/src/setup/integrations/self-modification/setup.js +1 -1
  519. package/dist/src/setup/scaffold/create/project.js +1 -1
  520. package/dist/src/setup/scaffold/update/web-options.js +1 -1
  521. package/dist/src/setup/scaffold/version-tokens.d.ts +0 -1
  522. package/dist/src/setup/scaffold/version-tokens.js +1 -1
  523. package/dist/src/shared/agent-definition.d.ts +33 -42
  524. package/dist/src/shared/built-server-start-failure.d.ts +12 -0
  525. package/dist/src/shared/built-server-start-failure.js +3 -0
  526. package/dist/src/shared/framework-eve-server.d.ts +2 -0
  527. package/dist/src/shared/framework-eve-server.js +2 -2
  528. package/dist/src/shared/sandbox-environment.d.ts +4 -10
  529. package/dist/src/shared/sandbox-environment.js +1 -1
  530. package/dist/src/shared/sandbox-network-policy.d.ts +45 -9
  531. package/dist/src/shared/sandbox-provider.d.ts +0 -103
  532. package/dist/src/shared/sandbox-provider.js +1 -1
  533. package/dist/src/shared/sandbox-recorded-data-error.d.ts +4 -0
  534. package/dist/src/shared/sandbox-recorded-data-error.js +1 -0
  535. package/dist/src/shared/sandbox-session-gone-error.d.ts +12 -0
  536. package/dist/src/shared/sandbox-session-gone-error.js +1 -0
  537. package/dist/src/shared/sandbox-session.d.ts +97 -83
  538. package/dist/src/shared/sandbox-template-error.d.ts +19 -4
  539. package/dist/src/shared/sandbox-template-error.js +1 -1
  540. package/dist/src/shared/sandbox-tool-session-error.d.ts +4 -0
  541. package/dist/src/shared/sandbox-tool-session-error.js +1 -0
  542. package/dist/src/shared/session-history.d.ts +22 -0
  543. package/dist/src/shared/session-history.js +1 -0
  544. package/dist/src/shared/skill-package.js +1 -1
  545. package/dist/src/shared/skill-paths.d.ts +4 -5
  546. package/dist/src/shared/skill-paths.js +2 -2
  547. package/dist/src/shared/workflow-sandbox.d.ts +4 -41
  548. package/dist/src/shared/workflow-sandbox.js +1 -1
  549. package/dist/src/subagents/tool.d.ts +1 -3
  550. package/dist/src/subagents/tool.js +1 -1
  551. package/dist/src/svelte/index.js +1 -1
  552. package/dist/src/svelte/use-eve-agent.d.ts +1 -1
  553. package/dist/src/svelte/use-eve-agent.js +1 -1
  554. package/dist/src/tools/model-output.d.ts +23 -5
  555. package/dist/src/tools/model-output.js +1 -1
  556. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  557. package/dist/src/tools/provided/glob.js +1 -1
  558. package/dist/src/tools/provided/grep.js +1 -1
  559. package/dist/src/tools/provided/read-file.js +1 -1
  560. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  561. package/dist/src/tools/provided/workflow.js +1 -1
  562. package/dist/src/tools/provided/write-file.js +1 -1
  563. package/dist/src/tools/workflow-definition.d.ts +33 -5
  564. package/dist/src/tracing/eve/conversation-context.d.ts +4 -1
  565. package/dist/src/tracing/eve/conversation-context.js +1 -1
  566. package/dist/src/tracing/eve/invoke-tool-span.js +1 -1
  567. package/dist/src/tracing/eve/operation-input.d.ts +0 -5
  568. package/dist/src/tracing/eve/operation-input.js +1 -1
  569. package/dist/src/tracing/eve/otel-registration.js +1 -1
  570. package/dist/src/tracing/eve/session.d.ts +3 -2
  571. package/dist/src/tracing/eve/session.js +1 -1
  572. package/dist/src/vue/index.js +1 -1
  573. package/dist/src/vue/use-eve-agent.d.ts +1 -1
  574. package/dist/src/vue/use-eve-agent.js +1 -1
  575. package/docs/agent-config.md +86 -65
  576. package/docs/channels/chat-sdk.mdx +6 -1
  577. package/docs/channels/custom.mdx +41 -9
  578. package/docs/channels/discord.mdx +279 -7
  579. package/docs/channels/eve.mdx +58 -1
  580. package/docs/channels/linq.mdx +53 -2
  581. package/docs/channels/mcp.mdx +2 -2
  582. package/docs/channels/overview.mdx +1 -1
  583. package/docs/channels/photon.mdx +65 -1
  584. package/docs/channels/slack.mdx +4 -2
  585. package/docs/concepts/built-in-tools.md +32 -9
  586. package/docs/concepts/execution-model-and-durability.mdx +15 -103
  587. package/docs/concepts/security-model.md +2 -0
  588. package/docs/concepts/sessions-runs-and-streaming.md +52 -43
  589. package/docs/connections/openapi.mdx +2 -0
  590. package/docs/connections/overview.mdx +1 -1
  591. package/docs/evals/reporters.mdx +1 -1
  592. package/docs/evals/running.mdx +1 -1
  593. package/docs/experimental/dynamic-schedules.mdx +186 -0
  594. package/docs/experimental/meta.json +4 -0
  595. package/docs/guides/client/messages.mdx +1 -1
  596. package/docs/guides/client/streaming.mdx +1 -0
  597. package/docs/guides/deployment/overview.md +4 -4
  598. package/docs/guides/deployment/self-hosting.md +53 -1
  599. package/docs/guides/dev-tui.md +1 -1
  600. package/docs/guides/dynamic-capabilities.md +1 -1
  601. package/docs/guides/frontend/overview.mdx +26 -6
  602. package/docs/guides/hooks.md +21 -1
  603. package/docs/guides/instrumentation/agent-runs.mdx +16 -0
  604. package/docs/guides/self-modification.md +1 -1
  605. package/docs/guides/session-context.md +1 -1
  606. package/docs/instructions.mdx +1 -1
  607. package/docs/memory/overview.mdx +2 -1
  608. package/docs/patterns/dynamic-scheduling.md +3 -1
  609. package/docs/reference/agent-files.md +3 -3
  610. package/docs/reference/cli.md +21 -9
  611. package/docs/reference/typescript-api.md +9 -3
  612. package/docs/sandbox/custom-providers.mdx +254 -0
  613. package/docs/sandbox/default.mdx +71 -4
  614. package/docs/sandbox/docker.mdx +15 -3
  615. package/docs/sandbox/index.mdx +27 -103
  616. package/docs/sandbox/just-bash.mdx +54 -0
  617. package/docs/sandbox/meta.json +9 -1
  618. package/docs/sandbox/troubleshooting.mdx +215 -0
  619. package/docs/sandbox/vercel.mdx +48 -7
  620. package/docs/schedules.mdx +2 -0
  621. package/docs/skills.mdx +1 -1
  622. package/docs/subagents/index.mdx +3 -1
  623. package/docs/tools/overview.mdx +21 -1
  624. package/docs/tools/tasks-upgrade.md +12 -7
  625. package/docs/tools/tasks.md +10 -6
  626. package/docs/tools/workflows.mdx +109 -10
  627. package/docs/tutorial/connect-a-warehouse.mdx +1 -1
  628. package/docs/tutorial/run-analysis.mdx +3 -3
  629. package/package.json +14 -20
  630. package/dist/src/compiled/@ai-sdk/code-mode/_run.d.ts +0 -1
  631. package/dist/src/compiled/@ai-sdk/code-mode/index.d.ts +0 -325
  632. package/dist/src/compiled/@ai-sdk/code-mode/index.js +0 -660
  633. package/dist/src/compiled/_chunks/workflow/dist-CyBgVS7g.js +0 -1
  634. package/dist/src/compiled/_chunks/workflow/dist-T5NnW-0k.js +0 -3
  635. package/dist/src/compiled/_chunks/workflow/helpers-DlLD3ov_.js +0 -1
  636. package/dist/src/compiled/_chunks/workflow/private-tQUuwBoQ.js +0 -1
  637. package/dist/src/compiled/_chunks/workflow/resume-hook-DMsV_b4n.js +0 -1
  638. package/dist/src/compiled/_chunks/workflow/serialization-DPdYS_w2.js +0 -16
  639. package/dist/src/compiled/_chunks/workflow/sleep-BY6leHh8.js +0 -1
  640. package/dist/src/compiled/_chunks/workflow/workflow-routes-CwqB063q.js +0 -1
  641. package/dist/src/execution/run-session-limits.d.ts +0 -12
  642. package/dist/src/execution/run-session-limits.js +0 -1
  643. package/dist/src/execution/sandbox/active-handles.d.ts +0 -32
  644. package/dist/src/execution/sandbox/active-handles.js +0 -1
  645. package/dist/src/execution/sandbox/bindings/docker-session.d.ts +0 -6
  646. package/dist/src/execution/sandbox/bindings/docker-session.js +0 -2
  647. package/dist/src/execution/sandbox/bindings/immutable-resources.d.ts +0 -15
  648. package/dist/src/execution/sandbox/bindings/immutable-resources.js +0 -2
  649. package/dist/src/execution/sandbox/bindings/microsandbox-create.d.ts +0 -12
  650. package/dist/src/execution/sandbox/bindings/microsandbox-create.js +0 -1
  651. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.d.ts +0 -42
  652. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +0 -1
  653. package/dist/src/execution/sandbox/bindings/microsandbox-metadata.d.ts +0 -29
  654. package/dist/src/execution/sandbox/bindings/microsandbox-metadata.js +0 -1
  655. package/dist/src/execution/sandbox/bindings/microsandbox-network.d.ts +0 -18
  656. package/dist/src/execution/sandbox/bindings/microsandbox-network.js +0 -1
  657. package/dist/src/execution/sandbox/bindings/microsandbox-options.d.ts +0 -37
  658. package/dist/src/execution/sandbox/bindings/microsandbox-options.js +0 -1
  659. package/dist/src/execution/sandbox/bindings/microsandbox-platform.d.ts +0 -21
  660. package/dist/src/execution/sandbox/bindings/microsandbox-platform.js +0 -21
  661. package/dist/src/execution/sandbox/bindings/microsandbox-process.d.ts +0 -3
  662. package/dist/src/execution/sandbox/bindings/microsandbox-process.js +0 -1
  663. package/dist/src/execution/sandbox/bindings/microsandbox-provider-state.d.ts +0 -11
  664. package/dist/src/execution/sandbox/bindings/microsandbox-provider-state.js +0 -1
  665. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.d.ts +0 -82
  666. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +0 -1
  667. package/dist/src/execution/sandbox/bindings/microsandbox-templates.d.ts +0 -12
  668. package/dist/src/execution/sandbox/bindings/microsandbox-templates.js +0 -1
  669. package/dist/src/execution/sandbox/bindings/microsandbox.d.ts +0 -16
  670. package/dist/src/execution/sandbox/bindings/microsandbox.js +0 -1
  671. package/dist/src/execution/sandbox/provider-host-development.d.ts +0 -2
  672. package/dist/src/execution/sandbox/provider-host-development.js +0 -1
  673. package/dist/src/execution/sandbox/provider-host.d.ts +0 -2
  674. package/dist/src/execution/sandbox/provider-host.js +0 -1
  675. package/dist/src/execution/tool-session/sandbox.d.ts +0 -22
  676. package/dist/src/execution/tool-session/sandbox.js +0 -1
  677. package/dist/src/harness/session-usage-limits.d.ts +0 -49
  678. package/dist/src/harness/session-usage-limits.js +0 -1
  679. package/dist/src/public/sandbox/microsandbox-sandbox.d.ts +0 -48
  680. package/dist/src/public/sandbox/microsandbox.d.ts +0 -9
  681. package/dist/src/public/sandbox/microsandbox.js +0 -1
  682. package/dist/src/sandbox/providers/microsandbox.d.ts +0 -12
  683. package/dist/src/sandbox/providers/microsandbox.js +0 -1
  684. package/dist/src/subagents/token-budget.d.ts +0 -15
  685. package/dist/src/subagents/token-budget.js +0 -1
  686. package/docs/sandbox/microsandbox.mdx +0 -31
  687. /package/dist/src/{public/sandbox/microsandbox-sandbox.js → execution/agent-sessions/runtime-overrides.js} +0 -0
@@ -1 +1 @@
1
- import{discordAudience,discordInstrumentationMetadata}from"./audience.js";import{createLogger,logError}from"#internal/logging.js";import{readNonEmptyString}from"#shared/guards.js";import{parseJsonObject}from"#shared/json.js";import{POST,defineChannel}from"#public/definitions/channel.js";import{INACTIVE_REQUEST_NOTICE,respondOrRetireInactivePrompt}from"#channel/inactive-prompt.js";import"#public/channels/discord/verify.js";import{callDiscordApi,createDiscordFollowupMessage,discordContinuationToken,editDiscordOriginalResponse,resolveDiscordBotToken,sendDiscordChannelMessage,splitDiscordMessageContent,triggerDiscordTypingIndicator}from"#public/channels/discord/api.js";import{buildFreeformModalResponse,deriveComponentInputResponses,deriveModalInputResponses,isDiscordFreeformComponent}from"#public/channels/discord/hitl.js";import{defaultDiscordAuth,defaultEvents,defaultOnCommand,editDiscordResolvedPrompt}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{discordDeferredJson,discordJson,discordJsonBody,readMessageContent}from"#public/channels/discord/responses.js";import{verifyDiscordInbound}from"#public/channels/discord/verifyInbound.js";import{createDiscordFetchFile,discordCommandContent}from"#public/channels/discord/attachments.js";const log=createLogger(`discord.channel`);function discordChannel(e={}){let t=e.onCommand??defaultOnCommand,n=e.onInputResponse??(e.onCommand===void 0?acceptAsPresser:dropUnmappedInputResponse),r={...defaultEvents,...e.events};return defineChannel({kindHint:`discord`,turnPolicy:e.turnPolicy,state:initialDiscordState(),metadata:discordInstrumentationMetadata,audience:({state:e})=>e.audience??`unknown`,fetchFile:createDiscordFetchFile(e.api?.fetch),context(t,n){return rebuildDiscordContext(t,n,e)},routes:[POST(e.route??`/eve/v1/discord`,async(r,{from:i,waitUntil:a})=>{let o=await verifyDiscordInbound(r,e.credentials);if(o===null)return new Response(`unauthorized`,{status:401});let s;try{s=parseJsonObject(JSON.parse(o))}catch(e){return log.warn(`inbound Discord body is not valid JSON`,{error:e}),discordJson({content:`invalid request`,ephemeral:!0})}if(s.type===DISCORD_INTERACTION_TYPE.PING)return discordJson({type:DISCORD_INTERACTION_RESPONSE_TYPE.PONG});let c=parseDiscordInteraction(s);return c===null?discordJson({content:`Unsupported Discord interaction.`,ephemeral:!0}):handleInteraction({config:e,interaction:c,onCommand:t,onInputResponse:n,from:i,waitUntil:a})})],async receive(t,{from:n}){let r=t.target,i=readNonEmptyString(r.channelId);if(!i)throw Error(`discordChannel().receive requires target.channelId.`);let a=readNonEmptyString(r.conversationId),o=r.initialMessage;if(o!==void 0&&a!==void 0)throw Error("discordChannel().receive: `conversationId` and `initialMessage` are mutually exclusive.");let s=a??``,c=a!==void 0;if(o!==void 0){let t=await buildDiscordHandle({config:e,state:{...initialDiscordState(),channelId:i}}).sendChannelMessage(o);s=t.id,c=t.id.length>0}return n(discordContinuationToken(i,s)).send(t.message,{auth:t.auth,state:{applicationId:null,channelId:i,conversationId:s||null,guildId:null,hasMessageAnchor:c,initialResponseSent:!0,interactionToken:null}})},events:r})}function rebuildDiscordContext(e,t,n){return{discord:buildDiscordHandle({config:n,session:t,state:e}),state:e}}function buildDiscordHandle(e){let t=e.config.api,n=e.state,r=mergeCredentials(e.config.credentials,n);function anchor(t,r){t.id&&(n.hasMessageAnchor&&r.components===void 0||(n.hasMessageAnchor||=(n.conversationId=t.id,!0),n.channelId&&e.session?.continuation?.alias(discordContinuationToken(n.channelId,t.id))))}async function sendViaChannel(e){let i=n.channelId??``;if(!i)throw Error(`discordChannel: missing channel id for outbound message.`);let a=normalizePostInput(e),o=await sendDiscordChannelMessage({apiBaseUrl:t?.apiBaseUrl,body:a,credentials:r,fetch:t?.fetch,channelId:i});return anchor(o,a),o}async function editOriginal(e){let i=n.interactionToken??``;if(!i)throw Error(`discordChannel: missing interaction token for original response edit.`);let a=normalizePostInput(e),o=await editDiscordOriginalResponse({apiBaseUrl:t?.apiBaseUrl,body:a,credentials:r,fetch:t?.fetch,interactionToken:i});return n.initialResponseSent=!0,anchor(o,a),o}async function followup(e){let i=n.interactionToken??``;if(!i)throw Error(`discordChannel: missing interaction token for followup message.`);let a=normalizePostInput(e),o=await createDiscordFollowupMessage({apiBaseUrl:t?.apiBaseUrl,body:a,credentials:r,fetch:t?.fetch,interactionToken:i});return anchor(o,a),o}async function startTyping(){let e=n.channelId??``;if(e)try{await triggerDiscordTypingIndicator({apiBaseUrl:t?.apiBaseUrl,credentials:r,fetch:t?.fetch,channelId:e})}catch(t){logError(log,`Discord typing indicator failed — swallowed`,t,{channelId:e})}}return{applicationId:n.applicationId??void 0,channelId:n.channelId??``,conversationId:n.conversationId??``,guildId:n.guildId??void 0,interactionToken:n.interactionToken??void 0,request(e,n,i){return callDiscordApi({apiBaseUrl:t?.apiBaseUrl,body:n,botToken:i?.botAuth===!0?r.botToken:void 0,fetch:t?.fetch,method:i?.method,path:e})},async post(e){let t=expandPostBodies(normalizePostInput(e)),r;for(let e of t){let t=await postOne({body:e,editOriginal,followup,sendViaChannel,state:n});r===void 0&&(r=t)}return r??{id:``,raw:null}},editOriginalResponse:editOriginal,followup,sendChannelMessage:sendViaChannel,startTyping}}async function postOne(e){if(e.state.interactionToken&&e.state.applicationId)try{return e.state.initialResponseSent?await e.followup(e.body):await e.editOriginal(e.body)}catch(e){log.warn(`Discord interaction-token delivery failed, falling back to channel message`,{error:e})}return e.sendViaChannel(e.body)}async function handleInteraction(e){return e.interaction.type===DISCORD_INTERACTION_TYPE.APPLICATION_COMMAND?handleCommandInteraction({config:e.config,interaction:e.interaction,onCommand:e.onCommand,from:e.from,waitUntil:e.waitUntil}):e.interaction.type===DISCORD_INTERACTION_TYPE.MESSAGE_COMPONENT?handleComponentInteraction({config:e.config,interaction:e.interaction,onInputResponse:e.onInputResponse,from:e.from,waitUntil:e.waitUntil}):handleModalSubmitInteraction({config:e.config,interaction:e.interaction,onInputResponse:e.onInputResponse,from:e.from,waitUntil:e.waitUntil})}async function handleCommandInteraction(e){let t=stateFromInteraction(e.interaction,{conversationId:e.interaction.id,hasMessageAnchor:!1,initialResponseSent:!1}),n={discord:buildDiscordHandle({config:e.config,state:t})},r;try{r=await e.onCommand(n,e.interaction)}catch(e){return log.error(`command handler failed`,{error:e}),discordJson({content:`The Discord command handler failed.`,ephemeral:!0})}return r==null?discordJson({content:`Command ignored.`,ephemeral:!0}):(e.waitUntil(dispatchCommand({interaction:e.interaction,result:r,from:e.from,state:t})),discordDeferredJson(r.ephemeral===!0))}function handleComponentInteraction(e){if(isDiscordFreeformComponent(e.interaction.customId)){let t=readMessageContent(e.interaction.raw);return discordJsonBody(buildFreeformModalResponse({customId:e.interaction.customId,prompt:t}))}let t=deriveComponentInputResponses(e.interaction);return t.length>0&&e.waitUntil(dispatchInputResponses({config:e.config,onInputResponse:e.onInputResponse,conversationId:e.interaction.messageId,inputResponses:t,interaction:e.interaction,from:e.from})),discordJsonBody({type:DISCORD_INTERACTION_RESPONSE_TYPE.DEFERRED_UPDATE_MESSAGE})}function handleModalSubmitInteraction(e){let t=deriveModalInputResponses(e.interaction);return t.length>0&&e.waitUntil(dispatchInputResponses({config:e.config,onInputResponse:e.onInputResponse,conversationId:e.interaction.messageId??e.interaction.id,inputResponses:t,interaction:e.interaction,from:e.from})),discordJson({content:`Answer received.`,ephemeral:!0})}async function dispatchCommand(e){let t=discordCommandContent(commandInteractionMessage(e.interaction),e.interaction.attachments),n=formatDiscordContextBlock({applicationId:e.interaction.applicationId,channelId:e.interaction.channelId,commandName:e.interaction.commandName,guildId:e.interaction.guildId,interactionId:e.interaction.id,userId:e.interaction.user.id,username:e.interaction.user.username}),r=e.result.context??[];try{await e.from(discordContinuationToken(e.interaction.channelId,e.interaction.id)).send(t,{auth:e.result.auth,context:[n,...r],state:e.state,title:e.result.title})}catch(e){log.error(`command delivery failed`,{error:e})}}async function dispatchInputResponses(e){let t=stateFromInteraction(e.interaction,{conversationId:e.conversationId,hasMessageAnchor:e.conversationId!==e.interaction.id,initialResponseSent:!0}),n=buildDiscordHandle({config:e.config,state:t}),r;try{r=await e.onInputResponse({defaultAuth:defaultDiscordAuth(e.interaction),discord:n},e.interaction)}catch(e){log.error(`input response handler failed`,{error:e});return}if(r===null)return;let{auth:i}=r,a=e.from(discordContinuationToken(e.interaction.channelId,e.conversationId)),o=await respondOrRetireInactivePrompt(()=>a.respond(e.inputResponses,{auth:i}),{retirePrompt:async t=>{let r=e.interaction.messageId,i=readMessageContent(e.interaction.raw);r!==void 0&&i!==void 0&&await editDiscordResolvedPrompt(n,{content:i,messageId:r},t)}},log);o.outcome===`inactive`&&await Promise.all([o.retirement,sendInactiveNotice(n)])}async function sendInactiveNotice(e){try{await e.followup({content:INACTIVE_REQUEST_NOTICE,flags:DISCORD_EPHEMERAL_MESSAGE_FLAG})}catch(e){log.error(`inactive prompt notice failed`,{error:e})}}function acceptAsPresser(e){return{auth:e.defaultAuth}}function dropUnmappedInputResponse(){return log.warn(`dropped a Discord input response: onCommand is customized but onInputResponse is not; set onInputResponse to accept button presses and modal submissions`),null}function stateFromInteraction(e,t){return{audience:discordAudience(e.channelType),applicationId:e.applicationId,channelId:e.channelId,conversationId:t.conversationId,guildId:e.guildId??null,hasMessageAnchor:t.hasMessageAnchor,initialResponseSent:t.initialResponseSent,interactionToken:e.token}}function initialDiscordState(){return{applicationId:null,channelId:null,conversationId:null,guildId:null,hasMessageAnchor:!1,initialResponseSent:!1,interactionToken:null}}function mergeCredentials(e,t){return{applicationId:t.applicationId??e?.applicationId,botToken:e?.botToken??(()=>resolveDiscordBotToken()),publicKey:e?.publicKey,webhookVerifier:e?.webhookVerifier}}function normalizePostInput(e){return typeof e==`string`?{content:e}:e}function expandPostBodies(e){return typeof e.content==`string`?splitDiscordMessageContent(e.content).map((t,n)=>n===0?{...e,content:t}:{allowed_mentions:e.allowed_mentions,content:t}):[e]}export{discordChannel};
1
+ import{discordAudience,discordInstrumentationMetadata}from"./audience.js";import{createLogger,logError}from"#internal/logging.js";import{readNonEmptyString}from"#shared/guards.js";import{parseJsonObject}from"#shared/json.js";import{POST,defineChannel}from"#public/definitions/channel.js";import{INACTIVE_REQUEST_NOTICE,respondOrRetireInactivePrompt}from"#channel/inactive-prompt.js";import"#public/channels/discord/verify.js";import{buildFreeformModalResponse,deriveComponentInputResponses,deriveModalInputResponses,isDiscordFreeformComponent}from"#public/channels/discord/hitl.js";import{callDiscordApi,createDiscordFollowupMessage,discordContinuationToken,editDiscordOriginalResponse,resolveDiscordBotToken,sendDiscordChannelMessage,splitDiscordMessageContent,triggerDiscordTypingIndicator}from"#public/channels/discord/api.js";import{answerDiscordAuthorizationReveal,readDiscordAuthorizationReveal}from"#public/channels/discord/authorization.js";import{defaultDiscordAuth,defaultEvents,defaultOnCommand,editDiscordResolvedPrompt}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{discordDeferredJson,discordJson,discordJsonBody,readMessageContent}from"#public/channels/discord/responses.js";import{createDiscordGatewayRoute}from"#public/channels/discord/messages.js";import{verifyDiscordInbound}from"#public/channels/discord/verifyInbound.js";import{createDiscordFetchFile,discordCommandContent}from"#public/channels/discord/attachments.js";const log=createLogger(`discord.channel`);function discordChannel(e={}){let t=e.onCommand??defaultOnCommand,n=e.onInputResponse??(e.onCommand===void 0?acceptAsPresser:dropUnmappedInputResponse),r={...defaultEvents,...e.events};return defineChannel({kindHint:`discord`,turnPolicy:e.turnPolicy,state:initialDiscordState(),metadata:discordInstrumentationMetadata,audience:({state:e})=>e.audience??`unknown`,fetchFile:createDiscordFetchFile(e.api?.fetch),context(t,n){return rebuildDiscordContext(t,n,e)},routes:[POST(e.route??`/eve/v1/discord`,async(r,{from:i,resolveSession:a,waitUntil:o})=>{let s=await verifyDiscordInbound(r,e.credentials);if(s===null)return new Response(`unauthorized`,{status:401});let c;try{c=parseJsonObject(JSON.parse(s))}catch(e){return log.warn(`inbound Discord body is not valid JSON`,{error:e}),discordJson({content:`invalid request`,ephemeral:!0})}if(c.type===DISCORD_INTERACTION_TYPE.PING)return discordJson({type:DISCORD_INTERACTION_RESPONSE_TYPE.PONG});let l=parseDiscordInteraction(c);return l===null?discordJson({content:`Unsupported Discord interaction.`,ephemeral:!0}):handleInteraction({config:e,interaction:l,onCommand:t,onInputResponse:n,from:i,resolveSession:a,waitUntil:o})}),...e.gateway===void 0?[]:[createDiscordGatewayRoute({buildContext:t=>({discord:buildDiscordHandle({config:e,state:t})}),config:e,gateway:e.gateway})]],async receive(t,{from:n}){let r=t.target,i=readNonEmptyString(r.channelId);if(!i)throw Error(`discordChannel().receive requires target.channelId.`);let a=readNonEmptyString(r.conversationId),o=r.initialMessage;if(o!==void 0&&a!==void 0)throw Error("discordChannel().receive: `conversationId` and `initialMessage` are mutually exclusive.");let s=a??``,c=a!==void 0;if(o!==void 0){let t=await buildDiscordHandle({config:e,state:{...initialDiscordState(),channelId:i}}).sendChannelMessage(o);s=t.id,c=t.id.length>0}return n(discordContinuationToken(i,s)).send(t.message,{auth:t.auth,state:{applicationId:null,channelId:i,conversationId:s||null,guildId:null,hasMessageAnchor:c,initialResponseSent:!0,interactionToken:null}})},events:r})}function rebuildDiscordContext(e,t,n){return{discord:buildDiscordHandle({config:n,session:t,state:e}),state:e}}function buildDiscordHandle(e){let t=e.config.api,n=e.state,r=mergeCredentials(e.config.credentials,n);function anchor(t){t.id&&(n.hasMessageAnchor||=(n.conversationId=t.id,!0),n.channelId&&e.session?.continuation?.alias(discordContinuationToken(n.channelId,t.id)))}async function sendViaChannel(e){let i=n.channelId??``;if(!i)throw Error(`discordChannel: missing channel id for outbound message.`);let a=normalizePostInput(e),o=await sendDiscordChannelMessage({apiBaseUrl:t?.apiBaseUrl,body:a,credentials:r,fetch:t?.fetch,channelId:i});return anchor(o),o}async function editOriginal(e){let i=n.interactionToken??``;if(!i)throw Error(`discordChannel: missing interaction token for original response edit.`);let a=normalizePostInput(e),o=await editDiscordOriginalResponse({apiBaseUrl:t?.apiBaseUrl,body:a,credentials:r,fetch:t?.fetch,interactionToken:i});return n.initialResponseSent=!0,anchor(o),o}async function followup(e){let i=n.interactionToken??``;if(!i)throw Error(`discordChannel: missing interaction token for followup message.`);let a=normalizePostInput(e),o=await createDiscordFollowupMessage({apiBaseUrl:t?.apiBaseUrl,body:a,credentials:r,fetch:t?.fetch,interactionToken:i});return anchor(o),o}async function startTyping(){let e=n.channelId??``;if(e)try{await triggerDiscordTypingIndicator({apiBaseUrl:t?.apiBaseUrl,credentials:r,fetch:t?.fetch,channelId:e})}catch(t){logError(log,`Discord typing indicator failed — swallowed`,t,{channelId:e})}}return{applicationId:n.applicationId??void 0,channelId:n.channelId??``,conversationId:n.conversationId??``,guildId:n.guildId??void 0,interactionToken:n.interactionToken??void 0,request(e,n,i){return callDiscordApi({apiBaseUrl:t?.apiBaseUrl,body:n,botToken:i?.botAuth===!0?r.botToken:void 0,fetch:t?.fetch,method:i?.method,path:e})},async post(e){let t=expandPostBodies(normalizePostInput(e)),r;for(let e of t){let t=await postOne({body:e,editOriginal,followup,sendViaChannel,state:n});r===void 0&&(r=t)}return r??{id:``,raw:null}},editOriginalResponse:editOriginal,followup,sendChannelMessage:sendViaChannel,startTyping}}async function postOne(e){if(e.state.interactionToken&&e.state.applicationId)try{return e.state.initialResponseSent?await e.followup(e.body):await e.editOriginal(e.body)}catch(e){log.warn(`Discord interaction-token delivery failed, falling back to channel message`,{error:e})}return e.sendViaChannel(e.body)}async function handleInteraction(e){if(e.interaction.type===DISCORD_INTERACTION_TYPE.MESSAGE_COMPONENT){let t=readDiscordAuthorizationReveal(e.interaction.customId);if(t!==null)return revealAuthorization({...e,interaction:e.interaction,reveal:t})}return e.interaction.type===DISCORD_INTERACTION_TYPE.APPLICATION_COMMAND?handleCommandInteraction({config:e.config,interaction:e.interaction,onCommand:e.onCommand,from:e.from,waitUntil:e.waitUntil}):e.interaction.type===DISCORD_INTERACTION_TYPE.MESSAGE_COMPONENT?handleComponentInteraction({config:e.config,interaction:e.interaction,onInputResponse:e.onInputResponse,from:e.from,waitUntil:e.waitUntil}):handleModalSubmitInteraction({config:e.config,interaction:e.interaction,onInputResponse:e.onInputResponse,from:e.from,waitUntil:e.waitUntil})}async function handleCommandInteraction(e){let t=stateFromInteraction(e.interaction,{conversationId:e.interaction.id,hasMessageAnchor:!1,initialResponseSent:!1}),n={discord:buildDiscordHandle({config:e.config,state:t})},r;try{r=await e.onCommand(n,e.interaction)}catch(e){return log.error(`command handler failed`,{error:e}),discordJson({content:`The Discord command handler failed.`,ephemeral:!0})}return r==null?discordJson({content:`Command ignored.`,ephemeral:!0}):(e.waitUntil(dispatchCommand({interaction:e.interaction,result:r,from:e.from,state:t})),discordDeferredJson(r.ephemeral===!0))}function revealAuthorization(e){return e.waitUntil(answerRevealedAuthorization(e)),discordDeferredJson(!0)}async function answerRevealedAuthorization(e){let{interaction:t}=e,n=stateFromInteraction(t,{conversationId:t.messageId,hasMessageAnchor:!0,initialResponseSent:!1}),r=buildDiscordHandle({config:e.config,state:n}),i=null;try{i=(await e.onInputResponse({defaultAuth:defaultDiscordAuth(t),discord:r},t))?.auth??null}catch(e){log.error(`Discord sign-in press authorization failed`,{error:e})}let a=await answerDiscordAuthorizationReveal({auth:i,resolveSession:()=>e.resolveSession(discordContinuationToken(t.channelId,t.messageId)),reveal:e.reveal});try{await r.editOriginalResponse(a)}catch(e){log.error(`Discord sign-in reply failed`,{error:e})}}function handleComponentInteraction(e){if(isDiscordFreeformComponent(e.interaction.customId)){let t=readMessageContent(e.interaction.raw);return discordJsonBody(buildFreeformModalResponse({customId:e.interaction.customId,prompt:t}))}let t=deriveComponentInputResponses(e.interaction);return t.length>0&&e.waitUntil(dispatchInputResponses({config:e.config,onInputResponse:e.onInputResponse,conversationId:e.interaction.messageId,inputResponses:t,interaction:e.interaction,from:e.from})),discordJsonBody({type:DISCORD_INTERACTION_RESPONSE_TYPE.DEFERRED_UPDATE_MESSAGE})}function handleModalSubmitInteraction(e){let t=deriveModalInputResponses(e.interaction);return t.length>0&&e.waitUntil(dispatchInputResponses({config:e.config,onInputResponse:e.onInputResponse,conversationId:e.interaction.messageId??e.interaction.id,inputResponses:t,interaction:e.interaction,from:e.from})),discordJson({content:`Answer received.`,ephemeral:!0})}async function dispatchCommand(e){let t=discordCommandContent(commandInteractionMessage(e.interaction),e.interaction.attachments),n=formatDiscordContextBlock({applicationId:e.interaction.applicationId,channelId:e.interaction.channelId,commandName:e.interaction.commandName,guildId:e.interaction.guildId,interactionId:e.interaction.id,userId:e.interaction.user.id,username:e.interaction.user.username}),r=e.result.context??[];try{await e.from(discordContinuationToken(e.interaction.channelId,e.interaction.id)).send(t,{auth:e.result.auth,context:[n,...r],history:e.result.history,state:e.state,title:e.result.title})}catch(e){log.error(`command delivery failed`,{error:e})}}async function dispatchInputResponses(e){let t=stateFromInteraction(e.interaction,{conversationId:e.conversationId,hasMessageAnchor:e.conversationId!==e.interaction.id,initialResponseSent:!0}),n=buildDiscordHandle({config:e.config,state:t}),r;try{r=await e.onInputResponse({defaultAuth:defaultDiscordAuth(e.interaction),discord:n},e.interaction)}catch(e){log.error(`input response handler failed`,{error:e});return}if(r===null)return;let{auth:i}=r,a=e.from(discordContinuationToken(e.interaction.channelId,e.conversationId)),o=await respondOrRetireInactivePrompt(()=>a.respond(e.inputResponses,{auth:i}),{retirePrompt:async t=>{let r=e.interaction.messageId,i=readMessageContent(e.interaction.raw);r!==void 0&&i!==void 0&&await editDiscordResolvedPrompt(n,{content:i,messageId:r},t)}},log);o.outcome===`inactive`&&await Promise.all([o.retirement,sendInactiveNotice(n)])}async function sendInactiveNotice(e){try{await e.followup({content:INACTIVE_REQUEST_NOTICE,flags:DISCORD_EPHEMERAL_MESSAGE_FLAG})}catch(e){log.error(`inactive prompt notice failed`,{error:e})}}function acceptAsPresser(e){return{auth:e.defaultAuth}}function dropUnmappedInputResponse(){return log.warn(`dropped a Discord input response: onCommand is customized but onInputResponse is not; set onInputResponse to accept button presses and modal submissions`),null}function stateFromInteraction(e,t){return{audience:discordAudience(e.channelType),directMessage:e.channelType===1,applicationId:e.applicationId,channelId:e.channelId,conversationId:t.conversationId,guildId:e.guildId??null,hasMessageAnchor:t.hasMessageAnchor,initialResponseSent:t.initialResponseSent,interactionToken:e.token}}function initialDiscordState(){return{applicationId:null,channelId:null,conversationId:null,guildId:null,hasMessageAnchor:!1,initialResponseSent:!1,interactionToken:null}}function mergeCredentials(e,t){return{applicationId:t.applicationId??e?.applicationId,botToken:e?.botToken??(()=>resolveDiscordBotToken()),publicKey:e?.publicKey,webhookVerifier:e?.webhookVerifier}}function normalizePostInput(e){return typeof e==`string`?{content:e}:e}function expandPostBodies(e){return typeof e.content==`string`?splitDiscordMessageContent(e.content).map((t,n)=>n===0?{...e,content:t}:{allowed_mentions:e.allowed_mentions,content:t}):[e]}export{discordChannel};
@@ -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};
@@ -1 +1 @@
1
- import{createLogger,logError}from"#internal/logging.js";import{extractGitHubCommentTrigger,formatGitHubContextBlock}from"#public/channels/github/inbound.js";import{buildGitHubBinding}from"#public/channels/github/binding.js";import{buildGitHubPullRequestContext,mergeGitHubContext}from"#public/channels/github/pr-context.js";import{continuationTokenFromState,stateFromCiEvent,stateFromIssueCommentEvent,stateFromIssueEvent,stateFromPullRequestEvent,stateFromPullRequestReviewCommentEvent}from"#public/channels/github/state.js";const log=createLogger(`github.dispatch`);async function dispatchIssueComment(e){let t=await e.botName();if(isIgnoredInboundComment(e.event.comment.body,e.event.comment.author,t))return;let n=buildInboundContext(e.config,e.event);await dispatchCommentTurn({body:e.event.comment.body,botName:t,commentUrl:e.event.comment.htmlUrl,event:e.event,handlerResult:()=>e.handler(n,toGitHubComment(e.event.comment)),config:e.config,from:e.from,state:stateFromIssueCommentEvent(e.event)})}async function dispatchPullRequestReviewComment(e){let t=await e.botName();if(isIgnoredInboundComment(e.event.comment.body,e.event.comment.author,t))return;let n=buildInboundContext(e.config,e.event);await dispatchCommentTurn({body:e.event.comment.body,botName:t,commentUrl:e.event.comment.htmlUrl,event:e.event,handlerResult:()=>e.handler(n,toGitHubComment(e.event.comment)),config:e.config,from:e.from,state:stateFromPullRequestReviewCommentEvent(e.event)})}async function dispatchIssue(e){let t=buildInboundContext(e.config,e.event);await dispatchWebhookEventTurn({botName:e.botName,config:e.config,event:e.event,handlerResult:()=>e.handler(t,e.event.issue),message:formatIssueEventMessage(e.event),from:e.from,state:stateFromIssueEvent(e.event)})}async function dispatchPullRequest(e){let t=buildInboundContext(e.config,e.event);await dispatchWebhookEventTurn({botName:e.botName,config:e.config,event:e.event,handlerResult:()=>e.handler(t,e.event.pullRequest),message:formatPullRequestEventMessage(e.event),from:e.from,state:stateFromPullRequestEvent(e.event)})}async function dispatchCheckSuite(e){await dispatchCiEvent({...e,ci:e.event.checkSuite,handlerResult:t=>e.handler(t,e.event.checkSuite),label:`Check suite`})}async function dispatchCheckRun(e){await dispatchCiEvent({...e,ci:e.event.checkRun,handlerResult:t=>e.handler(t,e.event.checkRun),label:`Check run`})}async function dispatchWorkflowRun(e){await dispatchCiEvent({...e,ci:e.event.workflowRun,handlerResult:t=>e.handler(t,e.event.workflowRun),label:`Workflow run`})}async function dispatchCiEvent(e){let t=stateFromCiEvent(e.event),n=buildInboundContext(e.config,e.event);if(t.pullRequestNumber===null){await runInboundHandler({event:e.event,handlerResult:()=>e.handlerResult(n)})!=null&&log.warn(`GitHub CI event cannot dispatch without an associated pull request`,{deliveryId:e.event.delivery.id,event:e.event.kind});return}await dispatchWebhookEventTurn({botName:e.botName,config:e.config,event:e.event,handlerResult:()=>e.handlerResult(n),message:formatCiEventMessage(e.label,e.ci),from:e.from,state:t})}async function dispatchWebhookEventTurn(e){let t=await runInboundHandler({event:e.event,handlerResult:e.handlerResult});if(t==null)return;let n=await e.botName();await sendGitHubTurn({auth:t.auth,botName:n,event:e.event,message:e.message,context:mergeGitHubContext({github:await buildPullRequestContext(e.config,e.state,e.event.delivery.id),hook:t.context}),from:e.from,state:e.state,title:t.title})}async function dispatchCommentTurn(e){let t=await runInboundHandler({event:e.event,handlerResult:e.handlerResult});if(t==null)return;let n=extractGitHubCommentTrigger({body:e.body,botName:e.botName}),r=n?.message??e.body.trim();await sendGitHubTurn({auth:t.auth,botName:e.botName,commentUrl:e.commentUrl,event:e.event,isMentioned:n!==null,message:r,context:mergeGitHubContext({github:await buildPullRequestContext(e.config,e.state,e.event.delivery.id),hook:t.context}),from:e.from,state:e.state,title:t.title})}async function runInboundHandler(e){try{return await e.handlerResult()}catch(t){logError(log,`GitHub inbound handler failed`,t,{deliveryId:e.event.delivery.id});return}}async function sendGitHubTurn(e){let t=formatGitHubContextBlock({botName:e.botName,deliveryId:e.event.delivery.id,commentUrl:e.commentUrl,headSha:e.state.headSha,issueNumber:e.state.issueNumber,isMentioned:e.isMentioned,pullRequestNumber:e.state.pullRequestNumber,repository:e.event.repository,sender:e.event.sender});try{await e.from(continuationTokenFromState(e.state)).send(e.message,{auth:e.auth,context:[t,...e.context??[]],state:e.state,title:e.title})}catch(t){logError(log,e.logMessage??`GitHub delivery failed`,t,{deliveryId:e.event.delivery.id})}}async function buildPullRequestContext(e,t,n){try{return await buildGitHubPullRequestContext({api:e.api,baseSha:t.baseSha,config:e.pullRequestContext,credentials:e.credentials,headSha:t.headSha,installationId:t.installationId??void 0,owner:t.owner,pullRequestNumber:t.pullRequestNumber,repo:t.repo})}catch(e){logError(log,`GitHub pull-request context failed — swallowed`,e,{deliveryId:n});return}}function buildInboundContext(e,t){let n=t.kind===`check_suite`||t.kind===`check_run`||t.kind===`workflow_run`?stateFromCiEvent(t):t.kind===`issue_comment`?stateFromIssueCommentEvent(t):t.kind===`issues`?stateFromIssueEvent(t):t.kind===`pull_request`?stateFromPullRequestEvent(t):stateFromPullRequestReviewCommentEvent(t),r=buildGitHubBinding({config:e,state:n});return{conversation:t.conversation,delivery:t.delivery,github:r.github,repository:t.repository,sender:t.sender,thread:r.thread}}function toGitHubComment(e){return{author:e.author,body:e.body,htmlUrl:e.htmlUrl,id:e.id,raw:e.raw,url:e.url}}function formatIssueEventMessage(e){let t=readString(e.issue.raw.title);return`Issue ${e.issue.action}: #${e.issue.issueNumber}${t?` ${t}`:``}`}function formatPullRequestEventMessage(e){let t=readString(e.pullRequest.raw.title);return`Pull request ${e.pullRequest.action}: #${e.pullRequest.pullRequestNumber}${t?` ${t}`:``}`}function formatCiEventMessage(e,t){let n=t.conclusion??t.status;return`${e} ${t.action}: ${ciEventId(t)}${n?` (${n})`:``}`}function ciEventId(e){return`checkSuiteId`in e?e.checkSuiteId:`checkRunId`in e?e.checkRunId:e.workflowRunId}function isIgnoredInboundComment(e,t,n){if(e.includes(`<!-- eve:github:`)||t?.type===`Bot`)return!0;let r=n?`${n}[bot]`.toLowerCase():``;return r.length>0&&t?.login.toLowerCase()===r}function readString(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}export{dispatchCheckRun,dispatchCheckSuite,dispatchIssue,dispatchIssueComment,dispatchPullRequest,dispatchPullRequestReviewComment,dispatchWorkflowRun};
1
+ import{createLogger,logError}from"#internal/logging.js";import{extractGitHubCommentTrigger,formatGitHubContextBlock}from"#public/channels/github/inbound.js";import{buildGitHubBinding}from"#public/channels/github/binding.js";import{buildGitHubPullRequestContext,mergeGitHubContext}from"#public/channels/github/pr-context.js";import{continuationTokenFromState,stateFromCiEvent,stateFromIssueCommentEvent,stateFromIssueEvent,stateFromPullRequestEvent,stateFromPullRequestReviewCommentEvent}from"#public/channels/github/state.js";const log=createLogger(`github.dispatch`);async function dispatchIssueComment(e){let t=await e.botName();if(isIgnoredInboundComment(e.event.comment.body,e.event.comment.author,t))return;let n=buildInboundContext(e.config,e.event);await dispatchCommentTurn({body:e.event.comment.body,botName:t,commentUrl:e.event.comment.htmlUrl,event:e.event,handlerResult:()=>e.handler(n,toGitHubComment(e.event.comment)),config:e.config,from:e.from,state:stateFromIssueCommentEvent(e.event)})}async function dispatchPullRequestReviewComment(e){let t=await e.botName();if(isIgnoredInboundComment(e.event.comment.body,e.event.comment.author,t))return;let n=buildInboundContext(e.config,e.event);await dispatchCommentTurn({body:e.event.comment.body,botName:t,commentUrl:e.event.comment.htmlUrl,event:e.event,handlerResult:()=>e.handler(n,toGitHubComment(e.event.comment)),config:e.config,from:e.from,state:stateFromPullRequestReviewCommentEvent(e.event)})}async function dispatchIssue(e){let t=buildInboundContext(e.config,e.event);await dispatchWebhookEventTurn({botName:e.botName,config:e.config,event:e.event,handlerResult:()=>e.handler(t,e.event.issue),message:formatIssueEventMessage(e.event),from:e.from,state:stateFromIssueEvent(e.event)})}async function dispatchPullRequest(e){let t=buildInboundContext(e.config,e.event);await dispatchWebhookEventTurn({botName:e.botName,config:e.config,event:e.event,handlerResult:()=>e.handler(t,e.event.pullRequest),message:formatPullRequestEventMessage(e.event),from:e.from,state:stateFromPullRequestEvent(e.event)})}async function dispatchCheckSuite(e){await dispatchCiEvent({...e,ci:e.event.checkSuite,handlerResult:t=>e.handler(t,e.event.checkSuite),label:`Check suite`})}async function dispatchCheckRun(e){await dispatchCiEvent({...e,ci:e.event.checkRun,handlerResult:t=>e.handler(t,e.event.checkRun),label:`Check run`})}async function dispatchWorkflowRun(e){await dispatchCiEvent({...e,ci:e.event.workflowRun,handlerResult:t=>e.handler(t,e.event.workflowRun),label:`Workflow run`})}async function dispatchCiEvent(e){let t=stateFromCiEvent(e.event),n=buildInboundContext(e.config,e.event);if(t.pullRequestNumber===null){await runInboundHandler({event:e.event,handlerResult:()=>e.handlerResult(n)})!=null&&log.warn(`GitHub CI event cannot dispatch without an associated pull request`,{deliveryId:e.event.delivery.id,event:e.event.kind});return}await dispatchWebhookEventTurn({botName:e.botName,config:e.config,event:e.event,handlerResult:()=>e.handlerResult(n),message:formatCiEventMessage(e.label,e.ci),from:e.from,state:t})}async function dispatchWebhookEventTurn(e){let t=await runInboundHandler({event:e.event,handlerResult:e.handlerResult});if(t==null)return;let n=await e.botName();await sendGitHubTurn({auth:t.auth,botName:n,event:e.event,message:e.message,context:mergeGitHubContext({github:await buildPullRequestContext(e.config,e.state,e.event.delivery.id),hook:t.context}),from:e.from,history:t.history,state:e.state,title:t.title})}async function dispatchCommentTurn(e){let t=await runInboundHandler({event:e.event,handlerResult:e.handlerResult});if(t==null)return;let n=extractGitHubCommentTrigger({body:e.body,botName:e.botName}),r=n?.message??e.body.trim();await sendGitHubTurn({auth:t.auth,botName:e.botName,commentUrl:e.commentUrl,event:e.event,isMentioned:n!==null,message:r,context:mergeGitHubContext({github:await buildPullRequestContext(e.config,e.state,e.event.delivery.id),hook:t.context}),from:e.from,history:t.history,state:e.state,title:t.title})}async function runInboundHandler(e){try{return await e.handlerResult()}catch(t){logError(log,`GitHub inbound handler failed`,t,{deliveryId:e.event.delivery.id});return}}async function sendGitHubTurn(e){let t=formatGitHubContextBlock({botName:e.botName,deliveryId:e.event.delivery.id,commentUrl:e.commentUrl,headSha:e.state.headSha,issueNumber:e.state.issueNumber,isMentioned:e.isMentioned,pullRequestNumber:e.state.pullRequestNumber,repository:e.event.repository,sender:e.event.sender});try{await e.from(continuationTokenFromState(e.state)).send(e.message,{auth:e.auth,context:[t,...e.context??[]],history:e.history,state:e.state,title:e.title})}catch(t){logError(log,e.logMessage??`GitHub delivery failed`,t,{deliveryId:e.event.delivery.id})}}async function buildPullRequestContext(e,t,n){try{return await buildGitHubPullRequestContext({api:e.api,baseSha:t.baseSha,config:e.pullRequestContext,credentials:e.credentials,headSha:t.headSha,installationId:t.installationId??void 0,owner:t.owner,pullRequestNumber:t.pullRequestNumber,repo:t.repo})}catch(e){logError(log,`GitHub pull-request context failed — swallowed`,e,{deliveryId:n});return}}function buildInboundContext(e,t){let n=t.kind===`check_suite`||t.kind===`check_run`||t.kind===`workflow_run`?stateFromCiEvent(t):t.kind===`issue_comment`?stateFromIssueCommentEvent(t):t.kind===`issues`?stateFromIssueEvent(t):t.kind===`pull_request`?stateFromPullRequestEvent(t):stateFromPullRequestReviewCommentEvent(t),r=buildGitHubBinding({config:e,state:n});return{conversation:t.conversation,delivery:t.delivery,github:r.github,repository:t.repository,sender:t.sender,thread:r.thread}}function toGitHubComment(e){return{author:e.author,body:e.body,htmlUrl:e.htmlUrl,id:e.id,raw:e.raw,url:e.url}}function formatIssueEventMessage(e){let t=readString(e.issue.raw.title);return`Issue ${e.issue.action}: #${e.issue.issueNumber}${t?` ${t}`:``}`}function formatPullRequestEventMessage(e){let t=readString(e.pullRequest.raw.title);return`Pull request ${e.pullRequest.action}: #${e.pullRequest.pullRequestNumber}${t?` ${t}`:``}`}function formatCiEventMessage(e,t){let n=t.conclusion??t.status;return`${e} ${t.action}: ${ciEventId(t)}${n?` (${n})`:``}`}function ciEventId(e){return`checkSuiteId`in e?e.checkSuiteId:`checkRunId`in e?e.checkRunId:e.workflowRunId}function isIgnoredInboundComment(e,t,n){if(e.includes(`<!-- eve:github:`)||t?.type===`Bot`)return!0;let r=n?`${n}[bot]`.toLowerCase():``;return r.length>0&&t?.login.toLowerCase()===r}function readString(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}export{dispatchCheckRun,dispatchCheckSuite,dispatchIssue,dispatchIssueComment,dispatchPullRequest,dispatchPullRequestReviewComment,dispatchWorkflowRun};
@@ -1,3 +1,4 @@
1
+ import type { SessionHistoryMessage } from "#shared/session-history.js";
1
2
  import type { SessionAuthContext, TurnPolicy } from "#channel/types.js";
2
3
  import type { SessionContext } from "#public/definitions/callback-context.js";
3
4
  import type { ChannelContinuationOps } from "#public/definitions/channel.js";
@@ -61,6 +62,8 @@ export interface GitHubEventContext extends GitHubChannelContext, ChannelContinu
61
62
  export type GitHubInboundResult = {
62
63
  readonly auth: SessionAuthContext | null;
63
64
  readonly context?: readonly string[];
65
+ /** Prior conversation added as user and assistant turns before this message. */
66
+ readonly history?: readonly SessionHistoryMessage[];
64
67
  /** Overrides the workflow run title without changing the message sent to the model. */
65
68
  readonly title?: string;
66
69
  } | null;
@@ -0,0 +1,74 @@
1
+ import type { SessionAuthContext } from "#channel/types.js";
2
+ import type { Adapter, Author, Chat, Message, ReactionEvent, Thread } from "#compiled/chat/index.js";
3
+ import type { ChatSdkChannel, ChatSdkChannelBridge } from "#public/channels/chat-sdk/index.js";
4
+ import { type ToolDefinition } from "#public/tools/index.js";
5
+ /** The six standard iMessage tapbacks. */
6
+ export declare const IMESSAGE_TAPBACKS: readonly ["love", "like", "dislike", "laugh", "emphasize", "question"];
7
+ /** A standard iMessage tapback. */
8
+ export type IMessageTapbackType = (typeof IMESSAGE_TAPBACKS)[number];
9
+ /** A tapback someone added to or removed from a message in an iMessage conversation. */
10
+ export interface IMessageTapback {
11
+ /** `true` when the tapback was added, `false` when it was removed. */
12
+ readonly added: boolean;
13
+ /** The person who sent the tapback. */
14
+ readonly author: Author;
15
+ /** The message the tapback is on, when the provider includes it. */
16
+ readonly message?: Message;
17
+ /** Id of the message the tapback is on. */
18
+ readonly messageId: string;
19
+ /** The provider's raw event. */
20
+ readonly raw: unknown;
21
+ /** A standard tapback, or the emoji itself for an emoji tapback. */
22
+ readonly tapback: IMessageTapbackType | (string & {});
23
+ }
24
+ /** Result of an `onTapback` hook. Return `null` to ignore the tapback. */
25
+ export type IMessageTapbackResult = {
26
+ /**
27
+ * Option id that answers the input request eve posted in the message the
28
+ * tapback is on, such as `"approve"` or `"cancel"` for a tool approval.
29
+ * When that message isn't waiting on an answer with this option, the agent
30
+ * receives the tapback as a message instead.
31
+ */
32
+ readonly answer?: string;
33
+ readonly auth: SessionAuthContext | null;
34
+ readonly context?: readonly string[];
35
+ /**
36
+ * Replaces the text the agent receives. Defaults to text like
37
+ * `Tapback: Loved “See you at 7”`.
38
+ */
39
+ readonly message?: string;
40
+ /** Overrides the workflow run title without changing the message sent to the model. */
41
+ readonly title?: string;
42
+ } | null;
43
+ /** Input of the tool returned by `tapbackTool()`. */
44
+ export interface IMessageTapbackToolInput {
45
+ /** A standard tapback, or a single emoji such as `"🎉"`. */
46
+ readonly tapback: IMessageTapbackType | (string & {});
47
+ }
48
+ /** Context passed to an `onTapback` hook. */
49
+ export interface IMessageTapbackContext {
50
+ /** Low-level Chat SDK thread for iMessage-specific operations. */
51
+ readonly thread: Thread<unknown>;
52
+ }
53
+ type TapbackHook = (ctx: IMessageTapbackContext, tapback: IMessageTapback) => IMessageTapbackResult | Promise<IMessageTapbackResult>;
54
+ /** Sends an emoji tapback (not one of the six standard ones) through the channel's adapter. */
55
+ export type SendEmojiTapback = (adapter: Adapter, threadId: string, messageId: string, emoji: string) => Promise<void>;
56
+ /** Normalizes a Chat SDK reaction event from an iMessage adapter. */
57
+ export declare function toIMessageTapback(event: ReactionEvent): IMessageTapback;
58
+ /** Model-visible text for a tapback, in the form iMessage uses for tapbacks shown as text. */
59
+ export declare function iMessageTapbackText(tapback: IMessageTapback): string;
60
+ /** Sends tapbacks people add or remove to eve when `onTapback` accepts them. */
61
+ export declare function dispatchIMessageTapbacks<TAdapters extends Record<string, Adapter>>(bridge: ChatSdkChannelBridge<TAdapters>, onTapback: TapbackHook): void;
62
+ /**
63
+ * Builds a tool that reacts to the latest message in the session's iMessage
64
+ * conversation. It acts only in sessions that came through `channel`.
65
+ */
66
+ export declare function iMessageTapbackTool(options: {
67
+ readonly adapterName: string;
68
+ readonly bot: Chat;
69
+ readonly channel: ChatSdkChannel;
70
+ readonly channelLabel: string;
71
+ /** Defaults to the adapter's `addReaction`. */
72
+ readonly sendEmoji?: SendEmojiTapback;
73
+ }): ToolDefinition<IMessageTapbackToolInput, string>;
74
+ export {};
@@ -0,0 +1 @@
1
+ import{loadContext}from"#context/container.js";import{ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{isChannel}from"#public/channels/index.js";import{fetchMessageBestEffort}from"#public/channels/chat-sdk/fetch-message.js";import{defineTool}from"#public/tools/index.js";const IMESSAGE_TAPBACKS=[`love`,`like`,`dislike`,`laugh`,`emphasize`,`question`],TAPBACK_BY_EMOJI_NAME={exclamation:`emphasize`,heart:`love`,laugh:`laugh`,question:`question`,thumbs_down:`dislike`,thumbs_up:`like`},TAPBACK_BY_GLYPH={"❓":`question`,"❤":`love`,"❤️":`love`,"‼":`emphasize`,"‼️":`emphasize`,"👍":`like`,"👎":`dislike`,"😂":`laugh`},EMOJI=/\p{Extended_Pictographic}|\p{Regional_Indicator}/u,graphemes=new Intl.Segmenter(void 0,{granularity:`grapheme`}),ADDED_VERB={dislike:`Disliked`,emphasize:`Emphasized`,laugh:`Laughed at`,like:`Liked`,love:`Loved`,question:`Questioned`};function toIMessageTapback(e){return{added:e.added,author:e.user,message:e.message,messageId:e.messageId,raw:e.raw,tapback:TAPBACK_BY_EMOJI_NAME[e.emoji.name]??e.rawEmoji}}function iMessageTapbackText(e){let t=e.message?.text.trim(),n=t?`“${t.length>200?`${t.slice(0,199)}…`:t}”`:`a message`,r=isStandardTapback(e.tapback);return e.added?r?`Tapback: ${ADDED_VERB[e.tapback]} ${n}`:`Tapback: Reacted ${e.tapback} to ${n}`:`Tapback: Removed ${r?`a ${e.tapback} tapback`:e.tapback} from ${n}`}function dispatchIMessageTapbacks(e,t){e.bot.onReaction(async n=>{if(n.user.isMe)return;let r=toIMessageTapback({...n,message:n.message??await fetchMessageBestEffort(n.adapter,n.threadId,n.messageId)??void 0}),i=await t({thread:n.thread},r);i!==null&&await e.send(i.message??iMessageTapbackText(r),{auth:i.auth,context:[...i.context??[]],inputAnswer:i.answer===void 0?void 0:{messageId:r.messageId,optionId:i.answer},thread:n.thread.toJSON(),title:i.title})})}function iMessageTapbackTool(e){let{adapterName:t,bot:n,channel:r,channelLabel:i}=e,a=e.sendEmoji??((e,t,n,r)=>e.addReaction(t,n,r));return defineTool({availableInSubagents:!1,description:`React to the latest message in this iMessage conversation with a tapback: love (heart), like (thumbs up), dislike (thumbs down), laugh (haha), emphasize (!!), question (?), or any single emoji such as 🎉. Use it to acknowledge a message, alone or alongside a reply.`,inputSchema:{type:`object`,properties:{tapback:{type:`string`,description:`One of ${IMESSAGE_TAPBACKS.join(`, `)}, or a single emoji.`}},required:[`tapback`],additionalProperties:!1},async execute(e){let o=normalizeOutgoingTapback(e.tapback);if(o===void 0)throw Error(`Unknown tapback "${e.tapback}". Use one of ${IMESSAGE_TAPBACKS.join(`, `)}, or a single emoji.`);let s=loadContext().get(ChannelKey);if(s===void 0||!isChannel({kind:s.kind},r))throw Error(`Tapbacks work only in a conversation that came through the ${i} channel.`);let c=s.state,l=c?.thread?.id,u=c?.latestMessageId;if(!l||!u)throw Error(`There is no message in this conversation to react to yet.`);await n.initialize();let d=n.getAdapter(t);return isStandardTapback(o)?await d.addReaction(l,u,o):await a(d,l,u,o),`Sent a ${o} tapback.`}})}function normalizeOutgoingTapback(e){let t=e.trim(),n=t.toLowerCase();if(isStandardTapback(n))return n;let r=TAPBACK_BY_GLYPH[t];return r===void 0?[...graphemes.segment(t)].length===1&&EMOJI.test(t)?t:void 0:r}function isStandardTapback(e){return IMESSAGE_TAPBACKS.includes(e)}export{IMESSAGE_TAPBACKS,dispatchIMessageTapbacks,iMessageTapbackText,iMessageTapbackTool,toIMessageTapback};
@@ -1,6 +1,7 @@
1
- export { defineChannel, disableRoute, GET, HEAD, OPTIONS, POST, PUT, PATCH, DELETE, WS, type AttachSessionFn, type CancelTurnResult, type ClearSessionResult, type CompactSessionResult, type ResetSessionResult, SessionStrandedError, type Channel, type ChannelAudience, type AudienceCaller, type AudienceContext, type AudienceInput, type AudiencePrincipal, type ConversationEnvironment, type ChannelFrom, type ChannelReceiveContext, type ChannelResolveSession, type ChannelRespondOptions, type ChannelSendOptions, type ChannelSource, type ChannelCors, type ChannelCorsOptions, type ChannelDefinition, type DisabledRouteSentinel, type ChannelContinuationOps, type ChannelEvents, type InferChannelMetadata, type Session, type SessionCallback, type SessionHandle, type SessionRespondOptions, type SessionSendOptions, type TurnPolicy, type RouteDefinition, type RouteHandlerArgs, type AgentDescription, type AgentSkillDescription, type AgentSkillFileDescription, type AgentToolDescription, type InvokeToolFn, type InvokeToolOptions, type InvokeToolResult, type HttpRouteDefinition, type WebSocketMessage, type WebSocketPeer, type WebSocketRouteDefinition, type WebSocketRouteHandler, type WebSocketRouteHooks, type WebSocketUpgradeRequest, type WebSocketUpgradeResult, isDisabledRouteSentinel, } from "#public/definitions/channel.js";
1
+ export { defineChannel, disableRoute, GET, HEAD, OPTIONS, POST, PUT, PATCH, DELETE, WS, type AttachSessionFn, type CancelTurnResult, type ClearSessionResult, type CompactSessionResult, type ResetSessionResult, SessionStrandedError, type Channel, type ChannelAudience, type AudienceCaller, type AudienceContext, type AudienceInput, type AudiencePrincipal, type ConversationEnvironment, type ChannelFrom, type ChannelReceiveContext, type ChannelResolveSession, type ChannelRespondOptions, type ChannelCreateOptions, type ChannelCreateResult, type ChannelSendOptions, type ChannelSource, type ChannelCors, type ChannelCorsOptions, type ChannelDefinition, type DisabledRouteSentinel, type ChannelContinuationOps, type ChannelEvents, type InferChannelMetadata, type Session, type SessionCallback, type SessionHandle, type SessionRespondOptions, type SessionSendOptions, type TurnPolicy, type RouteDefinition, type RouteHandlerArgs, type AgentDescription, type AgentSkillDescription, type AgentSkillFileDescription, type AgentToolDescription, type InvokeToolFn, type InvokeToolOptions, type InvokeToolResult, type HttpRouteDefinition, type WebSocketMessage, type WebSocketPeer, type WebSocketRouteDefinition, type WebSocketRouteHandler, type WebSocketRouteHooks, type WebSocketUpgradeRequest, type WebSocketUpgradeResult, isDisabledRouteSentinel, } from "#public/definitions/channel.js";
2
2
  export { attachmentError } from "#public/channels/attachment-error.js";
3
3
  export type { FetchFileContext, FetchFileFunction, FetchFileResult, } from "#shared/channel-definition.js";
4
+ export { InvalidSessionHistoryError, type SessionHistoryMessage } from "#shared/session-history.js";
4
5
  export { createWebSocketUpgradeServer, type WebSocketUpgradeServerBridge, } from "#channel/websocket-upgrade-server.js";
5
6
  import type { Channel, InferChannelMetadata } from "#public/definitions/channel.js";
6
7
  /**
@@ -1 +1 @@
1
- import{getChannelInstrumentationKind}from"#channel/compiled-channel.js";import{DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT,SessionStrandedError,WS,defineChannel,disableRoute,isDisabledRouteSentinel}from"#public/definitions/channel.js";import{attachmentError}from"#public/channels/attachment-error.js";import{createWebSocketUpgradeServer}from"#channel/websocket-upgrade-server.js";function isChannel(e,t){return e.kind===getChannelInstrumentationKind(t)}export{DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT,SessionStrandedError,WS,attachmentError,createWebSocketUpgradeServer,defineChannel,disableRoute,isChannel,isDisabledRouteSentinel};
1
+ import{InvalidSessionHistoryError}from"#shared/session-history.js";import{getChannelInstrumentationKind}from"#channel/compiled-channel.js";import{DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT,SessionStrandedError,WS,defineChannel,disableRoute,isDisabledRouteSentinel}from"#public/definitions/channel.js";import{attachmentError}from"#public/channels/attachment-error.js";import{createWebSocketUpgradeServer}from"#channel/websocket-upgrade-server.js";function isChannel(e,t){return e.kind===getChannelInstrumentationKind(t)}export{DELETE,GET,HEAD,InvalidSessionHistoryError,OPTIONS,PATCH,POST,PUT,SessionStrandedError,WS,attachmentError,createWebSocketUpgradeServer,defineChannel,disableRoute,isChannel,isDisabledRouteSentinel};
@@ -1,4 +1,5 @@
1
1
  import type { PromptQueueState } from "#channel/prompt-queue.js";
2
+ import type { SessionHistoryMessage } from "#shared/session-history.js";
2
3
  import type { SessionAuthContext, TurnPolicy } from "#channel/types.js";
3
4
  import type { UnstampedMessageStreamEvent } from "#protocol/message.js";
4
5
  import { createLinearAgentActivity, listLinearAgentSessionActivities, updateLinearAgentSession, type LinearApiOptions } from "#public/channels/linear/api.js";
@@ -121,6 +122,8 @@ export interface LinearChannelEvents {
121
122
  export type LinearInboundResult = {
122
123
  readonly auth: SessionAuthContext | null;
123
124
  readonly context?: readonly string[];
125
+ /** Prior conversation added as user and assistant turns before this message. */
126
+ readonly history?: readonly SessionHistoryMessage[];
124
127
  /** Overrides the workflow run title without changing the message sent to the model. */
125
128
  readonly title?: string;
126
129
  } | null;