@remnic/core 9.49.0 → 9.49.1

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 (606) hide show
  1. package/dist/abstraction-nodes.d.ts +12 -1
  2. package/dist/abstraction-nodes.js +9 -2
  3. package/dist/access-admin-ops-surface.d.ts +10 -10
  4. package/dist/access-admin-ops-surface.js +48 -48
  5. package/dist/access-authorization-probe.d.ts +10 -10
  6. package/dist/access-authorization-probe.js +49 -49
  7. package/dist/access-boundary.d.ts +10 -10
  8. package/dist/access-boundary.js +48 -48
  9. package/dist/access-cli.js +132 -127
  10. package/dist/access-cli.js.map +1 -1
  11. package/dist/access-coding-context-resolution.d.ts +1 -1
  12. package/dist/access-extraction-force-flush.d.ts +10 -10
  13. package/dist/access-extraction-force-flush.js +48 -48
  14. package/dist/access-health-types.d.ts +1 -1
  15. package/dist/access-http-lcm-compaction.d.ts +10 -10
  16. package/dist/access-http-lifecycle-flush.d.ts +10 -10
  17. package/dist/access-http-offline-stream.d.ts +10 -10
  18. package/dist/access-http-query.js +48 -48
  19. package/dist/access-http.d.ts +10 -10
  20. package/dist/access-http.js +60 -60
  21. package/dist/access-identity-continuity-surface.d.ts +8 -8
  22. package/dist/access-identity-continuity-surface.js +48 -48
  23. package/dist/access-lcm-surface.d.ts +10 -10
  24. package/dist/access-lcm-surface.js +48 -48
  25. package/dist/access-mcp.d.ts +10 -10
  26. package/dist/access-mcp.js +55 -55
  27. package/dist/access-memory-search-fanout.d.ts +2 -2
  28. package/dist/{access-namespace-preflight--H6HwN85.d.ts → access-namespace-preflight-DuDU301-.d.ts} +1 -1
  29. package/dist/access-namespace-preflight.d.ts +3 -3
  30. package/dist/access-namespace-preflight.js +48 -48
  31. package/dist/access-observe-write-surface.d.ts +10 -10
  32. package/dist/access-observe-write-surface.js +48 -48
  33. package/dist/access-offline-manifest.d.ts +8 -8
  34. package/dist/access-offline-manifest.js +3 -3
  35. package/dist/access-operations-batch.js +51 -51
  36. package/dist/access-operations.d.ts +13 -13
  37. package/dist/access-operations.js +54 -54
  38. package/dist/access-recall-concurrency.d.ts +10 -10
  39. package/dist/access-recall-concurrency.js +48 -48
  40. package/dist/access-recall-response.d.ts +10 -10
  41. package/dist/access-recall-response.js +48 -48
  42. package/dist/access-recall-surface.d.ts +10 -10
  43. package/dist/access-recall-surface.js +48 -48
  44. package/dist/access-schema.d.ts +105 -105
  45. package/dist/access-schema.js +4 -4
  46. package/dist/{access-service-DvXOzCrM.d.ts → access-service--_3T_v23.d.ts} +7 -7
  47. package/dist/access-service-helpers.d.ts +10 -10
  48. package/dist/access-service.d.ts +10 -10
  49. package/dist/access-service.js +48 -48
  50. package/dist/access-surface-catalog.d.ts +10 -10
  51. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  52. package/dist/action-confidence.d.ts +1 -1
  53. package/dist/active-memory-bridge.d.ts +1 -1
  54. package/dist/active-recall.d.ts +1 -1
  55. package/dist/active-recall.js +3 -2
  56. package/dist/active-recall.js.map +1 -1
  57. package/dist/adapters/index.js +4 -4
  58. package/dist/adapters/registry.js +2 -2
  59. package/dist/ambient-provenance.d.ts +1 -1
  60. package/dist/artifact-search.d.ts +1 -1
  61. package/dist/{auto-sync-7O6RP2RT.js → auto-sync-QFQGOEO2.js} +4 -4
  62. package/dist/behavior-learner.d.ts +1 -1
  63. package/dist/behavior-signals.d.ts +1 -1
  64. package/dist/bootstrap.d.ts +8 -8
  65. package/dist/briefing.d.ts +2 -2
  66. package/dist/briefing.js +12 -12
  67. package/dist/buffer-surprise-report.d.ts +1 -1
  68. package/dist/buffer-turn-helpers.d.ts +1 -1
  69. package/dist/buffer.d.ts +2 -2
  70. package/dist/buffer.js +4 -4
  71. package/dist/bulk-import/index.d.ts +3 -3
  72. package/dist/calibration.d.ts +1 -1
  73. package/dist/calibration.js +1 -1
  74. package/dist/capabilities.d.ts +1 -1
  75. package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-7FJQINUR.js} +2 -2
  76. package/dist/{capsule-merge-6GFHWECG.js → capsule-merge-KXTRZ23Z.js} +4 -4
  77. package/dist/{catalog-Iwbk9h5E.d.ts → catalog-DjUmUIal.d.ts} +1 -1
  78. package/dist/causal-behavior.d.ts +1 -1
  79. package/dist/causal-behavior.js +3 -3
  80. package/dist/causal-chain.js +3 -3
  81. package/dist/causal-consolidation.d.ts +1 -1
  82. package/dist/causal-consolidation.js +16 -16
  83. package/dist/causal-retrieval.js +3 -3
  84. package/dist/causal-trajectory-graph.d.ts +1 -1
  85. package/dist/causal-trajectory.d.ts +51 -2
  86. package/dist/causal-trajectory.js +8 -2
  87. package/dist/{chunk-EY64JLOM.js → chunk-24BKGKGO.js} +30 -19
  88. package/dist/chunk-24BKGKGO.js.map +1 -0
  89. package/dist/{chunk-ICP53SKG.js → chunk-2HIJHXB3.js} +2 -2
  90. package/dist/{chunk-BXLOS5AJ.js → chunk-2NLLXCJG.js} +2 -2
  91. package/dist/{chunk-LZGCJSQR.js → chunk-3LD4N2TF.js} +151 -37
  92. package/dist/chunk-3LD4N2TF.js.map +1 -0
  93. package/dist/{chunk-5JRC6BYS.js → chunk-47J4EDGR.js} +11 -11
  94. package/dist/{chunk-2VHLLPTX.js → chunk-4EABKPZS.js} +4 -4
  95. package/dist/{chunk-RJV6Q2FT.js → chunk-4JWJMRPJ.js} +2 -2
  96. package/dist/{chunk-MXPB6PJQ.js → chunk-4S3ECH3U.js} +2 -2
  97. package/dist/{chunk-CGASUJVP.js → chunk-5V6IXHPI.js} +4 -4
  98. package/dist/{chunk-R5IGA2NH.js → chunk-5XCN4XBU.js} +4 -4
  99. package/dist/{chunk-2RPJ4NEE.js → chunk-64BHFFKZ.js} +2 -2
  100. package/dist/{chunk-FQC3DHH2.js → chunk-66SE3BNH.js} +2 -2
  101. package/dist/{chunk-TERNBNJB.js → chunk-6FC3IZ26.js} +2 -2
  102. package/dist/{chunk-K7VKAHFE.js → chunk-6XGEBQ3R.js} +4 -4
  103. package/dist/{chunk-JFLOOTXU.js → chunk-7BLWBSRL.js} +3 -3
  104. package/dist/{chunk-ABR2HEJO.js → chunk-7NDM2PNK.js} +3 -3
  105. package/dist/{chunk-JXZ7NLYH.js → chunk-7VWZ4LRW.js} +2 -2
  106. package/dist/{chunk-RN53QBM4.js → chunk-A4QMKFFO.js} +5 -1
  107. package/dist/chunk-A4QMKFFO.js.map +1 -0
  108. package/dist/chunk-ACPCA4NO.js +321 -0
  109. package/dist/chunk-ACPCA4NO.js.map +1 -0
  110. package/dist/chunk-AMTEYNYK.js +72 -0
  111. package/dist/chunk-AMTEYNYK.js.map +1 -0
  112. package/dist/{chunk-R6YJI3HE.js → chunk-AW4QUFQF.js} +1 -1
  113. package/dist/{chunk-P65YJEEL.js → chunk-AXFWMRKI.js} +2 -2
  114. package/dist/{chunk-WG5HSQ4P.js → chunk-BAKXNQ3C.js} +2 -2
  115. package/dist/{chunk-NM2WP3B7.js → chunk-BJYET5TX.js} +2 -2
  116. package/dist/{chunk-HLKPRWF4.js → chunk-DATDLJAO.js} +6 -6
  117. package/dist/chunk-DJUKBGAD.js +260 -0
  118. package/dist/chunk-DJUKBGAD.js.map +1 -0
  119. package/dist/{chunk-DX3XRGLH.js → chunk-DQTCGVFK.js} +2 -2
  120. package/dist/{chunk-IPBNC77A.js → chunk-E633OXMH.js} +11 -11
  121. package/dist/{chunk-J7T4MX7P.js → chunk-EEAMSNSG.js} +12 -1
  122. package/dist/chunk-EEAMSNSG.js.map +1 -0
  123. package/dist/{chunk-Z5UC3OKB.js → chunk-ELQCS47S.js} +7 -7
  124. package/dist/{chunk-FMXJ555A.js → chunk-EURCX6PS.js} +2 -2
  125. package/dist/{chunk-MZZR3J6M.js → chunk-FV7YQTN3.js} +2 -2
  126. package/dist/chunk-G73MCJKL.js +20 -0
  127. package/dist/chunk-G73MCJKL.js.map +1 -0
  128. package/dist/{chunk-3R6D33UF.js → chunk-GGBSF2X7.js} +2 -2
  129. package/dist/{chunk-SYUBB3WM.js → chunk-GKEYXXKX.js} +2 -2
  130. package/dist/{chunk-5AGR7SAI.js → chunk-GSEPRIZC.js} +3 -3
  131. package/dist/{chunk-UTVZKHJK.js → chunk-GUKBW4HL.js} +2 -2
  132. package/dist/chunk-GXSOUIA4.js +293 -0
  133. package/dist/chunk-GXSOUIA4.js.map +1 -0
  134. package/dist/{chunk-2F6NP3NT.js → chunk-HDQUQBPW.js} +2 -2
  135. package/dist/{chunk-6HMYUWXR.js → chunk-HTP6XRUI.js} +2 -2
  136. package/dist/{chunk-UYUYZ4WY.js → chunk-IARXXZU4.js} +2 -2
  137. package/dist/{chunk-MNB5RMAY.js → chunk-IIFFC3RL.js} +2 -2
  138. package/dist/{chunk-VDX2J7OX.js → chunk-IPLYGWQF.js} +6 -6
  139. package/dist/{chunk-NZBZ7IS2.js → chunk-JDCQK3C5.js} +2 -2
  140. package/dist/{chunk-C3KVFJH5.js → chunk-JI62YGPI.js} +2 -2
  141. package/dist/{chunk-LULR4IUW.js → chunk-KATEWTQJ.js} +2 -2
  142. package/dist/{chunk-BMCHFWGX.js → chunk-KMWYZTIE.js} +2 -2
  143. package/dist/{chunk-JGSKJHF7.js → chunk-KQS72GCR.js} +2 -2
  144. package/dist/{chunk-3S63QIFQ.js → chunk-LAQ33B5D.js} +1 -1
  145. package/dist/chunk-LAQ33B5D.js.map +1 -0
  146. package/dist/chunk-LNTUXKBT.js +224 -0
  147. package/dist/chunk-LNTUXKBT.js.map +1 -0
  148. package/dist/{chunk-2RIWJUSQ.js → chunk-LQKXVQZR.js} +12 -12
  149. package/dist/{chunk-LQL7ARIC.js → chunk-LTOAJXZB.js} +4 -4
  150. package/dist/{chunk-QKD65RGL.js → chunk-LYMNZZIM.js} +2 -2
  151. package/dist/{chunk-W4FBGYGK.js → chunk-M4MP34AQ.js} +189 -5
  152. package/dist/chunk-M4MP34AQ.js.map +1 -0
  153. package/dist/{chunk-3PY7VHV7.js → chunk-MCA2X4WH.js} +2 -2
  154. package/dist/{chunk-S5NZBKKQ.js → chunk-N3CXAYPJ.js} +3 -3
  155. package/dist/{chunk-WQIHRA5F.js → chunk-N3LL5NEU.js} +2 -2
  156. package/dist/{chunk-Z4U6U3M3.js → chunk-NKL25FCF.js} +2 -2
  157. package/dist/{chunk-LMDRGRJ2.js → chunk-NOB2T2FC.js} +2 -2
  158. package/dist/{chunk-P2OTGMTR.js → chunk-NSGU76YO.js} +2 -2
  159. package/dist/{chunk-L6DCVUCA.js → chunk-O76MWTVS.js} +2 -2
  160. package/dist/{chunk-WZFAPHIK.js → chunk-OIOZ6MOP.js} +3 -3
  161. package/dist/{chunk-DNHVPZOD.js → chunk-P26YHAQH.js} +201 -1
  162. package/dist/chunk-P26YHAQH.js.map +1 -0
  163. package/dist/{chunk-UMOO7IY7.js → chunk-P2KBDJJ6.js} +2 -2
  164. package/dist/{chunk-KVJRXN2E.js → chunk-P4QOYG52.js} +125 -13
  165. package/dist/chunk-P4QOYG52.js.map +1 -0
  166. package/dist/chunk-P77QX3ID.js +332 -0
  167. package/dist/chunk-P77QX3ID.js.map +1 -0
  168. package/dist/{chunk-SXWHN7GC.js → chunk-PDEKQWDV.js} +2 -2
  169. package/dist/{chunk-ENEA47UC.js → chunk-PLCHU56K.js} +3 -3
  170. package/dist/{chunk-IXPKESVP.js → chunk-PWIMF7LP.js} +37 -37
  171. package/dist/{chunk-RHTO4HTL.js → chunk-PWLB4TRK.js} +2 -2
  172. package/dist/{chunk-RVYVMQK4.js → chunk-QSYL5CXK.js} +3 -3
  173. package/dist/{chunk-B6KGGRUL.js → chunk-QWLW3VQH.js} +2 -2
  174. package/dist/{chunk-YQIVWS7Y.js → chunk-RBPH3GZV.js} +405 -101
  175. package/dist/chunk-RBPH3GZV.js.map +1 -0
  176. package/dist/{chunk-JBPKEARU.js → chunk-RKNJBZ55.js} +4 -4
  177. package/dist/{chunk-QCECHYZL.js → chunk-RVO6TCTU.js} +6 -6
  178. package/dist/{chunk-SHDZNSK4.js → chunk-S2SJEOTM.js} +2 -2
  179. package/dist/{chunk-ULWHRQEQ.js → chunk-S75UQ3T3.js} +3 -3
  180. package/dist/{chunk-LXOM6IQU.js → chunk-SEF4IOFE.js} +2 -2
  181. package/dist/{chunk-I3YHVVT4.js → chunk-SHYIMIX5.js} +2 -2
  182. package/dist/{chunk-IZANPXMV.js → chunk-T35UJI5R.js} +86 -82
  183. package/dist/chunk-T35UJI5R.js.map +1 -0
  184. package/dist/{chunk-G5OB4XZX.js → chunk-VANZKHTN.js} +4 -4
  185. package/dist/{chunk-I4TQST3L.js → chunk-VFS3MK5F.js} +2 -2
  186. package/dist/chunk-VUDMT5CP.js +86 -0
  187. package/dist/chunk-VUDMT5CP.js.map +1 -0
  188. package/dist/{chunk-CMQZNEIF.js → chunk-WFLBP5GC.js} +8 -1
  189. package/dist/chunk-WFLBP5GC.js.map +1 -0
  190. package/dist/{chunk-SMPVHGHG.js → chunk-WPZX7MEA.js} +3 -3
  191. package/dist/{chunk-ZRWB5D4H.js → chunk-WT6UL3UA.js} +2 -2
  192. package/dist/{chunk-DQEMWVMT.js → chunk-X7Y7WX73.js} +1 -1
  193. package/dist/{chunk-JHMAYABJ.js → chunk-XL3TATMJ.js} +4 -4
  194. package/dist/{chunk-MC6XO7T4.js → chunk-YLBE6PLR.js} +2 -2
  195. package/dist/{chunk-OLX2HJFW.js → chunk-YLHM5BQQ.js} +4 -4
  196. package/dist/{chunk-EZ25VE3G.js → chunk-YNDLCWXS.js} +4 -4
  197. package/dist/{chunk-GF22HWS2.js → chunk-Z54EM5YZ.js} +4 -4
  198. package/dist/{chunk-GVX3NAUU.js → chunk-ZDAYWJV6.js} +2 -2
  199. package/dist/{chunk-EYAIZBLM.js → chunk-ZJIFYUJI.js} +5 -5
  200. package/dist/{chunk-CNQQMB67.js → chunk-ZN4EYMKJ.js} +2 -2
  201. package/dist/{cli-PyAUaozE.d.ts → cli-BLNmNEMT.d.ts} +16 -14
  202. package/dist/cli.d.ts +13 -13
  203. package/dist/cli.js +96 -94
  204. package/dist/coding/pre-action-gate.d.ts +66 -0
  205. package/dist/coding/pre-action-gate.js +22 -0
  206. package/dist/commitment-ledger.js +2 -2
  207. package/dist/compounding/engine.d.ts +2 -2
  208. package/dist/compounding/engine.js +13 -13
  209. package/dist/compounding/preference-consolidator.d.ts +1 -1
  210. package/dist/compression-optimizer.d.ts +1 -1
  211. package/dist/config.d.ts +1 -1
  212. package/dist/config.js +3 -2
  213. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  214. package/dist/connectors/codex-materialize-runner.js +12 -12
  215. package/dist/connectors/codex-materialize.d.ts +1 -1
  216. package/dist/connectors/index.d.ts +1 -1
  217. package/dist/connectors/index.js +12 -12
  218. package/dist/consolidation-provenance-check.d.ts +2 -2
  219. package/dist/consolidation-provenance-check.js +4 -4
  220. package/dist/consolidation-undo.d.ts +2 -2
  221. package/dist/consolidation-undo.js +3 -3
  222. package/dist/contradiction/index.d.ts +2 -2
  223. package/dist/contradiction/index.js +3 -3
  224. package/dist/converge-config.d.ts +1 -1
  225. package/dist/convergence-refresh.d.ts +2 -2
  226. package/dist/convergence-refresh.js +15 -15
  227. package/dist/conversation-index/backend.d.ts +1 -1
  228. package/dist/conversation-index/chunker.d.ts +1 -1
  229. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  230. package/dist/conversation-index/indexer.d.ts +1 -1
  231. package/dist/conversation-index/search.d.ts +1 -1
  232. package/dist/corpus-watermark.d.ts +1 -1
  233. package/dist/corpus-watermark.js +23 -23
  234. package/dist/cue-anchors.d.ts +19 -1
  235. package/dist/cue-anchors.js +10 -2
  236. package/dist/dashboard-runtime.js +2 -2
  237. package/dist/day-summary.d.ts +1 -1
  238. package/dist/delinearize.d.ts +1 -1
  239. package/dist/dependency-propagation-config.d.ts +10 -0
  240. package/dist/dependency-propagation-config.js +10 -0
  241. package/dist/dependency-propagation-config.js.map +1 -0
  242. package/dist/deterministic-order.d.ts +4 -0
  243. package/dist/deterministic-order.js +10 -0
  244. package/dist/deterministic-order.js.map +1 -0
  245. package/dist/direct-answer-wiring.d.ts +1 -1
  246. package/dist/direct-answer.d.ts +1 -1
  247. package/dist/embedding-fallback.d.ts +1 -1
  248. package/dist/enrichment/index.d.ts +1 -1
  249. package/dist/entity-retrieval.d.ts +2 -2
  250. package/dist/entity-retrieval.js +12 -12
  251. package/dist/entity-schema.d.ts +1 -1
  252. package/dist/evals.js +2 -2
  253. package/dist/explicit-capture.d.ts +8 -8
  254. package/dist/explicit-capture.js +6 -6
  255. package/dist/external-wiki-access.d.ts +10 -10
  256. package/dist/external-wiki-access.js +49 -49
  257. package/dist/external-wiki-collection-registration.d.ts +1 -1
  258. package/dist/external-wiki-collection.d.ts +1 -1
  259. package/dist/external-wiki-mcp-tools.d.ts +10 -10
  260. package/dist/extraction-error-classification.d.ts +1 -1
  261. package/dist/extraction-faithfulness.d.ts +1 -1
  262. package/dist/extraction-judge-telemetry.d.ts +1 -1
  263. package/dist/extraction-judge-training.d.ts +1 -1
  264. package/dist/extraction-judge.d.ts +1 -1
  265. package/dist/extraction-liveness.d.ts +1 -1
  266. package/dist/extraction-normalization.d.ts +14 -0
  267. package/dist/extraction-normalization.js +22 -0
  268. package/dist/extraction-normalization.js.map +1 -0
  269. package/dist/extraction-prompt.d.ts +4 -3
  270. package/dist/extraction-prompt.js +3 -1
  271. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  272. package/dist/extraction-source-grounding.d.ts +1 -1
  273. package/dist/extraction.d.ts +18 -1
  274. package/dist/extraction.js +21 -19
  275. package/dist/fallback-llm.d.ts +1 -1
  276. package/dist/{first-start-migration-ZSHEFEI3.js → first-start-migration-626C5554.js} +5 -5
  277. package/dist/{forget-DNAJ66ZD.js → forget-GJ42LCBW.js} +2 -2
  278. package/dist/graph-dashboard-diff.d.ts +1 -1
  279. package/dist/graph-dashboard-key.d.ts +1 -1
  280. package/dist/graph-dashboard-parser.d.ts +1 -1
  281. package/dist/graph-edge-reinforcement.d.ts +1 -1
  282. package/dist/graph-snapshot.d.ts +1 -1
  283. package/dist/graph.d.ts +1 -1
  284. package/dist/harmonic-construction.d.ts +43 -0
  285. package/dist/harmonic-construction.js +26 -0
  286. package/dist/harmonic-construction.js.map +1 -0
  287. package/dist/harmonic-retrieval.d.ts +1 -0
  288. package/dist/harmonic-retrieval.js +10 -4
  289. package/dist/importance.d.ts +1 -1
  290. package/dist/importers/index.d.ts +1 -1
  291. package/dist/in-flight-reads.d.ts +1 -1
  292. package/dist/index.d.ts +698 -696
  293. package/dist/index.js +207 -161
  294. package/dist/intent.d.ts +1 -1
  295. package/dist/json-store.d.ts +15 -1
  296. package/dist/json-store.js +11 -3
  297. package/dist/lcm/engine.d.ts +1 -1
  298. package/dist/lcm/engine.js +2 -2
  299. package/dist/lcm/index.d.ts +1 -1
  300. package/dist/lcm/index.js +4 -4
  301. package/dist/lcm/tools.d.ts +1 -1
  302. package/dist/lifecycle.d.ts +1 -1
  303. package/dist/live-connectors-runner.d.ts +1 -1
  304. package/dist/local-llm.d.ts +1 -1
  305. package/dist/local-model-endpoint.d.ts +1 -1
  306. package/dist/maintenance/archive-observations.js +2 -2
  307. package/dist/maintenance/atomic-file.d.ts +5 -0
  308. package/dist/maintenance/atomic-file.js +12 -0
  309. package/dist/maintenance/atomic-file.js.map +1 -0
  310. package/dist/maintenance/memory-governance.d.ts +1 -1
  311. package/dist/maintenance/memory-governance.js +12 -12
  312. package/dist/maintenance/migrate-observations.js +3 -3
  313. package/dist/maintenance/observation-ledger-utils.d.ts +1 -1
  314. package/dist/maintenance/observation-ledger-utils.js +2 -2
  315. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  316. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +13 -13
  317. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  318. package/dist/maintenance/rebuild-memory-projection.js +14 -14
  319. package/dist/maintenance/rebuild-observations.js +3 -3
  320. package/dist/{maintenance-j7sfNQdK.d.ts → maintenance-DKbKZi3u.d.ts} +3 -3
  321. package/dist/mcp-memory-inspector-app.d.ts +10 -10
  322. package/dist/memory-action-policy.d.ts +1 -1
  323. package/dist/memory-cache.d.ts +1 -1
  324. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  325. package/dist/memory-projection-store.d.ts +1 -1
  326. package/dist/memory-provenance.d.ts +1 -1
  327. package/dist/memory-snapshot.d.ts +1 -1
  328. package/dist/memory-worth-outcomes.d.ts +2 -2
  329. package/dist/models-json.d.ts +1 -1
  330. package/dist/namespaces/migrate.d.ts +3 -3
  331. package/dist/namespaces/migrate.js +22 -22
  332. package/dist/namespaces/principal.d.ts +1 -1
  333. package/dist/namespaces/search.d.ts +1 -1
  334. package/dist/namespaces/search.js +9 -9
  335. package/dist/namespaces/storage.d.ts +3 -3
  336. package/dist/namespaces/storage.js +12 -12
  337. package/dist/native-knowledge.d.ts +1 -1
  338. package/dist/objective-state-writers.js +3 -3
  339. package/dist/objective-state.js +2 -2
  340. package/dist/offline-sync-impression-drain.d.ts +1 -1
  341. package/dist/offline-sync-impression-drain.js +2 -2
  342. package/dist/operator-doctor-corpus.d.ts +1 -1
  343. package/dist/operator-doctor-corpus.js +24 -24
  344. package/dist/operator-doctor-replica.d.ts +1 -1
  345. package/dist/operator-toolkit.d.ts +3 -3
  346. package/dist/operator-toolkit.js +33 -32
  347. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  348. package/dist/orchestration/maintenance.d.ts +4 -4
  349. package/dist/orchestration/maintenance.js +18 -18
  350. package/dist/{orchestrator-Haa9xVPV.d.ts → orchestrator-BRwD7ceU.d.ts} +7 -7
  351. package/dist/orchestrator.d.ts +8 -8
  352. package/dist/orchestrator.js +132 -127
  353. package/dist/page-versioning.js +3 -3
  354. package/dist/patterns-cli.d.ts +1 -1
  355. package/dist/{pipeline-1h2GpiHP.d.ts → pipeline-DC-1C9T8.d.ts} +1 -1
  356. package/dist/policy-runtime.d.ts +1 -1
  357. package/dist/proactive-contention.d.ts +1 -1
  358. package/dist/provenance.d.ts +1 -1
  359. package/dist/{qmd-UdwoF71D.d.ts → qmd-DdeCEZdb.d.ts} +1 -1
  360. package/dist/qmd-preflight.d.ts +2 -2
  361. package/dist/qmd-recall-cache.d.ts +1 -1
  362. package/dist/qmd.d.ts +2 -2
  363. package/dist/qmd.js +4 -4
  364. package/dist/recall-concurrency-config.d.ts +1 -1
  365. package/dist/recall-disclosure-escalation.d.ts +1 -1
  366. package/dist/recall-explain-renderer.d.ts +1 -1
  367. package/dist/recall-explain-renderer.js +3 -3
  368. package/dist/recall-memory-map.d.ts +1 -1
  369. package/dist/recall-planner-llm.d.ts +1 -1
  370. package/dist/recall-state.d.ts +1 -1
  371. package/dist/recall-state.js +2 -2
  372. package/dist/recall-tag-filter.d.ts +1 -1
  373. package/dist/recall-timings.d.ts +1 -1
  374. package/dist/recall-xray-cli.d.ts +1 -1
  375. package/dist/recall-xray-cli.js +4 -4
  376. package/dist/recall-xray-renderer.d.ts +1 -1
  377. package/dist/recall-xray-renderer.js +3 -3
  378. package/dist/recall-xray.d.ts +1 -1
  379. package/dist/recall-xray.js +2 -2
  380. package/dist/reconcile/cursor.d.ts +1 -1
  381. package/dist/reconcile/manifest.d.ts +1 -1
  382. package/dist/reconcile/plan.d.ts +1 -1
  383. package/dist/relevance.js +2 -2
  384. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  385. package/dist/replay/normalizers/claude.d.ts +1 -1
  386. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  387. package/dist/replay/normalizers/shared.d.ts +1 -1
  388. package/dist/replay/runner.d.ts +1 -1
  389. package/dist/replay/types.d.ts +1 -1
  390. package/dist/replica-divergence.d.ts +1 -1
  391. package/dist/replica-peers-config.d.ts +1 -1
  392. package/dist/{resolution-3K27T4VO.js → resolution-MDPNOEG6.js} +4 -4
  393. package/dist/resolution-MDPNOEG6.js.map +1 -0
  394. package/dist/resolve-auth-token.d.ts +1 -1
  395. package/dist/resume-bundles.js +8 -7
  396. package/dist/retrieval-agents.d.ts +2 -2
  397. package/dist/retrieval-tiers.d.ts +1 -1
  398. package/dist/routing/engine.d.ts +1 -1
  399. package/dist/routing/store.d.ts +1 -1
  400. package/dist/salvage-envelope.d.ts +1 -1
  401. package/dist/salvage-envelope.js +3 -3
  402. package/dist/schemas.d.ts +213 -116
  403. package/dist/schemas.js +1 -1
  404. package/dist/{scope-profiles-APjhSe-w.d.ts → scope-profiles-BXVq4Jv0.d.ts} +1 -1
  405. package/dist/search/embed-helper.d.ts +1 -1
  406. package/dist/search/factory.d.ts +1 -1
  407. package/dist/search/factory.js +8 -8
  408. package/dist/search/index.d.ts +1 -1
  409. package/dist/search/index.js +13 -13
  410. package/dist/search/lancedb-backend.d.ts +1 -1
  411. package/dist/search/lancedb-backend.js +2 -2
  412. package/dist/search/meilisearch-backend.d.ts +1 -1
  413. package/dist/search/meilisearch-backend.js +2 -2
  414. package/dist/search/noop-backend.d.ts +1 -1
  415. package/dist/search/orama-backend.d.ts +1 -1
  416. package/dist/search/orama-backend.js +2 -2
  417. package/dist/search/port.d.ts +1 -1
  418. package/dist/search/remote-backend.d.ts +1 -1
  419. package/dist/{semantic-consolidation-CrySDbk3.d.ts → semantic-consolidation-CGYxfa8F.d.ts} +1 -1
  420. package/dist/semantic-consolidation.d.ts +2 -2
  421. package/dist/semantic-consolidation.js +13 -13
  422. package/dist/semantic-rule-promotion.js +12 -12
  423. package/dist/semantic-rule-verifier.d.ts +1 -1
  424. package/dist/semantic-rule-verifier.js +12 -12
  425. package/dist/{service-Da_BI4S8.d.ts → service-CBDBQFCN.d.ts} +2 -2
  426. package/dist/session-observer-bands.d.ts +1 -1
  427. package/dist/session-observer-state.d.ts +1 -1
  428. package/dist/shared-context/manager.d.ts +11 -11
  429. package/dist/signal.d.ts +1 -1
  430. package/dist/source-agent-qualifier.d.ts +1 -1
  431. package/dist/source-agent-qualifier.js +16 -16
  432. package/dist/{storage-D1apCiCS.d.ts → storage-V--MQi7w.d.ts} +1 -1
  433. package/dist/storage.d.ts +2 -2
  434. package/dist/storage.js +11 -11
  435. package/dist/summarizer.d.ts +1 -1
  436. package/dist/summary-snapshot.d.ts +1 -1
  437. package/dist/temporal-supersession.d.ts +13 -2
  438. package/dist/temporal-supersession.js +1 -1
  439. package/dist/temporal-timeline-recall.d.ts +1 -1
  440. package/dist/temporal-validity.d.ts +1 -1
  441. package/dist/threading.d.ts +1 -1
  442. package/dist/tier-migration.d.ts +2 -2
  443. package/dist/tier-routing.d.ts +1 -1
  444. package/dist/{tier-stats-OPTSBNRH.js → tier-stats-2JCZYEF7.js} +5 -5
  445. package/dist/topics.d.ts +1 -1
  446. package/dist/transcript.d.ts +1 -1
  447. package/dist/transfer/autodetect.js +1 -1
  448. package/dist/transfer/backup.js +2 -2
  449. package/dist/transfer/capsule-export.js +3 -3
  450. package/dist/transfer/capsule-import.js +5 -5
  451. package/dist/transfer/types.d.ts +66 -66
  452. package/dist/trust-score-stage.d.ts +1 -1
  453. package/dist/trust-score.d.ts +1 -1
  454. package/dist/trust-zones.js +2 -2
  455. package/dist/{types-D_Au9qJO.d.ts → types-D_a6Sqjz.d.ts} +25 -8
  456. package/dist/types.d.ts +1 -1
  457. package/dist/types.js +1 -1
  458. package/dist/utility-learner.js +3 -3
  459. package/dist/utility-runtime.d.ts +1 -1
  460. package/dist/utility-runtime.js +4 -4
  461. package/dist/utility-telemetry.js +2 -2
  462. package/dist/verified-recall.js +12 -12
  463. package/dist/work-product-ledger.js +2 -2
  464. package/dist/write-envelope.d.ts +1 -1
  465. package/dist/write-envelope.js +2 -2
  466. package/package.json +32 -2
  467. package/src/abstraction-nodes.ts +182 -4
  468. package/src/causal-trajectory.ts +258 -3
  469. package/src/cli/harmonic-search.ts +23 -0
  470. package/src/cli/research-status-commands.ts +2 -1
  471. package/src/cli.ts +1 -24
  472. package/src/coding/pre-action-gate.test.ts +516 -0
  473. package/src/coding/pre-action-gate.ts +320 -0
  474. package/src/config.test.ts +85 -0
  475. package/src/config.ts +2 -0
  476. package/src/cue-anchors.test.ts +90 -0
  477. package/src/cue-anchors.ts +264 -11
  478. package/src/dependency-frontmatter.test.ts +83 -0
  479. package/src/dependency-propagation-config.ts +94 -0
  480. package/src/deterministic-order.ts +14 -0
  481. package/src/extraction-normalization.ts +71 -0
  482. package/src/extraction-prompt.ts +45 -11
  483. package/src/extraction.ts +48 -32
  484. package/src/faithfulness-graph-guard.test.ts +27 -0
  485. package/src/harmonic-construction.test.ts +1799 -0
  486. package/src/harmonic-construction.ts +367 -0
  487. package/src/harmonic-retrieval.ts +166 -25
  488. package/src/index.ts +4 -5
  489. package/src/json-store.ts +354 -12
  490. package/src/orchestration/consolidation-run.ts +192 -0
  491. package/src/orchestration/contradiction-linking-coordinator.ts +35 -1
  492. package/src/orchestration/dependency-propagation-triggers.test.ts +286 -0
  493. package/src/orchestration/dependency-propagation.test.ts +487 -0
  494. package/src/orchestration/dependency-propagation.ts +263 -0
  495. package/src/orchestration/dependency-revalidation.ts +173 -0
  496. package/src/orchestration/extraction-persist-deps.ts +93 -0
  497. package/src/orchestration/extraction-persist.ts +101 -94
  498. package/src/orchestration/harmonic-construction-persist.ts +86 -0
  499. package/src/orchestration/recall-internal.ts +1 -0
  500. package/src/orchestrator.ts +2 -1
  501. package/src/schemas.ts +15 -0
  502. package/src/storage.ts +14 -0
  503. package/src/temporal-supersession.ts +29 -1
  504. package/src/testing/orchestrator-lite.ts +27 -8
  505. package/src/testing/subjects/extraction-lifecycle.test.ts +91 -50
  506. package/src/types.ts +22 -7
  507. package/dist/chunk-3S63QIFQ.js.map +0 -1
  508. package/dist/chunk-CMQZNEIF.js.map +0 -1
  509. package/dist/chunk-DNHVPZOD.js.map +0 -1
  510. package/dist/chunk-EY64JLOM.js.map +0 -1
  511. package/dist/chunk-FZZ2QTJI.js +0 -111
  512. package/dist/chunk-FZZ2QTJI.js.map +0 -1
  513. package/dist/chunk-IZANPXMV.js.map +0 -1
  514. package/dist/chunk-J7T4MX7P.js.map +0 -1
  515. package/dist/chunk-KVJRXN2E.js.map +0 -1
  516. package/dist/chunk-LPSF4OQH.js +0 -47
  517. package/dist/chunk-LPSF4OQH.js.map +0 -1
  518. package/dist/chunk-LZGCJSQR.js.map +0 -1
  519. package/dist/chunk-OADWQ5CR.js +0 -115
  520. package/dist/chunk-OADWQ5CR.js.map +0 -1
  521. package/dist/chunk-RN53QBM4.js.map +0 -1
  522. package/dist/chunk-W4FBGYGK.js.map +0 -1
  523. package/dist/chunk-YQIVWS7Y.js.map +0 -1
  524. /package/dist/{auto-sync-7O6RP2RT.js.map → auto-sync-QFQGOEO2.js.map} +0 -0
  525. /package/dist/{capsule-crypto-YO5QJ6L3.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  526. /package/dist/{capsule-merge-6GFHWECG.js.map → capsule-merge-KXTRZ23Z.js.map} +0 -0
  527. /package/dist/{chunk-ICP53SKG.js.map → chunk-2HIJHXB3.js.map} +0 -0
  528. /package/dist/{chunk-BXLOS5AJ.js.map → chunk-2NLLXCJG.js.map} +0 -0
  529. /package/dist/{chunk-5JRC6BYS.js.map → chunk-47J4EDGR.js.map} +0 -0
  530. /package/dist/{chunk-2VHLLPTX.js.map → chunk-4EABKPZS.js.map} +0 -0
  531. /package/dist/{chunk-RJV6Q2FT.js.map → chunk-4JWJMRPJ.js.map} +0 -0
  532. /package/dist/{chunk-MXPB6PJQ.js.map → chunk-4S3ECH3U.js.map} +0 -0
  533. /package/dist/{chunk-CGASUJVP.js.map → chunk-5V6IXHPI.js.map} +0 -0
  534. /package/dist/{chunk-R5IGA2NH.js.map → chunk-5XCN4XBU.js.map} +0 -0
  535. /package/dist/{chunk-2RPJ4NEE.js.map → chunk-64BHFFKZ.js.map} +0 -0
  536. /package/dist/{chunk-FQC3DHH2.js.map → chunk-66SE3BNH.js.map} +0 -0
  537. /package/dist/{chunk-TERNBNJB.js.map → chunk-6FC3IZ26.js.map} +0 -0
  538. /package/dist/{chunk-K7VKAHFE.js.map → chunk-6XGEBQ3R.js.map} +0 -0
  539. /package/dist/{chunk-JFLOOTXU.js.map → chunk-7BLWBSRL.js.map} +0 -0
  540. /package/dist/{chunk-ABR2HEJO.js.map → chunk-7NDM2PNK.js.map} +0 -0
  541. /package/dist/{chunk-JXZ7NLYH.js.map → chunk-7VWZ4LRW.js.map} +0 -0
  542. /package/dist/{chunk-R6YJI3HE.js.map → chunk-AW4QUFQF.js.map} +0 -0
  543. /package/dist/{chunk-P65YJEEL.js.map → chunk-AXFWMRKI.js.map} +0 -0
  544. /package/dist/{chunk-WG5HSQ4P.js.map → chunk-BAKXNQ3C.js.map} +0 -0
  545. /package/dist/{chunk-NM2WP3B7.js.map → chunk-BJYET5TX.js.map} +0 -0
  546. /package/dist/{chunk-HLKPRWF4.js.map → chunk-DATDLJAO.js.map} +0 -0
  547. /package/dist/{chunk-DX3XRGLH.js.map → chunk-DQTCGVFK.js.map} +0 -0
  548. /package/dist/{chunk-IPBNC77A.js.map → chunk-E633OXMH.js.map} +0 -0
  549. /package/dist/{chunk-Z5UC3OKB.js.map → chunk-ELQCS47S.js.map} +0 -0
  550. /package/dist/{chunk-FMXJ555A.js.map → chunk-EURCX6PS.js.map} +0 -0
  551. /package/dist/{chunk-MZZR3J6M.js.map → chunk-FV7YQTN3.js.map} +0 -0
  552. /package/dist/{chunk-3R6D33UF.js.map → chunk-GGBSF2X7.js.map} +0 -0
  553. /package/dist/{chunk-SYUBB3WM.js.map → chunk-GKEYXXKX.js.map} +0 -0
  554. /package/dist/{chunk-5AGR7SAI.js.map → chunk-GSEPRIZC.js.map} +0 -0
  555. /package/dist/{chunk-UTVZKHJK.js.map → chunk-GUKBW4HL.js.map} +0 -0
  556. /package/dist/{chunk-2F6NP3NT.js.map → chunk-HDQUQBPW.js.map} +0 -0
  557. /package/dist/{chunk-6HMYUWXR.js.map → chunk-HTP6XRUI.js.map} +0 -0
  558. /package/dist/{chunk-UYUYZ4WY.js.map → chunk-IARXXZU4.js.map} +0 -0
  559. /package/dist/{chunk-MNB5RMAY.js.map → chunk-IIFFC3RL.js.map} +0 -0
  560. /package/dist/{chunk-VDX2J7OX.js.map → chunk-IPLYGWQF.js.map} +0 -0
  561. /package/dist/{chunk-NZBZ7IS2.js.map → chunk-JDCQK3C5.js.map} +0 -0
  562. /package/dist/{chunk-C3KVFJH5.js.map → chunk-JI62YGPI.js.map} +0 -0
  563. /package/dist/{chunk-LULR4IUW.js.map → chunk-KATEWTQJ.js.map} +0 -0
  564. /package/dist/{chunk-BMCHFWGX.js.map → chunk-KMWYZTIE.js.map} +0 -0
  565. /package/dist/{chunk-JGSKJHF7.js.map → chunk-KQS72GCR.js.map} +0 -0
  566. /package/dist/{chunk-2RIWJUSQ.js.map → chunk-LQKXVQZR.js.map} +0 -0
  567. /package/dist/{chunk-LQL7ARIC.js.map → chunk-LTOAJXZB.js.map} +0 -0
  568. /package/dist/{chunk-QKD65RGL.js.map → chunk-LYMNZZIM.js.map} +0 -0
  569. /package/dist/{chunk-3PY7VHV7.js.map → chunk-MCA2X4WH.js.map} +0 -0
  570. /package/dist/{chunk-S5NZBKKQ.js.map → chunk-N3CXAYPJ.js.map} +0 -0
  571. /package/dist/{chunk-WQIHRA5F.js.map → chunk-N3LL5NEU.js.map} +0 -0
  572. /package/dist/{chunk-Z4U6U3M3.js.map → chunk-NKL25FCF.js.map} +0 -0
  573. /package/dist/{chunk-LMDRGRJ2.js.map → chunk-NOB2T2FC.js.map} +0 -0
  574. /package/dist/{chunk-P2OTGMTR.js.map → chunk-NSGU76YO.js.map} +0 -0
  575. /package/dist/{chunk-L6DCVUCA.js.map → chunk-O76MWTVS.js.map} +0 -0
  576. /package/dist/{chunk-WZFAPHIK.js.map → chunk-OIOZ6MOP.js.map} +0 -0
  577. /package/dist/{chunk-UMOO7IY7.js.map → chunk-P2KBDJJ6.js.map} +0 -0
  578. /package/dist/{chunk-SXWHN7GC.js.map → chunk-PDEKQWDV.js.map} +0 -0
  579. /package/dist/{chunk-ENEA47UC.js.map → chunk-PLCHU56K.js.map} +0 -0
  580. /package/dist/{chunk-IXPKESVP.js.map → chunk-PWIMF7LP.js.map} +0 -0
  581. /package/dist/{chunk-RHTO4HTL.js.map → chunk-PWLB4TRK.js.map} +0 -0
  582. /package/dist/{chunk-RVYVMQK4.js.map → chunk-QSYL5CXK.js.map} +0 -0
  583. /package/dist/{chunk-B6KGGRUL.js.map → chunk-QWLW3VQH.js.map} +0 -0
  584. /package/dist/{chunk-JBPKEARU.js.map → chunk-RKNJBZ55.js.map} +0 -0
  585. /package/dist/{chunk-QCECHYZL.js.map → chunk-RVO6TCTU.js.map} +0 -0
  586. /package/dist/{chunk-SHDZNSK4.js.map → chunk-S2SJEOTM.js.map} +0 -0
  587. /package/dist/{chunk-ULWHRQEQ.js.map → chunk-S75UQ3T3.js.map} +0 -0
  588. /package/dist/{chunk-LXOM6IQU.js.map → chunk-SEF4IOFE.js.map} +0 -0
  589. /package/dist/{chunk-I3YHVVT4.js.map → chunk-SHYIMIX5.js.map} +0 -0
  590. /package/dist/{chunk-G5OB4XZX.js.map → chunk-VANZKHTN.js.map} +0 -0
  591. /package/dist/{chunk-I4TQST3L.js.map → chunk-VFS3MK5F.js.map} +0 -0
  592. /package/dist/{chunk-SMPVHGHG.js.map → chunk-WPZX7MEA.js.map} +0 -0
  593. /package/dist/{chunk-ZRWB5D4H.js.map → chunk-WT6UL3UA.js.map} +0 -0
  594. /package/dist/{chunk-DQEMWVMT.js.map → chunk-X7Y7WX73.js.map} +0 -0
  595. /package/dist/{chunk-JHMAYABJ.js.map → chunk-XL3TATMJ.js.map} +0 -0
  596. /package/dist/{chunk-MC6XO7T4.js.map → chunk-YLBE6PLR.js.map} +0 -0
  597. /package/dist/{chunk-OLX2HJFW.js.map → chunk-YLHM5BQQ.js.map} +0 -0
  598. /package/dist/{chunk-EZ25VE3G.js.map → chunk-YNDLCWXS.js.map} +0 -0
  599. /package/dist/{chunk-GF22HWS2.js.map → chunk-Z54EM5YZ.js.map} +0 -0
  600. /package/dist/{chunk-GVX3NAUU.js.map → chunk-ZDAYWJV6.js.map} +0 -0
  601. /package/dist/{chunk-EYAIZBLM.js.map → chunk-ZJIFYUJI.js.map} +0 -0
  602. /package/dist/{chunk-CNQQMB67.js.map → chunk-ZN4EYMKJ.js.map} +0 -0
  603. /package/dist/{resolution-3K27T4VO.js.map → coding/pre-action-gate.js.map} +0 -0
  604. /package/dist/{first-start-migration-ZSHEFEI3.js.map → first-start-migration-626C5554.js.map} +0 -0
  605. /package/dist/{forget-DNAJ66ZD.js.map → forget-GJ42LCBW.js.map} +0 -0
  606. /package/dist/{tier-stats-OPTSBNRH.js.map → tier-stats-2JCZYEF7.js.map} +0 -0
@@ -37,6 +37,8 @@ import { semanticChunkContent, type SemanticChunkResult } from "../semantic-chun
37
37
  import { isAboveImportanceThreshold, scoreImportance } from "../importance.js";
38
38
  import { sanitizeMemoryContent } from "../sanitize.js";
39
39
  import {
40
+ resolveCapabilities,
41
+ resolveConsolidationCapabilities,
40
42
  resolveGraphConstructionCapabilities,
41
43
  resolveMemoryLifecycleCapabilities,
42
44
  resolvePipelineProcessingCapabilities,
@@ -90,6 +92,7 @@ import {
90
92
  import { buildProcedurePersistBody } from "../procedural/procedure-types.js";
91
93
  import { stripAttributesSuffix } from "../structured-attributes.js";
92
94
  import { LocalLlmClient } from "../local-llm.js";
95
+ import type { ExtractionEngine } from "../extraction.js";
93
96
  import {
94
97
  FallbackLlmClient,
95
98
  fallbackLlmRuntimeContextFromConfig,
@@ -117,106 +120,17 @@ import {
117
120
  readActiveMemoriesBothTiers,
118
121
  shouldPromoteToShared,
119
122
  } from "./extraction-persist-promotion.js";
123
+ import type { ExtractionPersistDeps } from "./extraction-persist-deps.js";
120
124
  import type { ResolvedScopeProfilePlan } from "../namespaces/scope-profiles.js";
121
125
  import {
122
126
  buildMemoryPathById,
123
127
  appendMemoryToGraphContext,
124
128
  resolvePersistedMemoryRelativePath,
125
129
  } from "../orchestrator.js";
130
+ import type { HarmonicConstructionInput } from "../harmonic-construction.js";
131
+ import { persistConstructedHarmonicRecords } from "./harmonic-construction-persist.js";
132
+
126
133
 
127
- export interface ExtractionPersistDeps {
128
- config: PluginConfig;
129
- getStorageRouter: () => NamespaceStorageRouter;
130
- getThreading: () => ThreadingManager;
131
- getLocalLlm: () => LocalLlmClient;
132
- getQmd: () => SearchBackend;
133
- getJudgeVerdictCache: () => Map<string, JudgeVerdict>;
134
- getJudgeDeferCounts: () => Map<string, number>;
135
- getFaithfulnessCounters: () => FaithfulnessGateCounters;
136
- getEmbeddingFallback: () => EmbeddingFallback;
137
- setLastPersistExtractionDeferredCount: (value: number) => void;
138
- setLastPersistExtractionPendingReviewIds: (ids: string[]) => void;
139
- addContentHashDedup: (targetStorage: StorageManager, content: string) => Promise<void>;
140
- hasContentHashDedup: (targetStorage: StorageManager, content: string) => Promise<boolean>;
141
- backfillTemporalBoundsOnDedupHit: (
142
- targetStorage: StorageManager,
143
- dedupContent: string,
144
- bounds: {
145
- invalidAt?: string;
146
- validFrom?: string;
147
- observedAt?: string;
148
- eventTimeSource?: "extracted" | "assumed";
149
- },
150
- entityRef?: string,
151
- sourceConnector?: string,
152
- ) => Promise<void>;
153
- saveContentHashIndexes: () => Promise<void>;
154
- artifactTypeForCategory: (
155
- category: string,
156
- ) =>
157
- | "decision"
158
- | "constraint"
159
- | "todo"
160
- | "definition"
161
- | "commitment"
162
- | "correction"
163
- | "fact";
164
- loadRoutingRules: () => Promise<RouteRule[]>;
165
- routeEngineOptions: () => RoutingEngineOptions;
166
- semanticDedupLookup: (
167
- content: string,
168
- limit: number,
169
- targetStorage: StorageManager,
170
- ) => Promise<SemanticDedupHit[]>;
171
- checkForContradiction: (
172
- content: string,
173
- category: string,
174
- namespaceScope: string,
175
- ) => Promise<{
176
- supersededId: string;
177
- confidence: number;
178
- reason: string;
179
- supersededPath: string;
180
- supersededCreated: string;
181
- supersededTags: string[];
182
- } | null>;
183
- applyDeferredContradictionResolve: (
184
- contradiction: {
185
- supersededId: string;
186
- reason: string;
187
- supersededPath: string;
188
- supersededCreated: string;
189
- supersededTags: string[];
190
- } | null | undefined,
191
- storage: StorageManager,
192
- newMemoryId: string,
193
- postWriteGuard: boolean,
194
- ) => Promise<void>;
195
- suggestLinksForMemory: (
196
- content: string,
197
- category: string,
198
- namespaceScope: string,
199
- ) => Promise<MemoryLink[]>;
200
- storageDirNamespace: (storageDir: string) => string;
201
- indexPersistedMemory: (storage: StorageManager, memoryId: string) => Promise<void>;
202
- buildGraphEdge: (
203
- storage: StorageManager,
204
- memoryRelPath: string,
205
- entityRef: string | undefined,
206
- memoryId: string,
207
- factContent: string,
208
- allMemsForGraph: MemoryFile[] | null | undefined,
209
- memoryPathById: Map<string, string>,
210
- threadIdForEdge: string | undefined,
211
- threadEpisodeIdsForGraph: string[] | undefined,
212
- fallbackCausalPredecessor: string | undefined,
213
- graphCaps?: GraphConstructionCapabilitySet,
214
- ) => Promise<void>;
215
- updateTemporalTagIndexes: (
216
- storage: StorageManager,
217
- persistedIds: string[],
218
- ) => Promise<void>;
219
- }
220
134
 
221
135
  export class ExtractionPersistCoordinator {
222
136
  constructor(
@@ -254,6 +168,20 @@ export class ExtractionPersistCoordinator {
254
168
  // ensureFactHashIndexAuthoritative), so a deferred write, crash, or
255
169
  // multi-process interleave is safe by construction with no marker to guard.
256
170
  const factDedupEnabled = resolveRecallAuxiliaryCapabilities(this.deps.config).factDeduplication;
171
+ const harmonicConstructionEnabled = resolveCapabilities(this.deps.config).harmonicRetrieval;
172
+ const harmonicAnchorsEnabled =
173
+ resolveConsolidationCapabilities(this.deps.config).abstractionAnchors;
174
+ const harmonicBaseNamespace =
175
+ baseNamespace ?? this.deps.storageDirNamespace(storage.dir);
176
+ const harmonicFactsByStorage = new Map<
177
+ string,
178
+ {
179
+ storage: StorageManager;
180
+ facts: HarmonicConstructionInput["persistedFacts"];
181
+ }
182
+ >();
183
+ const harmonicSourceInsertedAtBase = Date.now();
184
+ let harmonicSourceOrder = 0;
257
185
 
258
186
  // Canonicalize stored content for dedup comparison: strip citations
259
187
  // (using the same template), sanitize, then normalize whitespace.
@@ -304,6 +232,10 @@ export class ExtractionPersistCoordinator {
304
232
  /** #1635: keep this id out of the persisted thread episode set. */
305
233
  pendingReview?: boolean;
306
234
  category?: MemoryCategory;
235
+ harmonicFact?: Omit<
236
+ HarmonicConstructionInput["persistedFacts"][number],
237
+ "memoryId"
238
+ >;
307
239
  } = {},
308
240
  ): void => {
309
241
  if (options.includeReturnedIds !== false) {
@@ -319,6 +251,23 @@ export class ExtractionPersistCoordinator {
319
251
  } else {
320
252
  persistedIdsByStorage.set(key, { storage: targetStorage, ids: [id] });
321
253
  }
254
+ if (
255
+ harmonicConstructionEnabled &&
256
+ options.harmonicFact &&
257
+ !options.pendingReview
258
+ ) {
259
+ const harmonicEntry = harmonicFactsByStorage.get(key) ?? {
260
+ storage: targetStorage,
261
+ facts: [],
262
+ };
263
+ harmonicEntry.facts.push({
264
+ ...options.harmonicFact,
265
+ memoryId: id,
266
+ insertedAt: new Date(harmonicSourceInsertedAtBase + harmonicSourceOrder).toISOString(),
267
+ });
268
+ harmonicSourceOrder++;
269
+ harmonicFactsByStorage.set(key, harmonicEntry);
270
+ }
322
271
  if (options.category && !memoryPathById.has(id)) {
323
272
  const relPath = resolvePersistedMemoryRelativePath({ memoryId: id, pathById: memoryPathById, category: options.category });
324
273
  memoryPathById.set(id, relPath);
@@ -420,6 +369,10 @@ export class ExtractionPersistCoordinator {
420
369
  sources?: ProvenanceSource[];
421
370
  provenance?: "verified" | "unverified" | "none";
422
371
  toolScoped?: true;
372
+ harmonicFact?: Omit<
373
+ HarmonicConstructionInput["persistedFacts"][number],
374
+ "memoryId"
375
+ >;
423
376
  }): Promise<void> => {
424
377
  if (
425
378
  !scopeProfileWritePlan ||
@@ -558,6 +511,9 @@ export class ExtractionPersistCoordinator {
558
511
  structuredAttributes: { ...targetSurvivingAttrs },
559
512
  createdAt: supersessionOrderingAt(options.validAt),
560
513
  enabled: !(options.eventTimeSource === "extracted" && !options.validAt),
514
+ extraction: this.deps.getExtraction(),
515
+ config: this.config,
516
+ namespaceScope: this.deps.storageDirNamespace(targetStorage.dir),
561
517
  });
562
518
  } catch (profileSupersessionErr) {
563
519
  log.warn(
@@ -568,7 +524,11 @@ export class ExtractionPersistCoordinator {
568
524
  // #1645 TV6: a tombstone-blocked promotion is pending_review (no
569
525
  // active copy) — skip catalog/index/behavior like postWriteGuard.
570
526
  if (!targetPromotion.tombstoneBlocked) {
571
- trackPersistedId(targetStorage, promotedId, { includeReturnedIds: false, category: options.category as MemoryCategory });
527
+ trackPersistedId(targetStorage, promotedId, {
528
+ includeReturnedIds: false,
529
+ category: options.category as MemoryCategory,
530
+ harmonicFact: options.harmonicFact,
531
+ });
572
532
  await this.deps.indexPersistedMemory(targetStorage, promotedId);
573
533
  trackBehaviorSignals(
574
534
  targetStorage,
@@ -616,6 +576,10 @@ export class ExtractionPersistCoordinator {
616
576
  /** Claim-level provenance spans (issue #1575 PR 2). */
617
577
  sources?: ProvenanceSource[];
618
578
  provenance?: "verified" | "unverified" | "none";
579
+ harmonicFact?: Omit<
580
+ HarmonicConstructionInput["persistedFacts"][number],
581
+ "memoryId"
582
+ >;
619
583
  }): Promise<void> => {
620
584
  const toolScoped = withholdToolScopedFromSharedNamespace(options);
621
585
  await promoteMemoryToProfileTargets({
@@ -849,6 +813,9 @@ export class ExtractionPersistCoordinator {
849
813
  createdAt: supersessionOrderingAt(options.validAt),
850
814
  enabled: !(options.eventTimeSource === "extracted" && !options.validAt),
851
815
  useCallerTimestamp: true,
816
+ extraction: this.deps.getExtraction(),
817
+ config: this.config,
818
+ namespaceScope: this.deps.storageDirNamespace(sharedStorage.dir),
852
819
  });
853
820
  // Catalog touch (issue #1499 — codex P2 NElSf): this dedup branch
854
821
  // returns WITHOUT the post-write catalog touch (now at the storage chokepoint #1522),
@@ -971,6 +938,9 @@ export class ExtractionPersistCoordinator {
971
938
  structuredAttributes: { ...sharedSurvivingAttrs },
972
939
  createdAt: supersessionOrderingAt(options.validAt),
973
940
  enabled: !(options.eventTimeSource === "extracted" && !options.validAt),
941
+ extraction: this.deps.getExtraction(),
942
+ config: this.config,
943
+ namespaceScope: this.deps.storageDirNamespace(sharedStorage.dir),
974
944
  });
975
945
  } catch (sharedSupersessionErr) {
976
946
  log.warn(
@@ -992,6 +962,7 @@ export class ExtractionPersistCoordinator {
992
962
  trackPersistedId(sharedStorage, promotedId, {
993
963
  includeReturnedIds: false,
994
964
  category: options.category as MemoryCategory,
965
+ harmonicFact: options.harmonicFact,
995
966
  });
996
967
  await this.deps.indexPersistedMemory(sharedStorage, promotedId);
997
968
  trackBehaviorSignals(
@@ -1650,6 +1621,17 @@ export class ExtractionPersistCoordinator {
1650
1621
  );
1651
1622
  }
1652
1623
  }
1624
+ const harmonicFact: Omit<
1625
+ HarmonicConstructionInput["persistedFacts"][number],
1626
+ "memoryId"
1627
+ > = {
1628
+ category: writeCategory,
1629
+ content: fact.content,
1630
+ tags: fact.tags,
1631
+ cueAnchors: fact.cueAnchors,
1632
+ entityRef: fact.entityRef,
1633
+ validAt: biTemporal?.validFrom ?? sourceContext?.validAt,
1634
+ };
1653
1635
  // #1669 redaction-rule gate: consult BOTH source and target namespace
1654
1636
  // rules before any write. A never-store pattern registered under the
1655
1637
  // source namespace must survive scope-routing to a different target
@@ -2346,6 +2328,7 @@ export class ExtractionPersistCoordinator {
2346
2328
  trackPersistedId(targetStorage, parentId, {
2347
2329
  pendingReview: postWriteGuard,
2348
2330
  category: writeCategory,
2331
+ harmonicFact,
2349
2332
  });
2350
2333
  // #1576 (cursor Medium): keep pending_review ids out of threadEpisodeIdsForGraph — else later active facts build thread-predecessor edges to an unfaithful memory.
2351
2334
  if (
@@ -2383,6 +2366,9 @@ export class ExtractionPersistCoordinator {
2383
2366
  // supersede a later active fact (codex P1 on :15534).
2384
2367
  enabled: lifecycleCaps.temporalSupersession &&
2385
2368
  !(biTemporal && !biTemporal.validFrom),
2369
+ extraction: this.deps.getExtraction(),
2370
+ config: this.config,
2371
+ namespaceScope: this.deps.storageDirNamespace(targetStorage.dir),
2386
2372
  });
2387
2373
  } catch (err) {
2388
2374
  log.warn(`temporal-supersession (chunked): unexpected error: ${err}`);
@@ -2418,6 +2404,7 @@ export class ExtractionPersistCoordinator {
2418
2404
  ...(fact.procedureSteps && fact.procedureSteps.length ? { procedureSteps: fact.procedureSteps } : {}),
2419
2405
  ...(fact.sources && fact.sources.length > 0 ? { sources: fact.sources } : {}),
2420
2406
  ...(fact.provenance ? { provenance: fact.provenance } : {}),
2407
+ harmonicFact,
2421
2408
  });
2422
2409
  // Register chunked content in the target storage hash index too.
2423
2410
  // Thread 3 fix: canonicalize by stripping any pre-existing citation
@@ -2654,6 +2641,9 @@ export class ExtractionPersistCoordinator {
2654
2641
  createdAt: supersessionOrderingAt(biTemporal?.validFrom ?? sourceContext?.validAt),
2655
2642
  enabled: lifecycleCaps.temporalSupersession &&
2656
2643
  !(biTemporal && !biTemporal.validFrom),
2644
+ extraction: this.deps.getExtraction(),
2645
+ config: this.config,
2646
+ namespaceScope: this.deps.storageDirNamespace(targetStorage.dir),
2657
2647
  });
2658
2648
  } catch (err) {
2659
2649
  log.warn(`temporal-supersession: unexpected error: ${err}`);
@@ -2674,6 +2664,7 @@ export class ExtractionPersistCoordinator {
2674
2664
  trackPersistedId(targetStorage, memoryId, {
2675
2665
  pendingReview: postWriteGuard,
2676
2666
  category: writeCategory,
2667
+ harmonicFact,
2677
2668
  });
2678
2669
  if (
2679
2670
  !postWriteGuard &&
@@ -2721,6 +2712,7 @@ export class ExtractionPersistCoordinator {
2721
2712
  ...(fact.procedureSteps && fact.procedureSteps.length ? { procedureSteps: fact.procedureSteps } : {}),
2722
2713
  ...(fact.sources && fact.sources.length > 0 ? { sources: fact.sources } : {}),
2723
2714
  ...(fact.provenance ? { provenance: fact.provenance } : {}),
2715
+ harmonicFact,
2724
2716
  });
2725
2717
  // v8.2: graph edge building (fail-open). #1576: skip pending_review facts.
2726
2718
  if (graphCaps.multiGraphMemory && !postWriteGuard) {
@@ -2994,6 +2986,21 @@ export class ExtractionPersistCoordinator {
2994
2986
  log.info(
2995
2987
  `persisted: ${facts.length - dedupedCount - importanceGatedCount - judgeGatedCount - redactionGatedCount} facts${dedupSuffix}${gatedSuffix}${judgeSuffix}${redactionSuffix}, ${entities.length} entities, ${questions.length} questions, ${profileUpdates.length} profile updates`,
2996
2988
  );
2989
+ if (harmonicConstructionEnabled && harmonicFactsByStorage.size > 0) {
2990
+ await persistConstructedHarmonicRecords({
2991
+ entries: harmonicFactsByStorage.values(),
2992
+ baseStorageDir: storage.dir,
2993
+ abstractionNodeStoreDir:
2994
+ !scopeProfileWritePlan && harmonicBaseNamespace === this.deps.config.defaultNamespace
2995
+ ? this.deps.config.abstractionNodeStoreDir
2996
+ : undefined,
2997
+ sessionKey: sourceContext?.sessionKey,
2998
+ validAt: sourceContext?.validAt,
2999
+ episodeTitle: result.episodeTitle,
3000
+ anchorsEnabled: harmonicAnchorsEnabled,
3001
+ entityMentions: entities,
3002
+ });
3003
+ }
2997
3004
  // Update temporal + tag indexes (v8.1) — fire-and-forget, fail-open
2998
3005
  void (async () => {
2999
3006
  if (persistedIdsByStorage.size === 0) {
@@ -0,0 +1,86 @@
1
+ import {
2
+ type HarmonicConstructionInput,
3
+ deriveHarmonicRecords,
4
+ harmonicEntityReferenceMatches,
5
+ harmonicEntitySegment,
6
+ normalizedHarmonicEntityIdentity,
7
+ persistHarmonicRecords,
8
+ } from "../harmonic-construction.js";
9
+ import { log } from "../logger.js";
10
+ import type { ExtractionResult } from "../types.js";
11
+
12
+ export interface HarmonicPersistenceEntry {
13
+ storage: { dir: string };
14
+ facts: HarmonicConstructionInput["persistedFacts"];
15
+ }
16
+
17
+ export function filterHarmonicEntityMentions(
18
+ facts: HarmonicConstructionInput["persistedFacts"],
19
+ entityMentions: ExtractionResult["entities"]
20
+ ): ExtractionResult["entities"] {
21
+ const identitiesBySegment = new Map<string, Set<string>>();
22
+ for (const entity of entityMentions) {
23
+ const segment = harmonicEntitySegment(entity.name);
24
+ const identities = identitiesBySegment.get(segment) ?? new Set<string>();
25
+ identities.add(normalizedHarmonicEntityIdentity(entity.name));
26
+ identitiesBySegment.set(segment, identities);
27
+ }
28
+ return entityMentions.flatMap((entity) => {
29
+ const allowSegmentFallback = identitiesBySegment.get(harmonicEntitySegment(entity.name))?.size === 1;
30
+ const activeFacts = facts.filter(
31
+ (fact) =>
32
+ typeof fact.entityRef === "string" &&
33
+ harmonicEntityReferenceMatches(fact.entityRef, entity.name, allowSegmentFallback)
34
+ );
35
+ return activeFacts.length > 0 ? [{ ...entity, facts: activeFacts.map((fact) => fact.content) }] : [];
36
+ });
37
+ }
38
+
39
+ export async function persistConstructedHarmonicRecords(options: {
40
+ entries: Iterable<HarmonicPersistenceEntry>;
41
+ baseStorageDir: string;
42
+ abstractionNodeStoreDir?: string;
43
+ sessionKey?: string;
44
+ validAt?: string;
45
+ episodeTitle?: string;
46
+ anchorsEnabled: boolean;
47
+ entityMentions: ExtractionResult["entities"];
48
+ }): Promise<void> {
49
+ const sessionKey = options.sessionKey?.trim();
50
+ if (!sessionKey) {
51
+ log.warn("harmonic construction skipped: extraction session key is missing");
52
+ return;
53
+ }
54
+ const recordedAt =
55
+ options.validAt && Number.isFinite(Date.parse(options.validAt))
56
+ ? new Date(options.validAt).toISOString()
57
+ : new Date().toISOString();
58
+ const entries = [...options.entries];
59
+ const sharedEpisodeTitle = entries.length === 1 ? options.episodeTitle : undefined;
60
+ for (const entry of entries) {
61
+ try {
62
+ const records = deriveHarmonicRecords({
63
+ sessionKey,
64
+ recordedAt,
65
+ episodeTitle: sharedEpisodeTitle,
66
+ persistedFacts: entry.facts,
67
+ entityMentions: filterHarmonicEntityMentions(entry.facts, options.entityMentions).map((entity) => ({
68
+ name: entity.name,
69
+ type: entity.type,
70
+ facts: entity.facts,
71
+ })),
72
+ });
73
+ await persistHarmonicRecords({
74
+ memoryDir: entry.storage.dir,
75
+ abstractionNodeStoreDir:
76
+ entry.storage.dir === options.baseStorageDir ? options.abstractionNodeStoreDir : undefined,
77
+ nodes: records.nodes,
78
+ anchors: options.anchorsEnabled ? records.anchors : [],
79
+ });
80
+ } catch (error) {
81
+ log.warn(
82
+ `harmonic construction failed open for namespace ${entry.storage.dir}: ${error instanceof Error ? error.message : String(error)}`
83
+ );
84
+ }
85
+ }
86
+ }
@@ -1551,6 +1551,7 @@ export class RecallInternalCoordinator {
1551
1551
  maxResults,
1552
1552
  sessionKey,
1553
1553
  anchorsEnabled: resolveConsolidationCapabilities(this.deps.config).abstractionAnchors,
1554
+ temporalExpiredInInjection: this.deps.config.temporalExpiredInInjection,
1554
1555
  abortSignal: harmonicRetrievalAbort.signal,
1555
1556
  }),
1556
1557
  ),
@@ -784,13 +784,13 @@ export class Orchestrator {
784
784
  * its own methods + coordinators.
785
785
  */
786
786
  private _consolidationRunCoordinator: ConsolidationRunCoordinator | undefined;
787
-
788
787
  private get consolidationRunCoordinator(): ConsolidationRunCoordinator {
789
788
  if (!this._consolidationRunCoordinator) {
790
789
  this._consolidationRunCoordinator = new ConsolidationRunCoordinator({
791
790
  config: this.config,
792
791
  getStorage: () => this.storage,
793
792
  getStorageRouter: () => this.storageRouter,
793
+ getNamespaceCatalog: () => this.namespaceCatalog,
794
794
  getExtraction: () => this.extraction,
795
795
  embeddingFallback: this.embeddingFallback,
796
796
  tmtBuilder: this.tmtBuilder,
@@ -825,6 +825,7 @@ export class Orchestrator {
825
825
  getStorageRouter: () => this.storageRouter,
826
826
  getThreading: () => this.threading,
827
827
  getLocalLlm: () => this.localLlm,
828
+ getExtraction: () => this.extraction,
828
829
  getQmd: () => this.qmd,
829
830
  getJudgeVerdictCache: () => this.judgeVerdictCache,
830
831
  getJudgeDeferCounts: () => this.judgeDeferCounts,
package/src/schemas.ts CHANGED
@@ -81,6 +81,16 @@ export const ExtractedFactSchema = z.object({
81
81
  .optional()
82
82
  .nullable()
83
83
  .describe("If about an entity, its normalized name (e.g. person-jane-doe)"),
84
+ cueAnchors: z
85
+ .array(
86
+ z.object({
87
+ type: z.enum(["entity", "file", "tool", "outcome", "constraint", "date"]),
88
+ value: z.string(),
89
+ }),
90
+ )
91
+ .optional()
92
+ .nullable()
93
+ .describe("Up to three short retrieval cues for this fact."),
84
94
  promptedByQuestion: z
85
95
  .string()
86
96
  .optional()
@@ -296,6 +306,11 @@ export const ExtractionResultSchema = z.object({
296
306
  .describe(
297
307
  "A brief reflection on what you learned about yourself as an agent in this interaction — patterns in your behavior, growth, things you did well or could improve.",
298
308
  ),
309
+ episodeTitle: z
310
+ .string()
311
+ .optional()
312
+ .nullable()
313
+ .describe("A six-to-eight word title for this conversation segment."),
299
314
  relationships: z
300
315
  .array(ExtractedRelationshipSchema)
301
316
  .optional()
package/src/storage.ts CHANGED
@@ -365,6 +365,15 @@ function serializeFrontmatter(fm: MemoryFrontmatter): string {
365
365
  if (fm.tombstoneBlockTier) lines.push(`tombstoneBlockTier: ${fm.tombstoneBlockTier}`);
366
366
  if (fm.supersededBy) lines.push(`supersededBy: ${fm.supersededBy}`);
367
367
  if (fm.supersededAt) lines.push(`supersededAt: ${fm.supersededAt}`);
368
+ if (fm.supersessionCause) {
369
+ if (fm.supersessionCause !== "direct" && fm.supersessionCause !== "dependency") {
370
+ throw new Error(
371
+ `serializeFrontmatter: invalid supersessionCause ${JSON.stringify(fm.supersessionCause)} — expected "direct" | "dependency"`,
372
+ );
373
+ }
374
+ lines.push(`supersessionCause: ${fm.supersessionCause}`);
375
+ }
376
+ if (fm.invalidatedBy) lines.push(`invalidatedBy: ${fm.invalidatedBy}`);
368
377
  if (fm.archivedAt) lines.push(`archivedAt: ${fm.archivedAt}`);
369
378
  // Issue #680 — explicit fact lifecycle. Emit only when present so legacy
370
379
  // memories round-trip unchanged; readers default `valid_at` to `created`.
@@ -893,6 +902,11 @@ export function parseFrontmatter(raw: string): { frontmatter: MemoryFrontmatter;
893
902
  supersededBy: fm.supersededBy || undefined,
894
903
  supersededAt: fm.supersededAt || undefined,
895
904
  archivedAt: fm.archivedAt || undefined,
905
+ supersessionCause:
906
+ fm.supersessionCause === "direct" || fm.supersessionCause === "dependency"
907
+ ? fm.supersessionCause
908
+ : undefined,
909
+ invalidatedBy: fm.invalidatedBy || undefined,
896
910
  // Issue #680 — explicit fact lifecycle round-trip.
897
911
  valid_at: fm.validAt || undefined,
898
912
  invalid_at: fm.invalidAt || undefined,
@@ -12,10 +12,12 @@
12
12
  * cached `readAllMemories()` path so cost is amortized with the rest of the
13
13
  * write pipeline.
14
14
  */
15
- import type { MemoryFile, MemoryFrontmatter } from "./types.js";
15
+ import type { MemoryFile, MemoryFrontmatter, PluginConfig } from "./types.js";
16
+ import type { ExtractionEngine } from "./extraction.js";
16
17
  import type { StorageManager } from "./storage.js";
17
18
  import { log } from "./logger.js";
18
19
  import { effectiveValidAt } from "./temporal-validity.js";
20
+ import { propagateInvalidation } from "./orchestration/dependency-propagation.js";
19
21
 
20
22
  /**
21
23
  * Shared normalization for supersession key components.
@@ -244,6 +246,10 @@ export async function applyTemporalSupersession(args: {
244
246
  * stale relative to the incoming promotion event (PR #402 Finding Uyui).
245
247
  */
246
248
  useCallerTimestamp?: boolean;
249
+ /** Optional orchestration dependencies for one-hop propagation. */
250
+ extraction?: ExtractionEngine;
251
+ config?: PluginConfig;
252
+ namespaceScope?: string;
247
253
  }): Promise<TemporalSupersessionResult> {
248
254
  const empty: TemporalSupersessionResult = { supersededIds: [], matchedKeys: [] };
249
255
  if (!args.enabled) return empty;
@@ -509,6 +515,28 @@ export async function applyTemporalSupersession(args: {
509
515
  );
510
516
  }
511
517
  }
518
+ if (args.extraction && args.config && args.namespaceScope) {
519
+ try {
520
+ await propagateInvalidation(
521
+ {
522
+ storage: args.storage,
523
+ extraction: args.extraction,
524
+ config: args.config,
525
+ },
526
+ {
527
+ oldMemory: fresh,
528
+ replacementId: args.newMemoryId,
529
+ replacementContent: newMemoryFile?.content ?? null,
530
+ cause: "temporal_supersession",
531
+ namespaceScope: args.namespaceScope,
532
+ },
533
+ );
534
+ } catch (propagationErr) {
535
+ log.warn(
536
+ `temporal-supersession: dependency propagation failed for ${fresh.frontmatter.id}: ${propagationErr}`,
537
+ );
538
+ }
539
+ }
512
540
  }
513
541
  } catch (err) {
514
542
  log.warn(
@@ -14,6 +14,7 @@ import os from "node:os";
14
14
  import path from "node:path";
15
15
 
16
16
  import { parseConfig } from "../config.js";
17
+ import { getAbstractionNodeStoreStatus, type AbstractionNodeStoreStatus } from "../abstraction-nodes.js";
17
18
  import type { Orchestrator } from "../orchestrator.js";
18
19
  import type { ExtractionRunCoordinatorDeps } from "../orchestration/extraction-run.js";
19
20
  import type { BufferTurn, ExtractionResult, PluginConfig } from "../types.js";
@@ -25,10 +26,7 @@ import type { BufferTurn, ExtractionResult, PluginConfig } from "../types.js";
25
26
  * init gate floored so a recall() that never ran initialize() does not block.
26
27
  * Mirrors tests/orchestrator-characterization.test.ts:makeConfig.
27
28
  */
28
- export function makeLifecycleConfig(
29
- memoryDir: string,
30
- overrides: Record<string, unknown> = {},
31
- ): PluginConfig {
29
+ export function makeLifecycleConfig(memoryDir: string, overrides: Record<string, unknown> = {}): PluginConfig {
32
30
  return parseConfig({
33
31
  openaiApiKey: "sk-test",
34
32
  memoryDir,
@@ -47,6 +45,27 @@ export function makeLifecycleConfig(
47
45
  });
48
46
  }
49
47
 
48
+ /** Enable the production harmonic-construction persistence path for a lifecycle row. */
49
+ export function makeHarmonicLifecycleConfig(memoryDir: string, overrides: Record<string, unknown> = {}): PluginConfig {
50
+ return makeLifecycleConfig(memoryDir, {
51
+ harmonicRetrievalEnabled: true,
52
+ ...overrides,
53
+ });
54
+ }
55
+
56
+ /** Read and validate abstraction nodes written by the production store path. */
57
+ export function harmonicNodeStoreStatus(
58
+ memoryDir: string,
59
+ abstractionNodeStoreDir?: string
60
+ ): Promise<AbstractionNodeStoreStatus> {
61
+ return getAbstractionNodeStoreStatus({
62
+ memoryDir,
63
+ abstractionNodeStoreDir,
64
+ enabled: true,
65
+ anchorsEnabled: false,
66
+ });
67
+ }
68
+
50
69
  /** Create a fresh temp memory dir with a stable `remnic-lifecycle-<label>-` prefix. */
51
70
  export function mkTempMemoryDir(label: string): Promise<string> {
52
71
  return mkdtemp(path.join(os.tmpdir(), `remnic-lifecycle-${label}-`));
@@ -95,7 +114,7 @@ interface ExtractionClientSeam {
95
114
  */
96
115
  export function stubExtraction(
97
116
  orchestrator: Orchestrator,
98
- factory: (turns: BufferTurn[], call: number) => ExtractionResult | Promise<ExtractionResult>,
117
+ factory: (turns: BufferTurn[], call: number) => ExtractionResult | Promise<ExtractionResult>
99
118
  ): BufferTurn[][] {
100
119
  const calls: BufferTurn[][] = [];
101
120
  // The `extraction` field is private and structurally unexpressible from
@@ -143,7 +162,7 @@ interface PersistExtractionSeam {
143
162
  */
144
163
  export function stubPersistExtraction(
145
164
  orchestrator: Orchestrator,
146
- factory?: (args: PersistExtractionArgs, call: number) => string[] | Promise<string[]>,
165
+ factory?: (args: PersistExtractionArgs, call: number) => string[] | Promise<string[]>
147
166
  ): PersistExtractionArgs[] {
148
167
  const calls: PersistExtractionArgs[] = [];
149
168
  // `persistExtraction` is replaced in place; the named cast keeps the
@@ -191,7 +210,7 @@ export async function seedFactFile(memoryDir: string, id: string, content: strin
191
210
  content,
192
211
  "",
193
212
  ].join("\n"),
194
- "utf-8",
213
+ "utf-8"
195
214
  );
196
215
  return file;
197
216
  }
@@ -222,7 +241,7 @@ export async function memoryFilesContaining(root: string, needle: string): Promi
222
241
  export async function eventually<T>(
223
242
  probe: () => Promise<T | null | undefined | false>,
224
243
  label: string,
225
- timeoutMs = 5000,
244
+ timeoutMs = 5000
226
245
  ): Promise<T> {
227
246
  const startedAt = Date.now();
228
247
  for (;;) {