@vellumai/assistant 0.10.7 → 0.10.8-dev.202607102228.5945895

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 (1558) hide show
  1. package/AGENTS.md +3 -1
  2. package/ARCHITECTURE.md +9 -9
  3. package/README.md +1 -1
  4. package/docs/architecture/memory.md +1 -3
  5. package/docs/credential-execution-service.md +9 -96
  6. package/docs/runbook-trusted-contacts.md +132 -93
  7. package/docs/trusted-contact-access.md +125 -115
  8. package/docs/workspace-tools.md +4 -2
  9. package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +62 -360
  10. package/eslint-rules/cli-no-daemon-internals.js +91 -269
  11. package/eslint.config.mjs +4 -4
  12. package/knip.json +2 -1
  13. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -2
  14. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/attachment-naming.test.ts +104 -0
  15. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +0 -2
  16. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/attachment-naming.ts +118 -0
  17. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/credential-rpc.ts +3 -5
  18. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/index.ts +2 -4
  19. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/rpc.ts +4 -447
  20. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -2
  21. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/attachment-naming.test.ts +104 -0
  22. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +0 -2
  23. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/attachment-naming.ts +118 -0
  24. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/credential-rpc.ts +3 -5
  25. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/index.ts +2 -4
  26. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/rpc.ts +4 -447
  27. package/node_modules/@vellumai/gateway-client/src/__tests__/invite-contract.test.ts +0 -18
  28. package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +40 -6
  29. package/node_modules/@vellumai/gateway-client/src/channel-permission-contract.ts +13 -0
  30. package/node_modules/@vellumai/gateway-client/src/index.ts +24 -2
  31. package/node_modules/@vellumai/gateway-client/src/invite-contract.ts +146 -16
  32. package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +22 -4
  33. package/node_modules/@vellumai/service-contracts/package.json +1 -2
  34. package/node_modules/@vellumai/service-contracts/src/__tests__/attachment-naming.test.ts +104 -0
  35. package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +0 -2
  36. package/node_modules/@vellumai/service-contracts/src/attachment-naming.ts +118 -0
  37. package/node_modules/@vellumai/service-contracts/src/credential-rpc.ts +3 -5
  38. package/node_modules/@vellumai/service-contracts/src/index.ts +2 -4
  39. package/node_modules/@vellumai/service-contracts/src/rpc.ts +4 -447
  40. package/openapi.yaml +1648 -676
  41. package/package.json +4 -5
  42. package/scripts/build-test-fixtures.ts +105 -0
  43. package/scripts/memory-inspect.ts +2 -8
  44. package/scripts/test.ts +597 -0
  45. package/src/__tests__/access-request-card-view.test.ts +38 -0
  46. package/src/__tests__/activation-early-marking.test.ts +1 -8
  47. package/src/__tests__/actor-token-service.test.ts +1 -22
  48. package/src/__tests__/add-message-preassigned-id.test.ts +1 -1
  49. package/src/__tests__/agent-image-optimize.test.ts +104 -1
  50. package/src/__tests__/agent-loop-callsite-precedence.test.ts +0 -5
  51. package/src/__tests__/agent-loop-compaction-events.test.ts +1 -1
  52. package/src/__tests__/agent-loop-compaction-strip.test.ts +1 -1
  53. package/src/__tests__/agent-loop-exit-reason.test.ts +1 -1
  54. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +0 -6
  55. package/src/__tests__/agent-loop-override-profile.test.ts +66 -5
  56. package/src/__tests__/agent-loop-pushes-post-hook-prompt.test.ts +1 -9
  57. package/src/__tests__/agent-loop-regrowth-guard.test.ts +1 -1
  58. package/src/__tests__/agent-loop-set-system-prompt.test.ts +1 -7
  59. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +1 -0
  60. package/src/__tests__/agent-wake-override-profile.test.ts +21 -1
  61. package/src/__tests__/annotate-activity-metadata.test.ts +4 -10
  62. package/src/__tests__/annotate-risk-options.test.ts +4 -10
  63. package/src/__tests__/anthropic-error-formatting.test.ts +193 -2
  64. package/src/__tests__/anthropic-gateway-shared.test.ts +140 -0
  65. package/src/__tests__/anthropic-provider.test.ts +58 -0
  66. package/src/__tests__/app-bundler.test.ts +0 -8
  67. package/src/__tests__/app-conversation-ids-backfill.test.ts +1 -8
  68. package/src/__tests__/app-routes-csp.test.ts +0 -8
  69. package/src/__tests__/approval-cascade.test.ts +0 -21
  70. package/src/__tests__/approval-interception-trust-gates.test.ts +0 -7
  71. package/src/__tests__/approval-primitive.test.ts +1 -9
  72. package/src/__tests__/approval-routes-http.test.ts +1 -16
  73. package/src/__tests__/assistant-attachment-directive.test.ts +1 -0
  74. package/src/__tests__/assistant-attachments.test.ts +211 -0
  75. package/src/__tests__/assistant-event-hub-machine-name.test.ts +0 -7
  76. package/src/__tests__/assistant-events-sse-hardening.test.ts +0 -7
  77. package/src/__tests__/assistant-feature-flag-guard.test.ts +3 -3
  78. package/src/__tests__/assistant-feature-flag-guardrails.test.ts +1 -1
  79. package/src/__tests__/attachment-stored-path-annotation.test.ts +0 -7
  80. package/src/__tests__/attachment-upload-trusted-source.test.ts +0 -7
  81. package/src/__tests__/attachments-store-heic-normalize.test.ts +0 -7
  82. package/src/__tests__/attachments-store.test.ts +43 -8
  83. package/src/__tests__/attachments.test.ts +77 -0
  84. package/src/__tests__/audit-log-rotation.test.ts +1 -9
  85. package/src/__tests__/auth-fallback-events-store.test.ts +0 -7
  86. package/src/__tests__/available-skills.test.ts +266 -0
  87. package/src/__tests__/avatar-generator.test.ts +0 -9
  88. package/src/__tests__/background-shell-host-bash.test.ts +0 -7
  89. package/src/__tests__/background-workers-disk-pressure.test.ts +4 -3
  90. package/src/__tests__/browser-fill-credential.test.ts +0 -7
  91. package/src/__tests__/browser-manager.test.ts +1 -8
  92. package/src/__tests__/btw-routes.test.ts +0 -7
  93. package/src/__tests__/build-persisted-content.test.ts +0 -8
  94. package/src/__tests__/call-constants.test.ts +1 -1
  95. package/src/__tests__/call-controller.test.ts +783 -34
  96. package/src/__tests__/call-conversation-messages.test.ts +2 -9
  97. package/src/__tests__/call-domain.test.ts +7 -24
  98. package/src/__tests__/call-pointer-message-composer.test.ts +0 -8
  99. package/src/__tests__/call-pointer-messages.test.ts +1 -8
  100. package/src/__tests__/call-recovery.test.ts +1 -8
  101. package/src/__tests__/call-routes-http.test.ts +0 -7
  102. package/src/__tests__/call-setup-flow-invite.test.ts +1 -1
  103. package/src/__tests__/call-setup-flow-midcall-trust.test.ts +76 -97
  104. package/src/__tests__/call-setup-flow-name-capture.test.ts +1 -1
  105. package/src/__tests__/call-setup-flow-verification.test.ts +1 -1
  106. package/src/__tests__/call-setup-flow.test.ts +2 -2
  107. package/src/__tests__/call-site-routing-provider.test.ts +1 -5
  108. package/src/__tests__/call-state.test.ts +1 -8
  109. package/src/__tests__/call-store.test.ts +1 -8
  110. package/src/__tests__/cancel-resolves-conversation-key.test.ts +0 -7
  111. package/src/__tests__/canonical-guardian-store.test.ts +1 -8
  112. package/src/__tests__/catalog-cache.test.ts +0 -8
  113. package/src/__tests__/catalog-files.test.ts +0 -8
  114. package/src/__tests__/catalog-install-normalize.test.ts +0 -7
  115. package/src/__tests__/ces-rpc-credential-backend.test.ts +0 -7
  116. package/src/__tests__/channel-approval-routes.test.ts +0 -7
  117. package/src/__tests__/channel-approvals.test.ts +0 -7
  118. package/src/__tests__/channel-delivery-store.test.ts +0 -7
  119. package/src/__tests__/channel-guardian.test.ts +29 -16
  120. package/src/__tests__/channel-inbound-disk-pressure.test.ts +0 -7
  121. package/src/__tests__/channel-reply-delivery.test.ts +18 -5
  122. package/src/__tests__/channel-retry-sweep.test.ts +0 -7
  123. package/src/__tests__/clawhub-files.test.ts +0 -8
  124. package/src/__tests__/clawhub.test.ts +0 -7
  125. package/src/__tests__/clear-all-lexical.test.ts +0 -6
  126. package/src/__tests__/client-os-metadata-persistence.test.ts +0 -5
  127. package/src/__tests__/compaction-direct.test.ts +47 -0
  128. package/src/__tests__/compaction-events.test.ts +14 -29
  129. package/src/__tests__/compaction-ledger-store.test.ts +1 -7
  130. package/src/__tests__/compaction-summary-head-persisted-count.test.ts +417 -0
  131. package/src/__tests__/compaction-trail-store.test.ts +2 -8
  132. package/src/__tests__/compaction.benchmark.test.ts +0 -5
  133. package/src/__tests__/compactor-call-site-logging.test.ts +0 -21
  134. package/src/__tests__/compactor-fixed-boundary.test.ts +334 -0
  135. package/src/__tests__/compactor-low-watermark-cut.test.ts +8 -23
  136. package/src/__tests__/compactor-media-strip.test.ts +0 -21
  137. package/src/__tests__/compactor-preserved-tail-count.test.ts +0 -21
  138. package/src/__tests__/compactor-summary-call-truncation.test.ts +0 -21
  139. package/src/__tests__/compactor-web-search-strip.test.ts +21 -25
  140. package/src/__tests__/config-get-vision-flag.test.ts +0 -6
  141. package/src/__tests__/config-loader-backfill.test.ts +332 -316
  142. package/src/__tests__/config-loader-platform-defaults.test.ts +0 -21
  143. package/src/__tests__/config-loader-validation-reset-notice.test.ts +183 -0
  144. package/src/__tests__/config-schema.test.ts +85 -30
  145. package/src/__tests__/config-set-route.test.ts +0 -6
  146. package/src/__tests__/config-watcher-cleanup-throttle.test.ts +12 -24
  147. package/src/__tests__/config-watcher-skill-reseed.test.ts +1 -8
  148. package/src/__tests__/config-watcher.test.ts +22 -12
  149. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +1 -9
  150. package/src/__tests__/contact-store-interaction-info.test.ts +1 -8
  151. package/src/__tests__/contact-store-user-file.test.ts +1 -14
  152. package/src/__tests__/contacts-tools.test.ts +0 -7
  153. package/src/__tests__/contacts-write.test.ts +1 -8
  154. package/src/__tests__/context-search-memory-source.test.ts +0 -1
  155. package/src/__tests__/context-search-memory-v2-source.test.ts +0 -6
  156. package/src/__tests__/context-window-manager-compact-retry.test.ts +118 -21
  157. package/src/__tests__/context-window-manager-overflow-rung.test.ts +0 -21
  158. package/src/__tests__/conversation-abort-tool-results.test.ts +0 -5
  159. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +0 -12
  160. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +5 -12
  161. package/src/__tests__/conversation-agent-loop-overflow.test.ts +45 -21
  162. package/src/__tests__/conversation-agent-loop.test.ts +192 -70
  163. package/src/__tests__/conversation-app-control-instantiation.test.ts +20 -8
  164. package/src/__tests__/conversation-app-control-lifecycle.test.ts +0 -9
  165. package/src/__tests__/conversation-attachments.test.ts +1 -7
  166. package/src/__tests__/conversation-attention-store.test.ts +1 -9
  167. package/src/__tests__/conversation-attention-telegram.test.ts +0 -8
  168. package/src/__tests__/conversation-clear-safety.test.ts +0 -7
  169. package/src/__tests__/conversation-confirmation-signals.test.ts +0 -21
  170. package/src/__tests__/conversation-crud-enabled-plugins.test.ts +1 -7
  171. package/src/__tests__/conversation-crud-inference-profile.test.ts +1 -7
  172. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +0 -7
  173. package/src/__tests__/conversation-disk-view-integration.test.ts +0 -7
  174. package/src/__tests__/conversation-disk-view.test.ts +0 -7
  175. package/src/__tests__/conversation-enabledplugins-route.test.ts +2 -8
  176. package/src/__tests__/conversation-error.test.ts +299 -3
  177. package/src/__tests__/conversation-fork-crud.test.ts +52 -37
  178. package/src/__tests__/conversation-fork-retrospective.test.ts +486 -7
  179. package/src/__tests__/conversation-fork-route.test.ts +0 -7
  180. package/src/__tests__/conversation-history-web-search.test.ts +39 -17
  181. package/src/__tests__/conversation-inference-profile-list.test.ts +0 -6
  182. package/src/__tests__/conversation-inference-profile-route.test.ts +0 -5
  183. package/src/__tests__/conversation-init.benchmark.test.ts +6 -2
  184. package/src/__tests__/conversation-initial-prompt.test.ts +1 -1
  185. package/src/__tests__/conversation-key-store-disk-view.test.ts +0 -7
  186. package/src/__tests__/conversation-lifecycle.test.ts +108 -62
  187. package/src/__tests__/conversation-list-source.test.ts +0 -7
  188. package/src/__tests__/conversation-load-history-repair.test.ts +39 -53
  189. package/src/__tests__/conversation-load-history-stripped.test.ts +12 -19
  190. package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +10 -15
  191. package/src/__tests__/conversation-message-id-uuidv7.test.ts +73 -0
  192. package/src/__tests__/conversation-pairing.test.ts +0 -7
  193. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +0 -5
  194. package/src/__tests__/conversation-process-callsite.test.ts +14 -7
  195. package/src/__tests__/conversation-provider-retry-repair.test.ts +0 -5
  196. package/src/__tests__/conversation-queue.test.ts +91 -21
  197. package/src/__tests__/conversation-routes-disk-view.test.ts +0 -11
  198. package/src/__tests__/conversation-routes-enabled-plugins.test.ts +3 -11
  199. package/src/__tests__/conversation-routes-guardian-reply.test.ts +3 -11
  200. package/src/__tests__/conversation-routes-hidden-queue.test.ts +3 -11
  201. package/src/__tests__/conversation-routes-slash-commands.test.ts +24 -13
  202. package/src/__tests__/conversation-runtime-assembly.test.ts +37 -9
  203. package/src/__tests__/conversation-skill-tools.test.ts +31 -15
  204. package/src/__tests__/conversation-slash-commands.test.ts +5 -4
  205. package/src/__tests__/conversation-slash-queue.test.ts +0 -5
  206. package/src/__tests__/conversation-slash-unknown.test.ts +0 -5
  207. package/src/__tests__/conversation-speed-override.test.ts +13 -23
  208. package/src/__tests__/conversation-starter-routes.test.ts +0 -7
  209. package/src/__tests__/conversation-store.test.ts +9 -22
  210. package/src/__tests__/conversation-summarize-route.test.ts +445 -0
  211. package/src/__tests__/conversation-summarize-up-to.test.ts +711 -0
  212. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +0 -8
  213. package/src/__tests__/conversation-surfaces-data-persist.test.ts +4 -2
  214. package/src/__tests__/conversation-title-service.test.ts +0 -7
  215. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +0 -19
  216. package/src/__tests__/conversation-tool-setup-attribution.test.ts +4 -8
  217. package/src/__tests__/conversation-unread-route.test.ts +0 -7
  218. package/src/__tests__/conversation-usage.test.ts +10 -8
  219. package/src/__tests__/conversation-wait-for-idle.test.ts +391 -0
  220. package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -5
  221. package/src/__tests__/conversation-workspace-injection.test.ts +0 -5
  222. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -5
  223. package/src/__tests__/conversations-import-system-filter.test.ts +0 -7
  224. package/src/__tests__/credential-broker-browser-fill.test.ts +0 -9
  225. package/src/__tests__/credential-broker-server-use.test.ts +0 -9
  226. package/src/__tests__/credential-execution-api-key-propagation.test.ts +0 -40
  227. package/src/__tests__/credential-execution-client.test.ts +3 -38
  228. package/src/__tests__/credential-execution-managed-contract.test.ts +10 -106
  229. package/src/__tests__/credential-health-service.test.ts +0 -9
  230. package/src/__tests__/credential-metadata-store.test.ts +0 -8
  231. package/src/__tests__/credential-prompt-route.test.ts +80 -9
  232. package/src/__tests__/credential-request-route.test.ts +76 -0
  233. package/src/__tests__/credential-resolve.test.ts +0 -8
  234. package/src/__tests__/credential-security-invariants.test.ts +3 -10
  235. package/src/__tests__/credential-token-resolver.test.ts +0 -9
  236. package/src/__tests__/custom-profile-ensure.test.ts +232 -0
  237. package/src/__tests__/daemon-assistant-events.test.ts +1 -9
  238. package/src/__tests__/daemon-credential-client.test.ts +0 -7
  239. package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +1 -8
  240. package/src/__tests__/db-conversation-inference-profile-migration.test.ts +1 -7
  241. package/src/__tests__/db-llm-request-log-provider-migration.test.ts +0 -8
  242. package/src/__tests__/db-processing-resume-attempts-migration.test.ts +116 -0
  243. package/src/__tests__/db-readiness-http-gate.test.ts +0 -7
  244. package/src/__tests__/db-rename-inference-profile-snake-case-migration.test.ts +1 -7
  245. package/src/__tests__/default-provider-ensure.test.ts +343 -0
  246. package/src/__tests__/delete-managed-skill-tool.test.ts +0 -7
  247. package/src/__tests__/delete-propagation.test.ts +0 -7
  248. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -7
  249. package/src/__tests__/device-id.test.ts +1 -9
  250. package/src/__tests__/disk-pressure-tools.test.ts +0 -4
  251. package/src/__tests__/dm-backfill.test.ts +0 -7
  252. package/src/__tests__/dm-persistence.test.ts +0 -5
  253. package/src/__tests__/docker-signing-key-bootstrap.test.ts +1 -8
  254. package/src/__tests__/drain-requeue-on-contention.test.ts +202 -0
  255. package/src/__tests__/dynamic-skill-background-guard.test.ts +174 -0
  256. package/src/__tests__/edit-propagation.test.ts +1 -8
  257. package/src/__tests__/embedding-managed-proxy-selection.test.ts +0 -8
  258. package/src/__tests__/emit-signal-routing-intent.test.ts +175 -7
  259. package/src/__tests__/encrypted-store.test.ts +0 -9
  260. package/src/__tests__/ensure-conversation-exists.test.ts +85 -0
  261. package/src/__tests__/events-client-registration.test.ts +0 -7
  262. package/src/__tests__/events-dev-bypass-actor.test.ts +2 -9
  263. package/src/__tests__/events-tail-route.test.ts +172 -0
  264. package/src/__tests__/file-write-tool.test.ts +9 -13
  265. package/src/__tests__/followup-tools.test.ts +0 -7
  266. package/src/__tests__/gateway-flag-listener.test.ts +2 -23
  267. package/src/__tests__/gemini-inline-media.test.ts +2 -2
  268. package/src/__tests__/gemini-provider.test.ts +140 -1
  269. package/src/__tests__/get-skill-detail-audit.test.ts +89 -1
  270. package/src/__tests__/graph-extraction-event-date.test.ts +0 -9
  271. package/src/__tests__/guardian-action-sweep.test.ts +0 -7
  272. package/src/__tests__/guardian-binding-drift-heal.test.ts +0 -7
  273. package/src/__tests__/guardian-card-withdrawal.test.ts +0 -8
  274. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -9
  275. package/src/__tests__/guardian-dispatch.test.ts +0 -7
  276. package/src/__tests__/guardian-expiry-notifier.test.ts +1 -9
  277. package/src/__tests__/guardian-outbound-http.test.ts +0 -7
  278. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +1 -8
  279. package/src/__tests__/guardian-routing-invariants.test.ts +0 -8
  280. package/src/__tests__/guardian-routing-state.test.ts +1 -9
  281. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -7
  282. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -2
  283. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +4 -5
  284. package/src/__tests__/headless-browser-interactions.test.ts +0 -7
  285. package/src/__tests__/headless-browser-mode.test.ts +0 -9
  286. package/src/__tests__/headless-browser-navigate.test.ts +91 -13
  287. package/src/__tests__/headless-browser-read-tools.test.ts +0 -7
  288. package/src/__tests__/headless-browser-snapshot.test.ts +0 -7
  289. package/src/__tests__/heartbeat-disk-pressure.test.ts +0 -9
  290. package/src/__tests__/helpers/set-config.ts +40 -0
  291. package/src/__tests__/host-bash-proxy.test.ts +3 -3
  292. package/src/__tests__/host-browser-proxy.test.ts +15 -20
  293. package/src/__tests__/host-cu-routes-targeted.test.ts +0 -1
  294. package/src/__tests__/host-shell-tool.test.ts +5 -69
  295. package/src/__tests__/http-conversation-lineage.test.ts +0 -7
  296. package/src/__tests__/http-user-message-parity.test.ts +0 -7
  297. package/src/__tests__/identity-routes.test.ts +1 -9
  298. package/src/__tests__/image-recovery-hook.test.ts +36 -0
  299. package/src/__tests__/inbound-admitted-introduction-nudge.test.ts +296 -0
  300. package/src/__tests__/inbound-invite-redemption.test.ts +0 -7
  301. package/src/__tests__/inbound-slack-persistence.test.ts +0 -5
  302. package/src/__tests__/inbound-trust-verdict.test.ts +1 -8
  303. package/src/__tests__/inference-profile-reaper.test.ts +1 -7
  304. package/src/__tests__/inference-profile-session-handler.test.ts +0 -6
  305. package/src/__tests__/inference-profile-session-ipc.test.ts +0 -6
  306. package/src/__tests__/ingress-url-consistency.test.ts +1 -23
  307. package/src/__tests__/injection-block.test.ts +0 -1
  308. package/src/__tests__/injector-chain.test.ts +17 -0
  309. package/src/__tests__/injector-config-validation-reset-notice.test.ts +121 -0
  310. package/src/__tests__/injector-pkb-v2-silenced.test.ts +8 -0
  311. package/src/__tests__/injector-registry-order-guard.test.ts +1 -0
  312. package/src/__tests__/inline-command-runner.test.ts +0 -7
  313. package/src/__tests__/inline-skill-load-permissions.test.ts +29 -31
  314. package/src/__tests__/internal-telemetry-routes.test.ts +72 -7
  315. package/src/__tests__/interrupted-turn-reconciler.test.ts +126 -0
  316. package/src/__tests__/introduction-card-resolver.test.ts +0 -9
  317. package/src/__tests__/invite-redeemed-ipc.test.ts +0 -7
  318. package/src/__tests__/invite-routes-http.test.ts +46 -11
  319. package/src/__tests__/job-handler-registration-guard.test.ts +1 -1
  320. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +0 -7
  321. package/src/__tests__/jobs-store-upsert-debounced.test.ts +0 -7
  322. package/src/__tests__/lexical-index-dual-write.test.ts +2 -8
  323. package/src/__tests__/list-messages-attachments.test.ts +0 -7
  324. package/src/__tests__/list-messages-background-tool-completion.test.ts +0 -7
  325. package/src/__tests__/list-messages-client-message-id.test.ts +0 -7
  326. package/src/__tests__/list-messages-hidden-metadata.test.ts +0 -7
  327. package/src/__tests__/list-messages-page-latest.test.ts +0 -7
  328. package/src/__tests__/list-messages-queued.test.ts +9 -10
  329. package/src/__tests__/list-messages-tool-merge.test.ts +0 -7
  330. package/src/__tests__/llm-catalog-parity.test.ts +20 -0
  331. package/src/__tests__/llm-context-resolution.test.ts +26 -1
  332. package/src/__tests__/llm-context-route-provider.test.ts +1 -8
  333. package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +9 -16
  334. package/src/__tests__/llm-request-log-call-site.test.ts +5 -12
  335. package/src/__tests__/llm-request-log-clickhouse-routing.test.ts +117 -0
  336. package/src/__tests__/llm-request-log-clickhouse-writer-guards.test.ts +115 -0
  337. package/src/__tests__/llm-request-log-disabled-writes.test.ts +72 -0
  338. package/src/__tests__/llm-request-log-sink-clickhouse.test.ts +211 -0
  339. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +1 -22
  340. package/src/__tests__/llm-request-log-source-factory.test.ts +0 -21
  341. package/src/__tests__/llm-request-log-turn-query.test.ts +0 -7
  342. package/src/__tests__/llm-resolver-override-or-default.test.ts +563 -0
  343. package/src/__tests__/llm-resolver.test.ts +167 -6
  344. package/src/__tests__/llm-usage-store.test.ts +1 -7
  345. package/src/__tests__/log-export-routes.test.ts +0 -7
  346. package/src/__tests__/log-export-workspace.test.ts +0 -7
  347. package/src/__tests__/managed-profile-guard.test.ts +240 -6
  348. package/src/__tests__/managed-skill-lifecycle.test.ts +0 -7
  349. package/src/__tests__/managed-store.test.ts +1 -16
  350. package/src/__tests__/mcp-auth-routes.test.ts +1 -8
  351. package/src/__tests__/mcp-config-secret-boundary.test.ts +17 -5
  352. package/src/__tests__/media-generate-image.test.ts +20 -7
  353. package/src/__tests__/media-stream-output.test.ts +755 -71
  354. package/src/__tests__/media-stream-server-integration.test.ts +290 -60
  355. package/src/__tests__/media-stream-stt-session.test.ts +26 -13
  356. package/src/__tests__/memory-config-file-parity.test.ts +187 -0
  357. package/src/__tests__/memory-identity-context-parity.test.ts +103 -0
  358. package/src/__tests__/memory-jobs-worker-backoff.test.ts +8 -7
  359. package/src/__tests__/memory-jobs-worker-cleanup-cadence.test.ts +296 -0
  360. package/src/__tests__/memory-jobs-worker-lanes.test.ts +0 -7
  361. package/src/__tests__/memory-recall-log-store.test.ts +0 -7
  362. package/src/__tests__/memory-upsert-concurrency.test.ts +0 -7
  363. package/src/__tests__/message-queue.test.ts +40 -0
  364. package/src/__tests__/messages-after-tiebreaker.test.ts +1 -8
  365. package/src/__tests__/messaging-send-tool.test.ts +0 -7
  366. package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -7
  367. package/src/__tests__/migration-export-http.test.ts +10 -12
  368. package/src/__tests__/migration-export-streaming.test.ts +0 -7
  369. package/src/__tests__/migration-export-to-gcs.test.ts +60 -7
  370. package/src/__tests__/migration-import-commit-http.test.ts +11 -12
  371. package/src/__tests__/migration-import-from-gcs.test.ts +0 -7
  372. package/src/__tests__/migration-import-from-url.test.ts +0 -7
  373. package/src/__tests__/migration-import-preflight-http.test.ts +10 -11
  374. package/src/__tests__/migration-jobs-status.test.ts +8 -11
  375. package/src/__tests__/migration-validate-http.test.ts +2 -8
  376. package/src/__tests__/model-intents.test.ts +18 -0
  377. package/src/__tests__/mtime-cache.test.ts +102 -9
  378. package/src/__tests__/non-member-access-request.test.ts +145 -7
  379. package/src/__tests__/notification-broadcaster.test.ts +0 -7
  380. package/src/__tests__/notification-candidate-guardian-context.test.ts +1 -8
  381. package/src/__tests__/notification-decision-fallback.test.ts +0 -7
  382. package/src/__tests__/notification-decision-identity.test.ts +0 -7
  383. package/src/__tests__/notification-decision-recipient-context.test.ts +0 -7
  384. package/src/__tests__/notification-deep-link.test.ts +415 -11
  385. package/src/__tests__/notification-guardian-path.test.ts +0 -7
  386. package/src/__tests__/notification-platform-adapter.test.ts +0 -7
  387. package/src/__tests__/notification-routing-intent.test.ts +1 -9
  388. package/src/__tests__/notification-schedule-notify-dedup.test.ts +1 -9
  389. package/src/__tests__/notification-telegram-adapter.test.ts +0 -7
  390. package/src/__tests__/oauth-cli.test.ts +0 -1
  391. package/src/__tests__/oauth-connect-orchestrator.test.ts +0 -8
  392. package/src/__tests__/oauth-connect-routes.test.ts +19 -18
  393. package/src/__tests__/oauth-provider-profiles.test.ts +0 -7
  394. package/src/__tests__/oauth-provider-visibility.test.ts +0 -7
  395. package/src/__tests__/oauth-store.test.ts +0 -7
  396. package/src/__tests__/openai-provider.test.ts +11 -0
  397. package/src/__tests__/openrouter-provider-only.test.ts +16 -5
  398. package/src/__tests__/openrouter-token-estimation.test.ts +2 -2
  399. package/src/__tests__/outbound-slack-persistence.test.ts +9 -7
  400. package/src/__tests__/outlook-email-watcher.test.ts +0 -9
  401. package/src/__tests__/path-policy.test.ts +0 -7
  402. package/src/__tests__/pending-interactions-resolved-event.test.ts +26 -4
  403. package/src/__tests__/persist-media-references.test.ts +112 -0
  404. package/src/__tests__/persist-unsendable-image-downscale.test.ts +9 -4
  405. package/src/__tests__/persist-unsendable-image.test.ts +39 -7
  406. package/src/__tests__/persist-user-message-set-processing-failure.test.ts +41 -0
  407. package/src/__tests__/persistence-secret-redaction.test.ts +7 -7
  408. package/src/__tests__/persona-resolver.test.ts +1 -1
  409. package/src/__tests__/personal-memory-auth-bypass.test.ts +2 -4
  410. package/src/__tests__/platform-bash-auto-approve.test.ts +20 -10
  411. package/src/__tests__/platform-callback-registration.test.ts +10 -9
  412. package/src/__tests__/platform-proxy-context.test.ts +0 -8
  413. package/src/__tests__/playbook-execution.test.ts +2 -33
  414. package/src/__tests__/playbook-tools.test.ts +0 -7
  415. package/src/__tests__/plugin-api-model-profiles.test.ts +25 -4
  416. package/src/__tests__/plugin-effective-enabled-set.test.ts +29 -29
  417. package/src/__tests__/plugin-hook-pipeline-hardening.test.ts +249 -0
  418. package/src/__tests__/plugin-import-boundary-guard.test.ts +13 -25
  419. package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +316 -0
  420. package/src/__tests__/plugin-types.test.ts +1 -1
  421. package/src/__tests__/pointer-conversation-trust.test.ts +2 -4
  422. package/src/__tests__/pricing.test.ts +85 -2
  423. package/src/__tests__/process-message-background-slack.test.ts +4 -5
  424. package/src/__tests__/process-message-display-content.test.ts +102 -10
  425. package/src/__tests__/processing-flag-persist-failure.test.ts +0 -5
  426. package/src/__tests__/provider-commit-message-generator.test.ts +15 -8
  427. package/src/__tests__/provider-error-scenarios.test.ts +68 -5
  428. package/src/__tests__/provider-platform-proxy-integration.test.ts +17 -2
  429. package/src/__tests__/provider-registry-ollama.test.ts +14 -1
  430. package/src/__tests__/provider-send-message-override-profile.test.ts +13 -5
  431. package/src/__tests__/provider-streaming.benchmark.test.ts +1 -6
  432. package/src/__tests__/provider-usage-tracking.test.ts +9 -6
  433. package/src/__tests__/proxy-approval-callback.test.ts +0 -6
  434. package/src/__tests__/prune-old-conversations-job.test.ts +1 -9
  435. package/src/__tests__/prune-old-tool-invocations-job.test.ts +1 -9
  436. package/src/__tests__/public-ingress-urls.test.ts +1 -24
  437. package/src/__tests__/qdrant-collection-migration.test.ts +0 -7
  438. package/src/__tests__/qdrant-manager.test.ts +0 -8
  439. package/src/__tests__/ratelimit.test.ts +1 -8
  440. package/src/__tests__/reaction-persistence.test.ts +0 -7
  441. package/src/__tests__/rebuild-index-graph-nodes.test.ts +0 -11
  442. package/src/__tests__/registry.test.ts +39 -12
  443. package/src/__tests__/request-secret-standalone-channel-gate.test.ts +270 -0
  444. package/src/__tests__/require-fresh-approval.test.ts +47 -182
  445. package/src/__tests__/resolve-trust-class.test.ts +1 -1
  446. package/src/__tests__/retry-openrouter-only-normalization.test.ts +9 -5
  447. package/src/__tests__/retry-thinking-adaptive-only.test.ts +19 -5
  448. package/src/__tests__/retry-thinking-tool-choice.test.ts +65 -5
  449. package/src/__tests__/retry-verbosity-normalization.test.ts +9 -5
  450. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -7
  451. package/src/__tests__/runtime-events-sse-bilingual.test.ts +0 -7
  452. package/src/__tests__/runtime-events-sse-parity.test.ts +0 -7
  453. package/src/__tests__/runtime-events-sse-reconnect.test.ts +0 -7
  454. package/src/__tests__/runtime-events-sse.test.ts +0 -7
  455. package/src/__tests__/scaffold-managed-skill-tool.test.ts +131 -9
  456. package/src/__tests__/schedule-retry.test.ts +0 -8
  457. package/src/__tests__/schedule-routes-workflow-validation.test.ts +0 -7
  458. package/src/__tests__/schedule-routes.test.ts +0 -7
  459. package/src/__tests__/schedule-store.test.ts +0 -8
  460. package/src/__tests__/schedule-tools.test.ts +0 -7
  461. package/src/__tests__/scheduler-disk-pressure.test.ts +0 -10
  462. package/src/__tests__/scheduler-recurrence.test.ts +19 -96
  463. package/src/__tests__/scheduler-reuse-conversation.test.ts +75 -88
  464. package/src/__tests__/scheduler-wake.test.ts +12 -60
  465. package/src/__tests__/scheduler-worker-standdown.test.ts +0 -8
  466. package/src/__tests__/scoped-approval-grants.test.ts +1 -9
  467. package/src/__tests__/scoped-grant-security-matrix.test.ts +1 -9
  468. package/src/__tests__/secret-allowlist.test.ts +1 -8
  469. package/src/__tests__/secret-ingress-channel.test.ts +0 -7
  470. package/src/__tests__/secret-ingress-cli.test.ts +0 -7
  471. package/src/__tests__/secret-ingress-http.test.ts +3 -11
  472. package/src/__tests__/secret-patterns.test.ts +27 -0
  473. package/src/__tests__/secret-prompter-channel-fallback.test.ts +35 -9
  474. package/src/__tests__/secret-response-routing.test.ts +1 -1
  475. package/src/__tests__/secret-routes-platform-proxy.test.ts +0 -7
  476. package/src/__tests__/secure-keys-managed-failover.test.ts +0 -7
  477. package/src/__tests__/secure-keys.test.ts +142 -33
  478. package/src/__tests__/send-endpoint-busy.test.ts +0 -19
  479. package/src/__tests__/sequence-store.test.ts +0 -9
  480. package/src/__tests__/server-history-render.test.ts +61 -8
  481. package/src/__tests__/service-contracts-import-guard.test.ts +4 -9
  482. package/src/__tests__/set-permission-mode.test.ts +0 -7
  483. package/src/__tests__/settings-routes.test.ts +0 -7
  484. package/src/__tests__/shell-credential-ref.test.ts +0 -8
  485. package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -7
  486. package/src/__tests__/skill-projection-feature-flag.test.ts +35 -17
  487. package/src/__tests__/skill-projection.benchmark.test.ts +7 -7
  488. package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -7
  489. package/src/__tests__/skills-files-catalog-fallback.test.ts +0 -7
  490. package/src/__tests__/slack-channels-routes.test.ts +34 -16
  491. package/src/__tests__/slack-inbound-verification.test.ts +0 -7
  492. package/src/__tests__/slack-reaction-canonical-approval.test.ts +0 -8
  493. package/src/__tests__/slack-users-routes.test.ts +148 -0
  494. package/src/__tests__/slim-skill-category.test.ts +0 -7
  495. package/src/__tests__/stale-approval-dedup.test.ts +0 -7
  496. package/src/__tests__/subagent-call-site-routing.test.ts +45 -11
  497. package/src/__tests__/subagent-detail.test.ts +2 -1
  498. package/src/__tests__/subagent-fork-prompt-role.test.ts +0 -5
  499. package/src/__tests__/subagent-fork-spawn.test.ts +0 -37
  500. package/src/__tests__/subagent-spawn-and-await.test.ts +0 -5
  501. package/src/__tests__/subagent-tool-gate-mode.test.ts +1 -7
  502. package/src/__tests__/subagent-tools.test.ts +77 -36
  503. package/src/__tests__/suggestion-routes.test.ts +28 -42
  504. package/src/__tests__/summarize-boundary.test.ts +169 -0
  505. package/src/__tests__/task-compiler.test.ts +0 -7
  506. package/src/__tests__/task-management-tools.test.ts +0 -7
  507. package/src/__tests__/task-memory-cleanup.test.ts +0 -18
  508. package/src/__tests__/task-scheduler.test.ts +40 -9
  509. package/src/__tests__/telegram-bot-username-resolution.test.ts +0 -8
  510. package/src/__tests__/telephony-tts-guard.test.ts +118 -26
  511. package/src/__tests__/test-preload.ts +11 -1
  512. package/src/__tests__/thread-backfill.test.ts +2 -8
  513. package/src/__tests__/token-manager.test.ts +0 -9
  514. package/src/__tests__/tool-approval-handler.test.ts +57 -88
  515. package/src/__tests__/{tool-audit-listener.test.ts → tool-audit.test.ts} +230 -255
  516. package/src/__tests__/tool-execution-abort-cleanup.test.ts +5 -33
  517. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -8
  518. package/src/__tests__/tool-executor-lifecycle-events.test.ts +308 -411
  519. package/src/__tests__/tool-executor.test.ts +37 -26
  520. package/src/__tests__/tool-grant-request-escalation.test.ts +17 -31
  521. package/src/__tests__/tool-preview-lifecycle.test.ts +2 -8
  522. package/src/__tests__/tool-profiler.test.ts +139 -0
  523. package/src/__tests__/tool-result-metadata-plumbing.test.ts +0 -8
  524. package/src/__tests__/tool-start-timestamp.test.ts +4 -10
  525. package/src/__tests__/tools-get-route.test.ts +75 -3
  526. package/src/__tests__/trust-context-guards.test.ts +1 -1
  527. package/src/__tests__/trusted-contact-approval-notifier.test.ts +1 -1
  528. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +9 -26
  529. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -7
  530. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -7
  531. package/src/__tests__/trusted-contact-verification.test.ts +6 -139
  532. package/src/__tests__/turn-boundary-resolution.test.ts +0 -7
  533. package/src/__tests__/turn-events-store.test.ts +51 -7
  534. package/src/__tests__/turn-outcome-read.test.ts +75 -0
  535. package/src/__tests__/twilio-config.test.ts +0 -7
  536. package/src/__tests__/twilio-provider.test.ts +0 -7
  537. package/src/__tests__/twilio-routes-twiml.test.ts +1 -8
  538. package/src/__tests__/twilio-routes.test.ts +12 -5
  539. package/src/__tests__/twilio-validation.test.ts +0 -7
  540. package/src/__tests__/usage-attribution.test.ts +91 -1
  541. package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -7
  542. package/src/__tests__/usage-routes.test.ts +1 -8
  543. package/src/__tests__/vbundle-pax-and-symlink.test.ts +0 -7
  544. package/src/__tests__/vercel-ai-gateway-provider.test.ts +283 -0
  545. package/src/__tests__/vercel-config.test.ts +0 -7
  546. package/src/__tests__/verification-control-plane-policy.test.ts +60 -31
  547. package/src/__tests__/voice-approval-resolver-relay.test.ts +3 -9
  548. package/src/__tests__/voice-config-update.test.ts +1 -22
  549. package/src/__tests__/voice-guardian-cold-cache-warm.test.ts +8 -17
  550. package/src/__tests__/voice-scoped-grant-consumer.test.ts +1 -10
  551. package/src/__tests__/voice-session-bridge-processing-wait.test.ts +0 -7
  552. package/src/__tests__/voice-session-bridge.test.ts +116 -68
  553. package/src/__tests__/workspace-git-service.test.ts +207 -2
  554. package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +0 -8
  555. package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +0 -8
  556. package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +0 -8
  557. package/src/__tests__/workspace-migration-126-strip-managed-profile-bodies.test.ts +192 -0
  558. package/src/__tests__/workspace-migration-127-backfill-default-provider.test.ts +277 -0
  559. package/src/__tests__/workspace-migration-128-repair-stale-openrouter-grok-model-ids.test.ts +135 -0
  560. package/src/__tests__/workspace-migration-129-remove-analyze-conversation-config.test.ts +190 -0
  561. package/src/__tests__/workspace-tool-loader.test.ts +5 -1
  562. package/src/a2a/__tests__/e2e-a2a-channel.test.ts +1 -10
  563. package/src/a2a/__tests__/task-store.test.ts +0 -9
  564. package/src/acp/__tests__/session-manager-persistence.test.ts +1 -8
  565. package/src/acp/__tests__/session-manager-resume.test.ts +0 -7
  566. package/src/acp/__tests__/session-manager-startup.test.ts +1 -8
  567. package/src/agent/attachments.ts +57 -0
  568. package/src/agent/image-optimize.ts +80 -0
  569. package/src/agent/loop-exclusive-tool.test.ts +28 -5
  570. package/src/agent/loop.ts +25 -63
  571. package/src/api/responses/conversation-message.ts +9 -15
  572. package/src/approvals/guardian-expiry-notifier.ts +6 -0
  573. package/src/approvals/guardian-request-resolvers.ts +42 -21
  574. package/src/background-wake/wake-intent-hooks.test.ts +2 -10
  575. package/src/browser/operation-meta.ts +493 -0
  576. package/src/browser/operations.ts +2 -477
  577. package/src/calls/__tests__/call-setup-router.test.ts +341 -321
  578. package/src/calls/__tests__/channel-admission-reader.test.ts +50 -24
  579. package/src/calls/__tests__/fish-audio-client.test.ts +35 -11
  580. package/src/calls/__tests__/inbound-trust-reader.test.ts +157 -34
  581. package/src/calls/__tests__/tts-text-sanitizer.test.ts +22 -0
  582. package/src/calls/__tests__/voice-session-bridge.test.ts +884 -0
  583. package/src/calls/access-request-wait.ts +3 -1
  584. package/src/calls/audio-store.ts +6 -6
  585. package/src/calls/call-constants.ts +1 -1
  586. package/src/calls/call-controller.ts +242 -64
  587. package/src/calls/call-setup-flow-types.ts +2 -2
  588. package/src/calls/call-setup-flow.ts +19 -57
  589. package/src/calls/call-setup-router.ts +63 -39
  590. package/src/calls/call-speech-output.ts +39 -39
  591. package/src/calls/call-transport.ts +17 -5
  592. package/src/calls/channel-admission-reader.ts +38 -28
  593. package/src/calls/fish-audio-client.ts +24 -52
  594. package/src/calls/gateway-invite-reader.ts +15 -19
  595. package/src/calls/inbound-trust-reader.ts +74 -25
  596. package/src/calls/media-stream-audio-transcode.ts +1 -1
  597. package/src/calls/media-stream-output.ts +482 -64
  598. package/src/calls/media-stream-server.ts +156 -83
  599. package/src/calls/media-stream-stt-session.ts +1 -0
  600. package/src/calls/resolve-call-tts-provider.ts +60 -17
  601. package/src/calls/telephony-tts-capability.ts +13 -13
  602. package/src/calls/tts-text-sanitizer.ts +5 -3
  603. package/src/calls/unresolved-caller-trust.ts +36 -0
  604. package/src/calls/voice-session-bridge.ts +397 -52
  605. package/src/channels/__tests__/gateway-invites.test.ts +257 -0
  606. package/src/channels/gateway-invites.ts +142 -0
  607. package/src/channels/gateway-verification-sessions.ts +4 -8
  608. package/src/cli/AGENTS.md +60 -51
  609. package/src/cli/commands/__tests__/inference-models.test.ts +86 -0
  610. package/src/cli/commands/__tests__/inference-profiles.test.ts +254 -0
  611. package/src/cli/commands/__tests__/inference-providers.test.ts +171 -0
  612. package/src/cli/commands/__tests__/schedules.test.ts +133 -1
  613. package/src/cli/commands/__tests__/usage.test.ts +131 -0
  614. package/src/cli/commands/attachment.help.ts +100 -0
  615. package/src/cli/commands/attachment.ts +92 -157
  616. package/src/cli/commands/audit.help.ts +40 -0
  617. package/src/cli/commands/audit.ts +66 -86
  618. package/src/cli/commands/auth.help.ts +46 -0
  619. package/src/cli/commands/auth.ts +10 -43
  620. package/src/cli/commands/avatar.help.ts +236 -0
  621. package/src/cli/commands/avatar.ts +66 -250
  622. package/src/cli/commands/backup.help.ts +190 -0
  623. package/src/cli/commands/backup.ts +109 -276
  624. package/src/cli/commands/bash.help.ts +45 -0
  625. package/src/cli/commands/bash.ts +55 -75
  626. package/src/cli/commands/browser.help.ts +196 -0
  627. package/src/cli/commands/browser.ts +241 -352
  628. package/src/cli/commands/config.ts +166 -164
  629. package/src/cli/commands/contacts.ts +13 -22
  630. package/src/cli/commands/credentials.ts +38 -28
  631. package/src/cli/commands/db/repair-step-conversation-backfill.ts +19 -10
  632. package/src/cli/commands/db/repair.ts +20 -8
  633. package/src/cli/commands/default-action.ts +8 -3
  634. package/src/cli/commands/domain.ts +36 -22
  635. package/src/cli/commands/email.ts +77 -36
  636. package/src/cli/commands/inference-callsites.ts +158 -0
  637. package/src/cli/commands/inference-models.ts +84 -0
  638. package/src/cli/commands/inference-profiles.ts +371 -0
  639. package/src/cli/commands/inference-providers-default.ts +89 -0
  640. package/src/cli/commands/inference-providers.ts +117 -24
  641. package/src/cli/commands/inference.ts +6 -0
  642. package/src/cli/commands/keys.ts +27 -38
  643. package/src/cli/commands/memory/index.ts +8 -0
  644. package/src/cli/commands/memory/memory-retrospective.ts +7 -5
  645. package/src/cli/commands/memory/memory-v2-compare-render.ts +2 -2
  646. package/src/cli/commands/memory/nodes.ts +301 -0
  647. package/src/cli/commands/oauth/shared.ts +1 -1
  648. package/src/cli/commands/oauth/status.test.ts +6 -6
  649. package/src/cli/commands/oauth/status.ts +12 -6
  650. package/src/cli/commands/oauth/token.ts +1 -26
  651. package/src/cli/commands/plugins.ts +210 -116
  652. package/src/cli/commands/schedules.ts +17 -2
  653. package/src/cli/commands/tools-run.ts +4 -4
  654. package/src/cli/commands/tools.ts +23 -7
  655. package/src/cli/commands/ui.ts +2 -3
  656. package/src/cli/commands/usage.ts +59 -21
  657. package/src/cli/index.help.ts +31 -0
  658. package/src/cli/lib/__tests__/cli-output.test.ts +20 -0
  659. package/src/cli/lib/__tests__/diff-plugin.test.ts +2 -5
  660. package/src/cli/lib/__tests__/inspect-plugin.test.ts +1 -1
  661. package/src/cli/lib/__tests__/install-from-github.test.ts +37 -5
  662. package/src/cli/lib/__tests__/install-from-platform.test.ts +497 -0
  663. package/src/cli/lib/__tests__/list-installed-plugins.test.ts +36 -0
  664. package/src/cli/lib/__tests__/plugin-artifact.test.ts +54 -1
  665. package/src/cli/lib/__tests__/plugin-details.test.ts +137 -1
  666. package/src/cli/lib/__tests__/plugin-icon-file.test.ts +142 -0
  667. package/src/cli/lib/__tests__/plugin-marketplace.test.ts +1 -1
  668. package/src/cli/lib/__tests__/plugin-pin-history.test.ts +1 -1
  669. package/src/cli/lib/__tests__/search-plugins.test.ts +1 -1
  670. package/src/cli/lib/__tests__/uninstall-plugin.test.ts +82 -21
  671. package/src/cli/lib/__tests__/upgrade-plugin.test.ts +1 -1
  672. package/src/cli/lib/cli-command-help.ts +119 -0
  673. package/src/cli/lib/cli-output.ts +55 -0
  674. package/src/cli/lib/diff-plugin.ts +2 -2
  675. package/src/cli/lib/fetch-like.ts +11 -0
  676. package/src/cli/lib/inspect-plugin.ts +2 -2
  677. package/src/cli/lib/install-from-github.ts +61 -15
  678. package/src/cli/lib/install-from-platform.ts +618 -0
  679. package/src/cli/lib/list-installed-plugins.ts +39 -5
  680. package/src/cli/lib/plugin-artifact.ts +30 -0
  681. package/src/cli/lib/plugin-constants.ts +27 -0
  682. package/src/cli/lib/plugin-details.ts +51 -11
  683. package/src/cli/lib/plugin-icon-file.ts +101 -0
  684. package/src/cli/lib/plugin-marketplace.ts +1 -4
  685. package/src/cli/lib/plugin-pin-history.ts +27 -12
  686. package/src/cli/lib/publish-plugin.ts +3 -3
  687. package/src/cli/lib/search-plugins.ts +2 -6
  688. package/src/cli/lib/uninstall-plugin.ts +24 -2
  689. package/src/cli/lib/upgrade-plugin.ts +8 -22
  690. package/src/cli/program.ts +0 -2
  691. package/src/cli.ts +22 -13
  692. package/src/config/__tests__/default-profile-catalog.test.ts +384 -0
  693. package/src/config/__tests__/default-provider.test.ts +245 -0
  694. package/src/config/__tests__/deployment-context-defaults.test.ts +0 -21
  695. package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +0 -21
  696. package/src/config/__tests__/loader-last-known-good.test.ts +208 -0
  697. package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +145 -0
  698. package/src/config/__tests__/profile-materialization.test.ts +297 -0
  699. package/src/config/__tests__/seed-default-provider.test.ts +210 -0
  700. package/src/config/__tests__/sync-gated-profiles.test.ts +27 -34
  701. package/src/config/assistant-feature-flags.ts +1 -1
  702. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +9 -8
  703. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +0 -6
  704. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +2 -2
  705. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +0 -3
  706. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +0 -3
  707. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +1 -3
  708. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +0 -4
  709. package/src/config/bundled-skills/schedule/SKILL.md +17 -0
  710. package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +0 -7
  711. package/src/config/call-site-defaults.ts +5 -2
  712. package/src/config/default-profile-catalog.ts +481 -0
  713. package/src/config/default-profile-names.ts +44 -0
  714. package/src/config/default-provider-resolution.ts +33 -0
  715. package/src/config/default-provider.ts +38 -0
  716. package/src/config/env-registry.ts +2 -0
  717. package/src/config/env.ts +0 -6
  718. package/src/config/feature-flag-registry.json +42 -50
  719. package/src/config/inference-profile-validation.ts +5 -4
  720. package/src/config/llm-resolver.ts +447 -24
  721. package/src/config/loader.ts +345 -10
  722. package/src/config/profile-materialization.ts +151 -0
  723. package/src/config/schema.ts +2 -52
  724. package/src/config/schemas/__tests__/live-voice.test.ts +108 -0
  725. package/src/config/schemas/__tests__/llm-request-logs.test.ts +33 -5
  726. package/src/config/schemas/call-site-catalog.ts +0 -6
  727. package/src/config/schemas/calls.ts +9 -0
  728. package/src/config/schemas/conversations.ts +1 -1
  729. package/src/config/schemas/live-voice.ts +77 -0
  730. package/src/config/schemas/llm-request-logs.ts +78 -27
  731. package/src/config/schemas/llm.ts +53 -2
  732. package/src/config/schemas/memory-lifecycle.ts +0 -6
  733. package/src/config/schemas/memory.ts +57 -1
  734. package/src/config/seed-inference-profiles.ts +100 -289
  735. package/src/config/sync-gated-profiles.ts +17 -23
  736. package/src/contacts/canonical-guardian-store.ts +6 -0
  737. package/src/contacts/contact-store.ts +272 -51
  738. package/src/contacts/contacts-write.ts +0 -22
  739. package/src/contacts/guardian-contact-reader.ts +3 -2
  740. package/src/contacts/member-write-relay.ts +2 -19
  741. package/src/contacts/types.ts +2 -1
  742. package/src/context/compactor.ts +230 -38
  743. package/src/context/image-dimensions.ts +25 -3
  744. package/src/context/token-estimator.ts +11 -7
  745. package/src/conversations/__tests__/message-consolidation.test.ts +6 -5
  746. package/src/conversations/job-handlers/summarization.ts +0 -2
  747. package/src/conversations/message-consolidation.ts +34 -112
  748. package/src/credential-execution/executable-discovery.ts +16 -144
  749. package/src/credential-execution/process-manager.test.ts +1 -112
  750. package/src/credential-execution/process-manager.ts +13 -379
  751. package/src/credential-execution/prompted-credential.ts +1 -1
  752. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +1 -1
  753. package/src/daemon/__tests__/inference-profile-notification.test.ts +0 -8
  754. package/src/daemon/__tests__/inflight-message-content.test.ts +219 -0
  755. package/src/daemon/__tests__/native-web-search-metadata.test.ts +0 -8
  756. package/src/daemon/__tests__/wake-conversation-ops-completion.test.ts +0 -6
  757. package/src/daemon/__tests__/web-search-status-text.test.ts +0 -8
  758. package/src/daemon/approval-generators.ts +17 -11
  759. package/src/daemon/assistant-attachments.ts +86 -87
  760. package/src/daemon/config-watcher.ts +67 -21
  761. package/src/daemon/conversation-agent-loop-handlers.ts +146 -50
  762. package/src/daemon/conversation-agent-loop.ts +136 -34
  763. package/src/daemon/conversation-error.ts +291 -109
  764. package/src/daemon/conversation-history.ts +6 -12
  765. package/src/daemon/conversation-initial-prompt.ts +1 -1
  766. package/src/daemon/conversation-launch.ts +1 -1
  767. package/src/daemon/conversation-lifecycle.ts +5 -22
  768. package/src/daemon/conversation-media-retry.ts +3 -2
  769. package/src/daemon/conversation-messaging.ts +296 -66
  770. package/src/daemon/conversation-notifiers.ts +1 -1
  771. package/src/daemon/conversation-process.ts +162 -12
  772. package/src/daemon/conversation-queue-manager.ts +12 -0
  773. package/src/daemon/conversation-runtime-assembly.ts +197 -53
  774. package/src/daemon/conversation-skill-tools.ts +27 -9
  775. package/src/daemon/conversation-slash.ts +2 -4
  776. package/src/daemon/conversation-store.ts +11 -13
  777. package/src/daemon/conversation-surfaces.ts +145 -176
  778. package/src/daemon/conversation-tool-setup.ts +18 -12
  779. package/src/daemon/conversation-turn-finalize.ts +18 -1
  780. package/src/daemon/conversation.ts +265 -85
  781. package/src/daemon/disk-pressure-policy.ts +1 -1
  782. package/src/daemon/event-loop-watchdog.test.ts +1 -6
  783. package/src/daemon/event-loop-watchdog.ts +2 -20
  784. package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +0 -7
  785. package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +1 -8
  786. package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +1 -8
  787. package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +1 -8
  788. package/src/daemon/handlers/__tests__/config-a2a.test.ts +1 -8
  789. package/src/daemon/handlers/config-a2a.ts +0 -3
  790. package/src/daemon/handlers/conversation-history.ts +6 -4
  791. package/src/daemon/handlers/shared.ts +224 -79
  792. package/src/daemon/handlers/skills.ts +8 -0
  793. package/src/daemon/inflight-message-content.ts +228 -0
  794. package/src/daemon/interrupted-turn-reconciler.ts +134 -0
  795. package/src/daemon/lifecycle.ts +120 -64
  796. package/src/daemon/main.ts +1 -5
  797. package/src/daemon/message-types/conversations.ts +2 -0
  798. package/src/daemon/message-types/host-bash.ts +1 -1
  799. package/src/daemon/message-types/skills.ts +6 -0
  800. package/src/daemon/message-types/sync.ts +1 -0
  801. package/src/daemon/orphan-reaper.test.ts +1 -6
  802. package/src/daemon/persist-media-references.ts +151 -0
  803. package/src/daemon/pointer-conversation-trust.ts +2 -4
  804. package/src/daemon/process-message.ts +82 -8
  805. package/src/daemon/providers-setup.ts +1 -4
  806. package/src/daemon/shutdown-handlers.ts +0 -4
  807. package/src/daemon/sqlite-corruption-watchdog.test.ts +0 -13
  808. package/src/daemon/sqlite-corruption-watchdog.ts +2 -15
  809. package/src/daemon/summarize-boundary.ts +62 -0
  810. package/src/daemon/tool-setup-types.ts +1 -1
  811. package/src/daemon/trust-context-types.ts +61 -0
  812. package/src/daemon/trust-context.ts +5 -55
  813. package/src/daemon/wake-conversation-ops.ts +4 -1
  814. package/src/documents/document-comments-store.test.ts +1 -7
  815. package/src/export/__tests__/transcript-formatter.test.ts +13 -8
  816. package/src/export/formatter.ts +8 -17
  817. package/src/export/transcript-formatter.ts +13 -40
  818. package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +0 -9
  819. package/src/heartbeat/__tests__/heartbeat-service.test.ts +0 -2
  820. package/src/home/__tests__/home-content-refresh.test.ts +0 -7
  821. package/src/home/__tests__/suggested-prompts.test.ts +4 -12
  822. package/src/home/conversation-starter-checkpoints.ts +9 -5
  823. package/src/home/job-handlers/conversation-starters.ts +24 -54
  824. package/src/home/suggested-prompts-cache.ts +91 -0
  825. package/src/home/suggested-prompts.ts +4 -77
  826. package/src/hooks/__tests__/hook-live-reload.test.ts +62 -48
  827. package/src/hooks/hook-loader.ts +215 -194
  828. package/src/hooks/types.ts +2 -2
  829. package/src/ipc/__tests__/contacts-info-ipc.test.ts +66 -11
  830. package/src/ipc/assistant-server.ts +14 -34
  831. package/src/ipc/gateway-flag-listener.ts +14 -25
  832. package/src/ipc/gateway-validated-call.ts +32 -0
  833. package/src/ipc/routes/__tests__/contacts-mirror-ipc-routes.test.ts +149 -17
  834. package/src/ipc/routes/__tests__/contacts-mirror-merge-contact.test.ts +197 -0
  835. package/src/ipc/routes/__tests__/contacts-mirror-upsert-full.test.ts +368 -0
  836. package/src/ipc/routes/__tests__/guardian-label-ipc-routes.test.ts +74 -0
  837. package/src/ipc/routes/__tests__/invite-ipc-routes.test.ts +0 -7
  838. package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +5 -7
  839. package/src/ipc/routes/contacts-info-ipc-routes.ts +5 -2
  840. package/src/ipc/routes/contacts-mirror-ipc-routes.ts +78 -1
  841. package/src/ipc/routes/db-proxy.ts +9 -15
  842. package/src/ipc/routes/guardian-label-ipc-routes.ts +42 -0
  843. package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -8
  844. package/src/live-voice/__tests__/live-voice-credential-preflight.test.ts +275 -0
  845. package/src/live-voice/__tests__/live-voice-integration.test.ts +124 -0
  846. package/src/live-voice/__tests__/live-voice-metrics.test.ts +67 -0
  847. package/src/live-voice/__tests__/live-voice-session-preflight.test.ts +156 -0
  848. package/src/live-voice/__tests__/live-voice-stt.test.ts +464 -19
  849. package/src/live-voice/__tests__/live-voice-tts-session.test.ts +350 -4
  850. package/src/live-voice/__tests__/live-voice-tts.test.ts +186 -10
  851. package/src/live-voice/__tests__/live-voice-vad.test.ts +372 -10
  852. package/src/live-voice/__tests__/protocol.test.ts +2 -0
  853. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +61 -9
  854. package/src/live-voice/live-voice-credential-preflight.ts +205 -0
  855. package/src/live-voice/live-voice-metrics.ts +44 -0
  856. package/src/live-voice/live-voice-session-manager.ts +19 -0
  857. package/src/live-voice/live-voice-session.ts +1015 -276
  858. package/src/live-voice/live-voice-tts.ts +50 -4
  859. package/src/live-voice/protocol.ts +8 -0
  860. package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +3 -7
  861. package/src/messaging/channel-binding-schema.ts +15 -7
  862. package/src/messaging/providers/a2a/__tests__/deliver.test.ts +0 -9
  863. package/src/messaging/providers/slack/__tests__/download.test.ts +1 -8
  864. package/src/messaging/providers/slack/binding-metadata.test.ts +63 -0
  865. package/src/messaging/providers/slack/binding-metadata.ts +6 -0
  866. package/src/messaging/providers/slack/conversation-utils.ts +7 -4
  867. package/src/messaging/providers/slack/send.test.ts +0 -7
  868. package/src/messaging/providers/slack/types.ts +2 -0
  869. package/src/messaging/providers/slack/withdraw.test.ts +0 -6
  870. package/src/messaging/providers/telegram-bot/send.test.ts +0 -7
  871. package/src/monitoring/__tests__/resource-sampler.test.ts +2 -4
  872. package/src/monitoring/__tests__/stall-capture.test.ts +1 -1
  873. package/src/monitoring/process-memory.ts +6 -1
  874. package/src/monitoring/resource-sample-types.ts +71 -0
  875. package/src/monitoring/resource-sampler.ts +7 -69
  876. package/src/monitoring/stall-capture.ts +1 -1
  877. package/src/notifications/__tests__/broadcaster.test.ts +100 -9
  878. package/src/notifications/__tests__/connected-channels.test.ts +11 -8
  879. package/src/notifications/__tests__/decision-engine.test.ts +0 -7
  880. package/src/notifications/__tests__/destination-resolver.test.ts +18 -12
  881. package/src/notifications/__tests__/deterministic-checks.test.ts +1 -9
  882. package/src/notifications/access-request-copy.ts +33 -1
  883. package/src/notifications/adapters/slack.ts +7 -2
  884. package/src/notifications/approval-card-data.ts +4 -2
  885. package/src/notifications/broadcaster.ts +118 -67
  886. package/src/notifications/copy-composer.ts +6 -2
  887. package/src/notifications/emit-signal.ts +23 -1
  888. package/src/notifications/signal.ts +5 -4
  889. package/src/notifications/types.ts +1 -1
  890. package/src/notifications/urgency.ts +5 -0
  891. package/src/oauth/byo-connection.test.ts +1 -10
  892. package/src/oauth/connect-orchestrator.ts +1 -1
  893. package/src/oauth/connection-resolver.test.ts +140 -7
  894. package/src/oauth/connection-resolver.ts +48 -12
  895. package/src/oauth/oauth-store.ts +4 -11
  896. package/src/onboarding/__tests__/onboarding-events-store.test.ts +0 -8
  897. package/src/permissions/approval-policy.test.ts +0 -314
  898. package/src/permissions/approval-policy.ts +38 -90
  899. package/src/permissions/checker.test.ts +3 -14
  900. package/src/permissions/checker.ts +95 -19
  901. package/src/permissions/confirmation-canonical-request.ts +118 -0
  902. package/src/permissions/gateway-threshold-reader.test.ts +0 -8
  903. package/src/permissions/ipc-risk-types.ts +2 -0
  904. package/src/permissions/prompter.ts +16 -3
  905. package/src/permissions/secret-prompt-types.ts +34 -0
  906. package/src/permissions/secret-prompter.ts +21 -19
  907. package/src/permissions/types.ts +0 -14
  908. package/src/persistence/__tests__/bulk-write-gate.test.ts +159 -0
  909. package/src/persistence/__tests__/conversation-queries-search.test.ts +0 -7
  910. package/src/persistence/__tests__/immediate-transaction-guard.test.ts +70 -0
  911. package/src/persistence/__tests__/message-content-file.test.ts +259 -0
  912. package/src/persistence/__tests__/slow-query-log.test.ts +125 -0
  913. package/src/persistence/attachments-store.ts +90 -26
  914. package/src/persistence/auto-analysis-constants.ts +4 -13
  915. package/src/persistence/bulk-write-gate.ts +82 -0
  916. package/src/persistence/cleanup-schedule-state.ts +51 -21
  917. package/src/persistence/conversation-bootstrap.ts +3 -3
  918. package/src/persistence/conversation-crud.ts +382 -105
  919. package/src/persistence/conversation-disk-view.ts +32 -15
  920. package/src/persistence/conversation-group-migration.test.ts +1 -8
  921. package/src/persistence/conversation-key-store.ts +0 -2
  922. package/src/persistence/conversation-plugin-facade.ts +190 -0
  923. package/src/persistence/conversation-row-batch-delete.ts +16 -1
  924. package/src/persistence/conversation-title-service.ts +59 -22
  925. package/src/persistence/conversation-types.ts +19 -4
  926. package/src/persistence/db-async-query.ts +18 -9
  927. package/src/persistence/db-connection.ts +20 -4
  928. package/src/persistence/db-init.ts +16 -173
  929. package/src/persistence/db-maintenance.ts +78 -6
  930. package/src/persistence/embeddings/__tests__/messages-lexical-index.test.ts +0 -7
  931. package/src/persistence/embeddings/plugin-facade.ts +37 -0
  932. package/src/persistence/embeddings/qdrant-client.ts +2 -18
  933. package/src/persistence/fork-message-copy.ts +18 -4
  934. package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +0 -7
  935. package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +0 -6
  936. package/src/persistence/job-handlers/__tests__/message-lexical.test.ts +0 -7
  937. package/src/persistence/job-handlers/message-lexical-backfill.ts +8 -5
  938. package/src/persistence/job-handlers/message-lexical.ts +2 -2
  939. package/src/persistence/jobs-store.ts +48 -85
  940. package/src/persistence/llm-request-log-sink-clickhouse.ts +325 -0
  941. package/src/persistence/llm-request-log-store.ts +213 -100
  942. package/src/persistence/llm-request-log-writer-types.ts +80 -0
  943. package/src/persistence/message-content-file.ts +301 -0
  944. package/src/persistence/message-content.ts +33 -72
  945. package/src/persistence/migrations/321-canonical-guardian-request-trigger.ts +27 -0
  946. package/src/persistence/migrations/322-add-processing-resume-attempts.ts +31 -0
  947. package/src/persistence/migrations/323-delete-non-default-memory-scopes.test.ts +148 -0
  948. package/src/persistence/migrations/323-delete-non-default-memory-scopes.ts +35 -0
  949. package/src/persistence/migrations/324-message-finalized-column.ts +26 -0
  950. package/src/persistence/migrations/325-create-config-setting-events.ts +40 -0
  951. package/src/persistence/migrations/326-move-injection-events-to-memory-db.ts +104 -0
  952. package/src/persistence/migrations/327-create-flush-checkpoints.ts +86 -0
  953. package/src/persistence/migrations/__tests__/297-move-llm-request-logs.test.ts +2 -2
  954. package/src/persistence/migrations/__tests__/327-create-flush-checkpoints.test.ts +124 -0
  955. package/src/persistence/schema/conversations.ts +25 -1
  956. package/src/persistence/schema/guardian.ts +5 -0
  957. package/src/persistence/schema/infrastructure.ts +33 -0
  958. package/src/persistence/schema/memory-core.ts +17 -28
  959. package/src/persistence/schema/memory-graph.ts +0 -4
  960. package/src/persistence/schema/memory-injection.ts +3 -1
  961. package/src/persistence/schema/tasks.ts +0 -1
  962. package/src/persistence/slow-query-log.ts +58 -21
  963. package/src/persistence/steps.ts +14 -0
  964. package/src/platform/consent-cache.test.ts +0 -7
  965. package/src/platform/managed-speech.test.ts +218 -0
  966. package/src/platform/managed-speech.ts +195 -0
  967. package/src/playbooks/playbook-compiler.ts +2 -10
  968. package/src/plugin-api/index.ts +79 -0
  969. package/src/plugin-api/model-profiles.test.ts +31 -3
  970. package/src/plugin-api/model-profiles.ts +3 -1
  971. package/src/plugin-api/types.ts +12 -3
  972. package/src/plugin-api/vision-support.ts +4 -3
  973. package/src/plugins/AGENTS.md +19 -0
  974. package/src/plugins/__tests__/plugin-state-boundary-guard.test.ts +65 -0
  975. package/src/plugins/defaults/compaction/compact.ts +13 -0
  976. package/src/plugins/defaults/compaction/window-manager.ts +207 -43
  977. package/src/plugins/defaults/image-fallback/__tests__/caption-cache-persistence.test.ts +216 -0
  978. package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +281 -2
  979. package/src/plugins/defaults/image-fallback/__tests__/vision-recovery.test.ts +268 -0
  980. package/src/plugins/defaults/image-fallback/hooks/conversation-deleted.ts +27 -0
  981. package/src/plugins/defaults/image-fallback/hooks/init.ts +16 -0
  982. package/src/plugins/defaults/image-fallback/hooks/post-compact.ts +52 -0
  983. package/src/plugins/defaults/image-fallback/hooks/post-model-call.ts +80 -0
  984. package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +7 -4
  985. package/src/plugins/defaults/image-fallback/hooks/shutdown.ts +14 -0
  986. package/src/plugins/defaults/image-fallback/hooks/stop.ts +23 -0
  987. package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +12 -12
  988. package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +73 -15
  989. package/src/plugins/defaults/image-fallback/src/caption-cache.ts +206 -20
  990. package/src/plugins/defaults/image-fallback/src/recovery-state.ts +49 -0
  991. package/src/plugins/defaults/image-fallback/src/vision-caption.ts +11 -3
  992. package/src/plugins/defaults/image-fallback/src/vision-error.ts +19 -0
  993. package/src/plugins/defaults/image-recovery/detect.ts +32 -10
  994. package/src/plugins/defaults/image-recovery/hooks/post-model-call.ts +20 -18
  995. package/src/plugins/defaults/image-recovery/recover.ts +97 -61
  996. package/src/plugins/defaults/index.ts +29 -5
  997. package/src/plugins/defaults/injector-order.ts +1 -0
  998. package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +1 -8
  999. package/src/plugins/defaults/memory/__tests__/clear-stale-processing-flags.test.ts +1 -8
  1000. package/src/plugins/defaults/memory/__tests__/conversation-queries.test.ts +1 -8
  1001. package/src/plugins/defaults/memory/__tests__/conversation-row-batch-delete.test.ts +0 -6
  1002. package/src/plugins/defaults/memory/__tests__/db-maintenance.test.ts +105 -11
  1003. package/src/plugins/defaults/memory/__tests__/db-memory-attach.test.ts +22 -18
  1004. package/src/plugins/defaults/memory/__tests__/embedding-cache.test.ts +0 -6
  1005. package/src/plugins/defaults/memory/__tests__/find-most-recent-retrospective-for.test.ts +1 -8
  1006. package/src/plugins/defaults/memory/__tests__/fork-message-copy.test.ts +0 -6
  1007. package/src/plugins/defaults/memory/__tests__/jobs-store-enqueue-gate.test.ts +7 -70
  1008. package/src/plugins/defaults/memory/__tests__/jobs-worker-memory-disabled.test.ts +0 -7
  1009. package/src/plugins/defaults/memory/__tests__/jobs-worker-pkb-schedule.test.ts +7 -0
  1010. package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +0 -5
  1011. package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +7 -0
  1012. package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +0 -7
  1013. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +186 -19
  1014. package/src/plugins/defaults/memory/__tests__/memory-retrospective-skill-card.test.ts +926 -0
  1015. package/src/plugins/defaults/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +136 -82
  1016. package/src/plugins/defaults/memory/__tests__/memory-retrospective-state.test.ts +0 -6
  1017. package/src/plugins/defaults/memory/__tests__/memory-retrospective-trigger-check.test.ts +217 -2
  1018. package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -7
  1019. package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +0 -7
  1020. package/src/plugins/defaults/memory/__tests__/table-relocation.test.ts +49 -0
  1021. package/src/plugins/defaults/memory/activation-session-store.ts +1 -1
  1022. package/src/plugins/defaults/memory/anisotropy.ts +1 -1
  1023. package/src/plugins/defaults/memory/config.ts +155 -6
  1024. package/src/plugins/defaults/memory/context-search/agent-protocol.ts +1 -1
  1025. package/src/plugins/defaults/memory/context-search/search.ts +1 -1
  1026. package/src/plugins/defaults/memory/context-search/sources/conversations.ts +26 -23
  1027. package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +1 -1
  1028. package/src/plugins/defaults/memory/context-search/sources/memory.ts +1 -1
  1029. package/src/plugins/defaults/memory/embeddings.ts +8 -40
  1030. package/src/plugins/defaults/memory/filing-jobs.ts +1 -1
  1031. package/src/plugins/defaults/memory/fork-conversation-memory.ts +8 -4
  1032. package/src/plugins/defaults/memory/frontmatter.ts +1 -1
  1033. package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +4 -25
  1034. package/src/plugins/defaults/memory/graph/bootstrap.ts +13 -19
  1035. package/src/plugins/defaults/memory/graph/capability-seed.ts +62 -33
  1036. package/src/plugins/defaults/memory/graph/consolidation.ts +8 -15
  1037. package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +12 -4
  1038. package/src/plugins/defaults/memory/graph/decay.ts +5 -10
  1039. package/src/plugins/defaults/memory/graph/extraction-job.ts +2 -3
  1040. package/src/plugins/defaults/memory/graph/extraction.test.ts +1 -9
  1041. package/src/plugins/defaults/memory/graph/extraction.ts +149 -64
  1042. package/src/plugins/defaults/memory/graph/graph-search.test.ts +0 -6
  1043. package/src/plugins/defaults/memory/graph/graph-search.ts +33 -15
  1044. package/src/plugins/defaults/memory/graph/image-ref-utils.ts +7 -3
  1045. package/src/plugins/defaults/memory/graph/injection.test.ts +0 -1
  1046. package/src/plugins/defaults/memory/graph/injection.ts +1 -1
  1047. package/src/plugins/defaults/memory/graph/narrative.ts +2 -4
  1048. package/src/plugins/defaults/memory/graph/pattern-scan.ts +2 -5
  1049. package/src/plugins/defaults/memory/graph/retriever.test.ts +27 -28
  1050. package/src/plugins/defaults/memory/graph/retriever.ts +89 -42
  1051. package/src/plugins/defaults/memory/graph/scoring.test.ts +0 -1
  1052. package/src/plugins/defaults/memory/graph/store.test.ts +6 -58
  1053. package/src/plugins/defaults/memory/graph/store.ts +5 -43
  1054. package/src/plugins/defaults/memory/graph/tool-handlers.test.ts +318 -0
  1055. package/src/plugins/defaults/memory/graph/tool-handlers.ts +244 -8
  1056. package/src/plugins/defaults/memory/graph/tools.ts +1 -1
  1057. package/src/plugins/defaults/memory/graph/types.ts +0 -3
  1058. package/src/plugins/defaults/memory/graph-topology/__tests__/build-memory-graph.test.ts +130 -0
  1059. package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +303 -0
  1060. package/src/plugins/defaults/memory/graph-topology/flag.ts +14 -0
  1061. package/src/plugins/defaults/memory/graph-topology/types.ts +84 -0
  1062. package/src/plugins/defaults/memory/hooks/init.ts +1 -1
  1063. package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +10 -10
  1064. package/src/plugins/defaults/memory/host-utils.ts +80 -0
  1065. package/src/plugins/defaults/memory/identity-context.ts +39 -0
  1066. package/src/plugins/defaults/memory/indexer.ts +18 -54
  1067. package/src/plugins/defaults/memory/injectors.ts +5 -8
  1068. package/src/plugins/defaults/memory/job-handler-registration.ts +0 -4
  1069. package/src/plugins/defaults/memory/job-handlers/backfill.ts +10 -8
  1070. package/src/plugins/defaults/memory/job-handlers/embedding.test.ts +0 -8
  1071. package/src/plugins/defaults/memory/job-handlers/embedding.ts +31 -17
  1072. package/src/plugins/defaults/memory/job-handlers/index-maintenance.ts +13 -6
  1073. package/src/plugins/defaults/memory/job-handlers.ts +10 -9
  1074. package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +0 -7
  1075. package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +3 -3
  1076. package/src/plugins/defaults/memory/jobs/embed-pkb-file.test.ts +41 -28
  1077. package/src/plugins/defaults/memory/jobs/embed-pkb-file.ts +10 -5
  1078. package/src/plugins/defaults/memory/jobs-worker.ts +161 -50
  1079. package/src/plugins/defaults/memory/logging.ts +17 -0
  1080. package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +143 -0
  1081. package/src/plugins/defaults/memory/memory-retrospective-constants.ts +19 -7
  1082. package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +5 -6
  1083. package/src/plugins/defaults/memory/memory-retrospective-fork-boundary.ts +57 -20
  1084. package/src/plugins/defaults/memory/memory-retrospective-job.ts +220 -79
  1085. package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +448 -0
  1086. package/src/plugins/defaults/memory/memory-retrospective-startup-cleanup.ts +52 -39
  1087. package/src/plugins/defaults/memory/memory-retrospective-state.ts +14 -10
  1088. package/src/plugins/defaults/memory/memory-retrospective-trigger-check.ts +8 -3
  1089. package/src/plugins/defaults/memory/message-media.ts +80 -0
  1090. package/src/plugins/defaults/memory/paths.ts +48 -0
  1091. package/src/plugins/defaults/memory/pkb/autoinject.ts +1 -1
  1092. package/src/plugins/defaults/memory/pkb/context.ts +2 -2
  1093. package/src/plugins/defaults/memory/pkb/pkb-index.test.ts +25 -44
  1094. package/src/plugins/defaults/memory/pkb/pkb-index.ts +24 -25
  1095. package/src/plugins/defaults/memory/pkb/pkb-reconcile.test.ts +46 -34
  1096. package/src/plugins/defaults/memory/pkb/pkb-reconcile.ts +4 -9
  1097. package/src/plugins/defaults/memory/pkb/pkb-search.test.ts +5 -17
  1098. package/src/plugins/defaults/memory/pkb/pkb-search.ts +2 -9
  1099. package/src/plugins/defaults/memory/pkb/types.ts +1 -12
  1100. package/src/plugins/defaults/memory/pkb-schedule.ts +2 -2
  1101. package/src/plugins/defaults/memory/rerank-local.ts +3 -4
  1102. package/src/plugins/defaults/memory/routes/__tests__/memory-v2-simulate-route.test.ts +9 -17
  1103. package/src/plugins/defaults/memory/routes/memory-eval-routes.ts +2 -2
  1104. package/src/plugins/defaults/memory/routes/memory-graph-routes.ts +71 -0
  1105. package/src/plugins/defaults/memory/routes/memory-item-routes.test.ts +149 -9
  1106. package/src/plugins/defaults/memory/routes/memory-item-routes.ts +147 -12
  1107. package/src/plugins/defaults/memory/routes/memory-v2-routes.ts +7 -11
  1108. package/src/plugins/defaults/memory/routes/memory-v3-routes.ts +1 -1
  1109. package/src/plugins/defaults/memory/startup.ts +3 -4
  1110. package/src/plugins/defaults/memory/task-memory-cleanup.ts +1 -1
  1111. package/src/plugins/defaults/memory/tools.test.ts +1 -9
  1112. package/src/plugins/defaults/memory/tools.ts +0 -1
  1113. package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +0 -5
  1114. package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +0 -6
  1115. package/src/plugins/defaults/memory/v2/__tests__/cli-command-store.test.ts +6 -6
  1116. package/src/plugins/defaults/memory/v2/__tests__/consolidation-job.test.ts +48 -6
  1117. package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +0 -5
  1118. package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +0 -5
  1119. package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +0 -5
  1120. package/src/plugins/defaults/memory/v2/__tests__/injection-events.test.ts +61 -69
  1121. package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +0 -5
  1122. package/src/plugins/defaults/memory/v2/__tests__/migration.test.ts +0 -6
  1123. package/src/plugins/defaults/memory/v2/__tests__/page-index.test.ts +0 -5
  1124. package/src/plugins/defaults/memory/v2/__tests__/prompts-consolidation.test.ts +28 -0
  1125. package/src/plugins/defaults/memory/v2/__tests__/qdrant.test.ts +3 -6
  1126. package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +3 -5
  1127. package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +16 -27
  1128. package/src/plugins/defaults/memory/v2/__tests__/sim.test.ts +0 -5
  1129. package/src/plugins/defaults/memory/v2/__tests__/skill-content.test.ts +1 -1
  1130. package/src/plugins/defaults/memory/v2/__tests__/skill-store.test.ts +56 -22
  1131. package/src/plugins/defaults/memory/v2/__tests__/static-context.test.ts +9 -6
  1132. package/src/plugins/defaults/memory/v2/__tests__/sweep-job.test.ts +6 -6
  1133. package/src/plugins/defaults/memory/v2/backfill-jobs.ts +31 -16
  1134. package/src/plugins/defaults/memory/v2/cli-command-content.ts +78 -0
  1135. package/src/plugins/defaults/memory/v2/cli-command-store.ts +32 -11
  1136. package/src/plugins/defaults/memory/v2/consolidation-job.ts +45 -5
  1137. package/src/plugins/defaults/memory/v2/frontmatter-sweep.ts +1 -1
  1138. package/src/plugins/defaults/memory/v2/harness/harness-types.ts +12 -0
  1139. package/src/plugins/defaults/memory/v2/harness/retriever.ts +1 -8
  1140. package/src/plugins/defaults/memory/v2/harness/router-retriever.ts +1 -8
  1141. package/src/plugins/defaults/memory/v2/harness/trace.ts +1 -1
  1142. package/src/plugins/defaults/memory/v2/injection-events.ts +34 -15
  1143. package/src/plugins/defaults/memory/v2/injection.ts +3 -4
  1144. package/src/plugins/defaults/memory/v2/memory-v2-startup.test.ts +0 -5
  1145. package/src/plugins/defaults/memory/v2/memory-v2-startup.ts +2 -2
  1146. package/src/plugins/defaults/memory/v2/migration.ts +1 -1
  1147. package/src/plugins/defaults/memory/v2/page-index.ts +1 -1
  1148. package/src/plugins/defaults/memory/v2/prompts/consolidation.ts +6 -2
  1149. package/src/plugins/defaults/memory/v2/prompts/router.ts +1 -1
  1150. package/src/plugins/defaults/memory/v2/qdrant.ts +2 -2
  1151. package/src/plugins/defaults/memory/v2/reranker.ts +2 -2
  1152. package/src/plugins/defaults/memory/v2/router.ts +10 -20
  1153. package/src/plugins/defaults/memory/v2/skill-content.ts +23 -4
  1154. package/src/plugins/defaults/memory/v2/skill-store.ts +44 -43
  1155. package/src/plugins/defaults/memory/v2/static-context.ts +7 -12
  1156. package/src/plugins/defaults/memory/v2/sweep-job.ts +24 -13
  1157. package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +19 -0
  1158. package/src/plugins/defaults/memory/v3/__tests__/dense.test.ts +0 -5
  1159. package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +17 -0
  1160. package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +14 -4
  1161. package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +23 -17
  1162. package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +20 -6
  1163. package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +2 -0
  1164. package/src/plugins/defaults/memory/v3/__tests__/section-dense-store.test.ts +0 -5
  1165. package/src/plugins/defaults/memory/v3/candidate-match.ts +20 -11
  1166. package/src/plugins/defaults/memory/v3/dense.ts +1 -1
  1167. package/src/plugins/defaults/memory/v3/injector.ts +1 -1
  1168. package/src/plugins/defaults/memory/v3/learned-edges.test.ts +14 -0
  1169. package/src/plugins/defaults/memory/v3/learned-edges.ts +6 -1
  1170. package/src/plugins/defaults/memory/v3/maintain-job.ts +39 -31
  1171. package/src/plugins/defaults/memory/v3/orchestrate.ts +1 -1
  1172. package/src/plugins/defaults/memory/v3/page-content.ts +1 -1
  1173. package/src/plugins/defaults/memory/v3/pool-select.ts +2 -3
  1174. package/src/plugins/defaults/memory/v3/prune.test.ts +10 -0
  1175. package/src/plugins/defaults/memory/v3/prune.ts +1 -1
  1176. package/src/plugins/defaults/memory/v3/section-dense-store.ts +1 -1
  1177. package/src/plugins/defaults/memory/v3/selection-log-store.ts +1 -1
  1178. package/src/plugins/defaults/memory/v3/shadow-plugin.ts +47 -25
  1179. package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +31 -11
  1180. package/src/plugins/defaults/memory/worker.ts +2 -2
  1181. package/src/plugins/defaults/workspace/injectors.ts +116 -5
  1182. package/src/plugins/mtime-cache.ts +207 -105
  1183. package/src/plugins/pipeline.ts +195 -5
  1184. package/src/plugins/surface-import.ts +52 -14
  1185. package/src/plugins/types.ts +10 -15
  1186. package/src/prompts/persona-resolver.ts +1 -1
  1187. package/src/prompts/system-prompt.ts +2 -4
  1188. package/src/prompts/templates/system-sections.ts +12 -0
  1189. package/src/providers/__tests__/connection-model-compat.test.ts +0 -5
  1190. package/src/providers/__tests__/count-tokens-forwarding.test.ts +1 -21
  1191. package/src/providers/__tests__/dispatch-connection-routing.test.ts +12 -6
  1192. package/src/providers/__tests__/preflight-resolved-config.test.ts +189 -0
  1193. package/src/providers/__tests__/registry-native-web-search.test.ts +21 -3
  1194. package/src/providers/__tests__/retry-callsite.test.ts +207 -8
  1195. package/src/providers/__tests__/satellite-connection-routing.test.ts +12 -6
  1196. package/src/providers/__tests__/vellum-mismatch-routing.test.ts +0 -5
  1197. package/src/providers/anthropic/client.ts +109 -7
  1198. package/src/providers/anthropic-gateway-shared.ts +63 -0
  1199. package/src/providers/call-site-routing.ts +1 -0
  1200. package/src/providers/connection-resolution.ts +192 -6
  1201. package/src/providers/content-block-schema.ts +149 -0
  1202. package/src/providers/gemini/client.ts +84 -22
  1203. package/src/providers/gemini/inline-media.ts +2 -3
  1204. package/src/providers/inference/__tests__/base-url-route-validation.test.ts +5 -0
  1205. package/src/providers/inference/__tests__/codex-token-refresh.test.ts +1 -15
  1206. package/src/providers/inference/adapter-factory.ts +13 -0
  1207. package/src/providers/inference/connection-availability.ts +193 -0
  1208. package/src/providers/inference/connections.ts +6 -10
  1209. package/src/providers/media-resolve.ts +193 -0
  1210. package/src/providers/model-catalog.ts +337 -17
  1211. package/src/providers/model-intents.ts +6 -0
  1212. package/src/providers/openai/__tests__/api-error-normalization.test.ts +98 -0
  1213. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +112 -0
  1214. package/src/providers/openai/api-error-normalization.ts +61 -0
  1215. package/src/providers/openai/chat-completions-provider.ts +73 -10
  1216. package/src/providers/openai/responses-provider.ts +10 -3
  1217. package/src/providers/openrouter/client.ts +6 -39
  1218. package/src/providers/platform-proxy/constants.ts +4 -0
  1219. package/src/providers/provider-availability.ts +23 -1
  1220. package/src/providers/provider-send-message.ts +19 -3
  1221. package/src/providers/registry.ts +5 -1
  1222. package/src/providers/retry.ts +91 -29
  1223. package/src/providers/speech-to-text/__tests__/resolve.test.ts +31 -0
  1224. package/src/providers/speech-to-text/deepgram-realtime.test.ts +393 -1
  1225. package/src/providers/speech-to-text/deepgram-realtime.ts +213 -13
  1226. package/src/providers/speech-to-text/resolve.ts +33 -5
  1227. package/src/providers/types.ts +69 -24
  1228. package/src/providers/vellum-model-routing.ts +11 -0
  1229. package/src/providers/vercel-ai-gateway/client.ts +142 -0
  1230. package/src/runtime/__tests__/actor-trust-resolver.test.ts +132 -0
  1231. package/src/runtime/__tests__/agent-wake.test.ts +232 -16
  1232. package/src/runtime/__tests__/background-job-runner.test.ts +71 -2
  1233. package/src/runtime/__tests__/guardian-vellum-migration.test.ts +5 -15
  1234. package/src/runtime/__tests__/local-principal-trust.test.ts +0 -6
  1235. package/src/runtime/__tests__/member-verdict-cache.test.ts +2 -15
  1236. package/src/runtime/__tests__/trust-verdict-consumer.test.ts +91 -30
  1237. package/src/runtime/access-request-helper.ts +75 -3
  1238. package/src/runtime/actor-trust-resolver.ts +33 -108
  1239. package/src/runtime/agent-wake.ts +45 -25
  1240. package/src/runtime/assistant-event-hub.ts +0 -105
  1241. package/src/runtime/auth/__tests__/middleware.test.ts +1 -10
  1242. package/src/runtime/auth/__tests__/route-policy.test.ts +0 -7
  1243. package/src/runtime/auth/__tests__/token-service.test.ts +1 -8
  1244. package/src/runtime/background-job-runner.ts +57 -2
  1245. package/src/runtime/capabilities.ts +3 -3
  1246. package/src/runtime/channel-reply-delivery.ts +38 -19
  1247. package/src/runtime/channel-retry-sweep.ts +1 -1
  1248. package/src/runtime/confirmation-request-guardian-bridge.ts +4 -3
  1249. package/src/runtime/effective-capabilities.test.ts +0 -36
  1250. package/src/runtime/effective-capabilities.ts +8 -23
  1251. package/src/runtime/guardian-vellum-migration.ts +12 -16
  1252. package/src/runtime/http-router-types.ts +119 -0
  1253. package/src/runtime/http-router.ts +2 -115
  1254. package/src/runtime/http-server.ts +11 -2
  1255. package/src/runtime/http-types.ts +1 -1
  1256. package/src/runtime/introduction-policy.ts +89 -0
  1257. package/src/runtime/local-actor-identity.ts +4 -50
  1258. package/src/runtime/local-principal-trust.ts +1 -1
  1259. package/src/runtime/member-verdict-cache.ts +0 -0
  1260. package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +51 -1
  1261. package/src/runtime/migrations/__tests__/origin-mode.test.ts +62 -0
  1262. package/src/runtime/migrations/gcs-signed-url.ts +21 -7
  1263. package/src/runtime/migrations/origin-mode.ts +16 -11
  1264. package/src/runtime/pending-interactions.ts +8 -3
  1265. package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -7
  1266. package/src/runtime/routes/__tests__/backup-routes.test.ts +0 -7
  1267. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +0 -1
  1268. package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +0 -16
  1269. package/src/runtime/routes/__tests__/client-routes.test.ts +0 -7
  1270. package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +4 -5
  1271. package/src/runtime/routes/__tests__/consolidation-routes.test.ts +8 -8
  1272. package/src/runtime/routes/__tests__/contact-routes.test.ts +2 -3
  1273. package/src/runtime/routes/__tests__/content-source-routes.test.ts +0 -7
  1274. package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +31 -9
  1275. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +0 -7
  1276. package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +0 -8
  1277. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +260 -11
  1278. package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +0 -7
  1279. package/src/runtime/routes/__tests__/default-provider-routes.test.ts +499 -0
  1280. package/src/runtime/routes/__tests__/global-search-routes.test.ts +0 -1
  1281. package/src/runtime/routes/__tests__/inference-callsites-routes.test.ts +54 -0
  1282. package/src/runtime/routes/__tests__/inference-models-routes.test.ts +54 -0
  1283. package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +403 -0
  1284. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +219 -6
  1285. package/src/runtime/routes/__tests__/inference-routes-registration.test.ts +42 -0
  1286. package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +70 -15
  1287. package/src/runtime/routes/__tests__/monitoring-routes.test.ts +1 -1
  1288. package/src/runtime/routes/__tests__/plugins-routes.test.ts +182 -38
  1289. package/src/runtime/routes/__tests__/retrospective-routes.test.ts +1 -8
  1290. package/src/runtime/routes/__tests__/sanity-routes.test.ts +0 -7
  1291. package/src/runtime/routes/__tests__/stt-routes.test.ts +0 -9
  1292. package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +0 -7
  1293. package/src/runtime/routes/__tests__/task-routes.test.ts +2 -2
  1294. package/src/runtime/routes/__tests__/theme-routes.test.ts +66 -0
  1295. package/src/runtime/routes/__tests__/tts-routes.test.ts +0 -7
  1296. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +1 -9
  1297. package/src/runtime/routes/__tests__/wake-conversation-routes.test.ts +0 -7
  1298. package/src/runtime/routes/acp-routes.ts +20 -14
  1299. package/src/runtime/routes/approval-routes.ts +21 -2
  1300. package/src/runtime/routes/canned-message-complete.ts +82 -0
  1301. package/src/runtime/routes/channel-metadata.ts +49 -0
  1302. package/src/runtime/routes/contact-routes.ts +75 -43
  1303. package/src/runtime/routes/conversation-attention-routes.ts +1 -1
  1304. package/src/runtime/routes/conversation-cli-routes.ts +2 -2
  1305. package/src/runtime/routes/conversation-compaction-routes.ts +5 -0
  1306. package/src/runtime/routes/conversation-management-routes.ts +147 -2
  1307. package/src/runtime/routes/conversation-query-routes.ts +378 -43
  1308. package/src/runtime/routes/conversation-routes.ts +89 -181
  1309. package/src/runtime/routes/conversation-starter-routes.ts +12 -23
  1310. package/src/runtime/routes/credential-prompt-routes.ts +48 -4
  1311. package/src/runtime/routes/credential-request-routes.ts +85 -0
  1312. package/src/runtime/routes/credential-routes.ts +40 -5
  1313. package/src/runtime/routes/default-provider-routes.ts +132 -0
  1314. package/src/runtime/routes/errors.ts +17 -0
  1315. package/src/runtime/routes/events-routes.ts +158 -39
  1316. package/src/runtime/routes/guardian-approval-interception.ts +1 -1
  1317. package/src/runtime/routes/http-adapter.ts +1 -1
  1318. package/src/runtime/routes/inbound-message-handler.ts +61 -6
  1319. package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +58 -26
  1320. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +73 -87
  1321. package/src/runtime/routes/inbound-stages/admission-policy.ts +2 -1
  1322. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +1 -8
  1323. package/src/runtime/routes/inbound-stages/background-dispatch.ts +3 -2
  1324. package/src/runtime/routes/inbound-stages/bootstrap-intercept.test.ts +0 -5
  1325. package/src/runtime/routes/inbound-stages/edit-intercept.ts +5 -1
  1326. package/src/runtime/routes/inbound-stages/escalation-intercept.test.ts +0 -5
  1327. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +0 -9
  1328. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +0 -9
  1329. package/src/runtime/routes/inbound-stages/reaction-intercept.test.ts +302 -0
  1330. package/src/runtime/routes/inbound-stages/reaction-intercept.ts +27 -37
  1331. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +1 -1
  1332. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -9
  1333. package/src/runtime/routes/index.ts +16 -4
  1334. package/src/runtime/routes/inference-callsites-routes.ts +211 -0
  1335. package/src/runtime/routes/inference-models-routes.ts +104 -0
  1336. package/src/runtime/routes/inference-profile-session-handler.ts +2 -1
  1337. package/src/runtime/routes/inference-profiles-routes.ts +717 -0
  1338. package/src/runtime/routes/inference-provider-connection-routes.ts +38 -1
  1339. package/src/runtime/routes/inference-send-routes.ts +2 -1
  1340. package/src/runtime/routes/integrations/slack/channels.ts +26 -4
  1341. package/src/runtime/routes/integrations/slack/users.ts +78 -0
  1342. package/src/runtime/routes/internal-telemetry-routes.ts +44 -0
  1343. package/src/runtime/routes/llm-call-sites-routes.ts +2 -1
  1344. package/src/runtime/routes/llm-request-logs-access.ts +19 -0
  1345. package/src/runtime/routes/migration-routes.ts +94 -47
  1346. package/src/runtime/routes/monitoring-routes.ts +1 -1
  1347. package/src/runtime/routes/notification-routes.ts +1 -1
  1348. package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +0 -7
  1349. package/src/runtime/routes/plugins-routes.ts +169 -16
  1350. package/src/runtime/routes/schedule-routes.ts +38 -1
  1351. package/src/runtime/routes/secret-routes.ts +0 -7
  1352. package/src/runtime/routes/settings-routes.ts +160 -22
  1353. package/src/runtime/routes/skills-routes.ts +6 -0
  1354. package/src/runtime/routes/subagents-routes.ts +17 -18
  1355. package/src/runtime/routes/surface-action-routes.ts +4 -2
  1356. package/src/runtime/routes/theme-routes.ts +36 -0
  1357. package/src/runtime/routes/types.ts +2 -1
  1358. package/src/runtime/routes/workflow-routes.ts +1 -1
  1359. package/src/runtime/services/__tests__/auto-analysis-guard.test.ts +2 -16
  1360. package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -1
  1361. package/src/runtime/services/auto-analysis-guard.ts +5 -5
  1362. package/src/runtime/services/conversation-serializer.ts +2 -3
  1363. package/src/runtime/sync/resource-sync-events.ts +4 -0
  1364. package/src/runtime/trust-context-resolver.ts +9 -9
  1365. package/src/runtime/trust-verdict-consumer.ts +46 -5
  1366. package/src/schedule/scheduler.ts +61 -18
  1367. package/src/security/__tests__/oauth2-device-code.test.ts +12 -60
  1368. package/src/security/__tests__/provider-key-env-fallback.test.ts +0 -10
  1369. package/src/security/__tests__/secret-normalize.test.ts +96 -0
  1370. package/src/security/secret-normalize.ts +41 -0
  1371. package/src/security/secret-patterns.ts +3 -0
  1372. package/src/security/secure-keys.ts +222 -49
  1373. package/src/sequence/engine.ts +15 -6
  1374. package/src/signals/user-message.ts +3 -1
  1375. package/src/skills/available-skills.ts +134 -0
  1376. package/src/skills/install-meta.ts +8 -0
  1377. package/src/skills/managed-store.ts +10 -0
  1378. package/src/stt/types.ts +33 -2
  1379. package/src/subagent/manager.ts +5 -6
  1380. package/src/tasks/SPEC.md +10 -17
  1381. package/src/tasks/tool-sanitizer.ts +3 -1
  1382. package/src/telemetry/__tests__/config-setting-events-store.test.ts +126 -0
  1383. package/src/telemetry/__tests__/flush-checkpoints.test.ts +56 -0
  1384. package/src/telemetry/__tests__/watchdog-events-store.test.ts +0 -8
  1385. package/src/telemetry/config-setting-events-store.ts +97 -0
  1386. package/src/telemetry/flush-checkpoints.ts +70 -0
  1387. package/src/telemetry/skill-loaded-events-store.test.ts +0 -8
  1388. package/src/telemetry/telemetry-event-sources.ts +571 -0
  1389. package/src/telemetry/tool-audit.ts +285 -0
  1390. package/src/telemetry/tool-executed-events-store.test.ts +19 -27
  1391. package/src/telemetry/tool-executed-events-store.ts +5 -5
  1392. package/src/telemetry/turn-events-store.ts +36 -0
  1393. package/src/telemetry/turn-outcome.ts +116 -0
  1394. package/src/telemetry/turn-trace-store.test.ts +156 -8
  1395. package/src/telemetry/turn-trace-store.ts +53 -4
  1396. package/src/telemetry/types.ts +91 -2
  1397. package/src/telemetry/usage-telemetry-reporter.test.ts +373 -119
  1398. package/src/telemetry/usage-telemetry-reporter.ts +110 -675
  1399. package/src/telemetry/watchdog-direct-emit.test.ts +0 -5
  1400. package/src/theme/workspace-theme.test.ts +269 -0
  1401. package/src/theme/workspace-theme.ts +304 -0
  1402. package/src/tools/AGENTS.md +0 -26
  1403. package/src/tools/acp/spawn.test.ts +0 -7
  1404. package/src/tools/browser/browser-execution.ts +99 -75
  1405. package/src/tools/browser/cdp-client/__tests__/cdp-inspect-client.test.ts +1 -11
  1406. package/src/tools/browser/cdp-client/__tests__/local-cdp-client.test.ts +0 -10
  1407. package/src/tools/browser/network-recorder.test.ts +0 -11
  1408. package/src/tools/document/document-comment-tool.test.ts +1 -7
  1409. package/src/tools/execution-target.test.ts +31 -0
  1410. package/src/tools/execution-target.ts +1 -1
  1411. package/src/tools/executor.ts +63 -275
  1412. package/src/tools/filesystem/write.ts +0 -2
  1413. package/src/tools/host-terminal/host-shell.test.ts +0 -7
  1414. package/src/tools/host-terminal/host-shell.ts +6 -49
  1415. package/src/tools/permission-checker.ts +33 -81
  1416. package/src/tools/registry.ts +261 -166
  1417. package/src/tools/run-standalone.ts +6 -13
  1418. package/src/tools/side-effects.ts +0 -1
  1419. package/src/tools/skills/find-similar-skills.test.ts +5 -9
  1420. package/src/tools/skills/scaffold-managed.ts +31 -4
  1421. package/src/tools/skills/skill-script-runner.ts +17 -31
  1422. package/src/tools/skills/skill-tool-factory.ts +2 -6
  1423. package/src/tools/subagent/read.ts +6 -4
  1424. package/src/tools/subagent/spawn.ts +28 -29
  1425. package/src/tools/terminal/safe-env.ts +8 -3
  1426. package/src/tools/terminal/shell.test.ts +0 -6
  1427. package/src/tools/terminal/shell.ts +1 -50
  1428. package/src/tools/tool-approval-handler.ts +99 -166
  1429. package/src/tools/tool-defaults.ts +2 -6
  1430. package/src/tools/tool-manifest.ts +0 -49
  1431. package/src/{events/tool-profiling-listener.ts → tools/tool-profiler.ts} +64 -32
  1432. package/src/tools/tool-types.ts +4 -95
  1433. package/src/tools/types.ts +27 -140
  1434. package/src/tools/workflows/manage-workflows.ts +2 -1
  1435. package/src/tools/workflows/run-workflow.test.ts +6 -1
  1436. package/src/tools/workflows/run-workflow.ts +2 -4
  1437. package/src/tools/workspace-tools/loader.ts +26 -14
  1438. package/src/tts/__tests__/pcm-chunk-aligner.test.ts +48 -0
  1439. package/src/tts/__tests__/pcm-sample-rates.test.ts +59 -0
  1440. package/src/tts/__tests__/provider-adapters.test.ts +891 -22
  1441. package/src/tts/__tests__/provider-catalog.test.ts +43 -10
  1442. package/src/tts/__tests__/speakable-segments.test.ts +427 -0
  1443. package/src/tts/__tests__/synthesis-stream.test.ts +5 -1
  1444. package/src/tts/pcm-chunk-aligner.ts +29 -0
  1445. package/src/tts/pcm-sample-rates.ts +47 -0
  1446. package/src/tts/provider-definition.ts +6 -7
  1447. package/src/tts/providers/__tests__/xai-tts-socket.test.ts +406 -0
  1448. package/src/tts/providers/deepgram-provider.ts +160 -102
  1449. package/src/tts/providers/elevenlabs-provider.ts +182 -105
  1450. package/src/tts/providers/fish-audio-provider.ts +72 -105
  1451. package/src/tts/providers/xai-provider.ts +131 -22
  1452. package/src/tts/providers/xai-tts-socket.ts +311 -0
  1453. package/src/tts/speakable-segments.ts +188 -0
  1454. package/src/tts/stream-read.ts +136 -0
  1455. package/src/tts/synthesis-stream.ts +9 -5
  1456. package/src/tts/synthesize-text.ts +15 -5
  1457. package/src/tts/types.ts +21 -0
  1458. package/src/usage/attribution.ts +43 -9
  1459. package/src/util/errors.ts +26 -0
  1460. package/src/util/image-conversion.ts +23 -5
  1461. package/src/util/logger.ts +67 -68
  1462. package/src/util/platform.ts +19 -60
  1463. package/src/util/pricing.ts +14 -11
  1464. package/src/util/process-tree.ts +25 -13
  1465. package/src/util/provider-error-patterns.ts +21 -0
  1466. package/src/util/sqlite-query-label.ts +51 -0
  1467. package/src/util/sqlite-retry.ts +14 -2
  1468. package/src/util/unicode.ts +1 -1
  1469. package/src/watcher/__tests__/engine-auth-notify.test.ts +316 -0
  1470. package/src/watcher/engine.ts +87 -2
  1471. package/src/workflows/capabilities.test.ts +2 -32
  1472. package/src/workflows/capabilities.ts +18 -25
  1473. package/src/workflows/engine-integration.test.ts +1 -7
  1474. package/src/workflows/engine.test.ts +2 -10
  1475. package/src/workflows/engine.ts +1 -1
  1476. package/src/workflows/fanout-load.test.ts +1 -1
  1477. package/src/workflows/journal-store.test.ts +1 -9
  1478. package/src/workflows/leaf-runner.test.ts +0 -6
  1479. package/src/workflows/leaf-runner.ts +4 -5
  1480. package/src/workflows/library.test.ts +1 -9
  1481. package/src/workflows/run-manager.test.ts +2 -10
  1482. package/src/workflows/run-manager.ts +2 -4
  1483. package/src/workspace/adaptive-thinking-repair.ts +1 -1
  1484. package/src/workspace/custom-profile-ensure.ts +133 -0
  1485. package/src/workspace/default-provider-ensure.ts +162 -0
  1486. package/src/workspace/git-service.ts +160 -15
  1487. package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +0 -1
  1488. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +1 -1
  1489. package/src/workspace/migrations/126-strip-managed-profile-bodies.ts +92 -0
  1490. package/src/workspace/migrations/127-backfill-default-provider.ts +176 -0
  1491. package/src/workspace/migrations/128-repair-stale-openrouter-grok-model-ids.ts +112 -0
  1492. package/src/workspace/migrations/129-remove-analyze-conversation-config.ts +59 -0
  1493. package/src/workspace/migrations/registry.ts +8 -0
  1494. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/grants.test.ts +0 -686
  1495. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/grants.ts +0 -184
  1496. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/rendering.ts +0 -135
  1497. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/grants.test.ts +0 -686
  1498. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/grants.ts +0 -184
  1499. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/rendering.ts +0 -135
  1500. package/node_modules/@vellumai/service-contracts/src/__tests__/grants.test.ts +0 -686
  1501. package/node_modules/@vellumai/service-contracts/src/grants.ts +0 -184
  1502. package/node_modules/@vellumai/service-contracts/src/rendering.ts +0 -135
  1503. package/scripts/generate-bundled-tool-registry.ts +0 -223
  1504. package/scripts/test.sh +0 -494
  1505. package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +0 -255
  1506. package/src/__tests__/agent-loop-sentry-hygiene.test.ts +0 -137
  1507. package/src/__tests__/auto-analysis-end-to-end.test.ts +0 -621
  1508. package/src/__tests__/auto-analysis-prompt.test.ts +0 -50
  1509. package/src/__tests__/config-analysis.test.ts +0 -83
  1510. package/src/__tests__/conversation-analysis-routes.test.ts +0 -156
  1511. package/src/__tests__/credential-execution-admin-cli.test.ts +0 -504
  1512. package/src/__tests__/credential-execution-approval-bridge.test.ts +0 -297
  1513. package/src/__tests__/credential-execution-feature-gates.test.ts +0 -185
  1514. package/src/__tests__/credential-execution-shell-lockdown.test.ts +0 -120
  1515. package/src/__tests__/credential-execution-tools.test.ts +0 -289
  1516. package/src/__tests__/db-proxy-transaction.test.ts +0 -206
  1517. package/src/__tests__/event-bus.test.ts +0 -222
  1518. package/src/__tests__/reaction-intercept-cold-cache-warm.test.ts +0 -141
  1519. package/src/__tests__/reaction-intercept-member-verdict-warm.test.ts +0 -157
  1520. package/src/__tests__/skill-memory.test.ts +0 -85
  1521. package/src/__tests__/skill-runtime-path.test.ts +0 -63
  1522. package/src/__tests__/tool-domain-event-publisher.test.ts +0 -216
  1523. package/src/__tests__/tool-metrics-listener.test.ts +0 -194
  1524. package/src/__tests__/tool-profiling-listener.test.ts +0 -219
  1525. package/src/cli/commands/credential-execution.ts +0 -362
  1526. package/src/config/__tests__/bundled-tool-registry-guard.test.ts +0 -120
  1527. package/src/config/bundled-tool-registry.ts +0 -281
  1528. package/src/config/schemas/analysis.ts +0 -32
  1529. package/src/credential-execution/approval-bridge.ts +0 -320
  1530. package/src/credential-execution/feature-gates.ts +0 -61
  1531. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +0 -449
  1532. package/src/events/bus.ts +0 -177
  1533. package/src/events/domain-events.ts +0 -68
  1534. package/src/events/tool-audit-listener.ts +0 -184
  1535. package/src/events/tool-domain-event-publisher.ts +0 -90
  1536. package/src/events/tool-metrics-listener.ts +0 -134
  1537. package/src/events/tool-permission-telemetry-listener.ts +0 -44
  1538. package/src/instrument.ts +0 -213
  1539. package/src/ipc/routes/db-proxy-transaction.ts +0 -151
  1540. package/src/plugins/defaults/memory/__tests__/find-analysis-conversation.test.ts +0 -197
  1541. package/src/runtime/routes/conversation-analysis-routes.ts +0 -75
  1542. package/src/runtime/routes/work-items-routes.test.ts +0 -74
  1543. package/src/runtime/routes/work-items-routes.ts +0 -881
  1544. package/src/runtime/services/__tests__/analyze-conversation.test.ts +0 -477
  1545. package/src/runtime/services/__tests__/auto-analysis-enqueue.test.ts +0 -386
  1546. package/src/runtime/services/__tests__/auto-analysis-prompt.test.ts +0 -53
  1547. package/src/runtime/services/__tests__/conversation-analyze-job.test.ts +0 -213
  1548. package/src/runtime/services/__tests__/manual-analysis-prompt.test.ts +0 -41
  1549. package/src/runtime/services/analyze-conversation.ts +0 -332
  1550. package/src/runtime/services/auto-analysis-enqueue.ts +0 -130
  1551. package/src/runtime/services/auto-analysis-prompt.ts +0 -55
  1552. package/src/runtime/services/conversation-analyze-job.ts +0 -53
  1553. package/src/skills/skill-memory.ts +0 -44
  1554. package/src/tools/credential-execution/make-authenticated-request.ts +0 -198
  1555. package/src/tools/credential-execution/manage-secure-command-tool.ts +0 -371
  1556. package/src/tools/credential-execution/run-authenticated-command.ts +0 -261
  1557. package/src/tools/flag-gated-tools.test.ts +0 -76
  1558. package/src/util/sentry-log-stream.ts +0 -51
@@ -14,10 +14,11 @@ import {
14
14
  like,
15
15
  lt,
16
16
  lte,
17
+ notInArray,
17
18
  or,
18
19
  sql,
19
20
  } from "drizzle-orm";
20
- import { v4 as uuid } from "uuid";
21
+ import { v4 as uuid, v7 as uuidv7 } from "uuid";
21
22
  import { z } from "zod";
22
23
 
23
24
  import type { ChannelId, InterfaceId } from "../channels/types.js";
@@ -27,13 +28,14 @@ import { getConfig } from "../config/loader.js";
27
28
  import { findDisplayTurnEndIndex } from "../conversations/message-consolidation.js";
28
29
  import { findConversation } from "../daemon/conversation-registry.js";
29
30
  import { conversationMetadataSyncTag } from "../daemon/message-types/sync.js";
30
- import type { TrustContext } from "../daemon/trust-context.js";
31
+ import type { TrustContext } from "../daemon/trust-context-types.js";
31
32
  import { clearAllConversationIds } from "../home/feed-writer.js";
32
33
  import type { ConversationDeletedInputContext } from "../hooks/types.js";
33
34
  import { HOOKS } from "../plugin-api/constants.js";
34
35
  import { forkConversationMemory } from "../plugins/defaults/memory/fork-conversation-memory.js";
35
36
  import { indexMessageNow } from "../plugins/defaults/memory/indexer.js";
36
37
  import { runHook } from "../plugins/pipeline.js";
38
+ import type { ContentBlock } from "../providers/types.js";
37
39
  import { getCurrentSeq } from "../runtime/assistant-stream-state.js";
38
40
  import { publishSyncInvalidation } from "../runtime/sync/sync-publisher.js";
39
41
  import { trustClassSchema } from "../runtime/trust-class.js";
@@ -48,7 +50,6 @@ import {
48
50
  deleteOrphanAttachments,
49
51
  linkAttachmentToMessage,
50
52
  } from "./attachments-store.js";
51
- import { AUTO_ANALYSIS_SOURCE } from "./auto-analysis-constants.js";
52
53
  import {
53
54
  appendCompactionEvent,
54
55
  forkCompactionLedger,
@@ -67,6 +68,10 @@ import {
67
68
  import { ensureDisplayOrderMigration } from "./conversation-display-order-migration.js";
68
69
  import { ensureGroupMigration } from "./conversation-group-migration.js";
69
70
  import { deleteConversationRowsInBatches } from "./conversation-row-batch-delete.js";
71
+ import {
72
+ BACKGROUND_CONVERSATION_TYPES,
73
+ type ConversationCreateType,
74
+ } from "./conversation-types.js";
70
75
  import { runAsyncSqlite } from "./db-async-query.js";
71
76
  import {
72
77
  type DrizzleDb,
@@ -84,7 +89,9 @@ import {
84
89
  enqueueLexicalIndexForMessage,
85
90
  enqueuePurgeConversationLexical,
86
91
  } from "./job-handlers/message-lexical.js";
92
+ import { resolveMessageContentBlocks } from "./message-content-file.js";
87
93
  import {
94
+ rawAll,
88
95
  rawExec,
89
96
  rawGet,
90
97
  rawLogsRun,
@@ -187,6 +194,17 @@ export const messageMetadataSchema = z
187
194
  * and read gate (conversation history loading) to enforce trust-aware access.
188
195
  */
189
196
  provenanceTrustClass: trustClassSchema.optional(),
197
+ /**
198
+ * Model that actually served this assistant row, carried on the agent
199
+ * loop's `message_complete` event (the provider's `response.model`, the
200
+ * same value `llm_usage` records) and persisted with the finalized content.
201
+ * Reflects per-call reroutes by a `pre-model-call` hook. Present only on
202
+ * assistant rows produced by a real model call; absent on user rows,
203
+ * tool-result rows, and synthetic assistant rows (provider-error / yield
204
+ * notices). Turn-trace assembly surfaces it as the per-message
205
+ * `TurnTraceMessage.model`.
206
+ */
207
+ model: z.string().optional(),
190
208
  provenanceSourceChannel: channelIdSchema.optional(),
191
209
  provenanceGuardianExternalUserId: z.string().optional(),
192
210
  provenanceRequesterIdentifier: z.string().optional(),
@@ -377,7 +395,6 @@ export interface ConversationRow {
377
395
  slackContextCompactionWatermarkAt: number | null;
378
396
  conversationType: string;
379
397
  source: string;
380
- memoryScopeId: string;
381
398
  originChannel: string | null;
382
399
  originInterface: string | null;
383
400
  forkParentConversationId: string | null;
@@ -415,7 +432,6 @@ export const parseConversation = createRowMapper<
415
432
  slackContextCompactionWatermarkAt: "slackContextCompactionWatermarkAt",
416
433
  conversationType: "conversationType",
417
434
  source: "source",
418
- memoryScopeId: "memoryScopeId",
419
435
  originChannel: "originChannel",
420
436
  originInterface: "originInterface",
421
437
  forkParentConversationId: "forkParentConversationId",
@@ -443,24 +459,31 @@ export interface MessageRow {
443
459
  id: string;
444
460
  conversationId: string;
445
461
  role: string;
446
- content: string;
462
+ /**
463
+ * Typed content blocks, resolved at the row-fetch chokepoint by
464
+ * `resolveMessageContentBlocks`: inline JSON parses, file-backed
465
+ * `{ ref }` rows fold their delta file, and legacy plain strings arrive
466
+ * wrapped in a single text block.
467
+ */
468
+ content: ContentBlock[];
447
469
  createdAt: number;
448
470
  metadata: string | null;
449
471
  clientMessageId: string | null;
472
+ /** 1 = content is complete; 0 = message is still streaming. */
473
+ finalized: number;
450
474
  }
451
475
 
452
476
  const parseMessage = createRowMapper<typeof messages.$inferSelect, MessageRow>({
453
477
  id: "id",
454
478
  conversationId: "conversationId",
455
479
  role: "role",
456
- content: "content",
480
+ content: { from: "content", transform: resolveMessageContentBlocks },
457
481
  createdAt: "createdAt",
458
482
  metadata: "metadata",
459
483
  clientMessageId: "clientMessageId",
484
+ finalized: "finalized",
460
485
  });
461
486
 
462
- export type ConversationCreateType = "standard" | "background" | "scheduled";
463
-
464
487
  /**
465
488
  * Monotonic timestamp source for message ordering. Two messages saved within
466
489
  * the same millisecond (e.g., tool_results user message + assistant message in
@@ -493,10 +516,12 @@ interface InsertMessageCoreParams {
493
516
  conversationId: string;
494
517
  role: MessageRole;
495
518
  content: string;
519
+ /** 0 = row is born streaming (content is an in-flight `{ ref }`). Defaults to 1. */
520
+ finalized?: 0 | 1;
496
521
  metadata?: Record<string, unknown>;
497
522
  clientMessageId?: string;
498
- /** Pre-assigned message ID. When omitted, one is generated via
499
- * `uuid()`. Callers that already have a correlation ID (e.g.
523
+ /** Pre-assigned message ID. When omitted, a time-ordered `uuidv7()` is
524
+ * generated. Callers that already have a correlation ID (e.g.
500
525
  * `requestId` for user turns) can pass it here so the persisted
501
526
  * row ID matches the runtime request ID. */
502
527
  id?: string;
@@ -526,10 +551,19 @@ interface InsertMessageCoreParams {
526
551
  async function insertMessageCore(
527
552
  params: InsertMessageCoreParams,
528
553
  ): Promise<InsertedMessage> {
529
- const { conversationId, role, content, metadata, clientMessageId, id } =
530
- params;
554
+ const {
555
+ conversationId,
556
+ role,
557
+ content,
558
+ finalized,
559
+ metadata,
560
+ clientMessageId,
561
+ id,
562
+ } = params;
531
563
  const db = getDb();
532
- const messageId = id ?? uuid();
564
+ // Time-ordered UUIDv7 so server-generated message ids append to the tail of
565
+ // the WITHOUT ROWID `messages` primary key instead of scattering (v4).
566
+ const messageId = id ?? uuidv7();
533
567
 
534
568
  if (metadata) {
535
569
  const result = messageMetadataSchema.safeParse(metadata);
@@ -561,6 +595,7 @@ async function insertMessageCore(
561
595
  role,
562
596
  content,
563
597
  createdAt: now,
598
+ ...(finalized !== undefined ? { finalized } : {}),
564
599
  ...(metadataStr ? { metadata: metadataStr } : {}),
565
600
  ...(clientMessageId ? { clientMessageId } : {}),
566
601
  };
@@ -669,6 +704,13 @@ export function createConversation(
669
704
  titleOrOpts?:
670
705
  | string
671
706
  | {
707
+ /**
708
+ * Adopt an explicit conversation id instead of minting a new uuid.
709
+ * Callers that already hold a client-provided id and want the row to
710
+ * carry it verbatim (e.g. {@link ensureConversationExists}) pass it
711
+ * here; everyone else omits it and gets a fresh uuid.
712
+ */
713
+ id?: string;
672
714
  title?: string;
673
715
  /**
674
716
  * Override the `is_auto_title` column (schema default 1). Pass
@@ -696,8 +738,8 @@ export function createConversation(
696
738
  requestedConversationType ?? "standard";
697
739
  const source = opts.source ?? "user";
698
740
  const groupId = opts.groupId;
699
- const id = uuid();
700
- const memoryScopeId = "default";
741
+ // Time-ordered UUIDv7 for server-minted conversation ids (see message id).
742
+ const id = opts.id ?? uuidv7();
701
743
 
702
744
  // Ensure group_id column exists for deterministic schema readiness,
703
745
  // even when this conversation has no groupId (a subsequent query or
@@ -722,7 +764,6 @@ export function createConversation(
722
764
  slackContextCompactionWatermarkAt: null as number | null,
723
765
  conversationType,
724
766
  source,
725
- memoryScopeId,
726
767
  scheduleJobId: opts.scheduleJobId ?? null,
727
768
  forkParentConversationId: opts.forkParentConversationId ?? null,
728
769
  // Snapshot↔stream alignment baseline, captured at the creation instant.
@@ -764,6 +805,58 @@ export function createConversation(
764
805
  return conversation;
765
806
  }
766
807
 
808
+ /**
809
+ * A conversation id adopted verbatim from an untrusted source must be safe to
810
+ * embed as a single path component of the on-disk conversation dir
811
+ * (`<timestamp>_<id>/meta.json`). This pattern admits server uuids and the
812
+ * web client's `crypto.randomUUID()` / `draft-<ts>-<hex>` drafts while
813
+ * rejecting anything with path separators, `..`, or other traversal vectors.
814
+ */
815
+ const ADOPTABLE_CONVERSATION_ID_RE = /^[A-Za-z0-9_-]{1,128}$/;
816
+
817
+ /**
818
+ * Ensure a `conversations` row exists for `id`, creating one with default
819
+ * columns only when absent. Idempotent. Returns `true` iff this call inserted
820
+ * the row (so callers can emit a one-time creation side effect, e.g. a
821
+ * conversations-list invalidation).
822
+ *
823
+ * The normal text-send path persists the conversation row through the
824
+ * conversation-key store before the first message is written, so `messages`
825
+ * inserts always have their FK target. Entry points that adopt a
826
+ * client-provided conversation id directly — notably the live-voice session,
827
+ * which binds to the id from its start frame — have no such guarantee: on the
828
+ * first turn of a brand-new chat the row does not exist yet, and persisting
829
+ * the user message trips `FOREIGN KEY constraint failed`. Call this before the
830
+ * first persist to close that gap while keeping the adopted id verbatim.
831
+ *
832
+ * Because the id is adopted verbatim and reaches the filesystem via
833
+ * `createConversation` → `initConversationDir`, an id from an external client
834
+ * is validated first — a value like `../../tmp/x` would otherwise write
835
+ * `meta.json` outside the conversations directory.
836
+ */
837
+ export function ensureConversationExists(id: string): boolean {
838
+ if (getConversation(id)) {
839
+ return false;
840
+ }
841
+ if (!ADOPTABLE_CONVERSATION_ID_RE.test(id)) {
842
+ throw new Error(
843
+ `Refusing to adopt unsafe conversation id: ${JSON.stringify(id)}`,
844
+ );
845
+ }
846
+ try {
847
+ createConversation({ id });
848
+ return true;
849
+ } catch (err) {
850
+ // A concurrent caller may have created the row between the check and the
851
+ // insert (UNIQUE(id) violation). That's the desired end state, so only
852
+ // rethrow if the row still isn't there.
853
+ if (!getConversation(id)) {
854
+ throw err;
855
+ }
856
+ return false;
857
+ }
858
+ }
859
+
767
860
  export function getConversation(id: string): ConversationRow | null {
768
861
  const db = getDb();
769
862
  const row = db
@@ -791,41 +884,9 @@ export function countConversationsByScheduleJobId(
791
884
  );
792
885
  }
793
886
 
794
- /**
795
- * Find the rolling analysis conversation for a given source conversation,
796
- * or null if none exists yet. Used by the auto-analyze loop to append
797
- * to an existing analysis conversation rather than creating a new one
798
- * each time the analyze job fires.
799
- *
800
- * Returns the most recently updated match if multiple exist (defensive —
801
- * shouldn't happen in normal operation but the contract is well-defined).
802
- *
803
- * Hits `idx_conversations_fork_parent_conversation_id` for the
804
- * `forkParentConversationId` lookup.
805
- */
806
- export function findAnalysisConversationFor(
807
- parentConversationId: string,
808
- ): { id: string } | null {
809
- const db = getDb();
810
- const row = db
811
- .select({ id: conversations.id })
812
- .from(conversations)
813
- .where(
814
- and(
815
- eq(conversations.source, AUTO_ANALYSIS_SOURCE),
816
- eq(conversations.forkParentConversationId, parentConversationId),
817
- ),
818
- )
819
- .orderBy(desc(conversations.updatedAt))
820
- .limit(1)
821
- .get();
822
- return row ? { id: row.id } : null;
823
- }
824
-
825
887
  /**
826
888
  * Returns the `source` column for the given conversation, or null if
827
- * not found. Tiny convenience used by the recursion guard in the
828
- * auto-analyze loop.
889
+ * not found. Tiny convenience used by the auto-analysis legacy-row guard.
829
890
  */
830
891
  export function getConversationSource(conversationId: string): string | null {
831
892
  const db = getDb();
@@ -1024,7 +1085,7 @@ export function forkConversation(params: {
1024
1085
  } | null = null;
1025
1086
 
1026
1087
  const forkedMessageValues = messagesToCopy.map((message) => {
1027
- const forkedMessageId = uuid();
1088
+ const forkedMessageId = uuidv7();
1028
1089
  forkedMessageIds.set(message.id, forkedMessageId);
1029
1090
 
1030
1091
  if (message.role === "assistant") {
@@ -1038,7 +1099,7 @@ export function forkConversation(params: {
1038
1099
  id: forkedMessageId,
1039
1100
  conversationId: fc.id,
1040
1101
  role: message.role,
1041
- content: message.content,
1102
+ content: JSON.stringify(message.content),
1042
1103
  createdAt: message.createdAt,
1043
1104
  metadata: cloneForkMessageMetadata(message.metadata, message.id),
1044
1105
  };
@@ -1095,15 +1156,26 @@ interface PopulateForkContentsArgs {
1095
1156
  /** Source→fork message-id map for every copied row. */
1096
1157
  forkedMessageIds: Map<string, string>;
1097
1158
  latestForkedAssistant: { messageId: string; messageAt: number } | null;
1098
- /** `copyBoundaryIndex === sourceMessages.length - 1` for the source. */
1159
+ /**
1160
+ * True when the fork branches from the source's tip, so its rendered window
1161
+ * equals the source's and the wholesale memory-state carry is valid.
1162
+ */
1099
1163
  isFullHistoryFork: boolean;
1100
1164
  /**
1101
- * Count of leading messages behind the compaction event this fork inherits
1102
- * (0 when the fork branches from uncompacted history). Memory-slug seeding
1103
- * skips this prefix, since rows behind the fork's summary are not rendered
1104
- * and must stay re-injectable.
1165
+ * Count of leading `messagesToCopy` entries behind the compaction event this
1166
+ * fork inherits (0 when the copied range already starts at the visible
1167
+ * window, or the fork branches from uncompacted history). Memory-slug
1168
+ * seeding skips this prefix, since rows behind the fork's summary are not
1169
+ * rendered and must stay re-injectable.
1105
1170
  */
1106
1171
  inheritedCompactedMessageCount: number;
1172
+ /**
1173
+ * When true, the source's compaction-event ledger is not copied into the
1174
+ * fork. Set by the retrospective fork whenever it inherits a compaction —
1175
+ * it seeds its own count-adjusted event instead, since the source events'
1176
+ * `compactedMessageCount` values index source-space row positions.
1177
+ */
1178
+ skipCompactionLedgerCopy?: boolean;
1107
1179
  /**
1108
1180
  * When provided, a disk-sync entry is appended per copied message for the
1109
1181
  * caller to flush after commit. Omitted by the retrospective fork, whose
@@ -1136,6 +1208,7 @@ function populateForkContentsInProcess(args: PopulateForkContentsArgs): void {
1136
1208
  latestForkedAssistant,
1137
1209
  isFullHistoryFork,
1138
1210
  inheritedCompactedMessageCount,
1211
+ skipCompactionLedgerCopy,
1139
1212
  diskSyncQueue,
1140
1213
  } = args;
1141
1214
  const db = getDb();
@@ -1159,7 +1232,8 @@ function populateForkContentsInProcess(args: PopulateForkContentsArgs): void {
1159
1232
  const uncachedAttachmentLinks = attachmentLinks.filter(
1160
1233
  (link) => !attachmentIdMap.has(link.attachmentId),
1161
1234
  );
1162
- const stagingMessageId = uncachedAttachmentLinks.length > 0 ? uuid() : null;
1235
+ const stagingMessageId =
1236
+ uncachedAttachmentLinks.length > 0 ? uuidv7() : null;
1163
1237
 
1164
1238
  if (stagingMessageId) {
1165
1239
  db.insert(messages)
@@ -1239,13 +1313,17 @@ function populateForkContentsInProcess(args: PopulateForkContentsArgs): void {
1239
1313
  });
1240
1314
 
1241
1315
  // Carry the source's compaction events that predate the fork boundary so the
1242
- // fork owns a correct ledger for its own future forks/compactions.
1243
- forkCompactionLedger(
1244
- db,
1245
- sourceConversationId,
1246
- fork.id,
1247
- messagesToCopy.at(-1)?.createdAt ?? null,
1248
- );
1316
+ // fork owns a correct ledger for its own future forks/compactions. The
1317
+ // tail-only retrospective fork opts out and seeds a single count-adjusted
1318
+ // event of its own instead.
1319
+ if (!skipCompactionLedgerCopy) {
1320
+ forkCompactionLedger(
1321
+ db,
1322
+ sourceConversationId,
1323
+ fork.id,
1324
+ messagesToCopy.at(-1)?.createdAt ?? null,
1325
+ );
1326
+ }
1249
1327
  }
1250
1328
 
1251
1329
  /**
@@ -1272,17 +1350,28 @@ function latestForkedAssistantFrom(
1272
1350
 
1273
1351
  /**
1274
1352
  * Async variant of {@link forkConversation} for the memory-retrospective job,
1275
- * which forks the entire source conversation into a throwaway background
1276
- * conversation on a hot path that must not stall the daemon.
1353
+ * which forks the source conversation's visible window into a throwaway
1354
+ * background conversation on a hot path that must not stall the daemon.
1355
+ *
1356
+ * Only rows at-or-after the inherited compaction boundary are copied. The
1357
+ * retrospective wake always runs under guardian trust, whose history render
1358
+ * slices `contextCompactedMessageCount` rows off the front and prepends the
1359
+ * summary on `contextSummary` presence alone — so the fork carries the
1360
+ * inherited summary with a compacted count of 0 and renders identically to
1361
+ * the source (summary + tail) without materializing rows the agent cannot
1362
+ * see. The user-facing {@link forkConversation} keeps the full physical
1363
+ * history: user forks are long-lived and browsable, and untrusted-actor
1364
+ * views render the persisted history unsliced.
1277
1365
  *
1278
- * The dominant cost — copying every source message row — runs OFF the event
1279
- * loop in a `sqlite3` subprocess (see {@link copyForkMessagesViaSubprocess}),
1280
- * so `/healthz` and gateway IPC stay responsive during the copy. The cheap
1281
- * tail (conversation row, attachment relink, memory-state seeding) runs
1282
- * in-process and reuses {@link populateForkContentsInProcess}, the same helper
1283
- * the synchronous fork uses, so the two paths cannot drift on that logic. The
1284
- * boundary/compaction computation mirrors {@link forkConversation} and is
1285
- * pinned by a parity test.
1366
+ * The dominant cost — copying the visible tail's message rows — runs OFF the
1367
+ * event loop in a `sqlite3` subprocess (see
1368
+ * {@link copyForkMessagesViaSubprocess}), so `/healthz` and gateway IPC stay
1369
+ * responsive during the copy. The cheap tail (conversation row, attachment
1370
+ * relink, memory-state seeding) runs in-process and reuses
1371
+ * {@link populateForkContentsInProcess}, the same helper the synchronous fork
1372
+ * uses, so the two paths cannot drift on that logic. The cutoff/boundary
1373
+ * computation mirrors {@link forkConversation} and is pinned by a parity
1374
+ * test.
1286
1375
  *
1287
1376
  * The disk-view projection (`syncMessageToDisk`) is intentionally skipped: the
1288
1377
  * fork is GC'd after the retrospective pass and never browsed, and the agent
@@ -1310,6 +1399,12 @@ export async function forkConversationForRetrospective(params: {
1310
1399
  }
1311
1400
 
1312
1401
  const sourceMessages = getMessages(conversationId);
1402
+ // The render path hides the first `contextCompactedMessageCount` rows in
1403
+ // THIS load order (`getMessages`, `createdAt` only) — capture it before the
1404
+ // cutoff re-sort below so the tail-only drop-set matches what the source
1405
+ // actually renders even when `createdAt` ties straddle the compaction
1406
+ // boundary.
1407
+ const loadOrderIds = sourceMessages.map((message) => message.id);
1313
1408
  if (throughMessageId != null) {
1314
1409
  // Re-sort on `(createdAt, id)` so the cutoff slice agrees with the cursor
1315
1410
  // the caller chose it from — see the matching note in `forkConversation`.
@@ -1359,6 +1454,21 @@ export async function forkConversationForRetrospective(params: {
1359
1454
  const inheritsLatestCompaction =
1360
1455
  inheritedCompaction != null &&
1361
1456
  inheritedCompaction.compactedAt === sourceConversation.contextCompactedAt;
1457
+ // Copy only the visible tail: rows behind the inherited summary are never
1458
+ // rendered on this fork (the retrospective wake runs under guardian trust,
1459
+ // which slices `contextCompactedMessageCount` rows off the front), so
1460
+ // copying them would hold the write lock for rows the agent cannot see.
1461
+ // The drop-set is the first `compactedMessageCount` rows in LOAD order —
1462
+ // the exact rows the source's render hides — rather than a positional
1463
+ // slice of the re-sorted array, whose tie order can differ at the
1464
+ // boundary. `slice` self-clamps when the ledger count exceeds the row
1465
+ // count, mirroring the render path's clamp.
1466
+ const hiddenRowIds = new Set(
1467
+ loadOrderIds.slice(0, inheritedCompaction?.compactedMessageCount ?? 0),
1468
+ );
1469
+ const rowsToCopy = messagesToCopy.filter(
1470
+ (message) => !hiddenRowIds.has(message.id),
1471
+ );
1362
1472
  const forkParentMessageId = messagesToCopy.at(-1)?.id ?? null;
1363
1473
  const forkTitle =
1364
1474
  params.title ?? `${sourceConversation.title ?? "Untitled"} (Fork)`;
@@ -1366,9 +1476,9 @@ export async function forkConversationForRetrospective(params: {
1366
1476
 
1367
1477
  // Pre-generate the id map in JS so the same map drives the off-loop copy and
1368
1478
  // the in-process attachment relink that follows.
1369
- const idPairs: ForkIdPair[] = messagesToCopy.map((message) => ({
1479
+ const idPairs: ForkIdPair[] = rowsToCopy.map((message) => ({
1370
1480
  oldId: message.id,
1371
- newId: uuid(),
1481
+ newId: uuidv7(),
1372
1482
  }));
1373
1483
  const forkedMessageIds = new Map<string, string>(
1374
1484
  idPairs.map((pair) => [pair.oldId, pair.newId]),
@@ -1391,9 +1501,19 @@ export async function forkConversationForRetrospective(params: {
1391
1501
  .set({
1392
1502
  forkParentConversationId: sourceConversation.id,
1393
1503
  forkParentMessageId,
1504
+ // Stamped at creation so the startup orphan sweep (which only
1505
+ // considers rows with a non-null `lastMessageAt`) can age this
1506
+ // fork even if the daemon crashes before the copy or the
1507
+ // retrospective instruction lands — including the empty-tail
1508
+ // fork, which copies no rows at all. Phase 3 re-derives the same
1509
+ // value from the copied rows when the tail is non-empty.
1510
+ lastMessageAt: boundaryMessageCreatedAt,
1394
1511
  contextSummary: inheritedCompaction?.summary ?? null,
1395
- contextCompactedMessageCount:
1396
- inheritedCompaction?.compactedMessageCount ?? 0,
1512
+ // Zero of the fork's own rows sit behind the boundary (the
1513
+ // compacted prefix is not copied). The summary still renders:
1514
+ // the history render keys on `contextSummary` presence, not on
1515
+ // this count.
1516
+ contextCompactedMessageCount: 0,
1397
1517
  contextCompactedAt: inheritedCompaction?.compactedAt ?? null,
1398
1518
  slackContextCompactionWatermarkTs: inheritsLatestCompaction
1399
1519
  ? sourceConversation.slackContextCompactionWatermarkTs
@@ -1431,22 +1551,59 @@ export async function forkConversationForRetrospective(params: {
1431
1551
 
1432
1552
  // Phase 3 (in-process): attachments + memory-state seeding, reusing the
1433
1553
  // same helper as the synchronous fork. Disk-view projection is skipped.
1554
+ //
1555
+ // The populate transaction reads (attachment links) before its first
1556
+ // write, so a deferred BEGIN would take its snapshot as a reader and any
1557
+ // concurrent writer committing before the first write fails the
1558
+ // read→write upgrade with SQLITE_BUSY_SNAPSHOT — a hard error
1559
+ // `busy_timeout` cannot wait out, which would discard the entire batch
1560
+ // copy from phase 2. `behavior: "immediate"` acquires the write lock at
1561
+ // BEGIN so the snapshot postdates it, and the retry absorbs residual
1562
+ // contention: the transaction rolls back atomically, so re-running it is
1563
+ // safe.
1434
1564
  const latestForkedAssistant = latestForkedAssistantFrom(
1435
- messagesToCopy,
1565
+ rowsToCopy,
1436
1566
  forkedMessageIds,
1437
1567
  );
1438
- db.transaction(() => {
1439
- populateForkContentsInProcess({
1440
- fork,
1441
- sourceConversationId: sourceConversation.id,
1442
- messagesToCopy,
1443
- forkedMessageIds,
1444
- latestForkedAssistant,
1445
- isFullHistoryFork: copyBoundaryIndex === sourceMessages.length - 1,
1446
- inheritedCompactedMessageCount:
1447
- inheritedCompaction?.compactedMessageCount ?? 0,
1448
- });
1449
- });
1568
+ await withSqliteRetry(
1569
+ () =>
1570
+ db.transaction(
1571
+ () => {
1572
+ populateForkContentsInProcess({
1573
+ fork,
1574
+ sourceConversationId: sourceConversation.id,
1575
+ messagesToCopy: rowsToCopy,
1576
+ forkedMessageIds,
1577
+ latestForkedAssistant,
1578
+ isFullHistoryFork:
1579
+ copyBoundaryIndex === sourceMessages.length - 1,
1580
+ // The copied range already starts at the visible window.
1581
+ inheritedCompactedMessageCount: 0,
1582
+ skipCompactionLedgerCopy: inheritedCompaction != null,
1583
+ });
1584
+ // The fork owns none of the source's ledger events — their
1585
+ // counts index source-space row positions, and this fork row
1586
+ // stores a count of 0. Seed a single event mirroring the fork
1587
+ // row's compaction fields whenever a compaction is inherited
1588
+ // (even when the hidden prefix fell outside the cutoff and
1589
+ // nothing was dropped), so the ledger and the row cache agree
1590
+ // and a fork of this fork inherits the summary with the
1591
+ // fork-local count. With no inherited compaction the default
1592
+ // ledger copy is a natural no-op (no source event is
1593
+ // at-or-before the boundary). Rolls back with the transaction,
1594
+ // so the retry unit stays atomic.
1595
+ if (inheritedCompaction) {
1596
+ appendCompactionEvent(fork.id, {
1597
+ compactedAt: inheritedCompaction.compactedAt,
1598
+ summary: inheritedCompaction.summary,
1599
+ compactedMessageCount: 0,
1600
+ });
1601
+ }
1602
+ },
1603
+ { behavior: "immediate" },
1604
+ ),
1605
+ { op: "forkConversationForRetrospective.populate" },
1606
+ );
1450
1607
 
1451
1608
  const persistedFork = getConversation(fork.id);
1452
1609
  if (!persistedFork) {
@@ -1753,7 +1910,6 @@ export async function addMessage(
1753
1910
  role: message.role,
1754
1911
  content: message.content,
1755
1912
  createdAt: message.createdAt,
1756
- scopeId: "default",
1757
1913
  provenanceTrustClass,
1758
1914
  automated,
1759
1915
  },
@@ -2158,12 +2314,29 @@ export function getLastUserTimestampBefore(
2158
2314
  * newest `role = "user"` row rather than a scan of the whole (potentially
2159
2315
  * multi-GB) table.
2160
2316
  */
2161
- export function getLastUserMessageTimestamp(): number {
2317
+ /**
2318
+ * Timestamp of the newest user-role message in an interactive
2319
+ * (non-background) conversation, or 0 when none exists. Background machinery
2320
+ * writes user-role rows of its own — the memory-retrospective instruction
2321
+ * message, scheduled/heartbeat wake hints — inside background/scheduled
2322
+ * conversations, so an unfiltered max would keep an always-on install
2323
+ * permanently "active" for consumers gating on human quiet (the
2324
+ * db-maintenance quiet period).
2325
+ */
2326
+ export function getLastInteractiveUserMessageTimestamp(): number {
2162
2327
  const db = getDb();
2163
2328
  const row = db
2164
2329
  .select({ createdAt: messages.createdAt })
2165
2330
  .from(messages)
2166
- .where(eq(messages.role, "user"))
2331
+ .innerJoin(conversations, eq(messages.conversationId, conversations.id))
2332
+ .where(
2333
+ and(
2334
+ eq(messages.role, "user"),
2335
+ notInArray(conversations.conversationType, [
2336
+ ...BACKGROUND_CONVERSATION_TYPES,
2337
+ ]),
2338
+ ),
2339
+ )
2167
2340
  .orderBy(desc(messages.createdAt))
2168
2341
  .limit(1)
2169
2342
  .get();
@@ -2319,12 +2492,21 @@ export function unarchiveConversation(id: string): boolean {
2319
2492
  * Persist the processing-start timestamp for a conversation. Called by
2320
2493
  * `Conversation.setProcessing(true)` so out-of-process callers can detect
2321
2494
  * mid-turn state by reading the `conversations` row directly. Pass `null`
2322
- * to clear (turn ended).
2495
+ * to clear (turn ended); a clean turn end also closes any interruption
2496
+ * streak, so the startup auto-resume budget refills.
2323
2497
  */
2324
2498
  export function setConversationProcessingStartedAt(
2325
2499
  id: string,
2326
2500
  startedAt: number | null,
2327
2501
  ): void {
2502
+ if (startedAt == null) {
2503
+ rawRun(
2504
+ "conversation:setProcessingStartedAt",
2505
+ "UPDATE conversations SET processing_started_at = NULL, processing_resume_attempts = 0 WHERE id = ?",
2506
+ id,
2507
+ );
2508
+ return;
2509
+ }
2328
2510
  rawRun(
2329
2511
  "conversation:setProcessingStartedAt",
2330
2512
  "UPDATE conversations SET processing_started_at = ? WHERE id = ?",
@@ -2347,6 +2529,43 @@ export function clearStaleProcessingFlags(): number {
2347
2529
  );
2348
2530
  }
2349
2531
 
2532
+ export interface InterruptedConversationRow {
2533
+ id: string;
2534
+ /** Consecutive startup auto-resume attempts since the last clean turn end. */
2535
+ resumeAttempts: number;
2536
+ }
2537
+
2538
+ /**
2539
+ * Conversations whose persisted processing flag is still set. Read at daemon
2540
+ * startup before {@link clearStaleProcessingFlags} so the interrupted-turn
2541
+ * reconciler knows which conversations were mid-turn when the previous
2542
+ * process exited.
2543
+ */
2544
+ export function listInterruptedConversations(): InterruptedConversationRow[] {
2545
+ return rawAll<{ id: string; processing_resume_attempts: number }>(
2546
+ "conversation:listInterrupted",
2547
+ "SELECT id, processing_resume_attempts FROM conversations WHERE processing_started_at IS NOT NULL",
2548
+ ).map((row) => ({
2549
+ id: row.id,
2550
+ resumeAttempts: row.processing_resume_attempts,
2551
+ }));
2552
+ }
2553
+
2554
+ /**
2555
+ * Bump the persisted auto-resume counter for a conversation the startup
2556
+ * reconciler is about to resume. Intentionally left set by
2557
+ * {@link clearStaleProcessingFlags} — the counter must survive the flag clear
2558
+ * so the resume cap holds across boots. Reset to 0 by the clean turn-end
2559
+ * write in {@link setConversationProcessingStartedAt}.
2560
+ */
2561
+ export function incrementProcessingResumeAttempts(id: string): void {
2562
+ rawRun(
2563
+ "conversation:incrementResumeAttempts",
2564
+ "UPDATE conversations SET processing_resume_attempts = processing_resume_attempts + 1 WHERE id = ?",
2565
+ id,
2566
+ );
2567
+ }
2568
+
2350
2569
  /**
2351
2570
  * Read whether a conversation is currently processing. Checks the in-memory
2352
2571
  * `Conversation._processing` flag first (hot path for resident conversations),
@@ -2904,30 +3123,49 @@ export async function reserveMessage(
2904
3123
  conversationId: string,
2905
3124
  role: MessageRole,
2906
3125
  metadata?: Record<string, unknown>,
3126
+ /**
3127
+ * Workspace-relative in-flight delta-file path. When provided, the row is
3128
+ * created already streaming — `content` holds the `{ ref }` pointer and
3129
+ * `finalized = 0` — so no later row write is needed to enter the
3130
+ * streaming state. The finalize seam folds the row inline.
3131
+ */
3132
+ inflightRef?: string,
2907
3133
  ) {
2908
3134
  return insertMessageCore({
2909
3135
  conversationId,
2910
3136
  role,
2911
- content: "[]",
3137
+ content: inflightRef ? JSON.stringify({ ref: inflightRef }) : "[]",
3138
+ ...(inflightRef ? { finalized: 0 as const } : {}),
2912
3139
  metadata,
2913
3140
  });
2914
3141
  }
2915
3142
 
2916
3143
  /**
2917
- * Update the content of an existing message. Used when consolidating
2918
- * multiple assistant messages into one.
3144
+ * Update the content of an existing message in place. Used for edits to
3145
+ * already-finalized rows: consolidation, channel edit propagation, and the
3146
+ * post-finalize tool-timing stamps (`_startedAt`/`_previewStartedAt`).
3147
+ * Streaming writes do NOT come through here — the agent loop's partial
3148
+ * flushes append to the in-flight delta file (`inflight-message-content.ts`)
3149
+ * and land on the row once, at the finalize seam.
2919
3150
  *
2920
- * This is a pure CRUD primitive: it does NOT enqueue a lexical reindex, because
2921
- * it is also driven by mid-stream partial flushes and high-frequency tool-timing
2922
- * stamps (`_startedAt`/`_previewStartedAt`) that either don't change searchable
2923
- * text or would spam reindex jobs. Callers on genuine content-change seams
2924
- * (streaming finalize, channel edits, consolidation) enqueue the reindex
2925
- * themselves via `enqueueLexicalIndexForMessage`.
3151
+ * This is a pure CRUD primitive: it does NOT enqueue a lexical reindex
3152
+ * (the timing stamps don't change searchable text and would spam reindex
3153
+ * jobs). Callers on genuine content-change seams (channel edits,
3154
+ * consolidation) enqueue the reindex themselves via
3155
+ * `enqueueLexicalIndexForMessage`.
2926
3156
  */
2927
3157
  export function updateMessageContent(
2928
3158
  messageId: string,
2929
3159
  newContent: string,
3160
+ metadataUpdates?: Record<string, unknown>,
2930
3161
  ): void {
3162
+ // When metadata updates ride along (e.g. the served model stamped at
3163
+ // assistant-row finalize), delegate to the transactional content+metadata
3164
+ // writer so both land atomically.
3165
+ if (metadataUpdates) {
3166
+ updateMessageContentAndMetadata(messageId, newContent, metadataUpdates);
3167
+ return;
3168
+ }
2931
3169
  const db = getDb();
2932
3170
  db.update(messages)
2933
3171
  .set({ content: newContent })
@@ -2935,6 +3173,45 @@ export function updateMessageContent(
2935
3173
  .run();
2936
3174
  }
2937
3175
 
3176
+ /**
3177
+ * Terminal content write for a message: store the folded inline content and
3178
+ * set `finalized = 1` in the same statement (with optional metadata riding
3179
+ * the same transaction). After this, the row is immutable streaming-wise and
3180
+ * eligible for batch readers (search, memory indexing).
3181
+ */
3182
+ export function finalizeMessageContent(
3183
+ messageId: string,
3184
+ contentJson: string,
3185
+ metadataUpdates?: Record<string, unknown>,
3186
+ ): void {
3187
+ const db = getDb();
3188
+ if (!metadataUpdates) {
3189
+ db.update(messages)
3190
+ .set({ content: contentJson, finalized: 1 })
3191
+ .where(eq(messages.id, messageId))
3192
+ .run();
3193
+ return;
3194
+ }
3195
+ db.transaction((tx) => {
3196
+ const row = tx
3197
+ .select({ metadata: messages.metadata })
3198
+ .from(messages)
3199
+ .where(eq(messages.id, messageId))
3200
+ .get();
3201
+ const existing = row?.metadata
3202
+ ? (JSON.parse(row.metadata) as Record<string, unknown>)
3203
+ : {};
3204
+ tx.update(messages)
3205
+ .set({
3206
+ content: contentJson,
3207
+ finalized: 1,
3208
+ metadata: JSON.stringify({ ...existing, ...metadataUpdates }),
3209
+ })
3210
+ .where(eq(messages.id, messageId))
3211
+ .run();
3212
+ });
3213
+ }
3214
+
2938
3215
  /**
2939
3216
  * Merge `updates` into the metadata JSON of an existing message.
2940
3217
  * Reads the current metadata, shallow-merges the new fields, and writes back.