eve 0.67.1 → 0.67.2

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 (562) hide show
  1. package/CHANGELOG.md +10 -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 +0 -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/diagnostic-dump.d.ts +0 -2
  32. package/dist/src/cli/dev/diagnostic-dump.js +1 -1
  33. package/dist/src/cli/dev/diagnostic-sink.d.ts +3 -2
  34. package/dist/src/cli/dev/tui/agent-header.d.ts +2 -1
  35. package/dist/src/cli/dev/tui/argument-typeahead.d.ts +2 -1
  36. package/dist/src/cli/dev/tui/dev-rebuild-status.d.ts +2 -1
  37. package/dist/src/cli/dev/tui/diagnostic-presentation.d.ts +2 -1
  38. package/dist/src/cli/dev/tui/errors.d.ts +2 -7
  39. package/dist/src/cli/dev/tui/errors.js +1 -1
  40. package/dist/src/cli/dev/tui/flow-drawer.d.ts +2 -1
  41. package/dist/src/cli/dev/tui/line-editor.d.ts +1 -1
  42. package/dist/src/cli/dev/tui/mcp-connection-status.d.ts +2 -1
  43. package/dist/src/cli/dev/tui/message-queue.d.ts +4 -3
  44. package/dist/src/cli/dev/tui/prompt-command-handler.d.ts +2 -1
  45. package/dist/src/cli/dev/tui/provider-picker.d.ts +3 -2
  46. package/dist/src/cli/dev/tui/question-panel.d.ts +2 -1
  47. package/dist/src/cli/dev/tui/registry-result-message.d.ts +3 -4
  48. package/dist/src/cli/dev/tui/registry-result-message.js +1 -1
  49. package/dist/src/cli/dev/tui/remote-connection-probe.d.ts +3 -2
  50. package/dist/src/cli/dev/tui/setup-panel.d.ts +2 -2
  51. package/dist/src/cli/dev/tui/setup-selection-input.d.ts +2 -2
  52. package/dist/src/cli/dev/tui/status-line.d.ts +2 -1
  53. package/dist/src/cli/dev/tui/stream-format.d.ts +3 -2
  54. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +3 -2
  55. package/dist/src/cli/dev/tui/theme.d.ts +1 -1
  56. package/dist/src/cli/dev/tui/tool-block-groups.d.ts +3 -2
  57. package/dist/src/cli/dev/tui/tool-presentation.d.ts +2 -1
  58. package/dist/src/cli/dev/tui/traces/trace-content.d.ts +0 -9
  59. package/dist/src/cli/dev/tui/traces/trace-content.js +1 -1
  60. package/dist/src/cli/dev/tui/traces/trace-view.d.ts +3 -2
  61. package/dist/src/cli/dev/tui/traces/trace-viewer-session.d.ts +2 -1
  62. package/dist/src/cli/dev/tui/traces/trace-viewer-state.d.ts +2 -3
  63. package/dist/src/cli/dev/tui/traces/trace-viewer-state.js +1 -1
  64. package/dist/src/cli/dev/ui-options.d.ts +3 -2
  65. package/dist/src/cli/dev/url-target.d.ts +2 -1
  66. package/dist/src/cli/invoke/command.d.ts +0 -11
  67. package/dist/src/cli/invoke/command.js +1 -1
  68. package/dist/src/cli/invoke/result.d.ts +1 -1
  69. package/dist/src/cli/telemetry/index.d.ts +0 -6
  70. package/dist/src/cli/telemetry/preference.d.ts +2 -1
  71. package/dist/src/cli/ui/alt-screen.d.ts +3 -2
  72. package/dist/src/cli/ui/live-region.d.ts +3 -2
  73. package/dist/src/cli/ui/output.d.ts +1 -1
  74. package/dist/src/client/eve-agent-store-helpers.d.ts +0 -1
  75. package/dist/src/client/eve-agent-store-helpers.js +1 -1
  76. package/dist/src/client/message-action-parts.d.ts +2 -1
  77. package/dist/src/client/session-utils.d.ts +3 -2
  78. package/dist/src/compiled/.vendor-stamp.json +6 -6
  79. package/dist/src/compiled/@workflow/core/index.js +2 -2
  80. package/dist/src/compiled/@workflow/core/private.js +1 -1
  81. package/dist/src/compiled/@workflow/core/runtime/constants.d.ts +4 -3
  82. package/dist/src/compiled/@workflow/core/runtime/helpers.d.ts +23 -0
  83. package/dist/src/compiled/@workflow/core/runtime/helpers.js +1 -1
  84. package/dist/src/compiled/@workflow/core/runtime/hook-wake.d.ts +69 -36
  85. package/dist/src/compiled/@workflow/core/runtime/lifecycle-hooks.d.ts +25 -22
  86. package/dist/src/compiled/@workflow/core/runtime/run-spec-version.d.ts +16 -0
  87. package/dist/src/compiled/@workflow/core/runtime/start.d.ts +59 -1
  88. package/dist/src/compiled/@workflow/core/runtime/step-latency.d.ts +3 -2
  89. package/dist/src/compiled/@workflow/core/runtime/suspension-handler.d.ts +34 -12
  90. package/dist/src/compiled/@workflow/core/runtime.js +4 -4
  91. package/dist/src/compiled/@workflow/core/serialization.d.ts +7 -2
  92. package/dist/src/compiled/@workflow/core/serialization.js +1 -1
  93. package/dist/src/compiled/@workflow/core/telemetry/semantic-conventions.d.ts +29 -0
  94. package/dist/src/compiled/@workflow/core/types.d.ts +1 -0
  95. package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
  96. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  97. package/dist/src/compiled/@workflow/errors/index.d.ts +13 -0
  98. package/dist/src/compiled/@workflow/errors/index.js +1 -1
  99. package/dist/src/compiled/@workflow/world/events.d.ts +14 -4
  100. package/dist/src/compiled/@workflow/world/index.d.ts +2 -2
  101. package/dist/src/compiled/@workflow/world/interfaces.d.ts +2 -1
  102. package/dist/src/compiled/@workflow/world/shared.d.ts +24 -0
  103. package/dist/src/compiled/@workflow/world/spec-version.d.ts +23 -0
  104. package/dist/src/compiled/@workflow/world-local/index.js +5 -5
  105. package/dist/src/compiled/@workflow/world-vercel/index.js +16 -16
  106. package/dist/src/compiled/_chunks/workflow/{attribute-changes-DzJovO_f.js → attribute-changes-D721NpZv.js} +3 -3
  107. package/dist/src/compiled/_chunks/workflow/{dist-BQSf8Hax.js → dist-BUFGAKRb.js} +1 -1
  108. package/dist/src/compiled/_chunks/workflow/dist-CaNNONeg.js +3 -0
  109. package/dist/src/compiled/_chunks/workflow/{frames-qKc30rjg.js → frames-Dr9fHWdo.js} +2 -2
  110. package/dist/src/compiled/_chunks/workflow/{global-BQnKzRXo.js → global-DKbOgrts.js} +1 -1
  111. package/dist/src/compiled/_chunks/workflow/helpers-DkKxg_yn.js +1 -0
  112. package/dist/src/compiled/_chunks/workflow/logger-D4GJNTk4.js +14 -0
  113. package/dist/src/compiled/_chunks/workflow/resume-hook-uTW-jBYz.js +1 -0
  114. package/dist/src/compiled/_chunks/workflow/run-5DmiMN9b.js +1 -0
  115. package/dist/src/compiled/_chunks/workflow/serialization-CNIYl1D3.js +3 -0
  116. package/dist/src/compiled/_chunks/workflow/sleep-DFKgN7UG.js +1 -0
  117. package/dist/src/compiled/_chunks/workflow/wait-until-3_1djUuL.js +1 -0
  118. package/dist/src/compiled/_chunks/workflow/{ws-transport-BrsMYqJg.js → ws-transport--rYOVIaf.js} +1 -1
  119. package/dist/src/compiler/artifacts.d.ts +4 -27
  120. package/dist/src/compiler/artifacts.js +1 -1
  121. package/dist/src/compiler/compile-agent.d.ts +2 -1
  122. package/dist/src/compiler/compile-agent.js +1 -1
  123. package/dist/src/compiler/diagnostics.d.ts +0 -11
  124. package/dist/src/compiler/diagnostics.js +1 -1
  125. package/dist/src/compiler/manifest.d.ts +0 -4
  126. package/dist/src/compiler/module-map.d.ts +1 -5
  127. package/dist/src/compiler/module-map.js +1 -1
  128. package/dist/src/compiler/normalize-agent-config.js +1 -1
  129. package/dist/src/compiler/normalize-connection.d.ts +2 -1
  130. package/dist/src/compiler/normalize-instructions.d.ts +2 -6
  131. package/dist/src/compiler/normalize-instructions.js +1 -1
  132. package/dist/src/compiler/normalize-manifest-helpers.d.ts +0 -1
  133. package/dist/src/compiler/normalize-manifest-helpers.js +1 -1
  134. package/dist/src/compiler/normalize-manifest.js +1 -1
  135. package/dist/src/compiler/normalize-skill.d.ts +2 -1
  136. package/dist/src/compiler/project-sources.d.ts +0 -14
  137. package/dist/src/compiler/project-sources.js +1 -1
  138. package/dist/src/compiler/resolve-workspace-subagent.js +1 -1
  139. package/dist/src/compiler/source-graph.d.ts +1 -2
  140. package/dist/src/compiler/source-graph.js +1 -1
  141. package/dist/src/context/build-base-tool-context.d.ts +2 -1
  142. package/dist/src/context/dynamic-tool-lifecycle.d.ts +0 -4
  143. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  144. package/dist/src/context/dynamic-tool-metadata.d.ts +0 -1
  145. package/dist/src/context/dynamic-tool-metadata.js +1 -1
  146. package/dist/src/context/memory-lifecycle.d.ts +0 -8
  147. package/dist/src/context/memory-lifecycle.js +1 -1
  148. package/dist/src/discover/connections.d.ts +0 -15
  149. package/dist/src/discover/connections.js +1 -1
  150. package/dist/src/discover/diagnostics.d.ts +0 -8
  151. package/dist/src/discover/diagnostics.js +1 -1
  152. package/dist/src/discover/discover-agent.js +1 -1
  153. package/dist/src/discover/discover-subagent.d.ts +0 -1
  154. package/dist/src/discover/discover-subagent.js +1 -1
  155. package/dist/src/discover/extensions.d.ts +3 -10
  156. package/dist/src/discover/extensions.js +1 -1
  157. package/dist/src/discover/filesystem.d.ts +5 -9
  158. package/dist/src/discover/filesystem.js +1 -1
  159. package/dist/src/discover/grammar.d.ts +0 -46
  160. package/dist/src/discover/grammar.js +1 -1
  161. package/dist/src/discover/manifest.d.ts +5 -4
  162. package/dist/src/discover/memory.d.ts +0 -1
  163. package/dist/src/discover/memory.js +1 -1
  164. package/dist/src/discover/named-source-directory.js +1 -1
  165. package/dist/src/discover/project-source.d.ts +2 -1
  166. package/dist/src/discover/project.js +1 -1
  167. package/dist/src/discover/sandbox.js +1 -1
  168. package/dist/src/discover/skills.d.ts +0 -4
  169. package/dist/src/discover/skills.js +1 -1
  170. package/dist/src/evals/cli/eval-client.d.ts +2 -1
  171. package/dist/src/evals/judge.d.ts +2 -1
  172. package/dist/src/evals/runner/execute-task.d.ts +1 -1
  173. package/dist/src/evals/types.d.ts +1 -1
  174. package/dist/src/eve-channel/support.d.ts +1 -3
  175. package/dist/src/eve-channel/support.js +1 -1
  176. package/dist/src/execution/dynamic-workflow/schema.d.ts +2 -1
  177. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  178. package/dist/src/execution/effective-agent-config.d.ts +2 -1
  179. package/dist/src/execution/eve-workflow-attributes.d.ts +3 -5
  180. package/dist/src/execution/eve-workflow-attributes.js +1 -1
  181. package/dist/src/execution/history-view.d.ts +2 -1
  182. package/dist/src/execution/node-step.d.ts +3 -2
  183. package/dist/src/execution/sandbox/active-handles.d.ts +2 -4
  184. package/dist/src/execution/sandbox/active-handles.js +1 -1
  185. package/dist/src/execution/sandbox/bash.d.ts +2 -1
  186. package/dist/src/execution/sandbox/bindings/docker.js +1 -1
  187. package/dist/src/execution/sandbox/bindings/immutable-resources.d.ts +0 -6
  188. package/dist/src/execution/sandbox/bindings/immutable-resources.js +1 -1
  189. package/dist/src/execution/sandbox/bindings/local-provider-utils.d.ts +3 -2
  190. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.d.ts +0 -1
  191. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -1
  192. package/dist/src/execution/sandbox/bindings/microsandbox-network.d.ts +1 -1
  193. package/dist/src/execution/sandbox/bindings/microsandbox-options.d.ts +0 -3
  194. package/dist/src/execution/sandbox/bindings/microsandbox-options.js +1 -1
  195. package/dist/src/execution/sandbox/bindings/microsandbox-templates.d.ts +0 -1
  196. package/dist/src/execution/sandbox/bindings/microsandbox-templates.js +1 -1
  197. package/dist/src/execution/sandbox/bindings/vercel.d.ts +1 -1
  198. package/dist/src/execution/sandbox/dockerfile.d.ts +0 -1
  199. package/dist/src/execution/sandbox/dockerfile.js +1 -1
  200. package/dist/src/execution/sandbox/ensure.d.ts +2 -1
  201. package/dist/src/execution/sandbox/ensure.js +1 -1
  202. package/dist/src/execution/sandbox/prewarm.d.ts +1 -18
  203. package/dist/src/execution/sandbox/prewarm.js +1 -1
  204. package/dist/src/execution/sandbox/require-sandbox.d.ts +0 -11
  205. package/dist/src/execution/sandbox/require-sandbox.js +1 -1
  206. package/dist/src/execution/sandbox/truncate-output.d.ts +2 -5
  207. package/dist/src/execution/sandbox/truncate-output.js +2 -2
  208. package/dist/src/execution/session/admission.d.ts +3 -2
  209. package/dist/src/execution/session/event-sink.d.ts +2 -1
  210. package/dist/src/execution/session/finalization.d.ts +2 -1
  211. package/dist/src/execution/session/handoff.d.ts +3 -2
  212. package/dist/src/execution/session/route-selected-delivery.d.ts +2 -1
  213. package/dist/src/execution/session/timeout-control.d.ts +2 -1
  214. package/dist/src/execution/session-activity.d.ts +0 -3
  215. package/dist/src/execution/session-activity.js +1 -1
  216. package/dist/src/execution/session-inbox/protocol.d.ts +2 -1
  217. package/dist/src/execution/session.d.ts +3 -2
  218. package/dist/src/execution/stable-workflow-names.d.ts +0 -6
  219. package/dist/src/execution/stable-workflow-names.js +1 -1
  220. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  221. package/dist/src/execution/tools/ask-question-workflow.js +1 -1
  222. package/dist/src/execution/tools/connection-search.js +1 -1
  223. package/dist/src/execution/tools/sleep-workflow.js +1 -1
  224. package/dist/src/execution/tools/subagent/invoke-preparation.d.ts +2 -1
  225. package/dist/src/execution/tools/subagent/task-agent-requests.d.ts +4 -3
  226. package/dist/src/execution/tools/workflow/background.d.ts +2 -6
  227. package/dist/src/execution/tools/workflow/background.js +1 -1
  228. package/dist/src/execution/tools/workflow/owner-channels.d.ts +1 -1
  229. package/dist/src/execution/tools/workflow/workflow-owner-background.d.ts +2 -1
  230. package/dist/src/execution/web-fetch/execute.d.ts +2 -2
  231. package/dist/src/execution/web-fetch/request.d.ts +2 -1
  232. package/dist/src/extensions/code/extension/lib/computer-use-driver-source.d.ts +0 -2
  233. package/dist/src/extensions/code/extension/lib/computer-use-driver-source.js +57 -57
  234. package/dist/src/extensions/code/extension/lib/computer-use.d.ts +1 -1
  235. package/dist/src/extensions/code/extension/lib/generated-paths.d.ts +2 -1
  236. package/dist/src/extensions/code/extension/lib/grep-search.d.ts +5 -5
  237. package/dist/src/extensions/code/extension/lib/grep-search.js +2 -2
  238. package/dist/src/extensions/code/extension/lib/guidelines.d.ts +2 -1
  239. package/dist/src/extensions/code/extension/lib/patch.d.ts +3 -2
  240. package/dist/src/extensions/code/extension/lib/prwatch-github.d.ts +1 -2
  241. package/dist/src/extensions/code/extension/lib/prwatch-github.js +1 -1
  242. package/dist/src/extensions/code/extension/lib/prwatch-registry.d.ts +2 -1
  243. package/dist/src/framework/host-inventory.d.ts +3 -2
  244. package/dist/src/harness/approval-candidates.d.ts +4 -3
  245. package/dist/src/harness/approval-delivery-coordinator.d.ts +2 -1
  246. package/dist/src/harness/compaction-prompt.d.ts +2 -1
  247. package/dist/src/harness/coordination.d.ts +0 -4
  248. package/dist/src/harness/coordination.js +1 -1
  249. package/dist/src/harness/input-requests.d.ts +1 -10
  250. package/dist/src/harness/input-requests.js +1 -1
  251. package/dist/src/harness/pending-input-batches.d.ts +0 -5
  252. package/dist/src/harness/pending-input-batches.js +1 -1
  253. package/dist/src/harness/provider-tools.d.ts +2 -1
  254. package/dist/src/harness/session-limit-continuation.d.ts +0 -4
  255. package/dist/src/harness/session-limit-continuation.js +1 -1
  256. package/dist/src/harness/session-usage-limits.d.ts +2 -1
  257. package/dist/src/harness/tool-loop.js +1 -1
  258. package/dist/src/harness/tool-model-output.d.ts +2 -1
  259. package/dist/src/harness/turn-client-context.d.ts +2 -1
  260. package/dist/src/instrumentation/state.d.ts +2 -2
  261. package/dist/src/internal/agent-name.d.ts +0 -2
  262. package/dist/src/internal/agent-name.js +1 -1
  263. package/dist/src/internal/application/build-profile.d.ts +2 -2
  264. package/dist/src/internal/application/dev-environment.d.ts +2 -8
  265. package/dist/src/internal/application/dev-environment.js +1 -1
  266. package/dist/src/internal/application/output-publication.d.ts +1 -1
  267. package/dist/src/internal/application/package.js +1 -1
  268. package/dist/src/internal/application/paths.d.ts +0 -5
  269. package/dist/src/internal/application/paths.js +1 -1
  270. package/dist/src/internal/application/tsconfig-dependencies.d.ts +0 -16
  271. package/dist/src/internal/application/tsconfig-dependencies.js +1 -1
  272. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  273. package/dist/src/internal/authored-definition/source-identity.d.ts +1 -1
  274. package/dist/src/internal/authored-module-map-loader.js +1 -1
  275. package/dist/src/internal/bundler/extension-scope-plugin.d.ts +2 -1
  276. package/dist/src/internal/bundler/nitro-rolldown.d.ts +0 -11
  277. package/dist/src/internal/bundler/nitro-rolldown.js +1 -1
  278. package/dist/src/internal/eve-project-root.d.ts +0 -3
  279. package/dist/src/internal/eve-project-root.js +1 -1
  280. package/dist/src/internal/external-resources-snapshot.d.ts +1 -1
  281. package/dist/src/internal/external-resources.d.ts +0 -1
  282. package/dist/src/internal/external-resources.js +1 -1
  283. package/dist/src/internal/helpers/markdown.js +1 -1
  284. package/dist/src/internal/invocation/metadata.d.ts +1 -1
  285. package/dist/src/internal/materialized-authored-modules.d.ts +2 -1
  286. package/dist/src/internal/mcp/protected-resource.d.ts +2 -1
  287. package/dist/src/internal/mcp/streamable-http-server.d.ts +4 -5
  288. package/dist/src/internal/mcp/streamable-http-server.js +1 -1
  289. package/dist/src/internal/model-catalog.d.ts +2 -1
  290. package/dist/src/internal/nitro/dev-runtime-artifacts.d.ts +0 -4
  291. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  292. package/dist/src/internal/nitro/dev-runtime-source-snapshot.d.ts +0 -1
  293. package/dist/src/internal/nitro/dev-runtime-source-snapshot.js +1 -1
  294. package/dist/src/internal/nitro/development-generation.d.ts +0 -1
  295. package/dist/src/internal/nitro/development-generation.js +1 -1
  296. package/dist/src/internal/nitro/host/channel-routes.d.ts +1 -1
  297. package/dist/src/internal/nitro/host/dev-authored-rebuild-coordinator.d.ts +2 -1
  298. package/dist/src/internal/nitro/host/dev-host-candidate.d.ts +2 -1
  299. package/dist/src/internal/nitro/host/drained-nitro-dev-server.d.ts +1 -1
  300. package/dist/src/internal/nitro/host/extension-capability-requirements.js +1 -1
  301. package/dist/src/internal/nitro/host/schedule-task-routes.d.ts +1 -1
  302. package/dist/src/internal/nitro/host/workspace-extensions.js +1 -1
  303. package/dist/src/internal/nitro/routes/channel-request-instrumentation.d.ts +2 -1
  304. package/dist/src/internal/nitro/routes/channel-route-context.d.ts +1 -1
  305. package/dist/src/internal/nitro/routes/runtime-stack.d.ts +2 -1
  306. package/dist/src/internal/resolve-model-endpoint-status.d.ts +2 -1
  307. package/dist/src/internal/vercel/assemble-eve-services.d.ts +3 -2
  308. package/dist/src/internal/vercel/eve-service-contribution.d.ts +2 -3
  309. package/dist/src/internal/vercel/eve-service-contribution.js +1 -1
  310. package/dist/src/internal/vercel/project-link.d.ts +2 -1
  311. package/dist/src/internal/vercel/project-link.js +1 -1
  312. package/dist/src/internal/workflow/development-world-codec.d.ts +2 -1
  313. package/dist/src/internal/workflow/world-compatibility.d.ts +2 -1
  314. package/dist/src/internal/workflow-bundle/builder-support.d.ts +0 -9
  315. package/dist/src/internal/workflow-bundle/builder-support.js +2 -3
  316. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.d.ts +0 -1
  317. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
  318. package/dist/src/protocol/activity.d.ts +3 -3
  319. package/dist/src/protocol/activity.js +1 -1
  320. package/dist/src/protocol/baggage.d.ts +2 -2
  321. package/dist/src/protocol/cancel-turn.d.ts +0 -2
  322. package/dist/src/protocol/event-dedupe.d.ts +2 -1
  323. package/dist/src/protocol/event-id.d.ts +0 -6
  324. package/dist/src/protocol/event-id.js +1 -1
  325. package/dist/src/protocol/traceparent.d.ts +2 -1
  326. package/dist/src/public/channels/chat-sdk/audience.d.ts +2 -4
  327. package/dist/src/public/channels/chat-sdk/audience.js +1 -1
  328. package/dist/src/public/channels/discord/discordChannel.d.ts +1 -1
  329. package/dist/src/public/channels/github/api.d.ts +2 -12
  330. package/dist/src/public/channels/github/api.js +1 -1
  331. package/dist/src/public/channels/github/auth.d.ts +0 -9
  332. package/dist/src/public/channels/github/auth.js +1 -1
  333. package/dist/src/public/channels/github/binding.d.ts +3 -2
  334. package/dist/src/public/channels/github/checkout.d.ts +3 -3
  335. package/dist/src/public/channels/github/defaults.d.ts +3 -2
  336. package/dist/src/public/channels/github/githubChannel.d.ts +1 -1
  337. package/dist/src/public/channels/github/limits.d.ts +0 -2
  338. package/dist/src/public/channels/github/limits.js +2 -2
  339. package/dist/src/public/channels/github/pr-context.d.ts +2 -3
  340. package/dist/src/public/channels/github/pr-context.js +1 -1
  341. package/dist/src/public/channels/github/state.d.ts +2 -1
  342. package/dist/src/public/channels/github/verify.d.ts +2 -1
  343. package/dist/src/public/channels/linear/defaults.d.ts +2 -1
  344. package/dist/src/public/channels/linear/inbound-images.d.ts +2 -1
  345. package/dist/src/public/channels/slack/app-manifest.d.ts +3 -4
  346. package/dist/src/public/channels/slack/app-manifest.js +1 -1
  347. package/dist/src/public/channels/slack/inbound.d.ts +2 -1
  348. package/dist/src/public/channels/slack/model-context.d.ts +0 -18
  349. package/dist/src/public/channels/slack/model-context.js +1 -1
  350. package/dist/src/public/channels/slack/privacy.d.ts +2 -1
  351. package/dist/src/public/channels/slack/verify.d.ts +1 -1
  352. package/dist/src/public/channels/teams/teamsChannel.d.ts +1 -1
  353. package/dist/src/public/channels/telegram/audience.d.ts +2 -3
  354. package/dist/src/public/channels/telegram/audience.js +1 -1
  355. package/dist/src/public/channels/telegram/telegramChannel.d.ts +1 -1
  356. package/dist/src/public/channels/twilio/defaults.d.ts +0 -7
  357. package/dist/src/public/channels/twilio/defaults.js +1 -1
  358. package/dist/src/public/channels/twilio/routing.d.ts +2 -1
  359. package/dist/src/public/channels/twilio/twilioChannel.d.ts +1 -1
  360. package/dist/src/public/definitions/channel.d.ts +1 -1
  361. package/dist/src/public/index.js +1 -1
  362. package/dist/src/public/memory/file/provider.js +1 -1
  363. package/dist/src/public/models/openai/chatgpt/model.d.ts +2 -1
  364. package/dist/src/public/models/openai/chatgpt/token-broker.d.ts +1 -1
  365. package/dist/src/public/nuxt/dev-server.d.ts +3 -2
  366. package/dist/src/public/skills/index.js +1 -1
  367. package/dist/src/public/sveltekit/dev-server.d.ts +3 -2
  368. package/dist/src/public/tools/index.js +1 -1
  369. package/dist/src/runtime/compiled-artifacts-source.d.ts +0 -4
  370. package/dist/src/runtime/compiled-artifacts-source.js +1 -1
  371. package/dist/src/runtime/connections/instance-identity.d.ts +0 -3
  372. package/dist/src/runtime/connections/instance-identity.js +1 -1
  373. package/dist/src/runtime/connections/mcp-tracing.d.ts +1 -6
  374. package/dist/src/runtime/connections/mcp-tracing.js +1 -1
  375. package/dist/src/runtime/connections/openapi-client.d.ts +1 -1
  376. package/dist/src/runtime/connections/scoped-authorization.d.ts +0 -9
  377. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  378. package/dist/src/runtime/hooks/registry.d.ts +0 -7
  379. package/dist/src/runtime/hooks/registry.js +1 -1
  380. package/dist/src/runtime/loaders/artifact-paths.d.ts +2 -1
  381. package/dist/src/runtime/loaders/bundled-artifacts.d.ts +0 -1
  382. package/dist/src/runtime/loaders/bundled-artifacts.js +1 -1
  383. package/dist/src/runtime/resolve-agent.d.ts +2 -2
  384. package/dist/src/runtime/resolve-agent.js +1 -1
  385. package/dist/src/runtime/resolve-dynamic-tool.d.ts +0 -16
  386. package/dist/src/runtime/resolve-dynamic-tool.js +1 -1
  387. package/dist/src/runtime/sandbox/prepared-artifacts.d.ts +1 -2
  388. package/dist/src/runtime/sandbox/prepared-artifacts.js +1 -1
  389. package/dist/src/runtime/schedules/register.d.ts +0 -4
  390. package/dist/src/runtime/schedules/register.js +1 -1
  391. package/dist/src/self-modification/credentials.d.ts +1 -4
  392. package/dist/src/self-modification/credentials.js +1 -1
  393. package/dist/src/self-modification/filesystem.d.ts +0 -1
  394. package/dist/src/self-modification/filesystem.js +1 -1
  395. package/dist/src/self-modification/git-workspace.d.ts +0 -3
  396. package/dist/src/self-modification/git-workspace.js +1 -1
  397. package/dist/src/self-modification/github-publisher.d.ts +2 -1
  398. package/dist/src/self-modification/migration.d.ts +0 -1
  399. package/dist/src/self-modification/migration.js +1 -1
  400. package/dist/src/self-modification/mode.d.ts +2 -1
  401. package/dist/src/self-modification/proposal.d.ts +0 -2
  402. package/dist/src/self-modification/proposal.js +2 -2
  403. package/dist/src/self-modification/setup.js +1 -1
  404. package/dist/src/services/dev-client/agent-info-probe.d.ts +2 -1
  405. package/dist/src/services/dev-client/request-headers.d.ts +1 -1
  406. package/dist/src/setup/ai-gateway-api-key.d.ts +2 -1
  407. package/dist/src/setup/append-env.d.ts +3 -2
  408. package/dist/src/setup/ask.d.ts +3 -3
  409. package/dist/src/setup/boxes/apply-ai-gateway-credential.d.ts +2 -1
  410. package/dist/src/setup/boxes/deploy-project.d.ts +4 -3
  411. package/dist/src/setup/boxes/link-project.d.ts +2 -1
  412. package/dist/src/setup/boxes/resolve-provisioning.d.ts +2 -1
  413. package/dist/src/setup/boxes/select-model.d.ts +0 -1
  414. package/dist/src/setup/boxes/select-model.js +1 -1
  415. package/dist/src/setup/cli/option-row.d.ts +1 -1
  416. package/dist/src/setup/cli/prompt-ui.d.ts +0 -10
  417. package/dist/src/setup/cli/prompt-ui.js +1 -1
  418. package/dist/src/setup/cli/rail-log.d.ts +0 -2
  419. package/dist/src/setup/cli/rail-log.js +2 -2
  420. package/dist/src/setup/connect-provisioning.d.ts +2 -1
  421. package/dist/src/setup/connection-connector.d.ts +2 -1
  422. package/dist/src/setup/flows/link.d.ts +2 -1
  423. package/dist/src/setup/flows/model-login.d.ts +1 -1
  424. package/dist/src/setup/flows/model-source-change.js +1 -1
  425. package/dist/src/setup/flows/registry-session.d.ts +3 -2
  426. package/dist/src/setup/integrations/discord/api.d.ts +2 -1
  427. package/dist/src/setup/integrations/discord/connect.d.ts +3 -3
  428. package/dist/src/setup/integrations/discord/connect.js +1 -1
  429. package/dist/src/setup/integrations/discord/setup.d.ts +2 -1
  430. package/dist/src/setup/integrations/file-memory/vercel.d.ts +1 -1
  431. package/dist/src/setup/integrations/github/connect.d.ts +3 -3
  432. package/dist/src/setup/integrations/github/connect.js +1 -1
  433. package/dist/src/setup/integrations/github/setup.d.ts +1 -1
  434. package/dist/src/setup/integrations/linear/connect.d.ts +2 -2
  435. package/dist/src/setup/integrations/linear/connect.js +1 -1
  436. package/dist/src/setup/integrations/linear/setup.d.ts +1 -1
  437. package/dist/src/setup/integrations/linq/connect.d.ts +3 -4
  438. package/dist/src/setup/integrations/linq/connect.js +1 -1
  439. package/dist/src/setup/integrations/linq/management.d.ts +2 -1
  440. package/dist/src/setup/integrations/linq/setup.d.ts +1 -9
  441. package/dist/src/setup/integrations/linq/setup.js +1 -1
  442. package/dist/src/setup/integrations/photon/connect.d.ts +5 -7
  443. package/dist/src/setup/integrations/photon/connect.js +1 -1
  444. package/dist/src/setup/integrations/photon/management.d.ts +5 -4
  445. package/dist/src/setup/integrations/photon/setup-flow.d.ts +2 -1
  446. package/dist/src/setup/integrations/registry.d.ts +0 -2
  447. package/dist/src/setup/integrations/registry.js +1 -1
  448. package/dist/src/setup/integrations/runner.d.ts +3 -2
  449. package/dist/src/setup/integrations/shared/scaffold.d.ts +2 -1
  450. package/dist/src/setup/integrations/shared/vercel-project.d.ts +2 -1
  451. package/dist/src/setup/integrations/shopify/setup.d.ts +2 -1
  452. package/dist/src/setup/integrations/teams/connect.d.ts +3 -3
  453. package/dist/src/setup/integrations/teams/connect.js +1 -1
  454. package/dist/src/setup/integrations/teams/setup.d.ts +2 -1
  455. package/dist/src/setup/integrations/web/setup.d.ts +2 -1
  456. package/dist/src/setup/primitives/pm/process-result.d.ts +2 -1
  457. package/dist/src/setup/primitives/pm/shared.d.ts +2 -1
  458. package/dist/src/setup/primitives/process-output.d.ts +2 -1
  459. package/dist/src/setup/quit-guard.d.ts +3 -2
  460. package/dist/src/setup/scaffold/create/add-to-project.d.ts +2 -1
  461. package/dist/src/setup/scaffold/create/project.js +1 -1
  462. package/dist/src/setup/scaffold/files.d.ts +2 -1
  463. package/dist/src/setup/scaffold/update/channels.d.ts +0 -1
  464. package/dist/src/setup/scaffold/workspace-glob.d.ts +0 -1
  465. package/dist/src/setup/scaffold/workspace-glob.js +1 -1
  466. package/dist/src/setup/scaffold/workspace-root.d.ts +2 -1
  467. package/dist/src/setup/slack-connect-create.d.ts +1 -1
  468. package/dist/src/setup/slack-connect-lifecycle.d.ts +5 -5
  469. package/dist/src/setup/slack-connect.d.ts +0 -4
  470. package/dist/src/setup/slack-connect.js +1 -1
  471. package/dist/src/setup/slackbot.d.ts +3 -3
  472. package/dist/src/setup/slackbot.js +1 -1
  473. package/dist/src/setup/vercel-project-api.d.ts +1 -1
  474. package/dist/src/setup/vercel-project.d.ts +3 -18
  475. package/dist/src/setup/vercel-project.js +0 -0
  476. package/dist/src/shared/action-types.d.ts +1 -58
  477. package/dist/src/shared/action-types.js +1 -1
  478. package/dist/src/shared/agent-definition.d.ts +0 -3
  479. package/dist/src/shared/agent-turn-outcome.d.ts +1 -3
  480. package/dist/src/shared/agent-turn-outcome.js +1 -1
  481. package/dist/src/shared/chatgpt-model.d.ts +0 -1
  482. package/dist/src/shared/chatgpt-model.js +1 -1
  483. package/dist/src/shared/conversation-context.d.ts +2 -1
  484. package/dist/src/shared/extension-package-contract.d.ts +2 -1
  485. package/dist/src/shared/forwarded-trace-policy.d.ts +3 -2
  486. package/dist/src/shared/gateway-service-tier.d.ts +2 -1
  487. package/dist/src/shared/memory-state.d.ts +0 -8
  488. package/dist/src/shared/memory-state.js +1 -1
  489. package/dist/src/shared/sandbox-environment.d.ts +0 -1
  490. package/dist/src/shared/sandbox-environment.js +1 -1
  491. package/dist/src/shared/skill-package.d.ts +0 -5
  492. package/dist/src/shared/skill-package.js +1 -1
  493. package/dist/src/shared/token-usage.d.ts +0 -7
  494. package/dist/src/shared/token-usage.js +1 -1
  495. package/dist/src/shared/ulid.d.ts +2 -8
  496. package/dist/src/shared/ulid.js +1 -1
  497. package/dist/src/shared/vercel-project.d.ts +2 -1
  498. package/dist/src/shared/vercel-services.d.ts +2 -2
  499. package/dist/src/shared/workflow-sandbox.d.ts +0 -7
  500. package/dist/src/source-change/agent-config-ast.d.ts +2 -1
  501. package/dist/src/source-change/agent-config-string-path.d.ts +2 -2
  502. package/dist/src/source-change/apply-agent-model-settings.d.ts +2 -1
  503. package/dist/src/source-change/apply-model-selection.d.ts +2 -1
  504. package/dist/src/source-change/static-source-change.d.ts +4 -3
  505. package/dist/src/subagents/invocation.d.ts +1 -1
  506. package/dist/src/subagents/tool.d.ts +2 -1
  507. package/dist/src/tools/definition.d.ts +0 -3
  508. package/dist/src/tools/durable-callbacks.d.ts +1 -2
  509. package/dist/src/tools/durable-callbacks.js +1 -1
  510. package/dist/src/tools/framework/agent.js +1 -1
  511. package/dist/src/tools/framework/task-cancel.d.ts +1 -1
  512. package/dist/src/tools/native-definition.d.ts +2 -1
  513. package/dist/src/tracing/agent-action-instrumentation.d.ts +2 -1
  514. package/dist/src/tracing/agent-memory-instrumentation.d.ts +2 -1
  515. package/dist/src/tracing/agent-otel-provider.d.ts +2 -1
  516. package/dist/src/tracing/agent-span-id-generator.d.ts +0 -1
  517. package/dist/src/tracing/agent-span-id-generator.js +1 -1
  518. package/dist/src/tracing/agent-tool-instrumentation.d.ts +2 -1
  519. package/dist/src/tracing/agent-tool-span-context.d.ts +3 -2
  520. package/dist/src/tracing/agent-trace-state.d.ts +0 -24
  521. package/dist/src/tracing/agent-trace-state.js +1 -1
  522. package/dist/src/tracing/batch-span-processor.d.ts +2 -1
  523. package/dist/src/tracing/local-trace-analysis.d.ts +4 -3
  524. package/dist/src/tracing/local-trace-discovery-index.d.ts +0 -2
  525. package/dist/src/tracing/local-trace-discovery-index.js +1 -1
  526. package/dist/src/tracing/local-trace-query.d.ts +2 -1
  527. package/dist/src/tracing/local-trace-retention.d.ts +4 -4
  528. package/dist/src/tracing/telemetry-budget.d.ts +0 -1
  529. package/dist/src/tracing/telemetry-budget.js +1 -1
  530. package/package.json +8 -8
  531. package/dist/src/cli/commands/channel-add-conflicts.d.ts +0 -21
  532. package/dist/src/cli/commands/channel-add-conflicts.js +0 -1
  533. package/dist/src/cli/commands/registry-search-presentation.d.ts +0 -16
  534. package/dist/src/cli/commands/registry-search-presentation.js +0 -6
  535. package/dist/src/compiled/_chunks/workflow/dist-BfMqXLK3.js +0 -3
  536. package/dist/src/compiled/_chunks/workflow/helpers-CNMO7zB1.js +0 -1
  537. package/dist/src/compiled/_chunks/workflow/logger-BCEj9caG.js +0 -14
  538. package/dist/src/compiled/_chunks/workflow/resume-hook-QS_cMwHn.js +0 -1
  539. package/dist/src/compiled/_chunks/workflow/run-CA5wWV2S.js +0 -1
  540. package/dist/src/compiled/_chunks/workflow/serialization-CJ265vSe.js +0 -3
  541. package/dist/src/compiled/_chunks/workflow/sleep-CBn94Ayv.js +0 -1
  542. package/dist/src/compiled/_chunks/workflow/wait-until-Bo2U6ON9.js +0 -1
  543. package/dist/src/compiler/compile-from-memory.d.ts +0 -44
  544. package/dist/src/compiler/compile-from-memory.js +0 -1
  545. package/dist/src/execution/connection-auth-tool-result.d.ts +0 -2
  546. package/dist/src/execution/connection-auth-tool-result.js +0 -1
  547. package/dist/src/internal/process/pnpm.d.ts +0 -28
  548. package/dist/src/internal/process/pnpm.js +0 -1
  549. package/dist/src/public/channels/slack/api-encoding.d.ts +0 -5
  550. package/dist/src/public/channels/slack/api-encoding.js +0 -1
  551. package/dist/src/public/definitions/instrumentation.d.ts +0 -1
  552. package/dist/src/public/definitions/instrumentation.js +0 -1
  553. package/dist/src/public/models/openai/chatgpt/unsigned-jwt.d.ts +0 -5
  554. package/dist/src/public/models/openai/chatgpt/unsigned-jwt.js +0 -1
  555. package/dist/src/sandbox/backends/probes.d.ts +0 -7
  556. package/dist/src/sandbox/backends/probes.js +0 -1
  557. package/dist/src/setup/channel-add-conflicts.d.ts +0 -28
  558. package/dist/src/setup/channel-add-conflicts.js +0 -1
  559. package/dist/src/setup/primitives/run-pnpm.d.ts +0 -1
  560. package/dist/src/setup/primitives/run-pnpm.js +0 -1
  561. package/dist/src/shared/dispatch-action.d.ts +0 -30
  562. package/dist/src/shared/dispatch-action.js +0 -1
@@ -1 +1 @@
1
- import"#protocol/activity.js";import{normalizePresentationText}from"#shared/presentation-text.js";const MAX_ACTIVITY_EVENT_IDS=1e3,MAX_ACTIVITY_PENDING_SETTLEMENTS=500,MAX_ACTIVITY_ENTITIES=500;function createActivitySnapshot(){return{actions:{},blockers:{},pendingSettlements:{},revision:0,seenEventIds:[],version:1,work:{}}}function reduceActivityBatch(e,t){let n=e,r=e.seenEventIds,i=!1,a=!1;for(let e of t.events){if(r.includes(e.eventId))continue;let t=reduceEvent(n,e);t!==n&&(a=!0,r=appendBounded(r,e.eventId,MAX_ACTIVITY_EVENT_IDS),i||=presentationDiffers(n,t),n=t)}return a?i?{...n,revision:e.revision+1,seenEventIds:r}:{...n,revision:e.revision,seenEventIds:r}:e}function presentationDiffers(e,t){return e.actions!==t.actions||e.blockers!==t.blockers||e.work!==t.work}function reduceEvent(e,t){switch(t.kind){case`work.started`:return startWork(e,t);case`work.settled`:return settleWork(e,t);case`action.started`:return startAction(e,t);case`action.settled`:return settleAction(e,t);case`action.label.updated`:return updateActionLabel(e,t);case`blocker.started`:return startBlocker(e,t);case`blocker.settled`:return settleBlocker(e,t)}}function startWork(e,t){if(e.work[t.work.id]!==void 0)return e;let n=pendingFor(e,`work`,t.work.id),r=t.work.parentId===void 0?void 0:e.work[t.work.parentId],i=n?.outcome??(!isBackgroundWorkBoundary(e,t.work)&&r!==void 0&&r.phase!==`running`?`cancelled`:`running`),a={...t.work,label:t.work.label===void 0?void 0:normalizePresentationText(t.work.label),name:t.work.name===void 0?void 0:normalizePresentationText(t.work.name),phase:i,settledAt:n?.settledAt??(i===`cancelled`?r?.settledAt:void 0),startedAt:t.startedAt},o={...e,pendingSettlements:removeKey(e.pendingSettlements,pendingKey(`work`,a.id)),work:replaceBounded(e.work,a.id,a)};return a.phase===`running`?o:settleWorkTree(o,{outcome:a.phase,settledAt:a.settledAt??t.startedAt,workId:a.id})}function settleWork(e,t){let n=e.work[t.workId];return n===void 0?retainPending(e,`work`,t.workId,t):n.phase===`running`?settleWorkTree(e,{outcome:t.outcome,settledAt:t.settledAt,workId:t.workId}):e}function startAction(e,t){if(e.actions[t.action.id]!==void 0)return e;let n=pendingFor(e,`action`,t.action.id),r=e.work[t.action.parentWorkId],i=n?.outcome??(r!==void 0&&r.phase!==`running`?`cancelled`:`running`);return{...e,actions:replaceBounded(e.actions,t.action.id,{...t.action,name:normalizePresentationText(t.action.name),phase:i,settledAt:n?.settledAt??(i===`cancelled`?r?.settledAt:void 0),startedAt:t.startedAt}),pendingSettlements:removeKey(e.pendingSettlements,pendingKey(`action`,t.action.id))}}function updateActionLabel(e,t){let n=e.actions[t.actionId];if(n===void 0)return e;let r=normalizePresentationText(t.label);return n.label===r?e:{...e,actions:replaceBounded(e.actions,t.actionId,{...n,label:r})}}function settleAction(e,t){let n=e.actions[t.actionId];return n===void 0?retainPending(e,`action`,t.actionId,t):n.phase===`running`?{...e,actions:replaceBounded(e.actions,t.actionId,{...n,phase:t.outcome,settledAt:t.settledAt})}:e}function startBlocker(e,t){if(e.blockers[t.blocker.id]!==void 0)return e;let n=pendingFor(e,`blocker`,t.blocker.id),r=e.work[t.blocker.parentWorkId],i=n?.outcome??(r!==void 0&&r.phase!==`running`?`cancelled`:`blocked`);return{...e,blockers:replaceBounded(e.blockers,t.blocker.id,{...t.blocker,label:t.blocker.label===void 0?void 0:normalizePresentationText(t.blocker.label),phase:i,settledAt:n?.settledAt??(i===`cancelled`?r?.settledAt:void 0),startedAt:t.startedAt}),pendingSettlements:removeKey(e.pendingSettlements,pendingKey(`blocker`,t.blocker.id))}}function settleBlocker(e,t){let n=e.blockers[t.blockerId];return n===void 0?retainPending(e,`blocker`,t.blockerId,t):n.phase===`blocked`?{...e,blockers:replaceBounded(e.blockers,t.blockerId,{...n,phase:t.outcome,settledAt:t.settledAt})}:e}function retainPending(e,t,n,r){let i=pendingKey(t,n);return e.pendingSettlements[i]===void 0?{...e,pendingSettlements:replaceBounded(e.pendingSettlements,i,{entityKind:t,eventId:r.eventId,outcome:r.outcome,settledAt:r.settledAt},500)}:e}function pendingFor(e,t,n){return e.pendingSettlements[pendingKey(t,n)]}function pendingKey(e,t){return`${e}:${t}`}function settleWorkTree(e,t){let n=new Set([t.workId]),r=!0;for(;r;){r=!1;for(let t of Object.values(e.work))t.parentId===void 0||!n.has(t.parentId)||n.has(t.id)||isBackgroundWorkBoundary(e,t)||(n.add(t.id),r=!0)}return{...e,actions:mapActivityStates(e.actions,e=>n.has(e.parentWorkId)&&e.phase===`running`?{...e,phase:`cancelled`,settledAt:t.settledAt}:e),blockers:mapActivityStates(e.blockers,e=>n.has(e.parentWorkId)&&e.phase===`blocked`?{...e,phase:`cancelled`,settledAt:t.settledAt}:e),work:mapActivityStates(e.work,e=>e.id===t.workId?{...e,phase:t.outcome,settledAt:t.settledAt}:n.has(e.id)&&e.phase===`running`?{...e,phase:`cancelled`,settledAt:t.settledAt}:e)}}function isBackgroundWorkBoundary(e,t){return t.kind===`task`?!0:t.callId===void 0||t.parentId===void 0?!1:e.actions[`action:${t.parentId}:${t.callId}`]!==void 0}function mapActivityStates(e,t){let n=e;for(let[r,i]of Object.entries(e)){let a=t(i);a!==i&&(n===e&&(n={...e}),n[r]=a)}return n}function replaceBounded(e,t,n,r=500){let i={...e,[t]:n},a=Object.keys(i).length-r;for(let e of Object.keys(i).slice(0,Math.max(0,a)))delete i[e];return i}function removeKey(e,t){if(e[t]===void 0)return e;let n={...e};return delete n[t],n}function appendBounded(e,t,n){return[...e,t].slice(-n)}export{MAX_ACTIVITY_ENTITIES,MAX_ACTIVITY_EVENT_IDS,MAX_ACTIVITY_PENDING_SETTLEMENTS,createActivitySnapshot,reduceActivityBatch};
1
+ import"#protocol/activity.js";import{normalizePresentationText}from"#shared/presentation-text.js";function createActivitySnapshot(){return{actions:{},blockers:{},pendingSettlements:{},revision:0,seenEventIds:[],version:1,work:{}}}function reduceActivityBatch(e,t){let n=e,r=e.seenEventIds,i=!1,a=!1;for(let e of t.events){if(r.includes(e.eventId))continue;let t=reduceEvent(n,e);t!==n&&(a=!0,r=appendBounded(r,e.eventId,1e3),i||=presentationDiffers(n,t),n=t)}return a?i?{...n,revision:e.revision+1,seenEventIds:r}:{...n,revision:e.revision,seenEventIds:r}:e}function presentationDiffers(e,t){return e.actions!==t.actions||e.blockers!==t.blockers||e.work!==t.work}function reduceEvent(e,t){switch(t.kind){case`work.started`:return startWork(e,t);case`work.settled`:return settleWork(e,t);case`action.started`:return startAction(e,t);case`action.settled`:return settleAction(e,t);case`action.label.updated`:return updateActionLabel(e,t);case`blocker.started`:return startBlocker(e,t);case`blocker.settled`:return settleBlocker(e,t)}}function startWork(e,t){if(e.work[t.work.id]!==void 0)return e;let n=pendingFor(e,`work`,t.work.id),r=t.work.parentId===void 0?void 0:e.work[t.work.parentId],i=n?.outcome??(!isBackgroundWorkBoundary(e,t.work)&&r!==void 0&&r.phase!==`running`?`cancelled`:`running`),a={...t.work,label:t.work.label===void 0?void 0:normalizePresentationText(t.work.label),name:t.work.name===void 0?void 0:normalizePresentationText(t.work.name),phase:i,settledAt:n?.settledAt??(i===`cancelled`?r?.settledAt:void 0),startedAt:t.startedAt},o={...e,pendingSettlements:removeKey(e.pendingSettlements,pendingKey(`work`,a.id)),work:replaceBounded(e.work,a.id,a)};return a.phase===`running`?o:settleWorkTree(o,{outcome:a.phase,settledAt:a.settledAt??t.startedAt,workId:a.id})}function settleWork(e,t){let n=e.work[t.workId];return n===void 0?retainPending(e,`work`,t.workId,t):n.phase===`running`?settleWorkTree(e,{outcome:t.outcome,settledAt:t.settledAt,workId:t.workId}):e}function startAction(e,t){if(e.actions[t.action.id]!==void 0)return e;let n=pendingFor(e,`action`,t.action.id),r=e.work[t.action.parentWorkId],i=n?.outcome??(r!==void 0&&r.phase!==`running`?`cancelled`:`running`);return{...e,actions:replaceBounded(e.actions,t.action.id,{...t.action,name:normalizePresentationText(t.action.name),phase:i,settledAt:n?.settledAt??(i===`cancelled`?r?.settledAt:void 0),startedAt:t.startedAt}),pendingSettlements:removeKey(e.pendingSettlements,pendingKey(`action`,t.action.id))}}function updateActionLabel(e,t){let n=e.actions[t.actionId];if(n===void 0)return e;let r=normalizePresentationText(t.label);return n.label===r?e:{...e,actions:replaceBounded(e.actions,t.actionId,{...n,label:r})}}function settleAction(e,t){let n=e.actions[t.actionId];return n===void 0?retainPending(e,`action`,t.actionId,t):n.phase===`running`?{...e,actions:replaceBounded(e.actions,t.actionId,{...n,phase:t.outcome,settledAt:t.settledAt})}:e}function startBlocker(e,t){if(e.blockers[t.blocker.id]!==void 0)return e;let n=pendingFor(e,`blocker`,t.blocker.id),r=e.work[t.blocker.parentWorkId],i=n?.outcome??(r!==void 0&&r.phase!==`running`?`cancelled`:`blocked`);return{...e,blockers:replaceBounded(e.blockers,t.blocker.id,{...t.blocker,label:t.blocker.label===void 0?void 0:normalizePresentationText(t.blocker.label),phase:i,settledAt:n?.settledAt??(i===`cancelled`?r?.settledAt:void 0),startedAt:t.startedAt}),pendingSettlements:removeKey(e.pendingSettlements,pendingKey(`blocker`,t.blocker.id))}}function settleBlocker(e,t){let n=e.blockers[t.blockerId];return n===void 0?retainPending(e,`blocker`,t.blockerId,t):n.phase===`blocked`?{...e,blockers:replaceBounded(e.blockers,t.blockerId,{...n,phase:t.outcome,settledAt:t.settledAt})}:e}function retainPending(e,t,n,r){let i=pendingKey(t,n);return e.pendingSettlements[i]===void 0?{...e,pendingSettlements:replaceBounded(e.pendingSettlements,i,{entityKind:t,eventId:r.eventId,outcome:r.outcome,settledAt:r.settledAt},500)}:e}function pendingFor(e,t,n){return e.pendingSettlements[pendingKey(t,n)]}function pendingKey(e,t){return`${e}:${t}`}function settleWorkTree(e,t){let n=new Set([t.workId]),r=!0;for(;r;){r=!1;for(let t of Object.values(e.work))t.parentId===void 0||!n.has(t.parentId)||n.has(t.id)||isBackgroundWorkBoundary(e,t)||(n.add(t.id),r=!0)}return{...e,actions:mapActivityStates(e.actions,e=>n.has(e.parentWorkId)&&e.phase===`running`?{...e,phase:`cancelled`,settledAt:t.settledAt}:e),blockers:mapActivityStates(e.blockers,e=>n.has(e.parentWorkId)&&e.phase===`blocked`?{...e,phase:`cancelled`,settledAt:t.settledAt}:e),work:mapActivityStates(e.work,e=>e.id===t.workId?{...e,phase:t.outcome,settledAt:t.settledAt}:n.has(e.id)&&e.phase===`running`?{...e,phase:`cancelled`,settledAt:t.settledAt}:e)}}function isBackgroundWorkBoundary(e,t){return t.kind===`task`?!0:t.callId===void 0||t.parentId===void 0?!1:e.actions[`action:${t.parentId}:${t.callId}`]!==void 0}function mapActivityStates(e,t){let n=e;for(let[r,i]of Object.entries(e)){let a=t(i);a!==i&&(n===e&&(n={...e}),n[r]=a)}return n}function replaceBounded(e,t,n,r=500){let i={...e,[t]:n},a=Object.keys(i).length-r;for(let e of Object.keys(i).slice(0,Math.max(0,a)))delete i[e];return i}function removeKey(e,t){if(e[t]===void 0)return e;let n={...e};return delete n[t],n}function appendBounded(e,t,n){return[...e,t].slice(-n)}export{createActivitySnapshot,reduceActivityBatch};
@@ -1,5 +1,5 @@
1
1
  import type { DeliverHookPayload, SessionCommand, SessionTimeoutHookPayload } from "#channel/types.js";
2
- export type DecodedSessionInbox = DeliverHookPayload | SessionTimeoutHookPayload | Extract<SessionCommand, {
2
+ type DecodedSessionInbox = DeliverHookPayload | SessionTimeoutHookPayload | Extract<SessionCommand, {
3
3
  readonly kind: "cancel" | "clear" | "compact" | "reset";
4
4
  }>;
5
5
  /** Invalid current-generation inbox payload. Historical wire shapes are not accepted. */
@@ -8,3 +8,4 @@ export declare class SessionInboxPayloadError extends Error {
8
8
  }
9
9
  /** Normalizes the one authored `send` convenience command into a delivery. */
10
10
  export declare function decodeSessionInboxPayload(value: unknown): DecodedSessionInbox;
11
+ export {};
@@ -7,7 +7,7 @@ export declare const DEFAULT_ROOT_MAX_INPUT_TOKENS_PER_SESSION = 40000000;
7
7
  * explicitly uncapped the axis (skipping the root default). Resolution maps
8
8
  * this shape onto the numeric {@link SessionLimits} the harness checks.
9
9
  */
10
- export interface AuthoredSessionLimits {
10
+ interface AuthoredSessionLimits {
11
11
  readonly maxInputTokensPerSession?: number | false;
12
12
  readonly maxOutputTokensPerSession?: number | false;
13
13
  readonly maxTokenCostUsdPerSession?: number | false;
@@ -31,7 +31,7 @@ export declare function createCompactionConfig(input?: {
31
31
  lastKnownInputTokens: number;
32
32
  lastKnownPromptMessageCount: number | undefined;
33
33
  };
34
- export interface CreateSessionInput {
34
+ interface CreateSessionInput {
35
35
  readonly continuationToken: string;
36
36
  readonly compactionOverrides?: {
37
37
  readonly thresholdPercent?: number;
@@ -88,3 +88,4 @@ export declare function hydrateDurableSession(input: {
88
88
  readonly thresholdPercent?: number;
89
89
  };
90
90
  }): HarnessSession;
91
+ export {};
@@ -1,9 +1,3 @@
1
- /**
2
- * eve workflow functions whose bundled id carries no `@<version>` stamp, so
3
- * an explicitly stamped deployment can find them across eve versions.
4
- * Dependency-free so the bundler can import it.
5
- */
6
- export declare const TURN_WORKFLOW_NAME = "turnWorkflow";
7
1
  export declare const WORKFLOW_ENTRY_NAME = "workflowEntry";
8
2
  export declare const SESSION_TIMEOUT_WORKFLOW_NAME = "sessionTimeoutWorkflow";
9
3
  export declare const WORKFLOW_TOOL_RUN_WORKFLOW_NAME = "workflowToolRunWorkflow";
@@ -1 +1 @@
1
- const TURN_WORKFLOW_NAME=`turnWorkflow`,WORKFLOW_ENTRY_NAME=`workflowEntry`,SESSION_TIMEOUT_WORKFLOW_NAME=`sessionTimeoutWorkflow`,WORKFLOW_TOOL_RUN_WORKFLOW_NAME=`workflowToolRunWorkflow`,ACTIVITY_COLLECTOR_WORKFLOW_NAME=`activityCollectorWorkflow`,STABLE_WORKFLOW_NAMES=new Set([WORKFLOW_ENTRY_NAME,TURN_WORKFLOW_NAME,SESSION_TIMEOUT_WORKFLOW_NAME,WORKFLOW_TOOL_RUN_WORKFLOW_NAME,ACTIVITY_COLLECTOR_WORKFLOW_NAME]);export{ACTIVITY_COLLECTOR_WORKFLOW_NAME,SESSION_TIMEOUT_WORKFLOW_NAME,STABLE_WORKFLOW_NAMES,TURN_WORKFLOW_NAME,WORKFLOW_ENTRY_NAME,WORKFLOW_TOOL_RUN_WORKFLOW_NAME};
1
+ const WORKFLOW_ENTRY_NAME=`workflowEntry`,SESSION_TIMEOUT_WORKFLOW_NAME=`sessionTimeoutWorkflow`,WORKFLOW_TOOL_RUN_WORKFLOW_NAME=`workflowToolRunWorkflow`,ACTIVITY_COLLECTOR_WORKFLOW_NAME=`activityCollectorWorkflow`,STABLE_WORKFLOW_NAMES=new Set([WORKFLOW_ENTRY_NAME,`turnWorkflow`,SESSION_TIMEOUT_WORKFLOW_NAME,WORKFLOW_TOOL_RUN_WORKFLOW_NAME,ACTIVITY_COLLECTOR_WORKFLOW_NAME]);export{ACTIVITY_COLLECTOR_WORKFLOW_NAME,SESSION_TIMEOUT_WORKFLOW_NAME,STABLE_WORKFLOW_NAMES,WORKFLOW_ENTRY_NAME,WORKFLOW_TOOL_RUN_WORKFLOW_NAME};
@@ -1 +1 @@
1
- import{evaluate}from"#ai/evaluate.js";async function executeAgentRouterTool(e,t){"use workflow";let n=await chooseTarget(e.message,descriptions(t),t.abortSignal);return t.agent(n,{message:e.message})}async function chooseTarget(e,t,n){"use step";let r=Object.keys(t);if(r.length===0)throw Error(`agentRouter requires at least one available agent with a description.`);return r.length===1?r[0]:(await evaluate({abortSignal:n,state:{message:e},questions:{route:{type:`choice`,instructions:`Which subagent should handle this task?`,criteria:t}}})).answers.route.choice}function descriptions(e){return Object.fromEntries(Object.entries(e.agents).flatMap(([e,t])=>{let n=t.description.trim();return n.length===0?[]:[[e,n]]}))}executeAgentRouterTool.workflowId=`workflow//eve@0.67.1//executeAgentRouterTool`;export{executeAgentRouterTool};
1
+ import{evaluate}from"#ai/evaluate.js";async function executeAgentRouterTool(e,t){"use workflow";let n=await chooseTarget(e.message,descriptions(t),t.abortSignal);return t.agent(n,{message:e.message})}async function chooseTarget(e,t,n){"use step";let r=Object.keys(t);if(r.length===0)throw Error(`agentRouter requires at least one available agent with a description.`);return r.length===1?r[0]:(await evaluate({abortSignal:n,state:{message:e},questions:{route:{type:`choice`,instructions:`Which subagent should handle this task?`,criteria:t}}})).answers.route.choice}function descriptions(e){return Object.fromEntries(Object.entries(e.agents).flatMap(([e,t])=>{let n=t.description.trim();return n.length===0?[]:[[e,n]]}))}executeAgentRouterTool.workflowId=`workflow//eve@0.67.2//executeAgentRouterTool`;export{executeAgentRouterTool};
@@ -1 +1 @@
1
- async function executeAskQuestionTool(e,t){"use workflow";return toAskQuestionOutput(await t.ask(toAskQuestionRequest(e)))}function toAskQuestionRequest(e){let t=e.options?.map(e=>({description:e.description,id:e.label,label:e.label}));return{allowFreeform:!0,dismissible:!0,display:t===void 0?`text`:`select`,prompt:e.question,...t!==void 0&&{options:t}}}function toAskQuestionOutput(e){return e.status===`answered`?{answer:e.optionId??e.text??``,status:`answered`}:{status:e.status}}executeAskQuestionTool.workflowId=`workflow//eve@0.67.1//executeAskQuestionTool`;export{executeAskQuestionTool,toAskQuestionOutput,toAskQuestionRequest};
1
+ async function executeAskQuestionTool(e,t){"use workflow";return toAskQuestionOutput(await t.ask(toAskQuestionRequest(e)))}function toAskQuestionRequest(e){let t=e.options?.map(e=>({description:e.description,id:e.label,label:e.label}));return{allowFreeform:!0,dismissible:!0,display:t===void 0?`text`:`select`,prompt:e.question,...t!==void 0&&{options:t}}}function toAskQuestionOutput(e){return e.status===`answered`?{answer:e.optionId??e.text??``,status:`answered`}:{status:e.status}}executeAskQuestionTool.workflowId=`workflow//eve@0.67.2//executeAskQuestionTool`;export{executeAskQuestionTool,toAskQuestionOutput,toAskQuestionRequest};
@@ -1,2 +1,2 @@
1
- import{createLogger}from"#internal/logging.js";import{loadContext}from"#context/container.js";import{toError}from"#shared/errors.js";import{defineJsonSchema}from"#tools/schema.js";import{defineTool}from"#tools/definition.js";import{stampDurableDynamicToolCallbacks}from"#tools/durable-callbacks.js";import{ContextKey}from"#context/key.js";import{ConnectionRegistryKey}from"#context/providers/connection-key.js";import{resolveApprovalPolicy}from"#approval/definition.js";import{getAuthorizationResults,requestAuthorization}from"#harness/authorization.js";import{createAuthorizationExecution}from"#runtime/connections/scoped-authorization.js";import{isConnectionAuthorizationFailedError,isConnectionAuthorizationRequiredError}from"#connections/errors.js";import{resolveConnectionAuthorization}from"#runtime/connections/resolve-authorization.js";import{supportsInteractiveAuthorization}from"#shared/connection-types.js";const logger=createLogger(`framework.connection-search-dynamic`),CONNECTION_SEARCH_INPUT_SCHEMA=defineJsonSchema({type:`object`,properties:{connection:{type:`string`,description:`Optional: limit search to a specific connection name.`},keywords:{type:`string`,description:`Search keywords and expanded aliases. Distill intent into keywords; avoid stop words like 'a', 'the', 'in'.`},limit:{type:`number`,description:`Max results to return. Default 10.`}},required:[`keywords`],additionalProperties:!1}),CONNECTION_SEARCH_OUTPUT_SCHEMA=defineJsonSchema({type:`array`,items:{type:`object`,properties:{connection:{type:`string`},description:{type:`string`},error:{type:`string`},inputSchema:{type:`object`},needsAuthorization:{type:`boolean`},outputSchema:{type:`object`},qualifiedName:{type:`string`},tool:{type:`string`}},required:[`connection`,`description`],additionalProperties:!1}}),ConnectionSearchResultsKey=new ContextKey(`eve.connectionSearchResults`);function qualifiedConnectionToolName(e,t){return`${e}__${t}`}function tokenize(e){return e.toLowerCase().split(/[\s_\-./]+/).filter(e=>e.length>1)}function scoreMatch(e,t){let n=tokenize(t.name),r=tokenize(t.description),i=0;for(let t of e){for(let e of n)(e.includes(t)||t.includes(e))&&(i+=3);for(let e of r)(e.includes(t)||t.includes(e))&&(i+=1)}return i}async function resolveInteractiveAuth(e,t){let n=e.getConnections().find(e=>e.connectionName===t);if(n===void 0)return;let r=await resolveConnectionAuthorization(n);if(r!==void 0&&supportsInteractiveAuthorization(r))return{scope:n.connectionName,instanceId:n.instanceId,connection:{url:n.url??``},authorization:r}}async function completePendingAuthorizations(e,t,n){assertPendingConnectionAuthorizationInstances(e);for(let r of t){if(!getAuthorizationResults().some(e=>e.name===r.connectionName))continue;let t=await resolveInteractiveAuth(e,r.connectionName);t!==void 0&&await n.complete(t)}}async function executeConnectionSearch(e){let t=loadContext(),n=t.get(ConnectionRegistryKey);if(n===void 0)return[];let r=e.limit??10,i=tokenize(e.keywords),a=[],o=[],s=e.connection!==void 0&&e.connection!==``?n.getConnections().filter(t=>t.connectionName===e.connection):n.getConnections();if(e.connection&&s.length===0)throw Error(`Connection "${e.connection}" is not registered. Available connections: ${n.getConnectionNames().join(`, `)}.`);let c=createAuthorizationExecution();await completePendingAuthorizations(n,s,c);let l=[];for(let e of s){let t;try{t=await n.getClient(e.connectionName).getToolMetadata()}catch(t){if(isConnectionAuthorizationRequiredError(t)){let r=await resolveInteractiveAuth(n,e.connectionName);if(r!==void 0)try{let e=await c.handleError(t,r);l.push(...e.challenges)}catch(t){let n=toError(t);logger.warn(`connection authorization failed`,{connection:e.connectionName,error:n}),o.push({connection:e.connectionName,description:e.description,error:isConnectionAuthorizationFailedError(n)?n.message:`Failed to start authorization for "${e.connectionName}": ${n.message}`});continue}o.push({connection:e.connectionName,description:e.description,needsAuthorization:!0});continue}if(isConnectionAuthorizationFailedError(t)){logger.warn(`connection authorization failed`,{connection:e.connectionName,reason:t.reason,retryable:t.retryable,error:t}),o.push({connection:e.connectionName,description:e.description,error:`Authorization failed for ${e.connectionName}: ${t.message}`});continue}let r=toError(t);logger.warn(`failed to load connection tools`,{connection:e.connectionName,error:r}),o.push({connection:e.connectionName,description:e.description,error:`Failed to load tools for "${e.connectionName}": ${r.message}`});continue}for(let n of t){let t=scoreMatch(i,n);t>0&&a.push({item:{connection:e.connectionName,description:n.description,inputSchema:n.inputSchema,outputSchema:n.outputSchema,qualifiedName:qualifiedConnectionToolName(e.connectionName,n.name),tool:n.name},score:t})}}if(l.length>0)return requestAuthorization(l);let u=o.filter(e=>e.error!==void 0);if(s.length>0&&u.length===s.length)throw Error(u.map(e=>e.error).join(`
1
+ import{createLogger}from"#internal/logging.js";import{loadContext}from"#context/container.js";import{toError}from"#shared/errors.js";import{defineJsonSchema}from"#tools/schema.js";import{stampDurableDynamicToolCallbacks}from"#tools/durable-callbacks.js";import{ContextKey}from"#context/key.js";import{ConnectionRegistryKey}from"#context/providers/connection-key.js";import{resolveApprovalPolicy}from"#approval/definition.js";import{getAuthorizationResults,requestAuthorization}from"#harness/authorization.js";import{createAuthorizationExecution}from"#runtime/connections/scoped-authorization.js";import{isConnectionAuthorizationFailedError,isConnectionAuthorizationRequiredError}from"#connections/errors.js";import{defineTool}from"#tools/definition.js";import{resolveConnectionAuthorization}from"#runtime/connections/resolve-authorization.js";import{supportsInteractiveAuthorization}from"#shared/connection-types.js";const logger=createLogger(`framework.connection-search-dynamic`),CONNECTION_SEARCH_INPUT_SCHEMA=defineJsonSchema({type:`object`,properties:{connection:{type:`string`,description:`Optional: limit search to a specific connection name.`},keywords:{type:`string`,description:`Search keywords and expanded aliases. Distill intent into keywords; avoid stop words like 'a', 'the', 'in'.`},limit:{type:`number`,description:`Max results to return. Default 10.`}},required:[`keywords`],additionalProperties:!1}),CONNECTION_SEARCH_OUTPUT_SCHEMA=defineJsonSchema({type:`array`,items:{type:`object`,properties:{connection:{type:`string`},description:{type:`string`},error:{type:`string`},inputSchema:{type:`object`},needsAuthorization:{type:`boolean`},outputSchema:{type:`object`},qualifiedName:{type:`string`},tool:{type:`string`}},required:[`connection`,`description`],additionalProperties:!1}}),ConnectionSearchResultsKey=new ContextKey(`eve.connectionSearchResults`);function qualifiedConnectionToolName(e,t){return`${e}__${t}`}function tokenize(e){return e.toLowerCase().split(/[\s_\-./]+/).filter(e=>e.length>1)}function scoreMatch(e,t){let n=tokenize(t.name),r=tokenize(t.description),i=0;for(let t of e){for(let e of n)(e.includes(t)||t.includes(e))&&(i+=3);for(let e of r)(e.includes(t)||t.includes(e))&&(i+=1)}return i}async function resolveInteractiveAuth(e,t){let n=e.getConnections().find(e=>e.connectionName===t);if(n===void 0)return;let r=await resolveConnectionAuthorization(n);if(r!==void 0&&supportsInteractiveAuthorization(r))return{scope:n.connectionName,instanceId:n.instanceId,connection:{url:n.url??``},authorization:r}}async function completePendingAuthorizations(e,t,n){assertPendingConnectionAuthorizationInstances(e);for(let r of t){if(!getAuthorizationResults().some(e=>e.name===r.connectionName))continue;let t=await resolveInteractiveAuth(e,r.connectionName);t!==void 0&&await n.complete(t)}}async function executeConnectionSearch(e){let t=loadContext(),n=t.get(ConnectionRegistryKey);if(n===void 0)return[];let r=e.limit??10,i=tokenize(e.keywords),a=[],o=[],s=e.connection!==void 0&&e.connection!==``?n.getConnections().filter(t=>t.connectionName===e.connection):n.getConnections();if(e.connection&&s.length===0)throw Error(`Connection "${e.connection}" is not registered. Available connections: ${n.getConnectionNames().join(`, `)}.`);let c=createAuthorizationExecution();await completePendingAuthorizations(n,s,c);let l=[];for(let e of s){let t;try{t=await n.getClient(e.connectionName).getToolMetadata()}catch(t){if(isConnectionAuthorizationRequiredError(t)){let r=await resolveInteractiveAuth(n,e.connectionName);if(r!==void 0)try{let e=await c.handleError(t,r);l.push(...e.challenges)}catch(t){let n=toError(t);logger.warn(`connection authorization failed`,{connection:e.connectionName,error:n}),o.push({connection:e.connectionName,description:e.description,error:isConnectionAuthorizationFailedError(n)?n.message:`Failed to start authorization for "${e.connectionName}": ${n.message}`});continue}o.push({connection:e.connectionName,description:e.description,needsAuthorization:!0});continue}if(isConnectionAuthorizationFailedError(t)){logger.warn(`connection authorization failed`,{connection:e.connectionName,reason:t.reason,retryable:t.retryable,error:t}),o.push({connection:e.connectionName,description:e.description,error:`Authorization failed for ${e.connectionName}: ${t.message}`});continue}let r=toError(t);logger.warn(`failed to load connection tools`,{connection:e.connectionName,error:r}),o.push({connection:e.connectionName,description:e.description,error:`Failed to load tools for "${e.connectionName}": ${r.message}`});continue}for(let n of t){let t=scoreMatch(i,n);t>0&&a.push({item:{connection:e.connectionName,description:n.description,inputSchema:n.inputSchema,outputSchema:n.outputSchema,qualifiedName:qualifiedConnectionToolName(e.connectionName,n.name),tool:n.name},score:t})}}if(l.length>0)return requestAuthorization(l);let u=o.filter(e=>e.error!==void 0);if(s.length>0&&u.length===s.length)throw Error(u.map(e=>e.error).join(`
2
2
  `));a.sort((e,t)=>t.score-e.score);let d=a.slice(0,r).map(e=>e.item);if(d.length>0){let e=[...d,...o],n=t.get(ConnectionSearchResultsKey)??[],r=new Map(n.map(e=>[e.qualifiedName,e]));for(let e of d)e.qualifiedName&&r.set(e.qualifiedName,e);return t.set(ConnectionSearchResultsKey,[...r.values()]),e}return s.map(e=>o.find(t=>t.connection===e.connectionName)||{connection:e.connectionName,description:e.description})}function connectionToolReplayIdentity(e){let t=loadContext(),n=t.get(ConnectionSearchResultsKey)?.find(t=>t.qualifiedName===e);if(n!==void 0)return t.get(ConnectionRegistryKey)?.getConnections().find(e=>e.connectionName===n.connection)?.instanceId}function assertConnectionToolInstance(e){if(typeof e.instanceId!=`string`)return;let{connectionName:t}=readDiscoveredToolClosure(e);if(loadContext().get(ConnectionRegistryKey)?.getConnections().find(e=>e.connectionName===t)?.instanceId!==e.instanceId)throw Error(`The connection for this tool call changed or is unavailable. Request a new tool call and approval.`)}function readDiscoveredToolClosure(e){let t=e.connectionName,n=e.toolName;if(typeof t!=`string`||typeof n!=`string`)throw Error(`Discovered connection tool callback metadata is invalid.`);return{connectionName:t,toolName:n}}async function executeDiscoveredConnectionTool(e,t,n){let{connectionName:r,toolName:i}=readDiscoveredToolClosure(e),a=loadContext().get(ConnectionRegistryKey);if(a===void 0)throw Error(`Connection registry is unavailable while replaying a discovered tool.`);assertConnectionToolInstance(e),assertPendingConnectionAuthorizationInstances(a);let o=await resolveInteractiveAuth(a,r),s=createAuthorizationExecution();o!==void 0&&await s.complete(o);try{return await a.getClient(r).executeTool(i,t,{abortSignal:n.abortSignal,callId:n.callId})}catch(e){return await s.handleError(e,o)}}function assertPendingConnectionAuthorizationInstances(e){let t=new Map(e.getConnections().map(e=>[e.connectionName,e]));for(let e of getAuthorizationResults())if(e.instanceId!==void 0&&t.get(e.name)?.instanceId!==e.instanceId)throw Error(`Authorization for "${e.name}" cannot complete because its resolved connection changed while sign-in was pending. Start sign-in again.`)}async function requestDiscoveredConnectionToolApproval(e,t){let{connectionName:n}=readDiscoveredToolClosure(e);assertConnectionToolInstance(e);let r=loadContext().get(ConnectionRegistryKey)?.getConnectionApproval(n);return r===void 0?`not-applicable`:await resolveApprovalPolicy(r)(t)}async function authorizeDiscoveredConnectionToolApproval(e,t){let{connectionName:n}=readDiscoveredToolClosure(e);assertConnectionToolInstance(e);let r=loadContext().get(ConnectionRegistryKey)?.getConnectionApproval(n),i=r===void 0||typeof r==`function`?void 0:r.response;return i===void 0?{reason:`Approval response authorization is unavailable.`,status:`rejected`}:await i(t)}async function resolveConnectionSearchDynamicTools(){let e=loadContext().get(ConnectionRegistryKey);if(!e||e.getConnections().length===0)return null;let t=e.getConnections(),n=t.map(e=>e.connectionName),r=new Set(n),i=(loadContext().get(ConnectionSearchResultsKey)??[]).filter(e=>r.has(e.connection)),a={},o=defineTool({description:`Search for tools across your connections. Discovered tools become directly callable by their qualified name (e.g. \`linear__list_issues\`) in your next response. Available connections: ${n.join(`, `)}.`,inputSchema:CONNECTION_SEARCH_INPUT_SCHEMA,async execute(e){return executeConnectionSearch(e)},outputSchema:CONNECTION_SEARCH_OUTPUT_SCHEMA});stampDurableDynamicToolCallbacks(o,{inputSchema:{callback:()=>CONNECTION_SEARCH_INPUT_SCHEMA,closure:{}},outputSchema:{callback:()=>CONNECTION_SEARCH_OUTPUT_SCHEMA,closure:{}},execute:{callback:(e,t)=>executeConnectionSearch(t),closure:{}}}),a.connection_search=o;for(let n of i){let r=n.connection,i=n.tool,o=e.getConnectionApproval(r),s=t.find(e=>e.connectionName===r)?.instanceId,c={connectionName:r,toolName:i};s!==void 0&&(c.instanceId=s);let l=defineTool({description:n.description,inputSchema:n.inputSchema??{type:`object`},approval:o,outputSchema:n.outputSchema,async execute(e,t){return await executeDiscoveredConnectionTool(c,e,t)}});stampDurableDynamicToolCallbacks(l,{execute:{callback:executeDiscoveredConnectionTool,closure:c},...o===void 0?{}:{approvalRequest:{callback:requestDiscoveredConnectionToolApproval,closure:c}},...o===void 0||typeof o==`function`||o.response===void 0?{}:{approvalResponse:{callback:authorizeDiscoveredConnectionToolApproval,closure:c}}}),a[qualifiedConnectionToolName(r,i)]=l}return a}export{connectionToolReplayIdentity,resolveConnectionSearchDynamicTools};
@@ -1 +1 @@
1
- import{sleep}from"#compiled/@workflow/core/index.js";async function executeSleepTool(e){"use workflow";return await sleep(Math.ceil(e.seconds*1e3)),{waitedSeconds:e.seconds}}executeSleepTool.workflowId=`workflow//eve@0.67.1//executeSleepTool`;export{executeSleepTool};
1
+ import{sleep}from"#compiled/@workflow/core/index.js";async function executeSleepTool(e){"use workflow";return await sleep(Math.ceil(e.seconds*1e3)),{waitedSeconds:e.seconds}}executeSleepTool.workflowId=`workflow//eve@0.67.2//executeSleepTool`;export{executeSleepTool};
@@ -8,7 +8,7 @@ import { type CompiledBundle } from "#runtime/sessions/runtime-context-keys.js";
8
8
  import type { DynamicRemoteAgentConfig } from "#runtime/subagents/dynamic-remote-agent-config.js";
9
9
  import { type RuntimeAgentHandleAction, type RuntimeSession } from "#subagents/handle-dispatch.js";
10
10
  import type { SubagentStartTarget } from "#execution/tools/subagent/start.js";
11
- export type OwnerAgentDispatchPlanEntry = {
11
+ type OwnerAgentDispatchPlanEntry = {
12
12
  readonly kind: "resume";
13
13
  readonly action: RuntimeAgentHandleAction;
14
14
  readonly agentId: string;
@@ -41,3 +41,4 @@ export declare function resolveAgentInvocationAction(input: {
41
41
  readonly input: AgentInvocationRequest["input"];
42
42
  readonly invocationId: string;
43
43
  }): RuntimeAgentDispatchRequest;
44
+ export {};
@@ -1,17 +1,17 @@
1
1
  import type { DurableSessionState } from "#execution/durable-session-store.js";
2
2
  import type { TaskAgentRequestDelivery } from "#tasks/types.js";
3
- export interface AgentRequestDelivery {
3
+ interface AgentRequestDelivery {
4
4
  readonly ownerId: string;
5
5
  readonly replyTo: TaskAgentRequestDelivery["replyTo"];
6
6
  readonly request: TaskAgentRequestDelivery["request"];
7
7
  readonly taskId?: string;
8
8
  }
9
- export interface TaskAgentRequestContext {
9
+ interface TaskAgentRequestContext {
10
10
  readonly sessionWritable: WritableStream<Uint8Array>;
11
11
  readonly serializedContext: Record<string, unknown>;
12
12
  readonly sessionState: DurableSessionState;
13
13
  }
14
- export interface AppliedTaskAgentRequest {
14
+ interface AppliedTaskAgentRequest {
15
15
  readonly serializedContext: Record<string, unknown>;
16
16
  readonly sessionState: DurableSessionState;
17
17
  }
@@ -21,3 +21,4 @@ export interface AppliedTaskAgentRequest {
21
21
  * handle. Child authorization and HITL ride their own task envelope arms.
22
22
  */
23
23
  export declare function applyTaskAgentRequest(delivery: AgentRequestDelivery, ctx: TaskAgentRequestContext): Promise<AppliedTaskAgentRequest>;
24
+ export {};
@@ -1,7 +1,7 @@
1
1
  import type { HarnessToolDefinition } from "#harness/execute-tool.js";
2
2
  import type { PreparedRuntimeTool } from "#runtime/sessions/turn.js";
3
3
  import { parseJsonObject, type JsonValue } from "#shared/json.js";
4
- export interface WorkflowToolHarnessDefinitionInput {
4
+ interface WorkflowToolHarnessDefinitionInput {
5
5
  readonly definition: HarnessToolDefinition;
6
6
  readonly executeInput?: (input: unknown) => JsonValue;
7
7
  /** Selected agent definition's runtime graph ID; absent for authored workflow tools. */
@@ -10,9 +10,5 @@ export interface WorkflowToolHarnessDefinitionInput {
10
10
  }
11
11
  export declare function createWorkflowToolHarnessDefinition(input: WorkflowToolHarnessDefinitionInput): HarnessToolDefinition;
12
12
  export declare function createPreparedWorkflowToolHarnessDefinition(tool: PreparedRuntimeTool): HarnessToolDefinition;
13
- /** Returns a task receipt after the background scope starts the owning run. */
14
- export declare function createWorkflowToolBackgroundExecute(input: {
15
- readonly toolName: string;
16
- readonly workflowId: string;
17
- }): NonNullable<HarnessToolDefinition["execute"]>;
18
13
  export declare function parseWorkflowToolInput(toolInput: unknown, toolName: string): ReturnType<typeof parseJsonObject>;
14
+ export {};
@@ -1 +1 @@
1
- import{parseJsonObject}from"#shared/json.js";import{UNSPECIFIED_INPUT_SCHEMA,toInputSchema,toOutputSchema}from"#tools/schema.js";function createWorkflowToolHarnessDefinition(e){let t=e.definition,n={executeInput:e.executeInput,nodeId:e.nodeId,workflowId:e.workflowId};return t.execution===`background`?{...t,...n,execute:createWorkflowToolBackgroundExecute({toolName:t.name,workflowId:e.workflowId})}:{...t,...n,execute:void 0}}function createPreparedWorkflowToolHarnessDefinition(e){if(e.task===void 0)throw Error(`Prepared tool "${e.name}" is not backed by a workflow task.`);return createWorkflowToolHarnessDefinition({definition:{behavior:e.behavior,description:e.description,execution:e.execution,inputSchema:toInputSchema(e.inputSchema)??UNSPECIFIED_INPUT_SCHEMA,name:e.name,outputSchema:toOutputSchema(e.outputSchema),rootOnly:e.rootOnly},nodeId:e.task.nodeId,workflowId:e.task.workflowId})}function createWorkflowToolBackgroundExecute(e){return(t,n)=>{throw Error(`Background workflow tool "${e.toolName}" must be started by the task runtime (${e.workflowId}).`)}}function parseWorkflowToolInput(e,t){try{return parseJsonObject(e)}catch(e){throw TypeError(`Tool "${t}" is a workflow, so its parsed input must be a JSON object.`,{cause:e})}}export{createPreparedWorkflowToolHarnessDefinition,createWorkflowToolBackgroundExecute,createWorkflowToolHarnessDefinition,parseWorkflowToolInput};
1
+ import{parseJsonObject}from"#shared/json.js";import{UNSPECIFIED_INPUT_SCHEMA,toInputSchema,toOutputSchema}from"#tools/schema.js";function createWorkflowToolHarnessDefinition(e){let t=e.definition,n={executeInput:e.executeInput,nodeId:e.nodeId,workflowId:e.workflowId};return t.execution===`background`?{...t,...n,execute:createWorkflowToolBackgroundExecute({toolName:t.name,workflowId:e.workflowId})}:{...t,...n,execute:void 0}}function createPreparedWorkflowToolHarnessDefinition(e){if(e.task===void 0)throw Error(`Prepared tool "${e.name}" is not backed by a workflow task.`);return createWorkflowToolHarnessDefinition({definition:{behavior:e.behavior,description:e.description,execution:e.execution,inputSchema:toInputSchema(e.inputSchema)??UNSPECIFIED_INPUT_SCHEMA,name:e.name,outputSchema:toOutputSchema(e.outputSchema),rootOnly:e.rootOnly},nodeId:e.task.nodeId,workflowId:e.task.workflowId})}function createWorkflowToolBackgroundExecute(e){return(t,n)=>{throw Error(`Background workflow tool "${e.toolName}" must be started by the task runtime (${e.workflowId}).`)}}function parseWorkflowToolInput(e,t){try{return parseJsonObject(e)}catch(e){throw TypeError(`Tool "${t}" is a workflow, so its parsed input must be a JSON object.`,{cause:e})}}export{createPreparedWorkflowToolHarnessDefinition,createWorkflowToolHarnessDefinition,parseWorkflowToolInput};
@@ -19,7 +19,7 @@ type ChannelReadResult<R> = R extends ChannelReader<infer C, infer T> ? {
19
19
  readonly channel: C;
20
20
  readonly next: IteratorResult<T>;
21
21
  } : never;
22
- export type ChannelRead<R extends readonly ChannelReader<string, unknown>[]> = ChannelReadResult<R[number]>;
22
+ type ChannelRead<R extends readonly ChannelReader<string, unknown>[]> = ChannelReadResult<R[number]>;
23
23
  /**
24
24
  * Channel reads wake the loop with `undefined` after buffering their result;
25
25
  * a cancel wins the race outright.
@@ -2,7 +2,7 @@ import type { BackgroundWorkflowToolRunInput } from "#execution/tools/workflow/t
2
2
  import type { WorkflowToolRunMessage } from "#execution/tools/workflow/messages.js";
3
3
  import { type ChannelReader } from "#execution/tools/workflow/owner-channels.js";
4
4
  import { type TaskRunInboundPayload } from "#tasks/types.js";
5
- export interface BackgroundWorkflowOwner {
5
+ interface BackgroundWorkflowOwner {
6
6
  readonly kind: "session";
7
7
  readonly commands: ChannelReader<"commands", TaskRunInboundPayload>;
8
8
  readonly signal: AbortSignal;
@@ -11,3 +11,4 @@ export interface BackgroundWorkflowOwner {
11
11
  }
12
12
  /** Routes child messages; the parent session owns persisted task state. */
13
13
  export declare function createBackgroundWorkflowOwner(input: BackgroundWorkflowToolRunInput): Promise<BackgroundWorkflowOwner | undefined>;
14
+ export {};
@@ -8,14 +8,14 @@ export interface WebFetchInput {
8
8
  readonly url: string;
9
9
  }
10
10
  /** Per-call options accepted by {@link executeWebFetchTool}. */
11
- export interface WebFetchExecuteOptions {
11
+ interface WebFetchExecuteOptions {
12
12
  /** Signal combined with the request timeout. */
13
13
  readonly abortSignal?: AbortSignal;
14
14
  }
15
15
  /**
16
16
  * Structured result returned from {@link executeWebFetchTool}.
17
17
  */
18
- export interface WebFetchResult {
18
+ interface WebFetchResult {
19
19
  /** Response body, bounded to the shared tool-output limits. */
20
20
  readonly content: string;
21
21
  /** Response `Content-Type` header. */
@@ -1,5 +1,5 @@
1
1
  /** Options for an SSRF-safe HTTPS request. */
2
- export interface PublicUrlRequestOptions {
2
+ interface PublicUrlRequestOptions {
3
3
  readonly headers: Readonly<Record<string, string>>;
4
4
  readonly maxResponseSize: number;
5
5
  readonly signal: AbortSignal;
@@ -12,3 +12,4 @@ export interface PublicUrlRequestOptions {
12
12
  * and connects using those exact results.
13
13
  */
14
14
  export declare function requestPublicUrl(urlText: string, options: PublicUrlRequestOptions): Promise<Response>;
15
+ export {};
@@ -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};