@remnic/core 9.27.0 → 9.29.0

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 (515) hide show
  1. package/dist/access-admin-ops-surface.d.ts +13 -10
  2. package/dist/access-admin-ops-surface.js +46 -41
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-authorization-probe.d.ts +13 -10
  5. package/dist/access-authorization-probe.js +47 -42
  6. package/dist/access-boundary.d.ts +13 -10
  7. package/dist/access-boundary.js +46 -41
  8. package/dist/access-cli.js +105 -96
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-health-types.d.ts +10 -1
  11. package/dist/access-http-lcm-compaction.d.ts +13 -10
  12. package/dist/access-http.d.ts +13 -10
  13. package/dist/access-http.js +56 -51
  14. package/dist/access-identity-continuity-surface.d.ts +9 -8
  15. package/dist/access-identity-continuity-surface.js +46 -41
  16. package/dist/access-lcm-surface.d.ts +13 -10
  17. package/dist/access-lcm-surface.js +46 -41
  18. package/dist/access-mcp.d.ts +13 -10
  19. package/dist/access-mcp.js +51 -46
  20. package/dist/access-memory-search-fanout.d.ts +2 -2
  21. package/dist/access-memory-search-fanout.js +3 -3
  22. package/dist/{access-namespace-preflight-wRSZEO5V.d.ts → access-namespace-preflight-DCXBkDp0.d.ts} +1 -1
  23. package/dist/access-namespace-preflight.d.ts +3 -3
  24. package/dist/access-namespace-preflight.js +46 -41
  25. package/dist/access-observe-write-surface.d.ts +13 -10
  26. package/dist/access-observe-write-surface.js +46 -41
  27. package/dist/access-operations-batch.js +48 -43
  28. package/dist/access-operations.d.ts +16 -13
  29. package/dist/access-operations.js +50 -45
  30. package/dist/access-recall-concurrency.d.ts +13 -10
  31. package/dist/access-recall-concurrency.js +46 -41
  32. package/dist/access-recall-response.d.ts +13 -10
  33. package/dist/access-recall-response.js +46 -41
  34. package/dist/access-recall-surface.d.ts +13 -10
  35. package/dist/access-recall-surface.js +46 -41
  36. package/dist/access-schema.d.ts +80 -80
  37. package/dist/access-schema.js +3 -3
  38. package/dist/{access-service-B4-Fu9x2.d.ts → access-service-DvPW_M5j.d.ts} +12 -8
  39. package/dist/access-service.d.ts +13 -10
  40. package/dist/access-service.js +46 -41
  41. package/dist/access-surface-catalog.d.ts +13 -10
  42. package/dist/access-wearables-meetings-surface.d.ts +4 -3
  43. package/dist/action-confidence.d.ts +1 -1
  44. package/dist/active-memory-bridge.d.ts +1 -1
  45. package/dist/active-memory-bridge.js +3 -3
  46. package/dist/active-recall.d.ts +1 -1
  47. package/dist/active-recall.js +4 -2
  48. package/dist/active-recall.js.map +1 -1
  49. package/dist/adapters/index.js +4 -4
  50. package/dist/adapters/registry.js +2 -2
  51. package/dist/behavior-learner.d.ts +1 -1
  52. package/dist/behavior-signals.d.ts +1 -1
  53. package/dist/bootstrap.d.ts +9 -8
  54. package/dist/briefing.d.ts +3 -2
  55. package/dist/briefing.js +14 -12
  56. package/dist/buffer-surprise-report.d.ts +1 -1
  57. package/dist/buffer.d.ts +3 -2
  58. package/dist/buffer.js +2 -2
  59. package/dist/bulk-import/index.d.ts +3 -3
  60. package/dist/calibration.d.ts +1 -1
  61. package/dist/capabilities.d.ts +3 -2
  62. package/dist/capabilities.js +1 -1
  63. package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-GWVG7LGC.js} +2 -2
  64. package/dist/{catalog-BLLxZ5L5.d.ts → catalog-BIVgftWu.d.ts} +1 -1
  65. package/dist/causal-behavior.d.ts +1 -1
  66. package/dist/causal-consolidation.d.ts +1 -1
  67. package/dist/causal-consolidation.js +15 -13
  68. package/dist/causal-consolidation.js.map +1 -1
  69. package/dist/causal-trajectory-graph.d.ts +1 -1
  70. package/dist/{chunk-CI26JDZA.js → chunk-2HNUMF5V.js} +6 -4
  71. package/dist/{chunk-CI26JDZA.js.map → chunk-2HNUMF5V.js.map} +1 -1
  72. package/dist/{chunk-NUWMZIYZ.js → chunk-2XC73SHY.js} +61 -43
  73. package/dist/chunk-2XC73SHY.js.map +1 -0
  74. package/dist/{chunk-RDQGLJRR.js → chunk-2XRE6FLM.js} +2 -1
  75. package/dist/{chunk-RDQGLJRR.js.map → chunk-2XRE6FLM.js.map} +1 -1
  76. package/dist/{chunk-2H7OEVPO.js → chunk-3GD2HFR6.js} +2 -2
  77. package/dist/{chunk-4TFIRMTE.js → chunk-4A6YGWQN.js} +2 -2
  78. package/dist/{chunk-JDOJZTFF.js → chunk-4PBVXX7L.js} +2 -2
  79. package/dist/{chunk-IKMAO55B.js → chunk-55MDBZLC.js} +2 -2
  80. package/dist/{chunk-VDX2J7OX.js → chunk-5W7CTZ2E.js} +4 -4
  81. package/dist/{chunk-B7GROTXD.js → chunk-6LKEUCEM.js} +2 -2
  82. package/dist/{chunk-2AJ72VVS.js → chunk-7BZOBA5J.js} +3 -3
  83. package/dist/{chunk-44DUJETW.js → chunk-7HXCF4RE.js} +2 -2
  84. package/dist/{chunk-X3SQYAPP.js → chunk-ACXPX4AG.js} +2 -2
  85. package/dist/{chunk-AJ7QCSIS.js → chunk-ALSGMEJR.js} +5 -5
  86. package/dist/{chunk-JGUXPJUQ.js → chunk-AS7YMSL6.js} +2 -2
  87. package/dist/{chunk-77CNV7DY.js → chunk-BLAKS3CP.js} +4 -4
  88. package/dist/{chunk-5BRT4Z2I.js → chunk-CMRQ34J5.js} +2 -2
  89. package/dist/{chunk-HEXSNYJD.js → chunk-CSMCNOPH.js} +8 -8
  90. package/dist/chunk-CVILPI77.js +432 -0
  91. package/dist/chunk-CVILPI77.js.map +1 -0
  92. package/dist/{chunk-SK3EYPKC.js → chunk-D2ANTDGO.js} +3 -3
  93. package/dist/{chunk-JCVQV6QX.js → chunk-D3LMYTBV.js} +7 -7
  94. package/dist/{chunk-GJJBPI6I.js → chunk-DRBXHRXE.js} +7 -3
  95. package/dist/chunk-DRBXHRXE.js.map +1 -0
  96. package/dist/{chunk-XY7QPJDA.js → chunk-E6EE5B67.js} +2 -2
  97. package/dist/{chunk-LLISELSY.js → chunk-EP5BVCRI.js} +2 -2
  98. package/dist/{chunk-PTN6UAUA.js → chunk-ES36HTSC.js} +4 -4
  99. package/dist/{chunk-WEAO45M4.js → chunk-ESBQWC3U.js} +4 -4
  100. package/dist/{chunk-EUSLKI4X.js → chunk-EVX44I7C.js} +5 -5
  101. package/dist/{chunk-CIQXI47W.js → chunk-FCDWWCLX.js} +1195 -271
  102. package/dist/chunk-FCDWWCLX.js.map +1 -0
  103. package/dist/{chunk-X6ROIHFE.js → chunk-G5R3D5UP.js} +2 -2
  104. package/dist/{chunk-MG6MNSP4.js → chunk-G6LBWZRF.js} +7 -7
  105. package/dist/{chunk-TKBDJTXG.js → chunk-GBJ4RDFR.js} +94 -20
  106. package/dist/chunk-GBJ4RDFR.js.map +1 -0
  107. package/dist/{chunk-FRVTCCGD.js → chunk-GGUBDXRR.js} +2 -2
  108. package/dist/{chunk-QH6CS6XJ.js → chunk-H24WNPA2.js} +2 -2
  109. package/dist/{chunk-V25OWXAC.js → chunk-HUHX2OCX.js} +1 -1
  110. package/dist/chunk-HUHX2OCX.js.map +1 -0
  111. package/dist/{chunk-TGQ2NTWH.js → chunk-IJ6WHMFB.js} +16 -2
  112. package/dist/{chunk-TGQ2NTWH.js.map → chunk-IJ6WHMFB.js.map} +1 -1
  113. package/dist/{chunk-EOLC6EXV.js → chunk-IMA2EWLV.js} +24 -3
  114. package/dist/chunk-IMA2EWLV.js.map +1 -0
  115. package/dist/{chunk-MQVINOJQ.js → chunk-IYZ5K7MU.js} +3 -3
  116. package/dist/{chunk-RPA2RX5P.js → chunk-JDZRYH2N.js} +2 -2
  117. package/dist/{chunk-M5EPMNS4.js → chunk-K5GB36ME.js} +2 -2
  118. package/dist/{chunk-UT3OQPFA.js → chunk-KUJQHXPH.js} +2 -2
  119. package/dist/{chunk-7RZJWZ46.js → chunk-LEPOP46W.js} +5 -5
  120. package/dist/{chunk-EYJSW2RV.js → chunk-NBDCZWP4.js} +4 -4
  121. package/dist/{chunk-XKGPIWGI.js → chunk-OFHFH655.js} +6 -6
  122. package/dist/{chunk-FGBJBYWP.js → chunk-OVRQLAYR.js} +3 -3
  123. package/dist/{chunk-BXLOS5AJ.js → chunk-OWHERGF2.js} +2 -2
  124. package/dist/chunk-P2BM76KT.js +528 -0
  125. package/dist/chunk-P2BM76KT.js.map +1 -0
  126. package/dist/{chunk-U3TH5Q2Q.js → chunk-P3MH72CI.js} +2 -2
  127. package/dist/{chunk-P2OZKKYP.js → chunk-PHWUFPCO.js} +2 -2
  128. package/dist/{chunk-KGTD2KZJ.js → chunk-PKRIQL3V.js} +2 -2
  129. package/dist/{chunk-BNGPHGVZ.js → chunk-Q6VFVAKZ.js} +13 -6
  130. package/dist/{chunk-BNGPHGVZ.js.map → chunk-Q6VFVAKZ.js.map} +1 -1
  131. package/dist/{chunk-4MJZTF42.js → chunk-QAOGGNE3.js} +3 -3
  132. package/dist/{chunk-RGJBM7Z3.js → chunk-QMBNMPQM.js} +84 -84
  133. package/dist/{chunk-RGJBM7Z3.js.map → chunk-QMBNMPQM.js.map} +1 -1
  134. package/dist/{chunk-2QSZNTDO.js → chunk-RKNJBZ55.js} +4 -4
  135. package/dist/chunk-RMMVQQA6.js +70 -0
  136. package/dist/chunk-RMMVQQA6.js.map +1 -0
  137. package/dist/{chunk-FCCMFVS6.js → chunk-RPSYDM6C.js} +2 -2
  138. package/dist/chunk-RPW2NOU6.js +33 -0
  139. package/dist/chunk-RPW2NOU6.js.map +1 -0
  140. package/dist/{chunk-RYHWZ52A.js → chunk-S2BBISHU.js} +4 -4
  141. package/dist/{chunk-RSYJV25N.js → chunk-SG265CVF.js} +10 -10
  142. package/dist/{chunk-UGH6VPPO.js → chunk-SH6YO3LT.js} +3 -3
  143. package/dist/{chunk-2RAC4JIG.js → chunk-T3GCXULH.js} +16 -16
  144. package/dist/chunk-T3GCXULH.js.map +1 -0
  145. package/dist/{chunk-FMLKOL2Z.js → chunk-TC3VNKGX.js} +4 -4
  146. package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
  147. package/dist/{chunk-BJJAX3IZ.js → chunk-UTRO5UJU.js} +2 -2
  148. package/dist/{chunk-DQEMWVMT.js → chunk-UVYI6VIX.js} +1 -1
  149. package/dist/chunk-VNA7W7QF.js +134 -0
  150. package/dist/chunk-VNA7W7QF.js.map +1 -0
  151. package/dist/{chunk-BHLN7L7M.js → chunk-VVIW3PTA.js} +17 -17
  152. package/dist/chunk-WNIUPHWV.js +152 -0
  153. package/dist/chunk-WNIUPHWV.js.map +1 -0
  154. package/dist/chunk-WOCNN776.js +742 -0
  155. package/dist/chunk-WOCNN776.js.map +1 -0
  156. package/dist/{chunk-XQ4EH6DI.js → chunk-WONS4RZ2.js} +3 -3
  157. package/dist/chunk-WRJVB3C2.js +118 -0
  158. package/dist/chunk-WRJVB3C2.js.map +1 -0
  159. package/dist/{chunk-HORJVJ6K.js → chunk-WZ7UB7XQ.js} +42 -37
  160. package/dist/chunk-WZ7UB7XQ.js.map +1 -0
  161. package/dist/{chunk-MEBQFQ26.js → chunk-XEQ7OT7U.js} +8 -6
  162. package/dist/chunk-XEQ7OT7U.js.map +1 -0
  163. package/dist/{chunk-CSXHRAJJ.js → chunk-XOZ4ALGB.js} +3 -3
  164. package/dist/{chunk-XKO7BM2C.js → chunk-YGHMSDLK.js} +187 -26
  165. package/dist/chunk-YGHMSDLK.js.map +1 -0
  166. package/dist/chunk-YXZG5TVN.js +40 -0
  167. package/dist/chunk-YXZG5TVN.js.map +1 -0
  168. package/dist/{chunk-6NNNURLK.js → chunk-Z54EM5YZ.js} +4 -4
  169. package/dist/{chunk-YSGBD3QN.js → chunk-ZGOQTOYA.js} +3 -3
  170. package/dist/{chunk-4DJQYKMN.js → chunk-ZIKENA2C.js} +2 -2
  171. package/dist/chunk-ZIKENA2C.js.map +1 -0
  172. package/dist/{chunk-RNY3BO35.js → chunk-ZXAGJFHJ.js} +4 -4
  173. package/dist/{cli-Bz7X7dGx.d.ts → cli-CxoSOiG0.d.ts} +5 -5
  174. package/dist/cli.d.ts +14 -12
  175. package/dist/cli.js +73 -68
  176. package/dist/compounding/engine.d.ts +3 -2
  177. package/dist/compounding/engine.js +15 -13
  178. package/dist/compounding/preference-consolidator.d.ts +1 -1
  179. package/dist/compression-optimizer.d.ts +1 -1
  180. package/dist/config.d.ts +1 -1
  181. package/dist/config.js +4 -2
  182. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  183. package/dist/connectors/codex-materialize-runner.js +14 -12
  184. package/dist/connectors/codex-materialize.d.ts +1 -1
  185. package/dist/connectors/index.d.ts +1 -1
  186. package/dist/connectors/index.js +15 -13
  187. package/dist/consolidation-provenance-check.d.ts +3 -2
  188. package/dist/consolidation-undo.d.ts +3 -2
  189. package/dist/contradiction/index.d.ts +3 -2
  190. package/dist/contradiction/index.js +6 -6
  191. package/dist/{contradiction-scan-HMF7CNKD.js → contradiction-scan-HYLIRMJ2.js} +3 -3
  192. package/dist/conversation-index/backend.d.ts +1 -1
  193. package/dist/conversation-index/backend.js +2 -2
  194. package/dist/conversation-index/chunker.d.ts +1 -1
  195. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  196. package/dist/conversation-index/indexer.d.ts +1 -1
  197. package/dist/conversation-index/search.d.ts +1 -1
  198. package/dist/corpus-watermark.d.ts +15 -2
  199. package/dist/corpus-watermark.js +27 -23
  200. package/dist/day-summary.d.ts +1 -1
  201. package/dist/day-summary.js +2 -2
  202. package/dist/delinearize.d.ts +1 -1
  203. package/dist/direct-answer-wiring.d.ts +1 -1
  204. package/dist/direct-answer.d.ts +1 -1
  205. package/dist/embedding-fallback.d.ts +1 -1
  206. package/dist/embedding-fallback.js +2 -2
  207. package/dist/enrichment/index.d.ts +1 -1
  208. package/dist/entity-id-normalization.d.ts +4 -0
  209. package/dist/entity-id-normalization.js +10 -0
  210. package/dist/entity-id-normalization.js.map +1 -0
  211. package/dist/entity-retrieval-boundaries.d.ts +3 -0
  212. package/dist/entity-retrieval-boundaries.js +8 -0
  213. package/dist/entity-retrieval-boundaries.js.map +1 -0
  214. package/dist/entity-retrieval.d.ts +3 -2
  215. package/dist/entity-retrieval.js +15 -12
  216. package/dist/entity-schema.d.ts +1 -1
  217. package/dist/entity-schema.js +1 -1
  218. package/dist/explicit-capture.d.ts +9 -8
  219. package/dist/explicit-capture.js +2 -2
  220. package/dist/extraction-error-classification.d.ts +1 -1
  221. package/dist/extraction-faithfulness.d.ts +1 -1
  222. package/dist/extraction-judge-telemetry.d.ts +1 -1
  223. package/dist/extraction-judge-training.d.ts +1 -1
  224. package/dist/extraction-judge.d.ts +1 -1
  225. package/dist/extraction-liveness.d.ts +1 -1
  226. package/dist/extraction-source-grounding-helpers.d.ts +34 -0
  227. package/dist/extraction-source-grounding-helpers.js +62 -0
  228. package/dist/extraction-source-grounding-helpers.js.map +1 -0
  229. package/dist/extraction-source-grounding-rules.d.ts +18 -0
  230. package/dist/extraction-source-grounding-rules.js +12 -0
  231. package/dist/extraction-source-grounding-rules.js.map +1 -0
  232. package/dist/extraction-source-grounding.d.ts +11 -0
  233. package/dist/extraction-source-grounding.js +13 -0
  234. package/dist/extraction-source-grounding.js.map +1 -0
  235. package/dist/extraction.d.ts +3 -1
  236. package/dist/extraction.js +7 -4
  237. package/dist/fallback-llm.d.ts +1 -1
  238. package/dist/{first-start-migration-LEXL3XYL.js → first-start-migration-F2QJD66E.js} +2 -2
  239. package/dist/graph-dashboard-diff.d.ts +1 -1
  240. package/dist/graph-dashboard-key.d.ts +1 -1
  241. package/dist/graph-dashboard-parser.d.ts +1 -1
  242. package/dist/graph-edge-reinforcement.d.ts +1 -1
  243. package/dist/graph-snapshot.d.ts +1 -1
  244. package/dist/graph.d.ts +1 -1
  245. package/dist/importance.d.ts +1 -1
  246. package/dist/importers/index.d.ts +1 -1
  247. package/dist/in-flight-reads.d.ts +1 -1
  248. package/dist/index.d.ts +407 -405
  249. package/dist/index.js +154 -145
  250. package/dist/intent.d.ts +1 -1
  251. package/dist/lcm/engine.d.ts +1 -1
  252. package/dist/lcm/engine.js +2 -2
  253. package/dist/lcm/index.d.ts +1 -1
  254. package/dist/lcm/index.js +2 -2
  255. package/dist/lcm/tools.d.ts +1 -1
  256. package/dist/lifecycle.d.ts +1 -1
  257. package/dist/live-connectors-runner.d.ts +1 -1
  258. package/dist/local-llm.d.ts +1 -1
  259. package/dist/local-llm.js +2 -2
  260. package/dist/local-model-endpoint.d.ts +1 -1
  261. package/dist/maintenance/memory-governance.d.ts +1 -1
  262. package/dist/maintenance/memory-governance.js +14 -12
  263. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
  264. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +14 -12
  265. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  266. package/dist/maintenance/rebuild-memory-projection.js +15 -13
  267. package/dist/{maintenance-DgnD2z8S.d.ts → maintenance-Cb-PjxQd.d.ts} +3 -3
  268. package/dist/mcp-memory-inspector-app.d.ts +13 -10
  269. package/dist/memory-action-policy.d.ts +1 -1
  270. package/dist/memory-cache.d.ts +1 -1
  271. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  272. package/dist/memory-projection-mutations.d.ts +4 -0
  273. package/dist/memory-projection-mutations.js +15 -0
  274. package/dist/memory-projection-mutations.js.map +1 -0
  275. package/dist/memory-projection-store.d.ts +1 -1
  276. package/dist/memory-provenance.d.ts +1 -1
  277. package/dist/memory-worth-outcomes.d.ts +3 -2
  278. package/dist/models-json.d.ts +1 -1
  279. package/dist/namespaces/migrate.d.ts +4 -3
  280. package/dist/namespaces/migrate.js +24 -22
  281. package/dist/namespaces/principal.d.ts +1 -1
  282. package/dist/namespaces/principal.js +2 -2
  283. package/dist/namespaces/search.d.ts +1 -1
  284. package/dist/namespaces/search.js +10 -10
  285. package/dist/namespaces/storage.d.ts +4 -3
  286. package/dist/namespaces/storage.js +14 -12
  287. package/dist/native-knowledge.d.ts +1 -1
  288. package/dist/offline-sync-impression-drain.d.ts +1 -1
  289. package/dist/offline-sync-impression-drain.js +7 -7
  290. package/dist/operator-doctor-corpus.d.ts +22 -3
  291. package/dist/operator-doctor-corpus.js +34 -24
  292. package/dist/operator-doctor-replica.d.ts +52 -0
  293. package/dist/operator-doctor-replica.js +15 -0
  294. package/dist/operator-doctor-replica.js.map +1 -0
  295. package/dist/operator-toolkit.d.ts +7 -3
  296. package/dist/operator-toolkit.js +37 -31
  297. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  298. package/dist/orchestration/compression-guideline-coordinator.js +2 -2
  299. package/dist/orchestration/maintenance.d.ts +5 -4
  300. package/dist/orchestration/maintenance.js +21 -19
  301. package/dist/{orchestrator-rIHmHpv1.d.ts → orchestrator-5GKqb_HL.d.ts} +7 -7
  302. package/dist/orchestrator.d.ts +9 -8
  303. package/dist/orchestrator.js +105 -96
  304. package/dist/patterns-cli.d.ts +1 -1
  305. package/dist/{pipeline-Bq5zU6Bp.d.ts → pipeline-3Qi1TpRo.d.ts} +1 -1
  306. package/dist/policy-runtime.d.ts +1 -1
  307. package/dist/proactive-contention.d.ts +1 -1
  308. package/dist/provenance.d.ts +1 -1
  309. package/dist/{qmd-3ILJkC70.d.ts → qmd-D9JqzzRX.d.ts} +1 -1
  310. package/dist/qmd-preflight.d.ts +2 -2
  311. package/dist/qmd-recall-cache.d.ts +1 -1
  312. package/dist/qmd.d.ts +2 -2
  313. package/dist/recall-concurrency-config.d.ts +1 -1
  314. package/dist/recall-disclosure-escalation.d.ts +1 -1
  315. package/dist/recall-explain-renderer.d.ts +1 -1
  316. package/dist/recall-explain-renderer.js +3 -3
  317. package/dist/recall-memory-map.d.ts +1 -1
  318. package/dist/recall-planner-llm.d.ts +1 -1
  319. package/dist/recall-state.d.ts +1 -1
  320. package/dist/recall-state.js +2 -2
  321. package/dist/recall-tag-filter.d.ts +1 -1
  322. package/dist/recall-timings.d.ts +1 -1
  323. package/dist/recall-xray-cli.d.ts +1 -1
  324. package/dist/recall-xray-cli.js +4 -4
  325. package/dist/recall-xray-renderer.d.ts +1 -1
  326. package/dist/recall-xray-renderer.js +3 -3
  327. package/dist/recall-xray.d.ts +1 -1
  328. package/dist/recall-xray.js +2 -2
  329. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  330. package/dist/replay/normalizers/claude.d.ts +1 -1
  331. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  332. package/dist/replay/normalizers/shared.d.ts +1 -1
  333. package/dist/replay/runner.d.ts +1 -1
  334. package/dist/replay/types.d.ts +1 -1
  335. package/dist/replica-divergence.d.ts +279 -0
  336. package/dist/replica-divergence.js +28 -0
  337. package/dist/replica-divergence.js.map +1 -0
  338. package/dist/replica-peers-config.d.ts +5 -0
  339. package/dist/replica-peers-config.js +13 -0
  340. package/dist/replica-peers-config.js.map +1 -0
  341. package/dist/resolve-auth-token.d.ts +21 -2
  342. package/dist/resolve-auth-token.js +5 -1
  343. package/dist/resume-bundles.js +5 -3
  344. package/dist/retrieval-agents.d.ts +2 -2
  345. package/dist/retrieval-tiers.d.ts +1 -1
  346. package/dist/routing/engine.d.ts +1 -1
  347. package/dist/routing/store.d.ts +1 -1
  348. package/dist/salvage-envelope.d.ts +1 -1
  349. package/dist/schemas.d.ts +54 -54
  350. package/dist/{scope-profiles-D0-ff4xT.d.ts → scope-profiles-C4g6_UdP.d.ts} +1 -1
  351. package/dist/search/embed-helper.d.ts +1 -1
  352. package/dist/search/embed-helper.js +2 -2
  353. package/dist/search/factory.d.ts +1 -1
  354. package/dist/search/factory.js +9 -9
  355. package/dist/search/index.d.ts +1 -1
  356. package/dist/search/index.js +9 -9
  357. package/dist/search/lancedb-backend.d.ts +1 -1
  358. package/dist/search/lancedb-backend.js +2 -2
  359. package/dist/search/meilisearch-backend.d.ts +1 -1
  360. package/dist/search/meilisearch-backend.js +2 -2
  361. package/dist/search/noop-backend.d.ts +1 -1
  362. package/dist/search/orama-backend.d.ts +1 -1
  363. package/dist/search/orama-backend.js +2 -2
  364. package/dist/search/port.d.ts +1 -1
  365. package/dist/search/remote-backend.d.ts +1 -1
  366. package/dist/{semantic-consolidation-4Tfh7c1g.d.ts → semantic-consolidation-BrxqnzTW.d.ts} +1 -1
  367. package/dist/semantic-consolidation.d.ts +2 -2
  368. package/dist/semantic-consolidation.js +15 -13
  369. package/dist/semantic-rule-promotion.js +14 -12
  370. package/dist/semantic-rule-verifier.d.ts +1 -1
  371. package/dist/semantic-rule-verifier.js +14 -12
  372. package/dist/{service-cTvil7D_.d.ts → service-Bi1JgxdP.d.ts} +2 -2
  373. package/dist/session-observer-bands.d.ts +1 -1
  374. package/dist/session-observer-state.d.ts +1 -1
  375. package/dist/shared-context/manager.d.ts +9 -9
  376. package/dist/shared-context/manager.js +2 -2
  377. package/dist/signal.d.ts +1 -1
  378. package/dist/{storage-C9ibpTme.d.ts → storage-CcH6yPk2.d.ts} +13 -19
  379. package/dist/storage.d.ts +3 -2
  380. package/dist/storage.js +15 -12
  381. package/dist/summarizer.d.ts +1 -1
  382. package/dist/summarizer.js +3 -3
  383. package/dist/summary-snapshot.d.ts +1 -1
  384. package/dist/temporal-supersession.d.ts +3 -2
  385. package/dist/temporal-timeline-recall.d.ts +1 -1
  386. package/dist/temporal-validity.d.ts +1 -1
  387. package/dist/threading.d.ts +1 -1
  388. package/dist/tier-migration.d.ts +3 -2
  389. package/dist/tier-routing.d.ts +1 -1
  390. package/dist/{tier-stats-XKD7SXYY.js → tier-stats-OPTSBNRH.js} +2 -2
  391. package/dist/topics.d.ts +1 -1
  392. package/dist/transcript.d.ts +1 -1
  393. package/dist/transfer/backup.js +2 -2
  394. package/dist/transfer/capsule-export.js +2 -2
  395. package/dist/transfer/capsule-import.js +2 -2
  396. package/dist/transfer/types.d.ts +66 -66
  397. package/dist/trust-score-stage.d.ts +1 -1
  398. package/dist/trust-score.d.ts +1 -1
  399. package/dist/{types-DHBxIF0s.d.ts → types-Dg0w9ADr.d.ts} +54 -4
  400. package/dist/types.d.ts +1 -1
  401. package/dist/types.js +1 -1
  402. package/dist/utility-runtime.d.ts +1 -1
  403. package/dist/verified-recall.js +14 -12
  404. package/dist/write-envelope.d.ts +1 -1
  405. package/package.json +2 -2
  406. package/src/access-health-types.ts +8 -0
  407. package/src/access-http.test.ts +4 -0
  408. package/src/access-service-health.test.ts +23 -0
  409. package/src/access-service.ts +27 -4
  410. package/src/capabilities.test.ts +1 -0
  411. package/src/capabilities.ts +7 -7
  412. package/src/cli.ts +9 -7
  413. package/src/config.test.ts +5 -0
  414. package/src/config.ts +3 -2
  415. package/src/corpus-watermark.test.ts +21 -0
  416. package/src/corpus-watermark.ts +25 -3
  417. package/src/entity-id-normalization.ts +55 -0
  418. package/src/entity-retrieval-boundaries.ts +134 -0
  419. package/src/entity-retrieval.ts +253 -27
  420. package/src/entity-schema.ts +2 -1
  421. package/src/extraction-source-grounding-helpers.ts +603 -0
  422. package/src/extraction-source-grounding-rules.ts +1031 -0
  423. package/src/extraction-source-grounding.test.ts +2337 -0
  424. package/src/extraction-source-grounding.ts +50 -0
  425. package/src/extraction.ts +120 -15
  426. package/src/memory-projection-mutations.ts +132 -0
  427. package/src/namespaces/storage.ts +5 -3
  428. package/src/operator-doctor-corpus.ts +41 -0
  429. package/src/operator-doctor-replica.test.ts +261 -0
  430. package/src/operator-doctor-replica.ts +129 -0
  431. package/src/operator-toolkit.ts +5 -4
  432. package/src/orchestration/orchestrator-init.ts +2 -2
  433. package/src/replica-divergence.test.ts +1475 -0
  434. package/src/replica-divergence.ts +910 -0
  435. package/src/replica-peers-config.ts +250 -0
  436. package/src/resolve-auth-token.ts +38 -0
  437. package/src/storage/entity-canonical-id-migration-adapter.ts +72 -0
  438. package/src/storage/entity-canonical-id-migration-runner.ts +68 -0
  439. package/src/storage/entity-canonical-id-migration.ts +904 -0
  440. package/src/storage/entity-store.ts +44 -0
  441. package/src/storage/memory-frontmatter-metadata.ts +17 -0
  442. package/src/storage/memory-migration-serialization.ts +37 -0
  443. package/src/storage/memory-read-store.ts +3 -2
  444. package/src/storage/profile-header.ts +8 -7
  445. package/src/storage-profile-timestamp.test.ts +68 -0
  446. package/src/storage.ts +68 -69
  447. package/src/types.ts +5 -5
  448. package/dist/chunk-2RAC4JIG.js.map +0 -1
  449. package/dist/chunk-4DJQYKMN.js.map +0 -1
  450. package/dist/chunk-CIQXI47W.js.map +0 -1
  451. package/dist/chunk-EOLC6EXV.js.map +0 -1
  452. package/dist/chunk-GJJBPI6I.js.map +0 -1
  453. package/dist/chunk-HORJVJ6K.js.map +0 -1
  454. package/dist/chunk-MEBQFQ26.js.map +0 -1
  455. package/dist/chunk-NUWMZIYZ.js.map +0 -1
  456. package/dist/chunk-TKBDJTXG.js.map +0 -1
  457. package/dist/chunk-V25OWXAC.js.map +0 -1
  458. package/dist/chunk-XKO7BM2C.js.map +0 -1
  459. /package/dist/{capsule-crypto-YO5QJ6L3.js.map → capsule-crypto-GWVG7LGC.js.map} +0 -0
  460. /package/dist/{chunk-2H7OEVPO.js.map → chunk-3GD2HFR6.js.map} +0 -0
  461. /package/dist/{chunk-4TFIRMTE.js.map → chunk-4A6YGWQN.js.map} +0 -0
  462. /package/dist/{chunk-JDOJZTFF.js.map → chunk-4PBVXX7L.js.map} +0 -0
  463. /package/dist/{chunk-IKMAO55B.js.map → chunk-55MDBZLC.js.map} +0 -0
  464. /package/dist/{chunk-VDX2J7OX.js.map → chunk-5W7CTZ2E.js.map} +0 -0
  465. /package/dist/{chunk-B7GROTXD.js.map → chunk-6LKEUCEM.js.map} +0 -0
  466. /package/dist/{chunk-2AJ72VVS.js.map → chunk-7BZOBA5J.js.map} +0 -0
  467. /package/dist/{chunk-44DUJETW.js.map → chunk-7HXCF4RE.js.map} +0 -0
  468. /package/dist/{chunk-X3SQYAPP.js.map → chunk-ACXPX4AG.js.map} +0 -0
  469. /package/dist/{chunk-AJ7QCSIS.js.map → chunk-ALSGMEJR.js.map} +0 -0
  470. /package/dist/{chunk-JGUXPJUQ.js.map → chunk-AS7YMSL6.js.map} +0 -0
  471. /package/dist/{chunk-77CNV7DY.js.map → chunk-BLAKS3CP.js.map} +0 -0
  472. /package/dist/{chunk-5BRT4Z2I.js.map → chunk-CMRQ34J5.js.map} +0 -0
  473. /package/dist/{chunk-HEXSNYJD.js.map → chunk-CSMCNOPH.js.map} +0 -0
  474. /package/dist/{chunk-SK3EYPKC.js.map → chunk-D2ANTDGO.js.map} +0 -0
  475. /package/dist/{chunk-JCVQV6QX.js.map → chunk-D3LMYTBV.js.map} +0 -0
  476. /package/dist/{chunk-XY7QPJDA.js.map → chunk-E6EE5B67.js.map} +0 -0
  477. /package/dist/{chunk-LLISELSY.js.map → chunk-EP5BVCRI.js.map} +0 -0
  478. /package/dist/{chunk-PTN6UAUA.js.map → chunk-ES36HTSC.js.map} +0 -0
  479. /package/dist/{chunk-WEAO45M4.js.map → chunk-ESBQWC3U.js.map} +0 -0
  480. /package/dist/{chunk-EUSLKI4X.js.map → chunk-EVX44I7C.js.map} +0 -0
  481. /package/dist/{chunk-X6ROIHFE.js.map → chunk-G5R3D5UP.js.map} +0 -0
  482. /package/dist/{chunk-MG6MNSP4.js.map → chunk-G6LBWZRF.js.map} +0 -0
  483. /package/dist/{chunk-FRVTCCGD.js.map → chunk-GGUBDXRR.js.map} +0 -0
  484. /package/dist/{chunk-QH6CS6XJ.js.map → chunk-H24WNPA2.js.map} +0 -0
  485. /package/dist/{chunk-MQVINOJQ.js.map → chunk-IYZ5K7MU.js.map} +0 -0
  486. /package/dist/{chunk-RPA2RX5P.js.map → chunk-JDZRYH2N.js.map} +0 -0
  487. /package/dist/{chunk-M5EPMNS4.js.map → chunk-K5GB36ME.js.map} +0 -0
  488. /package/dist/{chunk-UT3OQPFA.js.map → chunk-KUJQHXPH.js.map} +0 -0
  489. /package/dist/{chunk-7RZJWZ46.js.map → chunk-LEPOP46W.js.map} +0 -0
  490. /package/dist/{chunk-EYJSW2RV.js.map → chunk-NBDCZWP4.js.map} +0 -0
  491. /package/dist/{chunk-XKGPIWGI.js.map → chunk-OFHFH655.js.map} +0 -0
  492. /package/dist/{chunk-FGBJBYWP.js.map → chunk-OVRQLAYR.js.map} +0 -0
  493. /package/dist/{chunk-BXLOS5AJ.js.map → chunk-OWHERGF2.js.map} +0 -0
  494. /package/dist/{chunk-U3TH5Q2Q.js.map → chunk-P3MH72CI.js.map} +0 -0
  495. /package/dist/{chunk-P2OZKKYP.js.map → chunk-PHWUFPCO.js.map} +0 -0
  496. /package/dist/{chunk-KGTD2KZJ.js.map → chunk-PKRIQL3V.js.map} +0 -0
  497. /package/dist/{chunk-4MJZTF42.js.map → chunk-QAOGGNE3.js.map} +0 -0
  498. /package/dist/{chunk-2QSZNTDO.js.map → chunk-RKNJBZ55.js.map} +0 -0
  499. /package/dist/{chunk-FCCMFVS6.js.map → chunk-RPSYDM6C.js.map} +0 -0
  500. /package/dist/{chunk-RYHWZ52A.js.map → chunk-S2BBISHU.js.map} +0 -0
  501. /package/dist/{chunk-RSYJV25N.js.map → chunk-SG265CVF.js.map} +0 -0
  502. /package/dist/{chunk-UGH6VPPO.js.map → chunk-SH6YO3LT.js.map} +0 -0
  503. /package/dist/{chunk-FMLKOL2Z.js.map → chunk-TC3VNKGX.js.map} +0 -0
  504. /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
  505. /package/dist/{chunk-BJJAX3IZ.js.map → chunk-UTRO5UJU.js.map} +0 -0
  506. /package/dist/{chunk-DQEMWVMT.js.map → chunk-UVYI6VIX.js.map} +0 -0
  507. /package/dist/{chunk-BHLN7L7M.js.map → chunk-VVIW3PTA.js.map} +0 -0
  508. /package/dist/{chunk-XQ4EH6DI.js.map → chunk-WONS4RZ2.js.map} +0 -0
  509. /package/dist/{chunk-CSXHRAJJ.js.map → chunk-XOZ4ALGB.js.map} +0 -0
  510. /package/dist/{chunk-6NNNURLK.js.map → chunk-Z54EM5YZ.js.map} +0 -0
  511. /package/dist/{chunk-YSGBD3QN.js.map → chunk-ZGOQTOYA.js.map} +0 -0
  512. /package/dist/{chunk-RNY3BO35.js.map → chunk-ZXAGJFHJ.js.map} +0 -0
  513. /package/dist/{contradiction-scan-HMF7CNKD.js.map → contradiction-scan-HYLIRMJ2.js.map} +0 -0
  514. /package/dist/{first-start-migration-LEXL3XYL.js.map → first-start-migration-F2QJD66E.js.map} +0 -0
  515. /package/dist/{tier-stats-XKD7SXYY.js.map → tier-stats-OPTSBNRH.js.map} +0 -0
@@ -0,0 +1,50 @@
1
+ import type { ExtractionResult } from "./types.js";
2
+ import { delinearize } from "./delinearize.js";
3
+ import {
4
+ applyExtractionSourceGrounding as applyGroundingRules,
5
+ filterExtractionResultBySource as filterGroundingRules,
6
+ } from "./extraction-source-grounding-rules.js";
7
+ import type {
8
+ ExtractionGroundingRoleSources,
9
+ ExtractionSourceGroundingOptions,
10
+ } from "./extraction-source-grounding-rules.js";
11
+
12
+ export type { ExtractionGroundingRoleSources, ExtractionSourceGroundingOptions } from "./extraction-source-grounding-rules.js";
13
+
14
+ export function applyExtractionSourceGrounding(
15
+ result: ExtractionResult,
16
+ sourceText: string,
17
+ assertionSourceText: string = sourceText,
18
+ roleAssertionSources: ExtractionGroundingRoleSources | undefined,
19
+ messageTimestamp: Date | undefined,
20
+ options: ExtractionSourceGroundingOptions,
21
+ ): ExtractionResult {
22
+ const sourceForGrounding = (source: string | undefined): string | undefined =>
23
+ source === undefined || !options.anchorTemporalExpressions
24
+ ? source
25
+ : delinearize(source, result.entities, messageTimestamp ?? new Date());
26
+ const groundedRoleSources = roleAssertionSources === undefined
27
+ ? undefined
28
+ : {
29
+ profile: sourceForGrounding(roleAssertionSources.profile),
30
+ identity: sourceForGrounding(roleAssertionSources.identity),
31
+ };
32
+ return applyGroundingRules(
33
+ result,
34
+ sourceForGrounding(sourceText) ?? sourceText,
35
+ sourceForGrounding(assertionSourceText) ?? assertionSourceText,
36
+ groundedRoleSources,
37
+ messageTimestamp,
38
+ options,
39
+ );
40
+ }
41
+
42
+ export function filterExtractionResultBySource(
43
+ result: ExtractionResult,
44
+ source: string,
45
+ assertionSource?: string,
46
+ roleAssertionSources?: ExtractionGroundingRoleSources,
47
+ eventTimeNormalizer?: (eventTime: string) => string,
48
+ ): ExtractionResult {
49
+ return filterGroundingRules(result, source, assertionSource, roleAssertionSources, eventTimeNormalizer);
50
+ }
package/src/extraction.ts CHANGED
@@ -40,6 +40,7 @@ import { normalizeProcedureSteps } from "./procedural/procedure-types.js";
40
40
  import { normalizeReasoningTrace } from "./reasoning-trace-types.js";
41
41
  import { looksLikeMechanicalTelemetryTranscript } from "./telemetry-transcript.js";
42
42
  import { buildFactProvenance, type ProvenanceTurnInput } from "./provenance.js";
43
+ import { applyExtractionSourceGrounding, type ExtractionGroundingRoleSources } from "./extraction-source-grounding.js";
43
44
  import { isMemoryCategory } from "./write-envelope.js";
44
45
  import { classifyExtractionThrownError, classifyFallbackParseFailure } from "./extraction-error-classification.js";
45
46
  export { classifyExtractionThrownError, classifyFallbackParseFailure } from "./extraction-error-classification.js";
@@ -656,6 +657,10 @@ export class ExtractionEngine {
656
657
  private async applyProactiveQuestionPass(
657
658
  conversation: string,
658
659
  base: ExtractionResult,
660
+ groundingSource: string,
661
+ assertionSource: string,
662
+ messageTimestamp?: Date,
663
+ roleAssertionSources?: ExtractionGroundingRoleSources,
659
664
  ): Promise<ExtractionResult> {
660
665
  if (!resolvePipelineProcessingCapabilities(this.config).proactiveExtraction) return base;
661
666
  const maxAdditional = Math.max(0, Math.floor(this.config.maxProactiveQuestionsPerExtraction));
@@ -670,8 +675,16 @@ export class ExtractionEngine {
670
675
  proactive,
671
676
  maxAdditional,
672
677
  );
673
- if (!this.hasExtractionOutputs(proactiveAdditions)) return base;
674
- return this.mergeProactiveExtractionPass(base, proactiveAdditions, maxAdditional);
678
+ const sanitizedAdditions = this.sanitizeExtractionResult(proactiveAdditions, messageTimestamp);
679
+ const groundedAdditions = this.applySourceGrounding(
680
+ sanitizedAdditions,
681
+ groundingSource,
682
+ assertionSource,
683
+ roleAssertionSources,
684
+ messageTimestamp,
685
+ );
686
+ if (!this.hasExtractionOutputs(groundedAdditions)) return base;
687
+ return this.mergeProactiveExtractionPass(base, groundedAdditions, maxAdditional);
675
688
  } catch (err) {
676
689
  log.debug(`proactive extraction question pass failed (ignored): ${err}`);
677
690
  return base;
@@ -875,7 +888,7 @@ export class ExtractionEngine {
875
888
  if (localResponse?.content) {
876
889
  const parsed = this.parseProactiveExtractionResultFromText(localResponse.content.trim());
877
890
  if (parsed) {
878
- return this.sanitizeExtractionResult(parsed);
891
+ return parsed;
879
892
  }
880
893
  }
881
894
  if (!this.config.localLlmFallback) {
@@ -906,12 +919,10 @@ export class ExtractionEngine {
906
919
  if (!fallbackResult) {
907
920
  return { facts: [], profileUpdates: [], entities: [], questions: [] };
908
921
  }
909
- return this.sanitizeExtractionResult(
910
- this.normalizeExtractionResultPayload({
911
- ...fallbackResult,
912
- questions: [],
913
- }),
914
- );
922
+ return this.normalizeExtractionResultPayload({
923
+ ...fallbackResult,
924
+ questions: [],
925
+ });
915
926
  }
916
927
 
917
928
  private mergeProactiveExtractionPass(
@@ -1133,6 +1144,40 @@ export class ExtractionEngine {
1133
1144
  return { ...result, facts };
1134
1145
  }
1135
1146
 
1147
+ private applySourceGrounding(
1148
+ result: ExtractionResult,
1149
+ sourceText: string,
1150
+ assertionSourceText: string = sourceText,
1151
+ roleAssertionSources?: ExtractionGroundingRoleSources,
1152
+ messageTimestamp?: Date,
1153
+ ): ExtractionResult {
1154
+ const capabilities = resolvePipelineProcessingCapabilities(this.config);
1155
+ return applyExtractionSourceGrounding(
1156
+ result,
1157
+ sourceText,
1158
+ assertionSourceText,
1159
+ roleAssertionSources,
1160
+ messageTimestamp,
1161
+ {
1162
+ sourceGrounding: capabilities.sourceGrounding,
1163
+ anchorTemporalExpressions: capabilities.delinearize,
1164
+ },
1165
+ );
1166
+ }
1167
+
1168
+ private finalizeExtractionResult(
1169
+ result: ExtractionResult,
1170
+ turns: ReadonlyArray<{
1171
+ content: string;
1172
+ sessionKey?: string;
1173
+ logicalSessionKey?: string;
1174
+ timestamp: string;
1175
+ turnFingerprint?: string;
1176
+ }>,
1177
+ ): ExtractionResult {
1178
+ return this.attachProvenanceToResult(result, turns);
1179
+ }
1180
+
1136
1181
  async extract(turns: BufferTurn[], existingEntities?: string[]): Promise<ExtractionResult> {
1137
1182
  const lifecycleCaps = resolveMemoryLifecycleCapabilities(this.config);
1138
1183
 
@@ -1158,6 +1203,24 @@ export class ExtractionEngine {
1158
1203
  return `[${roleLabel}] ${t.content}`;
1159
1204
  })
1160
1205
  .join("\n\n");
1206
+
1207
+ const groundingSource = boundedTurns
1208
+ .map((turn) => turn.content)
1209
+ .join("\n\n");
1210
+ const assertionSource = boundedTurns
1211
+ .filter((turn) => turn.extractionContextOnly !== true)
1212
+ .map((turn) => turn.content)
1213
+ .join("\n\n");
1214
+ const roleAssertionSources: ExtractionGroundingRoleSources = {
1215
+ profile: boundedTurns
1216
+ .filter((turn) => turn.role === "user" && turn.extractionContextOnly !== true)
1217
+ .map((turn) => turn.content)
1218
+ .join("\n\n"),
1219
+ identity: boundedTurns
1220
+ .filter((turn) => turn.role === "assistant" && turn.extractionContextOnly !== true)
1221
+ .map((turn) => turn.content)
1222
+ .join("\n\n"),
1223
+ };
1161
1224
  if (conversation.trim().length === 0) {
1162
1225
  log.debug("extraction skipped — conversation only contained non-memory work-layer context");
1163
1226
  return { facts: [], profileUpdates: [], entities: [], questions: [] };
@@ -1213,8 +1276,22 @@ export class ExtractionEngine {
1213
1276
  this.emit({ kind: "llm_end", traceId, model: this.config.localLlmModel, operation: "extraction", durationMs });
1214
1277
  log.debug(`extraction: used local LLM — ${localResult.facts.length} facts, ${localResult.entities.length} entities`);
1215
1278
  const sanitized = this.sanitizeExtractionResult(localResult, messageTimestamp);
1216
- const finalResult = await this.applyProactiveQuestionPass(conversation, sanitized);
1217
- return this.attachProvenanceToResult(finalResult, boundedTurns);
1279
+ const grounded = this.applySourceGrounding(
1280
+ sanitized,
1281
+ groundingSource,
1282
+ assertionSource,
1283
+ roleAssertionSources,
1284
+ messageTimestamp,
1285
+ );
1286
+ const finalResult = await this.applyProactiveQuestionPass(
1287
+ conversation,
1288
+ grounded,
1289
+ groundingSource,
1290
+ assertionSource,
1291
+ messageTimestamp,
1292
+ roleAssertionSources,
1293
+ );
1294
+ return this.finalizeExtractionResult(finalResult, boundedTurns);
1218
1295
  }
1219
1296
  // Local failed, fall back if allowed
1220
1297
  if (!this.config.localLlmFallback) {
@@ -1260,8 +1337,22 @@ export class ExtractionEngine {
1260
1337
  this.emit({ kind: "llm_end", traceId, model: this.config.model, operation: "extraction", durationMs });
1261
1338
  log.debug(`extraction: used direct client (${this.config.model}) — ${directResult.facts.length} facts, ${directResult.entities.length} entities`);
1262
1339
  const sanitized = this.sanitizeExtractionResult(directResult, messageTimestamp);
1263
- const finalResult = await this.applyProactiveQuestionPass(conversation, sanitized);
1264
- return this.attachProvenanceToResult(finalResult, boundedTurns);
1340
+ const grounded = this.applySourceGrounding(
1341
+ sanitized,
1342
+ groundingSource,
1343
+ assertionSource,
1344
+ roleAssertionSources,
1345
+ messageTimestamp,
1346
+ );
1347
+ const finalResult = await this.applyProactiveQuestionPass(
1348
+ conversation,
1349
+ grounded,
1350
+ groundingSource,
1351
+ assertionSource,
1352
+ messageTimestamp,
1353
+ roleAssertionSources,
1354
+ );
1355
+ return this.finalizeExtractionResult(finalResult, boundedTurns);
1265
1356
  }
1266
1357
  // Emit error event so Opik sees the direct client failure before fallback.
1267
1358
  // Wrapped in try/catch so a subscriber error doesn't break the fallback path.
@@ -1345,8 +1436,22 @@ export class ExtractionEngine {
1345
1436
  );
1346
1437
  const normalized = this.normalizeExtractionResultPayload(result);
1347
1438
  const sanitized = this.sanitizeExtractionResult(normalized, messageTimestamp);
1348
- const finalResult = await this.applyProactiveQuestionPass(conversation, sanitized);
1349
- return this.attachProvenanceToResult(finalResult, boundedTurns);
1439
+ const grounded = this.applySourceGrounding(
1440
+ sanitized,
1441
+ groundingSource,
1442
+ assertionSource,
1443
+ roleAssertionSources,
1444
+ messageTimestamp,
1445
+ );
1446
+ const finalResult = await this.applyProactiveQuestionPass(
1447
+ conversation,
1448
+ grounded,
1449
+ groundingSource,
1450
+ assertionSource,
1451
+ messageTimestamp,
1452
+ roleAssertionSources,
1453
+ );
1454
+ return this.finalizeExtractionResult(finalResult, boundedTurns);
1350
1455
  }
1351
1456
 
1352
1457
  this.emit({
@@ -0,0 +1,132 @@
1
+ import { lstat, realpath } from "node:fs/promises";
2
+ import { isErrnoCode } from "./utils/errno.js";
3
+ import { assertPathInsideRoot } from "./utils/path-containment.js";
4
+ import { getMemoryProjectionPath, initializeMemoryProjectionDb } from "./memory-projection-store.js";
5
+ import { type BetterSqlite3Database, openBetterSqlite3 } from "./runtime/better-sqlite.js";
6
+
7
+ const PROJECTION_WRITE_BUSY_TIMEOUT_MS = 100;
8
+ const PROJECTION_WRITE_RETRY_COUNT = 4;
9
+ const PROJECTION_WRITE_RETRY_DELAY_MS = 100;
10
+
11
+ function isSqliteBusyError(error: unknown): boolean {
12
+ const messages: string[] = [];
13
+ const seen = new Set<unknown>();
14
+ let current: unknown = error;
15
+ while (current !== null && typeof current === "object" && !seen.has(current)) {
16
+ seen.add(current);
17
+ if (current instanceof Error) messages.push(current.message);
18
+ if (!("cause" in current)) break;
19
+ current = current.cause;
20
+ }
21
+ const lower = messages.join("\n").toLowerCase();
22
+ return lower.includes("database is locked") || lower.includes("sqlite_busy");
23
+ }
24
+
25
+ async function validateProjectionPath(
26
+ memoryDir: string,
27
+ projectionPath: string,
28
+ ): Promise<boolean> {
29
+ let projectionStat;
30
+ try {
31
+ projectionStat = await lstat(projectionPath);
32
+ } catch (error) {
33
+ if (isErrnoCode(error, "ENOENT")) return false;
34
+ throw error;
35
+ }
36
+ if (projectionStat.isSymbolicLink() || !projectionStat.isFile()) {
37
+ throw new Error(`Refusing memory projection rewrite through unsafe database path: ${projectionPath}.`);
38
+ }
39
+ const [memoryRoot, projectionReal] = await Promise.all([
40
+ realpath(memoryDir),
41
+ realpath(projectionPath),
42
+ ]);
43
+ assertPathInsideRoot(memoryRoot, projectionReal, projectionPath);
44
+ return true;
45
+ }
46
+
47
+ async function rewriteProjectedEntityReferenceRows(
48
+ memoryDir: string,
49
+ entries: ReadonlyArray<readonly [string, string]>,
50
+ memoryId?: string,
51
+ ): Promise<void> {
52
+ if (memoryId !== undefined && memoryId.length === 0) {
53
+ throw new Error("Projection memoryId must not be empty.");
54
+ }
55
+ const scopedMemory = memoryId !== undefined;
56
+ const validEntries = entries.filter(
57
+ ([previousEntityRef, nextEntityRef]) =>
58
+ previousEntityRef.length > 0 && nextEntityRef.length > 0 && previousEntityRef !== nextEntityRef,
59
+ );
60
+ if (validEntries.length === 0) return;
61
+
62
+ const projectionPath = getMemoryProjectionPath(memoryDir);
63
+ if (!(await validateProjectionPath(memoryDir, projectionPath))) return;
64
+
65
+ let lastError: unknown;
66
+ for (let attempt = 0; attempt < PROJECTION_WRITE_RETRY_COUNT; attempt += 1) {
67
+ if (!(await validateProjectionPath(memoryDir, projectionPath))) return;
68
+ let db: BetterSqlite3Database | null = null;
69
+ try {
70
+ db = openBetterSqlite3(projectionPath, { fileMustExist: true });
71
+ db.pragma(`busy_timeout = ${PROJECTION_WRITE_BUSY_TIMEOUT_MS}`);
72
+ initializeMemoryProjectionDb(db);
73
+ const updateCurrent = db.prepare(
74
+ scopedMemory
75
+ ? "UPDATE memory_current SET entity_ref = ? WHERE memory_id = ? AND entity_ref = ?"
76
+ : "UPDATE memory_current SET entity_ref = ? WHERE entity_ref = ?",
77
+ );
78
+ const updateMentions = db.prepare(
79
+ scopedMemory
80
+ ? `
81
+ UPDATE memory_entity_mentions
82
+ SET entity_ref = ?
83
+ WHERE memory_id = ? AND entity_ref = ? AND mention_source = 'frontmatter.entityRef'
84
+ `
85
+ : `
86
+ UPDATE memory_entity_mentions
87
+ SET entity_ref = ?
88
+ WHERE entity_ref = ? AND mention_source = 'frontmatter.entityRef'
89
+ `,
90
+ );
91
+ const rewrite = db.transaction(() => {
92
+ for (const [previousEntityRef, nextEntityRef] of validEntries) {
93
+ const params = scopedMemory
94
+ ? [nextEntityRef, memoryId, previousEntityRef]
95
+ : [nextEntityRef, previousEntityRef];
96
+ updateCurrent.run(...params);
97
+ updateMentions.run(...params);
98
+ }
99
+ });
100
+ rewrite();
101
+ return;
102
+ } catch (error) {
103
+ lastError = error;
104
+ if (!isSqliteBusyError(error) || attempt === PROJECTION_WRITE_RETRY_COUNT - 1) {
105
+ throw error;
106
+ }
107
+ const { promise, resolve } = Promise.withResolvers<void>();
108
+ setTimeout(resolve, PROJECTION_WRITE_RETRY_DELAY_MS);
109
+ await promise;
110
+ } finally {
111
+ db?.close();
112
+ }
113
+ }
114
+
115
+ throw lastError instanceof Error ? lastError : new Error("Projection rewrite failed.");
116
+ }
117
+
118
+ export async function rewriteProjectedMemoryEntityReference(
119
+ memoryDir: string,
120
+ memoryId: string,
121
+ previousEntityRef: string,
122
+ nextEntityRef: string,
123
+ ): Promise<void> {
124
+ await rewriteProjectedEntityReferenceRows(memoryDir, [[previousEntityRef, nextEntityRef]], memoryId);
125
+ }
126
+
127
+ export async function rewriteProjectedEntityReferences(
128
+ memoryDir: string,
129
+ replacements: Readonly<Record<string, string>>,
130
+ ): Promise<void> {
131
+ await rewriteProjectedEntityReferenceRows(memoryDir, Object.entries(replacements));
132
+ }
@@ -284,6 +284,7 @@ export class NamespaceStorageRouter {
284
284
  root = await this.defaultNamespaceRoot();
285
285
  const cached = this.cache.get(ns);
286
286
  if (cached && cached.dir === root) {
287
+ await this.applySecureStoreConfig(cached);
287
288
  this.notifyResolved(ns, root);
288
289
  return cached;
289
290
  }
@@ -291,6 +292,7 @@ export class NamespaceStorageRouter {
291
292
  const cached = this.cache.get(ns);
292
293
  root = await this.namespaceRoot(ns);
293
294
  if (cached && cached.dir === root) {
295
+ await this.applySecureStoreConfig(cached);
294
296
  this.notifyResolved(ns, root);
295
297
  return cached;
296
298
  }
@@ -335,7 +337,7 @@ export class NamespaceStorageRouter {
335
337
  // recovery paths (e.g. the CLI lifecycle-ledger rebuild) refuse an encrypted
336
338
  // ledger they could actually rewrite, and namespace writes could silently
337
339
  // fall back to plaintext. Mirror the orchestrator's setup exactly.
338
- this.applySecureStoreConfig(sm);
340
+ await this.applySecureStoreConfig(sm);
339
341
  this.cache.set(ns, sm);
340
342
  // #2019: let the orchestrator wire write-triggered prioritized embedding on
341
343
  // every router-created namespace storage, not just the primary default store.
@@ -478,12 +480,12 @@ export class NamespaceStorageRouter {
478
480
  * root keyring id — exactly the id the orchestrator and `secure-store unlock`
479
481
  * register under. No-op when secure-store is disabled.
480
482
  */
481
- private applySecureStoreConfig(sm: StorageManager): void {
483
+ private async applySecureStoreConfig(sm: StorageManager): Promise<void> {
482
484
  if (!resolveRecallAuxiliaryCapabilities(this.config).secureStore) return;
483
485
  sm.setSecureStoreRequired(true);
484
486
  const existingKey = keyring.getKey(secureStoreDir(this.config.memoryDir));
485
487
  if (existingKey) {
486
- sm.setSecureStoreKey(existingKey, this.config.secureStoreEncryptOnWrite);
488
+ await sm.setSecureStoreKeyAndWait(existingKey, this.config.secureStoreEncryptOnWrite);
487
489
  }
488
490
  }
489
491
 
@@ -23,7 +23,9 @@ import {
23
23
  computeCorpusWatermarks,
24
24
  resolveCorpusNamespaceRoots,
25
25
  } from "./corpus-watermark.js";
26
+ import { summarizeReplicaDivergence } from "./operator-doctor-replica.js";
26
27
  import type { OperatorDoctorCheck } from "./operator-toolkit.js";
28
+ import type { ResolveSecretRefFn } from "./resolve-auth-token.js";
27
29
  import type { PluginConfig } from "./types.js";
28
30
 
29
31
  const DIGEST_PREFIX_LENGTH = 12;
@@ -93,3 +95,42 @@ export async function summarizeCorpusWatermark(
93
95
  details: { corpus: watermarks },
94
96
  };
95
97
  }
98
+
99
+ /**
100
+ * Extract the watermark array this check stores under `details.corpus` (issue
101
+ * #2149). The replica-divergence doctor check reuses the local watermark set
102
+ * computed here rather than rescanning the corpus, and consumes it through this
103
+ * helper so the `details.corpus` shape stays owned by the module that produces it.
104
+ */
105
+ export function corpusWatermarksFromCheck(check: OperatorDoctorCheck): CorpusWatermark[] {
106
+ const details = check.details;
107
+ if (!details || typeof details !== "object" || !("corpus" in details) || !Array.isArray(details.corpus)) {
108
+ return [];
109
+ }
110
+ // This check always stores a CorpusWatermark[] under `corpus` (guarded above).
111
+ return details.corpus as CorpusWatermark[];
112
+ }
113
+
114
+ /**
115
+ * Build the corpus-watermark and replica-divergence doctor checks together.
116
+ *
117
+ * They are paired deliberately: the replica comparison consumes the corpus
118
+ * check's watermarks (one scan, not two) AND its completeness — an incomplete
119
+ * local census must not let the replica check certify convergence. The pairing
120
+ * lives HERE, next to the corpus check + `corpusWatermarksFromCheck` it consumes
121
+ * and the `PluginConfig` it needs, so the sibling replica module stays a light
122
+ * tsup DTS entry free of the heavy `PluginConfig` type graph (round 6, coderabbit).
123
+ */
124
+ export async function summarizeCorpusAndReplica(
125
+ config: PluginConfig,
126
+ storageFactory: (dir: string) => CorpusStorage,
127
+ resolveSecretRef?: ResolveSecretRefFn | null,
128
+ ): Promise<OperatorDoctorCheck[]> {
129
+ const watermarkCheck = await summarizeCorpusWatermark(config, storageFactory);
130
+ const replicaCheck = await summarizeReplicaDivergence(
131
+ config.replicaPeers,
132
+ corpusWatermarksFromCheck(watermarkCheck),
133
+ { resolveSecretRef, localCensusComplete: watermarkCheck.status === "ok" },
134
+ );
135
+ return [watermarkCheck, replicaCheck];
136
+ }