@vellumai/assistant 0.4.26 → 0.4.29

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 (1301) hide show
  1. package/.env.example +2 -2
  2. package/AGENTS.md +5 -0
  3. package/ARCHITECTURE.md +169 -69
  4. package/Dockerfile +1 -1
  5. package/README.md +111 -112
  6. package/bun.lock +0 -3
  7. package/docs/architecture/integrations.md +0 -1
  8. package/docs/architecture/memory.md +100 -63
  9. package/docs/error-handling.md +71 -0
  10. package/docs/runbook-trusted-contacts.md +10 -9
  11. package/docs/trusted-contact-access.md +48 -46
  12. package/package.json +3 -3
  13. package/scripts/compare-benchmarks.sh +12 -5
  14. package/scripts/ipc/check-swift-decoder-drift.ts +3 -0
  15. package/scripts/test.sh +89 -5
  16. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +46 -0
  17. package/src/__tests__/access-request-decision.test.ts +0 -1
  18. package/src/__tests__/account-registry.test.ts +1 -1
  19. package/src/__tests__/actor-token-service.test.ts +36 -23
  20. package/src/__tests__/agent-loop-thinking.test.ts +29 -13
  21. package/src/__tests__/agent-loop.test.ts +2 -1
  22. package/src/__tests__/app-builder-tool-scripts.test.ts +1 -1
  23. package/src/__tests__/approval-routes-http.test.ts +2 -2
  24. package/src/__tests__/asset-materialize-tool.test.ts +7 -7
  25. package/src/__tests__/asset-search-tool.test.ts +7 -7
  26. package/src/__tests__/browser-fill-credential.test.ts +1 -1
  27. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +217 -0
  28. package/src/__tests__/call-controller.test.ts +99 -69
  29. package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
  30. package/src/__tests__/channel-approval-routes.test.ts +113 -70
  31. package/src/__tests__/channel-guardian.test.ts +173 -282
  32. package/src/__tests__/channel-readiness-service.test.ts +6 -2
  33. package/src/__tests__/channel-reply-delivery.test.ts +2 -2
  34. package/src/__tests__/channel-retry-sweep.test.ts +14 -14
  35. package/src/__tests__/checker.test.ts +12 -31
  36. package/src/__tests__/claude-code-tool-profiles.test.ts +1 -1
  37. package/src/__tests__/commit-message-enrichment-service.test.ts +67 -59
  38. package/src/__tests__/compaction.benchmark.test.ts +6 -2
  39. package/src/__tests__/computer-use-tools.test.ts +1 -1
  40. package/src/__tests__/config-schema.test.ts +66 -7
  41. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +29 -29
  42. package/src/__tests__/contacts-tools.test.ts +63 -2
  43. package/src/__tests__/context-overflow-approval.test.ts +141 -0
  44. package/src/__tests__/context-overflow-policy.test.ts +171 -0
  45. package/src/__tests__/context-overflow-reducer.test.ts +533 -0
  46. package/src/__tests__/context-window-manager.test.ts +97 -0
  47. package/src/__tests__/conversation-attention-telegram.test.ts +38 -46
  48. package/src/__tests__/conversation-pairing.test.ts +2 -2
  49. package/src/__tests__/conversation-routes-guardian-reply.test.ts +214 -10
  50. package/src/__tests__/conversation-routes.test.ts +4 -7
  51. package/src/__tests__/credential-broker-browser-fill.test.ts +13 -2
  52. package/src/__tests__/credential-security-e2e.test.ts +1 -1
  53. package/src/__tests__/credential-security-invariants.test.ts +1 -1
  54. package/src/__tests__/credential-vault-unit.test.ts +1 -1
  55. package/src/__tests__/credential-vault.test.ts +11 -8
  56. package/src/__tests__/daemon-lifecycle.test.ts +2 -2
  57. package/src/__tests__/daemon-server-session-init.test.ts +6 -6
  58. package/src/__tests__/delete-managed-skill-tool.test.ts +1 -1
  59. package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -2
  60. package/src/__tests__/emit-signal-routing-intent.test.ts +4 -0
  61. package/src/__tests__/encrypted-store.test.ts +10 -7
  62. package/src/__tests__/ephemeral-permissions.test.ts +3 -3
  63. package/src/__tests__/file-edit-tool.test.ts +1 -1
  64. package/src/__tests__/file-read-tool.test.ts +1 -1
  65. package/src/__tests__/file-write-tool.test.ts +1 -1
  66. package/src/__tests__/fixtures/credential-security-fixtures.ts +87 -64
  67. package/src/__tests__/fixtures/media-reuse-fixtures.ts +37 -31
  68. package/src/__tests__/fixtures/mock-signup-server.ts +171 -115
  69. package/src/__tests__/fixtures/proxy-fixtures.ts +39 -39
  70. package/src/__tests__/followup-tools.test.ts +1 -1
  71. package/src/__tests__/gateway-only-guard.test.ts +3 -0
  72. package/src/__tests__/guardian-actions-endpoint.test.ts +543 -1
  73. package/src/__tests__/guardian-control-plane-policy.test.ts +15 -15
  74. package/src/__tests__/guardian-dispatch.test.ts +79 -1
  75. package/src/__tests__/guardian-grant-minting.test.ts +14 -14
  76. package/src/__tests__/guardian-outbound-http.test.ts +1 -2
  77. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -41
  78. package/src/__tests__/guardian-routing-invariants.test.ts +2 -5
  79. package/src/__tests__/guardian-routing-state.test.ts +36 -52
  80. package/src/__tests__/guardian-verification-intent-routing.test.ts +4 -6
  81. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
  82. package/src/__tests__/handle-user-message-secret-resume.test.ts +39 -1
  83. package/src/__tests__/handlers-cu-observation-blob.test.ts +21 -10
  84. package/src/__tests__/handlers-telegram-config.test.ts +14 -14
  85. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +23 -2
  86. package/src/__tests__/headless-browser-interactions.test.ts +1 -1
  87. package/src/__tests__/headless-browser-navigate.test.ts +1 -1
  88. package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
  89. package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
  90. package/src/__tests__/heartbeat-service.test.ts +45 -2
  91. package/src/__tests__/host-file-edit-tool.test.ts +1 -1
  92. package/src/__tests__/host-file-read-tool.test.ts +1 -1
  93. package/src/__tests__/host-file-write-tool.test.ts +1 -1
  94. package/src/__tests__/host-shell-tool.test.ts +1 -1
  95. package/src/__tests__/inbound-invite-redemption.test.ts +16 -18
  96. package/src/__tests__/ingress-reconcile.test.ts +2 -2
  97. package/src/__tests__/ingress-routes-http.test.ts +2 -1
  98. package/src/__tests__/integrations-cli.test.ts +256 -0
  99. package/src/__tests__/intent-routing.test.ts +4 -5
  100. package/src/__tests__/invite-redemption-service.test.ts +4 -3
  101. package/src/__tests__/ipc-snapshot.test.ts +28 -0
  102. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -1
  103. package/src/__tests__/mcp-cli.test.ts +136 -57
  104. package/src/__tests__/mcp-client-auth.test.ts +95 -0
  105. package/src/__tests__/media-generate-image.test.ts +2 -2
  106. package/src/__tests__/media-reuse-story.e2e.test.ts +8 -8
  107. package/src/__tests__/memory-regressions.test.ts +6 -6
  108. package/src/__tests__/messaging-send-tool.test.ts +1 -1
  109. package/src/__tests__/migration-cross-version-compatibility.test.ts +1855 -0
  110. package/src/__tests__/migration-export-http.test.ts +540 -0
  111. package/src/__tests__/migration-import-commit-http.test.ts +823 -0
  112. package/src/__tests__/migration-import-preflight-http.test.ts +755 -0
  113. package/src/__tests__/migration-parity-persistence.test.ts +1854 -0
  114. package/src/__tests__/migration-transport.test.ts +904 -0
  115. package/src/__tests__/migration-validate-http.test.ts +698 -0
  116. package/src/__tests__/migration-wizard.test.ts +1289 -0
  117. package/src/__tests__/non-member-access-request.test.ts +17 -17
  118. package/src/__tests__/notification-decision-strategy.test.ts +110 -2
  119. package/src/__tests__/notification-deep-link.test.ts +18 -0
  120. package/src/__tests__/notification-guardian-path.test.ts +0 -1
  121. package/src/__tests__/oauth2-gateway-transport.test.ts +1 -1
  122. package/src/__tests__/playbook-execution.test.ts +1 -1
  123. package/src/__tests__/playbook-tools.test.ts +1 -1
  124. package/src/__tests__/provider-streaming.benchmark.test.ts +3 -1
  125. package/src/__tests__/proxy-approval-callback.test.ts +1 -1
  126. package/src/__tests__/qdrant-manager.test.ts +40 -11
  127. package/src/__tests__/rebind-secrets-screen.test.ts +839 -0
  128. package/src/__tests__/recording-handler.test.ts +2 -2
  129. package/src/__tests__/recording-intent-handler.test.ts +3 -3
  130. package/src/__tests__/recording-state-machine.test.ts +2 -2
  131. package/src/__tests__/relay-server.test.ts +506 -227
  132. package/src/__tests__/reminder-store.test.ts +8 -0
  133. package/src/__tests__/reminder.test.ts +8 -0
  134. package/src/__tests__/{resolve-guardian-trust-class.test.ts → resolve-trust-class.test.ts} +11 -17
  135. package/src/__tests__/scaffold-managed-skill-tool.test.ts +1 -1
  136. package/src/__tests__/schedule-tools.test.ts +1 -1
  137. package/src/__tests__/script-proxy-certs.test.ts +1 -1
  138. package/src/__tests__/script-proxy-connect-tunnel.test.ts +2 -3
  139. package/src/__tests__/script-proxy-decision-trace.test.ts +2 -2
  140. package/src/__tests__/script-proxy-http-forwarder.test.ts +1 -1
  141. package/src/__tests__/script-proxy-injection-runtime.test.ts +5 -5
  142. package/src/__tests__/script-proxy-mitm-handler.test.ts +4 -4
  143. package/src/__tests__/script-proxy-policy-runtime.test.ts +2 -2
  144. package/src/__tests__/script-proxy-policy.test.ts +2 -2
  145. package/src/__tests__/script-proxy-session-manager.test.ts +4 -7
  146. package/src/__tests__/script-proxy-session-runtime.test.ts +1 -6
  147. package/src/__tests__/secret-onetime-send.test.ts +4 -4
  148. package/src/__tests__/secret-scanner-executor.test.ts +2 -2
  149. package/src/__tests__/send-endpoint-busy.test.ts +11 -9
  150. package/src/__tests__/send-notification-tool.test.ts +2 -2
  151. package/src/__tests__/session-abort-tool-results.test.ts +17 -2
  152. package/src/__tests__/session-agent-loop.test.ts +456 -35
  153. package/src/__tests__/session-confirmation-signals.test.ts +3 -2
  154. package/src/__tests__/session-conflict-gate.test.ts +20 -3
  155. package/src/__tests__/session-init.benchmark.test.ts +2 -2
  156. package/src/__tests__/session-load-history-repair.test.ts +7 -7
  157. package/src/__tests__/session-pre-run-repair.test.ts +17 -2
  158. package/src/__tests__/session-profile-injection.test.ts +20 -3
  159. package/src/__tests__/session-provider-retry-repair.test.ts +86 -6
  160. package/src/__tests__/session-queue.test.ts +33 -18
  161. package/src/__tests__/session-runtime-assembly.test.ts +147 -1
  162. package/src/__tests__/session-runtime-workspace.test.ts +40 -0
  163. package/src/__tests__/session-slash-known.test.ts +21 -3
  164. package/src/__tests__/session-slash-queue.test.ts +17 -2
  165. package/src/__tests__/session-slash-unknown.test.ts +17 -2
  166. package/src/__tests__/session-surfaces-deselection.test.ts +208 -0
  167. package/src/__tests__/session-workspace-cache-state.test.ts +2 -2
  168. package/src/__tests__/session-workspace-injection.test.ts +17 -2
  169. package/src/__tests__/session-workspace-tool-tracking.test.ts +17 -2
  170. package/src/__tests__/shell-credential-ref.test.ts +1 -1
  171. package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
  172. package/src/__tests__/skill-load-feature-flag.test.ts +1 -1
  173. package/src/__tests__/skill-load-tool.test.ts +1 -1
  174. package/src/__tests__/skill-script-runner-host.test.ts +1 -1
  175. package/src/__tests__/skill-script-runner-sandbox.test.ts +1 -1
  176. package/src/__tests__/skill-script-runner.test.ts +1 -1
  177. package/src/__tests__/skill-tool-factory.test.ts +1 -1
  178. package/src/__tests__/slack-skill.test.ts +3 -2
  179. package/src/__tests__/subagent-tools.test.ts +3 -3
  180. package/src/__tests__/swarm-recursion.test.ts +1 -1
  181. package/src/__tests__/swarm-session-integration.test.ts +1 -1
  182. package/src/__tests__/swarm-tool.test.ts +1 -1
  183. package/src/__tests__/task-management-tools.test.ts +1 -1
  184. package/src/__tests__/task-tools.test.ts +1 -1
  185. package/src/__tests__/terminal-tools.test.ts +1 -1
  186. package/src/__tests__/test-support/browser-skill-harness.ts +39 -27
  187. package/src/__tests__/test-support/computer-use-skill-harness.ts +14 -14
  188. package/src/__tests__/tool-approval-handler.test.ts +15 -15
  189. package/src/__tests__/tool-execution-abort-cleanup.test.ts +1 -1
  190. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -1
  191. package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
  192. package/src/__tests__/tool-executor-shell-integration.test.ts +1 -1
  193. package/src/__tests__/tool-executor.test.ts +23 -182
  194. package/src/__tests__/tool-grant-request-escalation.test.ts +11 -11
  195. package/src/__tests__/tool-permission-simulate-handler.test.ts +4 -4
  196. package/src/__tests__/transfer-progress-screen.test.ts +1180 -0
  197. package/src/__tests__/trust-context-guards.test.ts +25 -29
  198. package/src/__tests__/trusted-contact-approval-notifier.test.ts +23 -21
  199. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +37 -40
  200. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +29 -25
  201. package/src/__tests__/trusted-contact-multichannel.test.ts +25 -24
  202. package/src/__tests__/trusted-contact-verification.test.ts +63 -77
  203. package/src/__tests__/turn-commit.test.ts +18 -18
  204. package/src/__tests__/twilio-provider.test.ts +7 -7
  205. package/src/__tests__/validation-results-screen.test.ts +1107 -0
  206. package/src/__tests__/view-image-tool.test.ts +1 -1
  207. package/src/__tests__/voice-invite-redemption.test.ts +3 -2
  208. package/src/__tests__/voice-scoped-grant-consumer.test.ts +12 -12
  209. package/src/__tests__/voice-session-bridge.test.ts +24 -24
  210. package/src/agent/attachments.ts +3 -1
  211. package/src/agent/loop.ts +13 -13
  212. package/src/agent/message-types.ts +13 -7
  213. package/src/amazon/cart.ts +59 -32
  214. package/src/amazon/checkout.ts +25 -14
  215. package/src/amazon/client.ts +68 -48
  216. package/src/amazon/product-details.ts +3 -3
  217. package/src/amazon/request-extractor.ts +46 -31
  218. package/src/amazon/search.ts +6 -4
  219. package/src/amazon/session.ts +33 -24
  220. package/src/approvals/AGENTS.md +26 -0
  221. package/src/approvals/approval-primitive.ts +87 -64
  222. package/src/approvals/guardian-decision-primitive.ts +172 -81
  223. package/src/approvals/guardian-request-resolvers.ts +262 -155
  224. package/src/autonomy/autonomy-resolver.ts +7 -5
  225. package/src/autonomy/autonomy-store.ts +34 -19
  226. package/src/autonomy/disposition-mapper.ts +5 -5
  227. package/src/autonomy/index.ts +6 -6
  228. package/src/autonomy/types.ts +7 -3
  229. package/src/browser-extension-relay/client.ts +50 -19
  230. package/src/browser-extension-relay/protocol.ts +11 -11
  231. package/src/browser-extension-relay/server.ts +45 -20
  232. package/src/bundler/app-bundler.ts +75 -50
  233. package/src/bundler/bundle-scanner.ts +145 -41
  234. package/src/bundler/bundle-signer.ts +16 -14
  235. package/src/bundler/signature-verifier.ts +36 -33
  236. package/src/calls/call-constants.ts +10 -3
  237. package/src/calls/call-controller.ts +473 -214
  238. package/src/calls/call-conversation-messages.ts +25 -15
  239. package/src/calls/call-domain.ts +401 -148
  240. package/src/calls/call-pointer-message-composer.ts +26 -21
  241. package/src/calls/call-pointer-messages.ts +52 -28
  242. package/src/calls/call-recovery.ts +53 -37
  243. package/src/calls/call-state-machine.ts +37 -7
  244. package/src/calls/call-state.ts +35 -13
  245. package/src/calls/call-store.ts +165 -77
  246. package/src/calls/elevenlabs-client.ts +39 -20
  247. package/src/calls/guardian-action-sweep.ts +42 -24
  248. package/src/calls/guardian-dispatch.ts +79 -56
  249. package/src/calls/guardian-question-copy.ts +28 -23
  250. package/src/calls/relay-server.ts +1121 -532
  251. package/src/calls/speaker-identification.ts +21 -15
  252. package/src/calls/twilio-config.ts +34 -17
  253. package/src/calls/twilio-provider.ts +108 -55
  254. package/src/calls/twilio-rest.ts +212 -100
  255. package/src/calls/twilio-routes.ts +165 -92
  256. package/src/calls/types.ts +55 -7
  257. package/src/calls/voice-quality.ts +6 -4
  258. package/src/calls/voice-session-bridge.ts +181 -133
  259. package/src/channels/config.ts +17 -13
  260. package/src/channels/types.ts +38 -10
  261. package/src/cli/amazon.ts +333 -227
  262. package/src/cli/config-commands.ts +236 -146
  263. package/src/cli/core-commands.ts +403 -329
  264. package/src/cli/email-guardrails.ts +38 -19
  265. package/src/cli/email.ts +207 -153
  266. package/src/cli/influencer.ts +58 -56
  267. package/src/cli/integrations.ts +362 -0
  268. package/src/cli/ipc-client.ts +24 -19
  269. package/src/cli/map.ts +176 -129
  270. package/src/cli/mcp.ts +260 -152
  271. package/src/cli/sequence.ts +165 -107
  272. package/src/cli/twitter.ts +302 -218
  273. package/src/cli.ts +418 -279
  274. package/src/commands/cc-command-registry.ts +52 -27
  275. package/src/config/agent-schema.ts +217 -134
  276. package/src/config/assistant-feature-flags.ts +23 -18
  277. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +19 -0
  278. package/src/config/bundled-skills/app-builder/tools/app-create.ts +7 -4
  279. package/src/config/bundled-skills/app-builder/tools/app-delete.ts +6 -3
  280. package/src/config/bundled-skills/app-builder/tools/app-file-edit.ts +7 -4
  281. package/src/config/bundled-skills/app-builder/tools/app-file-list.ts +6 -3
  282. package/src/config/bundled-skills/app-builder/tools/app-file-read.ts +6 -3
  283. package/src/config/bundled-skills/app-builder/tools/app-file-write.ts +7 -4
  284. package/src/config/bundled-skills/app-builder/tools/app-list.ts +6 -3
  285. package/src/config/bundled-skills/app-builder/tools/app-query.ts +6 -3
  286. package/src/config/bundled-skills/app-builder/tools/app-update.ts +6 -3
  287. package/src/config/bundled-skills/browser/tools/browser-click.ts +5 -2
  288. package/src/config/bundled-skills/browser/tools/browser-close.ts +5 -2
  289. package/src/config/bundled-skills/browser/tools/browser-extract.ts +5 -2
  290. package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +5 -2
  291. package/src/config/bundled-skills/browser/tools/browser-hover.ts +5 -2
  292. package/src/config/bundled-skills/browser/tools/browser-navigate.ts +5 -2
  293. package/src/config/bundled-skills/browser/tools/browser-press-key.ts +5 -2
  294. package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +5 -2
  295. package/src/config/bundled-skills/browser/tools/browser-scroll.ts +5 -2
  296. package/src/config/bundled-skills/browser/tools/browser-select-option.ts +5 -2
  297. package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +5 -2
  298. package/src/config/bundled-skills/browser/tools/browser-type.ts +5 -2
  299. package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +13 -6
  300. package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +5 -2
  301. package/src/config/bundled-skills/claude-code/TOOLS.json +4 -0
  302. package/src/config/bundled-skills/claude-code/tools/claude-code.ts +5 -2
  303. package/src/config/bundled-skills/computer-use/SKILL.md +2 -2
  304. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +6 -3
  305. package/src/config/bundled-skills/computer-use/tools/computer-use-done.ts +6 -3
  306. package/src/config/bundled-skills/computer-use/tools/computer-use-double-click.ts +10 -3
  307. package/src/config/bundled-skills/computer-use/tools/computer-use-drag.ts +6 -3
  308. package/src/config/bundled-skills/computer-use/tools/computer-use-key.ts +6 -3
  309. package/src/config/bundled-skills/computer-use/tools/computer-use-open-app.ts +6 -3
  310. package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +10 -3
  311. package/src/config/bundled-skills/computer-use/tools/computer-use-respond.ts +6 -3
  312. package/src/config/bundled-skills/computer-use/tools/computer-use-right-click.ts +10 -3
  313. package/src/config/bundled-skills/computer-use/tools/computer-use-run-applescript.ts +10 -3
  314. package/src/config/bundled-skills/computer-use/tools/computer-use-scroll.ts +6 -3
  315. package/src/config/bundled-skills/computer-use/tools/computer-use-type-text.ts +6 -3
  316. package/src/config/bundled-skills/computer-use/tools/computer-use-wait.ts +6 -3
  317. package/src/config/bundled-skills/configure-settings/SKILL.md +28 -14
  318. package/src/config/bundled-skills/contacts/SKILL.md +446 -15
  319. package/src/config/bundled-skills/contacts/tools/contact-merge.ts +99 -20
  320. package/src/config/bundled-skills/contacts/tools/contact-search.ts +74 -17
  321. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +89 -26
  322. package/src/config/bundled-skills/document/tools/document-create.ts +5 -2
  323. package/src/config/bundled-skills/document/tools/document-update.ts +5 -2
  324. package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -7
  325. package/src/config/bundled-skills/email-setup/SKILL.md +9 -9
  326. package/src/config/bundled-skills/followups/tools/followup-create.ts +5 -2
  327. package/src/config/bundled-skills/followups/tools/followup-list.ts +5 -2
  328. package/src/config/bundled-skills/followups/tools/followup-resolve.ts +5 -2
  329. package/src/config/bundled-skills/google-calendar/calendar-client.ts +44 -32
  330. package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +11 -5
  331. package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +13 -7
  332. package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +11 -5
  333. package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +13 -7
  334. package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +28 -12
  335. package/src/config/bundled-skills/google-calendar/tools/shared.ts +6 -4
  336. package/src/config/bundled-skills/google-calendar/types.ts +3 -3
  337. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +46 -24
  338. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +36 -19
  339. package/src/config/bundled-skills/knowledge-graph/tools/graph-query.ts +60 -35
  340. package/src/config/bundled-skills/mcp-setup/SKILL.md +75 -0
  341. package/src/config/bundled-skills/media-processing/SKILL.md +55 -15
  342. package/src/config/bundled-skills/media-processing/TOOLS.json +20 -2
  343. package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +12 -10
  344. package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +34 -19
  345. package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +82 -66
  346. package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +148 -0
  347. package/src/config/bundled-skills/media-processing/services/concurrency-pool.ts +1 -1
  348. package/src/config/bundled-skills/media-processing/services/cost-tracker.ts +8 -3
  349. package/src/config/bundled-skills/media-processing/services/gemini-map.ts +117 -53
  350. package/src/config/bundled-skills/media-processing/services/gemini-video.ts +273 -0
  351. package/src/config/bundled-skills/media-processing/services/preprocess.ts +185 -97
  352. package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +32 -27
  353. package/src/config/bundled-skills/media-processing/services/reduce.ts +101 -24
  354. package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +121 -55
  355. package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +58 -24
  356. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +177 -91
  357. package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +98 -70
  358. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +59 -19
  359. package/src/config/bundled-skills/media-processing/tools/media-status.ts +26 -10
  360. package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +29 -14
  361. package/src/config/bundled-skills/messaging/SKILL.md +7 -5
  362. package/src/config/bundled-skills/messaging/TOOLS.json +7 -7
  363. package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +31 -13
  364. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +16 -10
  365. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +18 -9
  366. package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +23 -16
  367. package/src/config/bundled-skills/messaging/tools/gmail-draft.ts +28 -12
  368. package/src/config/bundled-skills/messaging/tools/gmail-filters.ts +41 -21
  369. package/src/config/bundled-skills/messaging/tools/gmail-follow-up.ts +44 -23
  370. package/src/config/bundled-skills/messaging/tools/gmail-forward.ts +73 -33
  371. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +15 -9
  372. package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +22 -14
  373. package/src/config/bundled-skills/messaging/tools/gmail-outreach-scan.ts +99 -50
  374. package/src/config/bundled-skills/messaging/tools/gmail-send-draft.ts +14 -8
  375. package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +63 -44
  376. package/src/config/bundled-skills/messaging/tools/gmail-sender-digest.ts +90 -46
  377. package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +43 -22
  378. package/src/config/bundled-skills/messaging/tools/gmail-trash.ts +15 -9
  379. package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +51 -22
  380. package/src/config/bundled-skills/messaging/tools/gmail-unsubscribe.ts +62 -26
  381. package/src/config/bundled-skills/messaging/tools/gmail-vacation.ts +34 -19
  382. package/src/config/bundled-skills/messaging/tools/google-contacts.ts +32 -16
  383. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +10 -4
  384. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +91 -47
  385. package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +21 -9
  386. package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +9 -3
  387. package/src/config/bundled-skills/messaging/tools/messaging-draft.ts +30 -17
  388. package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +10 -4
  389. package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +14 -6
  390. package/src/config/bundled-skills/messaging/tools/messaging-read.ts +16 -5
  391. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +63 -36
  392. package/src/config/bundled-skills/messaging/tools/messaging-search.ts +10 -4
  393. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +30 -12
  394. package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +48 -29
  395. package/src/config/bundled-skills/messaging/tools/scan-result-store.ts +20 -6
  396. package/src/config/bundled-skills/messaging/tools/send-notification.ts +1 -1
  397. package/src/config/bundled-skills/messaging/tools/sequence-analytics.ts +59 -22
  398. package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +13 -7
  399. package/src/config/bundled-skills/messaging/tools/sequence-create.ts +27 -12
  400. package/src/config/bundled-skills/messaging/tools/sequence-delete.ts +14 -6
  401. package/src/config/bundled-skills/messaging/tools/sequence-enroll.ts +30 -11
  402. package/src/config/bundled-skills/messaging/tools/sequence-enrollment-list.ts +16 -8
  403. package/src/config/bundled-skills/messaging/tools/sequence-get.ts +31 -13
  404. package/src/config/bundled-skills/messaging/tools/sequence-import.ts +38 -22
  405. package/src/config/bundled-skills/messaging/tools/sequence-list.ts +16 -7
  406. package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +29 -10
  407. package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +16 -8
  408. package/src/config/bundled-skills/messaging/tools/sequence-update.ts +35 -16
  409. package/src/config/bundled-skills/messaging/tools/shared.ts +26 -12
  410. package/src/config/bundled-skills/notifications/tools/send-notification.ts +69 -34
  411. package/src/config/bundled-skills/notifications/tools/shared.ts +1 -1
  412. package/src/config/bundled-skills/phone-calls/SKILL.md +46 -48
  413. package/src/config/bundled-skills/phone-calls/tools/call-end.ts +1 -1
  414. package/src/config/bundled-skills/phone-calls/tools/call-start.ts +1 -1
  415. package/src/config/bundled-skills/phone-calls/tools/call-status.ts +1 -1
  416. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +91 -51
  417. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +30 -16
  418. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +66 -27
  419. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +89 -42
  420. package/src/config/bundled-skills/public-ingress/SKILL.md +26 -19
  421. package/src/config/bundled-skills/reminder/tools/reminder-cancel.ts +5 -2
  422. package/src/config/bundled-skills/reminder/tools/reminder-create.ts +5 -2
  423. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +5 -2
  424. package/src/config/bundled-skills/schedule/tools/schedule-create.ts +5 -2
  425. package/src/config/bundled-skills/schedule/tools/schedule-delete.ts +5 -2
  426. package/src/config/bundled-skills/schedule/tools/schedule-list.ts +5 -2
  427. package/src/config/bundled-skills/schedule/tools/schedule-update.ts +5 -2
  428. package/src/config/bundled-skills/screen-recording/SKILL.md +11 -3
  429. package/src/config/bundled-skills/self-upgrade/SKILL.md +9 -8
  430. package/src/config/bundled-skills/slack/TOOLS.json +33 -15
  431. package/src/config/bundled-skills/slack/tools/shared.ts +7 -5
  432. package/src/config/bundled-skills/slack/tools/slack-add-reaction.ts +11 -5
  433. package/src/config/bundled-skills/slack/tools/slack-channel-details.ts +11 -5
  434. package/src/config/bundled-skills/slack/tools/slack-configure-channels.ts +46 -16
  435. package/src/config/bundled-skills/slack/tools/slack-delete-message.ts +11 -5
  436. package/src/config/bundled-skills/slack/tools/slack-edit-message.ts +28 -0
  437. package/src/config/bundled-skills/slack/tools/slack-leave-channel.ts +12 -6
  438. package/src/config/bundled-skills/sms-setup/SKILL.md +5 -8
  439. package/src/config/bundled-skills/subagent/tools/subagent-abort.ts +5 -2
  440. package/src/config/bundled-skills/subagent/tools/subagent-message.ts +5 -2
  441. package/src/config/bundled-skills/subagent/tools/subagent-read.ts +5 -2
  442. package/src/config/bundled-skills/subagent/tools/subagent-spawn.ts +5 -2
  443. package/src/config/bundled-skills/subagent/tools/subagent-status.ts +5 -2
  444. package/src/config/bundled-skills/tasks/tools/task-delete.ts +5 -2
  445. package/src/config/bundled-skills/tasks/tools/task-list-add.ts +5 -2
  446. package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +5 -2
  447. package/src/config/bundled-skills/tasks/tools/task-list-show.ts +5 -2
  448. package/src/config/bundled-skills/tasks/tools/task-list-update.ts +5 -2
  449. package/src/config/bundled-skills/tasks/tools/task-list.ts +5 -2
  450. package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +5 -2
  451. package/src/config/bundled-skills/tasks/tools/task-run.ts +5 -2
  452. package/src/config/bundled-skills/tasks/tools/task-save.ts +5 -2
  453. package/src/config/bundled-skills/telegram-setup/SKILL.md +7 -8
  454. package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +232 -127
  455. package/src/config/bundled-skills/twilio-setup/SKILL.md +7 -12
  456. package/src/config/bundled-skills/twitter/SKILL.md +19 -2
  457. package/src/config/bundled-skills/voice-setup/SKILL.md +5 -5
  458. package/src/config/bundled-skills/watcher/tools/watcher-create.ts +5 -2
  459. package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +5 -2
  460. package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +5 -2
  461. package/src/config/bundled-skills/watcher/tools/watcher-list.ts +5 -2
  462. package/src/config/bundled-skills/watcher/tools/watcher-update.ts +5 -2
  463. package/src/config/bundled-skills/weather/tools/get-weather.ts +5 -2
  464. package/src/config/calls-schema.ts +108 -63
  465. package/src/config/computer-use-prompt.ts +7 -7
  466. package/src/config/core-schema.ts +239 -155
  467. package/src/config/defaults.ts +2 -2
  468. package/src/config/elevenlabs-schema.ts +15 -15
  469. package/src/config/env-registry.ts +33 -33
  470. package/src/config/feature-flag-registry.json +31 -7
  471. package/src/config/loader.ts +118 -58
  472. package/src/config/mcp-schema.ts +29 -15
  473. package/src/config/memory-schema.ts +434 -229
  474. package/src/config/notifications-schema.ts +4 -4
  475. package/src/config/sandbox-schema.ts +2 -2
  476. package/src/config/schema.ts +12 -2
  477. package/src/config/skill-state.ts +27 -15
  478. package/src/config/skills-schema.ts +72 -23
  479. package/src/config/skills.ts +303 -143
  480. package/src/config/system-prompt.ts +25 -6
  481. package/src/config/types.ts +1 -1
  482. package/src/config/update-bulletin-format.ts +3 -3
  483. package/src/config/update-bulletin-state.ts +15 -6
  484. package/src/config/update-bulletin-template-path.ts +8 -4
  485. package/src/config/update-bulletin.ts +33 -14
  486. package/src/config/user-reference.ts +8 -8
  487. package/src/contacts/contact-events.ts +21 -0
  488. package/src/contacts/contact-store.ts +622 -100
  489. package/src/contacts/contacts-write.ts +287 -0
  490. package/src/contacts/index.ts +13 -4
  491. package/src/contacts/startup-migration.ts +21 -0
  492. package/src/contacts/types.ts +47 -2
  493. package/src/context/token-estimator.ts +54 -31
  494. package/src/context/tool-result-truncation.ts +41 -7
  495. package/src/context/window-manager.ts +225 -120
  496. package/src/daemon/approval-generators.ts +83 -55
  497. package/src/daemon/approved-devices-store.ts +33 -20
  498. package/src/daemon/assistant-attachments.ts +134 -98
  499. package/src/daemon/auth-manager.ts +17 -15
  500. package/src/daemon/classifier.ts +117 -46
  501. package/src/daemon/computer-use-session.ts +316 -187
  502. package/src/daemon/config-watcher.ts +91 -44
  503. package/src/daemon/connection-policy.ts +18 -10
  504. package/src/daemon/context-overflow-approval.ts +48 -0
  505. package/src/daemon/context-overflow-policy.ts +50 -0
  506. package/src/daemon/context-overflow-reducer.ts +300 -0
  507. package/src/daemon/daemon-control.ts +79 -51
  508. package/src/daemon/date-context.ts +119 -69
  509. package/src/daemon/dictation-profile-store.ts +94 -48
  510. package/src/daemon/dictation-text-processing.ts +33 -12
  511. package/src/daemon/doordash-steps.ts +92 -49
  512. package/src/daemon/guardian-action-generators.ts +62 -46
  513. package/src/daemon/guardian-verification-intent.ts +31 -18
  514. package/src/daemon/handlers/apps.ts +257 -111
  515. package/src/daemon/handlers/avatar.ts +20 -15
  516. package/src/daemon/handlers/computer-use.ts +82 -39
  517. package/src/daemon/handlers/config-channels.ts +146 -69
  518. package/src/daemon/handlers/config-heartbeat.ts +114 -59
  519. package/src/daemon/handlers/config-inbox.ts +277 -106
  520. package/src/daemon/handlers/config-ingress.ts +127 -55
  521. package/src/daemon/handlers/config-integrations.ts +145 -88
  522. package/src/daemon/handlers/config-model.ts +58 -22
  523. package/src/daemon/handlers/config-platform.ts +40 -16
  524. package/src/daemon/handlers/config-scheduling.ts +109 -48
  525. package/src/daemon/handlers/config-slack-channel.ts +67 -35
  526. package/src/daemon/handlers/config-slack.ts +21 -20
  527. package/src/daemon/handlers/config-telegram.ts +100 -70
  528. package/src/daemon/handlers/config-tools.ts +103 -55
  529. package/src/daemon/handlers/config-trust.ts +50 -20
  530. package/src/daemon/handlers/config.ts +72 -24
  531. package/src/daemon/handlers/contacts.ts +163 -0
  532. package/src/daemon/handlers/diagnostics.ts +90 -48
  533. package/src/daemon/handlers/documents.ts +74 -46
  534. package/src/daemon/handlers/guardian-actions.ts +118 -71
  535. package/src/daemon/handlers/home-base.ts +19 -16
  536. package/src/daemon/handlers/identity.ts +65 -45
  537. package/src/daemon/handlers/index.ts +78 -54
  538. package/src/daemon/handlers/misc.ts +664 -234
  539. package/src/daemon/handlers/navigate-settings.ts +14 -11
  540. package/src/daemon/handlers/oauth-connect.ts +48 -35
  541. package/src/daemon/handlers/open-bundle-handler.ts +31 -24
  542. package/src/daemon/handlers/pairing.ts +51 -25
  543. package/src/daemon/handlers/publish.ts +55 -33
  544. package/src/daemon/handlers/recording.ts +378 -162
  545. package/src/daemon/handlers/sessions.ts +923 -423
  546. package/src/daemon/handlers/shared.ts +202 -117
  547. package/src/daemon/handlers/signing.ts +25 -6
  548. package/src/daemon/handlers/subagents.ts +117 -56
  549. package/src/daemon/handlers/twitter-auth.ts +70 -49
  550. package/src/daemon/handlers/work-items.ts +264 -112
  551. package/src/daemon/handlers/workspace-files.ts +27 -20
  552. package/src/daemon/handlers.ts +2 -2
  553. package/src/daemon/history-repair.ts +16 -15
  554. package/src/daemon/identity-helpers.ts +4 -4
  555. package/src/daemon/install-cli-launchers.ts +33 -22
  556. package/src/daemon/ipc-blob-store.ts +38 -24
  557. package/src/daemon/ipc-contract/apps.ts +61 -49
  558. package/src/daemon/ipc-contract/computer-use.ts +47 -37
  559. package/src/daemon/ipc-contract/contacts.ts +69 -0
  560. package/src/daemon/ipc-contract/diagnostics.ts +14 -14
  561. package/src/daemon/ipc-contract/documents.ts +8 -8
  562. package/src/daemon/ipc-contract/guardian-actions.ts +4 -4
  563. package/src/daemon/ipc-contract/inbox.ts +16 -16
  564. package/src/daemon/ipc-contract/integrations.ts +57 -44
  565. package/src/daemon/ipc-contract/memory.ts +3 -5
  566. package/src/daemon/ipc-contract/messages.ts +95 -69
  567. package/src/daemon/ipc-contract/notifications.ts +10 -6
  568. package/src/daemon/ipc-contract/pairing.ts +8 -8
  569. package/src/daemon/ipc-contract/schedules.ts +20 -20
  570. package/src/daemon/ipc-contract/sessions.ts +88 -57
  571. package/src/daemon/ipc-contract/settings.ts +12 -7
  572. package/src/daemon/ipc-contract/shared.ts +9 -7
  573. package/src/daemon/ipc-contract/skills.ts +46 -26
  574. package/src/daemon/ipc-contract/subagents.ts +9 -9
  575. package/src/daemon/ipc-contract/trust.ts +11 -11
  576. package/src/daemon/ipc-contract/work-items.ts +33 -28
  577. package/src/daemon/ipc-contract/workspace.ts +28 -21
  578. package/src/daemon/ipc-contract-inventory.json +8 -0
  579. package/src/daemon/ipc-contract-inventory.ts +29 -26
  580. package/src/daemon/ipc-contract.ts +111 -44
  581. package/src/daemon/ipc-handler.ts +27 -19
  582. package/src/daemon/ipc-protocol.ts +22 -12
  583. package/src/daemon/ipc-validate.ts +91 -46
  584. package/src/daemon/lifecycle.ts +25 -1
  585. package/src/daemon/main.ts +10 -8
  586. package/src/daemon/media-visibility-policy.ts +3 -1
  587. package/src/daemon/pairing-store.ts +72 -40
  588. package/src/daemon/providers-setup.ts +35 -25
  589. package/src/daemon/recording-executor.ts +37 -30
  590. package/src/daemon/recording-intent-fallback.ts +58 -28
  591. package/src/daemon/recording-intent.ts +71 -61
  592. package/src/daemon/ride-shotgun-handler.ts +201 -121
  593. package/src/daemon/seed-files.ts +28 -17
  594. package/src/daemon/server.ts +23 -14
  595. package/src/daemon/session-agent-loop-handlers.ts +261 -135
  596. package/src/daemon/session-agent-loop.ts +795 -253
  597. package/src/daemon/session-attachments.ts +104 -39
  598. package/src/daemon/session-conflict-gate.ts +72 -28
  599. package/src/daemon/session-dynamic-profile.ts +36 -22
  600. package/src/daemon/session-error.ts +50 -45
  601. package/src/daemon/session-evictor.ts +17 -10
  602. package/src/daemon/session-history.ts +201 -89
  603. package/src/daemon/session-lifecycle.ts +79 -42
  604. package/src/daemon/session-media-retry.ts +89 -41
  605. package/src/daemon/session-memory.ts +77 -55
  606. package/src/daemon/session-messaging.ts +261 -111
  607. package/src/daemon/session-notifiers.ts +57 -45
  608. package/src/daemon/session-process.ts +370 -154
  609. package/src/daemon/session-queue-manager.ts +30 -13
  610. package/src/daemon/session-runtime-assembly.ts +61 -15
  611. package/src/daemon/session-skill-tools.ts +84 -36
  612. package/src/daemon/session-slash.ts +178 -113
  613. package/src/daemon/session-surfaces.ts +498 -211
  614. package/src/daemon/session-tool-setup.ts +22 -17
  615. package/src/daemon/session-usage.ts +26 -13
  616. package/src/daemon/session-workspace.ts +7 -4
  617. package/src/daemon/session.ts +18 -19
  618. package/src/daemon/shutdown-handlers.ts +36 -33
  619. package/src/daemon/tls-certs.ts +90 -57
  620. package/src/daemon/tool-side-effects.ts +97 -65
  621. package/src/daemon/trace-emitter.ts +8 -7
  622. package/src/daemon/video-thumbnail.ts +55 -25
  623. package/src/daemon/watch-handler.ts +164 -86
  624. package/src/email/provider.ts +1 -1
  625. package/src/email/providers/agentmail.ts +87 -45
  626. package/src/email/providers/index.ts +19 -14
  627. package/src/email/service.ts +52 -24
  628. package/src/email/types.ts +2 -2
  629. package/src/errors.ts +1 -1
  630. package/src/events/bus.ts +30 -10
  631. package/src/events/domain-events.ts +19 -13
  632. package/src/events/index.ts +6 -6
  633. package/src/events/tool-audit-listener.ts +34 -20
  634. package/src/events/tool-domain-event-publisher.ts +22 -20
  635. package/src/events/tool-metrics-listener.ts +26 -21
  636. package/src/events/tool-notification-listener.ts +5 -5
  637. package/src/events/tool-profiling-listener.ts +33 -23
  638. package/src/events/tool-trace-listener.ts +70 -46
  639. package/src/export/formatter.ts +38 -32
  640. package/src/followups/followup-store.ts +43 -36
  641. package/src/followups/index.ts +2 -2
  642. package/src/followups/types.ts +1 -1
  643. package/src/gallery/default-gallery.ts +37 -34
  644. package/src/gallery/gallery-manifest.ts +9 -9
  645. package/src/heartbeat/heartbeat-service.ts +59 -37
  646. package/src/home-base/app-link-store.ts +14 -12
  647. package/src/home-base/bootstrap.ts +14 -8
  648. package/src/home-base/prebuilt/seed.ts +35 -26
  649. package/src/home-base/prebuilt-home-base-updater.ts +14 -8
  650. package/src/hooks/cli.ts +56 -43
  651. package/src/hooks/config.ts +27 -14
  652. package/src/hooks/discovery.ts +53 -33
  653. package/src/hooks/manager.ts +50 -26
  654. package/src/hooks/runner.ts +35 -29
  655. package/src/hooks/templates.ts +38 -15
  656. package/src/hooks/types.ts +13 -13
  657. package/src/inbound/platform-callback-registration.ts +21 -15
  658. package/src/inbound/public-ingress-urls.ts +9 -6
  659. package/src/index.ts +20 -19
  660. package/src/influencer/client.ts +269 -108
  661. package/src/instrument.ts +3 -1
  662. package/src/logfire.ts +64 -39
  663. package/src/mcp/client.ts +107 -55
  664. package/src/mcp/manager.ts +45 -18
  665. package/src/mcp/mcp-oauth-provider.ts +114 -62
  666. package/src/media/gemini-image-service.ts +28 -21
  667. package/src/memory/account-store.ts +16 -9
  668. package/src/memory/admin.ts +87 -57
  669. package/src/memory/app-git-service.ts +77 -47
  670. package/src/memory/app-store.ts +151 -77
  671. package/src/memory/attachments-store.ts +123 -53
  672. package/src/memory/canonical-guardian-store.ts +190 -48
  673. package/src/memory/channel-delivery-store.ts +5 -5
  674. package/src/memory/channel-guardian-store.ts +31 -16
  675. package/src/memory/checkpoints.ts +14 -7
  676. package/src/memory/clarification-resolver.ts +219 -104
  677. package/src/memory/conflict-intent.ts +74 -23
  678. package/src/memory/conflict-policy.ts +20 -7
  679. package/src/memory/conflict-store.ts +144 -94
  680. package/src/memory/contradiction-checker.ts +257 -132
  681. package/src/memory/conversation-attention-store.ts +72 -32
  682. package/src/memory/conversation-bootstrap.ts +28 -0
  683. package/src/memory/conversation-crud.ts +12 -5
  684. package/src/memory/conversation-display-order-migration.ts +7 -7
  685. package/src/memory/conversation-key-store.ts +18 -13
  686. package/src/memory/conversation-queries.ts +130 -52
  687. package/src/memory/conversation-store.ts +43 -26
  688. package/src/memory/conversation-title-service.ts +89 -66
  689. package/src/memory/db-init.ts +90 -2
  690. package/src/memory/db.ts +10 -3
  691. package/src/memory/delivery-channels.ts +12 -6
  692. package/src/memory/delivery-crud.ts +26 -12
  693. package/src/memory/delivery-status.ts +19 -16
  694. package/src/memory/embedding-backend.ts +205 -77
  695. package/src/memory/embedding-gemini.ts +23 -10
  696. package/src/memory/embedding-local.ts +89 -44
  697. package/src/memory/embedding-ollama.ts +25 -13
  698. package/src/memory/embedding-openai.ts +20 -11
  699. package/src/memory/embedding-runtime-manager.ts +163 -90
  700. package/src/memory/entity-extractor.ts +185 -123
  701. package/src/memory/external-conversation-store.ts +30 -12
  702. package/src/memory/fingerprint.ts +2 -2
  703. package/src/memory/fts-reconciler.ts +57 -28
  704. package/src/memory/guardian-action-store.ts +162 -100
  705. package/src/memory/guardian-approvals.ts +63 -129
  706. package/src/memory/guardian-rate-limits.ts +20 -9
  707. package/src/memory/guardian-verification.ts +82 -35
  708. package/src/memory/indexer.ts +96 -55
  709. package/src/memory/ingress-invite-store.ts +28 -169
  710. package/src/memory/items-extractor.ts +313 -157
  711. package/src/memory/job-handlers/backfill.ts +116 -63
  712. package/src/memory/job-handlers/cleanup.ts +64 -41
  713. package/src/memory/job-handlers/conflict.ts +90 -49
  714. package/src/memory/job-handlers/embedding.ts +32 -17
  715. package/src/memory/job-handlers/extraction.ts +58 -33
  716. package/src/memory/job-handlers/index-maintenance.ts +31 -17
  717. package/src/memory/job-handlers/media-processing.ts +65 -24
  718. package/src/memory/job-handlers/summarization.ts +186 -128
  719. package/src/memory/job-utils.ts +100 -57
  720. package/src/memory/jobs-store.ts +235 -142
  721. package/src/memory/jobs-worker.ts +167 -83
  722. package/src/memory/llm-request-log-store.ts +13 -11
  723. package/src/memory/llm-usage-store.ts +35 -26
  724. package/src/memory/media-store.ts +151 -44
  725. package/src/memory/message-content.ts +28 -18
  726. package/src/memory/migrations/001-job-deferrals.ts +11 -5
  727. package/src/memory/migrations/002-tool-invocations-fk.ts +14 -6
  728. package/src/memory/migrations/003-memory-fts-backfill.ts +11 -5
  729. package/src/memory/migrations/004-entity-relation-dedup.ts +17 -11
  730. package/src/memory/migrations/005-fingerprint-scope-unique.ts +36 -21
  731. package/src/memory/migrations/006-scope-salted-fingerprints.ts +35 -20
  732. package/src/memory/migrations/007-assistant-id-to-self.ts +40 -27
  733. package/src/memory/migrations/008-remove-assistant-id-columns.ts +58 -36
  734. package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +36 -22
  735. package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +21 -11
  736. package/src/memory/migrations/011-call-sessions-provider-sid-dedup.ts +30 -15
  737. package/src/memory/migrations/012-call-sessions-add-initiated-from.ts +4 -2
  738. package/src/memory/migrations/013-guardian-action-tables.ts +29 -11
  739. package/src/memory/migrations/014-backfill-inbox-thread-state.ts +35 -21
  740. package/src/memory/migrations/015-drop-active-search-index.ts +17 -11
  741. package/src/memory/migrations/016-memory-segments-indexes.ts +7 -3
  742. package/src/memory/migrations/017-memory-items-indexes.ts +4 -2
  743. package/src/memory/migrations/018-remaining-table-indexes.ts +13 -5
  744. package/src/memory/migrations/019-notification-tables-schema-migration.ts +34 -20
  745. package/src/memory/migrations/020-rename-macos-ios-channel-to-vellum.ts +87 -53
  746. package/src/memory/migrations/021-conversation-status-indexes.ts +7 -3
  747. package/src/memory/migrations/022-add-origin-interface.ts +4 -2
  748. package/src/memory/migrations/023-memory-item-sources-indexes.ts +4 -2
  749. package/src/memory/migrations/024-embedding-vector-blob.ts +34 -18
  750. package/src/memory/migrations/025-messages-fts-backfill.ts +11 -5
  751. package/src/memory/migrations/026-guardian-verification-sessions.ts +80 -14
  752. package/src/memory/migrations/026a-embeddings-nullable-vector-json.ts +42 -26
  753. package/src/memory/migrations/027-notification-delivery-pairing-columns.ts +22 -8
  754. package/src/memory/migrations/027a-guardian-bootstrap-token.ts +11 -3
  755. package/src/memory/migrations/028-call-session-mode.ts +13 -3
  756. package/src/memory/migrations/028-notification-delivery-client-ack.ts +22 -8
  757. package/src/memory/migrations/029-channel-inbound-delivered-segments.ts +7 -3
  758. package/src/memory/migrations/030-guardian-action-followup.ts +46 -8
  759. package/src/memory/migrations/030-guardian-verification-purpose.ts +4 -2
  760. package/src/memory/migrations/031-conversations-thread-type-index.ts +4 -2
  761. package/src/memory/migrations/032-guardian-delivery-conversation-index.ts +4 -2
  762. package/src/memory/migrations/032-notification-delivery-thread-decision.ts +22 -8
  763. package/src/memory/migrations/033-scoped-approval-grants.ts +1 -1
  764. package/src/memory/migrations/034-guardian-action-tool-metadata.ts +15 -3
  765. package/src/memory/migrations/035-guardian-action-supersession.ts +15 -3
  766. package/src/memory/migrations/036-normalize-phone-identities.ts +101 -87
  767. package/src/memory/migrations/037-voice-invite-columns.ts +22 -4
  768. package/src/memory/migrations/038-actor-token-records.ts +5 -9
  769. package/src/memory/migrations/039-actor-refresh-token-records.ts +7 -13
  770. package/src/memory/migrations/100-core-tables.ts +1 -1
  771. package/src/memory/migrations/101-watchers-and-logs.ts +1 -1
  772. package/src/memory/migrations/103-complex-migrations.ts +9 -9
  773. package/src/memory/migrations/104-core-indexes.ts +188 -64
  774. package/src/memory/migrations/105-contacts-and-triage.ts +28 -10
  775. package/src/memory/migrations/106-call-sessions.ts +58 -16
  776. package/src/memory/migrations/107-followups.ts +16 -6
  777. package/src/memory/migrations/108-tasks-and-work-items.ts +43 -11
  778. package/src/memory/migrations/109-external-conversation-bindings.ts +11 -5
  779. package/src/memory/migrations/110-channel-guardian.ts +48 -10
  780. package/src/memory/migrations/111-media-assets.ts +52 -18
  781. package/src/memory/migrations/112-assistant-inbox.ts +32 -12
  782. package/src/memory/migrations/113-late-migrations.ts +12 -12
  783. package/src/memory/migrations/114-notifications.ts +28 -12
  784. package/src/memory/migrations/115-sequences.ts +10 -4
  785. package/src/memory/migrations/116-messages-fts.ts +1 -1
  786. package/src/memory/migrations/117-conversation-attention.ts +16 -6
  787. package/src/memory/migrations/118-reminder-routing-intent.ts +7 -3
  788. package/src/memory/migrations/119-schema-indexes-and-columns.ts +35 -15
  789. package/src/memory/migrations/120-fk-cascade-rebuilds.ts +36 -17
  790. package/src/memory/migrations/121-canonical-guardian-requests.ts +25 -9
  791. package/src/memory/migrations/122-canonical-guardian-requester-chat-id.ts +11 -3
  792. package/src/memory/migrations/123-canonical-guardian-deliveries-destination-index.ts +4 -2
  793. package/src/memory/migrations/124-voice-invite-display-metadata.ts +15 -3
  794. package/src/memory/migrations/125-guardian-principal-id-columns.ts +22 -4
  795. package/src/memory/migrations/126-backfill-guardian-principal-id.ts +174 -126
  796. package/src/memory/migrations/127-guardian-principal-id-not-null.ts +58 -42
  797. package/src/memory/migrations/128-contacts-role-principal.ts +26 -0
  798. package/src/memory/migrations/129-contact-channels-access-fields.ts +105 -0
  799. package/src/memory/migrations/130-contact-channels-type-ext-chat-id-index.ts +15 -0
  800. package/src/memory/migrations/131-drop-legacy-member-guardian-tables.ts +134 -0
  801. package/src/memory/migrations/132-contacts-assistant-id.ts +21 -0
  802. package/src/memory/migrations/index.ts +82 -73
  803. package/src/memory/migrations/registry.ts +53 -37
  804. package/src/memory/migrations/validate-migration-state.ts +73 -46
  805. package/src/memory/profile-compiler.ts +58 -24
  806. package/src/memory/published-pages-store.ts +12 -16
  807. package/src/memory/qdrant-circuit-breaker.ts +28 -20
  808. package/src/memory/qdrant-client.ts +99 -63
  809. package/src/memory/qdrant-manager.ts +89 -57
  810. package/src/memory/query-builder.ts +9 -7
  811. package/src/memory/raw-query.ts +63 -14
  812. package/src/memory/recall-cache.ts +15 -8
  813. package/src/memory/retrieval-budget.ts +0 -1
  814. package/src/memory/retriever.ts +385 -192
  815. package/src/memory/schema-migration.ts +1 -1
  816. package/src/memory/schema.ts +44 -56
  817. package/src/memory/scoped-approval-grants.ts +99 -45
  818. package/src/memory/search/entity.ts +102 -40
  819. package/src/memory/search/formatting.ts +70 -52
  820. package/src/memory/search/lexical.ts +82 -43
  821. package/src/memory/search/ranking.ts +103 -39
  822. package/src/memory/search/semantic.ts +59 -35
  823. package/src/memory/search/types.ts +8 -8
  824. package/src/memory/segmenter.ts +20 -12
  825. package/src/memory/shared-app-links-store.ts +21 -16
  826. package/src/memory/task-memory-cleanup.ts +18 -8
  827. package/src/memory/tool-usage-store.ts +27 -19
  828. package/src/memory/validation.ts +4 -2
  829. package/src/messaging/activity-analyzer.ts +7 -7
  830. package/src/messaging/draft-store.ts +13 -10
  831. package/src/messaging/email-classifier.ts +73 -37
  832. package/src/messaging/index.ts +3 -3
  833. package/src/messaging/outreach-classifier.ts +76 -38
  834. package/src/messaging/provider-types.ts +2 -4
  835. package/src/messaging/provider.ts +37 -8
  836. package/src/messaging/providers/gmail/adapter.ts +183 -66
  837. package/src/messaging/providers/gmail/client.ts +3 -1
  838. package/src/messaging/providers/gmail/mime-builder.ts +21 -19
  839. package/src/messaging/providers/gmail/people-client.ts +22 -9
  840. package/src/messaging/providers/gmail/types.ts +6 -6
  841. package/src/messaging/providers/slack/adapter.ts +93 -43
  842. package/src/messaging/providers/slack/client.ts +100 -41
  843. package/src/messaging/providers/slack/types.ts +6 -0
  844. package/src/messaging/providers/sms/adapter.ts +76 -40
  845. package/src/messaging/providers/sms/client.ts +4 -4
  846. package/src/messaging/providers/telegram-bot/adapter.ts +52 -30
  847. package/src/messaging/providers/telegram-bot/client.ts +7 -7
  848. package/src/messaging/providers/whatsapp/adapter.ts +58 -31
  849. package/src/messaging/providers/whatsapp/client.ts +4 -4
  850. package/src/messaging/registry.ts +9 -5
  851. package/src/messaging/style-analyzer.ts +69 -39
  852. package/src/messaging/thread-summarizer.ts +101 -53
  853. package/src/messaging/triage-engine.ts +111 -82
  854. package/src/messaging/types.ts +10 -10
  855. package/src/migrations/config-merge.ts +18 -10
  856. package/src/migrations/data-layout.ts +35 -22
  857. package/src/migrations/data-merge.ts +17 -7
  858. package/src/migrations/hooks-merge.ts +43 -16
  859. package/src/migrations/index.ts +6 -6
  860. package/src/migrations/log.ts +9 -5
  861. package/src/migrations/skills-merge.ts +17 -7
  862. package/src/migrations/workspace-layout.ts +39 -25
  863. package/src/notifications/AGENTS.md +5 -0
  864. package/src/notifications/adapters/macos.ts +21 -14
  865. package/src/notifications/adapters/sms.ts +28 -15
  866. package/src/notifications/adapters/telegram.ts +24 -15
  867. package/src/notifications/broadcaster.ts +108 -52
  868. package/src/notifications/conversation-pairing.ts +64 -29
  869. package/src/notifications/copy-composer.ts +165 -95
  870. package/src/notifications/decision-engine.ts +353 -147
  871. package/src/notifications/decisions-store.ts +26 -10
  872. package/src/notifications/deliveries-store.ts +23 -13
  873. package/src/notifications/destination-resolver.ts +42 -24
  874. package/src/notifications/deterministic-checks.ts +78 -27
  875. package/src/notifications/emit-signal.ts +83 -45
  876. package/src/notifications/events-store.ts +13 -7
  877. package/src/notifications/guardian-question-mode.ts +125 -75
  878. package/src/notifications/preference-extractor.ts +85 -53
  879. package/src/notifications/preference-summary.ts +31 -18
  880. package/src/notifications/preferences-store.ts +29 -18
  881. package/src/notifications/runtime-dispatch.ts +22 -12
  882. package/src/notifications/signal.ts +4 -4
  883. package/src/notifications/thread-candidates.ts +59 -23
  884. package/src/notifications/thread-seed-composer.ts +45 -27
  885. package/src/notifications/types.ts +19 -10
  886. package/src/oauth/connect-orchestrator.ts +105 -54
  887. package/src/oauth/connect-types.ts +3 -3
  888. package/src/oauth/provider-profiles.ts +80 -59
  889. package/src/oauth/scope-policy.ts +5 -2
  890. package/src/oauth/token-persistence.ts +58 -24
  891. package/src/outbound-proxy/certs.ts +284 -0
  892. package/src/outbound-proxy/config.ts +94 -0
  893. package/src/outbound-proxy/connect-tunnel.ts +84 -0
  894. package/src/outbound-proxy/health.ts +62 -0
  895. package/src/outbound-proxy/host-pattern-match.ts +67 -0
  896. package/src/outbound-proxy/http-forwarder.ts +162 -0
  897. package/src/outbound-proxy/index.ts +80 -0
  898. package/src/outbound-proxy/logging.ts +193 -0
  899. package/src/outbound-proxy/mitm-handler.ts +292 -0
  900. package/src/outbound-proxy/policy.ts +172 -0
  901. package/src/outbound-proxy/router.ts +64 -0
  902. package/src/outbound-proxy/server.ts +145 -0
  903. package/src/outbound-proxy/types.ts +150 -0
  904. package/src/permissions/checker.ts +481 -189
  905. package/src/permissions/defaults.ts +135 -108
  906. package/src/permissions/prompter.ts +53 -27
  907. package/src/permissions/secret-prompter.ts +21 -15
  908. package/src/permissions/shell-identity.ts +47 -16
  909. package/src/permissions/trust-store.ts +185 -73
  910. package/src/permissions/types.ts +22 -12
  911. package/src/permissions/workspace-policy.ts +47 -38
  912. package/src/playbooks/index.ts +10 -2
  913. package/src/playbooks/playbook-compiler.ts +30 -24
  914. package/src/playbooks/types.ts +11 -8
  915. package/src/providers/anthropic/client.ts +325 -168
  916. package/src/providers/failover.ts +57 -22
  917. package/src/providers/fireworks/client.ts +9 -5
  918. package/src/providers/gemini/client.ts +61 -39
  919. package/src/providers/model-intents.ts +40 -33
  920. package/src/providers/ollama/client.ts +7 -7
  921. package/src/providers/openai/client.ts +106 -68
  922. package/src/providers/openrouter/client.ts +9 -5
  923. package/src/providers/provider-send-message.ts +59 -27
  924. package/src/providers/ratelimit.ts +25 -8
  925. package/src/providers/registry.ts +86 -38
  926. package/src/providers/retry.ts +84 -36
  927. package/src/providers/stream-timeout.ts +5 -3
  928. package/src/providers/types.ts +7 -6
  929. package/src/runtime/AGENTS.md +42 -0
  930. package/src/runtime/access-request-helper.ts +118 -68
  931. package/src/runtime/actor-refresh-token-store.ts +21 -16
  932. package/src/runtime/actor-token-store.ts +25 -18
  933. package/src/runtime/actor-trust-resolver.ts +183 -80
  934. package/src/runtime/approval-conversation-turn.ts +39 -26
  935. package/src/runtime/approval-message-composer.ts +116 -84
  936. package/src/runtime/assistant-event-hub.ts +25 -6
  937. package/src/runtime/assistant-event.ts +4 -4
  938. package/src/runtime/assistant-scope.ts +1 -1
  939. package/src/runtime/auth/__tests__/guard-tests.test.ts +36 -14
  940. package/src/runtime/auth/context.ts +8 -7
  941. package/src/runtime/auth/credential-service.ts +60 -38
  942. package/src/runtime/auth/external-assistant-id.ts +16 -8
  943. package/src/runtime/auth/index.ts +23 -16
  944. package/src/runtime/auth/route-policy.ts +170 -104
  945. package/src/runtime/auth/scopes.ts +22 -29
  946. package/src/runtime/auth/subject.ts +19 -13
  947. package/src/runtime/auth/token-service.ts +3 -3
  948. package/src/runtime/auth/types.ts +23 -23
  949. package/src/runtime/channel-approval-parser.ts +37 -14
  950. package/src/runtime/channel-approval-types.ts +12 -4
  951. package/src/runtime/channel-approvals.ts +41 -23
  952. package/src/runtime/channel-guardian-service.ts +144 -103
  953. package/src/runtime/channel-invite-transport.ts +4 -2
  954. package/src/runtime/channel-invite-transports/telegram.ts +16 -10
  955. package/src/runtime/channel-invite-transports/voice.ts +7 -7
  956. package/src/runtime/channel-readiness-service.ts +139 -90
  957. package/src/runtime/channel-readiness-types.ts +4 -2
  958. package/src/runtime/channel-reply-delivery.ts +21 -11
  959. package/src/runtime/channel-retry-sweep.ts +111 -62
  960. package/src/runtime/confirmation-request-guardian-bridge.ts +73 -54
  961. package/src/runtime/gateway-client.ts +86 -53
  962. package/src/runtime/guardian-action-conversation-turn.ts +34 -18
  963. package/src/runtime/guardian-action-followup-executor.ts +115 -45
  964. package/src/runtime/guardian-action-grant-minter.ts +40 -24
  965. package/src/runtime/guardian-action-message-composer.ts +105 -84
  966. package/src/runtime/guardian-decision-types.ts +28 -13
  967. package/src/runtime/guardian-outbound-actions.ts +9 -0
  968. package/src/runtime/guardian-reply-router.ts +274 -145
  969. package/src/runtime/guardian-vellum-migration.ts +38 -24
  970. package/src/runtime/guardian-verification-templates.ts +8 -11
  971. package/src/runtime/http-router.ts +175 -0
  972. package/src/runtime/http-server.ts +931 -669
  973. package/src/runtime/http-types.ts +2 -2
  974. package/src/runtime/ingress-service.ts +182 -89
  975. package/src/runtime/invite-redemption-service.ts +211 -134
  976. package/src/runtime/invite-redemption-templates.ts +18 -11
  977. package/src/runtime/local-actor-identity.ts +73 -55
  978. package/src/runtime/middleware/auth.ts +25 -14
  979. package/src/runtime/middleware/error-handler.ts +15 -11
  980. package/src/runtime/middleware/rate-limiter.ts +23 -17
  981. package/src/runtime/middleware/request-logger.ts +4 -4
  982. package/src/runtime/middleware/twilio-validation.ts +29 -20
  983. package/src/runtime/migrations/migration-transport.ts +575 -0
  984. package/src/runtime/migrations/migration-wizard.ts +715 -0
  985. package/src/runtime/migrations/rebind-secrets-screen.ts +351 -0
  986. package/src/runtime/migrations/transfer-progress-screen.ts +321 -0
  987. package/src/runtime/migrations/validation-results-screen.ts +467 -0
  988. package/src/runtime/migrations/vbundle-builder.ts +295 -0
  989. package/src/runtime/migrations/vbundle-import-analyzer.ts +212 -0
  990. package/src/runtime/migrations/vbundle-importer.ts +339 -0
  991. package/src/runtime/migrations/vbundle-validator.ts +356 -0
  992. package/src/runtime/pending-interactions.ts +16 -7
  993. package/src/runtime/routes/access-request-decision.ts +73 -52
  994. package/src/runtime/routes/app-routes.ts +56 -38
  995. package/src/runtime/routes/approval-routes.ts +165 -74
  996. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +930 -0
  997. package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +82 -0
  998. package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +151 -0
  999. package/src/runtime/routes/attachment-routes.ts +59 -48
  1000. package/src/runtime/routes/brain-graph-routes.ts +85 -69
  1001. package/src/runtime/routes/call-routes.ts +79 -38
  1002. package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +10 -10
  1003. package/src/runtime/routes/channel-delivery-routes.ts +19 -14
  1004. package/src/runtime/routes/channel-guardian-routes.ts +3 -3
  1005. package/src/runtime/routes/channel-inbound-routes.ts +2 -2
  1006. package/src/runtime/routes/channel-readiness-routes.ts +12 -6
  1007. package/src/runtime/routes/channel-route-shared.ts +33 -25
  1008. package/src/runtime/routes/channel-routes.ts +4 -6
  1009. package/src/runtime/routes/contact-routes.ts +205 -16
  1010. package/src/runtime/routes/conversation-attention-routes.ts +57 -28
  1011. package/src/runtime/routes/conversation-routes.ts +321 -174
  1012. package/src/runtime/routes/debug-routes.ts +14 -10
  1013. package/src/runtime/routes/events-routes.ts +90 -57
  1014. package/src/runtime/routes/global-search-routes.ts +266 -0
  1015. package/src/runtime/routes/guardian-action-routes.ts +147 -56
  1016. package/src/runtime/routes/guardian-approval-interception.ts +255 -880
  1017. package/src/runtime/routes/guardian-approval-prompt.ts +40 -24
  1018. package/src/runtime/routes/guardian-approval-reply-helpers.ts +135 -0
  1019. package/src/runtime/routes/guardian-bootstrap-routes.ts +55 -36
  1020. package/src/runtime/routes/guardian-expiry-sweep.ts +63 -37
  1021. package/src/runtime/routes/guardian-refresh-routes.ts +40 -19
  1022. package/src/runtime/routes/identity-routes.ts +71 -42
  1023. package/src/runtime/routes/inbound-conversation.ts +17 -11
  1024. package/src/runtime/routes/inbound-message-handler.ts +278 -1460
  1025. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +658 -0
  1026. package/src/runtime/routes/inbound-stages/background-dispatch.ts +492 -0
  1027. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +214 -0
  1028. package/src/runtime/routes/inbound-stages/edit-intercept.ts +116 -0
  1029. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +167 -0
  1030. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +185 -0
  1031. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +132 -0
  1032. package/src/runtime/routes/inbound-stages/verification-intercept.ts +340 -0
  1033. package/src/runtime/routes/ingress-routes.ts +34 -23
  1034. package/src/runtime/routes/integration-routes.ts +60 -21
  1035. package/src/runtime/routes/migration-routes.ts +434 -0
  1036. package/src/runtime/routes/pairing-routes.ts +157 -79
  1037. package/src/runtime/routes/secret-routes.ts +6 -2
  1038. package/src/runtime/routes/twilio-routes.ts +443 -249
  1039. package/src/runtime/tool-grant-request-helper.ts +36 -27
  1040. package/src/runtime/{guardian-context-resolver.ts → trust-context-resolver.ts} +29 -41
  1041. package/src/schedule/integration-status.ts +44 -9
  1042. package/src/schedule/recurrence-engine.ts +47 -24
  1043. package/src/schedule/recurrence-types.ts +12 -7
  1044. package/src/schedule/schedule-store.ts +166 -83
  1045. package/src/schedule/scheduler.ts +26 -22
  1046. package/src/security/encrypted-store.ts +68 -38
  1047. package/src/security/keychain.ts +183 -120
  1048. package/src/security/oauth-callback-registry.ts +3 -3
  1049. package/src/security/oauth2.ts +226 -138
  1050. package/src/security/redaction.ts +24 -24
  1051. package/src/security/secret-allowlist.ts +46 -21
  1052. package/src/security/secret-ingress.ts +15 -7
  1053. package/src/security/secret-scanner.ts +193 -104
  1054. package/src/security/secure-keys.ts +9 -3
  1055. package/src/security/token-manager.ts +99 -40
  1056. package/src/security/tool-approval-digest.ts +3 -3
  1057. package/src/sequence/analytics.ts +52 -27
  1058. package/src/sequence/engine.ts +135 -72
  1059. package/src/sequence/guardrails.ts +32 -20
  1060. package/src/sequence/importer.ts +75 -37
  1061. package/src/sequence/reply-matcher.ts +36 -18
  1062. package/src/sequence/store.ts +137 -75
  1063. package/src/sequence/types.ts +30 -16
  1064. package/src/services/published-app-updater.ts +26 -16
  1065. package/src/services/vercel-deploy.ts +19 -15
  1066. package/src/skills/active-skill-tools.ts +3 -3
  1067. package/src/skills/clawhub.ts +178 -90
  1068. package/src/skills/include-graph.ts +24 -17
  1069. package/src/skills/managed-store.ts +89 -42
  1070. package/src/skills/path-classifier.ts +10 -10
  1071. package/src/skills/remote-skill-policy.ts +31 -22
  1072. package/src/skills/slash-commands.ts +36 -30
  1073. package/src/skills/tool-manifest.ts +60 -31
  1074. package/src/skills/version-hash.ts +25 -15
  1075. package/src/slack/slack-webhook.ts +19 -15
  1076. package/src/subagent/index.ts +4 -8
  1077. package/src/subagent/manager.ts +119 -69
  1078. package/src/subagent/types.ts +9 -12
  1079. package/src/swarm/backend-claude-code.ts +124 -45
  1080. package/src/swarm/checkpoint.ts +36 -16
  1081. package/src/swarm/graph-utils.ts +1 -3
  1082. package/src/swarm/index.ts +38 -19
  1083. package/src/swarm/limits.ts +13 -4
  1084. package/src/swarm/orchestrator.ts +108 -57
  1085. package/src/swarm/plan-validator.ts +23 -17
  1086. package/src/swarm/router-planner.ts +51 -22
  1087. package/src/swarm/router-prompts.ts +4 -1
  1088. package/src/swarm/synthesizer.ts +26 -18
  1089. package/src/swarm/types.ts +14 -4
  1090. package/src/swarm/worker-backend.ts +36 -26
  1091. package/src/swarm/worker-prompts.ts +13 -9
  1092. package/src/swarm/worker-runner.ts +40 -34
  1093. package/src/tasks/candidate-store.ts +14 -6
  1094. package/src/tasks/ephemeral-permissions.ts +9 -5
  1095. package/src/tasks/task-compiler.ts +41 -38
  1096. package/src/tasks/task-runner.ts +54 -26
  1097. package/src/tasks/task-scheduler.ts +1 -1
  1098. package/src/tasks/task-store.ts +20 -7
  1099. package/src/tasks/tool-sanitizer.ts +3 -3
  1100. package/src/tools/apps/definitions.ts +23 -15
  1101. package/src/tools/apps/executors.ts +118 -37
  1102. package/src/tools/apps/open-proxy.ts +5 -5
  1103. package/src/tools/apps/registry.ts +2 -2
  1104. package/src/tools/assets/materialize.ts +59 -41
  1105. package/src/tools/assets/search.ts +86 -48
  1106. package/src/tools/browser/api-map.ts +52 -36
  1107. package/src/tools/browser/auth-cache.ts +21 -18
  1108. package/src/tools/browser/auth-detector.ts +43 -28
  1109. package/src/tools/browser/auto-navigate.ts +149 -68
  1110. package/src/tools/browser/browser-execution.ts +9 -3
  1111. package/src/tools/browser/headless-browser.ts +287 -150
  1112. package/src/tools/browser/jit-auth.ts +37 -21
  1113. package/src/tools/browser/network-recorder.ts +138 -56
  1114. package/src/tools/browser/recording-store.ts +22 -15
  1115. package/src/tools/browser/runtime-check.ts +8 -5
  1116. package/src/tools/browser/x-auto-navigate.ts +88 -47
  1117. package/src/tools/calls/call-end.ts +9 -6
  1118. package/src/tools/calls/call-start.ts +30 -20
  1119. package/src/tools/calls/call-status.ts +8 -5
  1120. package/src/tools/claude-code/claude-code.ts +301 -165
  1121. package/src/tools/computer-use/definitions.ts +159 -130
  1122. package/src/tools/computer-use/registry.ts +2 -2
  1123. package/src/tools/computer-use/request-computer-control.ts +21 -13
  1124. package/src/tools/computer-use/skill-proxy-bridge.ts +1 -1
  1125. package/src/tools/credentials/account-registry.ts +52 -35
  1126. package/src/tools/credentials/broker-types.ts +1 -1
  1127. package/src/tools/credentials/broker.ts +97 -55
  1128. package/src/tools/credentials/domain-policy.ts +5 -2
  1129. package/src/tools/credentials/host-pattern-match.ts +15 -8
  1130. package/src/tools/credentials/metadata-store.ts +93 -43
  1131. package/src/tools/credentials/policy-types.ts +5 -2
  1132. package/src/tools/credentials/policy-validate.ts +21 -14
  1133. package/src/tools/credentials/post-connect-hooks.ts +18 -7
  1134. package/src/tools/credentials/resolve.ts +11 -10
  1135. package/src/tools/credentials/selection.ts +30 -25
  1136. package/src/tools/credentials/tool-policy.ts +5 -2
  1137. package/src/tools/credentials/vault.ts +452 -183
  1138. package/src/tools/document/document-tool.ts +23 -17
  1139. package/src/tools/document/editor-template.ts +12 -7
  1140. package/src/tools/execution-target.ts +13 -10
  1141. package/src/tools/execution-timeout.ts +6 -5
  1142. package/src/tools/executor.ts +141 -74
  1143. package/src/tools/filesystem/edit.ts +82 -45
  1144. package/src/tools/filesystem/fuzzy-match.ts +70 -32
  1145. package/src/tools/filesystem/read.ts +46 -28
  1146. package/src/tools/filesystem/view-image.ts +86 -42
  1147. package/src/tools/filesystem/write.ts +53 -32
  1148. package/src/tools/followups/followup_create.ts +43 -17
  1149. package/src/tools/followups/followup_list.ts +28 -13
  1150. package/src/tools/followups/followup_resolve.ts +9 -6
  1151. package/src/tools/guardian-control-plane-policy.ts +15 -14
  1152. package/src/tools/host-filesystem/edit.ts +77 -42
  1153. package/src/tools/host-filesystem/read.ts +52 -33
  1154. package/src/tools/host-filesystem/write.ts +50 -29
  1155. package/src/tools/host-terminal/host-shell.ts +97 -61
  1156. package/src/tools/mcp/mcp-tool-factory.ts +21 -14
  1157. package/src/tools/memory/definitions.ts +60 -28
  1158. package/src/tools/memory/handlers.ts +149 -77
  1159. package/src/tools/memory/register.ts +39 -16
  1160. package/src/tools/network/__tests__/web-search.test.ts +236 -177
  1161. package/src/tools/network/domain-normalize.ts +13 -9
  1162. package/src/tools/network/script-proxy/__tests__/logging.test.ts +193 -123
  1163. package/src/tools/network/script-proxy/__tests__/policy.test.ts +225 -127
  1164. package/src/tools/network/script-proxy/index.ts +1 -17
  1165. package/src/tools/network/script-proxy/session-manager.ts +151 -84
  1166. package/src/tools/network/url-safety.ts +56 -34
  1167. package/src/tools/network/web-fetch.ts +273 -155
  1168. package/src/tools/network/web-search.ts +166 -81
  1169. package/src/tools/permission-checker.ts +6 -25
  1170. package/src/tools/policy-context.ts +8 -5
  1171. package/src/tools/registry.ts +73 -46
  1172. package/src/tools/reminder/reminder-store.ts +65 -44
  1173. package/src/tools/reminder/reminder.ts +76 -35
  1174. package/src/tools/schedule/create.ts +44 -21
  1175. package/src/tools/schedule/delete.ts +8 -5
  1176. package/src/tools/schedule/list.ts +39 -19
  1177. package/src/tools/schedule/update.ts +49 -26
  1178. package/src/tools/secret-detection-handler.ts +130 -49
  1179. package/src/tools/sensitive-output-placeholders.ts +15 -8
  1180. package/src/tools/shared/filesystem/edit-engine.ts +45 -14
  1181. package/src/tools/shared/filesystem/errors.ts +18 -18
  1182. package/src/tools/shared/filesystem/file-ops-service.ts +59 -32
  1183. package/src/tools/shared/filesystem/format-diff.ts +21 -11
  1184. package/src/tools/shared/filesystem/path-policy.ts +17 -13
  1185. package/src/tools/shared/filesystem/size-guard.ts +8 -4
  1186. package/src/tools/shared/filesystem/types.ts +2 -2
  1187. package/src/tools/shared/shell-output.ts +4 -3
  1188. package/src/tools/side-effects.ts +36 -28
  1189. package/src/tools/skills/delete-managed.ts +30 -17
  1190. package/src/tools/skills/load.ts +88 -46
  1191. package/src/tools/skills/sandbox-runner.ts +62 -46
  1192. package/src/tools/skills/scaffold-managed.ts +98 -48
  1193. package/src/tools/skills/script-contract.ts +5 -2
  1194. package/src/tools/skills/skill-script-runner.ts +29 -13
  1195. package/src/tools/skills/skill-tool-factory.ts +20 -10
  1196. package/src/tools/subagent/abort.ts +10 -4
  1197. package/src/tools/subagent/message.ts +14 -8
  1198. package/src/tools/subagent/read.ts +20 -11
  1199. package/src/tools/subagent/spawn.ts +14 -6
  1200. package/src/tools/subagent/status.ts +7 -4
  1201. package/src/tools/swarm/delegate.ts +75 -49
  1202. package/src/tools/system/avatar-generator.ts +46 -33
  1203. package/src/tools/system/navigate-settings.ts +29 -19
  1204. package/src/tools/system/open-system-settings.ts +30 -20
  1205. package/src/tools/system/request-permission.ts +59 -44
  1206. package/src/tools/system/version.ts +27 -16
  1207. package/src/tools/system/voice-config.ts +116 -53
  1208. package/src/tools/tasks/index.ts +8 -8
  1209. package/src/tools/tasks/task-delete.ts +61 -22
  1210. package/src/tools/tasks/task-list.ts +23 -11
  1211. package/src/tools/tasks/task-run.ts +41 -16
  1212. package/src/tools/tasks/task-save.ts +27 -10
  1213. package/src/tools/tasks/work-item-enqueue.ts +114 -48
  1214. package/src/tools/tasks/work-item-list.ts +20 -10
  1215. package/src/tools/tasks/work-item-remove.ts +49 -15
  1216. package/src/tools/tasks/work-item-run.ts +34 -13
  1217. package/src/tools/tasks/work-item-update.ts +84 -31
  1218. package/src/tools/terminal/backends/native.ts +64 -35
  1219. package/src/tools/terminal/backends/types.ts +6 -2
  1220. package/src/tools/terminal/parser.ts +200 -125
  1221. package/src/tools/terminal/safe-env.ts +27 -21
  1222. package/src/tools/terminal/sandbox-diagnostics.ts +31 -13
  1223. package/src/tools/terminal/sandbox.ts +10 -6
  1224. package/src/tools/terminal/shell.ts +124 -68
  1225. package/src/tools/tool-approval-handler.ts +193 -138
  1226. package/src/tools/types.ts +43 -23
  1227. package/src/tools/ui-surface/definitions.ts +124 -89
  1228. package/src/tools/ui-surface/registry.ts +2 -2
  1229. package/src/tools/watch/screen-watch.ts +50 -32
  1230. package/src/tools/watch/watch-state.ts +41 -15
  1231. package/src/tools/watcher/create.ts +37 -15
  1232. package/src/tools/watcher/delete.ts +9 -6
  1233. package/src/tools/watcher/digest.ts +10 -6
  1234. package/src/tools/watcher/list.ts +37 -14
  1235. package/src/tools/watcher/update.ts +33 -18
  1236. package/src/tools/weather/service.ts +331 -174
  1237. package/src/twitter/client.ts +261 -138
  1238. package/src/twitter/oauth-client.ts +17 -13
  1239. package/src/twitter/router.ts +51 -23
  1240. package/src/twitter/session.ts +27 -18
  1241. package/src/types/qrcode.d.ts +6 -3
  1242. package/src/usage/actors.ts +16 -16
  1243. package/src/usage/types.ts +3 -3
  1244. package/src/util/bundled-asset.ts +10 -6
  1245. package/src/util/canonicalize-identity.ts +11 -4
  1246. package/src/util/clipboard.ts +7 -7
  1247. package/src/util/content-id.ts +3 -3
  1248. package/src/util/debounce.ts +3 -2
  1249. package/src/util/diff.ts +55 -33
  1250. package/src/util/errors.ts +26 -26
  1251. package/src/util/fs.ts +8 -2
  1252. package/src/util/log-redact.ts +12 -12
  1253. package/src/util/logger.ts +112 -51
  1254. package/src/util/network-info.ts +13 -5
  1255. package/src/util/object.ts +4 -2
  1256. package/src/util/phone.ts +4 -4
  1257. package/src/util/platform.ts +80 -58
  1258. package/src/util/pricing.ts +49 -31
  1259. package/src/util/retry.ts +18 -7
  1260. package/src/util/row-mapper.ts +7 -4
  1261. package/src/util/silently.ts +7 -4
  1262. package/src/util/spawn.ts +48 -0
  1263. package/src/util/spinner.ts +9 -7
  1264. package/src/util/time.ts +16 -3
  1265. package/src/util/truncate.ts +1 -1
  1266. package/src/util/voice-code.ts +6 -4
  1267. package/src/util/xml.ts +5 -1
  1268. package/src/version.ts +12 -8
  1269. package/src/watcher/engine.ts +71 -44
  1270. package/src/watcher/provider-registry.ts +1 -1
  1271. package/src/watcher/providers/github.ts +40 -23
  1272. package/src/watcher/providers/gmail.ts +59 -38
  1273. package/src/watcher/providers/google-calendar.ts +62 -48
  1274. package/src/watcher/providers/linear.ts +219 -150
  1275. package/src/watcher/providers/slack.ts +93 -27
  1276. package/src/watcher/watcher-store.ts +75 -55
  1277. package/src/work-items/work-item-runner.ts +62 -29
  1278. package/src/work-items/work-item-store.ts +137 -47
  1279. package/src/workspace/commit-message-enrichment-service.ts +65 -25
  1280. package/src/workspace/commit-message-provider.ts +14 -12
  1281. package/src/workspace/git-service.ts +355 -239
  1282. package/src/workspace/heartbeat-service.ts +74 -37
  1283. package/src/workspace/provider-commit-message-generator.ts +95 -70
  1284. package/src/workspace/top-level-renderer.ts +10 -8
  1285. package/src/workspace/top-level-scanner.ts +9 -3
  1286. package/src/workspace/turn-commit.ts +63 -36
  1287. package/src/__tests__/ingress-member-store.test.ts +0 -294
  1288. package/src/__tests__/script-proxy-router.test.ts +0 -215
  1289. package/src/config/bundled-skills/trusted-contacts/SKILL.md +0 -372
  1290. package/src/memory/guardian-bindings.ts +0 -158
  1291. package/src/memory/ingress-member-store.ts +0 -352
  1292. package/src/tools/network/script-proxy/__tests__/router.test.ts +0 -77
  1293. package/src/tools/network/script-proxy/certs.ts +0 -7
  1294. package/src/tools/network/script-proxy/connect-tunnel.ts +0 -1
  1295. package/src/tools/network/script-proxy/http-forwarder.ts +0 -2
  1296. package/src/tools/network/script-proxy/logging.ts +0 -12
  1297. package/src/tools/network/script-proxy/mitm-handler.ts +0 -2
  1298. package/src/tools/network/script-proxy/policy.ts +0 -4
  1299. package/src/tools/network/script-proxy/router.ts +0 -2
  1300. package/src/tools/network/script-proxy/server.ts +0 -5
  1301. package/src/tools/network/script-proxy/types.ts +0 -19
@@ -1,19 +1,36 @@
1
- import { createHash } from 'node:crypto';
2
- import { homedir } from 'node:os';
3
- import { dirname, resolve } from 'node:path';
4
-
5
- import { getConfig } from '../config/loader.js';
6
- import { resolveSkillSelector } from '../config/skills.js';
7
- import { isSkillSourcePath,normalizeFilePath } from '../skills/path-classifier.js';
8
- import { computeSkillVersionHash } from '../skills/version-hash.js';
9
- import type { ManifestOverride } from '../tools/execution-target.js';
10
- import { looksLikeHostPortShorthand, looksLikePathOnlyInput } from '../tools/network/url-safety.js';
11
- import { getTool } from '../tools/registry.js';
12
- import { getLogger } from '../util/logger.js';
13
- import { buildShellAllowlistOptions, buildShellCommandCandidates, cachedParse, type ParsedCommand } from './shell-identity.js';
14
- import { findHighestPriorityRule, onRulesChanged } from './trust-store.js';
15
- import { type AllowlistOption, type PermissionCheckResult, type PolicyContext,RiskLevel, type ScopeOption } from './types.js';
16
- import { isWorkspaceScopedInvocation } from './workspace-policy.js';
1
+ import { createHash } from "node:crypto";
2
+ import { homedir } from "node:os";
3
+ import { dirname, resolve } from "node:path";
4
+
5
+ import { getConfig } from "../config/loader.js";
6
+ import { resolveSkillSelector } from "../config/skills.js";
7
+ import {
8
+ isSkillSourcePath,
9
+ normalizeFilePath,
10
+ } from "../skills/path-classifier.js";
11
+ import { computeSkillVersionHash } from "../skills/version-hash.js";
12
+ import type { ManifestOverride } from "../tools/execution-target.js";
13
+ import {
14
+ looksLikeHostPortShorthand,
15
+ looksLikePathOnlyInput,
16
+ } from "../tools/network/url-safety.js";
17
+ import { getTool } from "../tools/registry.js";
18
+ import { getLogger } from "../util/logger.js";
19
+ import {
20
+ buildShellAllowlistOptions,
21
+ buildShellCommandCandidates,
22
+ cachedParse,
23
+ type ParsedCommand,
24
+ } from "./shell-identity.js";
25
+ import { findHighestPriorityRule, onRulesChanged } from "./trust-store.js";
26
+ import {
27
+ type AllowlistOption,
28
+ type PermissionCheckResult,
29
+ type PolicyContext,
30
+ RiskLevel,
31
+ type ScopeOption,
32
+ } from "./types.js";
33
+ import { isWorkspaceScopedInvocation } from "./workspace-policy.js";
17
34
 
18
35
  // ── Risk classification cache ────────────────────────────────────────────────
19
36
  // classifyRisk() is called on every permission check and can invoke WASM
@@ -25,15 +42,20 @@ import { isWorkspaceScopedInvocation } from './workspace-policy.js';
25
42
  const RISK_CACHE_MAX = 256;
26
43
  const riskCache = new Map<string, RiskLevel>();
27
44
 
28
- function riskCacheKey(toolName: string, input: Record<string, unknown>, workingDir?: string, manifestOverride?: ManifestOverride): string {
45
+ function riskCacheKey(
46
+ toolName: string,
47
+ input: Record<string, unknown>,
48
+ workingDir?: string,
49
+ manifestOverride?: ManifestOverride,
50
+ ): string {
29
51
  const inputJson = JSON.stringify(input);
30
- const hash = createHash('sha256')
52
+ const hash = createHash("sha256")
31
53
  .update(inputJson)
32
- .update('\0')
33
- .update(workingDir ?? '')
34
- .update('\0')
35
- .update(manifestOverride ? JSON.stringify(manifestOverride) : '')
36
- .digest('hex');
54
+ .update("\0")
55
+ .update(workingDir ?? "")
56
+ .update("\0")
57
+ .update(manifestOverride ? JSON.stringify(manifestOverride) : "")
58
+ .digest("hex");
37
59
  return `${toolName}\0${hash}`;
38
60
  }
39
61
 
@@ -56,61 +78,156 @@ export function _resetLegacyDeprecationWarning(): void {
56
78
 
57
79
  // Low-risk shell programs that are read-only / informational
58
80
  const LOW_RISK_PROGRAMS = new Set([
59
- 'ls', 'cat', 'head', 'tail', 'less', 'more', 'wc', 'file', 'stat',
60
- 'grep', 'rg', 'ag', 'ack', 'find', 'fd', 'which', 'where', 'whereis', 'type',
61
- 'echo', 'printf', 'date', 'cal', 'uptime', 'whoami', 'hostname', 'uname',
62
- 'pwd', 'realpath', 'dirname', 'basename',
63
- 'git', 'node', 'bun', 'deno', 'npm', 'npx', 'yarn', 'pnpm',
64
- 'python', 'python3', 'pip', 'pip3',
65
- 'man', 'help', 'info',
66
- 'env', 'printenv', 'set',
67
- 'diff', 'sort', 'uniq', 'cut', 'tr', 'tee', 'xargs',
68
- 'jq', 'yq',
69
- 'http', 'dig', 'nslookup', 'ping',
70
- 'tree', 'du', 'df',
81
+ "ls",
82
+ "cat",
83
+ "head",
84
+ "tail",
85
+ "less",
86
+ "more",
87
+ "wc",
88
+ "file",
89
+ "stat",
90
+ "grep",
91
+ "rg",
92
+ "ag",
93
+ "ack",
94
+ "find",
95
+ "fd",
96
+ "which",
97
+ "where",
98
+ "whereis",
99
+ "type",
100
+ "echo",
101
+ "printf",
102
+ "date",
103
+ "cal",
104
+ "uptime",
105
+ "whoami",
106
+ "hostname",
107
+ "uname",
108
+ "pwd",
109
+ "realpath",
110
+ "dirname",
111
+ "basename",
112
+ "git",
113
+ "node",
114
+ "bun",
115
+ "deno",
116
+ "npm",
117
+ "npx",
118
+ "yarn",
119
+ "pnpm",
120
+ "python",
121
+ "python3",
122
+ "pip",
123
+ "pip3",
124
+ "man",
125
+ "help",
126
+ "info",
127
+ "env",
128
+ "printenv",
129
+ "set",
130
+ "diff",
131
+ "sort",
132
+ "uniq",
133
+ "cut",
134
+ "tr",
135
+ "tee",
136
+ "xargs",
137
+ "jq",
138
+ "yq",
139
+ "http",
140
+ "dig",
141
+ "nslookup",
142
+ "ping",
143
+ "tree",
144
+ "du",
145
+ "df",
71
146
  ]);
72
147
 
73
148
  // High-risk shell programs / patterns
74
149
  const HIGH_RISK_PROGRAMS = new Set([
75
- 'sudo', 'su', 'doas',
76
- 'dd', 'mkfs', 'fdisk', 'parted', 'mount', 'umount',
77
- 'systemctl', 'service', 'launchctl',
78
- 'useradd', 'userdel', 'usermod', 'groupadd', 'groupdel',
79
- 'iptables', 'ufw', 'firewall-cmd',
80
- 'reboot', 'shutdown', 'halt', 'poweroff',
81
- 'kill', 'killall', 'pkill',
150
+ "sudo",
151
+ "su",
152
+ "doas",
153
+ "dd",
154
+ "mkfs",
155
+ "fdisk",
156
+ "parted",
157
+ "mount",
158
+ "umount",
159
+ "systemctl",
160
+ "service",
161
+ "launchctl",
162
+ "useradd",
163
+ "userdel",
164
+ "usermod",
165
+ "groupadd",
166
+ "groupdel",
167
+ "iptables",
168
+ "ufw",
169
+ "firewall-cmd",
170
+ "reboot",
171
+ "shutdown",
172
+ "halt",
173
+ "poweroff",
174
+ "kill",
175
+ "killall",
176
+ "pkill",
82
177
  ]);
83
178
 
84
179
  // Git subcommands that are low-risk (read-only)
85
180
  const LOW_RISK_GIT_SUBCOMMANDS = new Set([
86
- 'status', 'log', 'diff', 'show', 'branch', 'tag', 'remote', 'stash',
87
- 'blame', 'shortlog', 'describe', 'rev-parse', 'ls-files', 'ls-tree',
88
- 'cat-file', 'reflog',
181
+ "status",
182
+ "log",
183
+ "diff",
184
+ "show",
185
+ "branch",
186
+ "tag",
187
+ "remote",
188
+ "stash",
189
+ "blame",
190
+ "shortlog",
191
+ "describe",
192
+ "rev-parse",
193
+ "ls-files",
194
+ "ls-tree",
195
+ "cat-file",
196
+ "reflog",
89
197
  ]);
90
198
 
91
199
  // Commands that wrap another program — the real program appears as the first
92
200
  // non-flag argument. When one of these is the segment program we look through
93
201
  // its args to find the effective program (e.g. `env curl …` → curl).
94
202
  const WRAPPER_PROGRAMS = new Set([
95
- 'env', 'nice', 'nohup', 'time', 'command', 'exec',
96
- 'strace', 'ltrace', 'ionice', 'taskset', 'timeout',
203
+ "env",
204
+ "nice",
205
+ "nohup",
206
+ "time",
207
+ "command",
208
+ "exec",
209
+ "strace",
210
+ "ltrace",
211
+ "ionice",
212
+ "taskset",
213
+ "timeout",
97
214
  ]);
98
215
 
99
216
  // `env` flags that consume the next positional argument as their value.
100
217
  // Without this, `env -u curl echo` would incorrectly identify `curl` (the
101
218
  // value of -u) as the wrapped program instead of `echo`.
102
- const ENV_VALUE_FLAGS = new Set(['-u', '--unset', '-C', '--chdir']);
219
+ const ENV_VALUE_FLAGS = new Set(["-u", "--unset", "-C", "--chdir"]);
103
220
 
104
221
  // Bare filenames that `rm` is allowed to delete at Medium risk (instead of
105
222
  // High) so workspace-scoped allow rules can approve them without the
106
223
  // dangerous `allowHighRisk` flag. Only matches when the args contain no
107
224
  // flags and exactly one of these filenames.
108
- const RM_SAFE_BARE_FILES = new Set(['BOOTSTRAP.md', 'UPDATES.md']);
225
+ const RM_SAFE_BARE_FILES = new Set(["BOOTSTRAP.md", "UPDATES.md"]);
109
226
 
110
227
  function isRmOfKnownSafeFile(args: string[]): boolean {
111
228
  if (args.length !== 1) return false;
112
229
  const target = args[0];
113
- if (target.startsWith('-') || target.includes('/')) return false;
230
+ if (target.startsWith("-") || target.includes("/")) return false;
114
231
  return RM_SAFE_BARE_FILES.has(target);
115
232
  }
116
233
 
@@ -122,26 +239,32 @@ function isRmOfKnownSafeFile(args: string[]): boolean {
122
239
  * Handles `env` specially: skips `VAR=value` pairs and value-taking flags
123
240
  * like `-u NAME` and `-C DIR`.
124
241
  */
125
- function getWrappedProgram(seg: { program: string; args: string[] }): string | undefined {
126
- const isEnv = seg.program === 'env';
242
+ function getWrappedProgram(seg: {
243
+ program: string;
244
+ args: string[];
245
+ }): string | undefined {
246
+ const isEnv = seg.program === "env";
127
247
  for (let i = 0; i < seg.args.length; i++) {
128
248
  const arg = seg.args[i];
129
- if (arg.startsWith('-')) {
249
+ if (arg.startsWith("-")) {
130
250
  if (isEnv && ENV_VALUE_FLAGS.has(arg)) i++; // skip the value argument
131
251
  continue;
132
252
  }
133
- if (isEnv && arg.includes('=')) continue; // skip env VAR=value pairs
253
+ if (isEnv && arg.includes("=")) continue; // skip env VAR=value pairs
134
254
  return arg;
135
255
  }
136
256
  return undefined;
137
257
  }
138
258
 
139
- function getStringField(input: Record<string, unknown>, ...keys: string[]): string {
259
+ function getStringField(
260
+ input: Record<string, unknown>,
261
+ ...keys: string[]
262
+ ): string {
140
263
  for (const key of keys) {
141
264
  const value = input[key];
142
- if (typeof value === 'string') return value;
265
+ if (typeof value === "string") return value;
143
266
  }
144
- return '';
267
+ return "";
145
268
  }
146
269
 
147
270
  /**
@@ -149,7 +272,9 @@ function getStringField(input: Record<string, unknown>, ...keys: string[]): stri
149
272
  * is always computed from disk so that untrusted input cannot spoof a
150
273
  * pre-approved hash. If disk computation fails, only the bare id is returned.
151
274
  */
152
- function resolveSkillIdAndHash(selector: string): { id: string; versionHash?: string } | null {
275
+ function resolveSkillIdAndHash(
276
+ selector: string,
277
+ ): { id: string; versionHash?: string } | null {
153
278
  const resolved = resolveSkillSelector(selector);
154
279
  if (!resolved.skill) return null;
155
280
 
@@ -162,9 +287,9 @@ function resolveSkillIdAndHash(selector: string): { id: string; versionHash?: st
162
287
  }
163
288
 
164
289
  function canonicalizeWebFetchUrl(parsed: URL): URL {
165
- parsed.hash = '';
166
- parsed.username = '';
167
- parsed.password = '';
290
+ parsed.hash = "";
291
+ parsed.username = "";
292
+ parsed.password = "";
168
293
 
169
294
  try {
170
295
  // Normalize equivalent escaped paths (for example, "/%70rivate" -> "/private")
@@ -174,8 +299,8 @@ function canonicalizeWebFetchUrl(parsed: URL): URL {
174
299
  // Keep URL parser canonical form when decoding fails.
175
300
  }
176
301
 
177
- if (parsed.hostname.endsWith('.')) {
178
- parsed.hostname = parsed.hostname.replace(/\.+$/, '');
302
+ if (parsed.hostname.endsWith(".")) {
303
+ parsed.hostname = parsed.hostname.replace(/\.+$/, "");
179
304
  }
180
305
 
181
306
  return parsed;
@@ -195,7 +320,7 @@ export function normalizeWebFetchUrl(rawUrl: string): URL | null {
195
320
 
196
321
  try {
197
322
  const parsed = new URL(trimmed);
198
- if (parsed.protocol === 'http:' || parsed.protocol === 'https:') {
323
+ if (parsed.protocol === "http:" || parsed.protocol === "https:") {
199
324
  return canonicalizeWebFetchUrl(parsed);
200
325
  }
201
326
  return null;
@@ -219,19 +344,27 @@ export function normalizeWebFetchUrl(rawUrl: string): URL | null {
219
344
  }
220
345
 
221
346
  function escapeMinimatchLiteral(value: string): string {
222
- return value.replace(/([\\*?[\]{}()!+@|])/g, '\\$1');
347
+ return value.replace(/([\\*?[\]{}()!+@|])/g, "\\$1");
223
348
  }
224
349
 
225
- async function buildCommandCandidates(toolName: string, input: Record<string, unknown>, workingDir: string, preParsed?: ParsedCommand): Promise<string[]> {
226
- if (toolName === 'bash' || toolName === 'host_bash') {
227
- return buildShellCommandCandidates(getStringField(input, 'command'), preParsed);
350
+ async function buildCommandCandidates(
351
+ toolName: string,
352
+ input: Record<string, unknown>,
353
+ workingDir: string,
354
+ preParsed?: ParsedCommand,
355
+ ): Promise<string[]> {
356
+ if (toolName === "bash" || toolName === "host_bash") {
357
+ return buildShellCommandCandidates(
358
+ getStringField(input, "command"),
359
+ preParsed,
360
+ );
228
361
  }
229
362
 
230
- if (toolName === 'skill_load') {
231
- const rawSelector = getStringField(input, 'skill').trim();
363
+ if (toolName === "skill_load") {
364
+ const rawSelector = getStringField(input, "skill").trim();
232
365
  const targets: string[] = [];
233
366
  if (!rawSelector) {
234
- targets.push('');
367
+ targets.push("");
235
368
  } else {
236
369
  const resolved = resolveSkillIdAndHash(rawSelector);
237
370
  if (resolved) {
@@ -247,13 +380,20 @@ async function buildCommandCandidates(toolName: string, input: Record<string, un
247
380
  return [...new Set(targets)].map((target) => `${toolName}:${target}`);
248
381
  }
249
382
 
250
- if (toolName === 'scaffold_managed_skill' || toolName === 'delete_managed_skill') {
251
- const skillId = getStringField(input, 'skill_id').trim();
383
+ if (
384
+ toolName === "scaffold_managed_skill" ||
385
+ toolName === "delete_managed_skill"
386
+ ) {
387
+ const skillId = getStringField(input, "skill_id").trim();
252
388
  return [`${toolName}:${skillId}`];
253
389
  }
254
390
 
255
- if (toolName === 'web_fetch' || toolName === 'browser_navigate' || toolName === 'network_request') {
256
- const rawUrl = getStringField(input, 'url').trim();
391
+ if (
392
+ toolName === "web_fetch" ||
393
+ toolName === "browser_navigate" ||
394
+ toolName === "network_request"
395
+ ) {
396
+ const rawUrl = getStringField(input, "url").trim();
257
397
  const candidates: string[] = [];
258
398
 
259
399
  if (rawUrl) {
@@ -273,10 +413,17 @@ async function buildCommandCandidates(toolName: string, input: Record<string, un
273
413
  return [...new Set(candidates)];
274
414
  }
275
415
 
276
- const fileTarget = getStringField(input, 'path', 'file_path');
277
- if (toolName === 'host_file_read' || toolName === 'host_file_write' || toolName === 'host_file_edit') {
416
+ const fileTarget = getStringField(input, "path", "file_path");
417
+ if (
418
+ toolName === "host_file_read" ||
419
+ toolName === "host_file_write" ||
420
+ toolName === "host_file_edit"
421
+ ) {
278
422
  const resolved = fileTarget ? resolve(fileTarget) : fileTarget;
279
- const normalized = resolved && process.platform === 'win32' ? resolved.replaceAll('\\', '/') : resolved;
423
+ const normalized =
424
+ resolved && process.platform === "win32"
425
+ ? resolved.replaceAll("\\", "/")
426
+ : resolved;
280
427
  const candidates = [`${toolName}:${normalized}`];
281
428
  if (normalized !== fileTarget) {
282
429
  candidates.push(`${toolName}:${fileTarget}`);
@@ -293,7 +440,10 @@ async function buildCommandCandidates(toolName: string, input: Record<string, un
293
440
  }
294
441
 
295
442
  const rawResolved = fileTarget ? resolve(workingDir, fileTarget) : fileTarget;
296
- const resolved = rawResolved && process.platform === 'win32' ? rawResolved.replaceAll('\\', '/') : rawResolved;
443
+ const resolved =
444
+ rawResolved && process.platform === "win32"
445
+ ? rawResolved.replaceAll("\\", "/")
446
+ : rawResolved;
297
447
  const candidates = [`${toolName}:${resolved}`];
298
448
  // Also include the raw path if it differs, so user-created rules with
299
449
  // raw paths still match.
@@ -312,12 +462,21 @@ async function buildCommandCandidates(toolName: string, input: Record<string, un
312
462
  return [...new Set(candidates)];
313
463
  }
314
464
 
315
- export async function classifyRisk(toolName: string, input: Record<string, unknown>, workingDir?: string, preParsed?: ParsedCommand, manifestOverride?: ManifestOverride, signal?: AbortSignal): Promise<RiskLevel> {
465
+ export async function classifyRisk(
466
+ toolName: string,
467
+ input: Record<string, unknown>,
468
+ workingDir?: string,
469
+ preParsed?: ParsedCommand,
470
+ manifestOverride?: ManifestOverride,
471
+ signal?: AbortSignal,
472
+ ): Promise<RiskLevel> {
316
473
  signal?.throwIfAborted();
317
474
 
318
475
  // Check cache first (skip when preParsed is provided since caller already
319
476
  // parsed and we'd just be duplicating the key computation cost).
320
- const cacheKey = preParsed ? null : riskCacheKey(toolName, input, workingDir, manifestOverride);
477
+ const cacheKey = preParsed
478
+ ? null
479
+ : riskCacheKey(toolName, input, workingDir, manifestOverride);
321
480
  if (cacheKey) {
322
481
  const cached = riskCache.get(cacheKey);
323
482
  if (cached !== undefined) {
@@ -328,7 +487,13 @@ export async function classifyRisk(toolName: string, input: Record<string, unkno
328
487
  }
329
488
  }
330
489
 
331
- const result = await classifyRiskUncached(toolName, input, workingDir, preParsed, manifestOverride);
490
+ const result = await classifyRiskUncached(
491
+ toolName,
492
+ input,
493
+ workingDir,
494
+ preParsed,
495
+ manifestOverride,
496
+ );
332
497
 
333
498
  if (cacheKey) {
334
499
  if (riskCache.size >= RISK_CACHE_MAX) {
@@ -341,47 +506,66 @@ export async function classifyRisk(toolName: string, input: Record<string, unkno
341
506
  return result;
342
507
  }
343
508
 
344
- async function classifyRiskUncached(toolName: string, input: Record<string, unknown>, workingDir?: string, preParsed?: ParsedCommand, manifestOverride?: ManifestOverride): Promise<RiskLevel> {
345
- if (toolName === 'file_read') return RiskLevel.Low;
346
- if (toolName === 'file_write' || toolName === 'file_edit') {
347
- const filePath = getStringField(input, 'path', 'file_path');
348
- if (filePath && isSkillSourcePath(resolve(workingDir ?? process.cwd(), filePath), getConfig().skills.load.extraDirs)) {
509
+ async function classifyRiskUncached(
510
+ toolName: string,
511
+ input: Record<string, unknown>,
512
+ workingDir?: string,
513
+ preParsed?: ParsedCommand,
514
+ manifestOverride?: ManifestOverride,
515
+ ): Promise<RiskLevel> {
516
+ if (toolName === "file_read") return RiskLevel.Low;
517
+ if (toolName === "file_write" || toolName === "file_edit") {
518
+ const filePath = getStringField(input, "path", "file_path");
519
+ if (
520
+ filePath &&
521
+ isSkillSourcePath(
522
+ resolve(workingDir ?? process.cwd(), filePath),
523
+ getConfig().skills.load.extraDirs,
524
+ )
525
+ ) {
349
526
  return RiskLevel.High;
350
527
  }
351
528
  return RiskLevel.Medium;
352
529
  }
353
- if (toolName === 'web_search') return RiskLevel.Low;
354
- if (toolName === 'web_fetch') {
530
+ if (toolName === "web_search") return RiskLevel.Low;
531
+ if (toolName === "web_fetch") {
355
532
  // Private-network fetches are High risk so that blanket allow rules
356
533
  // (including the starter bundle) cannot silently bypass the prompt.
357
- return input.allow_private_network === true ? RiskLevel.High : RiskLevel.Low;
534
+ return input.allow_private_network === true
535
+ ? RiskLevel.High
536
+ : RiskLevel.Low;
358
537
  }
359
- if (toolName === 'browser_navigate') {
360
- return input.allow_private_network === true ? RiskLevel.High : RiskLevel.Low;
538
+ if (toolName === "browser_navigate") {
539
+ return input.allow_private_network === true
540
+ ? RiskLevel.High
541
+ : RiskLevel.Low;
361
542
  }
362
543
  // All other browser tools are low risk — the browser is sandboxed and user-visible.
363
- if (toolName.startsWith('browser_')) return RiskLevel.Low;
544
+ if (toolName.startsWith("browser_")) return RiskLevel.Low;
364
545
  // Proxy-authenticated network requests are Medium risk — they carry injected
365
546
  // credentials and the user should approve the target host/origin.
366
- if (toolName === 'network_request') return RiskLevel.Medium;
367
- if (toolName === 'skill_load') return RiskLevel.Low;
547
+ if (toolName === "network_request") return RiskLevel.Medium;
548
+ if (toolName === "skill_load") return RiskLevel.Low;
368
549
 
369
550
  // Escalate host file mutations targeting skill source paths to High risk.
370
551
  // The host variants fall through to the tool registry (Medium) by default,
371
552
  // but writing to skill source code is a privilege-escalation vector.
372
- if (toolName === 'host_file_write' || toolName === 'host_file_edit') {
373
- const filePath = getStringField(input, 'path', 'file_path');
374
- if (filePath && isSkillSourcePath(resolve(filePath), getConfig().skills.load.extraDirs)) {
553
+ if (toolName === "host_file_write" || toolName === "host_file_edit") {
554
+ const filePath = getStringField(input, "path", "file_path");
555
+ if (
556
+ filePath &&
557
+ isSkillSourcePath(resolve(filePath), getConfig().skills.load.extraDirs)
558
+ ) {
375
559
  return RiskLevel.High;
376
560
  }
377
561
  // Fall through to the tool registry default (Medium) below.
378
562
  }
379
563
 
380
- if (toolName === 'bash' || toolName === 'host_bash') {
381
- const command = (input.command as string) ?? '';
564
+ if (toolName === "bash" || toolName === "host_bash") {
565
+ const command = (input.command as string) ?? "";
382
566
  if (!command.trim()) return RiskLevel.Low;
383
567
 
384
- const parsed = preParsed ?? await cachedParse(command);
568
+ const parsed = preParsed ?? (await cachedParse(command));
385
569
 
386
570
  // Dangerous patterns → High
387
571
  if (parsed.dangerousPatterns.length > 0) return RiskLevel.High;
@@ -397,26 +581,31 @@ async function classifyRiskUncached(toolName: string, input: Record<string, unkn
397
581
 
398
582
  if (HIGH_RISK_PROGRAMS.has(prog)) return RiskLevel.High;
399
583
 
400
- if (prog === 'rm') {
584
+ if (prog === "rm") {
401
585
  // Only downgrade rm of known safe workspace files for sandboxed bash.
402
586
  // host_bash has a global allow rule that would auto-approve Medium-risk
403
587
  // commands, so rm on the host must always require explicit approval.
404
- if (toolName === 'bash' && isRmOfKnownSafeFile(seg.args)) {
588
+ if (toolName === "bash" && isRmOfKnownSafeFile(seg.args)) {
405
589
  maxRisk = RiskLevel.Medium;
406
590
  continue;
407
591
  }
408
592
  return RiskLevel.High;
409
593
  }
410
594
 
411
- if (prog === 'chmod' || prog === 'chown' || prog === 'chgrp'
412
- || prog === 'sed' || prog === 'awk') {
595
+ if (
596
+ prog === "chmod" ||
597
+ prog === "chown" ||
598
+ prog === "chgrp" ||
599
+ prog === "sed" ||
600
+ prog === "awk"
601
+ ) {
413
602
  maxRisk = RiskLevel.Medium;
414
603
  continue;
415
604
  }
416
605
 
417
606
  // curl/wget can download and execute arbitrary code from the internet.
418
607
  // Also catch wrapped invocations like `env curl …` or `nice wget …`.
419
- if (prog === 'curl' || prog === 'wget') {
608
+ if (prog === "curl" || prog === "wget") {
420
609
  maxRisk = RiskLevel.Medium;
421
610
  continue;
422
611
  }
@@ -424,19 +613,23 @@ async function classifyRiskUncached(toolName: string, input: Record<string, unkn
424
613
  if (WRAPPER_PROGRAMS.has(prog)) {
425
614
  // `command -v` and `command -V` are read-only lookups (print where
426
615
  // a command lives) — don't escalate to high risk for those.
427
- if (prog === 'command' && seg.args.length > 0 && (seg.args[0] === '-v' || seg.args[0] === '-V')) {
616
+ if (
617
+ prog === "command" &&
618
+ seg.args.length > 0 &&
619
+ (seg.args[0] === "-v" || seg.args[0] === "-V")
620
+ ) {
428
621
  continue;
429
622
  }
430
623
  const wrapped = getWrappedProgram(seg);
431
- if (wrapped === 'rm') return RiskLevel.High;
624
+ if (wrapped === "rm") return RiskLevel.High;
432
625
  if (wrapped && HIGH_RISK_PROGRAMS.has(wrapped)) return RiskLevel.High;
433
- if (wrapped === 'curl' || wrapped === 'wget') {
626
+ if (wrapped === "curl" || wrapped === "wget") {
434
627
  maxRisk = RiskLevel.Medium;
435
628
  continue;
436
629
  }
437
630
  }
438
631
 
439
- if (prog === 'git') {
632
+ if (prog === "git") {
440
633
  const subcommand = seg.args[0];
441
634
  if (subcommand && LOW_RISK_GIT_SUBCOMMANDS.has(subcommand)) {
442
635
  // Stay at current risk
@@ -470,7 +663,11 @@ async function classifyRiskUncached(toolName: string, input: Record<string, unkn
470
663
  // Use manifest metadata for unregistered skill tools so the Permission
471
664
  // Simulator shows accurate risk levels instead of defaulting to Medium.
472
665
  if (manifestOverride) {
473
- const riskMap: Record<string, RiskLevel> = { low: RiskLevel.Low, medium: RiskLevel.Medium, high: RiskLevel.High };
666
+ const riskMap: Record<string, RiskLevel> = {
667
+ low: RiskLevel.Low,
668
+ medium: RiskLevel.Medium,
669
+ high: RiskLevel.High,
670
+ };
474
671
  return riskMap[manifestOverride.risk] ?? RiskLevel.Medium;
475
672
  }
476
673
 
@@ -490,49 +687,73 @@ export async function check(
490
687
 
491
688
  // For shell tools, parse once and share the result to avoid duplicate tree-sitter work.
492
689
  let shellParsed: ParsedCommand | undefined;
493
- if (toolName === 'bash' || toolName === 'host_bash') {
494
- const command = ((input.command as string) ?? '').trim();
690
+ if (toolName === "bash" || toolName === "host_bash") {
691
+ const command = ((input.command as string) ?? "").trim();
495
692
  if (command) {
496
693
  shellParsed = await cachedParse(command);
497
694
  }
498
695
  }
499
696
 
500
- const risk = await classifyRisk(toolName, input, workingDir, shellParsed, manifestOverride, signal);
697
+ const risk = await classifyRisk(
698
+ toolName,
699
+ input,
700
+ workingDir,
701
+ shellParsed,
702
+ manifestOverride,
703
+ signal,
704
+ );
501
705
 
502
706
  // Build command string candidates for rule matching
503
- const commandCandidates = await buildCommandCandidates(toolName, input, workingDir, shellParsed);
707
+ const commandCandidates = await buildCommandCandidates(
708
+ toolName,
709
+ input,
710
+ workingDir,
711
+ shellParsed,
712
+ );
504
713
 
505
714
  // Find the highest-priority matching rule across all candidates
506
- const matchedRule = findHighestPriorityRule(toolName, commandCandidates, workingDir, policyContext);
715
+ const matchedRule = findHighestPriorityRule(
716
+ toolName,
717
+ commandCandidates,
718
+ workingDir,
719
+ policyContext,
720
+ );
507
721
 
508
722
  // Deny rules apply at ALL risk levels — including proxied network mode.
509
723
  // Evaluate them first so hard blocks are never downgraded to a prompt.
510
- if (matchedRule && matchedRule.decision === 'deny') {
511
- return { decision: 'deny', reason: `Blocked by deny rule: ${matchedRule.pattern}`, matchedRule };
512
- }
513
-
514
- // Proxied network mode requires explicit user approval for every
515
- // invocation because the command routes through an authenticated
516
- // proxy with injected credentials. This runs after deny rules but
517
- // before allow/ask rules so that trust rules cannot auto-approve
518
- // proxied commands.
519
- if (toolName === 'bash' && input.network_mode === 'proxied') {
520
- return { decision: 'prompt', reason: 'Proxied network mode requires explicit approval for each invocation.' };
724
+ if (matchedRule && matchedRule.decision === "deny") {
725
+ return {
726
+ decision: "deny",
727
+ reason: `Blocked by deny rule: ${matchedRule.pattern}`,
728
+ matchedRule,
729
+ };
521
730
  }
522
731
 
523
732
  if (matchedRule) {
524
- if (matchedRule.decision === 'ask') {
733
+ if (matchedRule.decision === "ask") {
525
734
  // Ask rules always prompt — never auto-allow or auto-deny
526
- return { decision: 'prompt', reason: `Matched ask rule: ${matchedRule.pattern}`, matchedRule };
735
+ return {
736
+ decision: "prompt",
737
+ reason: `Matched ask rule: ${matchedRule.pattern}`,
738
+ matchedRule,
739
+ };
527
740
  }
528
741
 
529
742
  // Allow rule: auto-allow for non-High risk
530
743
  if (risk !== RiskLevel.High) {
531
- return { decision: 'allow', reason: `Matched trust rule: ${matchedRule.pattern}`, matchedRule };
744
+ return {
745
+ decision: "allow",
746
+ reason: `Matched trust rule: ${matchedRule.pattern}`,
747
+ matchedRule,
748
+ };
532
749
  }
533
750
  // High risk with allow rule that explicitly permits high-risk → auto-allow
534
751
  if (matchedRule.allowHighRisk === true) {
535
- return { decision: 'allow', reason: `Matched high-risk trust rule: ${matchedRule.pattern}`, matchedRule };
752
+ return {
753
+ decision: "allow",
754
+ reason: `Matched high-risk trust rule: ${matchedRule.pattern}`,
755
+ matchedRule,
756
+ };
536
757
  }
537
758
  // High risk with allow rule (without allowHighRisk) → fall through to prompt
538
759
  }
@@ -546,11 +767,17 @@ export async function check(
546
767
  // but isn't registered — treat it as a third-party skill tool.
547
768
  if (!matchedRule) {
548
769
  const tool = getTool(toolName);
549
- if (tool?.origin === 'skill' && !tool.ownerSkillBundled) {
550
- return { decision: 'prompt', reason: 'Skill tool: requires approval by default' };
770
+ if (tool?.origin === "skill" && !tool.ownerSkillBundled) {
771
+ return {
772
+ decision: "prompt",
773
+ reason: "Skill tool: requires approval by default",
774
+ };
551
775
  }
552
776
  if (!tool && manifestOverride) {
553
- return { decision: 'prompt', reason: 'Skill tool: requires approval by default' };
777
+ return {
778
+ decision: "prompt",
779
+ reason: "Skill tool: requires approval by default",
780
+ };
554
781
  }
555
782
  }
556
783
 
@@ -561,24 +788,32 @@ export async function check(
561
788
  // skill load via an exact-version or wildcard trust rule.
562
789
  const permissionsMode = getConfig().permissions.mode;
563
790
 
564
- if (permissionsMode === 'legacy' && !_legacyDeprecationWarned) {
791
+ if (permissionsMode === "legacy" && !_legacyDeprecationWarned) {
565
792
  _legacyDeprecationWarned = true;
566
- getLogger('checker').warn('Permissions mode "legacy" is deprecated and will be removed in a future release. Switch to "workspace" (default) or "strict".');
793
+ getLogger("checker").warn(
794
+ 'Permissions mode "legacy" is deprecated and will be removed in a future release. Switch to "workspace" (default) or "strict".',
795
+ );
567
796
  }
568
797
 
569
- if (permissionsMode === 'strict' && !matchedRule) {
570
- return { decision: 'prompt', reason: `Strict mode: no matching rule, requires approval` };
798
+ if (permissionsMode === "strict" && !matchedRule) {
799
+ return {
800
+ decision: "prompt",
801
+ reason: `Strict mode: no matching rule, requires approval`,
802
+ };
571
803
  }
572
804
 
573
805
  // Workspace mode: auto-allow workspace-scoped operations that don't have
574
806
  // an explicit rule. Non-workspace operations fall through to risk-based policy.
575
- if (permissionsMode === 'workspace' && !matchedRule) {
807
+ if (permissionsMode === "workspace" && !matchedRule) {
576
808
  // When sandbox is disabled, bash runs on the host — don't auto-allow
577
809
  const sandboxEnabled = getConfig().sandbox.enabled;
578
- if (toolName === 'bash' && !sandboxEnabled) {
810
+ if (toolName === "bash" && !sandboxEnabled) {
579
811
  // Fall through to risk-based policy below
580
812
  } else if (isWorkspaceScopedInvocation(toolName, input, workingDir)) {
581
- return { decision: 'allow', reason: 'Workspace mode: workspace-scoped operation auto-allowed' };
813
+ return {
814
+ decision: "allow",
815
+ reason: "Workspace mode: workspace-scoped operation auto-allowed",
816
+ };
582
817
  }
583
818
  }
584
819
 
@@ -590,41 +825,47 @@ export async function check(
590
825
  // still prompts for bundled skill tools without explicit rules.
591
826
  if (!matchedRule && risk === RiskLevel.Low) {
592
827
  const tool = getTool(toolName);
593
- if (tool?.origin === 'skill' && tool.ownerSkillBundled) {
594
- return { decision: 'allow', reason: 'Bundled skill tool: low risk, auto-allowed' };
828
+ if (tool?.origin === "skill" && tool.ownerSkillBundled) {
829
+ return {
830
+ decision: "allow",
831
+ reason: "Bundled skill tool: low risk, auto-allowed",
832
+ };
595
833
  }
596
834
  }
597
835
 
598
836
  if (risk === RiskLevel.High) {
599
- return { decision: 'prompt', reason: `High risk: always requires approval` };
837
+ return {
838
+ decision: "prompt",
839
+ reason: `High risk: always requires approval`,
840
+ };
600
841
  }
601
842
 
602
843
  if (risk === RiskLevel.Low) {
603
- return { decision: 'allow', reason: 'Low risk: auto-allowed' };
844
+ return { decision: "allow", reason: "Low risk: auto-allowed" };
604
845
  }
605
846
 
606
- return { decision: 'prompt', reason: `${risk} risk: requires approval` };
847
+ return { decision: "prompt", reason: `${risk} risk: requires approval` };
607
848
  }
608
849
 
609
850
  const TOOL_DISPLAY_NAMES: Record<string, string> = {
610
- file_read: 'file reads',
611
- file_write: 'file writes',
612
- file_edit: 'file edits',
613
- host_file_read: 'host file reads',
614
- host_file_write: 'host file writes',
615
- host_file_edit: 'host file edits',
616
- web_fetch: 'URL fetches',
617
- browser_navigate: 'browser navigations',
618
- network_request: 'network requests',
851
+ file_read: "file reads",
852
+ file_write: "file writes",
853
+ file_edit: "file edits",
854
+ host_file_read: "host file reads",
855
+ host_file_write: "host file writes",
856
+ host_file_edit: "host file edits",
857
+ web_fetch: "URL fetches",
858
+ browser_navigate: "browser navigations",
859
+ network_request: "network requests",
619
860
  };
620
861
 
621
862
  function friendlyBasename(filePath: string): string {
622
- const parts = filePath.split('/');
863
+ const parts = filePath.split("/");
623
864
  return parts[parts.length - 1] || filePath;
624
865
  }
625
866
 
626
867
  function friendlyHostname(url: URL): string {
627
- return url.hostname.replace(/^www\./, '');
868
+ return url.hostname.replace(/^www\./, "");
628
869
  }
629
870
 
630
871
  // ── Per-tool allowlist option strategies ─────────────────────────────────────
@@ -632,29 +873,46 @@ function friendlyHostname(url: URL): string {
632
873
  // options. Adding support for a new tool type means adding a function here
633
874
  // and registering it in ALLOWLIST_STRATEGIES below.
634
875
 
635
- type AllowlistStrategy = (toolName: string, input: Record<string, unknown>) => Promise<AllowlistOption[]> | AllowlistOption[];
876
+ type AllowlistStrategy = (
877
+ toolName: string,
878
+ input: Record<string, unknown>,
879
+ ) => Promise<AllowlistOption[]> | AllowlistOption[];
636
880
 
637
- function shellAllowlistStrategy(_toolName: string, input: Record<string, unknown>): Promise<AllowlistOption[]> {
638
- const command = ((input.command as string) ?? '').trim();
881
+ function shellAllowlistStrategy(
882
+ _toolName: string,
883
+ input: Record<string, unknown>,
884
+ ): Promise<AllowlistOption[]> {
885
+ const command = ((input.command as string) ?? "").trim();
639
886
  return buildShellAllowlistOptions(command);
640
887
  }
641
888
 
642
- function fileAllowlistStrategy(toolName: string, input: Record<string, unknown>): AllowlistOption[] {
643
- const filePath = (input.path as string) ?? (input.file_path as string) ?? '';
889
+ function fileAllowlistStrategy(
890
+ toolName: string,
891
+ input: Record<string, unknown>,
892
+ ): AllowlistOption[] {
893
+ const filePath = (input.path as string) ?? (input.file_path as string) ?? "";
644
894
  const toolLabel = TOOL_DISPLAY_NAMES[toolName] ?? toolName;
645
895
  const options: AllowlistOption[] = [];
646
896
 
647
897
  // Patterns must match the "tool:path" format used by check()
648
- options.push({ label: filePath, description: `This file only`, pattern: `${toolName}:${filePath}` });
898
+ options.push({
899
+ label: filePath,
900
+ description: `This file only`,
901
+ pattern: `${toolName}:${filePath}`,
902
+ });
649
903
 
650
904
  // Ancestor directory wildcards — walk up from immediate parent, stop at home dir or /
651
905
  const home = homedir();
652
906
  let dir = dirname(filePath);
653
907
  const maxLevels = 3;
654
908
  let levels = 0;
655
- while (dir && dir !== '/' && dir !== '.' && levels < maxLevels) {
909
+ while (dir && dir !== "/" && dir !== "." && levels < maxLevels) {
656
910
  const dirName = friendlyBasename(dir);
657
- options.push({ label: `${dir}/**`, description: `Anything in ${dirName}/`, pattern: `${toolName}:${dir}/**` });
911
+ options.push({
912
+ label: `${dir}/**`,
913
+ description: `Anything in ${dirName}/`,
914
+ pattern: `${toolName}:${dir}/**`,
915
+ });
658
916
  if (dir === home) break;
659
917
  const parent = dirname(dir);
660
918
  if (parent === dir) break;
@@ -662,18 +920,29 @@ function fileAllowlistStrategy(toolName: string, input: Record<string, unknown>)
662
920
  levels++;
663
921
  }
664
922
 
665
- options.push({ label: `${toolName}:*`, description: `All ${toolLabel}`, pattern: `${toolName}:*` });
923
+ options.push({
924
+ label: `${toolName}:*`,
925
+ description: `All ${toolLabel}`,
926
+ pattern: `${toolName}:*`,
927
+ });
666
928
  return options;
667
929
  }
668
930
 
669
- function urlAllowlistStrategy(toolName: string, input: Record<string, unknown>): AllowlistOption[] {
670
- const rawUrl = getStringField(input, 'url').trim();
931
+ function urlAllowlistStrategy(
932
+ toolName: string,
933
+ input: Record<string, unknown>,
934
+ ): AllowlistOption[] {
935
+ const rawUrl = getStringField(input, "url").trim();
671
936
  const normalized = normalizeWebFetchUrl(rawUrl);
672
937
  const exact = normalized?.href ?? rawUrl;
673
938
 
674
939
  const options: AllowlistOption[] = [];
675
940
  if (exact) {
676
- options.push({ label: exact, description: 'This exact URL', pattern: `${toolName}:${escapeMinimatchLiteral(exact)}` });
941
+ options.push({
942
+ label: exact,
943
+ description: "This exact URL",
944
+ pattern: `${toolName}:${escapeMinimatchLiteral(exact)}`,
945
+ });
677
946
  }
678
947
  if (normalized) {
679
948
  const host = friendlyHostname(normalized);
@@ -687,7 +956,11 @@ function urlAllowlistStrategy(toolName: string, input: Record<string, unknown>):
687
956
  // Use standalone "**" globstar — minimatch only treats ** as globstar when
688
957
  // it is its own path segment, so "${toolName}:*" would fail to match URL
689
958
  // candidates containing "/". The tool field is already filtered separately.
690
- options.push({ label: `${toolName}:*`, description: `All ${toolLabel}`, pattern: `**` });
959
+ options.push({
960
+ label: `${toolName}:*`,
961
+ description: `All ${toolLabel}`,
962
+ pattern: `**`,
963
+ });
691
964
 
692
965
  const seen = new Set<string>();
693
966
  return options.filter((o) => {
@@ -697,9 +970,13 @@ function urlAllowlistStrategy(toolName: string, input: Record<string, unknown>):
697
970
  });
698
971
  }
699
972
 
700
- function managedSkillAllowlistStrategy(toolName: string, input: Record<string, unknown>): AllowlistOption[] {
701
- const skillId = getStringField(input, 'skill_id').trim();
702
- const toolLabel = toolName === 'scaffold_managed_skill' ? 'scaffold' : 'delete';
973
+ function managedSkillAllowlistStrategy(
974
+ toolName: string,
975
+ input: Record<string, unknown>,
976
+ ): AllowlistOption[] {
977
+ const skillId = getStringField(input, "skill_id").trim();
978
+ const toolLabel =
979
+ toolName === "scaffold_managed_skill" ? "scaffold" : "delete";
703
980
  const options: AllowlistOption[] = [];
704
981
  if (skillId) {
705
982
  options.push({
@@ -716,8 +993,11 @@ function managedSkillAllowlistStrategy(toolName: string, input: Record<string, u
716
993
  return options;
717
994
  }
718
995
 
719
- function skillLoadAllowlistStrategy(_toolName: string, input: Record<string, unknown>): AllowlistOption[] {
720
- const rawSelector = getStringField(input, 'skill').trim();
996
+ function skillLoadAllowlistStrategy(
997
+ _toolName: string,
998
+ input: Record<string, unknown>,
999
+ ): AllowlistOption[] {
1000
+ const rawSelector = getStringField(input, "skill").trim();
721
1001
 
722
1002
  if (rawSelector) {
723
1003
  const resolved = resolveSkillIdAndHash(rawSelector);
@@ -725,7 +1005,7 @@ function skillLoadAllowlistStrategy(_toolName: string, input: Record<string, unk
725
1005
  return [
726
1006
  {
727
1007
  label: `${resolved.id}@${resolved.versionHash}`,
728
- description: 'This exact version',
1008
+ description: "This exact version",
729
1009
  pattern: `skill_load:${resolved.id}@${resolved.versionHash}`,
730
1010
  },
731
1011
  ];
@@ -734,7 +1014,7 @@ function skillLoadAllowlistStrategy(_toolName: string, input: Record<string, unk
734
1014
  return [
735
1015
  {
736
1016
  label: id,
737
- description: 'This skill',
1017
+ description: "This skill",
738
1018
  pattern: `skill_load:${id}`,
739
1019
  },
740
1020
  ];
@@ -742,9 +1022,9 @@ function skillLoadAllowlistStrategy(_toolName: string, input: Record<string, unk
742
1022
 
743
1023
  return [
744
1024
  {
745
- label: 'skill_load:*',
746
- description: 'All skill loads',
747
- pattern: 'skill_load:*',
1025
+ label: "skill_load:*",
1026
+ description: "All skill loads",
1027
+ pattern: "skill_load:*",
748
1028
  },
749
1029
  ];
750
1030
  }
@@ -766,25 +1046,37 @@ const ALLOWLIST_STRATEGIES: Record<string, AllowlistStrategy> = {
766
1046
  skill_load: skillLoadAllowlistStrategy,
767
1047
  };
768
1048
 
769
- export async function generateAllowlistOptions(toolName: string, input: Record<string, unknown>, signal?: AbortSignal): Promise<AllowlistOption[]> {
1049
+ export async function generateAllowlistOptions(
1050
+ toolName: string,
1051
+ input: Record<string, unknown>,
1052
+ signal?: AbortSignal,
1053
+ ): Promise<AllowlistOption[]> {
770
1054
  signal?.throwIfAborted();
771
1055
 
772
1056
  if (Object.hasOwn(ALLOWLIST_STRATEGIES, toolName)) {
773
1057
  return ALLOWLIST_STRATEGIES[toolName](toolName, input);
774
1058
  }
775
1059
 
776
- return [{ label: '*', description: 'Everything', pattern: '*' }];
1060
+ return [{ label: "*", description: "Everything", pattern: "*" }];
777
1061
  }
778
1062
 
779
1063
  // Directory-based scope only applies to filesystem and shell tools.
780
1064
  // All other tools auto-use "everywhere" (the client handles this).
781
1065
  export const SCOPE_AWARE_TOOLS = new Set([
782
- 'bash', 'host_bash',
783
- 'file_read', 'file_write', 'file_edit',
784
- 'host_file_read', 'host_file_write', 'host_file_edit',
1066
+ "bash",
1067
+ "host_bash",
1068
+ "file_read",
1069
+ "file_write",
1070
+ "file_edit",
1071
+ "host_file_read",
1072
+ "host_file_write",
1073
+ "host_file_edit",
785
1074
  ]);
786
1075
 
787
- export function generateScopeOptions(workingDir: string, toolName?: string): ScopeOption[] {
1076
+ export function generateScopeOptions(
1077
+ workingDir: string,
1078
+ toolName?: string,
1079
+ ): ScopeOption[] {
788
1080
  if (toolName && !SCOPE_AWARE_TOOLS.has(toolName)) {
789
1081
  return [];
790
1082
  }
@@ -794,7 +1086,7 @@ export function generateScopeOptions(workingDir: string, toolName?: string): Sco
794
1086
 
795
1087
  // Project directory
796
1088
  const displayDir = workingDir.startsWith(home)
797
- ? '~' + workingDir.slice(home.length)
1089
+ ? "~" + workingDir.slice(home.length)
798
1090
  : workingDir;
799
1091
  options.push({ label: displayDir, scope: workingDir });
800
1092
 
@@ -802,13 +1094,13 @@ export function generateScopeOptions(workingDir: string, toolName?: string): Sco
802
1094
  const parentDir = dirname(workingDir);
803
1095
  if (parentDir !== workingDir) {
804
1096
  const displayParent = parentDir.startsWith(home)
805
- ? '~' + parentDir.slice(home.length)
1097
+ ? "~" + parentDir.slice(home.length)
806
1098
  : parentDir;
807
1099
  options.push({ label: `${displayParent}/*`, scope: parentDir });
808
1100
  }
809
1101
 
810
1102
  // Everywhere
811
- options.push({ label: 'everywhere', scope: 'everywhere' });
1103
+ options.push({ label: "everywhere", scope: "everywhere" });
812
1104
 
813
1105
  return options;
814
1106
  }