@vellumai/assistant 0.10.4-staging.1 → 0.10.4

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 (1999) hide show
  1. package/ARCHITECTURE.md +13 -13
  2. package/bun.lock +165 -0
  3. package/docs/architecture/memory.md +26 -0
  4. package/eslint-rules/cli-no-daemon-internals.js +9 -8
  5. package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +18 -0
  6. package/openapi.yaml +677 -15
  7. package/package.json +8 -1
  8. package/scripts/generate-openapi.ts +149 -62
  9. package/src/__tests__/acp-session.test.ts +2 -2
  10. package/src/__tests__/activation-early-marking.test.ts +4 -4
  11. package/src/__tests__/actor-token-service.test.ts +2 -3
  12. package/src/__tests__/agent-loop-compaction-events.test.ts +1 -0
  13. package/src/__tests__/agent-loop-compaction-strip.test.ts +2 -0
  14. package/src/__tests__/agent-loop-exit-reason.test.ts +4 -1
  15. package/src/__tests__/agent-loop-override-profile.test.ts +2 -2
  16. package/src/__tests__/agent-loop-regrowth-guard.test.ts +8 -0
  17. package/src/__tests__/agent-loop.test.ts +1 -0
  18. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +3 -3
  19. package/src/__tests__/agent-wake-override-profile.test.ts +3 -3
  20. package/src/__tests__/annotate-activity-metadata.test.ts +4 -4
  21. package/src/__tests__/annotate-risk-options.test.ts +4 -4
  22. package/src/__tests__/anthropic-provider.test.ts +53 -2
  23. package/src/__tests__/app-builder-tool-scripts.test.ts +2 -2
  24. package/src/__tests__/app-bundler.test.ts +1 -1
  25. package/src/__tests__/app-conversation-ids-backfill.test.ts +4 -4
  26. package/src/__tests__/app-conversation-ids.test.ts +1 -1
  27. package/src/__tests__/app-dir-path-guard.test.ts +2 -2
  28. package/src/__tests__/app-executors.test.ts +1 -1
  29. package/src/__tests__/app-git-history.test.ts +2 -2
  30. package/src/__tests__/app-git-service.test.ts +2 -2
  31. package/src/__tests__/app-routes-csp.test.ts +2 -2
  32. package/src/__tests__/app-source-watcher.test.ts +1 -1
  33. package/src/__tests__/app-store-dir-names.test.ts +1 -1
  34. package/src/__tests__/approval-cascade.test.ts +7 -7
  35. package/src/__tests__/approval-interception-trust-gates.test.ts +1 -1
  36. package/src/__tests__/approval-primitive.test.ts +3 -3
  37. package/src/__tests__/approval-routes-http.test.ts +2 -2
  38. package/src/__tests__/assistant-event-hub-machine-name.test.ts +1 -1
  39. package/src/__tests__/assistant-events-sse-hardening.test.ts +2 -2
  40. package/src/__tests__/assistant-events-sse-shed.test.ts +2 -2
  41. package/src/__tests__/attachment-upload-trusted-source.test.ts +4 -2
  42. package/src/__tests__/attachments-store.test.ts +9 -6
  43. package/src/__tests__/audit-log-rotation.test.ts +6 -4
  44. package/src/__tests__/auth-fallback-events-store.test.ts +4 -4
  45. package/src/__tests__/auto-analysis-end-to-end.test.ts +13 -9
  46. package/src/__tests__/background-workers-disk-pressure.test.ts +12 -7
  47. package/src/__tests__/btw-routes.test.ts +4 -5
  48. package/src/__tests__/build-persisted-content.test.ts +4 -4
  49. package/src/__tests__/call-controller.test.ts +6 -6
  50. package/src/__tests__/call-conversation-messages.test.ts +4 -4
  51. package/src/__tests__/call-domain.test.ts +5 -5
  52. package/src/__tests__/call-pointer-messages.test.ts +5 -5
  53. package/src/__tests__/call-recovery.test.ts +3 -3
  54. package/src/__tests__/call-routes-http.test.ts +3 -3
  55. package/src/__tests__/call-store.test.ts +3 -3
  56. package/src/__tests__/cancel-resolves-conversation-key.test.ts +2 -2
  57. package/src/__tests__/canonical-guardian-store.test.ts +3 -3
  58. package/src/__tests__/channel-approval-routes.test.ts +9 -7
  59. package/src/__tests__/channel-delivery-store.test.ts +8 -8
  60. package/src/__tests__/channel-guardian.test.ts +24 -66
  61. package/src/__tests__/channel-inbound-disk-pressure.test.ts +4 -4
  62. package/src/__tests__/channel-reply-delivery.test.ts +2 -2
  63. package/src/__tests__/channel-retry-sweep.test.ts +49 -4
  64. package/src/__tests__/clawhub.test.ts +4 -0
  65. package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +2 -2
  66. package/src/__tests__/compaction-events.test.ts +8 -8
  67. package/src/__tests__/compaction-ledger-store.test.ts +4 -4
  68. package/src/__tests__/compaction-trail-store.test.ts +5 -5
  69. package/src/__tests__/compaction.benchmark.test.ts +5 -5
  70. package/src/__tests__/compactor-call-site-logging.test.ts +5 -5
  71. package/src/__tests__/compactor-image-manifest-trust.test.ts +7 -4
  72. package/src/__tests__/compactor-low-watermark-cut.test.ts +5 -5
  73. package/src/__tests__/compactor-preserved-tail-count.test.ts +4 -4
  74. package/src/__tests__/compactor-summary-call-truncation.test.ts +5 -5
  75. package/src/__tests__/compactor-web-search-strip.test.ts +4 -4
  76. package/src/__tests__/config-get-vision-flag.test.ts +1 -1
  77. package/src/__tests__/config-loader-backfill.test.ts +84 -104
  78. package/src/__tests__/config-set-route.test.ts +5 -2
  79. package/src/__tests__/config-watcher-cleanup-throttle.test.ts +3 -3
  80. package/src/__tests__/config-watcher-skill-reseed.test.ts +39 -112
  81. package/src/__tests__/config-watcher.test.ts +54 -31
  82. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +4 -4
  83. package/src/__tests__/contact-store-interaction-info.test.ts +3 -3
  84. package/src/__tests__/contact-store-user-file.test.ts +91 -81
  85. package/src/__tests__/contacts-relay-reads.test.ts +21 -3
  86. package/src/__tests__/contacts-tools.test.ts +2 -2
  87. package/src/__tests__/contacts-write.test.ts +2 -2
  88. package/src/__tests__/context-search-agent-protocol.test.ts +2 -2
  89. package/src/__tests__/context-search-agent-runner.test.ts +2 -2
  90. package/src/__tests__/context-search-conversations-source.test.ts +5 -5
  91. package/src/__tests__/context-search-fanout.test.ts +3 -3
  92. package/src/__tests__/context-search-memory-source.test.ts +9 -8
  93. package/src/__tests__/context-search-memory-v2-source.test.ts +9 -8
  94. package/src/__tests__/context-search-types.test.ts +2 -2
  95. package/src/__tests__/context-search-workspace-source.test.ts +2 -2
  96. package/src/__tests__/conversation-abort-tool-results.test.ts +5 -5
  97. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -3
  98. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +39 -11
  99. package/src/__tests__/conversation-agent-loop-overflow.test.ts +6 -6
  100. package/src/__tests__/conversation-agent-loop.test.ts +51 -13
  101. package/src/__tests__/conversation-analysis-routes.test.ts +4 -4
  102. package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -1
  103. package/src/__tests__/conversation-app-control-lifecycle.test.ts +7 -7
  104. package/src/__tests__/conversation-attachments.test.ts +7 -4
  105. package/src/__tests__/conversation-attention-store.test.ts +4 -4
  106. package/src/__tests__/conversation-attention-telegram.test.ts +8 -5
  107. package/src/__tests__/conversation-clear-safety.test.ts +3 -3
  108. package/src/__tests__/conversation-confirmation-signals.test.ts +7 -7
  109. package/src/__tests__/conversation-crud-inference-profile.test.ts +3 -3
  110. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +25 -25
  111. package/src/__tests__/conversation-directories-parse.test.ts +1 -1
  112. package/src/__tests__/conversation-disk-view-integration.test.ts +5 -5
  113. package/src/__tests__/conversation-disk-view.test.ts +6 -6
  114. package/src/__tests__/conversation-evictor.test.ts +32 -7
  115. package/src/__tests__/conversation-fork-crud.test.ts +24 -21
  116. package/src/__tests__/conversation-fork-retrospective.test.ts +12 -10
  117. package/src/__tests__/conversation-fork-route.test.ts +6 -3
  118. package/src/__tests__/conversation-history-web-search.test.ts +8 -8
  119. package/src/__tests__/conversation-inference-profile-list.test.ts +3 -3
  120. package/src/__tests__/conversation-inference-profile-route.test.ts +3 -3
  121. package/src/__tests__/conversation-init.benchmark.test.ts +1 -1
  122. package/src/__tests__/conversation-key-store-disk-view.test.ts +7 -4
  123. package/src/__tests__/conversation-lifecycle.test.ts +10 -13
  124. package/src/__tests__/conversation-list-source.test.ts +3 -3
  125. package/src/__tests__/conversation-load-history-repair.test.ts +4 -4
  126. package/src/__tests__/conversation-load-history-stripped.test.ts +4 -4
  127. package/src/__tests__/conversation-pairing.test.ts +4 -4
  128. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +5 -5
  129. package/src/__tests__/conversation-process-callsite.test.ts +5 -5
  130. package/src/__tests__/conversation-provider-retry-repair.test.ts +5 -5
  131. package/src/__tests__/conversation-queue.test.ts +55 -9
  132. package/src/__tests__/conversation-routes-disk-view.test.ts +5 -5
  133. package/src/__tests__/conversation-routes-guardian-reply.test.ts +6 -6
  134. package/src/__tests__/conversation-routes-slash-commands.test.ts +57 -10
  135. package/src/__tests__/conversation-runtime-assembly.test.ts +25 -19
  136. package/src/__tests__/conversation-runtime-workspace.test.ts +8 -1
  137. package/src/__tests__/conversation-skill-tools.test.ts +155 -2
  138. package/src/__tests__/conversation-slash-queue.test.ts +6 -6
  139. package/src/__tests__/conversation-slash-unknown.test.ts +6 -6
  140. package/src/__tests__/conversation-speed-override.test.ts +7 -7
  141. package/src/__tests__/conversation-starter-routes.test.ts +2 -2
  142. package/src/__tests__/conversation-store.test.ts +6 -6
  143. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +8 -5
  144. package/src/__tests__/conversation-surfaces-data-persist.test.ts +2 -2
  145. package/src/__tests__/conversation-sync-tags.test.ts +7 -4
  146. package/src/__tests__/conversation-title-service.test.ts +2 -3
  147. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +1 -1
  148. package/src/__tests__/conversation-tool-setup-attribution.test.ts +1 -1
  149. package/src/__tests__/conversation-unread-route.test.ts +2 -2
  150. package/src/__tests__/conversation-usage.test.ts +6 -6
  151. package/src/__tests__/conversation-wipe.test.ts +6 -4
  152. package/src/__tests__/conversation-workspace-cache-state.test.ts +9 -9
  153. package/src/__tests__/conversation-workspace-injection.test.ts +9 -9
  154. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +9 -9
  155. package/src/__tests__/conversations-import-system-filter.test.ts +5 -5
  156. package/src/__tests__/credential-security-invariants.test.ts +4 -4
  157. package/src/__tests__/db-acp-history.test.ts +4 -4
  158. package/src/__tests__/db-activation-state-fk-cascade.test.ts +4 -4
  159. package/src/__tests__/db-activation-state.test.ts +3 -3
  160. package/src/__tests__/db-compaction-events-migration.test.ts +3 -3
  161. package/src/__tests__/db-connection-isolation.test.ts +1 -1
  162. package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +3 -3
  163. package/src/__tests__/db-conversation-inference-profile-migration.test.ts +6 -6
  164. package/src/__tests__/db-drop-contact-acl-columns-migration.test.ts +159 -0
  165. package/src/__tests__/db-llm-request-log-provider-migration.test.ts +3 -3
  166. package/src/__tests__/db-memory-graph-event-date-repair.test.ts +3 -3
  167. package/src/__tests__/db-migration-rollback.test.ts +48 -43
  168. package/src/__tests__/db-proxy-transaction.test.ts +2 -2
  169. package/src/__tests__/db-rename-inference-profile-snake-case-migration.test.ts +3 -3
  170. package/src/__tests__/db-schedule-syntax-migration.test.ts +4 -4
  171. package/src/__tests__/db-slack-compaction-watermark-migration.test.ts +3 -3
  172. package/src/__tests__/db-slack-external-content-normalization.test.ts +4 -4
  173. package/src/__tests__/db-test-helpers.ts +7 -0
  174. package/src/__tests__/delete-propagation.test.ts +4 -4
  175. package/src/__tests__/deterministic-verification-control-plane.test.ts +3 -3
  176. package/src/__tests__/device-id.test.ts +38 -1
  177. package/src/__tests__/dm-backfill.test.ts +3 -3
  178. package/src/__tests__/dm-persistence.test.ts +5 -5
  179. package/src/__tests__/document-conversations.test.ts +3 -3
  180. package/src/__tests__/document-create-dedupe.test.ts +1 -1
  181. package/src/__tests__/document-find-replace.test.ts +1 -1
  182. package/src/__tests__/document-tool-security.test.ts +1 -1
  183. package/src/__tests__/document-update-default-surface.test.ts +1 -1
  184. package/src/__tests__/drop-capability-card-state-migration.test.ts +3 -5
  185. package/src/__tests__/edit-propagation.test.ts +6 -6
  186. package/src/__tests__/embedding-managed-proxy-selection.test.ts +2 -2
  187. package/src/__tests__/empty-state-greeting-cache.test.ts +1 -1
  188. package/src/__tests__/events-client-registration.test.ts +1 -1
  189. package/src/__tests__/exploration-drift-hook.test.ts +7 -23
  190. package/src/__tests__/file-write-tool.test.ts +3 -3
  191. package/src/__tests__/filing-service.test.ts +6 -5
  192. package/src/__tests__/followup-tools.test.ts +2 -2
  193. package/src/__tests__/get-skill-detail-audit.test.ts +1 -1
  194. package/src/__tests__/graph-extraction-event-date.test.ts +1 -1
  195. package/src/__tests__/guardian-action-sweep.test.ts +3 -3
  196. package/src/__tests__/guardian-binding-drift-heal.test.ts +6 -3
  197. package/src/__tests__/guardian-card-withdrawal.test.ts +3 -3
  198. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +4 -4
  199. package/src/__tests__/guardian-dispatch.test.ts +14 -42
  200. package/src/__tests__/guardian-expiry-notifier.test.ts +4 -4
  201. package/src/__tests__/guardian-outbound-http.test.ts +3 -4
  202. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +3 -3
  203. package/src/__tests__/guardian-routing-invariants.test.ts +3 -3
  204. package/src/__tests__/guardian-routing-state.test.ts +6 -4
  205. package/src/__tests__/guardian-verification-voice-binding.test.ts +4 -4
  206. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +1 -1
  207. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +3 -3
  208. package/src/__tests__/heartbeat-disk-pressure.test.ts +7 -13
  209. package/src/__tests__/heartbeat-service.test.ts +31 -19
  210. package/src/__tests__/helpers/channel-test-adapter.ts +22 -48
  211. package/src/__tests__/helpers/create-guardian-binding.ts +1 -1
  212. package/src/__tests__/helpers/derive-guardian-delivery.ts +66 -0
  213. package/src/__tests__/helpers/gateway-acl-store.ts +81 -0
  214. package/src/__tests__/helpers/seed-contact-channel.ts +50 -29
  215. package/src/__tests__/history-repair-hook.test.ts +1 -1
  216. package/src/__tests__/home-state-routes.test.ts +1 -1
  217. package/src/__tests__/http-conversation-lineage.test.ts +4 -4
  218. package/src/__tests__/http-user-message-parity.test.ts +8 -12
  219. package/src/__tests__/identity-routes.test.ts +113 -25
  220. package/src/__tests__/image-recovery-hook.test.ts +3 -3
  221. package/src/__tests__/inbound-invite-redemption.test.ts +36 -38
  222. package/src/__tests__/inbound-slack-persistence.test.ts +5 -5
  223. package/src/__tests__/inbound-trust-verdict.test.ts +5 -4
  224. package/src/__tests__/inference-no-mode-boot-e2e.test.ts +13 -6
  225. package/src/__tests__/inference-profile-reaper.test.ts +3 -3
  226. package/src/__tests__/inference-profile-session-handler.test.ts +3 -3
  227. package/src/__tests__/inference-profile-session-ipc.test.ts +3 -3
  228. package/src/__tests__/init-feature-flag-overrides.test.ts +1 -4
  229. package/src/__tests__/injection-block.test.ts +5 -2
  230. package/src/__tests__/injector-background-turn.test.ts +3 -5
  231. package/src/__tests__/injector-chain.test.ts +25 -16
  232. package/src/__tests__/injector-config-quarantine-notice.test.ts +3 -5
  233. package/src/__tests__/injector-disk-pressure.test.ts +10 -8
  234. package/src/__tests__/injector-document-comments.test.ts +5 -3
  235. package/src/__tests__/injector-pkb-v2-silenced.test.ts +5 -2
  236. package/src/__tests__/injector-registry-order-guard.test.ts +132 -0
  237. package/src/__tests__/injector-v3-suppression.test.ts +15 -9
  238. package/src/__tests__/install-meta.test.ts +104 -0
  239. package/src/__tests__/install-skill-routing.test.ts +1 -1
  240. package/src/__tests__/internal-telemetry-routes.test.ts +4 -4
  241. package/src/__tests__/invite-redemption-service.test.ts +42 -45
  242. package/src/__tests__/invite-routes-http.test.ts +3 -3
  243. package/src/__tests__/invite-service-ipc.test.ts +3 -3
  244. package/src/__tests__/job-handler-registry-guard.test.ts +125 -0
  245. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +8 -8
  246. package/src/__tests__/jobs-store-upsert-debounced.test.ts +7 -4
  247. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +7 -6
  248. package/src/__tests__/list-messages-attachments.test.ts +7 -4
  249. package/src/__tests__/list-messages-client-message-id.test.ts +6 -3
  250. package/src/__tests__/list-messages-hidden-metadata.test.ts +5 -5
  251. package/src/__tests__/list-messages-page-latest.test.ts +5 -5
  252. package/src/__tests__/list-messages-queued.test.ts +223 -0
  253. package/src/__tests__/list-messages-tool-merge.test.ts +6 -3
  254. package/src/__tests__/llm-context-route-provider.test.ts +3 -3
  255. package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +4 -4
  256. package/src/__tests__/llm-request-log-call-site.test.ts +5 -5
  257. package/src/__tests__/llm-request-log-error-payload.test.ts +1 -1
  258. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +2 -1
  259. package/src/__tests__/llm-request-log-source-factory.test.ts +3 -3
  260. package/src/__tests__/llm-request-log-turn-query.test.ts +9 -6
  261. package/src/__tests__/llm-usage-store.test.ts +137 -3
  262. package/src/__tests__/log-export-routes.test.ts +3 -3
  263. package/src/__tests__/log-export-workspace.test.ts +3 -3
  264. package/src/__tests__/managed-profile-guard.test.ts +1 -1
  265. package/src/__tests__/managed-skill-lifecycle.test.ts +3 -3
  266. package/src/__tests__/managed-store.test.ts +307 -0
  267. package/src/__tests__/mcp-config-secret-boundary.test.ts +2 -1
  268. package/src/__tests__/media-stream-server-integration.test.ts +1 -1
  269. package/src/__tests__/memory-jobs-worker-backoff.test.ts +4 -4
  270. package/src/__tests__/memory-jobs-worker-lanes.test.ts +11 -9
  271. package/src/__tests__/memory-recall-log-store.test.ts +4 -4
  272. package/src/__tests__/memory-retrieval-budget.test.ts +1 -1
  273. package/src/__tests__/memory-retrieval-hook.test.ts +8 -8
  274. package/src/__tests__/memory-upsert-concurrency.test.ts +9 -5
  275. package/src/__tests__/memory-v2-static-injector.test.ts +3 -3
  276. package/src/__tests__/messages-after-tiebreaker.test.ts +4 -4
  277. package/src/__tests__/messaging-send-tool.test.ts +5 -5
  278. package/src/__tests__/mock-gateway-ipc.ts +1 -1
  279. package/src/__tests__/native-web-search.test.ts +11 -11
  280. package/src/__tests__/non-member-access-request.test.ts +9 -7
  281. package/src/__tests__/notification-candidate-guardian-context.test.ts +4 -4
  282. package/src/__tests__/notification-deep-link.test.ts +3 -3
  283. package/src/__tests__/notification-guardian-path.test.ts +3 -3
  284. package/src/__tests__/notification-schedule-notify-dedup.test.ts +3 -3
  285. package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
  286. package/src/__tests__/oauth-provider-visibility.test.ts +2 -2
  287. package/src/__tests__/oauth-store.test.ts +6 -6
  288. package/src/__tests__/outbound-slack-persistence.test.ts +8 -8
  289. package/src/__tests__/persist-unsendable-image-downscale.test.ts +3 -3
  290. package/src/__tests__/persist-unsendable-image.test.ts +3 -3
  291. package/src/__tests__/persist-user-message-set-processing-failure.test.ts +70 -0
  292. package/src/__tests__/persistence-layering-guard.test.ts +207 -0
  293. package/src/__tests__/persistence-secret-redaction.test.ts +6 -6
  294. package/src/__tests__/pkb-autoinject.test.ts +1 -1
  295. package/src/__tests__/platform-bash-auto-approve.test.ts +3 -3
  296. package/src/__tests__/playbook-execution.test.ts +4 -4
  297. package/src/__tests__/playbook-tools.test.ts +3 -3
  298. package/src/__tests__/plugin-bootstrap.test.ts +40 -3
  299. package/src/__tests__/plugin-config-data-migration.test.ts +263 -0
  300. package/src/__tests__/plugin-disabled-state.test.ts +137 -4
  301. package/src/__tests__/plugin-import-boundary-guard.test.ts +495 -0
  302. package/src/__tests__/plugin-injector-contribution.test.ts +149 -0
  303. package/src/__tests__/pointer-conversation-trust.test.ts +141 -0
  304. package/src/__tests__/post-compaction-reinjection-idempotency.test.ts +8 -1
  305. package/src/__tests__/process-message-background-slack.test.ts +6 -6
  306. package/src/__tests__/process-message-display-content.test.ts +5 -5
  307. package/src/__tests__/processing-flag-persist-failure.test.ts +280 -0
  308. package/src/__tests__/provider-usage-tracking.test.ts +3 -3
  309. package/src/__tests__/prune-jobs-changes-parser.test.ts +1 -1
  310. package/src/__tests__/prune-old-conversations-job.test.ts +5 -5
  311. package/src/__tests__/published-app-updater.test.ts +3 -3
  312. package/src/__tests__/qdrant-collection-migration.test.ts +5 -2
  313. package/src/__tests__/qdrant-manager.test.ts +1 -1
  314. package/src/__tests__/reaction-intercept-cold-cache-warm.test.ts +18 -12
  315. package/src/__tests__/reaction-intercept-member-verdict-warm.test.ts +4 -4
  316. package/src/__tests__/reaction-persistence.test.ts +13 -10
  317. package/src/__tests__/rebuild-index-graph-nodes.test.ts +5 -5
  318. package/src/__tests__/recording-handler.test.ts +2 -2
  319. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +8 -8
  320. package/src/__tests__/relay-server.test.ts +140 -156
  321. package/src/__tests__/require-fresh-approval.test.ts +1 -1
  322. package/src/__tests__/resolve-app-id.test.ts +3 -3
  323. package/src/__tests__/runtime-attachment-metadata.test.ts +7 -7
  324. package/src/__tests__/runtime-events-sse-bilingual.test.ts +3 -3
  325. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -3
  326. package/src/__tests__/runtime-events-sse-reconnect.test.ts +3 -3
  327. package/src/__tests__/runtime-events-sse.test.ts +3 -3
  328. package/src/__tests__/scaffold-managed-skill-tool.test.ts +489 -2
  329. package/src/__tests__/schedule-retry.test.ts +53 -53
  330. package/src/__tests__/schedule-routes-workflow-validation.test.ts +47 -43
  331. package/src/__tests__/schedule-routes.test.ts +197 -187
  332. package/src/__tests__/schedule-store.test.ts +174 -172
  333. package/src/__tests__/schedule-tools.test.ts +2 -2
  334. package/src/__tests__/scheduler-disk-pressure.test.ts +3 -3
  335. package/src/__tests__/scheduler-recurrence.test.ts +15 -15
  336. package/src/__tests__/scheduler-reuse-conversation.test.ts +14 -14
  337. package/src/__tests__/scheduler-wake.test.ts +8 -8
  338. package/src/__tests__/scoped-approval-grants.test.ts +4 -4
  339. package/src/__tests__/scoped-grant-security-matrix.test.ts +4 -4
  340. package/src/__tests__/scrub-corrupted-image-attachments.test.ts +2 -2
  341. package/src/__tests__/search-skills-unified.test.ts +1 -1
  342. package/src/__tests__/secret-ingress-channel.test.ts +3 -3
  343. package/src/__tests__/secret-ingress-http.test.ts +6 -6
  344. package/src/__tests__/secret-routes-platform-proxy.test.ts +8 -7
  345. package/src/__tests__/send-endpoint-busy.test.ts +6 -6
  346. package/src/__tests__/sequence-store.test.ts +3 -3
  347. package/src/__tests__/server-history-render.test.ts +7 -4
  348. package/src/__tests__/settings-routes.test.ts +2 -2
  349. package/src/__tests__/skill-docs-sync-guard.test.ts +34 -0
  350. package/src/__tests__/skill-projection-feature-flag.test.ts +2 -1
  351. package/src/__tests__/skill-projection.benchmark.test.ts +2 -1
  352. package/src/__tests__/skill-version-hash.test.ts +32 -0
  353. package/src/__tests__/skills-file-content-endpoint.test.ts +1 -1
  354. package/src/__tests__/skills-files-catalog-fallback.test.ts +1 -1
  355. package/src/__tests__/slack-inbound-verification.test.ts +2 -2
  356. package/src/__tests__/slack-messaging-token-resolution.test.ts +2 -2
  357. package/src/__tests__/slack-reaction-canonical-approval.test.ts +4 -4
  358. package/src/__tests__/slack-share-routes.test.ts +1 -1
  359. package/src/__tests__/slim-skill-category.test.ts +34 -2
  360. package/src/__tests__/starter-task-flow.test.ts +1 -1
  361. package/src/__tests__/strip-memory-injections.test.ts +2 -2
  362. package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
  363. package/src/__tests__/subagent-detail.test.ts +1 -1
  364. package/src/__tests__/subagent-fork-prompt-role.test.ts +1 -1
  365. package/src/__tests__/subagent-notify-parent.test.ts +3 -3
  366. package/src/__tests__/subagent-spawn-and-await.test.ts +1 -1
  367. package/src/__tests__/subagent-spawn-tool-fork.test.ts +3 -3
  368. package/src/__tests__/subagent-tool-gate-mode.test.ts +1 -1
  369. package/src/__tests__/subagent-tools.test.ts +2 -5
  370. package/src/__tests__/suggestion-routes.test.ts +4 -4
  371. package/src/__tests__/task-compiler.test.ts +2 -2
  372. package/src/__tests__/task-management-tools.test.ts +2 -2
  373. package/src/__tests__/task-memory-cleanup.test.ts +9 -7
  374. package/src/__tests__/task-progress-nudge-hook.test.ts +37 -94
  375. package/src/__tests__/task-scheduler.test.ts +26 -26
  376. package/src/__tests__/test-support/tool-invocation-seed.ts +5 -2
  377. package/src/__tests__/thread-backfill.test.ts +4 -4
  378. package/src/__tests__/title-generate-hook.test.ts +6 -6
  379. package/src/__tests__/tool-approval-handler.test.ts +4 -4
  380. package/src/__tests__/tool-audit-listener.test.ts +1 -1
  381. package/src/__tests__/tool-error-hook.test.ts +2 -0
  382. package/src/__tests__/tool-executor-lifecycle-events.test.ts +5 -5
  383. package/src/__tests__/tool-executor-redaction.test.ts +11 -0
  384. package/src/__tests__/tool-executor.test.ts +24 -2
  385. package/src/__tests__/tool-grant-request-escalation.test.ts +5 -5
  386. package/src/__tests__/tool-preview-lifecycle.test.ts +77 -8
  387. package/src/__tests__/tool-result-metadata-plumbing.test.ts +4 -4
  388. package/src/__tests__/tool-result-truncate-hook.test.ts +2 -0
  389. package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -1
  390. package/src/__tests__/tool-start-timestamp.test.ts +65 -2
  391. package/src/__tests__/tools-get-route.test.ts +44 -1
  392. package/src/__tests__/trace-emitter.test.ts +1 -1
  393. package/src/__tests__/trust-context-guards.test.ts +1 -1
  394. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +5 -5
  395. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +11 -5
  396. package/src/__tests__/trusted-contact-multichannel.test.ts +9 -9
  397. package/src/__tests__/trusted-contact-verification.test.ts +8 -30
  398. package/src/__tests__/turn-boundary-resolution.test.ts +7 -4
  399. package/src/__tests__/turn-call-site.test.ts +29 -0
  400. package/src/__tests__/turn-events-store.test.ts +8 -5
  401. package/src/__tests__/twilio-routes.test.ts +3 -3
  402. package/src/__tests__/usage-cache-backfill-migration.test.ts +4 -8
  403. package/src/__tests__/usage-grouped-buckets.test.ts +1 -1
  404. package/src/__tests__/usage-routes.test.ts +61 -3
  405. package/src/__tests__/verification-control-plane-policy.test.ts +6 -6
  406. package/src/__tests__/voice-invite-redemption.test.ts +41 -45
  407. package/src/__tests__/voice-quality.test.ts +38 -12
  408. package/src/__tests__/voice-scoped-grant-consumer.test.ts +22 -14
  409. package/src/__tests__/voice-session-bridge.test.ts +16 -10
  410. package/src/__tests__/web-search-backend-failure.test.ts +4 -4
  411. package/src/__tests__/workspace-lifecycle.test.ts +29 -18
  412. package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +4 -4
  413. package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +5 -5
  414. package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +3 -3
  415. package/src/__tests__/workspace-migration-113-swap-balanced-profile-to-glm-5p2.test.ts +241 -0
  416. package/src/__tests__/workspace-migration-114-swap-quality-profile-to-opus.test.ts +172 -0
  417. package/src/__tests__/workspace-migration-116-rename-memory-plugin-disabled-sentinel.test.ts +128 -0
  418. package/src/__tests__/workspace-migration-117-normalize-stale-lean-memory-v3-defaults.test.ts +221 -0
  419. package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -1
  420. package/src/__tests__/workspace-migration-drop-user-md.test.ts +84 -7
  421. package/src/a2a/__tests__/e2e-a2a-channel.test.ts +10 -6
  422. package/src/a2a/__tests__/task-store.test.ts +2 -2
  423. package/src/a2a/task-store.ts +4 -4
  424. package/src/acp/__tests__/client-handler.test.ts +680 -0
  425. package/src/acp/__tests__/helpers/acp-history-db.ts +32 -4
  426. package/src/acp/__tests__/session-manager-persistence.test.ts +215 -7
  427. package/src/acp/__tests__/session-manager-resume.test.ts +113 -2
  428. package/src/acp/__tests__/session-manager-startup.test.ts +3 -3
  429. package/src/acp/__tests__/session-manager-usage.test.ts +113 -0
  430. package/src/acp/client-handler.ts +140 -21
  431. package/src/acp/session-manager.ts +127 -4
  432. package/src/acp/types.ts +18 -0
  433. package/src/agent/loop.ts +200 -148
  434. package/src/api/events/acp-session-completed.ts +33 -0
  435. package/src/api/events/acp-session-error.ts +21 -0
  436. package/src/api/events/acp-session-spawned.ts +32 -0
  437. package/src/api/events/acp-session-update.test.ts +122 -0
  438. package/src/api/events/acp-session-update.ts +51 -0
  439. package/src/api/events/acp-session-usage.test.ts +49 -0
  440. package/src/api/events/acp-session-usage.ts +31 -0
  441. package/src/api/events/tool-use-preview-start.ts +11 -0
  442. package/src/api/events/tool-use-start.ts +14 -0
  443. package/src/api/index.ts +38 -0
  444. package/src/api/responses/conversation-message.ts +37 -1
  445. package/src/api/responses/llm-request-log-entry.ts +41 -0
  446. package/src/api/responses/memory-v3-selection-log.ts +5 -7
  447. package/src/approvals/approval-primitive.ts +1 -1
  448. package/src/approvals/guardian-card-withdrawal.ts +2 -2
  449. package/src/approvals/guardian-decision-primitive.ts +1 -1
  450. package/src/approvals/guardian-expiry-notifier.ts +1 -1
  451. package/src/approvals/guardian-request-resolvers.ts +4 -4
  452. package/src/approvals/scoped-approval-grants.ts +551 -0
  453. package/src/apps/app-store.ts +1058 -0
  454. package/src/apps/published-pages-store.ts +67 -0
  455. package/src/apps/shared-app-links-store.ts +130 -0
  456. package/src/background-wake/background-wake-routes.test.ts +53 -23
  457. package/src/background-wake/wake-intent-hooks.test.ts +18 -12
  458. package/src/backup/restore.ts +1 -1
  459. package/src/bundler/app-bundler.ts +1 -1
  460. package/src/calls/__tests__/relay-setup-router.test.ts +1 -1
  461. package/src/calls/call-controller.ts +5 -5
  462. package/src/calls/call-conversation-messages.ts +1 -1
  463. package/src/calls/call-domain.ts +5 -5
  464. package/src/calls/call-pointer-messages.ts +1 -1
  465. package/src/calls/call-store.ts +3 -3
  466. package/src/calls/guardian-action-sweep.ts +1 -1
  467. package/src/calls/guardian-dispatch.ts +5 -5
  468. package/src/calls/media-stream-server.ts +1 -1
  469. package/src/calls/relay-access-wait.ts +1 -1
  470. package/src/calls/relay-server.ts +3 -3
  471. package/src/calls/relay-setup-router.ts +1 -1
  472. package/src/calls/tts-call-strategy.ts +4 -3
  473. package/src/calls/voice-quality.ts +47 -59
  474. package/src/calls/voice-session-bridge.ts +2 -16
  475. package/src/channels/channel-verification-sessions.ts +557 -0
  476. package/src/cli/commands/__tests__/conversations-new.test.ts +186 -0
  477. package/src/cli/commands/__tests__/conversations-slack.test.ts +1 -1
  478. package/src/cli/commands/__tests__/conversations-wake.test.ts +147 -0
  479. package/src/cli/commands/__tests__/ps.test.ts +205 -0
  480. package/src/cli/commands/conversations.ts +90 -30
  481. package/src/cli/commands/db/__tests__/repair.test.ts +4 -3
  482. package/src/cli/commands/db/repair-step-conversation-backfill.ts +2 -2
  483. package/src/cli/commands/memory/__tests__/memory-v2-compare-render.test.ts +1 -1
  484. package/src/cli/commands/memory/__tests__/worker.test.ts +106 -307
  485. package/src/cli/commands/memory/memory-retrospective.ts +32 -28
  486. package/src/cli/commands/memory/memory-v2-compare-render.ts +1 -1
  487. package/src/cli/commands/memory/memory-v2.ts +2 -2
  488. package/src/cli/commands/memory/memory-v3.ts +2 -2
  489. package/src/cli/commands/memory/worker.ts +83 -160
  490. package/src/cli/commands/plugins.ts +147 -11
  491. package/src/cli/commands/ps.ts +90 -0
  492. package/src/cli/commands/tools-run.ts +114 -0
  493. package/src/cli/commands/tools.ts +19 -5
  494. package/src/cli/lib/__tests__/cli-colors.test.ts +30 -1
  495. package/src/cli/lib/__tests__/install-from-github.test.ts +168 -8
  496. package/src/cli/lib/__tests__/list-installed-plugins.test.ts +9 -4
  497. package/src/cli/lib/__tests__/parse-github-plugin-spec.test.ts +121 -0
  498. package/src/cli/lib/__tests__/toggle-plugin.test.ts +10 -4
  499. package/src/cli/lib/cli-colors.ts +6 -0
  500. package/src/cli/lib/diff-plugin.ts +3 -7
  501. package/src/cli/lib/inspect-plugin.ts +2 -4
  502. package/src/cli/lib/install-from-github.ts +96 -24
  503. package/src/cli/lib/merge-plugin-tree.ts +5 -3
  504. package/src/cli/lib/parse-github-plugin-spec.ts +163 -0
  505. package/src/cli/lib/plugin-fingerprint.ts +22 -0
  506. package/src/cli/lib/upgrade-plugin.ts +6 -5
  507. package/src/cli/program.ts +4 -7
  508. package/src/cli.ts +6 -3
  509. package/src/config/__tests__/deployment-context-defaults.test.ts +228 -0
  510. package/src/config/__tests__/proc-to-skills.test.ts +21 -0
  511. package/src/config/__tests__/sync-gated-profiles.test.ts +2 -2
  512. package/src/config/bundled-skills/AGENTS.md +11 -0
  513. package/src/config/bundled-skills/app-builder/SKILL.md +2 -0
  514. package/src/config/bundled-skills/app-builder/tools/app-create.ts +2 -2
  515. package/src/config/bundled-skills/app-builder/tools/app-delete.ts +2 -2
  516. package/src/config/bundled-skills/app-builder/tools/app-generate-icon.ts +2 -2
  517. package/src/config/bundled-skills/app-builder/tools/app-list.ts +1 -1
  518. package/src/config/bundled-skills/app-builder/tools/app-refresh.ts +2 -2
  519. package/src/config/bundled-skills/app-builder/tools/app-update.ts +2 -2
  520. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
  521. package/src/config/bundled-skills/media-processing/__tests__/extract-keyframes.test.ts +1 -1
  522. package/src/config/bundled-skills/media-processing/__tests__/preprocess-audio.test.ts +1 -1
  523. package/src/config/bundled-skills/media-processing/services/preprocess.ts +1 -1
  524. package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +1 -1
  525. package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
  526. package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +1 -1
  527. package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +1 -1
  528. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +2 -2
  529. package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +2 -2
  530. package/src/config/bundled-skills/media-processing/tools/media-status.ts +1 -1
  531. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +5 -5
  532. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +6 -6
  533. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +8 -5
  534. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +4 -1
  535. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +2 -2
  536. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -4
  537. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +7 -7
  538. package/src/config/bundled-skills/skill-management/TOOLS.json +45 -0
  539. package/src/config/bundled-skills/skill-management/tools/find-similar.ts +12 -0
  540. package/src/config/bundled-tool-registry.ts +2 -0
  541. package/src/config/feature-flag-registry.json +8 -16
  542. package/src/config/llm-resolver.ts +17 -0
  543. package/src/config/loader.ts +38 -58
  544. package/src/config/memory-v3-gate.ts +16 -0
  545. package/src/config/schema.ts +2 -0
  546. package/src/config/schemas/__tests__/memory-v3.test.ts +16 -5
  547. package/src/config/schemas/conversations.ts +8 -0
  548. package/src/config/schemas/memory-lifecycle.ts +9 -0
  549. package/src/config/schemas/memory-v3.ts +56 -6
  550. package/src/config/schemas/migrations.ts +25 -0
  551. package/src/config/schemas/services.ts +0 -37
  552. package/src/config/seed-inference-profiles.ts +13 -50
  553. package/src/config/sync-gated-profiles.ts +6 -17
  554. package/src/contacts/__tests__/guardian-contact-reader.test.ts +89 -0
  555. package/src/contacts/__tests__/guardian-delivery-reader.test.ts +3 -14
  556. package/src/contacts/canonical-guardian-store.ts +891 -0
  557. package/src/contacts/contact-store.ts +11 -9
  558. package/src/contacts/guardian-contact-reader.ts +52 -0
  559. package/src/contacts/guardian-delivery-reader.ts +21 -23
  560. package/src/contacts/guardian-rate-limits.ts +191 -0
  561. package/src/contacts/notify-contacts-changed.ts +17 -0
  562. package/src/context/compactor.ts +3 -3
  563. package/src/context/strip-injections.ts +1 -1
  564. package/src/conversations/__tests__/message-consolidation.test.ts +10 -26
  565. package/src/conversations/job-handlers/summarization.ts +246 -0
  566. package/src/conversations/message-consolidation.ts +1 -1
  567. package/src/credential-execution/ces-runtime.ts +285 -0
  568. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +25 -22
  569. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +5 -4
  570. package/src/daemon/__tests__/daemon-readiness.test.ts +51 -0
  571. package/src/daemon/__tests__/daemon-skill-host.test.ts +1 -1
  572. package/src/daemon/__tests__/embedding-reconcile.test.ts +456 -0
  573. package/src/daemon/__tests__/inference-profile-notification.test.ts +9 -6
  574. package/src/daemon/__tests__/lifecycle-embedding-reconcile.test.ts +119 -0
  575. package/src/daemon/__tests__/memory-v2-startup.test.ts +86 -0
  576. package/src/daemon/__tests__/native-web-search-metadata.test.ts +2 -2
  577. package/src/daemon/__tests__/web-search-status-text.test.ts +3 -5
  578. package/src/daemon/app-source-watcher.ts +71 -10
  579. package/src/daemon/channel-ui-capability.ts +25 -0
  580. package/src/daemon/config-watcher.ts +71 -47
  581. package/src/daemon/conversation-agent-loop-handlers.ts +150 -23
  582. package/src/daemon/conversation-agent-loop.ts +84 -28
  583. package/src/daemon/conversation-attachments.ts +2 -2
  584. package/src/daemon/conversation-evictor.ts +42 -9
  585. package/src/daemon/conversation-history.ts +6 -6
  586. package/src/daemon/conversation-launch.ts +2 -2
  587. package/src/daemon/conversation-lifecycle.ts +7 -4
  588. package/src/daemon/conversation-messaging.ts +25 -11
  589. package/src/daemon/conversation-notifiers.ts +1 -1
  590. package/src/daemon/conversation-process.ts +17 -15
  591. package/src/daemon/conversation-queue-manager.ts +6 -0
  592. package/src/daemon/conversation-registry.ts +6 -5
  593. package/src/daemon/conversation-runtime-assembly.ts +37 -31
  594. package/src/daemon/conversation-skill-tools.ts +26 -2
  595. package/src/daemon/conversation-slash.ts +1 -1
  596. package/src/daemon/conversation-store.ts +44 -39
  597. package/src/daemon/conversation-surfaces.ts +4 -4
  598. package/src/daemon/conversation-tool-setup.ts +2 -1
  599. package/src/daemon/conversation-usage.ts +4 -2
  600. package/src/daemon/conversation-workspace.ts +2 -2
  601. package/src/daemon/conversation.ts +45 -17
  602. package/src/daemon/daemon-readiness.ts +33 -0
  603. package/src/daemon/daemon-skill-host.ts +1 -1
  604. package/src/daemon/embedding-reconcile.ts +340 -0
  605. package/src/daemon/event-loop-watchdog.ts +1 -1
  606. package/src/daemon/external-plugins-bootstrap.ts +80 -14
  607. package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +2 -2
  608. package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +3 -3
  609. package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +3 -3
  610. package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +7 -11
  611. package/src/daemon/handlers/__tests__/config-a2a.test.ts +2 -2
  612. package/src/daemon/handlers/__tests__/config-channels.test.ts +17 -11
  613. package/src/daemon/handlers/config-a2a.ts +3 -3
  614. package/src/daemon/handlers/config-channels.ts +7 -4
  615. package/src/daemon/handlers/config-embeddings.ts +1 -1
  616. package/src/daemon/handlers/conversation-history.ts +2 -2
  617. package/src/daemon/handlers/conversations.ts +7 -4
  618. package/src/daemon/handlers/recording.ts +6 -3
  619. package/src/daemon/handlers/shared.ts +2 -0
  620. package/src/daemon/handlers/skills.ts +9 -1
  621. package/src/daemon/lifecycle.ts +890 -1208
  622. package/src/daemon/memory-v2-startup.test.ts +3 -3
  623. package/src/daemon/memory-v2-startup.ts +47 -12
  624. package/src/daemon/message-provenance.ts +1 -1
  625. package/src/daemon/message-types/acp.ts +27 -1
  626. package/src/daemon/message-types/bookmarks.ts +1 -1
  627. package/src/daemon/message-types/skills.ts +20 -2
  628. package/src/daemon/pointer-conversation-trust.ts +66 -0
  629. package/src/daemon/process-message.ts +24 -3
  630. package/src/daemon/providers-setup.ts +0 -14
  631. package/src/daemon/shutdown-handlers.ts +185 -165
  632. package/src/daemon/skill-memory-refresh.ts +1 -1
  633. package/src/daemon/status.ts +15 -0
  634. package/src/daemon/tool-setup-types.ts +17 -0
  635. package/src/daemon/tool-side-effects.ts +4 -4
  636. package/src/daemon/trace-emitter.ts +1 -1
  637. package/src/daemon/trust-context.ts +1 -1
  638. package/src/daemon/turn-call-site.ts +25 -0
  639. package/src/daemon/turn-latency-tracker.test.ts +137 -0
  640. package/src/daemon/turn-latency-tracker.ts +134 -0
  641. package/src/daemon/wake-conversation-ops.ts +11 -4
  642. package/src/documents/document-comments-store.test.ts +2 -2
  643. package/src/documents/document-comments-store.ts +1 -1
  644. package/src/documents/document-store.ts +1 -1
  645. package/src/events/tool-audit-listener.ts +4 -4
  646. package/src/events/tool-permission-telemetry-listener.ts +1 -1
  647. package/src/export/__tests__/transcript-formatter.test.ts +1 -1
  648. package/src/export/transcript-formatter.ts +1 -1
  649. package/src/followups/followup-store.ts +2 -2
  650. package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +2 -2
  651. package/src/heartbeat/__tests__/heartbeat-service.test.ts +45 -39
  652. package/src/heartbeat/heartbeat-run-store.ts +3 -3
  653. package/src/heartbeat/heartbeat-service.ts +29 -11
  654. package/src/home/__tests__/relationship-state-writer.test.ts +1 -1
  655. package/src/home/__tests__/suggested-prompts.test.ts +1 -1
  656. package/src/home/conversation-starter-checkpoints.ts +64 -0
  657. package/src/home/feed-source-enrichment.ts +3 -3
  658. package/src/home/home-greeting-cache.ts +1 -1
  659. package/src/home/job-handlers/conversation-starters.ts +484 -0
  660. package/src/home/relationship-state-writer.ts +1 -1
  661. package/src/home/suggested-prompts.ts +1 -1
  662. package/src/hooks/hook-loader.ts +141 -6
  663. package/src/hooks/registry.ts +129 -0
  664. package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
  665. package/src/ipc/__tests__/cli-ipc.test.ts +1 -1
  666. package/src/ipc/__tests__/inject-local-actor-header.test.ts +33 -0
  667. package/src/ipc/__tests__/watcher-ipc.test.ts +1 -1
  668. package/src/ipc/assistant-server.ts +79 -33
  669. package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +3 -3
  670. package/src/ipc/routes/db-proxy-transaction.ts +1 -1
  671. package/src/ipc/routes/db-proxy.ts +4 -2
  672. package/src/ipc/skill-routes/__tests__/memory.test.ts +1 -1
  673. package/src/ipc/skill-routes/memory.ts +1 -1
  674. package/src/ipc/skill-routes/registries.ts +8 -10
  675. package/src/ipc/skill-server.ts +42 -6
  676. package/src/jobs/register-job-handlers.ts +74 -0
  677. package/src/jobs/worker.ts +91 -0
  678. package/src/live-voice/__tests__/live-voice-archive.test.ts +5 -5
  679. package/src/live-voice/live-voice-archive.ts +2 -2
  680. package/src/mcp/manager.ts +11 -0
  681. package/src/media/app-icon-generator.ts +1 -1
  682. package/src/media/job-handlers/media-processing.ts +126 -0
  683. package/src/messaging/channel-binding-metadata.ts +1 -1
  684. package/src/messaging/content/parse.test.ts +34 -0
  685. package/src/messaging/content/parse.ts +23 -0
  686. package/src/messaging/providers/__tests__/transport-dispatch.test.ts +1 -0
  687. package/src/messaging/providers/slack/binding-metadata.ts +1 -1
  688. package/src/messaging/providers/slack/render.test.ts +309 -0
  689. package/src/messaging/providers/slack/render.ts +459 -0
  690. package/src/messaging/providers/slack/send.test.ts +39 -0
  691. package/src/messaging/providers/slack/send.ts +38 -18
  692. package/src/messaging/providers/telegram-bot/adapter.ts +2 -2
  693. package/src/messaging/providers/telegram-bot/api.ts +17 -3
  694. package/src/messaging/providers/telegram-bot/render.test.ts +146 -0
  695. package/src/messaging/providers/telegram-bot/render.ts +292 -0
  696. package/src/messaging/providers/telegram-bot/send.test.ts +197 -0
  697. package/src/messaging/providers/telegram-bot/send.ts +70 -2
  698. package/src/messaging/providers/telegram-bot/transport.ts +10 -1
  699. package/src/messaging/providers/whatsapp/adapter.ts +2 -2
  700. package/src/messaging/providers/whatsapp/send.ts +1 -1
  701. package/src/notifications/__tests__/deterministic-checks.test.ts +3 -3
  702. package/src/notifications/__tests__/home-feed-side-effect.test.ts +1 -1
  703. package/src/notifications/broadcaster.ts +1 -1
  704. package/src/notifications/canonical-delivery-recorder.ts +1 -1
  705. package/src/notifications/conversation-candidates.ts +3 -3
  706. package/src/notifications/conversation-pairing.ts +25 -16
  707. package/src/notifications/decisions-store.ts +2 -2
  708. package/src/notifications/deliveries-store.ts +3 -3
  709. package/src/notifications/deterministic-checks.ts +2 -2
  710. package/src/notifications/emit-signal.ts +1 -1
  711. package/src/notifications/events-store.ts +2 -2
  712. package/src/notifications/home-feed-side-effect.ts +2 -2
  713. package/src/notifications/preferences-store.ts +2 -2
  714. package/src/notifications/signal.ts +1 -1
  715. package/src/oauth/oauth-store.ts +3 -3
  716. package/src/onboarding/__tests__/onboarding-events-store.test.ts +80 -0
  717. package/src/onboarding/checkin-event.test.ts +5 -2
  718. package/src/onboarding/checkin-event.ts +7 -1
  719. package/src/onboarding/onboarding-events-store.ts +161 -0
  720. package/src/permissions/checker.test.ts +319 -1
  721. package/src/permissions/checker.ts +52 -0
  722. package/src/permissions/types.ts +21 -0
  723. package/src/persistence/__tests__/db-init-migrations-ok.test.ts +20 -0
  724. package/src/persistence/__tests__/worker-control.test.ts +260 -0
  725. package/src/persistence/attachments-store.ts +1136 -0
  726. package/src/persistence/checkpoints.ts +65 -0
  727. package/src/persistence/compaction-ledger-store.ts +107 -0
  728. package/src/persistence/conversation-attention-store.ts +689 -0
  729. package/src/persistence/conversation-bootstrap.ts +59 -0
  730. package/src/persistence/conversation-crud.ts +3437 -0
  731. package/src/persistence/conversation-group-migration.test.ts +99 -0
  732. package/src/persistence/conversation-key-store.ts +274 -0
  733. package/src/persistence/conversation-queries.ts +768 -0
  734. package/src/persistence/conversation-row-batch-delete.ts +205 -0
  735. package/src/persistence/db-async-query.ts +329 -0
  736. package/src/persistence/db-connection.ts +242 -0
  737. package/src/persistence/db-init.ts +282 -0
  738. package/src/persistence/db-maintenance.ts +158 -0
  739. package/src/persistence/embeddings/__tests__/embedding-identity.test.ts +156 -0
  740. package/src/persistence/embeddings/__tests__/reconcile-decision.test.ts +95 -0
  741. package/src/persistence/embeddings/embed.ts +87 -0
  742. package/src/persistence/embeddings/embedding-backend.test.ts +355 -0
  743. package/src/persistence/embeddings/embedding-backend.ts +968 -0
  744. package/src/persistence/embeddings/embedding-billing-breaker.ts +96 -0
  745. package/src/persistence/embeddings/embedding-cache.ts +139 -0
  746. package/src/persistence/embeddings/embedding-identity.ts +88 -0
  747. package/src/persistence/embeddings/embedding-local.ts +587 -0
  748. package/src/persistence/embeddings/embedding-ollama.ts +79 -0
  749. package/src/persistence/embeddings/embedding-runtime-manager.ts +573 -0
  750. package/src/persistence/embeddings/embedding-types.ts +97 -0
  751. package/src/persistence/embeddings/qdrant-circuit-breaker.ts +119 -0
  752. package/src/persistence/embeddings/qdrant-client.test.ts +60 -0
  753. package/src/persistence/embeddings/qdrant-client.ts +842 -0
  754. package/src/persistence/embeddings/qdrant-manager.ts +450 -0
  755. package/src/persistence/embeddings/reconcile-decision.ts +53 -0
  756. package/src/persistence/embeddings/sparse-tokenize.ts +51 -0
  757. package/src/persistence/external-conversation-store.ts +315 -0
  758. package/src/persistence/fork-message-copy.ts +225 -0
  759. package/src/persistence/job-handlers/cleanup.ts +239 -0
  760. package/src/persistence/job-utils.ts +286 -0
  761. package/src/persistence/jobs-store.ts +813 -0
  762. package/src/persistence/jobs-worker.ts +833 -0
  763. package/src/persistence/llm-request-log-source-clickhouse.ts +525 -0
  764. package/src/persistence/llm-request-log-store.ts +740 -0
  765. package/src/persistence/llm-usage-store.ts +961 -0
  766. package/src/persistence/memory-lifecycle-hooks.test.ts +81 -0
  767. package/src/persistence/memory-lifecycle-hooks.ts +120 -0
  768. package/src/persistence/message-content.test.ts +35 -0
  769. package/src/persistence/migrations/126-backfill-guardian-principal-id.ts +300 -0
  770. package/src/persistence/migrations/140-backfill-usage-cache-accounting.ts +364 -0
  771. package/src/persistence/migrations/142-rename-verification-session-id-column.ts +55 -0
  772. package/src/persistence/migrations/182-oauth-providers-display-metadata.ts +22 -0
  773. package/src/persistence/migrations/196-strip-integration-prefix-from-provider-keys.ts +175 -0
  774. package/src/persistence/migrations/199-guardian-request-enrichment-columns.ts +50 -0
  775. package/src/persistence/migrations/202-memory-graph-tables.ts +128 -0
  776. package/src/persistence/migrations/203-drop-memory-items-tables.ts +53 -0
  777. package/src/persistence/migrations/206-scrub-corrupted-image-attachments.ts +121 -0
  778. package/src/persistence/migrations/209-strip-thinking-from-consolidated.ts +196 -0
  779. package/src/persistence/migrations/211-memory-recall-logs-query-context.ts +14 -0
  780. package/src/persistence/migrations/220-normalize-user-file-by-principal.ts +171 -0
  781. package/src/persistence/migrations/222-strip-placeholder-sentinels-from-messages.ts +179 -0
  782. package/src/persistence/migrations/236-tool-invocations-matched-rule-id.ts +23 -0
  783. package/src/persistence/migrations/243-provider-connections.ts +80 -0
  784. package/src/persistence/migrations/244-provider-connection-status-label.ts +29 -0
  785. package/src/persistence/migrations/246-backfill-provider-connection-label.ts +83 -0
  786. package/src/persistence/migrations/255-channel-inbound-delivery-attempts.ts +17 -0
  787. package/src/persistence/migrations/301-create-watchdog-events.ts +42 -0
  788. package/src/persistence/migrations/304-add-llm-usage-cron-run-id.ts +31 -0
  789. package/src/persistence/migrations/305-drop-contact-acl-columns.ts +49 -0
  790. package/src/persistence/migrations/306-rewrite-frontier-profile-pins.test.ts +110 -0
  791. package/src/persistence/migrations/306-rewrite-frontier-profile-pins.ts +65 -0
  792. package/src/persistence/migrations/307-acp-session-history-usage-columns.test.ts +124 -0
  793. package/src/persistence/migrations/307-acp-session-history-usage-columns.ts +36 -0
  794. package/src/persistence/migrations/308-acp-session-history-token-columns.test.ts +119 -0
  795. package/src/persistence/migrations/308-acp-session-history-token-columns.ts +32 -0
  796. package/src/persistence/migrations/309-drop-redundant-indexes.ts +60 -0
  797. package/src/persistence/migrations/310-llm-request-log-latency-breakdown.ts +37 -0
  798. package/src/persistence/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +328 -0
  799. package/src/persistence/migrations/__tests__/222-strip-placeholder-sentinels-from-messages.test.ts +273 -0
  800. package/src/persistence/migrations/__tests__/244-provider-connection-status-label.test.ts +90 -0
  801. package/src/persistence/migrations/__tests__/246-backfill-provider-connection-label.test.ts +250 -0
  802. package/src/persistence/migrations/__tests__/run-migrations.test.ts +380 -0
  803. package/src/persistence/migrations/helpers/relocation.ts +230 -0
  804. package/src/persistence/migrations/validate-migration-state.ts +279 -0
  805. package/src/persistence/schedule-attribution-sql.ts +106 -0
  806. package/src/persistence/schema/acp.ts +51 -0
  807. package/src/persistence/schema/contacts.ts +110 -0
  808. package/src/persistence/schema/conversations.ts +235 -0
  809. package/src/persistence/schema/infrastructure.ts +389 -0
  810. package/src/persistence/steps.ts +1310 -0
  811. package/src/persistence/worker-control.ts +277 -0
  812. package/src/platform/sync-identity.ts +24 -0
  813. package/src/playbooks/playbook-compiler.ts +2 -2
  814. package/src/plugin-api/index.ts +5 -0
  815. package/src/plugin-api/types.ts +40 -15
  816. package/src/plugins/defaults/channel/injectors.ts +101 -0
  817. package/src/plugins/defaults/channel/package.json +14 -0
  818. package/src/plugins/defaults/compaction/compact.ts +2 -1
  819. package/src/plugins/defaults/compaction/context-overflow-reducer.ts +2 -1
  820. package/src/plugins/defaults/compaction/window-manager.ts +8 -7
  821. package/src/plugins/defaults/documents/injectors.ts +125 -0
  822. package/src/plugins/defaults/documents/package.json +14 -0
  823. package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +6 -2
  824. package/src/plugins/defaults/exploration-drift/hooks/post-tool-use.ts +10 -11
  825. package/src/plugins/defaults/history-repair/terminal.ts +1 -1
  826. package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +23 -9
  827. package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +2 -3
  828. package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +7 -14
  829. package/src/plugins/defaults/image-fallback/src/vision-caption.ts +12 -4
  830. package/src/plugins/defaults/image-recovery/recover.ts +6 -3
  831. package/src/plugins/defaults/index.ts +235 -43
  832. package/src/plugins/defaults/injection-presence.ts +80 -0
  833. package/src/plugins/defaults/injector-order.ts +54 -0
  834. package/src/plugins/defaults/max-tokens-continue/hooks/post-model-call.ts +5 -2
  835. package/src/plugins/defaults/memory/__tests__/301-create-watchdog-events.test.ts +110 -0
  836. package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +41 -0
  837. package/src/plugins/defaults/memory/__tests__/bookmark-crud.test.ts +264 -0
  838. package/src/plugins/defaults/memory/__tests__/bookmark-schema.test.ts +181 -0
  839. package/src/plugins/defaults/memory/__tests__/clear-stale-processing-flags.test.ts +52 -0
  840. package/src/plugins/defaults/memory/__tests__/compaction-log-store-clickhouse.test.ts +432 -0
  841. package/src/plugins/defaults/memory/__tests__/conversation-queries.test.ts +843 -0
  842. package/src/plugins/defaults/memory/__tests__/conversation-row-batch-delete.test.ts +199 -0
  843. package/src/plugins/defaults/memory/__tests__/conversation-types.test.ts +36 -0
  844. package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +172 -0
  845. package/src/plugins/defaults/memory/__tests__/db-busy-timeout.test.ts +26 -0
  846. package/src/plugins/defaults/memory/__tests__/db-logs-attach.test.ts +113 -0
  847. package/src/plugins/defaults/memory/__tests__/db-maintenance.test.ts +238 -0
  848. package/src/plugins/defaults/memory/__tests__/db-memory-attach.test.ts +116 -0
  849. package/src/plugins/defaults/memory/__tests__/embedding-cache.test.ts +137 -0
  850. package/src/plugins/defaults/memory/__tests__/find-analysis-conversation.test.ts +197 -0
  851. package/src/plugins/defaults/memory/__tests__/find-most-recent-retrospective-for.test.ts +140 -0
  852. package/src/plugins/defaults/memory/__tests__/fork-message-copy.test.ts +232 -0
  853. package/src/plugins/defaults/memory/__tests__/jobs-store-enqueue-gate.test.ts +245 -0
  854. package/src/plugins/defaults/memory/__tests__/jobs-store-job-classes.test.ts +52 -0
  855. package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +115 -0
  856. package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +508 -0
  857. package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +160 -0
  858. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +1565 -0
  859. package/src/plugins/defaults/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +549 -0
  860. package/src/plugins/defaults/memory/__tests__/memory-retrospective-state.test.ts +195 -0
  861. package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +221 -0
  862. package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +275 -0
  863. package/src/plugins/defaults/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
  864. package/src/plugins/defaults/memory/__tests__/prompt-override.test.ts +192 -0
  865. package/src/plugins/defaults/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
  866. package/src/plugins/defaults/memory/__tests__/table-relocation.test.ts +130 -0
  867. package/src/plugins/defaults/memory/activation-session-store.ts +43 -0
  868. package/src/plugins/defaults/memory/anisotropy.ts +443 -0
  869. package/src/plugins/defaults/memory/context-search/agent-protocol.ts +428 -0
  870. package/src/plugins/defaults/memory/context-search/agent-runner.ts +1311 -0
  871. package/src/plugins/defaults/memory/context-search/search.ts +297 -0
  872. package/src/plugins/defaults/memory/context-search/sources/conversations.ts +341 -0
  873. package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +600 -0
  874. package/src/plugins/defaults/memory/context-search/sources/memory.ts +101 -0
  875. package/src/plugins/defaults/memory/context-search/types.ts +48 -0
  876. package/src/plugins/defaults/memory/filing-service.ts +430 -0
  877. package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +119 -0
  878. package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +663 -0
  879. package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +321 -0
  880. package/src/plugins/defaults/memory/graph/bootstrap.test.ts +287 -0
  881. package/src/plugins/defaults/memory/graph/bootstrap.ts +544 -0
  882. package/src/plugins/defaults/memory/graph/capability-seed.ts +454 -0
  883. package/src/plugins/defaults/memory/graph/consolidation.ts +712 -0
  884. package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +1181 -0
  885. package/src/plugins/defaults/memory/graph/decay.ts +195 -0
  886. package/src/plugins/defaults/memory/graph/extraction-job.ts +77 -0
  887. package/src/plugins/defaults/memory/graph/extraction.ts +1462 -0
  888. package/src/plugins/defaults/memory/graph/graph-memory-state-store.ts +50 -0
  889. package/src/plugins/defaults/memory/graph/graph-search.test.ts +132 -0
  890. package/src/plugins/defaults/memory/graph/graph-search.ts +294 -0
  891. package/src/plugins/defaults/memory/graph/image-ref-utils.ts +29 -0
  892. package/src/plugins/defaults/memory/graph/injection.ts +469 -0
  893. package/src/plugins/defaults/memory/graph/narrative.ts +267 -0
  894. package/src/plugins/defaults/memory/graph/pattern-scan.ts +269 -0
  895. package/src/plugins/defaults/memory/graph/retriever.test.ts +624 -0
  896. package/src/plugins/defaults/memory/graph/retriever.ts +1357 -0
  897. package/src/plugins/defaults/memory/graph/store.test.ts +1093 -0
  898. package/src/plugins/defaults/memory/graph/store.ts +923 -0
  899. package/src/plugins/defaults/memory/graph/tool-handlers.ts +195 -0
  900. package/src/plugins/defaults/memory/graph/tools.ts +95 -0
  901. package/src/plugins/defaults/memory/hooks/init.ts +26 -0
  902. package/src/plugins/defaults/memory/hooks/post-compact.ts +115 -0
  903. package/src/plugins/defaults/memory/hooks/shutdown.ts +14 -0
  904. package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +371 -0
  905. package/src/plugins/defaults/memory/indexer.ts +409 -0
  906. package/src/plugins/defaults/memory/injectors.ts +388 -0
  907. package/src/plugins/defaults/memory/job-handlers/backfill.ts +107 -0
  908. package/src/plugins/defaults/memory/job-handlers/embedding.test.ts +236 -0
  909. package/src/plugins/defaults/memory/job-handlers/embedding.ts +133 -0
  910. package/src/plugins/defaults/memory/job-handlers/index-maintenance.ts +117 -0
  911. package/src/plugins/defaults/memory/job-handlers.ts +203 -0
  912. package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +565 -0
  913. package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +424 -0
  914. package/src/plugins/defaults/memory/jobs/embed-pkb-file.test.ts +169 -0
  915. package/src/plugins/defaults/memory/jobs/embed-pkb-file.ts +59 -0
  916. package/src/plugins/defaults/memory/memory-recall-log-store.ts +172 -0
  917. package/src/plugins/defaults/memory/memory-retrospective-constants.ts +60 -0
  918. package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +131 -0
  919. package/src/plugins/defaults/memory/memory-retrospective-fork-boundary.ts +94 -0
  920. package/src/plugins/defaults/memory/memory-retrospective-job.ts +958 -0
  921. package/src/plugins/defaults/memory/memory-retrospective-startup-cleanup.ts +264 -0
  922. package/src/plugins/defaults/memory/memory-retrospective-state.ts +259 -0
  923. package/src/plugins/defaults/memory/memory-retrospective-trigger-check.ts +91 -0
  924. package/src/plugins/defaults/memory/memory-v2-activation-log-store.ts +216 -0
  925. package/src/plugins/defaults/memory/memory-v2-concept-frequency.ts +173 -0
  926. package/src/plugins/defaults/memory/package.json +14 -0
  927. package/src/plugins/defaults/memory/persistence-hooks.ts +119 -0
  928. package/src/plugins/defaults/memory/pkb/autoinject.ts +61 -0
  929. package/src/plugins/defaults/memory/pkb/context.ts +50 -0
  930. package/src/plugins/defaults/memory/pkb/pkb-index.test.ts +371 -0
  931. package/src/plugins/defaults/memory/pkb/pkb-index.ts +256 -0
  932. package/src/plugins/defaults/memory/pkb/pkb-reconcile.test.ts +254 -0
  933. package/src/plugins/defaults/memory/pkb/pkb-reconcile.ts +144 -0
  934. package/src/plugins/defaults/memory/pkb/pkb-search.test.ts +589 -0
  935. package/src/plugins/defaults/memory/pkb/pkb-search.ts +178 -0
  936. package/src/plugins/defaults/memory/pkb/types.ts +67 -0
  937. package/src/plugins/defaults/memory/rerank-local.ts +374 -0
  938. package/src/plugins/defaults/memory/routes/__tests__/memory-v2-routes.test.ts +165 -0
  939. package/src/plugins/defaults/memory/routes/__tests__/memory-v2-simulate-route.test.ts +347 -0
  940. package/src/plugins/defaults/memory/routes/memory-eval-routes.ts +179 -0
  941. package/src/plugins/defaults/memory/routes/memory-item-routes.test.ts +922 -0
  942. package/src/plugins/defaults/memory/routes/memory-item-routes.ts +814 -0
  943. package/src/plugins/defaults/memory/routes/memory-v2-routes.ts +850 -0
  944. package/src/plugins/defaults/memory/routes/memory-v3-routes.ts +125 -0
  945. package/src/plugins/defaults/memory/search/semantic.ts +241 -0
  946. package/src/plugins/defaults/memory/segmenter.ts +76 -0
  947. package/src/plugins/defaults/memory/tail-reinjection-strip.ts +65 -0
  948. package/src/plugins/defaults/memory/task-memory-cleanup.ts +241 -0
  949. package/src/plugins/defaults/memory/tools.test.ts +382 -0
  950. package/src/plugins/defaults/memory/tools.ts +87 -0
  951. package/src/plugins/defaults/memory/v2/__tests__/activation-store.test.ts +207 -0
  952. package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +1273 -0
  953. package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +510 -0
  954. package/src/plugins/defaults/memory/v2/__tests__/cli-command-store.test.ts +432 -0
  955. package/src/plugins/defaults/memory/v2/__tests__/consolidation-job.test.ts +744 -0
  956. package/src/plugins/defaults/memory/v2/__tests__/consolidation-prompt-flag-gating-guard.test.ts +205 -0
  957. package/src/plugins/defaults/memory/v2/__tests__/frontmatter-sweep.test.ts +136 -0
  958. package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +186 -0
  959. package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +257 -0
  960. package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +230 -0
  961. package/src/plugins/defaults/memory/v2/__tests__/harness-runner.test.ts +135 -0
  962. package/src/plugins/defaults/memory/v2/__tests__/injection-events.test.ts +318 -0
  963. package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +2308 -0
  964. package/src/plugins/defaults/memory/v2/__tests__/migration.test.ts +940 -0
  965. package/src/plugins/defaults/memory/v2/__tests__/page-index.test.ts +760 -0
  966. package/src/plugins/defaults/memory/v2/__tests__/prompts-consolidation.test.ts +332 -0
  967. package/src/plugins/defaults/memory/v2/__tests__/qdrant.test.ts +974 -0
  968. package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +338 -0
  969. package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +1198 -0
  970. package/src/plugins/defaults/memory/v2/__tests__/sim.test.ts +704 -0
  971. package/src/plugins/defaults/memory/v2/__tests__/skill-content.test.ts +115 -0
  972. package/src/plugins/defaults/memory/v2/__tests__/skill-store.test.ts +986 -0
  973. package/src/plugins/defaults/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
  974. package/src/plugins/defaults/memory/v2/__tests__/static-context.test.ts +223 -0
  975. package/src/plugins/defaults/memory/v2/__tests__/sweep-job.test.ts +530 -0
  976. package/src/plugins/defaults/memory/v2/activation-store.ts +185 -0
  977. package/src/plugins/defaults/memory/v2/activation.ts +560 -0
  978. package/src/plugins/defaults/memory/v2/backfill-jobs.ts +296 -0
  979. package/src/plugins/defaults/memory/v2/cli-command-store.ts +341 -0
  980. package/src/plugins/defaults/memory/v2/consolidation-job.ts +550 -0
  981. package/src/plugins/defaults/memory/v2/frontmatter-sweep.ts +98 -0
  982. package/src/plugins/defaults/memory/v2/harness/compare.ts +57 -0
  983. package/src/plugins/defaults/memory/v2/harness/oracle.ts +148 -0
  984. package/src/plugins/defaults/memory/v2/harness/replay-input.ts +243 -0
  985. package/src/plugins/defaults/memory/v2/harness/retriever.ts +74 -0
  986. package/src/plugins/defaults/memory/v2/harness/router-retriever.ts +43 -0
  987. package/src/plugins/defaults/memory/v2/injected-block-slugs.ts +79 -0
  988. package/src/plugins/defaults/memory/v2/injection-events.ts +101 -0
  989. package/src/plugins/defaults/memory/v2/injection.ts +932 -0
  990. package/src/plugins/defaults/memory/v2/migration.ts +774 -0
  991. package/src/plugins/defaults/memory/v2/page-index.ts +459 -0
  992. package/src/plugins/defaults/memory/v2/page-store.ts +443 -0
  993. package/src/plugins/defaults/memory/v2/prompts/consolidation.ts +868 -0
  994. package/src/plugins/defaults/memory/v2/prompts/router.ts +148 -0
  995. package/src/plugins/defaults/memory/v2/qdrant.ts +939 -0
  996. package/src/plugins/defaults/memory/v2/reranker.ts +184 -0
  997. package/src/plugins/defaults/memory/v2/router.ts +602 -0
  998. package/src/plugins/defaults/memory/v2/sim.ts +310 -0
  999. package/src/plugins/defaults/memory/v2/skill-content.ts +61 -0
  1000. package/src/plugins/defaults/memory/v2/skill-store.ts +431 -0
  1001. package/src/plugins/defaults/memory/v2/sparse-bm25.ts +245 -0
  1002. package/src/plugins/defaults/memory/v2/static-context.ts +100 -0
  1003. package/src/plugins/defaults/memory/v2/sweep-job.ts +323 -0
  1004. package/src/plugins/defaults/memory/v3/__tests__/candidate-match.test.ts +316 -0
  1005. package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +1163 -0
  1006. package/src/plugins/defaults/memory/v3/__tests__/dense.test.ts +211 -0
  1007. package/src/plugins/defaults/memory/v3/__tests__/edge.test.ts +247 -0
  1008. package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +685 -0
  1009. package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +365 -0
  1010. package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +1012 -0
  1011. package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +977 -0
  1012. package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +599 -0
  1013. package/src/plugins/defaults/memory/v3/__tests__/render-injection.test.ts +128 -0
  1014. package/src/plugins/defaults/memory/v3/__tests__/section-dense-store.test.ts +756 -0
  1015. package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +422 -0
  1016. package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +501 -0
  1017. package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +885 -0
  1018. package/src/plugins/defaults/memory/v3/__tests__/tuning-profile.test.ts +96 -0
  1019. package/src/plugins/defaults/memory/v3/candidate-match.ts +197 -0
  1020. package/src/plugins/defaults/memory/v3/capabilities.ts +88 -0
  1021. package/src/plugins/defaults/memory/v3/card.ts +160 -0
  1022. package/src/plugins/defaults/memory/v3/dense.ts +108 -0
  1023. package/src/plugins/defaults/memory/v3/edge.ts +252 -0
  1024. package/src/plugins/defaults/memory/v3/entity-lane.test.ts +124 -0
  1025. package/src/plugins/defaults/memory/v3/entity-lane.ts +113 -0
  1026. package/src/plugins/defaults/memory/v3/ever-injected-store.test.ts +307 -0
  1027. package/src/plugins/defaults/memory/v3/ever-injected-store.ts +278 -0
  1028. package/src/plugins/defaults/memory/v3/hot-set.test.ts +143 -0
  1029. package/src/plugins/defaults/memory/v3/hot-set.ts +85 -0
  1030. package/src/plugins/defaults/memory/v3/injector.ts +423 -0
  1031. package/src/plugins/defaults/memory/v3/learned-edges.test.ts +169 -0
  1032. package/src/plugins/defaults/memory/v3/learned-edges.ts +178 -0
  1033. package/src/plugins/defaults/memory/v3/maintain-job.ts +988 -0
  1034. package/src/plugins/defaults/memory/v3/orchestrate.ts +483 -0
  1035. package/src/plugins/defaults/memory/v3/page-content.ts +102 -0
  1036. package/src/plugins/defaults/memory/v3/pool-select.test.ts +147 -0
  1037. package/src/plugins/defaults/memory/v3/pool-select.ts +586 -0
  1038. package/src/plugins/defaults/memory/v3/prune.test.ts +760 -0
  1039. package/src/plugins/defaults/memory/v3/prune.ts +469 -0
  1040. package/src/plugins/defaults/memory/v3/render-injection.ts +92 -0
  1041. package/src/plugins/defaults/memory/v3/section-dense-store.ts +471 -0
  1042. package/src/plugins/defaults/memory/v3/section-needle.ts +215 -0
  1043. package/src/plugins/defaults/memory/v3/selection-log-store.ts +277 -0
  1044. package/src/plugins/defaults/memory/v3/shadow-plugin.ts +656 -0
  1045. package/src/plugins/defaults/memory/v3/tuning-profile.ts +91 -0
  1046. package/src/plugins/defaults/memory/v3/types.ts +130 -0
  1047. package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +731 -0
  1048. package/src/plugins/defaults/session/injectors.ts +84 -0
  1049. package/src/plugins/defaults/session/package.json +14 -0
  1050. package/src/plugins/defaults/surface-completion-nudge/hooks/post-model-call.ts +6 -2
  1051. package/src/plugins/defaults/task-progress-nudge/hooks/post-tool-use.ts +39 -45
  1052. package/src/plugins/defaults/title-generate/hooks/stop.ts +4 -5
  1053. package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +3 -3
  1054. package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +5 -3
  1055. package/src/plugins/defaults/turn-context/injectors.ts +52 -0
  1056. package/src/plugins/defaults/turn-context/package.json +14 -0
  1057. package/src/plugins/defaults/workspace/injectors.ts +295 -0
  1058. package/src/plugins/defaults/workspace/package.json +14 -0
  1059. package/src/plugins/injector-registry.ts +127 -0
  1060. package/src/plugins/job-handler-registry.ts +94 -0
  1061. package/src/plugins/mtime-cache.ts +1 -1
  1062. package/src/plugins/pipeline.ts +1 -1
  1063. package/src/plugins/registry.ts +37 -172
  1064. package/src/plugins/types.ts +36 -1
  1065. package/src/prompts/system-prompt.ts +1 -1
  1066. package/src/providers/__tests__/connection-model-compat.test.ts +1 -1
  1067. package/src/providers/__tests__/dispatch-connection-routing.test.ts +1 -1
  1068. package/src/providers/__tests__/inference.test.ts +6 -6
  1069. package/src/providers/__tests__/placeholder-sentinels.test.ts +80 -0
  1070. package/src/providers/__tests__/retry-callsite.test.ts +31 -3
  1071. package/src/providers/__tests__/satellite-connection-routing.test.ts +1 -1
  1072. package/src/providers/anthropic/client.ts +23 -24
  1073. package/src/providers/call-site-routing.ts +1 -1
  1074. package/src/providers/connection-resolution.ts +7 -3
  1075. package/src/providers/inference/__tests__/base-url-route-validation.test.ts +7 -8
  1076. package/src/providers/inference/__tests__/base-url-security.test.ts +8 -8
  1077. package/src/providers/inference/__tests__/connections-label.test.ts +5 -5
  1078. package/src/providers/inference/__tests__/connections-openai-compatible.test.ts +4 -4
  1079. package/src/providers/inference/backfill.ts +9 -5
  1080. package/src/providers/inference/connections.ts +2 -2
  1081. package/src/providers/inference/resolve-auth.ts +3 -3
  1082. package/src/providers/model-catalog.ts +38 -0
  1083. package/src/providers/placeholder-sentinels.ts +50 -15
  1084. package/src/providers/provider-send-message.ts +1 -1
  1085. package/src/providers/registry.ts +2 -0
  1086. package/src/providers/retry.ts +16 -0
  1087. package/src/providers/stop-reasons.ts +32 -0
  1088. package/src/providers/usage-tracking.ts +1 -1
  1089. package/src/runtime/__tests__/agent-wake.test.ts +100 -29
  1090. package/src/runtime/__tests__/background-job-runner.test.ts +19 -2
  1091. package/src/runtime/__tests__/channel-verification-service.test.ts +9 -5
  1092. package/src/runtime/__tests__/guardian-vellum-migration.test.ts +7 -5
  1093. package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +3 -3
  1094. package/src/runtime/__tests__/pre-first-message-gate.test.ts +1 -1
  1095. package/src/runtime/access-request-helper.ts +3 -3
  1096. package/src/runtime/agent-wake.ts +56 -11
  1097. package/src/runtime/assistant-event-hub.ts +1 -1
  1098. package/src/runtime/background-job-runner.ts +30 -10
  1099. package/src/runtime/channel-reply-delivery.ts +3 -3
  1100. package/src/runtime/channel-retry-sweep.ts +23 -3
  1101. package/src/runtime/channel-verification-service.ts +9 -9
  1102. package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
  1103. package/src/runtime/finalize-event-delivery.ts +2 -2
  1104. package/src/runtime/guardian-action-service.ts +1 -2
  1105. package/src/runtime/guardian-reply-router.ts +1 -1
  1106. package/src/runtime/http-server.ts +45 -1
  1107. package/src/runtime/invite-redemption-service.ts +11 -3
  1108. package/src/runtime/invite-service.ts +6 -4
  1109. package/src/runtime/migrations/vbundle-streaming-importer.ts +1 -1
  1110. package/src/runtime/pre-first-message-gate.ts +1 -1
  1111. package/src/runtime/routes/__tests__/acp-routes.test.ts +74 -8
  1112. package/src/runtime/routes/__tests__/backup-routes.test.ts +1 -1
  1113. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +3 -3
  1114. package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +17 -23
  1115. package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +3 -3
  1116. package/src/runtime/routes/__tests__/consolidation-routes.test.ts +5 -5
  1117. package/src/runtime/routes/__tests__/contact-routes.test.ts +90 -9
  1118. package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +5 -5
  1119. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +5 -5
  1120. package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +3 -3
  1121. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +12 -12
  1122. package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +4 -4
  1123. package/src/runtime/routes/__tests__/home-feed-routes.test.ts +3 -3
  1124. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +3 -3
  1125. package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +21 -7
  1126. package/src/runtime/routes/__tests__/memory-worker-routes.test.ts +306 -0
  1127. package/src/runtime/routes/__tests__/ps-routes.test.ts +114 -0
  1128. package/src/runtime/routes/__tests__/retrospective-routes.test.ts +6 -6
  1129. package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +4 -4
  1130. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +1 -1
  1131. package/src/runtime/routes/__tests__/surface-content-routes.test.ts +1 -1
  1132. package/src/runtime/routes/__tests__/wake-conversation-routes.test.ts +125 -0
  1133. package/src/runtime/routes/acp-routes-event-log.test.ts +283 -0
  1134. package/src/runtime/routes/acp-routes-list.test.ts +24 -25
  1135. package/src/runtime/routes/acp-routes.test.ts +4 -4
  1136. package/src/runtime/routes/acp-routes.ts +31 -4
  1137. package/src/runtime/routes/app-management-routes.ts +9 -9
  1138. package/src/runtime/routes/app-routes.ts +3 -7
  1139. package/src/runtime/routes/approval-routes.ts +2 -4
  1140. package/src/runtime/routes/attachment-routes.ts +2 -2
  1141. package/src/runtime/routes/audit-routes.ts +2 -3
  1142. package/src/runtime/routes/background-wake-routes.ts +19 -5
  1143. package/src/runtime/routes/backup-routes.ts +1 -1
  1144. package/src/runtime/routes/bookmark-routes.ts +3 -3
  1145. package/src/runtime/routes/brain-graph-routes.ts +2 -2
  1146. package/src/runtime/routes/btw-routes.ts +1 -1
  1147. package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +1 -1
  1148. package/src/runtime/routes/channel-delivery-routes.ts +1 -1
  1149. package/src/runtime/routes/channel-readiness-routes.ts +7 -3
  1150. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +3 -8
  1151. package/src/runtime/routes/consolidation-routes.ts +6 -6
  1152. package/src/runtime/routes/contact-routes.ts +66 -15
  1153. package/src/runtime/routes/conversation-attention-routes.ts +2 -2
  1154. package/src/runtime/routes/conversation-cli-routes.ts +32 -7
  1155. package/src/runtime/routes/conversation-compaction-routes.ts +4 -4
  1156. package/src/runtime/routes/conversation-list-routes.ts +9 -9
  1157. package/src/runtime/routes/conversation-management-routes.ts +9 -9
  1158. package/src/runtime/routes/conversation-query-routes.ts +34 -11
  1159. package/src/runtime/routes/conversation-routes.ts +99 -16
  1160. package/src/runtime/routes/conversation-starter-routes.ts +11 -5
  1161. package/src/runtime/routes/conversations-import-routes.ts +10 -6
  1162. package/src/runtime/routes/debug-routes.ts +3 -3
  1163. package/src/runtime/routes/defer-routes.ts +4 -4
  1164. package/src/runtime/routes/documents-routes.ts +1 -1
  1165. package/src/runtime/routes/empty-state-greeting-cache.ts +1 -1
  1166. package/src/runtime/routes/events-routes.ts +4 -4
  1167. package/src/runtime/routes/filing-routes.ts +1 -1
  1168. package/src/runtime/routes/global-search-routes.ts +4 -4
  1169. package/src/runtime/routes/group-routes.ts +1 -1
  1170. package/src/runtime/routes/guardian-action-routes.ts +1 -1
  1171. package/src/runtime/routes/heartbeat-routes.ts +2 -2
  1172. package/src/runtime/routes/home-feed-routes.ts +10 -5
  1173. package/src/runtime/routes/identity-routes.ts +33 -14
  1174. package/src/runtime/routes/inbound-conversation.ts +3 -3
  1175. package/src/runtime/routes/inbound-message-handler.ts +25 -25
  1176. package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +8 -4
  1177. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +13 -6
  1178. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +5 -5
  1179. package/src/runtime/routes/inbound-stages/background-dispatch.ts +11 -11
  1180. package/src/runtime/routes/inbound-stages/edit-intercept.ts +12 -12
  1181. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +2 -2
  1182. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +1 -1
  1183. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +1 -1
  1184. package/src/runtime/routes/inbound-stages/reaction-intercept.ts +8 -8
  1185. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +5 -2
  1186. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +1 -1
  1187. package/src/runtime/routes/inbound-stages/transcribe-audio.ts +1 -1
  1188. package/src/runtime/routes/index.ts +6 -4
  1189. package/src/runtime/routes/inference-profile-session-handler.ts +2 -2
  1190. package/src/runtime/routes/inference-profile-session-reaper.ts +1 -1
  1191. package/src/runtime/routes/inference-provider-connection-routes.ts +5 -2
  1192. package/src/runtime/routes/integrations/slack/__tests__/share.test.ts +3 -4
  1193. package/src/runtime/routes/integrations/slack/share.ts +1 -1
  1194. package/src/runtime/routes/internal-telemetry-routes.ts +1 -1
  1195. package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +1 -1
  1196. package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
  1197. package/src/runtime/routes/log-export-routes.ts +2 -2
  1198. package/src/runtime/routes/memory-worker-routes.ts +227 -0
  1199. package/src/runtime/routes/migration-rollback-routes.ts +11 -12
  1200. package/src/runtime/routes/migration-routes.ts +143 -5
  1201. package/src/runtime/routes/notification-routes.ts +2 -2
  1202. package/src/runtime/routes/platform-routes.ts +3 -0
  1203. package/src/runtime/routes/playground/helpers.ts +3 -3
  1204. package/src/runtime/routes/ps-routes.ts +37 -66
  1205. package/src/runtime/routes/publish-routes.ts +3 -3
  1206. package/src/runtime/routes/rename-conversation-routes.ts +1 -1
  1207. package/src/runtime/routes/retrospective-routes.ts +5 -5
  1208. package/src/runtime/routes/schedule-routes.ts +42 -40
  1209. package/src/runtime/routes/secret-routes.ts +10 -9
  1210. package/src/runtime/routes/sequence-routes.ts +1 -1
  1211. package/src/runtime/routes/settings-routes.ts +18 -9
  1212. package/src/runtime/routes/skills-routes.ts +11 -1
  1213. package/src/runtime/routes/slack-channel-routes.ts +4 -4
  1214. package/src/runtime/routes/subagents-routes.ts +2 -2
  1215. package/src/runtime/routes/surface-conversation-resolver.ts +1 -1
  1216. package/src/runtime/routes/task-routes.ts +18 -29
  1217. package/src/runtime/routes/telemetry-routes.ts +1 -1
  1218. package/src/runtime/routes/trace-event-routes.ts +1 -1
  1219. package/src/runtime/routes/types.ts +7 -0
  1220. package/src/runtime/routes/usage-routes.ts +2 -2
  1221. package/src/runtime/routes/wake-conversation-routes.ts +44 -8
  1222. package/src/runtime/routes/wipe-conversation-routes.ts +3 -3
  1223. package/src/runtime/routes/work-items-routes.test.ts +1 -1
  1224. package/src/runtime/routes/work-items-routes.ts +1 -1
  1225. package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -2
  1226. package/src/runtime/services/__tests__/auto-analysis-enqueue.test.ts +362 -0
  1227. package/src/runtime/services/__tests__/auto-analysis-guard.test.ts +57 -0
  1228. package/src/runtime/services/__tests__/conversation-analyze-job.test.ts +178 -0
  1229. package/src/runtime/services/__tests__/conversation-serializer.test.ts +1 -1
  1230. package/src/runtime/services/analyze-conversation.ts +22 -13
  1231. package/src/runtime/services/auto-analysis-enqueue.ts +130 -0
  1232. package/src/runtime/services/auto-analysis-guard.ts +13 -0
  1233. package/src/runtime/services/conversation-analyze-job.ts +53 -0
  1234. package/src/runtime/services/conversation-serializer.ts +5 -5
  1235. package/src/runtime/tool-grant-request-helper.ts +1 -1
  1236. package/src/schedule/retry-policy.ts +8 -8
  1237. package/src/schedule/run-script.ts +7 -2
  1238. package/src/schedule/schedule-recovery.ts +8 -5
  1239. package/src/schedule/schedule-store.ts +270 -162
  1240. package/src/schedule/schedule-usage-store.ts +2 -2
  1241. package/src/schedule/scheduler-types.ts +6 -0
  1242. package/src/schedule/scheduler.ts +189 -59
  1243. package/src/security/auth-fallback-events-store.ts +94 -0
  1244. package/src/security/redaction.ts +18 -14
  1245. package/src/sequence/engine.ts +1 -1
  1246. package/src/sequence/store.ts +3 -3
  1247. package/src/services/published-app-updater.ts +2 -2
  1248. package/src/signals/cancel.ts +1 -1
  1249. package/src/signals/user-message.ts +2 -2
  1250. package/src/skills/catalog-install.ts +2 -1
  1251. package/src/skills/clawhub.ts +1 -0
  1252. package/src/skills/install-meta.ts +44 -0
  1253. package/src/skills/managed-store.ts +101 -3
  1254. package/src/skills/skillssh-registry.ts +1 -0
  1255. package/src/skills/version-hash.ts +20 -0
  1256. package/src/subagent/manager.ts +5 -4
  1257. package/src/tasks/task-compiler.ts +2 -2
  1258. package/src/tasks/task-runner.ts +3 -3
  1259. package/src/tasks/task-store.ts +2 -2
  1260. package/src/telemetry/__tests__/watchdog-events-store.test.ts +161 -0
  1261. package/src/telemetry/skill-loaded-events-store.test.ts +152 -0
  1262. package/src/telemetry/skill-loaded-events-store.ts +95 -0
  1263. package/src/telemetry/tool-executed-events-store.test.ts +219 -0
  1264. package/src/telemetry/tool-executed-events-store.ts +102 -0
  1265. package/src/telemetry/tool-usage-store.ts +114 -0
  1266. package/src/telemetry/trace-event-store.ts +133 -0
  1267. package/src/telemetry/turn-events-store.ts +173 -0
  1268. package/src/telemetry/turn-trace-store.test.ts +736 -0
  1269. package/src/telemetry/turn-trace-store.ts +364 -0
  1270. package/src/telemetry/usage-telemetry-reporter.test.ts +12 -12
  1271. package/src/telemetry/usage-telemetry-reporter.ts +46 -17
  1272. package/src/telemetry/watchdog-events-store.ts +87 -0
  1273. package/src/tools/__tests__/run-standalone.test.ts +19 -0
  1274. package/src/tools/acp/spawn.test.ts +18 -7
  1275. package/src/tools/acp/spawn.ts +1 -0
  1276. package/src/tools/apps/executors.ts +2 -2
  1277. package/src/tools/apps/resolve-app-id.ts +1 -1
  1278. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/discovery.test.ts +3 -3
  1279. package/src/tools/document/document-comment-tool.test.ts +2 -2
  1280. package/src/tools/filesystem/write.ts +5 -4
  1281. package/src/tools/policy-context.ts +21 -0
  1282. package/src/tools/registry.ts +31 -1
  1283. package/src/tools/run-standalone.ts +101 -0
  1284. package/src/tools/schedule/create.ts +2 -2
  1285. package/src/tools/schedule/delete.ts +1 -1
  1286. package/src/tools/schedule/update.ts +1 -1
  1287. package/src/tools/skills/find-similar-skills.test.ts +277 -0
  1288. package/src/tools/skills/find-similar-skills.ts +120 -0
  1289. package/src/tools/skills/scaffold-managed.ts +123 -4
  1290. package/src/tools/subagent/read.ts +1 -1
  1291. package/src/tools/subagent/spawn.ts +1 -1
  1292. package/src/tools/tool-approval-handler.ts +1 -1
  1293. package/src/tools/tool-manifest.ts +1 -1
  1294. package/src/tools/types.ts +11 -0
  1295. package/src/usage/types.ts +7 -0
  1296. package/src/util/__tests__/process-tree.test.ts +123 -0
  1297. package/src/util/device-id.ts +52 -12
  1298. package/src/util/platform.ts +0 -14
  1299. package/src/util/process-tree.ts +203 -0
  1300. package/src/util/sqlite-retry.ts +90 -0
  1301. package/src/watcher/__tests__/telemetry.test.ts +2 -2
  1302. package/src/watcher/telemetry.ts +2 -2
  1303. package/src/watcher/watcher-store.ts +3 -3
  1304. package/src/work-items/work-item-store.ts +2 -2
  1305. package/src/workflows/engine-integration.test.ts +2 -2
  1306. package/src/workflows/engine.test.ts +2 -2
  1307. package/src/workflows/fanout-load.test.ts +2 -2
  1308. package/src/workflows/journal-store.test.ts +3 -3
  1309. package/src/workflows/journal-store.ts +1 -1
  1310. package/src/workflows/leaf-runner.test.ts +9 -6
  1311. package/src/workflows/leaf-runner.ts +1 -1
  1312. package/src/workspace/heartbeat-service.ts +29 -0
  1313. package/src/workspace/migrations/011-backfill-installation-id.ts +1 -1
  1314. package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +5 -2
  1315. package/src/workspace/migrations/031-drop-user-md.ts +26 -0
  1316. package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +1 -1
  1317. package/src/workspace/migrations/113-swap-balanced-profile-to-glm-5p2.ts +101 -0
  1318. package/src/workspace/migrations/114-swap-quality-profile-to-opus.ts +83 -0
  1319. package/src/workspace/migrations/115-drop-frontier-profile.ts +129 -0
  1320. package/src/workspace/migrations/116-rename-memory-plugin-disabled-sentinel.ts +53 -0
  1321. package/src/workspace/migrations/117-normalize-stale-lean-memory-v3-defaults.ts +116 -0
  1322. package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +5 -2
  1323. package/src/workspace/migrations/rebuild-conversation-disk-view.ts +4 -4
  1324. package/src/workspace/migrations/registry.ts +10 -0
  1325. package/src/__tests__/config-managed-gemini-defaults.test.ts +0 -277
  1326. package/src/__tests__/slack-block-formatting.test.ts +0 -173
  1327. package/src/background-wake/runtime-registry.ts +0 -24
  1328. package/src/contacts/contact-events.ts +0 -21
  1329. package/src/daemon/__tests__/meet-host-supervisor.test.ts +0 -587
  1330. package/src/daemon/__tests__/meet-manifest-loader.test.ts +0 -476
  1331. package/src/daemon/meet-host-startup.ts +0 -51
  1332. package/src/daemon/meet-host-supervisor.ts +0 -782
  1333. package/src/daemon/meet-manifest-loader.ts +0 -396
  1334. package/src/daemon/server.ts +0 -423
  1335. package/src/filing/filing-service.ts +0 -429
  1336. package/src/memory/__tests__/301-create-watchdog-events.test.ts +0 -110
  1337. package/src/memory/__tests__/activation-session-store.test.ts +0 -41
  1338. package/src/memory/__tests__/auto-analysis-enqueue.test.ts +0 -359
  1339. package/src/memory/__tests__/auto-analysis-guard.test.ts +0 -57
  1340. package/src/memory/__tests__/bookmark-crud.test.ts +0 -264
  1341. package/src/memory/__tests__/bookmark-schema.test.ts +0 -181
  1342. package/src/memory/__tests__/compaction-log-store-clickhouse.test.ts +0 -432
  1343. package/src/memory/__tests__/conversation-analyze-job.test.ts +0 -178
  1344. package/src/memory/__tests__/conversation-group-migration.test.ts +0 -99
  1345. package/src/memory/__tests__/conversation-queries.test.ts +0 -843
  1346. package/src/memory/__tests__/conversation-types.test.ts +0 -36
  1347. package/src/memory/__tests__/db-async-query.test.ts +0 -165
  1348. package/src/memory/__tests__/db-logs-attach.test.ts +0 -110
  1349. package/src/memory/__tests__/db-maintenance.test.ts +0 -235
  1350. package/src/memory/__tests__/db-memory-attach.test.ts +0 -113
  1351. package/src/memory/__tests__/embedding-cache.test.ts +0 -136
  1352. package/src/memory/__tests__/find-analysis-conversation.test.ts +0 -197
  1353. package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +0 -140
  1354. package/src/memory/__tests__/fork-message-copy.test.ts +0 -232
  1355. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +0 -241
  1356. package/src/memory/__tests__/jobs-store-job-classes.test.ts +0 -52
  1357. package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +0 -113
  1358. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +0 -505
  1359. package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +0 -160
  1360. package/src/memory/__tests__/memory-retrospective-job.test.ts +0 -1443
  1361. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +0 -544
  1362. package/src/memory/__tests__/memory-retrospective-state.test.ts +0 -195
  1363. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -221
  1364. package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +0 -275
  1365. package/src/memory/__tests__/memory-v3-selections-migration.test.ts +0 -103
  1366. package/src/memory/__tests__/message-content.test.ts +0 -35
  1367. package/src/memory/__tests__/onboarding-events-store.test.ts +0 -80
  1368. package/src/memory/__tests__/prompt-override.test.ts +0 -192
  1369. package/src/memory/__tests__/qdrant-client-sentinel.test.ts +0 -49
  1370. package/src/memory/__tests__/table-relocation.test.ts +0 -129
  1371. package/src/memory/__tests__/watchdog-events-store.test.ts +0 -161
  1372. package/src/memory/activation-session-store.ts +0 -43
  1373. package/src/memory/anisotropy.ts +0 -443
  1374. package/src/memory/app-store.ts +0 -1058
  1375. package/src/memory/attachments-store.ts +0 -1136
  1376. package/src/memory/auth-fallback-events-store.ts +0 -94
  1377. package/src/memory/auto-analysis-enqueue.ts +0 -127
  1378. package/src/memory/auto-analysis-guard.ts +0 -17
  1379. package/src/memory/canonical-guardian-store.ts +0 -891
  1380. package/src/memory/channel-verification-sessions.ts +0 -557
  1381. package/src/memory/checkpoints.ts +0 -65
  1382. package/src/memory/compaction-ledger-store.ts +0 -107
  1383. package/src/memory/context-search/agent-protocol.ts +0 -428
  1384. package/src/memory/context-search/agent-runner.ts +0 -1310
  1385. package/src/memory/context-search/search.ts +0 -297
  1386. package/src/memory/context-search/sources/conversations.ts +0 -341
  1387. package/src/memory/context-search/sources/memory-v2.ts +0 -600
  1388. package/src/memory/context-search/sources/memory.ts +0 -101
  1389. package/src/memory/context-search/types.ts +0 -48
  1390. package/src/memory/conversation-analyze-job.ts +0 -53
  1391. package/src/memory/conversation-attention-store.ts +0 -689
  1392. package/src/memory/conversation-bootstrap.ts +0 -50
  1393. package/src/memory/conversation-crud.ts +0 -3436
  1394. package/src/memory/conversation-key-store.ts +0 -274
  1395. package/src/memory/conversation-queries.ts +0 -768
  1396. package/src/memory/conversation-starter-checkpoints.ts +0 -64
  1397. package/src/memory/db-async-query.ts +0 -298
  1398. package/src/memory/db-connection.ts +0 -228
  1399. package/src/memory/db-init.ts +0 -265
  1400. package/src/memory/db-maintenance.ts +0 -154
  1401. package/src/memory/embed.ts +0 -73
  1402. package/src/memory/embedding-backend.test.ts +0 -204
  1403. package/src/memory/embedding-backend.ts +0 -862
  1404. package/src/memory/embedding-billing-breaker.ts +0 -96
  1405. package/src/memory/embedding-cache.ts +0 -139
  1406. package/src/memory/embedding-local.ts +0 -587
  1407. package/src/memory/embedding-ollama.ts +0 -79
  1408. package/src/memory/embedding-runtime-manager.ts +0 -573
  1409. package/src/memory/embedding-types.ts +0 -90
  1410. package/src/memory/external-conversation-store.ts +0 -315
  1411. package/src/memory/fork-message-copy.ts +0 -170
  1412. package/src/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +0 -119
  1413. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +0 -655
  1414. package/src/memory/graph/__tests__/handle-remember-v2.test.ts +0 -321
  1415. package/src/memory/graph/bootstrap.test.ts +0 -280
  1416. package/src/memory/graph/bootstrap.ts +0 -532
  1417. package/src/memory/graph/capability-seed.ts +0 -451
  1418. package/src/memory/graph/consolidation.ts +0 -712
  1419. package/src/memory/graph/conversation-graph-memory.ts +0 -1185
  1420. package/src/memory/graph/decay.ts +0 -195
  1421. package/src/memory/graph/extraction-job.ts +0 -74
  1422. package/src/memory/graph/extraction.ts +0 -1462
  1423. package/src/memory/graph/graph-memory-state-store.ts +0 -50
  1424. package/src/memory/graph/graph-search.test.ts +0 -129
  1425. package/src/memory/graph/graph-search.ts +0 -292
  1426. package/src/memory/graph/image-ref-utils.ts +0 -29
  1427. package/src/memory/graph/injection.ts +0 -469
  1428. package/src/memory/graph/narrative.ts +0 -267
  1429. package/src/memory/graph/pattern-scan.ts +0 -269
  1430. package/src/memory/graph/retriever.test.ts +0 -624
  1431. package/src/memory/graph/retriever.ts +0 -1356
  1432. package/src/memory/graph/store.test.ts +0 -1093
  1433. package/src/memory/graph/store.ts +0 -923
  1434. package/src/memory/graph/tool-handlers.ts +0 -195
  1435. package/src/memory/graph/tools.ts +0 -95
  1436. package/src/memory/guardian-rate-limits.ts +0 -191
  1437. package/src/memory/indexer.ts +0 -406
  1438. package/src/memory/job-handlers/backfill.ts +0 -104
  1439. package/src/memory/job-handlers/cleanup.ts +0 -237
  1440. package/src/memory/job-handlers/conversation-starters.ts +0 -481
  1441. package/src/memory/job-handlers/embedding.test.ts +0 -234
  1442. package/src/memory/job-handlers/embedding.ts +0 -133
  1443. package/src/memory/job-handlers/index-maintenance.ts +0 -111
  1444. package/src/memory/job-handlers/media-processing.ts +0 -120
  1445. package/src/memory/job-handlers/summarization.ts +0 -240
  1446. package/src/memory/job-utils.ts +0 -286
  1447. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +0 -559
  1448. package/src/memory/jobs/embed-concept-page.ts +0 -417
  1449. package/src/memory/jobs/embed-pkb-file.test.ts +0 -169
  1450. package/src/memory/jobs/embed-pkb-file.ts +0 -59
  1451. package/src/memory/jobs-store.ts +0 -813
  1452. package/src/memory/jobs-worker.ts +0 -1021
  1453. package/src/memory/llm-request-log-source-clickhouse.ts +0 -521
  1454. package/src/memory/llm-request-log-store.ts +0 -717
  1455. package/src/memory/llm-usage-store.ts +0 -900
  1456. package/src/memory/memory-recall-log-store.ts +0 -172
  1457. package/src/memory/memory-retrospective-constants.ts +0 -50
  1458. package/src/memory/memory-retrospective-enqueue.ts +0 -125
  1459. package/src/memory/memory-retrospective-fork-boundary.ts +0 -94
  1460. package/src/memory/memory-retrospective-job.ts +0 -884
  1461. package/src/memory/memory-retrospective-startup-cleanup.ts +0 -261
  1462. package/src/memory/memory-retrospective-state.ts +0 -245
  1463. package/src/memory/memory-retrospective-trigger-check.ts +0 -91
  1464. package/src/memory/memory-v2-activation-log-store.ts +0 -216
  1465. package/src/memory/memory-v2-concept-frequency.ts +0 -173
  1466. package/src/memory/migrations/126-backfill-guardian-principal-id.ts +0 -303
  1467. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +0 -365
  1468. package/src/memory/migrations/142-rename-verification-session-id-column.ts +0 -55
  1469. package/src/memory/migrations/182-oauth-providers-display-metadata.ts +0 -20
  1470. package/src/memory/migrations/196-strip-integration-prefix-from-provider-keys.ts +0 -179
  1471. package/src/memory/migrations/199-guardian-request-enrichment-columns.ts +0 -64
  1472. package/src/memory/migrations/202-memory-graph-tables.ts +0 -130
  1473. package/src/memory/migrations/203-drop-memory-items-tables.ts +0 -55
  1474. package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +0 -124
  1475. package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +0 -174
  1476. package/src/memory/migrations/211-memory-recall-logs-query-context.ts +0 -16
  1477. package/src/memory/migrations/220-normalize-user-file-by-principal.ts +0 -183
  1478. package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +0 -76
  1479. package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +0 -21
  1480. package/src/memory/migrations/243-provider-connections.ts +0 -68
  1481. package/src/memory/migrations/244-provider-connection-status-label.ts +0 -23
  1482. package/src/memory/migrations/246-backfill-provider-connection-label.ts +0 -81
  1483. package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +0 -19
  1484. package/src/memory/migrations/301-create-watchdog-events.ts +0 -45
  1485. package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +0 -297
  1486. package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +0 -84
  1487. package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +0 -192
  1488. package/src/memory/migrations/__tests__/run-migrations.test.ts +0 -378
  1489. package/src/memory/migrations/helpers/relocation.ts +0 -227
  1490. package/src/memory/migrations/validate-migration-state.ts +0 -277
  1491. package/src/memory/onboarding-events-store.ts +0 -161
  1492. package/src/memory/pkb/autoinject.ts +0 -61
  1493. package/src/memory/pkb/context.ts +0 -50
  1494. package/src/memory/pkb/pkb-index.test.ts +0 -368
  1495. package/src/memory/pkb/pkb-index.ts +0 -255
  1496. package/src/memory/pkb/pkb-reconcile.test.ts +0 -251
  1497. package/src/memory/pkb/pkb-reconcile.ts +0 -148
  1498. package/src/memory/pkb/pkb-search.test.ts +0 -586
  1499. package/src/memory/pkb/pkb-search.ts +0 -178
  1500. package/src/memory/pkb/types.ts +0 -67
  1501. package/src/memory/published-pages-store.ts +0 -67
  1502. package/src/memory/qdrant-circuit-breaker.ts +0 -119
  1503. package/src/memory/qdrant-client.test.ts +0 -60
  1504. package/src/memory/qdrant-client.ts +0 -834
  1505. package/src/memory/qdrant-manager.ts +0 -422
  1506. package/src/memory/rerank-local.ts +0 -374
  1507. package/src/memory/schedule-attribution-sql.ts +0 -104
  1508. package/src/memory/schema/acp.ts +0 -34
  1509. package/src/memory/schema/contacts.ts +0 -120
  1510. package/src/memory/schema/conversations.ts +0 -236
  1511. package/src/memory/schema/infrastructure.ts +0 -381
  1512. package/src/memory/scoped-approval-grants.ts +0 -551
  1513. package/src/memory/search/semantic.ts +0 -238
  1514. package/src/memory/segmenter.ts +0 -76
  1515. package/src/memory/shared-app-links-store.ts +0 -130
  1516. package/src/memory/skill-loaded-events-store.test.ts +0 -152
  1517. package/src/memory/skill-loaded-events-store.ts +0 -95
  1518. package/src/memory/sparse-tokenize.ts +0 -49
  1519. package/src/memory/steps.ts +0 -1296
  1520. package/src/memory/task-memory-cleanup.ts +0 -236
  1521. package/src/memory/tool-executed-events-store.test.ts +0 -219
  1522. package/src/memory/tool-executed-events-store.ts +0 -102
  1523. package/src/memory/tool-usage-store.ts +0 -113
  1524. package/src/memory/trace-event-store.ts +0 -133
  1525. package/src/memory/turn-events-store.ts +0 -173
  1526. package/src/memory/turn-trace-store.test.ts +0 -736
  1527. package/src/memory/turn-trace-store.ts +0 -364
  1528. package/src/memory/v2/__tests__/activation-store.test.ts +0 -204
  1529. package/src/memory/v2/__tests__/activation.test.ts +0 -1227
  1530. package/src/memory/v2/__tests__/backfill-jobs.test.ts +0 -504
  1531. package/src/memory/v2/__tests__/cli-command-store.test.ts +0 -429
  1532. package/src/memory/v2/__tests__/consolidation-job.test.ts +0 -747
  1533. package/src/memory/v2/__tests__/consolidation-prompt-flag-gating-guard.test.ts +0 -189
  1534. package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +0 -136
  1535. package/src/memory/v2/__tests__/harness-compare.test.ts +0 -186
  1536. package/src/memory/v2/__tests__/harness-oracle.test.ts +0 -257
  1537. package/src/memory/v2/__tests__/harness-replay-input.test.ts +0 -230
  1538. package/src/memory/v2/__tests__/harness-runner.test.ts +0 -135
  1539. package/src/memory/v2/__tests__/injection-events.test.ts +0 -318
  1540. package/src/memory/v2/__tests__/injection.test.ts +0 -2301
  1541. package/src/memory/v2/__tests__/migration.test.ts +0 -939
  1542. package/src/memory/v2/__tests__/page-index.test.ts +0 -760
  1543. package/src/memory/v2/__tests__/prompts-consolidation.test.ts +0 -313
  1544. package/src/memory/v2/__tests__/qdrant.test.ts +0 -950
  1545. package/src/memory/v2/__tests__/reranker.test.ts +0 -338
  1546. package/src/memory/v2/__tests__/router.test.ts +0 -1197
  1547. package/src/memory/v2/__tests__/sim.test.ts +0 -670
  1548. package/src/memory/v2/__tests__/skill-content.test.ts +0 -115
  1549. package/src/memory/v2/__tests__/skill-store.test.ts +0 -983
  1550. package/src/memory/v2/__tests__/sparse-bm25.test.ts +0 -292
  1551. package/src/memory/v2/__tests__/static-context.test.ts +0 -223
  1552. package/src/memory/v2/__tests__/sweep-job.test.ts +0 -526
  1553. package/src/memory/v2/activation-store.ts +0 -185
  1554. package/src/memory/v2/activation.ts +0 -548
  1555. package/src/memory/v2/backfill-jobs.ts +0 -296
  1556. package/src/memory/v2/cli-command-store.ts +0 -341
  1557. package/src/memory/v2/consolidation-job.ts +0 -561
  1558. package/src/memory/v2/frontmatter-sweep.ts +0 -98
  1559. package/src/memory/v2/harness/compare.ts +0 -57
  1560. package/src/memory/v2/harness/oracle.ts +0 -145
  1561. package/src/memory/v2/harness/replay-input.ts +0 -240
  1562. package/src/memory/v2/harness/retriever.ts +0 -74
  1563. package/src/memory/v2/harness/router-retriever.ts +0 -43
  1564. package/src/memory/v2/injected-block-slugs.ts +0 -79
  1565. package/src/memory/v2/injection-events.ts +0 -101
  1566. package/src/memory/v2/injection.ts +0 -932
  1567. package/src/memory/v2/migration.ts +0 -776
  1568. package/src/memory/v2/page-index.ts +0 -459
  1569. package/src/memory/v2/page-store.ts +0 -443
  1570. package/src/memory/v2/prompts/consolidation.ts +0 -857
  1571. package/src/memory/v2/prompts/router.ts +0 -148
  1572. package/src/memory/v2/qdrant.ts +0 -892
  1573. package/src/memory/v2/reranker.ts +0 -184
  1574. package/src/memory/v2/router.ts +0 -601
  1575. package/src/memory/v2/sim.ts +0 -296
  1576. package/src/memory/v2/skill-content.ts +0 -61
  1577. package/src/memory/v2/skill-store.ts +0 -431
  1578. package/src/memory/v2/sparse-bm25.ts +0 -245
  1579. package/src/memory/v2/static-context.ts +0 -100
  1580. package/src/memory/v2/sweep-job.ts +0 -320
  1581. package/src/memory/v3-eval/eval-packets.ts +0 -731
  1582. package/src/memory/watchdog-events-store.ts +0 -87
  1583. package/src/memory/worker-control.ts +0 -204
  1584. package/src/memory/worker-process.ts +0 -89
  1585. package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +0 -116
  1586. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +0 -370
  1587. package/src/plugins/defaults/memory-retrieval/injector-chain.ts +0 -41
  1588. package/src/plugins/defaults/memory-retrieval/injectors.ts +0 -1061
  1589. package/src/plugins/defaults/memory-retrieval/package.json +0 -14
  1590. package/src/plugins/defaults/memory-retrieval/tail-reinjection-strip.ts +0 -64
  1591. package/src/plugins/defaults/memory-v3-shadow/__tests__/carry-integration.test.ts +0 -1164
  1592. package/src/plugins/defaults/memory-v3-shadow/__tests__/dense.test.ts +0 -192
  1593. package/src/plugins/defaults/memory-v3-shadow/__tests__/edge.test.ts +0 -247
  1594. package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +0 -717
  1595. package/src/plugins/defaults/memory-v3-shadow/__tests__/live-integration.test.ts +0 -365
  1596. package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +0 -736
  1597. package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +0 -839
  1598. package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +0 -598
  1599. package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +0 -128
  1600. package/src/plugins/defaults/memory-v3-shadow/__tests__/section-dense-store.test.ts +0 -710
  1601. package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +0 -425
  1602. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +0 -493
  1603. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +0 -856
  1604. package/src/plugins/defaults/memory-v3-shadow/capabilities.ts +0 -91
  1605. package/src/plugins/defaults/memory-v3-shadow/card.ts +0 -160
  1606. package/src/plugins/defaults/memory-v3-shadow/dense.ts +0 -97
  1607. package/src/plugins/defaults/memory-v3-shadow/edge.ts +0 -252
  1608. package/src/plugins/defaults/memory-v3-shadow/ever-injected-store.test.ts +0 -305
  1609. package/src/plugins/defaults/memory-v3-shadow/ever-injected-store.ts +0 -278
  1610. package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +0 -14
  1611. package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +0 -19
  1612. package/src/plugins/defaults/memory-v3-shadow/hot-set.test.ts +0 -138
  1613. package/src/plugins/defaults/memory-v3-shadow/hot-set.ts +0 -85
  1614. package/src/plugins/defaults/memory-v3-shadow/injector.ts +0 -453
  1615. package/src/plugins/defaults/memory-v3-shadow/learned-edges.test.ts +0 -169
  1616. package/src/plugins/defaults/memory-v3-shadow/learned-edges.ts +0 -178
  1617. package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +0 -794
  1618. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +0 -431
  1619. package/src/plugins/defaults/memory-v3-shadow/package.json +0 -14
  1620. package/src/plugins/defaults/memory-v3-shadow/page-content.ts +0 -102
  1621. package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +0 -146
  1622. package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +0 -578
  1623. package/src/plugins/defaults/memory-v3-shadow/prune.test.ts +0 -758
  1624. package/src/plugins/defaults/memory-v3-shadow/prune.ts +0 -471
  1625. package/src/plugins/defaults/memory-v3-shadow/render-injection.ts +0 -92
  1626. package/src/plugins/defaults/memory-v3-shadow/section-dense-store.ts +0 -422
  1627. package/src/plugins/defaults/memory-v3-shadow/section-needle.ts +0 -200
  1628. package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +0 -281
  1629. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +0 -642
  1630. package/src/plugins/defaults/memory-v3-shadow/types.ts +0 -127
  1631. package/src/plugins/feature-gate.ts +0 -22
  1632. package/src/runtime/__tests__/slack-block-formatting.test.ts +0 -510
  1633. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +0 -165
  1634. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +0 -347
  1635. package/src/runtime/routes/memory-eval-routes.ts +0 -179
  1636. package/src/runtime/routes/memory-item-routes.test.ts +0 -912
  1637. package/src/runtime/routes/memory-item-routes.ts +0 -815
  1638. package/src/runtime/routes/memory-v2-routes.ts +0 -850
  1639. package/src/runtime/routes/memory-v3-routes.ts +0 -122
  1640. package/src/runtime/routes/secrets-deps.ts +0 -24
  1641. package/src/runtime/slack-block-formatting.ts +0 -586
  1642. package/src/tools/memory/register.test.ts +0 -382
  1643. package/src/tools/memory/register.ts +0 -81
  1644. /package/src/{memory → apps}/app-git-service.ts +0 -0
  1645. /package/src/{memory → channels}/slack-thread-store.ts +0 -0
  1646. /package/src/{memory → home}/conversation-starter-validation.ts +0 -0
  1647. /package/src/{memory → persistence}/auto-analysis-constants.ts +0 -0
  1648. /package/src/{memory → persistence}/bookmark-crud.ts +0 -0
  1649. /package/src/{memory → persistence}/cleanup-schedule-state.ts +0 -0
  1650. /package/src/{memory → persistence}/compaction-log-store-clickhouse.ts +0 -0
  1651. /package/src/{memory → persistence}/conversation-directories.ts +0 -0
  1652. /package/src/{memory → persistence}/conversation-disk-view.ts +0 -0
  1653. /package/src/{memory → persistence}/conversation-display-order-migration.ts +0 -0
  1654. /package/src/{memory → persistence}/conversation-group-migration.ts +0 -0
  1655. /package/src/{memory → persistence}/conversation-title-service.ts +0 -0
  1656. /package/src/{memory → persistence}/conversation-types.ts +0 -0
  1657. /package/src/{memory → persistence}/db-singleton.ts +0 -0
  1658. /package/src/{memory → persistence}/delivery-channels.ts +0 -0
  1659. /package/src/{memory → persistence}/delivery-crud.ts +0 -0
  1660. /package/src/{memory → persistence}/delivery-status.ts +0 -0
  1661. /package/src/{memory → persistence/embeddings}/__tests__/sparse-tokenize.test.ts +0 -0
  1662. /package/src/{memory → persistence/embeddings}/embedding-gemini.test.ts +0 -0
  1663. /package/src/{memory → persistence/embeddings}/embedding-gemini.ts +0 -0
  1664. /package/src/{memory → persistence/embeddings}/embedding-openai.ts +0 -0
  1665. /package/src/{memory → persistence/embeddings}/embedding-types.test.ts +0 -0
  1666. /package/src/{memory → persistence}/fingerprint.ts +0 -0
  1667. /package/src/{memory → persistence}/group-crud.ts +0 -0
  1668. /package/src/{memory → persistence}/invite-store.ts +0 -0
  1669. /package/src/{memory → persistence}/lifecycle-events-store.ts +0 -0
  1670. /package/src/{memory → persistence}/llm-request-log-source-local.ts +0 -0
  1671. /package/src/{memory → persistence}/llm-request-log-source.ts +0 -0
  1672. /package/src/{memory → persistence}/media-store.ts +0 -0
  1673. /package/src/{memory → persistence}/message-content.ts +0 -0
  1674. /package/src/{memory → persistence}/migrations/000-core-tables.ts +0 -0
  1675. /package/src/{memory → persistence}/migrations/001-job-deferrals.ts +0 -0
  1676. /package/src/{memory → persistence}/migrations/002-tool-invocations-fk.ts +0 -0
  1677. /package/src/{memory → persistence}/migrations/003-memory-fts-backfill.ts +0 -0
  1678. /package/src/{memory → persistence}/migrations/004-entity-relation-dedup.ts +0 -0
  1679. /package/src/{memory → persistence}/migrations/005-fingerprint-scope-unique.ts +0 -0
  1680. /package/src/{memory → persistence}/migrations/006-scope-salted-fingerprints.ts +0 -0
  1681. /package/src/{memory → persistence}/migrations/007-assistant-id-to-self.ts +0 -0
  1682. /package/src/{memory → persistence}/migrations/008-remove-assistant-id-columns.ts +0 -0
  1683. /package/src/{memory → persistence}/migrations/009-llm-usage-events-drop-assistant-id.ts +0 -0
  1684. /package/src/{memory → persistence}/migrations/011-call-sessions-provider-sid-dedup.ts +0 -0
  1685. /package/src/{memory → persistence}/migrations/012-call-sessions-add-initiated-from.ts +0 -0
  1686. /package/src/{memory → persistence}/migrations/013-guardian-action-tables.ts +0 -0
  1687. /package/src/{memory → persistence}/migrations/014-backfill-inbox-thread-state.ts +0 -0
  1688. /package/src/{memory → persistence}/migrations/015-drop-active-search-index.ts +0 -0
  1689. /package/src/{memory → persistence}/migrations/016-memory-segments-indexes.ts +0 -0
  1690. /package/src/{memory → persistence}/migrations/017-memory-items-indexes.ts +0 -0
  1691. /package/src/{memory → persistence}/migrations/018-remaining-table-indexes.ts +0 -0
  1692. /package/src/{memory → persistence}/migrations/019-notification-tables-schema-migration.ts +0 -0
  1693. /package/src/{memory → persistence}/migrations/020-rename-macos-ios-channel-to-vellum.ts +0 -0
  1694. /package/src/{memory → persistence}/migrations/021-conversation-status-indexes.ts +0 -0
  1695. /package/src/{memory → persistence}/migrations/022-add-origin-interface.ts +0 -0
  1696. /package/src/{memory → persistence}/migrations/023-memory-item-sources-indexes.ts +0 -0
  1697. /package/src/{memory → persistence}/migrations/024-embedding-vector-blob.ts +0 -0
  1698. /package/src/{memory → persistence}/migrations/025-messages-fts-backfill.ts +0 -0
  1699. /package/src/{memory → persistence}/migrations/026-guardian-verification-sessions.ts +0 -0
  1700. /package/src/{memory → persistence}/migrations/026a-embeddings-nullable-vector-json.ts +0 -0
  1701. /package/src/{memory → persistence}/migrations/027-notification-delivery-pairing-columns.ts +0 -0
  1702. /package/src/{memory → persistence}/migrations/027a-guardian-bootstrap-token.ts +0 -0
  1703. /package/src/{memory → persistence}/migrations/028-call-session-mode.ts +0 -0
  1704. /package/src/{memory → persistence}/migrations/028-notification-delivery-client-ack.ts +0 -0
  1705. /package/src/{memory → persistence}/migrations/029-channel-inbound-delivered-segments.ts +0 -0
  1706. /package/src/{memory → persistence}/migrations/030-guardian-action-followup.ts +0 -0
  1707. /package/src/{memory → persistence}/migrations/030-guardian-verification-purpose.ts +0 -0
  1708. /package/src/{memory → persistence}/migrations/031-conversations-thread-type-index.ts +0 -0
  1709. /package/src/{memory → persistence}/migrations/032-guardian-delivery-conversation-index.ts +0 -0
  1710. /package/src/{memory → persistence}/migrations/032-notification-delivery-thread-decision.ts +0 -0
  1711. /package/src/{memory → persistence}/migrations/033-scoped-approval-grants.ts +0 -0
  1712. /package/src/{memory → persistence}/migrations/034-guardian-action-tool-metadata.ts +0 -0
  1713. /package/src/{memory → persistence}/migrations/035-guardian-action-supersession.ts +0 -0
  1714. /package/src/{memory → persistence}/migrations/036-normalize-phone-identities.ts +0 -0
  1715. /package/src/{memory → persistence}/migrations/037-voice-invite-columns.ts +0 -0
  1716. /package/src/{memory → persistence}/migrations/040-invite-code-hash-column.ts +0 -0
  1717. /package/src/{memory → persistence}/migrations/041-approval-prompt-ts-tracker.ts +0 -0
  1718. /package/src/{memory → persistence}/migrations/101-watchers-and-logs.ts +0 -0
  1719. /package/src/{memory → persistence}/migrations/102-alter-table-columns.ts +0 -0
  1720. /package/src/{memory → persistence}/migrations/104-core-indexes.ts +0 -0
  1721. /package/src/{memory → persistence}/migrations/105-contacts-and-triage.ts +0 -0
  1722. /package/src/{memory → persistence}/migrations/106-call-sessions.ts +0 -0
  1723. /package/src/{memory → persistence}/migrations/107-followups.ts +0 -0
  1724. /package/src/{memory → persistence}/migrations/108-tasks-and-work-items.ts +0 -0
  1725. /package/src/{memory → persistence}/migrations/109-external-conversation-bindings.ts +0 -0
  1726. /package/src/{memory → persistence}/migrations/110-channel-guardian.ts +0 -0
  1727. /package/src/{memory → persistence}/migrations/111-media-assets.ts +0 -0
  1728. /package/src/{memory → persistence}/migrations/112-assistant-inbox.ts +0 -0
  1729. /package/src/{memory → persistence}/migrations/114-notifications.ts +0 -0
  1730. /package/src/{memory → persistence}/migrations/115-sequences.ts +0 -0
  1731. /package/src/{memory → persistence}/migrations/116-messages-fts.ts +0 -0
  1732. /package/src/{memory → persistence}/migrations/117-conversation-attention.ts +0 -0
  1733. /package/src/{memory → persistence}/migrations/118-reminder-routing-intent.ts +0 -0
  1734. /package/src/{memory → persistence}/migrations/119-schema-indexes-and-columns.ts +0 -0
  1735. /package/src/{memory → persistence}/migrations/120-fk-cascade-rebuilds.ts +0 -0
  1736. /package/src/{memory → persistence}/migrations/121-canonical-guardian-requests.ts +0 -0
  1737. /package/src/{memory → persistence}/migrations/122-canonical-guardian-requester-chat-id.ts +0 -0
  1738. /package/src/{memory → persistence}/migrations/123-canonical-guardian-deliveries-destination-index.ts +0 -0
  1739. /package/src/{memory → persistence}/migrations/124-voice-invite-display-metadata.ts +0 -0
  1740. /package/src/{memory → persistence}/migrations/125-guardian-principal-id-columns.ts +0 -0
  1741. /package/src/{memory → persistence}/migrations/127-guardian-principal-id-not-null.ts +0 -0
  1742. /package/src/{memory → persistence}/migrations/128-contacts-role-principal.ts +0 -0
  1743. /package/src/{memory → persistence}/migrations/129-contact-channels-access-fields.ts +0 -0
  1744. /package/src/{memory → persistence}/migrations/130-contact-channels-type-ext-chat-id-index.ts +0 -0
  1745. /package/src/{memory → persistence}/migrations/131-drop-legacy-member-guardian-tables.ts +0 -0
  1746. /package/src/{memory → persistence}/migrations/132-contacts-assistant-id.ts +0 -0
  1747. /package/src/{memory → persistence}/migrations/133-assistant-contact-metadata.ts +0 -0
  1748. /package/src/{memory → persistence}/migrations/134-contacts-notes-column.ts +0 -0
  1749. /package/src/{memory → persistence}/migrations/135-backfill-contact-interaction-stats.ts +0 -0
  1750. /package/src/{memory → persistence}/migrations/136-drop-assistant-id-columns.ts +0 -0
  1751. /package/src/{memory → persistence}/migrations/137-usage-dashboard-indexes.ts +0 -0
  1752. /package/src/{memory → persistence}/migrations/139-drop-usage-composite-indexes.ts +0 -0
  1753. /package/src/{memory → persistence}/migrations/141-rename-verification-table.ts +0 -0
  1754. /package/src/{memory → persistence}/migrations/143-rename-guardian-verification-values.ts +0 -0
  1755. /package/src/{memory → persistence}/migrations/144-rename-voice-to-phone.ts +0 -0
  1756. /package/src/{memory → persistence}/migrations/145-drop-accounts-table.ts +0 -0
  1757. /package/src/{memory → persistence}/migrations/146-schedule-oneshot-routing.ts +0 -0
  1758. /package/src/{memory → persistence}/migrations/147-migrate-reminders-to-schedules.ts +0 -0
  1759. /package/src/{memory → persistence}/migrations/148-drop-reminders-table.ts +0 -0
  1760. /package/src/{memory → persistence}/migrations/149-oauth-tables.ts +0 -0
  1761. /package/src/{memory → persistence}/migrations/150-oauth-apps-client-secret-path.ts +0 -0
  1762. /package/src/{memory → persistence}/migrations/151-oauth-providers-ping-url.ts +0 -0
  1763. /package/src/{memory → persistence}/migrations/152-memory-item-supersession.ts +0 -0
  1764. /package/src/{memory → persistence}/migrations/153-drop-entity-tables.ts +0 -0
  1765. /package/src/{memory → persistence}/migrations/154-drop-fts.ts +0 -0
  1766. /package/src/{memory → persistence}/migrations/155-drop-conflicts.ts +0 -0
  1767. /package/src/{memory → persistence}/migrations/156-call-session-invite-metadata.ts +0 -0
  1768. /package/src/{memory → persistence}/migrations/157-invite-contact-id.ts +0 -0
  1769. /package/src/{memory → persistence}/migrations/158-channel-interaction-columns.ts +0 -0
  1770. /package/src/{memory → persistence}/migrations/159-drop-contact-interaction-columns.ts +0 -0
  1771. /package/src/{memory → persistence}/migrations/160-drop-loopback-port-column.ts +0 -0
  1772. /package/src/{memory → persistence}/migrations/161-drop-orphaned-media-tables.ts +0 -0
  1773. /package/src/{memory → persistence}/migrations/162-guardian-timestamps-epoch-ms.ts +0 -0
  1774. /package/src/{memory → persistence}/migrations/163-rename-notification-thread-columns.ts +0 -0
  1775. /package/src/{memory → persistence}/migrations/164-rename-conversation-type-column.ts +0 -0
  1776. /package/src/{memory → persistence}/migrations/165-rename-inbox-thread-state-table.ts +0 -0
  1777. /package/src/{memory → persistence}/migrations/166-rename-followups-thread-id.ts +0 -0
  1778. /package/src/{memory → persistence}/migrations/167-rename-sequence-enrollments-thread-id.ts +0 -0
  1779. /package/src/{memory → persistence}/migrations/168-rename-sequence-steps-reply-key.ts +0 -0
  1780. /package/src/{memory → persistence}/migrations/169-rename-gmail-provider-key-to-google.ts +0 -0
  1781. /package/src/{memory → persistence}/migrations/170-thread-starters-table.ts +0 -0
  1782. /package/src/{memory → persistence}/migrations/171-capability-card-columns.ts +0 -0
  1783. /package/src/{memory → persistence}/migrations/172-rename-created-by-session-id.ts +0 -0
  1784. /package/src/{memory → persistence}/migrations/173-rename-source-session-id.ts +0 -0
  1785. /package/src/{memory → persistence}/migrations/174-rename-thread-starters-table.ts +0 -0
  1786. /package/src/{memory → persistence}/migrations/175-create-lifecycle-events.ts +0 -0
  1787. /package/src/{memory → persistence}/migrations/176-drop-capability-card-state.ts +0 -0
  1788. /package/src/{memory → persistence}/migrations/177-create-trace-events-table.ts +0 -0
  1789. /package/src/{memory → persistence}/migrations/178-oauth-providers-managed-service-config-key.ts +0 -0
  1790. /package/src/{memory → persistence}/migrations/179-llm-request-log-message-id.ts +0 -0
  1791. /package/src/{memory → persistence}/migrations/180-backfill-inline-attachments-to-disk.ts +0 -0
  1792. /package/src/{memory → persistence}/migrations/181-rename-thread-starters-checkpoints.ts +0 -0
  1793. /package/src/{memory → persistence}/migrations/183-add-conversation-fork-lineage.ts +0 -0
  1794. /package/src/{memory → persistence}/migrations/184-llm-request-log-provider.ts +0 -0
  1795. /package/src/{memory → persistence}/migrations/188-schedule-quiet-flag.ts +0 -0
  1796. /package/src/{memory → persistence}/migrations/189-drop-simplified-memory.ts +0 -0
  1797. /package/src/{memory → persistence}/migrations/190-call-session-skip-disclosure.ts +0 -0
  1798. /package/src/{memory → persistence}/migrations/191-backfill-audio-attachment-mime-types.ts +0 -0
  1799. /package/src/{memory → persistence}/migrations/192-contacts-user-file-column.ts +0 -0
  1800. /package/src/{memory → persistence}/migrations/193-add-source-type-columns.ts +0 -0
  1801. /package/src/{memory → persistence}/migrations/194-memory-recall-logs.ts +0 -0
  1802. /package/src/{memory → persistence}/migrations/195-oauth-providers-ping-config.ts +0 -0
  1803. /package/src/{memory → persistence}/migrations/196-messages-conversation-created-at-index.ts +0 -0
  1804. /package/src/{memory → persistence}/migrations/197-oauth-providers-behavior-columns.ts +0 -0
  1805. /package/src/{memory → persistence}/migrations/198-drop-setup-skill-id-column.ts +0 -0
  1806. /package/src/{memory → persistence}/migrations/200-usage-llm-call-count.ts +0 -0
  1807. /package/src/{memory → persistence}/migrations/201-oauth-providers-feature-flag.ts +0 -0
  1808. /package/src/{memory → persistence}/migrations/202-drop-callback-transport-column.ts +0 -0
  1809. /package/src/{memory → persistence}/migrations/204-rename-memory-graph-type-values.ts +0 -0
  1810. /package/src/{memory → persistence}/migrations/205-memory-graph-image-refs.ts +0 -0
  1811. /package/src/{memory → persistence}/migrations/206-memory-graph-node-edits.ts +0 -0
  1812. /package/src/{memory → persistence}/migrations/207-conversation-graph-memory-state.ts +0 -0
  1813. /package/src/{memory → persistence}/migrations/208-conversations-last-message-at.ts +0 -0
  1814. /package/src/{memory → persistence}/migrations/210-schedule-reuse-conversation.ts +0 -0
  1815. /package/src/{memory → persistence}/migrations/212-llm-request-logs-created-at-index.ts +0 -0
  1816. /package/src/{memory → persistence}/migrations/213-oauth-providers-scope-separator.ts +0 -0
  1817. /package/src/{memory → persistence}/migrations/214-oauth-providers-refresh-url.ts +0 -0
  1818. /package/src/{memory → persistence}/migrations/215-oauth-providers-revoke.ts +0 -0
  1819. /package/src/{memory → persistence}/migrations/216-oauth-providers-token-auth-method.ts +0 -0
  1820. /package/src/{memory → persistence}/migrations/217-conversation-host-access.ts +0 -0
  1821. /package/src/{memory → persistence}/migrations/218-oauth-providers-logo-url.ts +0 -0
  1822. /package/src/{memory → persistence}/migrations/219-oauth-providers-token-exchange-body-format.ts +0 -0
  1823. /package/src/{memory → persistence}/migrations/221-conversations-archived-at.ts +0 -0
  1824. /package/src/{memory → persistence}/migrations/223-schedule-script-column.ts +0 -0
  1825. /package/src/{memory → persistence}/migrations/224-oauth-providers-managed-service-is-paid.ts +0 -0
  1826. /package/src/{memory → persistence}/migrations/225-oauth-providers-available-scopes.ts +0 -0
  1827. /package/src/{memory → persistence}/migrations/226-schedule-wake-conversation-id.ts +0 -0
  1828. /package/src/{memory → persistence}/migrations/227-add-conversation-inference-profile.ts +0 -0
  1829. /package/src/{memory → persistence}/migrations/228-rename-inference-profile-snake-case.ts +0 -0
  1830. /package/src/{memory → persistence}/migrations/229-delete-private-conversations.test.ts +0 -0
  1831. /package/src/{memory → persistence}/migrations/229-delete-private-conversations.ts +0 -0
  1832. /package/src/{memory → persistence}/migrations/230-acp-session-history.ts +0 -0
  1833. /package/src/{memory → persistence}/migrations/231-repair-memory-graph-event-dates.ts +0 -0
  1834. /package/src/{memory → persistence}/migrations/232-activation-state.ts +0 -0
  1835. /package/src/{memory → persistence}/migrations/233-document-conversations.ts +0 -0
  1836. /package/src/{memory → persistence}/migrations/234-memory-v2-activation-logs.ts +0 -0
  1837. /package/src/{memory → persistence}/migrations/235-llm-usage-attribution.ts +0 -0
  1838. /package/src/{memory → persistence}/migrations/235-slack-compaction-watermark.ts +0 -0
  1839. /package/src/{memory → persistence}/migrations/237-heartbeat-runs.ts +0 -0
  1840. /package/src/{memory → persistence}/migrations/238-schedule-retry-policy.ts +0 -0
  1841. /package/src/{memory → persistence}/migrations/239-trace-events-created-at-index.ts +0 -0
  1842. /package/src/{memory → persistence}/migrations/240-conversation-inference-profile-session.ts +0 -0
  1843. /package/src/{memory → persistence}/migrations/241-activation-state-fk-cascade.ts +0 -0
  1844. /package/src/{memory → persistence}/migrations/242-message-bookmarks.ts +0 -0
  1845. /package/src/{memory → persistence}/migrations/245-memory-retrospective-state.ts +0 -0
  1846. /package/src/{memory → persistence}/migrations/247-external-conversation-binding-thread-id.ts +0 -0
  1847. /package/src/{memory → persistence}/migrations/248-create-onboarding-events.ts +0 -0
  1848. /package/src/{memory → persistence}/migrations/249-normalize-slack-external-content.ts +0 -0
  1849. /package/src/{memory → persistence}/migrations/250-provider-connection-base-url-and-models.ts +0 -0
  1850. /package/src/{memory → persistence}/migrations/251-a2a-tasks.ts +0 -0
  1851. /package/src/{memory → persistence}/migrations/252-llm-request-log-agent-loop-exit-reason.ts +0 -0
  1852. /package/src/{memory → persistence}/migrations/253-conversation-last-notified-profile.ts +0 -0
  1853. /package/src/{memory → persistence}/migrations/253-document-comments.ts +0 -0
  1854. /package/src/{memory → persistence}/migrations/254-external-conversation-binding-chat-name.ts +0 -0
  1855. /package/src/{memory → persistence}/migrations/256-memory-v2-injection-events.ts +0 -0
  1856. /package/src/{memory → persistence}/migrations/257-strip-base-url-non-openai-compatible.ts +0 -0
  1857. /package/src/{memory → persistence}/migrations/258-onboarding-events-prior-assistants.ts +0 -0
  1858. /package/src/{memory → persistence}/migrations/259-conversation-cleaned-at.ts +0 -0
  1859. /package/src/{memory → persistence}/migrations/260-rename-cleaned-at.ts +0 -0
  1860. /package/src/{memory → persistence}/migrations/261-llm-usage-add-raw-usage.ts +0 -0
  1861. /package/src/{memory → persistence}/migrations/262-memory-v3-coactivation.ts +0 -0
  1862. /package/src/{memory → persistence}/migrations/263-memory-v3-auto-edges.ts +0 -0
  1863. /package/src/{memory → persistence}/migrations/264-llm-request-log-call-site.ts +0 -0
  1864. /package/src/{memory → persistence}/migrations/265-drop-provider-connection-status.ts +0 -0
  1865. /package/src/{memory → persistence}/migrations/266-messages-client-message-id.ts +0 -0
  1866. /package/src/{memory → persistence}/migrations/267-llm-usage-events-add-assistant-version.ts +0 -0
  1867. /package/src/{memory → persistence}/migrations/268-add-memory-v3-selections.ts +0 -0
  1868. /package/src/{memory → persistence}/migrations/269-schedule-script-timeout.ts +0 -0
  1869. /package/src/{memory → persistence}/migrations/270-messages-role-created-at-index.ts +0 -0
  1870. /package/src/{memory → persistence}/migrations/270-schedule-description.ts +0 -0
  1871. /package/src/{memory → persistence}/migrations/270-schedule-source-conversation.ts +0 -0
  1872. /package/src/{memory → persistence}/migrations/271-create-auth-fallback-events.ts +0 -0
  1873. /package/src/{memory → persistence}/migrations/272-acp-session-history-cwd.ts +0 -0
  1874. /package/src/{memory → persistence}/migrations/273-onboarding-events-funnel-columns.ts +0 -0
  1875. /package/src/{memory → persistence}/migrations/274-create-activation-sessions.ts +0 -0
  1876. /package/src/{memory → persistence}/migrations/275-tool-invocations-add-skill-id.test.ts +0 -0
  1877. /package/src/{memory → persistence}/migrations/275-tool-invocations-add-skill-id.ts +0 -0
  1878. /package/src/{memory → persistence}/migrations/276-tool-invocations-created-at-id-index.test.ts +0 -0
  1879. /package/src/{memory → persistence}/migrations/276-tool-invocations-created-at-id-index.ts +0 -0
  1880. /package/src/{memory → persistence}/migrations/277-add-memory-v3-ever-injected.ts +0 -0
  1881. /package/src/{memory → persistence}/migrations/278-tool-invocations-telemetry-columns.test.ts +0 -0
  1882. /package/src/{memory → persistence}/migrations/278-tool-invocations-telemetry-columns.ts +0 -0
  1883. /package/src/{memory → persistence}/migrations/279-create-skill-loaded-events.test.ts +0 -0
  1884. /package/src/{memory → persistence}/migrations/279-create-skill-loaded-events.ts +0 -0
  1885. /package/src/{memory → persistence}/migrations/280-conversations-surfaced-at.test.ts +0 -0
  1886. /package/src/{memory → persistence}/migrations/280-conversations-surfaced-at.ts +0 -0
  1887. /package/src/{memory → persistence}/migrations/281-memory-retrospective-remembered-log.ts +0 -0
  1888. /package/src/{memory → persistence}/migrations/282-schedule-inference-profile.test.ts +0 -0
  1889. /package/src/{memory → persistence}/migrations/282-schedule-inference-profile.ts +0 -0
  1890. /package/src/{memory → persistence}/migrations/283-memory-v3-selections-message-id-and-sections.test.ts +0 -0
  1891. /package/src/{memory → persistence}/migrations/283-memory-v3-selections-message-id-and-sections.ts +0 -0
  1892. /package/src/{memory → persistence}/migrations/284-workflow-runs.ts +0 -0
  1893. /package/src/{memory → persistence}/migrations/285-schedule-workflow-mode.ts +0 -0
  1894. /package/src/{memory → persistence}/migrations/286-workflow-run-trust.ts +0 -0
  1895. /package/src/{memory → persistence}/migrations/287-conversation-origin-channel-index.ts +0 -0
  1896. /package/src/{memory → persistence}/migrations/288-backfill-origin-channel-from-bindings.ts +0 -0
  1897. /package/src/{memory → persistence}/migrations/289-contact-channels-unique-ext-user.ts +0 -0
  1898. /package/src/{memory → persistence}/migrations/290-schedule-capabilities.test.ts +0 -0
  1899. /package/src/{memory → persistence}/migrations/290-schedule-capabilities.ts +0 -0
  1900. /package/src/{memory → persistence}/migrations/291-contact-channels-renormalize-addresses.ts +0 -0
  1901. /package/src/{memory → persistence}/migrations/292-schedule-default-no-reuse-conversation.test.ts +0 -0
  1902. /package/src/{memory → persistence}/migrations/292-schedule-default-no-reuse-conversation.ts +0 -0
  1903. /package/src/{memory → persistence}/migrations/293-workflow-journal-leaf-tokens.ts +0 -0
  1904. /package/src/{memory → persistence}/migrations/294-drop-external-user-id.ts +0 -0
  1905. /package/src/{memory → persistence}/migrations/295-drop-approval-prompt-ts-tracker.ts +0 -0
  1906. /package/src/{memory → persistence}/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +0 -0
  1907. /package/src/{memory → persistence}/migrations/296-rewrite-balanced-economy-profile-pins.ts +0 -0
  1908. /package/src/{memory → persistence}/migrations/297-move-llm-request-logs-to-logs-db.ts +0 -0
  1909. /package/src/{memory → persistence}/migrations/298-move-memory-jobs-to-memory-db.ts +0 -0
  1910. /package/src/{memory → persistence}/migrations/299-canonical-guardian-deliveries-conversation-index.ts +0 -0
  1911. /package/src/{memory → persistence}/migrations/300-add-processing-started-at.ts +0 -0
  1912. /package/src/{memory → persistence}/migrations/302-create-compaction-events.ts +0 -0
  1913. /package/src/{memory → persistence}/migrations/303-add-conversation-creation-seq.ts +0 -0
  1914. /package/src/{memory → persistence}/migrations/__tests__/014-backfill-inbox-thread-state.test.ts +0 -0
  1915. /package/src/{memory → persistence}/migrations/__tests__/131-drop-legacy-member-guardian-tables.test.ts +0 -0
  1916. /package/src/{memory → persistence}/migrations/__tests__/136-drop-assistant-id-columns.test.ts +0 -0
  1917. /package/src/{memory → persistence}/migrations/__tests__/234-memory-v2-activation-logs.test.ts +0 -0
  1918. /package/src/{memory → persistence}/migrations/__tests__/245-memory-retrospective-state.test.ts +0 -0
  1919. /package/src/{memory → persistence}/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +0 -0
  1920. /package/src/{memory → persistence}/migrations/__tests__/281-memory-retrospective-remembered-log.test.ts +0 -0
  1921. /package/src/{memory → persistence}/migrations/__tests__/289-contact-channels-unique-ext-user.test.ts +0 -0
  1922. /package/src/{memory → persistence}/migrations/__tests__/291-contact-channels-renormalize-addresses.test.ts +0 -0
  1923. /package/src/{memory → persistence}/migrations/__tests__/297-move-llm-request-logs.test.ts +0 -0
  1924. /package/src/{memory → persistence}/migrations/run-migrations.ts +0 -0
  1925. /package/src/{memory → persistence}/migrations/schema-introspection.ts +0 -0
  1926. /package/src/{memory → persistence}/raw-query.ts +0 -0
  1927. /package/src/{memory → persistence}/schema/a2a.ts +0 -0
  1928. /package/src/{memory → persistence}/schema/bookmarks.ts +0 -0
  1929. /package/src/{memory → persistence}/schema/calls.ts +0 -0
  1930. /package/src/{memory → persistence}/schema/guardian.ts +0 -0
  1931. /package/src/{memory → persistence}/schema/index.ts +0 -0
  1932. /package/src/{memory → persistence}/schema/inference.ts +0 -0
  1933. /package/src/{memory → persistence}/schema/memory-core.ts +0 -0
  1934. /package/src/{memory → persistence}/schema/memory-graph.ts +0 -0
  1935. /package/src/{memory → persistence}/schema/notifications.ts +0 -0
  1936. /package/src/{memory → persistence}/schema/oauth.ts +0 -0
  1937. /package/src/{memory → persistence}/schema/tasks.ts +0 -0
  1938. /package/src/{memory → persistence}/schema.ts +0 -0
  1939. /package/src/{memory → persistence}/usage-buckets.ts +0 -0
  1940. /package/src/{memory → persistence}/usage-grouped-buckets.ts +0 -0
  1941. /package/src/{memory → plugins/defaults/memory}/__tests__/fixtures/memory-v2-activation-fixtures.ts +0 -0
  1942. /package/src/{memory → plugins/defaults/memory}/__tests__/memory-retrospective-trigger-check.test.ts +0 -0
  1943. /package/src/{memory → plugins/defaults/memory}/anisotropy.test.ts +0 -0
  1944. /package/src/{memory → plugins/defaults/memory}/context-search/__tests__/agent-runner-redaction.test.ts +0 -0
  1945. /package/src/{memory → plugins/defaults/memory}/context-search/format.ts +0 -0
  1946. /package/src/{memory → plugins/defaults/memory}/context-search/limits.ts +0 -0
  1947. /package/src/{memory → plugins/defaults/memory}/context-search/sources/workspace.ts +0 -0
  1948. /package/src/{memory → plugins/defaults/memory}/graph/decay.test.ts +0 -0
  1949. /package/src/{memory → plugins/defaults/memory}/graph/extraction.test.ts +0 -0
  1950. /package/src/{memory → plugins/defaults/memory}/graph/injection.test.ts +0 -0
  1951. /package/src/{memory → plugins/defaults/memory}/graph/scoring.test.ts +0 -0
  1952. /package/src/{memory → plugins/defaults/memory}/graph/scoring.ts +0 -0
  1953. /package/src/{memory → plugins/defaults/memory}/graph/serendipity.ts +0 -0
  1954. /package/src/{memory → plugins/defaults/memory}/graph/triggers.test.ts +0 -0
  1955. /package/src/{memory → plugins/defaults/memory}/graph/triggers.ts +0 -0
  1956. /package/src/{memory → plugins/defaults/memory}/graph/types.ts +0 -0
  1957. /package/src/plugins/defaults/{memory-retrieval → memory}/hooks/__tests__/user-prompt-submit.test.ts +0 -0
  1958. /package/src/{memory → plugins/defaults/memory}/memory-marker.ts +0 -0
  1959. /package/src/{memory → plugins/defaults/memory}/prompt-override.ts +0 -0
  1960. /package/src/{memory → plugins/defaults/memory}/retrieval-budget.ts +0 -0
  1961. /package/src/{memory → plugins/defaults/memory}/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +0 -0
  1962. /package/src/{memory → plugins/defaults/memory}/v2/__tests__/concept-page-frontmatter-schema.test.ts +0 -0
  1963. /package/src/{memory → plugins/defaults/memory}/v2/__tests__/edge-index.test.ts +0 -0
  1964. /package/src/{memory → plugins/defaults/memory}/v2/__tests__/harness-metrics.test.ts +0 -0
  1965. /package/src/{memory → plugins/defaults/memory}/v2/__tests__/injected-block-slugs.test.ts +0 -0
  1966. /package/src/{memory → plugins/defaults/memory}/v2/__tests__/page-store.test.ts +0 -0
  1967. /package/src/{memory → plugins/defaults/memory}/v2/__tests__/prompts-router.test.ts +0 -0
  1968. /package/src/{memory → plugins/defaults/memory}/v2/cli-command-content.ts +0 -0
  1969. /package/src/{memory → plugins/defaults/memory}/v2/constants.ts +0 -0
  1970. /package/src/{memory → plugins/defaults/memory}/v2/edge-index.ts +0 -0
  1971. /package/src/{memory → plugins/defaults/memory}/v2/harness/metrics.ts +0 -0
  1972. /package/src/{memory → plugins/defaults/memory}/v2/harness/runner.ts +0 -0
  1973. /package/src/{memory → plugins/defaults/memory}/v2/harness/trace.ts +0 -0
  1974. /package/src/{memory → plugins/defaults/memory}/v2/now-text.ts +0 -0
  1975. /package/src/{memory → plugins/defaults/memory}/v2/prompts/sweep.ts +0 -0
  1976. /package/src/{memory → plugins/defaults/memory}/v2/types.ts +0 -0
  1977. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/capabilities.test.ts +0 -0
  1978. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/card.test.ts +0 -0
  1979. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/fresh-set.test.ts +0 -0
  1980. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/section-needle.test.ts +0 -0
  1981. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/sections.test.ts +0 -0
  1982. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/types.test.ts +0 -0
  1983. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/card.test.ts +0 -0
  1984. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/core-set.test.ts +0 -0
  1985. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/core-set.ts +0 -0
  1986. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/README.md +0 -0
  1987. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/assignments.json +0 -0
  1988. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/core.json +0 -0
  1989. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/leaves/domain-a/topic-x.md +0 -0
  1990. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/leaves/domain-a/topic-y.md +0 -0
  1991. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/leaves/domain-b/topic-z.md +0 -0
  1992. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/fresh-set.ts +0 -0
  1993. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/llm-retry.ts +0 -0
  1994. /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/sections.ts +0 -0
  1995. /package/src/{memory → plugins/defaults/memory}/v3-eval/__tests__/eval-packets.test.ts +0 -0
  1996. /package/src/{memory → plugins/defaults/memory}/v3-eval/__tests__/eval-tally.test.ts +0 -0
  1997. /package/src/{memory → plugins/defaults/memory}/v3-eval/eval-tally.ts +0 -0
  1998. /package/src/{memory → plugins/defaults/memory}/validation.ts +0 -0
  1999. /package/src/plugins/defaults/{memory-retrieval → turn-context}/unified-turn-context.ts +0 -0
@@ -2,97 +2,72 @@ import { join } from "node:path";
2
2
 
3
3
  import { config as dotenvConfig } from "dotenv";
4
4
 
5
- import { refreshBackgroundWakeIntent } from "../background-wake/publisher.js";
6
- import { registerBackgroundWakeRuntime } from "../background-wake/runtime-registry.js";
7
5
  import { setPointerMessageProcessor } from "../calls/call-pointer-messages.js";
8
6
  import { reconcileCallsOnStartup } from "../calls/call-recovery.js";
9
7
  import { setRelayBroadcast } from "../calls/relay-server.js";
10
8
  import { TwilioConversationRelayProvider } from "../calls/twilio-provider.js";
11
9
  import { setVoiceBridgeDeps } from "../calls/voice-session-bridge.js";
12
10
  import { initFeatureFlagOverrides } from "../config/assistant-feature-flags.js";
13
- import {
14
- getPlatformAssistantId,
15
- getRuntimeHttpHost,
16
- getRuntimeHttpPort,
17
- setIngressPublicBaseUrl,
18
- validateEnv,
19
- } from "../config/env.js";
11
+ import { setIngressPublicBaseUrl, validateEnv } from "../config/env.js";
20
12
  import { loadConfig, mergeDefaultWorkspaceConfig } from "../config/loader.js";
21
- import type { AssistantConfig } from "../config/schema.js";
22
13
  import { seedInferenceProfiles } from "../config/seed-inference-profiles.js";
23
14
  import { reconcileFlagGatedProfiles } from "../config/sync-gated-profiles.js";
24
- import type { CesClient } from "../credential-execution/client.js";
25
- import { createCesClient } from "../credential-execution/client.js";
15
+ import { expireAllPendingCanonicalRequests } from "../contacts/canonical-guardian-store.js";
16
+ import { startCes } from "../credential-execution/ces-runtime.js";
26
17
  import { refreshManagedConnectionCache } from "../credential-execution/managed-catalog.js";
27
- import {
28
- type CesProcessManager,
29
- CesUnavailableError,
30
- createCesProcessManager,
31
- } from "../credential-execution/process-manager.js";
32
- import {
33
- awaitCesClientWithTimeout,
34
- DEFAULT_CES_STARTUP_TIMEOUT_MS,
35
- injectCesClientWhenReady,
36
- } from "../credential-execution/startup-timeout.js";
37
- import { FilingService } from "../filing/filing-service.js";
38
- import { HeartbeatService } from "../heartbeat/heartbeat-service.js";
18
+ import { startHeartbeatService } from "../heartbeat/heartbeat-service.js";
39
19
  import { backfillRelationshipStateIfMissing } from "../home/relationship-state-writer.js";
40
20
  import { closeSentry, initSentry, setSentryDeviceId } from "../instrument.js";
41
- import {
42
- startGatewayFlagListener,
43
- stopGatewayFlagListener,
44
- } from "../ipc/gateway-flag-listener.js";
45
- import { getMcpServerManager } from "../mcp/manager.js";
21
+ import { startCliIpcServer } from "../ipc/assistant-server.js";
22
+ import { startGatewayFlagListener } from "../ipc/gateway-flag-listener.js";
23
+ import { startSkillIpcServer } from "../ipc/skill-server.js";
24
+ import { registerMemoryJobHandlers } from "../jobs/register-job-handlers.js";
25
+ import { backfillManualTokenConnections } from "../oauth/manual-token-connection.js";
26
+ import { seedOAuthProviders } from "../oauth/seed-providers.js";
46
27
  import {
47
28
  getAttachmentsByIds,
48
29
  getSourcePathsForAttachments,
49
- } from "../memory/attachments-store.js";
50
- import { expireAllPendingCanonicalRequests } from "../memory/canonical-guardian-store.js";
51
- import { deleteMessageById, getMessages } from "../memory/conversation-crud.js";
52
- import { getDb } from "../memory/db-connection.js";
53
- import { initializeDb } from "../memory/db-init.js";
54
- import { selectEmbeddingBackend } from "../memory/embedding-backend.js";
55
- import { enqueueMemoryJob, isMemoryEnabled } from "../memory/jobs-store.js";
56
- import { startMemoryJobsWorker } from "../memory/jobs-worker.js";
57
- import { initQdrantClient, resolveQdrantUrl } from "../memory/qdrant-client.js";
58
- import { QdrantManager } from "../memory/qdrant-manager.js";
59
- import { rotateToolInvocations } from "../memory/tool-usage-store.js";
60
- import { sweepConceptPageFrontmatter } from "../memory/v2/frontmatter-sweep.js";
61
- import { emitNotificationSignal } from "../notifications/emit-signal.js";
62
- import { backfillManualTokenConnections } from "../oauth/manual-token-connection.js";
63
- import { seedOAuthProviders } from "../oauth/seed-providers.js";
30
+ } from "../persistence/attachments-store.js";
31
+ import {
32
+ clearStaleProcessingFlags,
33
+ deleteMessageById,
34
+ getMessages,
35
+ } from "../persistence/conversation-crud.js";
36
+ import { getDb } from "../persistence/db-connection.js";
37
+ import { initializeDb } from "../persistence/db-init.js";
38
+ import { selectEmbeddingBackend } from "../persistence/embeddings/embedding-backend.js";
39
+ import {
40
+ initQdrantClient,
41
+ resolveQdrantUrl,
42
+ } from "../persistence/embeddings/qdrant-client.js";
43
+ import { createQdrantManager } from "../persistence/embeddings/qdrant-manager.js";
44
+ import {
45
+ enqueueMemoryJob,
46
+ isMemoryEnabled,
47
+ } from "../persistence/jobs-store.js";
48
+ import { startMemoryJobsWorker } from "../persistence/jobs-worker.js";
64
49
  import {
65
50
  startConsentRefresh,
66
51
  stopConsentRefresh,
67
52
  } from "../platform/consent-cache.js";
53
+ import { syncWorkspaceIdentityToPlatform } from "../platform/sync-identity.js";
54
+ import { sweepConceptPageFrontmatter } from "../plugins/defaults/memory/v2/frontmatter-sweep.js";
68
55
  import { ensurePromptFiles } from "../prompts/system-prompt.js";
69
56
  import { runProviderConnectionsBackfill } from "../providers/inference/backfill.js";
70
- import { resolveManagedProxyContext } from "../providers/platform-proxy/context.js";
57
+ import { initializeProviders } from "../providers/registry.js";
71
58
  import { broadcastMessage } from "../runtime/assistant-event-hub.js";
72
59
  import {
73
60
  initAuthSigningKey,
74
61
  resolveSigningKey,
75
62
  } from "../runtime/auth/token-service.js";
76
- import { RuntimeHttpServer } from "../runtime/http-server.js";
63
+ import { startRuntimeHttpServer } from "../runtime/http-server.js";
77
64
  import { warmLocalGuardianPrincipalCache } from "../runtime/local-actor-identity.js";
78
65
  import { recoverInterruptedImport } from "../runtime/migrations/vbundle-streaming-importer.js";
79
- import { registerSecretsDeps } from "../runtime/routes/secrets-deps.js";
80
- import {
81
- publishConfigChanged,
82
- publishConversationListChanged,
83
- } from "../runtime/sync/resource-sync-events.js";
66
+ import { publishConfigChanged } from "../runtime/sync/resource-sync-events.js";
84
67
  import { recoverStaleSchedules } from "../schedule/schedule-recovery.js";
85
68
  import { startScheduler } from "../schedule/scheduler.js";
86
- import {
87
- getCesClient,
88
- onCesClientChanged,
89
- setCesClient,
90
- setCesReconnect,
91
- } from "../security/secure-keys.js";
92
- import {
93
- setUsageTelemetryReporter,
94
- UsageTelemetryReporter,
95
- } from "../telemetry/usage-telemetry-reporter.js";
69
+ import { rotateToolInvocations } from "../telemetry/tool-usage-store.js";
70
+ import { startUsageTelemetryReporter } from "../telemetry/usage-telemetry-reporter.js";
96
71
  import { syncFlagGatedTools } from "../tools/registry.js";
97
72
  import { registerBuiltinTtsProviders } from "../tts/providers/register-builtins.js";
98
73
  import { getDeviceId } from "../util/device-id.js";
@@ -109,23 +84,22 @@ import {
109
84
  } from "../work-items/work-item-store.js";
110
85
  import { getWorkflowRunManager } from "../workflows/run-manager.js";
111
86
  import { repairAdaptiveThinkingOnManagedProfiles } from "../workspace/adaptive-thinking-repair.js";
112
- import { WorkspaceHeartbeatService } from "../workspace/heartbeat-service.js";
87
+ import { startWorkspaceHeartbeatService } from "../workspace/heartbeat-service.js";
113
88
  import { WORKSPACE_MIGRATIONS } from "../workspace/migrations/registry.js";
114
89
  import { runWorkspaceMigrations } from "../workspace/migrations/runner.js";
115
- import {
116
- cleanupPidFile,
117
- cleanupPidFileIfOwner,
118
- writePid,
119
- } from "./daemon-control.js";
90
+ import { startAppSourceWatcher } from "./app-source-watcher.js";
91
+ import { startConfigWatcher } from "./config-watcher.js";
92
+ import { startConversationEvictor } from "./conversation-evictor.js";
93
+ import { getOrCreateConversation } from "./conversation-store.js";
94
+ import { writePid } from "./daemon-control.js";
95
+ import { setDbReady, setStartupComplete } from "./daemon-readiness.js";
120
96
  import {
121
97
  evaluateDiskPressureNow,
122
98
  startDiskPressureGuard,
123
99
  stopDiskPressureGuard,
124
100
  } from "./disk-pressure-guard.js";
125
- import {
126
- startEventLoopWatchdog,
127
- stopEventLoopWatchdog,
128
- } from "./event-loop-watchdog.js";
101
+ import { reconcileEmbeddingIdentity } from "./embedding-reconcile.js";
102
+ import { startEventLoopWatchdog } from "./event-loop-watchdog.js";
129
103
  import { initializePlugins } from "./external-plugins-bootstrap.js";
130
104
  import { backfillSlackInjectionTemplates } from "./handlers/config-slack-channel.js";
131
105
  import { installAssistantSymlink } from "./install-symlink.js";
@@ -133,7 +107,8 @@ import {
133
107
  maybeRebuildMemoryV2Concepts,
134
108
  rebuildBm25CorpusStatsAndReseedSkills,
135
109
  } from "./memory-v2-startup.js";
136
- import { startOrphanReaper, stopOrphanReaper } from "./orphan-reaper.js";
110
+ import { startOrphanReaper } from "./orphan-reaper.js";
111
+ import { elevatePointerConversationToGuardian } from "./pointer-conversation-trust.js";
137
112
  import { processMessage } from "./process-message.js";
138
113
  import { runProfilerSweep } from "./profiler-run-store.js";
139
114
  import {
@@ -141,10 +116,10 @@ import {
141
116
  registerMessagingProviders,
142
117
  registerWatcherProviders,
143
118
  } from "./providers-setup.js";
144
- import { DaemonServer } from "./server.js";
145
119
  import { installShutdownHandlers } from "./shutdown-handlers.js";
146
120
  import { registerShutdownHook } from "./shutdown-registry.js";
147
121
  import { refreshSkillCapabilityMemories } from "./skill-memory-refresh.js";
122
+ import { broadcastDaemonStatus } from "./status.js";
148
123
 
149
124
  const log = getLogger("lifecycle");
150
125
  let diskPressureStartupSampleTimer: ReturnType<typeof setTimeout> | null = null;
@@ -198,95 +173,6 @@ export function stopDiskPressureGuardForLifecycle(): void {
198
173
  stopDiskPressureGuard();
199
174
  }
200
175
 
201
- export interface CesStartupResult {
202
- client: CesClient | undefined;
203
- processManager: CesProcessManager | undefined;
204
- clientPromise: Promise<CesClient | undefined> | undefined;
205
- abortController: AbortController | undefined;
206
- }
207
-
208
- /**
209
- * Start the CES (Credential Execution Service) process and perform the RPC
210
- * handshake. Returns a promise that resolves with the CES client and process
211
- * manager. Callers can fire-and-forget — the daemon does not need to await
212
- * this for startup to continue.
213
- *
214
- * The managed sidecar accepts exactly one bootstrap connection, so this must
215
- * be called at the process level (not per-conversation).
216
- */
217
- async function startCesProcess(
218
- config: AssistantConfig,
219
- ): Promise<CesStartupResult> {
220
- const pm = createCesProcessManager({ assistantConfig: config });
221
- const abortController = new AbortController();
222
- let clientRef: CesClient | undefined;
223
-
224
- const clientPromise = (async (): Promise<CesClient | undefined> => {
225
- try {
226
- const transport = await pm.start();
227
- if (abortController.signal.aborted) {
228
- throw new Error("CES initialization aborted during shutdown");
229
- }
230
- const client = createCesClient(transport);
231
- clientRef = client;
232
- // Resolve the assistant API key so CES can use it for platform
233
- // credential materialisation. In managed mode the key is provisioned
234
- // after hatch and stored in the credential store — CES can't read
235
- // the env var, so we pass it via the handshake.
236
- const proxyCtx = await resolveManagedProxyContext();
237
- const assistantId = getPlatformAssistantId();
238
- const { accepted, reason } = await client.handshake({
239
- ...(proxyCtx.assistantApiKey
240
- ? { assistantApiKey: proxyCtx.assistantApiKey }
241
- : {}),
242
- ...(assistantId ? { assistantId } : {}),
243
- });
244
- if (abortController.signal.aborted) {
245
- client.close();
246
- throw new Error("CES initialization aborted during shutdown");
247
- }
248
- if (accepted) {
249
- log.info(
250
- "CES client initialized and handshake accepted (server-level)",
251
- );
252
- return client;
253
- }
254
- log.warn(
255
- { reason },
256
- "CES handshake rejected — CES tools will be unavailable",
257
- );
258
- client.close();
259
- clientRef = undefined;
260
- await pm.stop();
261
- return undefined;
262
- } catch (err) {
263
- if (err instanceof CesUnavailableError) {
264
- log.info(
265
- { reason: err.message },
266
- "CES is not available — CES tools will be unavailable",
267
- );
268
- } else {
269
- log.warn(
270
- { error: err instanceof Error ? err.message : String(err) },
271
- "Failed to initialize CES client — CES tools will be unavailable",
272
- );
273
- }
274
- await pm.stop().catch(() => {});
275
- clientRef = undefined;
276
- return undefined;
277
- }
278
- })();
279
-
280
- return {
281
- get client() {
282
- return clientRef;
283
- },
284
- processManager: pm,
285
- clientPromise,
286
- abortController,
287
- };
288
- }
289
-
290
176
  // Entry point for the daemon process itself
291
177
  export async function runDaemon(): Promise<void> {
292
178
  const startupStartedAt = Date.now();
@@ -297,1170 +183,966 @@ export async function runDaemon(): Promise<void> {
297
183
  validateEnv();
298
184
  log.info({ version: APP_VERSION }, "Daemon starting");
299
185
 
186
+ // Initialize crash reporting eagerly so the Sentry client is ready before
187
+ // early startup failures occur. Events are dropped (beforeSend) until the
188
+ // consent gate below confirms share_diagnostics opt-in; dev mode and the
189
+ // legacy local opt-out hard-disable via closeSentry().
190
+ initSentry();
191
+
192
+ ensureDataDir();
193
+
194
+ // Recover from any streaming `.vbundle` import that was interrupted by a
195
+ // crash or SIGKILL. If the previous process died between
196
+ // `carryOverPreservedPaths` and the atomic workspace swap, the live
197
+ // workspace may be missing `data/db` / `data/qdrant` / etc. The marker
198
+ // at `<workspaceDir>.import-marker.json` (persisted before any rename
199
+ // runs) tells us where the orphaned preserved paths landed; the
200
+ // recovery helper moves them back into the live workspace and cleans
201
+ // up the temp tree. Running this BEFORE `initializeDb()` ensures the
202
+ // DB singleton opens against the fully-restored `assistant.db`.
300
203
  try {
301
- // Initialize crash reporting eagerly so the Sentry client is ready before
302
- // early startup failures occur. Events are dropped (beforeSend) until the
303
- // consent gate below confirms share_diagnostics opt-in; dev mode and the
304
- // legacy local opt-out hard-disable via closeSentry().
305
- initSentry();
306
-
307
- ensureDataDir();
308
-
309
- // Recover from any streaming `.vbundle` import that was interrupted by a
310
- // crash or SIGKILL. If the previous process died between
311
- // `carryOverPreservedPaths` and the atomic workspace swap, the live
312
- // workspace may be missing `data/db` / `data/qdrant` / etc. The marker
313
- // at `<workspaceDir>.import-marker.json` (persisted before any rename
314
- // runs) tells us where the orphaned preserved paths landed; the
315
- // recovery helper moves them back into the live workspace and cleans
316
- // up the temp tree. Running this BEFORE `initializeDb()` ensures the
317
- // DB singleton opens against the fully-restored `assistant.db`.
318
- try {
319
- const recoveryResult = await recoverInterruptedImport(getWorkspaceDir());
320
- if (!recoveryResult.ok) {
321
- // Rollback is intentionally unresolved — backup/temp/marker are
322
- // preserved on disk so an operator (or a later retry) can finish
323
- // the recovery. Log loudly so ops sees it, but don't block start-up:
324
- // the daemon still needs to come up for diagnostics. The next
325
- // `streamCommitImport` will refuse to start a new import until the
326
- // marker is resolved.
327
- log.error(
328
- { failedCount: recoveryResult.failedCount },
329
- "Interrupted-import recovery is INCOMPLETE; leftover .pre-import-* / .import-* scratch dirs remain in the workspace. Manual intervention may be required before the next import can run.",
330
- );
331
- }
332
- } catch (err) {
333
- log.warn(
334
- { err },
335
- "recoverInterruptedImport threw during daemon startup; continuing",
204
+ const recoveryResult = await recoverInterruptedImport(getWorkspaceDir());
205
+ if (!recoveryResult.ok) {
206
+ // Rollback is intentionally unresolved backup/temp/marker are
207
+ // preserved on disk so an operator (or a later retry) can finish
208
+ // the recovery. Log loudly so ops sees it, but don't block start-up:
209
+ // the daemon still needs to come up for diagnostics. The next
210
+ // `streamCommitImport` will refuse to start a new import until the
211
+ // marker is resolved.
212
+ log.error(
213
+ { failedCount: recoveryResult.failedCount },
214
+ "Interrupted-import recovery is INCOMPLETE; leftover .pre-import-* / .import-* scratch dirs remain in the workspace. Manual intervention may be required before the next import can run.",
336
215
  );
337
216
  }
217
+ } catch (err) {
218
+ log.warn(
219
+ { err },
220
+ "recoverInterruptedImport threw during daemon startup; continuing",
221
+ );
222
+ }
338
223
 
339
- // Load (or generate + persist) the auth signing key so tokens survive
340
- // daemon restarts.
341
- const signingKey = resolveSigningKey();
342
- initAuthSigningKey(signingKey);
343
-
344
- // Start the runtime HTTP server early so /healthz answers ASAP.
345
- let runtimeHttp: RuntimeHttpServer | null = null;
346
- const httpPort = getRuntimeHttpPort();
347
- const httpHostname = getRuntimeHttpHost();
348
- log.info({ httpPort }, "Daemon startup: starting runtime HTTP server");
349
-
350
- runtimeHttp = new RuntimeHttpServer({
351
- port: httpPort,
352
- hostname: httpHostname,
353
- });
224
+ // Load (or generate + persist) the auth signing key so tokens survive
225
+ // daemon restarts.
226
+ const signingKey = resolveSigningKey();
227
+ initAuthSigningKey(signingKey);
228
+
229
+ // Start the runtime HTTP server early so /healthz answers ASAP. A bind
230
+ // failure is non-fatal the daemon falls back to IPC-only operation.
231
+ await startRuntimeHttpServer();
232
+
233
+ // Pre-populate feature flag overrides so subsequent sync
234
+ // isAssistantFeatureFlagEnabled() calls have data. Fired non-blocking
235
+ // so a slow or unreachable gateway doesn't delay daemon startup (the
236
+ // IPC call has a 3s connect + 5s call timeout that would otherwise
237
+ // stall the critical path).
238
+ // After the async fetch resolves, (re)register any flag-gated tools
239
+ // (`workflows`, `ces-tools`): `initializeTools()` runs during startup before
240
+ // this fetch completes, so without this follow-up sync a flag-enabled
241
+ // assistant would not expose the gated tools until a restart (which can lose
242
+ // the same race). Enable-direction only; chained so it sees the fresh cache.
243
+ // Then reconcile flag-gated managed profiles (OS Beta): `seedInferenceProfiles()`
244
+ // runs synchronously earlier in boot before flags are available, so this lands
245
+ // the profile on the same boot once the flag cache is populated. When this
246
+ // reconcile is the call that mutates config (it raced ahead of the gateway
247
+ // flag listener), publish the config invalidation so any client that already
248
+ // fetched `GET /v1/config` refreshes its profile picker.
249
+ // Profiles are reconciled only when flags actually loaded from the gateway:
250
+ // a failed fetch leaves the cache unset and resolves `os-beta` to its
251
+ // registry default `false`, which would remove the user's profile and reset
252
+ // their selection. Tool sync tolerates the default and stays unconditional.
253
+ void initFeatureFlagOverrides()
254
+ .then(async (loaded) => {
255
+ await syncFlagGatedTools();
256
+ if (loaded && reconcileFlagGatedProfiles()) {
257
+ publishConfigChanged();
258
+ }
259
+ })
260
+ .catch((err) => log.warn({ err }, "Background feature flag init failed"));
261
+
262
+ startGatewayFlagListener();
263
+
264
+ log.info("Daemon startup: initializing DB");
265
+ ensurePromptFiles();
266
+
267
+ // DB must be initialized before workspace migrations because some
268
+ // workspace migrations (e.g. 009-backfill-conversation-disk-view)
269
+ // depend on DB migrations having run (e.g. the inline-attachment-to-disk
270
+ // backfill that populates attachment filePaths).
271
+ //
272
+ // The daemon continues in a degraded state on either DB failure mode:
273
+ // (a) initializeDb() throws (e.g. the DB can't be opened), or (b) the DB
274
+ // opens but one or more migrations failed (initializeDb resolves with
275
+ // migrationsOk:false rather than throwing, per the daemon-never-blocks
276
+ // philosophy). In both cases DB-dependent features won't work, but the
277
+ // HTTP server and config-based subsystems still start so the process
278
+ // remains reachable for diagnostics. The trivial /healthz and detailed
279
+ // /v1/health(z) endpoints still answer 200, but setDbReady(true) runs only
280
+ // when migrations all applied, so the readiness latch stays unset and
281
+ // /readyz reports not-ready (503) for the rest of the process lifetime.
282
+ // That 503 is intentional: a DB-broken daemon should fail readiness so it
283
+ // is not routed user traffic.
284
+ //
285
+ // The local `dbReady` and the module-level readiness latch intentionally
286
+ // diverge on the migration-failure path: `dbReady` stays true to allow the
287
+ // downstream best-effort seeding / workspace migrations, while the latch
288
+ // stays unset to keep /readyz 503.
289
+ let dbReady = false;
290
+ try {
291
+ const { migrationsOk } = await initializeDb();
292
+ dbReady = true;
293
+ if (migrationsOk) {
294
+ setDbReady(true);
295
+ log.info("Daemon startup: DB initialized");
296
+ } else {
297
+ log.error(
298
+ "Daemon startup: DB opened but one or more migrations failed — /readyz will remain unready (degraded mode)",
299
+ );
300
+ }
301
+ } catch (err) {
302
+ log.error(
303
+ { err },
304
+ "DB initialization failed — continuing startup in degraded mode",
305
+ );
306
+ }
354
307
 
355
- // Isolated try/catch around start() a bind failure (port in use,
356
- // permission denied, fd exhaustion) must not tear down the rest of
357
- // daemon startup. The daemon falls back to IPC-only operation when
358
- // runtimeHttp is null.
308
+ // Seed well-known OAuth provider configurations (insert-if-not-exists).
309
+ // Runs in its own try/catch so a seeding error doesn't force degraded mode
310
+ // when the DB itself initialized successfully.
311
+ if (dbReady) {
359
312
  try {
360
- await runtimeHttp.start();
361
- log.info(
362
- { port: httpPort, hostname: httpHostname },
363
- "Daemon startup: runtime HTTP server listening",
364
- );
313
+ seedOAuthProviders();
365
314
  } catch (err) {
366
- log.warn(
367
- { err, port: httpPort },
368
- "Failed to start runtime HTTP server, continuing without it",
369
- );
370
- runtimeHttp = null;
315
+ log.warn({ err }, "OAuth provider seeding failed — continuing startup");
371
316
  }
317
+ }
372
318
 
373
- // Pre-populate feature flag overrides so subsequent sync
374
- // isAssistantFeatureFlagEnabled() calls have data. Fired non-blocking
375
- // so a slow or unreachable gateway doesn't delay daemon startup (the
376
- // IPC call has a 3s connect + 5s call timeout that would otherwise
377
- // stall the critical path).
378
- // After the async fetch resolves, (re)register any flag-gated tools
379
- // (`workflows`, `ces-tools`): `initializeTools()` runs during startup before
380
- // this fetch completes, so without this follow-up sync a flag-enabled
381
- // assistant would not expose the gated tools until a restart (which can lose
382
- // the same race). Enable-direction only; chained so it sees the fresh cache.
383
- // Then reconcile flag-gated managed profiles (OS Beta): `seedInferenceProfiles()`
384
- // runs synchronously earlier in boot before flags are available, so this lands
385
- // the profile on the same boot once the flag cache is populated. When this
386
- // reconcile is the call that mutates config (it raced ahead of the gateway
387
- // flag listener), publish the config invalidation so any client that already
388
- // fetched `GET /v1/config` refreshes its profile picker.
389
- // Profiles are reconciled only when flags actually loaded from the gateway:
390
- // a failed fetch leaves the cache unset and resolves `os-beta` to its
391
- // registry default `false`, which would remove the user's profile and reset
392
- // their selection. Tool sync tolerates the default and stays unconditional.
393
- void initFeatureFlagOverrides()
394
- .then(async (loaded) => {
395
- await syncFlagGatedTools();
396
- if (loaded && reconcileFlagGatedProfiles()) {
397
- publishConfigChanged();
398
- }
399
- })
400
- .catch((err) => log.warn({ err }, "Background feature flag init failed"));
401
-
402
- startGatewayFlagListener();
403
-
404
- log.info("Daemon startup: initializing DB");
405
- ensurePromptFiles();
319
+ if (dbReady) {
320
+ const migrationSummary = await runWorkspaceMigrations(
321
+ getWorkspaceDir(),
322
+ WORKSPACE_MIGRATIONS,
323
+ );
324
+ log.info(migrationSummary, "Daemon startup: workspace migrations complete");
406
325
 
407
- // DB must be initialized before workspace migrations because some
408
- // workspace migrations (e.g. 009-backfill-conversation-disk-view)
409
- // depend on DB migrations having run (e.g. the inline-attachment-to-disk
410
- // backfill that populates attachment filePaths).
411
- //
412
- // If DB initialization fails (e.g. a migration error), the daemon
413
- // continues in a degraded state — DB-dependent features won't work but
414
- // the HTTP server and config-based subsystems still start so the process
415
- // remains reachable for health checks and diagnostics.
416
- let dbReady = false;
326
+ // Seed canonical inference provider_connections and backfill any legacy
327
+ // profiles that pre-date the connection field. Runs after workspace
328
+ // migrations so migration 076 has already stripped services.inference.mode
329
+ // before backfill reads config. Idempotent — runs every boot so new
330
+ // canonicals propagate and manual config.json edits self-heal.
417
331
  try {
418
- await initializeDb();
419
- dbReady = true;
420
- log.info("Daemon startup: DB initialized");
332
+ runProviderConnectionsBackfill(getDb());
421
333
  } catch (err) {
422
- log.error(
334
+ log.warn(
423
335
  { err },
424
- "DB initialization failed — continuing startup in degraded mode",
336
+ "provider_connections backfill failed — continuing startup",
425
337
  );
426
338
  }
427
339
 
428
- // Seed well-known OAuth provider configurations (insert-if-not-exists).
429
- // Runs in its own try/catch so a seeding error doesn't force degraded mode
430
- // when the DB itself initialized successfully.
431
- if (dbReady) {
432
- try {
433
- seedOAuthProviders();
434
- } catch (err) {
435
- log.warn({ err }, "OAuth provider seeding failed — continuing startup");
340
+ // Profiler retention sweep prune completed profiler runs to stay
341
+ // within configured byte-count, run-count, and free-space budgets.
342
+ // Runs on every startup and is safe to call from explicit cleanup routes.
343
+ try {
344
+ const sweepResult = runProfilerSweep();
345
+ if (sweepResult.prunedCount > 0 || sweepResult.activeRunOverBudget) {
346
+ log.info(
347
+ {
348
+ prunedCount: sweepResult.prunedCount,
349
+ freedBytes: sweepResult.freedBytes,
350
+ activeRunOverBudget: sweepResult.activeRunOverBudget,
351
+ remainingRuns: sweepResult.remainingRuns,
352
+ },
353
+ "Profiler retention sweep completed on startup",
354
+ );
436
355
  }
356
+ } catch (err) {
357
+ log.warn({ err }, "Profiler retention sweep failed — continuing startup");
437
358
  }
438
359
 
439
- if (dbReady) {
440
- const migrationSummary = await runWorkspaceMigrations(
441
- getWorkspaceDir(),
442
- WORKSPACE_MIGRATIONS,
443
- );
444
- log.info(
445
- migrationSummary,
446
- "Daemon startup: workspace migrations complete",
360
+ // Backfill oauth_connection rows for manual-token providers (Telegram,
361
+ // Slack channel) that already have stored credentials from before the
362
+ // oauth_connection migration. Safe to call on every startup.
363
+ //
364
+ // Must run AFTER workspace migrations.
365
+ // Otherwise syncManualTokenConnection sees no stored credentials and
366
+ // incorrectly removes existing connection rows.
367
+ try {
368
+ await backfillManualTokenConnections();
369
+ } catch (err) {
370
+ log.warn(
371
+ { err },
372
+ "Manual-token connection backfill failed — continuing startup",
447
373
  );
374
+ }
448
375
 
449
- // Seed canonical inference provider_connections and backfill any legacy
450
- // profiles that pre-date the connection field. Runs after workspace
451
- // migrations so migration 076 has already stripped services.inference.mode
452
- // before backfill reads config. Idempotent runs every boot so new
453
- // canonicals propagate and manual config.json edits self-heal.
454
- try {
455
- runProviderConnectionsBackfill(getDb());
456
- } catch (err) {
457
- log.warn(
458
- { err },
459
- "provider_connections backfill failed continuing startup",
460
- );
461
- }
462
-
463
- // Profiler retention sweep — prune completed profiler runs to stay
464
- // within configured byte-count, run-count, and free-space budgets.
465
- // Runs on every startup and is safe to call from explicit cleanup routes.
466
- try {
467
- const sweepResult = runProfilerSweep();
468
- if (sweepResult.prunedCount > 0 || sweepResult.activeRunOverBudget) {
469
- log.info(
470
- {
471
- prunedCount: sweepResult.prunedCount,
472
- freedBytes: sweepResult.freedBytes,
473
- activeRunOverBudget: sweepResult.activeRunOverBudget,
474
- remainingRuns: sweepResult.remainingRuns,
475
- },
476
- "Profiler retention sweep completed on startup",
477
- );
478
- }
479
- } catch (err) {
480
- log.warn(
481
- { err },
482
- "Profiler retention sweep failed — continuing startup",
483
- );
484
- }
485
-
486
- // Backfill oauth_connection rows for manual-token providers (Telegram,
487
- // Slack channel) that already have stored credentials from before the
488
- // oauth_connection migration. Safe to call on every startup.
489
- //
490
- // Must run AFTER workspace migrations.
491
- // Otherwise syncManualTokenConnection sees no stored credentials and
492
- // incorrectly removes existing connection rows.
493
- try {
494
- await backfillManualTokenConnections();
495
- } catch (err) {
376
+ // One-time backfill of `relationship-state.json` for existing or
377
+ // upgraded users so they don't land on an empty Home page after the
378
+ // Phase 3 ship. Runs after DB init + workspace migrations so the
379
+ // writer can actually resolve the guardian persona file and list
380
+ // connected OAuth providers firing this from `ensurePromptFiles()`
381
+ // would be too early (DB isn't ready yet) and produce a degraded
382
+ // snapshot with zero facts and zero unlocked capabilities.
383
+ //
384
+ // Deferred via `setImmediate` so any sync filesystem/DB work the
385
+ // writer does (`readdirSync`, `readFileSync`, contact + provider
386
+ // lookups) happens on a later tick, off the startup critical path.
387
+ // Failures are logged — not silenced — to match the pattern used by
388
+ // other `void … .catch()` fire-and-forgets in this file and the
389
+ // assistant/CLAUDE.md rule that all errors must be observable.
390
+ setImmediate(() => {
391
+ void backfillRelationshipStateIfMissing().catch((err) =>
496
392
  log.warn(
497
393
  { err },
498
- "Manual-token connection backfill failed — continuing startup",
499
- );
500
- }
394
+ "Relationship state backfill failed — continuing startup",
395
+ ),
396
+ );
397
+ });
501
398
 
502
- // One-time backfill of `relationship-state.json` for existing or
503
- // upgraded users so they don't land on an empty Home page after the
504
- // Phase 3 ship. Runs after DB init + workspace migrations so the
505
- // writer can actually resolve the guardian persona file and list
506
- // connected OAuth providers — firing this from `ensurePromptFiles()`
507
- // would be too early (DB isn't ready yet) and produce a degraded
508
- // snapshot with zero facts and zero unlocked capabilities.
509
- //
510
- // Deferred via `setImmediate` so any sync filesystem/DB work the
511
- // writer does (`readdirSync`, `readFileSync`, contact + provider
512
- // lookups) happens on a later tick, off the startup critical path.
513
- // Failures are logged — not silenced — to match the pattern used by
514
- // other `void … .catch()` fire-and-forgets in this file and the
515
- // assistant/CLAUDE.md rule that all errors must be observable.
516
- setImmediate(() => {
517
- void backfillRelationshipStateIfMissing().catch((err) =>
518
- log.warn(
519
- { err },
520
- "Relationship state backfill failed — continuing startup",
521
- ),
522
- );
523
- });
399
+ // Backfill injection templates on Slack bot token credentials so the
400
+ // credential proxy can inject Authorization headers. Safe on every startup.
401
+ try {
402
+ backfillSlackInjectionTemplates();
403
+ } catch (err) {
404
+ log.warn(
405
+ { err },
406
+ "Slack injection template backfill failed — continuing startup",
407
+ );
408
+ }
524
409
 
525
- // Backfill injection templates on Slack bot token credentials so the
526
- // credential proxy can inject Authorization headers. Safe on every startup.
527
- try {
528
- backfillSlackInjectionTemplates();
529
- } catch (err) {
530
- log.warn(
531
- { err },
532
- "Slack injection template backfill failed — continuing startup",
533
- );
534
- }
410
+ // Now that workspace migrations have run (including 003-seed-device-id
411
+ // which may copy the legacy installationId into device.json), it is safe
412
+ // to read the device ID and set the Sentry tag.
413
+ setSentryDeviceId(getDeviceId());
535
414
 
536
- // Now that workspace migrations have run (including 003-seed-device-id
537
- // which may copy the legacy installationId into device.json), it is safe
538
- // to read the device ID and set the Sentry tag.
539
- setSentryDeviceId(getDeviceId());
540
-
541
- // Expire stale pending canonical guardian requests left over from before
542
- // this process started. Two categories are cleaned up:
543
- //
544
- // 1. Interaction-bound kinds (tool_approval, pending_question) their
545
- // in-memory pending-interaction session references are gone, so they
546
- // can never be completed.
547
- // 2. Any pending request whose expiresAt has already passed — persistent
548
- // kinds (access_request, tool_grant_request) that expired while the
549
- // daemon was stopped are transitioned so dedup logic doesn't return
550
- // stale rows.
551
- const expiredCount = expireAllPendingCanonicalRequests();
552
- if (expiredCount > 0) {
553
- log.info(
554
- { event: "startup_expired_stale_requests", expiredCount },
555
- `Expired ${expiredCount} stale canonical request(s) from previous process`,
556
- );
557
- }
415
+ // Expire stale pending canonical guardian requests left over from before
416
+ // this process started. Two categories are cleaned up:
417
+ //
418
+ // 1. Interaction-bound kinds (tool_approval, pending_question) — their
419
+ // in-memory pending-interaction session references are gone, so they
420
+ // can never be completed.
421
+ // 2. Any pending request whose expiresAt has already passed — persistent
422
+ // kinds (access_request, tool_grant_request) that expired while the
423
+ // daemon was stopped are transitioned so dedup logic doesn't return
424
+ // stale rows.
425
+ const expiredCount = expireAllPendingCanonicalRequests();
426
+ if (expiredCount > 0) {
427
+ log.info(
428
+ { event: "startup_expired_stale_requests", expiredCount },
429
+ `Expired ${expiredCount} stale canonical request(s) from previous process`,
430
+ );
431
+ }
558
432
 
559
- // Recover orphaned work items that were left in 'running' state when the
560
- // daemon previously crashed or was killed mid-task.
561
- const orphanedRunning = listWorkItems({ status: "running" });
562
- if (orphanedRunning.length > 0) {
563
- for (const item of orphanedRunning) {
564
- updateWorkItem(item.id, {
565
- status: "failed",
566
- lastRunStatus: "interrupted",
567
- });
568
- log.info(
569
- { workItemId: item.id, title: item.title },
570
- "Recovered orphaned running work item → failed (interrupted)",
571
- );
572
- }
433
+ // Recover orphaned work items that were left in 'running' state when the
434
+ // daemon previously crashed or was killed mid-task.
435
+ const orphanedRunning = listWorkItems({ status: "running" });
436
+ if (orphanedRunning.length > 0) {
437
+ for (const item of orphanedRunning) {
438
+ updateWorkItem(item.id, {
439
+ status: "failed",
440
+ lastRunStatus: "interrupted",
441
+ });
573
442
  log.info(
574
- { count: orphanedRunning.length },
575
- "Recovered orphaned running work items",
443
+ { workItemId: item.id, title: item.title },
444
+ "Recovered orphaned running work item → failed (interrupted)",
576
445
  );
577
446
  }
447
+ log.info(
448
+ { count: orphanedRunning.length },
449
+ "Recovered orphaned running work items",
450
+ );
451
+ }
578
452
 
579
- try {
580
- const twilioProvider = new TwilioConversationRelayProvider();
581
- await reconcileCallsOnStartup(twilioProvider, log);
582
- } catch (err) {
583
- log.warn({ err }, "Call recovery failed — continuing startup");
584
- }
585
- } // end if (dbReady)
586
-
587
- // Populate the managed-connection cache so the `14-connected-services`
588
- // bundled section (rendered by `renderConnectedServices()` in
589
- // system-sections.ts) can include platform-managed OAuth connections
590
- // (e.g. Twitter) in the system prompt from the first turn. This is
591
- // an HTTP-only call with no DB dependency, so it runs regardless of
592
- // dbReady. A periodic refresh keeps the cache current when users
593
- // connect/disconnect managed providers while the assistant is running.
453
+ try {
454
+ const twilioProvider = new TwilioConversationRelayProvider();
455
+ await reconcileCallsOnStartup(twilioProvider, log);
456
+ } catch (err) {
457
+ log.warn({ err }, "Call recovery failed — continuing startup");
458
+ }
459
+ } // end if (dbReady)
460
+
461
+ // Populate the managed-connection cache so the `14-connected-services`
462
+ // bundled section (rendered by `renderConnectedServices()` in
463
+ // system-sections.ts) can include platform-managed OAuth connections
464
+ // (e.g. Twitter) in the system prompt from the first turn. This is
465
+ // an HTTP-only call with no DB dependency, so it runs regardless of
466
+ // dbReady. A periodic refresh keeps the cache current when users
467
+ // connect/disconnect managed providers while the assistant is running.
468
+ void refreshManagedConnectionCache().catch((err) =>
469
+ log.warn(
470
+ { err },
471
+ "Managed connection cache refresh failed — continuing startup",
472
+ ),
473
+ );
474
+ const MANAGED_CONNECTION_REFRESH_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
475
+ setInterval(() => {
594
476
  void refreshManagedConnectionCache().catch((err) =>
595
- log.warn(
596
- { err },
597
- "Managed connection cache refresh failed — continuing startup",
598
- ),
477
+ log.warn({ err }, "Periodic managed connection cache refresh failed"),
599
478
  );
600
- const MANAGED_CONNECTION_REFRESH_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
601
- setInterval(() => {
602
- void refreshManagedConnectionCache().catch((err) =>
603
- log.warn({ err }, "Periodic managed connection cache refresh failed"),
604
- );
605
- }, MANAGED_CONNECTION_REFRESH_INTERVAL_MS);
606
-
607
- // Merge CLI-provided default config (from VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH)
608
- // into the workspace config file before profile seeding and the first
609
- // loadConfig() call so onboarding/platform preferences are visible to the
610
- // seeder and persisted alongside schema defaults.
611
- const defaultConfigMerge = mergeDefaultWorkspaceConfig();
612
-
613
- // Seed inference profiles into the workspace config. Managed Anthropic
614
- // profiles are overwritten on every boot so Vellum can push updates.
615
- // Off-platform hatches additionally create user profiles + a personal
616
- // provider connection for the hatch provider.
479
+ }, MANAGED_CONNECTION_REFRESH_INTERVAL_MS);
480
+
481
+ // Merge CLI-provided default config (from VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH)
482
+ // into the workspace config file before profile seeding and the first
483
+ // loadConfig() call so onboarding/platform preferences are visible to the
484
+ // seeder and persisted alongside schema defaults.
485
+ const defaultConfigMerge = mergeDefaultWorkspaceConfig();
486
+
487
+ // Seed inference profiles into the workspace config. Managed Anthropic
488
+ // profiles are overwritten on every boot so Vellum can push updates.
489
+ // Off-platform hatches additionally create user profiles + a personal
490
+ // provider connection for the hatch provider.
491
+ try {
492
+ seedInferenceProfiles({
493
+ preserveProfileNames: defaultConfigMerge.providedLlmProfileNames,
494
+ preserveActiveProfile: defaultConfigMerge.providedLlmActiveProfile,
495
+ isHatch: defaultConfigMerge.hadOverlay,
496
+ db: dbReady ? getDb() : undefined,
497
+ });
498
+ log.info("Inference profile seeding complete");
499
+ } catch (err) {
500
+ log.warn({ err }, "Inference profile seeding failed — continuing startup");
501
+ }
502
+
503
+ // Re-run the adaptive thinking repair after overlay merge + profile seeding.
504
+ // Workspace migration 097 enables adaptive thinking on managed profiles, but
505
+ // it runs before mergeDefaultWorkspaceConfig() which can overwrite the fix
506
+ // with overlay profiles that have thinking disabled or absent. On-platform
507
+ // instances where the overlay supplies "balanced" / "quality-optimized"
508
+ // profiles without thinking enabled would be stuck permanently because the
509
+ // migration is already checkpointed as completed. This idempotent repair
510
+ // ensures thinking is enabled regardless of overlay ordering.
511
+ if (defaultConfigMerge.hadOverlay) {
617
512
  try {
618
- seedInferenceProfiles({
619
- preserveProfileNames: defaultConfigMerge.providedLlmProfileNames,
620
- preserveActiveProfile: defaultConfigMerge.providedLlmActiveProfile,
621
- isHatch: defaultConfigMerge.hadOverlay,
622
- db: dbReady ? getDb() : undefined,
623
- });
624
- log.info("Inference profile seeding complete");
513
+ repairAdaptiveThinkingOnManagedProfiles(getWorkspaceDir());
514
+ log.info("Post-overlay adaptive thinking repair complete");
625
515
  } catch (err) {
626
516
  log.warn(
627
517
  { err },
628
- "Inference profile seeding failed — continuing startup",
518
+ "Post-overlay adaptive thinking repair failed — continuing startup",
629
519
  );
630
520
  }
521
+ }
522
+
523
+ log.info("Daemon startup: loading config");
524
+ const config = loadConfig();
631
525
 
632
- // Re-run the adaptive thinking repair after overlay merge + profile seeding.
633
- // Workspace migration 097 enables adaptive thinking on managed profiles, but
634
- // it runs before mergeDefaultWorkspaceConfig() which can overwrite the fix
635
- // with overlay profiles that have thinking disabled or absent. On-platform
636
- // instances where the overlay supplies "balanced" / "quality-optimized"
637
- // profiles without thinking enabled would be stuck permanently because the
638
- // migration is already checkpointed as completed. This idempotent repair
639
- // ensures thinking is enabled regardless of overlay ordering.
640
- if (defaultConfigMerge.hadOverlay) {
526
+ // Reconcile conversations left mid-turn by the previous shutdown. Their
527
+ // `processing_started_at` is still set even though the in-memory agent loop
528
+ // that owned the turn is gone.
529
+ if (dbReady) {
530
+ if (config.conversations.resumeProcessingOnStartup) {
531
+ // TODO: automatically resume the interrupted turn for each conversation
532
+ // whose processing flag is still set instead of clearing it.
533
+ } else {
641
534
  try {
642
- repairAdaptiveThinkingOnManagedProfiles(getWorkspaceDir());
643
- log.info("Post-overlay adaptive thinking repair complete");
535
+ const cleared = clearStaleProcessingFlags();
536
+ if (cleared > 0) {
537
+ log.info(
538
+ { count: cleared },
539
+ "Cleared stale conversation processing flags from previous process",
540
+ );
541
+ }
644
542
  } catch (err) {
645
543
  log.warn(
646
544
  { err },
647
- "Post-overlay adaptive thinking repair failed — continuing startup",
545
+ "Failed to clear stale conversation processing flags — continuing startup",
648
546
  );
649
547
  }
650
548
  }
549
+ }
651
550
 
652
- log.info("Daemon startup: loading config");
653
- const config = loadConfig();
654
-
655
- // Seed module-level ingress state from the workspace config so that
656
- // getIngressPublicBaseUrl() returns the correct value immediately after
657
- // startup (before any handleIngressConfig("set") call). Without this,
658
- // code paths that read the module-level state directly (e.g. session-slash
659
- // pairing info) would see undefined until an explicit set.
660
- if (config.ingress.enabled && config.ingress.publicBaseUrl) {
661
- setIngressPublicBaseUrl(config.ingress.publicBaseUrl);
662
- log.info(
663
- { url: config.ingress.publicBaseUrl },
664
- "Daemon startup: seeded ingress URL from workspace config",
665
- );
666
- }
667
-
668
- if (config.logFile.dir) {
669
- initLogger({
670
- dir: config.logFile.dir,
671
- retentionDays: config.logFile.retentionDays,
672
- });
673
- }
551
+ // Seed module-level ingress state from the workspace config so that
552
+ // getIngressPublicBaseUrl() returns the correct value immediately after
553
+ // startup (before any handleIngressConfig("set") call). Without this,
554
+ // code paths that read the module-level state directly (e.g. session-slash
555
+ // pairing info) would see undefined until an explicit set.
556
+ if (config.ingress.enabled && config.ingress.publicBaseUrl) {
557
+ setIngressPublicBaseUrl(config.ingress.publicBaseUrl);
558
+ log.info(
559
+ { url: config.ingress.publicBaseUrl },
560
+ "Daemon startup: seeded ingress URL from workspace config",
561
+ );
562
+ }
674
563
 
675
- // Privacy gating: Sentry crash/error reporting follows the platform owner's
676
- // share_diagnostics consent; the usage telemetry reporter re-checks
677
- // share_analytics on every flush. Both are disabled in dev mode. Sentry was
678
- // initialized early, but beforeSend re-reads getCachedShareDiagnostics() on
679
- // every event, so it drops events until consent confirms opt-in and honors a
680
- // later revocation within one refresh cycle (the cache is refreshed by
681
- // startConsentRefresh() below, mirroring the share_analytics posture).
682
- const isDevMode = process.env.VELLUM_DEV === "1";
683
- if (isDevMode || config.legacyDiagnosticsOptOut === true) {
684
- // Dev mode and a preserved legacy local opt-out both disable Sentry
685
- // unconditionally, without waiting on platform consent.
686
- await closeSentry();
687
- }
564
+ if (config.logFile.dir) {
565
+ initLogger({
566
+ dir: config.logFile.dir,
567
+ retentionDays: config.logFile.retentionDays,
568
+ });
569
+ }
688
570
 
689
- // Construct and start the reporter even when usage collection is disabled:
690
- // flush() re-checks the platform share_analytics consent each cycle and,
691
- // when opted out, sends nothing but advances all watermarks (including the
692
- // final flush in stop()). New opted-out tool_invocations rows are already
693
- // unreportable by construction the audit listener persists NULL telemetry
694
- // columns for them, which the tool_executed projection filters out so the
695
- // opted-out
696
- // flushes are defense in depth there (covering rows recorded under builds
697
- // that predate that write-time gate) and remain the primary guard for the
698
- // always-on tables without a write-time gate (llm_usage, turn events).
699
- // Deliberately NOT gated on dbReady: getDb()
700
- // can still work when initializeDb() failed mid-migration, in which case
701
- // the audit listener keeps writing rows that the opt-out branch must keep
702
- // covered. The reporter is degraded-mode safe — its constructor and
703
- // flush() treat DB errors as non-fatal.
704
- let telemetryReporter: UsageTelemetryReporter | null = null;
705
- if (!isDevMode) {
706
- telemetryReporter = new UsageTelemetryReporter();
707
- setUsageTelemetryReporter(telemetryReporter);
708
- telemetryReporter.start();
709
- log.info("Usage telemetry reporter started");
710
- }
571
+ // Privacy gating: Sentry crash/error reporting follows the platform owner's
572
+ // share_diagnostics consent; the usage telemetry reporter re-checks
573
+ // share_analytics on every flush. Both are disabled in dev mode. Sentry was
574
+ // initialized early, but beforeSend re-reads getCachedShareDiagnostics() on
575
+ // every event, so it drops events until consent confirms opt-in and honors a
576
+ // later revocation within one refresh cycle (the cache is refreshed by
577
+ // startConsentRefresh() below, mirroring the share_analytics posture).
578
+ const isDevMode = process.env.VELLUM_DEV === "1";
579
+ if (isDevMode || config.legacyDiagnosticsOptOut === true) {
580
+ // Dev mode and a preserved legacy local opt-out both disable Sentry
581
+ // unconditionally, without waiting on platform consent.
582
+ await closeSentry();
583
+ }
711
584
 
712
- // Refresh the consent cache regardless of dev mode so record-time telemetry
713
- // writes (gated on getCachedShareAnalytics()) work in dev too. The reporter
714
- // flush stays dev-gated above, so dev still never sends telemetry to the
715
- // platform. Fire-and-forget: startConsentRefresh() runs an immediate
716
- // non-blocking refresh, so the startup hot path is never blocked.
717
- startConsentRefresh();
718
- registerShutdownHook("consent-cache", () => stopConsentRefresh());
719
-
720
- // CES lifecycle kick off early so CES handshake runs concurrently with
721
- // provider/tool initialization. The CES sidecar accepts exactly one
722
- // bootstrap connection, so startup must happen at the process level.
723
- const cesStartupPromise = startCesProcess(config);
724
-
725
- // CES startup must complete BEFORE provider initialization so credential
726
- // reads can go through CES. Block with a 20-second timeout — fall back to
727
- // direct credential store on timeout.
728
- const cesResult = await cesStartupPromise;
729
- // startCesProcess() returns immediately the actual handshake runs
730
- // inside clientPromise. Await it (with a 20s timeout) so the CES client
731
- // is available before provider initialization.
732
- if (cesResult.clientPromise) {
733
- const client = await awaitCesClientWithTimeout(cesResult.clientPromise, {
734
- timeoutMs: DEFAULT_CES_STARTUP_TIMEOUT_MS,
735
- onTimeout: () => {
585
+ // Refresh the consent cache regardless of dev mode so record-time telemetry
586
+ // writes (gated on getCachedShareAnalytics()) work in dev too. The reporter
587
+ // flush stays dev-gated above, so dev still never sends telemetry to the
588
+ // platform. Fire-and-forget: startConsentRefresh() runs an immediate
589
+ // non-blocking refresh, so the startup hot path is never blocked.
590
+ startConsentRefresh();
591
+ registerShutdownHook("consent-cache", () => stopConsentRefresh());
592
+
593
+ // Bring up the daemon's CES connection (process + handshake + reconnect
594
+ // wiring). Blocks up to a 20s timeout so credential reads route through CES
595
+ // before provider init; non-fatal falls back to the direct credential store
596
+ // on failure. The sidecar accepts exactly one bootstrap connection, so this
597
+ // happens at the process level.
598
+ await startCes(config);
599
+
600
+ // Bring up the plugin layer: install the runtime bridge, register the
601
+ // first-party defaults, load user plugins, and run every plugin's
602
+ // `init()`. Ordering is load-bearing (defaults register ahead of user
603
+ // plugins so they compose innermost) and plugin failures are contained so
604
+ // they can't block daemon startup.
605
+ await initializePlugins();
606
+
607
+ // Initialize providers before Qdrant so HTTP routes can begin accepting
608
+ // requests while Qdrant initializes, then best-effort sync the workspace
609
+ // identity name to the platform record.
610
+ await initializeProviders(config);
611
+ syncWorkspaceIdentityToPlatform();
612
+
613
+ // Start the idle/LRU/memory-pressure sweep over the in-memory conversation
614
+ // pool.
615
+ startConversationEvictor();
616
+
617
+ // Watch workspace files (config, prompts, skills, sounds, avatar) and react
618
+ // to changes: evict conversations so the next turn rebuilds against the new
619
+ // config, and broadcast the relevant resource-changed events to clients.
620
+ startConfigWatcher();
621
+
622
+ // Watch app source directories so edits recompile + refresh surfaces across
623
+ // all conversations.
624
+ startAppSourceWatcher();
625
+
626
+ // Start the CLI IPC server. Throws on EADDRINUSE to abort startup when another
627
+ // daemon already holds the socket, so this process never runs background jobs
628
+ // against the shared database as an unmanageable duplicate.
629
+ await startCliIpcServer();
630
+
631
+ // Start the skill IPC server so first-party skill processes can connect for
632
+ // host capabilities. The meet-host supervisor reads the live server from the
633
+ // skill-server singleton at dispatch time.
634
+ await startSkillIpcServer();
635
+
636
+ // Warm the gateway guardian-delivery cache so the SSE eager-subscribe path
637
+ // (sync, IO-free) resolves the local actor principal on the FIRST client
638
+ // registration. Without this, a cold cache regresses host-proxy same-user
639
+ // targeting until a later reconnect. Non-blocking: failures aren't cached
640
+ // and the async hot paths re-warm on their next read.
641
+ void warmLocalGuardianPrincipalCache().catch((err) =>
642
+ log.warn({ err }, "Guardian principal cache warm failed — continuing"),
643
+ );
644
+
645
+ startUsageTelemetryReporter();
646
+ startDiskPressureGuardForLifecycle();
647
+ startOrphanReaper();
648
+ startEventLoopWatchdog();
649
+
650
+ // Initialize Qdrant vector store and memory worker in the background so the
651
+ // RuntimeHttpServer can start accepting requests without waiting for Qdrant.
652
+ async function initializeQdrantAndMemory(): Promise<void> {
653
+ const qdrantUrl = resolveQdrantUrl(config);
654
+ log.info({ qdrantUrl }, "Daemon startup: initializing Qdrant");
655
+ const manager = createQdrantManager({ url: qdrantUrl });
656
+ const QDRANT_START_MAX_ATTEMPTS = 3;
657
+ let qdrantStarted = false;
658
+ for (let attempt = 1; attempt <= QDRANT_START_MAX_ATTEMPTS; attempt++) {
659
+ try {
660
+ await manager.start();
661
+ qdrantStarted = true;
662
+ break;
663
+ } catch (err) {
664
+ if (attempt < QDRANT_START_MAX_ATTEMPTS) {
665
+ const backoffMs = attempt * 5_000; // 5s, 10s
736
666
  log.warn(
737
- "CES handshake timed out after 20s — falling back to direct credential store",
667
+ {
668
+ err,
669
+ attempt,
670
+ maxAttempts: QDRANT_START_MAX_ATTEMPTS,
671
+ backoffMs,
672
+ },
673
+ "Qdrant startup failed, retrying",
738
674
  );
739
- },
740
- });
741
- if (client) {
742
- setCesClient(client);
743
- } else {
744
- // The handshake lost the startup race, so provider init proceeds on
745
- // the direct credential store. Still inject the CES client into the
746
- // resolver once the handshake completes, so CES tools and the
747
- // approval bridge route through CES rather than reporting it
748
- // unavailable for the rest of the process.
749
- injectCesClientWhenReady(cesResult.clientPromise, {
750
- getCesClient,
751
- setCesClient,
752
- });
675
+ await Bun.sleep(backoffMs);
676
+ } else {
677
+ log.warn(
678
+ { err },
679
+ "Qdrant failed to start after all attempts — memory features will be unavailable",
680
+ );
681
+ }
753
682
  }
754
683
  }
755
684
 
756
- // Register CES reconnection callback so the credential layer can
757
- // re-establish the connection when the transport dies, instead of
758
- // falling back to the encrypted file store.
759
- if (cesResult.processManager) {
760
- const pm = cesResult.processManager;
761
-
762
- // Snapshot the managed-proxy context and assistant ID at CES startup
763
- // so the reconnect closure below never calls back into
764
- // `resolveManagedProxyContext()`. That function reads the assistant
765
- // API key via `getSecureKeyAsync()`, which — once `setCesClient()`
766
- // has resolved the backend to CES RPC — routes the read through CES
767
- // itself. During a reconnect the old transport is dead and a new
768
- // one is being set up by this very closure, so the nested credential
769
- // read recursively awaits its own in-flight reconnection and
770
- // deadlocks until `CREDENTIAL_OP_TIMEOUT_MS` (45s) fires. That
771
- // 45-second stall delays every CES restart and causes dependent
772
- // credential reads (e.g. Meet's STT provider resolution) to return
773
- // `undefined` during the window. API key rotation uses the
774
- // `updateAssistantApiKey` RPC on the live client, not a reconnect,
775
- // so caching at startup is safe.
776
- const startupProxyCtx = await resolveManagedProxyContext();
777
- const startupAssistantId = getPlatformAssistantId();
778
-
779
- setCesReconnect(async () => {
685
+ if (qdrantStarted) {
686
+ // Skip the v1 Qdrant collection lifecycle when memory v2 is active
687
+ // the v1 collection has no writers (handleRemember returns early) or
688
+ // readers (graph search is bypassed) under v2, so ensuring/migrating
689
+ // it just maintains a dead-on-arrival collection. Existing on-disk
690
+ // collections are left intact so flipping v2 off restores v1 cleanly.
691
+ if (!config.memory.v2.enabled) {
780
692
  try {
781
- await pm.stop();
782
- const transport = await pm.start();
783
- const newClient = createCesClient(transport);
784
- const { accepted, reason } = await newClient.handshake({
785
- ...(startupProxyCtx.assistantApiKey
786
- ? { assistantApiKey: startupProxyCtx.assistantApiKey }
787
- : {}),
788
- ...(startupAssistantId ? { assistantId: startupAssistantId } : {}),
693
+ const embeddingSelection = await selectEmbeddingBackend(config);
694
+ // Sentinel only encodes the dense provider+model identity; sparse
695
+ // encoder changes never require collection recreation, so they
696
+ // intentionally do not contribute to the v1 collection identity.
697
+ const embeddingModel = embeddingSelection.backend
698
+ ? `${embeddingSelection.backend.provider}:${embeddingSelection.backend.model}`
699
+ : undefined;
700
+ const qdrantClient = initQdrantClient({
701
+ url: qdrantUrl,
702
+ collection: config.memory.qdrant.collection,
703
+ vectorSize: config.memory.qdrant.vectorSize,
704
+ onDisk: config.memory.qdrant.onDisk,
705
+ quantization: config.memory.qdrant.quantization,
706
+ embeddingModel,
789
707
  });
790
- if (accepted) {
791
- log.info("CES reconnection handshake accepted");
792
- return newClient;
708
+
709
+ // Eagerly ensure the collection exists so we detect migrations
710
+ // (unnamed→named vectors, dimension/model changes) at startup.
711
+ // If a destructive migration occurred, enqueue a rebuild_index job
712
+ // to re-embed all memory items from the SQLite cache.
713
+ const { migrated } = await qdrantClient.ensureCollection();
714
+ if (migrated && isMemoryEnabled()) {
715
+ enqueueMemoryJob("rebuild_index", {});
716
+ log.info(
717
+ "Qdrant collection was migrated — enqueued rebuild_index job",
718
+ );
793
719
  }
794
- log.warn({ reason }, "CES reconnection handshake rejected");
795
- newClient.close();
796
- await pm.stop().catch(() => {});
797
- return undefined;
720
+
721
+ log.info("Qdrant vector store initialized");
798
722
  } catch (err) {
799
723
  log.warn(
800
- { error: err instanceof Error ? err.message : String(err) },
801
- "CES reconnection attempt failed",
724
+ { err },
725
+ "Qdrant client initialization failed — memory features will be degraded",
802
726
  );
803
- await pm.stop().catch(() => {});
804
- return undefined;
805
727
  }
806
- });
807
- }
728
+ }
808
729
 
809
- // Bring up the plugin layer: install the runtime bridge, register the
810
- // first-party defaults, load user plugins, and run every plugin's
811
- // `init()`. Ordering is load-bearing (defaults register ahead of user
812
- // plugins so they compose innermost) and plugin failures are contained so
813
- // they can't block daemon startup.
814
- await initializePlugins();
815
-
816
- // Start the DaemonServer (conversation manager) before Qdrant so HTTP
817
- // routes can begin accepting requests while Qdrant initializes.
818
- log.info("Daemon startup: starting DaemonServer");
819
- const server = new DaemonServer();
820
- server.setCes(await cesStartupPromise);
821
-
822
- // Keep the server's CES client ref in sync after reconnection so that
823
- // secret routes and new conversations use the fresh client.
824
- onCesClientChanged((client) => server.updateCesClient(client));
825
-
826
- await server.start();
827
- log.info("Daemon startup: DaemonServer started");
828
-
829
- // Warm the gateway guardian-delivery cache so the SSE eager-subscribe path
830
- // (sync, IO-free) resolves the local actor principal on the FIRST client
831
- // registration. Without this, a cold cache regresses host-proxy same-user
832
- // targeting until a later reconnect. Non-blocking: failures aren't cached
833
- // and the async hot paths re-warm on their next read.
834
- void warmLocalGuardianPrincipalCache().catch((err) =>
835
- log.warn({ err }, "Guardian principal cache warm failed — continuing"),
836
- );
730
+ // Reconcile the committed embedding-collection dimension against a live
731
+ // backend probe (confirm-before-destroy) before the v2 rebuild and the
732
+ // worker drain, so `memory.qdrant.vectorSize` is settled first. Its own
733
+ // try/catch keeps an unreachable backend or reconcile failure from
734
+ // blocking startup.
735
+ try {
736
+ await reconcileEmbeddingIdentity(config);
737
+ } catch (err) {
738
+ log.warn(
739
+ { err },
740
+ "Embedding-identity reconcile threw continuing startup",
741
+ );
742
+ }
837
743
 
838
- startDiskPressureGuardForLifecycle();
839
- startOrphanReaper();
840
- startEventLoopWatchdog();
841
-
842
- // Mutable refs for Qdrant and memory worker so background
843
- // init can assign them and the shutdown handler always sees the latest value.
844
- const bgRefs: {
845
- qdrantManager: QdrantManager | null;
846
- memoryWorker: { stop(): void } | null;
847
- } = { qdrantManager: null, memoryWorker: null };
848
-
849
- // Initialize Qdrant vector store and memory worker in the background so the
850
- // RuntimeHttpServer can start accepting requests without waiting for Qdrant.
851
- async function initializeQdrantAndMemory(): Promise<void> {
852
- const qdrantUrl = resolveQdrantUrl(config);
853
- log.info({ qdrantUrl }, "Daemon startup: initializing Qdrant");
854
- const manager = new QdrantManager({ url: qdrantUrl });
855
- bgRefs.qdrantManager = manager;
856
- const QDRANT_START_MAX_ATTEMPTS = 3;
857
- let qdrantStarted = false;
858
- for (let attempt = 1; attempt <= QDRANT_START_MAX_ATTEMPTS; attempt++) {
859
- try {
860
- await manager.start();
861
- qdrantStarted = true;
862
- break;
863
- } catch (err) {
864
- if (attempt < QDRANT_START_MAX_ATTEMPTS) {
865
- const backoffMs = attempt * 5_000; // 5s, 10s
866
- log.warn(
867
- {
868
- err,
869
- attempt,
870
- maxAttempts: QDRANT_START_MAX_ATTEMPTS,
871
- backoffMs,
872
- },
873
- "Qdrant startup failed, retrying",
874
- );
875
- await Bun.sleep(backoffMs);
876
- } else {
877
- log.warn(
878
- { err },
879
- "Qdrant failed to start after all attempts — memory features will be unavailable",
880
- );
881
- }
882
- }
744
+ // Detect schema drift on the v2 concept-page collection (e.g.
745
+ // pre-#29823 collections lacking summary_dense / summary_sparse) and
746
+ // recreate + enqueue a reembed when needed. Awaited inline so the
747
+ // reembed enqueue happens before the memory worker drains its first
748
+ // batch; the call's own try/catch keeps any v2-side failure from
749
+ // blocking the v1 PKB reconcile or BM25 build below.
750
+ try {
751
+ await maybeRebuildMemoryV2Concepts(config);
752
+ } catch (err) {
753
+ log.warn(
754
+ { err },
755
+ "Memory v2 collection schema check threw continuing startup",
756
+ );
883
757
  }
884
758
 
885
- if (qdrantStarted) {
886
- // Skip the v1 Qdrant collection lifecycle when memory v2 is active
887
- // the v1 collection has no writers (handleRemember returns early) or
888
- // readers (graph search is bypassed) under v2, so ensuring/migrating
889
- // it just maintains a dead-on-arrival collection. Existing on-disk
890
- // collections are left intact so flipping v2 off restores v1 cleanly.
891
- if (!config.memory.v2.enabled) {
759
+ // Reconcile the PKB Qdrant index against the on-disk tree. Gated on
760
+ // !v2 because PKB is the v1 storage layer; under v2 the v1 collection
761
+ // is not initialized, so calling `getQdrantClient()` here would throw.
762
+ // Fire-and-forget so enqueued re-index jobs drain in the background
763
+ // and first-turn latency stays unaffected.
764
+ if (!config.memory.v2.enabled) {
765
+ void (async () => {
892
766
  try {
893
- const embeddingSelection = await selectEmbeddingBackend(config);
894
- // Sentinel only encodes the dense provider+model identity; sparse
895
- // encoder changes never require collection recreation, so they
896
- // intentionally do not contribute to the v1 collection identity.
897
- const embeddingModel = embeddingSelection.backend
898
- ? `${embeddingSelection.backend.provider}:${embeddingSelection.backend.model}`
899
- : undefined;
900
- const qdrantClient = initQdrantClient({
901
- url: qdrantUrl,
902
- collection: config.memory.qdrant.collection,
903
- vectorSize: config.memory.qdrant.vectorSize,
904
- onDisk: config.memory.qdrant.onDisk,
905
- quantization: config.memory.qdrant.quantization,
906
- embeddingModel,
907
- });
908
-
909
- // Eagerly ensure the collection exists so we detect migrations
910
- // (unnamed→named vectors, dimension/model changes) at startup.
911
- // If a destructive migration occurred, enqueue a rebuild_index job
912
- // to re-embed all memory items from the SQLite cache.
913
- const { migrated } = await qdrantClient.ensureCollection();
914
- if (migrated && isMemoryEnabled()) {
915
- enqueueMemoryJob("rebuild_index", {});
916
- log.info(
917
- "Qdrant collection was migrated — enqueued rebuild_index job",
918
- );
919
- }
920
-
921
- log.info("Qdrant vector store initialized");
767
+ const { reconcilePkbIndex } =
768
+ await import("../plugins/defaults/memory/pkb/pkb-reconcile.js");
769
+ const { PKB_WORKSPACE_SCOPE } =
770
+ await import("../plugins/defaults/memory/pkb/types.js");
771
+ const pkbRoot = join(getWorkspaceDir(), "pkb");
772
+ await reconcilePkbIndex(pkbRoot, PKB_WORKSPACE_SCOPE);
922
773
  } catch (err) {
923
774
  log.warn(
924
775
  { err },
925
- "Qdrant client initialization failed — memory features will be degraded",
776
+ "PKB index reconciliation failed — continuing startup",
926
777
  );
927
778
  }
928
- }
929
-
930
- // Detect schema drift on the v2 concept-page collection (e.g.
931
- // pre-#29823 collections lacking summary_dense / summary_sparse) and
932
- // recreate + enqueue a reembed when needed. Awaited inline so the
933
- // reembed enqueue happens before the memory worker drains its first
934
- // batch; the call's own try/catch keeps any v2-side failure from
935
- // blocking the v1 PKB reconcile or BM25 build below.
936
- try {
937
- await maybeRebuildMemoryV2Concepts(config);
938
- } catch (err) {
939
- log.warn(
940
- { err },
941
- "Memory v2 collection schema check threw — continuing startup",
942
- );
943
- }
944
-
945
- // Reconcile the PKB Qdrant index against the on-disk tree. Gated on
946
- // !v2 because PKB is the v1 storage layer; under v2 the v1 collection
947
- // is not initialized, so calling `getQdrantClient()` here would throw.
948
- // Fire-and-forget so enqueued re-index jobs drain in the background
949
- // and first-turn latency stays unaffected.
950
- if (!config.memory.v2.enabled) {
951
- void (async () => {
952
- try {
953
- const { reconcilePkbIndex } =
954
- await import("../memory/pkb/pkb-reconcile.js");
955
- const { PKB_WORKSPACE_SCOPE } =
956
- await import("../memory/pkb/types.js");
957
- const pkbRoot = join(getWorkspaceDir(), "pkb");
958
- await reconcilePkbIndex(pkbRoot, PKB_WORKSPACE_SCOPE);
959
- } catch (err) {
960
- log.warn(
961
- { err },
962
- "PKB index reconciliation failed — continuing startup",
963
- );
964
- }
965
- })();
966
- }
967
-
968
- void rebuildBm25CorpusStatsAndReseedSkills(config);
969
-
970
- try {
971
- await sweepConceptPageFrontmatter(config, getWorkspaceDir());
972
- } catch (err) {
973
- log.warn(
974
- { err },
975
- "Concept page frontmatter sweep threw — continuing startup",
976
- );
977
- }
779
+ })();
978
780
  }
979
781
 
980
- // `startMemoryJobsWorker` starts the in-process supervisor (which owns
981
- // the synchronous runner and stands down when an out-of-process worker is
982
- // live) and spawns the out-of-process worker at boot when
983
- // `memory.worker.enabled` is set. Shutdown stops whichever worker is
984
- // actually running — see shutdown-handlers.ts.
985
- log.info("Daemon startup: starting memory worker");
986
- bgRefs.memoryWorker = startMemoryJobsWorker();
782
+ void rebuildBm25CorpusStatsAndReseedSkills(config);
987
783
 
988
- // Seed capability graph nodes (new memory graph system)
989
784
  try {
990
- const { seedCliGraphNodes } =
991
- await import("../memory/graph/capability-seed.js");
992
- refreshSkillCapabilityMemories(config);
993
- await seedCliGraphNodes();
785
+ await sweepConceptPageFrontmatter(config, getWorkspaceDir());
994
786
  } catch (err) {
995
- log.warn({ err }, "Graph capability seeding failed — continuing");
996
- }
997
-
998
- // Auto-bootstrap: if the graph has no non-procedural nodes but historical
999
- // segments exist, enqueue a one-time graph_bootstrap job to populate the
1000
- // graph from conversation history and journal files.
1001
- try {
1002
- const { maybeEnqueueGraphBootstrap, cleanupStaleItemVectors } =
1003
- await import("../memory/graph/bootstrap.js");
1004
- maybeEnqueueGraphBootstrap();
1005
- // Fire-and-forget: clean up orphaned Qdrant vectors from dropped memory_items table
1006
- void cleanupStaleItemVectors().catch((err) =>
1007
- log.warn({ err }, "Stale item vector cleanup failed — continuing"),
787
+ log.warn(
788
+ { err },
789
+ "Concept page frontmatter sweep threw — continuing startup",
1008
790
  );
1009
- } catch (err) {
1010
- log.warn({ err }, "Graph bootstrap check failed — continuing");
1011
791
  }
1012
792
  }
1013
793
 
1014
- registerWatcherProviders();
1015
- registerMessagingProviders();
794
+ // `startMemoryJobsWorker` starts the in-process supervisor (which owns
795
+ // the synchronous runner and stands down when an out-of-process worker is
796
+ // live) and spawns the out-of-process worker at boot when
797
+ // `memory.worker.enabled` is set. Shutdown stops whichever worker is
798
+ // actually running — see shutdown-handlers.ts.
799
+ log.info("Daemon startup: starting memory worker");
800
+ registerMemoryJobHandlers();
801
+ startMemoryJobsWorker();
1016
802
 
803
+ // Seed capability graph nodes (new memory graph system)
1017
804
  try {
1018
- recoverStaleSchedules();
805
+ const { seedCliGraphNodes } =
806
+ await import("../plugins/defaults/memory/graph/capability-seed.js");
807
+ refreshSkillCapabilityMemories(config);
808
+ await seedCliGraphNodes();
1019
809
  } catch (err) {
1020
- log.error({ err }, "Schedule recovery failed — continuing startup");
810
+ log.warn({ err }, "Graph capability seeding failed — continuing");
1021
811
  }
1022
812
 
1023
- // Reconcile workflow runs orphaned by a crash: any row still `running` was
1024
- // in flight when the process died (the engine always finishes its row on
1025
- // exit), so flip it to `interrupted` to make it eligible for an explicit
1026
- // resume. Status only — accounting counters are preserved. Never blocks
1027
- // startup on failure.
813
+ // Auto-bootstrap: if the graph has no non-procedural nodes but historical
814
+ // segments exist, enqueue a one-time graph_bootstrap job to populate the
815
+ // graph from conversation history and journal files.
1028
816
  try {
1029
- const reconciled = getWorkflowRunManager().reconcileOrphanedRuns();
1030
- if (reconciled > 0) {
1031
- log.info(
1032
- { reconciled },
1033
- "Reconciled orphaned workflow runs to interrupted",
1034
- );
1035
- }
1036
- } catch (err) {
1037
- log.error(
1038
- { err },
1039
- "Workflow run reconciliation failed — continuing startup",
817
+ const { maybeEnqueueGraphBootstrap, cleanupStaleItemVectors } =
818
+ await import("../plugins/defaults/memory/graph/bootstrap.js");
819
+ maybeEnqueueGraphBootstrap();
820
+ // Fire-and-forget: clean up orphaned Qdrant vectors from dropped memory_items table
821
+ void cleanupStaleItemVectors().catch((err) =>
822
+ log.warn({ err }, "Stale item vector cleanup failed — continuing"),
1040
823
  );
824
+ } catch (err) {
825
+ log.warn({ err }, "Graph bootstrap check failed — continuing");
1041
826
  }
827
+ }
1042
828
 
1043
- const scheduler = startScheduler(
1044
- async (conversationId, message, options) => {
1045
- await processMessage(
1046
- conversationId,
1047
- message,
1048
- options
1049
- ? {
1050
- ...(options.trustClass
1051
- ? {
1052
- trustContext: {
1053
- sourceChannel: "vellum",
1054
- trustClass: options.trustClass,
1055
- },
1056
- }
1057
- : {}),
1058
- ...(options.taskRunId ? { taskRunId: options.taskRunId } : {}),
1059
- ...(options.overrideProfile
1060
- ? { overrideProfile: options.overrideProfile }
1061
- : {}),
1062
- }
1063
- : undefined,
1064
- );
1065
- },
1066
- async (schedule) => {
1067
- await emitNotificationSignal({
1068
- sourceEventName: "schedule.notify",
1069
- sourceChannel: "scheduler",
1070
- sourceContextId: schedule.id,
1071
- attentionHints: {
1072
- requiresAction: true,
1073
- urgency: "high",
1074
- isAsyncBackground: false,
1075
- visibleInSourceNow: false,
1076
- },
1077
- contextPayload: {
1078
- scheduleId: schedule.id,
1079
- label: schedule.label,
1080
- message: schedule.message,
1081
- },
1082
- routingIntent: schedule.routingIntent,
1083
- routingHints: schedule.routingHints,
1084
- conversationMetadata: {
1085
- groupId: "system:scheduled",
1086
- scheduleJobId: schedule.id,
1087
- source: "schedule",
1088
- },
1089
- dedupeKey: `schedule:notify:${schedule.id}:${Date.now()}`,
1090
- throwOnError: true,
1091
- });
1092
- },
1093
- (notification) => {
1094
- void emitNotificationSignal({
1095
- sourceEventName: "watcher.notification",
1096
- sourceChannel: "watcher",
1097
- sourceContextId: `watcher-${Date.now()}`,
1098
- attentionHints: {
1099
- requiresAction: false,
1100
- urgency: "low",
1101
- isAsyncBackground: true,
1102
- visibleInSourceNow: false,
1103
- },
1104
- contextPayload: {
1105
- title: notification.title,
1106
- body: notification.body,
1107
- },
1108
- dedupeKey: `watcher:notification:${crypto.randomUUID()}`,
1109
- });
1110
- },
1111
- (info) => {
1112
- broadcastMessage({
1113
- type: "schedule_conversation_created",
1114
- conversationId: info.conversationId,
1115
- scheduleJobId: info.scheduleJobId,
1116
- title: info.title,
1117
- });
1118
- publishConversationListChanged("created");
1119
- },
1120
- );
829
+ registerWatcherProviders();
830
+ registerMessagingProviders();
1121
831
 
1122
- // Wire up the runtime HTTP server's deferred dependencies. The server
1123
- // itself was bound early in runDaemon (right after the auth signing key
1124
- // was loaded) so /healthz and /readyz already answer 200 OK; these
1125
- // registrations attach the live DaemonServer / CES / relay handlers to
1126
- // the running routes. They're module-level state, so they're effective
1127
- // even when the HTTP server failed to bind (IPC clients still work).
1128
- registerSecretsDeps({
1129
- getCesClient: () => server.getCesClient(),
1130
- onProviderCredentialsChanged: () =>
1131
- server.refreshConversationsForProviderChange(),
1132
- });
832
+ try {
833
+ await recoverStaleSchedules();
834
+ } catch (err) {
835
+ log.error({ err }, "Schedule recovery failed continuing startup");
836
+ }
1133
837
 
1134
- // Fire-and-forget: Qdrant init and memory worker startup run concurrently
1135
- // with the rest of daemon boot. Must run AFTER `new RuntimeHttpServer(...)`
1136
- // so the analyze-deps singleton (populated inside `buildRouteTable()`) is
1137
- // available before the memory worker can claim leftover
1138
- // `conversation_analyze` jobs from a prior run. See the daemon-startup
1139
- // ordering test in `assistant/src/daemon/__tests__/`.
1140
- void initializeQdrantAndMemory().catch((err) =>
1141
- log.warn({ err }, "Background Qdrant init failed"),
838
+ // Reconcile workflow runs orphaned by a crash: any row still `running` was
839
+ // in flight when the process died (the engine always finishes its row on
840
+ // exit), so flip it to `interrupted` to make it eligible for an explicit
841
+ // resume. Status only accounting counters are preserved. Never blocks
842
+ // startup on failure.
843
+ try {
844
+ const reconciled = getWorkflowRunManager().reconcileOrphanedRuns();
845
+ if (reconciled > 0) {
846
+ log.info(
847
+ { reconciled },
848
+ "Reconciled orphaned workflow runs to interrupted",
849
+ );
850
+ }
851
+ } catch (err) {
852
+ log.error(
853
+ { err },
854
+ "Workflow run reconciliation failed — continuing startup",
1142
855
  );
856
+ }
1143
857
 
1144
- // Inject voice bridge deps so route handlers + the relay pipeline can
1145
- // resolve a conversation by ID once a call lands. Module-level state,
1146
- // so available even when the HTTP server failed to bind.
1147
- setVoiceBridgeDeps({
1148
- getOrCreateConversation: (conversationId, _transport) =>
1149
- server.getConversationForMessages(conversationId),
1150
- resolveAttachments: (attachmentIds) => {
1151
- const resolved = getAttachmentsByIds(attachmentIds, {
1152
- hydrateFileData: true,
1153
- });
1154
- const sourcePaths = getSourcePathsForAttachments(attachmentIds);
1155
- return resolved.map((a) => ({
1156
- id: a.id,
1157
- filename: a.originalFilename,
1158
- mimeType: a.mimeType,
1159
- data: a.dataBase64,
1160
- ...(sourcePaths.has(a.id) ? { filePath: sourcePaths.get(a.id) } : {}),
1161
- }));
1162
- },
1163
- });
1164
- try {
1165
- setRelayBroadcast((msg) => broadcastMessage(msg));
1166
- setPointerMessageProcessor(
1167
- async (conversationId, instruction, requiredFacts) => {
1168
- const conversation =
1169
- await server.getConversationForMessages(conversationId);
1170
-
1171
- // Constrain pointer generation to a tool-disabled path so call-
1172
- // status events cannot trigger unintended side-effect tools.
1173
- // Incrementing toolsDisabledDepth causes the resolveTools callback
1174
- // to return an empty tool list, preventing the LLM from seeing or
1175
- // invoking any tools during the pointer agent loop.
1176
- //
1177
- // A depth counter (rather than a boolean) ensures that overlapping
1178
- // pointer requests on the same conversation don't clear each other's
1179
- // constraint each caller increments on entry and decrements in
1180
- // its own finally block.
1181
- conversation.toolsDisabledDepth++;
1182
- try {
1183
- const { id: messageId } = await conversation.persistUserMessage({
1184
- content: instruction,
1185
- metadata: { pointerInstruction: true },
1186
- displayContent: "[Call status event]",
1187
- });
1188
-
1189
- // Helper: roll back persisted messages on failure, then reload
1190
- // in-memory history from the (now cleaned) DB. Reloading avoids
1191
- // stale-index issues when context compaction reassigns the
1192
- // messages array during runAgentLoop.
1193
- const rollback = async (extraMessageIds?: string[]) => {
858
+ startScheduler(async (conversationId, message, options) => {
859
+ await processMessage(
860
+ conversationId,
861
+ message,
862
+ options
863
+ ? {
864
+ ...(options.trustClass
865
+ ? {
866
+ trustContext: {
867
+ sourceChannel: "vellum",
868
+ trustClass: options.trustClass,
869
+ },
870
+ }
871
+ : {}),
872
+ ...(options.taskRunId ? { taskRunId: options.taskRunId } : {}),
873
+ ...(options.overrideProfile
874
+ ? { overrideProfile: options.overrideProfile }
875
+ : {}),
876
+ ...(options.cronRunId ? { cronRunId: options.cronRunId } : {}),
877
+ }
878
+ : undefined,
879
+ );
880
+ });
881
+
882
+ // Fire-and-forget: Qdrant init and memory worker startup run concurrently
883
+ // with the rest of daemon boot. Must run AFTER `startRuntimeHttpServer()`
884
+ // so the analyze-deps singleton (populated inside `buildRouteTable()`) is
885
+ // available before the memory worker can claim leftover
886
+ // `conversation_analyze` jobs from a prior run. See the daemon-startup
887
+ // ordering test in `assistant/src/daemon/__tests__/`.
888
+ void initializeQdrantAndMemory().catch((err) =>
889
+ log.warn({ err }, "Background Qdrant init failed"),
890
+ );
891
+
892
+ // Inject voice bridge deps so the relay pipeline can resolve attachments
893
+ // once a call lands. Module-level state, so available even when the HTTP
894
+ // server failed to bind.
895
+ setVoiceBridgeDeps({
896
+ resolveAttachments: (attachmentIds) => {
897
+ const resolved = getAttachmentsByIds(attachmentIds, {
898
+ hydrateFileData: true,
899
+ });
900
+ const sourcePaths = getSourcePathsForAttachments(attachmentIds);
901
+ return resolved.map((a) => ({
902
+ id: a.id,
903
+ filename: a.originalFilename,
904
+ mimeType: a.mimeType,
905
+ data: a.dataBase64,
906
+ ...(sourcePaths.has(a.id) ? { filePath: sourcePaths.get(a.id) } : {}),
907
+ }));
908
+ },
909
+ });
910
+ try {
911
+ setRelayBroadcast((msg) => broadcastMessage(msg));
912
+ setPointerMessageProcessor(
913
+ async (conversationId, instruction, requiredFacts) => {
914
+ const conversation = await getOrCreateConversation(conversationId);
915
+
916
+ // Pointer turns are guardian-gated owner self-maintenance: elevate to
917
+ // the internal guardian context and rehydrate history so a cold
918
+ // (evicted) load doesn't filter guardian history to empty and ship a
919
+ // cache-missing turn. `restoreTrustContext` undoes the elevation after
920
+ // the turn. See pointer-conversation-trust.ts for the full rationale.
921
+ const restoreTrustContext =
922
+ await elevatePointerConversationToGuardian(conversation);
923
+
924
+ // Constrain pointer generation to a tool-disabled path so call-
925
+ // status events cannot trigger unintended side-effect tools.
926
+ // Incrementing toolsDisabledDepth causes the resolveTools callback
927
+ // to return an empty tool list, preventing the LLM from seeing or
928
+ // invoking any tools during the pointer agent loop.
929
+ //
930
+ // A depth counter (rather than a boolean) ensures that overlapping
931
+ // pointer requests on the same conversation don't clear each other's
932
+ // constraint — each caller increments on entry and decrements in
933
+ // its own finally block.
934
+ conversation.toolsDisabledDepth++;
935
+ try {
936
+ const { id: messageId } = await conversation.persistUserMessage({
937
+ content: instruction,
938
+ metadata: { pointerInstruction: true },
939
+ displayContent: "[Call status event]",
940
+ });
941
+
942
+ // Helper: roll back persisted messages on failure, then reload
943
+ // in-memory history from the (now cleaned) DB. Reloading avoids
944
+ // stale-index issues when context compaction reassigns the
945
+ // messages array during runAgentLoop.
946
+ const rollback = async (extraMessageIds?: string[]) => {
947
+ try {
948
+ deleteMessageById(messageId);
949
+ } catch {
950
+ /* best effort */
951
+ }
952
+ for (const id of extraMessageIds ?? []) {
1194
953
  try {
1195
- deleteMessageById(messageId);
954
+ deleteMessageById(id);
1196
955
  } catch {
1197
956
  /* best effort */
1198
957
  }
1199
- for (const id of extraMessageIds ?? []) {
1200
- try {
1201
- deleteMessageById(id);
1202
- } catch {
1203
- /* best effort */
1204
- }
958
+ }
959
+ try {
960
+ await conversation.loadFromDb();
961
+ } catch {
962
+ /* best effort */
963
+ }
964
+ };
965
+
966
+ // Snapshot message IDs before the agent loop so we can diff
967
+ // afterwards to find exactly which messages this run created,
968
+ // avoiding positional heuristics that break under concurrency.
969
+ //
970
+ // Caveat: the diff captures *all* new messages in the
971
+ // conversation during the loop window, not just those from
972
+ // this specific agent loop. If a concurrent pointer event
973
+ // falls back to a deterministic addMessage() while our loop
974
+ // is in flight, that message lands in our diff. The race
975
+ // requires two pointer events for the same conversation
976
+ // within the agent loop window *and* this run must fail or
977
+ // fail fact-check — narrow enough to accept. A future
978
+ // improvement could tag messages with a per-run correlation
979
+ // ID so rollback only targets its own output.
980
+ const preRunMessageIds = new Set(
981
+ getMessages(conversationId).map((m) => m.id),
982
+ );
983
+
984
+ let agentLoopError: string | undefined;
985
+ let generatedText = "";
986
+ await conversation.runAgentLoop(instruction, messageId, {
987
+ onEvent: (msg) => {
988
+ if (
989
+ "type" in msg &&
990
+ msg.type === "assistant_text_delta" &&
991
+ "text" in msg
992
+ ) {
993
+ generatedText += (msg as { text: string }).text;
1205
994
  }
1206
- try {
1207
- await conversation.loadFromDb();
1208
- } catch {
1209
- /* best effort */
995
+ if (
996
+ "type" in msg &&
997
+ (msg.type === "error" || msg.type === "conversation_error")
998
+ ) {
999
+ agentLoopError =
1000
+ "message" in msg
1001
+ ? (msg as { message: string }).message
1002
+ : "userMessage" in msg
1003
+ ? (msg as { userMessage: string }).userMessage
1004
+ : "Agent loop failed";
1210
1005
  }
1211
- };
1212
-
1213
- // Snapshot message IDs before the agent loop so we can diff
1214
- // afterwards to find exactly which messages this run created,
1215
- // avoiding positional heuristics that break under concurrency.
1216
- //
1217
- // Caveat: the diff captures *all* new messages in the
1218
- // conversation during the loop window, not just those from
1219
- // this specific agent loop. If a concurrent pointer event
1220
- // falls back to a deterministic addMessage() while our loop
1221
- // is in flight, that message lands in our diff. The race
1222
- // requires two pointer events for the same conversation
1223
- // within the agent loop window *and* this run must fail or
1224
- // fail fact-check — narrow enough to accept. A future
1225
- // improvement could tag messages with a per-run correlation
1226
- // ID so rollback only targets its own output.
1227
- const preRunMessageIds = new Set(
1228
- getMessages(conversationId).map((m) => m.id),
1229
- );
1006
+ },
1007
+ });
1230
1008
 
1231
- let agentLoopError: string | undefined;
1232
- let generatedText = "";
1233
- await conversation.runAgentLoop(instruction, messageId, {
1234
- onEvent: (msg) => {
1235
- if (
1236
- "type" in msg &&
1237
- msg.type === "assistant_text_delta" &&
1238
- "text" in msg
1239
- ) {
1240
- generatedText += (msg as { text: string }).text;
1241
- }
1242
- if (
1243
- "type" in msg &&
1244
- (msg.type === "error" || msg.type === "conversation_error")
1245
- ) {
1246
- agentLoopError =
1247
- "message" in msg
1248
- ? (msg as { message: string }).message
1249
- : "userMessage" in msg
1250
- ? (msg as { userMessage: string }).userMessage
1251
- : "Agent loop failed";
1252
- }
1253
- },
1254
- });
1255
-
1256
- // Identify messages created during this run by diffing against
1257
- // the pre-run snapshot. This captures all messages added to the
1258
- // conversation during the loop window, which may include messages
1259
- // from concurrent pointer events (see over-capture caveat above).
1260
- const postRunMessages = getMessages(conversationId);
1261
- const createdMessageIds = postRunMessages
1262
- .filter((m) => !preRunMessageIds.has(m.id) && m.id !== messageId)
1263
- .map((m) => m.id);
1264
-
1265
- if (agentLoopError) {
1266
- await rollback(createdMessageIds);
1267
- throw new Error(agentLoopError);
1268
- }
1009
+ // Identify messages created during this run by diffing against
1010
+ // the pre-run snapshot. This captures all messages added to the
1011
+ // conversation during the loop window, which may include messages
1012
+ // from concurrent pointer events (see over-capture caveat above).
1013
+ const postRunMessages = getMessages(conversationId);
1014
+ const createdMessageIds = postRunMessages
1015
+ .filter((m) => !preRunMessageIds.has(m.id) && m.id !== messageId)
1016
+ .map((m) => m.id);
1017
+
1018
+ if (agentLoopError) {
1019
+ await rollback(createdMessageIds);
1020
+ throw new Error(agentLoopError);
1021
+ }
1269
1022
 
1270
- // Post-generation fact check: verify the assistant's response
1271
- // includes all required factual details (phone number, duration,
1272
- // outcome keyword, etc.). If the model omitted or rewrote them,
1273
- // remove both the instruction and generated messages and throw so
1274
- // the deterministic fallback fires.
1275
- //
1276
- // Validation uses text accumulated from assistant_text_delta
1277
- // events during the agent loop rather than a DB lookup, avoiding
1278
- // any positional ambiguity when concurrent pointer events
1279
- // interleave messages in the conversation.
1280
- if (requiredFacts && requiredFacts.length > 0) {
1281
- const missingFacts = requiredFacts.filter(
1282
- (fact) => !generatedText.includes(fact),
1023
+ // Post-generation fact check: verify the assistant's response
1024
+ // includes all required factual details (phone number, duration,
1025
+ // outcome keyword, etc.). If the model omitted or rewrote them,
1026
+ // remove both the instruction and generated messages and throw so
1027
+ // the deterministic fallback fires.
1028
+ //
1029
+ // Validation uses text accumulated from assistant_text_delta
1030
+ // events during the agent loop rather than a DB lookup, avoiding
1031
+ // any positional ambiguity when concurrent pointer events
1032
+ // interleave messages in the conversation.
1033
+ if (requiredFacts && requiredFacts.length > 0) {
1034
+ const missingFacts = requiredFacts.filter(
1035
+ (fact) => !generatedText.includes(fact),
1036
+ );
1037
+ if (missingFacts.length > 0) {
1038
+ log.warn(
1039
+ { conversationId, missingFacts },
1040
+ "Generated pointer text failed fact validation — falling back to deterministic",
1283
1041
  );
1284
- if (missingFacts.length > 0) {
1285
- log.warn(
1286
- { conversationId, missingFacts },
1287
- "Generated pointer text failed fact validation — falling back to deterministic",
1288
- );
1289
- await rollback(createdMessageIds);
1290
- throw new Error(
1291
- "Generated pointer text failed fact validation",
1292
- );
1293
- }
1042
+ await rollback(createdMessageIds);
1043
+ throw new Error("Generated pointer text failed fact validation");
1294
1044
  }
1295
- } finally {
1296
- // Restore tool availability so subsequent turns aren't affected.
1297
- conversation.toolsDisabledDepth--;
1298
1045
  }
1299
- },
1300
- );
1301
- server.broadcastStatus();
1302
- } catch (err) {
1303
- log.warn(
1304
- { err },
1305
- "Failed to wire runtime HTTP server deps, continuing without them",
1306
- );
1307
- runtimeHttp = null;
1308
- }
1046
+ } finally {
1047
+ // Restore tool availability so subsequent turns aren't affected.
1048
+ conversation.toolsDisabledDepth--;
1049
+ // Undo the temporary guardian elevation installed above.
1050
+ restoreTrustContext();
1051
+ }
1052
+ },
1053
+ );
1054
+ broadcastDaemonStatus();
1055
+ } catch (err) {
1056
+ log.warn(
1057
+ { err },
1058
+ "Failed to wire runtime HTTP server deps, continuing without them",
1059
+ );
1060
+ }
1309
1061
 
1310
- // Register built-in TTS providers so the provider abstraction can resolve
1311
- // them by ID. Must happen before call controllers or routes are created.
1312
- try {
1313
- registerBuiltinTtsProviders();
1314
- } catch (err) {
1315
- log.warn(
1316
- { err },
1317
- "TTS provider registration failed — continuing with degraded TTS",
1318
- );
1319
- }
1062
+ // Register built-in TTS providers so the provider abstraction can resolve
1063
+ // them by ID. Must happen before call controllers or routes are created.
1064
+ try {
1065
+ registerBuiltinTtsProviders();
1066
+ } catch (err) {
1067
+ log.warn(
1068
+ { err },
1069
+ "TTS provider registration failed — continuing with degraded TTS",
1070
+ );
1071
+ }
1072
+
1073
+ // Initialize providers and tools after the HTTP server is listening so
1074
+ // health-check and pairing requests can be served immediately. Wrapped in
1075
+ // its own try/catch so a failure here doesn't tear down the running HTTP
1076
+ // server (providers were already initialized earlier in startup and tools
1077
+ // are resolved lazily at conversation creation time).
1078
+ try {
1079
+ log.info("Daemon startup: initializing providers and tools");
1080
+ await initializeProvidersAndTools(config);
1081
+ } catch (err) {
1082
+ log.warn(
1083
+ { err },
1084
+ "Provider/tool initialization failed — continuing with degraded functionality",
1085
+ );
1086
+ }
1087
+
1088
+ writePid(process.pid);
1089
+
1090
+ // Install the `assistant` CLI symlink idempotently on every daemon start.
1091
+ // Non-blocking — failures are logged but don't affect startup.
1092
+ try {
1093
+ installAssistantSymlink();
1094
+ } catch (err) {
1095
+ log.warn({ err }, "Assistant symlink installation failed — continuing");
1096
+ }
1320
1097
 
1321
- // Initialize providers and tools after the HTTP server is listening so
1322
- // health-check and pairing requests can be served immediately. Wrapped in
1323
- // its own try/catch so a failure here doesn't tear down the running HTTP
1324
- // server (DaemonServer.start() already calls initializeProviders internally
1325
- // and tools are resolved lazily at conversation creation time).
1098
+ // Download embedding runtime in background (non-blocking).
1099
+ // If download fails, local embeddings gracefully fall back to cloud backends.
1100
+ void (async () => {
1326
1101
  try {
1327
- log.info("Daemon startup: initializing providers and tools");
1328
- await initializeProvidersAndTools(config);
1102
+ const { EmbeddingRuntimeManager } =
1103
+ await import("../persistence/embeddings/embedding-runtime-manager.js");
1104
+ const runtimeManager = new EmbeddingRuntimeManager();
1105
+ if (!runtimeManager.isReady()) {
1106
+ log.info("Downloading embedding runtime in background...");
1107
+ await runtimeManager.ensureInstalled();
1108
+ // Reset the sticky local-backend failure flag so auto mode retries
1109
+ // local embeddings without evicting a worker that may already be live.
1110
+ const { resetLocalEmbeddingFailureState } =
1111
+ await import("../persistence/embeddings/embedding-backend.js");
1112
+ resetLocalEmbeddingFailureState();
1113
+ log.info("Embedding runtime download complete");
1114
+ }
1329
1115
  } catch (err) {
1330
1116
  log.warn(
1331
1117
  { err },
1332
- "Provider/tool initialization failed — continuing with degraded functionality",
1118
+ "Embedding runtime download failed — local embeddings will use cloud fallback",
1333
1119
  );
1334
1120
  }
1121
+ })();
1335
1122
 
1336
- writePid(process.pid);
1337
-
1338
- // Install the `assistant` CLI symlink idempotently on every daemon start.
1339
- // Non-blocking — failures are logged but don't affect startup.
1340
- try {
1341
- installAssistantSymlink();
1342
- } catch (err) {
1343
- log.warn({ err }, "Assistant symlink installation failed — continuing");
1344
- }
1345
-
1346
- // Download embedding runtime in background (non-blocking).
1347
- // If download fails, local embeddings gracefully fall back to cloud backends.
1348
- void (async () => {
1349
- try {
1350
- const { EmbeddingRuntimeManager } =
1351
- await import("../memory/embedding-runtime-manager.js");
1352
- const runtimeManager = new EmbeddingRuntimeManager();
1353
- if (!runtimeManager.isReady()) {
1354
- log.info("Downloading embedding runtime in background...");
1355
- await runtimeManager.ensureInstalled();
1356
- // Reset the sticky local-backend failure flag so auto mode retries
1357
- // local embeddings without evicting a worker that may already be live.
1358
- const { resetLocalEmbeddingFailureState } =
1359
- await import("../memory/embedding-backend.js");
1360
- resetLocalEmbeddingFailureState();
1361
- log.info("Embedding runtime download complete");
1362
- }
1363
- } catch (err) {
1364
- log.warn(
1365
- { err },
1366
- "Embedding runtime download failed — local embeddings will use cloud fallback",
1367
- );
1368
- }
1369
- })();
1123
+ if (config.auditLog.retentionDays > 0) {
1124
+ void rotateToolInvocations(config.auditLog.retentionDays).catch((err) => {
1125
+ log.warn({ err }, "Audit log rotation failed");
1126
+ });
1127
+ }
1370
1128
 
1371
- if (config.auditLog.retentionDays > 0) {
1372
- void rotateToolInvocations(config.auditLog.retentionDays).catch((err) => {
1373
- log.warn({ err }, "Audit log rotation failed");
1374
- });
1375
- }
1129
+ startWorkspaceHeartbeatService();
1376
1130
 
1377
- const workspaceHeartbeat = new WorkspaceHeartbeatService();
1378
- workspaceHeartbeat.start();
1379
-
1380
- const heartbeatConfig = config.heartbeat;
1381
- const heartbeat = new HeartbeatService({
1382
- alerter: (alert) => broadcastMessage(alert),
1383
- onConversationCreated: (info) =>
1384
- broadcastMessage({
1385
- type: "heartbeat_conversation_created",
1386
- conversationId: info.conversationId,
1387
- title: info.title,
1388
- }),
1389
- });
1390
- heartbeat.start();
1391
- registerBackgroundWakeRuntime({ scheduler, heartbeat });
1392
- refreshBackgroundWakeIntent("daemon-startup");
1393
- log.info(
1394
- {
1395
- enabled: heartbeatConfig.enabled,
1396
- intervalMs: heartbeatConfig.intervalMs,
1397
- },
1398
- "Heartbeat service configured",
1399
- );
1131
+ startHeartbeatService();
1400
1132
 
1401
- // Filing yields to the memory v2 consolidation job when v2 is enabled —
1402
- // both serve the same role (periodic background memory processing) and
1403
- // running both is redundant. The consolidation job runs through the
1404
- // memory jobs worker (see `maybeEnqueueGraphMaintenanceJobs`).
1405
- const memoryV2Enabled = config.memory.v2.enabled;
1406
- let filing: FilingService | null = null;
1407
- if (!memoryV2Enabled) {
1408
- const filingConfig = config.filing;
1409
- filing = new FilingService();
1410
- filing.start();
1411
- log.info(
1412
- {
1413
- enabled: filingConfig.enabled,
1414
- intervalMs: filingConfig.intervalMs,
1415
- },
1416
- "Filing service configured",
1417
- );
1418
- } else {
1419
- log.info(
1420
- "Filing service skipped — memory v2 consolidation is the active background memory job",
1421
- );
1422
- }
1133
+ installShutdownHandlers();
1423
1134
 
1424
- // Retrieve the MCP manager if MCP servers were configured.
1425
- // The manager is a singleton created during initializeProvidersAndTools().
1426
- const mcpManager =
1427
- config.mcp?.servers && Object.keys(config.mcp.servers).length > 0
1428
- ? getMcpServerManager()
1429
- : null;
1430
-
1431
- installShutdownHandlers({
1432
- server,
1433
- workspaceHeartbeat,
1434
- heartbeat,
1435
- filing,
1436
- runtimeHttp,
1437
- scheduler,
1438
- getMemoryWorker: () => bgRefs.memoryWorker,
1439
- getQdrantManager: () => bgRefs.qdrantManager,
1440
- mcpManager,
1441
- telemetryReporter,
1442
- cleanupPidFile: () => {
1443
- stopGatewayFlagListener();
1444
- stopDiskPressureGuardForLifecycle();
1445
- stopOrphanReaper();
1446
- stopEventLoopWatchdog();
1447
- cleanupPidFile();
1448
- },
1449
- });
1135
+ // The critical startup await-chain has completed and the daemon can serve
1136
+ // requests, so latch readiness before logging "Daemon started". Any fatal
1137
+ // failure earlier in startup propagates out of runDaemon before this line,
1138
+ // so the latch is never set on a failed start.
1139
+ setStartupComplete();
1450
1140
 
1451
- log.info(
1452
- {
1453
- durationMs: Date.now() - startupStartedAt,
1454
- pid: process.pid,
1455
- },
1456
- "Daemon started",
1457
- );
1458
- } catch (err) {
1459
- log.error({ err }, "Daemon startup failed — cleaning up");
1460
- stopDiskPressureGuardForLifecycle();
1461
- stopOrphanReaper();
1462
- stopEventLoopWatchdog();
1463
- cleanupPidFileIfOwner(process.pid);
1464
- throw err;
1465
- }
1141
+ log.info(
1142
+ {
1143
+ durationMs: Date.now() - startupStartedAt,
1144
+ pid: process.pid,
1145
+ },
1146
+ "Daemon started",
1147
+ );
1466
1148
  }