@vellumai/assistant 0.6.4 → 0.6.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 (717) hide show
  1. package/.prettierignore +5 -0
  2. package/ARCHITECTURE.md +32 -36
  3. package/Dockerfile +12 -0
  4. package/README.md +3 -4
  5. package/bun.lock +8 -3
  6. package/docs/architecture/integrations.md +1 -20
  7. package/docs/architecture/security.md +16 -16
  8. package/docs/error-handling.md +111 -0
  9. package/docs/skills.md +10 -10
  10. package/docs/stt-provider-onboarding.md +2 -1
  11. package/knip.json +9 -2
  12. package/node_modules/@vellumai/ces-contracts/package.json +2 -1
  13. package/node_modules/@vellumai/ces-contracts/src/__tests__/trust-rules.test.ts +471 -0
  14. package/node_modules/@vellumai/ces-contracts/src/trust-rules.ts +398 -4
  15. package/node_modules/@vellumai/credential-storage/bun.lock +2 -2
  16. package/node_modules/@vellumai/credential-storage/package.json +2 -2
  17. package/node_modules/@vellumai/credential-storage/src/oauth-runtime.ts +20 -2
  18. package/node_modules/@vellumai/egress-proxy/bun.lock +2 -2
  19. package/node_modules/@vellumai/egress-proxy/package.json +2 -2
  20. package/openapi.yaml +123 -11
  21. package/package.json +6 -3
  22. package/scripts/generate-openapi.ts +50 -11
  23. package/src/__tests__/agent-loop-callsite-precedence.test.ts +318 -0
  24. package/src/__tests__/agent-loop-sentry-hygiene.test.ts +137 -0
  25. package/src/__tests__/agent-loop.test.ts +112 -1
  26. package/src/__tests__/anthropic-error-formatting.test.ts +98 -0
  27. package/src/__tests__/anthropic-provider.test.ts +171 -2
  28. package/src/__tests__/approval-cascade.test.ts +31 -10
  29. package/src/__tests__/approval-routes-http.test.ts +134 -10
  30. package/src/__tests__/assistant-attachments.test.ts +44 -0
  31. package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -0
  32. package/src/__tests__/browser-fill-credential.test.ts +1 -1
  33. package/src/__tests__/browser-identifier-parity-guard.test.ts +53 -0
  34. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +23 -33
  35. package/src/__tests__/browser-skill-endstate.test.ts +51 -182
  36. package/src/__tests__/btw-routes.test.ts +47 -1
  37. package/src/__tests__/call-controller.test.ts +1 -2
  38. package/src/__tests__/call-site-routing-provider.test.ts +214 -0
  39. package/src/__tests__/catalog-cache.test.ts +27 -4
  40. package/src/__tests__/channel-approval-routes.test.ts +4 -4
  41. package/src/__tests__/channel-reply-delivery.test.ts +300 -2
  42. package/src/__tests__/checker.test.ts +428 -501
  43. package/src/__tests__/cli-command-risk-guard.test.ts +30 -33
  44. package/src/__tests__/compaction-circuit-breaker.test.ts +336 -0
  45. package/src/__tests__/compaction.benchmark.test.ts +1 -1
  46. package/src/__tests__/config-analysis.test.ts +11 -28
  47. package/src/__tests__/config-loader-backfill.test.ts +174 -0
  48. package/src/__tests__/config-loader-corrupt.test.ts +183 -0
  49. package/src/__tests__/config-loader-quarantine-bulletin.test.ts +202 -0
  50. package/src/__tests__/config-schema-cmd.test.ts +11 -5
  51. package/src/__tests__/config-schema.test.ts +427 -114
  52. package/src/__tests__/config-watcher.test.ts +2 -2
  53. package/src/__tests__/contact-store-user-file.test.ts +72 -73
  54. package/src/__tests__/contacts-write.test.ts +4 -4
  55. package/src/__tests__/context-token-estimator.test.ts +191 -1
  56. package/src/__tests__/context-window-manager.test.ts +530 -2
  57. package/src/__tests__/conversation-abort-tool-results.test.ts +30 -16
  58. package/src/__tests__/conversation-agent-loop-overflow.test.ts +61 -17
  59. package/src/__tests__/conversation-agent-loop.test.ts +412 -82
  60. package/src/__tests__/conversation-attachments.test.ts +1 -1
  61. package/src/__tests__/conversation-confirmation-signals.test.ts +30 -9
  62. package/src/__tests__/conversation-error.test.ts +37 -6
  63. package/src/__tests__/conversation-history-web-search.test.ts +6 -0
  64. package/src/__tests__/conversation-init.benchmark.test.ts +36 -0
  65. package/src/__tests__/conversation-lifecycle.test.ts +336 -0
  66. package/src/__tests__/conversation-load-history-repair.test.ts +27 -10
  67. package/src/__tests__/conversation-pre-run-repair.test.ts +30 -16
  68. package/src/__tests__/conversation-process-callsite.test.ts +306 -0
  69. package/src/__tests__/conversation-provider-retry-repair.test.ts +30 -16
  70. package/src/__tests__/conversation-queue.test.ts +41 -26
  71. package/src/__tests__/conversation-routes-disk-view.test.ts +29 -1
  72. package/src/__tests__/conversation-routes-slash-commands.test.ts +31 -3
  73. package/src/__tests__/conversation-runtime-assembly.test.ts +2735 -55
  74. package/src/__tests__/conversation-runtime-workspace.test.ts +12 -12
  75. package/src/__tests__/conversation-skill-tools.test.ts +12 -146
  76. package/src/__tests__/conversation-slash-queue.test.ts +34 -19
  77. package/src/__tests__/conversation-slash-unknown.test.ts +30 -16
  78. package/src/__tests__/conversation-speed-override.test.ts +30 -11
  79. package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1035 -0
  80. package/src/__tests__/conversation-surfaces-standalone.test.ts +630 -0
  81. package/src/__tests__/conversation-title-service.test.ts +2 -2
  82. package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +1 -1
  83. package/src/__tests__/conversation-unread-route.test.ts +2 -2
  84. package/src/__tests__/conversation-usage.test.ts +3 -1
  85. package/src/__tests__/conversation-workspace-cache-state.test.ts +31 -10
  86. package/src/__tests__/conversation-workspace-injection.test.ts +43 -15
  87. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +44 -16
  88. package/src/__tests__/credential-broker-browser-fill.test.ts +110 -0
  89. package/src/__tests__/credential-security-invariants.test.ts +3 -0
  90. package/src/__tests__/credential-storage-oauth-compat.test.ts +18 -0
  91. package/src/__tests__/credential-storage-static-compat.test.ts +28 -0
  92. package/src/__tests__/credential-vault-unit.test.ts +135 -19
  93. package/src/__tests__/credentials-cli.test.ts +1 -9
  94. package/src/__tests__/cross-provider-web-search.test.ts +84 -0
  95. package/src/__tests__/daemon-server-persist-and-process-callsite.test.ts +92 -0
  96. package/src/__tests__/delete-propagation.test.ts +437 -0
  97. package/src/__tests__/dm-backfill.test.ts +417 -0
  98. package/src/__tests__/dm-persistence.test.ts +227 -0
  99. package/src/__tests__/edit-propagation.test.ts +280 -0
  100. package/src/__tests__/ephemeral-permissions.test.ts +93 -3
  101. package/src/__tests__/estimator-calibration-integration.test.ts +208 -0
  102. package/src/__tests__/estimator-calibration.test.ts +213 -0
  103. package/src/__tests__/extension-id-sync-guard.test.ts +26 -7
  104. package/src/__tests__/file-write-tool.test.ts +151 -1
  105. package/src/__tests__/filing-service.test.ts +255 -0
  106. package/src/__tests__/gemini-provider.test.ts +0 -3
  107. package/src/__tests__/guardian-grant-minting.test.ts +8 -0
  108. package/src/__tests__/headless-browser-interactions.test.ts +1 -1
  109. package/src/__tests__/heartbeat-service.test.ts +96 -15
  110. package/src/__tests__/host-shell-tool.test.ts +124 -18
  111. package/src/__tests__/http-user-message-parity.test.ts +29 -1
  112. package/src/__tests__/inbound-slack-persistence.test.ts +340 -0
  113. package/src/__tests__/intent-routing.test.ts +1 -40
  114. package/src/__tests__/llm-catalog-parity.test.ts +174 -0
  115. package/src/__tests__/llm-context-normalization.test.ts +121 -0
  116. package/src/__tests__/llm-resolver.test.ts +214 -0
  117. package/src/__tests__/llm-schema.test.ts +223 -0
  118. package/src/__tests__/managed-proxy-context.test.ts +6 -2
  119. package/src/__tests__/messaging-skill-split.test.ts +3 -34
  120. package/src/__tests__/migration-import-from-url.test.ts +684 -0
  121. package/src/__tests__/model-intents.test.ts +9 -83
  122. package/src/__tests__/notification-decision-fallback.test.ts +0 -10
  123. package/src/__tests__/notification-decision-identity.test.ts +0 -9
  124. package/src/__tests__/notification-decision-recipient-context.test.ts +0 -9
  125. package/src/__tests__/oauth-store.test.ts +10 -7
  126. package/src/__tests__/oauth2-gateway-transport.test.ts +8 -3
  127. package/src/__tests__/oauth2-refresh-retry.test.ts +279 -0
  128. package/src/__tests__/openai-provider.test.ts +7 -0
  129. package/src/__tests__/openai-responses-provider.test.ts +396 -0
  130. package/src/__tests__/openrouter-provider-only.test.ts +135 -0
  131. package/src/__tests__/outbound-slack-persistence.test.ts +293 -0
  132. package/src/__tests__/permission-checker-host-gate.test.ts +1 -1
  133. package/src/__tests__/permission-mode.test.ts +16 -0
  134. package/src/__tests__/permission-types.test.ts +0 -1
  135. package/src/__tests__/persona-resolver.test.ts +13 -13
  136. package/src/__tests__/pkb-autoinject.test.ts +37 -1
  137. package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
  138. package/src/__tests__/pricing.test.ts +50 -3
  139. package/src/__tests__/profiler-routes.test.ts +1 -1
  140. package/src/__tests__/provider-commit-message-generator.test.ts +14 -84
  141. package/src/__tests__/provider-env-vars-scope.test.ts +52 -0
  142. package/src/__tests__/provider-error-scenarios.test.ts +135 -6
  143. package/src/__tests__/provider-managed-proxy-integration.test.ts +42 -11
  144. package/src/__tests__/provider-registry-ollama.test.ts +1 -2
  145. package/src/__tests__/proxy-approval-callback.test.ts +0 -1
  146. package/src/__tests__/reaction-persistence.test.ts +560 -0
  147. package/src/__tests__/relay-server.test.ts +1 -1
  148. package/src/__tests__/require-fresh-approval.test.ts +1 -1
  149. package/src/__tests__/retry-openrouter-only-normalization.test.ts +136 -0
  150. package/src/__tests__/retry-thinking-tool-choice.test.ts +226 -0
  151. package/src/__tests__/risk-classifier-parity.test.ts +230 -0
  152. package/src/__tests__/sanitize-config-for-transfer.test.ts +78 -1
  153. package/src/__tests__/secret-ingress-http.test.ts +28 -0
  154. package/src/__tests__/secret-prompter-channel-fallback.test.ts +125 -0
  155. package/src/__tests__/secret-routes-managed-proxy.test.ts +2 -3
  156. package/src/__tests__/secret-scanner-executor.test.ts +1 -1
  157. package/src/__tests__/send-endpoint-busy.test.ts +29 -1
  158. package/src/__tests__/server-history-render.test.ts +31 -0
  159. package/src/__tests__/shell-parser-property.test.ts +13 -13
  160. package/src/__tests__/skill-cache-store.test.ts +182 -0
  161. package/src/__tests__/skills.test.ts +19 -33
  162. package/src/__tests__/slack-app-setup-skill-regression.test.ts +3 -1
  163. package/src/__tests__/slack-skill.test.ts +3 -8
  164. package/src/__tests__/starter-bundle.test.ts +35 -0
  165. package/src/__tests__/subagent-call-site-routing.test.ts +280 -0
  166. package/src/__tests__/suggestion-routes.test.ts +160 -3
  167. package/src/__tests__/system-prompt.test.ts +22 -35
  168. package/src/__tests__/task-runner.test.ts +3 -1
  169. package/src/__tests__/tcc-sandbox-deny.test.ts +198 -0
  170. package/src/__tests__/terminal-tools.test.ts +8 -0
  171. package/src/__tests__/test-support/browser-skill-harness.ts +2 -52
  172. package/src/__tests__/thread-backfill.test.ts +941 -0
  173. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -2
  174. package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
  175. package/src/__tests__/tool-executor.test.ts +60 -94
  176. package/src/__tests__/trust-store.test.ts +442 -109
  177. package/src/__tests__/update-bulletin-job.test.ts +389 -0
  178. package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -1
  179. package/src/__tests__/verification-control-plane-policy.test.ts +1 -22
  180. package/src/__tests__/voice-session-bridge.test.ts +39 -0
  181. package/src/__tests__/volume-security-guard.test.ts +3 -2
  182. package/src/__tests__/web-search-history.test.ts +337 -0
  183. package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +343 -0
  184. package/src/__tests__/workspace-migration-043-release-notes-latex-rendering.test.ts +202 -0
  185. package/src/__tests__/workspace-migration-045-release-notes-meet-avatar.test.ts +210 -0
  186. package/src/__tests__/workspace-migration-drop-user-md.test.ts +11 -11
  187. package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +841 -0
  188. package/src/__tests__/workspace-policy.test.ts +1 -13
  189. package/src/acp/client-handler.ts +1 -2
  190. package/src/agent/loop.ts +209 -17
  191. package/src/avatar/resvg-lazy.test.ts +136 -0
  192. package/src/avatar/resvg-lazy.ts +82 -9
  193. package/src/avatar/traits-png-sync.ts +21 -1
  194. package/src/browser/__tests__/operations.test.ts +163 -0
  195. package/src/browser/identifiers.ts +51 -0
  196. package/src/browser/operations.ts +660 -0
  197. package/src/browser/types.ts +81 -0
  198. package/src/calls/guardian-question-copy.ts +2 -2
  199. package/src/calls/telephony-stt-routing.ts +1 -1
  200. package/src/calls/voice-session-bridge.ts +1 -0
  201. package/src/cli/AGENTS.md +1 -1
  202. package/src/cli/commands/__tests__/attachment.test.ts +438 -0
  203. package/src/cli/commands/__tests__/browser.test.ts +554 -0
  204. package/src/cli/commands/__tests__/cache.test.ts +623 -0
  205. package/src/cli/commands/__tests__/email-list.test.ts +6 -0
  206. package/src/cli/commands/__tests__/email-send.test.ts +93 -1
  207. package/src/cli/commands/__tests__/image-generation.test.ts +666 -0
  208. package/src/cli/commands/__tests__/inference-send.test.ts +451 -0
  209. package/src/cli/commands/__tests__/stt-transcribe.test.ts +454 -0
  210. package/src/cli/commands/__tests__/task.test.ts +913 -0
  211. package/src/cli/commands/__tests__/tts-synthesize.test.ts +594 -0
  212. package/src/cli/commands/__tests__/ui-confirm.test.ts +650 -0
  213. package/src/cli/commands/__tests__/ui.test.ts +1215 -0
  214. package/src/cli/commands/__tests__/watchers.test.ts +716 -0
  215. package/src/cli/commands/attachment.ts +182 -0
  216. package/src/cli/commands/browser.ts +350 -0
  217. package/src/cli/commands/cache.ts +341 -0
  218. package/src/cli/commands/completions.ts +0 -3
  219. package/src/cli/commands/config.ts +6 -6
  220. package/src/cli/commands/conversations-import.ts +347 -0
  221. package/src/cli/commands/conversations.ts +14 -1
  222. package/src/cli/commands/email.ts +234 -194
  223. package/src/cli/commands/image-generation.ts +300 -0
  224. package/src/cli/commands/inference.ts +200 -0
  225. package/src/cli/commands/memory.ts +127 -17
  226. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
  227. package/src/cli/commands/platform/__tests__/connect.test.ts +0 -1
  228. package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -1
  229. package/src/cli/commands/platform/__tests__/status.test.ts +0 -1
  230. package/src/cli/commands/stt.ts +339 -0
  231. package/src/cli/commands/task.ts +795 -0
  232. package/src/cli/commands/trust.ts +50 -19
  233. package/src/cli/commands/tts.ts +273 -0
  234. package/src/cli/commands/ui.ts +670 -0
  235. package/src/cli/commands/watchers.ts +509 -0
  236. package/src/cli/lib/daemon-credential-client.ts +0 -19
  237. package/src/cli/program.ts +23 -4
  238. package/src/cli.ts +0 -37
  239. package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +23 -1
  240. package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
  241. package/src/config/bundled-skills/messaging/SKILL.md +2 -2
  242. package/src/config/bundled-skills/messaging/TOOLS.json +4 -0
  243. package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +8 -1
  244. package/src/config/bundled-skills/messaging/tools/messaging-read.ts +15 -1
  245. package/src/config/bundled-skills/messaging/tools/messaging-search.ts +21 -1
  246. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +11 -12
  247. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +9 -8
  248. package/src/config/bundled-skills/settings/TOOLS.json +3 -3
  249. package/src/config/bundled-tool-registry.ts +0 -175
  250. package/src/config/env.ts +7 -2
  251. package/src/config/feature-flag-registry.json +25 -9
  252. package/src/config/llm-resolver.ts +128 -0
  253. package/src/config/loader.ts +194 -10
  254. package/src/config/raw-config-utils.ts +30 -2
  255. package/src/config/sanitize-for-transfer.ts +35 -0
  256. package/src/config/schema.ts +30 -41
  257. package/src/config/schemas/analysis.ts +3 -22
  258. package/src/config/schemas/calls.ts +0 -4
  259. package/src/config/schemas/filing.ts +2 -7
  260. package/src/config/schemas/heartbeat.ts +0 -5
  261. package/src/config/schemas/inference.ts +3 -23
  262. package/src/config/schemas/llm.ts +318 -0
  263. package/src/config/schemas/memory-processing.ts +1 -9
  264. package/src/config/schemas/notifications.ts +4 -11
  265. package/src/config/schemas/platform.ts +3 -9
  266. package/src/config/schemas/security.ts +33 -0
  267. package/src/config/schemas/services.ts +9 -4
  268. package/src/config/schemas/stt.ts +1 -0
  269. package/src/config/schemas/tts.ts +53 -0
  270. package/src/config/schemas/updates.ts +1 -1
  271. package/src/config/schemas/workspace-git.ts +3 -40
  272. package/src/config/skills.ts +2 -2
  273. package/src/context/__tests__/compact-prompt.test.ts +45 -0
  274. package/src/context/__tests__/microcompact.test.ts +805 -0
  275. package/src/context/estimator-calibration.ts +136 -0
  276. package/src/context/microcompact.ts +443 -0
  277. package/src/context/prompts/compact.md +12 -0
  278. package/src/context/token-estimator.ts +61 -3
  279. package/src/context/window-manager.ts +229 -25
  280. package/src/credential-execution/approval-bridge.ts +0 -1
  281. package/src/credential-execution/executable-discovery.ts +19 -8
  282. package/src/credential-execution/process-manager.test.ts +109 -0
  283. package/src/credential-execution/process-manager.ts +65 -2
  284. package/src/daemon/approval-generators.ts +29 -4
  285. package/src/daemon/assistant-attachments.ts +24 -13
  286. package/src/daemon/classifier.ts +2 -2
  287. package/src/daemon/config-watcher.ts +0 -1
  288. package/src/daemon/context-overflow-reducer.ts +4 -1
  289. package/src/daemon/conversation-agent-loop-handlers.ts +79 -12
  290. package/src/daemon/conversation-agent-loop.ts +462 -80
  291. package/src/daemon/conversation-attachments.ts +2 -6
  292. package/src/daemon/conversation-error.ts +36 -1
  293. package/src/daemon/conversation-lifecycle.ts +30 -6
  294. package/src/daemon/conversation-messaging.ts +73 -4
  295. package/src/daemon/conversation-process.ts +10 -4
  296. package/src/daemon/conversation-queue-manager.ts +3 -0
  297. package/src/daemon/conversation-runtime-assembly.ts +760 -29
  298. package/src/daemon/conversation-slash.ts +2 -2
  299. package/src/daemon/conversation-surfaces.ts +389 -1
  300. package/src/daemon/conversation-tool-setup.ts +10 -5
  301. package/src/daemon/conversation-usage.ts +1 -1
  302. package/src/daemon/conversation.ts +118 -30
  303. package/src/daemon/external-skills-bootstrap.ts +41 -0
  304. package/src/daemon/guardian-action-generators.ts +34 -14
  305. package/src/daemon/handlers/config-model.test.ts +86 -0
  306. package/src/daemon/handlers/config-model.ts +54 -12
  307. package/src/daemon/handlers/conversations.ts +9 -2
  308. package/src/daemon/handlers/shared.ts +39 -11
  309. package/src/daemon/handlers/skills.ts +2 -2
  310. package/src/daemon/handlers/slack-channel-oauth-install.ts +197 -0
  311. package/src/daemon/lifecycle.ts +76 -14
  312. package/src/daemon/message-types/conversations.ts +14 -0
  313. package/src/daemon/message-types/messages.ts +9 -1
  314. package/src/daemon/message-types/trust.ts +0 -2
  315. package/src/daemon/parse-actual-tokens-from-error.test.ts +57 -1
  316. package/src/daemon/parse-actual-tokens-from-error.ts +66 -0
  317. package/src/daemon/pkb-context-tracker.test.ts +169 -0
  318. package/src/daemon/pkb-context-tracker.ts +125 -0
  319. package/src/daemon/pkb-reminder-builder.test.ts +70 -0
  320. package/src/daemon/pkb-reminder-builder.ts +31 -0
  321. package/src/daemon/providers-setup.ts +6 -0
  322. package/src/daemon/server.ts +117 -9
  323. package/src/daemon/tool-side-effects.ts +0 -9
  324. package/src/daemon/watch-handler.ts +4 -4
  325. package/src/daemon/web-search-history.ts +126 -0
  326. package/src/events/domain-events.ts +0 -1
  327. package/src/filing/filing-service.ts +9 -10
  328. package/src/heartbeat/heartbeat-service.ts +76 -28
  329. package/src/home/__tests__/feed-scheduler.test.ts +39 -11
  330. package/src/home/__tests__/rollup-producer.test.ts +44 -0
  331. package/src/home/assistant-feed-authoring.ts +4 -0
  332. package/src/home/emit-feed-event.ts +4 -0
  333. package/src/home/feed-scheduler.ts +20 -4
  334. package/src/home/feed-types.ts +56 -2
  335. package/src/home/relationship-state-writer.ts +2 -2
  336. package/src/home/rollup-producer.ts +34 -5
  337. package/src/home/suggested-prompts.ts +101 -0
  338. package/src/ipc/__tests__/attachment-ipc.test.ts +213 -0
  339. package/src/ipc/__tests__/browser-ipc.test.ts +339 -0
  340. package/src/ipc/__tests__/cache-ipc.test.ts +266 -0
  341. package/src/ipc/__tests__/socket-path.test.ts +73 -0
  342. package/src/ipc/__tests__/task-ipc.test.ts +577 -0
  343. package/src/ipc/__tests__/ui-request-route.test.ts +495 -0
  344. package/src/ipc/__tests__/watcher-ipc.test.ts +295 -0
  345. package/src/ipc/cli-client.ts +2 -1
  346. package/src/ipc/cli-server.ts +26 -8
  347. package/src/ipc/gateway-client.ts +4 -4
  348. package/src/ipc/routes/attachment.ts +114 -0
  349. package/src/ipc/routes/browser-context.ts +61 -0
  350. package/src/ipc/routes/browser.ts +96 -0
  351. package/src/ipc/routes/cache.ts +96 -0
  352. package/src/ipc/routes/index.ts +17 -1
  353. package/src/ipc/routes/task-queue.ts +226 -0
  354. package/src/ipc/routes/task.ts +173 -0
  355. package/src/ipc/routes/ui-request.ts +50 -0
  356. package/src/ipc/routes/watcher.ts +203 -0
  357. package/src/ipc/socket-path.ts +100 -0
  358. package/src/memory/__tests__/conversation-analyze-job.test.ts +9 -8
  359. package/src/memory/__tests__/conversation-group-migration.test.ts +99 -0
  360. package/src/memory/admin.ts +18 -0
  361. package/src/memory/conversation-analyze-job.ts +14 -13
  362. package/src/memory/conversation-attention-store.ts +13 -6
  363. package/src/memory/conversation-crud.ts +103 -3
  364. package/src/memory/conversation-group-migration.ts +38 -6
  365. package/src/memory/conversation-title-service.ts +7 -4
  366. package/src/memory/db-init.ts +2 -0
  367. package/src/memory/embedding-backend.ts +1 -1
  368. package/src/memory/graph/compaction.ts +299 -0
  369. package/src/memory/graph/consolidation.ts +4 -4
  370. package/src/memory/graph/conversation-graph-memory.ts +89 -29
  371. package/src/memory/graph/extraction.test.ts +272 -2
  372. package/src/memory/graph/extraction.ts +173 -51
  373. package/src/memory/graph/graph-search.test.ts +92 -0
  374. package/src/memory/graph/graph-search.ts +4 -1
  375. package/src/memory/graph/narrative.ts +2 -2
  376. package/src/memory/graph/pattern-scan.ts +2 -2
  377. package/src/memory/graph/retriever.test.ts +459 -0
  378. package/src/memory/graph/retriever.ts +230 -48
  379. package/src/memory/graph/store.ts +41 -0
  380. package/src/memory/graph/tool-handlers.ts +27 -0
  381. package/src/memory/graph/tools.ts +6 -1
  382. package/src/memory/indexer.ts +5 -5
  383. package/src/memory/job-handlers/conversation-starters.ts +23 -20
  384. package/src/memory/job-handlers/summarization.ts +2 -2
  385. package/src/memory/job-utils.ts +7 -1
  386. package/src/memory/jobs/embed-pkb-file.test.ts +168 -0
  387. package/src/memory/jobs/embed-pkb-file.ts +54 -0
  388. package/src/memory/jobs-store.ts +44 -3
  389. package/src/memory/jobs-worker.ts +4 -0
  390. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +1 -1
  391. package/src/memory/migrations/220-normalize-user-file-by-principal.ts +2 -2
  392. package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +82 -0
  393. package/src/memory/migrations/index.ts +1 -0
  394. package/src/memory/pkb/pkb-index.test.ts +368 -0
  395. package/src/memory/pkb/pkb-index.ts +255 -0
  396. package/src/memory/pkb/pkb-reconcile.test.ts +251 -0
  397. package/src/memory/pkb/pkb-reconcile.ts +148 -0
  398. package/src/memory/pkb/pkb-search.test.ts +438 -0
  399. package/src/memory/pkb/pkb-search.ts +137 -0
  400. package/src/memory/pkb/types.ts +53 -0
  401. package/src/memory/qdrant-client.ts +122 -1
  402. package/src/memory/slack-thread-store.ts +37 -0
  403. package/src/messaging/providers/gmail/adapter.ts +6 -16
  404. package/src/messaging/providers/gmail/client.ts +22 -0
  405. package/src/messaging/providers/gmail/types.ts +7 -0
  406. package/src/messaging/providers/slack/adapter.ts +14 -2
  407. package/src/messaging/providers/slack/backfill.test.ts +257 -0
  408. package/src/messaging/providers/slack/backfill.ts +101 -0
  409. package/src/messaging/providers/slack/message-metadata.test.ts +316 -0
  410. package/src/messaging/providers/slack/message-metadata.ts +123 -0
  411. package/src/messaging/providers/slack/render-transcript.test.ts +1373 -0
  412. package/src/messaging/providers/slack/render-transcript.ts +443 -0
  413. package/src/messaging/style-analyzer.ts +5 -2
  414. package/src/notifications/README.md +9 -5
  415. package/src/notifications/decision-engine.ts +3 -9
  416. package/src/notifications/preference-extractor.ts +2 -6
  417. package/src/oauth/oauth-store.ts +1 -0
  418. package/src/oauth/platform-connection.test.ts +47 -0
  419. package/src/oauth/platform-connection.ts +15 -5
  420. package/src/oauth/seed-providers.ts +4 -2
  421. package/src/permissions/approval-policy.test.ts +948 -0
  422. package/src/permissions/approval-policy.ts +257 -0
  423. package/src/permissions/bash-risk-classifier.test.ts +1208 -0
  424. package/src/permissions/bash-risk-classifier.ts +707 -0
  425. package/src/permissions/checker.ts +217 -708
  426. package/src/permissions/command-registry.test.ts +535 -0
  427. package/src/permissions/command-registry.ts +825 -0
  428. package/src/permissions/defaults.ts +26 -78
  429. package/src/permissions/file-risk-classifier.test.ts +535 -0
  430. package/src/permissions/file-risk-classifier.ts +274 -0
  431. package/src/permissions/risk-types.ts +205 -0
  432. package/src/permissions/secret-prompter.ts +53 -2
  433. package/src/permissions/skill-risk-classifier.test.ts +311 -0
  434. package/src/permissions/skill-risk-classifier.ts +214 -0
  435. package/src/permissions/trust-client.ts +52 -25
  436. package/src/permissions/trust-store-interface.ts +1 -6
  437. package/src/permissions/trust-store.ts +161 -62
  438. package/src/permissions/types.ts +23 -14
  439. package/src/permissions/web-risk-classifier.test.ts +170 -0
  440. package/src/permissions/web-risk-classifier.ts +89 -0
  441. package/src/permissions/workspace-policy.ts +1 -16
  442. package/src/platform/client.ts +19 -1
  443. package/src/prompts/persona-resolver.ts +3 -3
  444. package/src/prompts/system-prompt.ts +19 -20
  445. package/src/prompts/templates/SOUL.md +2 -2
  446. package/src/prompts/update-bulletin-job.ts +190 -0
  447. package/src/providers/__tests__/context-overflow-error.test.ts +328 -0
  448. package/src/providers/__tests__/provider-env-vars.test.ts +102 -0
  449. package/src/providers/__tests__/retry-callsite.test.ts +424 -0
  450. package/src/providers/anthropic/client.ts +183 -14
  451. package/src/providers/call-site-routing.ts +71 -0
  452. package/src/providers/gemini/client.ts +65 -2
  453. package/src/providers/managed-proxy/constants.ts +2 -1
  454. package/src/providers/model-catalog.ts +501 -33
  455. package/src/providers/model-intents.ts +4 -4
  456. package/src/providers/openai/chat-completions-provider.ts +57 -1
  457. package/src/providers/openai/responses-provider.ts +86 -9
  458. package/src/providers/openrouter/client.ts +76 -9
  459. package/src/providers/provider-env-vars.ts +56 -0
  460. package/src/providers/provider-send-message.ts +22 -5
  461. package/src/providers/ratelimit.ts +4 -0
  462. package/src/providers/registry.ts +19 -8
  463. package/src/providers/retry.ts +174 -39
  464. package/src/providers/speech-to-text/__tests__/resolve.test.ts +55 -0
  465. package/src/providers/speech-to-text/google-gemini-live-stream.ts +4 -4
  466. package/src/providers/speech-to-text/provider-catalog.ts +17 -0
  467. package/src/providers/speech-to-text/resolve.ts +7 -0
  468. package/src/providers/speech-to-text/xai-realtime.test.ts +578 -0
  469. package/src/providers/speech-to-text/xai-realtime.ts +796 -0
  470. package/src/providers/speech-to-text/xai.test.ts +155 -0
  471. package/src/providers/speech-to-text/xai.ts +97 -0
  472. package/src/providers/types.ts +93 -3
  473. package/src/runtime/AGENTS.md +2 -2
  474. package/src/runtime/__tests__/agent-wake.test.ts +43 -2
  475. package/src/runtime/__tests__/interactive-ui.test.ts +673 -0
  476. package/src/runtime/agent-wake.ts +63 -22
  477. package/src/runtime/auth/route-policy.ts +4 -0
  478. package/src/runtime/btw-sidechain.ts +13 -3
  479. package/src/runtime/channel-reply-delivery.ts +106 -2
  480. package/src/runtime/decision-token.ts +116 -0
  481. package/src/runtime/gateway-client.ts +2 -2
  482. package/src/runtime/http-router.ts +32 -0
  483. package/src/runtime/http-server.ts +52 -1
  484. package/src/runtime/http-types.ts +23 -1
  485. package/src/runtime/interactive-ui.ts +362 -0
  486. package/src/runtime/invite-instruction-generator.ts +2 -2
  487. package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +176 -0
  488. package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +390 -0
  489. package/src/runtime/migrations/__tests__/vbundle-metadata-merge.test.ts +221 -0
  490. package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +1540 -0
  491. package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +453 -0
  492. package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +222 -0
  493. package/src/runtime/migrations/gcs-signed-url.ts +162 -0
  494. package/src/runtime/migrations/vbundle-importer.ts +154 -9
  495. package/src/runtime/migrations/vbundle-metadata-merge.ts +124 -0
  496. package/src/runtime/migrations/vbundle-streaming-importer.ts +2522 -0
  497. package/src/runtime/migrations/vbundle-streaming-validator.ts +244 -0
  498. package/src/runtime/migrations/vbundle-tar-stream.ts +217 -0
  499. package/src/runtime/migrations/vbundle-validator.ts +15 -6
  500. package/src/runtime/routes/__tests__/home-feed-routes.test.ts +111 -0
  501. package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +114 -75
  502. package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +246 -0
  503. package/src/runtime/routes/approval-prompt-ts-tracker.ts +58 -0
  504. package/src/runtime/routes/approval-routes.ts +12 -17
  505. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +9 -0
  506. package/src/runtime/routes/avatar-routes.ts +20 -4
  507. package/src/runtime/routes/btw-routes.ts +1 -4
  508. package/src/runtime/routes/conversation-management-routes.ts +20 -2
  509. package/src/runtime/routes/conversation-routes.ts +133 -27
  510. package/src/runtime/routes/debug-routes.ts +1 -1
  511. package/src/runtime/routes/diagnostics-routes.ts +6 -4
  512. package/src/runtime/routes/events-routes.ts +16 -0
  513. package/src/runtime/routes/guardian-approval-interception.ts +33 -3
  514. package/src/runtime/routes/guardian-approval-prompt.ts +13 -3
  515. package/src/runtime/routes/home-feed-routes.ts +120 -2
  516. package/src/runtime/routes/inbound-message-handler.ts +912 -2
  517. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +113 -2
  518. package/src/runtime/routes/inbound-stages/background-dispatch.ts +61 -3
  519. package/src/runtime/routes/inbound-stages/edit-intercept.ts +129 -6
  520. package/src/runtime/routes/integrations/slack/channel.ts +25 -3
  521. package/src/runtime/routes/llm-context-normalization.ts +23 -1
  522. package/src/runtime/routes/migration-routes.ts +720 -124
  523. package/src/runtime/routes/settings-routes.ts +4 -2
  524. package/src/runtime/routes/trust-rules-routes.ts +30 -14
  525. package/src/runtime/routes/work-items-routes.test.ts +1 -1
  526. package/src/runtime/routes/work-items-routes.ts +3 -2
  527. package/src/runtime/services/__tests__/analyze-conversation.test.ts +25 -43
  528. package/src/runtime/services/analyze-conversation.ts +12 -16
  529. package/src/runtime/skill-route-registry.ts +28 -6
  530. package/src/schedule/scheduler.ts +8 -0
  531. package/src/security/__tests__/provider-key-env-fallback.test.ts +119 -0
  532. package/src/security/__tests__/untrusted-content.test.ts +109 -0
  533. package/src/security/oauth2.ts +98 -35
  534. package/src/security/secure-keys.ts +7 -8
  535. package/src/security/token-manager.ts +27 -13
  536. package/src/security/untrusted-content.ts +102 -0
  537. package/src/skills/catalog-cache.ts +26 -7
  538. package/src/skills/catalog-install.ts +31 -3
  539. package/src/skills/skill-cache-store.ts +97 -0
  540. package/src/stt/__tests__/daemon-batch-transcriber.test.ts +76 -0
  541. package/src/stt/daemon-batch-transcriber.ts +33 -0
  542. package/src/stt/stt-stream-session.ts +8 -1
  543. package/src/stt/types.ts +5 -1
  544. package/src/subagent/manager.ts +41 -13
  545. package/src/tasks/ephemeral-permissions.ts +9 -4
  546. package/src/telemetry/usage-telemetry-reporter.ts +27 -5
  547. package/src/tools/browser/__tests__/browser-status.test.ts +45 -2
  548. package/src/tools/browser/browser-execution.ts +65 -38
  549. package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +22 -0
  550. package/src/tools/credentials/tool-policy.ts +39 -5
  551. package/src/tools/credentials/vault.ts +9 -4
  552. package/src/tools/executor.ts +4 -0
  553. package/src/tools/filesystem/write.ts +52 -0
  554. package/src/tools/host-terminal/host-shell.ts +45 -5
  555. package/src/tools/memory/register.test.ts +185 -0
  556. package/src/tools/memory/register.ts +3 -1
  557. package/src/tools/network/web-fetch.ts +20 -10
  558. package/src/tools/network/web-search.ts +19 -4
  559. package/src/tools/permission-checker.ts +36 -15
  560. package/src/tools/policy-context.ts +25 -8
  561. package/src/tools/registry.ts +55 -3
  562. package/src/tools/side-effects.ts +0 -11
  563. package/src/tools/skills/execute.ts +2 -2
  564. package/src/tools/skills/sandbox-runner.ts +5 -2
  565. package/src/tools/terminal/backends/native.ts +51 -2
  566. package/src/tools/terminal/safe-env.ts +3 -2
  567. package/src/tools/terminal/shell.ts +1 -0
  568. package/src/tools/tool-manifest.ts +6 -21
  569. package/src/tools/types.ts +12 -3
  570. package/src/tools/verification-control-plane-policy.ts +1 -1
  571. package/src/tts/__tests__/provider-adapters.test.ts +240 -13
  572. package/src/tts/provider-catalog.ts +18 -0
  573. package/src/tts/providers/index.ts +2 -0
  574. package/src/tts/providers/xai-provider.ts +224 -0
  575. package/src/tts/types.ts +46 -0
  576. package/src/types/tar-stream.d.ts +66 -0
  577. package/src/util/json.ts +17 -0
  578. package/src/util/platform.ts +2 -2
  579. package/src/util/pricing.ts +15 -5
  580. package/src/watcher/engine.ts +1 -1
  581. package/src/watcher/providers/google-calendar.ts +134 -8
  582. package/src/watcher/providers/outlook-calendar.ts +42 -2
  583. package/src/workspace/git-service.ts +23 -4
  584. package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +516 -0
  585. package/src/workspace/migrations/039-drop-legacy-llm-keys.ts +171 -0
  586. package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +154 -0
  587. package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +57 -0
  588. package/src/workspace/migrations/042-fix-backfill-google-gmail-settings-scope.ts +70 -0
  589. package/src/workspace/migrations/043-release-notes-latex-rendering.ts +75 -0
  590. package/src/workspace/migrations/044-bump-stale-provider-stream-timeout.ts +51 -0
  591. package/src/workspace/migrations/045-release-notes-meet-avatar.ts +130 -0
  592. package/src/workspace/migrations/AGENTS.md +1 -1
  593. package/src/workspace/migrations/registry.ts +16 -0
  594. package/src/workspace/provider-commit-message-generator.ts +19 -38
  595. package/src/__tests__/gmail-archive-fallback.test.ts +0 -193
  596. package/src/__tests__/gmail-archive-gate.test.ts +0 -246
  597. package/src/__tests__/gmail-preferences.test.ts +0 -117
  598. package/src/__tests__/outlook-attachments.test.ts +0 -301
  599. package/src/__tests__/outlook-automation-tools.test.ts +0 -425
  600. package/src/__tests__/outlook-categories.test.ts +0 -212
  601. package/src/__tests__/outlook-compose-tools.test.ts +0 -325
  602. package/src/__tests__/outlook-declutter-tools.test.ts +0 -585
  603. package/src/__tests__/outlook-follow-up.test.ts +0 -196
  604. package/src/__tests__/outlook-trash.test.ts +0 -77
  605. package/src/__tests__/outlook-unsubscribe.test.ts +0 -279
  606. package/src/__tests__/update-bulletin-format.test.ts +0 -181
  607. package/src/__tests__/update-bulletin-state.test.ts +0 -135
  608. package/src/__tests__/update-bulletin.test.ts +0 -478
  609. package/src/__tests__/update-template-contract.test.ts +0 -29
  610. package/src/cli/commands/doctor.ts +0 -341
  611. package/src/config/bundled-skills/browser/SKILL.md +0 -88
  612. package/src/config/bundled-skills/browser/TOOLS.json +0 -516
  613. package/src/config/bundled-skills/browser/tools/browser-attach.ts +0 -12
  614. package/src/config/bundled-skills/browser/tools/browser-click.ts +0 -12
  615. package/src/config/bundled-skills/browser/tools/browser-close.ts +0 -12
  616. package/src/config/bundled-skills/browser/tools/browser-detach.ts +0 -12
  617. package/src/config/bundled-skills/browser/tools/browser-extract.ts +0 -12
  618. package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +0 -12
  619. package/src/config/bundled-skills/browser/tools/browser-hover.ts +0 -12
  620. package/src/config/bundled-skills/browser/tools/browser-navigate.ts +0 -12
  621. package/src/config/bundled-skills/browser/tools/browser-press-key.ts +0 -12
  622. package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +0 -12
  623. package/src/config/bundled-skills/browser/tools/browser-scroll.ts +0 -12
  624. package/src/config/bundled-skills/browser/tools/browser-select-option.ts +0 -12
  625. package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +0 -12
  626. package/src/config/bundled-skills/browser/tools/browser-status.ts +0 -12
  627. package/src/config/bundled-skills/browser/tools/browser-type.ts +0 -12
  628. package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +0 -49
  629. package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +0 -12
  630. package/src/config/bundled-skills/chatgpt-import/SKILL.md +0 -27
  631. package/src/config/bundled-skills/chatgpt-import/TOOLS.json +0 -27
  632. package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +0 -378
  633. package/src/config/bundled-skills/gmail/SKILL.md +0 -221
  634. package/src/config/bundled-skills/gmail/TOOLS.json +0 -588
  635. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +0 -256
  636. package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +0 -112
  637. package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +0 -44
  638. package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +0 -81
  639. package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +0 -108
  640. package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +0 -146
  641. package/src/config/bundled-skills/gmail/tools/gmail-label.ts +0 -53
  642. package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +0 -347
  643. package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +0 -59
  644. package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +0 -82
  645. package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +0 -26
  646. package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +0 -347
  647. package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +0 -29
  648. package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +0 -122
  649. package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +0 -67
  650. package/src/config/bundled-skills/gmail/tools/scan-result-store.ts +0 -100
  651. package/src/config/bundled-skills/gmail/tools/shared.ts +0 -47
  652. package/src/config/bundled-skills/google-calendar/SKILL.md +0 -51
  653. package/src/config/bundled-skills/google-calendar/TOOLS.json +0 -226
  654. package/src/config/bundled-skills/google-calendar/calendar-client.ts +0 -223
  655. package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +0 -27
  656. package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +0 -48
  657. package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +0 -19
  658. package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +0 -36
  659. package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +0 -58
  660. package/src/config/bundled-skills/google-calendar/tools/shared.ts +0 -17
  661. package/src/config/bundled-skills/google-calendar/types.ts +0 -97
  662. package/src/config/bundled-skills/outlook/SKILL.md +0 -196
  663. package/src/config/bundled-skills/outlook/TOOLS.json +0 -530
  664. package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +0 -85
  665. package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +0 -77
  666. package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +0 -84
  667. package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +0 -94
  668. package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +0 -49
  669. package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +0 -237
  670. package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +0 -161
  671. package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +0 -32
  672. package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +0 -272
  673. package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +0 -29
  674. package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +0 -129
  675. package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +0 -87
  676. package/src/config/bundled-skills/outlook/tools/shared.ts +0 -20
  677. package/src/config/bundled-skills/outlook-calendar/SKILL.md +0 -51
  678. package/src/config/bundled-skills/outlook-calendar/TOOLS.json +0 -221
  679. package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +0 -252
  680. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +0 -53
  681. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +0 -74
  682. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +0 -18
  683. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +0 -46
  684. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +0 -36
  685. package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +0 -17
  686. package/src/config/bundled-skills/outlook-calendar/types.ts +0 -120
  687. package/src/config/bundled-skills/slack/SKILL.md +0 -108
  688. package/src/config/bundled-skills/tasks/SKILL.md +0 -37
  689. package/src/config/bundled-skills/tasks/TOOLS.json +0 -353
  690. package/src/config/bundled-skills/tasks/icon.svg +0 -34
  691. package/src/config/bundled-skills/tasks/tools/task-delete.ts +0 -12
  692. package/src/config/bundled-skills/tasks/tools/task-list-add.ts +0 -12
  693. package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +0 -12
  694. package/src/config/bundled-skills/tasks/tools/task-list-show.ts +0 -12
  695. package/src/config/bundled-skills/tasks/tools/task-list-update.ts +0 -12
  696. package/src/config/bundled-skills/tasks/tools/task-list.ts +0 -12
  697. package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +0 -12
  698. package/src/config/bundled-skills/tasks/tools/task-run.ts +0 -12
  699. package/src/config/bundled-skills/tasks/tools/task-save.ts +0 -12
  700. package/src/config/bundled-skills/watcher/SKILL.md +0 -31
  701. package/src/config/bundled-skills/watcher/TOOLS.json +0 -167
  702. package/src/config/bundled-skills/watcher/tools/watcher-create.ts +0 -12
  703. package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +0 -12
  704. package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +0 -12
  705. package/src/config/bundled-skills/watcher/tools/watcher-list.ts +0 -12
  706. package/src/config/bundled-skills/watcher/tools/watcher-update.ts +0 -12
  707. package/src/prompts/templates/UPDATES.md +0 -50
  708. package/src/prompts/update-bulletin-format.ts +0 -85
  709. package/src/prompts/update-bulletin-state.ts +0 -58
  710. package/src/prompts/update-bulletin-template-path.ts +0 -13
  711. package/src/prompts/update-bulletin.ts +0 -139
  712. package/src/shared/provider-env-vars.ts +0 -19
  713. package/src/tools/watcher/create.ts +0 -86
  714. package/src/tools/watcher/delete.ts +0 -36
  715. package/src/tools/watcher/digest.ts +0 -54
  716. package/src/tools/watcher/list.ts +0 -83
  717. package/src/tools/watcher/update.ts +0 -71
@@ -1,6 +1,7 @@
1
1
  import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
2
2
  import { getConfig } from "../config/loader.js";
3
3
  import { getHookManager } from "../hooks/manager.js";
4
+ import { resolveThreshold } from "../permissions/approval-policy.js";
4
5
  import {
5
6
  check,
6
7
  classifyRisk,
@@ -29,7 +30,12 @@ import type { Tool, ToolContext, ToolLifecycleEvent } from "./types.js";
29
30
  const log = getLogger("permission-checker");
30
31
 
31
32
  export type PermissionDecision =
32
- | { allowed: true; decision: string; riskLevel: string }
33
+ | {
34
+ allowed: true;
35
+ decision: string;
36
+ riskLevel: string;
37
+ wasPrompted?: boolean;
38
+ }
33
39
  | { allowed: false; decision: string; riskLevel: string; content: string };
34
40
 
35
41
  export class PermissionChecker {
@@ -95,7 +101,7 @@ export class PermissionChecker {
95
101
  }
96
102
  }
97
103
 
98
- const risk = await classifyRisk(
104
+ const { level: risk, reason: riskReason } = await classifyRisk(
99
105
  name,
100
106
  input,
101
107
  context.workingDir,
@@ -163,6 +169,7 @@ export class PermissionChecker {
163
169
  conversationId: context.conversationId,
164
170
  requestId: context.requestId,
165
171
  riskLevel,
172
+ riskReason,
166
173
  decision: "deny",
167
174
  reason: result.reason,
168
175
  durationMs,
@@ -204,20 +211,36 @@ export class PermissionChecker {
204
211
  // Exception: inline-command skill loads (skill_load_dynamic:*) must
205
212
  // never be silently auto-approved — they execute embedded commands
206
213
  // and require explicit human review or a pinned trust rule.
207
- // Exception: high-risk tools (e.g. destructive shell commands, writes
208
- // to sensitive paths) are denied — unattended sessions must not
209
- // auto-approve operations that could cause significant damage if
210
- // triggered by prompt injection from untrusted content.
214
+ // Exception: tools above the configured background threshold are
215
+ // denied — unattended sessions must not auto-approve operations that
216
+ // could cause significant damage if triggered by prompt injection
217
+ // from untrusted content.
211
218
  const isDynamicSkillLoad =
212
219
  result.matchedRule?.pattern.startsWith("skill_load_dynamic:") ===
213
220
  true;
221
+ const bgThreshold = resolveThreshold(
222
+ cfg.permissions.autoApproveUpTo,
223
+ "background",
224
+ );
225
+ const thresholdOrdinal: Record<string, number> = {
226
+ none: -1,
227
+ low: 0,
228
+ medium: 1,
229
+ };
230
+ const riskOrdinal: Record<string, number> = {
231
+ [RiskLevel.Low]: 0,
232
+ [RiskLevel.Medium]: 1,
233
+ [RiskLevel.High]: 2,
234
+ };
235
+ const withinThreshold =
236
+ (riskOrdinal[riskLevel] ?? 2) <= (thresholdOrdinal[bgThreshold] ?? 0);
214
237
  if (
215
238
  context.isInteractive === false &&
216
239
  context.trustClass === "guardian" &&
217
240
  !context.requireFreshApproval &&
218
241
  !isDynamicSkillLoad &&
219
242
  !v2ForcePrompt &&
220
- riskLevel !== RiskLevel.High
243
+ withinThreshold
221
244
  ) {
222
245
  log.info(
223
246
  { toolName: name, riskLevel },
@@ -247,6 +270,7 @@ export class PermissionChecker {
247
270
  conversationId: context.conversationId,
248
271
  requestId: context.requestId,
249
272
  riskLevel,
273
+ riskReason,
250
274
  decision: "deny",
251
275
  reason: "Non-interactive session: no client to approve prompt",
252
276
  durationMs,
@@ -321,6 +345,7 @@ export class PermissionChecker {
321
345
  conversationId: context.conversationId,
322
346
  requestId: context.requestId,
323
347
  riskLevel,
348
+ riskReason,
324
349
  reason: result.reason,
325
350
  allowlistOptions: promptOptions.allowlistOptions,
326
351
  scopeOptions: promptOptions.scopeOptions,
@@ -386,6 +411,7 @@ export class PermissionChecker {
386
411
  conversationId: context.conversationId,
387
412
  requestId: context.requestId,
388
413
  riskLevel,
414
+ riskReason,
389
415
  decision: "deny",
390
416
  reason: denialReason,
391
417
  durationMs,
@@ -434,6 +460,7 @@ export class PermissionChecker {
434
460
  conversationId: context.conversationId,
435
461
  requestId: context.requestId,
436
462
  riskLevel,
463
+ riskReason,
437
464
  decision: "always_deny",
438
465
  reason: denialReason,
439
466
  durationMs,
@@ -448,19 +475,13 @@ export class PermissionChecker {
448
475
 
449
476
  if (
450
477
  promptOptions.persistentDecisionsAllowed &&
451
- (decision === "always_allow" ||
452
- decision === "always_allow_high_risk") &&
478
+ decision === "always_allow" &&
453
479
  response.selectedPattern
454
480
  ) {
455
481
  const ruleOptions: {
456
- allowHighRisk?: boolean;
457
482
  executionTarget?: string;
458
483
  } = {};
459
484
 
460
- if (decision === "always_allow_high_risk") {
461
- ruleOptions.allowHighRisk = true;
462
- }
463
-
464
485
  if (policyContext?.executionTarget != null) {
465
486
  ruleOptions.executionTarget = policyContext.executionTarget;
466
487
  }
@@ -502,7 +523,7 @@ export class PermissionChecker {
502
523
  );
503
524
  }
504
525
 
505
- return { allowed: true, decision, riskLevel };
526
+ return { allowed: true, decision, riskLevel, wasPrompted: true };
506
527
  }
507
528
 
508
529
  // result.decision === 'allow'
@@ -1,7 +1,24 @@
1
+ import type { ExecutionContext } from "../permissions/approval-policy.js";
1
2
  import type { PolicyContext } from "../permissions/types.js";
2
3
  import { getTaskRunRules } from "../tasks/ephemeral-permissions.js";
3
4
  import type { Tool, ToolContext } from "./types.js";
4
5
 
6
+ /**
7
+ * Derive the execution context from the tool context fields.
8
+ * - Guardian + non-interactive → "background" (scheduled jobs, reminders)
9
+ * - Non-interactive (non-guardian) → "headless"
10
+ * - Otherwise → "conversation"
11
+ */
12
+ function deriveExecutionContext(context?: ToolContext): ExecutionContext {
13
+ if (context?.isInteractive === false && context.trustClass === "guardian") {
14
+ return "background";
15
+ }
16
+ if (context?.isInteractive === false) {
17
+ return "headless";
18
+ }
19
+ return "conversation";
20
+ }
21
+
5
22
  /**
6
23
  * Build a PolicyContext from tool metadata and execution context.
7
24
  * When executing within a task run, ephemeral permission rules are
@@ -10,23 +27,23 @@ import type { Tool, ToolContext } from "./types.js";
10
27
  export function buildPolicyContext(
11
28
  tool: Tool,
12
29
  context?: ToolContext,
13
- ): PolicyContext | undefined {
30
+ ): PolicyContext {
14
31
  const ephemeralRules = context?.taskRunId
15
32
  ? getTaskRunRules(context.taskRunId)
16
33
  : undefined;
17
34
 
35
+ const executionContext = deriveExecutionContext(context);
36
+
18
37
  if (tool.origin === "skill") {
19
38
  return {
20
39
  executionTarget: tool.executionTarget,
21
40
  ephemeralRules: ephemeralRules?.length ? ephemeralRules : undefined,
41
+ executionContext,
22
42
  };
23
43
  }
24
44
 
25
- if (context?.taskRunId && ephemeralRules?.length) {
26
- return {
27
- ephemeralRules,
28
- };
29
- }
30
-
31
- return undefined;
45
+ return {
46
+ ephemeralRules: ephemeralRules?.length ? ephemeralRules : undefined,
47
+ executionContext,
48
+ };
32
49
  }
@@ -16,6 +16,48 @@ const log = getLogger("tool-registry");
16
16
 
17
17
  const tools = new Map<string, Tool>();
18
18
 
19
+ // ── External tool registry ───────────────────────────────────────────
20
+ // Skills register their tools here at initialization time so the tool
21
+ // manifest can include them without importing from `../skills/`.
22
+ //
23
+ // Each registration is stored as a provider closure. Closures are
24
+ // resolved at `getExternalTools()` time (which `initializeTools()`
25
+ // calls), not at registration time — this lets a skill defer its
26
+ // feature-flag check until after the daemon has run
27
+ // `mergeDefaultWorkspaceConfig()`, so skills see the merged config
28
+ // instead of forcing an early `loadConfig()` against unmerged defaults.
29
+ const externalToolProviders: Array<() => Tool[]> = [];
30
+
31
+ /**
32
+ * Register tools provided by an external skill. Called during skill
33
+ * initialization (e.g. meet-join bootstrap).
34
+ *
35
+ * Accepts either a concrete `Tool[]` (resolved eagerly at the caller)
36
+ * or a `() => Tool[]` closure (resolved lazily inside
37
+ * `getExternalTools()`). Skills that perform feature-flag or config
38
+ * reads to decide which tools to surface must pass a closure so the
39
+ * read happens after daemon-startup config merging.
40
+ *
41
+ * Lives in registry.ts (not tool-manifest.ts) to avoid a circular
42
+ * dependency: skills/load.ts → … → meet-join/register.ts → tool-manifest.ts
43
+ * → skills/load.ts. Keeping it here lets external skill bootstraps import
44
+ * from registry.ts, which is already a leaf in the dependency graph.
45
+ */
46
+ export function registerExternalTools(
47
+ toolsOrProvider: Tool[] | (() => Tool[]),
48
+ ): void {
49
+ const provider =
50
+ typeof toolsOrProvider === "function"
51
+ ? toolsOrProvider
52
+ : () => toolsOrProvider;
53
+ externalToolProviders.push(provider);
54
+ }
55
+
56
+ /** Return all externally registered tools. */
57
+ export function getExternalTools(): Tool[] {
58
+ return externalToolProviders.flatMap((provider) => provider());
59
+ }
60
+
19
61
  // Snapshot of core tools captured after initializeTools() completes.
20
62
  // Used by __resetRegistryForTesting() to restore eager tools that cannot
21
63
  // be re-registered because ESM import caching prevents side effects
@@ -245,6 +287,15 @@ export async function initializeTools(): Promise<void> {
245
287
  registerTool(tool);
246
288
  }
247
289
 
290
+ // External skill tools — registered by skill bootstrap modules via
291
+ // `registerExternalTools()`. Called at init time (not spread into
292
+ // `explicitTools`) so registrations that happen between module-load
293
+ // and `initializeTools()` are picked up.
294
+ const extTools = getExternalTools();
295
+ for (const tool of extTools) {
296
+ registerTool(tool);
297
+ }
298
+
248
299
  // Host tools are registered explicitly so host access stays opt-in until
249
300
  // this point in startup, rather than as module side effects.
250
301
  const hostTools = [
@@ -272,13 +323,14 @@ export async function initializeTools(): Promise<void> {
272
323
  // arbitrary test tools that were registered before init.
273
324
  //
274
325
  // A pre-existing tool is included only if it is a known manifest tool
275
- // (declared in eagerModuleToolNames, explicitTools, or hostTools).
276
- // This handles ESM cache hits where eager-module tools are already in
277
- // the registry before init ran.
326
+ // (declared in eagerModuleToolNames, explicitTools, hostTools, or any
327
+ // registered external skill tool). This handles ESM cache hits where
328
+ // eager-module tools are already in the registry before init ran.
278
329
  if (!coreToolsSnapshot) {
279
330
  const manifestToolNames = new Set<string>([
280
331
  ...eagerModuleToolNames,
281
332
  ...explicitTools.map((t: Tool) => t.name),
333
+ ...extTools.map((t: Tool) => t.name),
282
334
  ...hostTools.map((t: Tool) => t.name),
283
335
  ...cesTools.map((t: Tool) => t.name),
284
336
  ...allComputerUseTools.map((t: Tool) => t.name),
@@ -12,17 +12,6 @@ const SIDE_EFFECT_TOOLS: ReadonlySet<string> = new Set([
12
12
  "bash",
13
13
  "host_bash",
14
14
  "web_fetch",
15
- "browser_navigate",
16
- "browser_click",
17
- "browser_type",
18
- "browser_press_key",
19
- "browser_scroll",
20
- "browser_select_option",
21
- "browser_hover",
22
- "browser_close",
23
- "browser_attach",
24
- "browser_detach",
25
- "browser_fill_credential",
26
15
  "document_create",
27
16
  "document_update",
28
17
  "schedule_create",
@@ -6,7 +6,7 @@ import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
6
6
  export class SkillExecuteTool implements Tool {
7
7
  name = "skill_execute";
8
8
  description =
9
- "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.";
9
+ "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
10
  category = "skills";
11
11
  defaultRiskLevel = RiskLevel.Low;
12
12
 
@@ -20,7 +20,7 @@ export class SkillExecuteTool implements Tool {
20
20
  tool: {
21
21
  type: "string",
22
22
  description:
23
- "The skill tool name to execute (e.g. 'browser_navigate', 'task_create')",
23
+ "The skill tool name to execute (e.g. 'task_create', 'deploy_run')",
24
24
  },
25
25
  input: {
26
26
  type: "object",
@@ -152,6 +152,7 @@ function spawnRunner(
152
152
  workingDir: context.workingDir,
153
153
  conversationId: context.conversationId,
154
154
  });
155
+ env.__CONVERSATION_ID = context.conversationId;
155
156
 
156
157
  const child = spawn(wrapped.command, wrapped.args, {
157
158
  cwd: runDir,
@@ -219,7 +220,8 @@ function spawnRunner(
219
220
  if (code !== 0) {
220
221
  const truncatedStderr =
221
222
  stderr.length > MAX_OUTPUT_CHARS
222
- ? safeStringSlice(stderr, 0, MAX_OUTPUT_CHARS) + "\n[stderr truncated]"
223
+ ? safeStringSlice(stderr, 0, MAX_OUTPUT_CHARS) +
224
+ "\n[stderr truncated]"
223
225
  : stderr;
224
226
  resolve({
225
227
  content: `Skill tool script "${executorPath}" exited with code ${code}:\n${truncatedStderr}`,
@@ -230,7 +232,8 @@ function spawnRunner(
230
232
 
231
233
  const truncatedStdout =
232
234
  stdout.length > MAX_OUTPUT_CHARS
233
- ? safeStringSlice(stdout, 0, MAX_OUTPUT_CHARS) + "\n[stdout truncated]"
235
+ ? safeStringSlice(stdout, 0, MAX_OUTPUT_CHARS) +
236
+ "\n[stdout truncated]"
234
237
  : stdout;
235
238
  resolve({ content: truncatedStdout, isError: false });
236
239
  });
@@ -12,6 +12,35 @@ const log = getLogger("sandbox");
12
12
 
13
13
  const HASH_DISPLAY_LENGTH = 12;
14
14
 
15
+ /**
16
+ * macOS TCC-protected directories that trigger permission prompts when accessed.
17
+ * Unconditionally denied in the SBPL sandbox profile to prevent the assistant
18
+ * from triggering Photos, Contacts, Calendar, etc. dialogs during filesystem
19
+ * traversal (e.g. `find ~ -name .git`).
20
+ *
21
+ * Paths are relative to $HOME. Includes both TCC-protected directories that
22
+ * trigger prompts for all apps and directories like ~/Desktop and ~/Documents
23
+ * that are TCC-protected under App Sandbox or Full Disk Access checks.
24
+ */
25
+ export const MACOS_TCC_PROTECTED_PATHS = [
26
+ "Desktop",
27
+ "Documents",
28
+ "Pictures/Photos Library.photoslibrary",
29
+ "Library/Photos",
30
+ "Library/Calendars",
31
+ "Library/Reminders",
32
+ "Library/Application Support/AddressBook",
33
+ "Library/Messages",
34
+ "Library/Mail",
35
+ "Library/Safari",
36
+ "Library/Cookies",
37
+ "Library/HomeKit",
38
+ "Library/IdentityServices",
39
+ "Library/Metadata/CoreSpotlight",
40
+ "Library/PersonalizationPortrait",
41
+ "Library/Suggestions",
42
+ ];
43
+
15
44
  /**
16
45
  * Build a macOS sandbox-exec SBPL profile.
17
46
  *
@@ -34,6 +63,18 @@ function buildSandboxProfile(
34
63
  ? ";; Allow network access (proxied mode - needed to reach the credential proxy)\n(allow network*)"
35
64
  : ";; Block network access\n(deny network*)";
36
65
 
66
+ // Block macOS TCC-protected directories to prevent permission prompts
67
+ // during filesystem traversal. Placed AFTER (allow file-read*) because
68
+ // SBPL uses last-match-wins semantics.
69
+ const home = process.env.HOME ?? "";
70
+ const tccDenyRules = home
71
+ ? "\n;; Block macOS TCC-protected directories to prevent permission prompts\n" +
72
+ MACOS_TCC_PROTECTED_PATHS.map(
73
+ (rel) =>
74
+ `(deny file-read* (subpath "${escapeSBPL(join(home, rel))}") (with no-log))`,
75
+ ).join("\n")
76
+ : "";
77
+
37
78
  // Build deny-read rules for protected paths (CES shell lockdown).
38
79
  // These are placed AFTER the allow file-read* rule because SBPL uses
39
80
  // last-match-wins semantics - the more specific deny overrides the
@@ -55,6 +96,13 @@ function buildSandboxProfile(
55
96
 
56
97
  ;; Allow read access to the filesystem (tools, libraries, etc.)
57
98
  (allow file-read*)
99
+ ${tccDenyRules}
100
+
101
+ ;; Re-allow reads for the working directory even if it falls under a TCC-denied
102
+ ;; subtree (e.g. ~/Desktop/my-project). SBPL is last-match-wins, so this
103
+ ;; override must come after the TCC deny rules above but BEFORE the CES
104
+ ;; deny-read rules below — credential isolation always takes precedence.
105
+ (allow file-read* (subpath "__WORKING_DIR__"))
58
106
  ${denyReadRules}
59
107
 
60
108
  ;; Allow write access to the working directory and its children
@@ -120,12 +168,13 @@ function getProfilePath(
120
168
  if (!existsSync(dir)) {
121
169
  mkdirSync(dir, { recursive: true });
122
170
  }
123
- // Include the network flag and deny-read paths in the hash so profiles
124
- // with different configurations don't collide.
171
+ // Include the network flag, deny-read paths, and HOME in the hash so
172
+ // profiles with different configurations don't collide.
125
173
  let hashInput = allowNetwork ? `${workingDir}:proxied` : workingDir;
126
174
  if (denyReadPaths && denyReadPaths.length > 0) {
127
175
  hashInput += `:deny-read:${denyReadPaths.sort().join(",")}`;
128
176
  }
177
+ hashInput += `:home:${process.env.HOME ?? ""}`;
129
178
  const hash = createHash("sha256")
130
179
  .update(hashInput)
131
180
  .digest("hex")
@@ -30,9 +30,11 @@ export const SAFE_ENV_VARS = [
30
30
  "VELLUM_DEV",
31
31
  "VELLUM_DEBUG",
32
32
  "VELLUM_ENVIRONMENT",
33
+ "BASE_DATA_DIR",
33
34
  "VELLUM_WORKSPACE_DIR",
34
35
  "CES_BOOTSTRAP_SOCKET_DIR",
35
36
  "GATEWAY_INTERNAL_URL",
37
+ "GATEWAY_SECURITY_DIR",
36
38
  "VELLUM_PLATFORM_URL",
37
39
  "VELLUM_ASSISTANT_PLATFORM_URL",
38
40
  "VELLUM_DOCS_BASE_URL",
@@ -82,8 +84,7 @@ export function buildSanitizedEnv(): Record<string, string> {
82
84
  // Ensure UTF-8 locale so multi-byte characters (em dashes, curly quotes,
83
85
  // arrows, etc.) survive piping through tools like pbcopy without corruption.
84
86
  // macOS (Darwin) does not provide C.UTF-8, so use en_US.UTF-8 there.
85
- const utf8Locale =
86
- process.platform === "darwin" ? "en_US.UTF-8" : "C.UTF-8";
87
+ const utf8Locale = process.platform === "darwin" ? "en_US.UTF-8" : "C.UTF-8";
87
88
  if (!env.LANG) env.LANG = utf8Locale;
88
89
  if (!env.LC_ALL) env.LC_ALL = utf8Locale;
89
90
  return env;
@@ -306,6 +306,7 @@ class ShellTool implements Tool {
306
306
  }
307
307
 
308
308
  const env = buildSanitizedEnv();
309
+ env.__CONVERSATION_ID = context.conversationId;
309
310
  if (proxyEnv) {
310
311
  Object.assign(env, proxyEnv);
311
312
  }
@@ -29,24 +29,6 @@ import { requestSystemPermissionTool } from "./system/request-permission.js";
29
29
  import { shellTool } from "./terminal/shell.js";
30
30
  import type { Tool } from "./types.js";
31
31
 
32
- // ── External tool registry ───────────────────────────────────────────
33
- // Skills register their tools here at initialization time so the tool
34
- // manifest can include them without importing from `../skills/`.
35
- const externalTools: Tool[] = [];
36
-
37
- /**
38
- * Register tools provided by an external skill. Called during skill
39
- * initialization.
40
- */
41
- export function registerExternalTools(tools: Tool[]): void {
42
- externalTools.push(...tools);
43
- }
44
-
45
- /** Return all externally registered tools. */
46
- export function getExternalTools(): Tool[] {
47
- return [...externalTools];
48
- }
49
-
50
32
  // ── Eager side-effect modules ───────────────────────────────────────
51
33
  // These static imports trigger top-level `registerTool()` side effects on
52
34
  // first evaluation. The named imports above serve double duty: they give us
@@ -109,9 +91,12 @@ export const explicitTools: Tool[] = [
109
91
  recallTool,
110
92
  credentialStoreTool,
111
93
  notifyParentTool,
112
- // Meet tools are registered via registerExternalTools() during skill
113
- // initialization the assistant never imports directly from skills/.
114
- ...getExternalTools(),
94
+ // NOTE: external skill tools (registered via registerExternalTools in
95
+ // registry.ts) are intentionally NOT included here. `explicitTools` is a
96
+ // module-level const whose value is fixed at first evaluation, so
97
+ // external tools registered after this file loads would be missed.
98
+ // `initializeTools()` in `registry.ts` calls `getExternalTools()`
99
+ // separately at runtime so late registrations are picked up.
115
100
  ];
116
101
 
117
102
  // ── CES tools (feature-flag gated) ──────────────────────────────────
@@ -31,6 +31,8 @@ export interface ToolExecutionStartEvent extends ToolLifecycleEventBase {
31
31
  export interface ToolPermissionPromptEvent extends ToolLifecycleEventBase {
32
32
  type: "permission_prompt";
33
33
  riskLevel: string;
34
+ /** Classifier-provided reason explaining why the risk level was assigned (bash/host_bash only). */
35
+ riskReason?: string;
34
36
  reason: string;
35
37
  allowlistOptions: AllowlistOption[];
36
38
  scopeOptions: ScopeOption[];
@@ -41,6 +43,8 @@ export interface ToolPermissionPromptEvent extends ToolLifecycleEventBase {
41
43
  export interface ToolPermissionDeniedEvent extends ToolLifecycleEventBase {
42
44
  type: "permission_denied";
43
45
  riskLevel: string;
46
+ /** Classifier-provided reason explaining why the risk level was assigned (bash/host_bash only). */
47
+ riskReason?: string;
44
48
  decision: "deny" | "always_deny";
45
49
  reason: string;
46
50
  durationMs: number;
@@ -163,6 +167,8 @@ export interface ToolContext {
163
167
  callSessionId?: string;
164
168
  /** True when the tool invocation was triggered by a user clicking a surface action button (not a regular message). */
165
169
  triggeredBySurfaceAction?: boolean;
170
+ /** True when the user explicitly approved this tool invocation via the interactive permission prompt (not auto-approved by trust rules or temporary overrides). */
171
+ approvedViaPrompt?: boolean;
166
172
  /**
167
173
  * True when the invocation is inside a scheduled task run whose
168
174
  * `required_tools` array pre-authorized this tool at task-creation time.
@@ -228,9 +234,12 @@ export interface ToolExecutionResult {
228
234
  sensitiveBindings?: SensitiveOutputBinding[];
229
235
  /**
230
236
  * When true, the agent loop should yield control back to the user after
231
- * returning this result. Used by interactive surfaces (tables with action
232
- * buttons, file uploads) to force-stop the loop so the LLM cannot bypass
233
- * the "wait for user action" instruction.
237
+ * returning this result tool results are pushed to history and the loop
238
+ * breaks without another LLM call. Two callers set this: interactive
239
+ * surfaces (tables with action buttons, file uploads) that force-stop the
240
+ * loop so the LLM cannot bypass the "wait for user action" instruction,
241
+ * and tools like `remember` that expose a `finish_turn` parameter letting
242
+ * the LLM voluntarily end its turn.
234
243
  */
235
244
  yieldToUser?: boolean;
236
245
  /**
@@ -28,7 +28,7 @@ const VERIFICATION_PATH_REGEX = /\/v1\/channel-verification-sessions/;
28
28
  const COMMAND_TOOLS = new Set(["bash", "host_bash"]);
29
29
 
30
30
  /** Tools whose `input.url` (string) may contain verification endpoint paths. */
31
- const URL_TOOLS = new Set(["network_request", "web_fetch", "browser_navigate"]);
31
+ const URL_TOOLS = new Set(["network_request", "web_fetch"]);
32
32
 
33
33
  /**
34
34
  * Normalize a string to defeat common URL obfuscation techniques before matching: