@remnic/core 9.50.3 → 9.51.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 (486) hide show
  1. package/dist/access-admin-ops-surface.d.ts +13 -11
  2. package/dist/access-admin-ops-surface.js +41 -39
  3. package/dist/access-authorization-probe.d.ts +13 -11
  4. package/dist/access-authorization-probe.js +42 -40
  5. package/dist/access-boundary.d.ts +13 -11
  6. package/dist/access-boundary.js +41 -39
  7. package/dist/access-cli.js +109 -104
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +3 -1
  10. package/dist/access-extraction-force-flush.d.ts +13 -11
  11. package/dist/access-extraction-force-flush.js +41 -39
  12. package/dist/access-health-types.d.ts +3 -1
  13. package/dist/access-http-lcm-compaction.d.ts +13 -11
  14. package/dist/access-http-lifecycle-flush.d.ts +13 -11
  15. package/dist/access-http-offline-stream.d.ts +13 -11
  16. package/dist/access-http-query.js +41 -39
  17. package/dist/access-http.d.ts +13 -11
  18. package/dist/access-http.js +52 -50
  19. package/dist/access-identity-continuity-surface.d.ts +11 -9
  20. package/dist/access-identity-continuity-surface.js +41 -39
  21. package/dist/access-lcm-surface.d.ts +13 -11
  22. package/dist/access-lcm-surface.js +41 -39
  23. package/dist/access-mcp.d.ts +13 -11
  24. package/dist/access-mcp.js +47 -45
  25. package/dist/access-memory-search-fanout.d.ts +4 -2
  26. package/dist/{access-namespace-preflight-Dj2QolFE.d.ts → access-namespace-preflight-Ds6CGlCP.d.ts} +1 -1
  27. package/dist/access-namespace-preflight.d.ts +5 -3
  28. package/dist/access-namespace-preflight.js +41 -39
  29. package/dist/access-observe-write-surface.d.ts +13 -11
  30. package/dist/access-observe-write-surface.js +41 -39
  31. package/dist/access-offline-manifest.d.ts +11 -9
  32. package/dist/access-operations-batch.js +43 -41
  33. package/dist/access-operations.d.ts +16 -14
  34. package/dist/access-operations.js +46 -44
  35. package/dist/access-recall-concurrency.d.ts +13 -11
  36. package/dist/access-recall-concurrency.js +41 -39
  37. package/dist/access-recall-response.d.ts +13 -11
  38. package/dist/access-recall-response.js +41 -39
  39. package/dist/access-recall-surface.d.ts +13 -11
  40. package/dist/access-recall-surface.js +41 -39
  41. package/dist/access-schema.d.ts +88 -88
  42. package/dist/access-schema.js +3 -3
  43. package/dist/{access-service-DesbnTSa.d.ts → access-service-BY0KJ44c.d.ts} +7 -7
  44. package/dist/access-service-helpers.d.ts +13 -11
  45. package/dist/access-service.d.ts +13 -11
  46. package/dist/access-service.js +41 -39
  47. package/dist/access-surface-catalog.d.ts +13 -11
  48. package/dist/access-wearables-meetings-surface.d.ts +5 -3
  49. package/dist/action-confidence.d.ts +3 -1
  50. package/dist/active-memory-bridge.d.ts +3 -1
  51. package/dist/active-recall.d.ts +3 -1
  52. package/dist/active-recall.js +5 -3
  53. package/dist/active-recall.js.map +1 -1
  54. package/dist/adapters/index.js +4 -4
  55. package/dist/adapters/registry.js +2 -2
  56. package/dist/ambient-provenance.d.ts +3 -1
  57. package/dist/archive-mutation-version.d.ts +9 -0
  58. package/dist/archive-mutation-version.js +20 -0
  59. package/dist/artifact-search.d.ts +3 -1
  60. package/dist/behavior-learner.d.ts +3 -1
  61. package/dist/behavior-signals.d.ts +3 -1
  62. package/dist/bootstrap.d.ts +11 -9
  63. package/dist/briefing.d.ts +4 -2
  64. package/dist/briefing.js +10 -9
  65. package/dist/buffer-surprise-report.d.ts +3 -1
  66. package/dist/buffer-turn-helpers.d.ts +3 -1
  67. package/dist/buffer.d.ts +4 -2
  68. package/dist/buffer.js +5 -5
  69. package/dist/bulk-import/index.d.ts +5 -3
  70. package/dist/calibration.d.ts +3 -1
  71. package/dist/capabilities.d.ts +3 -1
  72. package/dist/{catalog-D-G7RgXR.d.ts → catalog-D3B4RDy1.d.ts} +1 -1
  73. package/dist/causal-behavior.d.ts +3 -1
  74. package/dist/causal-behavior.js +2 -2
  75. package/dist/causal-chain.js +2 -2
  76. package/dist/causal-consolidation.d.ts +3 -1
  77. package/dist/causal-consolidation.js +13 -12
  78. package/dist/causal-consolidation.js.map +1 -1
  79. package/dist/causal-retrieval.js +2 -2
  80. package/dist/causal-trajectory-graph.d.ts +4 -2
  81. package/dist/causal-trajectory-graph.js +2 -1
  82. package/dist/causal-trajectory-graph.js.map +1 -1
  83. package/dist/causal-trajectory.js +1 -1
  84. package/dist/{chunk-KDG2KTWW.js → chunk-33SV3E43.js} +4 -4
  85. package/dist/{chunk-2HGUDBRJ.js → chunk-37ZO6LLJ.js} +2 -2
  86. package/dist/{chunk-QW3WFHKU.js → chunk-45BRYON6.js} +2 -2
  87. package/dist/{chunk-GZICBRWK.js → chunk-4F6X3RXW.js} +2 -2
  88. package/dist/{chunk-7BAYBYY5.js → chunk-4PC4PRJE.js} +2 -2
  89. package/dist/{chunk-VJXY5ZCT.js → chunk-52UKFTUK.js} +2 -2
  90. package/dist/{chunk-ESG7Z255.js → chunk-5UDMFE3Q.js} +2 -2
  91. package/dist/{chunk-JPHEOE6Z.js → chunk-6MTSFX7A.js} +15 -15
  92. package/dist/chunk-6ZN34ISG.js +44 -0
  93. package/dist/chunk-6ZN34ISG.js.map +1 -0
  94. package/dist/{chunk-M4MP34AQ.js → chunk-AHZOMHWN.js} +1 -1
  95. package/dist/{chunk-Z3RHPGSY.js → chunk-AIUBBHSF.js} +3 -3
  96. package/dist/{chunk-S3AYIQCU.js → chunk-AXIDQG5A.js} +12 -12
  97. package/dist/{chunk-QN7NTKRC.js → chunk-AZ2QBGYB.js} +1 -1
  98. package/dist/{chunk-47J4EDGR.js → chunk-AZM4CCAC.js} +8 -8
  99. package/dist/{chunk-IXXABW5A.js → chunk-BHXYAVUM.js} +11 -5
  100. package/dist/chunk-BHXYAVUM.js.map +1 -0
  101. package/dist/{chunk-L2DPF4DF.js → chunk-BIJAWZYW.js} +54 -12
  102. package/dist/chunk-BIJAWZYW.js.map +1 -0
  103. package/dist/{chunk-LEJPSMKM.js → chunk-C5QLI33R.js} +3 -3
  104. package/dist/{chunk-SV3PSA7Y.js → chunk-CV6BBVYV.js} +5 -5
  105. package/dist/{chunk-V7X767RT.js → chunk-DCZBSE4F.js} +52 -52
  106. package/dist/chunk-FC67T4E6.js +70 -0
  107. package/dist/chunk-FC67T4E6.js.map +1 -0
  108. package/dist/{chunk-7PKFPLLZ.js → chunk-FXTYIA46.js} +2 -2
  109. package/dist/{chunk-64BHFFKZ.js → chunk-HLYR2TQL.js} +5 -5
  110. package/dist/{chunk-5C2HNJMO.js → chunk-J5LLX6IL.js} +32 -32
  111. package/dist/{chunk-RKNJBZ55.js → chunk-JBPKEARU.js} +4 -4
  112. package/dist/{chunk-PLKFO2HJ.js → chunk-JL43BVDE.js} +2 -2
  113. package/dist/{chunk-2S72LWKX.js → chunk-JYL3BVVZ.js} +2 -2
  114. package/dist/{chunk-IPLYGWQF.js → chunk-KQAFEZQX.js} +5 -5
  115. package/dist/chunk-LXY5VVGM.js +61 -0
  116. package/dist/chunk-LXY5VVGM.js.map +1 -0
  117. package/dist/{chunk-PYKKWQZ2.js → chunk-M7BXDKPR.js} +6 -6
  118. package/dist/{chunk-Z54EM5YZ.js → chunk-MAXVH44E.js} +7 -7
  119. package/dist/{chunk-LYMNZZIM.js → chunk-NIS256NW.js} +2 -2
  120. package/dist/{chunk-67QG75MJ.js → chunk-NLK2VZYZ.js} +2 -2
  121. package/dist/{chunk-A4QMKFFO.js → chunk-O5FFBO2M.js} +14 -28
  122. package/dist/chunk-O5FFBO2M.js.map +1 -0
  123. package/dist/{chunk-JYIFGGEM.js → chunk-OUKBMQ2O.js} +2 -2
  124. package/dist/{chunk-75XOWNRS.js → chunk-OYESWJ43.js} +4 -4
  125. package/dist/{chunk-TS4AJ2GI.js → chunk-PA45XCUD.js} +3 -3
  126. package/dist/{chunk-BJYET5TX.js → chunk-PRDJMOST.js} +7 -1
  127. package/dist/chunk-PRDJMOST.js.map +1 -0
  128. package/dist/{chunk-4MBPIL4V.js → chunk-PUSLMZBQ.js} +2 -2
  129. package/dist/{chunk-RVO6TCTU.js → chunk-QCECHYZL.js} +6 -6
  130. package/dist/{chunk-GFIKG4FR.js → chunk-QGR6OVGT.js} +2 -2
  131. package/dist/{chunk-NSGU76YO.js → chunk-QHFV6VNU.js} +6 -2
  132. package/dist/chunk-QHFV6VNU.js.map +1 -0
  133. package/dist/{chunk-PDEKQWDV.js → chunk-QT2FRYI4.js} +18 -2
  134. package/dist/chunk-QT2FRYI4.js.map +1 -0
  135. package/dist/{chunk-HNZKVLAN.js → chunk-S354QO4R.js} +2 -2
  136. package/dist/{chunk-NO37MR45.js → chunk-SOEN6KCF.js} +2 -2
  137. package/dist/{chunk-FXX6RQYC.js → chunk-TPTECFWR.js} +2 -2
  138. package/dist/{chunk-GDDGZVFI.js → chunk-UEVLYVNW.js} +2 -2
  139. package/dist/{chunk-YQ4IQ2GA.js → chunk-UT5BV5OG.js} +2 -2
  140. package/dist/{chunk-LAQ33B5D.js → chunk-UU3G6GUP.js} +1 -1
  141. package/dist/chunk-UU3G6GUP.js.map +1 -0
  142. package/dist/{chunk-LNTUXKBT.js → chunk-UYYW2KPU.js} +2 -2
  143. package/dist/{chunk-BOFVT6P3.js → chunk-VBHPOWBJ.js} +175 -98
  144. package/dist/chunk-VBHPOWBJ.js.map +1 -0
  145. package/dist/{chunk-QSYL5CXK.js → chunk-VKXWK44Q.js} +3 -3
  146. package/dist/{chunk-KMWYZTIE.js → chunk-VMMQDEN5.js} +2 -2
  147. package/dist/{chunk-JB6D7EFB.js → chunk-VVG2BOKA.js} +2 -2
  148. package/dist/chunk-W5BIQOAJ.js +69 -0
  149. package/dist/chunk-W5BIQOAJ.js.map +1 -0
  150. package/dist/{chunk-V5H6OJCR.js → chunk-W5XVQFLM.js} +2 -2
  151. package/dist/{chunk-OIOZ6MOP.js → chunk-W6FNX2LP.js} +2 -2
  152. package/dist/{chunk-6QPHF6RR.js → chunk-WQM326GS.js} +2 -2
  153. package/dist/{chunk-TQFHQPWD.js → chunk-XADV5IZ3.js} +8 -8
  154. package/dist/{chunk-DATDLJAO.js → chunk-XAPMEU3K.js} +2 -2
  155. package/dist/chunk-XXSOVESA.js +42 -0
  156. package/dist/chunk-XXSOVESA.js.map +1 -0
  157. package/dist/{chunk-IK6X5QPO.js → chunk-ZHY5TMJG.js} +1193 -443
  158. package/dist/chunk-ZHY5TMJG.js.map +1 -0
  159. package/dist/{chunk-N3LL5NEU.js → chunk-ZMYDYNI4.js} +2 -2
  160. package/dist/{cli-D4vvtxjY.d.ts → cli-CnOkH9hA.d.ts} +6 -6
  161. package/dist/cli.d.ts +15 -13
  162. package/dist/cli.js +74 -70
  163. package/dist/coding/pre-action-gate.d.ts +3 -1
  164. package/dist/coding/pre-action-gate.js +2 -2
  165. package/dist/compounding/engine.d.ts +4 -2
  166. package/dist/compounding/engine.js +10 -9
  167. package/dist/compounding/preference-consolidator.d.ts +3 -1
  168. package/dist/compression-optimizer.d.ts +3 -1
  169. package/dist/config.d.ts +3 -1
  170. package/dist/config.js +5 -3
  171. package/dist/connectors/codex-materialize-runner.d.ts +3 -1
  172. package/dist/connectors/codex-materialize-runner.js +10 -9
  173. package/dist/connectors/codex-materialize.d.ts +3 -1
  174. package/dist/connectors/index.d.ts +3 -1
  175. package/dist/connectors/index.js +10 -9
  176. package/dist/consolidation-provenance-check.d.ts +4 -2
  177. package/dist/consolidation-undo.d.ts +4 -2
  178. package/dist/contradiction/index.d.ts +4 -2
  179. package/dist/contradiction-config.d.ts +29 -0
  180. package/dist/contradiction-config.js +12 -0
  181. package/dist/contradiction-config.js.map +1 -0
  182. package/dist/converge-config.d.ts +3 -1
  183. package/dist/convergence-refresh.d.ts +4 -2
  184. package/dist/convergence-refresh.js +12 -11
  185. package/dist/conversation-index/backend.d.ts +3 -1
  186. package/dist/conversation-index/chunker.d.ts +3 -1
  187. package/dist/conversation-index/faiss-adapter.d.ts +3 -1
  188. package/dist/conversation-index/indexer.d.ts +3 -1
  189. package/dist/conversation-index/search.d.ts +3 -1
  190. package/dist/corpus-watermark.d.ts +3 -1
  191. package/dist/corpus-watermark.js +21 -20
  192. package/dist/day-summary.d.ts +3 -1
  193. package/dist/delinearize.d.ts +3 -1
  194. package/dist/dependency-propagation-config.d.ts +3 -1
  195. package/dist/direct-answer-wiring.d.ts +3 -1
  196. package/dist/direct-answer.d.ts +3 -1
  197. package/dist/embedding-fallback.d.ts +3 -1
  198. package/dist/enrichment/index.d.ts +3 -1
  199. package/dist/entity-retrieval.d.ts +4 -2
  200. package/dist/entity-retrieval.js +10 -9
  201. package/dist/entity-schema.d.ts +3 -1
  202. package/dist/explicit-capture.d.ts +11 -9
  203. package/dist/explicit-capture.js +3 -2
  204. package/dist/external-wiki-access.d.ts +13 -11
  205. package/dist/external-wiki-access.js +42 -40
  206. package/dist/external-wiki-collection-registration.d.ts +3 -1
  207. package/dist/external-wiki-collection.d.ts +3 -1
  208. package/dist/external-wiki-mcp-tools.d.ts +13 -11
  209. package/dist/extraction-error-classification.d.ts +3 -1
  210. package/dist/extraction-faithfulness.d.ts +3 -1
  211. package/dist/extraction-judge-telemetry.d.ts +3 -1
  212. package/dist/extraction-judge-training.d.ts +3 -1
  213. package/dist/extraction-judge.d.ts +3 -1
  214. package/dist/extraction-liveness.d.ts +3 -1
  215. package/dist/extraction-normalization.d.ts +3 -1
  216. package/dist/extraction-prompt.d.ts +3 -1
  217. package/dist/extraction-source-grounding-rules.d.ts +3 -1
  218. package/dist/extraction-source-grounding.d.ts +3 -1
  219. package/dist/extraction.d.ts +3 -1
  220. package/dist/extraction.js +22 -21
  221. package/dist/fallback-llm.d.ts +3 -1
  222. package/dist/graph-444E-DrF.d.ts +349 -0
  223. package/dist/graph-dashboard-diff.d.ts +4 -2
  224. package/dist/graph-dashboard-key.d.ts +4 -2
  225. package/dist/graph-dashboard-parser.d.ts +4 -2
  226. package/dist/{graph-edge-decay-Z6ENALU2.js → graph-edge-decay-65KMOJWY.js} +4 -3
  227. package/dist/graph-edge-decay-65KMOJWY.js.map +1 -0
  228. package/dist/graph-edge-reinforcement.d.ts +4 -2
  229. package/dist/graph-path-reconstruction.d.ts +10 -0
  230. package/dist/graph-path-reconstruction.js +12 -0
  231. package/dist/graph-path-reconstruction.js.map +1 -0
  232. package/dist/graph-path-scoring-config.d.ts +8 -0
  233. package/dist/graph-path-scoring-config.js +10 -0
  234. package/dist/graph-path-scoring-config.js.map +1 -0
  235. package/dist/graph-path-scoring.d.ts +36 -0
  236. package/dist/graph-path-scoring.js +11 -0
  237. package/dist/graph-path-scoring.js.map +1 -0
  238. package/dist/graph-snapshot.d.ts +4 -2
  239. package/dist/graph-snapshot.js +3 -2
  240. package/dist/graph.d.ts +5 -318
  241. package/dist/graph.js +5 -1
  242. package/dist/harmonic-retrieval.js +1 -1
  243. package/dist/importance.d.ts +3 -1
  244. package/dist/importers/index.d.ts +3 -1
  245. package/dist/in-flight-reads.d.ts +3 -1
  246. package/dist/index.d.ts +696 -694
  247. package/dist/index.js +149 -144
  248. package/dist/intent.d.ts +3 -1
  249. package/dist/lcm/engine.d.ts +3 -1
  250. package/dist/lcm/engine.js +3 -3
  251. package/dist/lcm/index.d.ts +3 -1
  252. package/dist/lcm/index.js +6 -6
  253. package/dist/lcm/tools.d.ts +3 -1
  254. package/dist/lifecycle.d.ts +3 -1
  255. package/dist/live-connectors-runner.d.ts +3 -1
  256. package/dist/local-llm.d.ts +3 -1
  257. package/dist/local-model-endpoint.d.ts +3 -1
  258. package/dist/maintenance/memory-governance.d.ts +3 -1
  259. package/dist/maintenance/memory-governance.js +10 -9
  260. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +4 -2
  261. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +10 -9
  262. package/dist/maintenance/rebuild-memory-projection.d.ts +4 -2
  263. package/dist/maintenance/rebuild-memory-projection.js +11 -10
  264. package/dist/{maintenance-ClmUVpGI.d.ts → maintenance-CKwxpdRx.d.ts} +3 -3
  265. package/dist/mcp-memory-inspector-app.d.ts +13 -11
  266. package/dist/memory-action-policy.d.ts +3 -1
  267. package/dist/memory-cache.d.ts +3 -1
  268. package/dist/memory-lifecycle-ledger-utils.d.ts +3 -1
  269. package/dist/memory-projection-store.d.ts +3 -1
  270. package/dist/memory-provenance.d.ts +3 -1
  271. package/dist/memory-snapshot.d.ts +3 -1
  272. package/dist/memory-worth-outcomes.d.ts +4 -2
  273. package/dist/models-json.d.ts +3 -1
  274. package/dist/namespaces/migrate.d.ts +5 -3
  275. package/dist/namespaces/migrate.js +20 -19
  276. package/dist/namespaces/principal.d.ts +3 -1
  277. package/dist/namespaces/search.d.ts +3 -1
  278. package/dist/namespaces/search.js +7 -7
  279. package/dist/namespaces/storage.d.ts +5 -3
  280. package/dist/namespaces/storage.js +10 -9
  281. package/dist/native-knowledge.d.ts +3 -1
  282. package/dist/offline-sync-impression-drain.d.ts +3 -1
  283. package/dist/operator-doctor-corpus.d.ts +3 -1
  284. package/dist/operator-doctor-corpus.js +22 -21
  285. package/dist/operator-doctor-replica.d.ts +3 -1
  286. package/dist/operator-toolkit.d.ts +6 -4
  287. package/dist/operator-toolkit.js +33 -29
  288. package/dist/orchestration/compression-guideline-coordinator.d.ts +4 -2
  289. package/dist/orchestration/maintenance.d.ts +6 -4
  290. package/dist/orchestration/maintenance.js +15 -14
  291. package/dist/{orchestrator-qJ07zI8H.d.ts → orchestrator-BshGam-o.d.ts} +45 -19
  292. package/dist/orchestrator.d.ts +11 -9
  293. package/dist/orchestrator.js +109 -104
  294. package/dist/patterns-cli.d.ts +3 -1
  295. package/dist/{pipeline-WFCxhHOn.d.ts → pipeline-D21Rs6gW.d.ts} +1 -1
  296. package/dist/policy-runtime.d.ts +3 -1
  297. package/dist/proactive-contention.d.ts +3 -1
  298. package/dist/provenance.d.ts +3 -1
  299. package/dist/{qmd-5tzkQ44y.d.ts → qmd-Dhle1P4X.d.ts} +1 -1
  300. package/dist/qmd-preflight.d.ts +4 -2
  301. package/dist/qmd-recall-cache.d.ts +3 -1
  302. package/dist/qmd.d.ts +4 -2
  303. package/dist/qmd.js +4 -4
  304. package/dist/recall-concurrency-config.d.ts +3 -1
  305. package/dist/recall-disclosure-escalation.d.ts +3 -1
  306. package/dist/recall-explain-renderer.d.ts +3 -1
  307. package/dist/recall-explain-renderer.js +3 -3
  308. package/dist/recall-memory-map.d.ts +3 -1
  309. package/dist/recall-planner-llm.d.ts +3 -1
  310. package/dist/recall-planner-llm.js +3 -3
  311. package/dist/recall-state.d.ts +7 -1
  312. package/dist/recall-state.js +1 -1
  313. package/dist/recall-tag-filter.d.ts +3 -1
  314. package/dist/recall-timings.d.ts +3 -1
  315. package/dist/recall-xray-cli.d.ts +3 -1
  316. package/dist/recall-xray-cli.js +4 -4
  317. package/dist/recall-xray-renderer.d.ts +3 -1
  318. package/dist/recall-xray-renderer.js +3 -3
  319. package/dist/recall-xray.d.ts +7 -1
  320. package/dist/recall-xray.js +2 -2
  321. package/dist/reconcile/cursor.d.ts +3 -1
  322. package/dist/reconcile/manifest.d.ts +3 -1
  323. package/dist/reconcile/plan.d.ts +3 -1
  324. package/dist/replay/normalizers/chatgpt.d.ts +3 -1
  325. package/dist/replay/normalizers/claude.d.ts +3 -1
  326. package/dist/replay/normalizers/openclaw.d.ts +3 -1
  327. package/dist/replay/normalizers/shared.d.ts +3 -1
  328. package/dist/replay/runner.d.ts +3 -1
  329. package/dist/replay/types.d.ts +3 -1
  330. package/dist/replica-divergence.d.ts +3 -1
  331. package/dist/replica-peers-config.d.ts +3 -1
  332. package/dist/resolve-auth-token.d.ts +3 -1
  333. package/dist/resume-bundles.js +6 -4
  334. package/dist/retrieval-agents.d.ts +4 -2
  335. package/dist/retrieval-tiers.d.ts +3 -1
  336. package/dist/routing/engine.d.ts +3 -1
  337. package/dist/routing/store.d.ts +3 -1
  338. package/dist/salvage-envelope.d.ts +3 -1
  339. package/dist/schemas.d.ts +116 -116
  340. package/dist/{scope-profiles--vfXPl3X.d.ts → scope-profiles-NzGPDXLn.d.ts} +1 -1
  341. package/dist/search/embed-helper.d.ts +3 -1
  342. package/dist/search/factory.d.ts +3 -1
  343. package/dist/search/factory.js +6 -6
  344. package/dist/search/index.d.ts +3 -1
  345. package/dist/search/index.js +12 -12
  346. package/dist/search/lancedb-backend.d.ts +3 -1
  347. package/dist/search/meilisearch-backend.d.ts +3 -1
  348. package/dist/search/noop-backend.d.ts +3 -1
  349. package/dist/search/orama-backend.d.ts +3 -1
  350. package/dist/search/port.d.ts +3 -1
  351. package/dist/search/remote-backend.d.ts +3 -1
  352. package/dist/{semantic-consolidation-BBDuP9nJ.d.ts → semantic-consolidation-DLDKvyy5.d.ts} +1 -1
  353. package/dist/semantic-consolidation.d.ts +4 -2
  354. package/dist/semantic-consolidation.js +11 -10
  355. package/dist/semantic-rule-promotion.js +10 -9
  356. package/dist/semantic-rule-verifier.d.ts +3 -1
  357. package/dist/semantic-rule-verifier.js +10 -9
  358. package/dist/{service-B8DtbpCM.d.ts → service-BIgVM7fL.d.ts} +2 -2
  359. package/dist/session-observer-bands.d.ts +3 -1
  360. package/dist/session-observer-state.d.ts +3 -1
  361. package/dist/shared-context/manager.d.ts +11 -9
  362. package/dist/signal.d.ts +3 -1
  363. package/dist/source-agent-qualifier.d.ts +3 -1
  364. package/dist/source-agent-qualifier.js +18 -17
  365. package/dist/{storage-BkYN1RIy.d.ts → storage-CVfGWqCI.d.ts} +7 -6
  366. package/dist/storage.d.ts +4 -2
  367. package/dist/storage.js +9 -8
  368. package/dist/summarizer.d.ts +3 -1
  369. package/dist/summary-snapshot.d.ts +3 -1
  370. package/dist/temporal-supersession.d.ts +4 -2
  371. package/dist/temporal-timeline-recall.d.ts +3 -1
  372. package/dist/temporal-validity.d.ts +3 -1
  373. package/dist/threading.d.ts +3 -1
  374. package/dist/tier-migration.d.ts +4 -2
  375. package/dist/tier-routing.d.ts +3 -1
  376. package/dist/topics.d.ts +3 -1
  377. package/dist/transcript.d.ts +3 -1
  378. package/dist/transfer/autodetect.js +1 -1
  379. package/dist/transfer/backup.js +1 -1
  380. package/dist/transfer/capsule-export.js +2 -2
  381. package/dist/transfer/types.d.ts +66 -66
  382. package/dist/trust-score-stage.d.ts +3 -1
  383. package/dist/trust-score.d.ts +3 -1
  384. package/dist/{types-u2s9j1uD.d.ts → types-CkiDUorT.d.ts} +10 -16
  385. package/dist/types.d.ts +3 -1
  386. package/dist/types.js +1 -1
  387. package/dist/utility-runtime.d.ts +3 -1
  388. package/dist/verified-recall.js +10 -9
  389. package/dist/write-envelope.d.ts +3 -1
  390. package/package.json +2 -2
  391. package/src/archive-mutation-version.ts +59 -0
  392. package/src/config.test.ts +45 -0
  393. package/src/config.ts +10 -30
  394. package/src/contradiction/contradiction.test.ts +86 -1
  395. package/src/contradiction-config.ts +92 -0
  396. package/src/graph-path-reconstruction.ts +91 -0
  397. package/src/graph-path-scoring-config.ts +55 -0
  398. package/src/graph-path-scoring.test.ts +238 -0
  399. package/src/graph-path-scoring.ts +77 -0
  400. package/src/graph.test.ts +225 -5
  401. package/src/graph.ts +72 -5
  402. package/src/orchestration/contradiction-linking-coordinator.ts +246 -76
  403. package/src/orchestration/contradiction-localization.integration.test.ts +1953 -0
  404. package/src/orchestration/extraction-anchor-snapshot.ts +83 -0
  405. package/src/orchestration/extraction-persist-deps.ts +8 -2
  406. package/src/orchestration/extraction-persist.ts +43 -34
  407. package/src/orchestration/graph-path-state-loader.test.ts +801 -0
  408. package/src/orchestration/graph-path-state-loader.ts +318 -0
  409. package/src/orchestration/graph-recall-coordinator.integration.test.ts +1163 -0
  410. package/src/orchestration/graph-recall-coordinator.ts +206 -29
  411. package/src/orchestration/graph-recall-seam.ts +19 -0
  412. package/src/orchestration/recall-internal-deps.ts +7 -13
  413. package/src/orchestration/recall-internal.ts +5 -0
  414. package/src/orchestration/recall-introspection.ts +9 -1
  415. package/src/orchestration/recall-search-pipeline.ts +8 -13
  416. package/src/orchestration/update-localization.test.ts +784 -0
  417. package/src/orchestration/update-localization.ts +173 -0
  418. package/src/orchestrator.ts +19 -18
  419. package/src/recall-state.test.ts +29 -1
  420. package/src/recall-state.ts +13 -0
  421. package/src/recall-xray-renderer.test.ts +45 -0
  422. package/src/recall-xray-renderer.ts +16 -0
  423. package/src/recall-xray.ts +13 -0
  424. package/src/storage/supersession-side-effects.ts +97 -0
  425. package/src/storage/tombstone-blocked-capture-sync.ts +13 -5
  426. package/src/storage-contract/cache-coherence.test.ts +299 -0
  427. package/src/storage.ts +86 -88
  428. package/src/types.ts +12 -15
  429. package/dist/chunk-A4QMKFFO.js.map +0 -1
  430. package/dist/chunk-BJYET5TX.js.map +0 -1
  431. package/dist/chunk-BOFVT6P3.js.map +0 -1
  432. package/dist/chunk-IK6X5QPO.js.map +0 -1
  433. package/dist/chunk-IXXABW5A.js.map +0 -1
  434. package/dist/chunk-L2DPF4DF.js.map +0 -1
  435. package/dist/chunk-LAQ33B5D.js.map +0 -1
  436. package/dist/chunk-NSGU76YO.js.map +0 -1
  437. package/dist/chunk-PDEKQWDV.js.map +0 -1
  438. /package/dist/{graph-edge-decay-Z6ENALU2.js.map → archive-mutation-version.js.map} +0 -0
  439. /package/dist/{chunk-KDG2KTWW.js.map → chunk-33SV3E43.js.map} +0 -0
  440. /package/dist/{chunk-2HGUDBRJ.js.map → chunk-37ZO6LLJ.js.map} +0 -0
  441. /package/dist/{chunk-QW3WFHKU.js.map → chunk-45BRYON6.js.map} +0 -0
  442. /package/dist/{chunk-GZICBRWK.js.map → chunk-4F6X3RXW.js.map} +0 -0
  443. /package/dist/{chunk-7BAYBYY5.js.map → chunk-4PC4PRJE.js.map} +0 -0
  444. /package/dist/{chunk-VJXY5ZCT.js.map → chunk-52UKFTUK.js.map} +0 -0
  445. /package/dist/{chunk-ESG7Z255.js.map → chunk-5UDMFE3Q.js.map} +0 -0
  446. /package/dist/{chunk-JPHEOE6Z.js.map → chunk-6MTSFX7A.js.map} +0 -0
  447. /package/dist/{chunk-M4MP34AQ.js.map → chunk-AHZOMHWN.js.map} +0 -0
  448. /package/dist/{chunk-Z3RHPGSY.js.map → chunk-AIUBBHSF.js.map} +0 -0
  449. /package/dist/{chunk-S3AYIQCU.js.map → chunk-AXIDQG5A.js.map} +0 -0
  450. /package/dist/{chunk-QN7NTKRC.js.map → chunk-AZ2QBGYB.js.map} +0 -0
  451. /package/dist/{chunk-47J4EDGR.js.map → chunk-AZM4CCAC.js.map} +0 -0
  452. /package/dist/{chunk-LEJPSMKM.js.map → chunk-C5QLI33R.js.map} +0 -0
  453. /package/dist/{chunk-SV3PSA7Y.js.map → chunk-CV6BBVYV.js.map} +0 -0
  454. /package/dist/{chunk-V7X767RT.js.map → chunk-DCZBSE4F.js.map} +0 -0
  455. /package/dist/{chunk-7PKFPLLZ.js.map → chunk-FXTYIA46.js.map} +0 -0
  456. /package/dist/{chunk-64BHFFKZ.js.map → chunk-HLYR2TQL.js.map} +0 -0
  457. /package/dist/{chunk-5C2HNJMO.js.map → chunk-J5LLX6IL.js.map} +0 -0
  458. /package/dist/{chunk-RKNJBZ55.js.map → chunk-JBPKEARU.js.map} +0 -0
  459. /package/dist/{chunk-PLKFO2HJ.js.map → chunk-JL43BVDE.js.map} +0 -0
  460. /package/dist/{chunk-2S72LWKX.js.map → chunk-JYL3BVVZ.js.map} +0 -0
  461. /package/dist/{chunk-IPLYGWQF.js.map → chunk-KQAFEZQX.js.map} +0 -0
  462. /package/dist/{chunk-PYKKWQZ2.js.map → chunk-M7BXDKPR.js.map} +0 -0
  463. /package/dist/{chunk-Z54EM5YZ.js.map → chunk-MAXVH44E.js.map} +0 -0
  464. /package/dist/{chunk-LYMNZZIM.js.map → chunk-NIS256NW.js.map} +0 -0
  465. /package/dist/{chunk-67QG75MJ.js.map → chunk-NLK2VZYZ.js.map} +0 -0
  466. /package/dist/{chunk-JYIFGGEM.js.map → chunk-OUKBMQ2O.js.map} +0 -0
  467. /package/dist/{chunk-75XOWNRS.js.map → chunk-OYESWJ43.js.map} +0 -0
  468. /package/dist/{chunk-TS4AJ2GI.js.map → chunk-PA45XCUD.js.map} +0 -0
  469. /package/dist/{chunk-4MBPIL4V.js.map → chunk-PUSLMZBQ.js.map} +0 -0
  470. /package/dist/{chunk-RVO6TCTU.js.map → chunk-QCECHYZL.js.map} +0 -0
  471. /package/dist/{chunk-GFIKG4FR.js.map → chunk-QGR6OVGT.js.map} +0 -0
  472. /package/dist/{chunk-HNZKVLAN.js.map → chunk-S354QO4R.js.map} +0 -0
  473. /package/dist/{chunk-NO37MR45.js.map → chunk-SOEN6KCF.js.map} +0 -0
  474. /package/dist/{chunk-FXX6RQYC.js.map → chunk-TPTECFWR.js.map} +0 -0
  475. /package/dist/{chunk-GDDGZVFI.js.map → chunk-UEVLYVNW.js.map} +0 -0
  476. /package/dist/{chunk-YQ4IQ2GA.js.map → chunk-UT5BV5OG.js.map} +0 -0
  477. /package/dist/{chunk-LNTUXKBT.js.map → chunk-UYYW2KPU.js.map} +0 -0
  478. /package/dist/{chunk-QSYL5CXK.js.map → chunk-VKXWK44Q.js.map} +0 -0
  479. /package/dist/{chunk-KMWYZTIE.js.map → chunk-VMMQDEN5.js.map} +0 -0
  480. /package/dist/{chunk-JB6D7EFB.js.map → chunk-VVG2BOKA.js.map} +0 -0
  481. /package/dist/{chunk-V5H6OJCR.js.map → chunk-W5XVQFLM.js.map} +0 -0
  482. /package/dist/{chunk-OIOZ6MOP.js.map → chunk-W6FNX2LP.js.map} +0 -0
  483. /package/dist/{chunk-6QPHF6RR.js.map → chunk-WQM326GS.js.map} +0 -0
  484. /package/dist/{chunk-TQFHQPWD.js.map → chunk-XADV5IZ3.js.map} +0 -0
  485. /package/dist/{chunk-DATDLJAO.js.map → chunk-XAPMEU3K.js.map} +0 -0
  486. /package/dist/{chunk-N3LL5NEU.js.map → chunk-ZMYDYNI4.js.map} +0 -0
@@ -0,0 +1,238 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import type { ActivationPath } from "./graph.js";
4
+ import { scoreEvidencePath, type PathNodeState, type PathScoringOptions } from "./graph-path-scoring.js";
5
+
6
+ const activationPath = (nodeIds: string[], edgeConfidences: number[]): ActivationPath => ({
7
+ nodeIds,
8
+ edgeConfidences,
9
+ graphTypes: edgeConfidences.map(() => "entity"),
10
+ });
11
+
12
+ const state = (
13
+ id: string,
14
+ status: PathNodeState["status"] = "active",
15
+ invalidAt: string | null = null,
16
+ temporal: Record<string, string | null | undefined> = {},
17
+ ): PathNodeState => ({
18
+ id,
19
+ status,
20
+ created: "2025-01-01T00:00:00.000Z",
21
+ ...(invalidAt !== null ? { invalid_at: invalidAt } : {}),
22
+ ...temporal,
23
+ });
24
+
25
+ const score = (
26
+ evidencePath: ActivationPath | null,
27
+ states: ReadonlyMap<string, PathNodeState>,
28
+ options: Partial<PathScoringOptions> = {},
29
+ ): number =>
30
+ scoreEvidencePath(evidencePath, states, {
31
+ asOf: "2026-01-01T00:00:00.000Z",
32
+ invalidNodePenalty: 0.2,
33
+ ...options,
34
+ });
35
+
36
+ test("scores the edge confidence product across a clean path", () => {
37
+ assert.equal(score(activationPath(["seed", "mid", "candidate"], [0.8, 0.5]), new Map()), 0.4);
38
+ });
39
+
40
+ test("penalizes one invalid intermediate memory", () => {
41
+ const states = new Map([["mid", state("mid", "superseded")]]);
42
+ assert.equal(
43
+ score(activationPath(["seed", "mid", "candidate"], [0.8, 0.5]), states),
44
+ 0.8 * 0.5 * 0.2,
45
+ );
46
+ });
47
+
48
+ test("squares the penalty for two invalid intermediate memories", () => {
49
+ const states = new Map([
50
+ ["mid", state("mid", "superseded")],
51
+ ["mid-2", state("mid-2", "active", "2025-01-01T00:00:00.000Z")],
52
+ ]);
53
+ assert.equal(
54
+ score(activationPath(["seed", "mid", "mid-2", "candidate"], [0.8, 0.5, 0.25]), states),
55
+ 0.8 * 0.5 * 0.25 * 0.2 * 0.2,
56
+ );
57
+ });
58
+
59
+ test("ignores seed and candidate state", () => {
60
+ const states = new Map([
61
+ ["seed", state("seed", "rejected", "2025-01-01T00:00:00.000Z")],
62
+ ["candidate", state("candidate", "archived", "2025-01-01T00:00:00.000Z")],
63
+ ]);
64
+ assert.equal(score(activationPath(["seed", "candidate"], [0.7]), states), 0.7);
65
+ });
66
+
67
+ test("treats null status as neutral even with invalidAt", () => {
68
+ const states = new Map([
69
+ ["entity-mid", state("entity-mid", null, "2020-01-01T00:00:00.000Z")],
70
+ ]);
71
+ assert.equal(
72
+ score(activationPath(["seed", "entity-mid", "candidate"], [0.7, 0.6]), states),
73
+ 0.7 * 0.6,
74
+ );
75
+ });
76
+ test("treats malformed invalidAt as neutral", () => {
77
+ const states = new Map([
78
+ ["entity-mid", state("entity-mid", "superseded", "not-a-date")],
79
+ ]);
80
+ assert.equal(
81
+ score(activationPath(["seed", "entity-mid", "candidate"], [0.7, 0.6]), states),
82
+ 0.7 * 0.6,
83
+ );
84
+ });
85
+
86
+ test("treats an unknown intermediate id as neutral", () => {
87
+ assert.equal(
88
+ score(activationPath(["seed", "unknown", "candidate"], [0.7, 0.6]), new Map()),
89
+ 0.7 * 0.6,
90
+ );
91
+ });
92
+
93
+ test("treats invalidAt equal to asOf as invalid", () => {
94
+ const states = new Map([
95
+ ["boundary", state("boundary", "active", "2026-01-01T00:00:00.000Z")],
96
+ ]);
97
+ assert.equal(
98
+ score(activationPath(["seed", "boundary", "candidate"], [1, 1]), states),
99
+ 0.2,
100
+ );
101
+ });
102
+
103
+ test("treats a future invalidAt as valid", () => {
104
+ const states = new Map([
105
+ ["future", state("future", "active", "2026-01-02T00:00:00.000Z")],
106
+ ]);
107
+ assert.equal(
108
+ score(activationPath(["seed", "future", "candidate"], [1, 1]), states),
109
+ 1,
110
+ );
111
+ });
112
+ test("penalizes inactive intermediate nodes with a future invalidAt", () => {
113
+ for (const status of ["rejected", "quarantined", "pending_review", "archived", "forgotten"] as const) {
114
+ const states = new Map([
115
+ [status, state(status, status, "2026-01-02T00:00:00.000Z")],
116
+ ]);
117
+ assert.equal(
118
+ score(activationPath(["seed", status, "candidate"], [1, 1]), states),
119
+ 0.2,
120
+ `${status} intermediate node must remain invalid before invalidAt`,
121
+ );
122
+ }
123
+ });
124
+
125
+ test("keeps penalty one as a no-op", () => {
126
+ const states = new Map([["mid", state("mid", "rejected")]]);
127
+ assert.equal(
128
+ score(activationPath(["seed", "mid", "candidate"], [0.8, 0.5]), states, {
129
+ invalidNodePenalty: 1,
130
+ }),
131
+ 0.8 * 0.5,
132
+ );
133
+ });
134
+
135
+ test("returns one for a missing path", () => {
136
+ assert.equal(score(null, new Map()), 1);
137
+ });
138
+ test("reports path penalty only for invalid intermediate state", async () => {
139
+ const { scoreEvidencePathDetail } = await import("./graph-path-scoring.js");
140
+ const validDetail = scoreEvidencePathDetail(
141
+ activationPath(["seed", "mid", "candidate"], [0.2, 0.3]),
142
+ new Map([["mid", state("mid", "active")]]),
143
+ {
144
+ asOf: "2026-01-01T00:00:00.000Z",
145
+ invalidNodePenalty: 0.2,
146
+ },
147
+ );
148
+ assert.equal(validDetail.score, 0.2 * 0.3);
149
+ assert.equal(validDetail.pathPenaltyApplied, false);
150
+
151
+ const invalidDetail = scoreEvidencePathDetail(
152
+ activationPath(["seed", "mid", "candidate"], [1, 1]),
153
+ new Map([["mid", state("mid", "superseded")]]),
154
+ {
155
+ asOf: "2026-01-01T00:00:00.000Z",
156
+ invalidNodePenalty: 0.2,
157
+ },
158
+ );
159
+ assert.equal(invalidDetail.pathPenaltyApplied, true);
160
+ });
161
+
162
+ test("uses invalidAt for historical supersession validity", () => {
163
+ const states = new Map([
164
+ ["mid", state("mid", "superseded", "2026-02-01T00:00:00.000Z")],
165
+ ]);
166
+ assert.equal(
167
+ score(
168
+ activationPath(["seed", "mid", "candidate"], [1, 1]),
169
+ states,
170
+ { asOf: "2026-01-01T00:00:00.000Z" },
171
+ ),
172
+ 1,
173
+ );
174
+ assert.equal(
175
+ score(
176
+ activationPath(["seed", "mid", "candidate"], [1, 1]),
177
+ states,
178
+ { asOf: "2026-03-01T00:00:00.000Z" },
179
+ ),
180
+ 0.2,
181
+ );
182
+ });
183
+
184
+ test("penalizes an active intermediate that begins after historical asOf", () => {
185
+ const states = new Map([
186
+ [
187
+ "mid",
188
+ state("mid", "active", null, {
189
+ valid_at: "2026-02-01T00:00:00.000Z",
190
+ created: "2026-02-01T00:00:00.000Z",
191
+ }),
192
+ ],
193
+ ]);
194
+ assert.equal(
195
+ score(
196
+ activationPath(["seed", "mid", "candidate"], [1, 1]),
197
+ states,
198
+ { asOf: "2026-01-01T00:00:00.000Z" },
199
+ ),
200
+ 0.2,
201
+ );
202
+ });
203
+
204
+ test("uses legacy supersededAt as the historical end bound", () => {
205
+ const states = new Map([
206
+ [
207
+ "mid",
208
+ state("mid", "superseded", null, {
209
+ created: "2025-01-01T00:00:00.000Z",
210
+ supersededAt: "2026-02-01T00:00:00.000Z",
211
+ }),
212
+ ],
213
+ ]);
214
+ const path = activationPath(["seed", "mid", "candidate"], [1, 1]);
215
+ assert.equal(score(path, states, { asOf: "2026-01-01T00:00:00.000Z" }), 1);
216
+ assert.equal(score(path, states, { asOf: "2026-03-01T00:00:00.000Z" }), 0.2);
217
+ });
218
+
219
+ test("rejects a non-finite asOf", () => {
220
+ assert.throws(
221
+ () =>
222
+ score(
223
+ activationPath(["seed", "mid", "candidate"], [1, 1]),
224
+ new Map(),
225
+ { asOf: "not-a-date" },
226
+ ),
227
+ /asOf must be a finite timestamp/,
228
+ );
229
+ assert.throws(
230
+ () =>
231
+ scoreEvidencePath(
232
+ null,
233
+ new Map(),
234
+ { asOf: "not-a-date", invalidNodePenalty: 0.2 },
235
+ ),
236
+ /asOf must be a finite timestamp/,
237
+ );
238
+ });
@@ -0,0 +1,77 @@
1
+ import type { ActivationPath } from "./graph.js";
2
+ import type { MemoryFrontmatter, MemoryStatus } from "./types.js";
3
+ import { isValidAsOf } from "./temporal-validity.js";
4
+
5
+ /** Memory state used to score an intermediate path node. */
6
+ export interface PathNodeState
7
+ extends Pick<
8
+ MemoryFrontmatter,
9
+ "valid_at" | "invalid_at" | "created" | "supersededAt" | "eventTimeSource"
10
+ > {
11
+ id: string;
12
+ status: MemoryStatus | null;
13
+ }
14
+
15
+ /** Configuration for graph-path evidence scoring. */
16
+ export interface PathScoringOptions {
17
+ asOf: string;
18
+ invalidNodePenalty: number;
19
+ }
20
+
21
+ function isInvalidIntermediate(state: PathNodeState | undefined, asOfMs: number): boolean {
22
+ if (!state || state.status === null) return false;
23
+ if (!isValidAsOf({ ...state, status: state.status }, asOfMs)) return true;
24
+
25
+ const hasSupersessionEnd =
26
+ state.status === "superseded" &&
27
+ ((state.invalid_at?.trim().length ?? 0) > 0 ||
28
+ (state.supersededAt?.trim().length ?? 0) > 0);
29
+ return state.status !== "active" && !hasSupersessionEnd;
30
+ }
31
+
32
+ export interface PathScoreDetail {
33
+ score: number;
34
+ pathPenaltyApplied: boolean;
35
+ }
36
+
37
+ export function scoreEvidencePathDetail(
38
+ evidencePath: ActivationPath | null,
39
+ nodeStates: ReadonlyMap<string, PathNodeState>,
40
+ options: PathScoringOptions,
41
+ ): PathScoreDetail {
42
+ const asOfMs = Date.parse(options.asOf);
43
+ if (!Number.isFinite(asOfMs)) {
44
+ throw new Error("asOf must be a finite timestamp");
45
+ }
46
+ if (!evidencePath) return { score: 1, pathPenaltyApplied: false };
47
+ let multiplier = evidencePath.edgeConfidences.reduce(
48
+ (product, confidence) => product * confidence,
49
+ 1,
50
+ );
51
+ let invalidIntermediateCount = 0;
52
+ for (const nodeId of evidencePath.nodeIds.slice(1, -1)) {
53
+ if (isInvalidIntermediate(nodeStates.get(nodeId), asOfMs)) {
54
+ invalidIntermediateCount += 1;
55
+ multiplier *= options.invalidNodePenalty;
56
+ }
57
+ }
58
+ return {
59
+ score: multiplier,
60
+ pathPenaltyApplied: invalidIntermediateCount > 0 && options.invalidNodePenalty !== 1,
61
+ };
62
+ }
63
+
64
+ /**
65
+ * Return the multiplicative evidence factor for one graph activation path.
66
+ *
67
+ * Edge confidence is multiplied for every hop. Invalid intermediate memories
68
+ * receive the configured penalty once each. Seed and candidate states do not
69
+ * affect the result because the caller already scored those memories.
70
+ */
71
+ export function scoreEvidencePath(
72
+ evidencePath: ActivationPath | null,
73
+ nodeStates: ReadonlyMap<string, PathNodeState>,
74
+ options: PathScoringOptions,
75
+ ): number {
76
+ return scoreEvidencePathDetail(evidencePath, nodeStates, options).score;
77
+ }
package/src/graph.test.ts CHANGED
@@ -4,7 +4,15 @@ import os from "node:os";
4
4
  import path from "node:path";
5
5
  import test from "node:test";
6
6
 
7
- import { type GraphConfig, type GraphEdge, GraphIndex, graphFilePath, readEdges } from "./graph.js";
7
+ import {
8
+ type ActivationPredecessor,
9
+ type GraphConfig,
10
+ type GraphEdge,
11
+ GraphIndex,
12
+ graphFilePath,
13
+ readEdges,
14
+ reconstructActivationPath,
15
+ } from "./graph.js";
8
16
 
9
17
  function makeGraphConfig(): GraphConfig {
10
18
  return {
@@ -116,24 +124,236 @@ test("spreadingActivation propagates same-depth alternate path activation", asyn
116
124
  await rm(memoryDir, { recursive: true, force: true });
117
125
  }
118
126
  });
127
+ test("spreadingActivation records seed-first paths with aligned edge metadata", async () => {
128
+ const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-graph-path-order-"));
129
+ try {
130
+ await writeGraphEdges(memoryDir, [makeEdge("seed", "middle", "entity", 0.8)]);
131
+ await writeGraphEdges(memoryDir, [makeEdge("middle", "candidate", "causal", 0.7)], "causal");
132
+
133
+ const graph = new GraphIndex(memoryDir, {
134
+ ...makeGraphConfig(),
135
+ causalGraphEnabled: true,
136
+ maxGraphTraversalSteps: 2,
137
+ });
138
+ const activated = await graph.spreadingActivation(["seed"], undefined, { recordPaths: true });
139
+
140
+ assert.deepEqual(activated.find((candidate) => candidate.path === "candidate")?.activationPath, {
141
+ nodeIds: ["seed", "middle", "candidate"],
142
+ edgeConfidences: [0.8, 0.7],
143
+ graphTypes: ["entity", "causal"],
144
+ });
145
+ } finally {
146
+ await rm(memoryDir, { recursive: true, force: true });
147
+ }
148
+ });
149
+
150
+ test("spreadingActivation keeps the first shortest predecessor path", async () => {
151
+ const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-graph-path-shortest-"));
152
+ try {
153
+ await writeGraphEdges(memoryDir, [
154
+ makeEdge("seed", "long"),
155
+ makeEdge("seed", "short"),
156
+ makeEdge("long", "candidate"),
157
+ makeEdge("short", "candidate"),
158
+ ]);
159
+
160
+ const graph = new GraphIndex(memoryDir, { ...makeGraphConfig(), maxGraphTraversalSteps: 2 });
161
+ const activated = await graph.spreadingActivation(["seed"], undefined, { recordPaths: true });
162
+
163
+ assert.deepEqual(activated.find((candidate) => candidate.path === "candidate")?.activationPath, {
164
+ nodeIds: ["seed", "long", "candidate"],
165
+ edgeConfidences: [1, 1],
166
+ graphTypes: ["entity", "entity"],
167
+ });
168
+ } finally {
169
+ await rm(memoryDir, { recursive: true, force: true });
170
+ }
171
+ });
172
+ test("spreadingActivation records the stronger equal-hop predecessor", async () => {
173
+ const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-graph-path-strength-"));
174
+ try {
175
+ await writeGraphEdges(memoryDir, [
176
+ makeEdge("seed", "weak"),
177
+ makeEdge("seed", "strong"),
178
+ makeEdge("weak", "candidate", "entity", 0.4),
179
+ makeEdge("strong", "candidate", "entity", 0.9),
180
+ ]);
181
+
182
+ const graph = new GraphIndex(memoryDir, { ...makeGraphConfig(), maxGraphTraversalSteps: 2 });
183
+ const activated = await graph.spreadingActivation(["seed"], undefined, { recordPaths: true });
184
+
185
+ assert.deepEqual(activated.find((candidate) => candidate.path === "candidate")?.activationPath, {
186
+ nodeIds: ["seed", "strong", "candidate"],
187
+ edgeConfidences: [1, 0.9],
188
+ graphTypes: ["entity", "entity"],
189
+ });
190
+ } finally {
191
+ await rm(memoryDir, { recursive: true, force: true });
192
+ }
193
+ });
194
+
195
+ test("spreadingActivation uses a lexical predecessor tie-break", async () => {
196
+ const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-graph-path-lexical-"));
197
+ try {
198
+ await writeGraphEdges(memoryDir, [
199
+ makeEdge("seed", "zulu"),
200
+ makeEdge("seed", "alpha"),
201
+ makeEdge("zulu", "candidate"),
202
+ makeEdge("alpha", "candidate"),
203
+ ]);
204
+
205
+ const graph = new GraphIndex(memoryDir, { ...makeGraphConfig(), maxGraphTraversalSteps: 2 });
206
+ const activated = await graph.spreadingActivation(["seed"], undefined, { recordPaths: true });
207
+
208
+ assert.deepEqual(activated.find((candidate) => candidate.path === "candidate")?.activationPath, {
209
+ nodeIds: ["seed", "alpha", "candidate"],
210
+ edgeConfidences: [1, 1],
211
+ graphTypes: ["entity", "entity"],
212
+ });
213
+ } finally {
214
+ await rm(memoryDir, { recursive: true, force: true });
215
+ }
216
+ });
217
+
119
218
 
120
- function makeEdge(from: string, to: string): GraphEdge {
219
+ test("spreadingActivation keeps predecessor paths isolated per seed", async () => {
220
+ const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-graph-path-seeds-"));
221
+ try {
222
+ await writeGraphEdges(memoryDir, [
223
+ makeEdge("seed-a", "middle-a"),
224
+ makeEdge("seed-b", "middle-b"),
225
+ makeEdge("middle-a", "shared"),
226
+ makeEdge("middle-b", "shared"),
227
+ ]);
228
+
229
+ const graph = new GraphIndex(memoryDir, { ...makeGraphConfig(), maxGraphTraversalSteps: 2 });
230
+ const activated = await graph.spreadingActivation(["seed-a", "seed-b"], undefined, { recordPaths: true });
231
+
232
+ assert.deepEqual(activated.find((candidate) => candidate.path === "shared")?.activationPath, {
233
+ nodeIds: ["seed-a", "middle-a", "shared"],
234
+ edgeConfidences: [1, 1],
235
+ graphTypes: ["entity", "entity"],
236
+ });
237
+ } finally {
238
+ await rm(memoryDir, { recursive: true, force: true });
239
+ }
240
+ });
241
+
242
+ test("spreadingActivation reconstructs bounded paths through cycles without looping", async () => {
243
+ const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-graph-path-cycle-"));
244
+ try {
245
+ await writeGraphEdges(memoryDir, [
246
+ makeEdge("seed", "a"),
247
+ makeEdge("a", "b"),
248
+ makeEdge("b", "a"),
249
+ makeEdge("b", "candidate"),
250
+ ]);
251
+
252
+ const graph = new GraphIndex(memoryDir, { ...makeGraphConfig(), maxGraphTraversalSteps: 3 });
253
+ const activated = await graph.spreadingActivation(["seed"], undefined, { recordPaths: true });
254
+ const candidatePath = activated.find((candidate) => candidate.path === "candidate")?.activationPath;
255
+
256
+ assert.deepEqual(candidatePath, {
257
+ nodeIds: ["seed", "a", "b", "candidate"],
258
+ edgeConfidences: [1, 1, 1],
259
+ graphTypes: ["entity", "entity", "entity"],
260
+ });
261
+ assert.ok(activated.every((candidate) => (candidate.activationPath?.nodeIds.length ?? 0) <= 4));
262
+ } finally {
263
+ await rm(memoryDir, { recursive: true, force: true });
264
+ }
265
+ });
266
+
267
+ test("spreadingActivation path recording is deterministic and opt-in output stays unchanged", async () => {
268
+ const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-graph-path-determinism-"));
269
+ try {
270
+ await writeGraphEdges(memoryDir, [
271
+ makeEdge("seed", "left"),
272
+ makeEdge("seed", "right"),
273
+ makeEdge("left", "candidate"),
274
+ makeEdge("right", "candidate"),
275
+ ]);
276
+
277
+ const graph = new GraphIndex(memoryDir, { ...makeGraphConfig(), maxGraphTraversalSteps: 2 });
278
+ const baseline = await graph.spreadingActivation(["seed"]);
279
+ const explicitDisabled = await graph.spreadingActivation(["seed"], undefined, { recordPaths: false });
280
+ const first = await graph.spreadingActivation(["seed"], undefined, { recordPaths: true });
281
+ const second = await graph.spreadingActivation(["seed"], undefined, { recordPaths: true });
282
+
283
+ assert.deepEqual(explicitDisabled, baseline);
284
+ assert.ok(baseline.every((candidate) => !("activationPath" in candidate)));
285
+ assert.deepEqual(second, first);
286
+ } finally {
287
+ await rm(memoryDir, { recursive: true, force: true });
288
+ }
289
+ });
290
+
291
+ test("reconstructActivationPath returns a zero-hop path for a seed candidate", () => {
292
+ assert.deepEqual(reconstructActivationPath("seed", "seed", new Map(), 0), {
293
+ nodeIds: ["seed"],
294
+ edgeConfidences: [],
295
+ graphTypes: [],
296
+ });
297
+ });
298
+
299
+ test("reconstructActivationPath fails closed when a predecessor is missing", () => {
300
+ const predecessors = new Map<string, ActivationPredecessor>([
301
+ [
302
+ "seed\0candidate",
303
+ { prev: "middle", edgeConfidence: 0.8, graphType: "entity" },
304
+ ],
305
+ ]);
306
+
307
+ assert.equal(reconstructActivationPath("seed", "candidate", predecessors, 2), null);
308
+ });
309
+
310
+ test("reconstructActivationPath fails closed on a cycle beyond the step cap", () => {
311
+ const predecessors = new Map<string, ActivationPredecessor>([
312
+ [
313
+ "seed\0candidate",
314
+ { prev: "cycle-a", edgeConfidence: 0.8, graphType: "entity" },
315
+ ],
316
+ [
317
+ "seed\0cycle-a",
318
+ { prev: "cycle-b", edgeConfidence: 0.7, graphType: "time" },
319
+ ],
320
+ [
321
+ "seed\0cycle-b",
322
+ { prev: "cycle-a", edgeConfidence: 0.6, graphType: "causal" },
323
+ ],
324
+ ]);
325
+
326
+ assert.equal(reconstructActivationPath("seed", "candidate", predecessors, 4), null);
327
+ });
328
+
329
+ function makeEdge(
330
+ from: string,
331
+ to: string,
332
+ type: GraphEdge["type"] = "entity",
333
+ confidence?: number,
334
+ ): GraphEdge {
121
335
  return {
122
336
  from,
123
337
  to,
124
- type: "entity",
338
+ type,
125
339
  weight: 1,
340
+ ...(confidence === undefined ? {} : { confidence }),
126
341
  label: "test",
127
342
  ts: "2026-01-01T00:00:00.000Z",
128
343
  };
129
344
  }
130
345
 
131
- async function writeGraphEdges(memoryDir: string, edges: GraphEdge[]): Promise<void> {
132
- const filePath = graphFilePath(memoryDir, "entity");
346
+ async function writeGraphEdges(
347
+ memoryDir: string,
348
+ edges: GraphEdge[],
349
+ type: GraphEdge["type"] = "entity",
350
+ ): Promise<void> {
351
+ const filePath = graphFilePath(memoryDir, type);
133
352
  await mkdir(path.dirname(filePath), { recursive: true });
134
353
  await writeFile(filePath, `${edges.map((edge) => JSON.stringify(edge)).join("\n")}\n`, "utf-8");
135
354
  }
136
355
 
356
+
137
357
  // ---------------------------------------------------------------------------
138
358
  // Incremental edge cache (issue #1904). onMemoryWritten pushes single-writer
139
359
  // appends into the warm cache in place and reloads only on a peer append.