@vellumai/assistant 0.4.26 → 0.4.29

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 (1301) hide show
  1. package/.env.example +2 -2
  2. package/AGENTS.md +5 -0
  3. package/ARCHITECTURE.md +169 -69
  4. package/Dockerfile +1 -1
  5. package/README.md +111 -112
  6. package/bun.lock +0 -3
  7. package/docs/architecture/integrations.md +0 -1
  8. package/docs/architecture/memory.md +100 -63
  9. package/docs/error-handling.md +71 -0
  10. package/docs/runbook-trusted-contacts.md +10 -9
  11. package/docs/trusted-contact-access.md +48 -46
  12. package/package.json +3 -3
  13. package/scripts/compare-benchmarks.sh +12 -5
  14. package/scripts/ipc/check-swift-decoder-drift.ts +3 -0
  15. package/scripts/test.sh +89 -5
  16. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +46 -0
  17. package/src/__tests__/access-request-decision.test.ts +0 -1
  18. package/src/__tests__/account-registry.test.ts +1 -1
  19. package/src/__tests__/actor-token-service.test.ts +36 -23
  20. package/src/__tests__/agent-loop-thinking.test.ts +29 -13
  21. package/src/__tests__/agent-loop.test.ts +2 -1
  22. package/src/__tests__/app-builder-tool-scripts.test.ts +1 -1
  23. package/src/__tests__/approval-routes-http.test.ts +2 -2
  24. package/src/__tests__/asset-materialize-tool.test.ts +7 -7
  25. package/src/__tests__/asset-search-tool.test.ts +7 -7
  26. package/src/__tests__/browser-fill-credential.test.ts +1 -1
  27. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +217 -0
  28. package/src/__tests__/call-controller.test.ts +99 -69
  29. package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
  30. package/src/__tests__/channel-approval-routes.test.ts +113 -70
  31. package/src/__tests__/channel-guardian.test.ts +173 -282
  32. package/src/__tests__/channel-readiness-service.test.ts +6 -2
  33. package/src/__tests__/channel-reply-delivery.test.ts +2 -2
  34. package/src/__tests__/channel-retry-sweep.test.ts +14 -14
  35. package/src/__tests__/checker.test.ts +12 -31
  36. package/src/__tests__/claude-code-tool-profiles.test.ts +1 -1
  37. package/src/__tests__/commit-message-enrichment-service.test.ts +67 -59
  38. package/src/__tests__/compaction.benchmark.test.ts +6 -2
  39. package/src/__tests__/computer-use-tools.test.ts +1 -1
  40. package/src/__tests__/config-schema.test.ts +66 -7
  41. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +29 -29
  42. package/src/__tests__/contacts-tools.test.ts +63 -2
  43. package/src/__tests__/context-overflow-approval.test.ts +141 -0
  44. package/src/__tests__/context-overflow-policy.test.ts +171 -0
  45. package/src/__tests__/context-overflow-reducer.test.ts +533 -0
  46. package/src/__tests__/context-window-manager.test.ts +97 -0
  47. package/src/__tests__/conversation-attention-telegram.test.ts +38 -46
  48. package/src/__tests__/conversation-pairing.test.ts +2 -2
  49. package/src/__tests__/conversation-routes-guardian-reply.test.ts +214 -10
  50. package/src/__tests__/conversation-routes.test.ts +4 -7
  51. package/src/__tests__/credential-broker-browser-fill.test.ts +13 -2
  52. package/src/__tests__/credential-security-e2e.test.ts +1 -1
  53. package/src/__tests__/credential-security-invariants.test.ts +1 -1
  54. package/src/__tests__/credential-vault-unit.test.ts +1 -1
  55. package/src/__tests__/credential-vault.test.ts +11 -8
  56. package/src/__tests__/daemon-lifecycle.test.ts +2 -2
  57. package/src/__tests__/daemon-server-session-init.test.ts +6 -6
  58. package/src/__tests__/delete-managed-skill-tool.test.ts +1 -1
  59. package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -2
  60. package/src/__tests__/emit-signal-routing-intent.test.ts +4 -0
  61. package/src/__tests__/encrypted-store.test.ts +10 -7
  62. package/src/__tests__/ephemeral-permissions.test.ts +3 -3
  63. package/src/__tests__/file-edit-tool.test.ts +1 -1
  64. package/src/__tests__/file-read-tool.test.ts +1 -1
  65. package/src/__tests__/file-write-tool.test.ts +1 -1
  66. package/src/__tests__/fixtures/credential-security-fixtures.ts +87 -64
  67. package/src/__tests__/fixtures/media-reuse-fixtures.ts +37 -31
  68. package/src/__tests__/fixtures/mock-signup-server.ts +171 -115
  69. package/src/__tests__/fixtures/proxy-fixtures.ts +39 -39
  70. package/src/__tests__/followup-tools.test.ts +1 -1
  71. package/src/__tests__/gateway-only-guard.test.ts +3 -0
  72. package/src/__tests__/guardian-actions-endpoint.test.ts +543 -1
  73. package/src/__tests__/guardian-control-plane-policy.test.ts +15 -15
  74. package/src/__tests__/guardian-dispatch.test.ts +79 -1
  75. package/src/__tests__/guardian-grant-minting.test.ts +14 -14
  76. package/src/__tests__/guardian-outbound-http.test.ts +1 -2
  77. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -41
  78. package/src/__tests__/guardian-routing-invariants.test.ts +2 -5
  79. package/src/__tests__/guardian-routing-state.test.ts +36 -52
  80. package/src/__tests__/guardian-verification-intent-routing.test.ts +4 -6
  81. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
  82. package/src/__tests__/handle-user-message-secret-resume.test.ts +39 -1
  83. package/src/__tests__/handlers-cu-observation-blob.test.ts +21 -10
  84. package/src/__tests__/handlers-telegram-config.test.ts +14 -14
  85. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +23 -2
  86. package/src/__tests__/headless-browser-interactions.test.ts +1 -1
  87. package/src/__tests__/headless-browser-navigate.test.ts +1 -1
  88. package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
  89. package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
  90. package/src/__tests__/heartbeat-service.test.ts +45 -2
  91. package/src/__tests__/host-file-edit-tool.test.ts +1 -1
  92. package/src/__tests__/host-file-read-tool.test.ts +1 -1
  93. package/src/__tests__/host-file-write-tool.test.ts +1 -1
  94. package/src/__tests__/host-shell-tool.test.ts +1 -1
  95. package/src/__tests__/inbound-invite-redemption.test.ts +16 -18
  96. package/src/__tests__/ingress-reconcile.test.ts +2 -2
  97. package/src/__tests__/ingress-routes-http.test.ts +2 -1
  98. package/src/__tests__/integrations-cli.test.ts +256 -0
  99. package/src/__tests__/intent-routing.test.ts +4 -5
  100. package/src/__tests__/invite-redemption-service.test.ts +4 -3
  101. package/src/__tests__/ipc-snapshot.test.ts +28 -0
  102. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -1
  103. package/src/__tests__/mcp-cli.test.ts +136 -57
  104. package/src/__tests__/mcp-client-auth.test.ts +95 -0
  105. package/src/__tests__/media-generate-image.test.ts +2 -2
  106. package/src/__tests__/media-reuse-story.e2e.test.ts +8 -8
  107. package/src/__tests__/memory-regressions.test.ts +6 -6
  108. package/src/__tests__/messaging-send-tool.test.ts +1 -1
  109. package/src/__tests__/migration-cross-version-compatibility.test.ts +1855 -0
  110. package/src/__tests__/migration-export-http.test.ts +540 -0
  111. package/src/__tests__/migration-import-commit-http.test.ts +823 -0
  112. package/src/__tests__/migration-import-preflight-http.test.ts +755 -0
  113. package/src/__tests__/migration-parity-persistence.test.ts +1854 -0
  114. package/src/__tests__/migration-transport.test.ts +904 -0
  115. package/src/__tests__/migration-validate-http.test.ts +698 -0
  116. package/src/__tests__/migration-wizard.test.ts +1289 -0
  117. package/src/__tests__/non-member-access-request.test.ts +17 -17
  118. package/src/__tests__/notification-decision-strategy.test.ts +110 -2
  119. package/src/__tests__/notification-deep-link.test.ts +18 -0
  120. package/src/__tests__/notification-guardian-path.test.ts +0 -1
  121. package/src/__tests__/oauth2-gateway-transport.test.ts +1 -1
  122. package/src/__tests__/playbook-execution.test.ts +1 -1
  123. package/src/__tests__/playbook-tools.test.ts +1 -1
  124. package/src/__tests__/provider-streaming.benchmark.test.ts +3 -1
  125. package/src/__tests__/proxy-approval-callback.test.ts +1 -1
  126. package/src/__tests__/qdrant-manager.test.ts +40 -11
  127. package/src/__tests__/rebind-secrets-screen.test.ts +839 -0
  128. package/src/__tests__/recording-handler.test.ts +2 -2
  129. package/src/__tests__/recording-intent-handler.test.ts +3 -3
  130. package/src/__tests__/recording-state-machine.test.ts +2 -2
  131. package/src/__tests__/relay-server.test.ts +506 -227
  132. package/src/__tests__/reminder-store.test.ts +8 -0
  133. package/src/__tests__/reminder.test.ts +8 -0
  134. package/src/__tests__/{resolve-guardian-trust-class.test.ts → resolve-trust-class.test.ts} +11 -17
  135. package/src/__tests__/scaffold-managed-skill-tool.test.ts +1 -1
  136. package/src/__tests__/schedule-tools.test.ts +1 -1
  137. package/src/__tests__/script-proxy-certs.test.ts +1 -1
  138. package/src/__tests__/script-proxy-connect-tunnel.test.ts +2 -3
  139. package/src/__tests__/script-proxy-decision-trace.test.ts +2 -2
  140. package/src/__tests__/script-proxy-http-forwarder.test.ts +1 -1
  141. package/src/__tests__/script-proxy-injection-runtime.test.ts +5 -5
  142. package/src/__tests__/script-proxy-mitm-handler.test.ts +4 -4
  143. package/src/__tests__/script-proxy-policy-runtime.test.ts +2 -2
  144. package/src/__tests__/script-proxy-policy.test.ts +2 -2
  145. package/src/__tests__/script-proxy-session-manager.test.ts +4 -7
  146. package/src/__tests__/script-proxy-session-runtime.test.ts +1 -6
  147. package/src/__tests__/secret-onetime-send.test.ts +4 -4
  148. package/src/__tests__/secret-scanner-executor.test.ts +2 -2
  149. package/src/__tests__/send-endpoint-busy.test.ts +11 -9
  150. package/src/__tests__/send-notification-tool.test.ts +2 -2
  151. package/src/__tests__/session-abort-tool-results.test.ts +17 -2
  152. package/src/__tests__/session-agent-loop.test.ts +456 -35
  153. package/src/__tests__/session-confirmation-signals.test.ts +3 -2
  154. package/src/__tests__/session-conflict-gate.test.ts +20 -3
  155. package/src/__tests__/session-init.benchmark.test.ts +2 -2
  156. package/src/__tests__/session-load-history-repair.test.ts +7 -7
  157. package/src/__tests__/session-pre-run-repair.test.ts +17 -2
  158. package/src/__tests__/session-profile-injection.test.ts +20 -3
  159. package/src/__tests__/session-provider-retry-repair.test.ts +86 -6
  160. package/src/__tests__/session-queue.test.ts +33 -18
  161. package/src/__tests__/session-runtime-assembly.test.ts +147 -1
  162. package/src/__tests__/session-runtime-workspace.test.ts +40 -0
  163. package/src/__tests__/session-slash-known.test.ts +21 -3
  164. package/src/__tests__/session-slash-queue.test.ts +17 -2
  165. package/src/__tests__/session-slash-unknown.test.ts +17 -2
  166. package/src/__tests__/session-surfaces-deselection.test.ts +208 -0
  167. package/src/__tests__/session-workspace-cache-state.test.ts +2 -2
  168. package/src/__tests__/session-workspace-injection.test.ts +17 -2
  169. package/src/__tests__/session-workspace-tool-tracking.test.ts +17 -2
  170. package/src/__tests__/shell-credential-ref.test.ts +1 -1
  171. package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
  172. package/src/__tests__/skill-load-feature-flag.test.ts +1 -1
  173. package/src/__tests__/skill-load-tool.test.ts +1 -1
  174. package/src/__tests__/skill-script-runner-host.test.ts +1 -1
  175. package/src/__tests__/skill-script-runner-sandbox.test.ts +1 -1
  176. package/src/__tests__/skill-script-runner.test.ts +1 -1
  177. package/src/__tests__/skill-tool-factory.test.ts +1 -1
  178. package/src/__tests__/slack-skill.test.ts +3 -2
  179. package/src/__tests__/subagent-tools.test.ts +3 -3
  180. package/src/__tests__/swarm-recursion.test.ts +1 -1
  181. package/src/__tests__/swarm-session-integration.test.ts +1 -1
  182. package/src/__tests__/swarm-tool.test.ts +1 -1
  183. package/src/__tests__/task-management-tools.test.ts +1 -1
  184. package/src/__tests__/task-tools.test.ts +1 -1
  185. package/src/__tests__/terminal-tools.test.ts +1 -1
  186. package/src/__tests__/test-support/browser-skill-harness.ts +39 -27
  187. package/src/__tests__/test-support/computer-use-skill-harness.ts +14 -14
  188. package/src/__tests__/tool-approval-handler.test.ts +15 -15
  189. package/src/__tests__/tool-execution-abort-cleanup.test.ts +1 -1
  190. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -1
  191. package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
  192. package/src/__tests__/tool-executor-shell-integration.test.ts +1 -1
  193. package/src/__tests__/tool-executor.test.ts +23 -182
  194. package/src/__tests__/tool-grant-request-escalation.test.ts +11 -11
  195. package/src/__tests__/tool-permission-simulate-handler.test.ts +4 -4
  196. package/src/__tests__/transfer-progress-screen.test.ts +1180 -0
  197. package/src/__tests__/trust-context-guards.test.ts +25 -29
  198. package/src/__tests__/trusted-contact-approval-notifier.test.ts +23 -21
  199. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +37 -40
  200. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +29 -25
  201. package/src/__tests__/trusted-contact-multichannel.test.ts +25 -24
  202. package/src/__tests__/trusted-contact-verification.test.ts +63 -77
  203. package/src/__tests__/turn-commit.test.ts +18 -18
  204. package/src/__tests__/twilio-provider.test.ts +7 -7
  205. package/src/__tests__/validation-results-screen.test.ts +1107 -0
  206. package/src/__tests__/view-image-tool.test.ts +1 -1
  207. package/src/__tests__/voice-invite-redemption.test.ts +3 -2
  208. package/src/__tests__/voice-scoped-grant-consumer.test.ts +12 -12
  209. package/src/__tests__/voice-session-bridge.test.ts +24 -24
  210. package/src/agent/attachments.ts +3 -1
  211. package/src/agent/loop.ts +13 -13
  212. package/src/agent/message-types.ts +13 -7
  213. package/src/amazon/cart.ts +59 -32
  214. package/src/amazon/checkout.ts +25 -14
  215. package/src/amazon/client.ts +68 -48
  216. package/src/amazon/product-details.ts +3 -3
  217. package/src/amazon/request-extractor.ts +46 -31
  218. package/src/amazon/search.ts +6 -4
  219. package/src/amazon/session.ts +33 -24
  220. package/src/approvals/AGENTS.md +26 -0
  221. package/src/approvals/approval-primitive.ts +87 -64
  222. package/src/approvals/guardian-decision-primitive.ts +172 -81
  223. package/src/approvals/guardian-request-resolvers.ts +262 -155
  224. package/src/autonomy/autonomy-resolver.ts +7 -5
  225. package/src/autonomy/autonomy-store.ts +34 -19
  226. package/src/autonomy/disposition-mapper.ts +5 -5
  227. package/src/autonomy/index.ts +6 -6
  228. package/src/autonomy/types.ts +7 -3
  229. package/src/browser-extension-relay/client.ts +50 -19
  230. package/src/browser-extension-relay/protocol.ts +11 -11
  231. package/src/browser-extension-relay/server.ts +45 -20
  232. package/src/bundler/app-bundler.ts +75 -50
  233. package/src/bundler/bundle-scanner.ts +145 -41
  234. package/src/bundler/bundle-signer.ts +16 -14
  235. package/src/bundler/signature-verifier.ts +36 -33
  236. package/src/calls/call-constants.ts +10 -3
  237. package/src/calls/call-controller.ts +473 -214
  238. package/src/calls/call-conversation-messages.ts +25 -15
  239. package/src/calls/call-domain.ts +401 -148
  240. package/src/calls/call-pointer-message-composer.ts +26 -21
  241. package/src/calls/call-pointer-messages.ts +52 -28
  242. package/src/calls/call-recovery.ts +53 -37
  243. package/src/calls/call-state-machine.ts +37 -7
  244. package/src/calls/call-state.ts +35 -13
  245. package/src/calls/call-store.ts +165 -77
  246. package/src/calls/elevenlabs-client.ts +39 -20
  247. package/src/calls/guardian-action-sweep.ts +42 -24
  248. package/src/calls/guardian-dispatch.ts +79 -56
  249. package/src/calls/guardian-question-copy.ts +28 -23
  250. package/src/calls/relay-server.ts +1121 -532
  251. package/src/calls/speaker-identification.ts +21 -15
  252. package/src/calls/twilio-config.ts +34 -17
  253. package/src/calls/twilio-provider.ts +108 -55
  254. package/src/calls/twilio-rest.ts +212 -100
  255. package/src/calls/twilio-routes.ts +165 -92
  256. package/src/calls/types.ts +55 -7
  257. package/src/calls/voice-quality.ts +6 -4
  258. package/src/calls/voice-session-bridge.ts +181 -133
  259. package/src/channels/config.ts +17 -13
  260. package/src/channels/types.ts +38 -10
  261. package/src/cli/amazon.ts +333 -227
  262. package/src/cli/config-commands.ts +236 -146
  263. package/src/cli/core-commands.ts +403 -329
  264. package/src/cli/email-guardrails.ts +38 -19
  265. package/src/cli/email.ts +207 -153
  266. package/src/cli/influencer.ts +58 -56
  267. package/src/cli/integrations.ts +362 -0
  268. package/src/cli/ipc-client.ts +24 -19
  269. package/src/cli/map.ts +176 -129
  270. package/src/cli/mcp.ts +260 -152
  271. package/src/cli/sequence.ts +165 -107
  272. package/src/cli/twitter.ts +302 -218
  273. package/src/cli.ts +418 -279
  274. package/src/commands/cc-command-registry.ts +52 -27
  275. package/src/config/agent-schema.ts +217 -134
  276. package/src/config/assistant-feature-flags.ts +23 -18
  277. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +19 -0
  278. package/src/config/bundled-skills/app-builder/tools/app-create.ts +7 -4
  279. package/src/config/bundled-skills/app-builder/tools/app-delete.ts +6 -3
  280. package/src/config/bundled-skills/app-builder/tools/app-file-edit.ts +7 -4
  281. package/src/config/bundled-skills/app-builder/tools/app-file-list.ts +6 -3
  282. package/src/config/bundled-skills/app-builder/tools/app-file-read.ts +6 -3
  283. package/src/config/bundled-skills/app-builder/tools/app-file-write.ts +7 -4
  284. package/src/config/bundled-skills/app-builder/tools/app-list.ts +6 -3
  285. package/src/config/bundled-skills/app-builder/tools/app-query.ts +6 -3
  286. package/src/config/bundled-skills/app-builder/tools/app-update.ts +6 -3
  287. package/src/config/bundled-skills/browser/tools/browser-click.ts +5 -2
  288. package/src/config/bundled-skills/browser/tools/browser-close.ts +5 -2
  289. package/src/config/bundled-skills/browser/tools/browser-extract.ts +5 -2
  290. package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +5 -2
  291. package/src/config/bundled-skills/browser/tools/browser-hover.ts +5 -2
  292. package/src/config/bundled-skills/browser/tools/browser-navigate.ts +5 -2
  293. package/src/config/bundled-skills/browser/tools/browser-press-key.ts +5 -2
  294. package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +5 -2
  295. package/src/config/bundled-skills/browser/tools/browser-scroll.ts +5 -2
  296. package/src/config/bundled-skills/browser/tools/browser-select-option.ts +5 -2
  297. package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +5 -2
  298. package/src/config/bundled-skills/browser/tools/browser-type.ts +5 -2
  299. package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +13 -6
  300. package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +5 -2
  301. package/src/config/bundled-skills/claude-code/TOOLS.json +4 -0
  302. package/src/config/bundled-skills/claude-code/tools/claude-code.ts +5 -2
  303. package/src/config/bundled-skills/computer-use/SKILL.md +2 -2
  304. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +6 -3
  305. package/src/config/bundled-skills/computer-use/tools/computer-use-done.ts +6 -3
  306. package/src/config/bundled-skills/computer-use/tools/computer-use-double-click.ts +10 -3
  307. package/src/config/bundled-skills/computer-use/tools/computer-use-drag.ts +6 -3
  308. package/src/config/bundled-skills/computer-use/tools/computer-use-key.ts +6 -3
  309. package/src/config/bundled-skills/computer-use/tools/computer-use-open-app.ts +6 -3
  310. package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +10 -3
  311. package/src/config/bundled-skills/computer-use/tools/computer-use-respond.ts +6 -3
  312. package/src/config/bundled-skills/computer-use/tools/computer-use-right-click.ts +10 -3
  313. package/src/config/bundled-skills/computer-use/tools/computer-use-run-applescript.ts +10 -3
  314. package/src/config/bundled-skills/computer-use/tools/computer-use-scroll.ts +6 -3
  315. package/src/config/bundled-skills/computer-use/tools/computer-use-type-text.ts +6 -3
  316. package/src/config/bundled-skills/computer-use/tools/computer-use-wait.ts +6 -3
  317. package/src/config/bundled-skills/configure-settings/SKILL.md +28 -14
  318. package/src/config/bundled-skills/contacts/SKILL.md +446 -15
  319. package/src/config/bundled-skills/contacts/tools/contact-merge.ts +99 -20
  320. package/src/config/bundled-skills/contacts/tools/contact-search.ts +74 -17
  321. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +89 -26
  322. package/src/config/bundled-skills/document/tools/document-create.ts +5 -2
  323. package/src/config/bundled-skills/document/tools/document-update.ts +5 -2
  324. package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -7
  325. package/src/config/bundled-skills/email-setup/SKILL.md +9 -9
  326. package/src/config/bundled-skills/followups/tools/followup-create.ts +5 -2
  327. package/src/config/bundled-skills/followups/tools/followup-list.ts +5 -2
  328. package/src/config/bundled-skills/followups/tools/followup-resolve.ts +5 -2
  329. package/src/config/bundled-skills/google-calendar/calendar-client.ts +44 -32
  330. package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +11 -5
  331. package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +13 -7
  332. package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +11 -5
  333. package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +13 -7
  334. package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +28 -12
  335. package/src/config/bundled-skills/google-calendar/tools/shared.ts +6 -4
  336. package/src/config/bundled-skills/google-calendar/types.ts +3 -3
  337. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +46 -24
  338. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +36 -19
  339. package/src/config/bundled-skills/knowledge-graph/tools/graph-query.ts +60 -35
  340. package/src/config/bundled-skills/mcp-setup/SKILL.md +75 -0
  341. package/src/config/bundled-skills/media-processing/SKILL.md +55 -15
  342. package/src/config/bundled-skills/media-processing/TOOLS.json +20 -2
  343. package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +12 -10
  344. package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +34 -19
  345. package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +82 -66
  346. package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +148 -0
  347. package/src/config/bundled-skills/media-processing/services/concurrency-pool.ts +1 -1
  348. package/src/config/bundled-skills/media-processing/services/cost-tracker.ts +8 -3
  349. package/src/config/bundled-skills/media-processing/services/gemini-map.ts +117 -53
  350. package/src/config/bundled-skills/media-processing/services/gemini-video.ts +273 -0
  351. package/src/config/bundled-skills/media-processing/services/preprocess.ts +185 -97
  352. package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +32 -27
  353. package/src/config/bundled-skills/media-processing/services/reduce.ts +101 -24
  354. package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +121 -55
  355. package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +58 -24
  356. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +177 -91
  357. package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +98 -70
  358. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +59 -19
  359. package/src/config/bundled-skills/media-processing/tools/media-status.ts +26 -10
  360. package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +29 -14
  361. package/src/config/bundled-skills/messaging/SKILL.md +7 -5
  362. package/src/config/bundled-skills/messaging/TOOLS.json +7 -7
  363. package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +31 -13
  364. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +16 -10
  365. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +18 -9
  366. package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +23 -16
  367. package/src/config/bundled-skills/messaging/tools/gmail-draft.ts +28 -12
  368. package/src/config/bundled-skills/messaging/tools/gmail-filters.ts +41 -21
  369. package/src/config/bundled-skills/messaging/tools/gmail-follow-up.ts +44 -23
  370. package/src/config/bundled-skills/messaging/tools/gmail-forward.ts +73 -33
  371. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +15 -9
  372. package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +22 -14
  373. package/src/config/bundled-skills/messaging/tools/gmail-outreach-scan.ts +99 -50
  374. package/src/config/bundled-skills/messaging/tools/gmail-send-draft.ts +14 -8
  375. package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +63 -44
  376. package/src/config/bundled-skills/messaging/tools/gmail-sender-digest.ts +90 -46
  377. package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +43 -22
  378. package/src/config/bundled-skills/messaging/tools/gmail-trash.ts +15 -9
  379. package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +51 -22
  380. package/src/config/bundled-skills/messaging/tools/gmail-unsubscribe.ts +62 -26
  381. package/src/config/bundled-skills/messaging/tools/gmail-vacation.ts +34 -19
  382. package/src/config/bundled-skills/messaging/tools/google-contacts.ts +32 -16
  383. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +10 -4
  384. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +91 -47
  385. package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +21 -9
  386. package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +9 -3
  387. package/src/config/bundled-skills/messaging/tools/messaging-draft.ts +30 -17
  388. package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +10 -4
  389. package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +14 -6
  390. package/src/config/bundled-skills/messaging/tools/messaging-read.ts +16 -5
  391. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +63 -36
  392. package/src/config/bundled-skills/messaging/tools/messaging-search.ts +10 -4
  393. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +30 -12
  394. package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +48 -29
  395. package/src/config/bundled-skills/messaging/tools/scan-result-store.ts +20 -6
  396. package/src/config/bundled-skills/messaging/tools/send-notification.ts +1 -1
  397. package/src/config/bundled-skills/messaging/tools/sequence-analytics.ts +59 -22
  398. package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +13 -7
  399. package/src/config/bundled-skills/messaging/tools/sequence-create.ts +27 -12
  400. package/src/config/bundled-skills/messaging/tools/sequence-delete.ts +14 -6
  401. package/src/config/bundled-skills/messaging/tools/sequence-enroll.ts +30 -11
  402. package/src/config/bundled-skills/messaging/tools/sequence-enrollment-list.ts +16 -8
  403. package/src/config/bundled-skills/messaging/tools/sequence-get.ts +31 -13
  404. package/src/config/bundled-skills/messaging/tools/sequence-import.ts +38 -22
  405. package/src/config/bundled-skills/messaging/tools/sequence-list.ts +16 -7
  406. package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +29 -10
  407. package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +16 -8
  408. package/src/config/bundled-skills/messaging/tools/sequence-update.ts +35 -16
  409. package/src/config/bundled-skills/messaging/tools/shared.ts +26 -12
  410. package/src/config/bundled-skills/notifications/tools/send-notification.ts +69 -34
  411. package/src/config/bundled-skills/notifications/tools/shared.ts +1 -1
  412. package/src/config/bundled-skills/phone-calls/SKILL.md +46 -48
  413. package/src/config/bundled-skills/phone-calls/tools/call-end.ts +1 -1
  414. package/src/config/bundled-skills/phone-calls/tools/call-start.ts +1 -1
  415. package/src/config/bundled-skills/phone-calls/tools/call-status.ts +1 -1
  416. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +91 -51
  417. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +30 -16
  418. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +66 -27
  419. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +89 -42
  420. package/src/config/bundled-skills/public-ingress/SKILL.md +26 -19
  421. package/src/config/bundled-skills/reminder/tools/reminder-cancel.ts +5 -2
  422. package/src/config/bundled-skills/reminder/tools/reminder-create.ts +5 -2
  423. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +5 -2
  424. package/src/config/bundled-skills/schedule/tools/schedule-create.ts +5 -2
  425. package/src/config/bundled-skills/schedule/tools/schedule-delete.ts +5 -2
  426. package/src/config/bundled-skills/schedule/tools/schedule-list.ts +5 -2
  427. package/src/config/bundled-skills/schedule/tools/schedule-update.ts +5 -2
  428. package/src/config/bundled-skills/screen-recording/SKILL.md +11 -3
  429. package/src/config/bundled-skills/self-upgrade/SKILL.md +9 -8
  430. package/src/config/bundled-skills/slack/TOOLS.json +33 -15
  431. package/src/config/bundled-skills/slack/tools/shared.ts +7 -5
  432. package/src/config/bundled-skills/slack/tools/slack-add-reaction.ts +11 -5
  433. package/src/config/bundled-skills/slack/tools/slack-channel-details.ts +11 -5
  434. package/src/config/bundled-skills/slack/tools/slack-configure-channels.ts +46 -16
  435. package/src/config/bundled-skills/slack/tools/slack-delete-message.ts +11 -5
  436. package/src/config/bundled-skills/slack/tools/slack-edit-message.ts +28 -0
  437. package/src/config/bundled-skills/slack/tools/slack-leave-channel.ts +12 -6
  438. package/src/config/bundled-skills/sms-setup/SKILL.md +5 -8
  439. package/src/config/bundled-skills/subagent/tools/subagent-abort.ts +5 -2
  440. package/src/config/bundled-skills/subagent/tools/subagent-message.ts +5 -2
  441. package/src/config/bundled-skills/subagent/tools/subagent-read.ts +5 -2
  442. package/src/config/bundled-skills/subagent/tools/subagent-spawn.ts +5 -2
  443. package/src/config/bundled-skills/subagent/tools/subagent-status.ts +5 -2
  444. package/src/config/bundled-skills/tasks/tools/task-delete.ts +5 -2
  445. package/src/config/bundled-skills/tasks/tools/task-list-add.ts +5 -2
  446. package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +5 -2
  447. package/src/config/bundled-skills/tasks/tools/task-list-show.ts +5 -2
  448. package/src/config/bundled-skills/tasks/tools/task-list-update.ts +5 -2
  449. package/src/config/bundled-skills/tasks/tools/task-list.ts +5 -2
  450. package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +5 -2
  451. package/src/config/bundled-skills/tasks/tools/task-run.ts +5 -2
  452. package/src/config/bundled-skills/tasks/tools/task-save.ts +5 -2
  453. package/src/config/bundled-skills/telegram-setup/SKILL.md +7 -8
  454. package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +232 -127
  455. package/src/config/bundled-skills/twilio-setup/SKILL.md +7 -12
  456. package/src/config/bundled-skills/twitter/SKILL.md +19 -2
  457. package/src/config/bundled-skills/voice-setup/SKILL.md +5 -5
  458. package/src/config/bundled-skills/watcher/tools/watcher-create.ts +5 -2
  459. package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +5 -2
  460. package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +5 -2
  461. package/src/config/bundled-skills/watcher/tools/watcher-list.ts +5 -2
  462. package/src/config/bundled-skills/watcher/tools/watcher-update.ts +5 -2
  463. package/src/config/bundled-skills/weather/tools/get-weather.ts +5 -2
  464. package/src/config/calls-schema.ts +108 -63
  465. package/src/config/computer-use-prompt.ts +7 -7
  466. package/src/config/core-schema.ts +239 -155
  467. package/src/config/defaults.ts +2 -2
  468. package/src/config/elevenlabs-schema.ts +15 -15
  469. package/src/config/env-registry.ts +33 -33
  470. package/src/config/feature-flag-registry.json +31 -7
  471. package/src/config/loader.ts +118 -58
  472. package/src/config/mcp-schema.ts +29 -15
  473. package/src/config/memory-schema.ts +434 -229
  474. package/src/config/notifications-schema.ts +4 -4
  475. package/src/config/sandbox-schema.ts +2 -2
  476. package/src/config/schema.ts +12 -2
  477. package/src/config/skill-state.ts +27 -15
  478. package/src/config/skills-schema.ts +72 -23
  479. package/src/config/skills.ts +303 -143
  480. package/src/config/system-prompt.ts +25 -6
  481. package/src/config/types.ts +1 -1
  482. package/src/config/update-bulletin-format.ts +3 -3
  483. package/src/config/update-bulletin-state.ts +15 -6
  484. package/src/config/update-bulletin-template-path.ts +8 -4
  485. package/src/config/update-bulletin.ts +33 -14
  486. package/src/config/user-reference.ts +8 -8
  487. package/src/contacts/contact-events.ts +21 -0
  488. package/src/contacts/contact-store.ts +622 -100
  489. package/src/contacts/contacts-write.ts +287 -0
  490. package/src/contacts/index.ts +13 -4
  491. package/src/contacts/startup-migration.ts +21 -0
  492. package/src/contacts/types.ts +47 -2
  493. package/src/context/token-estimator.ts +54 -31
  494. package/src/context/tool-result-truncation.ts +41 -7
  495. package/src/context/window-manager.ts +225 -120
  496. package/src/daemon/approval-generators.ts +83 -55
  497. package/src/daemon/approved-devices-store.ts +33 -20
  498. package/src/daemon/assistant-attachments.ts +134 -98
  499. package/src/daemon/auth-manager.ts +17 -15
  500. package/src/daemon/classifier.ts +117 -46
  501. package/src/daemon/computer-use-session.ts +316 -187
  502. package/src/daemon/config-watcher.ts +91 -44
  503. package/src/daemon/connection-policy.ts +18 -10
  504. package/src/daemon/context-overflow-approval.ts +48 -0
  505. package/src/daemon/context-overflow-policy.ts +50 -0
  506. package/src/daemon/context-overflow-reducer.ts +300 -0
  507. package/src/daemon/daemon-control.ts +79 -51
  508. package/src/daemon/date-context.ts +119 -69
  509. package/src/daemon/dictation-profile-store.ts +94 -48
  510. package/src/daemon/dictation-text-processing.ts +33 -12
  511. package/src/daemon/doordash-steps.ts +92 -49
  512. package/src/daemon/guardian-action-generators.ts +62 -46
  513. package/src/daemon/guardian-verification-intent.ts +31 -18
  514. package/src/daemon/handlers/apps.ts +257 -111
  515. package/src/daemon/handlers/avatar.ts +20 -15
  516. package/src/daemon/handlers/computer-use.ts +82 -39
  517. package/src/daemon/handlers/config-channels.ts +146 -69
  518. package/src/daemon/handlers/config-heartbeat.ts +114 -59
  519. package/src/daemon/handlers/config-inbox.ts +277 -106
  520. package/src/daemon/handlers/config-ingress.ts +127 -55
  521. package/src/daemon/handlers/config-integrations.ts +145 -88
  522. package/src/daemon/handlers/config-model.ts +58 -22
  523. package/src/daemon/handlers/config-platform.ts +40 -16
  524. package/src/daemon/handlers/config-scheduling.ts +109 -48
  525. package/src/daemon/handlers/config-slack-channel.ts +67 -35
  526. package/src/daemon/handlers/config-slack.ts +21 -20
  527. package/src/daemon/handlers/config-telegram.ts +100 -70
  528. package/src/daemon/handlers/config-tools.ts +103 -55
  529. package/src/daemon/handlers/config-trust.ts +50 -20
  530. package/src/daemon/handlers/config.ts +72 -24
  531. package/src/daemon/handlers/contacts.ts +163 -0
  532. package/src/daemon/handlers/diagnostics.ts +90 -48
  533. package/src/daemon/handlers/documents.ts +74 -46
  534. package/src/daemon/handlers/guardian-actions.ts +118 -71
  535. package/src/daemon/handlers/home-base.ts +19 -16
  536. package/src/daemon/handlers/identity.ts +65 -45
  537. package/src/daemon/handlers/index.ts +78 -54
  538. package/src/daemon/handlers/misc.ts +664 -234
  539. package/src/daemon/handlers/navigate-settings.ts +14 -11
  540. package/src/daemon/handlers/oauth-connect.ts +48 -35
  541. package/src/daemon/handlers/open-bundle-handler.ts +31 -24
  542. package/src/daemon/handlers/pairing.ts +51 -25
  543. package/src/daemon/handlers/publish.ts +55 -33
  544. package/src/daemon/handlers/recording.ts +378 -162
  545. package/src/daemon/handlers/sessions.ts +923 -423
  546. package/src/daemon/handlers/shared.ts +202 -117
  547. package/src/daemon/handlers/signing.ts +25 -6
  548. package/src/daemon/handlers/subagents.ts +117 -56
  549. package/src/daemon/handlers/twitter-auth.ts +70 -49
  550. package/src/daemon/handlers/work-items.ts +264 -112
  551. package/src/daemon/handlers/workspace-files.ts +27 -20
  552. package/src/daemon/handlers.ts +2 -2
  553. package/src/daemon/history-repair.ts +16 -15
  554. package/src/daemon/identity-helpers.ts +4 -4
  555. package/src/daemon/install-cli-launchers.ts +33 -22
  556. package/src/daemon/ipc-blob-store.ts +38 -24
  557. package/src/daemon/ipc-contract/apps.ts +61 -49
  558. package/src/daemon/ipc-contract/computer-use.ts +47 -37
  559. package/src/daemon/ipc-contract/contacts.ts +69 -0
  560. package/src/daemon/ipc-contract/diagnostics.ts +14 -14
  561. package/src/daemon/ipc-contract/documents.ts +8 -8
  562. package/src/daemon/ipc-contract/guardian-actions.ts +4 -4
  563. package/src/daemon/ipc-contract/inbox.ts +16 -16
  564. package/src/daemon/ipc-contract/integrations.ts +57 -44
  565. package/src/daemon/ipc-contract/memory.ts +3 -5
  566. package/src/daemon/ipc-contract/messages.ts +95 -69
  567. package/src/daemon/ipc-contract/notifications.ts +10 -6
  568. package/src/daemon/ipc-contract/pairing.ts +8 -8
  569. package/src/daemon/ipc-contract/schedules.ts +20 -20
  570. package/src/daemon/ipc-contract/sessions.ts +88 -57
  571. package/src/daemon/ipc-contract/settings.ts +12 -7
  572. package/src/daemon/ipc-contract/shared.ts +9 -7
  573. package/src/daemon/ipc-contract/skills.ts +46 -26
  574. package/src/daemon/ipc-contract/subagents.ts +9 -9
  575. package/src/daemon/ipc-contract/trust.ts +11 -11
  576. package/src/daemon/ipc-contract/work-items.ts +33 -28
  577. package/src/daemon/ipc-contract/workspace.ts +28 -21
  578. package/src/daemon/ipc-contract-inventory.json +8 -0
  579. package/src/daemon/ipc-contract-inventory.ts +29 -26
  580. package/src/daemon/ipc-contract.ts +111 -44
  581. package/src/daemon/ipc-handler.ts +27 -19
  582. package/src/daemon/ipc-protocol.ts +22 -12
  583. package/src/daemon/ipc-validate.ts +91 -46
  584. package/src/daemon/lifecycle.ts +25 -1
  585. package/src/daemon/main.ts +10 -8
  586. package/src/daemon/media-visibility-policy.ts +3 -1
  587. package/src/daemon/pairing-store.ts +72 -40
  588. package/src/daemon/providers-setup.ts +35 -25
  589. package/src/daemon/recording-executor.ts +37 -30
  590. package/src/daemon/recording-intent-fallback.ts +58 -28
  591. package/src/daemon/recording-intent.ts +71 -61
  592. package/src/daemon/ride-shotgun-handler.ts +201 -121
  593. package/src/daemon/seed-files.ts +28 -17
  594. package/src/daemon/server.ts +23 -14
  595. package/src/daemon/session-agent-loop-handlers.ts +261 -135
  596. package/src/daemon/session-agent-loop.ts +795 -253
  597. package/src/daemon/session-attachments.ts +104 -39
  598. package/src/daemon/session-conflict-gate.ts +72 -28
  599. package/src/daemon/session-dynamic-profile.ts +36 -22
  600. package/src/daemon/session-error.ts +50 -45
  601. package/src/daemon/session-evictor.ts +17 -10
  602. package/src/daemon/session-history.ts +201 -89
  603. package/src/daemon/session-lifecycle.ts +79 -42
  604. package/src/daemon/session-media-retry.ts +89 -41
  605. package/src/daemon/session-memory.ts +77 -55
  606. package/src/daemon/session-messaging.ts +261 -111
  607. package/src/daemon/session-notifiers.ts +57 -45
  608. package/src/daemon/session-process.ts +370 -154
  609. package/src/daemon/session-queue-manager.ts +30 -13
  610. package/src/daemon/session-runtime-assembly.ts +61 -15
  611. package/src/daemon/session-skill-tools.ts +84 -36
  612. package/src/daemon/session-slash.ts +178 -113
  613. package/src/daemon/session-surfaces.ts +498 -211
  614. package/src/daemon/session-tool-setup.ts +22 -17
  615. package/src/daemon/session-usage.ts +26 -13
  616. package/src/daemon/session-workspace.ts +7 -4
  617. package/src/daemon/session.ts +18 -19
  618. package/src/daemon/shutdown-handlers.ts +36 -33
  619. package/src/daemon/tls-certs.ts +90 -57
  620. package/src/daemon/tool-side-effects.ts +97 -65
  621. package/src/daemon/trace-emitter.ts +8 -7
  622. package/src/daemon/video-thumbnail.ts +55 -25
  623. package/src/daemon/watch-handler.ts +164 -86
  624. package/src/email/provider.ts +1 -1
  625. package/src/email/providers/agentmail.ts +87 -45
  626. package/src/email/providers/index.ts +19 -14
  627. package/src/email/service.ts +52 -24
  628. package/src/email/types.ts +2 -2
  629. package/src/errors.ts +1 -1
  630. package/src/events/bus.ts +30 -10
  631. package/src/events/domain-events.ts +19 -13
  632. package/src/events/index.ts +6 -6
  633. package/src/events/tool-audit-listener.ts +34 -20
  634. package/src/events/tool-domain-event-publisher.ts +22 -20
  635. package/src/events/tool-metrics-listener.ts +26 -21
  636. package/src/events/tool-notification-listener.ts +5 -5
  637. package/src/events/tool-profiling-listener.ts +33 -23
  638. package/src/events/tool-trace-listener.ts +70 -46
  639. package/src/export/formatter.ts +38 -32
  640. package/src/followups/followup-store.ts +43 -36
  641. package/src/followups/index.ts +2 -2
  642. package/src/followups/types.ts +1 -1
  643. package/src/gallery/default-gallery.ts +37 -34
  644. package/src/gallery/gallery-manifest.ts +9 -9
  645. package/src/heartbeat/heartbeat-service.ts +59 -37
  646. package/src/home-base/app-link-store.ts +14 -12
  647. package/src/home-base/bootstrap.ts +14 -8
  648. package/src/home-base/prebuilt/seed.ts +35 -26
  649. package/src/home-base/prebuilt-home-base-updater.ts +14 -8
  650. package/src/hooks/cli.ts +56 -43
  651. package/src/hooks/config.ts +27 -14
  652. package/src/hooks/discovery.ts +53 -33
  653. package/src/hooks/manager.ts +50 -26
  654. package/src/hooks/runner.ts +35 -29
  655. package/src/hooks/templates.ts +38 -15
  656. package/src/hooks/types.ts +13 -13
  657. package/src/inbound/platform-callback-registration.ts +21 -15
  658. package/src/inbound/public-ingress-urls.ts +9 -6
  659. package/src/index.ts +20 -19
  660. package/src/influencer/client.ts +269 -108
  661. package/src/instrument.ts +3 -1
  662. package/src/logfire.ts +64 -39
  663. package/src/mcp/client.ts +107 -55
  664. package/src/mcp/manager.ts +45 -18
  665. package/src/mcp/mcp-oauth-provider.ts +114 -62
  666. package/src/media/gemini-image-service.ts +28 -21
  667. package/src/memory/account-store.ts +16 -9
  668. package/src/memory/admin.ts +87 -57
  669. package/src/memory/app-git-service.ts +77 -47
  670. package/src/memory/app-store.ts +151 -77
  671. package/src/memory/attachments-store.ts +123 -53
  672. package/src/memory/canonical-guardian-store.ts +190 -48
  673. package/src/memory/channel-delivery-store.ts +5 -5
  674. package/src/memory/channel-guardian-store.ts +31 -16
  675. package/src/memory/checkpoints.ts +14 -7
  676. package/src/memory/clarification-resolver.ts +219 -104
  677. package/src/memory/conflict-intent.ts +74 -23
  678. package/src/memory/conflict-policy.ts +20 -7
  679. package/src/memory/conflict-store.ts +144 -94
  680. package/src/memory/contradiction-checker.ts +257 -132
  681. package/src/memory/conversation-attention-store.ts +72 -32
  682. package/src/memory/conversation-bootstrap.ts +28 -0
  683. package/src/memory/conversation-crud.ts +12 -5
  684. package/src/memory/conversation-display-order-migration.ts +7 -7
  685. package/src/memory/conversation-key-store.ts +18 -13
  686. package/src/memory/conversation-queries.ts +130 -52
  687. package/src/memory/conversation-store.ts +43 -26
  688. package/src/memory/conversation-title-service.ts +89 -66
  689. package/src/memory/db-init.ts +90 -2
  690. package/src/memory/db.ts +10 -3
  691. package/src/memory/delivery-channels.ts +12 -6
  692. package/src/memory/delivery-crud.ts +26 -12
  693. package/src/memory/delivery-status.ts +19 -16
  694. package/src/memory/embedding-backend.ts +205 -77
  695. package/src/memory/embedding-gemini.ts +23 -10
  696. package/src/memory/embedding-local.ts +89 -44
  697. package/src/memory/embedding-ollama.ts +25 -13
  698. package/src/memory/embedding-openai.ts +20 -11
  699. package/src/memory/embedding-runtime-manager.ts +163 -90
  700. package/src/memory/entity-extractor.ts +185 -123
  701. package/src/memory/external-conversation-store.ts +30 -12
  702. package/src/memory/fingerprint.ts +2 -2
  703. package/src/memory/fts-reconciler.ts +57 -28
  704. package/src/memory/guardian-action-store.ts +162 -100
  705. package/src/memory/guardian-approvals.ts +63 -129
  706. package/src/memory/guardian-rate-limits.ts +20 -9
  707. package/src/memory/guardian-verification.ts +82 -35
  708. package/src/memory/indexer.ts +96 -55
  709. package/src/memory/ingress-invite-store.ts +28 -169
  710. package/src/memory/items-extractor.ts +313 -157
  711. package/src/memory/job-handlers/backfill.ts +116 -63
  712. package/src/memory/job-handlers/cleanup.ts +64 -41
  713. package/src/memory/job-handlers/conflict.ts +90 -49
  714. package/src/memory/job-handlers/embedding.ts +32 -17
  715. package/src/memory/job-handlers/extraction.ts +58 -33
  716. package/src/memory/job-handlers/index-maintenance.ts +31 -17
  717. package/src/memory/job-handlers/media-processing.ts +65 -24
  718. package/src/memory/job-handlers/summarization.ts +186 -128
  719. package/src/memory/job-utils.ts +100 -57
  720. package/src/memory/jobs-store.ts +235 -142
  721. package/src/memory/jobs-worker.ts +167 -83
  722. package/src/memory/llm-request-log-store.ts +13 -11
  723. package/src/memory/llm-usage-store.ts +35 -26
  724. package/src/memory/media-store.ts +151 -44
  725. package/src/memory/message-content.ts +28 -18
  726. package/src/memory/migrations/001-job-deferrals.ts +11 -5
  727. package/src/memory/migrations/002-tool-invocations-fk.ts +14 -6
  728. package/src/memory/migrations/003-memory-fts-backfill.ts +11 -5
  729. package/src/memory/migrations/004-entity-relation-dedup.ts +17 -11
  730. package/src/memory/migrations/005-fingerprint-scope-unique.ts +36 -21
  731. package/src/memory/migrations/006-scope-salted-fingerprints.ts +35 -20
  732. package/src/memory/migrations/007-assistant-id-to-self.ts +40 -27
  733. package/src/memory/migrations/008-remove-assistant-id-columns.ts +58 -36
  734. package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +36 -22
  735. package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +21 -11
  736. package/src/memory/migrations/011-call-sessions-provider-sid-dedup.ts +30 -15
  737. package/src/memory/migrations/012-call-sessions-add-initiated-from.ts +4 -2
  738. package/src/memory/migrations/013-guardian-action-tables.ts +29 -11
  739. package/src/memory/migrations/014-backfill-inbox-thread-state.ts +35 -21
  740. package/src/memory/migrations/015-drop-active-search-index.ts +17 -11
  741. package/src/memory/migrations/016-memory-segments-indexes.ts +7 -3
  742. package/src/memory/migrations/017-memory-items-indexes.ts +4 -2
  743. package/src/memory/migrations/018-remaining-table-indexes.ts +13 -5
  744. package/src/memory/migrations/019-notification-tables-schema-migration.ts +34 -20
  745. package/src/memory/migrations/020-rename-macos-ios-channel-to-vellum.ts +87 -53
  746. package/src/memory/migrations/021-conversation-status-indexes.ts +7 -3
  747. package/src/memory/migrations/022-add-origin-interface.ts +4 -2
  748. package/src/memory/migrations/023-memory-item-sources-indexes.ts +4 -2
  749. package/src/memory/migrations/024-embedding-vector-blob.ts +34 -18
  750. package/src/memory/migrations/025-messages-fts-backfill.ts +11 -5
  751. package/src/memory/migrations/026-guardian-verification-sessions.ts +80 -14
  752. package/src/memory/migrations/026a-embeddings-nullable-vector-json.ts +42 -26
  753. package/src/memory/migrations/027-notification-delivery-pairing-columns.ts +22 -8
  754. package/src/memory/migrations/027a-guardian-bootstrap-token.ts +11 -3
  755. package/src/memory/migrations/028-call-session-mode.ts +13 -3
  756. package/src/memory/migrations/028-notification-delivery-client-ack.ts +22 -8
  757. package/src/memory/migrations/029-channel-inbound-delivered-segments.ts +7 -3
  758. package/src/memory/migrations/030-guardian-action-followup.ts +46 -8
  759. package/src/memory/migrations/030-guardian-verification-purpose.ts +4 -2
  760. package/src/memory/migrations/031-conversations-thread-type-index.ts +4 -2
  761. package/src/memory/migrations/032-guardian-delivery-conversation-index.ts +4 -2
  762. package/src/memory/migrations/032-notification-delivery-thread-decision.ts +22 -8
  763. package/src/memory/migrations/033-scoped-approval-grants.ts +1 -1
  764. package/src/memory/migrations/034-guardian-action-tool-metadata.ts +15 -3
  765. package/src/memory/migrations/035-guardian-action-supersession.ts +15 -3
  766. package/src/memory/migrations/036-normalize-phone-identities.ts +101 -87
  767. package/src/memory/migrations/037-voice-invite-columns.ts +22 -4
  768. package/src/memory/migrations/038-actor-token-records.ts +5 -9
  769. package/src/memory/migrations/039-actor-refresh-token-records.ts +7 -13
  770. package/src/memory/migrations/100-core-tables.ts +1 -1
  771. package/src/memory/migrations/101-watchers-and-logs.ts +1 -1
  772. package/src/memory/migrations/103-complex-migrations.ts +9 -9
  773. package/src/memory/migrations/104-core-indexes.ts +188 -64
  774. package/src/memory/migrations/105-contacts-and-triage.ts +28 -10
  775. package/src/memory/migrations/106-call-sessions.ts +58 -16
  776. package/src/memory/migrations/107-followups.ts +16 -6
  777. package/src/memory/migrations/108-tasks-and-work-items.ts +43 -11
  778. package/src/memory/migrations/109-external-conversation-bindings.ts +11 -5
  779. package/src/memory/migrations/110-channel-guardian.ts +48 -10
  780. package/src/memory/migrations/111-media-assets.ts +52 -18
  781. package/src/memory/migrations/112-assistant-inbox.ts +32 -12
  782. package/src/memory/migrations/113-late-migrations.ts +12 -12
  783. package/src/memory/migrations/114-notifications.ts +28 -12
  784. package/src/memory/migrations/115-sequences.ts +10 -4
  785. package/src/memory/migrations/116-messages-fts.ts +1 -1
  786. package/src/memory/migrations/117-conversation-attention.ts +16 -6
  787. package/src/memory/migrations/118-reminder-routing-intent.ts +7 -3
  788. package/src/memory/migrations/119-schema-indexes-and-columns.ts +35 -15
  789. package/src/memory/migrations/120-fk-cascade-rebuilds.ts +36 -17
  790. package/src/memory/migrations/121-canonical-guardian-requests.ts +25 -9
  791. package/src/memory/migrations/122-canonical-guardian-requester-chat-id.ts +11 -3
  792. package/src/memory/migrations/123-canonical-guardian-deliveries-destination-index.ts +4 -2
  793. package/src/memory/migrations/124-voice-invite-display-metadata.ts +15 -3
  794. package/src/memory/migrations/125-guardian-principal-id-columns.ts +22 -4
  795. package/src/memory/migrations/126-backfill-guardian-principal-id.ts +174 -126
  796. package/src/memory/migrations/127-guardian-principal-id-not-null.ts +58 -42
  797. package/src/memory/migrations/128-contacts-role-principal.ts +26 -0
  798. package/src/memory/migrations/129-contact-channels-access-fields.ts +105 -0
  799. package/src/memory/migrations/130-contact-channels-type-ext-chat-id-index.ts +15 -0
  800. package/src/memory/migrations/131-drop-legacy-member-guardian-tables.ts +134 -0
  801. package/src/memory/migrations/132-contacts-assistant-id.ts +21 -0
  802. package/src/memory/migrations/index.ts +82 -73
  803. package/src/memory/migrations/registry.ts +53 -37
  804. package/src/memory/migrations/validate-migration-state.ts +73 -46
  805. package/src/memory/profile-compiler.ts +58 -24
  806. package/src/memory/published-pages-store.ts +12 -16
  807. package/src/memory/qdrant-circuit-breaker.ts +28 -20
  808. package/src/memory/qdrant-client.ts +99 -63
  809. package/src/memory/qdrant-manager.ts +89 -57
  810. package/src/memory/query-builder.ts +9 -7
  811. package/src/memory/raw-query.ts +63 -14
  812. package/src/memory/recall-cache.ts +15 -8
  813. package/src/memory/retrieval-budget.ts +0 -1
  814. package/src/memory/retriever.ts +385 -192
  815. package/src/memory/schema-migration.ts +1 -1
  816. package/src/memory/schema.ts +44 -56
  817. package/src/memory/scoped-approval-grants.ts +99 -45
  818. package/src/memory/search/entity.ts +102 -40
  819. package/src/memory/search/formatting.ts +70 -52
  820. package/src/memory/search/lexical.ts +82 -43
  821. package/src/memory/search/ranking.ts +103 -39
  822. package/src/memory/search/semantic.ts +59 -35
  823. package/src/memory/search/types.ts +8 -8
  824. package/src/memory/segmenter.ts +20 -12
  825. package/src/memory/shared-app-links-store.ts +21 -16
  826. package/src/memory/task-memory-cleanup.ts +18 -8
  827. package/src/memory/tool-usage-store.ts +27 -19
  828. package/src/memory/validation.ts +4 -2
  829. package/src/messaging/activity-analyzer.ts +7 -7
  830. package/src/messaging/draft-store.ts +13 -10
  831. package/src/messaging/email-classifier.ts +73 -37
  832. package/src/messaging/index.ts +3 -3
  833. package/src/messaging/outreach-classifier.ts +76 -38
  834. package/src/messaging/provider-types.ts +2 -4
  835. package/src/messaging/provider.ts +37 -8
  836. package/src/messaging/providers/gmail/adapter.ts +183 -66
  837. package/src/messaging/providers/gmail/client.ts +3 -1
  838. package/src/messaging/providers/gmail/mime-builder.ts +21 -19
  839. package/src/messaging/providers/gmail/people-client.ts +22 -9
  840. package/src/messaging/providers/gmail/types.ts +6 -6
  841. package/src/messaging/providers/slack/adapter.ts +93 -43
  842. package/src/messaging/providers/slack/client.ts +100 -41
  843. package/src/messaging/providers/slack/types.ts +6 -0
  844. package/src/messaging/providers/sms/adapter.ts +76 -40
  845. package/src/messaging/providers/sms/client.ts +4 -4
  846. package/src/messaging/providers/telegram-bot/adapter.ts +52 -30
  847. package/src/messaging/providers/telegram-bot/client.ts +7 -7
  848. package/src/messaging/providers/whatsapp/adapter.ts +58 -31
  849. package/src/messaging/providers/whatsapp/client.ts +4 -4
  850. package/src/messaging/registry.ts +9 -5
  851. package/src/messaging/style-analyzer.ts +69 -39
  852. package/src/messaging/thread-summarizer.ts +101 -53
  853. package/src/messaging/triage-engine.ts +111 -82
  854. package/src/messaging/types.ts +10 -10
  855. package/src/migrations/config-merge.ts +18 -10
  856. package/src/migrations/data-layout.ts +35 -22
  857. package/src/migrations/data-merge.ts +17 -7
  858. package/src/migrations/hooks-merge.ts +43 -16
  859. package/src/migrations/index.ts +6 -6
  860. package/src/migrations/log.ts +9 -5
  861. package/src/migrations/skills-merge.ts +17 -7
  862. package/src/migrations/workspace-layout.ts +39 -25
  863. package/src/notifications/AGENTS.md +5 -0
  864. package/src/notifications/adapters/macos.ts +21 -14
  865. package/src/notifications/adapters/sms.ts +28 -15
  866. package/src/notifications/adapters/telegram.ts +24 -15
  867. package/src/notifications/broadcaster.ts +108 -52
  868. package/src/notifications/conversation-pairing.ts +64 -29
  869. package/src/notifications/copy-composer.ts +165 -95
  870. package/src/notifications/decision-engine.ts +353 -147
  871. package/src/notifications/decisions-store.ts +26 -10
  872. package/src/notifications/deliveries-store.ts +23 -13
  873. package/src/notifications/destination-resolver.ts +42 -24
  874. package/src/notifications/deterministic-checks.ts +78 -27
  875. package/src/notifications/emit-signal.ts +83 -45
  876. package/src/notifications/events-store.ts +13 -7
  877. package/src/notifications/guardian-question-mode.ts +125 -75
  878. package/src/notifications/preference-extractor.ts +85 -53
  879. package/src/notifications/preference-summary.ts +31 -18
  880. package/src/notifications/preferences-store.ts +29 -18
  881. package/src/notifications/runtime-dispatch.ts +22 -12
  882. package/src/notifications/signal.ts +4 -4
  883. package/src/notifications/thread-candidates.ts +59 -23
  884. package/src/notifications/thread-seed-composer.ts +45 -27
  885. package/src/notifications/types.ts +19 -10
  886. package/src/oauth/connect-orchestrator.ts +105 -54
  887. package/src/oauth/connect-types.ts +3 -3
  888. package/src/oauth/provider-profiles.ts +80 -59
  889. package/src/oauth/scope-policy.ts +5 -2
  890. package/src/oauth/token-persistence.ts +58 -24
  891. package/src/outbound-proxy/certs.ts +284 -0
  892. package/src/outbound-proxy/config.ts +94 -0
  893. package/src/outbound-proxy/connect-tunnel.ts +84 -0
  894. package/src/outbound-proxy/health.ts +62 -0
  895. package/src/outbound-proxy/host-pattern-match.ts +67 -0
  896. package/src/outbound-proxy/http-forwarder.ts +162 -0
  897. package/src/outbound-proxy/index.ts +80 -0
  898. package/src/outbound-proxy/logging.ts +193 -0
  899. package/src/outbound-proxy/mitm-handler.ts +292 -0
  900. package/src/outbound-proxy/policy.ts +172 -0
  901. package/src/outbound-proxy/router.ts +64 -0
  902. package/src/outbound-proxy/server.ts +145 -0
  903. package/src/outbound-proxy/types.ts +150 -0
  904. package/src/permissions/checker.ts +481 -189
  905. package/src/permissions/defaults.ts +135 -108
  906. package/src/permissions/prompter.ts +53 -27
  907. package/src/permissions/secret-prompter.ts +21 -15
  908. package/src/permissions/shell-identity.ts +47 -16
  909. package/src/permissions/trust-store.ts +185 -73
  910. package/src/permissions/types.ts +22 -12
  911. package/src/permissions/workspace-policy.ts +47 -38
  912. package/src/playbooks/index.ts +10 -2
  913. package/src/playbooks/playbook-compiler.ts +30 -24
  914. package/src/playbooks/types.ts +11 -8
  915. package/src/providers/anthropic/client.ts +325 -168
  916. package/src/providers/failover.ts +57 -22
  917. package/src/providers/fireworks/client.ts +9 -5
  918. package/src/providers/gemini/client.ts +61 -39
  919. package/src/providers/model-intents.ts +40 -33
  920. package/src/providers/ollama/client.ts +7 -7
  921. package/src/providers/openai/client.ts +106 -68
  922. package/src/providers/openrouter/client.ts +9 -5
  923. package/src/providers/provider-send-message.ts +59 -27
  924. package/src/providers/ratelimit.ts +25 -8
  925. package/src/providers/registry.ts +86 -38
  926. package/src/providers/retry.ts +84 -36
  927. package/src/providers/stream-timeout.ts +5 -3
  928. package/src/providers/types.ts +7 -6
  929. package/src/runtime/AGENTS.md +42 -0
  930. package/src/runtime/access-request-helper.ts +118 -68
  931. package/src/runtime/actor-refresh-token-store.ts +21 -16
  932. package/src/runtime/actor-token-store.ts +25 -18
  933. package/src/runtime/actor-trust-resolver.ts +183 -80
  934. package/src/runtime/approval-conversation-turn.ts +39 -26
  935. package/src/runtime/approval-message-composer.ts +116 -84
  936. package/src/runtime/assistant-event-hub.ts +25 -6
  937. package/src/runtime/assistant-event.ts +4 -4
  938. package/src/runtime/assistant-scope.ts +1 -1
  939. package/src/runtime/auth/__tests__/guard-tests.test.ts +36 -14
  940. package/src/runtime/auth/context.ts +8 -7
  941. package/src/runtime/auth/credential-service.ts +60 -38
  942. package/src/runtime/auth/external-assistant-id.ts +16 -8
  943. package/src/runtime/auth/index.ts +23 -16
  944. package/src/runtime/auth/route-policy.ts +170 -104
  945. package/src/runtime/auth/scopes.ts +22 -29
  946. package/src/runtime/auth/subject.ts +19 -13
  947. package/src/runtime/auth/token-service.ts +3 -3
  948. package/src/runtime/auth/types.ts +23 -23
  949. package/src/runtime/channel-approval-parser.ts +37 -14
  950. package/src/runtime/channel-approval-types.ts +12 -4
  951. package/src/runtime/channel-approvals.ts +41 -23
  952. package/src/runtime/channel-guardian-service.ts +144 -103
  953. package/src/runtime/channel-invite-transport.ts +4 -2
  954. package/src/runtime/channel-invite-transports/telegram.ts +16 -10
  955. package/src/runtime/channel-invite-transports/voice.ts +7 -7
  956. package/src/runtime/channel-readiness-service.ts +139 -90
  957. package/src/runtime/channel-readiness-types.ts +4 -2
  958. package/src/runtime/channel-reply-delivery.ts +21 -11
  959. package/src/runtime/channel-retry-sweep.ts +111 -62
  960. package/src/runtime/confirmation-request-guardian-bridge.ts +73 -54
  961. package/src/runtime/gateway-client.ts +86 -53
  962. package/src/runtime/guardian-action-conversation-turn.ts +34 -18
  963. package/src/runtime/guardian-action-followup-executor.ts +115 -45
  964. package/src/runtime/guardian-action-grant-minter.ts +40 -24
  965. package/src/runtime/guardian-action-message-composer.ts +105 -84
  966. package/src/runtime/guardian-decision-types.ts +28 -13
  967. package/src/runtime/guardian-outbound-actions.ts +9 -0
  968. package/src/runtime/guardian-reply-router.ts +274 -145
  969. package/src/runtime/guardian-vellum-migration.ts +38 -24
  970. package/src/runtime/guardian-verification-templates.ts +8 -11
  971. package/src/runtime/http-router.ts +175 -0
  972. package/src/runtime/http-server.ts +931 -669
  973. package/src/runtime/http-types.ts +2 -2
  974. package/src/runtime/ingress-service.ts +182 -89
  975. package/src/runtime/invite-redemption-service.ts +211 -134
  976. package/src/runtime/invite-redemption-templates.ts +18 -11
  977. package/src/runtime/local-actor-identity.ts +73 -55
  978. package/src/runtime/middleware/auth.ts +25 -14
  979. package/src/runtime/middleware/error-handler.ts +15 -11
  980. package/src/runtime/middleware/rate-limiter.ts +23 -17
  981. package/src/runtime/middleware/request-logger.ts +4 -4
  982. package/src/runtime/middleware/twilio-validation.ts +29 -20
  983. package/src/runtime/migrations/migration-transport.ts +575 -0
  984. package/src/runtime/migrations/migration-wizard.ts +715 -0
  985. package/src/runtime/migrations/rebind-secrets-screen.ts +351 -0
  986. package/src/runtime/migrations/transfer-progress-screen.ts +321 -0
  987. package/src/runtime/migrations/validation-results-screen.ts +467 -0
  988. package/src/runtime/migrations/vbundle-builder.ts +295 -0
  989. package/src/runtime/migrations/vbundle-import-analyzer.ts +212 -0
  990. package/src/runtime/migrations/vbundle-importer.ts +339 -0
  991. package/src/runtime/migrations/vbundle-validator.ts +356 -0
  992. package/src/runtime/pending-interactions.ts +16 -7
  993. package/src/runtime/routes/access-request-decision.ts +73 -52
  994. package/src/runtime/routes/app-routes.ts +56 -38
  995. package/src/runtime/routes/approval-routes.ts +165 -74
  996. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +930 -0
  997. package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +82 -0
  998. package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +151 -0
  999. package/src/runtime/routes/attachment-routes.ts +59 -48
  1000. package/src/runtime/routes/brain-graph-routes.ts +85 -69
  1001. package/src/runtime/routes/call-routes.ts +79 -38
  1002. package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +10 -10
  1003. package/src/runtime/routes/channel-delivery-routes.ts +19 -14
  1004. package/src/runtime/routes/channel-guardian-routes.ts +3 -3
  1005. package/src/runtime/routes/channel-inbound-routes.ts +2 -2
  1006. package/src/runtime/routes/channel-readiness-routes.ts +12 -6
  1007. package/src/runtime/routes/channel-route-shared.ts +33 -25
  1008. package/src/runtime/routes/channel-routes.ts +4 -6
  1009. package/src/runtime/routes/contact-routes.ts +205 -16
  1010. package/src/runtime/routes/conversation-attention-routes.ts +57 -28
  1011. package/src/runtime/routes/conversation-routes.ts +321 -174
  1012. package/src/runtime/routes/debug-routes.ts +14 -10
  1013. package/src/runtime/routes/events-routes.ts +90 -57
  1014. package/src/runtime/routes/global-search-routes.ts +266 -0
  1015. package/src/runtime/routes/guardian-action-routes.ts +147 -56
  1016. package/src/runtime/routes/guardian-approval-interception.ts +255 -880
  1017. package/src/runtime/routes/guardian-approval-prompt.ts +40 -24
  1018. package/src/runtime/routes/guardian-approval-reply-helpers.ts +135 -0
  1019. package/src/runtime/routes/guardian-bootstrap-routes.ts +55 -36
  1020. package/src/runtime/routes/guardian-expiry-sweep.ts +63 -37
  1021. package/src/runtime/routes/guardian-refresh-routes.ts +40 -19
  1022. package/src/runtime/routes/identity-routes.ts +71 -42
  1023. package/src/runtime/routes/inbound-conversation.ts +17 -11
  1024. package/src/runtime/routes/inbound-message-handler.ts +278 -1460
  1025. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +658 -0
  1026. package/src/runtime/routes/inbound-stages/background-dispatch.ts +492 -0
  1027. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +214 -0
  1028. package/src/runtime/routes/inbound-stages/edit-intercept.ts +116 -0
  1029. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +167 -0
  1030. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +185 -0
  1031. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +132 -0
  1032. package/src/runtime/routes/inbound-stages/verification-intercept.ts +340 -0
  1033. package/src/runtime/routes/ingress-routes.ts +34 -23
  1034. package/src/runtime/routes/integration-routes.ts +60 -21
  1035. package/src/runtime/routes/migration-routes.ts +434 -0
  1036. package/src/runtime/routes/pairing-routes.ts +157 -79
  1037. package/src/runtime/routes/secret-routes.ts +6 -2
  1038. package/src/runtime/routes/twilio-routes.ts +443 -249
  1039. package/src/runtime/tool-grant-request-helper.ts +36 -27
  1040. package/src/runtime/{guardian-context-resolver.ts → trust-context-resolver.ts} +29 -41
  1041. package/src/schedule/integration-status.ts +44 -9
  1042. package/src/schedule/recurrence-engine.ts +47 -24
  1043. package/src/schedule/recurrence-types.ts +12 -7
  1044. package/src/schedule/schedule-store.ts +166 -83
  1045. package/src/schedule/scheduler.ts +26 -22
  1046. package/src/security/encrypted-store.ts +68 -38
  1047. package/src/security/keychain.ts +183 -120
  1048. package/src/security/oauth-callback-registry.ts +3 -3
  1049. package/src/security/oauth2.ts +226 -138
  1050. package/src/security/redaction.ts +24 -24
  1051. package/src/security/secret-allowlist.ts +46 -21
  1052. package/src/security/secret-ingress.ts +15 -7
  1053. package/src/security/secret-scanner.ts +193 -104
  1054. package/src/security/secure-keys.ts +9 -3
  1055. package/src/security/token-manager.ts +99 -40
  1056. package/src/security/tool-approval-digest.ts +3 -3
  1057. package/src/sequence/analytics.ts +52 -27
  1058. package/src/sequence/engine.ts +135 -72
  1059. package/src/sequence/guardrails.ts +32 -20
  1060. package/src/sequence/importer.ts +75 -37
  1061. package/src/sequence/reply-matcher.ts +36 -18
  1062. package/src/sequence/store.ts +137 -75
  1063. package/src/sequence/types.ts +30 -16
  1064. package/src/services/published-app-updater.ts +26 -16
  1065. package/src/services/vercel-deploy.ts +19 -15
  1066. package/src/skills/active-skill-tools.ts +3 -3
  1067. package/src/skills/clawhub.ts +178 -90
  1068. package/src/skills/include-graph.ts +24 -17
  1069. package/src/skills/managed-store.ts +89 -42
  1070. package/src/skills/path-classifier.ts +10 -10
  1071. package/src/skills/remote-skill-policy.ts +31 -22
  1072. package/src/skills/slash-commands.ts +36 -30
  1073. package/src/skills/tool-manifest.ts +60 -31
  1074. package/src/skills/version-hash.ts +25 -15
  1075. package/src/slack/slack-webhook.ts +19 -15
  1076. package/src/subagent/index.ts +4 -8
  1077. package/src/subagent/manager.ts +119 -69
  1078. package/src/subagent/types.ts +9 -12
  1079. package/src/swarm/backend-claude-code.ts +124 -45
  1080. package/src/swarm/checkpoint.ts +36 -16
  1081. package/src/swarm/graph-utils.ts +1 -3
  1082. package/src/swarm/index.ts +38 -19
  1083. package/src/swarm/limits.ts +13 -4
  1084. package/src/swarm/orchestrator.ts +108 -57
  1085. package/src/swarm/plan-validator.ts +23 -17
  1086. package/src/swarm/router-planner.ts +51 -22
  1087. package/src/swarm/router-prompts.ts +4 -1
  1088. package/src/swarm/synthesizer.ts +26 -18
  1089. package/src/swarm/types.ts +14 -4
  1090. package/src/swarm/worker-backend.ts +36 -26
  1091. package/src/swarm/worker-prompts.ts +13 -9
  1092. package/src/swarm/worker-runner.ts +40 -34
  1093. package/src/tasks/candidate-store.ts +14 -6
  1094. package/src/tasks/ephemeral-permissions.ts +9 -5
  1095. package/src/tasks/task-compiler.ts +41 -38
  1096. package/src/tasks/task-runner.ts +54 -26
  1097. package/src/tasks/task-scheduler.ts +1 -1
  1098. package/src/tasks/task-store.ts +20 -7
  1099. package/src/tasks/tool-sanitizer.ts +3 -3
  1100. package/src/tools/apps/definitions.ts +23 -15
  1101. package/src/tools/apps/executors.ts +118 -37
  1102. package/src/tools/apps/open-proxy.ts +5 -5
  1103. package/src/tools/apps/registry.ts +2 -2
  1104. package/src/tools/assets/materialize.ts +59 -41
  1105. package/src/tools/assets/search.ts +86 -48
  1106. package/src/tools/browser/api-map.ts +52 -36
  1107. package/src/tools/browser/auth-cache.ts +21 -18
  1108. package/src/tools/browser/auth-detector.ts +43 -28
  1109. package/src/tools/browser/auto-navigate.ts +149 -68
  1110. package/src/tools/browser/browser-execution.ts +9 -3
  1111. package/src/tools/browser/headless-browser.ts +287 -150
  1112. package/src/tools/browser/jit-auth.ts +37 -21
  1113. package/src/tools/browser/network-recorder.ts +138 -56
  1114. package/src/tools/browser/recording-store.ts +22 -15
  1115. package/src/tools/browser/runtime-check.ts +8 -5
  1116. package/src/tools/browser/x-auto-navigate.ts +88 -47
  1117. package/src/tools/calls/call-end.ts +9 -6
  1118. package/src/tools/calls/call-start.ts +30 -20
  1119. package/src/tools/calls/call-status.ts +8 -5
  1120. package/src/tools/claude-code/claude-code.ts +301 -165
  1121. package/src/tools/computer-use/definitions.ts +159 -130
  1122. package/src/tools/computer-use/registry.ts +2 -2
  1123. package/src/tools/computer-use/request-computer-control.ts +21 -13
  1124. package/src/tools/computer-use/skill-proxy-bridge.ts +1 -1
  1125. package/src/tools/credentials/account-registry.ts +52 -35
  1126. package/src/tools/credentials/broker-types.ts +1 -1
  1127. package/src/tools/credentials/broker.ts +97 -55
  1128. package/src/tools/credentials/domain-policy.ts +5 -2
  1129. package/src/tools/credentials/host-pattern-match.ts +15 -8
  1130. package/src/tools/credentials/metadata-store.ts +93 -43
  1131. package/src/tools/credentials/policy-types.ts +5 -2
  1132. package/src/tools/credentials/policy-validate.ts +21 -14
  1133. package/src/tools/credentials/post-connect-hooks.ts +18 -7
  1134. package/src/tools/credentials/resolve.ts +11 -10
  1135. package/src/tools/credentials/selection.ts +30 -25
  1136. package/src/tools/credentials/tool-policy.ts +5 -2
  1137. package/src/tools/credentials/vault.ts +452 -183
  1138. package/src/tools/document/document-tool.ts +23 -17
  1139. package/src/tools/document/editor-template.ts +12 -7
  1140. package/src/tools/execution-target.ts +13 -10
  1141. package/src/tools/execution-timeout.ts +6 -5
  1142. package/src/tools/executor.ts +141 -74
  1143. package/src/tools/filesystem/edit.ts +82 -45
  1144. package/src/tools/filesystem/fuzzy-match.ts +70 -32
  1145. package/src/tools/filesystem/read.ts +46 -28
  1146. package/src/tools/filesystem/view-image.ts +86 -42
  1147. package/src/tools/filesystem/write.ts +53 -32
  1148. package/src/tools/followups/followup_create.ts +43 -17
  1149. package/src/tools/followups/followup_list.ts +28 -13
  1150. package/src/tools/followups/followup_resolve.ts +9 -6
  1151. package/src/tools/guardian-control-plane-policy.ts +15 -14
  1152. package/src/tools/host-filesystem/edit.ts +77 -42
  1153. package/src/tools/host-filesystem/read.ts +52 -33
  1154. package/src/tools/host-filesystem/write.ts +50 -29
  1155. package/src/tools/host-terminal/host-shell.ts +97 -61
  1156. package/src/tools/mcp/mcp-tool-factory.ts +21 -14
  1157. package/src/tools/memory/definitions.ts +60 -28
  1158. package/src/tools/memory/handlers.ts +149 -77
  1159. package/src/tools/memory/register.ts +39 -16
  1160. package/src/tools/network/__tests__/web-search.test.ts +236 -177
  1161. package/src/tools/network/domain-normalize.ts +13 -9
  1162. package/src/tools/network/script-proxy/__tests__/logging.test.ts +193 -123
  1163. package/src/tools/network/script-proxy/__tests__/policy.test.ts +225 -127
  1164. package/src/tools/network/script-proxy/index.ts +1 -17
  1165. package/src/tools/network/script-proxy/session-manager.ts +151 -84
  1166. package/src/tools/network/url-safety.ts +56 -34
  1167. package/src/tools/network/web-fetch.ts +273 -155
  1168. package/src/tools/network/web-search.ts +166 -81
  1169. package/src/tools/permission-checker.ts +6 -25
  1170. package/src/tools/policy-context.ts +8 -5
  1171. package/src/tools/registry.ts +73 -46
  1172. package/src/tools/reminder/reminder-store.ts +65 -44
  1173. package/src/tools/reminder/reminder.ts +76 -35
  1174. package/src/tools/schedule/create.ts +44 -21
  1175. package/src/tools/schedule/delete.ts +8 -5
  1176. package/src/tools/schedule/list.ts +39 -19
  1177. package/src/tools/schedule/update.ts +49 -26
  1178. package/src/tools/secret-detection-handler.ts +130 -49
  1179. package/src/tools/sensitive-output-placeholders.ts +15 -8
  1180. package/src/tools/shared/filesystem/edit-engine.ts +45 -14
  1181. package/src/tools/shared/filesystem/errors.ts +18 -18
  1182. package/src/tools/shared/filesystem/file-ops-service.ts +59 -32
  1183. package/src/tools/shared/filesystem/format-diff.ts +21 -11
  1184. package/src/tools/shared/filesystem/path-policy.ts +17 -13
  1185. package/src/tools/shared/filesystem/size-guard.ts +8 -4
  1186. package/src/tools/shared/filesystem/types.ts +2 -2
  1187. package/src/tools/shared/shell-output.ts +4 -3
  1188. package/src/tools/side-effects.ts +36 -28
  1189. package/src/tools/skills/delete-managed.ts +30 -17
  1190. package/src/tools/skills/load.ts +88 -46
  1191. package/src/tools/skills/sandbox-runner.ts +62 -46
  1192. package/src/tools/skills/scaffold-managed.ts +98 -48
  1193. package/src/tools/skills/script-contract.ts +5 -2
  1194. package/src/tools/skills/skill-script-runner.ts +29 -13
  1195. package/src/tools/skills/skill-tool-factory.ts +20 -10
  1196. package/src/tools/subagent/abort.ts +10 -4
  1197. package/src/tools/subagent/message.ts +14 -8
  1198. package/src/tools/subagent/read.ts +20 -11
  1199. package/src/tools/subagent/spawn.ts +14 -6
  1200. package/src/tools/subagent/status.ts +7 -4
  1201. package/src/tools/swarm/delegate.ts +75 -49
  1202. package/src/tools/system/avatar-generator.ts +46 -33
  1203. package/src/tools/system/navigate-settings.ts +29 -19
  1204. package/src/tools/system/open-system-settings.ts +30 -20
  1205. package/src/tools/system/request-permission.ts +59 -44
  1206. package/src/tools/system/version.ts +27 -16
  1207. package/src/tools/system/voice-config.ts +116 -53
  1208. package/src/tools/tasks/index.ts +8 -8
  1209. package/src/tools/tasks/task-delete.ts +61 -22
  1210. package/src/tools/tasks/task-list.ts +23 -11
  1211. package/src/tools/tasks/task-run.ts +41 -16
  1212. package/src/tools/tasks/task-save.ts +27 -10
  1213. package/src/tools/tasks/work-item-enqueue.ts +114 -48
  1214. package/src/tools/tasks/work-item-list.ts +20 -10
  1215. package/src/tools/tasks/work-item-remove.ts +49 -15
  1216. package/src/tools/tasks/work-item-run.ts +34 -13
  1217. package/src/tools/tasks/work-item-update.ts +84 -31
  1218. package/src/tools/terminal/backends/native.ts +64 -35
  1219. package/src/tools/terminal/backends/types.ts +6 -2
  1220. package/src/tools/terminal/parser.ts +200 -125
  1221. package/src/tools/terminal/safe-env.ts +27 -21
  1222. package/src/tools/terminal/sandbox-diagnostics.ts +31 -13
  1223. package/src/tools/terminal/sandbox.ts +10 -6
  1224. package/src/tools/terminal/shell.ts +124 -68
  1225. package/src/tools/tool-approval-handler.ts +193 -138
  1226. package/src/tools/types.ts +43 -23
  1227. package/src/tools/ui-surface/definitions.ts +124 -89
  1228. package/src/tools/ui-surface/registry.ts +2 -2
  1229. package/src/tools/watch/screen-watch.ts +50 -32
  1230. package/src/tools/watch/watch-state.ts +41 -15
  1231. package/src/tools/watcher/create.ts +37 -15
  1232. package/src/tools/watcher/delete.ts +9 -6
  1233. package/src/tools/watcher/digest.ts +10 -6
  1234. package/src/tools/watcher/list.ts +37 -14
  1235. package/src/tools/watcher/update.ts +33 -18
  1236. package/src/tools/weather/service.ts +331 -174
  1237. package/src/twitter/client.ts +261 -138
  1238. package/src/twitter/oauth-client.ts +17 -13
  1239. package/src/twitter/router.ts +51 -23
  1240. package/src/twitter/session.ts +27 -18
  1241. package/src/types/qrcode.d.ts +6 -3
  1242. package/src/usage/actors.ts +16 -16
  1243. package/src/usage/types.ts +3 -3
  1244. package/src/util/bundled-asset.ts +10 -6
  1245. package/src/util/canonicalize-identity.ts +11 -4
  1246. package/src/util/clipboard.ts +7 -7
  1247. package/src/util/content-id.ts +3 -3
  1248. package/src/util/debounce.ts +3 -2
  1249. package/src/util/diff.ts +55 -33
  1250. package/src/util/errors.ts +26 -26
  1251. package/src/util/fs.ts +8 -2
  1252. package/src/util/log-redact.ts +12 -12
  1253. package/src/util/logger.ts +112 -51
  1254. package/src/util/network-info.ts +13 -5
  1255. package/src/util/object.ts +4 -2
  1256. package/src/util/phone.ts +4 -4
  1257. package/src/util/platform.ts +80 -58
  1258. package/src/util/pricing.ts +49 -31
  1259. package/src/util/retry.ts +18 -7
  1260. package/src/util/row-mapper.ts +7 -4
  1261. package/src/util/silently.ts +7 -4
  1262. package/src/util/spawn.ts +48 -0
  1263. package/src/util/spinner.ts +9 -7
  1264. package/src/util/time.ts +16 -3
  1265. package/src/util/truncate.ts +1 -1
  1266. package/src/util/voice-code.ts +6 -4
  1267. package/src/util/xml.ts +5 -1
  1268. package/src/version.ts +12 -8
  1269. package/src/watcher/engine.ts +71 -44
  1270. package/src/watcher/provider-registry.ts +1 -1
  1271. package/src/watcher/providers/github.ts +40 -23
  1272. package/src/watcher/providers/gmail.ts +59 -38
  1273. package/src/watcher/providers/google-calendar.ts +62 -48
  1274. package/src/watcher/providers/linear.ts +219 -150
  1275. package/src/watcher/providers/slack.ts +93 -27
  1276. package/src/watcher/watcher-store.ts +75 -55
  1277. package/src/work-items/work-item-runner.ts +62 -29
  1278. package/src/work-items/work-item-store.ts +137 -47
  1279. package/src/workspace/commit-message-enrichment-service.ts +65 -25
  1280. package/src/workspace/commit-message-provider.ts +14 -12
  1281. package/src/workspace/git-service.ts +355 -239
  1282. package/src/workspace/heartbeat-service.ts +74 -37
  1283. package/src/workspace/provider-commit-message-generator.ts +95 -70
  1284. package/src/workspace/top-level-renderer.ts +10 -8
  1285. package/src/workspace/top-level-scanner.ts +9 -3
  1286. package/src/workspace/turn-commit.ts +63 -36
  1287. package/src/__tests__/ingress-member-store.test.ts +0 -294
  1288. package/src/__tests__/script-proxy-router.test.ts +0 -215
  1289. package/src/config/bundled-skills/trusted-contacts/SKILL.md +0 -372
  1290. package/src/memory/guardian-bindings.ts +0 -158
  1291. package/src/memory/ingress-member-store.ts +0 -352
  1292. package/src/tools/network/script-proxy/__tests__/router.test.ts +0 -77
  1293. package/src/tools/network/script-proxy/certs.ts +0 -7
  1294. package/src/tools/network/script-proxy/connect-tunnel.ts +0 -1
  1295. package/src/tools/network/script-proxy/http-forwarder.ts +0 -2
  1296. package/src/tools/network/script-proxy/logging.ts +0 -12
  1297. package/src/tools/network/script-proxy/mitm-handler.ts +0 -2
  1298. package/src/tools/network/script-proxy/policy.ts +0 -4
  1299. package/src/tools/network/script-proxy/router.ts +0 -2
  1300. package/src/tools/network/script-proxy/server.ts +0 -5
  1301. package/src/tools/network/script-proxy/types.ts +0 -19
@@ -6,27 +6,43 @@
6
6
  * with the AgentLoop (which runs inference via the Anthropic API with CU tools).
7
7
  */
8
8
 
9
- import { v4 as uuid } from 'uuid';
10
-
11
- import { AgentLoop } from '../agent/loop.js';
12
- import { buildComputerUseSystemPrompt } from '../config/computer-use-prompt.js';
13
- import { getConfig } from '../config/loader.js';
14
- import { PermissionPrompter } from '../permissions/prompter.js';
15
- import { SecretPrompter } from '../permissions/secret-prompter.js';
16
- import type { UserDecision } from '../permissions/types.js';
17
- import type { ContentBlock, Message, Provider, ToolDefinition } from '../providers/types.js';
18
- import { allComputerUseTools } from '../tools/computer-use/definitions.js';
19
- import { ToolExecutor } from '../tools/executor.js';
20
- import { registerSkillTools } from '../tools/registry.js';
21
- import type { Tool, ToolExecutionResult } from '../tools/types.js';
22
- import { allUiSurfaceTools } from '../tools/ui-surface/definitions.js';
23
- import { getLogger } from '../util/logger.js';
24
- import { getSandboxWorkingDir } from '../util/platform.js';
25
- import type { CuObservation, FileUploadSurfaceData, ServerMessage, SurfaceData, SurfaceType, UiSurfaceShow } from './ipc-protocol.js';
26
- import { INTERACTIVE_SURFACE_TYPES } from './ipc-protocol.js';
27
- import { projectSkillTools, resetSkillToolProjection, type SkillProjectionCache } from './session-skill-tools.js';
28
-
29
- const log = getLogger('computer-use-session');
9
+ import { v4 as uuid } from "uuid";
10
+
11
+ import { AgentLoop } from "../agent/loop.js";
12
+ import { buildComputerUseSystemPrompt } from "../config/computer-use-prompt.js";
13
+ import { getConfig } from "../config/loader.js";
14
+ import { PermissionPrompter } from "../permissions/prompter.js";
15
+ import { SecretPrompter } from "../permissions/secret-prompter.js";
16
+ import type { UserDecision } from "../permissions/types.js";
17
+ import type {
18
+ ContentBlock,
19
+ Message,
20
+ Provider,
21
+ ToolDefinition,
22
+ } from "../providers/types.js";
23
+ import { allComputerUseTools } from "../tools/computer-use/definitions.js";
24
+ import { ToolExecutor } from "../tools/executor.js";
25
+ import { registerSkillTools } from "../tools/registry.js";
26
+ import type { Tool, ToolExecutionResult } from "../tools/types.js";
27
+ import { allUiSurfaceTools } from "../tools/ui-surface/definitions.js";
28
+ import { getLogger } from "../util/logger.js";
29
+ import { getSandboxWorkingDir } from "../util/platform.js";
30
+ import type {
31
+ CuObservation,
32
+ FileUploadSurfaceData,
33
+ ServerMessage,
34
+ SurfaceData,
35
+ SurfaceType,
36
+ UiSurfaceShow,
37
+ } from "./ipc-protocol.js";
38
+ import { INTERACTIVE_SURFACE_TYPES } from "./ipc-protocol.js";
39
+ import {
40
+ projectSkillTools,
41
+ resetSkillToolProjection,
42
+ type SkillProjectionCache,
43
+ } from "./session-skill-tools.js";
44
+
45
+ const log = getLogger("computer-use-session");
30
46
 
31
47
  const MAX_STEPS = 50;
32
48
  const SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
@@ -39,9 +55,14 @@ const MAX_AX_TREES_IN_HISTORY = 2;
39
55
 
40
56
  /** Regex that matches the `<ax-tree>…</ax-tree>` markers injected by buildObservationResultContent. */
41
57
  const AX_TREE_PATTERN = /<ax-tree>[\s\S]*?<\/ax-tree>/g;
42
- const AX_TREE_PLACEHOLDER = '<ax_tree_omitted />';
58
+ const AX_TREE_PLACEHOLDER = "<ax_tree_omitted />";
43
59
 
44
- type SessionState = 'idle' | 'awaiting_observation' | 'inferring' | 'complete' | 'error';
60
+ type SessionState =
61
+ | "idle"
62
+ | "awaiting_observation"
63
+ | "inferring"
64
+ | "complete"
65
+ | "error";
45
66
 
46
67
  interface ActionRecord {
47
68
  step: number;
@@ -58,13 +79,13 @@ export class ComputerUseSession {
58
79
  private readonly screenHeight: number;
59
80
  private readonly provider: Provider;
60
81
  private sendToClient: (msg: ServerMessage) => void;
61
- private readonly interactionType: 'computer_use' | 'text_qa';
82
+ private readonly interactionType: "computer_use" | "text_qa";
62
83
  private readonly onTerminal?: (sessionId: string) => void;
63
84
  private readonly preactivatedSkillIds: string[];
64
85
  private readonly skillProjectionState = new Map<string, string>();
65
86
  private readonly skillProjectionCache: SkillProjectionCache = {};
66
87
 
67
- private state: SessionState = 'idle';
88
+ private state: SessionState = "idle";
68
89
  private stepCount = 0;
69
90
  private actionHistory: ActionRecord[] = [];
70
91
  private previousAXTree: string | undefined;
@@ -76,10 +97,16 @@ export class ComputerUseSession {
76
97
  resolve: (result: ToolExecutionResult) => void;
77
98
  } | null = null;
78
99
 
79
- private pendingSurfaceActions = new Map<string, {
80
- resolve: (result: ToolExecutionResult) => void;
81
- }>();
82
- private surfaceState = new Map<string, { surfaceType: SurfaceType; data: SurfaceData; title?: string }>();
100
+ private pendingSurfaceActions = new Map<
101
+ string,
102
+ {
103
+ resolve: (result: ToolExecutionResult) => void;
104
+ }
105
+ >();
106
+ private surfaceState = new Map<
107
+ string,
108
+ { surfaceType: SurfaceType; data: SurfaceData; title?: string }
109
+ >();
83
110
  private terminalNotified = false;
84
111
  private prompter: PermissionPrompter | null = null;
85
112
 
@@ -93,7 +120,7 @@ export class ComputerUseSession {
93
120
  screenHeight: number,
94
121
  provider: Provider,
95
122
  sendToClient: (msg: ServerMessage) => void,
96
- interactionType?: 'computer_use' | 'text_qa',
123
+ interactionType?: "computer_use" | "text_qa",
97
124
  onTerminal?: (sessionId: string) => void,
98
125
  preactivatedSkillIds?: string[],
99
126
  ) {
@@ -103,9 +130,9 @@ export class ComputerUseSession {
103
130
  this.screenHeight = screenHeight;
104
131
  this.provider = provider;
105
132
  this.sendToClient = sendToClient;
106
- this.interactionType = interactionType ?? 'computer_use';
133
+ this.interactionType = interactionType ?? "computer_use";
107
134
  this.onTerminal = onTerminal;
108
- this.preactivatedSkillIds = preactivatedSkillIds ?? ['computer-use'];
135
+ this.preactivatedSkillIds = preactivatedSkillIds ?? ["computer-use"];
109
136
  }
110
137
 
111
138
  // ---------------------------------------------------------------------------
@@ -113,8 +140,11 @@ export class ComputerUseSession {
113
140
  // ---------------------------------------------------------------------------
114
141
 
115
142
  async handleObservation(obs: CuObservation): Promise<void> {
116
- if (this.state === 'complete' || this.state === 'error') {
117
- log.warn({ sessionId: this.sessionId, state: this.state }, 'Observation received after session ended');
143
+ if (this.state === "complete" || this.state === "error") {
144
+ log.warn(
145
+ { sessionId: this.sessionId, state: this.state },
146
+ "Observation received after session ended",
147
+ );
118
148
  return;
119
149
  }
120
150
 
@@ -133,13 +163,19 @@ export class ComputerUseSession {
133
163
  this.previousAXTree = obs.axTree;
134
164
  }
135
165
 
136
- if (this.state === 'awaiting_observation' && this.pendingObservation) {
166
+ if (this.state === "awaiting_observation" && this.pendingObservation) {
137
167
  // Resolve the pending proxy tool result with updated screen context
138
- const content = this.buildObservationResultContent(obs, hadPreviousAXTree);
168
+ const content = this.buildObservationResultContent(
169
+ obs,
170
+ hadPreviousAXTree,
171
+ );
139
172
  const result: ToolExecutionResult = obs.executionError
140
- ? { content: `Action failed: ${obs.executionError}\n\n${content}`, isError: true }
173
+ ? {
174
+ content: `Action failed: ${obs.executionError}\n\n${content}`,
175
+ isError: true,
176
+ }
141
177
  : { content, isError: false };
142
- this.state = 'inferring';
178
+ this.state = "inferring";
143
179
  this.pendingObservation.resolve(result);
144
180
  this.pendingObservation = null;
145
181
  // The agent loop continues automatically after resolution
@@ -147,12 +183,15 @@ export class ComputerUseSession {
147
183
  }
148
184
 
149
185
  // First observation — start the agent loop
150
- this.state = 'inferring';
186
+ this.state = "inferring";
151
187
  this.abortController = new AbortController();
152
188
 
153
189
  // Safety net: abort the session if it runs longer than SESSION_TIMEOUT_MS
154
190
  this.sessionTimer = setTimeout(() => {
155
- log.warn({ sessionId: this.sessionId, timeoutMs: SESSION_TIMEOUT_MS }, 'Session timeout reached, aborting');
191
+ log.warn(
192
+ { sessionId: this.sessionId, timeoutMs: SESSION_TIMEOUT_MS },
193
+ "Session timeout reached, aborting",
194
+ );
156
195
  this.abort();
157
196
  }, SESSION_TIMEOUT_MS);
158
197
 
@@ -161,15 +200,18 @@ export class ComputerUseSession {
161
200
  // Catches errors from setup code (e.g. skill projection failures) that
162
201
  // occur before runAgentLoop's internal try-catch takes over.
163
202
  const message = err instanceof Error ? err.message : String(err);
164
- log.error({ err, sessionId: this.sessionId }, 'Agent loop startup failed');
203
+ log.error(
204
+ { err, sessionId: this.sessionId },
205
+ "Agent loop startup failed",
206
+ );
165
207
  if (this.sessionTimer) {
166
208
  clearTimeout(this.sessionTimer);
167
209
  this.sessionTimer = null;
168
210
  }
169
- if (this.state !== 'complete' && this.state !== 'error') {
170
- this.state = 'error';
211
+ if (this.state !== "complete" && this.state !== "error") {
212
+ this.state = "error";
171
213
  this.sendToClient({
172
- type: 'cu_error',
214
+ type: "cu_error",
173
215
  sessionId: this.sessionId,
174
216
  message,
175
217
  });
@@ -181,9 +223,9 @@ export class ComputerUseSession {
181
223
  }
182
224
 
183
225
  abort(): void {
184
- if (this.state === 'complete' || this.state === 'error') return;
226
+ if (this.state === "complete" || this.state === "error") return;
185
227
 
186
- log.info({ sessionId: this.sessionId }, 'Aborting computer-use session');
228
+ log.info({ sessionId: this.sessionId }, "Aborting computer-use session");
187
229
  if (this.sessionTimer) {
188
230
  clearTimeout(this.sessionTimer);
189
231
  this.sessionTimer = null;
@@ -192,7 +234,10 @@ export class ComputerUseSession {
192
234
 
193
235
  // If waiting for an observation, resolve it as cancelled
194
236
  if (this.pendingObservation) {
195
- this.pendingObservation.resolve({ content: 'Session aborted', isError: true });
237
+ this.pendingObservation.resolve({
238
+ content: "Session aborted",
239
+ isError: true,
240
+ });
196
241
  this.pendingObservation = null;
197
242
  }
198
243
 
@@ -201,22 +246,22 @@ export class ComputerUseSession {
201
246
 
202
247
  // Resolve any pending surface actions
203
248
  for (const [, pending] of this.pendingSurfaceActions) {
204
- pending.resolve({ content: 'Session aborted', isError: true });
249
+ pending.resolve({ content: "Session aborted", isError: true });
205
250
  }
206
251
  this.pendingSurfaceActions.clear();
207
252
  this.surfaceState.clear();
208
253
 
209
- this.state = 'error';
254
+ this.state = "error";
210
255
  this.sendToClient({
211
- type: 'cu_error',
256
+ type: "cu_error",
212
257
  sessionId: this.sessionId,
213
- message: 'Session aborted by user',
258
+ message: "Session aborted by user",
214
259
  });
215
260
  this.notifyTerminal();
216
261
  }
217
262
 
218
263
  isComplete(): boolean {
219
- return this.state === 'complete';
264
+ return this.state === "complete";
220
265
  }
221
266
 
222
267
  getState(): string {
@@ -230,7 +275,9 @@ export class ComputerUseSession {
230
275
  */
231
276
  private getProjectedCuToolDefinitions(): ToolDefinition[] | null {
232
277
  if (this.preactivatedSkillIds.length === 0) {
233
- log.warn('No preactivatedSkillIds configured, falling back to legacy CU tools');
278
+ log.warn(
279
+ "No preactivatedSkillIds configured, falling back to legacy CU tools",
280
+ );
234
281
  return null;
235
282
  }
236
283
 
@@ -244,27 +291,34 @@ export class ComputerUseSession {
244
291
  if (projection.toolDefinitions.length === 0) {
245
292
  log.warn(
246
293
  { preactivatedSkillIds: this.preactivatedSkillIds },
247
- 'Skill projection produced no tool definitions, falling back to legacy CU tools',
294
+ "Skill projection produced no tool definitions, falling back to legacy CU tools",
248
295
  );
249
296
  return null;
250
297
  }
251
298
 
252
299
  return projection.toolDefinitions;
253
300
  } catch (err) {
254
- log.warn({ err }, 'Skill projection failed, falling back to legacy CU tools');
301
+ log.warn(
302
+ { err },
303
+ "Skill projection failed, falling back to legacy CU tools",
304
+ );
255
305
  return null;
256
306
  }
257
307
  }
258
308
 
259
- handleSurfaceAction(surfaceId: string, actionId: string, data?: Record<string, unknown>): void {
309
+ handleSurfaceAction(
310
+ surfaceId: string,
311
+ actionId: string,
312
+ data?: Record<string, unknown>,
313
+ ): void {
260
314
  const pending = this.pendingSurfaceActions.get(surfaceId);
261
315
  if (!pending) {
262
- log.warn({ surfaceId, actionId }, 'No pending surface action found');
316
+ log.warn({ surfaceId, actionId }, "No pending surface action found");
263
317
  return;
264
318
  }
265
319
  // selection_changed is a non-terminal state update — don't consume the
266
320
  // pending entry. The selection state will be in the action button payload.
267
- if (actionId === 'selection_changed') {
321
+ if (actionId === "selection_changed") {
268
322
  return;
269
323
  }
270
324
  this.pendingSurfaceActions.delete(surfaceId);
@@ -279,7 +333,10 @@ export class ComputerUseSession {
279
333
  // ---------------------------------------------------------------------------
280
334
 
281
335
  private async runAgentLoop(messages: Message[]): Promise<void> {
282
- const systemPrompt = buildComputerUseSystemPrompt(this.screenWidth, this.screenHeight);
336
+ const systemPrompt = buildComputerUseSystemPrompt(
337
+ this.screenWidth,
338
+ this.screenHeight,
339
+ );
283
340
 
284
341
  let cuToolDefs = this.getProjectedCuToolDefinitions();
285
342
  if (!cuToolDefs) {
@@ -288,23 +345,23 @@ export class ComputerUseSession {
288
345
  // ownerSkillId as the bundled computer-use skill. This avoids
289
346
  // core-vs-skill collisions that would permanently block skill
290
347
  // projection recovery on subsequent sessions.
291
- const fallbackSkillId = this.preactivatedSkillIds[0] ?? 'computer-use';
348
+ const fallbackSkillId = this.preactivatedSkillIds[0] ?? "computer-use";
292
349
  const fallbackTools: Tool[] = allComputerUseTools.map((t) => ({
293
350
  ...t,
294
- origin: 'skill' as const,
351
+ origin: "skill" as const,
295
352
  ownerSkillId: fallbackSkillId,
296
353
  ownerSkillBundled: true,
297
354
  }));
298
355
  registerSkillTools(fallbackTools);
299
356
  // Track in the session map so resetSkillToolProjection cleans up
300
- this.skillProjectionState.set(fallbackSkillId, 'fallback');
357
+ this.skillProjectionState.set(fallbackSkillId, "fallback");
301
358
  cuToolDefs = allComputerUseTools.map((t) => t.getDefinition());
302
359
  }
303
360
 
304
361
  const toolDefs: ToolDefinition[] = [
305
362
  ...cuToolDefs,
306
363
  ...allUiSurfaceTools
307
- .filter((t) => t.name !== 'request_file')
364
+ .filter((t) => t.name !== "request_file")
308
365
  .map((t) => t.getDefinition()),
309
366
  ];
310
367
 
@@ -318,37 +375,47 @@ export class ComputerUseSession {
318
375
  input: Record<string, unknown>,
319
376
  ): Promise<ToolExecutionResult> => {
320
377
  // ── Surface tool proxying ──────────────────────────────────────
321
- if (toolName === 'ui_show') {
378
+ if (toolName === "ui_show") {
322
379
  const surfaceId = uuid();
323
380
  const surfaceType = input.surface_type as SurfaceType;
324
- const title = typeof input.title === 'string' ? input.title : undefined;
381
+ const title = typeof input.title === "string" ? input.title : undefined;
325
382
  const data = input.data as SurfaceData;
326
- const actions = input.actions as Array<{ id: string; label: string; style?: string }> | undefined;
383
+ const actions = input.actions as
384
+ | Array<{ id: string; label: string; style?: string }>
385
+ | undefined;
327
386
  // Interactive surfaces default to awaiting user action.
328
387
  // Tables and lists only block when explicit action buttons are provided;
329
388
  // selectionMode alone should not gate blocking because selection_changed
330
389
  // fires on every click and would immediately resolve multi-select surfaces.
331
390
  const hasActions = Array.isArray(actions) && actions.length > 0;
332
- const isInteractive = surfaceType === 'card'
333
- ? hasActions
334
- : surfaceType === 'list'
391
+ const isInteractive =
392
+ surfaceType === "card"
335
393
  ? hasActions
336
- : surfaceType === 'table'
394
+ : surfaceType === "list"
337
395
  ? hasActions
338
- : INTERACTIVE_SURFACE_TYPES.includes(surfaceType);
396
+ : surfaceType === "table"
397
+ ? hasActions
398
+ : INTERACTIVE_SURFACE_TYPES.includes(surfaceType);
339
399
  const awaitAction = (input.await_action as boolean) ?? isInteractive;
340
400
 
341
401
  // Track surface state for ui_update merging
342
402
  this.surfaceState.set(surfaceId, { surfaceType, data, title });
343
403
 
344
404
  this.sendToClient({
345
- type: 'ui_surface_show',
405
+ type: "ui_surface_show",
346
406
  sessionId: this.sessionId,
347
407
  surfaceId,
348
408
  surfaceType,
349
409
  title,
350
410
  data,
351
- actions: actions?.map(a => ({ id: a.id, label: a.label, style: (a.style ?? 'secondary') as 'primary' | 'secondary' | 'destructive' })),
411
+ actions: actions?.map((a) => ({
412
+ id: a.id,
413
+ label: a.label,
414
+ style: (a.style ?? "secondary") as
415
+ | "primary"
416
+ | "secondary"
417
+ | "destructive",
418
+ })),
352
419
  } as unknown as UiSurfaceShow);
353
420
 
354
421
  if (awaitAction) {
@@ -359,7 +426,7 @@ export class ComputerUseSession {
359
426
  return { content: JSON.stringify({ surfaceId }), isError: false };
360
427
  }
361
428
 
362
- if (toolName === 'ui_update') {
429
+ if (toolName === "ui_update") {
363
430
  const surfaceId = input.surface_id as string;
364
431
  const patch = input.data as Record<string, unknown>;
365
432
 
@@ -374,32 +441,38 @@ export class ComputerUseSession {
374
441
  }
375
442
 
376
443
  this.sendToClient({
377
- type: 'ui_surface_update',
444
+ type: "ui_surface_update",
378
445
  sessionId: this.sessionId,
379
446
  surfaceId,
380
447
  data: mergedData,
381
448
  });
382
- return { content: 'Surface updated', isError: false };
449
+ return { content: "Surface updated", isError: false };
383
450
  }
384
451
 
385
- if (toolName === 'ui_dismiss') {
452
+ if (toolName === "ui_dismiss") {
386
453
  const surfaceId = input.surface_id as string;
387
454
  this.sendToClient({
388
- type: 'ui_surface_dismiss',
455
+ type: "ui_surface_dismiss",
389
456
  sessionId: this.sessionId,
390
457
  surfaceId,
391
458
  });
392
459
  this.pendingSurfaceActions.delete(surfaceId);
393
460
  this.surfaceState.delete(surfaceId);
394
- return { content: 'Surface dismissed', isError: false };
461
+ return { content: "Surface dismissed", isError: false };
395
462
  }
396
463
 
397
464
  // ── File request proxying ──────────────────────────────────────
398
- if (toolName === 'request_file') {
465
+ if (toolName === "request_file") {
399
466
  const surfaceId = uuid();
400
- const prompt = typeof input.prompt === 'string' ? input.prompt : 'Please share a file';
401
- const acceptedTypes = Array.isArray(input.accepted_types) ? input.accepted_types as string[] : undefined;
402
- const maxFiles = typeof input.max_files === 'number' ? input.max_files : 1;
467
+ const prompt =
468
+ typeof input.prompt === "string"
469
+ ? input.prompt
470
+ : "Please share a file";
471
+ const acceptedTypes = Array.isArray(input.accepted_types)
472
+ ? (input.accepted_types as string[])
473
+ : undefined;
474
+ const maxFiles =
475
+ typeof input.max_files === "number" ? input.max_files : 1;
403
476
 
404
477
  const data: FileUploadSurfaceData = {
405
478
  prompt,
@@ -407,14 +480,14 @@ export class ComputerUseSession {
407
480
  maxFiles,
408
481
  };
409
482
 
410
- this.surfaceState.set(surfaceId, { surfaceType: 'file_upload', data });
483
+ this.surfaceState.set(surfaceId, { surfaceType: "file_upload", data });
411
484
 
412
485
  this.sendToClient({
413
- type: 'ui_surface_show',
486
+ type: "ui_surface_show",
414
487
  sessionId: this.sessionId,
415
488
  surfaceId,
416
- surfaceType: 'file_upload',
417
- title: 'File Request',
489
+ surfaceType: "file_upload",
490
+ title: "File Request",
418
491
  data,
419
492
  } as UiSurfaceShow);
420
493
 
@@ -425,7 +498,8 @@ export class ComputerUseSession {
425
498
  }
426
499
 
427
500
  // ── Computer-use tool proxying ─────────────────────────────────
428
- const reasoning = typeof input.reasoning === 'string' ? input.reasoning : undefined;
501
+ const reasoning =
502
+ typeof input.reasoning === "string" ? input.reasoning : undefined;
429
503
 
430
504
  // Record action in history
431
505
  this.actionHistory.push({
@@ -436,33 +510,40 @@ export class ComputerUseSession {
436
510
  });
437
511
 
438
512
  // Check for terminal tools
439
- if (toolName === 'computer_use_done' || toolName === 'computer_use_respond') {
513
+ if (
514
+ toolName === "computer_use_done" ||
515
+ toolName === "computer_use_respond"
516
+ ) {
440
517
  const summary =
441
- toolName === 'computer_use_done'
442
- ? (typeof input.summary === 'string' ? input.summary : 'Task completed')
443
- : (typeof input.answer === 'string' ? input.answer : 'No answer provided');
518
+ toolName === "computer_use_done"
519
+ ? typeof input.summary === "string"
520
+ ? input.summary
521
+ : "Task completed"
522
+ : typeof input.answer === "string"
523
+ ? input.answer
524
+ : "No answer provided";
444
525
 
445
526
  this.sendToClient({
446
- type: 'cu_complete',
527
+ type: "cu_complete",
447
528
  sessionId: this.sessionId,
448
529
  summary,
449
530
  stepCount: this.stepCount,
450
- isResponse: toolName === 'computer_use_respond' ? true : undefined,
531
+ isResponse: toolName === "computer_use_respond" ? true : undefined,
451
532
  });
452
- this.state = 'complete';
533
+ this.state = "complete";
453
534
  // Stop AgentLoop immediately so terminal tools cannot trigger extra provider calls.
454
535
  this.abortController?.abort();
455
536
  this.notifyTerminal();
456
- return { content: 'Session complete', isError: false };
537
+ return { content: "Session complete", isError: false };
457
538
  }
458
539
 
459
540
  this.stepCount++;
460
541
 
461
542
  // Enforce step limit — abort the loop so toolChoice:'any' can't force another turn
462
543
  if (this.stepCount > MAX_STEPS) {
463
- this.state = 'error';
544
+ this.state = "error";
464
545
  this.sendToClient({
465
- type: 'cu_error',
546
+ type: "cu_error",
466
547
  sessionId: this.sessionId,
467
548
  message: `Step limit (${MAX_STEPS}) exceeded`,
468
549
  });
@@ -473,7 +554,7 @@ export class ComputerUseSession {
473
554
 
474
555
  // Send action to client for execution
475
556
  this.sendToClient({
476
- type: 'cu_action',
557
+ type: "cu_action",
477
558
  sessionId: this.sessionId,
478
559
  toolName,
479
560
  input,
@@ -482,7 +563,7 @@ export class ComputerUseSession {
482
563
  });
483
564
 
484
565
  // Wait for next observation from client
485
- this.state = 'awaiting_observation';
566
+ this.state = "awaiting_observation";
486
567
  return new Promise<ToolExecutionResult>((resolve) => {
487
568
  this.pendingObservation = { resolve };
488
569
  });
@@ -501,15 +582,20 @@ export class ComputerUseSession {
501
582
  workingDir: getSandboxWorkingDir(),
502
583
  sessionId: this.sessionId,
503
584
  conversationId: this.sessionId,
504
- guardianTrustClass: 'guardian',
585
+ trustClass: "guardian",
505
586
  proxyToolResolver: proxyResolver,
506
587
  allowedToolNames,
507
588
  requestSecret: async (params) => {
508
589
  return secretPrompter.prompt(
509
- params.service, params.field, params.label,
510
- params.description, params.placeholder,
590
+ params.service,
591
+ params.field,
592
+ params.label,
593
+ params.description,
594
+ params.placeholder,
511
595
  this.sessionId,
512
- params.purpose, params.allowedTools, params.allowedDomains,
596
+ params.purpose,
597
+ params.allowedTools,
598
+ params.allowedDomains,
513
599
  );
514
600
  },
515
601
  });
@@ -534,7 +620,7 @@ export class ComputerUseSession {
534
620
  {
535
621
  maxTokens: 4096,
536
622
  maxInputTokens: cuConfig.contextWindow.maxInputTokens,
537
- toolChoice: { type: 'any' },
623
+ toolChoice: { type: "any" },
538
624
  },
539
625
  toolDefs,
540
626
  toolExecutor,
@@ -545,25 +631,31 @@ export class ComputerUseSession {
545
631
  messages,
546
632
  (event) => {
547
633
  switch (event.type) {
548
- case 'error':
549
- log.error({ err: event.error, sessionId: this.sessionId }, 'Agent loop error');
550
- if (this.state !== 'complete') {
551
- this.state = 'error';
634
+ case "error":
635
+ log.error(
636
+ { err: event.error, sessionId: this.sessionId },
637
+ "Agent loop error",
638
+ );
639
+ if (this.state !== "complete") {
640
+ this.state = "error";
552
641
  this.sendToClient({
553
- type: 'cu_error',
642
+ type: "cu_error",
554
643
  sessionId: this.sessionId,
555
644
  message: event.error.message,
556
645
  });
557
646
  this.notifyTerminal();
558
647
  }
559
648
  break;
560
- case 'usage':
561
- log.info({
562
- sessionId: this.sessionId,
563
- inputTokens: event.inputTokens,
564
- outputTokens: event.outputTokens,
565
- model: event.model,
566
- }, 'Usage');
649
+ case "usage":
650
+ log.info(
651
+ {
652
+ sessionId: this.sessionId,
653
+ inputTokens: event.inputTokens,
654
+ outputTokens: event.outputTokens,
655
+ model: event.model,
656
+ },
657
+ "Usage",
658
+ );
567
659
  break;
568
660
  // Other events (text_delta, thinking_delta, etc.) are not surfaced to the CU client
569
661
  }
@@ -572,26 +664,26 @@ export class ComputerUseSession {
572
664
  );
573
665
 
574
666
  // If the loop exits without completing, treat as error
575
- if (this.state !== 'complete' && this.state !== 'error') {
576
- this.state = 'error';
667
+ if (this.state !== "complete" && this.state !== "error") {
668
+ this.state = "error";
577
669
  this.sendToClient({
578
- type: 'cu_error',
670
+ type: "cu_error",
579
671
  sessionId: this.sessionId,
580
- message: 'Agent loop ended unexpectedly',
672
+ message: "Agent loop ended unexpectedly",
581
673
  });
582
674
  this.notifyTerminal();
583
675
  }
584
676
  } catch (err) {
585
677
  if (this.abortController?.signal.aborted) {
586
- log.info({ sessionId: this.sessionId }, 'Agent loop aborted');
678
+ log.info({ sessionId: this.sessionId }, "Agent loop aborted");
587
679
  return;
588
680
  }
589
681
  const message = err instanceof Error ? err.message : String(err);
590
- log.error({ err, sessionId: this.sessionId }, 'Agent loop failed');
591
- if (this.state !== 'complete') {
592
- this.state = 'error';
682
+ log.error({ err, sessionId: this.sessionId }, "Agent loop failed");
683
+ if (this.state !== "complete") {
684
+ this.state = "error";
593
685
  this.sendToClient({
594
- type: 'cu_error',
686
+ type: "cu_error",
595
687
  sessionId: this.sessionId,
596
688
  message,
597
689
  });
@@ -629,12 +721,12 @@ export class ComputerUseSession {
629
721
  const indicesWithAxTree: number[] = [];
630
722
  for (let i = 0; i < messages.length; i++) {
631
723
  const msg = messages[i];
632
- if (msg.role !== 'user') continue;
724
+ if (msg.role !== "user") continue;
633
725
  for (const block of msg.content) {
634
726
  if (
635
- block.type === 'tool_result' &&
636
- typeof block.content === 'string' &&
637
- block.content.includes('<ax-tree>')
727
+ block.type === "tool_result" &&
728
+ typeof block.content === "string" &&
729
+ block.content.includes("<ax-tree>")
638
730
  ) {
639
731
  indicesWithAxTree.push(i);
640
732
  break;
@@ -646,7 +738,9 @@ export class ComputerUseSession {
646
738
  return messages;
647
739
  }
648
740
 
649
- const toStrip = new Set(indicesWithAxTree.slice(0, -MAX_AX_TREES_IN_HISTORY));
741
+ const toStrip = new Set(
742
+ indicesWithAxTree.slice(0, -MAX_AX_TREES_IN_HISTORY),
743
+ );
650
744
 
651
745
  return messages.map((msg, idx) => {
652
746
  if (!toStrip.has(idx)) return msg;
@@ -654,13 +748,16 @@ export class ComputerUseSession {
654
748
  ...msg,
655
749
  content: msg.content.map((block) => {
656
750
  if (
657
- block.type === 'tool_result' &&
658
- typeof block.content === 'string' &&
659
- block.content.includes('<ax-tree>')
751
+ block.type === "tool_result" &&
752
+ typeof block.content === "string" &&
753
+ block.content.includes("<ax-tree>")
660
754
  ) {
661
755
  return {
662
756
  ...block,
663
- content: block.content.replace(AX_TREE_PATTERN, AX_TREE_PLACEHOLDER),
757
+ content: block.content.replace(
758
+ AX_TREE_PATTERN,
759
+ AX_TREE_PLACEHOLDER,
760
+ ),
664
761
  };
665
762
  }
666
763
  return block;
@@ -677,7 +774,7 @@ export class ComputerUseSession {
677
774
  * unescaped because compaction replaces the entire block with a placeholder.
678
775
  */
679
776
  static escapeAxTreeContent(content: string): string {
680
- return content.replace(/<\/ax-tree>/gi, '&lt;/ax-tree&gt;');
777
+ return content.replace(/<\/ax-tree>/gi, "&lt;/ax-tree&gt;");
681
778
  }
682
779
 
683
780
  // ---------------------------------------------------------------------------
@@ -685,68 +782,79 @@ export class ComputerUseSession {
685
782
  // updated screen state on each turn (not just "Action executed").
686
783
  // ---------------------------------------------------------------------------
687
784
 
688
- private buildObservationResultContent(obs: CuObservation, hadPreviousAXTree: boolean): string {
785
+ private buildObservationResultContent(
786
+ obs: CuObservation,
787
+ hadPreviousAXTree: boolean,
788
+ ): string {
689
789
  const parts: string[] = [];
690
790
 
691
791
  // Surface user guidance prominently so the model sees it first
692
792
  if (obs.userGuidance) {
693
793
  parts.push(`USER GUIDANCE: ${obs.userGuidance}`);
694
- parts.push('');
794
+ parts.push("");
695
795
  }
696
796
 
697
797
  if (obs.executionResult) {
698
798
  parts.push(obs.executionResult);
699
- parts.push('');
799
+ parts.push("");
700
800
  }
701
801
 
702
802
  // AX tree diff
703
803
  if (obs.axDiff) {
704
804
  parts.push(obs.axDiff);
705
- parts.push('');
805
+ parts.push("");
706
806
  } else if (hadPreviousAXTree && obs.axTree != null) {
707
807
  const lastAction = this.actionHistory[this.actionHistory.length - 1];
708
- const wasWait = lastAction?.toolName === 'computer_use_wait';
709
- if (this.consecutiveUnchangedSteps >= CONSECUTIVE_UNCHANGED_WARNING_THRESHOLD) {
808
+ const wasWait = lastAction?.toolName === "computer_use_wait";
809
+ if (
810
+ this.consecutiveUnchangedSteps >=
811
+ CONSECUTIVE_UNCHANGED_WARNING_THRESHOLD
812
+ ) {
710
813
  parts.push(
711
814
  `WARNING: ${this.consecutiveUnchangedSteps} consecutive actions had NO VISIBLE EFFECT on the UI. You MUST try a completely different approach.`,
712
815
  );
713
816
  } else if (!wasWait) {
714
- parts.push('Your last action had NO VISIBLE EFFECT on the UI. Try something different.');
817
+ parts.push(
818
+ "Your last action had NO VISIBLE EFFECT on the UI. Try something different.",
819
+ );
715
820
  }
716
- parts.push('');
821
+ parts.push("");
717
822
  }
718
823
 
719
824
  // Current screen state — wrapped in markers so compactHistory can strip old snapshots
720
825
  if (obs.axTree) {
721
- parts.push('<ax-tree>');
722
- parts.push('CURRENT SCREEN STATE:');
826
+ parts.push("<ax-tree>");
827
+ parts.push("CURRENT SCREEN STATE:");
723
828
  parts.push(ComputerUseSession.escapeAxTreeContent(obs.axTree));
724
- parts.push('</ax-tree>');
829
+ parts.push("</ax-tree>");
725
830
  }
726
831
 
727
832
  const screenshotMetadata = this.formatScreenshotMetadata(obs);
728
833
  if (screenshotMetadata.length > 0) {
729
- parts.push('');
834
+ parts.push("");
730
835
  parts.push(...screenshotMetadata);
731
836
  }
732
837
 
733
- return parts.join('\n').trim() || 'Action executed';
838
+ return parts.join("\n").trim() || "Action executed";
734
839
  }
735
840
 
736
841
  // ---------------------------------------------------------------------------
737
842
  // Message building (replicates AnthropicProvider.buildMessages from Swift)
738
843
  // ---------------------------------------------------------------------------
739
844
 
740
- private buildMessages(obs: CuObservation, hadPreviousAXTree: boolean): Message[] {
845
+ private buildMessages(
846
+ obs: CuObservation,
847
+ hadPreviousAXTree: boolean,
848
+ ): Message[] {
741
849
  const contentBlocks: ContentBlock[] = [];
742
850
 
743
851
  // Screenshot image block
744
852
  if (obs.screenshot) {
745
853
  contentBlocks.push({
746
- type: 'image',
854
+ type: "image",
747
855
  source: {
748
- type: 'base64',
749
- media_type: 'image/jpeg',
856
+ type: "base64",
857
+ media_type: "image/jpeg",
750
858
  data: obs.screenshot,
751
859
  },
752
860
  });
@@ -758,55 +866,68 @@ export class ComputerUseSession {
758
866
  if (trimmedTask) {
759
867
  textParts.push(`TASK: ${trimmedTask}`);
760
868
  } else {
761
- textParts.push('TASK: No explicit task provided.');
869
+ textParts.push("TASK: No explicit task provided.");
762
870
  }
763
- textParts.push('');
871
+ textParts.push("");
764
872
 
765
873
  // AX tree diff (compact summary of what changed)
766
874
  if (obs.axDiff && this.actionHistory.length > 0) {
767
875
  textParts.push(obs.axDiff);
768
- textParts.push('');
769
- } else if (hadPreviousAXTree && obs.axTree != null && this.actionHistory.length > 0) {
876
+ textParts.push("");
877
+ } else if (
878
+ hadPreviousAXTree &&
879
+ obs.axTree != null &&
880
+ this.actionHistory.length > 0
881
+ ) {
770
882
  // AX tree unchanged — tell the model its action had no effect
771
883
  const lastAction = this.actionHistory[this.actionHistory.length - 1];
772
- const wasWait = lastAction?.toolName === 'computer_use_wait';
773
- textParts.push('CHANGES SINCE LAST ACTION:');
774
- if (this.consecutiveUnchangedSteps >= CONSECUTIVE_UNCHANGED_WARNING_THRESHOLD) {
884
+ const wasWait = lastAction?.toolName === "computer_use_wait";
885
+ textParts.push("CHANGES SINCE LAST ACTION:");
886
+ if (
887
+ this.consecutiveUnchangedSteps >=
888
+ CONSECUTIVE_UNCHANGED_WARNING_THRESHOLD
889
+ ) {
775
890
  textParts.push(
776
891
  `WARNING: ${this.consecutiveUnchangedSteps} consecutive actions had NO VISIBLE EFFECT on the UI. You MUST try a completely different approach — do not repeat any of your recent actions.`,
777
892
  );
778
893
  } else if (!wasWait) {
779
- const actionDesc = `${lastAction?.toolName ?? 'unknown'}`;
894
+ const actionDesc = `${lastAction?.toolName ?? "unknown"}`;
780
895
  textParts.push(
781
896
  `Your last action (${actionDesc}) had NO VISIBLE EFFECT on the UI. The screen is identical to the previous step. Do NOT repeat the same action — try something different.`,
782
897
  );
783
898
  } else {
784
- textParts.push('No visible changes detected — the UI is identical to the previous step.');
899
+ textParts.push(
900
+ "No visible changes detected — the UI is identical to the previous step.",
901
+ );
785
902
  }
786
- textParts.push('');
903
+ textParts.push("");
787
904
  }
788
905
 
789
906
  // Current screen state
790
907
  if (obs.axTree) {
791
- textParts.push('CURRENT SCREEN STATE (accessibility tree of the focused window):');
908
+ textParts.push(
909
+ "CURRENT SCREEN STATE (accessibility tree of the focused window):",
910
+ );
792
911
  textParts.push(obs.axTree);
793
- textParts.push('');
794
- textParts.push('Use element_id with the [ID] numbers shown above to target elements.');
912
+ textParts.push("");
913
+ textParts.push(
914
+ "Use element_id with the [ID] numbers shown above to target elements.",
915
+ );
795
916
 
796
917
  // Secondary windows for cross-app awareness
797
918
  if (obs.secondaryWindows) {
798
- textParts.push('');
919
+ textParts.push("");
799
920
  textParts.push(obs.secondaryWindows);
800
- textParts.push('');
921
+ textParts.push("");
801
922
  textParts.push(
802
923
  "Note: The element [ID]s above are from other windows — you can reference them for context but can only interact with the focused window's elements.",
803
924
  );
804
925
  }
805
926
 
806
927
  if (obs.screenshot) {
807
- textParts.push('');
928
+ textParts.push("");
808
929
  textParts.push(
809
- 'A screenshot of the FULL SCREEN is also attached above. Use it to see content outside the focused window (e.g., reference documents, PDFs, other apps visible behind the current window).',
930
+ "A screenshot of the FULL SCREEN is also attached above. Use it to see content outside the focused window (e.g., reference documents, PDFs, other apps visible behind the current window).",
810
931
  );
811
932
  const screenshotMetadata = this.formatScreenshotMetadata(obs);
812
933
  if (screenshotMetadata.length > 0) {
@@ -814,21 +935,23 @@ export class ComputerUseSession {
814
935
  }
815
936
  }
816
937
  } else if (obs.screenshot) {
817
- textParts.push('CURRENT SCREEN STATE:');
818
- textParts.push('See the screenshot above. No accessibility tree available — estimate coordinates from the image.');
938
+ textParts.push("CURRENT SCREEN STATE:");
939
+ textParts.push(
940
+ "See the screenshot above. No accessibility tree available — estimate coordinates from the image.",
941
+ );
819
942
  const screenshotMetadata = this.formatScreenshotMetadata(obs);
820
943
  if (screenshotMetadata.length > 0) {
821
944
  textParts.push(...screenshotMetadata);
822
945
  }
823
946
  } else {
824
- textParts.push('CURRENT SCREEN STATE:');
825
- textParts.push('No screen data available.');
947
+ textParts.push("CURRENT SCREEN STATE:");
948
+ textParts.push("No screen data available.");
826
949
  }
827
950
 
828
951
  // Action history
829
952
  if (this.actionHistory.length > 0) {
830
- textParts.push('');
831
- textParts.push('ACTIONS TAKEN SO FAR:');
953
+ textParts.push("");
954
+ textParts.push("ACTIONS TAKEN SO FAR:");
832
955
  let windowedHistory: ActionRecord[];
833
956
  if (this.actionHistory.length > MAX_HISTORY_ENTRIES) {
834
957
  textParts.push(
@@ -839,7 +962,7 @@ export class ComputerUseSession {
839
962
  windowedHistory = this.actionHistory;
840
963
  }
841
964
  for (const record of windowedHistory) {
842
- const result = record.result ?? 'executed';
965
+ const result = record.result ?? "executed";
843
966
  textParts.push(` ${record.step}. ${record.toolName} → ${result}`);
844
967
  }
845
968
  }
@@ -853,7 +976,7 @@ export class ComputerUseSession {
853
976
  JSON.stringify(r.input) === JSON.stringify(recent[0].input),
854
977
  );
855
978
  if (allIdentical) {
856
- textParts.push('');
979
+ textParts.push("");
857
980
  textParts.push(
858
981
  `WARNING: You have repeated the exact same action (${recent[0].toolName}) ${LOOP_DETECTION_WINDOW} times in a row. You MUST try a completely different approach or call computer_use_done with an explanation of why you are stuck.`,
859
982
  );
@@ -862,24 +985,26 @@ export class ComputerUseSession {
862
985
 
863
986
  // Surface user guidance prominently
864
987
  if (obs.userGuidance) {
865
- textParts.push('');
988
+ textParts.push("");
866
989
  textParts.push(`USER GUIDANCE: ${obs.userGuidance}`);
867
990
  }
868
991
 
869
992
  // Prompt for next action
870
- textParts.push('');
993
+ textParts.push("");
871
994
  if (this.actionHistory.length === 0) {
872
- textParts.push('This is the first action. Examine the screen state and decide what to do first.');
995
+ textParts.push(
996
+ "This is the first action. Examine the screen state and decide what to do first.",
997
+ );
873
998
  } else {
874
- textParts.push('Decide the next action to take.');
999
+ textParts.push("Decide the next action to take.");
875
1000
  }
876
1001
 
877
1002
  contentBlocks.push({
878
- type: 'text',
879
- text: textParts.join('\n'),
1003
+ type: "text",
1004
+ text: textParts.join("\n"),
880
1005
  });
881
1006
 
882
- return [{ role: 'user', content: contentBlocks }];
1007
+ return [{ role: "user", content: contentBlocks }];
883
1008
  }
884
1009
 
885
1010
  private formatScreenshotMetadata(obs: CuObservation): string[] {
@@ -887,10 +1012,14 @@ export class ComputerUseSession {
887
1012
 
888
1013
  const lines: string[] = [];
889
1014
  if (obs.screenshotWidthPx != null && obs.screenshotHeightPx != null) {
890
- lines.push(`Screenshot metadata: ${obs.screenshotWidthPx}x${obs.screenshotHeightPx} px`);
1015
+ lines.push(
1016
+ `Screenshot metadata: ${obs.screenshotWidthPx}x${obs.screenshotHeightPx} px`,
1017
+ );
891
1018
  }
892
1019
  if (obs.screenWidthPt != null && obs.screenHeightPt != null) {
893
- lines.push(`Screen metadata: ${obs.screenWidthPt}x${obs.screenHeightPt} pt`);
1020
+ lines.push(
1021
+ `Screen metadata: ${obs.screenWidthPt}x${obs.screenHeightPt} pt`,
1022
+ );
894
1023
  }
895
1024
  if (obs.coordinateOrigin) {
896
1025
  lines.push(`Coordinate origin: ${obs.coordinateOrigin}`);