@vellumai/assistant 0.8.4 → 0.8.5

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 (438) hide show
  1. package/ARCHITECTURE.md +2 -2
  2. package/docs/browser-use-architecture-phase2.md +1 -1
  3. package/knip.json +2 -1
  4. package/openapi.yaml +809 -11
  5. package/package.json +1 -1
  6. package/src/__tests__/anthropic-provider.test.ts +34 -37
  7. package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
  8. package/src/__tests__/assistant-feature-flags-integration.test.ts +3 -3
  9. package/src/__tests__/audit-log-rotation.test.ts +70 -16
  10. package/src/__tests__/background-workers-disk-pressure.test.ts +3 -3
  11. package/src/__tests__/btw-routes.test.ts +2 -3
  12. package/src/__tests__/call-controller.test.ts +0 -1
  13. package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
  14. package/src/__tests__/channel-guardian.test.ts +3 -3
  15. package/src/__tests__/checker.test.ts +6 -15
  16. package/src/__tests__/compaction-events.test.ts +1 -0
  17. package/src/__tests__/compactor-call-site-logging.test.ts +214 -0
  18. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +5 -11
  19. package/src/__tests__/computer-use-tools.test.ts +2 -4
  20. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  21. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -1
  22. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -1
  23. package/src/__tests__/conversation-agent-loop-overflow.test.ts +197 -2
  24. package/src/__tests__/conversation-agent-loop.test.ts +163 -122
  25. package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -5
  26. package/src/__tests__/conversation-clear-safety.test.ts +25 -25
  27. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
  28. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
  29. package/src/__tests__/conversation-error.test.ts +31 -0
  30. package/src/__tests__/conversation-fork-crud.test.ts +178 -15
  31. package/src/__tests__/conversation-lifecycle.test.ts +52 -11
  32. package/src/__tests__/{conversation-load-cleaned-at.test.ts → conversation-load-history-stripped.test.ts} +13 -13
  33. package/src/__tests__/conversation-provider-retry-repair.test.ts +1 -0
  34. package/src/__tests__/conversation-routes-disk-view.test.ts +109 -0
  35. package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -0
  36. package/src/__tests__/conversation-skill-tools.test.ts +2 -5
  37. package/src/__tests__/conversation-store.test.ts +1 -1
  38. package/src/__tests__/conversation-sync-tags.test.ts +99 -32
  39. package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -0
  40. package/src/__tests__/conversation-workspace-injection.test.ts +1 -1
  41. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
  42. package/src/__tests__/credential-execution-feature-gates.test.ts +9 -7
  43. package/src/__tests__/credential-execution-tools.test.ts +6 -6
  44. package/src/__tests__/credential-security-invariants.test.ts +1 -0
  45. package/src/__tests__/credential-vault-unit.test.ts +2 -2
  46. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  47. package/src/__tests__/email-html-renderer.test.ts +12 -0
  48. package/src/__tests__/gateway-flag-listener.test.ts +237 -0
  49. package/src/__tests__/gemini-provider.test.ts +78 -0
  50. package/src/__tests__/guardian-dispatch.test.ts +0 -1
  51. package/src/__tests__/guardian-outbound-http.test.ts +7 -5
  52. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
  53. package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
  54. package/src/__tests__/heartbeat-service.test.ts +4 -0
  55. package/src/__tests__/host-shell-tool.test.ts +1 -1
  56. package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
  57. package/src/__tests__/list-messages-tool-merge.test.ts +70 -11
  58. package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
  59. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
  60. package/src/__tests__/llm-resolver.test.ts +77 -9
  61. package/src/__tests__/llm-usage-store.test.ts +66 -0
  62. package/src/__tests__/logger.test.ts +89 -0
  63. package/src/__tests__/mcp-abort-signal.test.ts +2 -2
  64. package/src/__tests__/media-generate-image.test.ts +31 -0
  65. package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
  66. package/src/__tests__/model-intents.test.ts +2 -4
  67. package/src/__tests__/notification-guardian-path.test.ts +0 -1
  68. package/src/__tests__/onboarding-template-contract.test.ts +1 -1
  69. package/src/__tests__/openai-provider.test.ts +46 -0
  70. package/src/__tests__/openai-responses-provider.test.ts +114 -12
  71. package/src/__tests__/pending-interactions-resolved-event.test.ts +0 -1
  72. package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
  73. package/src/__tests__/platform.test.ts +2 -2
  74. package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
  75. package/src/__tests__/plugin-bootstrap.test.ts +2 -2
  76. package/src/__tests__/plugin-tool-contribution.test.ts +13 -6
  77. package/src/__tests__/plugin-types.test.ts +3 -2
  78. package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
  79. package/src/__tests__/pricing.test.ts +12 -0
  80. package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
  81. package/src/__tests__/registry.test.ts +2 -8
  82. package/src/__tests__/require-fresh-approval.test.ts +2 -2
  83. package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
  84. package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
  85. package/src/__tests__/skill-feature-flags.test.ts +2 -2
  86. package/src/__tests__/skill-projection-feature-flag.test.ts +4 -7
  87. package/src/__tests__/skill-projection.benchmark.test.ts +2 -6
  88. package/src/__tests__/skill-tool-factory.test.ts +1 -1
  89. package/src/__tests__/subagent-notify-parent.test.ts +1 -1
  90. package/src/__tests__/suggestion-routes.test.ts +1 -0
  91. package/src/__tests__/sync-message-contract.test.ts +59 -0
  92. package/src/__tests__/system-prompt.test.ts +145 -131
  93. package/src/__tests__/terminal-tools.test.ts +1 -1
  94. package/src/__tests__/tool-approval-handler.test.ts +1 -5
  95. package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
  96. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
  97. package/src/__tests__/tool-executor-lifecycle-events.test.ts +15 -5
  98. package/src/__tests__/tool-executor.test.ts +9 -62
  99. package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
  100. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  101. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
  102. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  103. package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
  104. package/src/__tests__/usage-routes.test.ts +3 -0
  105. package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
  106. package/src/__tests__/workspace-git-service.test.ts +6 -5
  107. package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
  108. package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
  109. package/src/acp/prepare-agent-env.ts +78 -0
  110. package/src/acp/session-manager.ts +1 -1
  111. package/src/agent/loop.ts +8 -0
  112. package/src/api/README.md +5 -0
  113. package/src/api/index.ts +4 -0
  114. package/src/api/package.json +10 -0
  115. package/src/background-wake/background-wake-routes.test.ts +233 -0
  116. package/src/background-wake/runtime-registry.ts +24 -0
  117. package/src/cli/commands/__tests__/browser.test.ts +23 -5
  118. package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
  119. package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
  120. package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
  121. package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
  122. package/src/cli/commands/__tests__/memory-v2.test.ts +1 -0
  123. package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
  124. package/src/cli/commands/browser.ts +247 -0
  125. package/src/cli/commands/domain.ts +91 -41
  126. package/src/cli/commands/inference.ts +93 -40
  127. package/src/cli/commands/memory-v2-compare-render.ts +115 -0
  128. package/src/cli/commands/memory-v2.ts +176 -1
  129. package/src/cli/commands/memory-v3-render.ts +344 -0
  130. package/src/cli/commands/memory-v3.ts +316 -0
  131. package/src/cli/program.ts +2 -0
  132. package/src/config/assistant-feature-flags.ts +21 -9
  133. package/src/config/bundled-skills/document-editor/SKILL.md +11 -2
  134. package/src/config/bundled-skills/document-editor/TOOLS.json +18 -0
  135. package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
  136. package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
  137. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
  138. package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
  139. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
  140. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
  141. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
  142. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
  143. package/src/config/bundled-tool-registry.ts +2 -0
  144. package/src/config/call-site-defaults.ts +7 -6
  145. package/src/config/feature-flag-registry.json +16 -0
  146. package/src/config/schemas/__tests__/memory-v2.test.ts +213 -1
  147. package/src/config/schemas/call-site-catalog.ts +21 -7
  148. package/src/config/schemas/llm.ts +12 -1
  149. package/src/config/schemas/memory-v2.ts +246 -0
  150. package/src/config/schemas/memory.ts +2 -1
  151. package/src/context/compactor.ts +52 -0
  152. package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
  153. package/src/conversations/message-consolidation.ts +404 -0
  154. package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -1
  155. package/src/daemon/__tests__/meet-manifest-loader.test.ts +1 -1
  156. package/src/daemon/conversation-agent-loop-handlers.ts +2 -13
  157. package/src/daemon/conversation-agent-loop.ts +126 -76
  158. package/src/daemon/conversation-error.ts +31 -1
  159. package/src/daemon/conversation-lifecycle.ts +27 -22
  160. package/src/daemon/conversation-runtime-assembly.ts +10 -9
  161. package/src/daemon/conversation-tool-setup.ts +63 -3
  162. package/src/daemon/conversation-usage.ts +2 -0
  163. package/src/daemon/conversation.ts +14 -29
  164. package/src/daemon/disk-pressure-guard.ts +14 -2
  165. package/src/daemon/handlers/config-model.test.ts +1 -0
  166. package/src/daemon/handlers/conversations.ts +11 -3
  167. package/src/daemon/host-browser-proxy.ts +5 -5
  168. package/src/daemon/host-cu-proxy.ts +4 -4
  169. package/src/daemon/host-file-proxy.ts +4 -4
  170. package/src/daemon/host-proxy-base.ts +4 -4
  171. package/src/daemon/host-transfer-proxy.ts +10 -10
  172. package/src/daemon/lifecycle.ts +23 -20
  173. package/src/daemon/meet-manifest-loader.ts +1 -7
  174. package/src/daemon/message-types/conversations.ts +6 -9
  175. package/src/daemon/message-types/home.ts +1 -13
  176. package/src/daemon/message-types/messages.ts +6 -14
  177. package/src/daemon/message-types/sync.ts +14 -0
  178. package/src/daemon/shutdown-handlers.ts +24 -5
  179. package/src/daemon/switch-inference-profile-tool.ts +52 -0
  180. package/src/daemon/tool-setup-types.ts +13 -0
  181. package/src/events/relationship-state-updated.ts +25 -0
  182. package/src/heartbeat/__tests__/heartbeat-service.test.ts +1 -1
  183. package/src/home/home-greeting.ts +0 -9
  184. package/src/home/suggested-prompts.ts +0 -9
  185. package/src/ipc/gateway-flag-listener.ts +123 -0
  186. package/src/ipc/skill-routes/registries.ts +8 -12
  187. package/src/memory/__tests__/db-async-query.test.ts +165 -0
  188. package/src/memory/__tests__/db-maintenance.test.ts +115 -0
  189. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +241 -0
  190. package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
  191. package/src/memory/__tests__/memory-retrospective-job.test.ts +7 -0
  192. package/src/memory/auto-analysis-enqueue.ts +5 -1
  193. package/src/memory/conversation-crud.ts +71 -70
  194. package/src/memory/conversation-starters-cadence.ts +3 -1
  195. package/src/memory/conversation-title-service.ts +19 -3
  196. package/src/memory/db-async-query.ts +214 -0
  197. package/src/memory/db-init.ts +10 -0
  198. package/src/memory/db-maintenance.ts +30 -21
  199. package/src/memory/graph/bootstrap.ts +8 -1
  200. package/src/memory/graph/capability-seed.ts +7 -3
  201. package/src/memory/graph/conversation-graph-memory.ts +100 -17
  202. package/src/memory/graph/extraction.ts +1 -5
  203. package/src/memory/graph/graph-search.ts +7 -1
  204. package/src/memory/indexer.ts +28 -18
  205. package/src/memory/job-handlers/cleanup.ts +76 -18
  206. package/src/memory/job-handlers/conversation-starters.ts +1 -4
  207. package/src/memory/jobs/embed-pkb-file.ts +6 -1
  208. package/src/memory/jobs-store.ts +14 -0
  209. package/src/memory/jobs-worker.ts +55 -22
  210. package/src/memory/llm-request-log-source-clickhouse.ts +42 -2
  211. package/src/memory/llm-request-log-source-local.ts +7 -0
  212. package/src/memory/llm-request-log-source.ts +9 -2
  213. package/src/memory/llm-request-log-store.ts +43 -1
  214. package/src/memory/llm-usage-store.ts +24 -0
  215. package/src/memory/memory-retrospective-enqueue.ts +8 -1
  216. package/src/memory/memory-retrospective-job.ts +5 -0
  217. package/src/memory/memory-v2-activation-log-store.ts +15 -6
  218. package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
  219. package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
  220. package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
  221. package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
  222. package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
  223. package/src/memory/migrations/index.ts +17 -0
  224. package/src/memory/migrations/registry.ts +33 -0
  225. package/src/memory/schema/conversations.ts +1 -1
  226. package/src/memory/schema/infrastructure.ts +21 -0
  227. package/src/memory/tool-usage-store.ts +36 -8
  228. package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
  229. package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
  230. package/src/memory/v2/__tests__/harness-metrics.test.ts +74 -0
  231. package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
  232. package/src/memory/v2/__tests__/harness-replay-input.test.ts +225 -0
  233. package/src/memory/v2/__tests__/harness-runner.test.ts +109 -0
  234. package/src/memory/v2/__tests__/injection.test.ts +127 -98
  235. package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
  236. package/src/memory/v2/__tests__/router.test.ts +171 -3
  237. package/src/memory/v2/harness/compare.ts +57 -0
  238. package/src/memory/v2/harness/metrics.ts +124 -0
  239. package/src/memory/v2/harness/oracle.ts +145 -0
  240. package/src/memory/v2/harness/replay-input.ts +224 -0
  241. package/src/memory/v2/harness/retriever.ts +74 -0
  242. package/src/memory/v2/harness/router-retriever.ts +43 -0
  243. package/src/memory/v2/harness/runner.ts +106 -0
  244. package/src/memory/v2/harness/trace.ts +58 -0
  245. package/src/memory/v2/injection.ts +21 -15
  246. package/src/memory/v2/prompts/router.ts +26 -1
  247. package/src/memory/v2/qdrant.ts +14 -2
  248. package/src/memory/v2/router.ts +171 -18
  249. package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
  250. package/src/memory/v3/__tests__/consolidation-job.test.ts +468 -0
  251. package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
  252. package/src/memory/v3/__tests__/edges.test.ts +563 -0
  253. package/src/memory/v3/__tests__/filter.test.ts +512 -0
  254. package/src/memory/v3/__tests__/gate.test.ts +574 -0
  255. package/src/memory/v3/__tests__/index-composition.test.ts +233 -0
  256. package/src/memory/v3/__tests__/loop.test.ts +530 -0
  257. package/src/memory/v3/__tests__/retriever.test.ts +226 -0
  258. package/src/memory/v3/__tests__/scouts.test.ts +440 -0
  259. package/src/memory/v3/__tests__/shadow-middleware.test.ts +312 -0
  260. package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
  261. package/src/memory/v3/__tests__/traversal.test.ts +469 -0
  262. package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
  263. package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
  264. package/src/memory/v3/__tests__/tree-walk.test.ts +707 -0
  265. package/src/memory/v3/__tests__/validate.test.ts +245 -0
  266. package/src/memory/v3/auto-edges.ts +223 -0
  267. package/src/memory/v3/coactivation-store.ts +124 -0
  268. package/src/memory/v3/consolidation-job.ts +323 -0
  269. package/src/memory/v3/edge-learning-job.ts +160 -0
  270. package/src/memory/v3/edges.ts +249 -0
  271. package/src/memory/v3/filter.ts +281 -0
  272. package/src/memory/v3/gate.ts +334 -0
  273. package/src/memory/v3/index-composition.ts +113 -0
  274. package/src/memory/v3/llm-capture.ts +46 -0
  275. package/src/memory/v3/loop.ts +382 -0
  276. package/src/memory/v3/maintenance.ts +144 -0
  277. package/src/memory/v3/prompt-context.ts +33 -0
  278. package/src/memory/v3/prompts/consolidation.ts +458 -0
  279. package/src/memory/v3/prompts/system-prompts.ts +196 -0
  280. package/src/memory/v3/retriever.ts +33 -0
  281. package/src/memory/v3/scouts.ts +420 -0
  282. package/src/memory/v3/shadow-middleware.ts +305 -0
  283. package/src/memory/v3/traversal.ts +206 -0
  284. package/src/memory/v3/tree-index.ts +237 -0
  285. package/src/memory/v3/tree-store.ts +394 -0
  286. package/src/memory/v3/tree-walk.ts +351 -0
  287. package/src/memory/v3/types.ts +65 -0
  288. package/src/memory/v3/validate.ts +300 -0
  289. package/src/notifications/adapters/macos.ts +18 -1
  290. package/src/notifications/adapters/platform.ts +1 -1
  291. package/src/notifications/decision-engine.ts +1 -4
  292. package/src/notifications/emit-signal.ts +29 -49
  293. package/src/permissions/prompter.ts +3 -3
  294. package/src/permissions/question-prompter.ts +5 -2
  295. package/src/permissions/secret-prompter.ts +2 -2
  296. package/src/plugin-api/index.ts +4 -0
  297. package/src/plugin-api/types.ts +7 -33
  298. package/src/plugins/defaults/index.ts +6 -0
  299. package/src/plugins/defaults/injectors.ts +18 -11
  300. package/src/plugins/external-plugin-loader.ts +5 -68
  301. package/src/plugins/types.ts +11 -16
  302. package/src/proactive-artifact/aux-message-injector.ts +17 -4
  303. package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
  304. package/src/prompts/persona-resolver.ts +36 -21
  305. package/src/prompts/sections.ts +39 -7
  306. package/src/prompts/system-prompt.ts +50 -185
  307. package/src/prompts/templates/BOOTSTRAP.md +2 -2
  308. package/src/prompts/templates/system-sections.ts +230 -8
  309. package/src/providers/__tests__/connection-model-compat.test.ts +234 -0
  310. package/src/providers/__tests__/retry-callsite.test.ts +85 -5
  311. package/src/providers/anthropic/client.ts +32 -66
  312. package/src/providers/call-site-routing.ts +14 -2
  313. package/src/providers/connection-model-compat.ts +38 -0
  314. package/src/providers/connection-resolution.ts +16 -2
  315. package/src/providers/gemini/client.ts +49 -6
  316. package/src/providers/inference/adapter-factory.ts +3 -0
  317. package/src/providers/minimax/client.ts +106 -0
  318. package/src/providers/model-catalog.ts +43 -0
  319. package/src/providers/model-intents.ts +1 -1
  320. package/src/providers/openai/chat-completions-provider.ts +6 -3
  321. package/src/providers/openai/codex-models.ts +18 -0
  322. package/src/providers/openai/responses-provider.ts +78 -21
  323. package/src/providers/provider-send-message.ts +7 -1
  324. package/src/providers/retry.ts +34 -3
  325. package/src/providers/thinking-config.ts +26 -1
  326. package/src/providers/usage-tracking.ts +2 -0
  327. package/src/runtime/AGENTS.md +2 -2
  328. package/src/runtime/agent-wake.ts +1 -0
  329. package/src/runtime/assistant-event-hub.ts +76 -6
  330. package/src/runtime/auth/route-policy.ts +36 -0
  331. package/src/runtime/btw-sidechain.ts +0 -6
  332. package/src/runtime/http-types.ts +0 -2
  333. package/src/runtime/migrations/vbundle-builder.ts +10 -3
  334. package/src/runtime/pending-interactions.ts +0 -1
  335. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +106 -0
  336. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +25 -6
  337. package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
  338. package/src/runtime/routes/acp-routes.test.ts +255 -6
  339. package/src/runtime/routes/acp-routes.ts +8 -1
  340. package/src/runtime/routes/avatar-routes.ts +10 -10
  341. package/src/runtime/routes/background-wake-routes.ts +188 -0
  342. package/src/runtime/routes/browser-tabs-routes.ts +200 -0
  343. package/src/runtime/routes/btw-routes.ts +0 -6
  344. package/src/runtime/routes/conversation-cli-routes.ts +1 -1
  345. package/src/runtime/routes/conversation-list-routes.ts +12 -4
  346. package/src/runtime/routes/conversation-management-routes.ts +77 -20
  347. package/src/runtime/routes/conversation-query-routes.ts +142 -36
  348. package/src/runtime/routes/conversation-routes.ts +252 -410
  349. package/src/runtime/routes/conversation-starter-routes.ts +6 -3
  350. package/src/runtime/routes/disk-pressure-routes.ts +1 -1
  351. package/src/runtime/routes/domain-routes.ts +60 -10
  352. package/src/runtime/routes/email-routes.ts +5 -2
  353. package/src/runtime/routes/events-routes.ts +54 -10
  354. package/src/runtime/routes/group-routes.ts +24 -8
  355. package/src/runtime/routes/host-browser-routes.ts +10 -2
  356. package/src/runtime/routes/host-cu-routes.ts +2 -2
  357. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
  358. package/src/runtime/routes/index.ts +8 -0
  359. package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
  360. package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
  361. package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
  362. package/src/runtime/routes/memory-item-routes.ts +8 -3
  363. package/src/runtime/routes/memory-v2-routes.ts +215 -5
  364. package/src/runtime/routes/memory-v3-routes.ts +316 -0
  365. package/src/runtime/routes/migration-routes.ts +21 -24
  366. package/src/runtime/routes/plugins-routes.ts +337 -0
  367. package/src/runtime/routes/rename-conversation-routes.ts +6 -2
  368. package/src/runtime/routes/secret-routes.ts +25 -5
  369. package/src/runtime/routes/settings-routes.ts +12 -11
  370. package/src/runtime/routes/slack-channel-routes.ts +5 -4
  371. package/src/runtime/routes/workspace-routes.ts +25 -10
  372. package/src/runtime/sync/resource-sync-events.ts +106 -38
  373. package/src/runtime/sync/sync-publisher.test.ts +49 -0
  374. package/src/runtime/sync/sync-publisher.ts +2 -1
  375. package/src/runtime/verification-outbound-actions.ts +73 -1
  376. package/src/telemetry/types.ts +12 -0
  377. package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
  378. package/src/telemetry/usage-telemetry-reporter.ts +1 -0
  379. package/src/tools/acp/spawn.test.ts +119 -0
  380. package/src/tools/acp/spawn.ts +15 -2
  381. package/src/tools/apps/definitions.ts +2 -8
  382. package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
  383. package/src/tools/ask-question/ask-question-tool.ts +38 -45
  384. package/src/tools/browser/__tests__/pinned-tabs.test.ts +70 -0
  385. package/src/tools/browser/browser-execution.ts +16 -3
  386. package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
  387. package/src/tools/browser/cdp-client/__tests__/types.test.ts +3 -0
  388. package/src/tools/browser/cdp-client/cdp-inspect-client.ts +12 -0
  389. package/src/tools/browser/cdp-client/extension-cdp-client.ts +27 -1
  390. package/src/tools/browser/cdp-client/factory.ts +100 -17
  391. package/src/tools/browser/cdp-client/local-cdp-client.ts +12 -0
  392. package/src/tools/browser/cdp-client/types.ts +65 -0
  393. package/src/tools/browser/pinned-tabs.ts +96 -40
  394. package/src/tools/computer-use/definitions.ts +22 -78
  395. package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
  396. package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
  397. package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
  398. package/src/tools/credentials/vault.ts +3 -9
  399. package/src/tools/document/document-tool.ts +59 -0
  400. package/src/tools/execution-target.ts +21 -23
  401. package/src/tools/executor.ts +6 -1
  402. package/src/tools/filesystem/edit.ts +3 -9
  403. package/src/tools/filesystem/list.ts +3 -9
  404. package/src/tools/filesystem/read.ts +3 -9
  405. package/src/tools/filesystem/write.ts +3 -9
  406. package/src/tools/host-filesystem/edit.ts +3 -9
  407. package/src/tools/host-filesystem/read.ts +3 -9
  408. package/src/tools/host-filesystem/transfer.ts +3 -9
  409. package/src/tools/host-filesystem/write.ts +3 -9
  410. package/src/tools/host-terminal/host-shell.ts +3 -9
  411. package/src/tools/mcp/mcp-tool-factory.ts +1 -8
  412. package/src/tools/memory/register.test.ts +1 -1
  413. package/src/tools/memory/register.ts +4 -9
  414. package/src/tools/network/web-fetch.ts +3 -9
  415. package/src/tools/network/web-search.ts +25 -32
  416. package/src/tools/registry.ts +7 -23
  417. package/src/tools/schema-transforms.ts +1 -1
  418. package/src/tools/skills/execute.ts +3 -9
  419. package/src/tools/skills/load.ts +3 -9
  420. package/src/tools/skills/skill-tool-factory.ts +1 -8
  421. package/src/tools/subagent/notify-parent.ts +3 -9
  422. package/src/tools/system/request-permission.ts +3 -9
  423. package/src/tools/terminal/shell.ts +3 -9
  424. package/src/tools/tool-defaults.ts +94 -0
  425. package/src/tools/types.ts +27 -98
  426. package/src/tools/ui-surface/definitions.ts +6 -22
  427. package/src/usage/pricing.ts +23 -0
  428. package/src/usage/types.ts +12 -0
  429. package/src/util/logger.ts +16 -7
  430. package/src/util/platform.ts +7 -2
  431. package/src/util/sqlite3-runtime.ts +65 -0
  432. package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
  433. package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
  434. package/src/workspace/migrations/registry.ts +2 -0
  435. package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
  436. package/src/__tests__/message-complete-display-id.test.ts +0 -175
  437. package/src/daemon/query-complexity-router.ts +0 -75
  438. package/src/prompts/cache-boundary.ts +0 -8
@@ -8,7 +8,6 @@
8
8
  */
9
9
 
10
10
  import { RiskLevel } from "../../permissions/types.js";
11
- import type { ToolDefinition } from "../../providers/types.js";
12
11
  import type { Tool, ToolExecutionResult } from "../types.js";
13
12
 
14
13
  // ---------------------------------------------------------------------------
@@ -32,12 +31,9 @@ export const computerUseClickTool: Tool = {
32
31
  category: "computer-use",
33
32
  defaultRiskLevel: RiskLevel.Low,
34
33
  executionMode: "proxy",
34
+ executionTarget: "host",
35
35
 
36
- getDefinition(): ToolDefinition {
37
- return {
38
- name: this.name,
39
- description: this.description,
40
- input_schema: {
36
+ input_schema: {
41
37
  type: "object",
42
38
  properties: {
43
39
  click_type: {
@@ -71,8 +67,6 @@ export const computerUseClickTool: Tool = {
71
67
  },
72
68
  required: ["reasoning"],
73
69
  },
74
- };
75
- },
76
70
 
77
71
  execute: proxyExecute,
78
72
  };
@@ -88,12 +82,9 @@ export const computerUseTypeTextTool: Tool = {
88
82
  category: "computer-use",
89
83
  defaultRiskLevel: RiskLevel.Low,
90
84
  executionMode: "proxy",
85
+ executionTarget: "host",
91
86
 
92
- getDefinition(): ToolDefinition {
93
- return {
94
- name: this.name,
95
- description: this.description,
96
- input_schema: {
87
+ input_schema: {
97
88
  type: "object",
98
89
  properties: {
99
90
  text: {
@@ -112,8 +103,6 @@ export const computerUseTypeTextTool: Tool = {
112
103
  },
113
104
  required: ["text", "reasoning"],
114
105
  },
115
- };
116
- },
117
106
 
118
107
  execute: proxyExecute,
119
108
  };
@@ -129,12 +118,9 @@ export const computerUseKeyTool: Tool = {
129
118
  category: "computer-use",
130
119
  defaultRiskLevel: RiskLevel.Low,
131
120
  executionMode: "proxy",
121
+ executionTarget: "host",
132
122
 
133
- getDefinition(): ToolDefinition {
134
- return {
135
- name: this.name,
136
- description: this.description,
137
- input_schema: {
123
+ input_schema: {
138
124
  type: "object",
139
125
  properties: {
140
126
  key: {
@@ -154,8 +140,6 @@ export const computerUseKeyTool: Tool = {
154
140
  },
155
141
  required: ["key", "reasoning"],
156
142
  },
157
- };
158
- },
159
143
 
160
144
  execute: proxyExecute,
161
145
  };
@@ -171,12 +155,9 @@ export const computerUseScrollTool: Tool = {
171
155
  category: "computer-use",
172
156
  defaultRiskLevel: RiskLevel.Low,
173
157
  executionMode: "proxy",
158
+ executionTarget: "host",
174
159
 
175
- getDefinition(): ToolDefinition {
176
- return {
177
- name: this.name,
178
- description: this.description,
179
- input_schema: {
160
+ input_schema: {
180
161
  type: "object",
181
162
  properties: {
182
163
  element_id: {
@@ -213,8 +194,6 @@ export const computerUseScrollTool: Tool = {
213
194
  },
214
195
  required: ["direction", "amount", "reasoning"],
215
196
  },
216
- };
217
- },
218
197
 
219
198
  execute: proxyExecute,
220
199
  };
@@ -230,12 +209,9 @@ export const computerUseDragTool: Tool = {
230
209
  category: "computer-use",
231
210
  defaultRiskLevel: RiskLevel.Low,
232
211
  executionMode: "proxy",
212
+ executionTarget: "host",
233
213
 
234
- getDefinition(): ToolDefinition {
235
- return {
236
- name: this.name,
237
- description: this.description,
238
- input_schema: {
214
+ input_schema: {
239
215
  type: "object",
240
216
  properties: {
241
217
  element_id: {
@@ -278,8 +254,6 @@ export const computerUseDragTool: Tool = {
278
254
  },
279
255
  required: ["reasoning"],
280
256
  },
281
- };
282
- },
283
257
 
284
258
  execute: proxyExecute,
285
259
  };
@@ -294,12 +268,9 @@ export const computerUseWaitTool: Tool = {
294
268
  category: "computer-use",
295
269
  defaultRiskLevel: RiskLevel.Low,
296
270
  executionMode: "proxy",
271
+ executionTarget: "host",
297
272
 
298
- getDefinition(): ToolDefinition {
299
- return {
300
- name: this.name,
301
- description: this.description,
302
- input_schema: {
273
+ input_schema: {
303
274
  type: "object",
304
275
  properties: {
305
276
  duration_ms: {
@@ -318,8 +289,6 @@ export const computerUseWaitTool: Tool = {
318
289
  },
319
290
  required: ["duration_ms", "reasoning"],
320
291
  },
321
- };
322
- },
323
292
 
324
293
  execute: proxyExecute,
325
294
  };
@@ -335,12 +304,9 @@ export const computerUseOpenAppTool: Tool = {
335
304
  category: "computer-use",
336
305
  defaultRiskLevel: RiskLevel.Low,
337
306
  executionMode: "proxy",
307
+ executionTarget: "host",
338
308
 
339
- getDefinition(): ToolDefinition {
340
- return {
341
- name: this.name,
342
- description: this.description,
343
- input_schema: {
309
+ input_schema: {
344
310
  type: "object",
345
311
  properties: {
346
312
  app_name: {
@@ -361,8 +327,6 @@ export const computerUseOpenAppTool: Tool = {
361
327
  },
362
328
  required: ["app_name", "reasoning"],
363
329
  },
364
- };
365
- },
366
330
 
367
331
  execute: proxyExecute,
368
332
  };
@@ -378,12 +342,9 @@ export const computerUseRunAppleScriptTool: Tool = {
378
342
  category: "computer-use",
379
343
  defaultRiskLevel: RiskLevel.Low,
380
344
  executionMode: "proxy",
345
+ executionTarget: "host",
381
346
 
382
- getDefinition(): ToolDefinition {
383
- return {
384
- name: this.name,
385
- description: this.description,
386
- input_schema: {
347
+ input_schema: {
387
348
  type: "object",
388
349
  properties: {
389
350
  script: {
@@ -403,8 +364,6 @@ export const computerUseRunAppleScriptTool: Tool = {
403
364
  },
404
365
  required: ["script", "reasoning"],
405
366
  },
406
- };
407
- },
408
367
 
409
368
  execute: proxyExecute,
410
369
  };
@@ -420,12 +379,9 @@ export const computerUseDoneTool: Tool = {
420
379
  category: "computer-use",
421
380
  defaultRiskLevel: RiskLevel.Low,
422
381
  executionMode: "proxy",
382
+ executionTarget: "host",
423
383
 
424
- getDefinition(): ToolDefinition {
425
- return {
426
- name: this.name,
427
- description: this.description,
428
- input_schema: {
384
+ input_schema: {
429
385
  type: "object",
430
386
  properties: {
431
387
  summary: {
@@ -435,8 +391,6 @@ export const computerUseDoneTool: Tool = {
435
391
  },
436
392
  required: ["summary"],
437
393
  },
438
- };
439
- },
440
394
 
441
395
  execute: proxyExecute,
442
396
  };
@@ -452,12 +406,9 @@ export const computerUseRespondTool: Tool = {
452
406
  category: "computer-use",
453
407
  defaultRiskLevel: RiskLevel.Low,
454
408
  executionMode: "proxy",
409
+ executionTarget: "host",
455
410
 
456
- getDefinition(): ToolDefinition {
457
- return {
458
- name: this.name,
459
- description: this.description,
460
- input_schema: {
411
+ input_schema: {
461
412
  type: "object",
462
413
  properties: {
463
414
  answer: {
@@ -471,8 +422,6 @@ export const computerUseRespondTool: Tool = {
471
422
  },
472
423
  required: ["answer", "reasoning"],
473
424
  },
474
- };
475
- },
476
425
 
477
426
  execute: proxyExecute,
478
427
  };
@@ -488,18 +437,13 @@ const computerUseObserveTool: Tool = {
488
437
  category: "computer-use",
489
438
  defaultRiskLevel: RiskLevel.Low,
490
439
  executionMode: "proxy",
440
+ executionTarget: "host",
491
441
 
492
- getDefinition(): ToolDefinition {
493
- return {
494
- name: this.name,
495
- description: this.description,
496
- input_schema: {
442
+ input_schema: {
497
443
  type: "object",
498
444
  properties: {},
499
445
  required: [],
500
446
  },
501
- };
502
- },
503
447
 
504
448
  execute: proxyExecute,
505
449
  };
@@ -13,7 +13,6 @@
13
13
  import { GrantProposalSchema, renderProposal } from "@vellumai/service-contracts/credential-rpc";
14
14
 
15
15
  import { RiskLevel } from "../../permissions/types.js";
16
- import type { ToolDefinition } from "../../providers/types.js";
17
16
  import { getLogger } from "../../util/logger.js";
18
17
  import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
19
18
 
@@ -24,13 +23,10 @@ class MakeAuthenticatedRequestTool implements Tool {
24
23
  description =
25
24
  "Execute an authenticated HTTP request through CES. CES injects the credential and returns the response - the assistant never sees raw secrets.";
26
25
  category = "credential-execution";
26
+ executionTarget = "sandbox" as const;
27
27
  defaultRiskLevel = RiskLevel.High;
28
28
 
29
- getDefinition(): ToolDefinition {
30
- return {
31
- name: this.name,
32
- description: this.description,
33
- input_schema: {
29
+ input_schema = {
34
30
  type: "object",
35
31
  properties: {
36
32
  credentialHandle: {
@@ -68,9 +64,7 @@ class MakeAuthenticatedRequestTool implements Tool {
68
64
  },
69
65
  },
70
66
  required: ["credentialHandle", "method", "url", "purpose"],
71
- },
72
- };
73
- }
67
+ };
74
68
 
75
69
  async execute(
76
70
  input: Record<string, unknown>,
@@ -18,7 +18,6 @@
18
18
  import type { ManageSecureCommandTool } from "@vellumai/service-contracts/rpc";
19
19
 
20
20
  import { RiskLevel } from "../../permissions/types.js";
21
- import type { ToolDefinition } from "../../providers/types.js";
22
21
  import { getLogger } from "../../util/logger.js";
23
22
  import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
24
23
 
@@ -31,13 +30,10 @@ class ManageSecureCommandToolImpl implements Tool {
31
30
  "Accepts only bundle metadata for guardian review - never raw bytes or file paths. " +
32
31
  "Each invocation requires fresh approval.";
33
32
  category = "credential-execution";
33
+ executionTarget = "sandbox" as const;
34
34
  defaultRiskLevel = RiskLevel.High;
35
35
 
36
- getDefinition(): ToolDefinition {
37
- return {
38
- name: this.name,
39
- description: this.description,
40
- input_schema: {
36
+ input_schema = {
41
37
  type: "object",
42
38
  properties: {
43
39
  action: {
@@ -236,9 +232,7 @@ class ManageSecureCommandToolImpl implements Tool {
236
232
  },
237
233
  },
238
234
  required: ["action", "toolName"],
239
- },
240
- };
241
- }
235
+ };
242
236
 
243
237
  async execute(
244
238
  input: Record<string, unknown>,
@@ -13,7 +13,6 @@
13
13
  import { GrantProposalSchema, renderProposal } from "@vellumai/service-contracts/credential-rpc";
14
14
 
15
15
  import { RiskLevel } from "../../permissions/types.js";
16
- import type { ToolDefinition } from "../../providers/types.js";
17
16
  import { getLogger } from "../../util/logger.js";
18
17
  import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
19
18
 
@@ -24,13 +23,10 @@ class RunAuthenticatedCommandTool implements Tool {
24
23
  description =
25
24
  "Execute a command with credential environment variables injected by CES. The command runs inside the CES sandbox - the assistant never sees raw secrets.";
26
25
  category = "credential-execution";
26
+ executionTarget = "sandbox" as const;
27
27
  defaultRiskLevel = RiskLevel.High;
28
28
 
29
- getDefinition(): ToolDefinition {
30
- return {
31
- name: this.name,
32
- description: this.description,
33
- input_schema: {
29
+ input_schema = {
34
30
  type: "object",
35
31
  properties: {
36
32
  credentialHandle: {
@@ -97,9 +93,7 @@ class RunAuthenticatedCommandTool implements Tool {
97
93
  },
98
94
  },
99
95
  required: ["credentialHandle", "command", "purpose"],
100
- },
101
- };
102
- }
96
+ };
103
97
 
104
98
  async execute(
105
99
  input: Record<string, unknown>,
@@ -10,7 +10,6 @@ import {
10
10
  getActiveConnection,
11
11
  } from "../../oauth/oauth-store.js";
12
12
  import { RiskLevel } from "../../permissions/types.js";
13
- import type { ToolDefinition } from "../../providers/types.js";
14
13
  import { credentialKey } from "../../security/credential-key.js";
15
14
  import {
16
15
  deleteSecureKeyAsync,
@@ -75,13 +74,10 @@ class CredentialStoreTool implements Tool {
75
74
  description =
76
75
  "Store, list, delete, or prompt for credentials in the secure vault";
77
76
  category = "credentials";
77
+ executionTarget = "sandbox" as const;
78
78
  defaultRiskLevel = RiskLevel.Low;
79
79
 
80
- getDefinition(): ToolDefinition {
81
- return {
82
- name: this.name,
83
- description: this.description,
84
- input_schema: {
80
+ input_schema = {
85
81
  type: "object",
86
82
  properties: {
87
83
  action: {
@@ -181,9 +177,7 @@ class CredentialStoreTool implements Tool {
181
177
  },
182
178
  },
183
179
  required: ["action"],
184
- },
185
- };
186
- }
180
+ };
187
181
 
188
182
  async execute(
189
183
  input: Record<string, unknown>,
@@ -42,6 +42,65 @@ export function canAccessDocument(
42
42
 
43
43
  // ── Exported execute functions ──────────────────────────────────────
44
44
 
45
+ export function executeDocumentOpen(
46
+ input: Record<string, unknown>,
47
+ context: ToolContext,
48
+ ): ToolExecutionResult {
49
+ const surfaceId = input.surface_id as string;
50
+ if (!canAccessDocument(surfaceId, context)) {
51
+ return documentNotFound(surfaceId);
52
+ }
53
+
54
+ const doc = getDocumentById(surfaceId);
55
+ if (!doc) {
56
+ return documentNotFound(surfaceId);
57
+ }
58
+
59
+ if (context.sendToClient) {
60
+ context.sendToClient({
61
+ type: "document_editor_show",
62
+ conversationId: context.conversationId,
63
+ surfaceId: doc.surfaceId,
64
+ title: doc.title,
65
+ initialContent: doc.content,
66
+ });
67
+
68
+ context.sendToClient({
69
+ type: "ui_surface_show",
70
+ conversationId: context.conversationId,
71
+ surfaceId: `preview-${doc.surfaceId}`,
72
+ surfaceType: "document_preview",
73
+ display: "inline",
74
+ title: doc.title,
75
+ data: {
76
+ title: doc.title,
77
+ surfaceId: doc.surfaceId,
78
+ subtitle: "Document",
79
+ },
80
+ });
81
+
82
+ return {
83
+ content: JSON.stringify({
84
+ success: true,
85
+ surface_id: doc.surfaceId,
86
+ title: doc.title,
87
+ word_count: doc.wordCount,
88
+ message: "Document editor opened",
89
+ }),
90
+ isError: false,
91
+ };
92
+ }
93
+
94
+ return {
95
+ content: JSON.stringify({
96
+ success: false,
97
+ surface_id: surfaceId,
98
+ error: "No client connected to open document editor",
99
+ }),
100
+ isError: true,
101
+ };
102
+ }
103
+
45
104
  export function executeDocumentCreate(
46
105
  input: Record<string, unknown>,
47
106
  context: ToolContext,
@@ -1,4 +1,3 @@
1
- import { getTool } from "./registry.js";
2
1
  import type { ExecutionTarget } from "./types.js";
3
2
 
4
3
  export interface ManifestOverride {
@@ -6,28 +5,27 @@ export interface ManifestOverride {
6
5
  execution_target: "host" | "sandbox";
7
6
  }
8
7
 
9
- export function resolveExecutionTarget(
10
- toolName: string,
11
- manifestOverride?: ManifestOverride,
12
- ): ExecutionTarget {
13
- const tool = getTool(toolName);
14
- // Manifest-declared execution target is authoritative - check it first so
15
- // skill tools with host_/computer_use_ prefixes aren't mis-classified.
16
- if (tool?.executionTarget) {
17
- return tool.executionTarget;
18
- }
19
- // Check the tool's executionMode metadata - proxy tools run on the connected
20
- // client (host), not inside the sandbox.
21
- if (tool?.executionMode === "proxy") {
22
- return "host";
23
- }
24
- // Use manifest metadata for unregistered skill tools so the Permission
25
- // Simulator shows accurate execution targets instead of defaulting to sandbox.
26
- if (!tool && manifestOverride) {
27
- return manifestOverride.execution_target;
28
- }
29
- // Prefix heuristics for core tools that don't declare an explicit target.
30
- if (toolName.startsWith("host_") || toolName.startsWith("computer_use_")) {
8
+ /**
9
+ * Decide a tool's execution target — sandbox (assistant container) or host
10
+ * (guardian's device via host-bridge proxy). Pure: same input → same output.
11
+ *
12
+ * Resolution order:
13
+ * 1. Declared `executionTarget` on the tool wins.
14
+ * 2. `executionMode === "proxy"` ⇒ host (proxied tools run on the client).
15
+ * 3. Name prefix heuristic — `host_*` / `computer_use_*` ⇒ host.
16
+ * 4. Default sandbox.
17
+ *
18
+ * Called once per tool at load/construction time. The returned value is
19
+ * stamped onto every `LoadedTool`, so runtime reads are just a field read.
20
+ */
21
+ export function resolveExecutionTarget(tool: {
22
+ name: string;
23
+ executionTarget?: ExecutionTarget;
24
+ executionMode?: "local" | "proxy";
25
+ }): ExecutionTarget {
26
+ if (tool.executionTarget) return tool.executionTarget;
27
+ if (tool.executionMode === "proxy") return "host";
28
+ if (tool.name.startsWith("host_") || tool.name.startsWith("computer_use_")) {
31
29
  return "host";
32
30
  }
33
31
  return "sandbox";
@@ -22,6 +22,7 @@ import { getLogger } from "../util/logger.js";
22
22
  import { resolveExecutionTarget } from "./execution-target.js";
23
23
  import { executeWithTimeout, safeTimeoutMs } from "./execution-timeout.js";
24
24
  import { PermissionChecker } from "./permission-checker.js";
25
+ import { getTool } from "./registry.js";
25
26
  import { extractAndSanitize } from "./sensitive-output-placeholders.js";
26
27
  import { applyEdit } from "./shared/filesystem/edit-engine.js";
27
28
  import { sandboxPolicy } from "./shared/filesystem/path-policy.js";
@@ -126,7 +127,11 @@ export class ToolExecutor {
126
127
  let permApprovalMode: string | undefined;
127
128
  let permApprovalReason: string | undefined;
128
129
  let permRiskThreshold: string | undefined;
129
- const executionTarget = resolveExecutionTarget(name);
130
+ // Registered tools have `executionTarget` stamped at load time; the
131
+ // `resolveExecutionTarget` fallback only fires for unknown tools (the
132
+ // executor's name-aliased lookup can race against late registration).
133
+ const executionTarget =
134
+ getTool(name)?.executionTarget ?? resolveExecutionTarget({ name });
130
135
 
131
136
  emitLifecycleEvent(context, {
132
137
  type: "start",
@@ -1,5 +1,4 @@
1
1
  import { RiskLevel } from "../../permissions/types.js";
2
- import type { ToolDefinition } from "../../providers/types.js";
3
2
  import { registerTool } from "../registry.js";
4
3
  import { FileSystemOps } from "../shared/filesystem/file-ops-service.js";
5
4
  import { formatEditDiff } from "../shared/filesystem/format-diff.js";
@@ -11,13 +10,10 @@ class FileEditTool implements Tool {
11
10
  description =
12
11
  "Replace an exact string in a file on your own machine with a new string. Use this for surgical edits instead of rewriting entire files. Use host_file_edit for files on your guardian's device instead.";
13
12
  category = "filesystem";
13
+ executionTarget = "sandbox" as const;
14
14
  defaultRiskLevel = RiskLevel.Low;
15
15
 
16
- getDefinition(): ToolDefinition {
17
- return {
18
- name: this.name,
19
- description: this.description,
20
- input_schema: {
16
+ input_schema = {
21
17
  type: "object",
22
18
  properties: {
23
19
  path: {
@@ -45,9 +41,7 @@ class FileEditTool implements Tool {
45
41
  },
46
42
  },
47
43
  required: ["path", "old_string", "new_string", "activity"],
48
- },
49
- };
50
- }
44
+ };
51
45
 
52
46
  async execute(
53
47
  input: Record<string, unknown>,
@@ -1,5 +1,4 @@
1
1
  import { RiskLevel } from "../../permissions/types.js";
2
- import type { ToolDefinition } from "../../providers/types.js";
3
2
  import { registerTool } from "../registry.js";
4
3
  import { FileSystemOps } from "../shared/filesystem/file-ops-service.js";
5
4
  import { sandboxPolicy } from "../shared/filesystem/path-policy.js";
@@ -10,13 +9,10 @@ class FileListTool implements Tool {
10
9
  description =
11
10
  "List the contents of a directory on your own machine. Returns file and subdirectory names with type indicators and sizes.";
12
11
  category = "filesystem";
12
+ executionTarget = "sandbox" as const;
13
13
  defaultRiskLevel = RiskLevel.Low;
14
14
 
15
- getDefinition(): ToolDefinition {
16
- return {
17
- name: this.name,
18
- description: this.description,
19
- input_schema: {
15
+ input_schema = {
20
16
  type: "object",
21
17
  properties: {
22
18
  path: {
@@ -34,9 +30,7 @@ class FileListTool implements Tool {
34
30
  },
35
31
  },
36
32
  required: ["path", "activity"],
37
- },
38
- };
39
- }
33
+ };
40
34
 
41
35
  async execute(
42
36
  input: Record<string, unknown>,
@@ -1,7 +1,6 @@
1
1
  import { extname } from "node:path";
2
2
 
3
3
  import { RiskLevel } from "../../permissions/types.js";
4
- import type { ToolDefinition } from "../../providers/types.js";
5
4
  import { registerTool } from "../registry.js";
6
5
  import { FileSystemOps } from "../shared/filesystem/file-ops-service.js";
7
6
  import {
@@ -16,13 +15,10 @@ class FileReadTool implements Tool {
16
15
  description =
17
16
  "Read the contents of a file on your own machine. For image files (JPEG, PNG, GIF, WebP), returns the image for visual analysis. Use host_file_read for files on your guardian's device instead.";
18
17
  category = "filesystem";
18
+ executionTarget = "sandbox" as const;
19
19
  defaultRiskLevel = RiskLevel.Low;
20
20
 
21
- getDefinition(): ToolDefinition {
22
- return {
23
- name: this.name,
24
- description: this.description,
25
- input_schema: {
21
+ input_schema = {
26
22
  type: "object",
27
23
  properties: {
28
24
  path: {
@@ -45,9 +41,7 @@ class FileReadTool implements Tool {
45
41
  },
46
42
  },
47
43
  required: ["path", "activity"],
48
- },
49
- };
50
- }
44
+ };
51
45
 
52
46
  async execute(
53
47
  input: Record<string, unknown>,
@@ -3,7 +3,6 @@ import { join, resolve, sep } from "node:path";
3
3
  import { enqueuePkbIndexJob } from "../../memory/jobs/embed-pkb-file.js";
4
4
  import { PKB_WORKSPACE_SCOPE } from "../../memory/pkb/types.js";
5
5
  import { RiskLevel } from "../../permissions/types.js";
6
- import type { ToolDefinition } from "../../providers/types.js";
7
6
  import { getLogger } from "../../util/logger.js";
8
7
  import { getWorkspaceDir } from "../../util/platform.js";
9
8
  import { registerTool } from "../registry.js";
@@ -35,13 +34,10 @@ class FileWriteTool implements Tool {
35
34
  description =
36
35
  "Write content to a file on your own machine, creating it if it does not exist. Use host_file_write for files on your guardian's device instead.";
37
36
  category = "filesystem";
37
+ executionTarget = "sandbox" as const;
38
38
  defaultRiskLevel = RiskLevel.Low;
39
39
 
40
- getDefinition(): ToolDefinition {
41
- return {
42
- name: this.name,
43
- description: this.description,
44
- input_schema: {
40
+ input_schema = {
45
41
  type: "object",
46
42
  properties: {
47
43
  path: {
@@ -60,9 +56,7 @@ class FileWriteTool implements Tool {
60
56
  },
61
57
  },
62
58
  required: ["path", "content", "activity"],
63
- },
64
- };
65
- }
59
+ };
66
60
 
67
61
  async execute(
68
62
  input: Record<string, unknown>,