@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
@@ -39,12 +39,15 @@ import {
39
39
  resolveSlash,
40
40
  } from "../../daemon/conversation-slash.js";
41
41
  import { getOrCreateConversation as getOrCreateConversationInstance } from "../../daemon/conversation-store.js";
42
+ import { canonicalizeTimeZone } from "../../daemon/date-context.js";
42
43
  import {
43
44
  getCannedFirstGreeting,
44
45
  isWakeUpGreeting,
45
46
  } from "../../daemon/first-greeting.js";
46
47
  import { renderHistoryContent } from "../../daemon/handlers/shared.js";
48
+ import { HostAppControlProxy } from "../../daemon/host-app-control-proxy.js";
47
49
  import { HostCuProxy } from "../../daemon/host-cu-proxy.js";
50
+ import { preactivateHostProxySkills } from "../../daemon/host-proxy-preactivation.js";
48
51
  import type { ServerMessage } from "../../daemon/message-protocol.js";
49
52
  import type {
50
53
  HostProxyTransportMetadata,
@@ -84,6 +87,8 @@ import {
84
87
  getOrCreateConversation,
85
88
  } from "../../memory/conversation-key-store.js";
86
89
  import { searchConversations } from "../../memory/conversation-queries.js";
90
+ import { normalizeOnboardingContext } from "../../prompts/normalize-onboarding.js";
91
+ import { writeOnboardingSection } from "../../prompts/persona-resolver.js";
87
92
  import { getConfiguredProvider } from "../../providers/provider-send-message.js";
88
93
  import type { Provider } from "../../providers/types.js";
89
94
  import { checkIngressForSecrets } from "../../security/secret-ingress.js";
@@ -997,7 +1002,7 @@ function mergeConsecutiveAssistantMessages(messages: MessageRow[]): {
997
1002
  /**
998
1003
  * Persist the pre-chat onboarding payload to disk.
999
1004
  *
1000
- * Runs only on the very first message of a fresh conversation. Three
1005
+ * Runs only on the very first message of a fresh conversation. Four
1001
1006
  * artifacts are produced:
1002
1007
  *
1003
1008
  * 1. `data/onboarding-context.json` — sidecar read by the
@@ -1005,12 +1010,15 @@ function mergeConsecutiveAssistantMessages(messages: MessageRow[]): {
1005
1010
  * the pure-recomputation write cycle (every turn boundary rebuilds
1006
1011
  * facts from markdown; the sidecar is the durable source for the
1007
1012
  * tool/task/tone chips).
1008
- * 2. `IDENTITY.md` / `USER.md` persona seed files, only written
1009
- * when missing so we never clobber existing content. These feed
1010
- * the system prompt and the relationship-state writer's
1011
- * `parseIdentity` / `parseUserName` helpers after a daemon
1012
- * restart when the in-memory onboarding context is gone.
1013
- * 3. `data/relationship-state.json` kicked off fire-and-forget so
1013
+ * 2. `IDENTITY.md` assistant persona seed file, only written when
1014
+ * missing so we never clobber existing content. Feeds the system
1015
+ * prompt and the relationship-state writer's `parseIdentity`
1016
+ * helper after a daemon restart when the in-memory onboarding
1017
+ * context is gone.
1018
+ * 3. Onboarding section in the guardian persona file — written via
1019
+ * `writeOnboardingSection`, which handles the user's preferred
1020
+ * name (with fallback to root `USER.md`).
1021
+ * 4. `data/relationship-state.json` — kicked off fire-and-forget so
1014
1022
  * the Home page can populate immediately on first visit instead
1015
1023
  * of waiting for the first agent-turn boundary.
1016
1024
  *
@@ -1055,25 +1063,11 @@ export function persistOnboardingArtifacts(onboarding: {
1055
1063
  }
1056
1064
  }
1057
1065
 
1058
- const userName = onboarding.userName?.trim();
1059
- if (userName) {
1060
- const userPath = getWorkspacePromptPath("USER.md");
1061
- try {
1062
- if (existsSync(userPath)) {
1063
- const content = readFileSync(userPath, "utf-8");
1064
- const updated = content.replace(
1065
- /^- (?:\*\*)?Name:(?:\*\*)?\s*.*$/m,
1066
- () => `- **Name:** ${userName}`,
1067
- );
1068
- if (updated !== content) {
1069
- writeFileSync(userPath, updated, "utf-8");
1070
- }
1071
- } else {
1072
- writeFileSync(userPath, `# User\n\n- **Name:** ${userName}\n`, "utf-8");
1073
- }
1074
- } catch (err) {
1075
- log.warn({ err, userPath }, "Failed to seed USER.md from onboarding");
1076
- }
1066
+ try {
1067
+ const normalized = normalizeOnboardingContext(onboarding);
1068
+ writeOnboardingSection(normalized);
1069
+ } catch (err) {
1070
+ log.warn({ err }, "Failed to write onboarding section to persona file");
1077
1071
  }
1078
1072
 
1079
1073
  void writeRelationshipState().catch((err) => {
@@ -1102,6 +1096,7 @@ export async function handleSendMessage(
1102
1096
  bypassSecretCheck?: boolean;
1103
1097
  hostHomeDir?: string;
1104
1098
  hostUsername?: string;
1099
+ clientTimezone?: unknown;
1105
1100
  clientId?: string;
1106
1101
  clientMessageId?: string;
1107
1102
  inferenceProfile?: string | null;
@@ -1181,6 +1176,10 @@ export async function handleSendMessage(
1181
1176
  )}`,
1182
1177
  );
1183
1178
  }
1179
+ const clientTimezone =
1180
+ typeof body.clientTimezone === "string"
1181
+ ? (canonicalizeTimeZone(body.clientTimezone) ?? undefined)
1182
+ : undefined;
1184
1183
 
1185
1184
  // When conversationKey is omitted, derive a stable default from
1186
1185
  // sourceChannel + sourceInterface so that repeated calls from the same
@@ -1300,10 +1299,12 @@ export async function handleSendMessage(
1300
1299
  interfaceId: sourceInterface,
1301
1300
  hostHomeDir: body.hostHomeDir,
1302
1301
  hostUsername: body.hostUsername,
1302
+ ...(clientTimezone ? { clientTimezone } : {}),
1303
1303
  } satisfies HostProxyTransportMetadata)
1304
1304
  : ({
1305
1305
  channelId: sourceChannel,
1306
1306
  interfaceId: sourceInterface,
1307
+ ...(clientTimezone ? { clientTimezone } : {}),
1307
1308
  } satisfies NonHostProxyTransportMetadata);
1308
1309
 
1309
1310
  const conversation = await smDeps.getOrCreateConversation(
@@ -1320,10 +1321,9 @@ export async function handleSendMessage(
1320
1321
 
1321
1322
  // Store pre-chat onboarding context on the conversation when this is the
1322
1323
  // very first message (no prior messages loaded). Artifact persistence
1323
- // (IDENTITY.md, USER.md, sidecar) is deferred: on the canned greeting
1324
- // path it runs inside the setTimeout right before warmPromptCache() so
1325
- // the warmed system prompt includes the identity; on the normal LLM
1326
- // path it runs immediately before inference starts.
1324
+ // (IDENTITY.md, USER.md, sidecar) runs before either the canned greeting
1325
+ // broadcast or normal LLM inference so client-side identity reads observe
1326
+ // the selected assistant name.
1327
1327
  const isFirstOnboarding =
1328
1328
  !!body.onboarding && conversation.messages.length === 0;
1329
1329
  if (isFirstOnboarding) {
@@ -1395,15 +1395,30 @@ export async function handleSendMessage(
1395
1395
  if (!conversation.isProcessing() || !conversation.hostCuProxy) {
1396
1396
  conversation.setHostCuProxy(new HostCuProxy());
1397
1397
  }
1398
- // Only preactivate CU when the conversation is idle — if the conversation is
1399
- // processing, this message will be queued and preactivation is deferred
1400
- // to dequeue time in drainQueueImpl to avoid mutating in-flight turn state.
1401
- if (!conversation.isProcessing()) {
1402
- conversation.addPreactivatedSkillId("computer-use");
1403
- }
1404
1398
  } else if (!conversation.isProcessing()) {
1405
1399
  conversation.setHostCuProxy(undefined);
1406
1400
  }
1401
+ // App-control mirrors CU's per-conversation lifecycle: the proxy owns a
1402
+ // singleton lock plus per-session loop tracking. Instantiation is
1403
+ // unconditional when the client supports the capability — feature-flag
1404
+ // gating lives in the skill-projection layer (which reads the
1405
+ // `feature-flag: app-control` declaration in SKILL.md frontmatter), so
1406
+ // an attached proxy is harmless when the flag resolves to off.
1407
+ if (supportsHostProxy(sourceInterface, "host_app_control")) {
1408
+ if (!conversation.isProcessing() || !conversation.hostAppControlProxy) {
1409
+ conversation.setHostAppControlProxy(
1410
+ new HostAppControlProxy(mapping.conversationId),
1411
+ );
1412
+ }
1413
+ } else if (!conversation.isProcessing()) {
1414
+ conversation.setHostAppControlProxy(undefined);
1415
+ }
1416
+ // Only preactivate when the conversation is idle — if it's processing,
1417
+ // this message will be queued and preactivation is deferred to dequeue
1418
+ // time in drainQueueImpl to avoid mutating in-flight turn state.
1419
+ if (!conversation.isProcessing()) {
1420
+ preactivateHostProxySkills(conversation, sourceInterface);
1421
+ }
1407
1422
  // Wire sendToClient to the SSE hub so all subsystems can reach the HTTP client.
1408
1423
  // hasNoClient must remain `!isInteractive` so downstream tool gating
1409
1424
  // (`isToolActiveForContext` for HOST_TOOL_NAMES, `createToolExecutor`'s
@@ -1473,6 +1488,10 @@ export async function handleSendMessage(
1473
1488
  conversationId,
1474
1489
  };
1475
1490
 
1491
+ if (isFirstOnboarding) {
1492
+ persistOnboardingArtifacts(body.onboarding!);
1493
+ }
1494
+
1476
1495
  setTimeout(() => {
1477
1496
  broadcastMessage({
1478
1497
  type: "user_message_echo",
@@ -1493,9 +1512,6 @@ export async function handleSendMessage(
1493
1512
  "canned-greeting queue drain",
1494
1513
  );
1495
1514
 
1496
- if (isFirstOnboarding) {
1497
- persistOnboardingArtifacts(body.onboarding!);
1498
- }
1499
1515
  conversation.warmPromptCache();
1500
1516
  }, 0);
1501
1517
 
@@ -1974,6 +1990,13 @@ async function generateLlmSuggestion(
1974
1990
  // prefill-safe model. Keep `stop_sequences: ["</reply>"]` as an
1975
1991
  // early-termination hint; the parser below handles both tagged and
1976
1992
  // untagged responses so untagged "casual answer" replies still work.
1993
+ //
1994
+ // Force `thinking: disabled` + `effort: none` so the call works on any
1995
+ // user profile — including thinking-enabled profiles (Opus 4.x at
1996
+ // `effort: high|xhigh`, etc.) where Anthropic 400s on `temperature` ≠ 1
1997
+ // when thinking is enabled or in adaptive mode. A 60-token reply chip
1998
+ // doesn't benefit from extended thinking anyway, and burning thinking
1999
+ // tokens here would be wasteful.
1977
2000
  const response = await provider.sendMessage(
1978
2001
  [{ role: "user", content: [{ type: "text", text: userPrompt }] }],
1979
2002
  [], // no tools
@@ -1984,6 +2007,8 @@ async function generateLlmSuggestion(
1984
2007
  max_tokens: 60,
1985
2008
  stop_sequences: ["</reply>"],
1986
2009
  temperature: 0.7,
2010
+ thinking: { type: "disabled" },
2011
+ effort: "none",
1987
2012
  },
1988
2013
  },
1989
2014
  );
@@ -2257,6 +2282,7 @@ export const ROUTES: RouteDefinition[] = [
2257
2282
  .optional(),
2258
2283
  conversationType: z.string().optional(),
2259
2284
  slashCommand: z.string().optional(),
2285
+ clientTimezone: z.string().optional(),
2260
2286
  inferenceProfile: z.string().nullable().optional(),
2261
2287
  riskThreshold: z.enum(VALID_RISK_THRESHOLDS).optional(),
2262
2288
  }),
@@ -0,0 +1,163 @@
1
+ /**
2
+ * IPC route for executing shell commands through the assistant process.
3
+ *
4
+ * The CLI sends the command over the IPC socket and receives a single
5
+ * response containing stdout, stderr, and the exit code.
6
+ *
7
+ * **Security**: Gated behind VELLUM_DEBUG=1. When debug mode is off (the
8
+ * default), the handler returns an error immediately so the CLI surfaces a
9
+ * clear rejection instead of hanging. The assistant must be restarted with
10
+ * VELLUM_DEBUG=1 for this route to execute commands.
11
+ */
12
+
13
+ import { spawn } from "node:child_process";
14
+
15
+ import { z } from "zod";
16
+
17
+ import { getIsContainerized } from "../../config/env-registry.js";
18
+ import { getWorkspaceDir } from "../../util/platform.js";
19
+ import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
20
+
21
+ const DEFAULT_TIMEOUT_MS = 30_000;
22
+
23
+ function isDebugMode(): boolean {
24
+ return (
25
+ process.env.VELLUM_DEBUG === "1" || process.env.VELLUM_DEBUG === "true"
26
+ );
27
+ }
28
+
29
+ interface DebugBashResult {
30
+ stdout: string;
31
+ stderr: string;
32
+ exitCode: number | null;
33
+ timedOut: boolean;
34
+ error?: string;
35
+ }
36
+
37
+ function handleDebugBash({ body }: RouteHandlerArgs): Promise<DebugBashResult> {
38
+ if (getIsContainerized()) {
39
+ return Promise.resolve({
40
+ stdout: "",
41
+ stderr: "",
42
+ exitCode: null,
43
+ timedOut: false,
44
+ error: "debug bash is not available in containerized environments",
45
+ });
46
+ }
47
+
48
+ if (!isDebugMode()) {
49
+ return Promise.resolve({
50
+ stdout: "",
51
+ stderr: "",
52
+ exitCode: null,
53
+ timedOut: false,
54
+ error:
55
+ "Bash debug execution is disabled. The running assistant process must have been started with VELLUM_DEBUG=1 (setting it on the CLI command alone is not enough). Restart the assistant with: vellum sleep && VELLUM_DEBUG=1 vellum wake",
56
+ });
57
+ }
58
+
59
+ const { command, timeoutMs } = body as {
60
+ command?: string;
61
+ timeoutMs?: number;
62
+ };
63
+
64
+ if (!command || typeof command !== "string") {
65
+ return Promise.resolve({
66
+ stdout: "",
67
+ stderr: "",
68
+ exitCode: null,
69
+ timedOut: false,
70
+ error: "command is required",
71
+ });
72
+ }
73
+
74
+ const effectiveTimeout =
75
+ typeof timeoutMs === "number" && timeoutMs > 0
76
+ ? timeoutMs
77
+ : DEFAULT_TIMEOUT_MS;
78
+
79
+ return new Promise<DebugBashResult>((resolve) => {
80
+ const stdoutChunks: Buffer[] = [];
81
+ const stderrChunks: Buffer[] = [];
82
+ let timedOut = false;
83
+ let settled = false;
84
+
85
+ const finish = (result: DebugBashResult) => {
86
+ if (settled) return;
87
+ settled = true;
88
+ resolve(result);
89
+ };
90
+
91
+ const child = spawn("bash", ["-c", command], {
92
+ cwd: getWorkspaceDir(),
93
+ stdio: ["ignore", "pipe", "pipe"],
94
+ detached: true,
95
+ });
96
+
97
+ const timer = setTimeout(() => {
98
+ timedOut = true;
99
+ try {
100
+ process.kill(-child.pid!, "SIGKILL");
101
+ } catch {
102
+ // Process group may have already exited.
103
+ }
104
+ }, effectiveTimeout);
105
+
106
+ child.stdout.on("data", (data: Buffer) => {
107
+ stdoutChunks.push(data);
108
+ });
109
+
110
+ child.stderr.on("data", (data: Buffer) => {
111
+ stderrChunks.push(data);
112
+ });
113
+
114
+ child.on("close", (code) => {
115
+ clearTimeout(timer);
116
+ finish({
117
+ stdout: Buffer.concat(stdoutChunks).toString(),
118
+ stderr: Buffer.concat(stderrChunks).toString(),
119
+ exitCode: code,
120
+ timedOut,
121
+ });
122
+ });
123
+
124
+ child.on("error", (err) => {
125
+ clearTimeout(timer);
126
+ finish({
127
+ stdout: "",
128
+ stderr: "",
129
+ exitCode: null,
130
+ timedOut: false,
131
+ error: err.message,
132
+ });
133
+ });
134
+ });
135
+ }
136
+
137
+ export const ROUTES: RouteDefinition[] = [
138
+ {
139
+ operationId: "debug_bash",
140
+ endpoint: "debug/bash",
141
+ method: "POST",
142
+ requireGuardian: false,
143
+ summary: "Execute a shell command in the assistant process",
144
+ description:
145
+ "Developer debugging tool. Requires the assistant to be running with VELLUM_DEBUG=1.",
146
+ tags: ["debug"],
147
+ requestBody: z.object({
148
+ command: z.string().describe("Shell command to execute via bash -c"),
149
+ timeoutMs: z
150
+ .number()
151
+ .optional()
152
+ .describe("Execution timeout in milliseconds (default: 30000)"),
153
+ }),
154
+ responseBody: z.object({
155
+ stdout: z.string(),
156
+ stderr: z.string(),
157
+ exitCode: z.number().nullable(),
158
+ timedOut: z.boolean(),
159
+ error: z.string().optional(),
160
+ }),
161
+ handler: handleDebugBash,
162
+ },
163
+ ];
@@ -0,0 +1,121 @@
1
+ import { z } from "zod";
2
+
3
+ import {
4
+ acknowledgeDiskPressureLock,
5
+ DISK_PRESSURE_OVERRIDE_CONFIRMATION,
6
+ getDiskPressureStatus,
7
+ overrideDiskPressureLock,
8
+ } from "../../daemon/disk-pressure-guard.js";
9
+ import { RouteError } from "./errors.js";
10
+ import type { RouteDefinition } from "./types.js";
11
+
12
+ const DiskPressureStatusSchema = z.object({
13
+ enabled: z.boolean(),
14
+ state: z.enum(["disabled", "ok", "critical", "unknown"]),
15
+ locked: z.boolean(),
16
+ acknowledged: z.boolean(),
17
+ overrideActive: z.boolean(),
18
+ effectivelyLocked: z.boolean(),
19
+ lockId: z.string().nullable(),
20
+ usagePercent: z.number().nullable(),
21
+ thresholdPercent: z.number(),
22
+ path: z.string().nullable(),
23
+ lastCheckedAt: z.string().nullable(),
24
+ blockedCapabilities: z.array(
25
+ z.enum(["agent-turns", "background-work", "remote-ingress"]),
26
+ ),
27
+ error: z.string().nullable(),
28
+ });
29
+
30
+ const DiskPressureActionResponseSchema = z.object({
31
+ status: DiskPressureStatusSchema,
32
+ });
33
+
34
+ const OverrideRequestSchema = z.object({
35
+ confirmation: z.string(),
36
+ });
37
+
38
+ function statusResponse() {
39
+ return { status: getDiskPressureStatus() };
40
+ }
41
+
42
+ function transitionErrorCode(
43
+ reason: "not_locked" | "already_acknowledged" | "already_overridden",
44
+ ): string {
45
+ if (reason === "not_locked") return "NOT_LOCKED";
46
+ if (reason === "already_acknowledged") return "ALREADY_ACKNOWLEDGED";
47
+ return "ALREADY_OVERRIDDEN";
48
+ }
49
+
50
+ export const ROUTES: RouteDefinition[] = [
51
+ {
52
+ operationId: "getDiskPressureStatus",
53
+ endpoint: "disk-pressure/status",
54
+ method: "GET",
55
+ policyKey: "disk-pressure/status",
56
+ requirePolicyEnforcement: true,
57
+ summary: "Get disk pressure status",
58
+ description:
59
+ "Return the current disk pressure status snapshot. When safe storage limits are disabled, returns a disabled status.",
60
+ tags: ["disk-pressure"],
61
+ responseBody: DiskPressureActionResponseSchema,
62
+ handler: () => statusResponse(),
63
+ },
64
+ {
65
+ operationId: "acknowledgeDiskPressure",
66
+ endpoint: "disk-pressure/acknowledge",
67
+ method: "POST",
68
+ policyKey: "disk-pressure/acknowledge",
69
+ requirePolicyEnforcement: true,
70
+ summary: "Acknowledge disk pressure",
71
+ description:
72
+ "Acknowledge the current disk pressure lock and enter cleanup mode without overriding assistant protections.",
73
+ tags: ["disk-pressure"],
74
+ responseBody: DiskPressureActionResponseSchema,
75
+ additionalResponses: {
76
+ "409": { description: "No active lock or lock already acknowledged." },
77
+ },
78
+ handler: () => {
79
+ const result = acknowledgeDiskPressureLock();
80
+ if (result.ok) return { status: result.status };
81
+ if (result.reason === "invalid_confirmation") {
82
+ throw new RouteError(result.message, "INVALID_CONFIRMATION", 400);
83
+ }
84
+ throw new RouteError(
85
+ result.message,
86
+ transitionErrorCode(result.reason),
87
+ 409,
88
+ );
89
+ },
90
+ },
91
+ {
92
+ operationId: "overrideDiskPressure",
93
+ endpoint: "disk-pressure/override",
94
+ method: "POST",
95
+ policyKey: "disk-pressure/override",
96
+ requirePolicyEnforcement: true,
97
+ summary: "Override disk pressure",
98
+ description: `Override the current disk pressure lock only after confirming "${DISK_PRESSURE_OVERRIDE_CONFIRMATION}".`,
99
+ tags: ["disk-pressure"],
100
+ requestBody: OverrideRequestSchema,
101
+ responseBody: DiskPressureActionResponseSchema,
102
+ additionalResponses: {
103
+ "400": { description: "Confirmation phrase is invalid." },
104
+ "409": { description: "No active lock or lock already overridden." },
105
+ },
106
+ handler: ({ body }) => {
107
+ const parsed = OverrideRequestSchema.safeParse(body);
108
+ const confirmation = parsed.success ? parsed.data.confirmation : "";
109
+ const result = overrideDiskPressureLock(confirmation);
110
+ if (result.ok) return { status: result.status };
111
+ if (result.reason === "invalid_confirmation") {
112
+ throw new RouteError(result.message, "INVALID_CONFIRMATION", 400);
113
+ }
114
+ throw new RouteError(
115
+ result.message,
116
+ transitionErrorCode(result.reason),
117
+ 409,
118
+ );
119
+ },
120
+ },
121
+ ];
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Markdown to PDF renderer for document export.
3
+ *
4
+ * Converts markdown content to styled HTML via `marked`, then renders
5
+ * the HTML to a PDF buffer using Playwright headless Chromium.
6
+ * The HTML template uses print-friendly styling that matches the
7
+ * document editor typography.
8
+ */
9
+
10
+ import { marked } from "marked";
11
+
12
+ import { importPlaywright } from "../../tools/browser/runtime-check.js";
13
+
14
+ // ---------------------------------------------------------------------------
15
+ // Print template
16
+ // ---------------------------------------------------------------------------
17
+
18
+ const FONT_STACK = `"DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif`;
19
+
20
+ function wrapInPrintTemplate(innerHtml: string): string {
21
+ return `<!DOCTYPE html>
22
+ <html>
23
+ <head>
24
+ <meta charset="utf-8">
25
+ <style>
26
+ * { margin: 0; padding: 0; box-sizing: border-box; }
27
+
28
+ body {
29
+ font-family: ${FONT_STACK};
30
+ font-size: 14px;
31
+ line-height: 1.7;
32
+ color: #1a1a1a;
33
+ background: #ffffff;
34
+ padding: 0;
35
+ }
36
+
37
+ h1 { font-size: 28px; font-weight: 600; margin-top: 32px; margin-bottom: 12px; }
38
+ h2 { font-size: 22px; font-weight: 600; margin-top: 28px; margin-bottom: 10px; }
39
+ h3 { font-size: 18px; font-weight: 600; margin-top: 24px; margin-bottom: 8px; }
40
+ h4, h5, h6 { font-size: 16px; font-weight: 600; margin-top: 20px; margin-bottom: 8px; }
41
+
42
+ p {
43
+ margin-bottom: 12px;
44
+ }
45
+
46
+ pre {
47
+ background: #f5f5f5;
48
+ border-radius: 8px;
49
+ padding: 12px 16px;
50
+ overflow-x: auto;
51
+ margin-bottom: 12px;
52
+ }
53
+
54
+ code {
55
+ font-family: "DM Mono", "SF Mono", monospace;
56
+ font-size: 13px;
57
+ background: #f5f5f5;
58
+ border-radius: 4px;
59
+ padding: 2px 5px;
60
+ }
61
+
62
+ pre code {
63
+ background: none;
64
+ padding: 0;
65
+ border-radius: 0;
66
+ }
67
+
68
+ blockquote {
69
+ border-left: 3px solid #6366f1;
70
+ padding-left: 16px;
71
+ margin: 12px 0;
72
+ color: #555555;
73
+ }
74
+
75
+ table {
76
+ width: 100%;
77
+ border-collapse: collapse;
78
+ margin: 12px 0;
79
+ }
80
+
81
+ th, td {
82
+ border: 1px solid #e0e0e0;
83
+ padding: 8px 12px;
84
+ text-align: left;
85
+ }
86
+
87
+ th {
88
+ background: #f5f5f5;
89
+ font-weight: 600;
90
+ }
91
+
92
+ ul, ol {
93
+ margin: 12px 0;
94
+ padding-left: 24px;
95
+ }
96
+
97
+ li {
98
+ margin-bottom: 4px;
99
+ }
100
+
101
+ a {
102
+ color: #6366f1;
103
+ text-decoration: none;
104
+ }
105
+
106
+ hr {
107
+ border: none;
108
+ border-top: 1px solid #e0e0e0;
109
+ margin: 24px 0;
110
+ }
111
+
112
+ img {
113
+ max-width: 100%;
114
+ height: auto;
115
+ }
116
+
117
+ </style>
118
+ </head>
119
+ <body>
120
+ ${innerHtml}
121
+ </body>
122
+ </html>`;
123
+ }
124
+
125
+ // ---------------------------------------------------------------------------
126
+ // Public API
127
+ // ---------------------------------------------------------------------------
128
+
129
+ /**
130
+ * Convert a markdown string to a PDF buffer.
131
+ *
132
+ * Parses markdown to HTML via `marked`, wraps it in a print-friendly
133
+ * template, then renders to PDF using Playwright headless Chromium.
134
+ * The browser is always closed in a `finally` block.
135
+ */
136
+ export async function renderMarkdownToPDF(
137
+ title: string,
138
+ markdown: string,
139
+ ): Promise<Buffer> {
140
+ const innerHtml = marked.parse(markdown, {
141
+ gfm: true,
142
+ breaks: true,
143
+ }) as string;
144
+ const fullHtml = wrapInPrintTemplate(innerHtml);
145
+
146
+ const pw = await importPlaywright();
147
+ const browser = await pw.chromium.launch({ headless: true });
148
+ try {
149
+ const context = await browser.newContext({
150
+ javaScriptEnabled: false,
151
+ });
152
+ const page = await context.newPage();
153
+ await page.route("**/*", (route) => route.abort());
154
+ await page.setContent(fullHtml, { waitUntil: "domcontentloaded" });
155
+ const pdfBuffer = await page.pdf({
156
+ format: "A4",
157
+ margin: {
158
+ top: "0.75in",
159
+ bottom: "0.75in",
160
+ left: "0.75in",
161
+ right: "0.75in",
162
+ },
163
+ printBackground: true,
164
+ });
165
+ return Buffer.from(pdfBuffer);
166
+ } finally {
167
+ await browser.close();
168
+ }
169
+ }