@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
@@ -1,7 +1,6 @@
1
1
  import { supportsHostProxy } from "../../channels/types.js";
2
2
  import { HostFileProxy } from "../../daemon/host-file-proxy.js";
3
3
  import { RiskLevel } from "../../permissions/types.js";
4
- import type { ToolDefinition } from "../../providers/types.js";
5
4
  import { assistantEventHub } from "../../runtime/assistant-event-hub.js";
6
5
  import { FileSystemOps } from "../shared/filesystem/file-ops-service.js";
7
6
  import { formatEditDiff } from "../shared/filesystem/format-diff.js";
@@ -13,13 +12,10 @@ class HostFileEditTool implements Tool {
13
12
  description =
14
13
  "Replace exact text in a file on your guardian's device with new text. For files on your own machine, use file_edit instead.";
15
14
  category = "host-filesystem";
15
+ executionTarget = "host" as const;
16
16
  defaultRiskLevel = RiskLevel.Medium;
17
17
 
18
- getDefinition(): ToolDefinition {
19
- return {
20
- name: this.name,
21
- description: this.description,
22
- input_schema: {
18
+ input_schema = {
23
19
  type: "object",
24
20
  properties: {
25
21
  path: {
@@ -46,9 +42,7 @@ class HostFileEditTool implements Tool {
46
42
  },
47
43
  },
48
44
  required: ["path", "old_string", "new_string"],
49
- },
50
- };
51
- }
45
+ };
52
46
 
53
47
  async execute(
54
48
  input: Record<string, unknown>,
@@ -3,7 +3,6 @@ import { extname } from "node:path";
3
3
  import { supportsHostProxy } from "../../channels/types.js";
4
4
  import { HostFileProxy } from "../../daemon/host-file-proxy.js";
5
5
  import { RiskLevel } from "../../permissions/types.js";
6
- import type { ToolDefinition } from "../../providers/types.js";
7
6
  import { assistantEventHub } from "../../runtime/assistant-event-hub.js";
8
7
  import { FileSystemOps } from "../shared/filesystem/file-ops-service.js";
9
8
  import {
@@ -18,13 +17,10 @@ class HostFileReadTool implements Tool {
18
17
  description =
19
18
  "Read the contents of a file on your guardian's device, including images (JPEG, PNG, GIF, WebP). For files on your own machine, use file_read instead.";
20
19
  category = "host-filesystem";
20
+ executionTarget = "host" as const;
21
21
  defaultRiskLevel = RiskLevel.Medium;
22
22
 
23
- getDefinition(): ToolDefinition {
24
- return {
25
- name: this.name,
26
- description: this.description,
27
- input_schema: {
23
+ input_schema = {
28
24
  type: "object",
29
25
  properties: {
30
26
  path: {
@@ -46,9 +42,7 @@ class HostFileReadTool implements Tool {
46
42
  },
47
43
  },
48
44
  required: ["path"],
49
- },
50
- };
51
- }
45
+ };
52
46
 
53
47
  async execute(
54
48
  input: Record<string, unknown>,
@@ -5,7 +5,6 @@ import { dirname, isAbsolute } from "node:path";
5
5
  import { supportsHostProxy } from "../../channels/types.js";
6
6
  import { HostTransferProxy } from "../../daemon/host-transfer-proxy.js";
7
7
  import { RiskLevel } from "../../permissions/types.js";
8
- import type { ToolDefinition } from "../../providers/types.js";
9
8
  import { assistantEventHub } from "../../runtime/assistant-event-hub.js";
10
9
  import { sandboxPolicy } from "../shared/filesystem/path-policy.js";
11
10
  import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
@@ -15,13 +14,10 @@ class HostFileTransferTool implements Tool {
15
14
  description =
16
15
  "Copy a file between the assistant's workspace and the host machine. Set direction to 'to_host' to send a workspace file to the host, or 'to_sandbox' to pull a host file into the workspace. When multiple clients support host_file, specify which one to use with target_client_id.";
17
16
  category = "host-filesystem";
17
+ executionTarget = "host" as const;
18
18
  defaultRiskLevel = RiskLevel.Medium;
19
19
 
20
- getDefinition(): ToolDefinition {
21
- return {
22
- name: this.name,
23
- description: this.description,
24
- input_schema: {
20
+ input_schema = {
25
21
  type: "object",
26
22
  properties: {
27
23
  source_path: {
@@ -57,9 +53,7 @@ class HostFileTransferTool implements Tool {
57
53
  },
58
54
  },
59
55
  required: ["source_path", "dest_path", "direction"],
60
- },
61
- };
62
- }
56
+ };
63
57
 
64
58
  async execute(
65
59
  input: Record<string, unknown>,
@@ -1,7 +1,6 @@
1
1
  import { supportsHostProxy } from "../../channels/types.js";
2
2
  import { HostFileProxy } from "../../daemon/host-file-proxy.js";
3
3
  import { RiskLevel } from "../../permissions/types.js";
4
- import type { ToolDefinition } from "../../providers/types.js";
5
4
  import { assistantEventHub } from "../../runtime/assistant-event-hub.js";
6
5
  import { FileSystemOps } from "../shared/filesystem/file-ops-service.js";
7
6
  import { formatWriteSummary } from "../shared/filesystem/format-diff.js";
@@ -13,13 +12,10 @@ class HostFileWriteTool implements Tool {
13
12
  description =
14
13
  "Write content to a file on your guardian's device, creating it if it does not exist. For files on your own machine, use file_write instead.";
15
14
  category = "host-filesystem";
15
+ executionTarget = "host" as const;
16
16
  defaultRiskLevel = RiskLevel.Medium;
17
17
 
18
- getDefinition(): ToolDefinition {
19
- return {
20
- name: this.name,
21
- description: this.description,
22
- input_schema: {
18
+ input_schema = {
23
19
  type: "object",
24
20
  properties: {
25
21
  path: {
@@ -37,9 +33,7 @@ class HostFileWriteTool implements Tool {
37
33
  },
38
34
  },
39
35
  required: ["path", "content"],
40
- },
41
- };
42
- }
36
+ };
43
37
 
44
38
  async execute(
45
39
  input: Record<string, unknown>,
@@ -23,7 +23,6 @@ import { getConfig } from "../../config/loader.js";
23
23
  import { isCesShellLockdownEnabled } from "../../credential-execution/feature-gates.js";
24
24
  import { HostBashProxy } from "../../daemon/host-bash-proxy.js";
25
25
  import { RiskLevel } from "../../permissions/types.js";
26
- import type { ToolDefinition } from "../../providers/types.js";
27
26
  import { isUntrustedTrustClass } from "../../runtime/actor-trust-resolver.js";
28
27
  import { wakeAgentForOpportunity } from "../../runtime/agent-wake.js";
29
28
  import { assistantEventHub } from "../../runtime/assistant-event-hub.js";
@@ -97,16 +96,13 @@ class HostShellTool implements Tool {
97
96
  description =
98
97
  "LAST RESORT — Execute a shell command directly on the host machine. You MUST strongly prefer the regular `bash` tool for all commands. Only use `host_bash` when you are absolutely certain the command MUST run on the host machine and CANNOT run in the workspace (e.g., managing host-level system services, accessing host-only peripherals, or interacting with host paths outside the workspace). If in doubt, use `bash` instead. Approval-gated: each invocation must be explicitly approved. Do not use for commands that require injected credentials or secrets.";
99
98
  category = "host-terminal";
99
+ executionTarget = "host" as const;
100
100
  // host_bash is a weaker-tier escape hatch under CES lockdown. It remains
101
101
  // Medium risk by default but persistent approvals are disabled for
102
102
  // untrusted sessions (see execute()).
103
103
  defaultRiskLevel = RiskLevel.Medium;
104
104
 
105
- getDefinition(): ToolDefinition {
106
- return {
107
- name: this.name,
108
- description: this.description,
109
- input_schema: {
105
+ input_schema = {
110
106
  type: "object",
111
107
  properties: {
112
108
  command: {
@@ -140,9 +136,7 @@ class HostShellTool implements Tool {
140
136
  },
141
137
  },
142
138
  required: ["command", "activity"],
143
- },
144
- };
145
- }
139
+ };
146
140
 
147
141
  async execute(
148
142
  input: Record<string, unknown>,
@@ -1,7 +1,6 @@
1
1
  import type { McpServerConfig } from "../../config/schemas/mcp.js";
2
2
  import type { McpServerManager } from "../../mcp/manager.js";
3
3
  import { RiskLevel } from "../../permissions/types.js";
4
- import type { ToolDefinition } from "../../providers/types.js";
5
4
  import { toProviderSafeToolName } from "../provider-tool-name.js";
6
5
  import { schemaDefinesProperty } from "../schema-transforms.js";
7
6
  import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
@@ -53,13 +52,7 @@ export function createMcpTool(
53
52
  ownerMcpServerId: serverId,
54
53
  executionTarget: "host",
55
54
 
56
- getDefinition(): ToolDefinition {
57
- return {
58
- name: namespacedName,
59
- description: metadata.description,
60
- input_schema: metadata.inputSchema as ToolDefinition["input_schema"],
61
- };
62
- },
55
+ input_schema: metadata.inputSchema as object,
63
56
 
64
57
  async execute(
65
58
  input: Record<string, unknown>,
@@ -100,7 +100,7 @@ function makeContext(overrides: Partial<ToolContext> = {}): ToolContext {
100
100
 
101
101
  describe("recallTool definition", () => {
102
102
  test("exposes the agentic local search schema", () => {
103
- const definition = recallTool.getDefinition();
103
+ const definition = recallTool;
104
104
 
105
105
  expect(definition.name).toBe("recall");
106
106
  expect(definition.description).toContain("Search local information");
@@ -10,7 +10,6 @@ import {
10
10
  graphRememberDefinition,
11
11
  } from "../../memory/graph/tools.js";
12
12
  import { RiskLevel } from "../../permissions/types.js";
13
- import type { ToolDefinition } from "../../providers/types.js";
14
13
  import { isUntrustedTrustClass } from "../../runtime/actor-trust-resolver.js";
15
14
  import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
16
15
 
@@ -20,11 +19,9 @@ class RememberTool implements Tool {
20
19
  name = "remember";
21
20
  description = graphRememberDefinition.description;
22
21
  category = "memory";
22
+ executionTarget = "sandbox" as const;
23
23
  defaultRiskLevel = RiskLevel.Low;
24
-
25
- getDefinition(): ToolDefinition {
26
- return graphRememberDefinition;
27
- }
24
+ input_schema = graphRememberDefinition.input_schema;
28
25
 
29
26
  async execute(
30
27
  input: Record<string, unknown>,
@@ -51,11 +48,9 @@ class RecallTool implements Tool {
51
48
  name = "recall";
52
49
  description = graphRecallDefinition.description;
53
50
  category = "memory";
51
+ executionTarget = "sandbox" as const;
54
52
  defaultRiskLevel = RiskLevel.Low;
55
-
56
- getDefinition(): ToolDefinition {
57
- return graphRecallDefinition;
58
- }
53
+ input_schema = graphRecallDefinition.input_schema;
59
54
 
60
55
  async execute(
61
56
  input: Record<string, unknown>,
@@ -7,7 +7,6 @@ import { Readable } from "node:stream";
7
7
 
8
8
  import type { WebFetchMetadata } from "../../daemon/message-types/web-activity.js";
9
9
  import { RiskLevel } from "../../permissions/types.js";
10
- import type { ToolDefinition } from "../../providers/types.js";
11
10
  import { wrapUntrustedContent } from "../../security/untrusted-content.js";
12
11
  import { faviconUrlForDomain } from "../../util/favicon.js";
13
12
  import { getLogger } from "../../util/logger.js";
@@ -990,13 +989,10 @@ class WebFetchTool implements Tool {
990
989
  description =
991
990
  "Fetch a webpage and return LLM-friendly extracted text with metadata. Use this after web_search when you need to read a specific result. To find pages on a site without guessing slugs, fetch /sitemap.xml first — it has ground-truth paths and works even when pages are JS-rendered.";
992
991
  category = "network";
992
+ executionTarget = "sandbox" as const;
993
993
  defaultRiskLevel = RiskLevel.Low;
994
994
 
995
- getDefinition(): ToolDefinition {
996
- return {
997
- name: this.name,
998
- description: this.description,
999
- input_schema: {
995
+ input_schema = {
1000
996
  type: "object",
1001
997
  properties: {
1002
998
  url: {
@@ -1029,9 +1025,7 @@ class WebFetchTool implements Tool {
1029
1025
  },
1030
1026
  },
1031
1027
  required: ["url"],
1032
- },
1033
- };
1034
- }
1028
+ };
1035
1029
 
1036
1030
  async execute(
1037
1031
  input: Record<string, unknown>,
@@ -4,7 +4,6 @@ import type {
4
4
  WebSearchResultItem,
5
5
  } from "../../daemon/message-types/web-activity.js";
6
6
  import { RiskLevel } from "../../permissions/types.js";
7
- import type { ToolDefinition } from "../../providers/types.js";
8
7
  import { getProviderKeyAsync } from "../../security/secure-keys.js";
9
8
  import { wrapUntrustedContent } from "../../security/untrusted-content.js";
10
9
  import { faviconUrlForDomain } from "../../util/favicon.js";
@@ -650,39 +649,33 @@ class WebSearchTool implements Tool {
650
649
  description =
651
650
  "Search the web and return results. Useful for looking up current information, documentation, or anything the assistant doesn't know.";
652
651
  category = "network";
652
+ executionTarget = "sandbox" as const;
653
653
  defaultRiskLevel = RiskLevel.Low;
654
-
655
- getDefinition(): ToolDefinition {
656
- return {
657
- name: this.name,
658
- description: this.description,
659
- input_schema: {
660
- type: "object",
661
- properties: {
662
- query: {
663
- type: "string",
664
- description: "The search query string",
665
- },
666
- count: {
667
- type: "number",
668
- description:
669
- "Number of results to return (1-20, default 10). Used with Brave and Tavily providers.",
670
- },
671
- offset: {
672
- type: "number",
673
- description:
674
- "Pagination offset (0-9, default 0). Only used with Brave provider.",
675
- },
676
- freshness: {
677
- type: "string",
678
- description:
679
- 'Filter by recency: "pd" (past day), "pw" (past week), "pm" (past month), "py" (past year). Used with Brave and Tavily providers.',
680
- },
681
- },
682
- required: ["query"],
654
+ input_schema = {
655
+ type: "object",
656
+ properties: {
657
+ query: {
658
+ type: "string",
659
+ description: "The search query string",
683
660
  },
684
- };
685
- }
661
+ count: {
662
+ type: "number",
663
+ description:
664
+ "Number of results to return (1-20, default 10). Used with Brave and Tavily providers.",
665
+ },
666
+ offset: {
667
+ type: "number",
668
+ description:
669
+ "Pagination offset (0-9, default 0). Only used with Brave provider.",
670
+ },
671
+ freshness: {
672
+ type: "string",
673
+ description:
674
+ 'Filter by recency: "pd" (past day), "pw" (past week), "pm" (past month), "py" (past year). Used with Brave and Tavily providers.',
675
+ },
676
+ },
677
+ required: ["query"],
678
+ };
686
679
 
687
680
  async execute(
688
681
  input: Record<string, unknown>,
@@ -10,7 +10,7 @@ import { hostFileWriteTool } from "./host-filesystem/write.js";
10
10
  import { hostShellTool } from "./host-terminal/host-shell.js";
11
11
  import { toProviderSafeToolName } from "./provider-tool-name.js";
12
12
  import { registerSystemTools } from "./system/register.js";
13
- import type { LoadedPluginTool, Tool } from "./types.js";
13
+ import type { LoadedTool, Tool } from "./types.js";
14
14
  import { allUiSurfaceTools } from "./ui-surface/definitions.js";
15
15
  import { registerUiSurfaceTools } from "./ui-surface/registry.js";
16
16
 
@@ -85,12 +85,6 @@ function withProviderSafeToolName(tool: Tool): Tool {
85
85
  return {
86
86
  ...tool,
87
87
  name: safeName,
88
- getDefinition(): ToolDefinition {
89
- return {
90
- ...tool.getDefinition(),
91
- name: safeName,
92
- };
93
- },
94
88
  };
95
89
  }
96
90
 
@@ -193,12 +187,11 @@ export function registerSkillTools(newTools: Tool[]): Tool[] {
193
187
  */
194
188
  export function registerPluginTools(
195
189
  pluginName: string,
196
- newTools: LoadedPluginTool[],
190
+ newTools: LoadedTool[],
197
191
  ): Tool[] {
198
192
  const stamped: Tool[] = newTools.map((pluginTool) => {
199
- const { input_schema, ...rest } = pluginTool;
200
193
  const tool: Tool = {
201
- ...rest,
194
+ ...pluginTool,
202
195
  category: "plugin",
203
196
  origin: "plugin" as const,
204
197
  ownerPluginId: pluginName,
@@ -206,13 +199,6 @@ export function registerPluginTools(
206
199
  ownerMcpServerId: undefined,
207
200
  ownerSkillBundled: undefined,
208
201
  ownerSkillVersionHash: undefined,
209
- getDefinition(): ToolDefinition {
210
- return {
211
- name: pluginTool.name,
212
- description: pluginTool.description,
213
- input_schema,
214
- };
215
- },
216
202
  };
217
203
  return withProviderSafeToolName(tool);
218
204
  });
@@ -399,9 +385,7 @@ export function unregisterAllMcpTools(): void {
399
385
  * were registered after session creation (e.g. via `vellum mcp reload`).
400
386
  */
401
387
  export function getMcpToolDefinitions(): ToolDefinition[] {
402
- return Array.from(tools.values())
403
- .filter((t) => t.origin === "mcp")
404
- .map((t) => t.getDefinition());
388
+ return Array.from(tools.values()).filter((t) => t.origin === "mcp");
405
389
  }
406
390
 
407
391
  /**
@@ -428,9 +412,9 @@ export function getAllToolDefinitions(): ToolDefinition[] {
428
412
  // the base tool list, which is shared across sessions via the global
429
413
  // registry. Including them here causes "Tool names must be unique"
430
414
  // errors when the projection appends the same tools a second time.
431
- return getAllTools()
432
- .filter((t) => t.executionMode !== "proxy" && t.origin !== "skill")
433
- .map((t) => t.getDefinition());
415
+ return getAllTools().filter(
416
+ (t) => t.executionMode !== "proxy" && t.origin !== "skill",
417
+ );
434
418
  }
435
419
 
436
420
  export async function initializeTools(): Promise<void> {
@@ -12,7 +12,7 @@ export const ACTIVITY_SKIP_SET = new Set<string>();
12
12
  * or has a non-object schema.
13
13
  *
14
14
  * CRITICAL: Never mutates the input definitions - always returns deep clones
15
- * for any modified definition, since `getDefinition()` returns shared refs.
15
+ * for any modified definition, since `Tool.input_schema` is a shared ref.
16
16
  */
17
17
  export function injectActivityField(
18
18
  definitions: ToolDefinition[],
@@ -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 type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
5
4
 
@@ -8,13 +7,10 @@ class SkillExecuteTool implements Tool {
8
7
  description =
9
8
  "Execute a tool provided by a loaded skill. Use this instead of calling skill tools directly. The skill's instructions (from skill_load) describe available tools and their parameters. For browser automation, use the `assistant browser` CLI commands instead.";
10
9
  category = "skills";
10
+ executionTarget = "sandbox" as const;
11
11
  defaultRiskLevel = RiskLevel.Low;
12
12
 
13
- getDefinition(): ToolDefinition {
14
- return {
15
- name: this.name,
16
- description: this.description,
17
- input_schema: {
13
+ input_schema = {
18
14
  type: "object",
19
15
  properties: {
20
16
  tool: {
@@ -34,9 +30,7 @@ class SkillExecuteTool implements Tool {
34
30
  },
35
31
  },
36
32
  required: ["tool", "input", "activity"],
37
- },
38
- };
39
- }
33
+ };
40
34
 
41
35
  async execute(
42
36
  _input: Record<string, unknown>,
@@ -11,7 +11,6 @@ import {
11
11
  loadSkillCatalog,
12
12
  } from "../../config/skills.js";
13
13
  import { RiskLevel } from "../../permissions/types.js";
14
- import type { ToolDefinition } from "../../providers/types.js";
15
14
  import {
16
15
  autoInstallFromCatalog,
17
16
  resolveCatalog,
@@ -126,13 +125,10 @@ export class SkillLoadTool implements Tool {
126
125
  description =
127
126
  "Load full instructions for a skill. Works for both bundled skills (listed in the catalog) and custom workspace skills.";
128
127
  category = "skills";
128
+ executionTarget = "sandbox" as const;
129
129
  defaultRiskLevel = RiskLevel.Low;
130
130
 
131
- getDefinition(): ToolDefinition {
132
- return {
133
- name: this.name,
134
- description: this.description,
135
- input_schema: {
131
+ input_schema = {
136
132
  type: "object",
137
133
  properties: {
138
134
  skill: {
@@ -141,9 +137,7 @@ export class SkillLoadTool implements Tool {
141
137
  },
142
138
  },
143
139
  required: ["skill"],
144
- },
145
- };
146
- }
140
+ };
147
141
 
148
142
  async execute(
149
143
  input: Record<string, unknown>,
@@ -1,6 +1,5 @@
1
1
  import type { SkillToolEntry } from "../../config/skills.js";
2
2
  import { RiskLevel } from "../../permissions/types.js";
3
- import type { ToolDefinition } from "../../providers/types.js";
4
3
  import type {
5
4
  ExecutionTarget,
6
5
  Tool,
@@ -63,13 +62,7 @@ export function createSkillTool(
63
62
  ownerSkillVersionHash: versionHash,
64
63
  ownerSkillBundled: bundled,
65
64
 
66
- getDefinition(): ToolDefinition {
67
- return {
68
- name: entry.name,
69
- description: entry.description,
70
- input_schema: entry.input_schema as ToolDefinition["input_schema"],
71
- };
72
- },
65
+ input_schema: entry.input_schema as object,
73
66
 
74
67
  async execute(
75
68
  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 { getSubagentManager } from "../../subagent/index.js";
4
3
  import { registerTool } from "../registry.js";
5
4
  import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
@@ -37,13 +36,10 @@ class NotifyParentTool implements Tool {
37
36
  description =
38
37
  "Send a notification to the parent conversation. Use this for important findings, when you're blocked, or when you have preliminary results the parent should know about. Do not overuse — notify for significant findings, not after every tool call.";
39
38
  category = "orchestration";
39
+ executionTarget = "sandbox" as const;
40
40
  defaultRiskLevel = RiskLevel.Low;
41
41
 
42
- getDefinition(): ToolDefinition {
43
- return {
44
- name: this.name,
45
- description: this.description,
46
- input_schema: {
42
+ input_schema = {
47
43
  type: "object",
48
44
  properties: {
49
45
  message: {
@@ -63,9 +59,7 @@ class NotifyParentTool implements Tool {
63
59
  },
64
60
  },
65
61
  required: ["message", "activity"],
66
- },
67
- };
68
- }
62
+ };
69
63
 
70
64
  async execute(
71
65
  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 type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
5
4
 
@@ -57,13 +56,10 @@ class RequestSystemPermissionTool implements Tool {
57
56
  "Use when a tool fails with a permission/access error (e.g. 'Operation not permitted', 'EACCES', sandbox denial). " +
58
57
  "Do not explain how to open System Settings manually - this tool handles it with a clickable button.";
59
58
  category = "system";
59
+ executionTarget = "sandbox" as const;
60
60
  defaultRiskLevel = RiskLevel.High;
61
61
 
62
- getDefinition(): ToolDefinition {
63
- return {
64
- name: this.name,
65
- description: this.description,
66
- input_schema: {
62
+ input_schema = {
67
63
  type: "object",
68
64
  properties: {
69
65
  permission_type: {
@@ -78,9 +74,7 @@ class RequestSystemPermissionTool implements Tool {
78
74
  },
79
75
  },
80
76
  required: ["permission_type", "activity"],
81
- },
82
- };
83
- }
77
+ };
84
78
 
85
79
  async execute(
86
80
  input: Record<string, unknown>,
@@ -4,7 +4,6 @@ import { spawn } from "node:child_process";
4
4
  import { getConfig } from "../../config/loader.js";
5
5
  import { isCesShellLockdownEnabled } from "../../credential-execution/feature-gates.js";
6
6
  import { RiskLevel } from "../../permissions/types.js";
7
- import type { ToolDefinition } from "../../providers/types.js";
8
7
  import { isUntrustedTrustClass } from "../../runtime/actor-trust-resolver.js";
9
8
  import { wakeAgentForOpportunity } from "../../runtime/agent-wake.js";
10
9
  import { redactSecrets } from "../../security/secret-scanner.js";
@@ -49,13 +48,10 @@ class ShellTool implements Tool {
49
48
  name = "bash";
50
49
  description = "Execute a shell command on the local machine";
51
50
  category = "terminal";
51
+ executionTarget = "sandbox" as const;
52
52
  defaultRiskLevel = RiskLevel.Medium;
53
53
 
54
- getDefinition(): ToolDefinition {
55
- return {
56
- name: this.name,
57
- description: this.description,
58
- input_schema: {
54
+ input_schema = {
59
55
  type: "object",
60
56
  properties: {
61
57
  command: {
@@ -91,9 +87,7 @@ class ShellTool implements Tool {
91
87
  },
92
88
  },
93
89
  required: ["command", "activity"],
94
- },
95
- };
96
- }
90
+ };
97
91
 
98
92
  async execute(
99
93
  input: Record<string, unknown>,