@remnic/core 9.45.2 → 9.45.4

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 (749) hide show
  1. package/dist/abort-error.d.ts +2 -1
  2. package/dist/abort-error.js +3 -1
  3. package/dist/access-admin-ops-surface.d.ts +14 -10
  4. package/dist/access-admin-ops-surface.js +84 -76
  5. package/dist/access-audit.js +2 -2
  6. package/dist/access-authorization-probe.d.ts +14 -10
  7. package/dist/access-authorization-probe.js +85 -77
  8. package/dist/access-boundary.d.ts +15 -11
  9. package/dist/access-boundary.js +84 -76
  10. package/dist/access-citation-namespace.js +2 -2
  11. package/dist/access-cli.js +193 -181
  12. package/dist/access-cli.js.map +1 -1
  13. package/dist/access-coding-context-resolution.d.ts +16 -0
  14. package/dist/access-coding-context-resolution.js +13 -0
  15. package/dist/access-coding-context-resolution.js.map +1 -0
  16. package/dist/access-extraction-force-flush.d.ts +14 -10
  17. package/dist/access-extraction-force-flush.js +84 -76
  18. package/dist/access-health-types.d.ts +2 -1
  19. package/dist/access-http-lcm-compaction.d.ts +16 -12
  20. package/dist/access-http-lcm-compaction.js +3 -3
  21. package/dist/access-http-lifecycle-flush.d.ts +14 -10
  22. package/dist/access-http-lifecycle-flush.js +2 -2
  23. package/dist/access-http-offline-stream.d.ts +123 -0
  24. package/dist/access-http-offline-stream.js +10 -0
  25. package/dist/access-http-offline-stream.js.map +1 -0
  26. package/dist/access-http-query.js +84 -76
  27. package/dist/access-http.d.ts +15 -10
  28. package/dist/access-http.js +105 -92
  29. package/dist/access-identity-continuity-surface.d.ts +9 -8
  30. package/dist/access-identity-continuity-surface.js +84 -76
  31. package/dist/access-lcm-surface.d.ts +14 -10
  32. package/dist/access-lcm-surface.js +84 -76
  33. package/dist/access-mcp-output-schemas.js +1 -1
  34. package/dist/access-mcp.d.ts +14 -10
  35. package/dist/access-mcp.js +95 -83
  36. package/dist/access-memory-search-fanout.d.ts +3 -2
  37. package/dist/{access-namespace-preflight-5yZ4g6F8.d.ts → access-namespace-preflight-CWUDwB4M.d.ts} +1 -1
  38. package/dist/access-namespace-preflight.d.ts +4 -3
  39. package/dist/access-namespace-preflight.js +84 -76
  40. package/dist/access-observe-helpers.d.ts +1 -0
  41. package/dist/access-observe-helpers.js +1 -1
  42. package/dist/access-observe-write-surface.d.ts +16 -10
  43. package/dist/access-observe-write-surface.js +84 -76
  44. package/dist/access-offline-manifest.d.ts +104 -0
  45. package/dist/access-offline-manifest.js +45 -0
  46. package/dist/access-offline-manifest.js.map +1 -0
  47. package/dist/access-operations-batch.js +86 -78
  48. package/dist/access-operations.d.ts +18 -14
  49. package/dist/access-operations.js +91 -80
  50. package/dist/access-recall-concurrency.d.ts +16 -26
  51. package/dist/access-recall-concurrency.js +86 -77
  52. package/dist/access-recall-response.d.ts +18 -14
  53. package/dist/access-recall-response.js +84 -76
  54. package/dist/access-recall-surface.d.ts +29 -24
  55. package/dist/access-recall-surface.js +84 -76
  56. package/dist/access-schema.d.ts +84 -84
  57. package/dist/access-schema.js +3 -3
  58. package/dist/{access-service-CiJRsgAB.d.ts → access-service-CsU-ljFD.d.ts} +25 -16
  59. package/dist/access-service-helpers.d.ts +14 -10
  60. package/dist/access-service.d.ts +14 -10
  61. package/dist/access-service.js +84 -76
  62. package/dist/access-surface-catalog.d.ts +14 -10
  63. package/dist/access-surface-catalog.js +4 -0
  64. package/dist/access-surface-catalog.js.map +1 -1
  65. package/dist/access-wearables-meetings-surface.d.ts +4 -3
  66. package/dist/action-confidence.d.ts +2 -1
  67. package/dist/active-memory-bridge.d.ts +2 -1
  68. package/dist/active-recall.d.ts +2 -1
  69. package/dist/active-recall.js +10 -8
  70. package/dist/active-recall.js.map +1 -1
  71. package/dist/adapters/index.js +7 -7
  72. package/dist/adapters/registry.js +3 -3
  73. package/dist/{auto-sync-5OE5QOZB.js → auto-sync-UPTUVE4X.js} +6 -6
  74. package/dist/behavior-learner.d.ts +2 -1
  75. package/dist/behavior-learner.js +1 -1
  76. package/dist/behavior-signals.d.ts +2 -1
  77. package/dist/bootstrap.d.ts +9 -8
  78. package/dist/briefing.d.ts +3 -2
  79. package/dist/briefing.js +23 -22
  80. package/dist/buffer-surprise-report.d.ts +2 -1
  81. package/dist/buffer-turn-helpers.d.ts +2 -1
  82. package/dist/buffer.d.ts +3 -2
  83. package/dist/buffer.js +12 -11
  84. package/dist/bulk-import/index.d.ts +4 -3
  85. package/dist/calibration.d.ts +2 -1
  86. package/dist/capabilities.d.ts +2 -1
  87. package/dist/{capsule-merge-IDWJPCWK.js → capsule-merge-Q6AR3XL7.js} +67 -54
  88. package/dist/capsule-merge-Q6AR3XL7.js.map +1 -0
  89. package/dist/{catalog-scBmy0sO.d.ts → catalog-bctMURhN.d.ts} +1 -1
  90. package/dist/causal-behavior.d.ts +2 -1
  91. package/dist/causal-behavior.js +2 -2
  92. package/dist/causal-chain.js +2 -2
  93. package/dist/causal-consolidation.d.ts +2 -1
  94. package/dist/causal-consolidation.js +27 -26
  95. package/dist/causal-consolidation.js.map +1 -1
  96. package/dist/causal-retrieval.js +2 -2
  97. package/dist/causal-trajectory-graph.d.ts +2 -1
  98. package/dist/causal-trajectory.js +1 -1
  99. package/dist/{chunk-VUPTKTDV.js → chunk-2MRHJNWL.js} +3 -3
  100. package/dist/{chunk-JBPKEARU.js → chunk-2QSZNTDO.js} +7 -7
  101. package/dist/{chunk-5IVLTFOV.js → chunk-44N6ESJ4.js} +2 -2
  102. package/dist/{chunk-WOCNN776.js → chunk-4POAMKV6.js} +100 -41
  103. package/dist/chunk-4POAMKV6.js.map +1 -0
  104. package/dist/{chunk-HO3QBJEY.js → chunk-5546W5SI.js} +2 -2
  105. package/dist/{chunk-U7GW7NE7.js → chunk-5CEECY6P.js} +10 -10
  106. package/dist/{chunk-4UH4BTGK.js → chunk-5SNZSWWR.js} +82 -82
  107. package/dist/{chunk-6CZPDBJS.js → chunk-5U7ID3EZ.js} +3 -3
  108. package/dist/{chunk-GF22HWS2.js → chunk-6NNNURLK.js} +7 -7
  109. package/dist/chunk-773TRRGT.js +36 -0
  110. package/dist/chunk-773TRRGT.js.map +1 -0
  111. package/dist/chunk-7CITSYSH.js +242 -0
  112. package/dist/chunk-7CITSYSH.js.map +1 -0
  113. package/dist/{chunk-227UFSEQ.js → chunk-7RZJWZ46.js} +5 -5
  114. package/dist/{chunk-E5UK4VPE.js → chunk-7SHJHPTY.js} +5 -5
  115. package/dist/{chunk-UVIKWC7M.js → chunk-7YERSTN7.js} +17 -17
  116. package/dist/{chunk-DLVPUX7U.js → chunk-7YKVM5H3.js} +8 -6
  117. package/dist/chunk-7YKVM5H3.js.map +1 -0
  118. package/dist/{chunk-3CE77VAP.js → chunk-A4JMGKCD.js} +87 -74
  119. package/dist/chunk-A4JMGKCD.js.map +1 -0
  120. package/dist/chunk-A5KNZSNA.js +26 -0
  121. package/dist/chunk-A5KNZSNA.js.map +1 -0
  122. package/dist/{chunk-S2NCTZGJ.js → chunk-AJQ57VV3.js} +15 -15
  123. package/dist/chunk-AJQ57VV3.js.map +1 -0
  124. package/dist/{chunk-CUM2BBPN.js → chunk-AUMWZSE7.js} +19 -10
  125. package/dist/chunk-AUMWZSE7.js.map +1 -0
  126. package/dist/{chunk-XYTOI63Z.js → chunk-BGHFOD5A.js} +19 -11
  127. package/dist/chunk-BGHFOD5A.js.map +1 -0
  128. package/dist/{chunk-BUE5E2HL.js → chunk-BGLY7EEM.js} +5 -314
  129. package/dist/chunk-BGLY7EEM.js.map +1 -0
  130. package/dist/chunk-BIPBQQFI.js +44 -0
  131. package/dist/chunk-BIPBQQFI.js.map +1 -0
  132. package/dist/{chunk-S5SLVSVY.js → chunk-BQIFZ2MP.js} +5 -5
  133. package/dist/chunk-BTTPKDIL.js +34 -0
  134. package/dist/{chunk-PVGDJXVK.js.map → chunk-BTTPKDIL.js.map} +1 -1
  135. package/dist/{chunk-E53DSZEN.js → chunk-C26TE27X.js} +3 -3
  136. package/dist/{chunk-LZ4LDKHZ.js → chunk-CLB32OHM.js} +6 -6
  137. package/dist/{chunk-Q6IP2ARR.js → chunk-CSOYVTRX.js} +2 -2
  138. package/dist/{chunk-XOQSEF7X.js → chunk-CVILPI77.js} +6 -6
  139. package/dist/chunk-D3I2MCN7.js +29 -0
  140. package/dist/chunk-D3I2MCN7.js.map +1 -0
  141. package/dist/{chunk-A5OJCXZL.js → chunk-DSUAAZZX.js} +15 -4
  142. package/dist/chunk-DSUAAZZX.js.map +1 -0
  143. package/dist/{chunk-HREE4JHI.js → chunk-DYVMXPCF.js} +486 -287
  144. package/dist/chunk-DYVMXPCF.js.map +1 -0
  145. package/dist/{chunk-J7VGGECD.js → chunk-DZPFMQZ7.js} +1 -1
  146. package/dist/chunk-DZPFMQZ7.js.map +1 -0
  147. package/dist/{chunk-PDLBLTOK.js → chunk-EITZHSX6.js} +9 -9
  148. package/dist/{chunk-D3J5SLQK.js → chunk-EJHEWCGQ.js} +81 -20
  149. package/dist/chunk-EJHEWCGQ.js.map +1 -0
  150. package/dist/{chunk-WUNIWKY4.js → chunk-ELIL2A37.js} +6 -6
  151. package/dist/{chunk-E6PNLPGJ.js → chunk-FZP32336.js} +806 -470
  152. package/dist/chunk-FZP32336.js.map +1 -0
  153. package/dist/{chunk-4L6HUREQ.js → chunk-G7A5HLUS.js} +23 -17
  154. package/dist/chunk-G7A5HLUS.js.map +1 -0
  155. package/dist/{chunk-CINZGPSJ.js → chunk-GUMZC2BO.js} +2 -2
  156. package/dist/{chunk-H24WNPA2.js → chunk-GWFSVJ4P.js} +3 -3
  157. package/dist/{chunk-7XC2HX75.js → chunk-GYPQL6XN.js} +157 -16
  158. package/dist/chunk-GYPQL6XN.js.map +1 -0
  159. package/dist/{chunk-TSH56VPU.js → chunk-HAYSYUAB.js} +2 -2
  160. package/dist/{chunk-TDHTVMPG.js → chunk-HFPASSFV.js} +7 -2
  161. package/dist/chunk-HFPASSFV.js.map +1 -0
  162. package/dist/chunk-J2WC5LF4.js +395 -0
  163. package/dist/chunk-J2WC5LF4.js.map +1 -0
  164. package/dist/{chunk-PKNLM44P.js → chunk-JH6BPLOP.js} +9 -9
  165. package/dist/{chunk-KXB4VXHY.js → chunk-JIYDRBVZ.js} +2 -2
  166. package/dist/chunk-JV3C2MNQ.js +74 -0
  167. package/dist/chunk-JV3C2MNQ.js.map +1 -0
  168. package/dist/{chunk-AV5ZEH4M.js → chunk-KVJRXN2E.js} +2 -2
  169. package/dist/{chunk-JVLCVFQ4.js → chunk-KXEFRMCF.js} +3 -3
  170. package/dist/{chunk-WFTIGIIS.js → chunk-L6CQ7WIW.js} +5 -5
  171. package/dist/{chunk-EJUEXZHX.js → chunk-LLJMAULE.js} +2 -2
  172. package/dist/{chunk-N5Z4EVOR.js → chunk-LNEWDF2A.js} +36 -11
  173. package/dist/chunk-LNEWDF2A.js.map +1 -0
  174. package/dist/{chunk-AS7YMSL6.js → chunk-M23RF3LJ.js} +4 -4
  175. package/dist/{chunk-UYLMNVY6.js → chunk-MDISBSYA.js} +16 -9
  176. package/dist/chunk-MDISBSYA.js.map +1 -0
  177. package/dist/{chunk-3F2LKUMU.js → chunk-NIS256NW.js} +2 -2
  178. package/dist/{chunk-YIAA2X3D.js → chunk-NK5RGJ65.js} +3 -3
  179. package/dist/chunk-NLDVVWCL.js +84 -0
  180. package/dist/chunk-NLDVVWCL.js.map +1 -0
  181. package/dist/{chunk-OQ5PRDDS.js → chunk-NTOIP2E6.js} +6 -6
  182. package/dist/{chunk-HLPD7B7P.js → chunk-NUEQKLNB.js} +2 -2
  183. package/dist/{chunk-4J7G5SY4.js → chunk-NZBZ7IS2.js} +72 -24
  184. package/dist/chunk-NZBZ7IS2.js.map +1 -0
  185. package/dist/{chunk-3TBLDMJA.js → chunk-O4KMGRXE.js} +5 -2
  186. package/dist/chunk-O4KMGRXE.js.map +1 -0
  187. package/dist/{chunk-33PLLLL7.js → chunk-P7NGM24P.js} +6 -6
  188. package/dist/{chunk-7TWUCYER.js → chunk-PNRA7FAD.js} +7 -7
  189. package/dist/{chunk-5I4M26Q7.js → chunk-QBSFOKY6.js} +4 -4
  190. package/dist/{chunk-QJAQNXWI.js → chunk-QCECHYZL.js} +76 -79
  191. package/dist/chunk-QCECHYZL.js.map +1 -0
  192. package/dist/{chunk-P4DRWEYC.js → chunk-QVSBTCVP.js} +2 -2
  193. package/dist/{chunk-AAIUERNB.js → chunk-R5RFK3CB.js} +6 -6
  194. package/dist/{chunk-WDISJRMG.js → chunk-RMMVQQA6.js} +2 -2
  195. package/dist/{chunk-KWMXR7XS.js → chunk-S2V7RUCL.js} +8 -1
  196. package/dist/{chunk-KWMXR7XS.js.map → chunk-S2V7RUCL.js.map} +1 -1
  197. package/dist/{chunk-5SM35XZR.js → chunk-S5NZBKKQ.js} +2 -2
  198. package/dist/{chunk-VNA7W7QF.js → chunk-SVH57F5Z.js} +12 -4
  199. package/dist/chunk-SVH57F5Z.js.map +1 -0
  200. package/dist/{chunk-WIPEXG6R.js → chunk-SXIMQLGV.js} +2 -2
  201. package/dist/{chunk-RVLJEII5.js → chunk-SYUBB3WM.js} +256 -187
  202. package/dist/chunk-SYUBB3WM.js.map +1 -0
  203. package/dist/{chunk-OAEQLRCY.js → chunk-TN76AKO3.js} +5 -5
  204. package/dist/{chunk-QN25OCUF.js → chunk-TQ4GD737.js} +5 -5
  205. package/dist/{chunk-VCD4PSK2.js → chunk-TQZ4DVBC.js} +7 -4
  206. package/dist/chunk-TQZ4DVBC.js.map +1 -0
  207. package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
  208. package/dist/{chunk-DNWXFTLD.js → chunk-TYISDI6B.js} +2 -2
  209. package/dist/{chunk-4LMA77JH.js → chunk-U2VLVBBH.js} +3 -3
  210. package/dist/{chunk-5ZE7QHTK.js → chunk-ULVR5KG7.js} +5 -5
  211. package/dist/{chunk-NVRYW264.js → chunk-UQWIKLQK.js} +18 -15
  212. package/dist/chunk-UQWIKLQK.js.map +1 -0
  213. package/dist/{chunk-YV32N67O.js → chunk-URS5GSM7.js} +1 -1
  214. package/dist/chunk-URS5GSM7.js.map +1 -0
  215. package/dist/{chunk-4B77XSG5.js → chunk-UV72DEZD.js} +5 -5
  216. package/dist/{chunk-S2BBISHU.js → chunk-VANZKHTN.js} +3 -3
  217. package/dist/chunk-VHFXP27N.js +250 -0
  218. package/dist/chunk-VHFXP27N.js.map +1 -0
  219. package/dist/{chunk-3Y224NYC.js → chunk-VYISFWVX.js} +2 -2
  220. package/dist/{chunk-TIHMZFIV.js → chunk-W3IC7QOY.js} +3 -3
  221. package/dist/{chunk-NRV4Y3PM.js → chunk-W4FBGYGK.js} +1 -1
  222. package/dist/{chunk-P2BM76KT.js → chunk-WAS4HV46.js} +174 -43
  223. package/dist/chunk-WAS4HV46.js.map +1 -0
  224. package/dist/{chunk-57QKLRBV.js → chunk-WB7JSQCP.js} +2 -1
  225. package/dist/chunk-WB7JSQCP.js.map +1 -0
  226. package/dist/chunk-WGP57SR3.js +68 -0
  227. package/dist/chunk-WGP57SR3.js.map +1 -0
  228. package/dist/{chunk-ECK75GDJ.js → chunk-WQIHRA5F.js} +43 -24
  229. package/dist/chunk-WQIHRA5F.js.map +1 -0
  230. package/dist/{chunk-MU7ZHSZE.js → chunk-WZFAPHIK.js} +2 -2
  231. package/dist/{chunk-T2TTP3KU.js → chunk-X4IDNPOS.js} +2 -2
  232. package/dist/{chunk-BLAKS3CP.js → chunk-XL3TATMJ.js} +3 -3
  233. package/dist/{chunk-W4XJFLAL.js → chunk-XPRJSHNI.js} +2 -2
  234. package/dist/{chunk-5TFP4CUL.js → chunk-XQ3HXAQH.js} +14 -11
  235. package/dist/chunk-XQ3HXAQH.js.map +1 -0
  236. package/dist/{chunk-VWAXN2BN.js → chunk-XSFHWBQO.js} +93 -31
  237. package/dist/chunk-XSFHWBQO.js.map +1 -0
  238. package/dist/{chunk-DL7ZD3JH.js → chunk-XTAUXTDO.js} +14 -9
  239. package/dist/chunk-XTAUXTDO.js.map +1 -0
  240. package/dist/{chunk-JE7EK33X.js → chunk-Y7HRYCNW.js} +2 -2
  241. package/dist/{chunk-E6EE5B67.js → chunk-YK6BDDHP.js} +4 -4
  242. package/dist/{chunk-ES36HTSC.js → chunk-YLHM5BQQ.js} +3 -3
  243. package/dist/{chunk-RN7DY3FC.js → chunk-YMAQDHQM.js} +31 -12
  244. package/dist/chunk-YMAQDHQM.js.map +1 -0
  245. package/dist/{chunk-ULARSG5Z.js → chunk-YN6ASZUG.js} +10 -8
  246. package/dist/{chunk-ULARSG5Z.js.map → chunk-YN6ASZUG.js.map} +1 -1
  247. package/dist/{chunk-IKKWIPYN.js → chunk-YYQAKIDJ.js} +37 -1
  248. package/dist/chunk-YYQAKIDJ.js.map +1 -0
  249. package/dist/{chunk-BJKPPZ6Z.js → chunk-ZFGZ6PZ2.js} +2 -2
  250. package/dist/{chunk-CJ2ZR7UA.js → chunk-ZI32MKDW.js} +267 -214
  251. package/dist/chunk-ZI32MKDW.js.map +1 -0
  252. package/dist/{chunk-64UDOIMI.js → chunk-ZLQ37WJX.js} +2 -2
  253. package/dist/chunk-ZMAYKGPN.js +351 -0
  254. package/dist/chunk-ZMAYKGPN.js.map +1 -0
  255. package/dist/{cli-BUGN3d6_.d.ts → cli-BBHDtG36.d.ts} +5 -5
  256. package/dist/cli.d.ts +16 -12
  257. package/dist/cli.js +138 -124
  258. package/dist/compounding/engine.d.ts +3 -2
  259. package/dist/compounding/engine.js +24 -23
  260. package/dist/compounding/preference-consolidator.d.ts +2 -1
  261. package/dist/compression-optimizer.d.ts +2 -1
  262. package/dist/config.d.ts +2 -1
  263. package/dist/config.js +10 -8
  264. package/dist/connectors/codex-materialize-runner.d.ts +2 -1
  265. package/dist/connectors/codex-materialize-runner.js +23 -22
  266. package/dist/connectors/codex-materialize.d.ts +2 -1
  267. package/dist/connectors/index.d.ts +2 -1
  268. package/dist/connectors/index.js +26 -25
  269. package/dist/consolidation-provenance-check.d.ts +3 -2
  270. package/dist/consolidation-provenance-check.js +4 -4
  271. package/dist/consolidation-undo.d.ts +3 -2
  272. package/dist/consolidation-undo.js +10 -7
  273. package/dist/consolidation-undo.js.map +1 -1
  274. package/dist/contradiction/index.d.ts +3 -2
  275. package/dist/converge-config.d.ts +2 -1
  276. package/dist/convergence-refresh.d.ts +4 -3
  277. package/dist/convergence-refresh.js +27 -26
  278. package/dist/conversation-index/backend.d.ts +2 -1
  279. package/dist/conversation-index/backend.js +2 -2
  280. package/dist/conversation-index/chunker.d.ts +2 -1
  281. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  282. package/dist/conversation-index/indexer.d.ts +2 -1
  283. package/dist/conversation-index/search.d.ts +2 -1
  284. package/dist/corpus-watermark.d.ts +2 -1
  285. package/dist/corpus-watermark.js +42 -41
  286. package/dist/day-summary.d.ts +2 -1
  287. package/dist/delinearize.d.ts +2 -1
  288. package/dist/direct-answer-wiring.d.ts +2 -1
  289. package/dist/direct-answer-wiring.js +2 -2
  290. package/dist/direct-answer.d.ts +2 -1
  291. package/dist/embedding-fallback.d.ts +2 -1
  292. package/dist/embedding-fallback.js +2 -2
  293. package/dist/enrichment/index.d.ts +2 -1
  294. package/dist/entity-retrieval-boundaries.js +1 -1
  295. package/dist/entity-retrieval.d.ts +3 -2
  296. package/dist/entity-retrieval.js +24 -23
  297. package/dist/entity-schema.d.ts +2 -1
  298. package/dist/explicit-capture.d.ts +9 -8
  299. package/dist/explicit-capture.js +11 -9
  300. package/dist/external-wiki-access.d.ts +127 -0
  301. package/dist/external-wiki-access.js +186 -0
  302. package/dist/external-wiki-access.js.map +1 -0
  303. package/dist/external-wiki-cli.d.ts +13 -0
  304. package/dist/external-wiki-cli.js +96 -0
  305. package/dist/external-wiki-cli.js.map +1 -0
  306. package/dist/external-wiki-collection-registration.d.ts +39 -0
  307. package/dist/external-wiki-collection-registration.js +79 -0
  308. package/dist/external-wiki-collection-registration.js.map +1 -0
  309. package/dist/external-wiki-collection.d.ts +50 -0
  310. package/dist/external-wiki-collection.js +387 -0
  311. package/dist/external-wiki-collection.js.map +1 -0
  312. package/dist/external-wiki-config.d.ts +13 -0
  313. package/dist/external-wiki-config.js +13 -0
  314. package/dist/external-wiki-config.js.map +1 -0
  315. package/dist/external-wiki-guard.d.ts +11 -0
  316. package/dist/external-wiki-guard.js +18 -0
  317. package/dist/external-wiki-guard.js.map +1 -0
  318. package/dist/external-wiki-mcp-tools.d.ts +123 -0
  319. package/dist/external-wiki-mcp-tools.js +8 -0
  320. package/dist/external-wiki-mcp-tools.js.map +1 -0
  321. package/dist/external-wiki-search.d.ts +42 -0
  322. package/dist/external-wiki-search.js +11 -0
  323. package/dist/external-wiki-search.js.map +1 -0
  324. package/dist/external-wiki.d.ts +43 -0
  325. package/dist/external-wiki.js +16 -0
  326. package/dist/external-wiki.js.map +1 -0
  327. package/dist/extraction-error-classification.d.ts +2 -1
  328. package/dist/extraction-faithfulness.d.ts +2 -1
  329. package/dist/extraction-judge-telemetry.d.ts +2 -1
  330. package/dist/extraction-judge-training.d.ts +2 -1
  331. package/dist/extraction-judge.d.ts +2 -1
  332. package/dist/extraction-liveness.d.ts +2 -1
  333. package/dist/extraction-source-grounding-helpers.d.ts +5 -3
  334. package/dist/extraction-source-grounding-helpers.js +1 -1
  335. package/dist/extraction-source-grounding-rules.d.ts +2 -1
  336. package/dist/extraction-source-grounding-rules.js +2 -2
  337. package/dist/extraction-source-grounding.d.ts +2 -1
  338. package/dist/extraction-source-grounding.js +5 -5
  339. package/dist/extraction.d.ts +2 -1
  340. package/dist/extraction.js +45 -43
  341. package/dist/fallback-llm.d.ts +2 -1
  342. package/dist/graph-dashboard-diff.d.ts +2 -1
  343. package/dist/graph-dashboard-key.d.ts +2 -1
  344. package/dist/graph-dashboard-parser.d.ts +2 -1
  345. package/dist/graph-edge-reinforcement.d.ts +2 -1
  346. package/dist/graph-snapshot.d.ts +2 -1
  347. package/dist/graph.d.ts +2 -1
  348. package/dist/harmonic-retrieval.js +2 -2
  349. package/dist/importance.d.ts +2 -1
  350. package/dist/importers/index.d.ts +2 -1
  351. package/dist/in-flight-reads.d.ts +2 -1
  352. package/dist/index.d.ts +732 -720
  353. package/dist/index.js +291 -259
  354. package/dist/intent.d.ts +2 -1
  355. package/dist/lcm/engine.d.ts +2 -1
  356. package/dist/lcm/engine.js +3 -3
  357. package/dist/lcm/index.d.ts +2 -1
  358. package/dist/lcm/index.js +8 -8
  359. package/dist/lcm/tools.d.ts +2 -1
  360. package/dist/lifecycle.d.ts +2 -1
  361. package/dist/live-connectors-runner.d.ts +2 -1
  362. package/dist/local-llm.d.ts +2 -1
  363. package/dist/local-llm.js +2 -2
  364. package/dist/local-model-endpoint.d.ts +2 -1
  365. package/dist/maintenance/memory-governance.d.ts +2 -1
  366. package/dist/maintenance/memory-governance.js +24 -23
  367. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
  368. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +24 -23
  369. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  370. package/dist/maintenance/rebuild-memory-projection.js +26 -25
  371. package/dist/{maintenance-LbuS2rUA.d.ts → maintenance-D2mveyCd.d.ts} +3 -3
  372. package/dist/mcp-memory-inspector-app.d.ts +14 -10
  373. package/dist/mcp-read-only-tools.js +1 -1
  374. package/dist/memory-action-policy.d.ts +2 -1
  375. package/dist/memory-cache.d.ts +2 -1
  376. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  377. package/dist/memory-projection-store.d.ts +2 -1
  378. package/dist/memory-provenance.d.ts +2 -1
  379. package/dist/memory-worth-outcomes.d.ts +3 -2
  380. package/dist/models-json.d.ts +2 -1
  381. package/dist/namespaces/migrate.d.ts +4 -3
  382. package/dist/namespaces/migrate.js +40 -39
  383. package/dist/namespaces/principal.d.ts +2 -1
  384. package/dist/namespaces/search.d.ts +2 -1
  385. package/dist/namespaces/search.js +18 -18
  386. package/dist/namespaces/storage.d.ts +4 -3
  387. package/dist/namespaces/storage.js +23 -22
  388. package/dist/native-knowledge.d.ts +2 -1
  389. package/dist/offline-sync-impression-drain.d.ts +2 -1
  390. package/dist/offline-sync-impression-drain.js +11 -9
  391. package/dist/offline-sync.d.ts +29 -3
  392. package/dist/offline-sync.js +6 -2
  393. package/dist/operator-doctor-corpus.d.ts +2 -1
  394. package/dist/operator-doctor-corpus.js +45 -44
  395. package/dist/operator-doctor-replica.d.ts +2 -1
  396. package/dist/operator-doctor-replica.js +3 -3
  397. package/dist/operator-toolkit.d.ts +4 -3
  398. package/dist/operator-toolkit.js +59 -55
  399. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  400. package/dist/orchestration/maintenance.d.ts +5 -4
  401. package/dist/orchestration/maintenance.js +36 -33
  402. package/dist/{orchestrator-rHiWt32X.d.ts → orchestrator-DJYlwiUv.d.ts} +14 -7
  403. package/dist/orchestrator.d.ts +9 -8
  404. package/dist/orchestrator.js +201 -189
  405. package/dist/page-versioning.js +3 -3
  406. package/dist/patterns-cli.d.ts +2 -1
  407. package/dist/{pipeline-W_97O8BV.d.ts → pipeline-CNjY4wk3.d.ts} +1 -1
  408. package/dist/policy-runtime.d.ts +2 -1
  409. package/dist/policy-runtime.js +1 -1
  410. package/dist/proactive-contention.d.ts +2 -1
  411. package/dist/provenance.d.ts +2 -1
  412. package/dist/provenance.js +2 -2
  413. package/dist/{qmd-LWtMofAf.d.ts → qmd-C0UDZidt.d.ts} +9 -7
  414. package/dist/qmd-preflight.d.ts +5 -4
  415. package/dist/qmd-preflight.js +2 -2
  416. package/dist/qmd-recall-cache.d.ts +2 -1
  417. package/dist/qmd.d.ts +4 -3
  418. package/dist/qmd.js +5 -5
  419. package/dist/recall-concurrency-config.d.ts +2 -1
  420. package/dist/recall-disclosure-escalation.d.ts +2 -1
  421. package/dist/recall-explain-renderer.d.ts +2 -1
  422. package/dist/recall-explain-renderer.js +3 -3
  423. package/dist/recall-memory-map.d.ts +2 -1
  424. package/dist/recall-planner-llm.d.ts +2 -1
  425. package/dist/recall-state.d.ts +2 -1
  426. package/dist/recall-tag-filter.d.ts +2 -1
  427. package/dist/recall-timings.d.ts +2 -1
  428. package/dist/recall-xray-cli.d.ts +2 -1
  429. package/dist/recall-xray-cli.js +4 -4
  430. package/dist/recall-xray-renderer.d.ts +2 -1
  431. package/dist/recall-xray-renderer.js +3 -3
  432. package/dist/recall-xray.d.ts +8 -1
  433. package/dist/recall-xray.js +2 -2
  434. package/dist/reconcile/cursor.d.ts +12 -2
  435. package/dist/reconcile/cursor.js +46 -7
  436. package/dist/reconcile/cursor.js.map +1 -1
  437. package/dist/reconcile/manifest.d.ts +9 -2
  438. package/dist/reconcile/manifest.js +15 -268
  439. package/dist/reconcile/manifest.js.map +1 -1
  440. package/dist/reconcile/plan.d.ts +6 -2
  441. package/dist/reconcile/plan.js +4 -4
  442. package/dist/replay/normalizers/chatgpt.d.ts +2 -1
  443. package/dist/replay/normalizers/claude.d.ts +2 -1
  444. package/dist/replay/normalizers/openclaw.d.ts +2 -1
  445. package/dist/replay/normalizers/shared.d.ts +2 -1
  446. package/dist/replay/runner.d.ts +2 -1
  447. package/dist/replay/types.d.ts +2 -1
  448. package/dist/replica-divergence.d.ts +2 -1
  449. package/dist/replica-divergence.js +2 -2
  450. package/dist/replica-peers-config.d.ts +2 -1
  451. package/dist/resolve-auth-token.d.ts +2 -1
  452. package/dist/resume-bundles.js +12 -10
  453. package/dist/retrieval-agents.d.ts +4 -3
  454. package/dist/retrieval-agents.js +2 -2
  455. package/dist/retrieval-tiers.d.ts +2 -1
  456. package/dist/routing/engine.d.ts +2 -1
  457. package/dist/routing/store.d.ts +2 -1
  458. package/dist/salvage-envelope.d.ts +2 -1
  459. package/dist/schemas.d.ts +76 -76
  460. package/dist/{scope-profiles-BiQKOE-p.d.ts → scope-profiles-BJzp2F5A.d.ts} +1 -1
  461. package/dist/search/embed-helper.d.ts +2 -1
  462. package/dist/search/embed-helper.js +3 -3
  463. package/dist/search/factory.d.ts +4 -2
  464. package/dist/search/factory.js +20 -18
  465. package/dist/search/index.d.ts +2 -1
  466. package/dist/search/index.js +22 -22
  467. package/dist/search/lancedb-backend.d.ts +2 -1
  468. package/dist/search/lancedb-backend.js +4 -4
  469. package/dist/search/meilisearch-backend.d.ts +2 -1
  470. package/dist/search/meilisearch-backend.js +4 -4
  471. package/dist/search/noop-backend.d.ts +2 -1
  472. package/dist/search/orama-backend.d.ts +2 -1
  473. package/dist/search/orama-backend.js +4 -4
  474. package/dist/search/port.d.ts +18 -1
  475. package/dist/search/port.js +1 -1
  476. package/dist/search/remote-backend.d.ts +2 -1
  477. package/dist/search/remote-backend.js +2 -2
  478. package/dist/secure-store/index.js +2 -2
  479. package/dist/{semantic-consolidation-dHYCyqgh.d.ts → semantic-consolidation-D4KAZO2G.d.ts} +1 -1
  480. package/dist/semantic-consolidation.d.ts +3 -2
  481. package/dist/semantic-consolidation.js +25 -24
  482. package/dist/semantic-rule-promotion.js +23 -22
  483. package/dist/semantic-rule-verifier.d.ts +2 -1
  484. package/dist/semantic-rule-verifier.js +24 -23
  485. package/dist/{service-DJG3KCQ4.d.ts → service-BeDxSqE-.d.ts} +2 -2
  486. package/dist/session-observer-bands.d.ts +2 -1
  487. package/dist/session-observer-state.d.ts +2 -1
  488. package/dist/shared-context/manager.d.ts +10 -9
  489. package/dist/shared-context/manager.js +2 -2
  490. package/dist/signal.d.ts +2 -1
  491. package/dist/source-agent-qualifier.d.ts +2 -1
  492. package/dist/source-agent-qualifier.js +42 -40
  493. package/dist/{storage-F9FVh-w9.d.ts → storage-DfjxusTE.d.ts} +24 -12
  494. package/dist/storage.d.ts +3 -2
  495. package/dist/storage.js +25 -24
  496. package/dist/summarizer.d.ts +2 -1
  497. package/dist/summarizer.js +5 -5
  498. package/dist/summary-snapshot.d.ts +2 -1
  499. package/dist/temporal-supersession.d.ts +3 -2
  500. package/dist/temporal-timeline-recall.d.ts +2 -1
  501. package/dist/temporal-validity.d.ts +2 -1
  502. package/dist/threading.d.ts +2 -1
  503. package/dist/tier-migration.d.ts +3 -2
  504. package/dist/tier-routing.d.ts +2 -1
  505. package/dist/tool-scoped-memory.d.ts +5 -1
  506. package/dist/tool-scoped-memory.js +3 -1
  507. package/dist/topics.d.ts +2 -1
  508. package/dist/transcript.d.ts +2 -1
  509. package/dist/transfer/capsule-import.js +4 -4
  510. package/dist/transfer/types.d.ts +66 -66
  511. package/dist/trust-score-stage.d.ts +2 -1
  512. package/dist/trust-score.d.ts +2 -1
  513. package/dist/{types-rEwubvim.d.ts → types-yX_FwERf.d.ts} +8 -1
  514. package/dist/types.d.ts +2 -1
  515. package/dist/types.js +1 -1
  516. package/dist/utility-runtime.d.ts +2 -1
  517. package/dist/verified-recall.js +24 -23
  518. package/dist/write-envelope.d.ts +2 -1
  519. package/package.json +2 -2
  520. package/src/abort-error.ts +17 -0
  521. package/src/access-admin-ops-surface.ts +1 -0
  522. package/src/access-boundary.ts +1 -0
  523. package/src/access-coding-context-resolution.ts +42 -0
  524. package/src/access-extraction-force-flush.ts +38 -2
  525. package/src/access-http-lcm-compaction.ts +5 -2
  526. package/src/access-http-offline-stream.ts +79 -0
  527. package/src/access-http.test.ts +310 -3
  528. package/src/access-http.ts +85 -21
  529. package/src/access-mcp-output-schemas.ts +36 -0
  530. package/src/access-mcp.test.ts +95 -1
  531. package/src/access-mcp.ts +7 -9
  532. package/src/access-observe-helpers.ts +64 -22
  533. package/src/access-observe-write-surface.ts +8 -0
  534. package/src/access-offline-manifest.ts +54 -0
  535. package/src/access-operations-batch.ts +3 -3
  536. package/src/access-operations.ts +13 -7
  537. package/src/access-recall-concurrency.ts +3 -27
  538. package/src/access-recall-surface.ts +3 -0
  539. package/src/access-service-health.test.ts +32 -7
  540. package/src/access-service-namespace.test.ts +55 -0
  541. package/src/access-service-observe-idempotency.test.ts +34 -2
  542. package/src/access-service-observe-lcm-parity.test.ts +138 -3
  543. package/src/access-service-observe-scope.test.ts +160 -1
  544. package/src/access-service-offline-file-content.test.ts +345 -1
  545. package/src/access-service.ts +86 -59
  546. package/src/access-surface-catalog.ts +4 -0
  547. package/src/admin/admin-surfaces.ts +2 -0
  548. package/src/binary-lifecycle/pipeline.test.ts +106 -1
  549. package/src/binary-lifecycle/pipeline.ts +3 -0
  550. package/src/coding/git-context.test.ts +47 -0
  551. package/src/coding/git-context.ts +129 -27
  552. package/src/config.test.ts +24 -0
  553. package/src/config.ts +9 -12
  554. package/src/connector-provenance.test.ts +101 -0
  555. package/src/consolidation-undo.ts +3 -0
  556. package/src/converge-conflict-policy-type.test.ts +15 -0
  557. package/src/convergence-refresh.ts +14 -2
  558. package/src/correction/correction-access-wiring.ts +9 -7
  559. package/src/correction/correction-executor.test.ts +206 -2
  560. package/src/correction/correction-executor.ts +29 -20
  561. package/src/correction/correction-planner.test.ts +36 -0
  562. package/src/correction/correction-planner.ts +9 -15
  563. package/src/correction/correction-service.ts +3 -1
  564. package/src/correction/correction-storage-integration.test.ts +77 -0
  565. package/src/correction/correction-surfaces.test.ts +41 -28
  566. package/src/correction/passive-capture.test.ts +59 -0
  567. package/src/correction/passive-capture.ts +4 -1
  568. package/src/entity-retrieval-boundaries.ts +17 -4
  569. package/src/entity-retrieval.ts +27 -6
  570. package/src/external-wiki-access.test.ts +65 -0
  571. package/src/external-wiki-access.ts +31 -0
  572. package/src/external-wiki-cli.ts +92 -0
  573. package/src/external-wiki-collection-registration.test.ts +163 -0
  574. package/src/external-wiki-collection-registration.ts +101 -0
  575. package/src/external-wiki-collection.test.ts +502 -0
  576. package/src/external-wiki-collection.ts +503 -0
  577. package/src/external-wiki-config.test.ts +135 -0
  578. package/src/external-wiki-config.ts +100 -0
  579. package/src/external-wiki-guard.ts +83 -0
  580. package/src/external-wiki-mcp-tools.ts +23 -0
  581. package/src/external-wiki-search.test.ts +301 -0
  582. package/src/external-wiki-search.ts +362 -0
  583. package/src/external-wiki.test.ts +240 -0
  584. package/src/external-wiki.ts +453 -0
  585. package/src/extraction-scope-source-agent.test.ts +21 -0
  586. package/src/extraction-source-grounding-helpers.ts +243 -53
  587. package/src/extraction-source-grounding-rules.ts +133 -39
  588. package/src/extraction-source-grounding.test.ts +363 -33
  589. package/src/extraction-timeout.test.ts +1 -0
  590. package/src/extraction-watermark.test.ts +150 -7
  591. package/src/extraction.ts +8 -1
  592. package/src/index.ts +8 -0
  593. package/src/mcp-read-only-tools.ts +1 -0
  594. package/src/offline-sync.test.ts +194 -0
  595. package/src/offline-sync.ts +217 -13
  596. package/src/orchestration/external-wiki-recall-guard.test.ts +94 -0
  597. package/src/orchestration/extraction-persist.ts +19 -2
  598. package/src/orchestration/extraction-run-helpers.ts +37 -19
  599. package/src/orchestration/extraction-run.test.ts +171 -2
  600. package/src/orchestration/extraction-run.ts +11 -13
  601. package/src/orchestration/extraction-watermark.ts +106 -17
  602. package/src/orchestration/generic-recall-paths.ts +14 -0
  603. package/src/orchestration/orchestrator-helpers.ts +2 -0
  604. package/src/orchestration/orchestrator-init.ts +9 -0
  605. package/src/orchestration/recall-internal-deps.ts +6 -0
  606. package/src/orchestration/recall-internal.ts +154 -33
  607. package/src/orchestration/recall-rerank-coordinator.ts +60 -25
  608. package/src/orchestration/recall-search-pipeline.test.ts +75 -1
  609. package/src/orchestration/recall-search-pipeline.ts +50 -10
  610. package/src/orchestrator-convergence-refresh.test.ts +36 -2
  611. package/src/orchestrator.ts +13 -3
  612. package/src/page-versioning.ts +5 -19
  613. package/src/procedural/procedure-recall.ts +5 -1
  614. package/src/provenance-surfaces.test.ts +3 -0
  615. package/src/qmd-client.test.ts +78 -17
  616. package/src/qmd.test.ts +24 -0
  617. package/src/qmd.ts +224 -315
  618. package/src/recall-explain-renderer.ts +3 -0
  619. package/src/recall-rerank-coordinator.test.ts +61 -0
  620. package/src/recall-xray-renderer.test.ts +6 -0
  621. package/src/recall-xray.test.ts +88 -1
  622. package/src/recall-xray.ts +15 -0
  623. package/src/reconcile/cursor.test.ts +48 -0
  624. package/src/reconcile/cursor.ts +58 -11
  625. package/src/reconcile/manifest.test.ts +4 -0
  626. package/src/reconcile/manifest.ts +41 -51
  627. package/src/reconcile/plan.test.ts +4 -0
  628. package/src/reconcile/plan.ts +29 -16
  629. package/src/search/factory.ts +6 -6
  630. package/src/search/port.ts +25 -9
  631. package/src/secure-store/secure-fs.ts +20 -12
  632. package/src/secure-store/secure-store.test.ts +41 -2
  633. package/src/spaces/index.test.ts +61 -2
  634. package/src/spaces/index.ts +44 -18
  635. package/src/storage/entity-alias-config.ts +97 -0
  636. package/src/storage/entity-canonical-id-lock.ts +53 -23
  637. package/src/storage/entity-canonical-id-migration.ts +53 -22
  638. package/src/storage/entity-canonical-id-references.ts +3 -0
  639. package/src/storage/entity-id-safety.ts +7 -0
  640. package/src/storage/entity-store.ts +6 -2
  641. package/src/storage/memory-frontmatter-metadata.ts +4 -9
  642. package/src/storage/memory-migration-serialization.ts +10 -15
  643. package/src/storage/tombstone-blocked-capture-mutation.ts +52 -64
  644. package/src/storage/tombstone-blocked-capture-sync.ts +244 -199
  645. package/src/storage-deletion-revisions.test.ts +91 -0
  646. package/src/storage-fact-hash-index-defer.test.ts +446 -163
  647. package/src/storage.ts +534 -245
  648. package/src/tool-scoped-memory.ts +10 -0
  649. package/src/transfer/capsule-import.ts +13 -0
  650. package/src/transfer/capsule-merge.ts +13 -0
  651. package/src/trust-score-recall-paths.test.ts +75 -1
  652. package/src/types.ts +7 -3
  653. package/dist/capsule-merge-IDWJPCWK.js.map +0 -1
  654. package/dist/chunk-3CE77VAP.js.map +0 -1
  655. package/dist/chunk-3TBLDMJA.js.map +0 -1
  656. package/dist/chunk-4J7G5SY4.js.map +0 -1
  657. package/dist/chunk-4L6HUREQ.js.map +0 -1
  658. package/dist/chunk-57QKLRBV.js.map +0 -1
  659. package/dist/chunk-5TFP4CUL.js.map +0 -1
  660. package/dist/chunk-7XC2HX75.js.map +0 -1
  661. package/dist/chunk-A5OJCXZL.js.map +0 -1
  662. package/dist/chunk-BUE5E2HL.js.map +0 -1
  663. package/dist/chunk-CJ2ZR7UA.js.map +0 -1
  664. package/dist/chunk-CUM2BBPN.js.map +0 -1
  665. package/dist/chunk-D3J5SLQK.js.map +0 -1
  666. package/dist/chunk-DL7ZD3JH.js.map +0 -1
  667. package/dist/chunk-DLVPUX7U.js.map +0 -1
  668. package/dist/chunk-E6PNLPGJ.js.map +0 -1
  669. package/dist/chunk-ECK75GDJ.js.map +0 -1
  670. package/dist/chunk-HREE4JHI.js.map +0 -1
  671. package/dist/chunk-IKKWIPYN.js.map +0 -1
  672. package/dist/chunk-J7VGGECD.js.map +0 -1
  673. package/dist/chunk-N5Z4EVOR.js.map +0 -1
  674. package/dist/chunk-NVRYW264.js.map +0 -1
  675. package/dist/chunk-P2BM76KT.js.map +0 -1
  676. package/dist/chunk-PVGDJXVK.js +0 -21
  677. package/dist/chunk-QJAQNXWI.js.map +0 -1
  678. package/dist/chunk-RN7DY3FC.js.map +0 -1
  679. package/dist/chunk-RVLJEII5.js.map +0 -1
  680. package/dist/chunk-S2NCTZGJ.js.map +0 -1
  681. package/dist/chunk-TDHTVMPG.js.map +0 -1
  682. package/dist/chunk-UYLMNVY6.js.map +0 -1
  683. package/dist/chunk-VCD4PSK2.js.map +0 -1
  684. package/dist/chunk-VNA7W7QF.js.map +0 -1
  685. package/dist/chunk-VWAXN2BN.js.map +0 -1
  686. package/dist/chunk-WOCNN776.js.map +0 -1
  687. package/dist/chunk-XYTOI63Z.js.map +0 -1
  688. package/dist/chunk-YV32N67O.js.map +0 -1
  689. /package/dist/{auto-sync-5OE5QOZB.js.map → auto-sync-UPTUVE4X.js.map} +0 -0
  690. /package/dist/{chunk-VUPTKTDV.js.map → chunk-2MRHJNWL.js.map} +0 -0
  691. /package/dist/{chunk-JBPKEARU.js.map → chunk-2QSZNTDO.js.map} +0 -0
  692. /package/dist/{chunk-5IVLTFOV.js.map → chunk-44N6ESJ4.js.map} +0 -0
  693. /package/dist/{chunk-HO3QBJEY.js.map → chunk-5546W5SI.js.map} +0 -0
  694. /package/dist/{chunk-U7GW7NE7.js.map → chunk-5CEECY6P.js.map} +0 -0
  695. /package/dist/{chunk-4UH4BTGK.js.map → chunk-5SNZSWWR.js.map} +0 -0
  696. /package/dist/{chunk-6CZPDBJS.js.map → chunk-5U7ID3EZ.js.map} +0 -0
  697. /package/dist/{chunk-GF22HWS2.js.map → chunk-6NNNURLK.js.map} +0 -0
  698. /package/dist/{chunk-227UFSEQ.js.map → chunk-7RZJWZ46.js.map} +0 -0
  699. /package/dist/{chunk-E5UK4VPE.js.map → chunk-7SHJHPTY.js.map} +0 -0
  700. /package/dist/{chunk-UVIKWC7M.js.map → chunk-7YERSTN7.js.map} +0 -0
  701. /package/dist/{chunk-S5SLVSVY.js.map → chunk-BQIFZ2MP.js.map} +0 -0
  702. /package/dist/{chunk-E53DSZEN.js.map → chunk-C26TE27X.js.map} +0 -0
  703. /package/dist/{chunk-LZ4LDKHZ.js.map → chunk-CLB32OHM.js.map} +0 -0
  704. /package/dist/{chunk-Q6IP2ARR.js.map → chunk-CSOYVTRX.js.map} +0 -0
  705. /package/dist/{chunk-XOQSEF7X.js.map → chunk-CVILPI77.js.map} +0 -0
  706. /package/dist/{chunk-PDLBLTOK.js.map → chunk-EITZHSX6.js.map} +0 -0
  707. /package/dist/{chunk-WUNIWKY4.js.map → chunk-ELIL2A37.js.map} +0 -0
  708. /package/dist/{chunk-CINZGPSJ.js.map → chunk-GUMZC2BO.js.map} +0 -0
  709. /package/dist/{chunk-H24WNPA2.js.map → chunk-GWFSVJ4P.js.map} +0 -0
  710. /package/dist/{chunk-TSH56VPU.js.map → chunk-HAYSYUAB.js.map} +0 -0
  711. /package/dist/{chunk-PKNLM44P.js.map → chunk-JH6BPLOP.js.map} +0 -0
  712. /package/dist/{chunk-KXB4VXHY.js.map → chunk-JIYDRBVZ.js.map} +0 -0
  713. /package/dist/{chunk-AV5ZEH4M.js.map → chunk-KVJRXN2E.js.map} +0 -0
  714. /package/dist/{chunk-JVLCVFQ4.js.map → chunk-KXEFRMCF.js.map} +0 -0
  715. /package/dist/{chunk-WFTIGIIS.js.map → chunk-L6CQ7WIW.js.map} +0 -0
  716. /package/dist/{chunk-EJUEXZHX.js.map → chunk-LLJMAULE.js.map} +0 -0
  717. /package/dist/{chunk-AS7YMSL6.js.map → chunk-M23RF3LJ.js.map} +0 -0
  718. /package/dist/{chunk-3F2LKUMU.js.map → chunk-NIS256NW.js.map} +0 -0
  719. /package/dist/{chunk-YIAA2X3D.js.map → chunk-NK5RGJ65.js.map} +0 -0
  720. /package/dist/{chunk-OQ5PRDDS.js.map → chunk-NTOIP2E6.js.map} +0 -0
  721. /package/dist/{chunk-HLPD7B7P.js.map → chunk-NUEQKLNB.js.map} +0 -0
  722. /package/dist/{chunk-33PLLLL7.js.map → chunk-P7NGM24P.js.map} +0 -0
  723. /package/dist/{chunk-7TWUCYER.js.map → chunk-PNRA7FAD.js.map} +0 -0
  724. /package/dist/{chunk-5I4M26Q7.js.map → chunk-QBSFOKY6.js.map} +0 -0
  725. /package/dist/{chunk-P4DRWEYC.js.map → chunk-QVSBTCVP.js.map} +0 -0
  726. /package/dist/{chunk-AAIUERNB.js.map → chunk-R5RFK3CB.js.map} +0 -0
  727. /package/dist/{chunk-WDISJRMG.js.map → chunk-RMMVQQA6.js.map} +0 -0
  728. /package/dist/{chunk-5SM35XZR.js.map → chunk-S5NZBKKQ.js.map} +0 -0
  729. /package/dist/{chunk-WIPEXG6R.js.map → chunk-SXIMQLGV.js.map} +0 -0
  730. /package/dist/{chunk-OAEQLRCY.js.map → chunk-TN76AKO3.js.map} +0 -0
  731. /package/dist/{chunk-QN25OCUF.js.map → chunk-TQ4GD737.js.map} +0 -0
  732. /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
  733. /package/dist/{chunk-DNWXFTLD.js.map → chunk-TYISDI6B.js.map} +0 -0
  734. /package/dist/{chunk-4LMA77JH.js.map → chunk-U2VLVBBH.js.map} +0 -0
  735. /package/dist/{chunk-5ZE7QHTK.js.map → chunk-ULVR5KG7.js.map} +0 -0
  736. /package/dist/{chunk-4B77XSG5.js.map → chunk-UV72DEZD.js.map} +0 -0
  737. /package/dist/{chunk-S2BBISHU.js.map → chunk-VANZKHTN.js.map} +0 -0
  738. /package/dist/{chunk-3Y224NYC.js.map → chunk-VYISFWVX.js.map} +0 -0
  739. /package/dist/{chunk-TIHMZFIV.js.map → chunk-W3IC7QOY.js.map} +0 -0
  740. /package/dist/{chunk-NRV4Y3PM.js.map → chunk-W4FBGYGK.js.map} +0 -0
  741. /package/dist/{chunk-MU7ZHSZE.js.map → chunk-WZFAPHIK.js.map} +0 -0
  742. /package/dist/{chunk-T2TTP3KU.js.map → chunk-X4IDNPOS.js.map} +0 -0
  743. /package/dist/{chunk-BLAKS3CP.js.map → chunk-XL3TATMJ.js.map} +0 -0
  744. /package/dist/{chunk-W4XJFLAL.js.map → chunk-XPRJSHNI.js.map} +0 -0
  745. /package/dist/{chunk-JE7EK33X.js.map → chunk-Y7HRYCNW.js.map} +0 -0
  746. /package/dist/{chunk-E6EE5B67.js.map → chunk-YK6BDDHP.js.map} +0 -0
  747. /package/dist/{chunk-ES36HTSC.js.map → chunk-YLHM5BQQ.js.map} +0 -0
  748. /package/dist/{chunk-BJKPPZ6Z.js.map → chunk-ZFGZ6PZ2.js.map} +0 -0
  749. /package/dist/{chunk-64UDOIMI.js.map → chunk-ZLQ37WJX.js.map} +0 -0
@@ -302,6 +302,9 @@ export function toRecallXraySnapshotFromLegacy(
302
302
  // behavior of the non-markdown surfaces.
303
303
  tierExplain: normalizeTierExplain(snapshot.tierExplain) ?? null,
304
304
  results,
305
+ appliedResultLimit: 0,
306
+ appliedResults: [],
307
+ headroomResults: [],
305
308
  filters,
306
309
  budget: { chars: 0, used: 0 },
307
310
  // Sanitize legacy session metadata at the adapter boundary so a
@@ -283,6 +283,67 @@ test("zero-semantics: both flags off → stage returns inputs unchanged with zer
283
283
  assert.equal(directReads, 0, "no direct reads when disabled");
284
284
  });
285
285
 
286
+ test("post-MMR partition exposes ordered headroom without changing admitted results", () => {
287
+ const config = parseConfig({
288
+ recallMmrEnabled: true,
289
+ recallMmrLambda: 0.3,
290
+ recallMmrTopN: 40,
291
+ });
292
+ const corpus = makeFakes([]);
293
+ const coordinator = new RecallRerankCoordinator({
294
+ getConfig: () => config,
295
+ getStorage: corpus.getStorage,
296
+ readQmdResultMemory: async () => null,
297
+ });
298
+ const candidates: QmdSearchResult[] = [
299
+ { docid: "a1", path: "p/a1", snippet: "alpha fact one", score: 0.99 },
300
+ { docid: "a2", path: "p/a2", snippet: "alpha fact two", score: 0.98 },
301
+ { docid: "a3", path: "p/a3", snippet: "alpha fact three", score: 0.97 },
302
+ { docid: "a4", path: "p/a4", snippet: "alpha fact four", score: 0.96 },
303
+ { docid: "a5", path: "p/a5", snippet: "alpha fact five", score: 0.95 },
304
+ {
305
+ docid: "d1",
306
+ path: "p/d1",
307
+ snippet: "orthogonal concept rocket fuel chemistry",
308
+ score: 0.94,
309
+ },
310
+ ];
311
+
312
+ const partition = coordinator.diversifyRecallResultsWithHeadroom(
313
+ "memories",
314
+ candidates,
315
+ 2,
316
+ "alpha rocket chemistry",
317
+ );
318
+ const admitted = coordinator.diversifyAndLimitRecallResults(
319
+ "memories",
320
+ candidates,
321
+ 2,
322
+ "alpha rocket chemistry",
323
+ );
324
+
325
+ assert.deepEqual(
326
+ partition.appliedResults.map((candidate) => candidate.docid),
327
+ ["a1", "d1"],
328
+ "the applied partition is the same post-MMR top slice",
329
+ );
330
+ assert.deepEqual(
331
+ partition.headroomResults.map((candidate) => candidate.docid),
332
+ ["a2", "a3", "a4", "a5"],
333
+ "headroom preserves the post-MMR order immediately beyond the applied cap",
334
+ );
335
+ assert.deepEqual(
336
+ partition.appliedResults,
337
+ admitted,
338
+ "headroom capture does not change admitted results",
339
+ );
340
+ assert.deepEqual(
341
+ candidates.map((candidate) => candidate.docid),
342
+ ["a1", "a2", "a3", "a4", "a5", "d1"],
343
+ "partitioning does not mutate the fetched candidate pool",
344
+ );
345
+ });
346
+
286
347
  /**
287
348
  * Write a fact into the default-namespace storage dir (mirrors the
288
349
  * trust-score-recall-paths helper) so recall's recent-memory-scan branch has
@@ -21,6 +21,9 @@ function minimalSnapshot(): RecallXraySnapshot {
21
21
  capturedAt: 1_700_000_000_000,
22
22
  tierExplain: null,
23
23
  results: [],
24
+ appliedResultLimit: 0,
25
+ appliedResults: [],
26
+ headroomResults: [],
24
27
  filters: [],
25
28
  budget: { chars: 4096, used: 0 },
26
29
  };
@@ -81,6 +84,9 @@ function fullSnapshot(): RecallXraySnapshot {
81
84
  rejectedBy: "mmr",
82
85
  },
83
86
  ],
87
+ appliedResultLimit: 0,
88
+ appliedResults: [],
89
+ headroomResults: [],
84
90
  budget: { chars: 4096, used: 1234 },
85
91
  };
86
92
  }
@@ -19,6 +19,16 @@ function idGen(): () => string {
19
19
  return () => `snap-${++n}`;
20
20
  }
21
21
 
22
+ function xrayResult(memoryId: string): RecallXrayResult {
23
+ return {
24
+ memoryId,
25
+ path: `/notes/${memoryId}.md`,
26
+ servedBy: "hybrid",
27
+ admittedBy: [`rank:${memoryId}`],
28
+ scoreDecomposition: { final: 0.5 },
29
+ };
30
+ }
31
+
22
32
  // ─── isRecallXrayServedBy ─────────────────────────────────────────────────
23
33
 
24
34
  test("isRecallXrayServedBy accepts every documented value", () => {
@@ -49,7 +59,9 @@ test("buildXraySnapshot fills defaults for empty input", () => {
49
59
  assert.equal(snapshot.capturedAt, 1_700_000_000_000);
50
60
  assert.equal(snapshot.tierExplain, null);
51
61
  assert.deepEqual(snapshot.results, []);
52
- assert.deepEqual(snapshot.filters, []);
62
+ assert.equal(snapshot.appliedResultLimit, 0);
63
+ assert.deepEqual(snapshot.appliedResults, []);
64
+ assert.deepEqual(snapshot.headroomResults, []);
53
65
  assert.deepEqual(snapshot.budget, { chars: 0, used: 0 });
54
66
  assert.equal(snapshot.sessionKey, undefined);
55
67
  assert.equal(snapshot.namespace, undefined);
@@ -454,6 +466,81 @@ test("buildXraySnapshot shallow-copies results so caller mutation does not leak
454
466
  assert.deepEqual(snapshot.results[0]!.admittedBy, ["alpha"]);
455
467
  });
456
468
 
469
+ test("buildXraySnapshot keeps ordered applied and headroom results separate from presentation results", () => {
470
+ const presentationResults = [xrayResult("presentation")];
471
+ const appliedResults = [xrayResult("applied-1"), xrayResult("applied-2")];
472
+ const headroomResults = [xrayResult("headroom-1"), xrayResult("headroom-2")];
473
+ const snapshot = buildXraySnapshot({
474
+ query: "q",
475
+ results: presentationResults,
476
+ appliedResultLimit: 2,
477
+ appliedResults,
478
+ headroomResults,
479
+ now: fixedNow,
480
+ snapshotIdGenerator: idGen(),
481
+ });
482
+
483
+ presentationResults[0]!.admittedBy.push("mutated");
484
+ appliedResults[0]!.admittedBy.push("mutated");
485
+ headroomResults[0]!.admittedBy.push("mutated");
486
+ appliedResults.reverse();
487
+ headroomResults.reverse();
488
+
489
+ assert.equal(snapshot.appliedResultLimit, 2);
490
+ assert.deepEqual(snapshot.results.map((result) => result.memoryId), ["presentation"]);
491
+ assert.deepEqual(snapshot.appliedResults.map((result) => result.memoryId), [
492
+ "applied-1",
493
+ "applied-2",
494
+ ]);
495
+ assert.deepEqual(snapshot.headroomResults.map((result) => result.memoryId), [
496
+ "headroom-1",
497
+ "headroom-2",
498
+ ]);
499
+ assert.deepEqual(snapshot.appliedResults[0]!.admittedBy, ["rank:applied-1"]);
500
+ assert.deepEqual(snapshot.headroomResults[0]!.admittedBy, ["rank:headroom-1"]);
501
+ });
502
+
503
+ test("buildXraySnapshot normalizes invalid and fractional applied result limits", () => {
504
+ for (const [value, expected] of [
505
+ [-1, 0],
506
+ [Number.NaN, 0],
507
+ [Number.POSITIVE_INFINITY, 0],
508
+ [2.9, 2],
509
+ ] as const) {
510
+ const snapshot = buildXraySnapshot({
511
+ query: "q",
512
+ appliedResultLimit: value,
513
+ now: fixedNow,
514
+ snapshotIdGenerator: idGen(),
515
+ });
516
+ assert.equal(snapshot.appliedResultLimit, expected);
517
+ }
518
+ });
519
+
520
+ test("buildXraySnapshot validates applied and headroom candidates like presentation results", () => {
521
+ const invalid = { ...xrayResult("invalid"), servedBy: "unknown-tier" as never };
522
+ assert.throws(
523
+ () =>
524
+ buildXraySnapshot({
525
+ query: "q",
526
+ appliedResults: [invalid],
527
+ now: fixedNow,
528
+ snapshotIdGenerator: idGen(),
529
+ }),
530
+ /servedBy must be one of/,
531
+ );
532
+ assert.throws(
533
+ () =>
534
+ buildXraySnapshot({
535
+ query: "q",
536
+ headroomResults: [invalid],
537
+ now: fixedNow,
538
+ snapshotIdGenerator: idGen(),
539
+ }),
540
+ /servedBy must be one of/,
541
+ );
542
+ });
543
+
457
544
  // ─── RecallXrayBuilder ────────────────────────────────────────────────────
458
545
 
459
546
  test("RecallXrayBuilder accumulates results and filters then builds a snapshot", () => {
@@ -256,6 +256,9 @@ export interface RecallXraySnapshot {
256
256
  */
257
257
  tierExplain: RecallTierExplain | null;
258
258
  results: RecallXrayResult[];
259
+ appliedResultLimit: number;
260
+ appliedResults: RecallXrayResult[];
261
+ headroomResults: RecallXrayResult[];
259
262
  filters: RecallFilterTrace[];
260
263
  /**
261
264
  * Character budget accounting for the final assembled recall payload.
@@ -282,6 +285,9 @@ export interface BuildXraySnapshotInput {
282
285
  query: string;
283
286
  tierExplain?: RecallTierExplain | null;
284
287
  results?: RecallXrayResult[];
288
+ appliedResultLimit?: number;
289
+ appliedResults?: RecallXrayResult[];
290
+ headroomResults?: RecallXrayResult[];
285
291
  filters?: RecallFilterTrace[];
286
292
  budget?: { chars?: number; used?: number };
287
293
  sessionKey?: string;
@@ -310,6 +316,12 @@ export function buildXraySnapshot(
310
316
  const results = Array.isArray(input.results)
311
317
  ? input.results.map(cloneResult)
312
318
  : [];
319
+ const appliedResults = Array.isArray(input.appliedResults)
320
+ ? input.appliedResults.map(cloneResult)
321
+ : [];
322
+ const headroomResults = Array.isArray(input.headroomResults)
323
+ ? input.headroomResults.map(cloneResult)
324
+ : [];
313
325
  const filters = Array.isArray(input.filters)
314
326
  ? input.filters.map(cloneFilter)
315
327
  : [];
@@ -346,6 +358,9 @@ export function buildXraySnapshot(
346
358
  capturedAt: now(),
347
359
  tierExplain,
348
360
  results,
361
+ appliedResultLimit: nonNegativeInt(input.appliedResultLimit),
362
+ appliedResults,
363
+ headroomResults,
349
364
  filters,
350
365
  budget: { chars: budgetChars, used: budgetUsed },
351
366
  sessionKey: nonEmptyString(input.sessionKey),
@@ -4,10 +4,13 @@ import * as os from "node:os";
4
4
  import * as path from "node:path";
5
5
  import { test } from "node:test";
6
6
  import {
7
+ clearConvergeRefreshPending,
7
8
  defaultConvergeCursorPath,
8
9
  deriveConvergeCursorBase,
9
10
  hashPeerNamespace,
11
+ markConvergeRefreshPending,
10
12
  normalizeConvergeCursor,
13
+ normalizeConvergePeerUrl,
11
14
  readConvergeCursor,
12
15
  writeConvergeCursor,
13
16
  type ConvergeCursorState,
@@ -42,6 +45,21 @@ test("hashPeerNamespace: preserves path case while normalizing URL authority and
42
45
  );
43
46
  });
44
47
 
48
+ test("normalizeConvergePeerUrl: strips credentials and request-only URL parts without folding path case", () => {
49
+ assert.equal(
50
+ normalizeConvergePeerUrl(" HTTPS://user:secret@PEER.EXAMPLE.COM:443/Memory/?token=abc#fragment "),
51
+ "https://peer.example.com/Memory",
52
+ );
53
+ assert.equal(
54
+ hashPeerNamespace("https://user:secret@peer.example.com/Memory?token=abc#fragment", "default"),
55
+ hashPeerNamespace("https://peer.example.com/Memory/", "DEFAULT "),
56
+ );
57
+ assert.notEqual(
58
+ hashPeerNamespace("https://peer.example.com/Memory", "default"),
59
+ hashPeerNamespace("https://peer.example.com/memory", "default"),
60
+ );
61
+ });
62
+
45
63
  test("defaultConvergeCursorPath: constructs path under memoryDir state", () => {
46
64
  const p = defaultConvergeCursorPath("/tmp/mem", "http://localhost:4318", "general");
47
65
  assert.ok(p.includes(path.join(".remnic", "state", "converge-cursors")));
@@ -151,3 +169,33 @@ test("writeConvergeCursor & readConvergeCursor: atomic write roundtrip", async (
151
169
  await fs.rm(tmpDir, { recursive: true, force: true });
152
170
  }
153
171
  });
172
+
173
+ test("converge refresh obligations survive restart and clear independently", async () => {
174
+ const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "remnic-cursor-refresh-"));
175
+ const cursorPath = defaultConvergeCursorPath(tmpDir, "https://peer.example.test", "team");
176
+ try {
177
+ await markConvergeRefreshPending(cursorPath, {
178
+ peerUrl: "https://peer.example.test",
179
+ namespace: "team",
180
+ target: "receiver",
181
+ });
182
+ await markConvergeRefreshPending(cursorPath, {
183
+ peerUrl: "https://peer.example.test",
184
+ namespace: "team",
185
+ target: "local",
186
+ });
187
+
188
+ const restarted = await readConvergeCursor(cursorPath);
189
+ assert.ok(restarted);
190
+ assert.deepEqual(restarted.pendingRefreshes, ["local", "receiver"]);
191
+ assert.deepEqual(restarted.baseFiles, []);
192
+
193
+ await clearConvergeRefreshPending(cursorPath, "receiver");
194
+ assert.deepEqual((await readConvergeCursor(cursorPath))?.pendingRefreshes, ["local"]);
195
+
196
+ await clearConvergeRefreshPending(cursorPath, "local");
197
+ assert.deepEqual((await readConvergeCursor(cursorPath))?.pendingRefreshes, []);
198
+ } finally {
199
+ await fs.rm(tmpDir, { recursive: true, force: true });
200
+ }
201
+ });
@@ -3,6 +3,8 @@ import * as fs from "node:fs/promises";
3
3
  import * as path from "node:path";
4
4
  import type { ReconcilePlanEntry, ReconcileSemanticAgreement } from "./plan.js";
5
5
 
6
+ export type ConvergeRefreshTarget = "local" | "receiver";
7
+
6
8
  export interface ConvergeCursorFileState {
7
9
  path: string;
8
10
  sha256: string;
@@ -18,22 +20,26 @@ export interface ConvergeCursorState {
18
20
  baseFiles: ConvergeCursorFileState[];
19
21
  semanticAgreements?: ReconcileSemanticAgreement[];
20
22
  completedPaths?: string[];
23
+ pendingRefreshes?: ConvergeRefreshTarget[];
21
24
  }
22
25
 
23
- export function hashPeerNamespace(peerUrl: string, namespace: string): string {
24
- let normalizedUrl: string;
26
+ export function normalizeConvergePeerUrl(peerUrl: string): string {
27
+ const trimmed = peerUrl.trim();
25
28
  try {
26
- const url = new URL(peerUrl);
27
- const credentials =
28
- url.username || url.password
29
- ? `${url.username}${url.password ? `:${url.password}` : ""}@`
30
- : "";
31
- normalizedUrl =
32
- `${url.protocol.toLowerCase()}//${credentials}${url.hostname.toLowerCase()}` +
33
- `${url.port ? `:${url.port}` : ""}${url.pathname.replace(/\/+$/, "")}${url.search}${url.hash}`;
29
+ const url = new URL(trimmed);
30
+ url.username = "";
31
+ url.password = "";
32
+ url.search = "";
33
+ url.hash = "";
34
+ url.pathname = url.pathname.replace(/\/+$/, "");
35
+ return url.toString().replace(/\/$/, "");
34
36
  } catch {
35
- normalizedUrl = peerUrl.trim().replace(/\/+$/, "").toLowerCase();
37
+ return trimmed.replace(/\/+$/, "");
36
38
  }
39
+ }
40
+
41
+ export function hashPeerNamespace(peerUrl: string, namespace: string): string {
42
+ const normalizedUrl = normalizeConvergePeerUrl(peerUrl);
37
43
  const normalizedNs = namespace.trim().toLowerCase();
38
44
  return createHash("sha256")
39
45
  .update(`${normalizedUrl}\0${normalizedNs}`)
@@ -148,6 +154,11 @@ export function normalizeConvergeCursor(input: unknown): ConvergeCursorState {
148
154
  }
149
155
  }
150
156
  }
157
+ const pendingRefreshes: ConvergeRefreshTarget[] = [];
158
+ if (Array.isArray(obj.pendingRefreshes)) {
159
+ if (obj.pendingRefreshes.includes("local")) pendingRefreshes.push("local");
160
+ if (obj.pendingRefreshes.includes("receiver")) pendingRefreshes.push("receiver");
161
+ }
151
162
  return {
152
163
  version: 1,
153
164
  peerUrl: obj.peerUrl.trim(),
@@ -156,6 +167,7 @@ export function normalizeConvergeCursor(input: unknown): ConvergeCursorState {
156
167
  baseFiles,
157
168
  semanticAgreements,
158
169
  completedPaths,
170
+ pendingRefreshes,
159
171
  };
160
172
  }
161
173
 
@@ -191,3 +203,38 @@ export async function writeConvergeCursor(
191
203
  throw error;
192
204
  }
193
205
  }
206
+
207
+ export async function markConvergeRefreshPending(
208
+ cursorPath: string,
209
+ options: {
210
+ peerUrl: string;
211
+ namespace: string;
212
+ target: ConvergeRefreshTarget;
213
+ },
214
+ ): Promise<void> {
215
+ const current = await readConvergeCursor(cursorPath);
216
+ const pendingRefreshes = new Set(current?.pendingRefreshes ?? []);
217
+ pendingRefreshes.add(options.target);
218
+ await writeConvergeCursor(cursorPath, {
219
+ version: 1,
220
+ peerUrl: current?.peerUrl ?? options.peerUrl,
221
+ namespace: current?.namespace ?? options.namespace,
222
+ lastConvergedAt: current?.lastConvergedAt,
223
+ baseFiles: current?.baseFiles ?? [],
224
+ semanticAgreements: current?.semanticAgreements ?? [],
225
+ completedPaths: current?.completedPaths ?? [],
226
+ pendingRefreshes: [...pendingRefreshes].sort(),
227
+ });
228
+ }
229
+
230
+ export async function clearConvergeRefreshPending(
231
+ cursorPath: string,
232
+ target: ConvergeRefreshTarget,
233
+ ): Promise<void> {
234
+ const current = await readConvergeCursor(cursorPath);
235
+ if (!current?.pendingRefreshes?.includes(target)) return;
236
+ await writeConvergeCursor(cursorPath, {
237
+ ...current,
238
+ pendingRefreshes: current.pendingRefreshes.filter((pending) => pending !== target),
239
+ });
240
+ }
@@ -2,6 +2,7 @@ import * as assert from "node:assert/strict";
2
2
  import { createHash } from "node:crypto";
3
3
  import { test } from "node:test";
4
4
  import { ContentHashIndex } from "../storage/content-hash-index.js";
5
+ import { parseFrontmatter } from "../storage.js";
5
6
  import { type ReconcileManifest, buildReconcileManifest, collapseActiveFactDuplicates } from "./manifest.js";
6
7
  import { planReconciliation } from "./plan.js";
7
8
 
@@ -34,6 +35,7 @@ test("reconcile manifest keeps file identity separate from canonical semantic id
34
35
 
35
36
  const manifest = await buildReconcileManifest({
36
37
  files: [{ path: "facts/fact-a.md", sha256: serializedHash, bytes: Buffer.byteLength(serialized) }],
38
+ parseMemory: parseFrontmatter,
37
39
  readFile: async () => Buffer.from(serialized),
38
40
  });
39
41
 
@@ -59,6 +61,7 @@ test("reconcile manifest hashes parsed legacy content and uses effective lifecyc
59
61
 
60
62
  const manifest = await buildReconcileManifest({
61
63
  files: [...rawByPath].map(([path, raw]) => ({ path, sha256: fileHash(raw.toString()) })),
64
+ parseMemory: parseFrontmatter,
62
65
  readFile: async (file) => rawByPath.get(file.path) ?? null,
63
66
  });
64
67
 
@@ -79,6 +82,7 @@ test("reconcile manifest keeps file identity when memory bytes cannot be trusted
79
82
 
80
83
  const manifest = await buildReconcileManifest({
81
84
  files,
85
+ parseMemory: parseFrontmatter,
82
86
  readFile: async (file) => {
83
87
  if (file.path === "facts/locked.md") throw new Error("locked");
84
88
  return file.path === "facts/changed.md" ? changed : readable;
@@ -34,9 +34,14 @@ export interface ReconcileManifest {
34
34
  files: ReconcileManifestFile[];
35
35
  }
36
36
 
37
+ export type ReconcileMemoryParser = (
38
+ raw: string,
39
+ ) => { frontmatter: MemoryFrontmatter; content: string } | null;
40
+
37
41
  export interface BuildReconcileManifestOptions {
38
42
  files: Iterable<ReconcileFileState>;
39
43
  readFile: (file: ReconcileFileState) => Promise<Buffer | string | null>;
44
+ parseMemory: ReconcileMemoryParser;
40
45
  cachedFiles?: Iterable<ReconcileManifestFile>;
41
46
  }
42
47
 
@@ -51,49 +56,46 @@ function isMemoryPath(filePath: string): boolean {
51
56
  return MEMORY_DIRS.has(segments[index] ?? "");
52
57
  }
53
58
 
54
- function parseScalar(value: string | undefined): string | undefined {
55
- if (value === undefined) return undefined;
56
- const trimmed = value.trim();
57
- if (trimmed.length === 0) return undefined;
58
- if (trimmed.startsWith('"') && trimmed.endsWith('"')) {
59
- try {
60
- const parsed = JSON.parse(trimmed) as unknown;
61
- return typeof parsed === "string" ? parsed : trimmed;
62
- } catch {
63
- return trimmed.slice(1, -1).replace(/\\"/g, '"');
64
- }
65
- }
66
- if (trimmed.startsWith("'") && trimmed.endsWith("'")) {
67
- return trimmed.slice(1, -1).replace(/''/g, "'");
68
- }
69
- return trimmed;
70
- }
71
59
 
72
- function parsedMemoryIdentity(filePath: string, raw: Buffer | string): ReconcileMemoryIdentity | undefined {
60
+ function parsedMemoryIdentity(
61
+ filePath: string,
62
+ raw: Buffer | string,
63
+ parseMemory: ReconcileMemoryParser,
64
+ ): ReconcileMemoryIdentity | undefined {
73
65
  if (!isMemoryPath(filePath)) return undefined;
74
- const match = (Buffer.isBuffer(raw) ? raw.toString("utf8") : raw).match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
75
- if (!match) return undefined;
76
- const fields = new Map<string, string>();
77
- for (const line of match[1].split("\n")) {
78
- const separator = line.indexOf(":");
79
- if (separator > 0) fields.set(line.slice(0, separator).trim(), line.slice(separator + 1).trim());
80
- }
81
- const id = parseScalar(fields.get("id"));
82
- if (!id) return undefined;
83
- const category = parseScalar(fields.get("category")) ?? "fact";
84
- const storedHash = parseScalar(fields.get("contentHash"));
66
+ const parsed = parseMemory(Buffer.isBuffer(raw) ? raw.toString("utf8") : raw);
67
+ if (!parsed?.frontmatter.id) return undefined;
68
+ const storedHash = parsed.frontmatter.contentHash;
85
69
  const contentHash =
86
70
  storedHash && SHA256_PATTERN.test(storedHash)
87
71
  ? storedHash.toLowerCase()
88
- : ContentHashIndex.computeHash(match[2].trim());
89
- const status = inferMemoryStatus(
90
- {
91
- status: parseScalar(fields.get("status")) as MemoryStatus | undefined,
92
- archivedAt: parseScalar(fields.get("archivedAt")),
93
- } as MemoryFrontmatter,
94
- filePath
95
- );
96
- return { id, category, contentHash, status };
72
+ : ContentHashIndex.computeHash(parsed.content);
73
+ return {
74
+ id: parsed.frontmatter.id,
75
+ category: parsed.frontmatter.category,
76
+ contentHash,
77
+ status: inferMemoryStatus(parsed.frontmatter, filePath),
78
+ };
79
+ }
80
+
81
+ export async function buildReconcileManifestFile(
82
+ file: ReconcileFileState,
83
+ readFile: (file: ReconcileFileState) => Promise<Buffer | string | null>,
84
+ parseMemory: ReconcileMemoryParser,
85
+ ): Promise<ReconcileManifestFile> {
86
+ let raw: Buffer | string | null = null;
87
+ if (isMemoryPath(file.path)) {
88
+ try {
89
+ raw = await readFile(file);
90
+ } catch {
91
+ raw = null;
92
+ }
93
+ }
94
+ if (raw !== null && createHash("sha256").update(raw).digest("hex") !== file.sha256.toLowerCase()) {
95
+ raw = null;
96
+ }
97
+ const memory = raw === null ? undefined : parsedMemoryIdentity(file.path, raw, parseMemory);
98
+ return { ...file, ...(memory ? { memory } : {}) };
97
99
  }
98
100
 
99
101
  export async function buildReconcileManifest(options: BuildReconcileManifestOptions): Promise<ReconcileManifest> {
@@ -110,19 +112,7 @@ export async function buildReconcileManifest(options: BuildReconcileManifestOpti
110
112
  continue;
111
113
  }
112
114
 
113
- let raw: Buffer | string | null = null;
114
- if (isMemoryPath(file.path)) {
115
- try {
116
- raw = await options.readFile(file);
117
- } catch {
118
- raw = null;
119
- }
120
- }
121
- if (raw !== null && createHash("sha256").update(raw).digest("hex") !== file.sha256.toLowerCase()) {
122
- raw = null;
123
- }
124
- const memory = raw === null ? undefined : parsedMemoryIdentity(file.path, raw);
125
- files.push({ ...file, ...(memory ? { memory } : {}) });
115
+ files.push(await buildReconcileManifestFile(file, options.readFile, options.parseMemory));
126
116
  }
127
117
  files.sort((left, right) => (left.path < right.path ? -1 : left.path > right.path ? 1 : 0));
128
118
  return {
@@ -222,6 +222,10 @@ test("newest-wins compares delete revision times with surviving modifications",
222
222
  assert.equal(entryFor(entries, "facts/peer-deletion-wins.md").resolution, "peer-wins");
223
223
  assert.equal(entryFor(entries, "facts/peer-modification-wins.md").resolution, "peer-wins");
224
224
  assert.equal(entryFor(entries, "facts/local-deletion-wins.md").resolution, "local-wins");
225
+ assert.equal(entryFor(entries, "facts/peer-deletion-wins.md").deletionMtimeMs, 3000);
226
+ assert.equal(entryFor(entries, "facts/local-deletion-wins.md").deletionMtimeMs, 3000);
227
+ assert.equal(entryFor(entries, "facts/local-modification-wins.md").deletionMtimeMs, undefined);
228
+ assert.equal(entryFor(entries, "facts/peer-modification-wins.md").deletionMtimeMs, undefined);
225
229
  });
226
230
 
227
231
  test("namespaces are planned independently and reported separately", () => {
@@ -7,6 +7,7 @@ import {
7
7
  DEFAULT_CONVERGE_CONFLICT_POLICY,
8
8
  } from "../converge-config.js";
9
9
  import type { ConvergeConflictPolicy } from "../types.js";
10
+ export type ReconcileConflictPolicy = ConvergeConflictPolicy;
10
11
 
11
12
  /**
12
13
  * Bootstrap reconciliation planner for two peer daemons whose corpora have
@@ -61,6 +62,8 @@ export interface ReconcilePlanEntry {
61
62
  baseSha256?: string;
62
63
  /** Set only when `action` is `conflict`. */
63
64
  resolution?: ReconcileResolution;
65
+ /** Original revision time when conflict resolution propagates a deletion. */
66
+ deletionMtimeMs?: number;
64
67
  /**
65
68
  * Which side holds the retracted revision. Set only when `action` is
66
69
  * `suppress`: with different digests on each side and only one retracted,
@@ -651,6 +654,15 @@ export function planNamespaceReconciliation(
651
654
  // a deliberate deletion. Without a base the peer simply never saw the
652
655
  // path, and a bootstrap merge must push — both sides hold unique data.
653
656
  if (baseSha256 !== undefined) {
657
+ const peerDeletionMtime = peerDeletionMtimeMs.get(path);
658
+ const resolution = baseSha256 === localFile.sha256
659
+ ? "unresolved"
660
+ : resolveConflict(
661
+ policy,
662
+ localFile.mtimeMs,
663
+ peerDeletionMtime,
664
+ "unresolved",
665
+ );
654
666
  entries.push({
655
667
  path,
656
668
  namespace,
@@ -658,14 +670,10 @@ export function planNamespaceReconciliation(
658
670
  reason: baseSha256 === localFile.sha256 ? "peer_deleted" : "local_modified_peer_deleted",
659
671
  localSha256: localFile.sha256,
660
672
  baseSha256,
661
- resolution: baseSha256 === localFile.sha256
662
- ? "unresolved"
663
- : resolveConflict(
664
- policy,
665
- localFile.mtimeMs,
666
- peerDeletionMtimeMs.get(path),
667
- "unresolved",
668
- ),
673
+ resolution,
674
+ ...(resolution === "peer-wins" && peerDeletionMtime !== undefined
675
+ ? { deletionMtimeMs: peerDeletionMtime }
676
+ : {}),
669
677
  });
670
678
  continue;
671
679
  }
@@ -755,6 +763,15 @@ export function planNamespaceReconciliation(
755
763
  continue;
756
764
  }
757
765
  if (baseSha256 !== undefined) {
766
+ const localDeletionMtime = localDeletionMtimeMs.get(path);
767
+ const resolution = baseSha256 === peerFile.sha256
768
+ ? "unresolved"
769
+ : resolveConflict(
770
+ policy,
771
+ localDeletionMtime,
772
+ peerFile.mtimeMs,
773
+ "unresolved",
774
+ );
758
775
  entries.push({
759
776
  path,
760
777
  namespace,
@@ -762,14 +779,10 @@ export function planNamespaceReconciliation(
762
779
  reason: baseSha256 === peerFile.sha256 ? "local_deleted" : "local_deleted_peer_modified",
763
780
  peerSha256: peerFile.sha256,
764
781
  baseSha256,
765
- resolution: baseSha256 === peerFile.sha256
766
- ? "unresolved"
767
- : resolveConflict(
768
- policy,
769
- localDeletionMtimeMs.get(path),
770
- peerFile.mtimeMs,
771
- "unresolved",
772
- ),
782
+ resolution,
783
+ ...(resolution === "local-wins" && localDeletionMtime !== undefined
784
+ ? { deletionMtimeMs: localDeletionMtime }
785
+ : {}),
773
786
  });
774
787
  continue;
775
788
  }