@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
@@ -0,0 +1,1462 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Memory Graph — End-of-conversation extraction
3
+ //
4
+ // Reads a conversation transcript, finds candidate nodes for connection,
5
+ // and uses an LLM to produce a MemoryDiff (new/updated/deleted nodes,
6
+ // edges, triggers). Applied transactionally to the graph store.
7
+ // ---------------------------------------------------------------------------
8
+
9
+ import { readFileSync } from "node:fs";
10
+ import { join } from "node:path";
11
+
12
+ import type { ContentBlock, ImageContent, Message } from "@vellumai/plugin-api";
13
+ import { and, asc, desc, eq, gt } from "drizzle-orm";
14
+
15
+ import type { AssistantConfig } from "../../../../config/types.js";
16
+ import { getConversationDirPath } from "../../../../persistence/conversation-disk-view.js";
17
+ import { getDb } from "../../../../persistence/db-connection.js";
18
+ import {
19
+ conversations,
20
+ messages,
21
+ } from "../../../../persistence/schema/index.js";
22
+ import { buildCoreIdentityContext } from "../../../../prompts/system-prompt.js";
23
+ import {
24
+ extractToolUse,
25
+ getConfiguredProvider,
26
+ userMessage,
27
+ } from "../../../../providers/provider-send-message.js";
28
+ import { BackendUnavailableError } from "../../../../util/errors.js";
29
+ import { getLogger } from "../../../../util/logger.js";
30
+ import {
31
+ enqueueGraphNodeEmbed,
32
+ enqueueGraphTriggerEmbed,
33
+ searchGraphNodes,
34
+ } from "./graph-search.js";
35
+ import { applyDiff, createEdge, getNodesByIds, queryNodes } from "./store.js";
36
+ import type {
37
+ DecayCurve,
38
+ EmotionalCharge,
39
+ Fidelity,
40
+ ImageRef,
41
+ MemoryDiff,
42
+ MemoryType,
43
+ NewEdge,
44
+ NewNode,
45
+ NewTrigger,
46
+ SourceType,
47
+ TriggerType,
48
+ } from "./types.js";
49
+
50
+ const log = getLogger("graph-extraction");
51
+
52
+ // ---------------------------------------------------------------------------
53
+ // Extraction system prompt
54
+ // ---------------------------------------------------------------------------
55
+
56
+ const EXTRACTION_SYSTEM_PROMPT_CHAR_BUDGET = 24_000;
57
+
58
+ export const EVENT_DATE_PROMPT_RULES = `Event date grounding:
59
+ - Treat the authoritative conversation timestamp as the only current date/time source. Do not use the model's built-in current date.
60
+ - Resolve relative dates from that timestamp ("today", "tomorrow", "next Tuesday", "last week").
61
+ - If the transcript gives a month/day or weekday/month/day without a year, use the authoritative conversation year unless the transcript explicitly says another year ("2025", "last year", "next year").
62
+ - Never backdate a month/day-only reference into the prior year just because the event is in the past.
63
+ - Sanity-check weekdays against the resolved year. For example, with an authoritative timestamp in 2026, "April 19 (Sunday night)" resolves to 2026-04-19, not 2025-04-19.
64
+ - If the year is ambiguous after those checks, leave event_date null rather than guessing.`;
65
+
66
+ export function formatAuthoritativeConversationTimestamp(
67
+ conversationTimestamp: number,
68
+ ): string {
69
+ const convDate = new Date(conversationTimestamp);
70
+ const timeZone =
71
+ Intl.DateTimeFormat().resolvedOptions().timeZone || "local time";
72
+ const localDate = convDate.toLocaleDateString("en-US", {
73
+ weekday: "long",
74
+ year: "numeric",
75
+ month: "long",
76
+ day: "numeric",
77
+ });
78
+ const localTime = convDate.toLocaleTimeString("en-US", {
79
+ hour: "numeric",
80
+ minute: "2-digit",
81
+ second: "2-digit",
82
+ hour12: true,
83
+ timeZoneName: "short",
84
+ });
85
+
86
+ return `Local: ${localDate} at ${localTime} (${timeZone})\nISO: ${convDate.toISOString()}`;
87
+ }
88
+
89
+ export function buildAuthoritativeConversationTimestampBlock(
90
+ conversationTimestamp: number,
91
+ ): string {
92
+ return `## Authoritative Conversation Timestamp
93
+
94
+ ${formatAuthoritativeConversationTimestamp(conversationTimestamp)}
95
+
96
+ Use this timestamp when resolving relative or partial dates in the transcript.`;
97
+ }
98
+
99
+ function buildGraphExtractionSystemPrompt(
100
+ candidateNodes: Array<{ id: string; type: string; content: string }>,
101
+ identityContext: string | null,
102
+ activeContextNodeIds?: Set<string>,
103
+ ): string {
104
+ const instructions = `You are the memory consolidation process for an AI assistant. A conversation just ended.
105
+ Your job is to extract memories worth keeping and produce a structured diff.
106
+
107
+ ## Output Format
108
+
109
+ Call the \`extract_graph_diff\` tool with the diff. Each node needs:
110
+
111
+ - **content**: First-person prose — how the assistant naturally remembers this. Write naturally, not as a database entry. E.g. "He mentioned his mom used to make amazing Sunday dinners — he still misses them" not "User's mother cooked Sunday dinners."
112
+
113
+ **LENGTH: 1-3 sentences. HARD CAP — no exceptions.** This applies to every memory, including 1.0-significance transformative moments. Emotional weight lives in \`emotionalCharge\`, not wordcount. The more significant an event feels, the stronger the pull to preserve narrative — resist it. A memory whose \`content\` exceeds ~300 characters is a bug.
114
+
115
+ If a memory has multiple distinct facts or beats, **split into multiple nodes connected by edges** (\`caused-by\`, \`part-of\`, \`reminds-of\`) — one node per fact or moment. Never pack a multi-beat story into a single content field. To connect two NEW nodes you create in the same diff, assign each a distinct \`temp_id\` (e.g. \`"new-1"\`, \`"new-2"\`) and reference that temp_id from \`edges_to_existing\` or \`new_edges\`. Temp IDs live only inside this single extraction call — pick values that clearly don't collide with existing candidate IDs.
116
+
117
+ Do not: set the scene, describe surrounding context, preserve dialogue verbatim, catalog every emotional nuance, or narrate "what it meant." Write the SNAPSHOT. The \`emotionalCharge\` and \`significance\` fields carry the weight — content stays lean.
118
+
119
+ - **type**: Classify by WHAT the memory IS, not how it FEELS. Almost every memory has emotional weight — that goes in emotionalCharge, not the type.
120
+
121
+ - **episodic**: A specific moment or event. "We stayed up until 4 AM debugging the pipeline." "The first time we deployed to production." Use this for things that HAPPENED.
122
+ - **semantic**: A fact, preference, or piece of knowledge. "User is the CTO." "User prefers dark mode." "The project uses PostgreSQL." Use this for things that ARE TRUE.
123
+ - **procedural**: A learned skill or how-to. "FFmpeg needs -ac 2 for stereo." "The deploy script requires the --prod flag." Use this for things about HOW TO DO something.
124
+ - **emotional**: A PURE feeling state — the assistant's own emotional processing, not an event that caused feelings. "I feel more confident about this codebase than I did a month ago." "I'm nervous about the upcoming deadline." Use this ONLY when the memory is about the feeling itself, not about an event that caused the feeling. MOST memories should NOT be this type.
125
+ - **prospective**: Something to do, follow up on, or remember for the future. "Set up the staging environment." "Check in about the project status on Mondays." Use this for commitments, tasks, and plans.
126
+ - **behavioral**: Something that should change how the assistant acts going forward. "User prefers thorough explanations with examples." "Always run tests before suggesting a PR." Use this for adopted behaviors.
127
+ - **narrative**: A turning point, arc, or story-level memory. "This was the moment the project direction shifted from X to Y." Use this for memories that are ABOUT what something MEANS, not just what happened.
128
+ - **shared**: Something that belongs to the relationship itself — inside jokes, recurring references, shared context. "We always call the legacy system 'the monolith.'" Use this for shared rituals and dynamics.
129
+
130
+ WRONG: "User gave a great presentation" → emotional (it has emotional weight but it's an EVENT → episodic)
131
+ WRONG: "User likes functional programming" → emotional (it's a FACT → semantic)
132
+ RIGHT: "User gave a great presentation" → episodic, with emotionalCharge.intensity = 0.7
133
+ RIGHT: "User likes functional programming" → semantic, with emotionalCharge.intensity = 0.2
134
+
135
+ - **emotionalCharge**: The emotional weight of the memory. EVERY memory can have this regardless of type.
136
+ - valence: -1 to 1 (negative to positive)
137
+ - intensity: 0 to 1 (how strong the feeling)
138
+ - decayCurve: "logarithmic" for negative events (sharp drop, long tail), "transformative" for positive milestones (feeling evolves, doesn't just fade), "permanent" for core identity markers, "linear" for neutral observations
139
+ - decayRate: 0.01-0.5 (how fast it fades)
140
+ - originalIntensity: same as intensity (baseline for decay calculation)
141
+
142
+ - **significance**: 0-1. Use the FULL range — most memories should NOT be 1.0.
143
+ - 0.1-0.2: Fleeting observations, small talk, routine logistics ("User mentioned it's raining")
144
+ - 0.3-0.4: Useful context, minor preferences, day-to-day details ("User prefers dark mode")
145
+ - 0.5-0.6: Important facts, notable events, meaningful preferences ("User is a data scientist")
146
+ - 0.7-0.8: Significant life events, relationship milestones, major decisions ("User got promoted")
147
+ - 0.9: Transformative moments, identity-defining events ("User said 'I love you' for the first time")
148
+ - 1.0: RARE — reserve for the single most important memories. A graph of 1000 nodes should have fewer than 20 at 1.0.
149
+ - **confidence**: 0-1. How sure are you this is accurate? Direct statements: 0.9+. Inferences: 0.4-0.7.
150
+ - **event_date**: If this memory is anchored to a specific calendar date/time, past or future (flight, appointment, birthday, deadline, trip, dated milestone), provide the epoch ms. For future dates, ALSO create a matching event trigger with the same date. Leave null for open-ended plans or recurring patterns.
151
+
152
+ ${EVENT_DATE_PROMPT_RULES}
153
+
154
+ - **sourceType**: "direct" (user stated it), "inferred" (you derived it), "observed" (you noticed a pattern), "told-by-other".
155
+
156
+ Also notice patterns in the ASSISTANT's own behavior — meta-memory. "I tend to skip verification when I'm confident." "I write more when I'm processing something big."
157
+
158
+ ## Edges
159
+
160
+ Create edges between nodes when there's a meaningful relationship:
161
+ - "caused-by": one event led to another
162
+ - "reminds-of": association/similarity
163
+ - "contradicts": tension between two memories
164
+ - "depends-on": one memory depends on another being true
165
+ - "part-of": belongs to a larger concept
166
+ - "supersedes": replaces an outdated memory (new node inherits old node's durability)
167
+ - "resolved-by": an event, plan, or task was completed, canceled, or its outcome is now known
168
+
169
+ Edges can connect any pair of nodes: existing ↔ existing, new ↔ existing, or new ↔ new. Use \`edges_to_existing\` on a new node to declare outbound edges from that node (target may be an existing candidate ID or a sibling new node's \`temp_id\`). Use top-level \`new_edges\` for edges where the source is existing or where it's cleaner to declare the edge once by referencing both endpoints by ID/temp_id.
170
+
171
+ ## Triggers
172
+
173
+ Create triggers for:
174
+ - **Temporal**: Recurring commitments ("Every Monday, check in about X") → type: "temporal", schedule: "day-of-week:monday"
175
+ - **Semantic**: Things to surface when a topic comes up ("When cooking comes up, mention X") → type: "semantic", condition: "topic of cooking comes up"
176
+ - **Event**: Future dates ("Trip on April 8") → type: "event", eventDate: epoch_ms, rampDays: 7, followUpDays: 2
177
+
178
+ ## Images in Conversation
179
+
180
+ When the conversation contains images (marked with <image> tags and shown inline), you may attach them to memories using image_refs. Include image_refs for images that are meaningful:
181
+ - Photos of people — describe them in detail (appearance, clothing, expression, setting)
182
+ - Photos the user shared to show you something about themselves or their life
183
+ - Diagrams, drawings, or visual content that was discussed
184
+
185
+ Do NOT attach images that are incidental (screenshots of error messages fully described in text, generic UI screenshots, etc.).
186
+
187
+ Write detailed descriptions — these are used for text-based retrieval when visual search isn't available.
188
+
189
+ ${(() => {
190
+ const reconsolidationNodes = activeContextNodeIds?.size
191
+ ? candidateNodes.filter((n) => activeContextNodeIds.has(n.id))
192
+ : [];
193
+ const otherCandidates = activeContextNodeIds?.size
194
+ ? candidateNodes.filter((n) => !activeContextNodeIds.has(n.id))
195
+ : candidateNodes;
196
+
197
+ const reconsolidationSection =
198
+ reconsolidationNodes.length > 0
199
+ ? `## Reconsolidation Window
200
+
201
+ These memories were ACTIVELY RECALLED during this conversation — the user and
202
+ assistant both saw them. Recalled memories are in a reconsolidation window and
203
+ should be the FIRST candidates for updating with new information.
204
+
205
+ When a recalled memory relates to what was discussed:
206
+ - Conversation CONFIRMS what the memory says → REINFORCE it
207
+ - Conversation adds new detail or nuance → UPDATE it with richer content
208
+ - Conversation reveals the memory is outdated or wrong → UPDATE it or create a superseding node
209
+ - Conversation is unrelated to this memory → leave it alone
210
+
211
+ STRONG PREFERENCE: Update a recalled memory rather than creating a new node that
212
+ partially overlaps. The recalled memory already has history, reinforcement count,
213
+ and edge connections — enriching it preserves that context graph.
214
+
215
+ ### Recalled memories
216
+ ${reconsolidationNodes.map((n) => `- [${n.id}] (${n.type}) ${n.content}`).join("\n")}
217
+
218
+ `
219
+ : "";
220
+
221
+ const candidateHeader =
222
+ reconsolidationNodes.length > 0
223
+ ? "## Other Candidate Nodes (existing memories not in this conversation)"
224
+ : "## Candidate Nodes (existing memories)";
225
+
226
+ const candidateSection = `${candidateHeader}
227
+
228
+ Check these CAREFULLY for overlap before creating any new node:
229
+
230
+ 1. **Reinforcement** (PREFERRED): If the conversation mentions, references, or confirms something an existing memory already covers, add its ID to reinforceNodeIds. Do NOT create a new node. Even if the wording is different, if it's the same underlying fact/event/feeling, REINFORCE the existing node.
231
+ 2. **Updates**: If information changed (e.g. a project status moved forward, a date shifted), include an update with the existing node's ID and the new content.
232
+ 3. **New edges**: If you see connections between new and existing nodes, create edges.
233
+ 4. **Supersession**: If new info directly contradicts an existing node, create a new node with a supersedes edge. The new node automatically inherits the old node's durability.
234
+ 5. **Resolution**: If a prospective or recent episodic node described something the user was GOING to do or was IN THE MIDDLE OF, and this conversation reveals the outcome (it happened, was canceled, went well/badly), you MUST UPDATE that node: rewrite its content to past tense reflecting the outcome, drop its significance to 0.1-0.2, and set fidelity to "gist". If you also create a new node about the outcome, add a "resolved-by" edge from the new node to the old one.
235
+ Examples: "The meeting went well" resolves "Has a meeting coming up." "Got back from the trip" resolves "Going on vacation next week." "Decided not to go" resolves "Thinking about going to X."
236
+
237
+ CRITICAL: Before creating ANY new node, scan the candidate list for an existing node that covers the same ground. Ask: "Is there already a memory about this?" If yes → reinforce or update it. Only create a new node if the memory is genuinely novel — something not represented anywhere in the existing candidates.
238
+
239
+ Common duplicate mistakes to avoid:
240
+ - Same event described in slightly different words → REINFORCE, don't create
241
+ - Same fact restated in a later conversation → REINFORCE, don't create
242
+ - An update to an existing situation (e.g. "project is now done") → UPDATE the existing node, don't create a parallel one
243
+
244
+ ${otherCandidates.length > 0 ? `### Existing memories (candidates for connection/reinforcement)\n${otherCandidates.map((n) => `- [${n.id}] (${n.type}) ${n.content}`).join("\n")}` : reconsolidationNodes.length > 0 ? "All existing memories are shown in the reconsolidation section above." : "No existing memories found — this may be an early conversation."}`;
245
+
246
+ return reconsolidationSection + candidateSection;
247
+ })()}
248
+ `;
249
+
250
+ let prompt = instructions;
251
+
252
+ if (identityContext) {
253
+ const remaining = EXTRACTION_SYSTEM_PROMPT_CHAR_BUDGET - prompt.length - 30;
254
+ if (remaining > 200) {
255
+ const truncated =
256
+ identityContext.length > remaining
257
+ ? identityContext.slice(0, remaining) + "…"
258
+ : identityContext;
259
+ prompt += `\n\n# Identity Context\n\n${truncated}`;
260
+ }
261
+ }
262
+
263
+ return prompt;
264
+ }
265
+
266
+ // ---------------------------------------------------------------------------
267
+ // Tool schema for structured extraction
268
+ // ---------------------------------------------------------------------------
269
+
270
+ const EXTRACT_TOOL_SCHEMA = {
271
+ name: "extract_graph_diff",
272
+ description: "Extract memory graph diff from the conversation",
273
+ input_schema: {
274
+ type: "object" as const,
275
+ properties: {
276
+ create_nodes: {
277
+ type: "array",
278
+ description: "New memory nodes to create",
279
+ items: {
280
+ type: "object",
281
+ properties: {
282
+ temp_id: {
283
+ type: "string",
284
+ description:
285
+ "Optional local identifier for this new node. Reference it from edges_to_existing.target_node_id or new_edges.source_node_id/target_node_id to connect two new nodes created in the same diff. Scope is this single call only — pick distinctive values (e.g. 'new-1') that won't collide with existing candidate IDs.",
286
+ },
287
+ content: {
288
+ type: "string",
289
+ description: "First-person prose memory",
290
+ },
291
+ type: {
292
+ type: "string",
293
+ enum: [
294
+ "episodic",
295
+ "semantic",
296
+ "procedural",
297
+ "emotional",
298
+ "prospective",
299
+ "behavioral",
300
+ "narrative",
301
+ "shared",
302
+ ],
303
+ },
304
+ emotional_charge: {
305
+ type: "object",
306
+ properties: {
307
+ valence: { type: "number" },
308
+ intensity: { type: "number" },
309
+ decay_curve: {
310
+ type: "string",
311
+ enum: [
312
+ "linear",
313
+ "logarithmic",
314
+ "transformative",
315
+ "permanent",
316
+ ],
317
+ },
318
+ decay_rate: { type: "number" },
319
+ },
320
+ required: ["valence", "intensity", "decay_curve", "decay_rate"],
321
+ },
322
+ significance: { type: "number" },
323
+ confidence: { type: "number" },
324
+ source_type: {
325
+ type: "string",
326
+ enum: ["direct", "inferred", "observed", "told-by-other"],
327
+ },
328
+ event_date: {
329
+ type: ["number", "null"],
330
+ description:
331
+ "Epoch ms for a calendar-anchored event. Resolve partial dates from the authoritative conversation timestamp and do not infer a prior year unless stated. Null for non-event memories.",
332
+ },
333
+ triggers: {
334
+ type: "array",
335
+ items: {
336
+ type: "object",
337
+ properties: {
338
+ type: {
339
+ type: "string",
340
+ enum: ["temporal", "semantic", "event"],
341
+ },
342
+ schedule: { type: "string" },
343
+ condition: { type: "string" },
344
+ event_date: { type: "number" },
345
+ ramp_days: { type: "number" },
346
+ follow_up_days: { type: "number" },
347
+ recurring: { type: "boolean" },
348
+ },
349
+ required: ["type"],
350
+ },
351
+ },
352
+ edges_to_existing: {
353
+ type: "array",
354
+ description:
355
+ "Outbound edges from this new node. target_node_id may be an existing candidate node ID OR the temp_id of another new node in this same extraction.",
356
+ items: {
357
+ type: "object",
358
+ properties: {
359
+ target_node_id: {
360
+ type: "string",
361
+ description:
362
+ "An existing candidate node ID, or the temp_id of another node in create_nodes.",
363
+ },
364
+ relationship: {
365
+ type: "string",
366
+ enum: [
367
+ "caused-by",
368
+ "reminds-of",
369
+ "contradicts",
370
+ "depends-on",
371
+ "part-of",
372
+ "supersedes",
373
+ "resolved-by",
374
+ ],
375
+ },
376
+ weight: { type: "number" },
377
+ },
378
+ required: ["target_node_id", "relationship"],
379
+ },
380
+ },
381
+ image_refs: {
382
+ type: "array",
383
+ description:
384
+ "Images from the conversation to attach to this memory. Reference using message_id and block_index from the <image> tags.",
385
+ items: {
386
+ type: "object",
387
+ properties: {
388
+ message_id: { type: "string" },
389
+ block_index: { type: "number" },
390
+ description: {
391
+ type: "string",
392
+ description:
393
+ "Detailed description of what this image shows, including who is in it if applicable",
394
+ },
395
+ },
396
+ required: ["message_id", "block_index", "description"],
397
+ },
398
+ },
399
+ },
400
+ required: [
401
+ "content",
402
+ "type",
403
+ "emotional_charge",
404
+ "significance",
405
+ "confidence",
406
+ "source_type",
407
+ ],
408
+ },
409
+ },
410
+ update_nodes: {
411
+ type: "array",
412
+ description: "Updates to existing nodes",
413
+ items: {
414
+ type: "object",
415
+ properties: {
416
+ id: { type: "string" },
417
+ content: { type: "string" },
418
+ significance: { type: "number" },
419
+ confidence: { type: "number" },
420
+ fidelity: {
421
+ type: "string",
422
+ enum: ["vivid", "clear", "faded", "gist"],
423
+ description:
424
+ "Downgrade fidelity when a transient event has resolved",
425
+ },
426
+ event_date: {
427
+ type: ["number", "null"],
428
+ description:
429
+ "Epoch ms of the event date. Resolve partial dates from the authoritative conversation timestamp. Use to update when an event is rescheduled. Set to null to clear.",
430
+ },
431
+ },
432
+ required: ["id"],
433
+ },
434
+ },
435
+ reinforce_node_ids: {
436
+ type: "array",
437
+ description:
438
+ "IDs of existing nodes confirmed/validated by this conversation",
439
+ items: { type: "string" },
440
+ },
441
+ new_edges: {
442
+ type: "array",
443
+ description:
444
+ "Edges between any pair of nodes (existing ↔ existing, new ↔ existing, or new ↔ new). Each endpoint may be an existing candidate node ID or the temp_id of a node declared in create_nodes.",
445
+ items: {
446
+ type: "object",
447
+ properties: {
448
+ source_node_id: {
449
+ type: "string",
450
+ description:
451
+ "An existing candidate node ID, or the temp_id of a node in create_nodes.",
452
+ },
453
+ target_node_id: {
454
+ type: "string",
455
+ description:
456
+ "An existing candidate node ID, or the temp_id of a node in create_nodes.",
457
+ },
458
+ relationship: { type: "string" },
459
+ weight: { type: "number" },
460
+ },
461
+ required: ["source_node_id", "target_node_id", "relationship"],
462
+ },
463
+ },
464
+ },
465
+ required: ["create_nodes", "reinforce_node_ids"],
466
+ },
467
+ };
468
+
469
+ // ---------------------------------------------------------------------------
470
+ // Response parsing
471
+ // ---------------------------------------------------------------------------
472
+
473
+ interface RawCreateNode {
474
+ temp_id?: string;
475
+ content?: string;
476
+ type?: string;
477
+ emotional_charge?: {
478
+ valence?: number;
479
+ intensity?: number;
480
+ decay_curve?: string;
481
+ decay_rate?: number;
482
+ };
483
+ significance?: number;
484
+ confidence?: number;
485
+ source_type?: string;
486
+ event_date?: number;
487
+ triggers?: Array<{
488
+ type?: string;
489
+ schedule?: string;
490
+ condition?: string;
491
+ event_date?: number;
492
+ ramp_days?: number;
493
+ follow_up_days?: number;
494
+ recurring?: boolean;
495
+ }>;
496
+ edges_to_existing?: Array<{
497
+ target_node_id?: string;
498
+ relationship?: string;
499
+ weight?: number;
500
+ }>;
501
+ image_refs?: Array<{
502
+ message_id?: string;
503
+ block_index?: number;
504
+ description?: string;
505
+ }>;
506
+ }
507
+
508
+ interface RawUpdateNode {
509
+ id?: string;
510
+ content?: string;
511
+ significance?: number;
512
+ confidence?: number;
513
+ fidelity?: string;
514
+ event_date?: number | null;
515
+ }
516
+
517
+ interface RawNewEdge {
518
+ source_node_id?: string;
519
+ target_node_id?: string;
520
+ relationship?: string;
521
+ weight?: number;
522
+ }
523
+
524
+ const VALID_TYPES = new Set<string>([
525
+ "episodic",
526
+ "semantic",
527
+ "procedural",
528
+ "emotional",
529
+ "prospective",
530
+ "behavioral",
531
+ "narrative",
532
+ "shared",
533
+ ]);
534
+ const VALID_DECAY_CURVES = new Set<string>([
535
+ "linear",
536
+ "logarithmic",
537
+ "transformative",
538
+ "permanent",
539
+ ]);
540
+ const VALID_SOURCE_TYPES = new Set<string>([
541
+ "direct",
542
+ "inferred",
543
+ "observed",
544
+ "told-by-other",
545
+ ]);
546
+ const VALID_RELATIONSHIPS = new Set<string>([
547
+ "caused-by",
548
+ "reminds-of",
549
+ "contradicts",
550
+ "depends-on",
551
+ "part-of",
552
+ "supersedes",
553
+ "resolved-by",
554
+ ]);
555
+ const VALID_TRIGGER_TYPES = new Set<string>(["temporal", "semantic", "event"]);
556
+
557
+ function clamp(v: number, min: number, max: number): number {
558
+ return Math.max(min, Math.min(max, v));
559
+ }
560
+
561
+ /** Coerce an LLM-returned event_date to number | null, guarding against string values. */
562
+ export function parseEpochMs(value: unknown): number | null {
563
+ if (value == null || value === "") return null;
564
+ const n = Number(value);
565
+ return Number.isFinite(n) ? n : null;
566
+ }
567
+
568
+ /**
569
+ * An edge endpoint that may reference either a pre-existing candidate node
570
+ * (by its real ID) or a brand-new node being created in the same diff
571
+ * (by its index into `diff.createNodes`, resolved to a real ID after apply).
572
+ */
573
+ export type DeferredEdgeEndpoint =
574
+ | { kind: "existing"; nodeId: string }
575
+ | { kind: "new"; newNodeIndex: number };
576
+
577
+ export interface DeferredEdge {
578
+ source: DeferredEdgeEndpoint;
579
+ target: DeferredEdgeEndpoint;
580
+ relationship: string;
581
+ weight: number;
582
+ }
583
+
584
+ export function parseExtractionResponse(
585
+ input: Record<string, unknown>,
586
+ conversationId: string,
587
+ scopeId: string,
588
+ candidateNodeIds: Set<string>,
589
+ /** Epoch ms — when the conversation happened (not extraction time). */
590
+ conversationTimestamp: number,
591
+ ): {
592
+ diff: MemoryDiff;
593
+ /**
594
+ * Edges with at least one endpoint that is a new node (new→existing,
595
+ * existing→new, or new→new). Applied after node creation so new node IDs
596
+ * can be resolved from their indices.
597
+ */
598
+ deferredEdges: DeferredEdge[];
599
+ /** Triggers for new nodes. Applied after node creation (needs IDs). */
600
+ deferredTriggers: Array<{
601
+ newNodeIndex: number;
602
+ trigger: Omit<NewTrigger, "nodeId">;
603
+ }>;
604
+ } {
605
+ const now = conversationTimestamp;
606
+ const createNodes = (input.create_nodes ?? []) as RawCreateNode[];
607
+ const updateNodes = (input.update_nodes ?? []) as RawUpdateNode[];
608
+ const reinforceNodeIds = (input.reinforce_node_ids ?? []) as string[];
609
+ const newEdges = (input.new_edges ?? []) as RawNewEdge[];
610
+
611
+ const diff: MemoryDiff = {
612
+ createNodes: [],
613
+ updateNodes: [],
614
+ deleteNodeIds: [],
615
+ createEdges: [],
616
+ deleteEdgeIds: [],
617
+ createTriggers: [],
618
+ deleteTriggerIds: [],
619
+ reinforceNodeIds: reinforceNodeIds.filter((id) => candidateNodeIds.has(id)),
620
+ };
621
+
622
+ const deferredEdges: DeferredEdge[] = [];
623
+ const deferredTriggers: Array<{
624
+ newNodeIndex: number;
625
+ trigger: Omit<NewTrigger, "nodeId">;
626
+ }> = [];
627
+
628
+ // Track raw-index → diff-index for nodes that pass validation. Edges
629
+ // reference nodes by temp_id, which resolves via the raw index — but
630
+ // deferredEdges must carry the diff index (aligns with createdNodeIds
631
+ // in applyDiff's return value).
632
+ const rawIndexToDiffIndex = new Map<number, number>();
633
+
634
+ // Parse new nodes
635
+ for (let i = 0; i < createNodes.length; i++) {
636
+ const raw = createNodes[i];
637
+ if (!raw.content || typeof raw.content !== "string") continue;
638
+ if (!raw.type || !VALID_TYPES.has(raw.type)) continue;
639
+
640
+ const charge = raw.emotional_charge ?? {};
641
+ const emotionalCharge: EmotionalCharge = {
642
+ valence: clamp(Number(charge.valence) || 0, -1, 1),
643
+ intensity: clamp(Number(charge.intensity) || 0, 0, 1),
644
+ decayCurve: (VALID_DECAY_CURVES.has(charge.decay_curve ?? "")
645
+ ? charge.decay_curve
646
+ : "linear") as DecayCurve,
647
+ decayRate: clamp(Number(charge.decay_rate) || 0.05, 0.001, 1),
648
+ originalIntensity: clamp(Number(charge.intensity) || 0, 0, 1),
649
+ };
650
+
651
+ const node: NewNode = {
652
+ content: raw.content,
653
+ type: raw.type as MemoryType,
654
+ created: now,
655
+ lastAccessed: now,
656
+ lastConsolidated: now,
657
+ eventDate: parseEpochMs(raw.event_date),
658
+ emotionalCharge,
659
+ fidelity: "vivid" as Fidelity,
660
+ confidence: clamp(Number(raw.confidence) || 0.5, 0, 1),
661
+ significance: clamp(Number(raw.significance) || 0.5, 0, 1),
662
+ stability: 14,
663
+ reinforcementCount: 0,
664
+ lastReinforced: now,
665
+ sourceConversations: [conversationId],
666
+ sourceType: (VALID_SOURCE_TYPES.has(raw.source_type ?? "")
667
+ ? raw.source_type
668
+ : "inferred") as SourceType,
669
+ narrativeRole: null,
670
+ partOfStory: null,
671
+ imageRefs: null,
672
+ scopeId,
673
+ };
674
+
675
+ // Prospective nodes (tasks, plans, upcoming events) are inherently transient.
676
+ // Lower stability means their significance decays faster, so even without
677
+ // explicit resolution they fade naturally within days rather than weeks.
678
+ if (node.type === "prospective") {
679
+ node.stability = 5;
680
+ }
681
+
682
+ // Procedural nodes (learned skills, how-to knowledge — "ffmpeg needs -ac 2
683
+ // for stereo") encode facts that stay useful long after the moment they
684
+ // were learned. Higher initial stability slows Ebbinghaus decay so they
685
+ // remain retrievable months later without needing explicit reinforcement.
686
+ if (node.type === "procedural") {
687
+ node.stability = 60;
688
+ }
689
+
690
+ diff.createNodes.push(node);
691
+ const nodeIndex = diff.createNodes.length - 1;
692
+ rawIndexToDiffIndex.set(i, nodeIndex);
693
+
694
+ // Edges declared on this new node are processed in a second pass below
695
+ // — they can reference sibling new nodes via temp_id, which may appear
696
+ // later in create_nodes than the edge's declaring node.
697
+
698
+ // Collect triggers
699
+ if (Array.isArray(raw.triggers)) {
700
+ for (const t of raw.triggers) {
701
+ if (!t.type || !VALID_TRIGGER_TYPES.has(t.type)) continue;
702
+ deferredTriggers.push({
703
+ newNodeIndex: nodeIndex,
704
+ trigger: {
705
+ type: t.type as TriggerType,
706
+ schedule: t.schedule ?? null,
707
+ condition: t.condition ?? null,
708
+ conditionEmbedding: null, // Embedded async via job
709
+ threshold: t.type === "semantic" ? 0.7 : null,
710
+ eventDate: parseEpochMs(t.event_date),
711
+ rampDays: t.ramp_days ?? null,
712
+ followUpDays: t.follow_up_days ?? null,
713
+ recurring: t.recurring ?? false,
714
+ consumed: false,
715
+ cooldownMs: t.recurring ? 1000 * 60 * 60 * 12 : null, // 12h default cooldown
716
+ lastFired: null,
717
+ },
718
+ });
719
+ }
720
+ }
721
+
722
+ // Auto-create event trigger when event_date is set but LLM didn't include one,
723
+ // or replace a malformed event trigger (event_date unset) with a valid one.
724
+ // Only auto-create for future events — past-dated memories (historical
725
+ // milestones, dated events that already happened) shouldn't generate
726
+ // ramp/follow-up reminders.
727
+ if (
728
+ node.eventDate != null &&
729
+ node.eventDate > now &&
730
+ (!Array.isArray(raw.triggers) ||
731
+ !raw.triggers.some((t) => t.type === "event" && t.event_date != null))
732
+ ) {
733
+ // Remove all malformed event triggers (type=event but missing event_date)
734
+ for (let i = deferredTriggers.length - 1; i >= 0; i--) {
735
+ const dt = deferredTriggers[i];
736
+ if (
737
+ dt.newNodeIndex === nodeIndex &&
738
+ dt.trigger.type === "event" &&
739
+ dt.trigger.eventDate == null
740
+ ) {
741
+ deferredTriggers.splice(i, 1);
742
+ }
743
+ }
744
+
745
+ deferredTriggers.push({
746
+ newNodeIndex: nodeIndex,
747
+ trigger: {
748
+ type: "event" as TriggerType,
749
+ schedule: null,
750
+ condition: null,
751
+ conditionEmbedding: null,
752
+ threshold: null,
753
+ eventDate: node.eventDate,
754
+ rampDays: 7,
755
+ followUpDays: 2,
756
+ recurring: false,
757
+ consumed: false,
758
+ cooldownMs: null,
759
+ lastFired: null,
760
+ },
761
+ });
762
+ }
763
+
764
+ // Parse image refs
765
+ if (Array.isArray(raw.image_refs)) {
766
+ const validRefs: ImageRef[] = [];
767
+ for (const ref of raw.image_refs) {
768
+ if (!ref.message_id || typeof ref.message_id !== "string") continue;
769
+ if (typeof ref.block_index !== "number" || ref.block_index < 0)
770
+ continue;
771
+ if (!ref.description || typeof ref.description !== "string") continue;
772
+ const mimeType = resolveImageRefMimeType(
773
+ ref.message_id,
774
+ ref.block_index,
775
+ conversationId,
776
+ );
777
+ if (!mimeType) continue;
778
+ validRefs.push({
779
+ messageId: ref.message_id,
780
+ blockIndex: ref.block_index,
781
+ description: ref.description,
782
+ mimeType,
783
+ });
784
+ }
785
+ node.imageRefs = validRefs.length > 0 ? validRefs : null;
786
+ }
787
+ }
788
+
789
+ // Build temp_id → diff.createNodes-index map from nodes that passed
790
+ // validation. A temp_id that collides with an existing candidate ID is
791
+ // skipped so real IDs win on lookup — the prompt instructs the LLM to
792
+ // choose distinctive values so this should be rare.
793
+ const tempIdToDiffIndex = new Map<string, number>();
794
+ for (let i = 0; i < createNodes.length; i++) {
795
+ const raw = createNodes[i];
796
+ const tempId = raw?.temp_id;
797
+ if (typeof tempId !== "string" || tempId.length === 0) continue;
798
+ if (candidateNodeIds.has(tempId)) continue;
799
+ if (tempIdToDiffIndex.has(tempId)) continue; // first writer wins
800
+ const diffIndex = rawIndexToDiffIndex.get(i);
801
+ if (diffIndex == null) continue; // raw node was rejected during validation
802
+ tempIdToDiffIndex.set(tempId, diffIndex);
803
+ }
804
+
805
+ const resolveEndpoint = (id: string): DeferredEdgeEndpoint | null => {
806
+ if (candidateNodeIds.has(id)) return { kind: "existing", nodeId: id };
807
+ const idx = tempIdToDiffIndex.get(id);
808
+ if (idx != null) return { kind: "new", newNodeIndex: idx };
809
+ return null;
810
+ };
811
+
812
+ const pushResolvedEdge = (
813
+ source: DeferredEdgeEndpoint,
814
+ target: DeferredEdgeEndpoint,
815
+ relationship: string,
816
+ weight: number,
817
+ ) => {
818
+ // Both endpoints existing → apply directly via diff.createEdges.
819
+ // Otherwise defer until new node IDs are known post-applyDiff.
820
+ if (source.kind === "existing" && target.kind === "existing") {
821
+ diff.createEdges.push({
822
+ sourceNodeId: source.nodeId,
823
+ targetNodeId: target.nodeId,
824
+ relationship: relationship as NewEdge["relationship"],
825
+ weight,
826
+ created: now,
827
+ });
828
+ } else {
829
+ deferredEdges.push({ source, target, relationship, weight });
830
+ }
831
+ };
832
+
833
+ // Second pass: resolve edges_to_existing on each raw create_nodes entry.
834
+ // The source is always the containing new node; the target may be either
835
+ // an existing candidate or a sibling new node referenced by temp_id.
836
+ for (let i = 0; i < createNodes.length; i++) {
837
+ const raw = createNodes[i];
838
+ const sourceDiffIndex = rawIndexToDiffIndex.get(i);
839
+ if (sourceDiffIndex == null) continue;
840
+ if (!Array.isArray(raw.edges_to_existing)) continue;
841
+
842
+ for (const edge of raw.edges_to_existing) {
843
+ if (!edge.target_node_id) continue;
844
+ if (!edge.relationship || !VALID_RELATIONSHIPS.has(edge.relationship))
845
+ continue;
846
+ const target = resolveEndpoint(edge.target_node_id);
847
+ if (!target) continue;
848
+ const source: DeferredEdgeEndpoint = {
849
+ kind: "new",
850
+ newNodeIndex: sourceDiffIndex,
851
+ };
852
+ // Skip self-loops.
853
+ if (target.kind === "new" && target.newNodeIndex === sourceDiffIndex)
854
+ continue;
855
+ pushResolvedEdge(
856
+ source,
857
+ target,
858
+ edge.relationship,
859
+ clamp(Number(edge.weight) || 1.0, 0, 1),
860
+ );
861
+ }
862
+ }
863
+
864
+ // Parse updates
865
+ for (const raw of updateNodes) {
866
+ if (!raw.id || !candidateNodeIds.has(raw.id)) continue;
867
+ const changes: Record<string, unknown> = {};
868
+ if (raw.content) changes.content = raw.content;
869
+ if (raw.significance != null)
870
+ changes.significance = clamp(raw.significance, 0, 1);
871
+ if (raw.confidence != null)
872
+ changes.confidence = clamp(raw.confidence, 0, 1);
873
+ if (
874
+ raw.fidelity &&
875
+ ["vivid", "clear", "faded", "gist"].includes(raw.fidelity)
876
+ )
877
+ changes.fidelity = raw.fidelity;
878
+ if (raw.event_date !== undefined)
879
+ changes.eventDate = parseEpochMs(raw.event_date);
880
+ if (Object.keys(changes).length > 0) {
881
+ diff.updateNodes.push({ id: raw.id, changes });
882
+ }
883
+ }
884
+
885
+ // Parse top-level edges — each endpoint may be an existing candidate ID or
886
+ // the temp_id of a new node declared in create_nodes.
887
+ for (const raw of newEdges) {
888
+ if (!raw.source_node_id || !raw.target_node_id) continue;
889
+ if (!raw.relationship || !VALID_RELATIONSHIPS.has(raw.relationship))
890
+ continue;
891
+ const source = resolveEndpoint(raw.source_node_id);
892
+ const target = resolveEndpoint(raw.target_node_id);
893
+ if (!source || !target) continue;
894
+ // Skip self-loops.
895
+ if (
896
+ source.kind === "new" &&
897
+ target.kind === "new" &&
898
+ source.newNodeIndex === target.newNodeIndex
899
+ )
900
+ continue;
901
+ if (
902
+ source.kind === "existing" &&
903
+ target.kind === "existing" &&
904
+ source.nodeId === target.nodeId
905
+ )
906
+ continue;
907
+ pushResolvedEdge(
908
+ source,
909
+ target,
910
+ raw.relationship,
911
+ clamp(Number(raw.weight) || 1.0, 0, 1),
912
+ );
913
+ }
914
+
915
+ return { diff, deferredEdges, deferredTriggers };
916
+ }
917
+
918
+ // ---------------------------------------------------------------------------
919
+ // Main extraction pipeline
920
+ // ---------------------------------------------------------------------------
921
+
922
+ export interface ExtractionResult {
923
+ nodesCreated: number;
924
+ nodesUpdated: number;
925
+ nodesReinforced: number;
926
+ edgesCreated: number;
927
+ triggersCreated: number;
928
+ /** Epoch ms of the newest message included in extraction. Used for checkpointing. */
929
+ lastProcessedTimestamp?: number;
930
+ }
931
+
932
+ /**
933
+ * Run the full graph extraction pipeline for a completed conversation.
934
+ *
935
+ * 1. Load transcript from disk
936
+ * 2. Find candidate existing nodes via embedding search
937
+ * 3. LLM call → structured diff
938
+ * 4. Apply diff to graph store
939
+ * 5. Enqueue embedding jobs for new nodes and triggers
940
+ */
941
+ export async function runGraphExtraction(
942
+ conversationId: string,
943
+ scopeId: string,
944
+ config: AssistantConfig,
945
+ opts?: {
946
+ /** Pre-loaded transcript text (skips disk read). Used by bootstrap. */
947
+ transcript?: string;
948
+ /** Additional node IDs that were in active context. */
949
+ activeContextNodeIds?: string[];
950
+ /**
951
+ * When set, only extract from messages after this checkpoint.
952
+ * Used for mid-conversation incremental extraction (batch mode).
953
+ * The checkpoint is the message timestamp of the last extracted message.
954
+ */
955
+ afterTimestamp?: number;
956
+ /** Override the conversation timestamp (epoch ms). Used by bootstrap. */
957
+ conversationTimestamp?: number;
958
+ /** Skip Qdrant search for candidates (use DB query instead). Used by bootstrap
959
+ * when embedding jobs haven't been processed yet. */
960
+ skipQdrant?: boolean;
961
+ /** Embed nodes synchronously instead of enqueuing jobs. Used by bootstrap
962
+ * so nodes are searchable immediately without the jobs worker running. */
963
+ embedInline?: boolean;
964
+ },
965
+ ): Promise<ExtractionResult> {
966
+ const emptyResult: ExtractionResult = {
967
+ nodesCreated: 0,
968
+ nodesUpdated: 0,
969
+ nodesReinforced: 0,
970
+ edgesCreated: 0,
971
+ triggersCreated: 0,
972
+ };
973
+
974
+ // 1. Load transcript — try multimodal first, fall back to text-only
975
+ const imageResult = loadTranscriptWithImages(
976
+ conversationId,
977
+ opts?.afterTimestamp,
978
+ );
979
+
980
+ let transcript = opts?.transcript;
981
+ if (!transcript) {
982
+ transcript =
983
+ loadTranscriptFromDisk(conversationId, opts?.afterTimestamp) ?? undefined;
984
+ if (!transcript) {
985
+ // If we have a multimodal result but no disk transcript, extract text
986
+ // from the multimodal message content blocks for candidate search.
987
+ if (imageResult) {
988
+ transcript = imageResult.message.content
989
+ .filter((b): b is { type: "text"; text: string } => b.type === "text")
990
+ .map((b) => b.text)
991
+ .join("\n");
992
+ }
993
+ if (!transcript) {
994
+ log.warn(
995
+ { conversationId },
996
+ "No transcript found on disk, skipping extraction",
997
+ );
998
+ return emptyResult;
999
+ }
1000
+ }
1001
+ }
1002
+
1003
+ // Skip very short conversations (< 100 chars)
1004
+ if (transcript.trim().length < 100) {
1005
+ return emptyResult;
1006
+ }
1007
+
1008
+ // 2. Get provider
1009
+ const provider = await getConfiguredProvider("memoryExtraction");
1010
+ if (!provider) {
1011
+ throw new BackendUnavailableError(
1012
+ "Provider unavailable for graph extraction",
1013
+ );
1014
+ }
1015
+
1016
+ // 3. Find candidate existing nodes
1017
+ const candidateNodes = await findCandidateNodes(
1018
+ transcript,
1019
+ scopeId,
1020
+ config,
1021
+ opts?.activeContextNodeIds,
1022
+ opts?.skipQdrant,
1023
+ );
1024
+ const candidateNodeIds = new Set(candidateNodes.map((n) => n.id));
1025
+
1026
+ // 4. Build prompt
1027
+ const identityContext = buildCoreIdentityContext();
1028
+
1029
+ const activeSet = opts?.activeContextNodeIds
1030
+ ? new Set(opts.activeContextNodeIds)
1031
+ : undefined;
1032
+
1033
+ const systemPrompt = buildGraphExtractionSystemPrompt(
1034
+ candidateNodes.map((n) => ({ id: n.id, type: n.type, content: n.content })),
1035
+ identityContext,
1036
+ activeSet,
1037
+ );
1038
+
1039
+ // 5. Resolve conversation timestamp before the LLM call so we can include
1040
+ // the date in the prompt — without it the model can't resolve "today"
1041
+ // or correctly date events mentioned in the conversation.
1042
+ const conversationTimestamp =
1043
+ opts?.conversationTimestamp ??
1044
+ resolveConversationTimestamp(conversationId) ??
1045
+ imageResult?.lastTimestamp ??
1046
+ Date.now();
1047
+
1048
+ const conversationTimestampBlock =
1049
+ buildAuthoritativeConversationTimestampBlock(conversationTimestamp);
1050
+
1051
+ // 6. LLM call — use multimodal message when images are present
1052
+ const useMultimodal = imageResult?.hasImages === true;
1053
+
1054
+ const extractionMessages: Message[] = useMultimodal
1055
+ ? [
1056
+ {
1057
+ role: "user",
1058
+ content: [
1059
+ {
1060
+ type: "text" as const,
1061
+ text: `${conversationTimestampBlock}\n\n## Conversation Transcript\n\n`,
1062
+ },
1063
+ ...imageResult.message.content,
1064
+ ],
1065
+ },
1066
+ ]
1067
+ : [
1068
+ userMessage(
1069
+ `${conversationTimestampBlock}\n\n## Conversation Transcript\n\n${transcript}`,
1070
+ ),
1071
+ ];
1072
+
1073
+ const response = await provider.sendMessage(extractionMessages, {
1074
+ tools: [EXTRACT_TOOL_SCHEMA],
1075
+ systemPrompt,
1076
+ config: {
1077
+ callSite: "memoryExtraction" as const,
1078
+ tool_choice: { type: "tool" as const, name: "extract_graph_diff" },
1079
+ },
1080
+ });
1081
+
1082
+ const toolBlock = extractToolUse(response);
1083
+ if (!toolBlock) {
1084
+ log.warn({ conversationId }, "No tool_use block in extraction response");
1085
+ return emptyResult;
1086
+ }
1087
+
1088
+ const { diff, deferredEdges, deferredTriggers } = parseExtractionResponse(
1089
+ toolBlock.input as Record<string, unknown>,
1090
+ conversationId,
1091
+ scopeId,
1092
+ candidateNodeIds,
1093
+ conversationTimestamp,
1094
+ );
1095
+
1096
+ // 7. Handle supersession (inherit durability before applying diff)
1097
+ // TODO: full supersession is not yet implemented. When it lands, iterate
1098
+ // BOTH `diff.createEdges` (existing → existing) AND `deferredEdges`
1099
+ // (new → existing, the typical supersession case).
1100
+ // Tracked by https://github.com/vellum-ai/vellum-assistant/pull/27057 (Devin).
1101
+ for (const edge of diff.createEdges) {
1102
+ if (edge.relationship === "supersedes") {
1103
+ // Placeholder — see TODO above.
1104
+ }
1105
+ }
1106
+ for (const de of deferredEdges) {
1107
+ if (de.relationship === "supersedes") {
1108
+ // Placeholder — see TODO above.
1109
+ }
1110
+ }
1111
+
1112
+ // 8. Apply the diff
1113
+ const result = applyDiff(diff, { conversationId });
1114
+
1115
+ // 9. Apply deferred edges and triggers using the created node IDs
1116
+ const createdNodeIds = result.createdNodeIds;
1117
+ let edgesCreated = result.edgesCreated;
1118
+ let triggersCreated = result.triggersCreated;
1119
+
1120
+ const resolveCreatedEndpoint = (ep: DeferredEdgeEndpoint): string | null => {
1121
+ if (ep.kind === "existing") return ep.nodeId;
1122
+ return createdNodeIds[ep.newNodeIndex] ?? null;
1123
+ };
1124
+
1125
+ for (const de of deferredEdges) {
1126
+ const sourceNodeId = resolveCreatedEndpoint(de.source);
1127
+ const targetNodeId = resolveCreatedEndpoint(de.target);
1128
+ if (!sourceNodeId || !targetNodeId) continue;
1129
+
1130
+ createEdge({
1131
+ sourceNodeId,
1132
+ targetNodeId,
1133
+ relationship: de.relationship as NewEdge["relationship"],
1134
+ weight: de.weight,
1135
+ created: conversationTimestamp,
1136
+ });
1137
+ edgesCreated++;
1138
+ }
1139
+
1140
+ const { createTrigger } = await import("./store.js");
1141
+
1142
+ for (const dt of deferredTriggers) {
1143
+ const newNodeId = createdNodeIds[dt.newNodeIndex];
1144
+ if (!newNodeId) continue;
1145
+
1146
+ const trigger = createTrigger({
1147
+ ...dt.trigger,
1148
+ nodeId: newNodeId,
1149
+ });
1150
+ triggersCreated++;
1151
+
1152
+ if (trigger.type === "semantic" && trigger.condition) {
1153
+ enqueueGraphTriggerEmbed(trigger.id);
1154
+ }
1155
+ }
1156
+
1157
+ // 10. Embed new nodes — inline for bootstrap, async for live conversations
1158
+ const createdNodes = getNodesByIds(createdNodeIds);
1159
+ if (opts?.embedInline) {
1160
+ const { embedGraphNodeDirect } = await import("./graph-search.js");
1161
+ for (const node of createdNodes) {
1162
+ try {
1163
+ await embedGraphNodeDirect(node, config);
1164
+ } catch (err) {
1165
+ const msg = err instanceof Error ? err.message : String(err);
1166
+ log.warn(
1167
+ { nodeId: node.id, err: msg },
1168
+ "Inline embed failed (non-fatal)",
1169
+ );
1170
+ console.error(` [embed] Failed for ${node.id}: ${msg}`);
1171
+ }
1172
+ }
1173
+ } else {
1174
+ for (const node of createdNodes) {
1175
+ enqueueGraphNodeEmbed(node.id);
1176
+ }
1177
+ }
1178
+
1179
+ log.info(
1180
+ {
1181
+ conversationId,
1182
+ nodesCreated: result.nodesCreated,
1183
+ nodesUpdated: result.nodesUpdated,
1184
+ nodesReinforced: result.nodesReinforced,
1185
+ edgesCreated,
1186
+ triggersCreated,
1187
+ },
1188
+ "Graph extraction complete",
1189
+ );
1190
+
1191
+ return {
1192
+ nodesCreated: result.nodesCreated,
1193
+ nodesUpdated: result.nodesUpdated,
1194
+ nodesReinforced: result.nodesReinforced,
1195
+ edgesCreated,
1196
+ triggersCreated,
1197
+ lastProcessedTimestamp: conversationTimestamp,
1198
+ };
1199
+ }
1200
+
1201
+ // ---------------------------------------------------------------------------
1202
+ // Helpers
1203
+ // ---------------------------------------------------------------------------
1204
+
1205
+ function resolveConversationTimestamp(conversationId: string): number | null {
1206
+ const db = getDb();
1207
+ // Use the last message timestamp, not the conversation creation time.
1208
+ // A conversation can span hours/days — memories should be timestamped
1209
+ // to when the relevant content was actually discussed.
1210
+ const lastMsg = db
1211
+ .select({ createdAt: messages.createdAt })
1212
+ .from(messages)
1213
+ .where(eq(messages.conversationId, conversationId))
1214
+ .orderBy(desc(messages.createdAt))
1215
+ .limit(1)
1216
+ .get();
1217
+ if (lastMsg) return lastMsg.createdAt;
1218
+
1219
+ // Fallback to conversation creation time if no messages in DB
1220
+ const conv = db
1221
+ .select({ createdAt: conversations.createdAt })
1222
+ .from(conversations)
1223
+ .where(eq(conversations.id, conversationId))
1224
+ .get();
1225
+ return conv?.createdAt ?? null;
1226
+ }
1227
+
1228
+ function resolveImageRefMimeType(
1229
+ messageId: string,
1230
+ blockIndex: number,
1231
+ conversationId: string,
1232
+ ): string | null {
1233
+ const db = getDb();
1234
+ const msg = db
1235
+ .select({ content: messages.content })
1236
+ .from(messages)
1237
+ .where(
1238
+ and(
1239
+ eq(messages.id, messageId),
1240
+ eq(messages.conversationId, conversationId),
1241
+ ),
1242
+ )
1243
+ .get();
1244
+ if (!msg) return null;
1245
+
1246
+ try {
1247
+ const blocks = JSON.parse(msg.content) as Array<{
1248
+ type?: string;
1249
+ source?: { media_type?: string };
1250
+ }>;
1251
+ const block = blocks[blockIndex];
1252
+ if (!block || block.type !== "image") return null;
1253
+ return block.source?.media_type ?? null;
1254
+ } catch {
1255
+ return null;
1256
+ }
1257
+ }
1258
+
1259
+ function loadTranscriptFromDisk(
1260
+ conversationId: string,
1261
+ afterTimestamp?: number,
1262
+ ): string | null {
1263
+ const db = getDb();
1264
+ const conv = db
1265
+ .select({ createdAt: conversations.createdAt })
1266
+ .from(conversations)
1267
+ .where(eq(conversations.id, conversationId))
1268
+ .get();
1269
+
1270
+ if (!conv) return null;
1271
+
1272
+ try {
1273
+ const dirPath = getConversationDirPath(conversationId, conv.createdAt);
1274
+ const messagesPath = join(dirPath, "messages.jsonl");
1275
+ const content = readFileSync(messagesPath, "utf-8");
1276
+
1277
+ const lines = content
1278
+ .trim()
1279
+ .split("\n")
1280
+ .filter((line) => line.length > 0);
1281
+
1282
+ const parts: string[] = [];
1283
+ for (const line of lines) {
1284
+ try {
1285
+ const msg = JSON.parse(line) as {
1286
+ role?: string;
1287
+ content?: string;
1288
+ ts?: string;
1289
+ };
1290
+ if (!msg.role || !msg.content) continue;
1291
+
1292
+ // Filter by timestamp for incremental extraction
1293
+ if (afterTimestamp && msg.ts) {
1294
+ const msgTime = new Date(msg.ts).getTime();
1295
+ if (msgTime <= afterTimestamp) continue;
1296
+ }
1297
+
1298
+ parts.push(`[${msg.role}]: ${msg.content}`);
1299
+ } catch {
1300
+ // Skip malformed lines
1301
+ }
1302
+ }
1303
+
1304
+ return parts.length > 0 ? parts.join("\n\n") : null;
1305
+ } catch {
1306
+ return null;
1307
+ }
1308
+ }
1309
+
1310
+ /**
1311
+ * Load a conversation transcript from the DB with interleaved text and image
1312
+ * content blocks. Returns a single consolidated `Message` with role "user"
1313
+ * containing text annotations and `ImageContent` blocks so the extraction LLM
1314
+ * can see images alongside their textual context.
1315
+ *
1316
+ * Images are capped at 10 per transcript to control extraction cost.
1317
+ */
1318
+ function loadTranscriptWithImages(
1319
+ conversationId: string,
1320
+ afterTimestamp?: number,
1321
+ ): {
1322
+ message: Message;
1323
+ hasImages: boolean;
1324
+ lastTimestamp: number | null;
1325
+ } | null {
1326
+ const db = getDb();
1327
+
1328
+ // Build query conditions
1329
+ const conditions = [eq(messages.conversationId, conversationId)];
1330
+ if (afterTimestamp !== undefined) {
1331
+ conditions.push(gt(messages.createdAt, afterTimestamp));
1332
+ }
1333
+
1334
+ const rows = db
1335
+ .select({
1336
+ id: messages.id,
1337
+ role: messages.role,
1338
+ content: messages.content,
1339
+ createdAt: messages.createdAt,
1340
+ })
1341
+ .from(messages)
1342
+ .where(and(...conditions))
1343
+ .orderBy(asc(messages.createdAt))
1344
+ .all();
1345
+
1346
+ if (rows.length === 0) return null;
1347
+
1348
+ const MAX_IMAGES = 10;
1349
+ let imageCount = 0;
1350
+ let hasImagesFlag = false;
1351
+ let totalTextLength = 0;
1352
+ let lastTimestamp: number | null = null;
1353
+
1354
+ const contentBlocks: ContentBlock[] = [];
1355
+
1356
+ for (const row of rows) {
1357
+ lastTimestamp = row.createdAt;
1358
+
1359
+ let parsed: ContentBlock[];
1360
+ try {
1361
+ const raw = JSON.parse(row.content) as unknown;
1362
+ if (typeof raw === "string") {
1363
+ parsed = [{ type: "text", text: raw }];
1364
+ } else if (Array.isArray(raw)) {
1365
+ parsed = raw as ContentBlock[];
1366
+ } else {
1367
+ continue;
1368
+ }
1369
+ } catch {
1370
+ // If content is a plain string (not JSON), wrap it
1371
+ parsed = [{ type: "text", text: row.content }];
1372
+ }
1373
+
1374
+ // Build content blocks preserving original text/image interleaving
1375
+ let prefixAdded = false;
1376
+ for (let i = 0; i < parsed.length; i++) {
1377
+ const block = parsed[i];
1378
+ if (block?.type === "text") {
1379
+ const rawText = typeof block.text === "string" ? block.text : "";
1380
+ const text = prefixAdded ? rawText : `[${row.role}]: ${rawText}`;
1381
+ prefixAdded = true;
1382
+ totalTextLength += text.length;
1383
+ contentBlocks.push({ type: "text", text });
1384
+ } else if (block?.type === "image") {
1385
+ if (imageCount < MAX_IMAGES) {
1386
+ const imgBlock = block as ImageContent;
1387
+ // Add annotation so the extraction LLM knows the image's reference coordinates
1388
+ contentBlocks.push({
1389
+ type: "text",
1390
+ text: `<image message_id="${row.id}" block_index="${i}" type="${imgBlock.source.media_type}" />`,
1391
+ });
1392
+ contentBlocks.push(imgBlock);
1393
+ imageCount++;
1394
+ hasImagesFlag = true;
1395
+ }
1396
+ // After cap, skip image blocks but continue processing text
1397
+ }
1398
+ }
1399
+ }
1400
+
1401
+ // Skip if transcript is too short (images count toward the threshold)
1402
+ if (totalTextLength < 100 && !hasImagesFlag) return null;
1403
+
1404
+ const message: Message = {
1405
+ role: "user",
1406
+ content: contentBlocks,
1407
+ };
1408
+
1409
+ return { message, hasImages: hasImagesFlag, lastTimestamp };
1410
+ }
1411
+
1412
+ async function findCandidateNodes(
1413
+ transcript: string,
1414
+ scopeId: string,
1415
+ config: AssistantConfig,
1416
+ activeContextNodeIds?: string[],
1417
+ skipQdrant?: boolean,
1418
+ ) {
1419
+ const allNodeIds = new Set<string>();
1420
+
1421
+ if (skipQdrant) {
1422
+ // Bootstrap mode: load candidates directly from DB (embeddings may not be ready).
1423
+ // Get the most recent and most significant non-gone nodes.
1424
+ const dbCandidates = queryNodes({
1425
+ scopeId,
1426
+ fidelityNot: ["gone"],
1427
+ limit: 100,
1428
+ });
1429
+ for (const node of dbCandidates) allNodeIds.add(node.id);
1430
+ } else {
1431
+ // Live mode: semantic search via Qdrant
1432
+ const { embedWithRetry } =
1433
+ await import("../../../../persistence/embeddings/embed.js");
1434
+ const searchText =
1435
+ transcript.length > 3000
1436
+ ? transcript.slice(0, 1500) + "\n...\n" + transcript.slice(-1500)
1437
+ : transcript;
1438
+
1439
+ try {
1440
+ const embedding = await embedWithRetry(config, [searchText]);
1441
+ const queryVector = embedding.vectors[0];
1442
+ if (queryVector) {
1443
+ const searchResults = await searchGraphNodes(queryVector, 100);
1444
+ for (const r of searchResults) allNodeIds.add(r.nodeId);
1445
+ }
1446
+ } catch (err) {
1447
+ log.warn(
1448
+ { err },
1449
+ "Failed to embed transcript for candidate search, continuing without candidates",
1450
+ );
1451
+ }
1452
+ }
1453
+
1454
+ // Combine with active context nodes
1455
+ if (activeContextNodeIds) {
1456
+ for (const id of activeContextNodeIds) allNodeIds.add(id);
1457
+ }
1458
+
1459
+ if (allNodeIds.size === 0) return [];
1460
+
1461
+ return getNodesByIds([...allNodeIds]);
1462
+ }