@vellumai/assistant 0.10.3 → 0.10.4-dev.202607010028.1a4efcc

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