@vellumai/assistant 0.7.1 → 0.7.3

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 (739) hide show
  1. package/ARCHITECTURE.md +48 -50
  2. package/Dockerfile +1 -0
  3. package/README.md +1 -2
  4. package/__tests__/permissions/gateway-threshold-reader.test.ts +9 -3
  5. package/bun.lock +26 -26
  6. package/docs/architecture/memory.md +5 -2
  7. package/docs/architecture/security.md +20 -0
  8. package/docs/plugins.md +7 -9
  9. package/knip.json +1 -0
  10. package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
  11. package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +52 -5
  12. package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
  13. package/node_modules/@vellumai/service-contracts/package.json +2 -0
  14. package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
  15. package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
  16. package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
  17. package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
  18. package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -0
  19. package/node_modules/@vellumai/slack-text/src/index.test.ts +18 -35
  20. package/node_modules/@vellumai/slack-text/src/index.ts +2 -48
  21. package/node_modules/@vellumai/twilio-client/bun.lock +24 -0
  22. package/node_modules/@vellumai/twilio-client/package.json +18 -0
  23. package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
  24. package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
  25. package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
  26. package/openapi.yaml +1020 -40
  27. package/package.json +6 -3
  28. package/src/__tests__/app-builder-tool-scripts.test.ts +3 -3
  29. package/src/__tests__/app-bundler.test.ts +170 -1
  30. package/src/__tests__/app-control-flow.test.ts +384 -0
  31. package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
  32. package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
  33. package/src/__tests__/app-executors.test.ts +30 -43
  34. package/src/__tests__/approval-routes-http.test.ts +23 -6
  35. package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
  36. package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
  37. package/src/__tests__/assistant-event-hub.test.ts +157 -2
  38. package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -7
  39. package/src/__tests__/auto-analysis-end-to-end.test.ts +62 -1
  40. package/src/__tests__/background-shell-host-bash.test.ts +14 -15
  41. package/src/__tests__/background-workers-disk-pressure.test.ts +268 -0
  42. package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
  43. package/src/__tests__/btw-routes.test.ts +13 -4
  44. package/src/__tests__/call-controller.test.ts +49 -1
  45. package/src/__tests__/call-conversation-messages.test.ts +8 -2
  46. package/src/__tests__/call-domain.test.ts +0 -2
  47. package/src/__tests__/call-routes-http.test.ts +0 -2
  48. package/src/__tests__/channel-inbound-disk-pressure.test.ts +537 -0
  49. package/src/__tests__/channel-readiness-service.test.ts +62 -2
  50. package/src/__tests__/checker.test.ts +3 -4
  51. package/src/__tests__/config-loader-backfill.test.ts +461 -147
  52. package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
  53. package/src/__tests__/config-schema-cmd.test.ts +0 -1
  54. package/src/__tests__/config-schema.test.ts +1 -0
  55. package/src/__tests__/config-set-platform-guard.test.ts +48 -4
  56. package/src/__tests__/config-watcher-cleanup-throttle.test.ts +20 -11
  57. package/src/__tests__/config-watcher.test.ts +142 -71
  58. package/src/__tests__/context-search-agent-runner.test.ts +61 -3
  59. package/src/__tests__/context-search-conversations-source.test.ts +0 -24
  60. package/src/__tests__/context-search-fanout.test.ts +0 -1
  61. package/src/__tests__/context-search-memory-source.test.ts +3 -7
  62. package/src/__tests__/context-search-memory-v2-source.test.ts +0 -2
  63. package/src/__tests__/context-search-pkb-source.test.ts +0 -1
  64. package/src/__tests__/context-search-workspace-source.test.ts +0 -1
  65. package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
  66. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +223 -0
  67. package/src/__tests__/conversation-agent-loop.test.ts +454 -5
  68. package/src/__tests__/conversation-app-control-instantiation.test.ts +392 -0
  69. package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
  70. package/src/__tests__/conversation-error.test.ts +150 -3
  71. package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
  72. package/src/__tests__/conversation-lifecycle.test.ts +36 -0
  73. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
  74. package/src/__tests__/conversation-process-callsite.test.ts +43 -0
  75. package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
  76. package/src/__tests__/conversation-routes-disk-view.test.ts +6 -0
  77. package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -72
  78. package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
  79. package/src/__tests__/conversation-runtime-assembly.test.ts +65 -0
  80. package/src/__tests__/conversation-slash-commands.test.ts +0 -4
  81. package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
  82. package/src/__tests__/conversation-speed-override.test.ts +0 -3
  83. package/src/__tests__/conversation-store.test.ts +0 -18
  84. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
  85. package/src/__tests__/conversation-surfaces-app-control.test.ts +328 -0
  86. package/src/__tests__/conversation-surfaces-data-persist.test.ts +404 -0
  87. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +2 -5
  88. package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
  89. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
  90. package/src/__tests__/credential-execution-feature-gates.test.ts +5 -12
  91. package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
  92. package/src/__tests__/credentials-cli.test.ts +12 -12
  93. package/src/__tests__/cu-unified-flow.test.ts +351 -23
  94. package/src/__tests__/daemon-credential-client.test.ts +101 -19
  95. package/src/__tests__/date-context.test.ts +164 -2
  96. package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
  97. package/src/__tests__/disk-pressure-guard.test.ts +262 -0
  98. package/src/__tests__/disk-pressure-lifecycle.test.ts +168 -0
  99. package/src/__tests__/disk-pressure-policy.test.ts +241 -0
  100. package/src/__tests__/disk-pressure-routes.test.ts +379 -0
  101. package/src/__tests__/disk-pressure-tools.test.ts +277 -0
  102. package/src/__tests__/disk-usage.test.ts +150 -0
  103. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  104. package/src/__tests__/events-client-registration.test.ts +52 -0
  105. package/src/__tests__/events-dev-bypass-actor.test.ts +162 -0
  106. package/src/__tests__/file-write-tool.test.ts +4 -10
  107. package/src/__tests__/filing-service.test.ts +3 -4
  108. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  109. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -2
  110. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -2
  111. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -1
  112. package/src/__tests__/heartbeat-disk-pressure.test.ts +183 -0
  113. package/src/__tests__/heartbeat-service.test.ts +968 -2
  114. package/src/__tests__/helpers/call-route-handler.ts +7 -1
  115. package/src/__tests__/host-app-control-proxy.test.ts +772 -0
  116. package/src/__tests__/host-app-control-routes.test.ts +263 -0
  117. package/src/__tests__/host-bash-proxy.test.ts +439 -47
  118. package/src/__tests__/host-bash-routes.test.ts +459 -0
  119. package/src/__tests__/host-browser-proxy.test.ts +24 -22
  120. package/src/__tests__/host-browser-routes.test.ts +39 -13
  121. package/src/__tests__/host-cu-proxy.test.ts +248 -52
  122. package/src/__tests__/host-cu-routes-targeted.test.ts +429 -0
  123. package/src/__tests__/host-file-edit-tool.test.ts +47 -1
  124. package/src/__tests__/host-file-proxy-targeted.test.ts +378 -0
  125. package/src/__tests__/host-file-proxy.test.ts +301 -45
  126. package/src/__tests__/host-file-read-tool.test.ts +17 -0
  127. package/src/__tests__/host-file-routes-targeted.test.ts +420 -0
  128. package/src/__tests__/host-file-write-tool.test.ts +42 -1
  129. package/src/__tests__/host-proxy-base.test.ts +312 -0
  130. package/src/__tests__/host-shell-tool.test.ts +22 -4
  131. package/src/__tests__/host-transfer-proxy-targeted.test.ts +932 -0
  132. package/src/__tests__/host-transfer-proxy.test.ts +121 -22
  133. package/src/__tests__/host-transfer-routes-targeted.test.ts +662 -0
  134. package/src/__tests__/http-user-message-parity.test.ts +108 -1
  135. package/src/__tests__/identity-intro-cache.test.ts +29 -0
  136. package/src/__tests__/identity-routes.test.ts +103 -1
  137. package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
  138. package/src/__tests__/injector-chain.test.ts +18 -6
  139. package/src/__tests__/injector-disk-pressure.test.ts +224 -0
  140. package/src/__tests__/inline-command-runner.test.ts +0 -1
  141. package/src/__tests__/inline-skill-load-permissions.test.ts +5 -11
  142. package/src/__tests__/integration-status.test.ts +85 -5
  143. package/src/__tests__/intent-routing.test.ts +0 -1
  144. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
  145. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
  146. package/src/__tests__/managed-profile-guard.test.ts +18 -0
  147. package/src/__tests__/managed-skill-lifecycle.test.ts +0 -1
  148. package/src/__tests__/mcp-abort-signal.test.ts +130 -0
  149. package/src/__tests__/mcp-auth-routes.test.ts +197 -0
  150. package/src/__tests__/mcp-cli.test.ts +338 -2
  151. package/src/__tests__/memory-admin-recall.test.ts +3 -11
  152. package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
  153. package/src/__tests__/memory-retrieval-pipeline.test.ts +22 -1
  154. package/src/__tests__/migration-import-commit-http.test.ts +108 -2
  155. package/src/__tests__/mock-gateway-ipc.ts +1 -0
  156. package/src/__tests__/normalize-onboarding.test.ts +180 -0
  157. package/src/__tests__/oauth-cli.test.ts +0 -2
  158. package/src/__tests__/oauth-connect-routes.test.ts +316 -0
  159. package/src/__tests__/oauth-provider-seed-logos.test.ts +24 -2
  160. package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
  161. package/src/__tests__/onboarding-persona-write.test.ts +308 -0
  162. package/src/__tests__/openai-provider.test.ts +45 -8
  163. package/src/__tests__/persist-onboarding-artifacts.test.ts +44 -64
  164. package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
  165. package/src/__tests__/platform-bash-auto-approve.test.ts +5 -9
  166. package/src/__tests__/platform-callback-registration.test.ts +21 -4
  167. package/src/__tests__/platform.test.ts +2 -1
  168. package/src/__tests__/playbook-execution.test.ts +0 -43
  169. package/src/__tests__/plugin-tool-contribution.test.ts +47 -0
  170. package/src/__tests__/prechat-onboarding-contract.test.ts +214 -25
  171. package/src/__tests__/process-message-background-slack.test.ts +2 -0
  172. package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
  173. package/src/__tests__/provider-tool-name.test.ts +23 -0
  174. package/src/__tests__/public-ingress-urls.test.ts +97 -0
  175. package/src/__tests__/relay-server.test.ts +15 -4
  176. package/src/__tests__/require-fresh-approval.test.ts +0 -1
  177. package/src/__tests__/retry-backoff.test.ts +87 -0
  178. package/src/__tests__/runtime-events-sse.test.ts +2 -2
  179. package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
  180. package/src/__tests__/schedule-retry.test.ts +715 -0
  181. package/src/__tests__/scheduler-disk-pressure.test.ts +148 -0
  182. package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
  183. package/src/__tests__/secret-ingress-http.test.ts +1 -1
  184. package/src/__tests__/send-endpoint-busy.test.ts +3 -0
  185. package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -1
  186. package/src/__tests__/skill-feature-flags.test.ts +43 -41
  187. package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
  188. package/src/__tests__/skill-load-inline-command.test.ts +0 -51
  189. package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
  190. package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
  191. package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -1
  192. package/src/__tests__/slack-channel-config.test.ts +9 -14
  193. package/src/__tests__/suggestion-routes.test.ts +46 -0
  194. package/src/__tests__/system-prompt-ask-mode.test.ts +0 -1
  195. package/src/__tests__/system-prompt.test.ts +0 -1
  196. package/src/__tests__/telegram-config.test.ts +0 -1
  197. package/src/__tests__/test-preload.ts +8 -0
  198. package/src/__tests__/tool-approval-handler.test.ts +3 -4
  199. package/src/__tests__/tool-audit-listener.test.ts +48 -0
  200. package/src/__tests__/tool-execute-pipeline.test.ts +0 -1
  201. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  202. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
  203. package/src/__tests__/tool-executor.test.ts +0 -1
  204. package/src/__tests__/twilio-config.test.ts +3 -16
  205. package/src/__tests__/twilio-routes.test.ts +3 -5
  206. package/src/__tests__/twilio-validation.test.ts +93 -0
  207. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +1 -4
  208. package/src/__tests__/verification-control-plane-policy.test.ts +2 -4
  209. package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
  210. package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
  211. package/src/__tests__/workspace-migration-065-bump-stale-heartbeat-interval.test.ts +122 -0
  212. package/src/__tests__/workspace-migration-066-seed-heartbeat-callsite-cost-default.test.ts +285 -0
  213. package/src/__tests__/workspace-migration-068-release-notes-local-timezone.test.ts +90 -0
  214. package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -5
  215. package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
  216. package/src/__tests__/workspace-migration-safe-storage-limits-release.test.ts +90 -0
  217. package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
  218. package/src/approvals/guardian-decision-primitive.ts +13 -0
  219. package/src/approvals/guardian-request-resolvers.ts +16 -17
  220. package/src/backup/__tests__/paths.test.ts +0 -22
  221. package/src/backup/__tests__/restore.test.ts +51 -151
  222. package/src/backup/paths.ts +2 -18
  223. package/src/backup/restore.ts +107 -231
  224. package/src/backup/snapshot-lock.ts +2 -27
  225. package/src/bundler/app-bundler.ts +51 -3
  226. package/src/bundler/compiler-tools.ts +3 -2
  227. package/src/calls/call-conversation-messages.ts +46 -10
  228. package/src/calls/relay-server.ts +4 -44
  229. package/src/calls/twilio-config.ts +2 -17
  230. package/src/calls/twilio-rest.ts +33 -105
  231. package/src/calls/twilio-routes.ts +11 -12
  232. package/src/channels/types.ts +8 -7
  233. package/src/cli/commands/__tests__/backup.test.ts +6 -277
  234. package/src/cli/commands/__tests__/gateway.test.ts +288 -0
  235. package/src/cli/commands/__tests__/memory-v2.test.ts +4 -0
  236. package/src/cli/commands/__tests__/webhooks.test.ts +0 -5
  237. package/src/cli/commands/backup.ts +6 -331
  238. package/src/cli/commands/bash.ts +35 -108
  239. package/src/cli/commands/clients.ts +36 -37
  240. package/src/cli/commands/contacts.ts +137 -25
  241. package/src/cli/commands/conversations.ts +2 -5
  242. package/src/cli/commands/credentials.ts +71 -7
  243. package/src/cli/commands/domain.ts +66 -15
  244. package/src/cli/commands/gateway.ts +183 -0
  245. package/src/cli/commands/keys.ts +9 -6
  246. package/src/cli/commands/mcp.ts +116 -156
  247. package/src/cli/commands/memory-v2.ts +303 -7
  248. package/src/cli/commands/oauth/__tests__/connect.test.ts +437 -1
  249. package/src/cli/commands/oauth/connect.ts +127 -1
  250. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -4
  251. package/src/cli/commands/platform/__tests__/connect.test.ts +7 -3
  252. package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -3
  253. package/src/cli/commands/platform/__tests__/status.test.ts +116 -21
  254. package/src/cli/commands/platform/disconnect.ts +5 -4
  255. package/src/cli/commands/platform/index.ts +16 -25
  256. package/src/cli/commands/status.ts +57 -0
  257. package/src/cli/lib/daemon-credential-client.ts +110 -28
  258. package/src/cli/program.ts +6 -2
  259. package/src/config/assistant-feature-flags.ts +79 -12
  260. package/src/config/bundled-skills/acp/SKILL.md +6 -0
  261. package/src/config/bundled-skills/acp/TOOLS.json +1 -22
  262. package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
  263. package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
  264. package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
  265. package/src/config/bundled-skills/app-control/SKILL.md +75 -0
  266. package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
  267. package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
  268. package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
  269. package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
  270. package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
  271. package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
  272. package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
  273. package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
  274. package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
  275. package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
  276. package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
  277. package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
  278. package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
  279. package/src/config/bundled-skills/document/TOOLS.json +0 -8
  280. package/src/config/bundled-skills/followups/TOOLS.json +0 -12
  281. package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
  282. package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
  283. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
  284. package/src/config/bundled-skills/messaging/TOOLS.json +0 -40
  285. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -3
  286. package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
  287. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +25 -4
  288. package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
  289. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +2 -2
  290. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +2 -2
  291. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +2 -2
  292. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +2 -2
  293. package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
  294. package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
  295. package/src/config/bundled-skills/settings/SKILL.md +4 -0
  296. package/src/config/bundled-skills/settings/TOOLS.json +0 -12
  297. package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
  298. package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
  299. package/src/config/bundled-skills/subagent/SKILL.md +6 -2
  300. package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
  301. package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
  302. package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
  303. package/src/config/bundled-tool-registry.ts +21 -0
  304. package/src/config/env-registry.ts +0 -2
  305. package/src/config/env.ts +19 -20
  306. package/src/config/feature-flag-registry.json +47 -135
  307. package/src/config/loader.ts +197 -104
  308. package/src/config/sanitize-for-transfer.ts +2 -0
  309. package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
  310. package/src/config/schemas/__tests__/memory-v2.test.ts +17 -9
  311. package/src/config/schemas/call-site-catalog.ts +14 -0
  312. package/src/config/schemas/calls.ts +0 -9
  313. package/src/config/schemas/channels.ts +0 -5
  314. package/src/config/schemas/heartbeat.ts +64 -1
  315. package/src/config/schemas/ingress.ts +10 -6
  316. package/src/config/schemas/llm.ts +7 -10
  317. package/src/config/schemas/memory-lifecycle.ts +90 -24
  318. package/src/config/schemas/memory-v2.ts +121 -13
  319. package/src/config/schemas/platform.ts +49 -3
  320. package/src/config/schemas/services.ts +29 -15
  321. package/src/config/schemas/skills.ts +0 -6
  322. package/src/config/seed-inference-profiles.ts +230 -33
  323. package/src/contacts/contact-store.ts +0 -55
  324. package/src/contacts/contacts-write.ts +0 -27
  325. package/src/context/window-manager.ts +1 -2
  326. package/src/credential-execution/feature-gates.ts +10 -10
  327. package/src/credential-execution/process-manager.ts +12 -41
  328. package/src/daemon/__tests__/conversation-tool-setup.test.ts +187 -5
  329. package/src/daemon/assistant-attachments.ts +4 -4
  330. package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
  331. package/src/daemon/config-watcher.ts +89 -60
  332. package/src/daemon/conversation-agent-loop-handlers.ts +27 -3
  333. package/src/daemon/conversation-agent-loop.ts +202 -61
  334. package/src/daemon/conversation-error.ts +87 -15
  335. package/src/daemon/conversation-lifecycle.ts +9 -4
  336. package/src/daemon/conversation-process.ts +24 -11
  337. package/src/daemon/conversation-runtime-assembly.ts +28 -2
  338. package/src/daemon/conversation-store.ts +2 -2
  339. package/src/daemon/conversation-surfaces.ts +305 -4
  340. package/src/daemon/conversation-tool-setup.ts +66 -62
  341. package/src/daemon/conversation.ts +38 -24
  342. package/src/daemon/date-context.ts +71 -22
  343. package/src/daemon/disk-pressure-background-gate.ts +73 -0
  344. package/src/daemon/disk-pressure-guard.ts +343 -0
  345. package/src/daemon/disk-pressure-policy.ts +163 -0
  346. package/src/daemon/doordash-steps.ts +1 -1
  347. package/src/daemon/handlers/shared.ts +4 -2
  348. package/src/daemon/handlers/skills.ts +3 -4
  349. package/src/daemon/host-app-control-proxy.ts +389 -0
  350. package/src/daemon/host-bash-proxy.ts +117 -82
  351. package/src/daemon/host-browser-proxy.ts +67 -82
  352. package/src/daemon/host-cu-proxy.ts +127 -86
  353. package/src/daemon/host-file-proxy.ts +129 -69
  354. package/src/daemon/host-proxy-base.ts +294 -0
  355. package/src/daemon/host-proxy-preactivation.ts +82 -0
  356. package/src/daemon/host-transfer-proxy.ts +338 -129
  357. package/src/daemon/lifecycle.ts +194 -145
  358. package/src/daemon/meet-host-supervisor.ts +4 -4
  359. package/src/daemon/meet-manifest-loader.ts +0 -1
  360. package/src/daemon/memory-v2-startup.ts +14 -4
  361. package/src/daemon/message-protocol.ts +6 -8
  362. package/src/daemon/message-types/contacts.ts +23 -1
  363. package/src/daemon/message-types/conversations.ts +15 -8
  364. package/src/daemon/message-types/disk-pressure.ts +9 -0
  365. package/src/daemon/message-types/host-app-control.ts +150 -0
  366. package/src/daemon/message-types/host-bash.ts +4 -0
  367. package/src/daemon/message-types/host-cu.ts +2 -0
  368. package/src/daemon/message-types/host-file.ts +4 -0
  369. package/src/daemon/message-types/host-transfer.ts +3 -0
  370. package/src/daemon/message-types/messages.ts +3 -0
  371. package/src/daemon/message-types/schedules.ts +8 -3
  372. package/src/daemon/message-types/skills.ts +2 -2
  373. package/src/daemon/process-message.ts +18 -1
  374. package/src/daemon/profiler-run-store.ts +5 -5
  375. package/src/daemon/shutdown-handlers.ts +0 -3
  376. package/src/daemon/tool-setup-types.ts +51 -0
  377. package/src/daemon/tool-side-effects.ts +1 -1
  378. package/src/documents/document-store.ts +85 -0
  379. package/src/events/tool-audit-listener.ts +2 -1
  380. package/src/filing/filing-service.ts +30 -5
  381. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +24 -23
  382. package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +252 -0
  383. package/src/heartbeat/heartbeat-run-store.ts +249 -0
  384. package/src/heartbeat/heartbeat-service.ts +459 -54
  385. package/src/home/__tests__/post-connect-feed.test.ts +99 -0
  386. package/src/home/__tests__/relationship-state-writer.test.ts +11 -9
  387. package/src/home/__tests__/suggested-prompts.test.ts +89 -0
  388. package/src/home/feed-scheduler.ts +18 -0
  389. package/src/home/post-connect-feed.ts +68 -0
  390. package/src/home/relationship-state-writer.ts +17 -92
  391. package/src/home/suggested-prompts.ts +46 -10
  392. package/src/inbound/platform-callback-registration.ts +8 -15
  393. package/src/inbound/public-ingress-urls.ts +32 -34
  394. package/src/ipc/__tests__/clients-list-ipc.test.ts +169 -0
  395. package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
  396. package/src/ipc/assistant-server.ts +70 -3
  397. package/src/ipc/cli-client.ts +32 -1
  398. package/src/ipc/gateway-client.ts +37 -3
  399. package/src/live-voice/live-voice-archive.ts +4 -4
  400. package/src/live-voice/live-voice-metrics.ts +10 -10
  401. package/src/live-voice/protocol.ts +5 -7
  402. package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
  403. package/src/mcp/mcp-auth-orchestrator.ts +213 -0
  404. package/src/mcp/mcp-auth-state.ts +133 -0
  405. package/src/mcp/mcp-oauth-provider.ts +19 -0
  406. package/src/media/image-service.ts +1 -7
  407. package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +21 -13
  408. package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
  409. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +52 -22
  410. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -6
  411. package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +272 -0
  412. package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
  413. package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
  414. package/src/memory/admin.ts +5 -9
  415. package/src/memory/anisotropy.test.ts +247 -0
  416. package/src/memory/anisotropy.ts +443 -0
  417. package/src/memory/auto-analysis-constants.ts +17 -0
  418. package/src/memory/auto-analysis-guard.ts +5 -15
  419. package/src/memory/canonical-guardian-store.ts +7 -7
  420. package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
  421. package/src/memory/context-search/agent-protocol.ts +6 -6
  422. package/src/memory/context-search/agent-runner.ts +51 -9
  423. package/src/memory/context-search/sources/conversations.ts +2 -11
  424. package/src/memory/context-search/sources/memory-v2.ts +22 -9
  425. package/src/memory/context-search/sources/memory.ts +0 -1
  426. package/src/memory/context-search/types.ts +0 -1
  427. package/src/memory/conversation-crud.ts +5 -13
  428. package/src/memory/conversation-key-store.ts +2 -15
  429. package/src/memory/db-init.ts +6 -0
  430. package/src/memory/embedding-backend.ts +9 -21
  431. package/src/memory/embedding-runtime-manager.ts +119 -5
  432. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +81 -25
  433. package/src/memory/graph/conversation-graph-memory.ts +43 -78
  434. package/src/memory/graph/extraction.ts +1 -3
  435. package/src/memory/graph/graph-search.test.ts +10 -67
  436. package/src/memory/graph/graph-search.ts +9 -20
  437. package/src/memory/graph/retriever.test.ts +6 -0
  438. package/src/memory/graph/retriever.ts +34 -10
  439. package/src/memory/graph/tools.ts +1 -1
  440. package/src/memory/indexer.ts +54 -45
  441. package/src/memory/job-handlers/backfill.ts +2 -11
  442. package/src/memory/job-handlers/cleanup.ts +43 -0
  443. package/src/memory/job-handlers/embedding.ts +6 -8
  444. package/src/memory/job-handlers/summarization.ts +2 -7
  445. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +8 -2
  446. package/src/memory/jobs/embed-concept-page.ts +28 -2
  447. package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
  448. package/src/memory/jobs-store.ts +114 -22
  449. package/src/memory/jobs-worker.ts +193 -106
  450. package/src/memory/memory-v2-activation-log-store.ts +33 -15
  451. package/src/memory/memory-v2-concept-frequency.ts +169 -0
  452. package/src/memory/migrations/237-heartbeat-runs.ts +45 -0
  453. package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
  454. package/src/memory/migrations/239-trace-events-created-at-index.ts +18 -0
  455. package/src/memory/migrations/index.ts +6 -0
  456. package/src/memory/migrations/registry.ts +8 -0
  457. package/src/memory/pkb/pkb-search.test.ts +6 -0
  458. package/src/memory/pkb/pkb-search.ts +7 -0
  459. package/src/memory/qdrant-client.ts +49 -32
  460. package/src/memory/rerank-local.ts +374 -0
  461. package/src/memory/schema/infrastructure.ts +15 -0
  462. package/src/memory/search/semantic.ts +13 -67
  463. package/src/memory/sparse-tokenize.ts +49 -0
  464. package/src/memory/trace-event-store.ts +1 -17
  465. package/src/memory/v2/__tests__/activation.test.ts +387 -344
  466. package/src/memory/v2/__tests__/consolidation-job.test.ts +40 -8
  467. package/src/memory/v2/__tests__/injection.test.ts +181 -169
  468. package/src/memory/v2/__tests__/prompts-consolidation.test.ts +61 -2
  469. package/src/memory/v2/__tests__/qdrant.test.ts +16 -0
  470. package/src/memory/v2/__tests__/reranker.test.ts +338 -0
  471. package/src/memory/v2/__tests__/sim.test.ts +154 -188
  472. package/src/memory/v2/__tests__/skill-store.test.ts +71 -65
  473. package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
  474. package/src/memory/v2/__tests__/static-context.test.ts +76 -2
  475. package/src/memory/v2/activation.ts +213 -239
  476. package/src/memory/v2/consolidation-job.ts +65 -17
  477. package/src/memory/v2/constants.ts +7 -0
  478. package/src/memory/v2/injection.ts +123 -103
  479. package/src/memory/v2/prompts/consolidation.ts +348 -92
  480. package/src/memory/v2/qdrant.ts +198 -1
  481. package/src/memory/v2/reranker.ts +177 -0
  482. package/src/memory/v2/sim.ts +113 -77
  483. package/src/memory/v2/skill-content.ts +4 -3
  484. package/src/memory/v2/skill-store.ts +91 -53
  485. package/src/memory/v2/sparse-bm25.ts +245 -0
  486. package/src/memory/v2/static-context.ts +28 -5
  487. package/src/memory/v2/types.ts +10 -10
  488. package/src/messaging/providers/gmail/types.ts +0 -49
  489. package/src/messaging/providers/slack/adapter.ts +1 -31
  490. package/src/messaging/providers/slack/types.ts +0 -32
  491. package/src/notifications/README.md +10 -10
  492. package/src/notifications/broadcaster.ts +1 -1
  493. package/src/notifications/copy-composer.ts +13 -0
  494. package/src/notifications/guardian-question-mode.ts +5 -5
  495. package/src/notifications/signal.ts +4 -0
  496. package/src/oauth/AGENTS.md +3 -1
  497. package/src/oauth/__tests__/oauth-connect-state.test.ts +137 -0
  498. package/src/oauth/connect-orchestrator.ts +6 -0
  499. package/src/oauth/connection-resolver.test.ts +66 -1
  500. package/src/oauth/connection-resolver.ts +55 -1
  501. package/src/oauth/credential-token-resolver.ts +1 -3
  502. package/src/oauth/manual-token-connection.ts +0 -4
  503. package/src/oauth/oauth-connect-state.ts +77 -0
  504. package/src/oauth/seed-providers.ts +58 -1
  505. package/src/outbound-proxy/index.ts +1 -37
  506. package/src/outbound-proxy/logging.ts +1 -1
  507. package/src/outbound-proxy/policy.ts +6 -5
  508. package/src/outbound-proxy/router.ts +2 -1
  509. package/src/permissions/approval-policy.test.ts +6 -275
  510. package/src/permissions/approval-policy.ts +0 -51
  511. package/src/permissions/checker.test.ts +0 -1
  512. package/src/permissions/checker.ts +3 -17
  513. package/src/permissions/gateway-threshold-reader.ts +2 -0
  514. package/src/permissions/prompter.ts +34 -1
  515. package/src/permissions/secret-prompter.ts +6 -2
  516. package/src/plugins/defaults/injectors.ts +35 -2
  517. package/src/plugins/defaults/memory-retrieval.ts +5 -6
  518. package/src/plugins/types.ts +7 -0
  519. package/src/proactive-artifact/aux-message-injector.ts +74 -0
  520. package/src/proactive-artifact/decision.test.ts +226 -0
  521. package/src/proactive-artifact/decision.ts +165 -0
  522. package/src/proactive-artifact/index.ts +7 -0
  523. package/src/proactive-artifact/job.test.ts +867 -0
  524. package/src/proactive-artifact/job.ts +352 -0
  525. package/src/proactive-artifact/message-copy.ts +41 -0
  526. package/src/proactive-artifact/trigger-state.test.ts +277 -0
  527. package/src/proactive-artifact/trigger-state.ts +119 -0
  528. package/src/prompts/bootstrap-cleanup.ts +27 -0
  529. package/src/prompts/normalize-onboarding.ts +80 -0
  530. package/src/prompts/persona-resolver.ts +101 -9
  531. package/src/prompts/system-prompt.ts +23 -24
  532. package/src/prompts/templates/BOOTSTRAP.md +13 -5
  533. package/src/prompts/templates/SOUL.md +13 -1
  534. package/src/providers/__tests__/retry-callsite.test.ts +222 -1
  535. package/src/providers/model-intents.ts +7 -0
  536. package/src/providers/openrouter/client.ts +8 -0
  537. package/src/providers/retry.ts +50 -0
  538. package/src/providers/speech-to-text/provider-catalog.ts +7 -8
  539. package/src/providers/types.ts +1 -0
  540. package/src/runtime/__tests__/agent-wake.test.ts +456 -3
  541. package/src/runtime/agent-wake.ts +238 -100
  542. package/src/runtime/assistant-event-hub.ts +151 -99
  543. package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
  544. package/src/runtime/auth/__tests__/route-policy.test.ts +64 -0
  545. package/src/runtime/auth/middleware.ts +0 -96
  546. package/src/runtime/auth/route-policy.ts +32 -0
  547. package/src/runtime/auth/same-actor.ts +216 -0
  548. package/src/runtime/btw-sidechain.ts +2 -3
  549. package/src/runtime/channel-invite-transport.ts +2 -48
  550. package/src/runtime/channel-invite-transports/email.ts +1 -1
  551. package/src/runtime/channel-invite-transports/slack.ts +1 -1
  552. package/src/runtime/channel-invite-transports/telegram.ts +1 -1
  553. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  554. package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
  555. package/src/runtime/channel-invite-types.ts +54 -0
  556. package/src/runtime/channel-readiness-service.ts +32 -13
  557. package/src/runtime/channel-retry-sweep.ts +65 -1
  558. package/src/runtime/guardian-reply-router.ts +10 -0
  559. package/src/runtime/http-server.ts +3 -329
  560. package/src/runtime/http-types.ts +0 -5
  561. package/src/runtime/local-actor-identity.ts +52 -11
  562. package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +413 -0
  563. package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
  564. package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
  565. package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +153 -1
  566. package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
  567. package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
  568. package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
  569. package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
  570. package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
  571. package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +51 -1
  572. package/src/runtime/migrations/migration-transport.ts +7 -7
  573. package/src/runtime/migrations/vbundle-builder.ts +327 -60
  574. package/src/runtime/migrations/vbundle-import-analyzer.ts +4 -4
  575. package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
  576. package/src/runtime/migrations/vbundle-importer.ts +245 -68
  577. package/src/runtime/migrations/vbundle-streaming-importer.ts +326 -35
  578. package/src/runtime/migrations/vbundle-streaming-validator.ts +157 -4
  579. package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
  580. package/src/runtime/migrations/vbundle-validator.ts +114 -0
  581. package/src/runtime/pending-interactions.ts +43 -9
  582. package/src/runtime/routes/__tests__/backup-routes.test.ts +22 -150
  583. package/src/runtime/routes/__tests__/client-routes.test.ts +155 -0
  584. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -5
  585. package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
  586. package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -0
  587. package/src/runtime/routes/approval-interception-types.ts +13 -0
  588. package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
  589. package/src/runtime/routes/backup-routes.ts +15 -38
  590. package/src/runtime/routes/btw-routes.ts +14 -37
  591. package/src/runtime/routes/client-routes.ts +21 -2
  592. package/src/runtime/routes/contact-prompt-routes.ts +183 -0
  593. package/src/runtime/routes/contact-routes.ts +0 -25
  594. package/src/runtime/routes/conversation-query-routes.ts +36 -1
  595. package/src/runtime/routes/conversation-routes.ts +65 -39
  596. package/src/runtime/routes/debug-bash-routes.ts +163 -0
  597. package/src/runtime/routes/disk-pressure-routes.ts +121 -0
  598. package/src/runtime/routes/document-pdf-renderer.ts +169 -0
  599. package/src/runtime/routes/documents-routes.ts +32 -75
  600. package/src/runtime/routes/errors.ts +19 -4
  601. package/src/runtime/routes/events-routes.ts +38 -0
  602. package/src/runtime/routes/gateway-log-routes.ts +79 -0
  603. package/src/runtime/routes/guardian-approval-interception.ts +2 -8
  604. package/src/runtime/routes/heartbeat-routes.ts +103 -38
  605. package/src/runtime/routes/host-app-control-routes.ts +134 -0
  606. package/src/runtime/routes/host-bash-routes.ts +56 -6
  607. package/src/runtime/routes/host-browser-routes.ts +108 -13
  608. package/src/runtime/routes/host-cu-routes.ts +66 -9
  609. package/src/runtime/routes/host-file-routes.ts +54 -5
  610. package/src/runtime/routes/host-transfer-routes.ts +122 -19
  611. package/src/runtime/routes/http-adapter.ts +1 -0
  612. package/src/runtime/routes/identity-intro-cache.ts +30 -0
  613. package/src/runtime/routes/identity-routes.ts +21 -180
  614. package/src/runtime/routes/inbound-message-handler.ts +78 -21
  615. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -7
  616. package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
  617. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +3 -0
  618. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
  619. package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
  620. package/src/runtime/routes/index.ts +14 -0
  621. package/src/runtime/routes/mcp-auth-routes.ts +132 -0
  622. package/src/runtime/routes/memory-item-routes.test.ts +41 -15
  623. package/src/runtime/routes/memory-item-routes.ts +10 -12
  624. package/src/runtime/routes/memory-v2-routes.ts +474 -1
  625. package/src/runtime/routes/migration-routes.ts +96 -0
  626. package/src/runtime/routes/oauth-connect-routes.ts +153 -0
  627. package/src/runtime/routes/schedule-routes.ts +7 -0
  628. package/src/runtime/verification-outbound-actions.ts +4 -4
  629. package/src/runtime/verification-templates.ts +4 -7
  630. package/src/schedule/integration-status.ts +66 -2
  631. package/src/schedule/recurrence-engine.ts +4 -1
  632. package/src/schedule/retry-backoff.ts +18 -0
  633. package/src/schedule/retry-policy.ts +82 -0
  634. package/src/schedule/run-script.ts +37 -5
  635. package/src/schedule/schedule-recovery.ts +64 -0
  636. package/src/schedule/schedule-store.ts +106 -2
  637. package/src/schedule/scheduler-types.ts +25 -0
  638. package/src/schedule/scheduler.ts +83 -39
  639. package/src/security/encrypted-store.ts +2 -0
  640. package/src/security/oauth-callback-registry.ts +8 -0
  641. package/src/security/secure-keys.ts +55 -0
  642. package/src/sequence/analytics.ts +5 -5
  643. package/src/sequence/engine.ts +1 -1
  644. package/src/skills/catalog-files.ts +2 -8
  645. package/src/skills/include-graph.ts +5 -5
  646. package/src/skills/remote-skill-policy.ts +10 -16
  647. package/src/skills/skill-file-provider.ts +1 -1
  648. package/src/skills/skill-file-types.ts +13 -0
  649. package/src/skills/skillssh-audit-types.ts +28 -0
  650. package/src/skills/skillssh-registry.ts +8 -21
  651. package/src/subagent/index.ts +1 -7
  652. package/src/subagent/manager.ts +1 -15
  653. package/src/tasks/task-runner.ts +0 -1
  654. package/src/tasks/task-store.ts +0 -3
  655. package/src/telemetry/types.ts +2 -0
  656. package/src/telemetry/usage-telemetry-reporter.test.ts +21 -0
  657. package/src/telemetry/usage-telemetry-reporter.ts +1 -0
  658. package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
  659. package/src/tools/apps/executors.ts +56 -69
  660. package/src/tools/background-tool-registry.ts +17 -3
  661. package/src/tools/browser/__tests__/browser-status.test.ts +21 -18
  662. package/src/tools/browser/browser-execution.ts +2 -2
  663. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +55 -4
  664. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
  665. package/src/tools/browser/cdp-client/factory.ts +23 -24
  666. package/src/tools/browser/cdp-client/index.ts +1 -14
  667. package/src/tools/computer-use/definitions.ts +42 -20
  668. package/src/tools/executor.ts +2 -0
  669. package/src/tools/host-filesystem/edit.test.ts +151 -0
  670. package/src/tools/host-filesystem/edit.ts +68 -0
  671. package/src/tools/host-filesystem/read.test.ts +129 -0
  672. package/src/tools/host-filesystem/read.ts +68 -0
  673. package/src/tools/host-filesystem/transfer.test.ts +127 -2
  674. package/src/tools/host-filesystem/transfer.ts +78 -3
  675. package/src/tools/host-filesystem/write.test.ts +134 -0
  676. package/src/tools/host-filesystem/write.ts +68 -0
  677. package/src/tools/host-terminal/host-shell.ts +66 -1
  678. package/src/tools/mcp/mcp-tool-factory.ts +2 -1
  679. package/src/tools/memory/register.test.ts +12 -9
  680. package/src/tools/memory/register.ts +1 -2
  681. package/src/tools/provider-tool-name.ts +28 -0
  682. package/src/tools/registry.ts +30 -9
  683. package/src/tools/schedule/create.ts +6 -0
  684. package/src/tools/schedule/list.ts +2 -0
  685. package/src/tools/schedule/update.ts +10 -0
  686. package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
  687. package/src/tools/shared/filesystem/path-policy.ts +25 -1
  688. package/src/tools/skills/load.ts +0 -32
  689. package/src/tools/terminal/shell.ts +9 -1
  690. package/src/tools/tool-approval-handler.ts +32 -11
  691. package/src/tools/types.ts +28 -2
  692. package/src/tts/provider-catalog.ts +3 -5
  693. package/src/usage/pricing.ts +1 -1
  694. package/src/util/disk-usage.ts +138 -0
  695. package/src/util/platform.ts +21 -11
  696. package/src/util/process-liveness.ts +26 -0
  697. package/src/workspace/hatched-date.ts +86 -0
  698. package/src/workspace/heartbeat-service.ts +19 -0
  699. package/src/workspace/migrations/003-seed-device-id.ts +1 -1
  700. package/src/workspace/migrations/006-services-config.ts +8 -5
  701. package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
  702. package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
  703. package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
  704. package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
  705. package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
  706. package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
  707. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +2 -1
  708. package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
  709. package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +3 -8
  710. package/src/workspace/migrations/065-bump-stale-heartbeat-interval.ts +60 -0
  711. package/src/workspace/migrations/066-seed-heartbeat-callsite-cost-default.ts +146 -0
  712. package/src/workspace/migrations/067-release-notes-safe-storage-limits.ts +72 -0
  713. package/src/workspace/migrations/068-release-notes-local-timezone.ts +65 -0
  714. package/src/workspace/migrations/AGENTS.md +1 -1
  715. package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
  716. package/src/workspace/migrations/registry.ts +8 -0
  717. package/src/workspace/migrations/utils.ts +21 -0
  718. package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +0 -167
  719. package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -443
  720. package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -226
  721. package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -427
  722. package/src/__tests__/twilio-rest.test.ts +0 -34
  723. package/src/backup/__tests__/backup-key.test.ts +0 -152
  724. package/src/backup/__tests__/backup-worker.test.ts +0 -782
  725. package/src/backup/__tests__/offsite-writer.test.ts +0 -641
  726. package/src/backup/__tests__/stream-crypt.test.ts +0 -228
  727. package/src/backup/backup-key.ts +0 -137
  728. package/src/backup/backup-worker.ts +0 -472
  729. package/src/backup/offsite-writer.ts +0 -222
  730. package/src/backup/stream-crypt.ts +0 -263
  731. package/src/daemon/message-types/pairing.ts +0 -58
  732. package/src/memory/v2/__tests__/skill-qdrant.test.ts +0 -657
  733. package/src/memory/v2/skill-qdrant.ts +0 -395
  734. package/src/outbound-proxy/config.ts +0 -20
  735. package/src/outbound-proxy/health.ts +0 -18
  736. package/src/outbound-proxy/types.ts +0 -150
  737. package/src/runtime/capability-tokens.ts +0 -190
  738. package/src/signals/bash.ts +0 -198
  739. package/src/signals/mcp-reload.ts +0 -18
@@ -1,12 +1,6 @@
1
- export type RemoteSkillProvider = "clawhub" | "skillssh";
2
-
3
- export type SkillsShRisk =
4
- | "safe"
5
- | "low"
6
- | "medium"
7
- | "high"
8
- | "critical"
9
- | "unknown";
1
+ type RemoteSkillProvider = "clawhub" | "skillssh";
2
+
3
+ type SkillsShRisk = "safe" | "low" | "medium" | "high" | "critical" | "unknown";
10
4
  export type SkillsShRiskThreshold = Exclude<SkillsShRisk, "unknown">;
11
5
 
12
6
  export interface RemoteSkillPolicy {
@@ -26,12 +20,12 @@ export interface RemoteSkillPolicy {
26
20
  maxSkillsShRisk: SkillsShRiskThreshold;
27
21
  }
28
22
 
29
- export interface ClawhubModerationState {
23
+ interface ClawhubModerationState {
30
24
  isSuspicious?: boolean;
31
25
  isMalwareBlocked?: boolean;
32
26
  }
33
27
 
34
- export interface SkillsShAuditState {
28
+ interface SkillsShAuditState {
35
29
  risk?: SkillsShRisk | null;
36
30
  }
37
31
 
@@ -40,27 +34,27 @@ interface RemoteSkillCandidateBase {
40
34
  slug: string;
41
35
  }
42
36
 
43
- export interface ClawhubRemoteSkillCandidate extends RemoteSkillCandidateBase {
37
+ interface ClawhubRemoteSkillCandidate extends RemoteSkillCandidateBase {
44
38
  provider: "clawhub";
45
39
  moderation?: ClawhubModerationState | null;
46
40
  }
47
41
 
48
- export interface SkillsShRemoteSkillCandidate extends RemoteSkillCandidateBase {
42
+ interface SkillsShRemoteSkillCandidate extends RemoteSkillCandidateBase {
49
43
  provider: "skillssh";
50
44
  audit?: SkillsShAuditState | null;
51
45
  }
52
46
 
53
- export type RemoteSkillCandidate =
47
+ type RemoteSkillCandidate =
54
48
  | ClawhubRemoteSkillCandidate
55
49
  | SkillsShRemoteSkillCandidate;
56
50
 
57
- export type RemoteSkillDenyReason =
51
+ type RemoteSkillDenyReason =
58
52
  | "clawhub_suspicious"
59
53
  | "clawhub_malware_blocked"
60
54
  | "clawhub_moderation_missing"
61
55
  | "skillssh_risk_exceeds_threshold";
62
56
 
63
- export type RemoteSkillInstallDecision =
57
+ type RemoteSkillInstallDecision =
64
58
  | { ok: true }
65
59
  | { ok: false; reason: RemoteSkillDenyReason };
66
60
 
@@ -1,5 +1,5 @@
1
1
  import type { SlimSkillResponse } from "../daemon/message-types/skills.js";
2
- import type { SkillFileEntry } from "./catalog-files.js";
2
+ import type { SkillFileEntry } from "./skill-file-types.js";
3
3
 
4
4
  /**
5
5
  * A file provider can resolve file listings and single-file content for
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Types extracted from catalog-files.ts to break the
3
+ * catalog-files ↔ skill-file-provider cycle.
4
+ */
5
+
6
+ export interface SkillFileEntry {
7
+ path: string; // relative to skill directory root (e.g. "SKILL.md", "tools/foo.ts")
8
+ name: string; // basename
9
+ size: number;
10
+ mimeType: string;
11
+ isBinary: boolean;
12
+ content: string | null; // inline text if ≤ 2 MB and text MIME, else null
13
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Audit types for SkillSSH partner security analysis.
3
+ *
4
+ * Extracted as a leaf module so daemon message types can reference
5
+ * PartnerAudit without pulling in the full skillssh-registry module
6
+ * (which transitively imports cli/program and the entire CLI graph).
7
+ */
8
+
9
+ export type RiskLevel =
10
+ | "safe"
11
+ | "low"
12
+ | "medium"
13
+ | "high"
14
+ | "critical"
15
+ | "unknown";
16
+
17
+ export interface PartnerAudit {
18
+ risk: RiskLevel;
19
+ alerts?: number;
20
+ score?: number;
21
+ analyzedAt: string;
22
+ }
23
+
24
+ /** Map from audit provider name (e.g. "ath", "socket", "snyk") to audit data */
25
+ export type SkillAuditData = Record<string, PartnerAudit>;
26
+
27
+ /** Map from skill slug to per-provider audit data */
28
+ export type AuditResponse = Record<string, SkillAuditData>;
@@ -6,6 +6,14 @@ import { dirname, join, resolve, sep } from "node:path";
6
6
  import { getWorkspaceSkillsDir } from "../util/platform.js";
7
7
  import { upsertSkillsIndex } from "./catalog-install.js";
8
8
  import { computeSkillHash, writeInstallMeta } from "./install-meta.js";
9
+ import type {
10
+ AuditResponse,
11
+ PartnerAudit,
12
+ RiskLevel,
13
+ SkillAuditData,
14
+ } from "./skillssh-audit-types.js";
15
+
16
+ export type { AuditResponse, PartnerAudit, RiskLevel, SkillAuditData };
9
17
 
10
18
  // ─── Types ───────────────────────────────────────────────────────────────────
11
19
 
@@ -17,27 +25,6 @@ export interface SkillsShSearchResult {
17
25
  source: string; // e.g. "vercel-labs/agent-skills"
18
26
  }
19
27
 
20
- export type RiskLevel =
21
- | "safe"
22
- | "low"
23
- | "medium"
24
- | "high"
25
- | "critical"
26
- | "unknown";
27
-
28
- export interface PartnerAudit {
29
- risk: RiskLevel;
30
- alerts?: number;
31
- score?: number;
32
- analyzedAt: string;
33
- }
34
-
35
- /** Map from audit provider name (e.g. "ath", "socket", "snyk") to audit data */
36
- export type SkillAuditData = Record<string, PartnerAudit>;
37
-
38
- /** Map from skill slug to per-provider audit data */
39
- export type AuditResponse = Record<string, SkillAuditData>;
40
-
41
28
  export interface ResolvedSkillSource {
42
29
  owner: string;
43
30
  repo: string;
@@ -1,11 +1,5 @@
1
1
  export { mergeSkillIds } from "./manager.js";
2
- export type {
3
- SubagentConfig,
4
- SubagentRole,
5
- SubagentRoleConfig,
6
- SubagentState,
7
- SubagentStatus,
8
- } from "./types.js";
2
+ export type { SubagentRole } from "./types.js";
9
3
  export { SUBAGENT_ROLE_REGISTRY, TERMINAL_STATUSES } from "./types.js";
10
4
 
11
5
  import { SubagentManager } from "./manager.js";
@@ -11,10 +11,7 @@
11
11
  import { v4 as uuid } from "uuid";
12
12
 
13
13
  import { getConfig } from "../config/loader.js";
14
- import {
15
- Conversation,
16
- type ConversationMemoryPolicy,
17
- } from "../daemon/conversation.js";
14
+ import { Conversation } from "../daemon/conversation.js";
18
15
  import { findConversation } from "../daemon/conversation-store.js";
19
16
  import type { ServerMessage } from "../daemon/message-protocol.js";
20
17
  import { bootstrapConversation } from "../memory/conversation-bootstrap.js";
@@ -231,16 +228,6 @@ export class SubagentManager {
231
228
  const maxTokens = appConfig.llm.default.maxTokens;
232
229
  const workingDir = getSandboxWorkingDir();
233
230
 
234
- const memoryPolicy: ConversationMemoryPolicy = isFork
235
- ? {
236
- scopeId: "default",
237
- includeDefaultFallback: false,
238
- }
239
- : {
240
- scopeId: `subagent:${subagentId}`,
241
- includeDefaultFallback: true,
242
- };
243
-
244
231
  // ── Initialise state ────────────────────────────────────────────
245
232
  const now = Date.now();
246
233
  // For forks, default sendResultToUser to false (silent) unless explicitly true.
@@ -289,7 +276,6 @@ export class SubagentManager {
289
276
  maxTokens,
290
277
  wrappedSendToClient,
291
278
  workingDir,
292
- memoryPolicy,
293
279
  undefined, // sharedCesClient
294
280
  undefined, // speedOverride
295
281
  "5m", // cacheTtl — subagents run tight tool-use loops, 5m is always hot
@@ -67,7 +67,6 @@ export async function runTask(
67
67
 
68
68
  updateTaskRun(run.id, {
69
69
  conversationId: conversation.id,
70
- memoryScopeId: `task:${task.id}`,
71
70
  });
72
71
 
73
72
  try {
@@ -27,7 +27,6 @@ export interface TaskRun {
27
27
  finishedAt: number | null;
28
28
  error: string | null;
29
29
  principalId: string | null;
30
- memoryScopeId: string | null;
31
30
  createdAt: number;
32
31
  }
33
32
 
@@ -109,7 +108,6 @@ export function createTaskRun(taskId: string): TaskRun {
109
108
  finishedAt: null,
110
109
  error: null,
111
110
  principalId: null,
112
- memoryScopeId: null,
113
111
  createdAt: now,
114
112
  };
115
113
  db.insert(taskRuns).values(run).run();
@@ -125,7 +123,6 @@ export function updateTaskRun(
125
123
  | "conversationId"
126
124
  | "error"
127
125
  | "principalId"
128
- | "memoryScopeId"
129
126
  | "startedAt"
130
127
  | "finishedAt"
131
128
  >
@@ -21,6 +21,8 @@ export interface LlmUsageTelemetryEvent extends TelemetryEventBase {
21
21
  llm_call_site: LLMCallSite | null;
22
22
  inference_profile: string | null;
23
23
  inference_profile_source: UsageAttributionProfileSource | null;
24
+ /** Computed estimated cost in USD for this LLM call. Null when pricing data is unavailable. */
25
+ cost: number | null;
24
26
  }
25
27
 
26
28
  /** Turn event — one per user message. */
@@ -389,6 +389,7 @@ describe("UsageTelemetryReporter", () => {
389
389
  expect(e.llm_call_site).toBe("compactionAgent");
390
390
  expect(e.inference_profile).toBe("quality-optimized");
391
391
  expect(e.inference_profile_source).toBe("conversation");
392
+ expect(e.cost).toBe(0.001);
392
393
  expect(e.recorded_at).toBe(1700000099000);
393
394
  });
394
395
 
@@ -419,6 +420,26 @@ describe("UsageTelemetryReporter", () => {
419
420
  });
420
421
  });
421
422
 
423
+ test("cost is null when estimatedCostUsd is null (unpriced event)", async () => {
424
+ const event = makeUsageEvent({
425
+ id: "evt-unpriced",
426
+ estimatedCostUsd: null,
427
+ pricingStatus: "unpriced",
428
+ });
429
+ mockQueryUnreportedUsageEvents.mockReturnValue([event]);
430
+ mockFetch.mockImplementation(() =>
431
+ Promise.resolve(new Response('{"accepted":1}', { status: 200 })),
432
+ );
433
+
434
+ const reporter = new UsageTelemetryReporter();
435
+ await reporter.flush();
436
+
437
+ const body = JSON.parse(
438
+ (mockFetch.mock.calls[0] as [string, RequestInit])[1].body as string,
439
+ );
440
+ expect(body.events[0].cost).toBeNull();
441
+ });
442
+
422
443
  test("organization_id and user_id included in payload when available", async () => {
423
444
  mockGetPlatformOrganizationId.mockReturnValue("org-123");
424
445
  mockGetPlatformUserId.mockReturnValue("user-456");
@@ -194,6 +194,7 @@ export class UsageTelemetryReporter {
194
194
  llm_call_site: e.callSite,
195
195
  inference_profile: e.inferenceProfile,
196
196
  inference_profile_source: e.inferenceProfileSource,
197
+ cost: e.estimatedCostUsd ?? null,
197
198
  recorded_at: e.createdAt,
198
199
  }),
199
200
  ),
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Shared helper for app-control skill wrapper scripts.
3
+ *
4
+ * Each wrapper calls forwardAppControlProxyTool() to delegate execution to
5
+ * the proxy resolver, which forwards the call to the connected client.
6
+ */
7
+
8
+ import type { ToolContext, ToolExecutionResult } from "../types.js";
9
+
10
+ /**
11
+ * Forward an app-control proxy tool call through the context's proxyToolResolver.
12
+ *
13
+ * Returns a clear error result if the resolver is missing (e.g. when the tool
14
+ * is invoked outside a session with a connected client).
15
+ */
16
+ export function forwardAppControlProxyTool(
17
+ toolName: string,
18
+ input: Record<string, unknown>,
19
+ context: ToolContext,
20
+ ): Promise<ToolExecutionResult> {
21
+ if (!context.proxyToolResolver) {
22
+ return Promise.resolve({
23
+ content: `Cannot execute ${toolName}: no proxy resolver available. This tool requires a connected client.`,
24
+ isError: true,
25
+ });
26
+ }
27
+ return context.proxyToolResolver(toolName, input);
28
+ }
@@ -42,7 +42,6 @@ export interface AppStoreWriter {
42
42
  icon?: string;
43
43
  schemaJson: string;
44
44
  htmlDefinition: string;
45
- pages?: Record<string, string>;
46
45
  formatVersion?: number;
47
46
  }): AppDefinition;
48
47
  updateApp(
@@ -77,12 +76,16 @@ export interface AppCreateInput {
77
76
  name: string;
78
77
  description?: string;
79
78
  schema_json?: string;
80
- html?: string;
81
- pages?: Record<string, string>;
79
+ /**
80
+ * Retired single-file shortcut. Kept in the type so legacy or stale callers
81
+ * get a clear tool error instead of silently creating a v2 app with stale
82
+ * scaffold content.
83
+ */
84
+ html?: unknown;
85
+ /** Retired single-file multi-page shortcut. */
86
+ pages?: unknown;
82
87
  auto_open?: boolean;
83
88
  preview?: Record<string, unknown>;
84
- /** When provided, controls multifile scaffold behavior. */
85
- featureFlags?: { multifileEnabled: boolean };
86
89
  }
87
90
 
88
91
  export async function executeAppCreate(
@@ -93,22 +96,26 @@ export async function executeAppCreate(
93
96
  const name = input.name;
94
97
  const description = input.description;
95
98
  const schemaJson = input.schema_json ?? "{}";
96
- // Default to a minimal scaffold only when html is truly omitted; reject
97
- // invalid types (e.g. object/number) so malformed tool calls surface errors.
98
- let htmlDefinition: string;
99
- if (typeof input.html === "string") {
100
- htmlDefinition = input.html;
101
- } else if (input.html == null) {
102
- htmlDefinition = "<!DOCTYPE html><html><head></head><body></body></html>";
103
- } else {
99
+
100
+ if (Object.prototype.hasOwnProperty.call(input, "html")) {
104
101
  return {
105
102
  content: JSON.stringify({
106
- error: `html must be a string, got ${typeof input.html}`,
103
+ error:
104
+ "app_create no longer accepts html. Create the app scaffold, write src/index.html and src/main.tsx with file_write, then call app_refresh.",
105
+ }),
106
+ isError: true,
107
+ };
108
+ }
109
+
110
+ if (Object.prototype.hasOwnProperty.call(input, "pages")) {
111
+ return {
112
+ content: JSON.stringify({
113
+ error:
114
+ "app_create no longer accepts pages. Build multi-file TSX apps under src/ and route inside the Preact app instead.",
107
115
  }),
108
116
  isError: true,
109
117
  };
110
118
  }
111
- const pages = input.pages;
112
119
  const autoOpen = input.auto_open !== false; // default true
113
120
  const preview = input.preview;
114
121
 
@@ -121,49 +128,30 @@ export async function executeAppCreate(
121
128
  isError: true,
122
129
  };
123
130
  }
124
- if (pages) {
125
- for (const [filename, content] of Object.entries(pages)) {
126
- if (typeof content !== "string") {
127
- return {
128
- content: JSON.stringify({
129
- error: `pages["${filename}"] must be a string, got ${typeof content}`,
130
- }),
131
- isError: true,
132
- };
133
- }
134
- }
135
- }
136
131
 
137
132
  // Extract icon from preview if provided - only persist emoji-like values,
138
133
  // not URLs which would render as raw strings in UI and bundle manifests.
139
134
  const rawIcon = preview?.icon as string | undefined;
140
135
  const icon = rawIcon && !rawIcon.startsWith("http") ? rawIcon : undefined;
141
136
 
142
- const multifileEnabled = input.featureFlags?.multifileEnabled === true;
143
-
144
137
  const app = store.createApp({
145
138
  name,
146
139
  description,
147
140
  icon,
148
141
  schemaJson,
149
- htmlDefinition: multifileEnabled ? "" : htmlDefinition,
150
- pages: multifileEnabled ? undefined : pages,
151
- formatVersion: multifileEnabled ? 2 : undefined,
142
+ htmlDefinition: "",
143
+ formatVersion: 2,
152
144
  });
153
145
 
154
146
  // Scaffold multifile app with src/ files and compile to dist/
155
- if (multifileEnabled) {
156
- const htmlSafeName = name
157
- .replace(/&/g, "&amp;")
158
- .replace(/</g, "&lt;")
159
- .replace(/>/g, "&gt;")
160
- .replace(/"/g, "&quot;");
161
- const jsxSafeName = name.replace(/[<>{}&"']/g, "");
162
-
163
- const indexHtml =
164
- typeof input.html === "string"
165
- ? input.html
166
- : `<!DOCTYPE html>
147
+ const htmlSafeName = name
148
+ .replace(/&/g, "&amp;")
149
+ .replace(/</g, "&lt;")
150
+ .replace(/>/g, "&gt;")
151
+ .replace(/"/g, "&quot;");
152
+ const jsxSafeName = name.replace(/[<>{}&"']/g, "");
153
+
154
+ const indexHtml = `<!DOCTYPE html>
167
155
  <html lang="en">
168
156
  <head>
169
157
  <meta charset="UTF-8">
@@ -175,7 +163,7 @@ export async function executeAppCreate(
175
163
  </body>
176
164
  </html>`;
177
165
 
178
- const mainTsx = `import { render } from 'preact';
166
+ const mainTsx = `import { render } from 'preact';
179
167
 
180
168
  function App() {
181
169
  return <div>{"Hello, ${jsxSafeName}!"}</div>;
@@ -184,31 +172,30 @@ function App() {
184
172
  render(<App />, document.getElementById('app')!);
185
173
  `;
186
174
 
187
- // Only write scaffold files when they don't already exist on disk.
188
- // The LLM may have written custom source files via file_write before
189
- // calling app_create, and overwriting them would destroy the real app
190
- // content, leaving only the scaffold placeholder.
191
- if (!store.appFileExists(app.id, "src/index.html")) {
192
- store.writeAppFile(app.id, "src/index.html", indexHtml);
193
- }
194
- if (!store.appFileExists(app.id, "src/main.tsx")) {
195
- store.writeAppFile(app.id, "src/main.tsx", mainTsx);
196
- }
175
+ // Only write scaffold files when they don't already exist on disk.
176
+ // The LLM may have written custom source files via file_write before
177
+ // calling app_create, and overwriting them would destroy the real app
178
+ // content, leaving only the scaffold placeholder.
179
+ if (!store.appFileExists(app.id, "src/index.html")) {
180
+ store.writeAppFile(app.id, "src/index.html", indexHtml);
181
+ }
182
+ if (!store.appFileExists(app.id, "src/main.tsx")) {
183
+ store.writeAppFile(app.id, "src/main.tsx", mainTsx);
184
+ }
197
185
 
198
- // Compile src/ → dist/
199
- const appDir = getAppDirPath(app.id);
200
- const compileResult = await compileApp(appDir);
201
- if (!compileResult.ok) {
202
- return {
203
- content: JSON.stringify({
204
- ...app,
205
- compile_errors: compileResult.errors,
206
- compile_warnings: compileResult.warnings,
207
- compile_duration_ms: compileResult.durationMs,
208
- }),
209
- isError: false,
210
- };
211
- }
186
+ // Compile src/ → dist/
187
+ const appDir = getAppDirPath(app.id);
188
+ const compileResult = await compileApp(appDir);
189
+ if (!compileResult.ok) {
190
+ return {
191
+ content: JSON.stringify({
192
+ ...app,
193
+ compile_errors: compileResult.errors,
194
+ compile_warnings: compileResult.warnings,
195
+ compile_duration_ms: compileResult.durationMs,
196
+ }),
197
+ isError: false,
198
+ };
212
199
  }
213
200
 
214
201
  // Emit the inline preview card via the proxy without opening a workspace panel.
@@ -19,7 +19,7 @@ export interface BackgroundTool {
19
19
  command: string;
20
20
  startedAt: number;
21
21
  /** Kills the process (bash) or aborts the proxy (host_bash). */
22
- cancel: () => void;
22
+ cancel: (reason?: string) => void;
23
23
  }
24
24
 
25
25
  /** Maximum number of concurrent background tools allowed. */
@@ -61,16 +61,30 @@ export function listBackgroundTools(conversationId?: string): BackgroundTool[] {
61
61
  * Cancels a background tool by ID: calls `tool.cancel()`, removes the entry,
62
62
  * and returns `true`. Returns `false` if the ID is not found.
63
63
  */
64
- export function cancelBackgroundTool(id: string): boolean {
64
+ export function cancelBackgroundTool(id: string, reason?: string): boolean {
65
65
  const tool = registry.get(id);
66
66
  if (!tool) {
67
67
  return false;
68
68
  }
69
- tool.cancel();
69
+ tool.cancel(reason);
70
70
  registry.delete(id);
71
71
  return true;
72
72
  }
73
73
 
74
+ export function cancelBackgroundTools(
75
+ shouldCancel: (tool: BackgroundTool) => boolean,
76
+ reason?: string,
77
+ ): BackgroundTool[] {
78
+ const cancelled: BackgroundTool[] = [];
79
+ for (const tool of Array.from(registry.values())) {
80
+ if (!shouldCancel(tool)) continue;
81
+ tool.cancel(reason);
82
+ registry.delete(tool.id);
83
+ cancelled.push(tool);
84
+ }
85
+ return cancelled;
86
+ }
87
+
74
88
  /**
75
89
  * Generates a short prefixed ID for a background tool.
76
90
  * Format: `bg-<8 hex chars>` (e.g. `bg-a1b2c3d4`).
@@ -85,11 +85,13 @@ mock.module("../browser-manager.js", () => ({
85
85
  /** Mutable proxy returned by HostBrowserProxy.instance. */
86
86
  let mockSingletonProxy: {
87
87
  isAvailable: () => boolean;
88
+ hasExtensionClient: () => boolean;
88
89
  request: unknown;
89
90
  } | null = null;
90
91
 
91
92
  const unavailableFallback = {
92
93
  isAvailable: () => false,
94
+ hasExtensionClient: () => false,
93
95
  request: () => Promise.reject(new Error("no extension")),
94
96
  };
95
97
 
@@ -159,7 +161,7 @@ describe("executeBrowserStatus", () => {
159
161
  });
160
162
 
161
163
  test("reports extension as connected when probe fails on restricted chrome:// page", async () => {
162
- mockSingletonProxy = { isAvailable: () => true, request: () => {} };
164
+ mockSingletonProxy = { isAvailable: () => true, hasExtensionClient: () => true, request: () => {} };
163
165
  probeOutcomes[BROWSER_STATUS_MODE.EXTENSION] = "fail";
164
166
  probeErrors[BROWSER_STATUS_MODE.EXTENSION] = new CdpError(
165
167
  "cdp_error",
@@ -181,7 +183,7 @@ describe("executeBrowserStatus", () => {
181
183
  // ── macOS host-browser proxy mode tests ─────────────────────────────
182
184
 
183
185
  test("reports extension as available when singleton proxy is connected", async () => {
184
- mockSingletonProxy = { isAvailable: () => true, request: () => {} };
186
+ mockSingletonProxy = { isAvailable: () => true, hasExtensionClient: () => true, request: () => {} };
185
187
  const result = await executeBrowserStatus(
186
188
  {},
187
189
  makeContext({
@@ -199,22 +201,23 @@ describe("executeBrowserStatus", () => {
199
201
  expect(extension.details.transport).toBe("extension-ws");
200
202
  });
201
203
 
202
- test("reports extension disconnected when singleton proxy is not available", async () => {
203
- // mockSingletonProxy = null → falls back to unavailableFallback
204
- const result = await executeBrowserStatus({}, makeContext());
205
- expect(result.isError).toBe(false);
206
- const payload = JSON.parse(result.content);
207
- const extension = payload.modes.find(
208
- (m: { mode: string }) => m.mode === BROWSER_STATUS_MODE.EXTENSION,
209
- );
210
- expect(extension).toBeDefined();
211
- expect(extension.available).toBe(false);
212
- expect(extension.summary).toContain("disconnected");
213
- expect(extension.details.transport).toBe("extension-ws");
214
- });
204
+ test("reports extension unavailable when no Chrome Extension is connected", async () => {
205
+ // mockSingletonProxy = null → falls back to unavailableFallback (hasExtensionClient = false)
206
+ const result = await executeBrowserStatus({}, makeContext());
207
+ expect(result.isError).toBe(false);
208
+ const payload = JSON.parse(result.content);
209
+ const extension = payload.modes.find(
210
+ (m: { mode: string }) => m.mode === BROWSER_STATUS_MODE.EXTENSION,
211
+ );
212
+ expect(extension).toBeDefined();
213
+ expect(extension.available).toBe(false);
214
+ expect(extension.summary).toContain("no Chrome Extension is connected");
215
+ expect(extension.verified).toBe("preflight");
216
+ expect(extension.details.transport).toBe("extension-ws");
217
+ });
215
218
 
216
219
  test("probe failure diagnostics include remediation actions", async () => {
217
- mockSingletonProxy = { isAvailable: () => true, request: () => {} };
220
+ mockSingletonProxy = { isAvailable: () => true, hasExtensionClient: () => true, request: () => {} };
218
221
  probeOutcomes[BROWSER_STATUS_MODE.EXTENSION] = "fail";
219
222
  probeErrors[BROWSER_STATUS_MODE.EXTENSION] = new CdpError(
220
223
  "transport_error",
@@ -233,7 +236,7 @@ describe("executeBrowserStatus", () => {
233
236
  });
234
237
 
235
238
  test("recommendation order follows auto candidate precedence with available extension", async () => {
236
- mockSingletonProxy = { isAvailable: () => true, request: () => {} };
239
+ mockSingletonProxy = { isAvailable: () => true, hasExtensionClient: () => true, request: () => {} };
237
240
  const result = await executeBrowserStatus({}, makeContext());
238
241
  expect(result.isError).toBe(false);
239
242
  const payload = JSON.parse(result.content);
@@ -252,7 +255,7 @@ describe("executeBrowserStatus", () => {
252
255
  });
253
256
 
254
257
  test("restricted chrome:// page probe includes transport details", async () => {
255
- mockSingletonProxy = { isAvailable: () => true, request: () => {} };
258
+ mockSingletonProxy = { isAvailable: () => true, hasExtensionClient: () => true, request: () => {} };
256
259
  probeOutcomes[BROWSER_STATUS_MODE.EXTENSION] = "fail";
257
260
  probeErrors[BROWSER_STATUS_MODE.EXTENSION] = new CdpError(
258
261
  "cdp_error",
@@ -2251,14 +2251,14 @@ async function checkExtensionModeStatus(
2251
2251
  ): Promise<BrowserStatusModeResult> {
2252
2252
  const proxy = HostBrowserProxy.instance;
2253
2253
 
2254
- if (!proxy.isAvailable()) {
2254
+ if (!proxy.hasExtensionClient()) {
2255
2255
  return {
2256
2256
  mode: BROWSER_STATUS_MODE.EXTENSION,
2257
2257
  available: false,
2258
2258
  verified: "preflight",
2259
2259
  autoCandidate,
2260
2260
  summary:
2261
- "Extension mode is unavailable: the extension transport is currently disconnected.",
2261
+ "Extension mode is unavailable: no Chrome Extension is connected.",
2262
2262
  userActions: extensionSetupActions(),
2263
2263
  tradeoffs: modeTradeoffs(BROWSER_STATUS_MODE.EXTENSION),
2264
2264
  details: { transport: "extension-ws" },