eve 0.67.1 → 0.68.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 (653) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/src/channel/channel-address.d.ts +2 -2
  3. package/dist/src/channel/compiled-channel.d.ts +3 -2
  4. package/dist/src/channel/cross-channel-receive.d.ts +1 -18
  5. package/dist/src/channel/cross-channel-receive.js +1 -1
  6. package/dist/src/channel/forwarded-principal.d.ts +3 -2
  7. package/dist/src/channel/resolve-text.d.ts +2 -1
  8. package/dist/src/channel/schedule.d.ts +2 -2
  9. package/dist/src/channel/session-callback.d.ts +2 -1
  10. package/dist/src/channel/types.d.ts +3 -7
  11. package/dist/src/cli/acp/command.d.ts +2 -1
  12. package/dist/src/cli/agent-command.d.ts +2 -1
  13. package/dist/src/cli/agent-detection.d.ts +0 -1
  14. package/dist/src/cli/agent-detection.js +1 -1
  15. package/dist/src/cli/application-command.d.ts +2 -1
  16. package/dist/src/cli/application-root.d.ts +3 -6
  17. package/dist/src/cli/application-root.js +1 -1
  18. package/dist/src/cli/commands/init-target.d.ts +1 -1
  19. package/dist/src/cli/commands/init-telemetry.d.ts +2 -1
  20. package/dist/src/cli/commands/registry-declared-setups.d.ts +2 -1
  21. package/dist/src/cli/commands/registry-install-transaction.d.ts +0 -13
  22. package/dist/src/cli/commands/registry-install-transaction.js +1 -1
  23. package/dist/src/cli/commands/registry-pnpm-build-policy-flow.d.ts +1 -1
  24. package/dist/src/cli/commands/registry-presentation.d.ts +0 -1
  25. package/dist/src/cli/commands/registry-presentation.js +1 -1
  26. package/dist/src/cli/commands/registry-project.d.ts +2 -1
  27. package/dist/src/cli/commands/registry.d.ts +0 -4
  28. package/dist/src/cli/commands/registry.js +1 -1
  29. package/dist/src/cli/commands/setup-headless.d.ts +2 -1
  30. package/dist/src/cli/commands/vercel-non-interactive.d.ts +2 -1
  31. package/dist/src/cli/dev/command-options.d.ts +1 -0
  32. package/dist/src/cli/dev/command.js +1 -1
  33. package/dist/src/cli/dev/diagnostic-dump.d.ts +0 -2
  34. package/dist/src/cli/dev/diagnostic-dump.js +1 -1
  35. package/dist/src/cli/dev/diagnostic-sink.d.ts +3 -2
  36. package/dist/src/cli/dev/local-server-process.js +1 -1
  37. package/dist/src/cli/dev/tui/agent-header.d.ts +2 -1
  38. package/dist/src/cli/dev/tui/argument-typeahead.d.ts +2 -1
  39. package/dist/src/cli/dev/tui/dev-rebuild-status.d.ts +2 -1
  40. package/dist/src/cli/dev/tui/diagnostic-presentation.d.ts +2 -1
  41. package/dist/src/cli/dev/tui/errors.d.ts +2 -7
  42. package/dist/src/cli/dev/tui/errors.js +1 -1
  43. package/dist/src/cli/dev/tui/flow-drawer.d.ts +2 -1
  44. package/dist/src/cli/dev/tui/line-editor.d.ts +1 -1
  45. package/dist/src/cli/dev/tui/mcp-connection-status.d.ts +2 -1
  46. package/dist/src/cli/dev/tui/message-queue.d.ts +4 -3
  47. package/dist/src/cli/dev/tui/prompt-command-handler.d.ts +2 -1
  48. package/dist/src/cli/dev/tui/provider-picker.d.ts +3 -2
  49. package/dist/src/cli/dev/tui/question-panel.d.ts +2 -1
  50. package/dist/src/cli/dev/tui/registry-result-message.d.ts +3 -4
  51. package/dist/src/cli/dev/tui/registry-result-message.js +1 -1
  52. package/dist/src/cli/dev/tui/remote-connection-probe.d.ts +3 -2
  53. package/dist/src/cli/dev/tui/setup-panel.d.ts +2 -2
  54. package/dist/src/cli/dev/tui/setup-selection-input.d.ts +2 -2
  55. package/dist/src/cli/dev/tui/status-line.d.ts +2 -1
  56. package/dist/src/cli/dev/tui/stream-format.d.ts +3 -2
  57. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +3 -2
  58. package/dist/src/cli/dev/tui/theme.d.ts +1 -1
  59. package/dist/src/cli/dev/tui/tool-block-groups.d.ts +3 -2
  60. package/dist/src/cli/dev/tui/tool-presentation.d.ts +2 -1
  61. package/dist/src/cli/dev/tui/traces/trace-content.d.ts +0 -9
  62. package/dist/src/cli/dev/tui/traces/trace-content.js +1 -1
  63. package/dist/src/cli/dev/tui/traces/trace-view.d.ts +3 -2
  64. package/dist/src/cli/dev/tui/traces/trace-viewer-session.d.ts +2 -1
  65. package/dist/src/cli/dev/tui/traces/trace-viewer-state.d.ts +2 -3
  66. package/dist/src/cli/dev/tui/traces/trace-viewer-state.js +1 -1
  67. package/dist/src/cli/dev/tui/tui.js +1 -1
  68. package/dist/src/cli/dev/ui-options.d.ts +3 -2
  69. package/dist/src/cli/dev/url-target.d.ts +2 -1
  70. package/dist/src/cli/invoke/command.d.ts +0 -11
  71. package/dist/src/cli/invoke/command.js +1 -1
  72. package/dist/src/cli/invoke/result.d.ts +1 -1
  73. package/dist/src/cli/telemetry/index.d.ts +0 -6
  74. package/dist/src/cli/telemetry/preference.d.ts +2 -1
  75. package/dist/src/cli/ui/alt-screen.d.ts +3 -2
  76. package/dist/src/cli/ui/live-region.d.ts +3 -2
  77. package/dist/src/cli/ui/output.d.ts +1 -1
  78. package/dist/src/client/eve-agent-store-helpers.d.ts +0 -1
  79. package/dist/src/client/eve-agent-store-helpers.js +1 -1
  80. package/dist/src/client/message-action-parts.d.ts +2 -1
  81. package/dist/src/client/session-utils.d.ts +3 -2
  82. package/dist/src/compiled/.vendor-stamp.json +6 -6
  83. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/index.js +55 -55
  84. package/dist/src/compiled/@vercel/blob/index.js +1 -1
  85. package/dist/src/compiled/@vercel/oidc/index.js +1 -1
  86. package/dist/src/compiled/@workflow/core/index.js +2 -2
  87. package/dist/src/compiled/@workflow/core/private.js +1 -1
  88. package/dist/src/compiled/@workflow/core/runtime/constants.d.ts +4 -3
  89. package/dist/src/compiled/@workflow/core/runtime/helpers.d.ts +23 -0
  90. package/dist/src/compiled/@workflow/core/runtime/helpers.js +1 -1
  91. package/dist/src/compiled/@workflow/core/runtime/hook-wake.d.ts +69 -36
  92. package/dist/src/compiled/@workflow/core/runtime/lifecycle-hooks.d.ts +25 -22
  93. package/dist/src/compiled/@workflow/core/runtime/run-spec-version.d.ts +16 -0
  94. package/dist/src/compiled/@workflow/core/runtime/start.d.ts +59 -1
  95. package/dist/src/compiled/@workflow/core/runtime/step-latency.d.ts +3 -2
  96. package/dist/src/compiled/@workflow/core/runtime/suspension-handler.d.ts +34 -12
  97. package/dist/src/compiled/@workflow/core/runtime.js +4 -4
  98. package/dist/src/compiled/@workflow/core/serialization.d.ts +7 -2
  99. package/dist/src/compiled/@workflow/core/serialization.js +1 -1
  100. package/dist/src/compiled/@workflow/core/telemetry/semantic-conventions.d.ts +29 -0
  101. package/dist/src/compiled/@workflow/core/types.d.ts +1 -0
  102. package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
  103. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  104. package/dist/src/compiled/@workflow/errors/index.d.ts +13 -0
  105. package/dist/src/compiled/@workflow/errors/index.js +1 -1
  106. package/dist/src/compiled/@workflow/world/events.d.ts +14 -4
  107. package/dist/src/compiled/@workflow/world/index.d.ts +2 -2
  108. package/dist/src/compiled/@workflow/world/interfaces.d.ts +2 -1
  109. package/dist/src/compiled/@workflow/world/shared.d.ts +24 -0
  110. package/dist/src/compiled/@workflow/world/spec-version.d.ts +23 -0
  111. package/dist/src/compiled/@workflow/world-local/index.js +5 -5
  112. package/dist/src/compiled/@workflow/world-vercel/index.js +16 -16
  113. package/dist/src/compiled/_chunks/workflow/{attribute-changes-DzJovO_f.js → attribute-changes-D721NpZv.js} +3 -3
  114. package/dist/src/compiled/_chunks/workflow/{dist-BQSf8Hax.js → dist-BUFGAKRb.js} +1 -1
  115. package/dist/src/compiled/_chunks/workflow/dist-CaNNONeg.js +3 -0
  116. package/dist/src/compiled/_chunks/workflow/{frames-qKc30rjg.js → frames-Dr9fHWdo.js} +2 -2
  117. package/dist/src/compiled/_chunks/workflow/{global-BQnKzRXo.js → global-DKbOgrts.js} +1 -1
  118. package/dist/src/compiled/_chunks/workflow/helpers-DkKxg_yn.js +1 -0
  119. package/dist/src/compiled/_chunks/workflow/logger-D4GJNTk4.js +14 -0
  120. package/dist/src/compiled/_chunks/workflow/resume-hook-uTW-jBYz.js +1 -0
  121. package/dist/src/compiled/_chunks/workflow/run-5DmiMN9b.js +1 -0
  122. package/dist/src/compiled/_chunks/workflow/serialization-CNIYl1D3.js +3 -0
  123. package/dist/src/compiled/_chunks/workflow/sleep-DFKgN7UG.js +1 -0
  124. package/dist/src/compiled/_chunks/workflow/wait-until-3_1djUuL.js +1 -0
  125. package/dist/src/compiled/_chunks/workflow/{ws-transport-BrsMYqJg.js → ws-transport--rYOVIaf.js} +1 -1
  126. package/dist/src/compiler/artifacts.d.ts +4 -27
  127. package/dist/src/compiler/artifacts.js +1 -1
  128. package/dist/src/compiler/compile-agent.d.ts +2 -1
  129. package/dist/src/compiler/compile-agent.js +1 -1
  130. package/dist/src/compiler/diagnostics.d.ts +0 -11
  131. package/dist/src/compiler/diagnostics.js +1 -1
  132. package/dist/src/compiler/extension-compatibility.d.ts +6 -6
  133. package/dist/src/compiler/extension-compatibility.js +1 -1
  134. package/dist/src/compiler/manifest.d.ts +0 -4
  135. package/dist/src/compiler/module-map.d.ts +1 -5
  136. package/dist/src/compiler/module-map.js +1 -1
  137. package/dist/src/compiler/normalize-agent-config.js +1 -1
  138. package/dist/src/compiler/normalize-connection.d.ts +2 -1
  139. package/dist/src/compiler/normalize-instructions.d.ts +2 -6
  140. package/dist/src/compiler/normalize-instructions.js +1 -1
  141. package/dist/src/compiler/normalize-manifest-helpers.d.ts +0 -1
  142. package/dist/src/compiler/normalize-manifest-helpers.js +1 -1
  143. package/dist/src/compiler/normalize-manifest.js +1 -1
  144. package/dist/src/compiler/normalize-skill.d.ts +2 -1
  145. package/dist/src/compiler/project-sources.d.ts +0 -14
  146. package/dist/src/compiler/project-sources.js +1 -1
  147. package/dist/src/compiler/resolve-workspace-subagent.js +1 -1
  148. package/dist/src/compiler/source-graph.d.ts +1 -2
  149. package/dist/src/compiler/source-graph.js +1 -1
  150. package/dist/src/computer-use/extension/extension.d.ts +2 -0
  151. package/dist/src/computer-use/extension/extension.js +1 -0
  152. package/dist/src/computer-use/extension/lib/command-failure.d.ts +7 -0
  153. package/dist/src/computer-use/extension/lib/command-failure.js +2 -0
  154. package/dist/src/{extensions/code → computer-use}/extension/lib/computer-use-driver-source.d.ts +0 -2
  155. package/dist/src/{extensions/code → computer-use}/extension/lib/computer-use-driver-source.js +57 -57
  156. package/dist/src/{extensions/code → computer-use}/extension/lib/computer-use-sandbox.js +1 -1
  157. package/dist/src/{extensions/code → computer-use}/extension/lib/computer-use.d.ts +1 -1
  158. package/dist/src/computer-use/extension/lib/sandbox.d.ts +1 -0
  159. package/dist/src/computer-use/extension/lib/sandbox.js +1 -0
  160. package/dist/src/computer-use/extension/lib/shell.d.ts +1 -0
  161. package/dist/src/computer-use/extension/lib/shell.js +1 -0
  162. package/dist/src/computer-use/tools.d.ts +1 -0
  163. package/dist/src/computer-use/tools.js +1 -0
  164. package/dist/src/context/build-base-tool-context.d.ts +2 -1
  165. package/dist/src/context/dynamic-tool-lifecycle.d.ts +1 -5
  166. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  167. package/dist/src/context/dynamic-tool-metadata.d.ts +0 -1
  168. package/dist/src/context/dynamic-tool-metadata.js +1 -1
  169. package/dist/src/context/hook-lifecycle.d.ts +4 -3
  170. package/dist/src/context/hook-lifecycle.js +1 -1
  171. package/dist/src/context/memory-lifecycle.d.ts +0 -8
  172. package/dist/src/context/memory-lifecycle.js +1 -1
  173. package/dist/src/discover/connections.d.ts +0 -15
  174. package/dist/src/discover/connections.js +1 -1
  175. package/dist/src/discover/diagnostics.d.ts +0 -8
  176. package/dist/src/discover/diagnostics.js +1 -1
  177. package/dist/src/discover/discover-agent.js +1 -1
  178. package/dist/src/discover/discover-subagent.d.ts +0 -1
  179. package/dist/src/discover/discover-subagent.js +1 -1
  180. package/dist/src/discover/extensions.d.ts +3 -10
  181. package/dist/src/discover/extensions.js +1 -1
  182. package/dist/src/discover/filesystem.d.ts +5 -9
  183. package/dist/src/discover/filesystem.js +1 -1
  184. package/dist/src/discover/grammar.d.ts +0 -46
  185. package/dist/src/discover/grammar.js +1 -1
  186. package/dist/src/discover/manifest.d.ts +5 -4
  187. package/dist/src/discover/memory.d.ts +0 -1
  188. package/dist/src/discover/memory.js +1 -1
  189. package/dist/src/discover/named-source-directory.js +1 -1
  190. package/dist/src/discover/project-source.d.ts +2 -1
  191. package/dist/src/discover/project.js +1 -1
  192. package/dist/src/discover/sandbox.js +1 -1
  193. package/dist/src/discover/skills.d.ts +0 -4
  194. package/dist/src/discover/skills.js +1 -1
  195. package/dist/src/evals/cli/eval-client.d.ts +2 -1
  196. package/dist/src/evals/judge.d.ts +2 -1
  197. package/dist/src/evals/runner/execute-task.d.ts +1 -1
  198. package/dist/src/evals/types.d.ts +1 -1
  199. package/dist/src/eve-channel/support.d.ts +1 -3
  200. package/dist/src/eve-channel/support.js +1 -1
  201. package/dist/src/execution/continuation-conflict-step.js +1 -1
  202. package/dist/src/execution/dynamic-workflow/schema.d.ts +2 -1
  203. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  204. package/dist/src/execution/effective-agent-config.d.ts +2 -1
  205. package/dist/src/execution/eve-workflow-attributes.d.ts +3 -5
  206. package/dist/src/execution/eve-workflow-attributes.js +1 -1
  207. package/dist/src/execution/history-view.d.ts +2 -1
  208. package/dist/src/execution/node-step.d.ts +3 -2
  209. package/dist/src/execution/proxied-deliver-step.js +1 -1
  210. package/dist/src/execution/publish-channel-event.js +1 -1
  211. package/dist/src/execution/sandbox/active-handles.d.ts +2 -4
  212. package/dist/src/execution/sandbox/active-handles.js +1 -1
  213. package/dist/src/execution/sandbox/bash.d.ts +2 -1
  214. package/dist/src/execution/sandbox/bindings/docker.js +1 -1
  215. package/dist/src/execution/sandbox/bindings/immutable-resources.d.ts +0 -6
  216. package/dist/src/execution/sandbox/bindings/immutable-resources.js +1 -1
  217. package/dist/src/execution/sandbox/bindings/local-provider-utils.d.ts +3 -2
  218. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.d.ts +0 -1
  219. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -1
  220. package/dist/src/execution/sandbox/bindings/microsandbox-network.d.ts +1 -1
  221. package/dist/src/execution/sandbox/bindings/microsandbox-options.d.ts +0 -3
  222. package/dist/src/execution/sandbox/bindings/microsandbox-options.js +1 -1
  223. package/dist/src/execution/sandbox/bindings/microsandbox-templates.d.ts +0 -1
  224. package/dist/src/execution/sandbox/bindings/microsandbox-templates.js +1 -1
  225. package/dist/src/execution/sandbox/bindings/vercel.d.ts +1 -1
  226. package/dist/src/execution/sandbox/dockerfile.d.ts +0 -1
  227. package/dist/src/execution/sandbox/dockerfile.js +1 -1
  228. package/dist/src/execution/sandbox/ensure.d.ts +2 -1
  229. package/dist/src/execution/sandbox/ensure.js +1 -1
  230. package/dist/src/execution/sandbox/prewarm.d.ts +1 -18
  231. package/dist/src/execution/sandbox/prewarm.js +1 -1
  232. package/dist/src/execution/sandbox/require-sandbox.d.ts +0 -11
  233. package/dist/src/execution/sandbox/require-sandbox.js +1 -1
  234. package/dist/src/execution/sandbox/truncate-output.d.ts +2 -5
  235. package/dist/src/execution/sandbox/truncate-output.js +2 -2
  236. package/dist/src/execution/session/admission.d.ts +3 -2
  237. package/dist/src/execution/session/event-sink.d.ts +2 -1
  238. package/dist/src/execution/session/finalization.d.ts +2 -1
  239. package/dist/src/execution/session/handoff.d.ts +3 -2
  240. package/dist/src/execution/session/route-selected-delivery.d.ts +2 -1
  241. package/dist/src/execution/session/timeout-control.d.ts +2 -1
  242. package/dist/src/execution/session/timeout-steps.js +1 -1
  243. package/dist/src/execution/session/turn-event-handler.d.ts +27 -0
  244. package/dist/src/execution/session/turn-event-handler.js +1 -0
  245. package/dist/src/execution/session/turn-step.js +1 -1
  246. package/dist/src/execution/session-activity.d.ts +0 -3
  247. package/dist/src/execution/session-activity.js +1 -1
  248. package/dist/src/execution/session-inbox/protocol.d.ts +2 -1
  249. package/dist/src/execution/session.d.ts +3 -2
  250. package/dist/src/execution/stable-workflow-names.d.ts +0 -6
  251. package/dist/src/execution/stable-workflow-names.js +1 -1
  252. package/dist/src/execution/task-input-response-route.js +1 -1
  253. package/dist/src/execution/tasks/child/notify.js +1 -1
  254. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  255. package/dist/src/execution/tools/ask-question-workflow.js +1 -1
  256. package/dist/src/execution/tools/connection-search.js +2 -2
  257. package/dist/src/execution/tools/sleep-workflow.js +1 -1
  258. package/dist/src/execution/tools/subagent/emit-event-step.js +1 -1
  259. package/dist/src/execution/tools/subagent/invoke-preparation.d.ts +2 -1
  260. package/dist/src/execution/tools/subagent/task-agent-requests.d.ts +4 -3
  261. package/dist/src/execution/tools/workflow/answer.d.ts +4 -1
  262. package/dist/src/execution/tools/workflow/answer.js +1 -1
  263. package/dist/src/execution/tools/workflow/background.d.ts +2 -6
  264. package/dist/src/execution/tools/workflow/background.js +1 -1
  265. package/dist/src/execution/tools/workflow/owner-channels.d.ts +1 -1
  266. package/dist/src/execution/tools/workflow/workflow-owner-background.d.ts +2 -1
  267. package/dist/src/execution/web-fetch/execute.d.ts +2 -2
  268. package/dist/src/execution/web-fetch/request.d.ts +2 -1
  269. package/dist/src/execution/workflow-runtime.js +1 -1
  270. package/dist/src/extensions/code/extension/lib/generated-paths.d.ts +2 -1
  271. package/dist/src/extensions/code/extension/lib/grep-search.d.ts +5 -5
  272. package/dist/src/extensions/code/extension/lib/grep-search.js +2 -2
  273. package/dist/src/extensions/code/extension/lib/guidelines.d.ts +2 -1
  274. package/dist/src/extensions/code/extension/lib/patch.d.ts +3 -2
  275. package/dist/src/extensions/code/extension/lib/prwatch-github.d.ts +1 -2
  276. package/dist/src/extensions/code/extension/lib/prwatch-github.js +1 -1
  277. package/dist/src/extensions/code/extension/lib/prwatch-registry.d.ts +2 -1
  278. package/dist/src/extensions/code/extension/lib/sandbox.d.ts +3 -2
  279. package/dist/src/extensions/code/extension/lib/sandbox.js +1 -1
  280. package/dist/src/extensions/code/extension/lib/signed-commit.d.ts +1 -1
  281. package/dist/src/extensions/code/extension/lib/signed-commit.js +2 -2
  282. package/dist/src/extensions/code/tools.d.ts +2 -1
  283. package/dist/src/extensions/code/tools.js +1 -1
  284. package/dist/src/framework/host-inventory.d.ts +3 -2
  285. package/dist/src/harness/approval-candidates.d.ts +4 -3
  286. package/dist/src/harness/approval-delivery-coordinator.d.ts +2 -1
  287. package/dist/src/harness/compaction-prompt.d.ts +2 -1
  288. package/dist/src/harness/coordination.d.ts +0 -4
  289. package/dist/src/harness/coordination.js +1 -1
  290. package/dist/src/harness/input-requests.d.ts +1 -10
  291. package/dist/src/harness/input-requests.js +1 -1
  292. package/dist/src/harness/pending-input-batches.d.ts +0 -5
  293. package/dist/src/harness/pending-input-batches.js +1 -1
  294. package/dist/src/harness/provider-tools.d.ts +2 -1
  295. package/dist/src/harness/session-limit-continuation.d.ts +0 -4
  296. package/dist/src/harness/session-limit-continuation.js +1 -1
  297. package/dist/src/harness/session-usage-limits.d.ts +2 -1
  298. package/dist/src/harness/tool-loop.js +2 -2
  299. package/dist/src/harness/tool-model-output.d.ts +2 -1
  300. package/dist/src/harness/turn-client-context.d.ts +2 -1
  301. package/dist/src/instrumentation/ai-sdk-hook-bridge.js +1 -1
  302. package/dist/src/instrumentation/lifecycle.d.ts +2 -2
  303. package/dist/src/instrumentation/lifecycle.js +1 -1
  304. package/dist/src/instrumentation/state.d.ts +2 -2
  305. package/dist/src/internal/agent-name.d.ts +0 -2
  306. package/dist/src/internal/agent-name.js +1 -1
  307. package/dist/src/internal/application/build-profile.d.ts +2 -2
  308. package/dist/src/internal/application/dev-environment.d.ts +2 -8
  309. package/dist/src/internal/application/dev-environment.js +1 -1
  310. package/dist/src/internal/application/output-publication.d.ts +1 -1
  311. package/dist/src/internal/application/package.js +1 -1
  312. package/dist/src/internal/application/paths.d.ts +0 -5
  313. package/dist/src/internal/application/paths.js +1 -1
  314. package/dist/src/internal/application/tsconfig-dependencies.d.ts +0 -16
  315. package/dist/src/internal/application/tsconfig-dependencies.js +1 -1
  316. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  317. package/dist/src/internal/authored-definition/source-identity.d.ts +1 -1
  318. package/dist/src/internal/authored-module-map-loader.js +1 -1
  319. package/dist/src/internal/bundler/extension-scope-plugin.d.ts +2 -1
  320. package/dist/src/internal/bundler/nitro-rolldown.d.ts +0 -11
  321. package/dist/src/internal/bundler/nitro-rolldown.js +1 -1
  322. package/dist/src/internal/eve-project-root.d.ts +0 -3
  323. package/dist/src/internal/eve-project-root.js +1 -1
  324. package/dist/src/internal/external-resources-snapshot.d.ts +1 -1
  325. package/dist/src/internal/external-resources.d.ts +0 -1
  326. package/dist/src/internal/external-resources.js +1 -1
  327. package/dist/src/internal/helpers/markdown.js +1 -1
  328. package/dist/src/internal/invocation/metadata.d.ts +1 -1
  329. package/dist/src/internal/materialized-authored-modules.d.ts +2 -1
  330. package/dist/src/internal/mcp/protected-resource.d.ts +2 -1
  331. package/dist/src/internal/mcp/streamable-http-server.d.ts +4 -5
  332. package/dist/src/internal/mcp/streamable-http-server.js +1 -1
  333. package/dist/src/internal/model-catalog.d.ts +2 -1
  334. package/dist/src/internal/nitro/dev-runtime-artifacts-retention.d.ts +2 -2
  335. package/dist/src/internal/nitro/dev-runtime-artifacts-retention.js +1 -1
  336. package/dist/src/internal/nitro/dev-runtime-artifacts.d.ts +2 -8
  337. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  338. package/dist/src/internal/nitro/dev-runtime-generation-metadata.d.ts +13 -0
  339. package/dist/src/internal/nitro/dev-runtime-generation-metadata.js +1 -0
  340. package/dist/src/internal/nitro/dev-runtime-source-snapshot.d.ts +0 -1
  341. package/dist/src/internal/nitro/dev-runtime-source-snapshot.js +1 -1
  342. package/dist/src/internal/nitro/development-generation.d.ts +2 -1
  343. package/dist/src/internal/nitro/development-generation.js +1 -1
  344. package/dist/src/internal/nitro/host/channel-routes.d.ts +1 -1
  345. package/dist/src/internal/nitro/host/dev-authored-rebuild-coordinator.d.ts +3 -1
  346. package/dist/src/internal/nitro/host/dev-authored-rebuild-coordinator.js +1 -1
  347. package/dist/src/internal/nitro/host/dev-host-candidate.d.ts +2 -1
  348. package/dist/src/internal/nitro/host/dev-workflow-world-setup.d.ts +1 -0
  349. package/dist/src/internal/nitro/host/dev-workflow-world-setup.js +1 -1
  350. package/dist/src/internal/nitro/host/drained-nitro-dev-server.d.ts +1 -1
  351. package/dist/src/internal/nitro/host/extension-capability-requirements.js +1 -1
  352. package/dist/src/internal/nitro/host/schedule-task-routes.d.ts +1 -1
  353. package/dist/src/internal/nitro/host/start-development-server.js +1 -1
  354. package/dist/src/internal/nitro/host/types.d.ts +2 -0
  355. package/dist/src/internal/nitro/host/workspace-extensions.js +1 -1
  356. package/dist/src/internal/nitro/routes/channel-request-instrumentation.d.ts +2 -1
  357. package/dist/src/internal/nitro/routes/channel-route-context.d.ts +1 -1
  358. package/dist/src/internal/nitro/routes/runtime-stack.d.ts +2 -1
  359. package/dist/src/internal/resolve-model-endpoint-status.d.ts +2 -1
  360. package/dist/src/internal/vercel/assemble-eve-services.d.ts +3 -2
  361. package/dist/src/internal/vercel/eve-service-contribution.d.ts +2 -3
  362. package/dist/src/internal/vercel/eve-service-contribution.js +1 -1
  363. package/dist/src/internal/vercel/project-link.d.ts +2 -1
  364. package/dist/src/internal/vercel/project-link.js +1 -1
  365. package/dist/src/internal/workflow/cancel-expired-development-run.d.ts +2 -0
  366. package/dist/src/internal/workflow/cancel-expired-development-run.js +1 -0
  367. package/dist/src/internal/workflow/development-runtime-compatibility.d.ts +12 -0
  368. package/dist/src/internal/workflow/development-runtime-compatibility.js +1 -0
  369. package/dist/src/internal/workflow/development-world-client.js +1 -1
  370. package/dist/src/internal/workflow/development-world-codec.d.ts +2 -1
  371. package/dist/src/internal/workflow/development-world-protocol.d.ts +9 -0
  372. package/dist/src/internal/workflow/development-world-server.d.ts +2 -0
  373. package/dist/src/internal/workflow/development-world-server.js +1 -1
  374. package/dist/src/internal/workflow/is-inactive-workflow-run-error.d.ts +2 -0
  375. package/dist/src/internal/workflow/is-inactive-workflow-run-error.js +1 -0
  376. package/dist/src/internal/workflow/world-compatibility.d.ts +2 -1
  377. package/dist/src/internal/workflow-bundle/builder-support.d.ts +0 -9
  378. package/dist/src/internal/workflow-bundle/builder-support.js +2 -3
  379. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.d.ts +0 -1
  380. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
  381. package/dist/src/protocol/activity.d.ts +3 -3
  382. package/dist/src/protocol/activity.js +1 -1
  383. package/dist/src/protocol/baggage.d.ts +2 -2
  384. package/dist/src/protocol/cancel-turn.d.ts +0 -2
  385. package/dist/src/protocol/event-dedupe.d.ts +2 -1
  386. package/dist/src/protocol/event-id.d.ts +0 -6
  387. package/dist/src/protocol/event-id.js +1 -1
  388. package/dist/src/protocol/traceparent.d.ts +2 -1
  389. package/dist/src/public/channels/chat-sdk/audience.d.ts +2 -4
  390. package/dist/src/public/channels/chat-sdk/audience.js +1 -1
  391. package/dist/src/public/channels/discord/discordChannel.d.ts +1 -1
  392. package/dist/src/public/channels/github/api.d.ts +2 -12
  393. package/dist/src/public/channels/github/api.js +1 -1
  394. package/dist/src/public/channels/github/auth.d.ts +0 -9
  395. package/dist/src/public/channels/github/auth.js +1 -1
  396. package/dist/src/public/channels/github/binding.d.ts +3 -2
  397. package/dist/src/public/channels/github/checkout.d.ts +3 -3
  398. package/dist/src/public/channels/github/defaults.d.ts +3 -2
  399. package/dist/src/public/channels/github/githubChannel.d.ts +1 -1
  400. package/dist/src/public/channels/github/limits.d.ts +0 -2
  401. package/dist/src/public/channels/github/limits.js +2 -2
  402. package/dist/src/public/channels/github/pr-context.d.ts +2 -3
  403. package/dist/src/public/channels/github/pr-context.js +1 -1
  404. package/dist/src/public/channels/github/state.d.ts +2 -1
  405. package/dist/src/public/channels/github/verify.d.ts +2 -1
  406. package/dist/src/public/channels/linear/defaults.d.ts +2 -1
  407. package/dist/src/public/channels/linear/inbound-images.d.ts +2 -1
  408. package/dist/src/public/channels/slack/app-manifest.d.ts +3 -4
  409. package/dist/src/public/channels/slack/app-manifest.js +1 -1
  410. package/dist/src/public/channels/slack/inbound.d.ts +2 -1
  411. package/dist/src/public/channels/slack/model-context.d.ts +0 -18
  412. package/dist/src/public/channels/slack/model-context.js +1 -1
  413. package/dist/src/public/channels/slack/privacy.d.ts +2 -1
  414. package/dist/src/public/channels/slack/verify.d.ts +1 -1
  415. package/dist/src/public/channels/teams/teamsChannel.d.ts +1 -1
  416. package/dist/src/public/channels/telegram/audience.d.ts +2 -3
  417. package/dist/src/public/channels/telegram/audience.js +1 -1
  418. package/dist/src/public/channels/telegram/telegramChannel.d.ts +1 -1
  419. package/dist/src/public/channels/twilio/defaults.d.ts +0 -7
  420. package/dist/src/public/channels/twilio/defaults.js +1 -1
  421. package/dist/src/public/channels/twilio/routing.d.ts +2 -1
  422. package/dist/src/public/channels/twilio/twilioChannel.d.ts +1 -1
  423. package/dist/src/public/definitions/channel.d.ts +1 -1
  424. package/dist/src/public/definitions/hook.d.ts +12 -0
  425. package/dist/src/public/index.js +1 -1
  426. package/dist/src/public/memory/file/provider.js +1 -1
  427. package/dist/src/public/models/openai/chatgpt/model.d.ts +2 -1
  428. package/dist/src/public/models/openai/chatgpt/token-broker.d.ts +1 -1
  429. package/dist/src/public/nuxt/dev-server.d.ts +3 -2
  430. package/dist/src/public/skills/index.js +1 -1
  431. package/dist/src/public/sveltekit/dev-server.d.ts +3 -2
  432. package/dist/src/public/tools/index.js +1 -1
  433. package/dist/src/runtime/compiled-artifacts-source.d.ts +0 -4
  434. package/dist/src/runtime/compiled-artifacts-source.js +1 -1
  435. package/dist/src/runtime/connections/instance-identity.d.ts +0 -3
  436. package/dist/src/runtime/connections/instance-identity.js +1 -1
  437. package/dist/src/runtime/connections/mcp-client.d.ts +7 -0
  438. package/dist/src/runtime/connections/mcp-client.js +1 -1
  439. package/dist/src/runtime/connections/mcp-tracing.d.ts +1 -6
  440. package/dist/src/runtime/connections/mcp-tracing.js +1 -1
  441. package/dist/src/runtime/connections/openapi-client.d.ts +1 -1
  442. package/dist/src/runtime/connections/scoped-authorization.d.ts +0 -9
  443. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  444. package/dist/src/runtime/hooks/registry.d.ts +0 -7
  445. package/dist/src/runtime/hooks/registry.js +1 -1
  446. package/dist/src/runtime/loaders/artifact-paths.d.ts +2 -1
  447. package/dist/src/runtime/loaders/bundled-artifacts.d.ts +0 -1
  448. package/dist/src/runtime/loaders/bundled-artifacts.js +1 -1
  449. package/dist/src/runtime/resolve-agent.d.ts +2 -2
  450. package/dist/src/runtime/resolve-agent.js +1 -1
  451. package/dist/src/runtime/resolve-dynamic-tool.d.ts +0 -16
  452. package/dist/src/runtime/resolve-dynamic-tool.js +1 -1
  453. package/dist/src/runtime/sandbox/prepared-artifacts.d.ts +1 -2
  454. package/dist/src/runtime/sandbox/prepared-artifacts.js +1 -1
  455. package/dist/src/runtime/schedules/register.d.ts +0 -4
  456. package/dist/src/runtime/schedules/register.js +1 -1
  457. package/dist/src/self-modification/credentials.d.ts +1 -4
  458. package/dist/src/self-modification/credentials.js +1 -1
  459. package/dist/src/self-modification/extension/subagents/agent/tools/search_traces.js +1 -1
  460. package/dist/src/self-modification/filesystem.d.ts +0 -1
  461. package/dist/src/self-modification/filesystem.js +1 -1
  462. package/dist/src/self-modification/git-workspace.d.ts +0 -3
  463. package/dist/src/self-modification/git-workspace.js +1 -1
  464. package/dist/src/self-modification/github-publisher.d.ts +2 -1
  465. package/dist/src/self-modification/migration.d.ts +0 -1
  466. package/dist/src/self-modification/migration.js +1 -1
  467. package/dist/src/self-modification/mode.d.ts +2 -1
  468. package/dist/src/self-modification/proposal.d.ts +0 -2
  469. package/dist/src/self-modification/proposal.js +2 -2
  470. package/dist/src/self-modification/setup.js +1 -1
  471. package/dist/src/services/dev-client/agent-info-probe.d.ts +2 -1
  472. package/dist/src/services/dev-client/request-headers.d.ts +1 -1
  473. package/dist/src/setup/ai-gateway-api-key.d.ts +2 -1
  474. package/dist/src/setup/append-env.d.ts +3 -2
  475. package/dist/src/setup/ask.d.ts +3 -3
  476. package/dist/src/setup/boxes/apply-ai-gateway-credential.d.ts +2 -1
  477. package/dist/src/setup/boxes/deploy-project.d.ts +4 -3
  478. package/dist/src/setup/boxes/link-project.d.ts +2 -1
  479. package/dist/src/setup/boxes/model-capabilities.d.ts +2 -2
  480. package/dist/src/setup/boxes/model-capabilities.js +1 -1
  481. package/dist/src/setup/boxes/resolve-provisioning.d.ts +2 -1
  482. package/dist/src/setup/boxes/select-model.d.ts +0 -1
  483. package/dist/src/setup/boxes/select-model.js +1 -1
  484. package/dist/src/setup/cli/option-row.d.ts +1 -1
  485. package/dist/src/setup/cli/prompt-ui.d.ts +0 -10
  486. package/dist/src/setup/cli/prompt-ui.js +1 -1
  487. package/dist/src/setup/cli/rail-log.d.ts +0 -2
  488. package/dist/src/setup/cli/rail-log.js +2 -2
  489. package/dist/src/setup/connect-provisioning.d.ts +2 -1
  490. package/dist/src/setup/connection-connector.d.ts +2 -1
  491. package/dist/src/setup/flows/link.d.ts +2 -1
  492. package/dist/src/setup/flows/model-login.d.ts +1 -1
  493. package/dist/src/setup/flows/model-source-change.js +1 -1
  494. package/dist/src/setup/flows/registry-session.d.ts +3 -2
  495. package/dist/src/setup/integrations/discord/api.d.ts +2 -1
  496. package/dist/src/setup/integrations/discord/connect.d.ts +3 -3
  497. package/dist/src/setup/integrations/discord/connect.js +1 -1
  498. package/dist/src/setup/integrations/discord/setup.d.ts +2 -1
  499. package/dist/src/setup/integrations/file-memory/vercel.d.ts +1 -1
  500. package/dist/src/setup/integrations/github/connect.d.ts +3 -3
  501. package/dist/src/setup/integrations/github/connect.js +1 -1
  502. package/dist/src/setup/integrations/github/setup.d.ts +1 -1
  503. package/dist/src/setup/integrations/linear/connect.d.ts +2 -2
  504. package/dist/src/setup/integrations/linear/connect.js +1 -1
  505. package/dist/src/setup/integrations/linear/setup.d.ts +1 -1
  506. package/dist/src/setup/integrations/linq/connect.d.ts +3 -4
  507. package/dist/src/setup/integrations/linq/connect.js +1 -1
  508. package/dist/src/setup/integrations/linq/management.d.ts +2 -1
  509. package/dist/src/setup/integrations/linq/setup.d.ts +1 -9
  510. package/dist/src/setup/integrations/linq/setup.js +1 -1
  511. package/dist/src/setup/integrations/photon/connect.d.ts +5 -7
  512. package/dist/src/setup/integrations/photon/connect.js +1 -1
  513. package/dist/src/setup/integrations/photon/management.d.ts +5 -4
  514. package/dist/src/setup/integrations/photon/setup-flow.d.ts +2 -1
  515. package/dist/src/setup/integrations/registry.d.ts +0 -2
  516. package/dist/src/setup/integrations/registry.js +1 -1
  517. package/dist/src/setup/integrations/runner.d.ts +3 -2
  518. package/dist/src/setup/integrations/shared/scaffold.d.ts +2 -1
  519. package/dist/src/setup/integrations/shared/vercel-project.d.ts +2 -1
  520. package/dist/src/setup/integrations/shopify/setup.d.ts +2 -1
  521. package/dist/src/setup/integrations/teams/connect.d.ts +3 -3
  522. package/dist/src/setup/integrations/teams/connect.js +1 -1
  523. package/dist/src/setup/integrations/teams/setup.d.ts +2 -1
  524. package/dist/src/setup/integrations/web/setup.d.ts +2 -3
  525. package/dist/src/setup/integrations/web/setup.js +3 -3
  526. package/dist/src/setup/primitives/pm/process-result.d.ts +2 -1
  527. package/dist/src/setup/primitives/pm/shared.d.ts +2 -1
  528. package/dist/src/setup/primitives/process-output.d.ts +2 -1
  529. package/dist/src/setup/quit-guard.d.ts +3 -2
  530. package/dist/src/setup/scaffold/create/add-to-project.d.ts +2 -1
  531. package/dist/src/setup/scaffold/create/project.js +1 -1
  532. package/dist/src/setup/scaffold/create/web-template.d.ts +1 -1
  533. package/dist/src/setup/scaffold/create/web-template.js +1 -1
  534. package/dist/src/setup/scaffold/files.d.ts +2 -1
  535. package/dist/src/setup/scaffold/update/channels.d.ts +0 -1
  536. package/dist/src/setup/scaffold/workspace-glob.d.ts +0 -1
  537. package/dist/src/setup/scaffold/workspace-glob.js +1 -1
  538. package/dist/src/setup/scaffold/workspace-root.d.ts +2 -1
  539. package/dist/src/setup/slack-connect-create.d.ts +1 -1
  540. package/dist/src/setup/slack-connect-lifecycle.d.ts +5 -5
  541. package/dist/src/setup/slack-connect.d.ts +0 -4
  542. package/dist/src/setup/slack-connect.js +1 -1
  543. package/dist/src/setup/slackbot.d.ts +3 -3
  544. package/dist/src/setup/slackbot.js +1 -1
  545. package/dist/src/setup/vercel-project-api.d.ts +1 -1
  546. package/dist/src/setup/vercel-project.d.ts +3 -18
  547. package/dist/src/setup/vercel-project.js +0 -0
  548. package/dist/src/shared/action-types.d.ts +1 -58
  549. package/dist/src/shared/action-types.js +1 -1
  550. package/dist/src/shared/agent-definition.d.ts +0 -3
  551. package/dist/src/shared/agent-turn-outcome.d.ts +1 -3
  552. package/dist/src/shared/agent-turn-outcome.js +1 -1
  553. package/dist/src/shared/chatgpt-model.d.ts +0 -1
  554. package/dist/src/shared/chatgpt-model.js +1 -1
  555. package/dist/src/shared/connection-types.d.ts +5 -0
  556. package/dist/src/shared/conversation-context.d.ts +2 -1
  557. package/dist/src/shared/extension-package-contract.d.ts +2 -1
  558. package/dist/src/shared/forwarded-trace-policy.d.ts +3 -2
  559. package/dist/src/shared/gateway-model-catalog.d.ts +25 -2
  560. package/dist/src/shared/gateway-model-catalog.js +1 -1
  561. package/dist/src/shared/gateway-service-tier.d.ts +2 -1
  562. package/dist/src/shared/memory-state.d.ts +0 -8
  563. package/dist/src/shared/memory-state.js +1 -1
  564. package/dist/src/shared/sandbox-environment.d.ts +0 -1
  565. package/dist/src/shared/sandbox-environment.js +1 -1
  566. package/dist/src/shared/skill-package.d.ts +0 -5
  567. package/dist/src/shared/skill-package.js +1 -1
  568. package/dist/src/shared/token-usage.d.ts +0 -7
  569. package/dist/src/shared/token-usage.js +1 -1
  570. package/dist/src/shared/ulid.d.ts +2 -8
  571. package/dist/src/shared/ulid.js +1 -1
  572. package/dist/src/shared/vercel-project.d.ts +2 -1
  573. package/dist/src/shared/vercel-services.d.ts +2 -2
  574. package/dist/src/shared/workflow-sandbox.d.ts +0 -7
  575. package/dist/src/source-change/agent-config-ast.d.ts +2 -1
  576. package/dist/src/source-change/agent-config-string-path.d.ts +2 -2
  577. package/dist/src/source-change/apply-agent-model-settings.d.ts +2 -1
  578. package/dist/src/source-change/apply-model-selection.d.ts +2 -1
  579. package/dist/src/source-change/static-source-change.d.ts +4 -3
  580. package/dist/src/subagents/invocation.d.ts +1 -1
  581. package/dist/src/subagents/parent-notification.js +1 -1
  582. package/dist/src/subagents/tool.d.ts +2 -1
  583. package/dist/src/tasks/types.d.ts +2 -0
  584. package/dist/src/tools/definition.d.ts +8 -3
  585. package/dist/src/tools/durable-callbacks.d.ts +1 -2
  586. package/dist/src/tools/durable-callbacks.js +1 -1
  587. package/dist/src/tools/framework/agent.js +1 -1
  588. package/dist/src/tools/framework/task-cancel.d.ts +1 -1
  589. package/dist/src/tools/native-definition.d.ts +2 -1
  590. package/dist/src/tracing/agent-action-instrumentation.d.ts +2 -1
  591. package/dist/src/tracing/agent-memory-instrumentation.d.ts +2 -1
  592. package/dist/src/tracing/agent-otel-provider.d.ts +2 -1
  593. package/dist/src/tracing/agent-span-id-generator.d.ts +0 -1
  594. package/dist/src/tracing/agent-span-id-generator.js +1 -1
  595. package/dist/src/tracing/agent-tool-instrumentation.d.ts +2 -1
  596. package/dist/src/tracing/agent-tool-span-context.d.ts +3 -2
  597. package/dist/src/tracing/agent-trace-state.d.ts +0 -24
  598. package/dist/src/tracing/agent-trace-state.js +1 -1
  599. package/dist/src/tracing/batch-span-processor.d.ts +2 -1
  600. package/dist/src/tracing/local-trace-analysis.d.ts +4 -3
  601. package/dist/src/tracing/local-trace-discovery-index.d.ts +0 -2
  602. package/dist/src/tracing/local-trace-discovery-index.js +1 -1
  603. package/dist/src/tracing/local-trace-query.d.ts +2 -1
  604. package/dist/src/tracing/local-trace-retention.d.ts +4 -4
  605. package/dist/src/tracing/telemetry-budget.d.ts +0 -1
  606. package/dist/src/tracing/telemetry-budget.js +1 -1
  607. package/docs/concepts/project-structure.mdx +1 -1
  608. package/docs/guides/auth-and-route-protection.md +1 -1
  609. package/docs/guides/deployment/vercel.mdx +1 -1
  610. package/docs/guides/dynamic-capabilities.md +10 -7
  611. package/docs/guides/hooks.md +34 -2
  612. package/docs/install-integrations.mdx +1 -1
  613. package/docs/reference/cli.md +36 -15
  614. package/docs/tools/human-in-the-loop.md +2 -0
  615. package/package.json +31 -10
  616. package/dist/src/cli/commands/channel-add-conflicts.d.ts +0 -21
  617. package/dist/src/cli/commands/channel-add-conflicts.js +0 -1
  618. package/dist/src/cli/commands/registry-search-presentation.d.ts +0 -16
  619. package/dist/src/cli/commands/registry-search-presentation.js +0 -6
  620. package/dist/src/compiled/_chunks/workflow/dist-BfMqXLK3.js +0 -3
  621. package/dist/src/compiled/_chunks/workflow/helpers-CNMO7zB1.js +0 -1
  622. package/dist/src/compiled/_chunks/workflow/logger-BCEj9caG.js +0 -14
  623. package/dist/src/compiled/_chunks/workflow/resume-hook-QS_cMwHn.js +0 -1
  624. package/dist/src/compiled/_chunks/workflow/run-CA5wWV2S.js +0 -1
  625. package/dist/src/compiled/_chunks/workflow/serialization-CJ265vSe.js +0 -3
  626. package/dist/src/compiled/_chunks/workflow/sleep-CBn94Ayv.js +0 -1
  627. package/dist/src/compiled/_chunks/workflow/wait-until-Bo2U6ON9.js +0 -1
  628. package/dist/src/compiler/compile-from-memory.d.ts +0 -44
  629. package/dist/src/compiler/compile-from-memory.js +0 -1
  630. package/dist/src/execution/connection-auth-tool-result.d.ts +0 -2
  631. package/dist/src/execution/connection-auth-tool-result.js +0 -1
  632. package/dist/src/internal/process/pnpm.d.ts +0 -28
  633. package/dist/src/internal/process/pnpm.js +0 -1
  634. package/dist/src/public/channels/slack/api-encoding.d.ts +0 -5
  635. package/dist/src/public/channels/slack/api-encoding.js +0 -1
  636. package/dist/src/public/definitions/instrumentation.d.ts +0 -1
  637. package/dist/src/public/definitions/instrumentation.js +0 -1
  638. package/dist/src/public/models/openai/chatgpt/unsigned-jwt.d.ts +0 -5
  639. package/dist/src/public/models/openai/chatgpt/unsigned-jwt.js +0 -1
  640. package/dist/src/sandbox/backends/probes.d.ts +0 -7
  641. package/dist/src/sandbox/backends/probes.js +0 -1
  642. package/dist/src/setup/channel-add-conflicts.d.ts +0 -28
  643. package/dist/src/setup/channel-add-conflicts.js +0 -1
  644. package/dist/src/setup/primitives/run-pnpm.d.ts +0 -1
  645. package/dist/src/setup/primitives/run-pnpm.js +0 -1
  646. package/dist/src/shared/boundary-hook-error.d.ts +0 -4
  647. package/dist/src/shared/boundary-hook-error.js +0 -1
  648. package/dist/src/shared/dispatch-action.d.ts +0 -30
  649. package/dist/src/shared/dispatch-action.js +0 -1
  650. /package/dist/src/{extensions/code → computer-use}/extension/lib/computer-use-sandbox.d.ts +0 -0
  651. /package/dist/src/{extensions/code → computer-use}/extension/lib/computer-use.js +0 -0
  652. /package/dist/src/{extensions/code → computer-use}/extension/tools/computer_use.d.ts +0 -0
  653. /package/dist/src/{extensions/code → computer-use}/extension/tools/computer_use.js +0 -0
@@ -1,9 +1,7 @@
1
1
  export declare const SERVER_MJS_SOURCE = "import { setTimeout as delay } from \"node:timers/promises\";\nimport { execFile, execFileSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { chmod, rename, rm } from \"node:fs/promises\";\nimport { promisify } from \"node:util\";\nimport http from \"node:http\";\nimport { env } from \"node:process\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { CuaDriver } from \"@trycua/cua-driver\";\n\nimport { pointerMotionPlan } from \"./pointer-motion.mjs\";\nimport { selectGroundingElements } from \"./state.mjs\";\nimport { naturalTypingPlan } from \"./typing.mjs\";\n\nconst socketPath = env.COMPUTER_USE_SOCKET_PATH;\nconst workspaceRoot = env.COMPUTER_USE_ROOT;\nconst maxRequestBytes = 32 * 1024;\nconst maxRequestMs = 120_000;\nconst maxRecordingMs = 300_000;\nconst nativeCallTimeoutMs = 10_000;\n// Only the queue owner sets this signal; recording finalization deliberately bypasses it.\nlet requestSignal;\nconst desktopMargin = 24;\nconst minimumWindow = { height: 240, width: 480 };\nconst layoutTolerance = { height: 8, width: 8, x: 4, y: 4 };\nconst maxClipboardBytes = 10_000;\nconst driver = await CuaDriver.create({ claudeCodeCompatibility: false });\nconst execFilePromise = promisify(execFile);\nfunction execFileAsync(file, args, options) {\n return execFilePromise(file, args, {\n timeout: nativeCallTimeoutMs,\n ...options,\n signal: requestSignal,\n });\n}\n\nlet activeRecording = null;\nlet queue = Promise.resolve();\nlet shuttingDown = false;\n\nawait rm(socketPath, { force: true });\n\nconst server = http.createServer((request, response) => {\n if (shuttingDown) return response.destroy();\n if (request.method !== \"POST\" || request.url !== \"/call\") {\n sendJson(response, 404, { error: \"not found\" });\n return;\n }\n const controller = new AbortController();\n const deadline = Number(request.headers[\"x-computer-use-deadline\"]);\n const timeoutMs = Number.isFinite(deadline)\n ? Math.max(0, Math.min(maxRequestMs, deadline - Date.now()))\n : maxRequestMs;\n const cancel = () =>\n controller.abort(new Error(\"computer-use request cancelled or deadline exceeded\"));\n const timer = setTimeout(cancel, timeoutMs);\n response.once(\"close\", cancel);\n controller.signal.addEventListener(\"abort\", () => response.destroy(), { once: true });\n if (timeoutMs === 0) cancel();\n // Read immediately: a body may finish or disconnect while another call owns the queue.\n const body = readBody(request);\n void body.catch(() => undefined);\n const task = queue.then(async () => {\n controller.signal.throwIfAborted();\n if (shuttingDown) return;\n requestSignal = controller.signal;\n try {\n await handleRequest(await body, response);\n } finally {\n requestSignal = undefined;\n }\n });\n queue = task\n .catch(() => response.destroy())\n .finally(() => {\n clearTimeout(timer);\n response.removeListener(\"close\", cancel);\n });\n});\n\nserver.listen(socketPath, () => {\n void chmod(socketPath, 0o600);\n});\n\nfor (const signal of [\"SIGINT\", \"SIGTERM\"]) {\n process.once(signal, () => {\n void shutdown();\n });\n}\n\nasync function shutdown() {\n if (shuttingDown) return;\n shuttingDown = true;\n server.close();\n server.closeAllConnections();\n const timer = setTimeout(() => process.exit(1), nativeCallTimeoutMs * 2);\n let exitCode = 0;\n try {\n await queue;\n if (activeRecording !== null) await stopRecording();\n } catch {\n exitCode = 1;\n } finally {\n try {\n await driver.shutdown();\n } catch {\n exitCode = 1;\n } finally {\n clearTimeout(timer);\n process.exit(exitCode);\n }\n }\n}\n\nasync function handleRequest(body, response) {\n try {\n const input = JSON.parse(body);\n if (input.action === \"health\") {\n sendJson(response, 200, { backend: \"cua-driver\", version: \"0.12.5\" });\n return;\n }\n\n validateRequest(input);\n const actionResult = await performAction(input.action);\n const state = await captureState(input.screenshotPath);\n sendJson(response, 200, {\n action: actionResult,\n backend: \"cua-driver\",\n screenshot: input.screenshotPath,\n state,\n version: \"0.12.5\",\n });\n } catch (error) {\n if (requestSignal?.aborted && activeRecording !== null) {\n await stopRecording().catch(() => undefined);\n }\n sendJson(response, 500, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\nasync function performAction(action) {\n requestSignal?.throwIfAborted();\n validateActionCoordinates(action);\n if (action.action === \"sequence\") {\n const results = [];\n try {\n for (const nested of action.actions) {\n const startedAt = performance.now();\n const result = await performAction(nested);\n results.push({\n action: nested.action,\n durationMs: Math.round(performance.now() - startedAt),\n result,\n });\n }\n return results;\n } catch (error) {\n // Never strand the durable driver in an active-recording state when a\n // rehearsed step fails. Preserve the original action error.\n if (activeRecording !== null) await stopRecording().catch(() => undefined);\n throw error;\n }\n }\n switch (action.action) {\n case \"screenshot\":\n return null;\n case \"click\":\n await moveCursor(action);\n return click(action, 1);\n case \"double_click\":\n await moveCursor(action);\n return click(action, 2);\n case \"triple_click\":\n await moveCursor(action);\n return click(action, 3);\n case \"drag\":\n return dragCursor(action);\n case \"keypress\":\n return action.keys.length === 1\n ? call(\"press_key\", {\n scope: \"desktop\",\n key: normalizeKey(action.keys[0]),\n })\n : call(\"hotkey\", {\n scope: \"desktop\",\n keys: action.keys.map(normalizeKey),\n });\n case \"move\":\n return moveCursor(action);\n case \"scroll\": {\n await call(\"move_cursor\", {\n scope: \"desktop\",\n x: action.x,\n y: action.y,\n });\n const results = [];\n if (action.scrollY !== 0) {\n results.push(await call(\"scroll\", scrollInput(action.scrollY, \"up\", \"down\")));\n }\n if (action.scrollX !== 0) {\n results.push(await call(\"scroll\", scrollInput(action.scrollX, \"left\", \"right\")));\n }\n return results;\n }\n case \"type\":\n return typeText(action);\n case \"clipboard_read\":\n return readClipboard(action.selection);\n case \"clipboard_write\":\n return writeClipboard(action.selection, action.text);\n case \"wait\":\n await sleep(action.durationMs ?? 2_000);\n return null;\n case \"arrange_windows\":\n return arrangeWindows(action);\n case \"record_start\":\n return startRecording(action.path);\n case \"record_stop\":\n return stopRecording();\n default:\n throw new Error(`unsupported computer-use action: ${String(action.action)}`);\n }\n}\n\nasync function captureState(screenshotPath) {\n await call(\"get_desktop_state\", { screenshot_out_file: screenshotPath });\n const pointer = structured(await call(\"get_cursor_position\", {}));\n const screen = x11ScreenSize();\n const windows = structured(await call(\"list_windows\", { on_screen_only: true })).windows;\n const contentWindows = Array.isArray(windows) ? windows.filter(isContentWindow) : [];\n const groundingWindow = contentWindows.toSorted((left, right) => right.z_index - left.z_index)[0];\n\n let elements = [];\n if (groundingWindow !== undefined) {\n const windowState = structured(\n await call(\"get_window_state\", {\n pid: groundingWindow.pid,\n window_id: groundingWindow.window_id,\n include_screenshot: false,\n max_depth: 20,\n max_elements: 250,\n }),\n );\n if (Array.isArray(windowState.elements)) {\n elements = selectGroundingElements(windowState.elements, {\n width: Number(screen.width) || 1920,\n height: Number(screen.height) || 1080,\n });\n }\n }\n\n return formatState(groundingWindow, pointer, elements);\n}\n\nasync function startRecording(path) {\n if (activeRecording !== null) {\n throw new Error(\"a recording is already active\");\n }\n\n const outputDirectory = `${workspaceRoot}/recording-${randomUUID()}`;\n const result = await call(\n \"start_recording\",\n {\n output_dir: outputDirectory,\n record_video: true,\n },\n false,\n );\n activeRecording = {\n outputDirectory,\n outputPath: path,\n stopping: null,\n timer: setTimeout(() => {\n void stopRecording().catch(() => {\n void shutdown();\n });\n }, maxRecordingMs),\n };\n return result;\n}\n\nasync function stopRecording() {\n if (activeRecording === null) {\n throw new Error(\"no recording is active\");\n }\n\n const recording = activeRecording;\n if (recording.stopping !== null) return recording.stopping;\n clearTimeout(recording.timer);\n recording.stopping = finalizeRecording(recording);\n return recording.stopping;\n}\n\nasync function finalizeRecording(recording) {\n try {\n const result = await call(\"stop_recording\", {}, false);\n const output = structured(result);\n const videoPath =\n typeof output.last_video_path === \"string\"\n ? output.last_video_path\n : recording.outputDirectory + \"/recording.mp4\";\n await rename(videoPath, recording.outputPath);\n await rm(recording.outputDirectory, { force: true, recursive: true });\n return result;\n } catch (error) {\n void shutdown();\n throw error;\n } finally {\n activeRecording = null;\n }\n}\n\nasync function call(name, input, cancellable = true) {\n const signal = cancellable ? requestSignal : undefined;\n signal?.throwIfAborted();\n let timer;\n const result = await Promise.race([\n driver.callTool(name, JSON.stringify(input)),\n new Promise((_, reject) => {\n timer = setTimeout(() => {\n // Native calls have no abort API. Do not reuse a driver with uncertain in-flight work.\n void shutdown();\n reject(new Error(\"computer-use native call timed out; restart with startComputerUse\"));\n }, nativeCallTimeoutMs);\n }),\n ]).finally(() => clearTimeout(timer));\n signal?.throwIfAborted();\n if (result.isError) {\n throw new Error(\n `Cua ${name} failed${result.errorCode ? ` (${result.errorCode})` : \"\"}: ${result.text}`,\n );\n }\n return {\n degraded: result.degraded,\n structuredJson: result.structuredJson,\n text: result.text,\n verified: result.verified,\n };\n}\n\nfunction structured(result) {\n if (result.structuredJson === undefined) return {};\n return JSON.parse(result.structuredJson);\n}\n\nfunction pointerClickInput(x, y, button, count) {\n return {\n scope: \"desktop\",\n x,\n y,\n button: button === \"wheel\" ? \"middle\" : button,\n count,\n };\n}\n\nasync function moveCursor(action) {\n if (action.movementStyle === undefined) {\n return call(\"move_cursor\", { scope: \"desktop\", x: action.x, y: action.y });\n }\n const current = structured(await call(\"get_cursor_position\", {}));\n const start = { x: Number(current.x), y: Number(current.y) };\n if (!Number.isFinite(start.x) || !Number.isFinite(start.y)) {\n return call(\"move_cursor\", { scope: \"desktop\", x: action.x, y: action.y });\n }\n const options = { style: action.movementStyle };\n if (action.durationMs !== undefined) options.durationMs = action.durationMs;\n return followPointerPlan(pointerMotionPlan(start, { x: action.x, y: action.y }, options), \"x11\");\n}\n\nasync function dragCursor(action) {\n const start = action.path[0];\n const end = action.path.at(-1);\n if (action.movementStyle === undefined) {\n return call(\"drag\", {\n scope: \"desktop\",\n from_x: start.x,\n from_y: start.y,\n to_x: end.x,\n to_y: end.y,\n steps: Math.min(200, Math.max(20, action.path.length * 10)),\n });\n }\n const style = action.movementStyle;\n const current = structured(await call(\"get_cursor_position\", {}));\n const currentPoint = { x: Number(current.x), y: Number(current.y) };\n const approach =\n Number.isFinite(currentPoint.x) && Number.isFinite(currentPoint.y)\n ? pointerPlanArgs(pointerMotionPlan(currentPoint, start, { style: \"natural\" }))\n : [\"mousemove\", String(start.x), String(start.y)];\n const options = { style };\n if (action.durationMs !== undefined) options.durationMs = action.durationMs;\n const drag = pointerPlanArgs(pointerMotionPlan(start, end, options));\n return xdotool([\n ...approach,\n \"sleep\",\n \"0.025\",\n \"mousedown\",\n \"1\",\n \"sleep\",\n \"0.030\",\n ...drag,\n \"sleep\",\n \"0.030\",\n \"mouseup\",\n \"1\",\n ]);\n}\n\nasync function followPointerPlan(plan, backend = \"cua\") {\n if (backend === \"x11\") return xdotool(pointerPlanArgs(plan));\n const results = [];\n for (let phaseIndex = 0; phaseIndex < plan.phases.length; phaseIndex += 1) {\n for (const point of plan.phases[phaseIndex]) {\n results.push(await call(\"move_cursor\", { scope: \"desktop\", x: point.x, y: point.y }));\n if (point.delayMs > 0) await sleep(point.delayMs);\n }\n if (phaseIndex < plan.phases.length - 1 && plan.settleMs > 0) await sleep(plan.settleMs);\n }\n if (plan.phases.length === 1 && plan.settleMs > 0) await sleep(plan.settleMs);\n return results;\n}\n\nfunction pointerPlanArgs(plan) {\n const args = [];\n for (let phaseIndex = 0; phaseIndex < plan.phases.length; phaseIndex += 1) {\n for (const point of plan.phases[phaseIndex]) {\n args.push(\"mousemove\", String(point.x), String(point.y));\n if (point.delayMs > 0) args.push(\"sleep\", (point.delayMs / 1000).toFixed(3));\n }\n if (phaseIndex < plan.phases.length - 1 && plan.settleMs > 0) {\n args.push(\"sleep\", (plan.settleMs / 1000).toFixed(3));\n }\n }\n if (plan.phases.length === 1 && plan.settleMs > 0) {\n args.push(\"sleep\", (plan.settleMs / 1000).toFixed(3));\n }\n return args;\n}\n\nasync function xdotool(args) {\n const plannedSleepMs = args.reduce(\n (total, value, index) => (args[index - 1] === \"sleep\" ? total + Number(value) * 1000 : total),\n 0,\n );\n const timeout = Math.max(2_000, Math.ceil(plannedSleepMs + 1_500));\n const result = await execFileAsync(\"xdotool\", args, { env: displayEnv(), timeout });\n return {\n plannedSleepMs: Math.round(plannedSleepMs),\n stderr: result.stderr,\n stdout: result.stdout,\n };\n}\n\nfunction typingPlan(action) {\n if (action.typingStyle === \"natural\") return naturalTypingPlan(action.text);\n return [...new Intl.Segmenter().segment(action.text)].map(({ segment }) => ({\n grapheme: segment,\n delayMs: action.typingDelayMs ?? 0,\n }));\n}\n\nfunction validateTypingBudget(actions) {\n let characters = 0;\n let calls = 0;\n let delayMs = 0;\n for (const action of actions) {\n if (action.action !== \"type\") continue;\n if (typeof action.text !== \"string\" || action.text.length > 10_000) {\n throw new Error(\"typing text must be at most 10000 characters\");\n }\n characters += action.text.length;\n if (action.typingStyle === undefined && !action.typingDelayMs) continue;\n const plan = typingPlan(action);\n calls += plan.length;\n delayMs += plan.reduce((total, step) => total + step.delayMs, 0);\n }\n if (characters > 10_000 || calls > 1_000 || delayMs > 30_000) {\n throw new Error(\n \"typing budget exceeded: at most 10000 characters, 1000 paced graphemes and 30000ms delay per request; use unpaced typing for longer text\",\n );\n }\n}\n\nasync function typeText(action) {\n if (action.typingStyle === undefined && !action.typingDelayMs) {\n return call(\"type_text\", { scope: \"desktop\", text: action.text });\n }\n let result;\n let graphemesTyped = 0;\n for (const { grapheme, delayMs } of typingPlan(action)) {\n result = await call(\"type_text\", { scope: \"desktop\", text: grapheme });\n graphemesTyped += 1;\n if (delayMs > 0) await sleep(delayMs);\n }\n return { graphemesTyped, result };\n}\n\nasync function click(action, count) {\n if (action.button !== \"back\" && action.button !== \"forward\") {\n return call(\"click\", pointerClickInput(action.x, action.y, action.button, count));\n }\n\n await call(\"move_cursor\", {\n scope: \"desktop\",\n x: action.x,\n y: action.y,\n });\n const results = [];\n for (let index = 0; index < count; index += 1) {\n results.push(\n await call(\"hotkey\", {\n scope: \"desktop\",\n keys: [\"alt\", action.button === \"back\" ? \"left\" : \"right\"],\n }),\n );\n }\n return results;\n}\n\nasync function readClipboard(selection) {\n try {\n const result = await execFileAsync(\"xclip\", [\"-selection\", xclipSelection(selection), \"-out\"], {\n env: displayEnv(),\n maxBuffer: maxClipboardBytes + 1,\n });\n if (Buffer.byteLength(result.stdout) > maxClipboardBytes) {\n throw new Error(`clipboard content exceeds ${maxClipboardBytes} bytes`);\n }\n return { selection, text: result.stdout };\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"clipboard content exceeds\")) throw error;\n return { selection, text: \"\" };\n }\n}\n\nasync function writeClipboard(selection, text) {\n if (Buffer.byteLength(text) > maxClipboardBytes) {\n throw new Error(`clipboard content exceeds ${maxClipboardBytes} bytes`);\n }\n await new Promise((resolve, reject) => {\n const child = execFile(\"xclip\", [\"-selection\", xclipSelection(selection), \"-in\"], {\n env: displayEnv(),\n timeout: nativeCallTimeoutMs,\n signal: requestSignal,\n });\n child.once(\"error\", reject);\n child.once(\"exit\", (code) =>\n code === 0 ? resolve() : reject(new Error(`xclip exited ${code}`)),\n );\n child.stdin.end(text);\n });\n return { bytes: Buffer.byteLength(text), selection };\n}\n\nfunction xclipSelection(selection) {\n return selection === \"primary\" ? \"primary\" : \"clipboard\";\n}\n\nasync function arrangeWindows(action) {\n const scene = validateWindowScene(action.windows);\n const deadline = Date.now() + action.waitForMs;\n let resolved = null;\n while (resolved === null) {\n const windows = structured(await call(\"list_windows\", { on_screen_only: true })).windows;\n resolved = resolveSceneWindows(scene, Array.isArray(windows) ? windows : []);\n if (resolved !== null) break;\n if (Date.now() >= deadline) {\n throw new Error(\n `arrange_windows timed out waiting for: ${missingSceneSelectors(scene, Array.isArray(windows) ? windows : []).join(\", \")}`,\n );\n }\n await sleep(100);\n }\n\n // Resolve the complete scene before mutating any window. A missing selector\n // therefore leaves the existing desktop untouched.\n for (const item of resolved) {\n const windowId = String(item.window.window_id);\n await execFileAsync(\"xdotool\", [\"windowactivate\", \"--sync\", windowId], { env: displayEnv() });\n await execFileAsync(\n \"xdotool\",\n [\"windowmove\", windowId, String(item.bounds.x), String(item.bounds.y)],\n {\n env: displayEnv(),\n },\n );\n await execFileAsync(\n \"xdotool\",\n [\"windowsize\", windowId, String(item.bounds.width), String(item.bounds.height)],\n { env: displayEnv() },\n );\n }\n\n let verified = null;\n let windows = [];\n for (let attempt = 0; attempt < 10; attempt += 1) {\n const response = structured(await call(\"list_windows\", { on_screen_only: true })).windows;\n windows = Array.isArray(response) ? response : [];\n verified = resolveSceneWindows(scene, windows);\n if (\n verified !== null &&\n verified.every(({ bounds, window }) => approximatelyEqual(bounds, window))\n ) {\n return verified.map(layoutResult);\n }\n await sleep(100);\n }\n\n const screenshotPath = `${workspaceRoot}/layout-failure-${Date.now()}.png`;\n await call(\"get_desktop_state\", { screenshot_out_file: screenshotPath });\n const details =\n verified === null\n ? { stage: \"selector_resolution\", missing: missingSceneSelectors(scene, windows) }\n : {\n stage: \"verification\",\n tolerance: layoutTolerance,\n windows: verified.map(layoutResult),\n };\n throw new Error(\n `arrange_windows failed: ${JSON.stringify({ ...details, screenshot: screenshotPath })}`,\n );\n}\n\nfunction validateWindowScene(windows) {\n if (!Array.isArray(windows) || windows.length < 1 || windows.length > 4) {\n throw new Error(\"arrange_windows requires 1 to 4 windows\");\n }\n const scene = windows.map((item) => ({ ...item, bounds: regionBounds(item.region) }));\n const selectors = scene.map((item) => selectorLabel(item.selector));\n if (new Set(selectors).size !== selectors.length) {\n throw new Error(\"arrange_windows selectors must be unique\");\n }\n for (let left = 0; left < scene.length; left += 1) {\n for (let right = left + 1; right < scene.length; right += 1) {\n if (overlaps(scene[left].bounds, scene[right].bounds)) {\n throw new Error(\"arrange_windows regions must not overlap\");\n }\n }\n }\n return scene;\n}\n\nfunction desktopBounds() {\n const screen = x11ScreenSize();\n return {\n x: desktopMargin,\n y: desktopMargin,\n width: screen.width - desktopMargin * 2,\n height: screen.height - desktopMargin * 2,\n };\n}\n\nfunction x11ScreenSize() {\n // The X server is the source of truth after set_desktop_size. Avoid CUA's\n // session-oriented get_screen_size contract, which differs from pointer\n // actions and does not accept scope.\n const output = execFileSync(\"xdpyinfo\", [\"-display\", \":99\"], {\n encoding: \"utf8\",\n timeout: 2_000,\n });\n const match = /dimensions:\\s+(\\d+)x(\\d+) pixels/u.exec(output);\n if (match === null) throw new Error(\"could not determine desktop dimensions\");\n return { width: Number(match[1]), height: Number(match[2]) };\n}\n\nfunction regionBounds(region) {\n if (\n typeof region !== \"object\" ||\n region === null ||\n ![region.x, region.y, region.width, region.height].every(Number.isFinite) ||\n region.x < 0 ||\n region.y < 0 ||\n region.width <= 0 ||\n region.height <= 0 ||\n region.x + region.width > 1 ||\n region.y + region.height > 1\n ) {\n throw new Error(\"arrange_windows regions must fit within the desktop\");\n }\n const desktop = desktopBounds();\n const left = Math.round(desktop.x + desktop.width * region.x);\n const top = Math.round(desktop.y + desktop.height * region.y);\n const right = Math.round(desktop.x + desktop.width * (region.x + region.width));\n const bottom = Math.round(desktop.y + desktop.height * (region.y + region.height));\n const bounds = { x: left, y: top, width: right - left, height: bottom - top };\n if (bounds.width < minimumWindow.width || bounds.height < minimumWindow.height) {\n throw new Error(\n `arrange_windows regions must be at least ${minimumWindow.width}x${minimumWindow.height}`,\n );\n }\n return bounds;\n}\n\nfunction resolveSceneWindows(scene, windows) {\n const resolved = scene.map((item) => {\n const window = windows.find((candidate) => matchesSelector(candidate, item.selector));\n return window === undefined ? null : { bounds: item.bounds, window };\n });\n return resolved.includes(null) ? null : resolved;\n}\n\nfunction missingSceneSelectors(scene, windows) {\n return scene\n .filter((item) => !windows.some((window) => matchesSelector(window, item.selector)))\n .map((item) => selectorLabel(item.selector));\n}\n\nfunction matchesSelector(window, selector) {\n const identity = `${window.app_name ?? \"\"}\\n${window.title ?? \"\"}`.toLowerCase();\n if (selector.app === \"firefox\") return identity.includes(\"firefox\");\n const title = selector.instance === \"primary\" ? \"terminal 1\" : \"terminal 2\";\n return identity.includes(title);\n}\n\nfunction selectorLabel(selector) {\n return selector.app === \"firefox\" ? \"firefox\" : `xterm:${selector.instance}`;\n}\n\nfunction overlaps(left, right) {\n return (\n left.x < right.x + right.width &&\n left.x + left.width > right.x &&\n left.y < right.y + right.height &&\n left.y + left.height > right.y\n );\n}\n\nfunction layoutResult({ bounds, window }) {\n const observed = {\n x: Number(window.x),\n y: Number(window.y),\n width: Number(window.width),\n height: Number(window.height),\n };\n return {\n selector: `${window.app_name ?? \"\"}:${window.title ?? \"\"}`,\n requested: bounds,\n observed,\n delta: {\n x: observed.x - bounds.x,\n y: observed.y - bounds.y,\n width: observed.width - bounds.width,\n height: observed.height - bounds.height,\n },\n tolerance: layoutTolerance,\n title: window.title,\n window_id: window.window_id,\n };\n}\n\nfunction displayEnv() {\n return { ...env, DISPLAY: \":99\" };\n}\n\nfunction approximatelyEqual(bounds, window) {\n return (\n Math.abs(bounds.x - window.x) <= layoutTolerance.x &&\n Math.abs(bounds.y - window.y) <= layoutTolerance.y &&\n Math.abs(bounds.width - window.width) <= layoutTolerance.width &&\n Math.abs(bounds.height - window.height) <= layoutTolerance.height\n );\n}\n\nfunction sleep(milliseconds) {\n return delay(milliseconds, undefined, { signal: requestSignal });\n}\n\nfunction scrollInput(delta, negativeDirection, positiveDirection) {\n return {\n scope: \"desktop\",\n direction: delta < 0 ? negativeDirection : positiveDirection,\n amount: Math.min(50, Math.max(1, Math.round(Math.abs(delta) / 100))),\n by: \"line\",\n };\n}\n\nfunction normalizeKey(key) {\n const aliases = {\n ARROWDOWN: \"down\",\n ARROWLEFT: \"left\",\n ARROWRIGHT: \"right\",\n ARROWUP: \"up\",\n CMD: \"meta\",\n COMMAND: \"meta\",\n CONTROL: \"ctrl\",\n DEL: \"delete\",\n ENTER: \"enter\",\n ESC: \"escape\",\n OPTION: \"alt\",\n RETURN: \"enter\",\n };\n return aliases[key] ?? key.toLowerCase();\n}\n\nfunction isContentWindow(window) {\n const identity = `${window.app_name ?? \"\"}\\n${window.title ?? \"\"}`.toLowerCase();\n return (\n window.width >= 200 &&\n window.height >= 100 &&\n !identity.includes(\"xfce4-panel\") &&\n !identity.includes(\"xfdesktop\") &&\n window.title !== \"Desktop\"\n );\n}\n\nfunction formatState(groundingWindow, pointer, elements) {\n const lines = [\n groundingWindow === undefined\n ? \"grounding_window\\t(none)\"\n : `grounding_window\\t${groundingWindow.title} pid=${groundingWindow.pid} window_id=${groundingWindow.window_id}`,\n `pointer\\tx=${pointer.x ?? \"unknown\"} y=${pointer.y ?? \"unknown\"}`,\n \"accessibility_elements\",\n ];\n\n for (const element of elements) {\n const frame =\n element.frame === undefined\n ? \"\"\n : ` x=${element.frame.x} y=${element.frame.y} width=${element.frame.w} height=${element.frame.h}`;\n lines.push(\n `[${element.element_index}] role=${element.role}${frame} label=${JSON.stringify(element.label ?? \"\")}`,\n );\n }\n return lines.join(\"\\n\");\n}\n\nfunction validateActionCoordinates(action) {\n const screen = x11ScreenSize();\n const points = [];\n if ([\"click\", \"double_click\", \"triple_click\", \"move\", \"scroll\"].includes(action.action)) {\n points.push({ x: action.x, y: action.y });\n }\n if (action.action === \"drag\") points.push(...action.path);\n for (const point of points) {\n if (\n !Number.isFinite(point.x) ||\n !Number.isFinite(point.y) ||\n point.x < 0 ||\n point.y < 0 ||\n point.x >= screen.width ||\n point.y >= screen.height\n ) {\n throw new Error(\n `computer-use coordinate is outside the ${screen.width}x${screen.height} desktop`,\n );\n }\n }\n}\n\nfunction validateRequest(input) {\n if (typeof input !== \"object\" || input === null) {\n throw new Error(\"request must be an object\");\n }\n if (!isArtifactPath(input.screenshotPath, \".png\")) {\n throw new Error(\"screenshot path must be a PNG under the computer-use workspace\");\n }\n if (typeof input.action !== \"object\" || input.action === null) {\n throw new Error(\"request action must be an object\");\n }\n const actions = new Set([\n \"arrange_windows\",\n \"click\",\n \"clipboard_read\",\n \"clipboard_write\",\n \"double_click\",\n \"drag\",\n \"keypress\",\n \"move\",\n \"record_start\",\n \"record_stop\",\n \"screenshot\",\n \"scroll\",\n \"sequence\",\n \"triple_click\",\n \"type\",\n \"wait\",\n ]);\n if (!actions.has(input.action.action)) {\n throw new Error(`unsupported computer-use action: ${String(input.action.action)}`);\n }\n if (input.action.action === \"sequence\") {\n if (\n !Array.isArray(input.action.actions) ||\n input.action.actions.length < 1 ||\n input.action.actions.length > 30\n ) {\n throw new Error(\"sequence must contain 1 to 30 actions\");\n }\n for (const action of input.action.actions) validateNestedSequenceAction(action);\n }\n if (input.action.action === \"arrange_windows\") validateArrangeWindowsAction(input.action);\n if (input.action.action === \"record_start\" && !isArtifactPath(input.action.path, \".mp4\")) {\n throw new Error(\"recording path must be an MP4 under the computer-use workspace\");\n }\n if (\n [\"click\", \"double_click\", \"triple_click\", \"drag\", \"move\"].includes(input.action.action) &&\n \"durationMs\" in input.action &&\n (!Number.isInteger(input.action.durationMs) ||\n input.action.durationMs < 0 ||\n input.action.durationMs > 2000)\n ) {\n throw new Error(\"pointer durationMs must be an integer from 0 to 2000\");\n }\n validateMovementStyle(input.action, \"\");\n if (\n input.action.action === \"wait\" &&\n (!Number.isInteger(input.action.durationMs) ||\n input.action.durationMs < 100 ||\n input.action.durationMs > 10_000)\n ) {\n throw new Error(\"wait durationMs must be an integer from 100 to 10000\");\n }\n validateClipboardOptions(input.action);\n validateTypingOptions(input.action, \"\");\n validateTypingBudget(input.action.action === \"sequence\" ? input.action.actions : [input.action]);\n}\n\nfunction validateNestedSequenceAction(action) {\n if (typeof action !== \"object\" || action === null)\n throw new Error(\"sequence action must be an object\");\n const allowed = new Set([\n \"arrange_windows\",\n \"click\",\n \"double_click\",\n \"drag\",\n \"keypress\",\n \"move\",\n \"record_start\",\n \"record_stop\",\n \"triple_click\",\n \"type\",\n \"wait\",\n ]);\n if (!allowed.has(action.action))\n throw new Error(`unsupported sequence action: ${String(action.action)}`);\n if (action.action === \"arrange_windows\") validateArrangeWindowsAction(action);\n if (action.action === \"record_start\" && !isArtifactPath(action.path, \".mp4\")) {\n throw new Error(\"sequence recording path must be an MP4 under the computer-use workspace\");\n }\n if (\n [\"click\", \"double_click\", \"triple_click\", \"drag\", \"move\"].includes(action.action) &&\n \"durationMs\" in action &&\n (!Number.isInteger(action.durationMs) || action.durationMs < 0 || action.durationMs > 2000)\n ) {\n throw new Error(\"sequence pointer durationMs must be an integer from 0 to 2000\");\n }\n validateMovementStyle(action, \"sequence \");\n if (\n action.action === \"wait\" &&\n (!Number.isInteger(action.durationMs) || action.durationMs < 100 || action.durationMs > 10_000)\n ) {\n throw new Error(\"sequence wait durationMs must be an integer from 100 to 10000\");\n }\n if (action.action === \"type\") validateTypingOptions(action, \"sequence \");\n}\n\nfunction validateMovementStyle(action, prefix) {\n if (\n \"movementStyle\" in action &&\n action.movementStyle !== \"natural\" &&\n action.movementStyle !== \"precision\"\n ) {\n throw new Error(`${prefix}movementStyle must be natural or precision`);\n }\n if (\n action.action === \"drag\" &&\n \"movementStyle\" in action &&\n action.movementStyle !== \"precision\"\n ) {\n throw new Error(`${prefix}drag movementStyle must be precision`);\n }\n}\n\nfunction validateClipboardOptions(action) {\n if (\n [\"clipboard_read\", \"clipboard_write\"].includes(action.action) &&\n action.selection !== \"clipboard\" &&\n action.selection !== \"primary\"\n ) {\n throw new Error(\"clipboard selection must be clipboard or primary\");\n }\n if (\n action.action === \"clipboard_write\" &&\n (typeof action.text !== \"string\" || Buffer.byteLength(action.text) > maxClipboardBytes)\n ) {\n throw new Error(`clipboard text must be at most ${maxClipboardBytes} bytes`);\n }\n}\n\nfunction validateTypingOptions(action, prefix) {\n if (\n \"typingDelayMs\" in action &&\n (!Number.isInteger(action.typingDelayMs) ||\n action.typingDelayMs < 0 ||\n action.typingDelayMs > 200)\n ) {\n throw new Error(`${prefix}typingDelayMs must be an integer from 0 to 200`);\n }\n if (\"typingStyle\" in action && action.typingStyle !== \"natural\") {\n throw new Error(`${prefix}typingStyle must be natural`);\n }\n if (\"typingStyle\" in action && \"typingDelayMs\" in action) {\n throw new Error(`${prefix}type action cannot set both typingStyle and typingDelayMs`);\n }\n}\n\nfunction validateArrangeWindowsAction(action) {\n if (!Number.isInteger(action.waitForMs) || action.waitForMs < 0 || action.waitForMs > 10_000) {\n throw new Error(\"arrange_windows waitForMs must be an integer from 0 to 10000\");\n }\n validateWindowScene(action.windows);\n}\n\nfunction isArtifactPath(value, extension) {\n if (typeof value !== \"string\" || !value.endsWith(extension)) return false;\n const path = resolve(value);\n return dirname(path) === workspaceRoot;\n}\n\nasync function readBody(request) {\n let body = \"\";\n for await (const chunk of request) {\n body += chunk;\n if (Buffer.byteLength(body) > maxRequestBytes) {\n throw new Error(\"request exceeds 32 KiB\");\n }\n }\n return body;\n}\n\nfunction sendJson(response, statusCode, body) {\n if (response.destroyed) return;\n const json = JSON.stringify(body);\n response.writeHead(statusCode, {\n \"content-length\": Buffer.byteLength(json),\n \"content-type\": \"application/json\",\n });\n response.end(json);\n}\n";
2
2
  export declare const CLIENT_MJS_SOURCE = "import http from \"node:http\";\nimport { env } from \"node:process\";\n\nconst socketPath = env.COMPUTER_USE_SOCKET_PATH;\nconst body = env.COMPUTER_USE_REQUEST;\n\nif (body === undefined) {\n throw new Error(\"COMPUTER_USE_REQUEST is required\");\n}\n\nconst deadline = Date.now() + 120_000;\nconst response = await new Promise((resolve, reject) => {\n const request = http.request(\n {\n socketPath,\n method: \"POST\",\n path: \"/call\",\n headers: {\n \"content-length\": Buffer.byteLength(body),\n \"content-type\": \"application/json\",\n \"x-computer-use-deadline\": String(deadline),\n },\n },\n (incoming) => {\n incoming.on(\"error\", reject);\n incoming.setEncoding(\"utf8\");\n let responseBody = \"\";\n incoming.on(\"data\", (chunk) => {\n responseBody += chunk;\n });\n incoming.on(\"end\", () => {\n resolve({ body: responseBody, statusCode: incoming.statusCode ?? 500 });\n });\n },\n );\n const timer = setTimeout(\n () => request.destroy(new Error(\"computer-use request deadline exceeded\")),\n Math.max(0, deadline - Date.now()),\n );\n request.once(\"close\", () => clearTimeout(timer));\n request.on(\"error\", reject);\n request.end(body);\n});\n\nif (response.statusCode !== 200) {\n process.stderr.write(response.body);\n process.exitCode = 1;\n} else {\n process.stdout.write(response.body);\n}\n";
3
- export declare const STATE_MJS_SOURCE = "const MAX_GROUNDING_ELEMENTS = 80;\n\n/**\n * @typedef {{\n * element_index?: number;\n * frame?: { h?: number; w?: number; x?: number; y?: number };\n * label?: unknown;\n * [key: string]: unknown;\n * }} GroundingElement\n */\n\n/**\n * Keep the model-facing state aligned with the visible desktop screenshot.\n *\n * @param {unknown[]} elements\n * @returns {GroundingElement[]}\n */\nexport function selectGroundingElements(elements, screen = { width: 1920, height: 1080 }) {\n return elements\n .filter((element) => isVisibleLabeledElement(element, screen))\n .slice(0, MAX_GROUNDING_ELEMENTS);\n}\n\n/**\n * @param {unknown} value\n * @returns {value is GroundingElement}\n */\nfunction isVisibleLabeledElement(value, screen) {\n if (typeof value !== \"object\" || value === null) return false;\n const element = /** @type {GroundingElement} */ (value);\n const frame = element.frame;\n if (typeof element.label !== \"string\" || element.label.trim().length === 0) return false;\n if (typeof frame !== \"object\" || frame === null) return false;\n if (\n !Number.isFinite(frame.x) ||\n !Number.isFinite(frame.y) ||\n !Number.isFinite(frame.w) ||\n !Number.isFinite(frame.h)\n ) {\n return false;\n }\n\n const x = /** @type {number} */ (frame.x);\n const y = /** @type {number} */ (frame.y);\n const width = /** @type {number} */ (frame.w);\n const height = /** @type {number} */ (frame.h);\n return (\n width > 0 &&\n height > 0 &&\n x < screen.width &&\n y < screen.height &&\n x + width > 0 &&\n y + height > 0\n );\n}\n";
4
3
  export declare const TYPING_MJS_SOURCE = "const DEMO_TYPING_SPEED = 1.2;\nconst MIN_DELAY_MS = 35;\nconst MAX_DELAY_MS = 220;\n\nexport function naturalTypingPlan(text) {\n const graphemes = [...new Intl.Segmenter().segment(text)].map(({ segment }) => segment);\n let state = hashText(text) || 1;\n return graphemes.map((grapheme, index) => {\n state = nextState(state);\n return {\n grapheme,\n delayMs: index === graphemes.length - 1 ? 0 : naturalDelay(grapheme, state),\n };\n });\n}\n\nfunction naturalDelay(grapheme, state) {\n const jitter = state / 0x1_0000_0000;\n const range = delayRange(grapheme);\n return Math.round((range.min + (range.max - range.min) * jitter) / DEMO_TYPING_SPEED);\n}\n\nfunction delayRange(grapheme) {\n if (/\\s/u.test(grapheme)) return { min: 75, max: 125 };\n if (/[.!?]/u.test(grapheme)) return { min: 145, max: MAX_DELAY_MS };\n if (/[/|;&]/u.test(grapheme)) return { min: 105, max: 175 };\n if (/[-_=,:]/u.test(grapheme)) return { min: 70, max: 125 };\n return { min: MIN_DELAY_MS, max: 85 };\n}\n\nfunction hashText(text) {\n let hash = 2166136261;\n for (const character of text) {\n hash ^= character.codePointAt(0);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n\nfunction nextState(state) {\n let value = state;\n value ^= value << 13;\n value ^= value >>> 17;\n value ^= value << 5;\n return value >>> 0;\n}\n";
5
4
  export declare const POINTER_MOTION_MJS_SOURCE = "const FRAME_MS = 16;\n\nexport function pointerMotionPlan(start, end, options = {}) {\n const style = options.style ?? \"natural\";\n const distance = Math.hypot(end.x - start.x, end.y - start.y);\n const durationMs = options.durationMs ?? naturalDuration(distance, style);\n if (distance < 2 || durationMs === 0) {\n return { phases: [[{ ...end, delayMs: 0 }]], settleMs: 0 };\n }\n\n if (style === \"precision\" && distance >= 120) {\n const ratio = 0.92 + deterministicUnit(start, end, 7) * 0.04;\n const undershoot = {\n x: Math.round(start.x + (end.x - start.x) * ratio),\n y: Math.round(start.y + (end.y - start.y) * ratio),\n };\n // Cover most of the distance quickly, then spend a disproportionate\n // share of the duration continuously correcting the final 4\u20138%.\n const firstDuration = Math.round(durationMs * 0.62);\n return {\n phases: [\n bezierPhase(start, undershoot, firstDuration, \"natural\", 11),\n bezierPhase(undershoot, end, durationMs - firstDuration, \"precision\", 23),\n ],\n settleMs: 0,\n };\n }\n\n return {\n phases: [bezierPhase(start, end, durationMs, style, 17)],\n settleMs: style === \"natural\" ? 15 + Math.round(deterministicUnit(start, end, 31) * 15) : 0,\n };\n}\n\nfunction bezierPhase(start, end, durationMs, style, salt) {\n const distance = Math.hypot(end.x - start.x, end.y - start.y);\n const steps = Math.max(2, Math.min(60, Math.round(durationMs / FRAME_MS)));\n const perpendicular = unitPerpendicular(start, end);\n const bendLimit = style === \"precision\" ? 8 : Math.min(70, distance * 0.09);\n const bend = (deterministicUnit(start, end, salt) * 2 - 1) * bendLimit;\n const c1 = {\n x: start.x + (end.x - start.x) * 0.28 + perpendicular.x * bend,\n y: start.y + (end.y - start.y) * 0.28 + perpendicular.y * bend,\n };\n const c2 = {\n x: start.x + (end.x - start.x) * 0.76 + perpendicular.x * bend * 0.65,\n y: start.y + (end.y - start.y) * 0.76 + perpendicular.y * bend * 0.65,\n };\n const delayMs = durationMs / steps;\n return Array.from({ length: steps }, (_, index) => {\n // This asymmetric timing curve accelerates quickly and eases into the\n // target without the perfectly mirrored feel of smoothstep.\n const progress = (index + 1) / steps;\n const t = 1 - (1 - progress) ** 2.35;\n const point = cubicBezier(start, c1, c2, end, t);\n return {\n x: index === steps - 1 ? end.x : Math.round(point.x),\n y: index === steps - 1 ? end.y : Math.round(point.y),\n delayMs: index === steps - 1 ? 0 : delayMs,\n };\n });\n}\n\nfunction cubicBezier(start, c1, c2, end, t) {\n const inverse = 1 - t;\n return {\n x:\n inverse ** 3 * start.x +\n 3 * inverse ** 2 * t * c1.x +\n 3 * inverse * t ** 2 * c2.x +\n t ** 3 * end.x,\n y:\n inverse ** 3 * start.y +\n 3 * inverse ** 2 * t * c1.y +\n 3 * inverse * t ** 2 * c2.y +\n t ** 3 * end.y,\n };\n}\n\nfunction naturalDuration(distance, style) {\n const base = style === \"precision\" ? 150 : 110;\n const scale = style === \"precision\" ? 0.35 : 0.28;\n const minimum = style === \"precision\" ? 180 : 140;\n const maximum = style === \"precision\" ? 650 : 550;\n return Math.round(Math.min(maximum, Math.max(minimum, base + distance * scale)));\n}\n\nfunction unitPerpendicular(start, end) {\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const length = Math.hypot(dx, dy) || 1;\n return { x: -dy / length, y: dx / length };\n}\n\nfunction deterministicUnit(start, end, salt) {\n let value =\n (Math.imul(Math.round(start.x), 73_856_093) ^\n Math.imul(Math.round(start.y), 19_349_663) ^\n Math.imul(Math.round(end.x), 83_492_791) ^\n Math.imul(Math.round(end.y), 2_654_435_761) ^\n salt) >>>\n 0;\n value ^= value << 13;\n value ^= value >>> 17;\n value ^= value << 5;\n return (value >>> 0) / 0x1_0000_0000;\n}\n";
6
- export declare const PACKAGE_JSON_SOURCE = "{\n \"name\": \"computer-use-driver\",\n \"private\": true,\n \"type\": \"module\",\n \"dependencies\": {\n \"@trycua/cua-driver\": \"0.12.5\"\n }\n}\n";
7
5
  export declare const COMPUTER_USE_DRIVER_SOURCES: {
8
6
  readonly "server.mjs": "import { setTimeout as delay } from \"node:timers/promises\";\nimport { execFile, execFileSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { chmod, rename, rm } from \"node:fs/promises\";\nimport { promisify } from \"node:util\";\nimport http from \"node:http\";\nimport { env } from \"node:process\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { CuaDriver } from \"@trycua/cua-driver\";\n\nimport { pointerMotionPlan } from \"./pointer-motion.mjs\";\nimport { selectGroundingElements } from \"./state.mjs\";\nimport { naturalTypingPlan } from \"./typing.mjs\";\n\nconst socketPath = env.COMPUTER_USE_SOCKET_PATH;\nconst workspaceRoot = env.COMPUTER_USE_ROOT;\nconst maxRequestBytes = 32 * 1024;\nconst maxRequestMs = 120_000;\nconst maxRecordingMs = 300_000;\nconst nativeCallTimeoutMs = 10_000;\n// Only the queue owner sets this signal; recording finalization deliberately bypasses it.\nlet requestSignal;\nconst desktopMargin = 24;\nconst minimumWindow = { height: 240, width: 480 };\nconst layoutTolerance = { height: 8, width: 8, x: 4, y: 4 };\nconst maxClipboardBytes = 10_000;\nconst driver = await CuaDriver.create({ claudeCodeCompatibility: false });\nconst execFilePromise = promisify(execFile);\nfunction execFileAsync(file, args, options) {\n return execFilePromise(file, args, {\n timeout: nativeCallTimeoutMs,\n ...options,\n signal: requestSignal,\n });\n}\n\nlet activeRecording = null;\nlet queue = Promise.resolve();\nlet shuttingDown = false;\n\nawait rm(socketPath, { force: true });\n\nconst server = http.createServer((request, response) => {\n if (shuttingDown) return response.destroy();\n if (request.method !== \"POST\" || request.url !== \"/call\") {\n sendJson(response, 404, { error: \"not found\" });\n return;\n }\n const controller = new AbortController();\n const deadline = Number(request.headers[\"x-computer-use-deadline\"]);\n const timeoutMs = Number.isFinite(deadline)\n ? Math.max(0, Math.min(maxRequestMs, deadline - Date.now()))\n : maxRequestMs;\n const cancel = () =>\n controller.abort(new Error(\"computer-use request cancelled or deadline exceeded\"));\n const timer = setTimeout(cancel, timeoutMs);\n response.once(\"close\", cancel);\n controller.signal.addEventListener(\"abort\", () => response.destroy(), { once: true });\n if (timeoutMs === 0) cancel();\n // Read immediately: a body may finish or disconnect while another call owns the queue.\n const body = readBody(request);\n void body.catch(() => undefined);\n const task = queue.then(async () => {\n controller.signal.throwIfAborted();\n if (shuttingDown) return;\n requestSignal = controller.signal;\n try {\n await handleRequest(await body, response);\n } finally {\n requestSignal = undefined;\n }\n });\n queue = task\n .catch(() => response.destroy())\n .finally(() => {\n clearTimeout(timer);\n response.removeListener(\"close\", cancel);\n });\n});\n\nserver.listen(socketPath, () => {\n void chmod(socketPath, 0o600);\n});\n\nfor (const signal of [\"SIGINT\", \"SIGTERM\"]) {\n process.once(signal, () => {\n void shutdown();\n });\n}\n\nasync function shutdown() {\n if (shuttingDown) return;\n shuttingDown = true;\n server.close();\n server.closeAllConnections();\n const timer = setTimeout(() => process.exit(1), nativeCallTimeoutMs * 2);\n let exitCode = 0;\n try {\n await queue;\n if (activeRecording !== null) await stopRecording();\n } catch {\n exitCode = 1;\n } finally {\n try {\n await driver.shutdown();\n } catch {\n exitCode = 1;\n } finally {\n clearTimeout(timer);\n process.exit(exitCode);\n }\n }\n}\n\nasync function handleRequest(body, response) {\n try {\n const input = JSON.parse(body);\n if (input.action === \"health\") {\n sendJson(response, 200, { backend: \"cua-driver\", version: \"0.12.5\" });\n return;\n }\n\n validateRequest(input);\n const actionResult = await performAction(input.action);\n const state = await captureState(input.screenshotPath);\n sendJson(response, 200, {\n action: actionResult,\n backend: \"cua-driver\",\n screenshot: input.screenshotPath,\n state,\n version: \"0.12.5\",\n });\n } catch (error) {\n if (requestSignal?.aborted && activeRecording !== null) {\n await stopRecording().catch(() => undefined);\n }\n sendJson(response, 500, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\nasync function performAction(action) {\n requestSignal?.throwIfAborted();\n validateActionCoordinates(action);\n if (action.action === \"sequence\") {\n const results = [];\n try {\n for (const nested of action.actions) {\n const startedAt = performance.now();\n const result = await performAction(nested);\n results.push({\n action: nested.action,\n durationMs: Math.round(performance.now() - startedAt),\n result,\n });\n }\n return results;\n } catch (error) {\n // Never strand the durable driver in an active-recording state when a\n // rehearsed step fails. Preserve the original action error.\n if (activeRecording !== null) await stopRecording().catch(() => undefined);\n throw error;\n }\n }\n switch (action.action) {\n case \"screenshot\":\n return null;\n case \"click\":\n await moveCursor(action);\n return click(action, 1);\n case \"double_click\":\n await moveCursor(action);\n return click(action, 2);\n case \"triple_click\":\n await moveCursor(action);\n return click(action, 3);\n case \"drag\":\n return dragCursor(action);\n case \"keypress\":\n return action.keys.length === 1\n ? call(\"press_key\", {\n scope: \"desktop\",\n key: normalizeKey(action.keys[0]),\n })\n : call(\"hotkey\", {\n scope: \"desktop\",\n keys: action.keys.map(normalizeKey),\n });\n case \"move\":\n return moveCursor(action);\n case \"scroll\": {\n await call(\"move_cursor\", {\n scope: \"desktop\",\n x: action.x,\n y: action.y,\n });\n const results = [];\n if (action.scrollY !== 0) {\n results.push(await call(\"scroll\", scrollInput(action.scrollY, \"up\", \"down\")));\n }\n if (action.scrollX !== 0) {\n results.push(await call(\"scroll\", scrollInput(action.scrollX, \"left\", \"right\")));\n }\n return results;\n }\n case \"type\":\n return typeText(action);\n case \"clipboard_read\":\n return readClipboard(action.selection);\n case \"clipboard_write\":\n return writeClipboard(action.selection, action.text);\n case \"wait\":\n await sleep(action.durationMs ?? 2_000);\n return null;\n case \"arrange_windows\":\n return arrangeWindows(action);\n case \"record_start\":\n return startRecording(action.path);\n case \"record_stop\":\n return stopRecording();\n default:\n throw new Error(`unsupported computer-use action: ${String(action.action)}`);\n }\n}\n\nasync function captureState(screenshotPath) {\n await call(\"get_desktop_state\", { screenshot_out_file: screenshotPath });\n const pointer = structured(await call(\"get_cursor_position\", {}));\n const screen = x11ScreenSize();\n const windows = structured(await call(\"list_windows\", { on_screen_only: true })).windows;\n const contentWindows = Array.isArray(windows) ? windows.filter(isContentWindow) : [];\n const groundingWindow = contentWindows.toSorted((left, right) => right.z_index - left.z_index)[0];\n\n let elements = [];\n if (groundingWindow !== undefined) {\n const windowState = structured(\n await call(\"get_window_state\", {\n pid: groundingWindow.pid,\n window_id: groundingWindow.window_id,\n include_screenshot: false,\n max_depth: 20,\n max_elements: 250,\n }),\n );\n if (Array.isArray(windowState.elements)) {\n elements = selectGroundingElements(windowState.elements, {\n width: Number(screen.width) || 1920,\n height: Number(screen.height) || 1080,\n });\n }\n }\n\n return formatState(groundingWindow, pointer, elements);\n}\n\nasync function startRecording(path) {\n if (activeRecording !== null) {\n throw new Error(\"a recording is already active\");\n }\n\n const outputDirectory = `${workspaceRoot}/recording-${randomUUID()}`;\n const result = await call(\n \"start_recording\",\n {\n output_dir: outputDirectory,\n record_video: true,\n },\n false,\n );\n activeRecording = {\n outputDirectory,\n outputPath: path,\n stopping: null,\n timer: setTimeout(() => {\n void stopRecording().catch(() => {\n void shutdown();\n });\n }, maxRecordingMs),\n };\n return result;\n}\n\nasync function stopRecording() {\n if (activeRecording === null) {\n throw new Error(\"no recording is active\");\n }\n\n const recording = activeRecording;\n if (recording.stopping !== null) return recording.stopping;\n clearTimeout(recording.timer);\n recording.stopping = finalizeRecording(recording);\n return recording.stopping;\n}\n\nasync function finalizeRecording(recording) {\n try {\n const result = await call(\"stop_recording\", {}, false);\n const output = structured(result);\n const videoPath =\n typeof output.last_video_path === \"string\"\n ? output.last_video_path\n : recording.outputDirectory + \"/recording.mp4\";\n await rename(videoPath, recording.outputPath);\n await rm(recording.outputDirectory, { force: true, recursive: true });\n return result;\n } catch (error) {\n void shutdown();\n throw error;\n } finally {\n activeRecording = null;\n }\n}\n\nasync function call(name, input, cancellable = true) {\n const signal = cancellable ? requestSignal : undefined;\n signal?.throwIfAborted();\n let timer;\n const result = await Promise.race([\n driver.callTool(name, JSON.stringify(input)),\n new Promise((_, reject) => {\n timer = setTimeout(() => {\n // Native calls have no abort API. Do not reuse a driver with uncertain in-flight work.\n void shutdown();\n reject(new Error(\"computer-use native call timed out; restart with startComputerUse\"));\n }, nativeCallTimeoutMs);\n }),\n ]).finally(() => clearTimeout(timer));\n signal?.throwIfAborted();\n if (result.isError) {\n throw new Error(\n `Cua ${name} failed${result.errorCode ? ` (${result.errorCode})` : \"\"}: ${result.text}`,\n );\n }\n return {\n degraded: result.degraded,\n structuredJson: result.structuredJson,\n text: result.text,\n verified: result.verified,\n };\n}\n\nfunction structured(result) {\n if (result.structuredJson === undefined) return {};\n return JSON.parse(result.structuredJson);\n}\n\nfunction pointerClickInput(x, y, button, count) {\n return {\n scope: \"desktop\",\n x,\n y,\n button: button === \"wheel\" ? \"middle\" : button,\n count,\n };\n}\n\nasync function moveCursor(action) {\n if (action.movementStyle === undefined) {\n return call(\"move_cursor\", { scope: \"desktop\", x: action.x, y: action.y });\n }\n const current = structured(await call(\"get_cursor_position\", {}));\n const start = { x: Number(current.x), y: Number(current.y) };\n if (!Number.isFinite(start.x) || !Number.isFinite(start.y)) {\n return call(\"move_cursor\", { scope: \"desktop\", x: action.x, y: action.y });\n }\n const options = { style: action.movementStyle };\n if (action.durationMs !== undefined) options.durationMs = action.durationMs;\n return followPointerPlan(pointerMotionPlan(start, { x: action.x, y: action.y }, options), \"x11\");\n}\n\nasync function dragCursor(action) {\n const start = action.path[0];\n const end = action.path.at(-1);\n if (action.movementStyle === undefined) {\n return call(\"drag\", {\n scope: \"desktop\",\n from_x: start.x,\n from_y: start.y,\n to_x: end.x,\n to_y: end.y,\n steps: Math.min(200, Math.max(20, action.path.length * 10)),\n });\n }\n const style = action.movementStyle;\n const current = structured(await call(\"get_cursor_position\", {}));\n const currentPoint = { x: Number(current.x), y: Number(current.y) };\n const approach =\n Number.isFinite(currentPoint.x) && Number.isFinite(currentPoint.y)\n ? pointerPlanArgs(pointerMotionPlan(currentPoint, start, { style: \"natural\" }))\n : [\"mousemove\", String(start.x), String(start.y)];\n const options = { style };\n if (action.durationMs !== undefined) options.durationMs = action.durationMs;\n const drag = pointerPlanArgs(pointerMotionPlan(start, end, options));\n return xdotool([\n ...approach,\n \"sleep\",\n \"0.025\",\n \"mousedown\",\n \"1\",\n \"sleep\",\n \"0.030\",\n ...drag,\n \"sleep\",\n \"0.030\",\n \"mouseup\",\n \"1\",\n ]);\n}\n\nasync function followPointerPlan(plan, backend = \"cua\") {\n if (backend === \"x11\") return xdotool(pointerPlanArgs(plan));\n const results = [];\n for (let phaseIndex = 0; phaseIndex < plan.phases.length; phaseIndex += 1) {\n for (const point of plan.phases[phaseIndex]) {\n results.push(await call(\"move_cursor\", { scope: \"desktop\", x: point.x, y: point.y }));\n if (point.delayMs > 0) await sleep(point.delayMs);\n }\n if (phaseIndex < plan.phases.length - 1 && plan.settleMs > 0) await sleep(plan.settleMs);\n }\n if (plan.phases.length === 1 && plan.settleMs > 0) await sleep(plan.settleMs);\n return results;\n}\n\nfunction pointerPlanArgs(plan) {\n const args = [];\n for (let phaseIndex = 0; phaseIndex < plan.phases.length; phaseIndex += 1) {\n for (const point of plan.phases[phaseIndex]) {\n args.push(\"mousemove\", String(point.x), String(point.y));\n if (point.delayMs > 0) args.push(\"sleep\", (point.delayMs / 1000).toFixed(3));\n }\n if (phaseIndex < plan.phases.length - 1 && plan.settleMs > 0) {\n args.push(\"sleep\", (plan.settleMs / 1000).toFixed(3));\n }\n }\n if (plan.phases.length === 1 && plan.settleMs > 0) {\n args.push(\"sleep\", (plan.settleMs / 1000).toFixed(3));\n }\n return args;\n}\n\nasync function xdotool(args) {\n const plannedSleepMs = args.reduce(\n (total, value, index) => (args[index - 1] === \"sleep\" ? total + Number(value) * 1000 : total),\n 0,\n );\n const timeout = Math.max(2_000, Math.ceil(plannedSleepMs + 1_500));\n const result = await execFileAsync(\"xdotool\", args, { env: displayEnv(), timeout });\n return {\n plannedSleepMs: Math.round(plannedSleepMs),\n stderr: result.stderr,\n stdout: result.stdout,\n };\n}\n\nfunction typingPlan(action) {\n if (action.typingStyle === \"natural\") return naturalTypingPlan(action.text);\n return [...new Intl.Segmenter().segment(action.text)].map(({ segment }) => ({\n grapheme: segment,\n delayMs: action.typingDelayMs ?? 0,\n }));\n}\n\nfunction validateTypingBudget(actions) {\n let characters = 0;\n let calls = 0;\n let delayMs = 0;\n for (const action of actions) {\n if (action.action !== \"type\") continue;\n if (typeof action.text !== \"string\" || action.text.length > 10_000) {\n throw new Error(\"typing text must be at most 10000 characters\");\n }\n characters += action.text.length;\n if (action.typingStyle === undefined && !action.typingDelayMs) continue;\n const plan = typingPlan(action);\n calls += plan.length;\n delayMs += plan.reduce((total, step) => total + step.delayMs, 0);\n }\n if (characters > 10_000 || calls > 1_000 || delayMs > 30_000) {\n throw new Error(\n \"typing budget exceeded: at most 10000 characters, 1000 paced graphemes and 30000ms delay per request; use unpaced typing for longer text\",\n );\n }\n}\n\nasync function typeText(action) {\n if (action.typingStyle === undefined && !action.typingDelayMs) {\n return call(\"type_text\", { scope: \"desktop\", text: action.text });\n }\n let result;\n let graphemesTyped = 0;\n for (const { grapheme, delayMs } of typingPlan(action)) {\n result = await call(\"type_text\", { scope: \"desktop\", text: grapheme });\n graphemesTyped += 1;\n if (delayMs > 0) await sleep(delayMs);\n }\n return { graphemesTyped, result };\n}\n\nasync function click(action, count) {\n if (action.button !== \"back\" && action.button !== \"forward\") {\n return call(\"click\", pointerClickInput(action.x, action.y, action.button, count));\n }\n\n await call(\"move_cursor\", {\n scope: \"desktop\",\n x: action.x,\n y: action.y,\n });\n const results = [];\n for (let index = 0; index < count; index += 1) {\n results.push(\n await call(\"hotkey\", {\n scope: \"desktop\",\n keys: [\"alt\", action.button === \"back\" ? \"left\" : \"right\"],\n }),\n );\n }\n return results;\n}\n\nasync function readClipboard(selection) {\n try {\n const result = await execFileAsync(\"xclip\", [\"-selection\", xclipSelection(selection), \"-out\"], {\n env: displayEnv(),\n maxBuffer: maxClipboardBytes + 1,\n });\n if (Buffer.byteLength(result.stdout) > maxClipboardBytes) {\n throw new Error(`clipboard content exceeds ${maxClipboardBytes} bytes`);\n }\n return { selection, text: result.stdout };\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"clipboard content exceeds\")) throw error;\n return { selection, text: \"\" };\n }\n}\n\nasync function writeClipboard(selection, text) {\n if (Buffer.byteLength(text) > maxClipboardBytes) {\n throw new Error(`clipboard content exceeds ${maxClipboardBytes} bytes`);\n }\n await new Promise((resolve, reject) => {\n const child = execFile(\"xclip\", [\"-selection\", xclipSelection(selection), \"-in\"], {\n env: displayEnv(),\n timeout: nativeCallTimeoutMs,\n signal: requestSignal,\n });\n child.once(\"error\", reject);\n child.once(\"exit\", (code) =>\n code === 0 ? resolve() : reject(new Error(`xclip exited ${code}`)),\n );\n child.stdin.end(text);\n });\n return { bytes: Buffer.byteLength(text), selection };\n}\n\nfunction xclipSelection(selection) {\n return selection === \"primary\" ? \"primary\" : \"clipboard\";\n}\n\nasync function arrangeWindows(action) {\n const scene = validateWindowScene(action.windows);\n const deadline = Date.now() + action.waitForMs;\n let resolved = null;\n while (resolved === null) {\n const windows = structured(await call(\"list_windows\", { on_screen_only: true })).windows;\n resolved = resolveSceneWindows(scene, Array.isArray(windows) ? windows : []);\n if (resolved !== null) break;\n if (Date.now() >= deadline) {\n throw new Error(\n `arrange_windows timed out waiting for: ${missingSceneSelectors(scene, Array.isArray(windows) ? windows : []).join(\", \")}`,\n );\n }\n await sleep(100);\n }\n\n // Resolve the complete scene before mutating any window. A missing selector\n // therefore leaves the existing desktop untouched.\n for (const item of resolved) {\n const windowId = String(item.window.window_id);\n await execFileAsync(\"xdotool\", [\"windowactivate\", \"--sync\", windowId], { env: displayEnv() });\n await execFileAsync(\n \"xdotool\",\n [\"windowmove\", windowId, String(item.bounds.x), String(item.bounds.y)],\n {\n env: displayEnv(),\n },\n );\n await execFileAsync(\n \"xdotool\",\n [\"windowsize\", windowId, String(item.bounds.width), String(item.bounds.height)],\n { env: displayEnv() },\n );\n }\n\n let verified = null;\n let windows = [];\n for (let attempt = 0; attempt < 10; attempt += 1) {\n const response = structured(await call(\"list_windows\", { on_screen_only: true })).windows;\n windows = Array.isArray(response) ? response : [];\n verified = resolveSceneWindows(scene, windows);\n if (\n verified !== null &&\n verified.every(({ bounds, window }) => approximatelyEqual(bounds, window))\n ) {\n return verified.map(layoutResult);\n }\n await sleep(100);\n }\n\n const screenshotPath = `${workspaceRoot}/layout-failure-${Date.now()}.png`;\n await call(\"get_desktop_state\", { screenshot_out_file: screenshotPath });\n const details =\n verified === null\n ? { stage: \"selector_resolution\", missing: missingSceneSelectors(scene, windows) }\n : {\n stage: \"verification\",\n tolerance: layoutTolerance,\n windows: verified.map(layoutResult),\n };\n throw new Error(\n `arrange_windows failed: ${JSON.stringify({ ...details, screenshot: screenshotPath })}`,\n );\n}\n\nfunction validateWindowScene(windows) {\n if (!Array.isArray(windows) || windows.length < 1 || windows.length > 4) {\n throw new Error(\"arrange_windows requires 1 to 4 windows\");\n }\n const scene = windows.map((item) => ({ ...item, bounds: regionBounds(item.region) }));\n const selectors = scene.map((item) => selectorLabel(item.selector));\n if (new Set(selectors).size !== selectors.length) {\n throw new Error(\"arrange_windows selectors must be unique\");\n }\n for (let left = 0; left < scene.length; left += 1) {\n for (let right = left + 1; right < scene.length; right += 1) {\n if (overlaps(scene[left].bounds, scene[right].bounds)) {\n throw new Error(\"arrange_windows regions must not overlap\");\n }\n }\n }\n return scene;\n}\n\nfunction desktopBounds() {\n const screen = x11ScreenSize();\n return {\n x: desktopMargin,\n y: desktopMargin,\n width: screen.width - desktopMargin * 2,\n height: screen.height - desktopMargin * 2,\n };\n}\n\nfunction x11ScreenSize() {\n // The X server is the source of truth after set_desktop_size. Avoid CUA's\n // session-oriented get_screen_size contract, which differs from pointer\n // actions and does not accept scope.\n const output = execFileSync(\"xdpyinfo\", [\"-display\", \":99\"], {\n encoding: \"utf8\",\n timeout: 2_000,\n });\n const match = /dimensions:\\s+(\\d+)x(\\d+) pixels/u.exec(output);\n if (match === null) throw new Error(\"could not determine desktop dimensions\");\n return { width: Number(match[1]), height: Number(match[2]) };\n}\n\nfunction regionBounds(region) {\n if (\n typeof region !== \"object\" ||\n region === null ||\n ![region.x, region.y, region.width, region.height].every(Number.isFinite) ||\n region.x < 0 ||\n region.y < 0 ||\n region.width <= 0 ||\n region.height <= 0 ||\n region.x + region.width > 1 ||\n region.y + region.height > 1\n ) {\n throw new Error(\"arrange_windows regions must fit within the desktop\");\n }\n const desktop = desktopBounds();\n const left = Math.round(desktop.x + desktop.width * region.x);\n const top = Math.round(desktop.y + desktop.height * region.y);\n const right = Math.round(desktop.x + desktop.width * (region.x + region.width));\n const bottom = Math.round(desktop.y + desktop.height * (region.y + region.height));\n const bounds = { x: left, y: top, width: right - left, height: bottom - top };\n if (bounds.width < minimumWindow.width || bounds.height < minimumWindow.height) {\n throw new Error(\n `arrange_windows regions must be at least ${minimumWindow.width}x${minimumWindow.height}`,\n );\n }\n return bounds;\n}\n\nfunction resolveSceneWindows(scene, windows) {\n const resolved = scene.map((item) => {\n const window = windows.find((candidate) => matchesSelector(candidate, item.selector));\n return window === undefined ? null : { bounds: item.bounds, window };\n });\n return resolved.includes(null) ? null : resolved;\n}\n\nfunction missingSceneSelectors(scene, windows) {\n return scene\n .filter((item) => !windows.some((window) => matchesSelector(window, item.selector)))\n .map((item) => selectorLabel(item.selector));\n}\n\nfunction matchesSelector(window, selector) {\n const identity = `${window.app_name ?? \"\"}\\n${window.title ?? \"\"}`.toLowerCase();\n if (selector.app === \"firefox\") return identity.includes(\"firefox\");\n const title = selector.instance === \"primary\" ? \"terminal 1\" : \"terminal 2\";\n return identity.includes(title);\n}\n\nfunction selectorLabel(selector) {\n return selector.app === \"firefox\" ? \"firefox\" : `xterm:${selector.instance}`;\n}\n\nfunction overlaps(left, right) {\n return (\n left.x < right.x + right.width &&\n left.x + left.width > right.x &&\n left.y < right.y + right.height &&\n left.y + left.height > right.y\n );\n}\n\nfunction layoutResult({ bounds, window }) {\n const observed = {\n x: Number(window.x),\n y: Number(window.y),\n width: Number(window.width),\n height: Number(window.height),\n };\n return {\n selector: `${window.app_name ?? \"\"}:${window.title ?? \"\"}`,\n requested: bounds,\n observed,\n delta: {\n x: observed.x - bounds.x,\n y: observed.y - bounds.y,\n width: observed.width - bounds.width,\n height: observed.height - bounds.height,\n },\n tolerance: layoutTolerance,\n title: window.title,\n window_id: window.window_id,\n };\n}\n\nfunction displayEnv() {\n return { ...env, DISPLAY: \":99\" };\n}\n\nfunction approximatelyEqual(bounds, window) {\n return (\n Math.abs(bounds.x - window.x) <= layoutTolerance.x &&\n Math.abs(bounds.y - window.y) <= layoutTolerance.y &&\n Math.abs(bounds.width - window.width) <= layoutTolerance.width &&\n Math.abs(bounds.height - window.height) <= layoutTolerance.height\n );\n}\n\nfunction sleep(milliseconds) {\n return delay(milliseconds, undefined, { signal: requestSignal });\n}\n\nfunction scrollInput(delta, negativeDirection, positiveDirection) {\n return {\n scope: \"desktop\",\n direction: delta < 0 ? negativeDirection : positiveDirection,\n amount: Math.min(50, Math.max(1, Math.round(Math.abs(delta) / 100))),\n by: \"line\",\n };\n}\n\nfunction normalizeKey(key) {\n const aliases = {\n ARROWDOWN: \"down\",\n ARROWLEFT: \"left\",\n ARROWRIGHT: \"right\",\n ARROWUP: \"up\",\n CMD: \"meta\",\n COMMAND: \"meta\",\n CONTROL: \"ctrl\",\n DEL: \"delete\",\n ENTER: \"enter\",\n ESC: \"escape\",\n OPTION: \"alt\",\n RETURN: \"enter\",\n };\n return aliases[key] ?? key.toLowerCase();\n}\n\nfunction isContentWindow(window) {\n const identity = `${window.app_name ?? \"\"}\\n${window.title ?? \"\"}`.toLowerCase();\n return (\n window.width >= 200 &&\n window.height >= 100 &&\n !identity.includes(\"xfce4-panel\") &&\n !identity.includes(\"xfdesktop\") &&\n window.title !== \"Desktop\"\n );\n}\n\nfunction formatState(groundingWindow, pointer, elements) {\n const lines = [\n groundingWindow === undefined\n ? \"grounding_window\\t(none)\"\n : `grounding_window\\t${groundingWindow.title} pid=${groundingWindow.pid} window_id=${groundingWindow.window_id}`,\n `pointer\\tx=${pointer.x ?? \"unknown\"} y=${pointer.y ?? \"unknown\"}`,\n \"accessibility_elements\",\n ];\n\n for (const element of elements) {\n const frame =\n element.frame === undefined\n ? \"\"\n : ` x=${element.frame.x} y=${element.frame.y} width=${element.frame.w} height=${element.frame.h}`;\n lines.push(\n `[${element.element_index}] role=${element.role}${frame} label=${JSON.stringify(element.label ?? \"\")}`,\n );\n }\n return lines.join(\"\\n\");\n}\n\nfunction validateActionCoordinates(action) {\n const screen = x11ScreenSize();\n const points = [];\n if ([\"click\", \"double_click\", \"triple_click\", \"move\", \"scroll\"].includes(action.action)) {\n points.push({ x: action.x, y: action.y });\n }\n if (action.action === \"drag\") points.push(...action.path);\n for (const point of points) {\n if (\n !Number.isFinite(point.x) ||\n !Number.isFinite(point.y) ||\n point.x < 0 ||\n point.y < 0 ||\n point.x >= screen.width ||\n point.y >= screen.height\n ) {\n throw new Error(\n `computer-use coordinate is outside the ${screen.width}x${screen.height} desktop`,\n );\n }\n }\n}\n\nfunction validateRequest(input) {\n if (typeof input !== \"object\" || input === null) {\n throw new Error(\"request must be an object\");\n }\n if (!isArtifactPath(input.screenshotPath, \".png\")) {\n throw new Error(\"screenshot path must be a PNG under the computer-use workspace\");\n }\n if (typeof input.action !== \"object\" || input.action === null) {\n throw new Error(\"request action must be an object\");\n }\n const actions = new Set([\n \"arrange_windows\",\n \"click\",\n \"clipboard_read\",\n \"clipboard_write\",\n \"double_click\",\n \"drag\",\n \"keypress\",\n \"move\",\n \"record_start\",\n \"record_stop\",\n \"screenshot\",\n \"scroll\",\n \"sequence\",\n \"triple_click\",\n \"type\",\n \"wait\",\n ]);\n if (!actions.has(input.action.action)) {\n throw new Error(`unsupported computer-use action: ${String(input.action.action)}`);\n }\n if (input.action.action === \"sequence\") {\n if (\n !Array.isArray(input.action.actions) ||\n input.action.actions.length < 1 ||\n input.action.actions.length > 30\n ) {\n throw new Error(\"sequence must contain 1 to 30 actions\");\n }\n for (const action of input.action.actions) validateNestedSequenceAction(action);\n }\n if (input.action.action === \"arrange_windows\") validateArrangeWindowsAction(input.action);\n if (input.action.action === \"record_start\" && !isArtifactPath(input.action.path, \".mp4\")) {\n throw new Error(\"recording path must be an MP4 under the computer-use workspace\");\n }\n if (\n [\"click\", \"double_click\", \"triple_click\", \"drag\", \"move\"].includes(input.action.action) &&\n \"durationMs\" in input.action &&\n (!Number.isInteger(input.action.durationMs) ||\n input.action.durationMs < 0 ||\n input.action.durationMs > 2000)\n ) {\n throw new Error(\"pointer durationMs must be an integer from 0 to 2000\");\n }\n validateMovementStyle(input.action, \"\");\n if (\n input.action.action === \"wait\" &&\n (!Number.isInteger(input.action.durationMs) ||\n input.action.durationMs < 100 ||\n input.action.durationMs > 10_000)\n ) {\n throw new Error(\"wait durationMs must be an integer from 100 to 10000\");\n }\n validateClipboardOptions(input.action);\n validateTypingOptions(input.action, \"\");\n validateTypingBudget(input.action.action === \"sequence\" ? input.action.actions : [input.action]);\n}\n\nfunction validateNestedSequenceAction(action) {\n if (typeof action !== \"object\" || action === null)\n throw new Error(\"sequence action must be an object\");\n const allowed = new Set([\n \"arrange_windows\",\n \"click\",\n \"double_click\",\n \"drag\",\n \"keypress\",\n \"move\",\n \"record_start\",\n \"record_stop\",\n \"triple_click\",\n \"type\",\n \"wait\",\n ]);\n if (!allowed.has(action.action))\n throw new Error(`unsupported sequence action: ${String(action.action)}`);\n if (action.action === \"arrange_windows\") validateArrangeWindowsAction(action);\n if (action.action === \"record_start\" && !isArtifactPath(action.path, \".mp4\")) {\n throw new Error(\"sequence recording path must be an MP4 under the computer-use workspace\");\n }\n if (\n [\"click\", \"double_click\", \"triple_click\", \"drag\", \"move\"].includes(action.action) &&\n \"durationMs\" in action &&\n (!Number.isInteger(action.durationMs) || action.durationMs < 0 || action.durationMs > 2000)\n ) {\n throw new Error(\"sequence pointer durationMs must be an integer from 0 to 2000\");\n }\n validateMovementStyle(action, \"sequence \");\n if (\n action.action === \"wait\" &&\n (!Number.isInteger(action.durationMs) || action.durationMs < 100 || action.durationMs > 10_000)\n ) {\n throw new Error(\"sequence wait durationMs must be an integer from 100 to 10000\");\n }\n if (action.action === \"type\") validateTypingOptions(action, \"sequence \");\n}\n\nfunction validateMovementStyle(action, prefix) {\n if (\n \"movementStyle\" in action &&\n action.movementStyle !== \"natural\" &&\n action.movementStyle !== \"precision\"\n ) {\n throw new Error(`${prefix}movementStyle must be natural or precision`);\n }\n if (\n action.action === \"drag\" &&\n \"movementStyle\" in action &&\n action.movementStyle !== \"precision\"\n ) {\n throw new Error(`${prefix}drag movementStyle must be precision`);\n }\n}\n\nfunction validateClipboardOptions(action) {\n if (\n [\"clipboard_read\", \"clipboard_write\"].includes(action.action) &&\n action.selection !== \"clipboard\" &&\n action.selection !== \"primary\"\n ) {\n throw new Error(\"clipboard selection must be clipboard or primary\");\n }\n if (\n action.action === \"clipboard_write\" &&\n (typeof action.text !== \"string\" || Buffer.byteLength(action.text) > maxClipboardBytes)\n ) {\n throw new Error(`clipboard text must be at most ${maxClipboardBytes} bytes`);\n }\n}\n\nfunction validateTypingOptions(action, prefix) {\n if (\n \"typingDelayMs\" in action &&\n (!Number.isInteger(action.typingDelayMs) ||\n action.typingDelayMs < 0 ||\n action.typingDelayMs > 200)\n ) {\n throw new Error(`${prefix}typingDelayMs must be an integer from 0 to 200`);\n }\n if (\"typingStyle\" in action && action.typingStyle !== \"natural\") {\n throw new Error(`${prefix}typingStyle must be natural`);\n }\n if (\"typingStyle\" in action && \"typingDelayMs\" in action) {\n throw new Error(`${prefix}type action cannot set both typingStyle and typingDelayMs`);\n }\n}\n\nfunction validateArrangeWindowsAction(action) {\n if (!Number.isInteger(action.waitForMs) || action.waitForMs < 0 || action.waitForMs > 10_000) {\n throw new Error(\"arrange_windows waitForMs must be an integer from 0 to 10000\");\n }\n validateWindowScene(action.windows);\n}\n\nfunction isArtifactPath(value, extension) {\n if (typeof value !== \"string\" || !value.endsWith(extension)) return false;\n const path = resolve(value);\n return dirname(path) === workspaceRoot;\n}\n\nasync function readBody(request) {\n let body = \"\";\n for await (const chunk of request) {\n body += chunk;\n if (Buffer.byteLength(body) > maxRequestBytes) {\n throw new Error(\"request exceeds 32 KiB\");\n }\n }\n return body;\n}\n\nfunction sendJson(response, statusCode, body) {\n if (response.destroyed) return;\n const json = JSON.stringify(body);\n response.writeHead(statusCode, {\n \"content-length\": Buffer.byteLength(json),\n \"content-type\": \"application/json\",\n });\n response.end(json);\n}\n";
9
7
  readonly "client.mjs": "import http from \"node:http\";\nimport { env } from \"node:process\";\n\nconst socketPath = env.COMPUTER_USE_SOCKET_PATH;\nconst body = env.COMPUTER_USE_REQUEST;\n\nif (body === undefined) {\n throw new Error(\"COMPUTER_USE_REQUEST is required\");\n}\n\nconst deadline = Date.now() + 120_000;\nconst response = await new Promise((resolve, reject) => {\n const request = http.request(\n {\n socketPath,\n method: \"POST\",\n path: \"/call\",\n headers: {\n \"content-length\": Buffer.byteLength(body),\n \"content-type\": \"application/json\",\n \"x-computer-use-deadline\": String(deadline),\n },\n },\n (incoming) => {\n incoming.on(\"error\", reject);\n incoming.setEncoding(\"utf8\");\n let responseBody = \"\";\n incoming.on(\"data\", (chunk) => {\n responseBody += chunk;\n });\n incoming.on(\"end\", () => {\n resolve({ body: responseBody, statusCode: incoming.statusCode ?? 500 });\n });\n },\n );\n const timer = setTimeout(\n () => request.destroy(new Error(\"computer-use request deadline exceeded\")),\n Math.max(0, deadline - Date.now()),\n );\n request.once(\"close\", () => clearTimeout(timer));\n request.on(\"error\", reject);\n request.end(body);\n});\n\nif (response.statusCode !== 200) {\n process.stderr.write(response.body);\n process.exitCode = 1;\n} else {\n process.stdout.write(response.body);\n}\n";
@@ -1090,61 +1090,6 @@ if (response.statusCode !== 200) {
1090
1090
  } else {
1091
1091
  process.stdout.write(response.body);
1092
1092
  }
1093
- `,STATE_MJS_SOURCE=`const MAX_GROUNDING_ELEMENTS = 80;
1094
-
1095
- /**
1096
- * @typedef {{
1097
- * element_index?: number;
1098
- * frame?: { h?: number; w?: number; x?: number; y?: number };
1099
- * label?: unknown;
1100
- * [key: string]: unknown;
1101
- * }} GroundingElement
1102
- */
1103
-
1104
- /**
1105
- * Keep the model-facing state aligned with the visible desktop screenshot.
1106
- *
1107
- * @param {unknown[]} elements
1108
- * @returns {GroundingElement[]}
1109
- */
1110
- export function selectGroundingElements(elements, screen = { width: 1920, height: 1080 }) {
1111
- return elements
1112
- .filter((element) => isVisibleLabeledElement(element, screen))
1113
- .slice(0, MAX_GROUNDING_ELEMENTS);
1114
- }
1115
-
1116
- /**
1117
- * @param {unknown} value
1118
- * @returns {value is GroundingElement}
1119
- */
1120
- function isVisibleLabeledElement(value, screen) {
1121
- if (typeof value !== "object" || value === null) return false;
1122
- const element = /** @type {GroundingElement} */ (value);
1123
- const frame = element.frame;
1124
- if (typeof element.label !== "string" || element.label.trim().length === 0) return false;
1125
- if (typeof frame !== "object" || frame === null) return false;
1126
- if (
1127
- !Number.isFinite(frame.x) ||
1128
- !Number.isFinite(frame.y) ||
1129
- !Number.isFinite(frame.w) ||
1130
- !Number.isFinite(frame.h)
1131
- ) {
1132
- return false;
1133
- }
1134
-
1135
- const x = /** @type {number} */ (frame.x);
1136
- const y = /** @type {number} */ (frame.y);
1137
- const width = /** @type {number} */ (frame.w);
1138
- const height = /** @type {number} */ (frame.h);
1139
- return (
1140
- width > 0 &&
1141
- height > 0 &&
1142
- x < screen.width &&
1143
- y < screen.height &&
1144
- x + width > 0 &&
1145
- y + height > 0
1146
- );
1147
- }
1148
1093
  `,TYPING_MJS_SOURCE=`const DEMO_TYPING_SPEED = 1.2;
1149
1094
  const MIN_DELAY_MS = 35;
1150
1095
  const MAX_DELAY_MS = 220;
@@ -1298,7 +1243,62 @@ function deterministicUnit(start, end, salt) {
1298
1243
  value ^= value << 5;
1299
1244
  return (value >>> 0) / 0x1_0000_0000;
1300
1245
  }
1301
- `,PACKAGE_JSON_SOURCE=`{
1246
+ `,COMPUTER_USE_DRIVER_SOURCES={"server.mjs":SERVER_MJS_SOURCE,"client.mjs":CLIENT_MJS_SOURCE,"state.mjs":`const MAX_GROUNDING_ELEMENTS = 80;
1247
+
1248
+ /**
1249
+ * @typedef {{
1250
+ * element_index?: number;
1251
+ * frame?: { h?: number; w?: number; x?: number; y?: number };
1252
+ * label?: unknown;
1253
+ * [key: string]: unknown;
1254
+ * }} GroundingElement
1255
+ */
1256
+
1257
+ /**
1258
+ * Keep the model-facing state aligned with the visible desktop screenshot.
1259
+ *
1260
+ * @param {unknown[]} elements
1261
+ * @returns {GroundingElement[]}
1262
+ */
1263
+ export function selectGroundingElements(elements, screen = { width: 1920, height: 1080 }) {
1264
+ return elements
1265
+ .filter((element) => isVisibleLabeledElement(element, screen))
1266
+ .slice(0, MAX_GROUNDING_ELEMENTS);
1267
+ }
1268
+
1269
+ /**
1270
+ * @param {unknown} value
1271
+ * @returns {value is GroundingElement}
1272
+ */
1273
+ function isVisibleLabeledElement(value, screen) {
1274
+ if (typeof value !== "object" || value === null) return false;
1275
+ const element = /** @type {GroundingElement} */ (value);
1276
+ const frame = element.frame;
1277
+ if (typeof element.label !== "string" || element.label.trim().length === 0) return false;
1278
+ if (typeof frame !== "object" || frame === null) return false;
1279
+ if (
1280
+ !Number.isFinite(frame.x) ||
1281
+ !Number.isFinite(frame.y) ||
1282
+ !Number.isFinite(frame.w) ||
1283
+ !Number.isFinite(frame.h)
1284
+ ) {
1285
+ return false;
1286
+ }
1287
+
1288
+ const x = /** @type {number} */ (frame.x);
1289
+ const y = /** @type {number} */ (frame.y);
1290
+ const width = /** @type {number} */ (frame.w);
1291
+ const height = /** @type {number} */ (frame.h);
1292
+ return (
1293
+ width > 0 &&
1294
+ height > 0 &&
1295
+ x < screen.width &&
1296
+ y < screen.height &&
1297
+ x + width > 0 &&
1298
+ y + height > 0
1299
+ );
1300
+ }
1301
+ `,"typing.mjs":TYPING_MJS_SOURCE,"pointer-motion.mjs":POINTER_MOTION_MJS_SOURCE,"package.json":`{
1302
1302
  "name": "computer-use-driver",
1303
1303
  "private": true,
1304
1304
  "type": "module",
@@ -1306,4 +1306,4 @@ function deterministicUnit(start, end, salt) {
1306
1306
  "@trycua/cua-driver": "0.12.5"
1307
1307
  }
1308
1308
  }
1309
- `,COMPUTER_USE_DRIVER_SOURCES={"server.mjs":SERVER_MJS_SOURCE,"client.mjs":CLIENT_MJS_SOURCE,"state.mjs":STATE_MJS_SOURCE,"typing.mjs":TYPING_MJS_SOURCE,"pointer-motion.mjs":POINTER_MOTION_MJS_SOURCE,"package.json":PACKAGE_JSON_SOURCE};export{CLIENT_MJS_SOURCE,COMPUTER_USE_DRIVER_SOURCES,PACKAGE_JSON_SOURCE,POINTER_MOTION_MJS_SOURCE,SERVER_MJS_SOURCE,STATE_MJS_SOURCE,TYPING_MJS_SOURCE};
1309
+ `};export{CLIENT_MJS_SOURCE,COMPUTER_USE_DRIVER_SOURCES,POINTER_MOTION_MJS_SOURCE,SERVER_MJS_SOURCE,TYPING_MJS_SOURCE};
@@ -1,4 +1,4 @@
1
- import{shellQuote}from"./shell.js";import{commandFailureDetail}from"./command-failure.js";import{COMPUTER_USE_DRIVER_SOURCES}from"./computer-use-driver-source.js";import{computerUseDisplayCommand,computerUseDriverStartCommand,computerUsePaths}from"./computer-use.js";const COMPUTER_USE_REVALIDATION_KEY=`computer-use:0.12.5:2026-09-17.1`;async function installComputerUse(e){let t=computerUsePaths(e),n=e.resolvePath(`.eve-code/install-computer-use.sh`);await e.run({command:`mkdir -p ${shellQuote(t.driverRoot)}`}),await Promise.all([...Object.entries(COMPUTER_USE_DRIVER_SOURCES).map(([n,r])=>e.writeTextFile({path:`${t.driverRoot}/${n}`,content:r})),e.writeTextFile({path:n,content:computerUseInstallScript(e)})]);let r=await e.run({command:[`set -e`,`if [ "$(id -u)" = 0 ]; then`,` bash ${shellQuote(n)}`,`elif command -v sudo >/dev/null 2>&1; then`,` sudo -n bash ${shellQuote(n)}`,`else`,` echo 'computer-use requires an apt-based sandbox image with root or passwordless sudo' >&2`,` exit 1`,`fi`].join(`
1
+ import{commandFailureDetail}from"./command-failure.js";import{COMPUTER_USE_DRIVER_SOURCES}from"./computer-use-driver-source.js";import{shellQuote}from"./shell.js";import{computerUseDisplayCommand,computerUseDriverStartCommand,computerUsePaths}from"./computer-use.js";const COMPUTER_USE_REVALIDATION_KEY=`computer-use:0.12.5:2026-09-17.1`;async function installComputerUse(e){let t=computerUsePaths(e),n=e.resolvePath(`.eve-code/install-computer-use.sh`);await e.run({command:`mkdir -p ${shellQuote(t.driverRoot)}`}),await Promise.all([...Object.entries(COMPUTER_USE_DRIVER_SOURCES).map(([n,r])=>e.writeTextFile({path:`${t.driverRoot}/${n}`,content:r})),e.writeTextFile({path:n,content:computerUseInstallScript(e)})]);let r=await e.run({command:[`set -e`,`if [ "$(id -u)" = 0 ]; then`,` bash ${shellQuote(n)}`,`elif command -v sudo >/dev/null 2>&1; then`,` sudo -n bash ${shellQuote(n)}`,`else`,` echo 'computer-use requires an apt-based sandbox image with root or passwordless sudo' >&2`,` exit 1`,`fi`].join(`
2
2
  `)});if(r.exitCode!==0)throw Error(`computer-use installation failed (exit ${r.exitCode}): ${commandFailureDetail(r)}`)}async function startComputerUse(e){let t={TERM:`xterm-256color`},n=await e.run({command:computerUseDisplayCommand(e),env:t});if(n.exitCode!==0)throw Error(`computer-use display startup failed (exit ${n.exitCode}): ${commandFailureDetail(n)}`);let r=await e.run({command:computerUseDriverStartCommand(e),env:t});if(r.exitCode!==0)throw Error(`computer-use driver startup failed (exit ${r.exitCode}): ${commandFailureDetail(r)}`)}function computerUseInstallScript(e){let t=computerUsePaths(e);return`#!/usr/bin/env bash
3
3
  set -euo pipefail
4
4
 
@@ -19,7 +19,7 @@ type LaunchAction = {
19
19
  type DriverAction = {
20
20
  action: string;
21
21
  } & Record<string, unknown>;
22
- export interface ComputerUseDriverRequest {
22
+ interface ComputerUseDriverRequest {
23
23
  action: DriverAction;
24
24
  screenshotPath: string;
25
25
  }
@@ -0,0 +1 @@
1
+ export { COMPUTER_USE_REVALIDATION_KEY, installComputerUse, startComputerUse, } from "./computer-use-sandbox.ts";
@@ -0,0 +1 @@
1
+ import{COMPUTER_USE_REVALIDATION_KEY,installComputerUse,startComputerUse}from"./computer-use-sandbox.js";export{COMPUTER_USE_REVALIDATION_KEY,installComputerUse,startComputerUse};
@@ -0,0 +1 @@
1
+ export declare function shellQuote(value: string): string;
@@ -0,0 +1 @@
1
+ function shellQuote(e){return`'${e.replaceAll(`'`,`'"'"'`)}'`}export{shellQuote};
@@ -0,0 +1 @@
1
+ export { default as computer_use } from "./extension/tools/computer_use.ts";
@@ -0,0 +1 @@
1
+ import computer_use_default from"./extension/tools/computer_use.js";export{computer_use_default as computer_use};
@@ -1,7 +1,7 @@
1
1
  import type { SessionContext } from "#context/session-context.js";
2
2
  import type { ToolExecuteOptions } from "#tools/definition.js";
3
3
  /** Base context shared by tool executors. */
4
- export type BaseToolContext = SessionContext & {
4
+ type BaseToolContext = SessionContext & {
5
5
  readonly abortSignal: AbortSignal;
6
6
  readonly callId: string;
7
7
  readonly toolName: string;
@@ -11,3 +11,4 @@ export declare function buildBaseToolContext(input: {
11
11
  readonly options: Pick<ToolExecuteOptions, "abortSignal" | "toolCallId">;
12
12
  readonly toolName: string;
13
13
  }): BaseToolContext;
14
+ export {};
@@ -1,13 +1,9 @@
1
1
  import type { ModelMessage } from "ai";
2
2
  import { type AlsContext } from "#context/container.js";
3
- import { type CurrentDynamicToolMetadata } from "#context/dynamic-tool-metadata.js";
4
- import type { HarnessToolDefinition } from "#harness/execute-tool.js";
5
3
  import type { SessionStartedStreamEvent, StepStartedStreamEvent, UnstampedMessageStreamEvent } from "#protocol/message.js";
6
4
  import { type DynamicToolEntry } from "#tools/dynamic.js";
7
5
  import { type DynamicToolCallbackOwner, type DurableDynamicToolCallbacks } from "#tools/durable-callbacks.js";
8
6
  import type { ResolvedDynamicToolResolver } from "#runtime/types.js";
9
- /** Kept as the session-specific entry point for existing runtime consumers. */
10
- export declare function replayDynamicSessionTools(metadata: readonly CurrentDynamicToolMetadata[], _resolvers: readonly ResolvedDynamicToolResolver[], sessionId: string): readonly HarnessToolDefinition[];
11
7
  export declare function validateDurableDynamicToolCallbacks(name: string, entry: DynamicToolEntry, owner: DynamicToolCallbackOwner): DurableDynamicToolCallbacks;
12
8
  /** Resolves step-scoped tools once for one internal policy/model pass. */
13
9
  export declare function resolveStepDynamicTools(input: {
@@ -41,7 +37,7 @@ export declare function refreshDynamicSessionToolsForRuntimeRevision(input: {
41
37
  readonly messages: readonly ModelMessage[];
42
38
  readonly runtimeRevision: string;
43
39
  }): Promise<void>;
44
- /** Re-registers callbacks for compiled resolvers that explicitly support cold replay. */
40
+ /** Re-registers missing callbacks while preserving the active turn's persisted tool set. */
45
41
  export declare function rebindMissingCompiledDynamicToolCallbacks(input: {
46
42
  readonly ctx: AlsContext;
47
43
  readonly event: UnstampedMessageStreamEvent;
@@ -1 +1 @@
1
- import{createLogger}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{SessionDynamicToolMetadataKey,SessionDynamicToolRuntimeRevisionKey,SessionIdKey,StepDynamicToolMetadataKey,TurnDynamicToolMetadataKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{parseJsonObject}from"#shared/json.js";import{serializeInputSchema,serializeOutputSchema}from"#tools/schema.js";import{ALLOWED_DYNAMIC_TOOL_EVENTS}from"#dynamic/definition.js";import{isCurrentDynamicToolMetadata,toCurrentDynamicToolMetadataList}from"#context/dynamic-tool-metadata.js";import{clearDurableDynamicCallbacks,hasUnregisteredDurableDynamicCallbacks,readDurableDynamicToolCallbacks,registerDurableDynamicCallback}from"#tools/durable-callbacks.js";import{hasSchemaValidator}from"#tools/durable-schema.js";import{buildResolveContext}from"#context/dynamic-resolve-context.js";import{isWorkflowToolDefinition}from"#tools/workflow-definition.js";import{replayDynamicTools}from"#context/build-dynamic-tools.js";import{isBrandedToolEntry}from"#tools/dynamic.js";const log=createLogger(`dynamic-tools`);function qualifyDynamicToolNames(e,t,n){let r=Object.keys(n);if(r.length===0)return[];if(t){let t=r[0];return[{name:e.slug,entryKey:t,entry:n[t]}]}let i=e.extensionNamespace===void 0?``:`${e.extensionNamespace}__`;return r.map(e=>({entry:n[e],entryKey:e,name:`${i}${e}`}))}function replayDynamicSessionTools(e,t,n){return replayDynamicTools(e,{sessionId:n,scope:`session`})}function durableKeyForEvent(e){switch(e){case`session.started`:return SessionDynamicToolMetadataKey;case`turn.started`:return TurnDynamicToolMetadataKey;case`step.started`:return StepDynamicToolMetadataKey;default:return}}function readDynamicToolResult(e,t){let assertOrdinaryTool=t=>{if(isWorkflowToolDefinition(t))throw Error(`Dynamic tool resolver "${e.logicalPath}" cannot return defineWorkflowTool(). Workflow tools must be static tools; use defineTool() for dynamic entries.`)};if(assertOrdinaryTool(t),isBrandedToolEntry(t))return{entries:{_single:t},isSingle:!0};if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`Dynamic tool resolver "${e.logicalPath}" must return defineTool(), a map of defineTool() values, or null.`);let n={};for(let[r,i]of Object.entries(t)){if(assertOrdinaryTool(i),!isBrandedToolEntry(i))throw Error(`Dynamic tool resolver "${e.logicalPath}" returned "${r}" without defineTool(). Wrap every dynamic tool entry in defineTool().`);n[r]=i}return{entries:n,isSingle:!1}}function validateReference(e){let t=e.phase===`inputSchema`||e.phase===`outputSchema`,n=t?`Write the schema expression inline in defineTool() or use defineDurableSchema() for a provider package.`:`Author the callback inline in transformed source or use an eve durable callback helper.`;if(e.stamped===void 0){if(e.required)throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" does not have a durable descriptor. `+n);return}let r=Object.keys(e.stamped).filter(e=>e!==`closure`&&e!==`callback`);if(r.includes(`stepId`))throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" was persisted by a pre-release eve version that identified callbacks by build offset. Start a new session to re-resolve it.`);if(r.length>0)throw Error(`Dynamic tool "${e.name}" has invalid ${e.phase} callback metadata: unknown key(s) ${r.join(`, `)}.`);if(typeof e.stamped.callback!=`function`)throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" does not have a durable descriptor. `+n);let i;try{i=parseJsonObject(e.stamped.closure)}catch(n){throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" has a non-serializable capture. ${toErrorMessage(n)}`+(t?` Inline the schema construction or reference a stable module-level schema; put only JSON data in its closure.`:``))}return registerDurableDynamicCallback({callback:e.stamped.callback,phase:e.phase,owner:e.owner}),{closure:i}}function validateDurableDynamicToolCallbacks(e,t,n){let r=readDurableDynamicToolCallbacks(t)??{},i=Object.keys(r).filter(e=>e!==`execute`&&e!==`inputSchema`&&e!==`outputSchema`&&e!==`label`&&e!==`approvalKey`&&e!==`approvalRequest`&&e!==`approvalResponse`&&e!==`toModelOutput`);if(i.length>0)throw Error(`Dynamic tool "${e}" has unknown durable callback phase(s): ${i.join(`, `)}.`);let a=t.approval!==void 0,o=t.approval!==void 0&&typeof t.approval!=`function`&&t.approval.response!==void 0,s=validateReference({name:e,owner:n,phase:`execute`,stamped:r.execute,required:!0}),c=validateReference({name:e,owner:n,phase:`labelComplete`,stamped:r.label?.complete,required:!1}),l=validateReference({name:e,owner:n,phase:`labelDelta`,stamped:r.label?.delta,required:!1}),u=validateReference({name:e,owner:n,phase:`labelStart`,stamped:r.label?.start,required:!1}),d=validateReference({name:e,owner:n,phase:`approvalKey`,stamped:r.approvalKey,required:t.approvalKey!==void 0}),f=validateReference({name:e,owner:n,phase:`approvalRequest`,stamped:r.approvalRequest,required:a}),p=validateReference({name:e,owner:n,phase:`approvalResponse`,stamped:r.approvalResponse,required:o}),m=validateReference({name:e,owner:n,phase:`toModelOutput`,stamped:r.toModelOutput,required:t.toModelOutput!==void 0}),h=validateReference({name:e,owner:n,phase:`inputSchema`,stamped:r.inputSchema,required:hasSchemaValidator(t.inputSchema)}),g=validateReference({name:e,owner:n,phase:`outputSchema`,stamped:r.outputSchema,required:hasSchemaValidator(t.outputSchema)}),_={execute:s};return h!==void 0&&(_.inputSchema=h),g!==void 0&&(_.outputSchema=g),(c!==void 0||l!==void 0||u!==void 0)&&(_.label={complete:c,delta:l,start:u}),d!==void 0&&(_.approvalKey=d),f!==void 0&&(_.approvalRequest=f),p!==void 0&&(_.approvalResponse=p),m!==void 0&&(_.toModelOutput=m),_}function createMetadata(e){return{availableInSubagents:e.entry.availableInSubagents,callbacks:validateDurableDynamicToolCallbacks(e.name,e.entry,{sessionId:e.sessionId,scope:e.scope,resolverSlug:e.resolver.slug,entryKey:e.entryKey,name:e.name}),description:e.entry.description,entryKey:e.entryKey,inputSchema:serializeInputSchema(e.entry.inputSchema),name:e.name,outputSchema:serializeOutputSchema(e.entry.outputSchema),resolverSlug:e.resolver.slug}}async function resolveToolsFromEvent(e,t,n,r){let i=e.require(SessionIdKey),a=n.type.split(`.`)[0],o=await Promise.allSettled(t.map(async t=>{let o=t.events[n.type];if(o===void 0)return null;clearDurableDynamicCallbacks(i,{scope:a,resolverSlug:t.slug});try{let s=await o(n,buildResolveContext(e,r));if(s==null)return null;let{entries:c,isSingle:l}=readDynamicToolResult(t,s);return{metadata:qualifyDynamicToolNames(t,l,c).map(({name:e,entryKey:n,entry:r})=>createMetadata({entry:r,entryKey:n,name:e,resolver:t,sessionId:i,scope:a})),resolver:t}}catch(e){throw clearDurableDynamicCallbacks(i,{scope:a,resolverSlug:t.slug}),e}})),s=[],c=new Map;for(let e of o){if(e.status===`rejected`){log.error(`Dynamic tool resolver (${n.type}) failed — skipping its complete result.`,{error:toErrorMessage(e.reason)});continue}if(e.value!==null){for(let t of e.value.metadata){let n=c.get(t.name);if(n!==void 0&&n!==e.value.resolver.slug)throw Error(`Dynamic tool "${t.name}" from resolver "${e.value.resolver.slug}" collides with dynamic resolver "${n}". Namespace the map key manually.`);c.set(t.name,e.value.resolver.slug)}s.push(...e.value.metadata)}}return{metadata:s}}const resolvedStepTools=new WeakMap;function stepCoordinate(e){return`${e.data.turnId}:${String(e.data.stepIndex)}`}function storeResolvedStepTools(e){e.ctx.set(StepDynamicToolMetadataKey,e.metadata);let t=stepCoordinate(e.event);resolvedStepTools.set(e.ctx,{coordinate:t,metadata:e.metadata})}async function resolveStepDynamicTools(e){let t=stepCoordinate(e.event),n=resolvedStepTools.get(e.ctx);if(n?.coordinate===t){e.ctx.set(StepDynamicToolMetadataKey,n.metadata);return}let r=e.resolvers.filter(e=>e.eventNames.includes(`step.started`)),{metadata:i}=r.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,r,e.event,e.messages);storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:i})}async function preparePersistedStepDynamicToolMetadata(e){let t=e.ctx.get(StepDynamicToolMetadataKey)??[],n=t.filter(isCurrentDynamicToolMetadata);if(n.length===t.length&&!hasUnregisteredDurableDynamicCallbacks(n,{sessionId:e.ctx.require(SessionIdKey),scope:`step`})){n.length>0&&storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:n});return}await resolveStepDynamicTools(e);let r=e.ctx.get(StepDynamicToolMetadataKey)??[];storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:toCurrentDynamicToolMetadataList(t,r.filter(isCurrentDynamicToolMetadata))})}async function dispatchDynamicToolEvent(e){if(e.event.type===`session.completed`){let t=e.ctx.get(SessionIdKey);t!==void 0&&clearDurableDynamicCallbacks(t);return}if(!ALLOWED_DYNAMIC_TOOL_EVENTS.has(e.event.type))return;if(e.event.type===`step.started`){await resolveStepDynamicTools({...e,event:e.event});return}e.event.type===`turn.started`&&e.ctx.set(StepDynamicToolMetadataKey,[]);let t=e.resolvers.filter(t=>t.eventNames.includes(e.event.type)),{metadata:n}=t.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,t,e.event,e.messages),r=durableKeyForEvent(e.event.type);if(r===void 0)return;if(e.event.type===`session.started`){e.ctx.set(SessionDynamicToolMetadataKey,n);return}let i=new Set(t.map(e=>e.slug)),a=(e.ctx.get(r)??[]).filter(e=>!i.has(e.resolverSlug));e.ctx.set(r,[...a,...n])}async function refreshDynamicSessionToolsForRuntimeRevision(e){let t=e.ctx.get(SessionDynamicToolMetadataKey)??[],n=t.filter(isCurrentDynamicToolMetadata),r=n.length!==t.length,i=e.ctx.get(SessionDynamicToolRuntimeRevisionKey)!==e.runtimeRevision;if(!i&&!r&&!hasUnregisteredDurableDynamicCallbacks(n,{sessionId:e.ctx.require(SessionIdKey),scope:`session`}))return;let a=e.resolvers.filter(e=>e.eventNames.includes(`session.started`)),{metadata:o}=a.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,a,e.event,e.messages);e.ctx.set(SessionDynamicToolMetadataKey,i?o:toCurrentDynamicToolMetadataList(t,o)),e.ctx.set(SessionDynamicToolRuntimeRevisionKey,e.runtimeRevision)}async function rebindMissingCompiledDynamicToolCallbacks(e){let t=e.ctx.get(TurnDynamicToolMetadataKey)??[],n=t.filter(t=>!isCurrentDynamicToolMetadata(t)||hasUnregisteredDurableDynamicCallbacks([t],{sessionId:e.ctx.require(SessionIdKey),scope:`turn`}));if(n.length===0)return;let r=new Set(n.map(e=>e.resolverSlug)),i=new Set(t.filter(e=>!isCurrentDynamicToolMetadata(e)).map(e=>e.resolverSlug)),a=e.resolvers.filter(e=>r.has(e.slug)&&(i.has(e.slug)||e.rebindMissingCallbacks===!0));if(a.length===0){e.ctx.set(TurnDynamicToolMetadataKey,toCurrentDynamicToolMetadataList(t));return}let o=await contextStorage.run(e.ctx,async()=>await resolveToolsFromEvent(e.ctx,a,e.event,e.messages)),s=toCurrentDynamicToolMetadataList(t,o.metadata);e.ctx.set(TurnDynamicToolMetadataKey,s);let c=s.filter(t=>n.some(e=>e.resolverSlug===t.resolverSlug&&e.name===t.name)&&hasUnregisteredDurableDynamicCallbacks([t],{sessionId:e.ctx.require(SessionIdKey),scope:`turn`}));if(c.length>0)throw Error(`Dynamic tool callback rebind did not restore: ${c.map(e=>e.name).join(`, `)}. The tool may have been renamed or removed.`)}export{dispatchDynamicToolEvent,preparePersistedStepDynamicToolMetadata,rebindMissingCompiledDynamicToolCallbacks,refreshDynamicSessionToolsForRuntimeRevision,replayDynamicSessionTools,resolveStepDynamicTools,validateDurableDynamicToolCallbacks};
1
+ import{createLogger}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{SessionDynamicToolMetadataKey,SessionDynamicToolRuntimeRevisionKey,SessionIdKey,StepDynamicToolMetadataKey,TurnDynamicToolMetadataKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{parseJsonObject}from"#shared/json.js";import{serializeInputSchema,serializeOutputSchema}from"#tools/schema.js";import{ALLOWED_DYNAMIC_TOOL_EVENTS}from"#dynamic/definition.js";import{isCurrentDynamicToolMetadata,toCurrentDynamicToolMetadataList}from"#context/dynamic-tool-metadata.js";import{clearDurableDynamicCallbacks,hasUnregisteredDurableDynamicCallbacks,readDurableDynamicToolCallbacks,registerDurableDynamicCallback}from"#tools/durable-callbacks.js";import{hasSchemaValidator}from"#tools/durable-schema.js";import{buildResolveContext}from"#context/dynamic-resolve-context.js";import{isWorkflowToolDefinition}from"#tools/workflow-definition.js";import{isBrandedToolEntry}from"#tools/dynamic.js";const log=createLogger(`dynamic-tools`);function qualifyDynamicToolNames(e,t,n){let r=Object.keys(n);if(r.length===0)return[];if(t){let t=r[0];return[{name:e.slug,entryKey:t,entry:n[t]}]}let i=e.extensionNamespace===void 0?``:`${e.extensionNamespace}__`;return r.map(e=>({entry:n[e],entryKey:e,name:`${i}${e}`}))}function durableKeyForEvent(e){switch(e){case`session.started`:return SessionDynamicToolMetadataKey;case`turn.started`:return TurnDynamicToolMetadataKey;case`step.started`:return StepDynamicToolMetadataKey;default:return}}function readDynamicToolResult(e,t){let assertOrdinaryTool=t=>{if(isWorkflowToolDefinition(t))throw Error(`Dynamic tool resolver "${e.logicalPath}" cannot return defineWorkflowTool(). Workflow tools must be static tools; use defineTool() for dynamic entries.`)};if(assertOrdinaryTool(t),isBrandedToolEntry(t))return{entries:{_single:t},isSingle:!0};if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`Dynamic tool resolver "${e.logicalPath}" must return defineTool(), a map of defineTool() values, or null.`);let n={};for(let[r,i]of Object.entries(t)){if(assertOrdinaryTool(i),!isBrandedToolEntry(i))throw Error(`Dynamic tool resolver "${e.logicalPath}" returned "${r}" without defineTool(). Wrap every dynamic tool entry in defineTool().`);n[r]=i}return{entries:n,isSingle:!1}}function validateReference(e){let t=e.phase===`inputSchema`||e.phase===`outputSchema`,n=t?`Write the schema expression inline in defineTool() or use defineDurableSchema() for a provider package.`:`Author the callback inline in transformed source or use an eve durable callback helper.`;if(e.stamped===void 0){if(e.required)throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" does not have a durable descriptor. `+n);return}let r=Object.keys(e.stamped).filter(e=>e!==`closure`&&e!==`callback`);if(r.includes(`stepId`))throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" was persisted by a pre-release eve version that identified callbacks by build offset. Start a new session to re-resolve it.`);if(r.length>0)throw Error(`Dynamic tool "${e.name}" has invalid ${e.phase} callback metadata: unknown key(s) ${r.join(`, `)}.`);if(typeof e.stamped.callback!=`function`)throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" does not have a durable descriptor. `+n);let i;try{i=parseJsonObject(e.stamped.closure)}catch(n){throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" has a non-serializable capture. ${toErrorMessage(n)}`+(t?` Inline the schema construction or reference a stable module-level schema; put only JSON data in its closure.`:``))}return registerDurableDynamicCallback({callback:e.stamped.callback,phase:e.phase,owner:e.owner}),{closure:i}}function validateDurableDynamicToolCallbacks(e,t,n){let r=readDurableDynamicToolCallbacks(t)??{},i=Object.keys(r).filter(e=>e!==`execute`&&e!==`inputSchema`&&e!==`outputSchema`&&e!==`label`&&e!==`approvalKey`&&e!==`approvalRequest`&&e!==`approvalResponse`&&e!==`toModelOutput`);if(i.length>0)throw Error(`Dynamic tool "${e}" has unknown durable callback phase(s): ${i.join(`, `)}.`);let a=t.approval!==void 0,o=t.approval!==void 0&&typeof t.approval!=`function`&&t.approval.response!==void 0,s=validateReference({name:e,owner:n,phase:`execute`,stamped:r.execute,required:!0}),c=validateReference({name:e,owner:n,phase:`labelComplete`,stamped:r.label?.complete,required:!1}),l=validateReference({name:e,owner:n,phase:`labelDelta`,stamped:r.label?.delta,required:!1}),u=validateReference({name:e,owner:n,phase:`labelStart`,stamped:r.label?.start,required:!1}),d=validateReference({name:e,owner:n,phase:`approvalKey`,stamped:r.approvalKey,required:t.approvalKey!==void 0}),f=validateReference({name:e,owner:n,phase:`approvalRequest`,stamped:r.approvalRequest,required:a}),p=validateReference({name:e,owner:n,phase:`approvalResponse`,stamped:r.approvalResponse,required:o}),m=validateReference({name:e,owner:n,phase:`toModelOutput`,stamped:r.toModelOutput,required:t.toModelOutput!==void 0}),h=validateReference({name:e,owner:n,phase:`inputSchema`,stamped:r.inputSchema,required:hasSchemaValidator(t.inputSchema)}),g=validateReference({name:e,owner:n,phase:`outputSchema`,stamped:r.outputSchema,required:hasSchemaValidator(t.outputSchema)}),_={execute:s};return h!==void 0&&(_.inputSchema=h),g!==void 0&&(_.outputSchema=g),(c!==void 0||l!==void 0||u!==void 0)&&(_.label={complete:c,delta:l,start:u}),d!==void 0&&(_.approvalKey=d),f!==void 0&&(_.approvalRequest=f),p!==void 0&&(_.approvalResponse=p),m!==void 0&&(_.toModelOutput=m),_}function createMetadata(e){return{availableInSubagents:e.entry.availableInSubagents,callbacks:validateDurableDynamicToolCallbacks(e.name,e.entry,{sessionId:e.sessionId,scope:e.scope,resolverSlug:e.resolver.slug,entryKey:e.entryKey,name:e.name}),description:e.entry.description,entryKey:e.entryKey,inputSchema:serializeInputSchema(e.entry.inputSchema),name:e.name,outputSchema:serializeOutputSchema(e.entry.outputSchema),resolverSlug:e.resolver.slug}}async function resolveToolsFromEvent(e,t,n,r){let i=e.require(SessionIdKey),a=n.type.split(`.`)[0],o=await Promise.allSettled(t.map(async t=>{let o=t.events[n.type];if(o===void 0)return null;clearDurableDynamicCallbacks(i,{scope:a,resolverSlug:t.slug});try{let s=await o(n,buildResolveContext(e,r));if(s==null)return null;let{entries:c,isSingle:l}=readDynamicToolResult(t,s);return{metadata:qualifyDynamicToolNames(t,l,c).map(({name:e,entryKey:n,entry:r})=>createMetadata({entry:r,entryKey:n,name:e,resolver:t,sessionId:i,scope:a})),resolver:t}}catch(e){throw clearDurableDynamicCallbacks(i,{scope:a,resolverSlug:t.slug}),e}})),s=[],c=new Map;for(let e of o){if(e.status===`rejected`){log.error(`Dynamic tool resolver (${n.type}) failed — skipping its complete result.`,{error:toErrorMessage(e.reason)});continue}if(e.value!==null){for(let t of e.value.metadata){let n=c.get(t.name);if(n!==void 0&&n!==e.value.resolver.slug)throw Error(`Dynamic tool "${t.name}" from resolver "${e.value.resolver.slug}" collides with dynamic resolver "${n}". Namespace the map key manually.`);c.set(t.name,e.value.resolver.slug)}s.push(...e.value.metadata)}}return{metadata:s}}const resolvedStepTools=new WeakMap;function stepCoordinate(e){return`${e.data.turnId}:${String(e.data.stepIndex)}`}function storeResolvedStepTools(e){e.ctx.set(StepDynamicToolMetadataKey,e.metadata);let t=stepCoordinate(e.event);resolvedStepTools.set(e.ctx,{coordinate:t,metadata:e.metadata})}async function resolveStepDynamicTools(e){let t=stepCoordinate(e.event),n=resolvedStepTools.get(e.ctx);if(n?.coordinate===t){e.ctx.set(StepDynamicToolMetadataKey,n.metadata);return}let r=e.resolvers.filter(e=>e.eventNames.includes(`step.started`)),{metadata:i}=r.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,r,e.event,e.messages);storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:i})}async function preparePersistedStepDynamicToolMetadata(e){let t=e.ctx.get(StepDynamicToolMetadataKey)??[],n=t.filter(isCurrentDynamicToolMetadata);if(n.length===t.length&&!hasUnregisteredDurableDynamicCallbacks(n,{sessionId:e.ctx.require(SessionIdKey),scope:`step`})){n.length>0&&storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:n});return}await resolveStepDynamicTools(e);let r=e.ctx.get(StepDynamicToolMetadataKey)??[];storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:toCurrentDynamicToolMetadataList(t,r.filter(isCurrentDynamicToolMetadata))})}async function dispatchDynamicToolEvent(e){if(e.event.type===`session.completed`){let t=e.ctx.get(SessionIdKey);t!==void 0&&clearDurableDynamicCallbacks(t);return}if(!ALLOWED_DYNAMIC_TOOL_EVENTS.has(e.event.type))return;if(e.event.type===`step.started`){await resolveStepDynamicTools({...e,event:e.event});return}e.event.type===`turn.started`&&e.ctx.set(StepDynamicToolMetadataKey,[]);let t=e.resolvers.filter(t=>t.eventNames.includes(e.event.type)),{metadata:n}=t.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,t,e.event,e.messages),r=durableKeyForEvent(e.event.type);if(r===void 0)return;if(e.event.type===`session.started`){e.ctx.set(SessionDynamicToolMetadataKey,n);return}let i=new Set(t.map(e=>e.slug)),a=(e.ctx.get(r)??[]).filter(e=>!i.has(e.resolverSlug));e.ctx.set(r,[...a,...n])}async function refreshDynamicSessionToolsForRuntimeRevision(e){let t=e.ctx.get(SessionDynamicToolMetadataKey)??[],n=t.filter(isCurrentDynamicToolMetadata),r=n.length!==t.length,i=e.ctx.get(SessionDynamicToolRuntimeRevisionKey)!==e.runtimeRevision;if(!i&&!r&&!hasUnregisteredDurableDynamicCallbacks(n,{sessionId:e.ctx.require(SessionIdKey),scope:`session`}))return;let a=e.resolvers.filter(e=>e.eventNames.includes(`session.started`)),{metadata:o}=a.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,a,e.event,e.messages);e.ctx.set(SessionDynamicToolMetadataKey,i?o:toCurrentDynamicToolMetadataList(t,o)),e.ctx.set(SessionDynamicToolRuntimeRevisionKey,e.runtimeRevision)}async function rebindMissingCompiledDynamicToolCallbacks(e){let t=e.ctx.get(TurnDynamicToolMetadataKey)??[],n=t.filter(t=>!isCurrentDynamicToolMetadata(t)||hasUnregisteredDurableDynamicCallbacks([t],{sessionId:e.ctx.require(SessionIdKey),scope:`turn`}));if(n.length===0)return;let r=new Set(n.map(e=>e.resolverSlug)),i=e.resolvers.filter(e=>r.has(e.slug)),a=new Set(i.filter(e=>e.rebindMissingCallbacks===!0).map(e=>e.slug)),o=new Set(t.filter(e=>!isCurrentDynamicToolMetadata(e)).map(e=>e.resolverSlug));if(i.length===0){e.ctx.set(TurnDynamicToolMetadataKey,toCurrentDynamicToolMetadataList(t));return}let s=await contextStorage.run(e.ctx,async()=>await resolveToolsFromEvent(e.ctx,i,e.event,e.messages)),c=toCurrentDynamicToolMetadataList(t,s.metadata);e.ctx.set(TurnDynamicToolMetadataKey,c);let l=c.filter(t=>(a.has(t.resolverSlug)||o.has(t.resolverSlug))&&n.some(e=>e.resolverSlug===t.resolverSlug&&e.name===t.name)&&hasUnregisteredDurableDynamicCallbacks([t],{sessionId:e.ctx.require(SessionIdKey),scope:`turn`}));if(l.length>0)throw Error(`Dynamic tool callback rebind did not restore: ${l.map(e=>e.name).join(`, `)}. The tool may have been renamed or removed.`)}export{dispatchDynamicToolEvent,preparePersistedStepDynamicToolMetadata,rebindMissingCompiledDynamicToolCallbacks,refreshDynamicSessionToolsForRuntimeRevision,resolveStepDynamicTools,validateDurableDynamicToolCallbacks};
@@ -39,7 +39,6 @@ export type OldDynamicToolMetadata = OldStepFunctionDynamicToolMetadata | OldSou
39
39
  export type PersistedDynamicToolMetadata = CurrentDynamicToolMetadata | OldDynamicToolMetadata;
40
40
  export declare function isOldSourceOffsetDynamicToolMetadata(metadata: PersistedDynamicToolMetadata): metadata is OldSourceOffsetDynamicToolMetadata;
41
41
  export declare function isCurrentDynamicToolMetadata(metadata: PersistedDynamicToolMetadata): metadata is CurrentDynamicToolMetadata;
42
- export declare function isOldStepFunctionDynamicToolMetadata(metadata: PersistedDynamicToolMetadata): metadata is OldStepFunctionDynamicToolMetadata;
43
42
  /** Converts persisted metadata without changing already-persisted callback closures. */
44
43
  export declare function toCurrentDynamicToolMetadata(persisted: PersistedDynamicToolMetadata, resolved?: CurrentDynamicToolMetadata): CurrentDynamicToolMetadata;
45
44
  export declare function toCurrentDynamicToolMetadataList(persisted: readonly PersistedDynamicToolMetadata[], resolved?: readonly CurrentDynamicToolMetadata[]): readonly CurrentDynamicToolMetadata[];
@@ -1 +1 @@
1
- function isOldSourceOffsetDynamicToolMetadata(e){return e.callbacks!==void 0&&`stepId`in e.callbacks.execute}function isCurrentDynamicToolMetadata(e){return e.callbacks!==void 0&&!isOldSourceOffsetDynamicToolMetadata(e)}function isOldStepFunctionDynamicToolMetadata(e){return e.callbacks===void 0}function withoutSourceOffset(e){return{closure:e.closure}}function convertSourceOffsetMetadata(e){let t={execute:withoutSourceOffset(e.callbacks.execute),...e.callbacks.approvalRequest===void 0?{}:{approvalRequest:withoutSourceOffset(e.callbacks.approvalRequest)},...e.callbacks.approvalResponse===void 0?{}:{approvalResponse:withoutSourceOffset(e.callbacks.approvalResponse)},...e.callbacks.toModelOutput===void 0?{}:{toModelOutput:withoutSourceOffset(e.callbacks.toModelOutput)}};return{...e,callbacks:t}}function toCurrentDynamicToolMetadata(e,t){if(isCurrentDynamicToolMetadata(e))return e;if(t===void 0)throw Error(`Dynamic tool "${e.name}" uses old persisted metadata, but its resolver did not return a current replacement.`);if(t.resolverSlug!==e.resolverSlug||t.name!==e.name)throw Error(`Dynamic tool "${e.name}" received current metadata from a different resolver or tool.`);if(!isOldStepFunctionDynamicToolMetadata(e)){for(let n of Object.keys(e.callbacks))if(t.callbacks[n]===void 0)throw Error(`Dynamic tool "${e.name}" lost its ${n} callback while converting old persisted metadata.`);return convertSourceOffsetMetadata(e)}if(e.approvalResponseStepFnName!==void 0&&e.approvalStepFnName===void 0)throw Error(`Dynamic tool "${e.name}" has an old approval-response callback without an approval-request callback.`);if(e.approvalStepFnName!==void 0&&t.callbacks.approvalRequest===void 0)throw Error(`Dynamic tool "${e.name}" lost its approval-request callback while converting old persisted metadata.`);if(e.approvalResponseStepFnName!==void 0&&t.callbacks.approvalResponse===void 0)throw Error(`Dynamic tool "${e.name}" lost its approval-response callback while converting old persisted metadata.`);return t}function toCurrentDynamicToolMetadataList(e,t=[]){return e.map(e=>toCurrentDynamicToolMetadata(e,t.find(t=>t.resolverSlug===e.resolverSlug&&t.name===e.name)))}export{isCurrentDynamicToolMetadata,isOldSourceOffsetDynamicToolMetadata,isOldStepFunctionDynamicToolMetadata,toCurrentDynamicToolMetadata,toCurrentDynamicToolMetadataList};
1
+ function isOldSourceOffsetDynamicToolMetadata(e){return e.callbacks!==void 0&&`stepId`in e.callbacks.execute}function isCurrentDynamicToolMetadata(e){return e.callbacks!==void 0&&!isOldSourceOffsetDynamicToolMetadata(e)}function isOldStepFunctionDynamicToolMetadata(e){return e.callbacks===void 0}function withoutSourceOffset(e){return{closure:e.closure}}function convertSourceOffsetMetadata(e){let t={execute:withoutSourceOffset(e.callbacks.execute),...e.callbacks.approvalRequest===void 0?{}:{approvalRequest:withoutSourceOffset(e.callbacks.approvalRequest)},...e.callbacks.approvalResponse===void 0?{}:{approvalResponse:withoutSourceOffset(e.callbacks.approvalResponse)},...e.callbacks.toModelOutput===void 0?{}:{toModelOutput:withoutSourceOffset(e.callbacks.toModelOutput)}};return{...e,callbacks:t}}function toCurrentDynamicToolMetadata(e,t){if(isCurrentDynamicToolMetadata(e))return e;if(t===void 0)throw Error(`Dynamic tool "${e.name}" uses old persisted metadata, but its resolver did not return a current replacement.`);if(t.resolverSlug!==e.resolverSlug||t.name!==e.name)throw Error(`Dynamic tool "${e.name}" received current metadata from a different resolver or tool.`);if(!isOldStepFunctionDynamicToolMetadata(e)){for(let n of Object.keys(e.callbacks))if(t.callbacks[n]===void 0)throw Error(`Dynamic tool "${e.name}" lost its ${n} callback while converting old persisted metadata.`);return convertSourceOffsetMetadata(e)}if(e.approvalResponseStepFnName!==void 0&&e.approvalStepFnName===void 0)throw Error(`Dynamic tool "${e.name}" has an old approval-response callback without an approval-request callback.`);if(e.approvalStepFnName!==void 0&&t.callbacks.approvalRequest===void 0)throw Error(`Dynamic tool "${e.name}" lost its approval-request callback while converting old persisted metadata.`);if(e.approvalResponseStepFnName!==void 0&&t.callbacks.approvalResponse===void 0)throw Error(`Dynamic tool "${e.name}" lost its approval-response callback while converting old persisted metadata.`);return t}function toCurrentDynamicToolMetadataList(e,t=[]){return e.map(e=>toCurrentDynamicToolMetadata(e,t.find(t=>t.resolverSlug===e.resolverSlug&&t.name===e.name)))}export{isCurrentDynamicToolMetadata,isOldSourceOffsetDynamicToolMetadata,toCurrentDynamicToolMetadata,toCurrentDynamicToolMetadataList};
@@ -3,12 +3,13 @@ import type { RuntimeHookRegistry } from "#runtime/hooks/registry.js";
3
3
  import type { ContextContainer } from "./container.js";
4
4
  /**
5
5
  * Fans one runtime stream event out to every matching subscriber.
6
- * Errors propagate — harness error paths convert them into the
7
- * recoverable `turn.failed` cascade. Caller must hold an active ALS
8
- * scope so hooks see the same context as the rest of the step.
6
+ * Authored handler failures are logged independently. Caller must hold an
7
+ * active ALS scope so hooks see the same context as the rest of the step.
9
8
  */
10
9
  export declare function dispatchStreamEventHooks(input: {
11
10
  readonly ctx: ContextContainer;
12
11
  readonly registry: RuntimeHookRegistry;
13
12
  readonly event: MessageStreamEvent;
13
+ /** Stops the running turn for `ctx.cancel()`; `undefined` when this event cannot stop one. */
14
+ readonly cancelTurn: (() => void) | undefined;
14
15
  }): Promise<void>;
@@ -1 +1 @@
1
- import{ContinuationTokenKey}from"./keys.js";import{getAdapterKind}from"#channel/adapter.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{BoundaryHookError}from"#shared/boundary-hook-error.js";async function dispatchStreamEventHooks(e){let t=e.registry.streamEventsByType.get(e.event.type)??[],n=e.registry.streamEventsWildcard;if(t.length===0&&n.length===0)return;let r=buildHookContext(e.ctx);try{for(let n of t)await n.handler(e.event,r);for(let t of n)await t.handler(e.event,r)}catch(t){throw e.event.type===`turn.started`||e.event.type===`step.started`?new BoundaryHookError(t):t}}function buildHookContext(e){let t=e.require(BundleKey),n=e.get(ChannelKey),r=e.get(ContinuationTokenKey),i=n===void 0?void 0:getAdapterKind(n);return{...buildCallbackContext(),agent:{name:t.turnAgent.id,nodeId:t.nodeId},channel:{kind:i,continuationToken:r}}}export{dispatchStreamEventHooks};
1
+ import{ContinuationTokenKey}from"./keys.js";import{createLogger,logError}from"#internal/logging.js";import{getAdapterKind}from"#channel/adapter.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";const log=createLogger(`hooks`);async function dispatchStreamEventHooks(e){let t=e.registry.streamEventsByType.get(e.event.type)??[],n=e.registry.streamEventsWildcard;if(t.length===0&&n.length===0)return;let r=buildHookContext(e.ctx),i=!0;for(let a of[...t,...n]){let t={...r,cancel:()=>{if(i&&e.cancelTurn!==void 0){e.cancelTurn();return}log.warn(i?`ctx.cancel() ignored: the event is not part of a running turn`:`ctx.cancel() ignored: the event's hooks already returned`,{hook:a.slug,eventId:e.event.meta.id,eventType:e.event.type,sessionId:r.session.id})}};try{await a.handler(e.event,t)}catch(t){logError(log,`stream event hook failed`,t,{hook:a.slug,subscription:a.eventType,eventId:e.event.meta.id,eventType:e.event.type,sessionId:r.session.id})}}i=!1}function buildHookContext(e){let t=e.require(BundleKey),n=e.get(ChannelKey),r=e.get(ContinuationTokenKey),i=n===void 0?void 0:getAdapterKind(n);return{...buildCallbackContext(),agent:{name:t.turnAgent.id,nodeId:t.nodeId},channel:{kind:i,continuationToken:r}}}export{dispatchStreamEventHooks};
@@ -45,11 +45,3 @@ export declare function dispatchMemoryTurnCompleted(input: {
45
45
  readonly messages: readonly ModelMessage[];
46
46
  readonly instrumentation?: MemoryInstrumentation;
47
47
  }): Promise<void>;
48
- export declare function memoryOperationId(input: {
49
- readonly phase: string;
50
- readonly sequence: number;
51
- readonly sessionId: string;
52
- readonly slot: string;
53
- readonly stepIndex?: number;
54
- readonly turnId: string | null;
55
- }): string;
@@ -1 +1 @@
1
- import{createLogger}from"#internal/logging.js";import{PendingMemoryCommitKey,PreparedMemoryCompactionKey,PreparedMemoryPreambleKey,TurnMemoryLocksKey}from"#context/keys.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{buildResolveContext}from"#context/dynamic-resolve-context.js";import{isEveDevEnvironment}from"#internal/application/dev-environment.js";import{defaultNamespace}from"#public/memory/index.js";import{instrumentMemoryOperation}from"#instrumentation/memory.js";import{applyMemoryRecallBatches,createMemoryLock,projectMemoryHistory,validateMemoryRecallResult}from"#shared/memory-state.js";const fallbackAbortSignal=new AbortController().signal,log=createLogger(`memory`);function prepareMemoryPreamble(e,t){e.setVirtualContext(PreparedMemoryPreambleKey,t)}async function dispatchMemoryTurnStarted(e){let t=e.ctx.get(PreparedMemoryPreambleKey);if(t===void 0)return[];let n=Object.freeze({id:e.event.data.turnId,input:Object.freeze([...t.input]),sequence:e.event.data.sequence}),r=Object.fromEntries((await Promise.all([...e.memories].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)).map(async t=>{let r=await resolveMemoryLock({abortSignal:e.abortSignal??fallbackAbortSignal,appRoot:e.appRoot,ctx:e.ctx,memory:t,nodeId:e.nodeId,turn:n});return r===null?null:[t.slot,r]}))).filter(e=>e!==null));e.ctx.set(TurnMemoryLocksKey,r);let i=projectMemoryHistory({locks:r,messages:t.history}),a=buildCallbackContext(),o=(await settleMemoryOperations([...e.memories].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)).map(async t=>{let o=r[t.slot];if(o===void 0)return null;let s=memoryOperationId({phase:`turn.started`,sequence:e.event.data.sequence,sessionId:a.session.id,slot:t.slot,turnId:n.id});return{lock:o,messages:await instrumentMemoryOperation(e.instrumentation,memoryInstrumentationOperation({operationId:s,operationName:`search_memory`,phase:`turn.started`,slot:t.slot,storeId:o.scope.key,turnId:n.id}),async()=>{let r=await t.provider.recall[`turn.started`]({...a,abortSignal:e.abortSignal??fallbackAbortSignal,memory:{scope:o.scope,slot:t.slot},messages:i,operationId:s,turn:n}),c=validateMemoryRecallResult(r,t.slot);return{outputRecords:memoryRecords(r),recordCount:c.length,value:c}}),operationId:s}}))).filter(e=>e!==null),s=applyMemoryRecallBatches({batches:o,history:t.history,state:t.state}),c=[...projectMemoryHistory({locks:r,messages:s.history}),...t.input],l=t.projector?.({messages:c,state:s.state})??c;return e.ctx.setVirtualContext(PendingMemoryCommitKey,{history:s.history,projectedMessages:l,state:s.state}),l}function drainMemoryCommit(e){let t=e.get(PendingMemoryCommitKey);return e.delete(PendingMemoryCommitKey),e.delete(PreparedMemoryPreambleKey),t}function prepareMemoryCompaction(e,t){e.setVirtualContext(PreparedMemoryCompactionKey,t)}async function dispatchMemoryCompactionRequested(e){let t=buildCallbackContext(),n=await resolveCompactionLocks(e);e.ctx.set(TurnMemoryLocksKey,n);let r=e.event.data.turnId.length===0?null:firstLockedTurn(n);await settleMemoryOperations([...e.memories].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)).map(async i=>{let a=n[i.slot],o=i.provider.capture?.[`compaction.requested`];if(a===void 0||o===void 0)return;let s=memoryOperationId({phase:`compaction.requested`,sequence:e.event.data.sequence,sessionId:t.session.id,slot:i.slot,stepIndex:e.event.data.stepIndex,turnId:r?.id??null});await instrumentMemoryOperation(e.instrumentation,memoryInstrumentationOperation({operationId:s,operationName:`upsert_memory`,phase:`compaction.requested`,slot:i.slot,storeId:a.scope.key,turnId:r?.id}),async()=>(await o({...t,abortSignal:e.abortSignal??fallbackAbortSignal,compaction:{modelId:e.event.data.modelId,usageInputTokens:e.event.data.usageInputTokens},memory:{scope:a.scope,slot:i.slot},messages:e.messages,operationId:s,turn:r}),{value:void 0}))}))}async function dispatchMemoryCompactionCompleted(e){let t=e.ctx.get(PreparedMemoryCompactionKey),n=t?.history??e.messages,r=e.ctx.get(TurnMemoryLocksKey)??{},i=projectMemoryHistory({locks:r,messages:n}),a=buildCallbackContext(),o=e.event.data.turnId.length===0?null:firstLockedTurn(r),s=(await settleMemoryOperations([...e.memories].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)).map(async t=>{let n=r[t.slot],s=t.provider.recall[`compaction.completed`];if(n===void 0||s===void 0)return null;let c=memoryOperationId({phase:`compaction.completed`,sequence:e.event.data.sequence,sessionId:a.session.id,slot:t.slot,stepIndex:e.event.data.stepIndex,turnId:o?.id??null});return{lock:n,messages:await instrumentMemoryOperation(e.instrumentation,memoryInstrumentationOperation({operationId:c,operationName:`search_memory`,phase:`compaction.completed`,slot:t.slot,storeId:n.scope.key,turnId:o?.id}),async()=>{let r=await s({...a,abortSignal:e.abortSignal??fallbackAbortSignal,compaction:{modelId:e.event.data.modelId},memory:{scope:n.scope,slot:t.slot},messages:i,operationId:c,turn:o}),l=validateMemoryRecallResult(r,t.slot);return{outputRecords:memoryRecords(r),recordCount:l.length,value:l}}),operationId:c}}))).filter(e=>e!==null),c=applyMemoryRecallBatches({batches:s,history:n,state:t?.state}),l=projectMemoryHistory({locks:r,messages:c.history});return e.ctx.setVirtualContext(PendingMemoryCommitKey,{history:c.history,projectedMessages:l,state:c.state}),e.ctx.delete(PreparedMemoryCompactionKey),l}async function dispatchMemoryTurnCompleted(e){let t=e.ctx.get(TurnMemoryLocksKey)??{},n=buildCallbackContext(),r=projectMemoryHistory({locks:t,messages:e.messages});await settleMemoryOperations([...e.memories].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)).map(async i=>{let a=t[i.slot],o=i.provider.capture?.[`turn.completed`];if(a===void 0||o===void 0)return;let s=memoryOperationId({phase:`turn.completed`,sequence:e.event.data.sequence,sessionId:n.session.id,slot:i.slot,turnId:e.event.data.turnId});await instrumentMemoryOperation(e.instrumentation,memoryInstrumentationOperation({operationId:s,operationName:`upsert_memory`,phase:`turn.completed`,slot:i.slot,storeId:a.scope.key,turnId:a.turn.id}),async()=>(await o({...n,abortSignal:e.abortSignal??fallbackAbortSignal,memory:{scope:a.scope,slot:i.slot},messages:r,operationId:s,turn:a.turn}),{value:void 0}))}))}async function resolveCompactionLocks(e){let t=e.ctx.get(TurnMemoryLocksKey);if(e.event.data.turnId.length>0&&t!==void 0)return t;let n=Object.freeze({id:``,input:[],sequence:e.event.data.sequence});return Object.fromEntries((await Promise.all(e.memories.map(async t=>{let r=await resolveMemoryLock({abortSignal:e.abortSignal??fallbackAbortSignal,appRoot:e.appRoot,ctx:e.ctx,memory:t,nodeId:e.nodeId,turn:n});return r===null?null:[t.slot,r]}))).filter(e=>e!==null))}function firstLockedTurn(e){return Object.values(e)[0]?.turn??null}async function resolveMemoryLock(e){let t=buildResolveContext(e.ctx,[]),n={abortSignal:e.abortSignal,channel:t.channel,session:t.session},r=typeof e.memory.scope==`function`?await e.memory.scope(n):e.memory.scope;if(r===null)return reportDisabledMemorySlot(e.memory.slot,`scope`),null;let i={appRoot:e.appRoot,node:e.nodeId,slot:e.memory.slot},a=e.memory.namespace===void 0?defaultNamespace(i):typeof e.memory.namespace==`function`?await e.memory.namespace(i):e.memory.namespace;return a===null?(reportDisabledMemorySlot(e.memory.slot,`namespace`),null):createMemoryLock({namespace:a,scope:r,slot:e.memory.slot,turn:e.turn,visibility:e.memory.visibility})}function reportDisabledMemorySlot(e,t){isEveDevEnvironment()&&log.info(`Memory slot is disabled for this operation`,{resolver:t,slot:e})}async function settleMemoryOperations(e){let t=await Promise.allSettled(e),n=[],r;for(let e of t)e.status===`rejected`?r??=e:n.push(e.value);if(r!==void 0)throw r.reason;return n}function memoryOperationId(e){return[`eve-memory-operation-v1`,e.sessionId,String(e.sequence),e.turnId??`standalone`,...e.stepIndex===void 0?[]:[String(e.stepIndex)],e.phase,e.slot].join(`:`)}function memoryInstrumentationOperation(e){return{idempotencyKey:e.operationId,operationName:e.operationName,phase:e.phase,slot:e.slot,storeId:e.storeId,turnId:e.turnId}}function memoryRecords(e){return e==null?[]:e.messages.map(e=>e.id===void 0?{content:e.content}:{content:e.content,id:e.id})}export{dispatchMemoryCompactionCompleted,dispatchMemoryCompactionRequested,dispatchMemoryTurnCompleted,dispatchMemoryTurnStarted,drainMemoryCommit,memoryOperationId,prepareMemoryCompaction,prepareMemoryPreamble};
1
+ import{createLogger}from"#internal/logging.js";import{PendingMemoryCommitKey,PreparedMemoryCompactionKey,PreparedMemoryPreambleKey,TurnMemoryLocksKey}from"#context/keys.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{buildResolveContext}from"#context/dynamic-resolve-context.js";import{isEveDevEnvironment}from"#internal/application/dev-environment.js";import{defaultNamespace}from"#public/memory/index.js";import{instrumentMemoryOperation}from"#instrumentation/memory.js";import{applyMemoryRecallBatches,createMemoryLock,projectMemoryHistory,validateMemoryRecallResult}from"#shared/memory-state.js";const fallbackAbortSignal=new AbortController().signal,log=createLogger(`memory`);function prepareMemoryPreamble(e,t){e.setVirtualContext(PreparedMemoryPreambleKey,t)}async function dispatchMemoryTurnStarted(e){let t=e.ctx.get(PreparedMemoryPreambleKey);if(t===void 0)return[];let n=Object.freeze({id:e.event.data.turnId,input:Object.freeze([...t.input]),sequence:e.event.data.sequence}),r=Object.fromEntries((await Promise.all([...e.memories].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)).map(async t=>{let r=await resolveMemoryLock({abortSignal:e.abortSignal??fallbackAbortSignal,appRoot:e.appRoot,ctx:e.ctx,memory:t,nodeId:e.nodeId,turn:n});return r===null?null:[t.slot,r]}))).filter(e=>e!==null));e.ctx.set(TurnMemoryLocksKey,r);let i=projectMemoryHistory({locks:r,messages:t.history}),a=buildCallbackContext(),o=(await settleMemoryOperations([...e.memories].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)).map(async t=>{let o=r[t.slot];if(o===void 0)return null;let s=memoryOperationId({phase:`turn.started`,sequence:e.event.data.sequence,sessionId:a.session.id,slot:t.slot,turnId:n.id});return{lock:o,messages:await instrumentMemoryOperation(e.instrumentation,memoryInstrumentationOperation({operationId:s,operationName:`search_memory`,phase:`turn.started`,slot:t.slot,storeId:o.scope.key,turnId:n.id}),async()=>{let r=await t.provider.recall[`turn.started`]({...a,abortSignal:e.abortSignal??fallbackAbortSignal,memory:{scope:o.scope,slot:t.slot},messages:i,operationId:s,turn:n}),c=validateMemoryRecallResult(r,t.slot);return{outputRecords:memoryRecords(r),recordCount:c.length,value:c}}),operationId:s}}))).filter(e=>e!==null),s=applyMemoryRecallBatches({batches:o,history:t.history,state:t.state}),c=[...projectMemoryHistory({locks:r,messages:s.history}),...t.input],l=t.projector?.({messages:c,state:s.state})??c;return e.ctx.setVirtualContext(PendingMemoryCommitKey,{history:s.history,projectedMessages:l,state:s.state}),l}function drainMemoryCommit(e){let t=e.get(PendingMemoryCommitKey);return e.delete(PendingMemoryCommitKey),e.delete(PreparedMemoryPreambleKey),t}function prepareMemoryCompaction(e,t){e.setVirtualContext(PreparedMemoryCompactionKey,t)}async function dispatchMemoryCompactionRequested(e){let t=buildCallbackContext(),n=await resolveCompactionLocks(e);e.ctx.set(TurnMemoryLocksKey,n);let r=e.event.data.turnId.length===0?null:firstLockedTurn(n);await settleMemoryOperations([...e.memories].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)).map(async i=>{let a=n[i.slot],o=i.provider.capture?.[`compaction.requested`];if(a===void 0||o===void 0)return;let s=memoryOperationId({phase:`compaction.requested`,sequence:e.event.data.sequence,sessionId:t.session.id,slot:i.slot,stepIndex:e.event.data.stepIndex,turnId:r?.id??null});await instrumentMemoryOperation(e.instrumentation,memoryInstrumentationOperation({operationId:s,operationName:`upsert_memory`,phase:`compaction.requested`,slot:i.slot,storeId:a.scope.key,turnId:r?.id}),async()=>(await o({...t,abortSignal:e.abortSignal??fallbackAbortSignal,compaction:{modelId:e.event.data.modelId,usageInputTokens:e.event.data.usageInputTokens},memory:{scope:a.scope,slot:i.slot},messages:e.messages,operationId:s,turn:r}),{value:void 0}))}))}async function dispatchMemoryCompactionCompleted(e){let t=e.ctx.get(PreparedMemoryCompactionKey),n=t?.history??e.messages,r=e.ctx.get(TurnMemoryLocksKey)??{},i=projectMemoryHistory({locks:r,messages:n}),a=buildCallbackContext(),o=e.event.data.turnId.length===0?null:firstLockedTurn(r),s=(await settleMemoryOperations([...e.memories].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)).map(async t=>{let n=r[t.slot],s=t.provider.recall[`compaction.completed`];if(n===void 0||s===void 0)return null;let c=memoryOperationId({phase:`compaction.completed`,sequence:e.event.data.sequence,sessionId:a.session.id,slot:t.slot,stepIndex:e.event.data.stepIndex,turnId:o?.id??null});return{lock:n,messages:await instrumentMemoryOperation(e.instrumentation,memoryInstrumentationOperation({operationId:c,operationName:`search_memory`,phase:`compaction.completed`,slot:t.slot,storeId:n.scope.key,turnId:o?.id}),async()=>{let r=await s({...a,abortSignal:e.abortSignal??fallbackAbortSignal,compaction:{modelId:e.event.data.modelId},memory:{scope:n.scope,slot:t.slot},messages:i,operationId:c,turn:o}),l=validateMemoryRecallResult(r,t.slot);return{outputRecords:memoryRecords(r),recordCount:l.length,value:l}}),operationId:c}}))).filter(e=>e!==null),c=applyMemoryRecallBatches({batches:s,history:n,state:t?.state}),l=projectMemoryHistory({locks:r,messages:c.history});return e.ctx.setVirtualContext(PendingMemoryCommitKey,{history:c.history,projectedMessages:l,state:c.state}),e.ctx.delete(PreparedMemoryCompactionKey),l}async function dispatchMemoryTurnCompleted(e){let t=e.ctx.get(TurnMemoryLocksKey)??{},n=buildCallbackContext(),r=projectMemoryHistory({locks:t,messages:e.messages});await settleMemoryOperations([...e.memories].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)).map(async i=>{let a=t[i.slot],o=i.provider.capture?.[`turn.completed`];if(a===void 0||o===void 0)return;let s=memoryOperationId({phase:`turn.completed`,sequence:e.event.data.sequence,sessionId:n.session.id,slot:i.slot,turnId:e.event.data.turnId});await instrumentMemoryOperation(e.instrumentation,memoryInstrumentationOperation({operationId:s,operationName:`upsert_memory`,phase:`turn.completed`,slot:i.slot,storeId:a.scope.key,turnId:a.turn.id}),async()=>(await o({...n,abortSignal:e.abortSignal??fallbackAbortSignal,memory:{scope:a.scope,slot:i.slot},messages:r,operationId:s,turn:a.turn}),{value:void 0}))}))}async function resolveCompactionLocks(e){let t=e.ctx.get(TurnMemoryLocksKey);if(e.event.data.turnId.length>0&&t!==void 0)return t;let n=Object.freeze({id:``,input:[],sequence:e.event.data.sequence});return Object.fromEntries((await Promise.all(e.memories.map(async t=>{let r=await resolveMemoryLock({abortSignal:e.abortSignal??fallbackAbortSignal,appRoot:e.appRoot,ctx:e.ctx,memory:t,nodeId:e.nodeId,turn:n});return r===null?null:[t.slot,r]}))).filter(e=>e!==null))}function firstLockedTurn(e){return Object.values(e)[0]?.turn??null}async function resolveMemoryLock(e){let t=buildResolveContext(e.ctx,[]),n={abortSignal:e.abortSignal,channel:t.channel,session:t.session},r=typeof e.memory.scope==`function`?await e.memory.scope(n):e.memory.scope;if(r===null)return reportDisabledMemorySlot(e.memory.slot,`scope`),null;let i={appRoot:e.appRoot,node:e.nodeId,slot:e.memory.slot},a=e.memory.namespace===void 0?defaultNamespace(i):typeof e.memory.namespace==`function`?await e.memory.namespace(i):e.memory.namespace;return a===null?(reportDisabledMemorySlot(e.memory.slot,`namespace`),null):createMemoryLock({namespace:a,scope:r,slot:e.memory.slot,turn:e.turn,visibility:e.memory.visibility})}function reportDisabledMemorySlot(e,t){isEveDevEnvironment()&&log.info(`Memory slot is disabled for this operation`,{resolver:t,slot:e})}async function settleMemoryOperations(e){let t=await Promise.allSettled(e),n=[],r;for(let e of t)e.status===`rejected`?r??=e:n.push(e.value);if(r!==void 0)throw r.reason;return n}function memoryOperationId(e){return[`eve-memory-operation-v1`,e.sessionId,String(e.sequence),e.turnId??`standalone`,...e.stepIndex===void 0?[]:[String(e.stepIndex)],e.phase,e.slot].join(`:`)}function memoryInstrumentationOperation(e){return{idempotencyKey:e.operationId,operationName:e.operationName,phase:e.phase,slot:e.slot,storeId:e.storeId,turnId:e.turnId}}function memoryRecords(e){return e==null?[]:e.messages.map(e=>e.id===void 0?{content:e.content}:{content:e.content,id:e.id})}export{dispatchMemoryCompactionCompleted,dispatchMemoryCompactionRequested,dispatchMemoryTurnCompleted,dispatchMemoryTurnStarted,drainMemoryCommit,prepareMemoryCompaction,prepareMemoryPreamble};
@@ -1,21 +1,6 @@
1
1
  import { type DiscoverDiagnostic } from "#discover/diagnostics.js";
2
2
  import { type ConnectionSourceRef } from "#discover/manifest.js";
3
3
  import type { ProjectSource, ProjectSourceEntry } from "#discover/project-source.js";
4
- /**
5
- * Shared diagnostic emitted when the authored `connections/` root is not a
6
- * directory.
7
- */
8
- export declare const DISCOVER_CONNECTIONS_DIRECTORY_INVALID = "discover/connections-directory-invalid";
9
- /**
10
- * Discovery diagnostic emitted when a connection exists in both file form
11
- * (`connections/<name>.ts`) and folder form (`connections/<name>/`).
12
- */
13
- export declare const DISCOVER_CONNECTION_FILE_FOLDER_COLLISION = "discover/connection-file-folder-collision";
14
- /**
15
- * Discovery diagnostic emitted when a folder-form connection contains no
16
- * `connection.ts` definition module.
17
- */
18
- export declare const DISCOVER_CONNECTION_FOLDER_EMPTY = "discover/connection-folder-empty";
19
4
  /**
20
5
  * Result of discovering authored connection sources from a single agent root.
21
6
  */