@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
@@ -43,6 +43,7 @@ import type {
43
43
  } from "../plugins/types.js";
44
44
  import type { ContentBlock, ImageContent } from "../providers/types.js";
45
45
  import { isContextOverflowError } from "../providers/types.js";
46
+ import { redactSecrets } from "../security/secret-scanner.js";
46
47
  import { ProviderError } from "../util/errors.js";
47
48
  import { getLogger } from "../util/logger.js";
48
49
  import type { DirectiveRequest } from "./assistant-attachments.js";
@@ -136,6 +137,8 @@ export interface EventHandlerState {
136
137
  readonly directiveWarnings: string[];
137
138
  readonly toolUseIdToName: Map<string, string>;
138
139
  currentTurnToolNames: string[];
140
+ /** Sticky for the whole run: this turn created/refreshed an app. */
141
+ appBuildToolUsedThisRun: boolean;
139
142
  /** Tracks whether the first text delta has been emitted this turn for activity state transitions. */
140
143
  firstTextDeltaEmitted: boolean;
141
144
  /** Tracks whether a thinking delta has been emitted this turn for activity state transitions. */
@@ -218,6 +221,7 @@ export function createEventHandlerState(): EventHandlerState {
218
221
  directiveWarnings: [],
219
222
  toolUseIdToName: new Map(),
220
223
  currentTurnToolNames: [],
224
+ appBuildToolUsedThisRun: false,
221
225
  firstTextDeltaEmitted: false,
222
226
  firstThinkingDeltaEmitted: false,
223
227
  lastCompletedToolName: undefined,
@@ -364,6 +368,9 @@ export function handleToolUse(
364
368
  ): void {
365
369
  state.toolUseIdToName.set(event.id, event.name);
366
370
  state.currentTurnToolNames.push(event.name);
371
+ if (event.name === "app_create" || event.name === "app_refresh") {
372
+ state.appBuildToolUsedThisRun = true;
373
+ }
367
374
  state.toolCallTimestamps.set(event.id, { startedAt: Date.now() });
368
375
  state.currentToolUseId = event.id;
369
376
  state.currentTurnToolUseIds.push(event.id);
@@ -804,10 +811,16 @@ export async function handleMessageComplete(
804
811
  ([toolUseId, result]) => ({
805
812
  type: "tool_result",
806
813
  tool_use_id: toolUseId,
807
- content: result.content,
814
+ content: redactSecrets(result.content),
808
815
  is_error: result.isError,
809
816
  ...(result.contentBlocks
810
- ? { contentBlocks: result.contentBlocks }
817
+ ? {
818
+ contentBlocks: result.contentBlocks.map((block) =>
819
+ block.type === "text"
820
+ ? { ...block, text: redactSecrets(block.text) }
821
+ : block,
822
+ ),
823
+ }
811
824
  : {}),
812
825
  }),
813
826
  );
@@ -929,6 +942,17 @@ export async function handleMessageComplete(
929
942
  );
930
943
  }
931
944
  }
945
+ // Redact known-pattern secrets from assistant text blocks before they are
946
+ // written to durable storage. Non-text blocks (images, UI surfaces) pass
947
+ // through unchanged. The live model history retains the original values.
948
+ const contentForPersistence = contentWithSurfaces.map((block) => {
949
+ if (block.type === "text") {
950
+ const tb = block as Extract<ContentBlock, { type: "text" }>;
951
+ return { ...tb, text: redactSecrets(tb.text) };
952
+ }
953
+ return block;
954
+ });
955
+
932
956
  // Route the assistant-message persistence through the `persistence`
933
957
  // pipeline. No `syncToDisk` here — the orchestrator separately invokes
934
958
  // `syncMessageToDisk` on `state.lastAssistantMessageId` after the loop
@@ -941,7 +965,7 @@ export async function handleMessageComplete(
941
965
  op: "add",
942
966
  conversationId: deps.ctx.conversationId,
943
967
  role: "assistant",
944
- content: JSON.stringify(contentWithSurfaces),
968
+ content: JSON.stringify(contentForPersistence),
945
969
  metadata: assistantChannelMetadata,
946
970
  },
947
971
  buildHandlerTurnContext(deps),
@@ -24,7 +24,6 @@ import type {
24
24
  TurnChannelContext,
25
25
  TurnInterfaceContext,
26
26
  } from "../channels/types.js";
27
- import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
28
27
  import {
29
28
  contextWindowConfigFromEffective,
30
29
  resolveEffectiveContextWindow,
@@ -74,7 +73,10 @@ import type { ConversationGraphMemory } from "../memory/graph/conversation-graph
74
73
  import { recordMemoryRecallLog } from "../memory/memory-recall-log-store.js";
75
74
  import { PKB_WORKSPACE_SCOPE } from "../memory/pkb/types.js";
76
75
  import type { QdrantSparseVector } from "../memory/qdrant-client.js";
77
- import { readMemoryV2StaticContent } from "../memory/v2/static-context.js";
76
+ import {
77
+ readMemoryV2StaticContent,
78
+ shouldLoadMemoryV2Static,
79
+ } from "../memory/v2/static-context.js";
78
80
  import type { PermissionPrompter } from "../permissions/prompter.js";
79
81
  import { defaultCompactionTerminal } from "../plugins/defaults/compaction.js";
80
82
  import { defaultHistoryRepairTerminal } from "../plugins/defaults/history-repair.js";
@@ -107,6 +109,11 @@ import type {
107
109
  TurnContext as PluginTurnContext,
108
110
  } from "../plugins/types.js";
109
111
  import { PluginExecutionError, PluginTimeoutError } from "../plugins/types.js";
112
+ import {
113
+ hasProactiveArtifactCompleted,
114
+ runProactiveArtifactJob,
115
+ tryClaimProactiveArtifactTrigger,
116
+ } from "../proactive-artifact/index.js";
110
117
  import type {
111
118
  ContentBlock,
112
119
  Message,
@@ -114,7 +121,9 @@ import type {
114
121
  } from "../providers/types.js";
115
122
  import type { Provider } from "../providers/types.js";
116
123
  import { resolveActorTrust } from "../runtime/actor-trust-resolver.js";
124
+ import { broadcastMessage } from "../runtime/assistant-event-hub.js";
117
125
  import { DAEMON_INTERNAL_ASSISTANT_ID } from "../runtime/assistant-scope.js";
126
+ import { redactSecrets } from "../security/secret-scanner.js";
118
127
  import { getSubagentManager } from "../subagent/index.js";
119
128
  import type { UsageActor } from "../usage/actors.js";
120
129
  import { getLogger } from "../util/logger.js";
@@ -127,6 +136,7 @@ import {
127
136
  type AssistantAttachmentDraft,
128
137
  cleanAssistantContent,
129
138
  } from "./assistant-attachments.js";
139
+ import { cleanupBootstrapAfterTurnThreshold } from "./bootstrap-turn-cleanup.js";
130
140
  import { resolveOverflowAction } from "./context-overflow-policy.js";
131
141
  import {
132
142
  createInitialReducerState,
@@ -174,7 +184,12 @@ import type { SkillProjectionCache } from "./conversation-skill-tools.js";
174
184
  import { markSurfaceCompleted } from "./conversation-surfaces.js";
175
185
  import { resolveTrustClass } from "./conversation-tool-setup.js";
176
186
  import { recordUsage } from "./conversation-usage.js";
177
- import { formatTurnTimestamp } from "./date-context.js";
187
+ import {
188
+ formatTurnTimestamp,
189
+ resolveTurnTimezoneContext,
190
+ } from "./date-context.js";
191
+ import { getDiskPressureStatus } from "./disk-pressure-guard.js";
192
+ import { classifyDiskPressureTurnPolicy } from "./disk-pressure-policy.js";
178
193
  import { deepRepairHistory } from "./history-repair.js";
179
194
  import type {
180
195
  DynamicPageSurfaceData,
@@ -191,6 +206,8 @@ import type { TrustContext } from "./trust-context.js";
191
206
  import { stripHistoricalWebSearchResults } from "./web-search-history.js";
192
207
 
193
208
  const log = getLogger("conversation-agent-loop");
209
+ const DISK_PRESSURE_ERROR_CODE = "DISK_SPACE_CRITICAL" as const;
210
+ const DISK_PRESSURE_ERROR_CATEGORY = "disk_pressure";
194
211
 
195
212
  /** Title-cased friendly labels for tool names, used in confirmation chips. */
196
213
  const TOOL_FRIENDLY_LABEL: Record<string, string> = {
@@ -210,6 +227,10 @@ type GitServiceInitializer = {
210
227
  ensureInitialized(): Promise<void>;
211
228
  };
212
229
 
230
+ function formatDiskPressureBlockedMessage(): string {
231
+ return "Storage is critically low, so background processes are paused and remote messages are ignored until the guardian frees enough space. Remote senders should try again later.";
232
+ }
233
+
213
234
  // ── Compaction circuit-breaker pipeline helpers ─────────────────────
214
235
  //
215
236
  // The circuit-breaker behavior (3 consecutive summary-LLM failures trips a
@@ -437,7 +458,6 @@ export interface AgentLoopConversationContext {
437
458
  /** Timestamp (ms since epoch) until which the circuit breaker is open. */
438
459
  compactionCircuitOpenUntil: number | null;
439
460
 
440
- readonly memoryPolicy: { scopeId: string; includeDefaultFallback: boolean };
441
461
  readonly graphMemory: ConversationGraphMemory;
442
462
 
443
463
  currentActiveSurfaceId?: string;
@@ -494,9 +514,11 @@ export interface AgentLoopConversationContext {
494
514
  voiceCallControlPrompt?: string;
495
515
  transportHints?: string[];
496
516
  slackRuntimeContextNotice?: string;
517
+ clientTimezone?: string;
497
518
 
498
519
  readonly coreToolNames: Set<string>;
499
520
  allowedToolNames?: Set<string>;
521
+ diskPressureCleanupModeActive?: boolean;
500
522
  toolsDisabledDepth: number;
501
523
  preactivatedSkillIds?: string[];
502
524
  readonly skillProjectionState: Map<string, string>;
@@ -706,19 +728,39 @@ export async function runAgentLoopImpl(
706
728
  };
707
729
  })();
708
730
 
731
+ const isInteractiveResolved =
732
+ options?.isInteractive ?? (!ctx.hasNoClient && !ctx.headlessLock);
733
+ const diskPressureDecision = classifyDiskPressureTurnPolicy(
734
+ getDiskPressureStatus(),
735
+ {
736
+ conversationType: turnStartConversation?.conversationType ?? null,
737
+ conversationSource: turnStartConversation?.source ?? null,
738
+ callSite: turnCallSite,
739
+ isInteractive: isInteractiveResolved,
740
+ sourceChannel:
741
+ ctx.trustContext?.sourceChannel ??
742
+ capturedTurnChannelContext.userMessageChannel,
743
+ sourceInterface:
744
+ ctx.channelCapabilities?.clientOS ??
745
+ capturedTurnInterfaceContext.userMessageInterface,
746
+ trustContext: ctx.trustContext
747
+ ? {
748
+ sourceChannel: ctx.trustContext.sourceChannel,
749
+ trustClass: ctx.trustContext.trustClass,
750
+ }
751
+ : null,
752
+ },
753
+ );
754
+ const diskPressureContext =
755
+ diskPressureDecision.action === "allow-cleanup-mode"
756
+ ? { cleanupModeActive: true }
757
+ : null;
758
+ ctx.diskPressureCleanupModeActive =
759
+ diskPressureDecision.action === "allow-cleanup-mode";
760
+
709
761
  ctx.lastAssistantAttachments = [];
710
762
  ctx.lastAttachmentWarnings = [];
711
763
 
712
- // Ensure workspace git repo is initialized before any tools run.
713
- try {
714
- const getWorkspaceGitServiceFn =
715
- ctx.getWorkspaceGitService ?? getWorkspaceGitService;
716
- const gitService = getWorkspaceGitServiceFn(ctx.workingDir);
717
- await gitService.ensureInitialized();
718
- } catch (err) {
719
- rlog.warn({ err }, "Failed to initialize workspace git repo (non-fatal)");
720
- }
721
-
722
764
  ctx.profiler.startRequest();
723
765
  let turnStarted = false;
724
766
 
@@ -735,6 +777,52 @@ export async function runAgentLoopImpl(
735
777
  });
736
778
 
737
779
  try {
780
+ if (diskPressureDecision.action === "block") {
781
+ const message = formatDiskPressureBlockedMessage();
782
+ rlog.warn(
783
+ { reason: diskPressureDecision.reason },
784
+ "Blocked turn during disk pressure cleanup mode",
785
+ );
786
+ ctx.emitActivityState("idle", "error_terminal", "global", reqId);
787
+ ctx.traceEmitter.emit("request_error", message, {
788
+ requestId: reqId,
789
+ status: "error",
790
+ attributes: {
791
+ errorCategory: DISK_PRESSURE_ERROR_CATEGORY,
792
+ errorCode: DISK_PRESSURE_ERROR_CODE,
793
+ diskPressureReason: diskPressureDecision.reason,
794
+ },
795
+ });
796
+ onEvent({
797
+ type: "error",
798
+ conversationId: ctx.conversationId,
799
+ requestId: reqId,
800
+ code: DISK_PRESSURE_ERROR_CODE,
801
+ message,
802
+ category: DISK_PRESSURE_ERROR_CATEGORY,
803
+ errorCategory: DISK_PRESSURE_ERROR_CATEGORY,
804
+ });
805
+ onEvent({
806
+ type: "conversation_error",
807
+ conversationId: ctx.conversationId,
808
+ code: DISK_PRESSURE_ERROR_CODE,
809
+ userMessage: message,
810
+ retryable: true,
811
+ errorCategory: DISK_PRESSURE_ERROR_CATEGORY,
812
+ });
813
+ return;
814
+ }
815
+
816
+ // Ensure workspace git repo is initialized before any tools run.
817
+ try {
818
+ const getWorkspaceGitServiceFn =
819
+ ctx.getWorkspaceGitService ?? getWorkspaceGitService;
820
+ const gitService = getWorkspaceGitServiceFn(ctx.workingDir);
821
+ await gitService.ensureInitialized();
822
+ } catch (err) {
823
+ rlog.warn({ err }, "Failed to initialize workspace git repo (non-fatal)");
824
+ }
825
+
738
826
  // Auto-complete stale interactive surfaces from previous turns.
739
827
  // Only dismiss when the user sends a new message (not a surface action
740
828
  // response), so internal turns (subagent notifications, lifecycle
@@ -1237,14 +1325,16 @@ export async function runAgentLoopImpl(
1237
1325
 
1238
1326
  // Compute fresh turn timestamp for date grounding.
1239
1327
  // Absolute "now" is always anchored to assistant host clock, while local
1240
- // date semantics prefer configured user timezone, then recalled memory.
1328
+ // date semantics prefer configured user timezone, then device timezones.
1241
1329
  const hostTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
1242
- const configuredUserTimeZone = getConfig().ui.userTimezone ?? null;
1243
- const recalledUserTimeZone = null;
1244
- const timestamp = formatTurnTimestamp({
1330
+ const timezoneContext = resolveTurnTimezoneContext({
1331
+ configuredUserTimeZone: config.ui.userTimezone ?? null,
1332
+ clientTimezone: ctx.clientTimezone ?? null,
1333
+ detectedTimezone: config.ui.detectedTimezone ?? null,
1245
1334
  hostTimeZone,
1246
- configuredUserTimeZone,
1247
- userTimeZone: recalledUserTimeZone,
1335
+ });
1336
+ const timestamp = formatTurnTimestamp({
1337
+ timeZone: timezoneContext.effectiveTimezone,
1248
1338
  });
1249
1339
 
1250
1340
  // Resolve the inbound actor context for the unified <turn_context> block.
@@ -1298,23 +1388,26 @@ export async function runAgentLoopImpl(
1298
1388
  }
1299
1389
  }
1300
1390
 
1391
+ const baseTurnContext = {
1392
+ timestamp,
1393
+ interfaceName,
1394
+ channelName,
1395
+ configuredUserTimezone: timezoneContext.configuredUserTimezone,
1396
+ clientTimezone: timezoneContext.clientTimezone,
1397
+ detectedTimezone: timezoneContext.detectedTimezone,
1398
+ timeSinceLastMessage,
1399
+ };
1301
1400
  const unifiedTurnContextStr = buildUnifiedTurnContextBlock(
1302
1401
  isGuardian
1303
- ? { timestamp, interfaceName, channelName, timeSinceLastMessage }
1402
+ ? baseTurnContext
1304
1403
  : {
1305
- timestamp,
1306
- interfaceName,
1307
- channelName,
1404
+ ...baseTurnContext,
1308
1405
  actorContext: resolvedInboundActorContext,
1309
- timeSinceLastMessage,
1310
1406
  },
1311
1407
  );
1312
1408
 
1313
1409
  // The `remember` tool handles scratchpad-style memory writes directly to the graph.
1314
1410
 
1315
- const isInteractiveResolved =
1316
- options?.isInteractive ?? (!ctx.hasNoClient && !ctx.headlessLock);
1317
-
1318
1411
  // Inject NOW.md and PKB content only on the first turn (or after
1319
1412
  // compaction re-strips them). Old injections persist in history and
1320
1413
  // are never stripped on normal turns — this preserves the cached prefix.
@@ -1329,10 +1422,16 @@ export async function runAgentLoopImpl(
1329
1422
  const pkbActive = currentPkbContent !== null;
1330
1423
 
1331
1424
  // V2 static memory block (essentials/threads/recent/buffer). Same
1332
- // first-turn / post-compaction cadence as PKB `readMemoryV2StaticContent`
1333
- // self-gates on the v2 flag + config, returning null when v2 is off.
1334
- // Skip the file reads entirely on non-injection turns.
1335
- const currentMemoryV2Static = shouldInjectNowAndPkb
1425
+ // first-turn / post-compaction cadence as PKB. `shouldLoadMemoryV2Static`
1426
+ // also blocks remote-channel non-guardian actors from inducing the
1427
+ // model to recite private memory; `readMemoryV2StaticContent` self-gates
1428
+ // on the v2 flag + config and returns null when v2 is off, so the file
1429
+ // reads are skipped on non-injection turns.
1430
+ const currentMemoryV2Static = shouldLoadMemoryV2Static({
1431
+ shouldInjectNowAndPkb,
1432
+ sourceChannel: ctx.trustContext?.sourceChannel,
1433
+ isTrustedActor,
1434
+ })
1336
1435
  ? readMemoryV2StaticContent()
1337
1436
  : null;
1338
1437
  const memoryV2Static = currentMemoryV2Static;
@@ -1348,8 +1447,8 @@ export async function runAgentLoopImpl(
1348
1447
  // `getInContextPkbPaths` re-reads `conversation.messages` on each call,
1349
1448
  // so post-compaction re-injects see the updated history.
1350
1449
  const pkbConversation = pkbActive ? ctx : undefined;
1351
- // PKB points live under a single workspace sentinel scope, not the
1352
- // conversation's memoryPolicy.scopeId. See `PKB_WORKSPACE_SCOPE` for why.
1450
+ // PKB points live under a single workspace sentinel scope.
1451
+ // See `PKB_WORKSPACE_SCOPE` for why.
1353
1452
  const pkbScopeId = pkbActive ? PKB_WORKSPACE_SCOPE : undefined;
1354
1453
 
1355
1454
  // Subagent status injection — gives the parent LLM visibility into active/completed children.
@@ -1416,6 +1515,7 @@ export async function runAgentLoopImpl(
1416
1515
 
1417
1516
  // Shared injection options — reused whenever we need to re-inject after reduction.
1418
1517
  const injectionOpts = {
1518
+ diskPressureContext,
1419
1519
  activeSurface,
1420
1520
  workspaceTopLevelContext: shouldInjectWorkspace
1421
1521
  ? ctx.workspaceTopLevelContext
@@ -2533,10 +2633,16 @@ export async function runAgentLoopImpl(
2533
2633
  ).map(([toolUseId, result]) => ({
2534
2634
  type: "tool_result",
2535
2635
  tool_use_id: toolUseId,
2536
- content: result.content,
2636
+ content: redactSecrets(result.content),
2537
2637
  is_error: result.isError,
2538
2638
  ...(result.contentBlocks
2539
- ? { contentBlocks: result.contentBlocks }
2639
+ ? {
2640
+ contentBlocks: result.contentBlocks.map((block) =>
2641
+ block.type === "text"
2642
+ ? { ...block, text: redactSecrets(block.text) }
2643
+ : block,
2644
+ ),
2645
+ }
2540
2646
  : {}),
2541
2647
  }));
2542
2648
  const toolResultMetadata = {
@@ -2619,34 +2725,29 @@ export async function runAgentLoopImpl(
2619
2725
 
2620
2726
  // Post-turn tool result truncation: save large results to disk and
2621
2727
  // replace in-context content with a prefix/suffix stub + file pointer.
2622
- if (isAssistantFeatureFlagEnabled("tool-result-truncation", config)) {
2623
- try {
2624
- const conv = getConversation(ctx.conversationId);
2625
- if (conv) {
2626
- const convDir = getResolvedConversationDirPath(
2627
- ctx.conversationId,
2628
- conv.createdAt,
2728
+ try {
2729
+ const conv = getConversation(ctx.conversationId);
2730
+ if (conv) {
2731
+ const convDir = getResolvedConversationDirPath(
2732
+ ctx.conversationId,
2733
+ conv.createdAt,
2734
+ );
2735
+ const { messages: derefMessages, dereferencedCount } =
2736
+ derefToolResultReReads(restoredHistory);
2737
+ const { messages: truncatedMessages, truncatedCount } =
2738
+ postTurnTruncateToolResults(derefMessages, {
2739
+ conversationDir: convDir,
2740
+ });
2741
+ if (truncatedCount > 0 || dereferencedCount > 0) {
2742
+ rlog.info(
2743
+ { truncatedCount, dereferencedCount },
2744
+ "Post-turn tool result truncation applied",
2629
2745
  );
2630
- const { messages: derefMessages, dereferencedCount } =
2631
- derefToolResultReReads(restoredHistory);
2632
- const { messages: truncatedMessages, truncatedCount } =
2633
- postTurnTruncateToolResults(derefMessages, {
2634
- conversationDir: convDir,
2635
- });
2636
- if (truncatedCount > 0 || dereferencedCount > 0) {
2637
- rlog.info(
2638
- { truncatedCount, dereferencedCount },
2639
- "Post-turn tool result truncation applied",
2640
- );
2641
- }
2642
- restoredHistory = truncatedMessages;
2643
2746
  }
2644
- } catch (err) {
2645
- rlog.warn(
2646
- { err },
2647
- "Post-turn tool result truncation failed (non-fatal)",
2648
- );
2747
+ restoredHistory = truncatedMessages;
2649
2748
  }
2749
+ } catch (err) {
2750
+ rlog.warn({ err }, "Post-turn tool result truncation failed (non-fatal)");
2650
2751
  }
2651
2752
 
2652
2753
  // Persist injections in history: runtime-injected context stays on
@@ -2872,6 +2973,42 @@ export async function runAgentLoopImpl(
2872
2973
  "Failed to build home-feed event for background conversation",
2873
2974
  );
2874
2975
  }
2976
+
2977
+ // Proactive artifact: fire once when the processed turn was the 4th user message.
2978
+ // Only trigger for real user-authored turns (not subagent/system messages).
2979
+ {
2980
+ const paConv = getConversation(ctx.conversationId);
2981
+ if (
2982
+ paConv &&
2983
+ paConv.conversationType === "standard" &&
2984
+ options?.isUserMessage
2985
+ ) {
2986
+ void (async () => {
2987
+ try {
2988
+ if (hasProactiveArtifactCompleted()) return;
2989
+ const userMsg = getMessageById(
2990
+ userMessageId,
2991
+ ctx.conversationId,
2992
+ );
2993
+ if (!userMsg) return;
2994
+ if (!tryClaimProactiveArtifactTrigger(userMsg.createdAt))
2995
+ return;
2996
+ await runProactiveArtifactJob({
2997
+ conversationId: ctx.conversationId,
2998
+ userMessageCutoff: userMsg.createdAt,
2999
+ assistantMessageId: state.lastAssistantMessageId,
3000
+ suppressAppBuild: state.appBuildToolUsedThisRun,
3001
+ broadcastMessage,
3002
+ });
3003
+ } catch (err) {
3004
+ log.warn(
3005
+ { err, conversationId: ctx.conversationId },
3006
+ "Proactive artifact trigger failed",
3007
+ );
3008
+ }
3009
+ })();
3010
+ }
3011
+ }
2875
3012
  }
2876
3013
  }
2877
3014
 
@@ -2935,11 +3072,14 @@ export async function runAgentLoopImpl(
2935
3072
  conversationId: ctx.conversationId,
2936
3073
  code: classified.code,
2937
3074
  message: classified.userMessage,
3075
+ errorCategory: classified.errorCategory,
2938
3076
  });
2939
3077
  onEvent(buildConversationErrorMessage(ctx.conversationId, classified));
2940
3078
  }
2941
3079
  } finally {
2942
3080
  if (turnStarted) {
3081
+ cleanupBootstrapAfterTurnThreshold(ctx.conversationId);
3082
+
2943
3083
  ctx.turnCount++;
2944
3084
  const config = getConfig();
2945
3085
  const maxWait = config.workspaceGit?.turnCommitMaxWaitMs ?? 4000;
@@ -2984,6 +3124,7 @@ export async function runAgentLoopImpl(
2984
3124
  ctx.currentRequestId = undefined;
2985
3125
  ctx.currentActiveSurfaceId = undefined;
2986
3126
  ctx.allowedToolNames = undefined;
3127
+ ctx.diskPressureCleanupModeActive = false;
2987
3128
  ctx.preactivatedSkillIds = undefined;
2988
3129
  ctx.currentTurnOverrideProfile = undefined;
2989
3130
  ctx.slackRuntimeContextNotice = undefined;
@@ -36,6 +36,23 @@ const NETWORK_PATTERNS = [
36
36
  // Rate limit patterns (HTTP 429 or explicit rate limit messages)
37
37
  const RATE_LIMIT_PATTERNS = [/429/, /rate.?limit/i, /too many requests/i];
38
38
 
39
+ // Managed usage-limit responses are generated by Vellum, even though they can
40
+ // travel through provider SDKs and get wrapped as ProviderError.
41
+ const MANAGED_USAGE_LIMIT_PATTERNS = [
42
+ /"code"\s*:\s*"daily_quota_exceeded"/i,
43
+ /"code"\s*:\s*"rate_limit_exceeded"/i,
44
+ /system credential proxy rate limit/i,
45
+ /you've reached your usage limit for today/i,
46
+ /current plan allows/i,
47
+ ];
48
+
49
+ const PROVIDER_BILLING_PATTERNS = [
50
+ /credit balance is too low/i,
51
+ /insufficient.*credits?/i,
52
+ /requires more credits/i,
53
+ /can only afford/i,
54
+ ];
55
+
39
56
  // Overloaded patterns — provider is capacity-constrained (distinct from rate limiting)
40
57
  const OVERLOADED_PATTERNS = [/overloaded/i];
41
58
 
@@ -259,15 +276,21 @@ function classifyCore(
259
276
  };
260
277
  }
261
278
  if (error.statusCode === 402) {
262
- return {
263
- code: "PROVIDER_BILLING",
264
- userMessage:
265
- "You've run out of credits. Add funds to continue using the assistant.",
266
- retryable: false,
267
- errorCategory: "credits_exhausted",
268
- };
279
+ if (isManagedBalanceError(error)) {
280
+ return managedBalanceClassification();
281
+ }
282
+ return providerBillingClassification();
269
283
  }
270
284
  if (error.statusCode === 429) {
285
+ if (isManagedUsageLimitError(error, message)) {
286
+ return {
287
+ code: "MANAGED_USAGE_LIMIT",
288
+ userMessage:
289
+ "Vellum managed inference is rate limited. This is a Vellum-side usage limit, not an AI provider outage.",
290
+ retryable: true,
291
+ errorCategory: "managed_usage_limit",
292
+ };
293
+ }
271
294
  return {
272
295
  code: "PROVIDER_RATE_LIMIT",
273
296
  userMessage:
@@ -331,13 +354,8 @@ function classifyCore(
331
354
  errorCategory: "tool_ordering",
332
355
  };
333
356
  }
334
- if (/credit balance is too low|insufficient.*credits?/i.test(message)) {
335
- return {
336
- code: "PROVIDER_BILLING",
337
- userMessage: "Your API key has insufficient credits.",
338
- retryable: false,
339
- errorCategory: "provider_billing",
340
- };
357
+ if (isProviderBillingError(message)) {
358
+ return providerBillingClassification();
341
359
  }
342
360
  if (
343
361
  /invalid.*api.?key|invalid.*x-api-key|authentication.?error|invalid.authentication/i.test(
@@ -362,7 +380,7 @@ function classifyCore(
362
380
  }
363
381
 
364
382
  // Regex fallback for non-ProviderError or ProviderError without statusCode
365
- return classifyByMessage(message);
383
+ return classifyByMessage(error, message);
366
384
  }
367
385
 
368
386
  /** Check whether an error message indicates a context-too-large failure. */
@@ -394,7 +412,52 @@ function isStreamingError(message: string): boolean {
394
412
  return STREAMING_ERROR_PATTERNS.some((p) => p.test(message));
395
413
  }
396
414
 
415
+ function isManagedUsageLimitError(error: unknown, message: string): boolean {
416
+ if (
417
+ error instanceof ProviderError &&
418
+ getProviderRoutingSource(error.provider) === "managed-proxy"
419
+ ) {
420
+ return true;
421
+ }
422
+ return MANAGED_USAGE_LIMIT_PATTERNS.some((p) => p.test(message));
423
+ }
424
+
425
+ function isManagedBalanceError(error: ProviderError): boolean {
426
+ return getProviderRoutingSource(error.provider) === "managed-proxy";
427
+ }
428
+
429
+ function isProviderBillingError(message: string): boolean {
430
+ return PROVIDER_BILLING_PATTERNS.some((p) => p.test(message));
431
+ }
432
+
433
+ function managedBalanceClassification(): Omit<
434
+ ClassifiedConversationError,
435
+ "debugDetails"
436
+ > {
437
+ return {
438
+ code: "PROVIDER_BILLING",
439
+ userMessage:
440
+ "You've run out of credits. Add funds to continue using the assistant.",
441
+ retryable: false,
442
+ errorCategory: "credits_exhausted",
443
+ };
444
+ }
445
+
446
+ function providerBillingClassification(): Omit<
447
+ ClassifiedConversationError,
448
+ "debugDetails"
449
+ > {
450
+ return {
451
+ code: "PROVIDER_BILLING",
452
+ userMessage:
453
+ "Your API provider account or key needs credits. Add funds with the provider or update the key in Settings.",
454
+ retryable: false,
455
+ errorCategory: "provider_billing",
456
+ };
457
+ }
458
+
397
459
  function classifyByMessage(
460
+ error: unknown,
398
461
  message: string,
399
462
  ): Omit<ClassifiedConversationError, "debugDetails"> {
400
463
  // Check context-too-large before other patterns
@@ -411,6 +474,15 @@ function classifyByMessage(
411
474
  // Check rate limit first (before network, since 429 could match both)
412
475
  for (const pattern of RATE_LIMIT_PATTERNS) {
413
476
  if (pattern.test(message)) {
477
+ if (isManagedUsageLimitError(error, message)) {
478
+ return {
479
+ code: "MANAGED_USAGE_LIMIT",
480
+ userMessage:
481
+ "Vellum managed inference is rate limited. This is a Vellum-side usage limit, not an AI provider outage.",
482
+ retryable: true,
483
+ errorCategory: "managed_usage_limit",
484
+ };
485
+ }
414
486
  return {
415
487
  code: "PROVIDER_RATE_LIMIT",
416
488
  userMessage: