@vellumai/assistant 0.7.1 → 0.7.3

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 (739) hide show
  1. package/ARCHITECTURE.md +48 -50
  2. package/Dockerfile +1 -0
  3. package/README.md +1 -2
  4. package/__tests__/permissions/gateway-threshold-reader.test.ts +9 -3
  5. package/bun.lock +26 -26
  6. package/docs/architecture/memory.md +5 -2
  7. package/docs/architecture/security.md +20 -0
  8. package/docs/plugins.md +7 -9
  9. package/knip.json +1 -0
  10. package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
  11. package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +52 -5
  12. package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
  13. package/node_modules/@vellumai/service-contracts/package.json +2 -0
  14. package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
  15. package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
  16. package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
  17. package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
  18. package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -0
  19. package/node_modules/@vellumai/slack-text/src/index.test.ts +18 -35
  20. package/node_modules/@vellumai/slack-text/src/index.ts +2 -48
  21. package/node_modules/@vellumai/twilio-client/bun.lock +24 -0
  22. package/node_modules/@vellumai/twilio-client/package.json +18 -0
  23. package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
  24. package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
  25. package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
  26. package/openapi.yaml +1020 -40
  27. package/package.json +6 -3
  28. package/src/__tests__/app-builder-tool-scripts.test.ts +3 -3
  29. package/src/__tests__/app-bundler.test.ts +170 -1
  30. package/src/__tests__/app-control-flow.test.ts +384 -0
  31. package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
  32. package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
  33. package/src/__tests__/app-executors.test.ts +30 -43
  34. package/src/__tests__/approval-routes-http.test.ts +23 -6
  35. package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
  36. package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
  37. package/src/__tests__/assistant-event-hub.test.ts +157 -2
  38. package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -7
  39. package/src/__tests__/auto-analysis-end-to-end.test.ts +62 -1
  40. package/src/__tests__/background-shell-host-bash.test.ts +14 -15
  41. package/src/__tests__/background-workers-disk-pressure.test.ts +268 -0
  42. package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
  43. package/src/__tests__/btw-routes.test.ts +13 -4
  44. package/src/__tests__/call-controller.test.ts +49 -1
  45. package/src/__tests__/call-conversation-messages.test.ts +8 -2
  46. package/src/__tests__/call-domain.test.ts +0 -2
  47. package/src/__tests__/call-routes-http.test.ts +0 -2
  48. package/src/__tests__/channel-inbound-disk-pressure.test.ts +537 -0
  49. package/src/__tests__/channel-readiness-service.test.ts +62 -2
  50. package/src/__tests__/checker.test.ts +3 -4
  51. package/src/__tests__/config-loader-backfill.test.ts +461 -147
  52. package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
  53. package/src/__tests__/config-schema-cmd.test.ts +0 -1
  54. package/src/__tests__/config-schema.test.ts +1 -0
  55. package/src/__tests__/config-set-platform-guard.test.ts +48 -4
  56. package/src/__tests__/config-watcher-cleanup-throttle.test.ts +20 -11
  57. package/src/__tests__/config-watcher.test.ts +142 -71
  58. package/src/__tests__/context-search-agent-runner.test.ts +61 -3
  59. package/src/__tests__/context-search-conversations-source.test.ts +0 -24
  60. package/src/__tests__/context-search-fanout.test.ts +0 -1
  61. package/src/__tests__/context-search-memory-source.test.ts +3 -7
  62. package/src/__tests__/context-search-memory-v2-source.test.ts +0 -2
  63. package/src/__tests__/context-search-pkb-source.test.ts +0 -1
  64. package/src/__tests__/context-search-workspace-source.test.ts +0 -1
  65. package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
  66. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +223 -0
  67. package/src/__tests__/conversation-agent-loop.test.ts +454 -5
  68. package/src/__tests__/conversation-app-control-instantiation.test.ts +392 -0
  69. package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
  70. package/src/__tests__/conversation-error.test.ts +150 -3
  71. package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
  72. package/src/__tests__/conversation-lifecycle.test.ts +36 -0
  73. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
  74. package/src/__tests__/conversation-process-callsite.test.ts +43 -0
  75. package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
  76. package/src/__tests__/conversation-routes-disk-view.test.ts +6 -0
  77. package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -72
  78. package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
  79. package/src/__tests__/conversation-runtime-assembly.test.ts +65 -0
  80. package/src/__tests__/conversation-slash-commands.test.ts +0 -4
  81. package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
  82. package/src/__tests__/conversation-speed-override.test.ts +0 -3
  83. package/src/__tests__/conversation-store.test.ts +0 -18
  84. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
  85. package/src/__tests__/conversation-surfaces-app-control.test.ts +328 -0
  86. package/src/__tests__/conversation-surfaces-data-persist.test.ts +404 -0
  87. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +2 -5
  88. package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
  89. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
  90. package/src/__tests__/credential-execution-feature-gates.test.ts +5 -12
  91. package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
  92. package/src/__tests__/credentials-cli.test.ts +12 -12
  93. package/src/__tests__/cu-unified-flow.test.ts +351 -23
  94. package/src/__tests__/daemon-credential-client.test.ts +101 -19
  95. package/src/__tests__/date-context.test.ts +164 -2
  96. package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
  97. package/src/__tests__/disk-pressure-guard.test.ts +262 -0
  98. package/src/__tests__/disk-pressure-lifecycle.test.ts +168 -0
  99. package/src/__tests__/disk-pressure-policy.test.ts +241 -0
  100. package/src/__tests__/disk-pressure-routes.test.ts +379 -0
  101. package/src/__tests__/disk-pressure-tools.test.ts +277 -0
  102. package/src/__tests__/disk-usage.test.ts +150 -0
  103. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  104. package/src/__tests__/events-client-registration.test.ts +52 -0
  105. package/src/__tests__/events-dev-bypass-actor.test.ts +162 -0
  106. package/src/__tests__/file-write-tool.test.ts +4 -10
  107. package/src/__tests__/filing-service.test.ts +3 -4
  108. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  109. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -2
  110. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -2
  111. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -1
  112. package/src/__tests__/heartbeat-disk-pressure.test.ts +183 -0
  113. package/src/__tests__/heartbeat-service.test.ts +968 -2
  114. package/src/__tests__/helpers/call-route-handler.ts +7 -1
  115. package/src/__tests__/host-app-control-proxy.test.ts +772 -0
  116. package/src/__tests__/host-app-control-routes.test.ts +263 -0
  117. package/src/__tests__/host-bash-proxy.test.ts +439 -47
  118. package/src/__tests__/host-bash-routes.test.ts +459 -0
  119. package/src/__tests__/host-browser-proxy.test.ts +24 -22
  120. package/src/__tests__/host-browser-routes.test.ts +39 -13
  121. package/src/__tests__/host-cu-proxy.test.ts +248 -52
  122. package/src/__tests__/host-cu-routes-targeted.test.ts +429 -0
  123. package/src/__tests__/host-file-edit-tool.test.ts +47 -1
  124. package/src/__tests__/host-file-proxy-targeted.test.ts +378 -0
  125. package/src/__tests__/host-file-proxy.test.ts +301 -45
  126. package/src/__tests__/host-file-read-tool.test.ts +17 -0
  127. package/src/__tests__/host-file-routes-targeted.test.ts +420 -0
  128. package/src/__tests__/host-file-write-tool.test.ts +42 -1
  129. package/src/__tests__/host-proxy-base.test.ts +312 -0
  130. package/src/__tests__/host-shell-tool.test.ts +22 -4
  131. package/src/__tests__/host-transfer-proxy-targeted.test.ts +932 -0
  132. package/src/__tests__/host-transfer-proxy.test.ts +121 -22
  133. package/src/__tests__/host-transfer-routes-targeted.test.ts +662 -0
  134. package/src/__tests__/http-user-message-parity.test.ts +108 -1
  135. package/src/__tests__/identity-intro-cache.test.ts +29 -0
  136. package/src/__tests__/identity-routes.test.ts +103 -1
  137. package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
  138. package/src/__tests__/injector-chain.test.ts +18 -6
  139. package/src/__tests__/injector-disk-pressure.test.ts +224 -0
  140. package/src/__tests__/inline-command-runner.test.ts +0 -1
  141. package/src/__tests__/inline-skill-load-permissions.test.ts +5 -11
  142. package/src/__tests__/integration-status.test.ts +85 -5
  143. package/src/__tests__/intent-routing.test.ts +0 -1
  144. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
  145. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
  146. package/src/__tests__/managed-profile-guard.test.ts +18 -0
  147. package/src/__tests__/managed-skill-lifecycle.test.ts +0 -1
  148. package/src/__tests__/mcp-abort-signal.test.ts +130 -0
  149. package/src/__tests__/mcp-auth-routes.test.ts +197 -0
  150. package/src/__tests__/mcp-cli.test.ts +338 -2
  151. package/src/__tests__/memory-admin-recall.test.ts +3 -11
  152. package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
  153. package/src/__tests__/memory-retrieval-pipeline.test.ts +22 -1
  154. package/src/__tests__/migration-import-commit-http.test.ts +108 -2
  155. package/src/__tests__/mock-gateway-ipc.ts +1 -0
  156. package/src/__tests__/normalize-onboarding.test.ts +180 -0
  157. package/src/__tests__/oauth-cli.test.ts +0 -2
  158. package/src/__tests__/oauth-connect-routes.test.ts +316 -0
  159. package/src/__tests__/oauth-provider-seed-logos.test.ts +24 -2
  160. package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
  161. package/src/__tests__/onboarding-persona-write.test.ts +308 -0
  162. package/src/__tests__/openai-provider.test.ts +45 -8
  163. package/src/__tests__/persist-onboarding-artifacts.test.ts +44 -64
  164. package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
  165. package/src/__tests__/platform-bash-auto-approve.test.ts +5 -9
  166. package/src/__tests__/platform-callback-registration.test.ts +21 -4
  167. package/src/__tests__/platform.test.ts +2 -1
  168. package/src/__tests__/playbook-execution.test.ts +0 -43
  169. package/src/__tests__/plugin-tool-contribution.test.ts +47 -0
  170. package/src/__tests__/prechat-onboarding-contract.test.ts +214 -25
  171. package/src/__tests__/process-message-background-slack.test.ts +2 -0
  172. package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
  173. package/src/__tests__/provider-tool-name.test.ts +23 -0
  174. package/src/__tests__/public-ingress-urls.test.ts +97 -0
  175. package/src/__tests__/relay-server.test.ts +15 -4
  176. package/src/__tests__/require-fresh-approval.test.ts +0 -1
  177. package/src/__tests__/retry-backoff.test.ts +87 -0
  178. package/src/__tests__/runtime-events-sse.test.ts +2 -2
  179. package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
  180. package/src/__tests__/schedule-retry.test.ts +715 -0
  181. package/src/__tests__/scheduler-disk-pressure.test.ts +148 -0
  182. package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
  183. package/src/__tests__/secret-ingress-http.test.ts +1 -1
  184. package/src/__tests__/send-endpoint-busy.test.ts +3 -0
  185. package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -1
  186. package/src/__tests__/skill-feature-flags.test.ts +43 -41
  187. package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
  188. package/src/__tests__/skill-load-inline-command.test.ts +0 -51
  189. package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
  190. package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
  191. package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -1
  192. package/src/__tests__/slack-channel-config.test.ts +9 -14
  193. package/src/__tests__/suggestion-routes.test.ts +46 -0
  194. package/src/__tests__/system-prompt-ask-mode.test.ts +0 -1
  195. package/src/__tests__/system-prompt.test.ts +0 -1
  196. package/src/__tests__/telegram-config.test.ts +0 -1
  197. package/src/__tests__/test-preload.ts +8 -0
  198. package/src/__tests__/tool-approval-handler.test.ts +3 -4
  199. package/src/__tests__/tool-audit-listener.test.ts +48 -0
  200. package/src/__tests__/tool-execute-pipeline.test.ts +0 -1
  201. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  202. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
  203. package/src/__tests__/tool-executor.test.ts +0 -1
  204. package/src/__tests__/twilio-config.test.ts +3 -16
  205. package/src/__tests__/twilio-routes.test.ts +3 -5
  206. package/src/__tests__/twilio-validation.test.ts +93 -0
  207. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +1 -4
  208. package/src/__tests__/verification-control-plane-policy.test.ts +2 -4
  209. package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
  210. package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
  211. package/src/__tests__/workspace-migration-065-bump-stale-heartbeat-interval.test.ts +122 -0
  212. package/src/__tests__/workspace-migration-066-seed-heartbeat-callsite-cost-default.test.ts +285 -0
  213. package/src/__tests__/workspace-migration-068-release-notes-local-timezone.test.ts +90 -0
  214. package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -5
  215. package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
  216. package/src/__tests__/workspace-migration-safe-storage-limits-release.test.ts +90 -0
  217. package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
  218. package/src/approvals/guardian-decision-primitive.ts +13 -0
  219. package/src/approvals/guardian-request-resolvers.ts +16 -17
  220. package/src/backup/__tests__/paths.test.ts +0 -22
  221. package/src/backup/__tests__/restore.test.ts +51 -151
  222. package/src/backup/paths.ts +2 -18
  223. package/src/backup/restore.ts +107 -231
  224. package/src/backup/snapshot-lock.ts +2 -27
  225. package/src/bundler/app-bundler.ts +51 -3
  226. package/src/bundler/compiler-tools.ts +3 -2
  227. package/src/calls/call-conversation-messages.ts +46 -10
  228. package/src/calls/relay-server.ts +4 -44
  229. package/src/calls/twilio-config.ts +2 -17
  230. package/src/calls/twilio-rest.ts +33 -105
  231. package/src/calls/twilio-routes.ts +11 -12
  232. package/src/channels/types.ts +8 -7
  233. package/src/cli/commands/__tests__/backup.test.ts +6 -277
  234. package/src/cli/commands/__tests__/gateway.test.ts +288 -0
  235. package/src/cli/commands/__tests__/memory-v2.test.ts +4 -0
  236. package/src/cli/commands/__tests__/webhooks.test.ts +0 -5
  237. package/src/cli/commands/backup.ts +6 -331
  238. package/src/cli/commands/bash.ts +35 -108
  239. package/src/cli/commands/clients.ts +36 -37
  240. package/src/cli/commands/contacts.ts +137 -25
  241. package/src/cli/commands/conversations.ts +2 -5
  242. package/src/cli/commands/credentials.ts +71 -7
  243. package/src/cli/commands/domain.ts +66 -15
  244. package/src/cli/commands/gateway.ts +183 -0
  245. package/src/cli/commands/keys.ts +9 -6
  246. package/src/cli/commands/mcp.ts +116 -156
  247. package/src/cli/commands/memory-v2.ts +303 -7
  248. package/src/cli/commands/oauth/__tests__/connect.test.ts +437 -1
  249. package/src/cli/commands/oauth/connect.ts +127 -1
  250. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -4
  251. package/src/cli/commands/platform/__tests__/connect.test.ts +7 -3
  252. package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -3
  253. package/src/cli/commands/platform/__tests__/status.test.ts +116 -21
  254. package/src/cli/commands/platform/disconnect.ts +5 -4
  255. package/src/cli/commands/platform/index.ts +16 -25
  256. package/src/cli/commands/status.ts +57 -0
  257. package/src/cli/lib/daemon-credential-client.ts +110 -28
  258. package/src/cli/program.ts +6 -2
  259. package/src/config/assistant-feature-flags.ts +79 -12
  260. package/src/config/bundled-skills/acp/SKILL.md +6 -0
  261. package/src/config/bundled-skills/acp/TOOLS.json +1 -22
  262. package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
  263. package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
  264. package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
  265. package/src/config/bundled-skills/app-control/SKILL.md +75 -0
  266. package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
  267. package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
  268. package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
  269. package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
  270. package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
  271. package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
  272. package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
  273. package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
  274. package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
  275. package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
  276. package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
  277. package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
  278. package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
  279. package/src/config/bundled-skills/document/TOOLS.json +0 -8
  280. package/src/config/bundled-skills/followups/TOOLS.json +0 -12
  281. package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
  282. package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
  283. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
  284. package/src/config/bundled-skills/messaging/TOOLS.json +0 -40
  285. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -3
  286. package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
  287. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +25 -4
  288. package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
  289. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +2 -2
  290. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +2 -2
  291. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +2 -2
  292. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +2 -2
  293. package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
  294. package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
  295. package/src/config/bundled-skills/settings/SKILL.md +4 -0
  296. package/src/config/bundled-skills/settings/TOOLS.json +0 -12
  297. package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
  298. package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
  299. package/src/config/bundled-skills/subagent/SKILL.md +6 -2
  300. package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
  301. package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
  302. package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
  303. package/src/config/bundled-tool-registry.ts +21 -0
  304. package/src/config/env-registry.ts +0 -2
  305. package/src/config/env.ts +19 -20
  306. package/src/config/feature-flag-registry.json +47 -135
  307. package/src/config/loader.ts +197 -104
  308. package/src/config/sanitize-for-transfer.ts +2 -0
  309. package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
  310. package/src/config/schemas/__tests__/memory-v2.test.ts +17 -9
  311. package/src/config/schemas/call-site-catalog.ts +14 -0
  312. package/src/config/schemas/calls.ts +0 -9
  313. package/src/config/schemas/channels.ts +0 -5
  314. package/src/config/schemas/heartbeat.ts +64 -1
  315. package/src/config/schemas/ingress.ts +10 -6
  316. package/src/config/schemas/llm.ts +7 -10
  317. package/src/config/schemas/memory-lifecycle.ts +90 -24
  318. package/src/config/schemas/memory-v2.ts +121 -13
  319. package/src/config/schemas/platform.ts +49 -3
  320. package/src/config/schemas/services.ts +29 -15
  321. package/src/config/schemas/skills.ts +0 -6
  322. package/src/config/seed-inference-profiles.ts +230 -33
  323. package/src/contacts/contact-store.ts +0 -55
  324. package/src/contacts/contacts-write.ts +0 -27
  325. package/src/context/window-manager.ts +1 -2
  326. package/src/credential-execution/feature-gates.ts +10 -10
  327. package/src/credential-execution/process-manager.ts +12 -41
  328. package/src/daemon/__tests__/conversation-tool-setup.test.ts +187 -5
  329. package/src/daemon/assistant-attachments.ts +4 -4
  330. package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
  331. package/src/daemon/config-watcher.ts +89 -60
  332. package/src/daemon/conversation-agent-loop-handlers.ts +27 -3
  333. package/src/daemon/conversation-agent-loop.ts +202 -61
  334. package/src/daemon/conversation-error.ts +87 -15
  335. package/src/daemon/conversation-lifecycle.ts +9 -4
  336. package/src/daemon/conversation-process.ts +24 -11
  337. package/src/daemon/conversation-runtime-assembly.ts +28 -2
  338. package/src/daemon/conversation-store.ts +2 -2
  339. package/src/daemon/conversation-surfaces.ts +305 -4
  340. package/src/daemon/conversation-tool-setup.ts +66 -62
  341. package/src/daemon/conversation.ts +38 -24
  342. package/src/daemon/date-context.ts +71 -22
  343. package/src/daemon/disk-pressure-background-gate.ts +73 -0
  344. package/src/daemon/disk-pressure-guard.ts +343 -0
  345. package/src/daemon/disk-pressure-policy.ts +163 -0
  346. package/src/daemon/doordash-steps.ts +1 -1
  347. package/src/daemon/handlers/shared.ts +4 -2
  348. package/src/daemon/handlers/skills.ts +3 -4
  349. package/src/daemon/host-app-control-proxy.ts +389 -0
  350. package/src/daemon/host-bash-proxy.ts +117 -82
  351. package/src/daemon/host-browser-proxy.ts +67 -82
  352. package/src/daemon/host-cu-proxy.ts +127 -86
  353. package/src/daemon/host-file-proxy.ts +129 -69
  354. package/src/daemon/host-proxy-base.ts +294 -0
  355. package/src/daemon/host-proxy-preactivation.ts +82 -0
  356. package/src/daemon/host-transfer-proxy.ts +338 -129
  357. package/src/daemon/lifecycle.ts +194 -145
  358. package/src/daemon/meet-host-supervisor.ts +4 -4
  359. package/src/daemon/meet-manifest-loader.ts +0 -1
  360. package/src/daemon/memory-v2-startup.ts +14 -4
  361. package/src/daemon/message-protocol.ts +6 -8
  362. package/src/daemon/message-types/contacts.ts +23 -1
  363. package/src/daemon/message-types/conversations.ts +15 -8
  364. package/src/daemon/message-types/disk-pressure.ts +9 -0
  365. package/src/daemon/message-types/host-app-control.ts +150 -0
  366. package/src/daemon/message-types/host-bash.ts +4 -0
  367. package/src/daemon/message-types/host-cu.ts +2 -0
  368. package/src/daemon/message-types/host-file.ts +4 -0
  369. package/src/daemon/message-types/host-transfer.ts +3 -0
  370. package/src/daemon/message-types/messages.ts +3 -0
  371. package/src/daemon/message-types/schedules.ts +8 -3
  372. package/src/daemon/message-types/skills.ts +2 -2
  373. package/src/daemon/process-message.ts +18 -1
  374. package/src/daemon/profiler-run-store.ts +5 -5
  375. package/src/daemon/shutdown-handlers.ts +0 -3
  376. package/src/daemon/tool-setup-types.ts +51 -0
  377. package/src/daemon/tool-side-effects.ts +1 -1
  378. package/src/documents/document-store.ts +85 -0
  379. package/src/events/tool-audit-listener.ts +2 -1
  380. package/src/filing/filing-service.ts +30 -5
  381. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +24 -23
  382. package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +252 -0
  383. package/src/heartbeat/heartbeat-run-store.ts +249 -0
  384. package/src/heartbeat/heartbeat-service.ts +459 -54
  385. package/src/home/__tests__/post-connect-feed.test.ts +99 -0
  386. package/src/home/__tests__/relationship-state-writer.test.ts +11 -9
  387. package/src/home/__tests__/suggested-prompts.test.ts +89 -0
  388. package/src/home/feed-scheduler.ts +18 -0
  389. package/src/home/post-connect-feed.ts +68 -0
  390. package/src/home/relationship-state-writer.ts +17 -92
  391. package/src/home/suggested-prompts.ts +46 -10
  392. package/src/inbound/platform-callback-registration.ts +8 -15
  393. package/src/inbound/public-ingress-urls.ts +32 -34
  394. package/src/ipc/__tests__/clients-list-ipc.test.ts +169 -0
  395. package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
  396. package/src/ipc/assistant-server.ts +70 -3
  397. package/src/ipc/cli-client.ts +32 -1
  398. package/src/ipc/gateway-client.ts +37 -3
  399. package/src/live-voice/live-voice-archive.ts +4 -4
  400. package/src/live-voice/live-voice-metrics.ts +10 -10
  401. package/src/live-voice/protocol.ts +5 -7
  402. package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
  403. package/src/mcp/mcp-auth-orchestrator.ts +213 -0
  404. package/src/mcp/mcp-auth-state.ts +133 -0
  405. package/src/mcp/mcp-oauth-provider.ts +19 -0
  406. package/src/media/image-service.ts +1 -7
  407. package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +21 -13
  408. package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
  409. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +52 -22
  410. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -6
  411. package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +272 -0
  412. package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
  413. package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
  414. package/src/memory/admin.ts +5 -9
  415. package/src/memory/anisotropy.test.ts +247 -0
  416. package/src/memory/anisotropy.ts +443 -0
  417. package/src/memory/auto-analysis-constants.ts +17 -0
  418. package/src/memory/auto-analysis-guard.ts +5 -15
  419. package/src/memory/canonical-guardian-store.ts +7 -7
  420. package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
  421. package/src/memory/context-search/agent-protocol.ts +6 -6
  422. package/src/memory/context-search/agent-runner.ts +51 -9
  423. package/src/memory/context-search/sources/conversations.ts +2 -11
  424. package/src/memory/context-search/sources/memory-v2.ts +22 -9
  425. package/src/memory/context-search/sources/memory.ts +0 -1
  426. package/src/memory/context-search/types.ts +0 -1
  427. package/src/memory/conversation-crud.ts +5 -13
  428. package/src/memory/conversation-key-store.ts +2 -15
  429. package/src/memory/db-init.ts +6 -0
  430. package/src/memory/embedding-backend.ts +9 -21
  431. package/src/memory/embedding-runtime-manager.ts +119 -5
  432. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +81 -25
  433. package/src/memory/graph/conversation-graph-memory.ts +43 -78
  434. package/src/memory/graph/extraction.ts +1 -3
  435. package/src/memory/graph/graph-search.test.ts +10 -67
  436. package/src/memory/graph/graph-search.ts +9 -20
  437. package/src/memory/graph/retriever.test.ts +6 -0
  438. package/src/memory/graph/retriever.ts +34 -10
  439. package/src/memory/graph/tools.ts +1 -1
  440. package/src/memory/indexer.ts +54 -45
  441. package/src/memory/job-handlers/backfill.ts +2 -11
  442. package/src/memory/job-handlers/cleanup.ts +43 -0
  443. package/src/memory/job-handlers/embedding.ts +6 -8
  444. package/src/memory/job-handlers/summarization.ts +2 -7
  445. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +8 -2
  446. package/src/memory/jobs/embed-concept-page.ts +28 -2
  447. package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
  448. package/src/memory/jobs-store.ts +114 -22
  449. package/src/memory/jobs-worker.ts +193 -106
  450. package/src/memory/memory-v2-activation-log-store.ts +33 -15
  451. package/src/memory/memory-v2-concept-frequency.ts +169 -0
  452. package/src/memory/migrations/237-heartbeat-runs.ts +45 -0
  453. package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
  454. package/src/memory/migrations/239-trace-events-created-at-index.ts +18 -0
  455. package/src/memory/migrations/index.ts +6 -0
  456. package/src/memory/migrations/registry.ts +8 -0
  457. package/src/memory/pkb/pkb-search.test.ts +6 -0
  458. package/src/memory/pkb/pkb-search.ts +7 -0
  459. package/src/memory/qdrant-client.ts +49 -32
  460. package/src/memory/rerank-local.ts +374 -0
  461. package/src/memory/schema/infrastructure.ts +15 -0
  462. package/src/memory/search/semantic.ts +13 -67
  463. package/src/memory/sparse-tokenize.ts +49 -0
  464. package/src/memory/trace-event-store.ts +1 -17
  465. package/src/memory/v2/__tests__/activation.test.ts +387 -344
  466. package/src/memory/v2/__tests__/consolidation-job.test.ts +40 -8
  467. package/src/memory/v2/__tests__/injection.test.ts +181 -169
  468. package/src/memory/v2/__tests__/prompts-consolidation.test.ts +61 -2
  469. package/src/memory/v2/__tests__/qdrant.test.ts +16 -0
  470. package/src/memory/v2/__tests__/reranker.test.ts +338 -0
  471. package/src/memory/v2/__tests__/sim.test.ts +154 -188
  472. package/src/memory/v2/__tests__/skill-store.test.ts +71 -65
  473. package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
  474. package/src/memory/v2/__tests__/static-context.test.ts +76 -2
  475. package/src/memory/v2/activation.ts +213 -239
  476. package/src/memory/v2/consolidation-job.ts +65 -17
  477. package/src/memory/v2/constants.ts +7 -0
  478. package/src/memory/v2/injection.ts +123 -103
  479. package/src/memory/v2/prompts/consolidation.ts +348 -92
  480. package/src/memory/v2/qdrant.ts +198 -1
  481. package/src/memory/v2/reranker.ts +177 -0
  482. package/src/memory/v2/sim.ts +113 -77
  483. package/src/memory/v2/skill-content.ts +4 -3
  484. package/src/memory/v2/skill-store.ts +91 -53
  485. package/src/memory/v2/sparse-bm25.ts +245 -0
  486. package/src/memory/v2/static-context.ts +28 -5
  487. package/src/memory/v2/types.ts +10 -10
  488. package/src/messaging/providers/gmail/types.ts +0 -49
  489. package/src/messaging/providers/slack/adapter.ts +1 -31
  490. package/src/messaging/providers/slack/types.ts +0 -32
  491. package/src/notifications/README.md +10 -10
  492. package/src/notifications/broadcaster.ts +1 -1
  493. package/src/notifications/copy-composer.ts +13 -0
  494. package/src/notifications/guardian-question-mode.ts +5 -5
  495. package/src/notifications/signal.ts +4 -0
  496. package/src/oauth/AGENTS.md +3 -1
  497. package/src/oauth/__tests__/oauth-connect-state.test.ts +137 -0
  498. package/src/oauth/connect-orchestrator.ts +6 -0
  499. package/src/oauth/connection-resolver.test.ts +66 -1
  500. package/src/oauth/connection-resolver.ts +55 -1
  501. package/src/oauth/credential-token-resolver.ts +1 -3
  502. package/src/oauth/manual-token-connection.ts +0 -4
  503. package/src/oauth/oauth-connect-state.ts +77 -0
  504. package/src/oauth/seed-providers.ts +58 -1
  505. package/src/outbound-proxy/index.ts +1 -37
  506. package/src/outbound-proxy/logging.ts +1 -1
  507. package/src/outbound-proxy/policy.ts +6 -5
  508. package/src/outbound-proxy/router.ts +2 -1
  509. package/src/permissions/approval-policy.test.ts +6 -275
  510. package/src/permissions/approval-policy.ts +0 -51
  511. package/src/permissions/checker.test.ts +0 -1
  512. package/src/permissions/checker.ts +3 -17
  513. package/src/permissions/gateway-threshold-reader.ts +2 -0
  514. package/src/permissions/prompter.ts +34 -1
  515. package/src/permissions/secret-prompter.ts +6 -2
  516. package/src/plugins/defaults/injectors.ts +35 -2
  517. package/src/plugins/defaults/memory-retrieval.ts +5 -6
  518. package/src/plugins/types.ts +7 -0
  519. package/src/proactive-artifact/aux-message-injector.ts +74 -0
  520. package/src/proactive-artifact/decision.test.ts +226 -0
  521. package/src/proactive-artifact/decision.ts +165 -0
  522. package/src/proactive-artifact/index.ts +7 -0
  523. package/src/proactive-artifact/job.test.ts +867 -0
  524. package/src/proactive-artifact/job.ts +352 -0
  525. package/src/proactive-artifact/message-copy.ts +41 -0
  526. package/src/proactive-artifact/trigger-state.test.ts +277 -0
  527. package/src/proactive-artifact/trigger-state.ts +119 -0
  528. package/src/prompts/bootstrap-cleanup.ts +27 -0
  529. package/src/prompts/normalize-onboarding.ts +80 -0
  530. package/src/prompts/persona-resolver.ts +101 -9
  531. package/src/prompts/system-prompt.ts +23 -24
  532. package/src/prompts/templates/BOOTSTRAP.md +13 -5
  533. package/src/prompts/templates/SOUL.md +13 -1
  534. package/src/providers/__tests__/retry-callsite.test.ts +222 -1
  535. package/src/providers/model-intents.ts +7 -0
  536. package/src/providers/openrouter/client.ts +8 -0
  537. package/src/providers/retry.ts +50 -0
  538. package/src/providers/speech-to-text/provider-catalog.ts +7 -8
  539. package/src/providers/types.ts +1 -0
  540. package/src/runtime/__tests__/agent-wake.test.ts +456 -3
  541. package/src/runtime/agent-wake.ts +238 -100
  542. package/src/runtime/assistant-event-hub.ts +151 -99
  543. package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
  544. package/src/runtime/auth/__tests__/route-policy.test.ts +64 -0
  545. package/src/runtime/auth/middleware.ts +0 -96
  546. package/src/runtime/auth/route-policy.ts +32 -0
  547. package/src/runtime/auth/same-actor.ts +216 -0
  548. package/src/runtime/btw-sidechain.ts +2 -3
  549. package/src/runtime/channel-invite-transport.ts +2 -48
  550. package/src/runtime/channel-invite-transports/email.ts +1 -1
  551. package/src/runtime/channel-invite-transports/slack.ts +1 -1
  552. package/src/runtime/channel-invite-transports/telegram.ts +1 -1
  553. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  554. package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
  555. package/src/runtime/channel-invite-types.ts +54 -0
  556. package/src/runtime/channel-readiness-service.ts +32 -13
  557. package/src/runtime/channel-retry-sweep.ts +65 -1
  558. package/src/runtime/guardian-reply-router.ts +10 -0
  559. package/src/runtime/http-server.ts +3 -329
  560. package/src/runtime/http-types.ts +0 -5
  561. package/src/runtime/local-actor-identity.ts +52 -11
  562. package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +413 -0
  563. package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
  564. package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
  565. package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +153 -1
  566. package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
  567. package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
  568. package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
  569. package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
  570. package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
  571. package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +51 -1
  572. package/src/runtime/migrations/migration-transport.ts +7 -7
  573. package/src/runtime/migrations/vbundle-builder.ts +327 -60
  574. package/src/runtime/migrations/vbundle-import-analyzer.ts +4 -4
  575. package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
  576. package/src/runtime/migrations/vbundle-importer.ts +245 -68
  577. package/src/runtime/migrations/vbundle-streaming-importer.ts +326 -35
  578. package/src/runtime/migrations/vbundle-streaming-validator.ts +157 -4
  579. package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
  580. package/src/runtime/migrations/vbundle-validator.ts +114 -0
  581. package/src/runtime/pending-interactions.ts +43 -9
  582. package/src/runtime/routes/__tests__/backup-routes.test.ts +22 -150
  583. package/src/runtime/routes/__tests__/client-routes.test.ts +155 -0
  584. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -5
  585. package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
  586. package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -0
  587. package/src/runtime/routes/approval-interception-types.ts +13 -0
  588. package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
  589. package/src/runtime/routes/backup-routes.ts +15 -38
  590. package/src/runtime/routes/btw-routes.ts +14 -37
  591. package/src/runtime/routes/client-routes.ts +21 -2
  592. package/src/runtime/routes/contact-prompt-routes.ts +183 -0
  593. package/src/runtime/routes/contact-routes.ts +0 -25
  594. package/src/runtime/routes/conversation-query-routes.ts +36 -1
  595. package/src/runtime/routes/conversation-routes.ts +65 -39
  596. package/src/runtime/routes/debug-bash-routes.ts +163 -0
  597. package/src/runtime/routes/disk-pressure-routes.ts +121 -0
  598. package/src/runtime/routes/document-pdf-renderer.ts +169 -0
  599. package/src/runtime/routes/documents-routes.ts +32 -75
  600. package/src/runtime/routes/errors.ts +19 -4
  601. package/src/runtime/routes/events-routes.ts +38 -0
  602. package/src/runtime/routes/gateway-log-routes.ts +79 -0
  603. package/src/runtime/routes/guardian-approval-interception.ts +2 -8
  604. package/src/runtime/routes/heartbeat-routes.ts +103 -38
  605. package/src/runtime/routes/host-app-control-routes.ts +134 -0
  606. package/src/runtime/routes/host-bash-routes.ts +56 -6
  607. package/src/runtime/routes/host-browser-routes.ts +108 -13
  608. package/src/runtime/routes/host-cu-routes.ts +66 -9
  609. package/src/runtime/routes/host-file-routes.ts +54 -5
  610. package/src/runtime/routes/host-transfer-routes.ts +122 -19
  611. package/src/runtime/routes/http-adapter.ts +1 -0
  612. package/src/runtime/routes/identity-intro-cache.ts +30 -0
  613. package/src/runtime/routes/identity-routes.ts +21 -180
  614. package/src/runtime/routes/inbound-message-handler.ts +78 -21
  615. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -7
  616. package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
  617. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +3 -0
  618. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
  619. package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
  620. package/src/runtime/routes/index.ts +14 -0
  621. package/src/runtime/routes/mcp-auth-routes.ts +132 -0
  622. package/src/runtime/routes/memory-item-routes.test.ts +41 -15
  623. package/src/runtime/routes/memory-item-routes.ts +10 -12
  624. package/src/runtime/routes/memory-v2-routes.ts +474 -1
  625. package/src/runtime/routes/migration-routes.ts +96 -0
  626. package/src/runtime/routes/oauth-connect-routes.ts +153 -0
  627. package/src/runtime/routes/schedule-routes.ts +7 -0
  628. package/src/runtime/verification-outbound-actions.ts +4 -4
  629. package/src/runtime/verification-templates.ts +4 -7
  630. package/src/schedule/integration-status.ts +66 -2
  631. package/src/schedule/recurrence-engine.ts +4 -1
  632. package/src/schedule/retry-backoff.ts +18 -0
  633. package/src/schedule/retry-policy.ts +82 -0
  634. package/src/schedule/run-script.ts +37 -5
  635. package/src/schedule/schedule-recovery.ts +64 -0
  636. package/src/schedule/schedule-store.ts +106 -2
  637. package/src/schedule/scheduler-types.ts +25 -0
  638. package/src/schedule/scheduler.ts +83 -39
  639. package/src/security/encrypted-store.ts +2 -0
  640. package/src/security/oauth-callback-registry.ts +8 -0
  641. package/src/security/secure-keys.ts +55 -0
  642. package/src/sequence/analytics.ts +5 -5
  643. package/src/sequence/engine.ts +1 -1
  644. package/src/skills/catalog-files.ts +2 -8
  645. package/src/skills/include-graph.ts +5 -5
  646. package/src/skills/remote-skill-policy.ts +10 -16
  647. package/src/skills/skill-file-provider.ts +1 -1
  648. package/src/skills/skill-file-types.ts +13 -0
  649. package/src/skills/skillssh-audit-types.ts +28 -0
  650. package/src/skills/skillssh-registry.ts +8 -21
  651. package/src/subagent/index.ts +1 -7
  652. package/src/subagent/manager.ts +1 -15
  653. package/src/tasks/task-runner.ts +0 -1
  654. package/src/tasks/task-store.ts +0 -3
  655. package/src/telemetry/types.ts +2 -0
  656. package/src/telemetry/usage-telemetry-reporter.test.ts +21 -0
  657. package/src/telemetry/usage-telemetry-reporter.ts +1 -0
  658. package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
  659. package/src/tools/apps/executors.ts +56 -69
  660. package/src/tools/background-tool-registry.ts +17 -3
  661. package/src/tools/browser/__tests__/browser-status.test.ts +21 -18
  662. package/src/tools/browser/browser-execution.ts +2 -2
  663. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +55 -4
  664. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
  665. package/src/tools/browser/cdp-client/factory.ts +23 -24
  666. package/src/tools/browser/cdp-client/index.ts +1 -14
  667. package/src/tools/computer-use/definitions.ts +42 -20
  668. package/src/tools/executor.ts +2 -0
  669. package/src/tools/host-filesystem/edit.test.ts +151 -0
  670. package/src/tools/host-filesystem/edit.ts +68 -0
  671. package/src/tools/host-filesystem/read.test.ts +129 -0
  672. package/src/tools/host-filesystem/read.ts +68 -0
  673. package/src/tools/host-filesystem/transfer.test.ts +127 -2
  674. package/src/tools/host-filesystem/transfer.ts +78 -3
  675. package/src/tools/host-filesystem/write.test.ts +134 -0
  676. package/src/tools/host-filesystem/write.ts +68 -0
  677. package/src/tools/host-terminal/host-shell.ts +66 -1
  678. package/src/tools/mcp/mcp-tool-factory.ts +2 -1
  679. package/src/tools/memory/register.test.ts +12 -9
  680. package/src/tools/memory/register.ts +1 -2
  681. package/src/tools/provider-tool-name.ts +28 -0
  682. package/src/tools/registry.ts +30 -9
  683. package/src/tools/schedule/create.ts +6 -0
  684. package/src/tools/schedule/list.ts +2 -0
  685. package/src/tools/schedule/update.ts +10 -0
  686. package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
  687. package/src/tools/shared/filesystem/path-policy.ts +25 -1
  688. package/src/tools/skills/load.ts +0 -32
  689. package/src/tools/terminal/shell.ts +9 -1
  690. package/src/tools/tool-approval-handler.ts +32 -11
  691. package/src/tools/types.ts +28 -2
  692. package/src/tts/provider-catalog.ts +3 -5
  693. package/src/usage/pricing.ts +1 -1
  694. package/src/util/disk-usage.ts +138 -0
  695. package/src/util/platform.ts +21 -11
  696. package/src/util/process-liveness.ts +26 -0
  697. package/src/workspace/hatched-date.ts +86 -0
  698. package/src/workspace/heartbeat-service.ts +19 -0
  699. package/src/workspace/migrations/003-seed-device-id.ts +1 -1
  700. package/src/workspace/migrations/006-services-config.ts +8 -5
  701. package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
  702. package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
  703. package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
  704. package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
  705. package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
  706. package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
  707. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +2 -1
  708. package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
  709. package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +3 -8
  710. package/src/workspace/migrations/065-bump-stale-heartbeat-interval.ts +60 -0
  711. package/src/workspace/migrations/066-seed-heartbeat-callsite-cost-default.ts +146 -0
  712. package/src/workspace/migrations/067-release-notes-safe-storage-limits.ts +72 -0
  713. package/src/workspace/migrations/068-release-notes-local-timezone.ts +65 -0
  714. package/src/workspace/migrations/AGENTS.md +1 -1
  715. package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
  716. package/src/workspace/migrations/registry.ts +8 -0
  717. package/src/workspace/migrations/utils.ts +21 -0
  718. package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +0 -167
  719. package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -443
  720. package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -226
  721. package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -427
  722. package/src/__tests__/twilio-rest.test.ts +0 -34
  723. package/src/backup/__tests__/backup-key.test.ts +0 -152
  724. package/src/backup/__tests__/backup-worker.test.ts +0 -782
  725. package/src/backup/__tests__/offsite-writer.test.ts +0 -641
  726. package/src/backup/__tests__/stream-crypt.test.ts +0 -228
  727. package/src/backup/backup-key.ts +0 -137
  728. package/src/backup/backup-worker.ts +0 -472
  729. package/src/backup/offsite-writer.ts +0 -222
  730. package/src/backup/stream-crypt.ts +0 -263
  731. package/src/daemon/message-types/pairing.ts +0 -58
  732. package/src/memory/v2/__tests__/skill-qdrant.test.ts +0 -657
  733. package/src/memory/v2/skill-qdrant.ts +0 -395
  734. package/src/outbound-proxy/config.ts +0 -20
  735. package/src/outbound-proxy/health.ts +0 -18
  736. package/src/outbound-proxy/types.ts +0 -150
  737. package/src/runtime/capability-tokens.ts +0 -190
  738. package/src/signals/bash.ts +0 -198
  739. package/src/signals/mcp-reload.ts +0 -18
@@ -0,0 +1,148 @@
1
+ import { beforeEach, describe, expect, mock, test } from "bun:test";
2
+
3
+ mock.module("../util/logger.js", () => ({
4
+ getLogger: () => ({
5
+ info: () => {},
6
+ debug: () => {},
7
+ warn: () => {},
8
+ error: () => {},
9
+ }),
10
+ truncateForLog: (value: string) => value,
11
+ }));
12
+
13
+ mock.module("../runtime/agent-wake.js", () => ({
14
+ wakeAgentForOpportunity: mock(() =>
15
+ Promise.resolve({ invoked: true, producedToolCalls: false }),
16
+ ),
17
+ }));
18
+
19
+ mock.module("../home/emit-feed-event.js", () => ({
20
+ emitFeedEvent: mock(() => Promise.resolve()),
21
+ }));
22
+
23
+ mock.module("../config/loader.js", () => ({
24
+ getConfig: () => ({}),
25
+ loadConfig: () => ({}),
26
+ loadRawConfig: () => ({}),
27
+ saveRawConfig: () => {},
28
+ getConfigReadOnly: () => ({}),
29
+ applyNestedDefaults: (config: unknown) => config,
30
+ deepMergeOverwrite: (base: unknown) => base,
31
+ mergeDefaultWorkspaceConfig: () => {},
32
+ getNestedValue: () => undefined,
33
+ setNestedValue: () => {},
34
+ API_KEY_PROVIDERS: [],
35
+ _appendQuarantineBulletin: () => {},
36
+ invalidateConfigCache: () => {},
37
+ }));
38
+
39
+ let locked = true;
40
+ mock.module("../daemon/disk-pressure-background-gate.js", () => ({
41
+ checkDiskPressureBackgroundGate: () =>
42
+ locked
43
+ ? {
44
+ action: "skip",
45
+ reason: "disk_pressure",
46
+ blockedCapability: "background-work",
47
+ status: {
48
+ enabled: true,
49
+ state: "critical",
50
+ locked: true,
51
+ acknowledged: true,
52
+ overrideActive: false,
53
+ effectivelyLocked: true,
54
+ lockId: "disk-pressure-test",
55
+ usagePercent: 98,
56
+ thresholdPercent: 95,
57
+ path: "/",
58
+ lastCheckedAt: "2026-05-05T00:00:00.000Z",
59
+ blockedCapabilities: [
60
+ "agent-turns",
61
+ "background-work",
62
+ "remote-ingress",
63
+ ],
64
+ error: null,
65
+ },
66
+ }
67
+ : {
68
+ action: "allow",
69
+ status: {
70
+ enabled: false,
71
+ state: "disabled",
72
+ locked: false,
73
+ acknowledged: false,
74
+ overrideActive: false,
75
+ effectivelyLocked: false,
76
+ lockId: null,
77
+ usagePercent: null,
78
+ thresholdPercent: 95,
79
+ path: null,
80
+ lastCheckedAt: null,
81
+ blockedCapabilities: [],
82
+ error: null,
83
+ },
84
+ },
85
+ diskPressureBackgroundSkipLogFields: () => ({
86
+ reason: "disk_pressure",
87
+ thresholdPercent: 95,
88
+ usagePercent: 98,
89
+ blockedCapability: "background-work",
90
+ lockId: "disk-pressure-test",
91
+ path: "/",
92
+ }),
93
+ shouldLogDiskPressureBackgroundSkip: () => true,
94
+ }));
95
+
96
+ import { getDb } from "../memory/db-connection.js";
97
+ import { initializeDb } from "../memory/db-init.js";
98
+ import { createSchedule } from "../schedule/schedule-store.js";
99
+ import { runScheduleOnce } from "../schedule/scheduler.js";
100
+
101
+ initializeDb();
102
+
103
+ function rawDb(): import("bun:sqlite").Database {
104
+ return (getDb() as unknown as { $client: import("bun:sqlite").Database })
105
+ .$client;
106
+ }
107
+
108
+ describe("scheduler disk pressure gate", () => {
109
+ beforeEach(() => {
110
+ locked = true;
111
+ const db = getDb();
112
+ db.run("DELETE FROM cron_runs");
113
+ db.run("DELETE FROM cron_jobs");
114
+ db.run("DELETE FROM task_runs");
115
+ db.run("DELETE FROM tasks");
116
+ db.run("DELETE FROM messages");
117
+ db.run("DELETE FROM conversations");
118
+ });
119
+
120
+ test("skips before claiming due schedules while disk pressure is locked", async () => {
121
+ const dueAt = Date.now() - 10_000;
122
+ const schedule = createSchedule({
123
+ name: "Due reminder",
124
+ message: "Do not fire while locked",
125
+ mode: "notify",
126
+ nextRunAt: dueAt,
127
+ });
128
+
129
+ const processMessage = mock(() => Promise.resolve());
130
+ const notify = mock(() => Promise.resolve());
131
+
132
+ const processed = await runScheduleOnce(processMessage, notify);
133
+
134
+ expect(processed).toBe(0);
135
+ expect(processMessage).not.toHaveBeenCalled();
136
+ expect(notify).not.toHaveBeenCalled();
137
+
138
+ const row = rawDb()
139
+ .query("SELECT status, next_run_at FROM cron_jobs WHERE id = ?")
140
+ .get(schedule.id) as { status: string; next_run_at: number } | null;
141
+ expect(row).toEqual({ status: "active", next_run_at: dueAt });
142
+
143
+ const runCount = rawDb()
144
+ .query("SELECT COUNT(*) AS count FROM cron_runs")
145
+ .get() as { count: number };
146
+ expect(runCount.count).toBe(0);
147
+ });
148
+ });
@@ -13,8 +13,8 @@ import {
13
13
  getCAPath,
14
14
  issueLeafCert,
15
15
  type RewriteCallback,
16
- type RouteDecision,
17
16
  } from "../outbound-proxy/index.js";
17
+ import type { RouteDecision } from "../outbound-proxy/router.js";
18
18
 
19
19
  let dataDir: string;
20
20
  let caDir: string;
@@ -106,7 +106,6 @@ mock.module("../memory/conversation-crud.js", () => ({
106
106
  provenanceFromTrustContext: () => undefined,
107
107
  setConversationOriginChannelIfUnset: () => {},
108
108
  setConversationOriginInterfaceIfUnset: () => {},
109
- getConversationMemoryScopeId: () => undefined,
110
109
  }));
111
110
 
112
111
  mock.module("../runtime/local-actor-identity.js", () => ({
@@ -213,6 +212,7 @@ function makeSendMessageDeps() {
213
212
  hasPendingConfirmation: () => false,
214
213
  setHostBrowserProxy: () => {},
215
214
  setHostCuProxy: () => {},
215
+ setHostAppControlProxy: () => {},
216
216
  addPreactivatedSkillId: () => {},
217
217
  } as unknown as import("../daemon/conversation.js").Conversation;
218
218
 
@@ -160,6 +160,7 @@ function makeCompletingConversation(): Conversation {
160
160
  updateClient: () => {},
161
161
  setHostBrowserProxy: () => {},
162
162
  setHostCuProxy: () => {},
163
+ setHostAppControlProxy: () => {},
163
164
  addPreactivatedSkillId: () => {},
164
165
  hasAnyPendingConfirmation: () => false,
165
166
  hasPendingConfirmation: () => false,
@@ -216,6 +217,7 @@ function makeHangingConversation(): Conversation {
216
217
  updateClient: () => {},
217
218
  setHostBrowserProxy: () => {},
218
219
  setHostCuProxy: () => {},
220
+ setHostAppControlProxy: () => {},
219
221
  addPreactivatedSkillId: () => {},
220
222
  hasAnyPendingConfirmation: () => false,
221
223
  hasPendingConfirmation: () => false,
@@ -300,6 +302,7 @@ function makePendingApprovalConversation(
300
302
  updateClient: () => {},
301
303
  setHostBrowserProxy: () => {},
302
304
  setHostCuProxy: () => {},
305
+ setHostAppControlProxy: () => {},
303
306
  addPreactivatedSkillId: () => {},
304
307
  hasAnyPendingConfirmation: () => pending.size > 0,
305
308
  hasPendingConfirmation: (candidateRequestId: string) =>
@@ -45,7 +45,6 @@ mock.module("../config/loader.js", () => ({
45
45
  getConfig: () => mockConfig,
46
46
  loadConfig: () => mockConfig,
47
47
  invalidateConfigCache: () => {},
48
- saveConfig: () => {},
49
48
  loadRawConfig: () => ({}),
50
49
  saveRawConfig: () => {},
51
50
  getNestedValue: () => undefined,
@@ -16,10 +16,11 @@ afterEach(() => {
16
16
  _setOverridesForTesting({});
17
17
  });
18
18
 
19
- const DECLARED_FLAG_ID = "sounds";
19
+ const DECLARED_FLAG_ID = "email-channel";
20
20
  const DECLARED_FLAG_KEY = DECLARED_FLAG_ID;
21
- const DECLARED_SKILL_ID = "sounds";
22
- const APP_BUILDER_MULTIFILE_FLAG_KEY = "app-builder-multifile";
21
+ const DECLARED_SKILL_ID = "email-channel";
22
+ const ENABLED_UNDECLARED_FLAG_KEY = "enabled-undeclared-flag";
23
+ const ENABLED_UNDECLARED_SKILL_ID = "enabled-undeclared-skill";
23
24
  // ---------------------------------------------------------------------------
24
25
  // Helpers
25
26
  // ---------------------------------------------------------------------------
@@ -91,14 +92,14 @@ describe("skillFlagKey", () => {
91
92
  // ---------------------------------------------------------------------------
92
93
 
93
94
  describe("isAssistantFeatureFlagEnabled with skillFlagKey", () => {
94
- test("returns true when no flag overrides (registry default is true)", () => {
95
+ test("returns false when no flag overrides (registry default is false)", () => {
95
96
  const config = makeConfig();
96
97
  expect(
97
98
  isAssistantFeatureFlagEnabled(
98
99
  skillFlagKey({ featureFlag: DECLARED_FLAG_ID })!,
99
100
  config,
100
101
  ),
101
- ).toBe(true);
102
+ ).toBe(false);
102
103
  });
103
104
 
104
105
  test("returns true when skill key is explicitly true", () => {
@@ -144,27 +145,18 @@ describe("isAssistantFeatureFlagEnabled", () => {
144
145
 
145
146
  test("falls back to registry default when no override", () => {
146
147
  const config = makeConfig();
147
- // sounds defaults to true in the registry
148
- expect(isAssistantFeatureFlagEnabled(DECLARED_FLAG_KEY, config)).toBe(true);
148
+ // email-channel defaults to false in the registry
149
+ expect(isAssistantFeatureFlagEnabled(DECLARED_FLAG_KEY, config)).toBe(
150
+ false,
151
+ );
149
152
  });
150
153
 
151
154
  test("respects persisted overrides for undeclared keys", () => {
152
- _setOverridesForTesting({ browser: false });
153
- const config = makeConfig();
154
- expect(isAssistantFeatureFlagEnabled("browser", config)).toBe(false);
155
- });
156
-
157
- test("declared keys with no persisted override use registry default", () => {
158
- const config = makeConfig();
159
- // browser is declared in the registry with defaultEnabled: true
160
- expect(isAssistantFeatureFlagEnabled("browser", config)).toBe(true);
161
- });
162
-
163
- test("app-builder-multifile defaults to enabled when no override is set", () => {
155
+ _setOverridesForTesting({ "some-undeclared-flag": false });
164
156
  const config = makeConfig();
165
- expect(
166
- isAssistantFeatureFlagEnabled(APP_BUILDER_MULTIFILE_FLAG_KEY, config),
167
- ).toBe(true);
157
+ expect(isAssistantFeatureFlagEnabled("some-undeclared-flag", config)).toBe(
158
+ false,
159
+ );
168
160
  });
169
161
  });
170
162
 
@@ -176,11 +168,15 @@ describe("resolveSkillStates with feature flags", () => {
176
168
  test("flag OFF skill does not appear in resolved list", () => {
177
169
  _setOverridesForTesting({
178
170
  [DECLARED_FLAG_KEY]: false,
179
- browser: true,
171
+ [ENABLED_UNDECLARED_FLAG_KEY]: true,
180
172
  });
181
173
  const catalog = [
182
174
  makeSkill(DECLARED_SKILL_ID, "bundled", DECLARED_FLAG_ID),
183
- makeSkill("browser", "bundled", "browser"),
175
+ makeSkill(
176
+ ENABLED_UNDECLARED_SKILL_ID,
177
+ "bundled",
178
+ ENABLED_UNDECLARED_FLAG_KEY,
179
+ ),
184
180
  ];
185
181
  const config = makeConfig();
186
182
 
@@ -188,17 +184,21 @@ describe("resolveSkillStates with feature flags", () => {
188
184
  const ids = resolved.map((r) => r.summary.id);
189
185
 
190
186
  expect(ids).not.toContain(DECLARED_SKILL_ID);
191
- expect(ids).toContain("browser");
187
+ expect(ids).toContain(ENABLED_UNDECLARED_SKILL_ID);
192
188
  });
193
189
 
194
190
  test("flag ON skill appears normally", () => {
195
191
  _setOverridesForTesting({
196
192
  [DECLARED_FLAG_KEY]: true,
197
- browser: true,
193
+ [ENABLED_UNDECLARED_FLAG_KEY]: true,
198
194
  });
199
195
  const catalog = [
200
196
  makeSkill(DECLARED_SKILL_ID, "bundled", DECLARED_FLAG_ID),
201
- makeSkill("browser", "bundled", "browser"),
197
+ makeSkill(
198
+ ENABLED_UNDECLARED_SKILL_ID,
199
+ "bundled",
200
+ ENABLED_UNDECLARED_FLAG_KEY,
201
+ ),
202
202
  ];
203
203
  const config = makeConfig();
204
204
 
@@ -206,17 +206,16 @@ describe("resolveSkillStates with feature flags", () => {
206
206
  const ids = resolved.map((r) => r.summary.id);
207
207
 
208
208
  expect(ids).toContain(DECLARED_SKILL_ID);
209
- expect(ids).toContain("browser");
209
+ expect(ids).toContain(ENABLED_UNDECLARED_SKILL_ID);
210
210
  });
211
211
 
212
- test("declared flag key defaults to registry value (true)", () => {
212
+ test("declared flag key defaults to registry value (false)", () => {
213
213
  const catalog = [makeSkill(DECLARED_SKILL_ID, "bundled", DECLARED_FLAG_ID)];
214
214
  const config = makeConfig();
215
215
 
216
216
  const resolved = resolveSkillStates(catalog, config);
217
- // sounds registry default is true, so it passes through
218
- expect(resolved.length).toBe(1);
219
- expect(resolved[0].summary.id).toBe(DECLARED_SKILL_ID);
217
+ // email-channel registry default is false, so it is filtered out
218
+ expect(resolved.length).toBe(0);
220
219
  });
221
220
 
222
221
  test("skill without featureFlag is never flag-gated", () => {
@@ -259,12 +258,16 @@ describe("resolveSkillStates with feature flags", () => {
259
258
  test("multiple skills with mixed flags — persisted overrides respected", () => {
260
259
  _setOverridesForTesting({
261
260
  [DECLARED_FLAG_KEY]: false,
262
- browser: true,
261
+ [ENABLED_UNDECLARED_FLAG_KEY]: true,
263
262
  deploy: false,
264
263
  });
265
264
  const catalog = [
266
265
  makeSkill(DECLARED_SKILL_ID, "bundled", DECLARED_FLAG_ID),
267
- makeSkill("browser", "bundled", "browser"),
266
+ makeSkill(
267
+ ENABLED_UNDECLARED_SKILL_ID,
268
+ "bundled",
269
+ ENABLED_UNDECLARED_FLAG_KEY,
270
+ ),
268
271
  makeSkill("deploy", "bundled", "deploy"),
269
272
  ];
270
273
  const config = makeConfig();
@@ -272,8 +275,8 @@ describe("resolveSkillStates with feature flags", () => {
272
275
  const resolved = resolveSkillStates(catalog, config);
273
276
  const ids = resolved.map((r) => r.summary.id);
274
277
 
275
- // sounds and deploy explicitly false; browser explicitly true
276
- expect(ids).toEqual(["browser"]);
278
+ // email-channel and deploy explicitly false; one unrelated skill explicitly true
279
+ expect(ids).toEqual([ENABLED_UNDECLARED_SKILL_ID]);
277
280
  });
278
281
  });
279
282
 
@@ -282,15 +285,14 @@ describe("resolveSkillStates with feature flags", () => {
282
285
  // ---------------------------------------------------------------------------
283
286
 
284
287
  describe("resolveSkillStates with frontmatter featureFlag", () => {
285
- test("skill with featureFlag (defaultEnabled: true) is included when no config override", () => {
286
- // sounds has defaultEnabled: true in the registry
288
+ test("skill with featureFlag (defaultEnabled: false) is excluded when no config override", () => {
289
+ // email-channel has defaultEnabled: false in the registry
287
290
  const catalog = [makeSkill(DECLARED_SKILL_ID, "bundled", DECLARED_FLAG_ID)];
288
291
  const config = makeConfig();
289
292
 
290
293
  const resolved = resolveSkillStates(catalog, config);
291
- // No override, registry default is truepasses through
292
- expect(resolved.length).toBe(1);
293
- expect(resolved[0].summary.id).toBe(DECLARED_SKILL_ID);
294
+ // No override, registry default is falsefiltered out
295
+ expect(resolved.length).toBe(0);
294
296
  });
295
297
 
296
298
  test("skill with featureFlag is included when override enables it", () => {
@@ -12,8 +12,8 @@ const TEST_DIR = process.env.VELLUM_WORKSPACE_DIR!;
12
12
 
13
13
  let currentConfig: Record<string, unknown> = {};
14
14
 
15
- const DECLARED_SKILL_ID = "sounds";
16
- const DECLARED_FLAG_KEY = "sounds";
15
+ const DECLARED_SKILL_ID = "email-channel";
16
+ const DECLARED_FLAG_KEY = "email-channel";
17
17
 
18
18
  const noopLogger = new Proxy({} as Record<string, unknown>, {
19
19
  get: (_target, prop) => (prop === "child" ? () => noopLogger : () => {}),
@@ -35,7 +35,6 @@ mock.module("../config/loader.js", () => ({
35
35
  getConfigReadOnly: () => currentConfig,
36
36
  loadConfig: () => currentConfig,
37
37
  loadRawConfig: () => ({}),
38
- saveConfig: () => {},
39
38
  saveRawConfig: () => {},
40
39
  invalidateConfigCache: () => {},
41
40
  getNestedValue: () => undefined,
@@ -99,8 +98,8 @@ describe("skill_load feature flag enforcement", () => {
99
98
  test("returns deterministic error for flag OFF skill", async () => {
100
99
  writeSkill(
101
100
  DECLARED_SKILL_ID,
102
- "Sounds",
103
- "Toggle sounds behavior",
101
+ "Email Channel",
102
+ "Toggle email channel behavior",
104
103
  "Use the feature.",
105
104
  );
106
105
  writeFileSync(
@@ -120,8 +119,8 @@ describe("skill_load feature flag enforcement", () => {
120
119
  test("loads skill normally when flag is ON", async () => {
121
120
  writeSkill(
122
121
  DECLARED_SKILL_ID,
123
- "Sounds",
124
- "Toggle sounds behavior",
122
+ "Email Channel",
123
+ "Toggle email channel behavior",
125
124
  "Use the feature.",
126
125
  );
127
126
  writeFileSync(
@@ -134,14 +133,14 @@ describe("skill_load feature flag enforcement", () => {
134
133
  const result = await executeSkillLoad({ skill: DECLARED_SKILL_ID });
135
134
 
136
135
  expect(result.isError).toBe(false);
137
- expect(result.content).toContain("Skill: Sounds");
136
+ expect(result.content).toContain("Skill: Email Channel");
138
137
  });
139
138
 
140
- test("loads skill when flag key is absent (registry defaults to enabled)", async () => {
139
+ test("returns error when flag key is absent (registry defaults to disabled)", async () => {
141
140
  writeSkill(
142
141
  DECLARED_SKILL_ID,
143
- "Sounds",
144
- "Toggle sounds behavior",
142
+ "Email Channel",
143
+ "Toggle email channel behavior",
145
144
  "Use the feature.",
146
145
  );
147
146
  writeFileSync(
@@ -153,8 +152,8 @@ describe("skill_load feature flag enforcement", () => {
153
152
 
154
153
  const result = await executeSkillLoad({ skill: DECLARED_SKILL_ID });
155
154
 
156
- // sounds is declared in the registry with defaultEnabled: true
157
- expect(result.isError).toBe(false);
158
- expect(result.content).toContain("Skill: Sounds");
155
+ // email-channel is declared in the registry with defaultEnabled: false
156
+ expect(result.isError).toBe(true);
157
+ expect(result.content).toContain("disabled by feature flag");
159
158
  });
160
159
  });
@@ -4,8 +4,6 @@
4
4
  * Validates that:
5
5
  * - Root skills with `!\`command\`` tokens get those tokens expanded exactly
6
6
  * once at skill_load time, wrapped in <inline_skill_command> XML tags.
7
- * - When the feature flag is off, skill_load returns an error instead of
8
- * leaving unresolved live tokens in the prompt.
9
7
  * - When the skill source is "extra", skill_load rejects with a specific error.
10
8
  * - Render failures produce stable inline stubs rather than raw stderr.
11
9
  */
@@ -14,8 +12,6 @@ import { mkdirSync, writeFileSync } from "node:fs";
14
12
  import { join } from "node:path";
15
13
  import { beforeEach, describe, expect, mock, test } from "bun:test";
16
14
 
17
- import { _setOverridesForTesting } from "../config/assistant-feature-flags.js";
18
-
19
15
  // ── Test directory ────────────────────────────────────────────────────────────
20
16
 
21
17
  const TEST_DIR = process.env.VELLUM_WORKSPACE_DIR!;
@@ -93,7 +89,6 @@ mock.module("../config/loader.js", () => ({
93
89
  getConfig: () => testConfig,
94
90
  loadConfig: () => testConfig,
95
91
  invalidateConfigCache: () => {},
96
- saveConfig: () => {},
97
92
  loadRawConfig: () => ({}),
98
93
  saveRawConfig: () => {},
99
94
  getNestedValue: () => undefined,
@@ -163,10 +158,6 @@ describe("skill_load inline command expansion", () => {
163
158
  ) => mockRunInlineCommand(command, workingDir),
164
159
  }));
165
160
 
166
- // Enable the feature flag
167
- _setOverridesForTesting({
168
- "inline-skill-commands": true,
169
- });
170
161
  testConfig.skills = { load: { extraDirs: [] } };
171
162
  });
172
163
 
@@ -255,48 +246,6 @@ describe("skill_load inline command expansion", () => {
255
246
  });
256
247
  });
257
248
 
258
- // ── Feature flag off ─────────────────────────────────────────────────
259
-
260
- describe("feature flag disabled", () => {
261
- test("returns error when flag is off and skill has inline commands", async () => {
262
- _setOverridesForTesting({
263
- "inline-skill-commands": false,
264
- });
265
-
266
- writeSkill(
267
- "flagged-off-skill",
268
- "Flagged Off Skill",
269
- "Has inline commands",
270
- "Data: !`echo hello`",
271
- );
272
-
273
- const result = await executeSkillLoad({ skill: "flagged-off-skill" });
274
- expect(result.isError).toBe(true);
275
- expect(result.content).toContain(
276
- "inline-skill-commands feature flag is disabled",
277
- );
278
- // Runner should not be called when flag is off
279
- expect(runInlineCommandCalls).toHaveLength(0);
280
- });
281
-
282
- test("plain skill still loads when flag is off", async () => {
283
- _setOverridesForTesting({
284
- "inline-skill-commands": false,
285
- });
286
-
287
- writeSkill(
288
- "plain-flag-off",
289
- "Plain Flag Off",
290
- "No inline commands",
291
- "Regular content.",
292
- );
293
-
294
- const result = await executeSkillLoad({ skill: "plain-flag-off" });
295
- expect(result.isError).toBe(false);
296
- expect(result.content).toContain("Regular content.");
297
- });
298
- });
299
-
300
249
  // ── Extra source rejection ───────────────────────────────────────────
301
250
  //
302
251
  // The SkillLoadTool checks `skill.source === "extra"` and rejects inline
@@ -16,8 +16,6 @@ import { mkdirSync, writeFileSync } from "node:fs";
16
16
  import { join } from "node:path";
17
17
  import { beforeEach, describe, expect, mock, test } from "bun:test";
18
18
 
19
- import { _setOverridesForTesting } from "../config/assistant-feature-flags.js";
20
-
21
19
  // ── Test directory ────────────────────────────────────────────────────────────
22
20
 
23
21
  const TEST_DIR = process.env.VELLUM_WORKSPACE_DIR!;
@@ -95,7 +93,6 @@ mock.module("../config/loader.js", () => ({
95
93
  getConfig: () => testConfig,
96
94
  loadConfig: () => testConfig,
97
95
  invalidateConfigCache: () => {},
98
- saveConfig: () => {},
99
96
  loadRawConfig: () => ({}),
100
97
  saveRawConfig: () => {},
101
98
  getNestedValue: () => undefined,
@@ -173,10 +170,6 @@ describe("skill_load inline command expansion for included skills", () => {
173
170
  ) => mockRunInlineCommand(command, workingDir),
174
171
  }));
175
172
 
176
- // Enable the feature flag
177
- _setOverridesForTesting({
178
- "inline-skill-commands": true,
179
- });
180
173
  testConfig.skills = { load: { extraDirs: [] } };
181
174
  });
182
175
 
@@ -514,42 +507,6 @@ describe("skill_load inline command expansion for included skills", () => {
514
507
  });
515
508
  });
516
509
 
517
- // ── Feature flag off for child inline commands ────────────────────────
518
-
519
- describe("feature flag disabled for included skills", () => {
520
- test("skill_load returns error when child has inline commands and flag is off", async () => {
521
- _setOverridesForTesting({
522
- "inline-skill-commands": false,
523
- });
524
-
525
- writeSkill(
526
- "child-flag-off",
527
- "Flag Off Child",
528
- "Child with inline cmds",
529
- "Data: !`echo hello`",
530
- );
531
- writeSkill(
532
- "parent-flag-off",
533
- "Parent Flag Off",
534
- "Parent for flag-off test",
535
- "Root content.",
536
- { includes: ["child-flag-off"] },
537
- );
538
-
539
- const result = await executeSkillLoad({ skill: "parent-flag-off" });
540
- // Fail closed: the entire skill_load must error when any included child
541
- // has inline commands and the feature flag is off, matching the root
542
- // skill behavior and the documented fail-closed contract.
543
- expect(result.isError).toBe(true);
544
- expect(result.content).toContain("child-flag-off");
545
- expect(result.content).toContain(
546
- "inline-skill-commands feature flag is disabled",
547
- );
548
- // Runner should not be called
549
- expect(runInlineCommandCalls).toHaveLength(0);
550
- });
551
- });
552
-
553
510
  // ── Root with inline + child with inline ──────────────────────────────
554
511
 
555
512
  describe("root and child both have inline commands", () => {
@@ -28,7 +28,6 @@ mock.module("../config/loader.js", () => ({
28
28
  getConfig: () => ({}),
29
29
  loadConfig: () => ({}),
30
30
  applyNestedDefaults: (c: unknown) => c,
31
- saveConfig: () => {},
32
31
  invalidateConfigCache: () => {},
33
32
  loadRawConfig: () => ({}),
34
33
  saveRawConfig: () => {},
@@ -28,7 +28,6 @@ mock.module("../config/loader.js", () => ({
28
28
  getConfig: () => mockConfig,
29
29
  loadConfig: () => mockConfig,
30
30
  invalidateConfigCache: () => {},
31
- saveConfig: () => {},
32
31
  loadRawConfig: () => ({}),
33
32
  saveRawConfig: () => {},
34
33
  getNestedValue: () => undefined,