@vellumai/assistant 0.10.2-dev.202606250318.5e7cfb0 → 0.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/bun.lock +0 -20
  2. package/docs/workspace-tools.md +33 -42
  3. package/eslint-rules/cli-no-daemon-internals.js +0 -6
  4. package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +0 -31
  5. package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +0 -44
  6. package/node_modules/@vellumai/gateway-client/src/index.ts +0 -14
  7. package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +0 -17
  8. package/node_modules/@vellumai/service-contracts/package.json +0 -1
  9. package/node_modules/@vellumai/service-contracts/src/index.ts +0 -1
  10. package/openapi.yaml +0 -155
  11. package/package.json +1 -4
  12. package/scripts/test.sh +15 -36
  13. package/src/__tests__/actor-token-service.test.ts +14 -36
  14. package/src/__tests__/agent-loop-override-profile.test.ts +0 -1
  15. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +0 -2
  16. package/src/__tests__/agent-wake-override-profile.test.ts +0 -2
  17. package/src/__tests__/annotate-activity-metadata.test.ts +0 -2
  18. package/src/__tests__/annotate-risk-options.test.ts +0 -2
  19. package/src/__tests__/approval-cascade.test.ts +0 -2
  20. package/src/__tests__/assistant-attachments.test.ts +0 -42
  21. package/src/__tests__/background-workers-disk-pressure.test.ts +0 -2
  22. package/src/__tests__/btw-routes.test.ts +0 -2
  23. package/src/__tests__/build-persisted-content.test.ts +0 -2
  24. package/src/__tests__/call-controller.test.ts +0 -19
  25. package/src/__tests__/channel-guardian.test.ts +58 -94
  26. package/src/__tests__/channel-reply-delivery.test.ts +0 -2
  27. package/src/__tests__/compaction-events.test.ts +0 -2
  28. package/src/__tests__/compaction.benchmark.test.ts +0 -2
  29. package/src/__tests__/compactor-call-site-logging.test.ts +0 -2
  30. package/src/__tests__/compactor-low-watermark-cut.test.ts +0 -2
  31. package/src/__tests__/compactor-preserved-tail-count.test.ts +0 -2
  32. package/src/__tests__/compactor-summary-call-truncation.test.ts +0 -2
  33. package/src/__tests__/compactor-web-search-strip.test.ts +0 -2
  34. package/src/__tests__/config-loader-backfill.test.ts +10 -123
  35. package/src/__tests__/config-schema.test.ts +0 -1
  36. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +29 -31
  37. package/src/__tests__/contacts-relay-reads.test.ts +15 -13
  38. package/src/__tests__/conversation-abort-tool-results.test.ts +0 -2
  39. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +0 -2
  40. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +0 -2
  41. package/src/__tests__/conversation-agent-loop-overflow.test.ts +0 -2
  42. package/src/__tests__/conversation-agent-loop.test.ts +0 -134
  43. package/src/__tests__/conversation-analysis-routes.test.ts +0 -2
  44. package/src/__tests__/conversation-app-control-lifecycle.test.ts +0 -2
  45. package/src/__tests__/conversation-confirmation-signals.test.ts +0 -2
  46. package/src/__tests__/conversation-history-web-search.test.ts +0 -2
  47. package/src/__tests__/conversation-load-history-repair.test.ts +0 -2
  48. package/src/__tests__/conversation-load-history-stripped.test.ts +0 -2
  49. package/src/__tests__/conversation-pairing.test.ts +0 -2
  50. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +0 -2
  51. package/src/__tests__/conversation-process-callsite.test.ts +0 -2
  52. package/src/__tests__/conversation-provider-retry-repair.test.ts +0 -2
  53. package/src/__tests__/conversation-queue.test.ts +0 -91
  54. package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -14
  55. package/src/__tests__/conversation-routes-slash-commands.test.ts +0 -14
  56. package/src/__tests__/conversation-slash-queue.test.ts +0 -2
  57. package/src/__tests__/conversation-slash-unknown.test.ts +0 -2
  58. package/src/__tests__/conversation-speed-override.test.ts +0 -2
  59. package/src/__tests__/conversation-surfaces-task-progress.test.ts +0 -29
  60. package/src/__tests__/conversation-title-service.test.ts +0 -2
  61. package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -47
  62. package/src/__tests__/conversation-usage.test.ts +0 -2
  63. package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -2
  64. package/src/__tests__/conversation-workspace-injection.test.ts +0 -2
  65. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -2
  66. package/src/__tests__/credential-security-invariants.test.ts +1 -1
  67. package/src/__tests__/db-migration-rollback.test.ts +171 -205
  68. package/src/__tests__/db-test-helpers.ts +4 -5
  69. package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -4
  70. package/src/__tests__/disk-pressure-guard.test.ts +0 -41
  71. package/src/__tests__/dm-persistence.test.ts +0 -2
  72. package/src/__tests__/emit-signal-routing-intent.test.ts +5 -10
  73. package/src/__tests__/events-dev-bypass-actor.test.ts +1 -7
  74. package/src/__tests__/exploration-drift-hook.test.ts +2 -3
  75. package/src/__tests__/filing-service.test.ts +0 -2
  76. package/src/__tests__/guardian-binding-drift-heal.test.ts +10 -75
  77. package/src/__tests__/guardian-dispatch.test.ts +1 -95
  78. package/src/__tests__/guardian-outbound-http.test.ts +0 -13
  79. package/src/__tests__/heartbeat-disk-pressure.test.ts +0 -2
  80. package/src/__tests__/heartbeat-service.test.ts +0 -2
  81. package/src/__tests__/helpers/channel-test-adapter.ts +7 -1
  82. package/src/__tests__/host-app-control-routes.test.ts +30 -24
  83. package/src/__tests__/host-bash-routes.test.ts +41 -31
  84. package/src/__tests__/host-browser-routes.test.ts +32 -26
  85. package/src/__tests__/host-cu-routes-targeted.test.ts +33 -25
  86. package/src/__tests__/host-file-routes-targeted.test.ts +52 -40
  87. package/src/__tests__/host-transfer-routes-targeted.test.ts +43 -31
  88. package/src/__tests__/http-user-message-parity.test.ts +8 -290
  89. package/src/__tests__/inbound-invite-redemption.test.ts +0 -28
  90. package/src/__tests__/inbound-slack-persistence.test.ts +0 -2
  91. package/src/__tests__/invite-redemption-service.test.ts +0 -198
  92. package/src/__tests__/llm-context-normalization.test.ts +0 -105
  93. package/src/__tests__/llm-request-log-error-payload.test.ts +9 -71
  94. package/src/__tests__/llm-usage-store.test.ts +0 -25
  95. package/src/__tests__/mcp-health-check.test.ts +1 -2
  96. package/src/__tests__/media-stream-server-integration.test.ts +0 -127
  97. package/src/__tests__/memory-retrieval-hook.test.ts +0 -2
  98. package/src/__tests__/messaging-send-tool.test.ts +0 -2
  99. package/src/__tests__/migration-import-from-url.test.ts +2 -2
  100. package/src/__tests__/mtime-cache.test.ts +5 -146
  101. package/src/__tests__/native-web-search.test.ts +0 -2
  102. package/src/__tests__/non-member-access-request.test.ts +17 -189
  103. package/src/__tests__/notification-broadcaster.test.ts +0 -4
  104. package/src/__tests__/notification-decision-recipient-context.test.ts +32 -33
  105. package/src/__tests__/notification-deep-link.test.ts +0 -6
  106. package/src/__tests__/notification-guardian-path.test.ts +0 -19
  107. package/src/__tests__/openai-provider.test.ts +12 -22
  108. package/src/__tests__/openai-responses-provider.test.ts +2 -12
  109. package/src/__tests__/outbound-slack-persistence.test.ts +0 -2
  110. package/src/__tests__/pending-interactions-resolved-event.test.ts +4 -7
  111. package/src/__tests__/persistence-secret-redaction.test.ts +0 -2
  112. package/src/__tests__/plugin-bootstrap.test.ts +73 -3
  113. package/src/__tests__/plugin-route-contribution.test.ts +17 -4
  114. package/src/__tests__/plugin-tool-contribution.test.ts +18 -3
  115. package/src/__tests__/plugin-types.test.ts +2 -0
  116. package/src/__tests__/process-message-background-slack.test.ts +0 -2
  117. package/src/__tests__/process-message-display-content.test.ts +0 -2
  118. package/src/__tests__/provider-error-scenarios.test.ts +4 -5
  119. package/src/__tests__/provider-usage-tracking.test.ts +0 -39
  120. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +0 -2
  121. package/src/__tests__/registry.test.ts +1 -4
  122. package/src/__tests__/relay-server.test.ts +25 -694
  123. package/src/__tests__/runtime-attachment-metadata.test.ts +1 -0
  124. package/src/__tests__/secret-ingress-http.test.ts +0 -14
  125. package/src/__tests__/send-endpoint-busy.test.ts +8 -30
  126. package/src/__tests__/skills.test.ts +0 -44
  127. package/src/__tests__/slack-inbound-verification.test.ts +2 -47
  128. package/src/__tests__/stt-hints.test.ts +13 -44
  129. package/src/__tests__/subagent-detail.test.ts +0 -27
  130. package/src/__tests__/subagent-disposal.test.ts +0 -65
  131. package/src/__tests__/subagent-notify-parent.test.ts +0 -2
  132. package/src/__tests__/subagent-role-registry.test.ts +2 -7
  133. package/src/__tests__/subagent-spawn-tool-fork.test.ts +0 -2
  134. package/src/__tests__/subagent-tools.test.ts +0 -2
  135. package/src/__tests__/suggestion-routes.test.ts +0 -2
  136. package/src/__tests__/title-generate-hook.test.ts +0 -2
  137. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -2
  138. package/src/__tests__/tool-executor.test.ts +11 -16
  139. package/src/__tests__/tool-preview-lifecycle.test.ts +0 -2
  140. package/src/__tests__/tool-result-metadata-plumbing.test.ts +0 -2
  141. package/src/__tests__/tool-start-timestamp.test.ts +0 -2
  142. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +10 -10
  143. package/src/__tests__/twilio-routes.test.ts +0 -96
  144. package/src/__tests__/ui-file-upload-surface.test.ts +0 -86
  145. package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
  146. package/src/__tests__/voice-invite-redemption.test.ts +0 -33
  147. package/src/__tests__/web-search-backend-failure.test.ts +0 -2
  148. package/src/__tests__/workspace-migration-remove-hooks.test.ts +35 -14
  149. package/src/__tests__/workspace-tool-loader.test.ts +2 -195
  150. package/src/__tests__/workspace-tools-watcher-flag.test.ts +70 -0
  151. package/src/agent/loop.ts +0 -56
  152. package/src/api/index.ts +1 -19
  153. package/src/api/responses/llm-request-log-entry.ts +0 -29
  154. package/src/api/responses/subagent-detail.ts +0 -17
  155. package/src/api/surfaces.ts +3 -39
  156. package/src/approvals/guardian-request-resolvers.ts +11 -1
  157. package/src/calls/__tests__/relay-setup-router.test.ts +4 -262
  158. package/src/calls/call-domain.ts +3 -3
  159. package/src/calls/guardian-dispatch.ts +8 -10
  160. package/src/calls/inbound-trust-reader.ts +1 -17
  161. package/src/calls/media-stream-server.ts +0 -21
  162. package/src/calls/relay-server.ts +50 -167
  163. package/src/calls/relay-setup-router.ts +7 -37
  164. package/src/calls/relay-verification.ts +4 -4
  165. package/src/calls/stt-hints.ts +12 -9
  166. package/src/calls/twilio-routes.ts +4 -14
  167. package/src/channels/types.ts +20 -10
  168. package/src/cli/commands/__tests__/cache.test.ts +1 -8
  169. package/src/cli/commands/cache.ts +181 -194
  170. package/src/cli/commands/db/__tests__/repair.test.ts +5 -6
  171. package/src/cli/commands/db/status.ts +1 -37
  172. package/src/cli/commands/mcp.ts +218 -252
  173. package/src/cli/commands/memory/index.ts +0 -2
  174. package/src/cli/commands/plugins.ts +3 -75
  175. package/src/cli/lib/__tests__/install-from-github.test.ts +0 -102
  176. package/src/cli/lib/__tests__/list-installed-plugins.test.ts +1 -160
  177. package/src/cli/lib/list-installed-plugins.ts +1 -179
  178. package/src/config/__tests__/sync-gated-profiles.test.ts +3 -11
  179. package/src/config/bundled-skills/contacts/tools/contact-merge.ts +17 -27
  180. package/src/config/bundled-skills/contacts/tools/contact-search.ts +3 -13
  181. package/src/config/bundled-skills/subagent/SKILL.md +1 -1
  182. package/src/config/bundled-skills/subagent/TOOLS.json +1 -1
  183. package/src/config/feature-flag-registry.json +13 -5
  184. package/src/config/loader.ts +5 -38
  185. package/src/config/schemas/__tests__/memory-v3.test.ts +0 -1
  186. package/src/config/schemas/memory-lifecycle.ts +0 -12
  187. package/src/config/schemas/memory-v3.ts +0 -7
  188. package/src/config/schemas/memory.ts +0 -4
  189. package/src/config/schemas/timeouts.ts +0 -8
  190. package/src/config/seed-inference-profiles.ts +11 -21
  191. package/src/config/skills.ts +5 -27
  192. package/src/config/sync-gated-profiles.ts +13 -12
  193. package/src/contacts/contacts-write.ts +0 -3
  194. package/src/daemon/assistant-attachments.ts +4 -27
  195. package/src/daemon/conversation-agent-loop.ts +0 -28
  196. package/src/daemon/conversation-process.ts +16 -35
  197. package/src/daemon/conversation-surfaces.ts +38 -111
  198. package/src/daemon/conversation-tool-setup.ts +16 -50
  199. package/src/daemon/conversation.ts +1 -13
  200. package/src/daemon/disk-pressure-guard.ts +2 -12
  201. package/src/daemon/event-loop-watchdog.ts +1 -28
  202. package/src/daemon/external-plugins-bootstrap.ts +34 -4
  203. package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +0 -25
  204. package/src/daemon/handlers/config-a2a.ts +14 -6
  205. package/src/daemon/handlers/config-channels.ts +22 -78
  206. package/src/daemon/handlers/conversations.ts +0 -77
  207. package/src/daemon/lifecycle.ts +0 -4
  208. package/src/daemon/mcp-reload-service.ts +0 -10
  209. package/src/daemon/memory-v2-startup.test.ts +0 -72
  210. package/src/daemon/memory-v2-startup.ts +19 -87
  211. package/src/daemon/message-types/conversations.ts +0 -2
  212. package/src/daemon/message-types/surfaces.ts +12 -12
  213. package/src/daemon/server.ts +4 -0
  214. package/src/daemon/shutdown-handlers.ts +0 -20
  215. package/src/daemon/tool-setup-types.ts +0 -9
  216. package/src/daemon/workspace-tools-watcher.ts +328 -0
  217. package/src/ipc/__tests__/clients-list-ipc.test.ts +1 -1
  218. package/src/ipc/assistant-server.ts +2 -2
  219. package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +0 -1
  220. package/src/mcp/client.ts +1 -15
  221. package/src/mcp/mcp-auth-orchestrator.ts +1 -6
  222. package/src/mcp/mcp-oauth-provider.ts +8 -19
  223. package/src/memory/__tests__/memory-retrospective-job.test.ts +0 -8
  224. package/src/memory/conversation-crud.ts +0 -38
  225. package/src/memory/db-connection.ts +3 -22
  226. package/src/memory/db-init.ts +502 -36
  227. package/src/memory/db-singleton.ts +4 -6
  228. package/src/memory/jobs-worker.ts +0 -58
  229. package/src/memory/llm-request-log-store.ts +1 -26
  230. package/src/memory/llm-usage-store.ts +20 -48
  231. package/src/memory/memory-retrospective-job.ts +8 -9
  232. package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +56 -130
  233. package/src/memory/migrations/__tests__/run-migrations.test.ts +2 -2
  234. package/src/memory/migrations/registry.ts +573 -0
  235. package/src/memory/migrations/run-migrations.ts +6 -90
  236. package/src/memory/migrations/validate-migration-state.ts +66 -101
  237. package/src/memory/schema/conversations.ts +0 -9
  238. package/src/memory/schema/infrastructure.ts +0 -20
  239. package/src/memory/v2/__tests__/cli-command-store.test.ts +0 -25
  240. package/src/memory/v2/__tests__/skill-store.test.ts +0 -80
  241. package/src/memory/v2/cli-command-store.ts +38 -75
  242. package/src/memory/v2/prompts/consolidation.ts +82 -13
  243. package/src/memory/v2/prompts/router.ts +93 -21
  244. package/src/memory/v2/skill-store.ts +31 -68
  245. package/src/notifications/__tests__/broadcaster.test.ts +8 -16
  246. package/src/notifications/__tests__/decision-engine.test.ts +9 -78
  247. package/src/notifications/broadcaster.ts +1 -8
  248. package/src/notifications/decision-engine.ts +7 -15
  249. package/src/notifications/destination-resolver.ts +24 -68
  250. package/src/notifications/emit-signal.ts +14 -39
  251. package/src/permissions/question-prompter.test.ts +1 -1
  252. package/src/permissions/question-prompter.ts +4 -7
  253. package/src/plugin-api/index.ts +6 -6
  254. package/src/plugin-api/types.ts +5 -3
  255. package/src/plugin-api/vision-support.test.ts +4 -28
  256. package/src/plugin-api/vision-support.ts +31 -66
  257. package/src/plugins/defaults/advisor/__tests__/consult.test.ts +0 -161
  258. package/src/plugins/defaults/advisor/consult.ts +6 -110
  259. package/src/plugins/defaults/advisor/steering.ts +2 -14
  260. package/src/plugins/defaults/advisor/tools/advisor.ts +5 -32
  261. package/src/plugins/defaults/exploration-drift/hooks/post-tool-use.ts +1 -2
  262. package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +7 -47
  263. package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +11 -10
  264. package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +20 -12
  265. package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +11 -42
  266. package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +3 -33
  267. package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +4 -48
  268. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +8 -4
  269. package/src/plugins/defaults/memory-v3-shadow/injector.ts +15 -43
  270. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +2 -11
  271. package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +13 -77
  272. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +11 -12
  273. package/src/plugins/mtime-cache.ts +291 -76
  274. package/src/plugins/pipeline.ts +13 -111
  275. package/src/plugins/types.ts +2 -0
  276. package/src/providers/anthropic/client.ts +0 -5
  277. package/src/providers/call-site-routing.ts +0 -4
  278. package/src/providers/model-catalog.ts +0 -16
  279. package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
  280. package/src/providers/openai/chat-completions-provider.ts +83 -37
  281. package/src/providers/openai/responses-provider.ts +46 -50
  282. package/src/providers/openrouter/client.ts +0 -5
  283. package/src/providers/provider-send-message.ts +0 -4
  284. package/src/providers/ratelimit.ts +0 -4
  285. package/src/providers/retry.ts +0 -4
  286. package/src/providers/types.ts +0 -9
  287. package/src/providers/usage-tracking.ts +0 -4
  288. package/src/runtime/__tests__/trust-verdict-consumer.test.ts +3 -335
  289. package/src/runtime/access-request-helper.ts +39 -19
  290. package/src/runtime/actor-trust-resolver.ts +2 -2
  291. package/src/runtime/assistant-event-hub.ts +1 -1
  292. package/src/runtime/assistant-stream-state.ts +2 -9
  293. package/src/runtime/auth/require-bound-guardian.ts +11 -21
  294. package/src/runtime/channel-verification-service.ts +31 -56
  295. package/src/runtime/confirmation-request-guardian-bridge.ts +3 -3
  296. package/src/runtime/guardian-vellum-migration.ts +7 -66
  297. package/src/runtime/invite-redemption-service.ts +187 -198
  298. package/src/runtime/local-actor-identity.ts +11 -76
  299. package/src/runtime/pending-interactions.ts +1 -11
  300. package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +5 -56
  301. package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +1 -1
  302. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +0 -187
  303. package/src/runtime/routes/browser-routes.ts +1 -1
  304. package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +5 -13
  305. package/src/runtime/routes/channel-verification-routes.ts +3 -3
  306. package/src/runtime/routes/contact-routes.ts +32 -8
  307. package/src/runtime/routes/conversation-cli-routes.ts +5 -4
  308. package/src/runtime/routes/conversation-list-routes.ts +7 -4
  309. package/src/runtime/routes/conversation-query-routes.ts +0 -72
  310. package/src/runtime/routes/conversation-routes.ts +85 -84
  311. package/src/runtime/routes/events-routes.ts +2 -2
  312. package/src/runtime/routes/global-search-routes.ts +1 -3
  313. package/src/runtime/routes/guardian-action-routes.ts +5 -4
  314. package/src/runtime/routes/host-app-control-routes.ts +4 -5
  315. package/src/runtime/routes/host-bash-routes.ts +4 -5
  316. package/src/runtime/routes/host-browser-routes.ts +11 -9
  317. package/src/runtime/routes/host-cu-routes.ts +4 -5
  318. package/src/runtime/routes/host-file-routes.ts +4 -5
  319. package/src/runtime/routes/host-transfer-routes.ts +6 -6
  320. package/src/runtime/routes/http-adapter.ts +1 -1
  321. package/src/runtime/routes/identity-routes.ts +2 -3
  322. package/src/runtime/routes/inbound-message-handler.ts +5 -5
  323. package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +5 -97
  324. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +49 -61
  325. package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -16
  326. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +7 -7
  327. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +8 -21
  328. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +3 -14
  329. package/src/runtime/routes/index.ts +0 -2
  330. package/src/runtime/routes/llm-context-normalization.ts +0 -83
  331. package/src/runtime/routes/mcp-auth-routes.ts +19 -171
  332. package/src/runtime/routes/migration-rollback-routes.ts +3 -4
  333. package/src/runtime/routes/migration-routes.ts +1 -4
  334. package/src/runtime/routes/subagents-routes.ts +0 -5
  335. package/src/runtime/routes/surface-action-routes.ts +56 -42
  336. package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -1
  337. package/src/runtime/services/conversation-serializer.ts +9 -7
  338. package/src/runtime/tool-grant-request-helper.ts +3 -3
  339. package/src/runtime/trust-verdict-consumer.ts +9 -85
  340. package/src/runtime/verification-outbound-actions.ts +18 -18
  341. package/src/signals/user-message.ts +0 -16
  342. package/src/subagent/manager.ts +0 -9
  343. package/src/subagent/types.ts +3 -3
  344. package/src/telemetry/types.ts +1 -34
  345. package/src/telemetry/usage-telemetry-reporter.test.ts +2 -3
  346. package/src/telemetry/usage-telemetry-reporter.ts +3 -87
  347. package/src/tools/ask-question/ask-question-tool.test.ts +0 -29
  348. package/src/tools/ask-question/ask-question-tool.ts +0 -13
  349. package/src/tools/executor.ts +4 -4
  350. package/src/tools/registry.ts +0 -18
  351. package/src/tools/shared/filesystem/path-policy.ts +5 -12
  352. package/src/tools/tool-approval-handler.ts +1 -1
  353. package/src/tools/tool-defaults.ts +2 -9
  354. package/src/tools/tool-manifest.ts +0 -3
  355. package/src/tools/types.ts +2 -17
  356. package/src/tools/workspace-tools/loader.ts +244 -348
  357. package/src/util/errors.ts +1 -26
  358. package/src/util/platform.ts +0 -5
  359. package/src/workflows/library.test.ts +0 -140
  360. package/src/workflows/library.ts +28 -82
  361. package/src/workspace/migrations/017-seed-persona-dirs.ts +34 -3
  362. package/src/workspace/migrations/019-scope-journal-to-guardian.ts +24 -3
  363. package/src/workspace/migrations/048-remove-workspace-hooks.ts +66 -14
  364. package/src/workspace/migrations/registry.ts +0 -2
  365. package/node_modules/@vellumai/gateway-client/src/__tests__/guardian-delivery-contract.test.ts +0 -91
  366. package/node_modules/@vellumai/gateway-client/src/guardian-delivery-contract.ts +0 -48
  367. package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +0 -28
  368. package/node_modules/@vellumai/service-contracts/src/channels.ts +0 -41
  369. package/src/__tests__/code-search-tool.test.ts +0 -585
  370. package/src/__tests__/guardian-expiry-notifier.test.ts +0 -282
  371. package/src/__tests__/mcp-config-secret-boundary.test.ts +0 -390
  372. package/src/__tests__/plugin-pipeline.test.ts +0 -96
  373. package/src/__tests__/sse-actor-principal-guardian-source.test.ts +0 -102
  374. package/src/__tests__/steer-on-enqueue-question.test.ts +0 -181
  375. package/src/__tests__/workspace-migration-111-prune-seeded-callsite-defaults.test.ts +0 -208
  376. package/src/agent/loop-exclusive-tool.test.ts +0 -150
  377. package/src/api/constants/sse-replay.ts +0 -41
  378. package/src/api/events/conversation-notice.ts +0 -26
  379. package/src/approvals/guardian-channel-delivery.ts +0 -30
  380. package/src/approvals/guardian-expiry-notifier.ts +0 -148
  381. package/src/cli/commands/memory/__tests__/worker.test.ts +0 -302
  382. package/src/cli/commands/memory/worker.ts +0 -175
  383. package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +0 -143
  384. package/src/config/prune-seeded-callsite-defaults.ts +0 -110
  385. package/src/contacts/__tests__/contacts-write-revoke-relay.test.ts +0 -129
  386. package/src/contacts/__tests__/guardian-delivery-reader.test.ts +0 -312
  387. package/src/contacts/__tests__/member-write-relay.test.ts +0 -202
  388. package/src/contacts/guardian-delivery-reader.ts +0 -223
  389. package/src/contacts/member-write-relay.ts +0 -189
  390. package/src/daemon/conversation-notices.ts +0 -60
  391. package/src/daemon/handlers/__tests__/config-channels.test.ts +0 -225
  392. package/src/hooks/hook-loader.ts +0 -341
  393. package/src/mcp/mcp-header-store.ts +0 -134
  394. package/src/memory/__tests__/301-create-watchdog-events.test.ts +0 -110
  395. package/src/memory/__tests__/prompt-override.test.ts +0 -192
  396. package/src/memory/__tests__/watchdog-events-store.test.ts +0 -161
  397. package/src/memory/migrations/300-add-processing-started-at.ts +0 -30
  398. package/src/memory/migrations/301-create-watchdog-events.ts +0 -45
  399. package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +0 -224
  400. package/src/memory/prompt-override.ts +0 -129
  401. package/src/memory/steps.ts +0 -573
  402. package/src/memory/watchdog-events-store.ts +0 -87
  403. package/src/memory/worker-control.ts +0 -118
  404. package/src/memory/worker-process.ts +0 -72
  405. package/src/notifications/__tests__/connected-channels.test.ts +0 -114
  406. package/src/notifications/__tests__/destination-resolver.test.ts +0 -256
  407. package/src/onboarding/checkin-event.test.ts +0 -222
  408. package/src/onboarding/checkin-event.ts +0 -321
  409. package/src/onboarding/schedule-checkin.ts +0 -190
  410. package/src/plugins/defaults/advisor/__tests__/context-pack-gating.test.ts +0 -106
  411. package/src/plugins/defaults/advisor/__tests__/context-pack.test.ts +0 -60
  412. package/src/plugins/defaults/advisor/context-pack.ts +0 -288
  413. package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +0 -146
  414. package/src/plugins/surface-import.ts +0 -121
  415. package/src/providers/openai/__tests__/api-error-normalization.test.ts +0 -321
  416. package/src/providers/openai/api-error-normalization.ts +0 -270
  417. package/src/runtime/__tests__/channel-verification-service.test.ts +0 -133
  418. package/src/runtime/__tests__/guardian-vellum-migration.test.ts +0 -181
  419. package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +0 -66
  420. package/src/runtime/__tests__/local-principal-trust.test.ts +0 -164
  421. package/src/runtime/anchored-guardian.test.ts +0 -156
  422. package/src/runtime/anchored-guardian.ts +0 -135
  423. package/src/runtime/auth/__tests__/require-bound-guardian.test.ts +0 -99
  424. package/src/runtime/local-principal-trust.ts +0 -52
  425. package/src/runtime/routes/__tests__/contact-routes.test.ts +0 -212
  426. package/src/runtime/routes/__tests__/global-search-routes.test.ts +0 -93
  427. package/src/runtime/routes/onboarding-checkin-routes.ts +0 -86
  428. package/src/tools/filesystem/search.ts +0 -543
  429. package/src/util/telemetry-db-path.ts +0 -24
  430. package/src/workspace/migrations/111-prune-seeded-callsite-defaults.ts +0 -134
@@ -28,7 +28,6 @@ import {
28
28
  assembleBoundedTurnTrace,
29
29
  isTurnSettled,
30
30
  } from "../memory/turn-trace-store.js";
31
- import { queryUnreportedWatchdogEvents } from "../memory/watchdog-events-store.js";
32
31
  import { VellumPlatformClient } from "../platform/client.js";
33
32
  import {
34
33
  getCachedShareAnalytics,
@@ -77,9 +76,6 @@ const CHECKPOINT_KEY_SKILL_LOADED_WATERMARK =
77
76
  "telemetry:skill_loaded:last_reported_at";
78
77
  const CHECKPOINT_KEY_SKILL_LOADED_WATERMARK_ID =
79
78
  "telemetry:skill_loaded:last_reported_id";
80
- const CHECKPOINT_KEY_WATCHDOG_WATERMARK = "telemetry:watchdog:last_reported_at";
81
- const CHECKPOINT_KEY_WATCHDOG_WATERMARK_ID =
82
- "telemetry:watchdog:last_reported_id";
83
79
  // Written into the `*_id` watermark checkpoints by the opt-out flush branch.
84
80
  // Sorts lexicographically above every real row ID (all event stores generate
85
81
  // lowercase v4 UUIDs), so the compound cursor's same-millisecond arm
@@ -104,7 +100,6 @@ const WATERMARK_KEY_PAIRS: ReadonlyArray<readonly [string, string]> = [
104
100
  CHECKPOINT_KEY_SKILL_LOADED_WATERMARK,
105
101
  CHECKPOINT_KEY_SKILL_LOADED_WATERMARK_ID,
106
102
  ],
107
- [CHECKPOINT_KEY_WATCHDOG_WATERMARK, CHECKPOINT_KEY_WATCHDOG_WATERMARK_ID],
108
103
  ];
109
104
  const REPORT_INTERVAL_MS = 5 * 60 * 1000;
110
105
  const INITIAL_FLUSH_DELAY_MS = 30_000; // Delay first flush to let CES handshake complete
@@ -128,37 +123,6 @@ export function setUsageTelemetryReporter(
128
123
  _instance = reporter;
129
124
  }
130
125
 
131
- // ---------------------------------------------------------------------------
132
- // Helpers
133
- // ---------------------------------------------------------------------------
134
-
135
- /**
136
- * Parse a stored `watchdog_events.detail` JSON text column into the object the
137
- * platform expects. Returns null for a null column or an unparseable/corrupted
138
- * blob (mirroring the turn `client` metadata parse: a bad blob emits null
139
- * rather than failing the batch). A non-object (e.g. a bare number or string)
140
- * also resolves to null, since the platform serializer treats `detail` as a
141
- * JSON object bag.
142
- */
143
- function parseWatchdogDetail(
144
- raw: string | null,
145
- ): Record<string, unknown> | null {
146
- if (!raw) return null;
147
- try {
148
- const parsed = JSON.parse(raw) as unknown;
149
- if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
150
- return parsed as Record<string, unknown>;
151
- }
152
- return null;
153
- } catch {
154
- log.warn(
155
- { rawDetail: raw.slice(0, 200) },
156
- "Telemetry watchdog: failed to parse detail; emitting null",
157
- );
158
- return null;
159
- }
160
- }
161
-
162
126
  // ---------------------------------------------------------------------------
163
127
  // Reporter
164
128
  // ---------------------------------------------------------------------------
@@ -343,8 +307,7 @@ export class UsageTelemetryReporter {
343
307
  undefined;
344
308
 
345
309
  // Read skill-loaded watermark (compound cursor: createdAt + id).
346
- // Writes are gated on share_analytics consent, so opted-out rows
347
- // cannot exist and the standard 0 default is safe.
310
+ // Brand-new table, so the standard 0 default is safe.
348
311
  const skillLoadedWatermark = Number(
349
312
  getMemoryCheckpoint(CHECKPOINT_KEY_SKILL_LOADED_WATERMARK) ?? "0",
350
313
  );
@@ -352,15 +315,6 @@ export class UsageTelemetryReporter {
352
315
  getMemoryCheckpoint(CHECKPOINT_KEY_SKILL_LOADED_WATERMARK_ID) ??
353
316
  undefined;
354
317
 
355
- // Read watchdog watermark (compound cursor: createdAt + id).
356
- // Writes are gated on share_analytics consent, so opted-out rows
357
- // cannot exist and the standard 0 default is safe.
358
- const watchdogWatermark = Number(
359
- getMemoryCheckpoint(CHECKPOINT_KEY_WATCHDOG_WATERMARK) ?? "0",
360
- );
361
- const watchdogWatermarkId =
362
- getMemoryCheckpoint(CHECKPOINT_KEY_WATCHDOG_WATERMARK_ID) ?? undefined;
363
-
364
318
  // Query unreported events
365
319
  const events = queryUnreportedUsageEvents(
366
320
  watermark,
@@ -397,11 +351,6 @@ export class UsageTelemetryReporter {
397
351
  skillLoadedWatermarkId,
398
352
  BATCH_SIZE,
399
353
  );
400
- const watchdogEvents = queryUnreportedWatchdogEvents(
401
- watchdogWatermark,
402
- watchdogWatermarkId,
403
- BATCH_SIZE,
404
- );
405
354
 
406
355
  // Trace completeness barrier (trace-eligible owners only).
407
356
  //
@@ -469,8 +418,7 @@ export class UsageTelemetryReporter {
469
418
  onboardingEvents.length === 0 &&
470
419
  authFallbackEvents.length === 0 &&
471
420
  toolExecutedEvents.length === 0 &&
472
- skillLoadedEvents.length === 0 &&
473
- watchdogEvents.length === 0
421
+ skillLoadedEvents.length === 0
474
422
  )
475
423
  return;
476
424
 
@@ -494,7 +442,6 @@ export class UsageTelemetryReporter {
494
442
  authFallbackCount: authFallbackEvents.length,
495
443
  toolExecutedCount: toolExecutedEvents.length,
496
444
  skillLoadedCount: skillLoadedEvents.length,
497
- watchdogCount: watchdogEvents.length,
498
445
  },
499
446
  "Telemetry flush: resolved auth context",
500
447
  );
@@ -727,23 +674,6 @@ export class UsageTelemetryReporter {
727
674
  assistant_version: APP_VERSION,
728
675
  }),
729
676
  ),
730
- ...watchdogEvents.map(
731
- (e): TelemetryEvent => ({
732
- type: "watchdog",
733
- daemon_event_id: e.id,
734
- recorded_at: e.createdAt,
735
- check_name: e.checkName,
736
- value: e.value,
737
- // `detail` is stored as JSON text; parse defensively so a
738
- // corrupted blob never fails the batch flush. A parse failure
739
- // emits null rather than dropping the event.
740
- detail: parseWatchdogDetail(e.detail),
741
- // `watchdog_events` has no record-time version column — same
742
- // upload-time APP_VERSION stamping as the other non-llm_usage
743
- // event types.
744
- assistant_version: APP_VERSION,
745
- }),
746
- ),
747
677
  ];
748
678
 
749
679
  const organizationId = getPlatformOrganizationId() || undefined;
@@ -866,19 +796,6 @@ export class UsageTelemetryReporter {
866
796
  );
867
797
  }
868
798
 
869
- // Advance watchdog watermark (compound cursor)
870
- if (watchdogEvents.length > 0) {
871
- const lastWatchdog = watchdogEvents[watchdogEvents.length - 1];
872
- setMemoryCheckpoint(
873
- CHECKPOINT_KEY_WATCHDOG_WATERMARK,
874
- String(lastWatchdog.createdAt),
875
- );
876
- setMemoryCheckpoint(
877
- CHECKPOINT_KEY_WATCHDOG_WATERMARK_ID,
878
- lastWatchdog.id,
879
- );
880
- }
881
-
882
799
  // If we got a full batch of any type, there may be more — recurse.
883
800
  // Turns use the REPORTED count: when the completeness barrier truncates
884
801
  // the batch, the deferred turns must wait for a later flush (by which
@@ -891,8 +808,7 @@ export class UsageTelemetryReporter {
891
808
  onboardingEvents.length === BATCH_SIZE ||
892
809
  authFallbackEvents.length === BATCH_SIZE ||
893
810
  toolExecutedEvents.length === BATCH_SIZE ||
894
- skillLoadedEvents.length === BATCH_SIZE ||
895
- watchdogEvents.length === BATCH_SIZE
811
+ skillLoadedEvents.length === BATCH_SIZE
896
812
  ) {
897
813
  await this._doFlush(batchCount + 1);
898
814
  }
@@ -206,35 +206,6 @@ describe("AskQuestionTool.execute", () => {
206
206
  expect(result.content).toBe("Question aborted");
207
207
  });
208
208
 
209
- test("short-circuits without prompting when no interactive user is present", async () => {
210
- setNextResult(singleCompleted({ decision: "option", optionId: "a" }));
211
-
212
- const result = await askQuestionTool.execute(
213
- validInput,
214
- makeContext({ isInteractive: false }),
215
- );
216
-
217
- // The prompter must never be invoked — there is no one to answer, so the
218
- // turn proceeds with defaults instead of parking on the response backstop.
219
- expect(calls).toHaveLength(0);
220
- expect(result.isError).toBe(false);
221
- expect(result.content.toLowerCase()).toContain("no interactive user");
222
- });
223
-
224
- test("still prompts when isInteractive is true or unset", async () => {
225
- setNextResult(singleCompleted({ decision: "option", optionId: "a" }));
226
-
227
- // The short-circuit keys off an explicit `false`, not a missing flag, so an
228
- // interactive turn (or one that never set the flag) still prompts.
229
- await askQuestionTool.execute(
230
- validInput,
231
- makeContext({ isInteractive: true }),
232
- );
233
- await askQuestionTool.execute(validInput, makeContext());
234
-
235
- expect(calls).toHaveLength(2);
236
- });
237
-
238
209
  test("rejects a question with fewer than 2 options", async () => {
239
210
  setNextResult(singleCompleted({ decision: "option", optionId: "a" }));
240
211
  const result = await askQuestionTool.execute(
@@ -182,19 +182,6 @@ export const askQuestionTool = {
182
182
 
183
183
  const questions: SingleQuestion[] = parsed.data.questions;
184
184
 
185
- // No interactive user is present to answer (scheduled/headless/background
186
- // turn). Don't park the turn on a prompt no one can resolve — proceed with
187
- // defaults immediately. Non-interactive turns are already instructed not to
188
- // ask (NON_INTERACTIVE_CONTEXT_BLOCK); this is the backstop for when the
189
- // model asks anyway, so it doesn't wait out the full response timeout.
190
- if (context.isInteractive === false) {
191
- return {
192
- content:
193
- "No interactive user is present to answer; proceeding with reasonable defaults.",
194
- isError: false,
195
- };
196
- }
197
-
198
185
  const prompter = new QuestionPrompter();
199
186
  const result = await prompter.prompt({
200
187
  conversationId: context.conversationId,
@@ -528,8 +528,8 @@ export { isSideEffectTool } from "./side-effects.js";
528
528
  * handles cleanup before the executor wrapper trips.
529
529
  *
530
530
  * `ask_question` blocks on user input inside `execute()` via `QuestionPrompter`,
531
- * which waits up to `questionResponseTimeoutSec`. We give the wrapper the same
532
- * 5s buffer over that deadline so the prompter's own timeout fires first and
531
+ * which waits up to `permissionTimeoutSec`. We give the wrapper the same 5s
532
+ * buffer over that deadline so the prompter's own timeout fires first and
533
533
  * returns its clean "User did not respond within timeout" result — otherwise
534
534
  * the shorter generic budget trips first, orphaning the still-pending prompt
535
535
  * behind the confusing "may still be running in the background" error.
@@ -556,8 +556,8 @@ export function computePerToolTimeoutMs(
556
556
  return (shellTimeoutSec + 5) * 1000;
557
557
  }
558
558
  if (name === "ask_question") {
559
- const { questionResponseTimeoutSec } = getConfig().timeouts;
560
- return (questionResponseTimeoutSec + 5) * 1000;
559
+ const { permissionTimeoutSec } = getConfig().timeouts;
560
+ return (permissionTimeoutSec + 5) * 1000;
561
561
  }
562
562
  const rawTimeoutSec = getConfig().timeouts.toolExecutionTimeoutSec;
563
563
  return safeTimeoutMs(rawTimeoutSec);
@@ -826,20 +826,6 @@ export function getWorkspaceToolNames(): string[] {
826
826
  .map((t) => t.name);
827
827
  }
828
828
 
829
- /**
830
- * Return tool definitions for all currently registered workspace-origin
831
- * tools. Used by the conversation tool resolver to re-read workspace tools
832
- * from the registry each turn, the same way {@link getMcpToolDefinitions}
833
- * lets a conversation pick up MCP tools registered after it was created —
834
- * here so reconciled edits under `<workspaceDir>/tools/` are picked up
835
- * without recreating the conversation.
836
- */
837
- export function getWorkspaceToolDefinitions(): Tool[] {
838
- return Array.from(tools.values()).filter(
839
- (t) => ownersByName.get(t.name)?.kind === "workspace",
840
- );
841
- }
842
-
843
829
  /**
844
830
  * Return the names of core tools currently stripped via workspace
845
831
  * `.removed` sentinels — i.e. names where the stash holds an entry but
@@ -982,10 +968,6 @@ export async function initializeTools(): Promise<void> {
982
968
  // Workspace tools land after the core snapshot above so they're never
983
969
  // baked into the test-reset baseline.
984
970
  //
985
- // `loadWorkspaceTools` is idempotent: this is the first reconcile, and
986
- // conversation reads re-run it later to pick up on-disk edits without a
987
- // restart (see workspace-tools/loader.ts).
988
- //
989
971
  // Imported dynamically because the loader imports back from this module
990
972
  // (registerWorkspaceTools / removeCoreToolViaWorkspace); a static import
991
973
  // here would create a registry ↔ loader cycle.
@@ -20,16 +20,6 @@ export type PathFailureReason = "not_absolute" | "out_of_bounds" | "denied";
20
20
  */
21
21
  const DENIED_BASENAMES = new Set([".backup.key", "backup.key"]);
22
22
 
23
- /**
24
- * Whether a path's basename is on the denylist of files the assistant must
25
- * never read or write. Shared so callers that walk the filesystem (e.g.
26
- * `code_search`) apply the same denylist as `sandboxPolicy`/`hostPolicy`,
27
- * keeping the three in sync.
28
- */
29
- export function isDeniedBasename(path: string): boolean {
30
- return DENIED_BASENAMES.has(basename(path));
31
- }
32
-
33
23
  export type PathResult =
34
24
  | { ok: true; resolved: string }
35
25
  | { ok: false; reason: PathFailureReason; error: string };
@@ -148,7 +138,10 @@ export function sandboxPolicy(
148
138
 
149
139
  // Check both the logical path and the symlink-resolved path so a symlink
150
140
  // with a non-denied name pointing at a denied file is still caught.
151
- if (isDeniedBasename(resolved) || isDeniedBasename(realResolved)) {
141
+ if (
142
+ DENIED_BASENAMES.has(basename(resolved)) ||
143
+ DENIED_BASENAMES.has(basename(realResolved))
144
+ ) {
152
145
  return {
153
146
  ok: false,
154
147
  reason: "denied",
@@ -175,7 +168,7 @@ export function hostPolicy(rawPath: string): PathResult {
175
168
  error: `path must be absolute for host file access: ${rawPath}`,
176
169
  };
177
170
  }
178
- if (isDeniedBasename(rawPath)) {
171
+ if (DENIED_BASENAMES.has(basename(rawPath))) {
179
172
  return {
180
173
  ok: false,
181
174
  reason: "denied",
@@ -553,7 +553,7 @@ export class ToolApprovalHandler {
553
553
  const inputDigest =
554
554
  deferredConsumeParams?.inputDigest ??
555
555
  computeToolApprovalDigest(name, input);
556
- const escalation = await createOrReuseToolGrantRequest({
556
+ const escalation = createOrReuseToolGrantRequest({
557
557
  assistantId: context.assistantId,
558
558
  sourceChannel: context.executionChannel as ChannelId,
559
559
  conversationId: context.conversationId,
@@ -10,7 +10,6 @@
10
10
  * is a `Tool` (`Required<ToolDefinition>`).
11
11
  */
12
12
 
13
- import { resolveExecutionTarget } from "./execution-target.js";
14
13
  import type {
15
14
  RiskLevel,
16
15
  Tool,
@@ -31,10 +30,7 @@ import type {
31
30
  * are rejected at the JSON-schema layer.
32
31
  * - `executionTarget` defaults to `sandbox` — author-supplied tool code
33
32
  * runs in the assistant container by default; opt in to `host` when
34
- * the tool proxies work to the connected client. The name-prefix
35
- * heuristic (`host_*` / `computer_use_*` resolves to host) is applied
36
- * by `resolveExecutionTarget` in `finalizeTool`, so a tool named
37
- * `host_my_thing` defaults to host even without an explicit field.
33
+ * the tool proxies work to the connected client.
38
34
  * - `category` defaults to empty — Slack channel `allowedToolCategories`
39
35
  * policy denies uncategorized tools when a category allow-list is set,
40
36
  * which is the correct deny-by-default for tools the author didn't
@@ -94,10 +90,8 @@ export function finalizeTool(tool: ToolDefinition, defaultName = ""): Tool {
94
90
  content: `tool ${name} has no execute implementation`,
95
91
  isError: true,
96
92
  });
97
- const executionTarget =
98
- tool.executionTarget ?? resolveExecutionTarget({ name });
93
+ const executionTarget = tool.executionTarget ?? TOOL_DEFAULTS.executionTarget;
99
94
  const category = tool.category ?? TOOL_DEFAULTS.category;
100
- const exclusive = tool.exclusive ?? false;
101
95
  return {
102
96
  ...tool,
103
97
  name,
@@ -107,6 +101,5 @@ export function finalizeTool(tool: ToolDefinition, defaultName = ""): Tool {
107
101
  executionTarget,
108
102
  execute,
109
103
  category,
110
- exclusive,
111
104
  };
112
105
  }
@@ -18,7 +18,6 @@ import { runAuthenticatedCommandTool } from "./credential-execution/run-authenti
18
18
  import { fileEditTool } from "./filesystem/edit.js";
19
19
  import { fileListTool } from "./filesystem/list.js";
20
20
  import { fileReadTool } from "./filesystem/read.js";
21
- import { codeSearchTool } from "./filesystem/search.js";
22
21
  import { fileWriteTool } from "./filesystem/write.js";
23
22
  import { recallTool, rememberTool } from "./memory/register.js";
24
23
  import { webFetchTool } from "./network/web-fetch.js";
@@ -60,7 +59,6 @@ export const eagerModuleToolNames: string[] = [
60
59
  "file_write",
61
60
  "file_edit",
62
61
  "file_list",
63
- "code_search",
64
62
  "web_search",
65
63
  "web_fetch",
66
64
  "skill_execute",
@@ -83,7 +81,6 @@ export const explicitTools: ToolDefinition[] = [
83
81
  fileWriteTool,
84
82
  fileEditTool,
85
83
  fileListTool,
86
- codeSearchTool,
87
84
  webFetchTool,
88
85
  webSearchTool,
89
86
  skillExecuteTool,
@@ -449,15 +449,6 @@ export const ToolDefinitionSchema = z.object({
449
449
  ) => Promise<ToolExecutionResult>
450
450
  >()
451
451
  .optional(),
452
- /**
453
- * When true, this tool runs alone in its turn. If the model emits it
454
- * alongside other tool calls, the agent loop executes only this one and
455
- * defers the siblings — returning them un-run with a benign notice — so the
456
- * model incorporates this tool's output before acting on anything else. The
457
- * `advisor` tool sets this so its guidance lands before the agent commits to
458
- * a path. Default false (the loop runs sibling calls concurrently as usual).
459
- */
460
- exclusive: z.boolean().optional(),
461
452
  });
462
453
 
463
454
  /**
@@ -469,14 +460,8 @@ export const ToolDefinitionSchema = z.object({
469
460
  */
470
461
  export type ToolDefinition = z.infer<typeof ToolDefinitionSchema>;
471
462
 
472
- /**
473
- * Tool after the loader has derived its name and filled defaults. Every field
474
- * is required except `exclusive`, which stays optional — most tools never set
475
- * it, and the agent loop reads it as `?.exclusive === true`, so forcing every
476
- * hand-built `Tool` (MCP/meet/test fixtures) to carry it would be noise.
477
- */
478
- export type Tool = Required<Omit<ToolDefinition, "exclusive">> &
479
- Pick<ToolDefinition, "exclusive">;
463
+ /** Tool after the loader has derived its name and filled defaults. */
464
+ export type Tool = Required<ToolDefinition>;
480
465
 
481
466
  /** The kind of extension that owns a tool. Core tools have no owner. */
482
467
  export type OwnerKind = "skill" | "mcp" | "plugin" | "workspace";