vellum 0.0.16 → 0.2.0

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 (838) hide show
  1. package/.dockerignore +27 -0
  2. package/.env.example +22 -0
  3. package/Dockerfile +99 -0
  4. package/Dockerfile.sandbox +5 -0
  5. package/README.md +150 -3
  6. package/bun.lock +1768 -0
  7. package/bunfig.toml +2 -0
  8. package/docs/skills.md +158 -0
  9. package/drizzle/0000_dizzy_maggott.sql +301 -0
  10. package/drizzle/meta/0000_snapshot.json +1999 -0
  11. package/drizzle/meta/_journal.json +13 -0
  12. package/drizzle.config.ts +7 -0
  13. package/eslint.config.mjs +17 -0
  14. package/hook-templates/debug-prompt-logger/hook.json +7 -0
  15. package/hook-templates/debug-prompt-logger/run.sh +68 -0
  16. package/knip.json +9 -0
  17. package/package.json +60 -10
  18. package/scripts/ipc/check-contract-inventory.ts +104 -0
  19. package/scripts/ipc/check-swift-decoder-drift.ts +163 -0
  20. package/scripts/ipc/generate-swift.ts +492 -0
  21. package/scripts/test-filesystem-tools.sh +48 -0
  22. package/scripts/test.sh +122 -0
  23. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +2079 -0
  24. package/src/__tests__/account-registry.test.ts +244 -0
  25. package/src/__tests__/active-skill-tools.test.ts +378 -0
  26. package/src/__tests__/agent-loop-thinking.test.ts +81 -0
  27. package/src/__tests__/agent-loop.test.ts +1135 -0
  28. package/src/__tests__/anthropic-provider.test.ts +778 -0
  29. package/src/__tests__/app-builder-tool-scripts.test.ts +290 -0
  30. package/src/__tests__/app-bundler.test.ts +313 -0
  31. package/src/__tests__/app-executors.test.ts +613 -0
  32. package/src/__tests__/app-open-proxy.test.ts +62 -0
  33. package/src/__tests__/asset-materialize-tool.test.ts +451 -0
  34. package/src/__tests__/asset-search-tool.test.ts +476 -0
  35. package/src/__tests__/assistant-attachment-directive.test.ts +401 -0
  36. package/src/__tests__/assistant-attachments.test.ts +437 -0
  37. package/src/__tests__/assistant-event-hub.test.ts +226 -0
  38. package/src/__tests__/assistant-event.test.ts +123 -0
  39. package/src/__tests__/attachments-store.test.ts +547 -0
  40. package/src/__tests__/attachments.test.ts +134 -0
  41. package/src/__tests__/audit-log-rotation.test.ts +154 -0
  42. package/src/__tests__/browser-fill-credential.test.ts +309 -0
  43. package/src/__tests__/browser-manager.test.ts +203 -0
  44. package/src/__tests__/browser-runtime-check.test.ts +55 -0
  45. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +67 -0
  46. package/src/__tests__/browser-skill-endstate.test.ts +198 -0
  47. package/src/__tests__/bundle-scanner.test.ts +313 -0
  48. package/src/__tests__/checker.test.ts +3856 -0
  49. package/src/__tests__/clarification-resolver.test.ts +159 -0
  50. package/src/__tests__/classifier.test.ts +67 -0
  51. package/src/__tests__/claude-code-skill-regression.test.ts +127 -0
  52. package/src/__tests__/claude-code-tool-profiles.test.ts +88 -0
  53. package/src/__tests__/cli-discover.test.ts +85 -0
  54. package/src/__tests__/cli.test.ts +81 -0
  55. package/src/__tests__/clipboard.test.ts +80 -0
  56. package/src/__tests__/commit-guarantee.test.ts +335 -0
  57. package/src/__tests__/computer-use-session-compaction.test.ts +132 -0
  58. package/src/__tests__/computer-use-session-lifecycle.test.ts +293 -0
  59. package/src/__tests__/computer-use-session-working-dir.test.ts +117 -0
  60. package/src/__tests__/computer-use-skill-baseline.test.ts +74 -0
  61. package/src/__tests__/computer-use-skill-endstate.test.ts +89 -0
  62. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +217 -0
  63. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +107 -0
  64. package/src/__tests__/computer-use-skill-proxy-bridge.test.ts +54 -0
  65. package/src/__tests__/config-schema.test.ts +720 -0
  66. package/src/__tests__/conflict-store.test.ts +329 -0
  67. package/src/__tests__/connection-policy.test.ts +102 -0
  68. package/src/__tests__/context-memory-e2e.test.ts +434 -0
  69. package/src/__tests__/context-token-estimator.test.ts +135 -0
  70. package/src/__tests__/context-window-manager.test.ts +376 -0
  71. package/src/__tests__/contradiction-checker.test.ts +216 -0
  72. package/src/__tests__/conversation-store.test.ts +614 -0
  73. package/src/__tests__/credential-broker-browser-fill.test.ts +517 -0
  74. package/src/__tests__/credential-broker-server-use.test.ts +554 -0
  75. package/src/__tests__/credential-broker.test.ts +167 -0
  76. package/src/__tests__/credential-host-pattern-match.test.ts +104 -0
  77. package/src/__tests__/credential-metadata-store.test.ts +779 -0
  78. package/src/__tests__/credential-policy-validate.test.ts +121 -0
  79. package/src/__tests__/credential-resolve.test.ts +328 -0
  80. package/src/__tests__/credential-security-e2e.test.ts +352 -0
  81. package/src/__tests__/credential-security-invariants.test.ts +563 -0
  82. package/src/__tests__/credential-selection.test.ts +354 -0
  83. package/src/__tests__/credential-vault.test.ts +852 -0
  84. package/src/__tests__/daemon-assistant-events.test.ts +164 -0
  85. package/src/__tests__/daemon-server-session-init.test.ts +522 -0
  86. package/src/__tests__/delete-managed-skill-tool.test.ts +97 -0
  87. package/src/__tests__/diff.test.ts +121 -0
  88. package/src/__tests__/domain-normalize.test.ts +112 -0
  89. package/src/__tests__/domain-policy.test.ts +124 -0
  90. package/src/__tests__/doordash-client.test.ts +186 -0
  91. package/src/__tests__/doordash-session.test.ts +143 -0
  92. package/src/__tests__/dynamic-page-surface.test.ts +91 -0
  93. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +132 -0
  94. package/src/__tests__/edit-engine.test.ts +180 -0
  95. package/src/__tests__/email-cli.test.ts +283 -0
  96. package/src/__tests__/encrypted-store.test.ts +332 -0
  97. package/src/__tests__/entity-extractor.test.ts +190 -0
  98. package/src/__tests__/ephemeral-permissions.test.ts +312 -0
  99. package/src/__tests__/evaluate-typescript-tool.test.ts +286 -0
  100. package/src/__tests__/event-bus.test.ts +222 -0
  101. package/src/__tests__/file-edit-tool.test.ts +122 -0
  102. package/src/__tests__/file-ops-service.test.ts +330 -0
  103. package/src/__tests__/file-read-tool.test.ts +75 -0
  104. package/src/__tests__/file-write-tool.test.ts +113 -0
  105. package/src/__tests__/fixtures/credential-security-fixtures.ts +181 -0
  106. package/src/__tests__/fixtures/media-reuse-fixtures.ts +126 -0
  107. package/src/__tests__/fixtures/mock-signup-server.ts +387 -0
  108. package/src/__tests__/fixtures/proxy-fixtures.ts +147 -0
  109. package/src/__tests__/fuzzy-match-property.test.ts +216 -0
  110. package/src/__tests__/fuzzy-match.test.ts +138 -0
  111. package/src/__tests__/gemini-image-service.test.ts +261 -0
  112. package/src/__tests__/gemini-provider.test.ts +651 -0
  113. package/src/__tests__/get-weather.test.ts +318 -0
  114. package/src/__tests__/gmail-integration.test.ts +73 -0
  115. package/src/__tests__/handlers-cu-observation-blob.test.ts +351 -0
  116. package/src/__tests__/handlers-ipc-blob-probe.test.ts +190 -0
  117. package/src/__tests__/handlers-slack-config.test.ts +199 -0
  118. package/src/__tests__/handlers-task-submit-slash.test.ts +38 -0
  119. package/src/__tests__/headless-browser-interactions.test.ts +536 -0
  120. package/src/__tests__/headless-browser-navigate.test.ts +211 -0
  121. package/src/__tests__/headless-browser-read-tools.test.ts +261 -0
  122. package/src/__tests__/headless-browser-snapshot.test.ts +185 -0
  123. package/src/__tests__/history-repair-observability.test.ts +56 -0
  124. package/src/__tests__/history-repair.test.ts +510 -0
  125. package/src/__tests__/home-base-bootstrap.test.ts +77 -0
  126. package/src/__tests__/hooks-blocking.test.ts +128 -0
  127. package/src/__tests__/hooks-cli.test.ts +144 -0
  128. package/src/__tests__/hooks-config.test.ts +93 -0
  129. package/src/__tests__/hooks-discovery.test.ts +199 -0
  130. package/src/__tests__/hooks-integration.test.ts +189 -0
  131. package/src/__tests__/hooks-manager.test.ts +187 -0
  132. package/src/__tests__/hooks-runner.test.ts +178 -0
  133. package/src/__tests__/hooks-settings.test.ts +154 -0
  134. package/src/__tests__/hooks-templates.test.ts +137 -0
  135. package/src/__tests__/hooks-ts-runner.test.ts +125 -0
  136. package/src/__tests__/hooks-watch.test.ts +100 -0
  137. package/src/__tests__/host-file-edit-tool.test.ts +104 -0
  138. package/src/__tests__/host-file-read-tool.test.ts +61 -0
  139. package/src/__tests__/host-file-write-tool.test.ts +77 -0
  140. package/src/__tests__/host-shell-tool.test.ts +311 -0
  141. package/src/__tests__/intent-routing.test.ts +255 -0
  142. package/src/__tests__/ipc-blob-store.test.ts +315 -0
  143. package/src/__tests__/ipc-contract-inventory.test.ts +54 -0
  144. package/src/__tests__/ipc-contract.test.ts +74 -0
  145. package/src/__tests__/ipc-protocol.test.ts +113 -0
  146. package/src/__tests__/ipc-snapshot.test.ts +1560 -0
  147. package/src/__tests__/ipc-validate.test.ts +357 -0
  148. package/src/__tests__/key-migration.test.ts +183 -0
  149. package/src/__tests__/keychain.test.ts +258 -0
  150. package/src/__tests__/llm-usage-store.test.ts +226 -0
  151. package/src/__tests__/managed-skill-lifecycle.test.ts +257 -0
  152. package/src/__tests__/managed-store.test.ts +608 -0
  153. package/src/__tests__/media-generate-image.test.ts +238 -0
  154. package/src/__tests__/media-reuse-story.e2e.test.ts +676 -0
  155. package/src/__tests__/media-visibility-policy.test.ts +141 -0
  156. package/src/__tests__/memory-context-benchmark.test.ts +235 -0
  157. package/src/__tests__/memory-lifecycle-e2e.test.ts +481 -0
  158. package/src/__tests__/memory-query-builder.test.ts +59 -0
  159. package/src/__tests__/memory-recall-quality.test.ts +846 -0
  160. package/src/__tests__/memory-regressions.experimental.test.ts +538 -0
  161. package/src/__tests__/memory-regressions.test.ts +4238 -0
  162. package/src/__tests__/memory-retrieval-budget.test.ts +49 -0
  163. package/src/__tests__/migration-cli-flows.test.ts +169 -0
  164. package/src/__tests__/migration-ordering.test.ts +249 -0
  165. package/src/__tests__/mock-signup-server.test.ts +528 -0
  166. package/src/__tests__/onboarding-starter-tasks.test.ts +166 -0
  167. package/src/__tests__/onboarding-template-contract.test.ts +58 -0
  168. package/src/__tests__/openai-provider.test.ts +753 -0
  169. package/src/__tests__/parser.test.ts +472 -0
  170. package/src/__tests__/path-classifier.test.ts +73 -0
  171. package/src/__tests__/path-policy.test.ts +435 -0
  172. package/src/__tests__/platform-move-helper.test.ts +99 -0
  173. package/src/__tests__/platform-socket-path.test.ts +52 -0
  174. package/src/__tests__/platform-workspace-migration.test.ts +1000 -0
  175. package/src/__tests__/platform.test.ts +131 -0
  176. package/src/__tests__/prebuilt-home-base-seed.test.ts +71 -0
  177. package/src/__tests__/pricing.test.ts +256 -0
  178. package/src/__tests__/profile-compiler.test.ts +373 -0
  179. package/src/__tests__/provider-registry-ollama.test.ts +16 -0
  180. package/src/__tests__/proxy-approval-callback.test.ts +601 -0
  181. package/src/__tests__/ratelimit.test.ts +297 -0
  182. package/src/__tests__/registry.test.ts +487 -0
  183. package/src/__tests__/reminder-store.test.ts +220 -0
  184. package/src/__tests__/reminder.test.ts +263 -0
  185. package/src/__tests__/request-file-tool.test.ts +158 -0
  186. package/src/__tests__/run-orchestrator.test.ts +200 -0
  187. package/src/__tests__/runtime-attachment-metadata.test.ts +190 -0
  188. package/src/__tests__/runtime-runs-http.test.ts +451 -0
  189. package/src/__tests__/runtime-runs.test.ts +273 -0
  190. package/src/__tests__/sandbox-diagnostics.test.ts +408 -0
  191. package/src/__tests__/sandbox-host-parity.test.ts +950 -0
  192. package/src/__tests__/scaffold-managed-skill-tool.test.ts +253 -0
  193. package/src/__tests__/script-proxy-certs.test.ts +90 -0
  194. package/src/__tests__/script-proxy-connect-tunnel.test.ts +177 -0
  195. package/src/__tests__/script-proxy-decision-trace.test.ts +156 -0
  196. package/src/__tests__/script-proxy-http-forwarder.test.ts +281 -0
  197. package/src/__tests__/script-proxy-injection-runtime.test.ts +401 -0
  198. package/src/__tests__/script-proxy-mitm-handler.test.ts +407 -0
  199. package/src/__tests__/script-proxy-policy-runtime.test.ts +287 -0
  200. package/src/__tests__/script-proxy-policy.test.ts +310 -0
  201. package/src/__tests__/script-proxy-rewrite-specificity.test.ts +135 -0
  202. package/src/__tests__/script-proxy-router.test.ts +180 -0
  203. package/src/__tests__/script-proxy-session-manager.test.ts +382 -0
  204. package/src/__tests__/script-proxy-session-runtime.test.ts +113 -0
  205. package/src/__tests__/secret-allowlist.test.ts +229 -0
  206. package/src/__tests__/secret-ingress-handler.test.ts +99 -0
  207. package/src/__tests__/secret-onetime-send.test.ts +130 -0
  208. package/src/__tests__/secret-prompt-log-hygiene.test.ts +106 -0
  209. package/src/__tests__/secret-response-routing.test.ts +93 -0
  210. package/src/__tests__/secret-scanner-executor.test.ts +348 -0
  211. package/src/__tests__/secret-scanner.test.ts +857 -0
  212. package/src/__tests__/secure-keys.test.ts +323 -0
  213. package/src/__tests__/server-history-render.test.ts +430 -0
  214. package/src/__tests__/session-abort-tool-results.test.ts +240 -0
  215. package/src/__tests__/session-conflict-gate.test.ts +697 -0
  216. package/src/__tests__/session-error.test.ts +341 -0
  217. package/src/__tests__/session-evictor.test.ts +188 -0
  218. package/src/__tests__/session-load-history-repair.test.ts +222 -0
  219. package/src/__tests__/session-pre-run-repair.test.ts +213 -0
  220. package/src/__tests__/session-profile-injection.test.ts +444 -0
  221. package/src/__tests__/session-provider-retry-repair.test.ts +306 -0
  222. package/src/__tests__/session-queue.test.ts +1462 -0
  223. package/src/__tests__/session-runtime-assembly.test.ts +315 -0
  224. package/src/__tests__/session-runtime-workspace.test.ts +183 -0
  225. package/src/__tests__/session-skill-tools.test.ts +2431 -0
  226. package/src/__tests__/session-slash-known.test.ts +368 -0
  227. package/src/__tests__/session-slash-queue.test.ts +288 -0
  228. package/src/__tests__/session-slash-unknown.test.ts +271 -0
  229. package/src/__tests__/session-tool-setup-app-refresh.test.ts +473 -0
  230. package/src/__tests__/session-tool-setup-memory-scope.test.ts +140 -0
  231. package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +140 -0
  232. package/src/__tests__/session-undo.test.ts +75 -0
  233. package/src/__tests__/session-workspace-cache-state.test.ts +246 -0
  234. package/src/__tests__/session-workspace-injection.test.ts +327 -0
  235. package/src/__tests__/session-workspace-tool-tracking.test.ts +240 -0
  236. package/src/__tests__/shared-filesystem-errors.test.ts +78 -0
  237. package/src/__tests__/shell-credential-ref.test.ts +187 -0
  238. package/src/__tests__/shell-parser-fuzz.test.ts +544 -0
  239. package/src/__tests__/shell-parser-property.test.ts +433 -0
  240. package/src/__tests__/shell-tool-proxy-mode.test.ts +272 -0
  241. package/src/__tests__/signup-e2e.test.ts +352 -0
  242. package/src/__tests__/size-guard.test.ts +117 -0
  243. package/src/__tests__/skill-include-graph.test.ts +303 -0
  244. package/src/__tests__/skill-load-tool.test.ts +409 -0
  245. package/src/__tests__/skill-script-runner-host.test.ts +489 -0
  246. package/src/__tests__/skill-script-runner-sandbox.test.ts +349 -0
  247. package/src/__tests__/skill-tool-factory.test.ts +252 -0
  248. package/src/__tests__/skill-tool-manifest.test.ts +658 -0
  249. package/src/__tests__/skill-version-hash.test.ts +182 -0
  250. package/src/__tests__/skills.test.ts +597 -0
  251. package/src/__tests__/slash-commands-catalog.test.ts +86 -0
  252. package/src/__tests__/slash-commands-parser.test.ts +119 -0
  253. package/src/__tests__/slash-commands-resolver.test.ts +193 -0
  254. package/src/__tests__/slash-commands-rewrite.test.ts +39 -0
  255. package/src/__tests__/starter-bundle.test.ts +136 -0
  256. package/src/__tests__/starter-task-flow.test.ts +143 -0
  257. package/src/__tests__/subagent-manager-notify.test.ts +372 -0
  258. package/src/__tests__/subagent-tools.test.ts +118 -0
  259. package/src/__tests__/subagent-types.test.ts +78 -0
  260. package/src/__tests__/swarm-orchestrator.test.ts +428 -0
  261. package/src/__tests__/swarm-plan-validator.test.ts +330 -0
  262. package/src/__tests__/swarm-recursion.test.ts +165 -0
  263. package/src/__tests__/swarm-router-planner.test.ts +208 -0
  264. package/src/__tests__/swarm-session-integration.test.ts +274 -0
  265. package/src/__tests__/swarm-tool.test.ts +145 -0
  266. package/src/__tests__/swarm-worker-backend.test.ts +129 -0
  267. package/src/__tests__/swarm-worker-runner.test.ts +272 -0
  268. package/src/__tests__/system-prompt.test.ts +461 -0
  269. package/src/__tests__/task-compiler.test.ts +283 -0
  270. package/src/__tests__/task-runner.test.ts +215 -0
  271. package/src/__tests__/task-scheduler.test.ts +216 -0
  272. package/src/__tests__/task-tools.test.ts +602 -0
  273. package/src/__tests__/terminal-sandbox-docker.test.ts +1064 -0
  274. package/src/__tests__/terminal-sandbox.integration.test.ts +178 -0
  275. package/src/__tests__/terminal-sandbox.test.ts +202 -0
  276. package/src/__tests__/test-support/browser-skill-harness.ts +90 -0
  277. package/src/__tests__/test-support/computer-use-skill-harness.ts +45 -0
  278. package/src/__tests__/tool-audit-listener.test.ts +112 -0
  279. package/src/__tests__/tool-domain-event-publisher.test.ts +251 -0
  280. package/src/__tests__/tool-executor-lifecycle-events.test.ts +516 -0
  281. package/src/__tests__/tool-executor-redaction.test.ts +289 -0
  282. package/src/__tests__/tool-executor.test.ts +1971 -0
  283. package/src/__tests__/tool-metrics-listener.test.ts +225 -0
  284. package/src/__tests__/tool-notification-listener.test.ts +49 -0
  285. package/src/__tests__/tool-policy.test.ts +54 -0
  286. package/src/__tests__/tool-profiling-listener.test.ts +268 -0
  287. package/src/__tests__/tool-result-truncation.test.ts +217 -0
  288. package/src/__tests__/tool-trace-listener.test.ts +226 -0
  289. package/src/__tests__/top-level-renderer.test.ts +121 -0
  290. package/src/__tests__/top-level-scanner.test.ts +141 -0
  291. package/src/__tests__/trace-emitter.test.ts +173 -0
  292. package/src/__tests__/trust-store.test.ts +2030 -0
  293. package/src/__tests__/turn-commit.test.ts +219 -0
  294. package/src/__tests__/url-safety.test.ts +418 -0
  295. package/src/__tests__/weather-skill-regression.test.ts +225 -0
  296. package/src/__tests__/web-fetch.test.ts +869 -0
  297. package/src/__tests__/web-search.test.ts +584 -0
  298. package/src/__tests__/workspace-git-service.test.ts +750 -0
  299. package/src/__tests__/workspace-heartbeat-service.test.ts +347 -0
  300. package/src/__tests__/workspace-lifecycle.test.ts +292 -0
  301. package/src/agent/attachments.ts +35 -0
  302. package/src/agent/loop.ts +500 -0
  303. package/src/agent/message-types.ts +17 -0
  304. package/src/autonomy/autonomy-resolver.ts +60 -0
  305. package/src/autonomy/autonomy-store.ts +122 -0
  306. package/src/autonomy/disposition-mapper.ts +31 -0
  307. package/src/autonomy/index.ts +11 -0
  308. package/src/autonomy/types.ts +39 -0
  309. package/src/bundler/app-bundler.ts +274 -0
  310. package/src/bundler/bundle-scanner.ts +535 -0
  311. package/src/bundler/bundle-signer.ts +124 -0
  312. package/src/bundler/manifest.ts +21 -0
  313. package/src/bundler/signature-verifier.ts +184 -0
  314. package/src/cli/autonomy.ts +188 -0
  315. package/src/cli/contacts.ts +149 -0
  316. package/src/cli/doordash.ts +824 -0
  317. package/src/cli/email-guardrails.ts +200 -0
  318. package/src/cli/email.ts +405 -0
  319. package/src/cli/main-screen.tsx +155 -0
  320. package/src/cli.ts +935 -0
  321. package/src/config/bundled-skills/.gitkeep +0 -0
  322. package/src/config/bundled-skills/agentmail/SKILL.md +128 -0
  323. package/src/config/bundled-skills/agentmail/icon.svg +21 -0
  324. package/src/config/bundled-skills/app-builder/SKILL.md +1348 -0
  325. package/src/config/bundled-skills/app-builder/TOOLS.json +279 -0
  326. package/src/config/bundled-skills/app-builder/icon.svg +9 -0
  327. package/src/config/bundled-skills/app-builder/tools/app-create.ts +15 -0
  328. package/src/config/bundled-skills/app-builder/tools/app-delete.ts +10 -0
  329. package/src/config/bundled-skills/app-builder/tools/app-file-edit.ts +11 -0
  330. package/src/config/bundled-skills/app-builder/tools/app-file-list.ts +10 -0
  331. package/src/config/bundled-skills/app-builder/tools/app-file-read.ts +18 -0
  332. package/src/config/bundled-skills/app-builder/tools/app-file-write.ts +11 -0
  333. package/src/config/bundled-skills/app-builder/tools/app-list.ts +10 -0
  334. package/src/config/bundled-skills/app-builder/tools/app-query.ts +10 -0
  335. package/src/config/bundled-skills/app-builder/tools/app-update.ts +20 -0
  336. package/src/config/bundled-skills/browser/SKILL.md +28 -0
  337. package/src/config/bundled-skills/browser/TOOLS.json +234 -0
  338. package/src/config/bundled-skills/browser/tools/browser-click.ts +9 -0
  339. package/src/config/bundled-skills/browser/tools/browser-close.ts +9 -0
  340. package/src/config/bundled-skills/browser/tools/browser-extract.ts +9 -0
  341. package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +9 -0
  342. package/src/config/bundled-skills/browser/tools/browser-navigate.ts +9 -0
  343. package/src/config/bundled-skills/browser/tools/browser-press-key.ts +9 -0
  344. package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +9 -0
  345. package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +9 -0
  346. package/src/config/bundled-skills/browser/tools/browser-type.ts +9 -0
  347. package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +9 -0
  348. package/src/config/bundled-skills/claude-code/SKILL.md +50 -0
  349. package/src/config/bundled-skills/claude-code/TOOLS.json +40 -0
  350. package/src/config/bundled-skills/claude-code/tools/claude-code.ts +9 -0
  351. package/src/config/bundled-skills/computer-use/SKILL.md +17 -0
  352. package/src/config/bundled-skills/computer-use/TOOLS.json +326 -0
  353. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +9 -0
  354. package/src/config/bundled-skills/computer-use/tools/computer-use-done.ts +9 -0
  355. package/src/config/bundled-skills/computer-use/tools/computer-use-double-click.ts +9 -0
  356. package/src/config/bundled-skills/computer-use/tools/computer-use-drag.ts +9 -0
  357. package/src/config/bundled-skills/computer-use/tools/computer-use-key.ts +9 -0
  358. package/src/config/bundled-skills/computer-use/tools/computer-use-open-app.ts +9 -0
  359. package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +9 -0
  360. package/src/config/bundled-skills/computer-use/tools/computer-use-respond.ts +9 -0
  361. package/src/config/bundled-skills/computer-use/tools/computer-use-right-click.ts +9 -0
  362. package/src/config/bundled-skills/computer-use/tools/computer-use-run-applescript.ts +9 -0
  363. package/src/config/bundled-skills/computer-use/tools/computer-use-scroll.ts +9 -0
  364. package/src/config/bundled-skills/computer-use/tools/computer-use-type-text.ts +9 -0
  365. package/src/config/bundled-skills/computer-use/tools/computer-use-wait.ts +9 -0
  366. package/src/config/bundled-skills/google-calendar/SKILL.md +51 -0
  367. package/src/config/bundled-skills/google-calendar/TOOLS.json +108 -0
  368. package/src/config/bundled-skills/google-calendar/calendar-client.ts +165 -0
  369. package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +21 -0
  370. package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +42 -0
  371. package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +13 -0
  372. package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +30 -0
  373. package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +41 -0
  374. package/src/config/bundled-skills/google-calendar/tools/shared.ts +18 -0
  375. package/src/config/bundled-skills/google-calendar/types.ts +97 -0
  376. package/src/config/bundled-skills/image-studio/SKILL.md +32 -0
  377. package/src/config/bundled-skills/image-studio/TOOLS.json +42 -0
  378. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +137 -0
  379. package/src/config/bundled-skills/messaging/SKILL.md +126 -0
  380. package/src/config/bundled-skills/messaging/TOOLS.json +357 -0
  381. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +23 -0
  382. package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +23 -0
  383. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +25 -0
  384. package/src/config/bundled-skills/messaging/tools/gmail-draft.ts +26 -0
  385. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +25 -0
  386. package/src/config/bundled-skills/messaging/tools/gmail-trash.ts +23 -0
  387. package/src/config/bundled-skills/messaging/tools/gmail-unsubscribe.ts +84 -0
  388. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +18 -0
  389. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +124 -0
  390. package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +16 -0
  391. package/src/config/bundled-skills/messaging/tools/messaging-draft.ts +49 -0
  392. package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +21 -0
  393. package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +25 -0
  394. package/src/config/bundled-skills/messaging/tools/messaging-read.ts +28 -0
  395. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +29 -0
  396. package/src/config/bundled-skills/messaging/tools/messaging-search.ts +22 -0
  397. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +27 -0
  398. package/src/config/bundled-skills/messaging/tools/shared.ts +71 -0
  399. package/src/config/bundled-skills/messaging/tools/slack-add-reaction.ts +25 -0
  400. package/src/config/bundled-skills/messaging/tools/slack-leave-channel.ts +23 -0
  401. package/src/config/bundled-skills/self-upgrade/SKILL.md +74 -0
  402. package/src/config/bundled-skills/start-the-day/SKILL.md +70 -0
  403. package/src/config/bundled-skills/start-the-day/icon.svg +13 -0
  404. package/src/config/bundled-skills/weather/SKILL.md +37 -0
  405. package/src/config/bundled-skills/weather/TOOLS.json +32 -0
  406. package/src/config/bundled-skills/weather/icon.svg +24 -0
  407. package/src/config/bundled-skills/weather/tools/get-weather.ts +9 -0
  408. package/src/config/computer-use-prompt.ts +97 -0
  409. package/src/config/defaults.ts +186 -0
  410. package/src/config/loader.ts +336 -0
  411. package/src/config/schema.ts +1004 -0
  412. package/src/config/skill-state.ts +95 -0
  413. package/src/config/skills.ts +972 -0
  414. package/src/config/system-prompt.ts +927 -0
  415. package/src/config/templates/BOOTSTRAP.md +70 -0
  416. package/src/config/templates/IDENTITY.md +18 -0
  417. package/src/config/templates/LOOKS.md +25 -0
  418. package/src/config/templates/SOUL.md +37 -0
  419. package/src/config/templates/USER.md +19 -0
  420. package/src/config/types.ts +32 -0
  421. package/src/config/vellum-skills/deploy-fullstack-vercel/SKILL.md +179 -0
  422. package/src/config/vellum-skills/document-writer/SKILL.md +195 -0
  423. package/src/config/vellum-skills/google-oauth-setup/SKILL.md +194 -0
  424. package/src/config/vellum-skills/slack-oauth-setup/SKILL.md +147 -0
  425. package/src/config/vellum-skills/telegram-setup/SKILL.md +105 -0
  426. package/src/contacts/contact-store.ts +410 -0
  427. package/src/contacts/index.ts +11 -0
  428. package/src/contacts/types.ts +28 -0
  429. package/src/context/token-estimator.ts +108 -0
  430. package/src/context/tool-result-truncation.ts +128 -0
  431. package/src/context/window-manager.ts +531 -0
  432. package/src/daemon/assistant-attachments.ts +679 -0
  433. package/src/daemon/classifier.ts +108 -0
  434. package/src/daemon/computer-use-session.ts +900 -0
  435. package/src/daemon/connection-policy.ts +41 -0
  436. package/src/daemon/handlers/apps.ts +446 -0
  437. package/src/daemon/handlers/computer-use.ts +181 -0
  438. package/src/daemon/handlers/config.ts +434 -0
  439. package/src/daemon/handlers/diagnostics.ts +334 -0
  440. package/src/daemon/handlers/documents.ts +184 -0
  441. package/src/daemon/handlers/home-base.ts +73 -0
  442. package/src/daemon/handlers/index.ts +355 -0
  443. package/src/daemon/handlers/misc.ts +323 -0
  444. package/src/daemon/handlers/open-bundle-handler.ts +80 -0
  445. package/src/daemon/handlers/publish.ts +182 -0
  446. package/src/daemon/handlers/sessions.ts +486 -0
  447. package/src/daemon/handlers/shared.ts +533 -0
  448. package/src/daemon/handlers/skills.ts +487 -0
  449. package/src/daemon/handlers/subagents.ts +122 -0
  450. package/src/daemon/handlers/work-items.ts +176 -0
  451. package/src/daemon/handlers.ts +17 -0
  452. package/src/daemon/history-repair.ts +214 -0
  453. package/src/daemon/ipc-blob-store.ts +231 -0
  454. package/src/daemon/ipc-contract-inventory.json +407 -0
  455. package/src/daemon/ipc-contract-inventory.ts +126 -0
  456. package/src/daemon/ipc-contract.ts +2102 -0
  457. package/src/daemon/ipc-protocol.ts +70 -0
  458. package/src/daemon/ipc-validate.ts +171 -0
  459. package/src/daemon/lifecycle.ts +503 -0
  460. package/src/daemon/main.ts +15 -0
  461. package/src/daemon/media-visibility-policy.ts +57 -0
  462. package/src/daemon/ride-shotgun-handler.ts +244 -0
  463. package/src/daemon/server.ts +1085 -0
  464. package/src/daemon/session-attachments.ts +173 -0
  465. package/src/daemon/session-conflict-gate.ts +219 -0
  466. package/src/daemon/session-dynamic-profile.ts +63 -0
  467. package/src/daemon/session-error.ts +269 -0
  468. package/src/daemon/session-evictor.ts +196 -0
  469. package/src/daemon/session-history.ts +437 -0
  470. package/src/daemon/session-memory.ts +212 -0
  471. package/src/daemon/session-process.ts +264 -0
  472. package/src/daemon/session-queue-manager.ts +81 -0
  473. package/src/daemon/session-runtime-assembly.ts +395 -0
  474. package/src/daemon/session-skill-tools.ts +237 -0
  475. package/src/daemon/session-slash.ts +302 -0
  476. package/src/daemon/session-surfaces.ts +624 -0
  477. package/src/daemon/session-tool-setup.ts +286 -0
  478. package/src/daemon/session-usage.ts +74 -0
  479. package/src/daemon/session-workspace.ts +19 -0
  480. package/src/daemon/session.ts +1651 -0
  481. package/src/daemon/trace-emitter.ts +82 -0
  482. package/src/daemon/watch-handler.ts +274 -0
  483. package/src/doordash/client.ts +905 -0
  484. package/src/doordash/queries.ts +1312 -0
  485. package/src/doordash/query-extractor.ts +93 -0
  486. package/src/doordash/session.ts +82 -0
  487. package/src/email/provider.ts +117 -0
  488. package/src/email/providers/agentmail.ts +317 -0
  489. package/src/email/providers/index.ts +58 -0
  490. package/src/email/service.ts +303 -0
  491. package/src/email/types.ts +126 -0
  492. package/src/events/bus.ts +157 -0
  493. package/src/events/domain-events.ts +83 -0
  494. package/src/events/index.ts +18 -0
  495. package/src/events/tool-audit-listener.ts +80 -0
  496. package/src/events/tool-domain-event-publisher.ts +111 -0
  497. package/src/events/tool-metrics-listener.ts +159 -0
  498. package/src/events/tool-notification-listener.ts +17 -0
  499. package/src/events/tool-profiling-listener.ts +158 -0
  500. package/src/events/tool-trace-listener.ts +75 -0
  501. package/src/export/formatter.ts +96 -0
  502. package/src/followups/followup-store.ts +166 -0
  503. package/src/followups/index.ts +10 -0
  504. package/src/followups/types.ts +23 -0
  505. package/src/gallery/default-gallery.ts +795 -0
  506. package/src/gallery/gallery-manifest.ts +24 -0
  507. package/src/home-base/app-link-store.ts +82 -0
  508. package/src/home-base/bootstrap.ts +66 -0
  509. package/src/home-base/prebuilt/index.html +662 -0
  510. package/src/home-base/prebuilt/seed-metadata.json +21 -0
  511. package/src/home-base/prebuilt/seed.ts +101 -0
  512. package/src/home-base/prebuilt-home-base-updater.ts +30 -0
  513. package/src/hooks/cli.ts +163 -0
  514. package/src/hooks/config.ts +88 -0
  515. package/src/hooks/discovery.ts +110 -0
  516. package/src/hooks/manager.ts +128 -0
  517. package/src/hooks/runner.ts +123 -0
  518. package/src/hooks/templates.ts +52 -0
  519. package/src/hooks/types.ts +72 -0
  520. package/src/index.ts +1194 -0
  521. package/src/instrument.ts +60 -0
  522. package/src/logfire.ts +99 -0
  523. package/src/media/gemini-image-service.ts +136 -0
  524. package/src/memory/account-store.ts +108 -0
  525. package/src/memory/admin.ts +211 -0
  526. package/src/memory/app-store.ts +556 -0
  527. package/src/memory/attachments-store.ts +453 -0
  528. package/src/memory/channel-delivery-store.ts +368 -0
  529. package/src/memory/checkpoints.ts +52 -0
  530. package/src/memory/clarification-resolver.ts +297 -0
  531. package/src/memory/conflict-store.ts +342 -0
  532. package/src/memory/contradiction-checker.ts +329 -0
  533. package/src/memory/conversation-key-store.ts +127 -0
  534. package/src/memory/conversation-store.ts +469 -0
  535. package/src/memory/db.ts +1105 -0
  536. package/src/memory/embedding-backend.ts +229 -0
  537. package/src/memory/embedding-gemini.ts +52 -0
  538. package/src/memory/embedding-local.ts +75 -0
  539. package/src/memory/embedding-ollama.ts +55 -0
  540. package/src/memory/embedding-openai.ts +25 -0
  541. package/src/memory/entity-extractor.ts +471 -0
  542. package/src/memory/fingerprint.ts +20 -0
  543. package/src/memory/indexer.ts +156 -0
  544. package/src/memory/items-extractor.ts +460 -0
  545. package/src/memory/job-handlers/backfill.ts +139 -0
  546. package/src/memory/job-handlers/cleanup.ts +58 -0
  547. package/src/memory/job-handlers/conflict.ts +99 -0
  548. package/src/memory/job-handlers/embedding.ts +61 -0
  549. package/src/memory/job-handlers/extraction.ts +123 -0
  550. package/src/memory/job-handlers/index-maintenance.ts +54 -0
  551. package/src/memory/job-handlers/summarization.ts +286 -0
  552. package/src/memory/job-utils.ts +170 -0
  553. package/src/memory/jobs-store.ts +400 -0
  554. package/src/memory/jobs-worker.ts +274 -0
  555. package/src/memory/llm-request-log-store.ts +45 -0
  556. package/src/memory/llm-usage-store.ts +62 -0
  557. package/src/memory/message-content.ts +54 -0
  558. package/src/memory/profile-compiler.ts +160 -0
  559. package/src/memory/published-pages-store.ts +137 -0
  560. package/src/memory/qdrant-client.ts +366 -0
  561. package/src/memory/qdrant-manager.ts +242 -0
  562. package/src/memory/query-builder.ts +45 -0
  563. package/src/memory/retrieval-budget.ts +30 -0
  564. package/src/memory/retriever.ts +653 -0
  565. package/src/memory/runs-store.ts +211 -0
  566. package/src/memory/schema.ts +529 -0
  567. package/src/memory/search/entity.ts +298 -0
  568. package/src/memory/search/formatting.ts +207 -0
  569. package/src/memory/search/lexical.ts +227 -0
  570. package/src/memory/search/ranking.ts +401 -0
  571. package/src/memory/search/semantic.ts +121 -0
  572. package/src/memory/search/types.ts +137 -0
  573. package/src/memory/segmenter.ts +68 -0
  574. package/src/memory/shared-app-links-store.ts +138 -0
  575. package/src/memory/tool-usage-store.ts +62 -0
  576. package/src/messaging/activity-analyzer.ts +76 -0
  577. package/src/messaging/draft-store.ts +88 -0
  578. package/src/messaging/index.ts +3 -0
  579. package/src/messaging/provider-types.ts +80 -0
  580. package/src/messaging/provider.ts +43 -0
  581. package/src/messaging/providers/gmail/adapter.ts +193 -0
  582. package/src/messaging/providers/gmail/client.ts +204 -0
  583. package/src/messaging/providers/gmail/types.ts +90 -0
  584. package/src/messaging/providers/slack/adapter.ts +202 -0
  585. package/src/messaging/providers/slack/client.ts +198 -0
  586. package/src/messaging/providers/slack/types.ts +119 -0
  587. package/src/messaging/registry.ts +34 -0
  588. package/src/messaging/style-analyzer.ts +158 -0
  589. package/src/messaging/thread-summarizer.ts +310 -0
  590. package/src/messaging/triage-engine.ts +321 -0
  591. package/src/messaging/types.ts +55 -0
  592. package/src/permissions/checker.ts +636 -0
  593. package/src/permissions/defaults.ts +243 -0
  594. package/src/permissions/prompter.ts +102 -0
  595. package/src/permissions/secret-prompter.ts +114 -0
  596. package/src/permissions/trust-store.ts +584 -0
  597. package/src/permissions/types.ts +62 -0
  598. package/src/playbooks/index.ts +2 -0
  599. package/src/playbooks/playbook-compiler.ts +90 -0
  600. package/src/playbooks/types.ts +55 -0
  601. package/src/providers/anthropic/client.ts +751 -0
  602. package/src/providers/failover.ts +129 -0
  603. package/src/providers/fireworks/client.ts +20 -0
  604. package/src/providers/gemini/client.ts +285 -0
  605. package/src/providers/ollama/client.ts +30 -0
  606. package/src/providers/openai/client.ts +337 -0
  607. package/src/providers/ratelimit.ts +93 -0
  608. package/src/providers/registry.ts +138 -0
  609. package/src/providers/retry.ts +106 -0
  610. package/src/providers/stream-timeout.ts +38 -0
  611. package/src/providers/types.ts +109 -0
  612. package/src/runtime/assistant-event-hub.ts +120 -0
  613. package/src/runtime/assistant-event.ts +82 -0
  614. package/src/runtime/http-server.ts +478 -0
  615. package/src/runtime/http-types.ts +68 -0
  616. package/src/runtime/routes/app-routes.ts +174 -0
  617. package/src/runtime/routes/attachment-routes.ts +134 -0
  618. package/src/runtime/routes/channel-routes.ts +342 -0
  619. package/src/runtime/routes/conversation-routes.ts +349 -0
  620. package/src/runtime/routes/run-routes.ts +223 -0
  621. package/src/runtime/routes/secret-routes.ts +76 -0
  622. package/src/runtime/run-orchestrator.ts +206 -0
  623. package/src/schedule/schedule-store.ts +452 -0
  624. package/src/schedule/scheduler.ts +168 -0
  625. package/src/security/encrypted-store.ts +238 -0
  626. package/src/security/keychain.ts +252 -0
  627. package/src/security/oauth2.ts +241 -0
  628. package/src/security/redaction.ts +89 -0
  629. package/src/security/secret-allowlist.ts +118 -0
  630. package/src/security/secret-ingress.ts +57 -0
  631. package/src/security/secret-scanner.ts +543 -0
  632. package/src/security/secure-keys.ts +180 -0
  633. package/src/security/token-manager.ts +141 -0
  634. package/src/services/published-app-updater.ts +69 -0
  635. package/src/services/vercel-deploy.ts +73 -0
  636. package/src/skills/active-skill-tools.ts +81 -0
  637. package/src/skills/clawhub.ts +414 -0
  638. package/src/skills/include-graph.ts +146 -0
  639. package/src/skills/managed-store.ts +233 -0
  640. package/src/skills/path-classifier.ts +128 -0
  641. package/src/skills/slash-commands.ts +174 -0
  642. package/src/skills/tool-manifest.ts +165 -0
  643. package/src/skills/version-hash.ts +110 -0
  644. package/src/slack/slack-webhook.ts +61 -0
  645. package/src/subagent/index.ts +19 -0
  646. package/src/subagent/manager.ts +477 -0
  647. package/src/subagent/types.ts +69 -0
  648. package/src/swarm/backend-claude-code.ts +90 -0
  649. package/src/swarm/index.ts +44 -0
  650. package/src/swarm/limits.ts +37 -0
  651. package/src/swarm/orchestrator.ts +279 -0
  652. package/src/swarm/plan-validator.ts +151 -0
  653. package/src/swarm/router-planner.ts +100 -0
  654. package/src/swarm/router-prompts.ts +36 -0
  655. package/src/swarm/synthesizer.ts +62 -0
  656. package/src/swarm/types.ts +62 -0
  657. package/src/swarm/worker-backend.ts +121 -0
  658. package/src/swarm/worker-prompts.ts +78 -0
  659. package/src/swarm/worker-runner.ts +164 -0
  660. package/src/tasks/SPEC.md +133 -0
  661. package/src/tasks/candidate-store.ts +86 -0
  662. package/src/tasks/ephemeral-permissions.ts +41 -0
  663. package/src/tasks/task-compiler.ts +198 -0
  664. package/src/tasks/task-runner.ts +85 -0
  665. package/src/tasks/task-scheduler.ts +20 -0
  666. package/src/tasks/task-store.ts +127 -0
  667. package/src/tools/apps/definitions.ts +59 -0
  668. package/src/tools/apps/executors.ts +313 -0
  669. package/src/tools/apps/open-proxy.ts +43 -0
  670. package/src/tools/apps/registry.ts +16 -0
  671. package/src/tools/assets/materialize.ts +218 -0
  672. package/src/tools/assets/search.ts +396 -0
  673. package/src/tools/browser/__tests__/auth-cache.test.ts +219 -0
  674. package/src/tools/browser/__tests__/auth-detector.test.ts +362 -0
  675. package/src/tools/browser/__tests__/jit-auth.test.ts +189 -0
  676. package/src/tools/browser/auth-cache.ts +149 -0
  677. package/src/tools/browser/auth-detector.ts +347 -0
  678. package/src/tools/browser/browser-execution.ts +979 -0
  679. package/src/tools/browser/browser-handoff.ts +79 -0
  680. package/src/tools/browser/browser-manager.ts +715 -0
  681. package/src/tools/browser/browser-screencast.ts +217 -0
  682. package/src/tools/browser/headless-browser.ts +450 -0
  683. package/src/tools/browser/jit-auth.ts +51 -0
  684. package/src/tools/browser/network-recorder.ts +348 -0
  685. package/src/tools/browser/network-recording-types.ts +49 -0
  686. package/src/tools/browser/recording-store.ts +49 -0
  687. package/src/tools/browser/runtime-check.ts +43 -0
  688. package/src/tools/claude-code/claude-code.ts +232 -0
  689. package/src/tools/computer-use/definitions.ts +443 -0
  690. package/src/tools/computer-use/registry.ts +22 -0
  691. package/src/tools/computer-use/request-computer-control.ts +53 -0
  692. package/src/tools/computer-use/skill-proxy-bridge.ts +28 -0
  693. package/src/tools/contacts/contact-merge.ts +87 -0
  694. package/src/tools/contacts/contact-search.ts +102 -0
  695. package/src/tools/contacts/contact-upsert.ts +137 -0
  696. package/src/tools/contacts/index.ts +4 -0
  697. package/src/tools/credentials/account-registry.ts +127 -0
  698. package/src/tools/credentials/broker-types.ts +107 -0
  699. package/src/tools/credentials/broker.ts +372 -0
  700. package/src/tools/credentials/domain-policy.ts +51 -0
  701. package/src/tools/credentials/host-pattern-match.ts +60 -0
  702. package/src/tools/credentials/metadata-store.ts +335 -0
  703. package/src/tools/credentials/policy-types.ts +52 -0
  704. package/src/tools/credentials/policy-validate.ts +80 -0
  705. package/src/tools/credentials/resolve.ts +122 -0
  706. package/src/tools/credentials/selection.ts +159 -0
  707. package/src/tools/credentials/tool-policy.ts +25 -0
  708. package/src/tools/credentials/vault.ts +641 -0
  709. package/src/tools/document/document-tool.ts +165 -0
  710. package/src/tools/document/editor-template.ts +237 -0
  711. package/src/tools/document/index.ts +5 -0
  712. package/src/tools/executor.ts +825 -0
  713. package/src/tools/filesystem/edit.ts +127 -0
  714. package/src/tools/filesystem/fuzzy-match.ts +202 -0
  715. package/src/tools/filesystem/read.ts +71 -0
  716. package/src/tools/filesystem/view-image.ts +199 -0
  717. package/src/tools/filesystem/write.ts +79 -0
  718. package/src/tools/followups/followup_create.ts +118 -0
  719. package/src/tools/followups/followup_list.ts +100 -0
  720. package/src/tools/followups/followup_resolve.ts +91 -0
  721. package/src/tools/followups/index.ts +3 -0
  722. package/src/tools/host-filesystem/edit.ts +125 -0
  723. package/src/tools/host-filesystem/read.ts +80 -0
  724. package/src/tools/host-filesystem/write.ts +76 -0
  725. package/src/tools/host-terminal/cli-discover.ts +179 -0
  726. package/src/tools/host-terminal/host-shell.ts +181 -0
  727. package/src/tools/memory/definitions.ts +69 -0
  728. package/src/tools/memory/handlers.ts +245 -0
  729. package/src/tools/memory/register.ts +66 -0
  730. package/src/tools/network/domain-normalize.ts +85 -0
  731. package/src/tools/network/script-proxy/certs.ts +237 -0
  732. package/src/tools/network/script-proxy/connect-tunnel.ts +82 -0
  733. package/src/tools/network/script-proxy/http-forwarder.ts +151 -0
  734. package/src/tools/network/script-proxy/index.ts +28 -0
  735. package/src/tools/network/script-proxy/logging.ts +196 -0
  736. package/src/tools/network/script-proxy/mitm-handler.ts +269 -0
  737. package/src/tools/network/script-proxy/policy.ts +152 -0
  738. package/src/tools/network/script-proxy/router.ts +60 -0
  739. package/src/tools/network/script-proxy/server.ts +136 -0
  740. package/src/tools/network/script-proxy/session-manager.ts +534 -0
  741. package/src/tools/network/script-proxy/types.ts +125 -0
  742. package/src/tools/network/url-safety.ts +227 -0
  743. package/src/tools/network/web-fetch.ts +701 -0
  744. package/src/tools/network/web-search.ts +319 -0
  745. package/src/tools/playbooks/index.ts +5 -0
  746. package/src/tools/playbooks/playbook-create.ts +140 -0
  747. package/src/tools/playbooks/playbook-delete.ts +76 -0
  748. package/src/tools/playbooks/playbook-list.ts +101 -0
  749. package/src/tools/playbooks/playbook-update.ts +159 -0
  750. package/src/tools/registry.ts +297 -0
  751. package/src/tools/reminder/reminder-store.ts +148 -0
  752. package/src/tools/reminder/reminder.ts +153 -0
  753. package/src/tools/schedule/create.ts +86 -0
  754. package/src/tools/schedule/delete.ts +54 -0
  755. package/src/tools/schedule/list.ts +88 -0
  756. package/src/tools/schedule/update.ts +97 -0
  757. package/src/tools/shared/filesystem/edit-engine.ts +56 -0
  758. package/src/tools/shared/filesystem/errors.ts +85 -0
  759. package/src/tools/shared/filesystem/file-ops-service.ts +215 -0
  760. package/src/tools/shared/filesystem/format-diff.ts +35 -0
  761. package/src/tools/shared/filesystem/path-policy.ts +125 -0
  762. package/src/tools/shared/filesystem/size-guard.ts +41 -0
  763. package/src/tools/shared/filesystem/types.ts +80 -0
  764. package/src/tools/shared/shell-output.ts +52 -0
  765. package/src/tools/skills/delete-managed.ts +60 -0
  766. package/src/tools/skills/load.ts +139 -0
  767. package/src/tools/skills/sandbox-runner.ts +279 -0
  768. package/src/tools/skills/scaffold-managed.ts +150 -0
  769. package/src/tools/skills/script-contract.ts +6 -0
  770. package/src/tools/skills/skill-script-runner.ts +86 -0
  771. package/src/tools/skills/skill-tool-factory.ts +64 -0
  772. package/src/tools/skills/vellum-catalog.ts +217 -0
  773. package/src/tools/subagent/abort.ts +62 -0
  774. package/src/tools/subagent/index.ts +5 -0
  775. package/src/tools/subagent/message.ts +72 -0
  776. package/src/tools/subagent/read.ts +98 -0
  777. package/src/tools/subagent/spawn.ts +85 -0
  778. package/src/tools/subagent/status.ts +74 -0
  779. package/src/tools/swarm/delegate.ts +182 -0
  780. package/src/tools/system/request-permission.ts +98 -0
  781. package/src/tools/tasks/index.ts +25 -0
  782. package/src/tools/tasks/task-delete.ts +69 -0
  783. package/src/tools/tasks/task-list.ts +65 -0
  784. package/src/tools/tasks/task-run.ts +125 -0
  785. package/src/tools/tasks/task-save.ts +79 -0
  786. package/src/tools/tasks/work-item-enqueue.ts +176 -0
  787. package/src/tools/tasks/work-item-list.ts +86 -0
  788. package/src/tools/terminal/backends/docker.ts +372 -0
  789. package/src/tools/terminal/backends/native.ts +188 -0
  790. package/src/tools/terminal/backends/types.ts +26 -0
  791. package/src/tools/terminal/evaluate-typescript.ts +275 -0
  792. package/src/tools/terminal/parser.ts +393 -0
  793. package/src/tools/terminal/safe-env.ts +37 -0
  794. package/src/tools/terminal/sandbox-diagnostics.ts +149 -0
  795. package/src/tools/terminal/sandbox.ts +44 -0
  796. package/src/tools/terminal/shell.ts +257 -0
  797. package/src/tools/tool-manifest.ts +250 -0
  798. package/src/tools/types.ts +177 -0
  799. package/src/tools/ui-surface/definitions.ts +232 -0
  800. package/src/tools/ui-surface/registry.ts +14 -0
  801. package/src/tools/watch/screen-watch.ts +128 -0
  802. package/src/tools/watch/watch-state.ts +119 -0
  803. package/src/tools/watcher/create.ts +110 -0
  804. package/src/tools/watcher/delete.ts +53 -0
  805. package/src/tools/watcher/digest.ts +84 -0
  806. package/src/tools/watcher/list.ts +90 -0
  807. package/src/tools/watcher/update.ts +102 -0
  808. package/src/tools/weather/service.ts +551 -0
  809. package/src/usage/actors.ts +24 -0
  810. package/src/usage/types.ts +38 -0
  811. package/src/util/clipboard.ts +33 -0
  812. package/src/util/content-id.ts +16 -0
  813. package/src/util/diff.ts +181 -0
  814. package/src/util/errors.ts +129 -0
  815. package/src/util/logger.ts +243 -0
  816. package/src/util/platform.ts +607 -0
  817. package/src/util/pricing.ts +150 -0
  818. package/src/util/spinner.ts +51 -0
  819. package/src/util/time.ts +16 -0
  820. package/src/util/xml.ts +4 -0
  821. package/src/version.ts +3 -0
  822. package/src/watcher/constants.ts +11 -0
  823. package/src/watcher/engine.ts +199 -0
  824. package/src/watcher/provider-registry.ts +15 -0
  825. package/src/watcher/provider-types.ts +48 -0
  826. package/src/watcher/providers/gmail.ts +198 -0
  827. package/src/watcher/providers/google-calendar.ts +228 -0
  828. package/src/watcher/providers/slack.ts +128 -0
  829. package/src/watcher/watcher-store.ts +418 -0
  830. package/src/work-items/work-item-store.ts +91 -0
  831. package/src/workspace/git-service.ts +620 -0
  832. package/src/workspace/heartbeat-service.ts +288 -0
  833. package/src/workspace/top-level-renderer.ts +19 -0
  834. package/src/workspace/top-level-scanner.ts +41 -0
  835. package/src/workspace/turn-commit.ts +122 -0
  836. package/tsconfig.json +21 -0
  837. package/LICENSE +0 -674
  838. package/dist/cli.js +0 -569
@@ -0,0 +1,584 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, renameSync, chmodSync } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
+ import { v4 as uuid } from 'uuid';
4
+ import { minimatch } from 'minimatch';
5
+ import { getRootDir } from '../util/platform.js';
6
+ import { getLogger } from '../util/logger.js';
7
+ import { getDefaultRuleTemplates } from './defaults.js';
8
+ import type { TrustRule, PolicyContext } from './types.js';
9
+
10
+ const log = getLogger('trust-store');
11
+
12
+ const TRUST_FILE_VERSION = 3;
13
+
14
+ interface TrustFile {
15
+ version: number;
16
+ rules: TrustRule[];
17
+ /** Set to true when the user explicitly accepts the starter approval bundle. */
18
+ starterBundleAccepted?: boolean;
19
+ }
20
+
21
+ let cachedRules: TrustRule[] | null = null;
22
+ let cachedStarterBundleAccepted: boolean | null = null;
23
+
24
+ function getTrustPath(): string {
25
+ return join(getRootDir(), 'protected', 'trust.json');
26
+ }
27
+
28
+ /**
29
+ * Sort comparator: highest priority first. At the same priority, deny rules
30
+ * come before allow rules for safety (deny wins ties).
31
+ */
32
+ function ruleOrder(a: TrustRule, b: TrustRule): number {
33
+ if (b.priority !== a.priority) return b.priority - a.priority;
34
+ if (a.decision !== b.decision) {
35
+ // deny > ask > allow
36
+ const order = { deny: 0, ask: 1, allow: 2 };
37
+ return (order[a.decision] ?? 2) - (order[b.decision] ?? 2);
38
+ }
39
+ return 0;
40
+ }
41
+
42
+ /**
43
+ * Ensure default rules are always present in the rule set.
44
+ * Mutates the provided array and returns whether any rules were added.
45
+ */
46
+ function backfillDefaults(rules: TrustRule[]): boolean {
47
+ let changed = false;
48
+ const existingIds = new Set(rules.map((r) => r.id));
49
+
50
+ // Migrate old default:deny-*-protected rules → default:ask-*-protected
51
+ const oldDefaultPrefix = 'default:deny-';
52
+ const newDefaultPrefix = 'default:ask-';
53
+ for (let i = rules.length - 1; i >= 0; i--) {
54
+ const rule = rules[i];
55
+ if (rule.id.startsWith(oldDefaultPrefix) && rule.id.endsWith('-protected')) {
56
+ const newId = newDefaultPrefix + rule.id.slice(oldDefaultPrefix.length);
57
+ rules.splice(i, 1);
58
+ existingIds.delete(rule.id);
59
+ // Don't add newId to existingIds — let the backfill loop re-add it
60
+ changed = true;
61
+ log.info({ oldId: rule.id, newId }, 'Migrated default deny rule to ask');
62
+ }
63
+ }
64
+
65
+ // Remove default rules that are no longer in the template set (e.g.
66
+ // computer_use_done/computer_use_respond were removed from the ask-rule list
67
+ // because they are terminal signal tools that don't need approval).
68
+ const templateIds = new Set(getDefaultRuleTemplates().map((t) => t.id));
69
+ for (let i = rules.length - 1; i >= 0; i--) {
70
+ const rule = rules[i];
71
+ if (rule.id.startsWith('default:') && !templateIds.has(rule.id)) {
72
+ rules.splice(i, 1);
73
+ existingIds.delete(rule.id);
74
+ changed = true;
75
+ log.info({ ruleId: rule.id }, 'Removed stale default trust rule');
76
+ }
77
+ }
78
+
79
+ // Migrate existing default rules whose priority, pattern, decision, or
80
+ // allowHighRisk has changed in the template (e.g. host_bash pattern changed
81
+ // from '*' to '**', host tool priorities changed from 1000 to 50).
82
+ for (const template of getDefaultRuleTemplates()) {
83
+ if (existingIds.has(template.id)) {
84
+ const rule = rules.find((r) => r.id === template.id);
85
+ if (rule && (
86
+ rule.priority !== template.priority
87
+ || rule.pattern !== template.pattern
88
+ || rule.decision !== template.decision
89
+ || rule.allowHighRisk !== template.allowHighRisk
90
+ )) {
91
+ log.info(
92
+ { ruleId: rule.id, oldPriority: rule.priority, newPriority: template.priority, oldPattern: rule.pattern, newPattern: template.pattern },
93
+ 'Migrated default rule to updated template values',
94
+ );
95
+ rule.priority = template.priority;
96
+ rule.pattern = template.pattern;
97
+ rule.decision = template.decision;
98
+ if (template.allowHighRisk != null) {
99
+ rule.allowHighRisk = template.allowHighRisk;
100
+ } else {
101
+ delete rule.allowHighRisk;
102
+ }
103
+ changed = true;
104
+ }
105
+ }
106
+ }
107
+
108
+ for (const template of getDefaultRuleTemplates()) {
109
+ if (!existingIds.has(template.id)) {
110
+ const rule: TrustRule = {
111
+ id: template.id,
112
+ tool: template.tool,
113
+ pattern: template.pattern,
114
+ scope: template.scope,
115
+ decision: template.decision,
116
+ priority: template.priority,
117
+ createdAt: Date.now(),
118
+ };
119
+ if (template.allowHighRisk != null) {
120
+ rule.allowHighRisk = template.allowHighRisk;
121
+ }
122
+ rules.push(rule);
123
+ changed = true;
124
+ log.info({ ruleId: template.id }, 'Backfilled default trust rule');
125
+ }
126
+ }
127
+ return changed;
128
+ }
129
+
130
+ /**
131
+ * Update persisted starter-bundle rules whose pattern matches a known legacy
132
+ * format (e.g. the old "tool:**" prefix was changed to standalone "**").
133
+ * Returns true when at least one rule was updated.
134
+ *
135
+ * Only rules with a recognised legacy pattern are migrated. If a user has
136
+ * intentionally customised a starter rule's pattern (e.g. narrowed it), it is
137
+ * left untouched.
138
+ */
139
+ function migrateStarterRulePatterns(rules: TrustRule[]): boolean {
140
+ const templatesByID = new Map(getStarterBundleRules().map((t) => [t.id, t]));
141
+ let changed = false;
142
+ for (const rule of rules) {
143
+ const template = templatesByID.get(rule.id);
144
+ if (!template || rule.pattern === template.pattern) continue;
145
+ // Only migrate patterns that match a known legacy format.
146
+ // The "tool:**" prefix (e.g. "file_read:**") was the original pattern
147
+ // before it was changed to standalone "**".
148
+ if (!isLegacyStarterPattern(rule.pattern, rule.tool)) continue;
149
+ log.info(
150
+ { ruleId: rule.id, oldPattern: rule.pattern, newPattern: template.pattern },
151
+ 'Migrated starter rule pattern to current template',
152
+ );
153
+ rule.pattern = template.pattern;
154
+ changed = true;
155
+ }
156
+ return changed;
157
+ }
158
+
159
+ /** Recognises legacy starter-rule patterns that should be auto-migrated. */
160
+ function isLegacyStarterPattern(pattern: string, tool: string): boolean {
161
+ // Legacy format used "tool:**" prefixes, e.g. "file_read:**", "glob:**".
162
+ // Only match the exact legacy pattern for this specific tool to avoid
163
+ // silently resetting user-customised patterns.
164
+ return pattern === `${tool}:**`;
165
+ }
166
+
167
+ function loadFromDisk(): TrustRule[] {
168
+ const path = getTrustPath();
169
+ let rules: TrustRule[] = [];
170
+ let needsSave = false;
171
+
172
+ if (existsSync(path)) {
173
+ try {
174
+ const raw = readFileSync(path, 'utf-8');
175
+ const data = JSON.parse(raw) as TrustFile;
176
+
177
+ // Guard: ensure rules is an array (protects against hand-edited files)
178
+ const rawRules = Array.isArray(data.rules) ? data.rules : [];
179
+
180
+ // Restore persisted starter bundle flag
181
+ cachedStarterBundleAccepted = data.starterBundleAccepted === true;
182
+
183
+ if (data.version === 1) {
184
+ // Migration: v1 → v2. All existing rules are user-created → priority 100.
185
+ rules = rawRules.map((r) => ({
186
+ ...r,
187
+ priority: 100,
188
+ }));
189
+ needsSave = true;
190
+ log.info({ ruleCount: rules.length }, 'Migrated v1 trust rules to v2 (priority=100)');
191
+ // Fall through to v2 → v3 migration below
192
+ }
193
+
194
+ if (data.version === 2 || (data.version === 1 && needsSave)) {
195
+ // Migration: v2 → v3. Existing rules have no principal fields,
196
+ // which is correct — missing principal fields act as wildcards.
197
+ if (data.version === 2) {
198
+ rules = rawRules;
199
+ }
200
+ needsSave = true;
201
+ log.info({ ruleCount: rules.length }, 'Migrated v2 trust rules to v3 (principal fields)');
202
+ } else if (data.version === TRUST_FILE_VERSION) {
203
+ rules = rawRules;
204
+ } else if (data.version !== 1) {
205
+ log.warn({ version: data.version }, 'Unknown trust file version, applying defaults in-memory only');
206
+ // Apply default deny rules in-memory so the assistant is still
207
+ // protected, but do NOT persist — we must not overwrite a newer
208
+ // trust file format we don't understand.
209
+ const memRules: TrustRule[] = [];
210
+ backfillDefaults(memRules);
211
+ memRules.sort(ruleOrder);
212
+ return memRules;
213
+ }
214
+ } catch (err) {
215
+ log.error({ err }, 'Failed to load trust file');
216
+ // Fall through to backfill defaults even on parse errors
217
+ }
218
+ }
219
+
220
+ // Backfill default rules at their declared priority
221
+ if (backfillDefaults(rules)) {
222
+ needsSave = true;
223
+ }
224
+
225
+ // Migrate persisted starter rules whose pattern has drifted from the
226
+ // current template (e.g. old "tool:**" → "**").
227
+ if (migrateStarterRulePatterns(rules)) {
228
+ needsSave = true;
229
+ }
230
+
231
+ rules.sort(ruleOrder);
232
+
233
+ if (needsSave) {
234
+ try {
235
+ saveToDisk(rules);
236
+ } catch (err) {
237
+ log.warn({ err }, 'Failed to persist migrated trust rules (continuing with in-memory rules)');
238
+ }
239
+ }
240
+
241
+ return rules;
242
+ }
243
+
244
+ function saveToDisk(rules: TrustRule[]): void {
245
+ const path = getTrustPath();
246
+ const dir = dirname(path);
247
+ if (!existsSync(dir)) {
248
+ mkdirSync(dir, { recursive: true });
249
+ }
250
+ const data: TrustFile = { version: TRUST_FILE_VERSION, rules };
251
+ if (cachedStarterBundleAccepted) {
252
+ data.starterBundleAccepted = true;
253
+ }
254
+ const tmpPath = path + '.tmp.' + process.pid;
255
+ writeFileSync(tmpPath, JSON.stringify(data, null, 2), { mode: 0o600 });
256
+ renameSync(tmpPath, path);
257
+ // Enforce owner-only permissions even if the file already existed with
258
+ // wider permissions. Matches the pattern used in encrypted-store.ts.
259
+ chmodSync(path, 0o600);
260
+ }
261
+
262
+ function getRules(): TrustRule[] {
263
+ if (cachedRules === null) {
264
+ cachedRules = loadFromDisk();
265
+ }
266
+ return cachedRules;
267
+ }
268
+
269
+ export function addRule(
270
+ tool: string,
271
+ pattern: string,
272
+ scope: string,
273
+ decision: 'allow' | 'deny' | 'ask' = 'allow',
274
+ priority: number = 100,
275
+ options?: {
276
+ allowHighRisk?: boolean;
277
+ principalKind?: string;
278
+ principalId?: string;
279
+ principalVersion?: string;
280
+ executionTarget?: string;
281
+ },
282
+ ): TrustRule {
283
+ // Re-read from disk to avoid lost updates if another call modified rules
284
+ // between our last read and now (e.g. two rapid trust rule additions).
285
+ cachedRules = null;
286
+ const rules = [...getRules()];
287
+ const rule: TrustRule = {
288
+ id: uuid(),
289
+ tool,
290
+ pattern,
291
+ scope,
292
+ decision,
293
+ priority,
294
+ createdAt: Date.now(),
295
+ };
296
+ if (options?.allowHighRisk != null) {
297
+ rule.allowHighRisk = options.allowHighRisk;
298
+ }
299
+ if (options?.principalKind != null) {
300
+ rule.principalKind = options.principalKind;
301
+ }
302
+ if (options?.principalId != null) {
303
+ rule.principalId = options.principalId;
304
+ }
305
+ if (options?.principalVersion != null) {
306
+ rule.principalVersion = options.principalVersion;
307
+ }
308
+ if (options?.executionTarget != null) {
309
+ rule.executionTarget = options.executionTarget;
310
+ }
311
+ rules.push(rule);
312
+ rules.sort(ruleOrder);
313
+ cachedRules = rules;
314
+ saveToDisk(rules);
315
+ log.info({ rule }, 'Added trust rule');
316
+ return rule;
317
+ }
318
+
319
+ export function updateRule(
320
+ id: string,
321
+ updates: { tool?: string; pattern?: string; scope?: string; decision?: 'allow' | 'deny' | 'ask'; priority?: number },
322
+ ): TrustRule {
323
+ const defaultIds = new Set(getDefaultRuleTemplates().map((t) => t.id));
324
+ if (defaultIds.has(id)) throw new Error(`Cannot modify default trust rule: ${id}`);
325
+
326
+ // Re-read from disk to avoid lost updates from concurrent modifications.
327
+ cachedRules = null;
328
+ const rules = [...getRules()];
329
+ const index = rules.findIndex((r) => r.id === id);
330
+ if (index === -1) throw new Error(`Trust rule not found: ${id}`);
331
+ const rule = { ...rules[index] };
332
+ if (updates.tool != null) rule.tool = updates.tool;
333
+ if (updates.pattern != null) rule.pattern = updates.pattern;
334
+ if (updates.scope != null) rule.scope = updates.scope;
335
+ if (updates.decision != null) rule.decision = updates.decision;
336
+ if (updates.priority != null) rule.priority = updates.priority;
337
+ rules[index] = rule;
338
+ rules.sort(ruleOrder);
339
+ cachedRules = rules;
340
+ saveToDisk(rules);
341
+ log.info({ rule }, 'Updated trust rule');
342
+ return rule;
343
+ }
344
+
345
+ export function removeRule(id: string): boolean {
346
+ const defaultIds = new Set(getDefaultRuleTemplates().map((t) => t.id));
347
+ if (defaultIds.has(id)) throw new Error(`Cannot remove default trust rule: ${id}`);
348
+
349
+ // Re-read from disk to avoid lost updates from concurrent modifications.
350
+ cachedRules = null;
351
+ const rules = [...getRules()];
352
+ const index = rules.findIndex((r) => r.id === id);
353
+ if (index === -1) return false;
354
+ rules.splice(index, 1);
355
+ cachedRules = rules;
356
+ saveToDisk(rules);
357
+ log.info({ id }, 'Removed trust rule');
358
+ return true;
359
+ }
360
+
361
+ function matchesScope(ruleScope: string, workingDir: string): boolean {
362
+ if (ruleScope === 'everywhere') return true;
363
+ // Strip optional trailing wildcard, then enforce a directory-boundary match
364
+ // so that a rule for "/path/project" does NOT match "/path/project-evil".
365
+ const prefix = ruleScope.replace(/\*$/, '').replace(/\/+$/, '');
366
+ const dir = workingDir.replace(/\/+$/, '');
367
+ return dir === prefix || dir.startsWith(prefix + '/');
368
+ }
369
+
370
+ function findRuleByDecision(tool: string, command: string, scope: string, decision: 'allow' | 'deny' | 'ask'): TrustRule | null {
371
+ const rules = getRules();
372
+ for (const rule of rules) {
373
+ if (rule.tool !== tool) continue;
374
+ if (rule.decision !== decision) continue;
375
+ if (!minimatch(command, rule.pattern)) continue;
376
+ if (!matchesScope(rule.scope, scope)) continue;
377
+ return rule;
378
+ }
379
+ return null;
380
+ }
381
+
382
+ /**
383
+ * Check whether a rule's principal constraints match the given policy context.
384
+ *
385
+ * A missing field on the rule acts as a wildcard — it matches any value
386
+ * (or absence) in the context. When a rule specifies a principal field,
387
+ * the context must provide a matching value for the rule to apply.
388
+ */
389
+ function matchesPrincipal(rule: TrustRule, ctx?: PolicyContext): boolean {
390
+ // If the rule has no principal constraints it matches everything (wildcard).
391
+ if (rule.principalKind == null && rule.principalId == null && rule.principalVersion == null) {
392
+ return true;
393
+ }
394
+
395
+ const principal = ctx?.principal;
396
+
397
+ // Rule specifies a principalKind — context must supply one that matches.
398
+ if (rule.principalKind != null) {
399
+ if (principal?.kind !== rule.principalKind) return false;
400
+ }
401
+
402
+ // Rule specifies a principalId — context must supply one that matches.
403
+ if (rule.principalId != null) {
404
+ if (principal?.id !== rule.principalId) return false;
405
+ }
406
+
407
+ // Rule specifies a principalVersion — context must supply one that matches.
408
+ // If the rule omits principalVersion, any version (or none) is accepted.
409
+ if (rule.principalVersion != null) {
410
+ if (principal?.version !== rule.principalVersion) return false;
411
+ }
412
+
413
+ return true;
414
+ }
415
+
416
+ /**
417
+ * Check whether a rule's executionTarget constraint matches the context.
418
+ *
419
+ * If the rule does not specify an executionTarget it matches any target
420
+ * (wildcard). If specified, it must match exactly.
421
+ */
422
+ function matchesExecutionTarget(rule: TrustRule, ctx?: PolicyContext): boolean {
423
+ if (rule.executionTarget == null) return true;
424
+ return ctx?.executionTarget === rule.executionTarget;
425
+ }
426
+
427
+ /**
428
+ * Find the highest-priority rule that matches any of the command candidates.
429
+ * Rules are pre-sorted by priority descending, so the first match wins.
430
+ *
431
+ * When a `PolicyContext` is provided, rules that specify principal or
432
+ * executionTarget constraints are filtered accordingly. Rules without
433
+ * those constraints act as wildcards and match any context.
434
+ */
435
+ export function findHighestPriorityRule(tool: string, commands: string[], scope: string, ctx?: PolicyContext): TrustRule | null {
436
+ // Check ephemeral (task-scoped) rules first — they take precedence over
437
+ // file-based rules at the same priority because they are evaluated earlier.
438
+ // The ruleOrder sort (highest priority first, deny wins ties) still applies
439
+ // across the combined set because ephemeral rules use a lower default
440
+ // priority (50) than user rules (100), so user deny rules still win.
441
+ const ephemeral = ctx?.ephemeralRules ?? [];
442
+ const fileRules = getRules();
443
+
444
+ // Concatenate and re-sort so priority ordering is respected across both sets.
445
+ const allRules = ephemeral.length > 0
446
+ ? [...ephemeral, ...fileRules].sort(ruleOrder)
447
+ : fileRules;
448
+
449
+ for (const rule of allRules) {
450
+ if (rule.tool !== tool) continue;
451
+ if (!matchesScope(rule.scope, scope)) continue;
452
+ if (!matchesPrincipal(rule, ctx)) continue;
453
+ if (!matchesExecutionTarget(rule, ctx)) continue;
454
+ for (const command of commands) {
455
+ if (minimatch(command, rule.pattern)) {
456
+ return rule;
457
+ }
458
+ }
459
+ }
460
+ return null;
461
+ }
462
+
463
+ export function findMatchingRule(tool: string, command: string, scope: string): TrustRule | null {
464
+ return findRuleByDecision(tool, command, scope, 'allow');
465
+ }
466
+
467
+ export function findDenyRule(tool: string, command: string, scope: string): TrustRule | null {
468
+ return findRuleByDecision(tool, command, scope, 'deny');
469
+ }
470
+
471
+ export function getAllRules(): TrustRule[] {
472
+ return [...getRules()];
473
+ }
474
+
475
+ export function clearAllRules(): void {
476
+ // Reset the starter bundle flag so the bundle can be re-accepted after clear.
477
+ cachedStarterBundleAccepted = false;
478
+ // Re-backfill default rules so protected directory stays guarded.
479
+ const rules: TrustRule[] = [];
480
+ backfillDefaults(rules);
481
+ rules.sort(ruleOrder);
482
+ cachedRules = rules;
483
+ saveToDisk(rules);
484
+ log.info('Cleared all user trust rules (default rules preserved)');
485
+ }
486
+
487
+ export function clearCache(): void {
488
+ cachedRules = null;
489
+ cachedStarterBundleAccepted = null;
490
+ }
491
+
492
+ // ─── Starter approval bundle ────────────────────────────────────────────────
493
+ //
494
+ // A curated set of low-risk tool rules that most users would approve
495
+ // individually during normal use. Accepting the bundle seeds them all at
496
+ // once, reducing prompt noise in strict mode while keeping the action
497
+ // explicitly opt-in.
498
+
499
+ export interface StarterBundleRule {
500
+ id: string;
501
+ tool: string;
502
+ pattern: string;
503
+ scope: string;
504
+ decision: 'allow';
505
+ priority: number;
506
+ }
507
+
508
+ /**
509
+ * Returns the starter bundle rule definitions. These cover read-only and
510
+ * information-gathering tools that never mutate the filesystem or execute
511
+ * arbitrary code.
512
+ */
513
+ export function getStarterBundleRules(): StarterBundleRule[] {
514
+ return [
515
+ // Use standalone "**" globstar — minimatch only treats ** as globstar when
516
+ // it is its own path segment, so a "tool:**" prefix would collapse to
517
+ // single-star behavior and fail to match candidates containing "/".
518
+ // The tool field is already filtered by findHighestPriorityRule.
519
+ { id: 'starter:allow-file_read', tool: 'file_read', pattern: '**', scope: 'everywhere', decision: 'allow', priority: 90 },
520
+ { id: 'starter:allow-glob', tool: 'glob', pattern: '**', scope: 'everywhere', decision: 'allow', priority: 90 },
521
+ { id: 'starter:allow-grep', tool: 'grep', pattern: '**', scope: 'everywhere', decision: 'allow', priority: 90 },
522
+ { id: 'starter:allow-list_directory', tool: 'list_directory', pattern: '**', scope: 'everywhere', decision: 'allow', priority: 90 },
523
+ { id: 'starter:allow-web_search', tool: 'web_search', pattern: '**', scope: 'everywhere', decision: 'allow', priority: 90 },
524
+ { id: 'starter:allow-web_fetch', tool: 'web_fetch', pattern: '**', scope: 'everywhere', decision: 'allow', priority: 90 },
525
+ ];
526
+ }
527
+
528
+ /** Whether the user has previously accepted the starter bundle. */
529
+ export function isStarterBundleAccepted(): boolean {
530
+ // Ensure rules are loaded (which also loads the flag from disk)
531
+ getRules();
532
+ return cachedStarterBundleAccepted === true;
533
+ }
534
+
535
+ export interface AcceptStarterBundleResult {
536
+ accepted: boolean;
537
+ rulesAdded: number;
538
+ alreadyAccepted: boolean;
539
+ }
540
+
541
+ /**
542
+ * Seed the trust store with the starter bundle rules.
543
+ *
544
+ * Idempotent: if the bundle was already accepted, no rules are added and
545
+ * `alreadyAccepted` is returned as true. Rules whose IDs already exist
546
+ * (e.g. from a previous partial acceptance) are skipped individually.
547
+ */
548
+ export function acceptStarterBundle(): AcceptStarterBundleResult {
549
+ // Re-read from disk to avoid lost updates.
550
+ // loadFromDisk() also runs migrateStarterRulePatterns() to fix any
551
+ // stale patterns (e.g. old "tool:**" → "**") before we get here.
552
+ cachedRules = null;
553
+ cachedStarterBundleAccepted = null;
554
+ const rules = [...getRules()];
555
+
556
+ if (cachedStarterBundleAccepted === true) {
557
+ return { accepted: true, rulesAdded: 0, alreadyAccepted: true };
558
+ }
559
+
560
+ const existingIds = new Set(rules.map((r) => r.id));
561
+ let added = 0;
562
+
563
+ for (const template of getStarterBundleRules()) {
564
+ if (existingIds.has(template.id)) continue;
565
+ rules.push({
566
+ id: template.id,
567
+ tool: template.tool,
568
+ pattern: template.pattern,
569
+ scope: template.scope,
570
+ decision: template.decision,
571
+ priority: template.priority,
572
+ createdAt: Date.now(),
573
+ });
574
+ added++;
575
+ }
576
+
577
+ cachedStarterBundleAccepted = true;
578
+ rules.sort(ruleOrder);
579
+ cachedRules = rules;
580
+ saveToDisk(rules);
581
+ log.info({ rulesAdded: added }, 'Starter approval bundle accepted');
582
+
583
+ return { accepted: true, rulesAdded: added, alreadyAccepted: false };
584
+ }
@@ -0,0 +1,62 @@
1
+ export enum RiskLevel {
2
+ Low = 'low',
3
+ Medium = 'medium',
4
+ High = 'high',
5
+ }
6
+
7
+ export interface TrustRule {
8
+ id: string;
9
+ tool: string;
10
+ pattern: string;
11
+ scope: string;
12
+ decision: 'allow' | 'deny' | 'ask';
13
+ priority: number;
14
+ createdAt: number;
15
+ // v3 fields — optional for backward compatibility with v2 rules
16
+ principalKind?: string;
17
+ principalId?: string;
18
+ principalVersion?: string;
19
+ executionTarget?: string;
20
+ allowHighRisk?: boolean;
21
+ }
22
+
23
+ export type UserDecision = 'allow' | 'always_allow' | 'always_allow_high_risk' | 'deny' | 'always_deny';
24
+
25
+ export interface PermissionCheckResult {
26
+ decision: 'allow' | 'deny' | 'prompt';
27
+ reason: string;
28
+ matchedRule?: TrustRule;
29
+ }
30
+
31
+ export interface AllowlistOption {
32
+ label: string;
33
+ description: string;
34
+ pattern: string;
35
+ }
36
+
37
+ export interface ScopeOption {
38
+ label: string;
39
+ scope: string;
40
+ }
41
+
42
+ // ── Principal + policy context types (PR 3) ──────────────────
43
+
44
+ /** Distinguishes whether a tool is a built-in core tool, provided by a skill, or scoped to a one-shot task. */
45
+ export type ToolPrincipalKind = 'core' | 'skill' | 'task';
46
+
47
+ /** Identifies the security principal that owns a tool invocation. */
48
+ export interface ToolPrincipal {
49
+ kind: ToolPrincipalKind;
50
+ /** Skill ID when kind is 'skill'; task ID when kind is 'task'. */
51
+ id?: string;
52
+ /** Content-hash of the skill source at the time of approval. */
53
+ version?: string;
54
+ }
55
+
56
+ /** Contextual information passed alongside a permission check for policy decisions. */
57
+ export interface PolicyContext {
58
+ principal?: ToolPrincipal;
59
+ executionTarget?: string;
60
+ /** Ephemeral rules for task-scoped permissions — checked before persistent trust.json rules. */
61
+ ephemeralRules?: TrustRule[];
62
+ }
@@ -0,0 +1,2 @@
1
+ export { type Playbook, type PlaybookAutonomyLevel, parsePlaybookStatement } from './types.js';
2
+ export { compilePlaybooks, type CompiledPlaybooks, type CompilePlaybooksOptions } from './playbook-compiler.js';