@remnic/core 9.69.6 → 9.69.8

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 (250) hide show
  1. package/dist/access-admin-ops-surface.js +26 -26
  2. package/dist/access-authorization-probe.js +27 -27
  3. package/dist/access-boundary.js +26 -26
  4. package/dist/access-cli.js +84 -84
  5. package/dist/access-extraction-force-flush.js +26 -26
  6. package/dist/access-http-query.js +28 -28
  7. package/dist/access-http.js +44 -44
  8. package/dist/access-identity-continuity-surface.js +26 -26
  9. package/dist/access-lcm-surface.js +26 -26
  10. package/dist/access-mcp.js +35 -35
  11. package/dist/access-namespace-preflight.js +26 -26
  12. package/dist/access-observe-write-surface.js +26 -26
  13. package/dist/access-offline-manifest.js +3 -3
  14. package/dist/access-operations-batch.js +29 -29
  15. package/dist/access-operations.js +34 -34
  16. package/dist/access-recall-concurrency.js +26 -26
  17. package/dist/access-recall-response.js +26 -26
  18. package/dist/access-recall-surface.js +26 -26
  19. package/dist/access-schema.js +5 -5
  20. package/dist/access-service.js +26 -26
  21. package/dist/access-surface-catalog.js +28 -28
  22. package/dist/active-recall.js +5 -5
  23. package/dist/adapters/index.js +7 -7
  24. package/dist/adapters/registry.js +3 -3
  25. package/dist/briefing.js +6 -6
  26. package/dist/buffer.js +3 -3
  27. package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-7FJQINUR.js} +2 -2
  28. package/dist/causal-behavior.js +2 -2
  29. package/dist/causal-chain.js +2 -2
  30. package/dist/causal-consolidation.js +9 -9
  31. package/dist/causal-retrieval.js +2 -2
  32. package/dist/causal-trajectory-graph.js +2 -2
  33. package/dist/causal-trajectory.js +1 -1
  34. package/dist/{chunk-7RZJWZ46.js → chunk-227UFSEQ.js} +5 -5
  35. package/dist/{chunk-QA6H4PIO.js → chunk-26JWBSWD.js} +3 -3
  36. package/dist/{chunk-7VA7PARC.js → chunk-2MW3UQNX.js} +2 -2
  37. package/dist/{chunk-BXLOS5AJ.js → chunk-2NLLXCJG.js} +2 -2
  38. package/dist/{chunk-JBPKEARU.js → chunk-2QSZNTDO.js} +7 -7
  39. package/dist/{chunk-P6GKRT2H.js → chunk-2Z3DG5CQ.js} +1 -1
  40. package/dist/{chunk-6EXRODDF.js → chunk-3FXXFLVK.js} +2 -2
  41. package/dist/{chunk-XOGYSWQZ.js → chunk-3QWF54M4.js} +18 -18
  42. package/dist/{chunk-YTCE2JQL.js → chunk-44HBCMOA.js} +99 -48
  43. package/dist/chunk-44HBCMOA.js.map +1 -0
  44. package/dist/{chunk-IE7N2YK6.js → chunk-4PJYD2L3.js} +2 -2
  45. package/dist/{chunk-MWLBRFLY.js → chunk-5PTS43CH.js} +2 -2
  46. package/dist/{chunk-NM5EOKN7.js → chunk-6C57JBJ3.js} +2 -2
  47. package/dist/{chunk-WTWHORVW.js → chunk-754GA2UE.js} +5 -5
  48. package/dist/{chunk-VDX2J7OX.js → chunk-7LCGFUMB.js} +4 -4
  49. package/dist/{chunk-YPNTBYEV.js → chunk-A3WMMQAH.js} +3 -3
  50. package/dist/{chunk-SZZGVXKC.js → chunk-ANN5VMHT.js} +2 -2
  51. package/dist/{chunk-OLBZ2WGG.js → chunk-C2JCVZWX.js} +2 -2
  52. package/dist/{chunk-7DXW5V2W.js → chunk-CTCGHNWN.js} +5 -5
  53. package/dist/{chunk-JJAOVJ3E.js → chunk-DJZWNKFO.js} +2 -2
  54. package/dist/{chunk-PY5E3UOD.js → chunk-DKZR56A3.js} +2 -2
  55. package/dist/{chunk-6JYTP3JP.js → chunk-E5WTGEWX.js} +3 -3
  56. package/dist/{chunk-WAPSYHNR.js → chunk-EN75MUTO.js} +5 -5
  57. package/dist/{chunk-OMA2B7GY.js → chunk-G4MCAHMF.js} +2 -2
  58. package/dist/{chunk-EJJ57PTY.js → chunk-GD7D7WP2.js} +2 -2
  59. package/dist/{chunk-X3DTN2RC.js → chunk-GFGQOZGG.js} +10 -10
  60. package/dist/{chunk-EVLHZ6F3.js → chunk-GISV63M2.js} +2 -2
  61. package/dist/{chunk-YERBUSU2.js → chunk-H3HOC6UT.js} +2 -2
  62. package/dist/{chunk-AJFKQJQK.js → chunk-HINMCD7V.js} +2 -2
  63. package/dist/{chunk-ISDSX7GW.js → chunk-IGUWU5BD.js} +1 -1
  64. package/dist/{chunk-W6V2XVUO.js → chunk-IIO4C3YL.js} +4 -4
  65. package/dist/{chunk-SKVSBTFQ.js → chunk-IWO4HEOL.js} +2 -2
  66. package/dist/{chunk-TB2MJRI6.js → chunk-J3NGQ5SC.js} +2 -2
  67. package/dist/chunk-J3NGQ5SC.js.map +1 -0
  68. package/dist/{chunk-ZIZUB6VB.js → chunk-J55NAXDH.js} +34 -34
  69. package/dist/{chunk-3X7Z467X.js → chunk-JAU4MRKB.js} +2 -2
  70. package/dist/{chunk-XJJYSX6F.js → chunk-JCUG7AXZ.js} +4 -4
  71. package/dist/{chunk-BX6GW4KC.js → chunk-JMAG7WZ7.js} +2 -2
  72. package/dist/{chunk-NAB4MKTJ.js → chunk-KAVQ5GYY.js} +6 -5
  73. package/dist/{chunk-NAB4MKTJ.js.map → chunk-KAVQ5GYY.js.map} +1 -1
  74. package/dist/{chunk-MDQXW235.js → chunk-KLL5SPER.js} +2 -2
  75. package/dist/{chunk-DD2BKHSD.js → chunk-KZMFU7YL.js} +2 -2
  76. package/dist/{chunk-C5FRCM4B.js → chunk-LHGIBXVX.js} +2 -2
  77. package/dist/{chunk-CGFDT752.js → chunk-LVYO2HZJ.js} +4 -4
  78. package/dist/{chunk-TP3N5364.js → chunk-M5GBTETG.js} +2 -2
  79. package/dist/{chunk-PGD3DXZP.js → chunk-M5UJJUON.js} +3 -3
  80. package/dist/{chunk-HDEQRI2O.js → chunk-NAZROP6I.js} +2 -2
  81. package/dist/{chunk-R3YVNAJB.js → chunk-NDE7CH6C.js} +2 -2
  82. package/dist/{chunk-BIJAWZYW.js → chunk-OLT3YTDH.js} +4 -4
  83. package/dist/{chunk-4OH6FGAO.js → chunk-PEOFTEUC.js} +12 -12
  84. package/dist/{chunk-GM35IHF7.js → chunk-PRK4WTPU.js} +2 -2
  85. package/dist/{chunk-MOUCCUET.js → chunk-QGUFN25Q.js} +2 -2
  86. package/dist/{chunk-5HP6LVWU.js → chunk-QHYSECIG.js} +2 -2
  87. package/dist/{chunk-SZ3SRRYZ.js → chunk-RXS4SQ5S.js} +2 -2
  88. package/dist/{chunk-6KQLDPKA.js → chunk-S6AHHQ6C.js} +2 -2
  89. package/dist/{chunk-R4FPBSFD.js → chunk-SO73GYOZ.js} +2 -2
  90. package/dist/{chunk-M4MNLPO7.js → chunk-SXQZMC7R.js} +2 -2
  91. package/dist/{chunk-JHTF22NQ.js → chunk-TA7UZZMW.js} +2 -2
  92. package/dist/{chunk-UJICQ77Y.js → chunk-UCNQV43K.js} +2 -2
  93. package/dist/{chunk-OUAK37ID.js → chunk-VGTXHTWU.js} +2 -2
  94. package/dist/{chunk-TGDFKC7X.js → chunk-VOPOPTZ7.js} +2 -2
  95. package/dist/{chunk-IFHT77WK.js → chunk-WF2WCZCR.js} +2 -2
  96. package/dist/{chunk-6F5WBXE2.js → chunk-X2NFFBTO.js} +4 -4
  97. package/dist/{chunk-IHFN3JTR.js → chunk-X5TGZAP2.js} +3 -3
  98. package/dist/{chunk-RJ57OOCD.js → chunk-X66BHMAU.js} +2 -2
  99. package/dist/{chunk-DQEMWVMT.js → chunk-X7Y7WX73.js} +1 -1
  100. package/dist/{chunk-FGV7V2N4.js → chunk-Y3WMJAZ3.js} +2 -2
  101. package/dist/{chunk-ZET6A3OF.js → chunk-YHCBJULX.js} +2 -2
  102. package/dist/{chunk-LGVIKA7O.js → chunk-YJPFTF57.js} +6 -6
  103. package/dist/{chunk-EAG7YMIS.js → chunk-YVMTXBJJ.js} +2 -2
  104. package/dist/{chunk-OUKBMQ2O.js → chunk-Z3SQEEB6.js} +2 -2
  105. package/dist/{chunk-MVH7YAWY.js → chunk-ZPN6SSWA.js} +2 -2
  106. package/dist/cli.js +62 -62
  107. package/dist/coding/export-okf-codegraph.js +6 -6
  108. package/dist/coding/pre-action-gate.js +2 -2
  109. package/dist/compounding/engine.js +6 -6
  110. package/dist/config.js +5 -5
  111. package/dist/connectors/codex-materialize-runner.js +6 -6
  112. package/dist/connectors/index.js +6 -6
  113. package/dist/convergence-refresh.js +8 -8
  114. package/dist/conversation-index/backend.js +2 -2
  115. package/dist/corpus-watermark.js +8 -8
  116. package/dist/entity-retrieval.js +6 -6
  117. package/dist/external-wiki-access.js +27 -27
  118. package/dist/extraction-span-source-hash.d.ts +45 -0
  119. package/dist/extraction-span-source-hash.js +52 -0
  120. package/dist/extraction-span-source-hash.js.map +1 -0
  121. package/dist/extraction.js +10 -10
  122. package/dist/{graph-edge-decay-FXGELBFA.js → graph-edge-decay-DGTBFALQ.js} +4 -4
  123. package/dist/graph-snapshot.js +3 -3
  124. package/dist/graph.js +2 -2
  125. package/dist/harmonic-retrieval.js +1 -1
  126. package/dist/index.d.ts +14 -1
  127. package/dist/index.js +94 -90
  128. package/dist/lcm/engine.js +2 -2
  129. package/dist/lcm/index.js +2 -2
  130. package/dist/location/index.js +9 -9
  131. package/dist/maintenance/memory-governance.js +6 -6
  132. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +6 -6
  133. package/dist/maintenance/rebuild-memory-projection.js +7 -7
  134. package/dist/namespaces/migrate.js +7 -7
  135. package/dist/namespaces/search.js +4 -4
  136. package/dist/namespaces/storage.js +6 -6
  137. package/dist/offline-sync.js +2 -2
  138. package/dist/operator-doctor-corpus.js +9 -9
  139. package/dist/operator-toolkit.js +21 -21
  140. package/dist/orchestration/maintenance.js +15 -15
  141. package/dist/orchestrator.js +86 -86
  142. package/dist/recall-state-view-zero-diff.d.ts +23 -0
  143. package/dist/recall-state-view-zero-diff.js +84 -0
  144. package/dist/recall-state-view-zero-diff.js.map +1 -0
  145. package/dist/reconcile/cursor.js +7 -2
  146. package/dist/reconcile/cursor.js.map +1 -1
  147. package/dist/resume-bundles.js +6 -6
  148. package/dist/search/factory.js +3 -3
  149. package/dist/search/index.js +3 -3
  150. package/dist/semantic-consolidation.js +7 -7
  151. package/dist/semantic-rule-promotion.js +6 -6
  152. package/dist/semantic-rule-verifier.js +6 -6
  153. package/dist/source-agent-qualifier.js +9 -9
  154. package/dist/standup/build.js +6 -6
  155. package/dist/storage.js +5 -5
  156. package/dist/support-passport/index.js +29 -29
  157. package/dist/transfer/backup.js +2 -2
  158. package/dist/transfer/capsule-export.js +2 -2
  159. package/dist/transfer/capsule-import.js +2 -2
  160. package/dist/transfer/export-okf.d.ts +2 -1
  161. package/dist/transfer/export-okf.js +9 -7
  162. package/dist/verified-recall.js +6 -6
  163. package/dist/who-knows-cli.js +7 -7
  164. package/dist/who-knows.js +6 -6
  165. package/package.json +2 -2
  166. package/src/activity/timeline/index.ts +1 -0
  167. package/src/activity/timeline/week-config-hash.test.ts +207 -0
  168. package/src/activity/timeline/week-config-hash.ts +83 -0
  169. package/src/extraction-span-source-hash.test.ts +165 -0
  170. package/src/extraction-span-source-hash.ts +100 -0
  171. package/src/location/matching.test.ts +31 -1
  172. package/src/location/matching.ts +6 -1
  173. package/src/recall-state-view-zero-diff.test.ts +282 -0
  174. package/src/recall-state-view-zero-diff.ts +125 -0
  175. package/src/reconcile/cursor.test.ts +18 -0
  176. package/src/reconcile/cursor.ts +13 -2
  177. package/src/shared-context/authority-precedence.test.ts +127 -0
  178. package/src/shared-context/authority-precedence.ts +68 -0
  179. package/src/transfer/export-okf.test.ts +22 -0
  180. package/src/transfer/export-okf.ts +6 -2
  181. package/dist/chunk-TB2MJRI6.js.map +0 -1
  182. package/dist/chunk-YTCE2JQL.js.map +0 -1
  183. /package/dist/{capsule-crypto-YO5QJ6L3.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  184. /package/dist/{chunk-7RZJWZ46.js.map → chunk-227UFSEQ.js.map} +0 -0
  185. /package/dist/{chunk-QA6H4PIO.js.map → chunk-26JWBSWD.js.map} +0 -0
  186. /package/dist/{chunk-7VA7PARC.js.map → chunk-2MW3UQNX.js.map} +0 -0
  187. /package/dist/{chunk-BXLOS5AJ.js.map → chunk-2NLLXCJG.js.map} +0 -0
  188. /package/dist/{chunk-JBPKEARU.js.map → chunk-2QSZNTDO.js.map} +0 -0
  189. /package/dist/{chunk-P6GKRT2H.js.map → chunk-2Z3DG5CQ.js.map} +0 -0
  190. /package/dist/{chunk-6EXRODDF.js.map → chunk-3FXXFLVK.js.map} +0 -0
  191. /package/dist/{chunk-XOGYSWQZ.js.map → chunk-3QWF54M4.js.map} +0 -0
  192. /package/dist/{chunk-IE7N2YK6.js.map → chunk-4PJYD2L3.js.map} +0 -0
  193. /package/dist/{chunk-MWLBRFLY.js.map → chunk-5PTS43CH.js.map} +0 -0
  194. /package/dist/{chunk-NM5EOKN7.js.map → chunk-6C57JBJ3.js.map} +0 -0
  195. /package/dist/{chunk-WTWHORVW.js.map → chunk-754GA2UE.js.map} +0 -0
  196. /package/dist/{chunk-VDX2J7OX.js.map → chunk-7LCGFUMB.js.map} +0 -0
  197. /package/dist/{chunk-YPNTBYEV.js.map → chunk-A3WMMQAH.js.map} +0 -0
  198. /package/dist/{chunk-SZZGVXKC.js.map → chunk-ANN5VMHT.js.map} +0 -0
  199. /package/dist/{chunk-OLBZ2WGG.js.map → chunk-C2JCVZWX.js.map} +0 -0
  200. /package/dist/{chunk-7DXW5V2W.js.map → chunk-CTCGHNWN.js.map} +0 -0
  201. /package/dist/{chunk-JJAOVJ3E.js.map → chunk-DJZWNKFO.js.map} +0 -0
  202. /package/dist/{chunk-PY5E3UOD.js.map → chunk-DKZR56A3.js.map} +0 -0
  203. /package/dist/{chunk-6JYTP3JP.js.map → chunk-E5WTGEWX.js.map} +0 -0
  204. /package/dist/{chunk-WAPSYHNR.js.map → chunk-EN75MUTO.js.map} +0 -0
  205. /package/dist/{chunk-OMA2B7GY.js.map → chunk-G4MCAHMF.js.map} +0 -0
  206. /package/dist/{chunk-EJJ57PTY.js.map → chunk-GD7D7WP2.js.map} +0 -0
  207. /package/dist/{chunk-X3DTN2RC.js.map → chunk-GFGQOZGG.js.map} +0 -0
  208. /package/dist/{chunk-EVLHZ6F3.js.map → chunk-GISV63M2.js.map} +0 -0
  209. /package/dist/{chunk-YERBUSU2.js.map → chunk-H3HOC6UT.js.map} +0 -0
  210. /package/dist/{chunk-AJFKQJQK.js.map → chunk-HINMCD7V.js.map} +0 -0
  211. /package/dist/{chunk-ISDSX7GW.js.map → chunk-IGUWU5BD.js.map} +0 -0
  212. /package/dist/{chunk-W6V2XVUO.js.map → chunk-IIO4C3YL.js.map} +0 -0
  213. /package/dist/{chunk-SKVSBTFQ.js.map → chunk-IWO4HEOL.js.map} +0 -0
  214. /package/dist/{chunk-ZIZUB6VB.js.map → chunk-J55NAXDH.js.map} +0 -0
  215. /package/dist/{chunk-3X7Z467X.js.map → chunk-JAU4MRKB.js.map} +0 -0
  216. /package/dist/{chunk-XJJYSX6F.js.map → chunk-JCUG7AXZ.js.map} +0 -0
  217. /package/dist/{chunk-BX6GW4KC.js.map → chunk-JMAG7WZ7.js.map} +0 -0
  218. /package/dist/{chunk-MDQXW235.js.map → chunk-KLL5SPER.js.map} +0 -0
  219. /package/dist/{chunk-DD2BKHSD.js.map → chunk-KZMFU7YL.js.map} +0 -0
  220. /package/dist/{chunk-C5FRCM4B.js.map → chunk-LHGIBXVX.js.map} +0 -0
  221. /package/dist/{chunk-CGFDT752.js.map → chunk-LVYO2HZJ.js.map} +0 -0
  222. /package/dist/{chunk-TP3N5364.js.map → chunk-M5GBTETG.js.map} +0 -0
  223. /package/dist/{chunk-PGD3DXZP.js.map → chunk-M5UJJUON.js.map} +0 -0
  224. /package/dist/{chunk-HDEQRI2O.js.map → chunk-NAZROP6I.js.map} +0 -0
  225. /package/dist/{chunk-R3YVNAJB.js.map → chunk-NDE7CH6C.js.map} +0 -0
  226. /package/dist/{chunk-BIJAWZYW.js.map → chunk-OLT3YTDH.js.map} +0 -0
  227. /package/dist/{chunk-4OH6FGAO.js.map → chunk-PEOFTEUC.js.map} +0 -0
  228. /package/dist/{chunk-GM35IHF7.js.map → chunk-PRK4WTPU.js.map} +0 -0
  229. /package/dist/{chunk-MOUCCUET.js.map → chunk-QGUFN25Q.js.map} +0 -0
  230. /package/dist/{chunk-5HP6LVWU.js.map → chunk-QHYSECIG.js.map} +0 -0
  231. /package/dist/{chunk-SZ3SRRYZ.js.map → chunk-RXS4SQ5S.js.map} +0 -0
  232. /package/dist/{chunk-6KQLDPKA.js.map → chunk-S6AHHQ6C.js.map} +0 -0
  233. /package/dist/{chunk-R4FPBSFD.js.map → chunk-SO73GYOZ.js.map} +0 -0
  234. /package/dist/{chunk-M4MNLPO7.js.map → chunk-SXQZMC7R.js.map} +0 -0
  235. /package/dist/{chunk-JHTF22NQ.js.map → chunk-TA7UZZMW.js.map} +0 -0
  236. /package/dist/{chunk-UJICQ77Y.js.map → chunk-UCNQV43K.js.map} +0 -0
  237. /package/dist/{chunk-OUAK37ID.js.map → chunk-VGTXHTWU.js.map} +0 -0
  238. /package/dist/{chunk-TGDFKC7X.js.map → chunk-VOPOPTZ7.js.map} +0 -0
  239. /package/dist/{chunk-IFHT77WK.js.map → chunk-WF2WCZCR.js.map} +0 -0
  240. /package/dist/{chunk-6F5WBXE2.js.map → chunk-X2NFFBTO.js.map} +0 -0
  241. /package/dist/{chunk-IHFN3JTR.js.map → chunk-X5TGZAP2.js.map} +0 -0
  242. /package/dist/{chunk-RJ57OOCD.js.map → chunk-X66BHMAU.js.map} +0 -0
  243. /package/dist/{chunk-DQEMWVMT.js.map → chunk-X7Y7WX73.js.map} +0 -0
  244. /package/dist/{chunk-FGV7V2N4.js.map → chunk-Y3WMJAZ3.js.map} +0 -0
  245. /package/dist/{chunk-ZET6A3OF.js.map → chunk-YHCBJULX.js.map} +0 -0
  246. /package/dist/{chunk-LGVIKA7O.js.map → chunk-YJPFTF57.js.map} +0 -0
  247. /package/dist/{chunk-EAG7YMIS.js.map → chunk-YVMTXBJJ.js.map} +0 -0
  248. /package/dist/{chunk-OUKBMQ2O.js.map → chunk-Z3SQEEB6.js.map} +0 -0
  249. /package/dist/{chunk-MVH7YAWY.js.map → chunk-ZPN6SSWA.js.map} +0 -0
  250. /package/dist/{graph-edge-decay-FXGELBFA.js.map → graph-edge-decay-DGTBFALQ.js.map} +0 -0
@@ -3,46 +3,46 @@ import {
3
3
  blendGraphExpandedRecallScore,
4
4
  graphPathRelativeToStorage,
5
5
  mergeGraphExpandedResults
6
- } from "./chunk-YTCE2JQL.js";
6
+ } from "./chunk-44HBCMOA.js";
7
7
  import "./chunk-3TSU662L.js";
8
- import "./chunk-DD2BKHSD.js";
9
- import "./chunk-WAPSYHNR.js";
10
- import "./chunk-I74SUMNI.js";
11
- import "./chunk-ILNPU5W5.js";
12
- import "./chunk-7HYPN2GC.js";
8
+ import "./chunk-KZMFU7YL.js";
13
9
  import {
14
10
  formatCompressionGuidelinesForRecall
15
11
  } from "./chunk-UXREWVW4.js";
12
+ import "./chunk-EN75MUTO.js";
13
+ import "./chunk-I74SUMNI.js";
14
+ import "./chunk-ILNPU5W5.js";
15
+ import "./chunk-7HYPN2GC.js";
16
16
  import "./chunk-666A3MOW.js";
17
- import "./chunk-3X7Z467X.js";
18
- import "./chunk-KBL3JJR6.js";
19
- import "./chunk-FQ7HAWWC.js";
20
17
  import "./chunk-VDC6RZI4.js";
21
18
  import "./chunk-UWK5OXUJ.js";
22
- import "./chunk-6F5WBXE2.js";
19
+ import "./chunk-JAU4MRKB.js";
20
+ import "./chunk-KBL3JJR6.js";
21
+ import "./chunk-FQ7HAWWC.js";
22
+ import "./chunk-X2NFFBTO.js";
23
+ import "./chunk-TPDBFYEG.js";
23
24
  import "./chunk-UXPUUL3G.js";
24
25
  import "./chunk-DDA47TES.js";
25
26
  import "./chunk-KOLJJN5G.js";
26
27
  import "./chunk-WVP2I6C5.js";
27
28
  import "./chunk-7N4KAIGN.js";
28
- import "./chunk-TPDBFYEG.js";
29
29
  import "./chunk-V5OCT34X.js";
30
30
  import "./chunk-TECVW3JP.js";
31
31
  import "./chunk-C5JF6EZ7.js";
32
- import "./chunk-GM35IHF7.js";
32
+ import "./chunk-PRK4WTPU.js";
33
33
  import "./chunk-VI637ILW.js";
34
+ import "./chunk-VOPOPTZ7.js";
35
+ import "./chunk-47DU4SGJ.js";
34
36
  import "./chunk-SEF4IOFE.js";
35
- import "./chunk-TGDFKC7X.js";
36
37
  import "./chunk-KVDUKH5E.js";
37
- import "./chunk-47DU4SGJ.js";
38
+ import "./chunk-2NKY7OC6.js";
38
39
  import "./chunk-4EX5WZ4M.js";
39
40
  import "./chunk-YRFAYOFQ.js";
40
41
  import "./chunk-DD5JFCWM.js";
41
42
  import "./chunk-ECZU5BJH.js";
42
- import "./chunk-T67LUYCR.js";
43
- import "./chunk-2NKY7OC6.js";
44
43
  import "./chunk-IEZ6CGTW.js";
45
44
  import "./chunk-6DNMUYEE.js";
45
+ import "./chunk-T67LUYCR.js";
46
46
  import "./chunk-ODZKV2F7.js";
47
47
  import "./chunk-6TCXIRP5.js";
48
48
  import "./chunk-QJ622LTI.js";
@@ -66,18 +66,18 @@ import "./chunk-573TEZCD.js";
66
66
  import "./chunk-3GPTTA4J.js";
67
67
  import "./chunk-IBJ6U753.js";
68
68
  import "./chunk-HTIIXNJQ.js";
69
+ import "./chunk-MEW53VQJ.js";
69
70
  import "./chunk-YAZNBMNF.js";
70
71
  import "./chunk-XXSOVESA.js";
71
72
  import "./chunk-PHRLJFWZ.js";
72
73
  import "./chunk-64NJRYU2.js";
73
- import "./chunk-MEW53VQJ.js";
74
- import "./chunk-OH7QLI6W.js";
75
- import "./chunk-OMA2B7GY.js";
76
- import "./chunk-IE7N2YK6.js";
74
+ import "./chunk-G4MCAHMF.js";
75
+ import "./chunk-4PJYD2L3.js";
77
76
  import "./chunk-AJTG3CP7.js";
78
77
  import "./chunk-54V4BZWP.js";
79
78
  import "./chunk-2CGLBUW3.js";
80
79
  import "./chunk-WLZYGLJ4.js";
80
+ import "./chunk-OH7QLI6W.js";
81
81
  import "./chunk-R4OCGPSH.js";
82
82
  import "./chunk-HMKPFW7R.js";
83
83
  import "./chunk-27IOSH2W.js";
@@ -96,7 +96,7 @@ import "./chunk-LUPVCGYK.js";
96
96
  import "./chunk-BUYVPUEM.js";
97
97
  import "./chunk-IAIPNEHD.js";
98
98
  import "./chunk-DGFU5MSX.js";
99
- import "./chunk-C5FRCM4B.js";
99
+ import "./chunk-LHGIBXVX.js";
100
100
  import "./chunk-GKUA4MGB.js";
101
101
  import "./chunk-5AUY5Z5E.js";
102
102
  import "./chunk-SVH57F5Z.js";
@@ -107,65 +107,65 @@ import "./chunk-VEWZZM3H.js";
107
107
  import "./chunk-VY47VI2T.js";
108
108
  import "./chunk-PYIR4SSB.js";
109
109
  import "./chunk-DFEODULB.js";
110
- import "./chunk-FGV7V2N4.js";
111
- import "./chunk-ZIZUB6VB.js";
110
+ import "./chunk-Y3WMJAZ3.js";
111
+ import "./chunk-J55NAXDH.js";
112
112
  import "./chunk-MMACM5G2.js";
113
113
  import "./chunk-54BGIBCR.js";
114
114
  import "./chunk-H4CKS5B2.js";
115
115
  import "./chunk-FXZTL7F7.js";
116
116
  import "./chunk-HDDRVXX4.js";
117
117
  import "./chunk-PYHOAXTI.js";
118
+ import "./chunk-2NLLXCJG.js";
118
119
  import "./chunk-UP6MOYCB.js";
119
- import "./chunk-NAB4MKTJ.js";
120
+ import "./chunk-KAVQ5GYY.js";
120
121
  import "./chunk-BV2TIZ4F.js";
121
122
  import "./chunk-Z734BLO3.js";
122
123
  import "./chunk-OZKVVUJB.js";
123
124
  import "./chunk-2DL3OFLD.js";
124
125
  import "./chunk-G4IAEX6D.js";
125
- import "./chunk-BXLOS5AJ.js";
126
126
  import "./chunk-765K3SAT.js";
127
127
  import "./chunk-TBUEE7XF.js";
128
+ import "./chunk-PYIFUBRK.js";
128
129
  import "./chunk-FGDKJJZS.js";
129
130
  import "./chunk-AJVLDJU6.js";
131
+ import "./chunk-DQTCGVFK.js";
130
132
  import "./chunk-EEC4PCG5.js";
131
- import "./chunk-PYIFUBRK.js";
132
133
  import "./chunk-IIFFC3RL.js";
133
- import "./chunk-7VA7PARC.js";
134
- import "./chunk-DQTCGVFK.js";
135
134
  import "./chunk-AXFWMRKI.js";
135
+ import "./chunk-2MW3UQNX.js";
136
136
  import "./chunk-YLBE6PLR.js";
137
+ import "./chunk-IWO4HEOL.js";
137
138
  import "./chunk-CDKHKZL5.js";
138
139
  import "./chunk-HSSERO3E.js";
139
140
  import "./chunk-NOUJNHWG.js";
140
- import "./chunk-SKVSBTFQ.js";
141
141
  import "./chunk-HDQUQBPW.js";
142
142
  import "./chunk-6FC3IZ26.js";
143
- import "./chunk-MOUCCUET.js";
143
+ import "./chunk-QGUFN25Q.js";
144
144
  import "./chunk-HL4DB7TO.js";
145
145
  import "./chunk-OJP3N7UK.js";
146
- import "./chunk-R4FPBSFD.js";
147
- import "./chunk-EVLHZ6F3.js";
148
- import "./chunk-M4MNLPO7.js";
146
+ import "./chunk-SO73GYOZ.js";
147
+ import "./chunk-GISV63M2.js";
148
+ import "./chunk-SXQZMC7R.js";
149
149
  import "./chunk-NRLELHAY.js";
150
150
  import "./chunk-AM4T6CHX.js";
151
151
  import "./chunk-X5PIDJ3L.js";
152
152
  import "./chunk-3T74IZB3.js";
153
153
  import "./chunk-2LA3H54D.js";
154
- import "./chunk-X3DTN2RC.js";
155
- import "./chunk-IHFN3JTR.js";
154
+ import "./chunk-GFGQOZGG.js";
155
+ import "./chunk-X5TGZAP2.js";
156
156
  import "./chunk-KFY3SGN7.js";
157
157
  import "./chunk-CMTINOFS.js";
158
- import "./chunk-5HP6LVWU.js";
158
+ import "./chunk-QHYSECIG.js";
159
159
  import "./chunk-RMMVQQA6.js";
160
160
  import "./chunk-UR6PBX2J.js";
161
161
  import "./chunk-6GUG4YNM.js";
162
- import "./chunk-ISDSX7GW.js";
162
+ import "./chunk-IGUWU5BD.js";
163
163
  import "./chunk-UOBPK2OS.js";
164
164
  import "./chunk-C7SRUWBW.js";
165
165
  import "./chunk-OZKOPQCM.js";
166
166
  import "./chunk-MCA2X4WH.js";
167
167
  import "./chunk-CIO7GCWE.js";
168
- import "./chunk-6JYTP3JP.js";
168
+ import "./chunk-E5WTGEWX.js";
169
169
  import "./chunk-KJTKLXTH.js";
170
170
  import "./chunk-2DQ2XREU.js";
171
171
  import "./chunk-ACPCA4NO.js";
@@ -177,13 +177,13 @@ import "./chunk-OKTXM5H4.js";
177
177
  import "./chunk-DUAJKRR2.js";
178
178
  import "./chunk-NOB2T2FC.js";
179
179
  import "./chunk-3I4FUAVJ.js";
180
- import "./chunk-YERBUSU2.js";
180
+ import "./chunk-H3HOC6UT.js";
181
181
  import "./chunk-5JMAGU26.js";
182
182
  import "./chunk-YBPYIAA5.js";
183
183
  import "./chunk-HK6KYIF6.js";
184
184
  import "./chunk-2GBFKHBZ.js";
185
185
  import "./chunk-6TBIWIAG.js";
186
- import "./chunk-MWLBRFLY.js";
186
+ import "./chunk-5PTS43CH.js";
187
187
  import "./chunk-2AD5SXO4.js";
188
188
  import "./chunk-7CBKAQIG.js";
189
189
  import "./chunk-C6WMSXCJ.js";
@@ -196,12 +196,12 @@ import "./chunk-MI2OTWV5.js";
196
196
  import "./chunk-43HUVDTD.js";
197
197
  import "./chunk-4RA3C3EV.js";
198
198
  import "./chunk-YFLLGRXO.js";
199
- import "./chunk-QA6H4PIO.js";
199
+ import "./chunk-26JWBSWD.js";
200
200
  import "./chunk-ZKOPY4WW.js";
201
201
  import "./chunk-62OKGIJA.js";
202
202
  import "./chunk-KJUWWN3T.js";
203
203
  import "./chunk-TEZ2HTC7.js";
204
- import "./chunk-JHTF22NQ.js";
204
+ import "./chunk-TA7UZZMW.js";
205
205
  import "./chunk-SN4JXNLL.js";
206
206
  import "./chunk-Z5LAYHGJ.js";
207
207
  import "./chunk-6ZMAMSHS.js";
@@ -216,42 +216,42 @@ import "./chunk-JI7U6AS3.js";
216
216
  import "./chunk-KFZY2OFH.js";
217
217
  import "./chunk-B32WYRXX.js";
218
218
  import "./chunk-QW27DOHG.js";
219
- import "./chunk-4OH6FGAO.js";
219
+ import "./chunk-PEOFTEUC.js";
220
220
  import "./chunk-V7IZKJI3.js";
221
221
  import "./chunk-SEDEKFYQ.js";
222
- import "./chunk-JBPKEARU.js";
222
+ import "./chunk-2QSZNTDO.js";
223
+ import "./chunk-RSUYKGGZ.js";
224
+ import "./chunk-42NQ7AVG.js";
223
225
  import "./chunk-TMSXWOBZ.js";
224
226
  import "./chunk-TB6CBZ5V.js";
225
227
  import "./chunk-J64TK33U.js";
226
- import "./chunk-RSUYKGGZ.js";
227
- import "./chunk-42NQ7AVG.js";
228
228
  import "./chunk-7RXCMVFQ.js";
229
229
  import "./chunk-3HSRWJTC.js";
230
- import "./chunk-PY5E3UOD.js";
231
- import "./chunk-6EXRODDF.js";
232
- import "./chunk-CGFDT752.js";
230
+ import "./chunk-DKZR56A3.js";
231
+ import "./chunk-3FXXFLVK.js";
232
+ import "./chunk-LVYO2HZJ.js";
233
233
  import "./chunk-4OFKZAJG.js";
234
234
  import "./chunk-A5KNZSNA.js";
235
235
  import "./chunk-D24OXEPB.js";
236
- import "./chunk-LGVIKA7O.js";
237
- import "./chunk-AJFKQJQK.js";
238
- import "./chunk-OUAK37ID.js";
239
- import "./chunk-W6V2XVUO.js";
240
- import "./chunk-TP3N5364.js";
236
+ import "./chunk-YJPFTF57.js";
237
+ import "./chunk-HINMCD7V.js";
238
+ import "./chunk-VGTXHTWU.js";
239
+ import "./chunk-IIO4C3YL.js";
240
+ import "./chunk-M5GBTETG.js";
241
241
  import "./chunk-7T4TOGMS.js";
242
242
  import "./chunk-7YQ6ESEA.js";
243
243
  import "./chunk-ZQUVBZI4.js";
244
- import "./chunk-WTWHORVW.js";
245
- import "./chunk-OLBZ2WGG.js";
244
+ import "./chunk-754GA2UE.js";
245
+ import "./chunk-C2JCVZWX.js";
246
246
  import "./chunk-EQWEIIKQ.js";
247
247
  import "./chunk-JTWZKNUH.js";
248
248
  import "./chunk-YYGZJPOK.js";
249
249
  import "./chunk-CTVWELNK.js";
250
250
  import "./chunk-CEN6DW6X.js";
251
251
  import "./chunk-E4RMZGRS.js";
252
- import "./chunk-PGD3DXZP.js";
253
- import "./chunk-EAG7YMIS.js";
254
- import "./chunk-SZ3SRRYZ.js";
252
+ import "./chunk-M5UJJUON.js";
253
+ import "./chunk-YVMTXBJJ.js";
254
+ import "./chunk-RXS4SQ5S.js";
255
255
  import "./chunk-AB3A7EFH.js";
256
256
  import "./chunk-K4E3Y3ZX.js";
257
257
  import "./chunk-SRT6SHVZ.js";
@@ -260,19 +260,19 @@ import "./chunk-GZ3R6XOE.js";
260
260
  import "./chunk-CK5KOVHW.js";
261
261
  import "./chunk-DJUKBGAD.js";
262
262
  import "./chunk-G73MCJKL.js";
263
- import "./chunk-MDQXW235.js";
263
+ import "./chunk-KLL5SPER.js";
264
264
  import {
265
265
  filterRecallCandidates,
266
266
  hasIdentityRecoveryIntent,
267
267
  resolveEffectiveIdentityInjectionMode
268
- } from "./chunk-XOGYSWQZ.js";
268
+ } from "./chunk-3QWF54M4.js";
269
269
  import "./chunk-GDASG7NC.js";
270
270
  import "./chunk-GDB4J2H3.js";
271
- import "./chunk-7DXW5V2W.js";
271
+ import "./chunk-CTCGHNWN.js";
272
272
  import "./chunk-QJCWK2A7.js";
273
273
  import "./chunk-VQ7B2Q6M.js";
274
+ import "./chunk-6C57JBJ3.js";
274
275
  import "./chunk-PJSK6OJM.js";
275
- import "./chunk-NM5EOKN7.js";
276
276
  import "./chunk-GNVZQ5JN.js";
277
277
  import "./chunk-YN2UN7N3.js";
278
278
  import "./chunk-5QZR2RA3.js";
@@ -283,7 +283,7 @@ import "./chunk-H7XKCNR6.js";
283
283
  import "./chunk-H6RSANGQ.js";
284
284
  import "./chunk-SOBJ6NEY.js";
285
285
  import "./chunk-LK4TOYPU.js";
286
- import "./chunk-R3YVNAJB.js";
286
+ import "./chunk-NDE7CH6C.js";
287
287
  import "./chunk-CVILPI77.js";
288
288
  import "./chunk-2HIJHXB3.js";
289
289
  import "./chunk-AQEJKOKI.js";
@@ -291,7 +291,7 @@ import "./chunk-HTP6XRUI.js";
291
291
  import "./chunk-UD7UNYRD.js";
292
292
  import "./chunk-IISBCCWR.js";
293
293
  import "./chunk-2YA5N2BY.js";
294
- import "./chunk-OUKBMQ2O.js";
294
+ import "./chunk-Z3SQEEB6.js";
295
295
  import "./chunk-EI6V5UXY.js";
296
296
  import "./chunk-J3JEW5CT.js";
297
297
  import "./chunk-5TBO7CDR.js";
@@ -304,25 +304,25 @@ import "./chunk-LTHVM4XN.js";
304
304
  import "./chunk-X5YYSAZX.js";
305
305
  import "./chunk-C37ZRXX7.js";
306
306
  import "./chunk-7ZNJN5WZ.js";
307
- import "./chunk-SZZGVXKC.js";
308
- import "./chunk-HDEQRI2O.js";
309
- import "./chunk-YPNTBYEV.js";
310
- import "./chunk-EJJ57PTY.js";
307
+ import "./chunk-ANN5VMHT.js";
308
+ import "./chunk-NAZROP6I.js";
309
+ import "./chunk-A3WMMQAH.js";
310
+ import "./chunk-GD7D7WP2.js";
311
311
  import "./chunk-UFGFMWAD.js";
312
- import "./chunk-6KQLDPKA.js";
312
+ import "./chunk-S6AHHQ6C.js";
313
313
  import "./chunk-3UXOZBHV.js";
314
314
  import "./chunk-ZXBTTMGZ.js";
315
- import "./chunk-BIJAWZYW.js";
315
+ import "./chunk-OLT3YTDH.js";
316
+ import "./chunk-DEUNUKTD.js";
316
317
  import "./chunk-LXY5VVGM.js";
317
318
  import "./chunk-2LSZVONP.js";
318
- import "./chunk-DEUNUKTD.js";
319
- import "./chunk-MVH7YAWY.js";
320
- import "./chunk-IFHT77WK.js";
319
+ import "./chunk-ZPN6SSWA.js";
320
+ import "./chunk-WF2WCZCR.js";
321
321
  import "./chunk-UHVXE24Y.js";
322
322
  import "./chunk-4ZWCQJNM.js";
323
323
  import "./chunk-WVGXCBOC.js";
324
- import "./chunk-ZET6A3OF.js";
325
- import "./chunk-JJAOVJ3E.js";
324
+ import "./chunk-YHCBJULX.js";
325
+ import "./chunk-DJZWNKFO.js";
326
326
  import "./chunk-N37X5RU7.js";
327
327
  import "./chunk-NNBZS3DY.js";
328
328
  import "./chunk-CYEPCZN5.js";
@@ -331,10 +331,10 @@ import "./chunk-YQNNHLCG.js";
331
331
  import "./chunk-W7IGLX4G.js";
332
332
  import "./chunk-6KTXE6A3.js";
333
333
  import "./chunk-GUMZC2BO.js";
334
- import "./chunk-7RZJWZ46.js";
335
- import "./chunk-A7Q43EUZ.js";
334
+ import "./chunk-227UFSEQ.js";
336
335
  import "./chunk-ET356KSB.js";
337
336
  import "./chunk-72A4L5JJ.js";
337
+ import "./chunk-A7Q43EUZ.js";
338
338
  import "./chunk-S2V7RUCL.js";
339
339
  import "./chunk-XXW32OL7.js";
340
340
  import "./chunk-S2HLHAZ4.js";
@@ -394,8 +394,8 @@ import {
394
394
  throwIfRecallAborted,
395
395
  tokenizeRecallQuery,
396
396
  utcDateKeysForLocalDay
397
- } from "./chunk-UJICQ77Y.js";
398
- import "./chunk-TB2MJRI6.js";
397
+ } from "./chunk-UCNQV43K.js";
398
+ import "./chunk-J3NGQ5SC.js";
399
399
  import "./chunk-CSAKJVXW.js";
400
400
  import "./chunk-K2XUWZBM.js";
401
401
  import "./chunk-OD4FM2U7.js";
@@ -431,7 +431,7 @@ import "./chunk-K6MV3TRQ.js";
431
431
  import "./chunk-236PXYG7.js";
432
432
  import "./chunk-ZCUTSMR2.js";
433
433
  import "./chunk-QDW3E4RD.js";
434
- import "./chunk-P6GKRT2H.js";
434
+ import "./chunk-2Z3DG5CQ.js";
435
435
  import "./chunk-NXH34IPL.js";
436
436
  import "./chunk-ZIKENA2C.js";
437
437
  import "./chunk-M6L7HI7R.js";
@@ -440,9 +440,9 @@ import "./chunk-6Q3ZTEF6.js";
440
440
  import "./chunk-YCVB7X56.js";
441
441
  import "./chunk-PQVCH2AE.js";
442
442
  import "./chunk-PJKTFXE2.js";
443
- import "./chunk-VDX2J7OX.js";
443
+ import "./chunk-7LCGFUMB.js";
444
+ import "./chunk-X7Y7WX73.js";
444
445
  import "./chunk-WEHSQBFR.js";
445
- import "./chunk-DQEMWVMT.js";
446
446
  import "./chunk-J4EB7DNW.js";
447
447
  import "./chunk-BJMBJZ2Y.js";
448
448
  import "./chunk-UKJAGEXH.js";
@@ -453,7 +453,7 @@ import "./chunk-SOAU2OE2.js";
453
453
  import "./chunk-3QL24R5Y.js";
454
454
  import "./chunk-ZN7SMKAK.js";
455
455
  import "./chunk-LNEWDF2A.js";
456
- import "./chunk-RJ57OOCD.js";
456
+ import "./chunk-X66BHMAU.js";
457
457
  import "./chunk-DDX6KIXF.js";
458
458
  import "./chunk-ZRUEP4IK.js";
459
459
  import "./chunk-2OXIPF3A.js";
@@ -476,11 +476,11 @@ import "./chunk-5FVVY2EB.js";
476
476
  import "./chunk-JDSVLVCG.js";
477
477
  import "./chunk-5GKPFL3S.js";
478
478
  import "./chunk-JAKIDQB2.js";
479
- import "./chunk-XJJYSX6F.js";
479
+ import "./chunk-JCUG7AXZ.js";
480
480
  import "./chunk-UI3NYK34.js";
481
481
  import "./chunk-GCGJW34D.js";
482
- import "./chunk-AREGMX2J.js";
483
482
  import "./chunk-NBP4EX5N.js";
483
+ import "./chunk-AREGMX2J.js";
484
484
  import "./chunk-LQWOFU6L.js";
485
485
  import "./chunk-P7FMDTKL.js";
486
486
  import "./chunk-MRV7VSQK.js";
@@ -0,0 +1,23 @@
1
+ interface StateViewLine {
2
+ memoryId: string;
3
+ /** The line as it would be injected. */
4
+ text: string;
5
+ stateLabel: string;
6
+ }
7
+ type ZeroDiffCheck = {
8
+ ok: true;
9
+ reason: "verified" | "not_applicable";
10
+ } | {
11
+ ok: false;
12
+ error: "current_line_changed";
13
+ memoryId: string;
14
+ } | {
15
+ ok: false;
16
+ error: "order_changed";
17
+ };
18
+ declare function checkStateViewZeroDiff(input: {
19
+ baseline: readonly StateViewLine[];
20
+ annotated: readonly StateViewLine[];
21
+ }): ZeroDiffCheck;
22
+
23
+ export { type StateViewLine, type ZeroDiffCheck, checkStateViewZeroDiff };
@@ -0,0 +1,84 @@
1
+ import "./chunk-PZ5AY32C.js";
2
+
3
+ // src/recall-state-view-zero-diff.ts
4
+ var STATE_LABELS = Object.freeze(
5
+ ["current", "historical", "transition"]
6
+ );
7
+ function isStateLabel(value) {
8
+ return STATE_LABELS.includes(value);
9
+ }
10
+ function validateLines(lines, name) {
11
+ for (const line of lines) {
12
+ if (line === null || typeof line !== "object") {
13
+ throw new TypeError(`${name} line must be an object`);
14
+ }
15
+ if (typeof line.memoryId !== "string") {
16
+ throw new TypeError(`${name} line memoryId must be a string`);
17
+ }
18
+ if (typeof line.text !== "string") {
19
+ throw new TypeError(`${name} line text must be a string`);
20
+ }
21
+ if (typeof line.stateLabel !== "string" || !isStateLabel(line.stateLabel)) {
22
+ throw new TypeError(
23
+ `unknown state label: ${JSON.stringify(line.stateLabel)} (allowed: ${STATE_LABELS.join(", ")})`
24
+ );
25
+ }
26
+ }
27
+ const seen = /* @__PURE__ */ new Set();
28
+ for (const line of lines) {
29
+ if (seen.has(line.memoryId)) {
30
+ throw new RangeError(`duplicate memoryId in ${name}: ${line.memoryId}`);
31
+ }
32
+ seen.add(line.memoryId);
33
+ }
34
+ }
35
+ function checkStateViewZeroDiff(input) {
36
+ if (input === null || typeof input !== "object") {
37
+ throw new TypeError("input must be an object");
38
+ }
39
+ if (!Array.isArray(input.baseline)) {
40
+ throw new TypeError("baseline must be an array");
41
+ }
42
+ if (!Array.isArray(input.annotated)) {
43
+ throw new TypeError("annotated must be an array");
44
+ }
45
+ const baseline = input.baseline;
46
+ const annotated = input.annotated;
47
+ validateLines(baseline, "baseline");
48
+ validateLines(annotated, "annotated");
49
+ for (const line of baseline) {
50
+ if (line.stateLabel !== "current") {
51
+ throw new RangeError(
52
+ `baseline may only contain current lines, got ${JSON.stringify(line.stateLabel)}`
53
+ );
54
+ }
55
+ }
56
+ const hasHistorical = annotated.some(
57
+ (line) => line.stateLabel === "historical" || line.stateLabel === "transition"
58
+ );
59
+ if (hasHistorical) {
60
+ return { ok: true, reason: "not_applicable" };
61
+ }
62
+ const baselineText = /* @__PURE__ */ new Map();
63
+ for (const line of baseline) {
64
+ baselineText.set(line.memoryId, line.text);
65
+ }
66
+ for (const line of annotated) {
67
+ if (baselineText.has(line.memoryId) && baselineText.get(line.memoryId) !== line.text) {
68
+ return { ok: false, error: "current_line_changed", memoryId: line.memoryId };
69
+ }
70
+ }
71
+ if (baseline.length !== annotated.length) {
72
+ return { ok: false, error: "order_changed" };
73
+ }
74
+ for (let i = 0; i < baseline.length; i++) {
75
+ if (baseline[i].memoryId !== annotated[i].memoryId) {
76
+ return { ok: false, error: "order_changed" };
77
+ }
78
+ }
79
+ return { ok: true, reason: "verified" };
80
+ }
81
+ export {
82
+ checkStateViewZeroDiff
83
+ };
84
+ //# sourceMappingURL=recall-state-view-zero-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/recall-state-view-zero-diff.ts"],"sourcesContent":["/**\n * Zero-diff guard for recall state views (issue #1952).\n *\n * The issue promises: current items are unchanged — zero diff for existing\n * users when no historical item qualifies. This module makes that promise\n * checkable. It compares the lines the pipeline would inject WITHOUT state\n * views (baseline) against the lines it would inject WITH them (annotated).\n *\n * Ok reasons are named for what a reader will assume they mean:\n * - `verified`: no historical or transition item is present, so the promise\n * applies, and the byte-exact comparison ran and held.\n * - `not_applicable`: at least one historical or transition item is present,\n * so the \"when no historical item qualifies\" precondition is false and\n * nothing was compared.\n *\n * Text comparison is byte-exact; a trailing space added by a renderer is a\n * diff. Current-line text mismatches are reported before order mismatches,\n * so `order_changed` means every line matched by memoryId had identical\n * text and only the memoryId sequence moved.\n *\n * Pure: no I/O, inputs are never mutated. Tests drive it through the live\n * recall route (`applyRecallStateViews` then\n * `RecallResultFormatter.formatQmdResultEntries`); wiring the guard into a\n * runtime caller is a later slice.\n */\nimport type { StateLabel } from \"./recall-state-view.js\";\n\nexport interface StateViewLine {\n memoryId: string;\n /** The line as it would be injected. */\n text: string;\n stateLabel: string;\n}\n\nexport type ZeroDiffCheck =\n | { ok: true; reason: \"verified\" | \"not_applicable\" }\n | { ok: false; error: \"current_line_changed\"; memoryId: string }\n | { ok: false; error: \"order_changed\" };\n\nconst STATE_LABELS = Object.freeze(\n [\"current\", \"historical\", \"transition\"] as const satisfies readonly StateLabel[],\n);\n\nfunction isStateLabel(value: string): value is StateLabel {\n return (STATE_LABELS as readonly string[]).includes(value);\n}\n\nfunction validateLines(lines: readonly StateViewLine[], name: string): void {\n for (const line of lines) {\n if (line === null || typeof line !== \"object\") {\n throw new TypeError(`${name} line must be an object`);\n }\n if (typeof line.memoryId !== \"string\") {\n throw new TypeError(`${name} line memoryId must be a string`);\n }\n if (typeof line.text !== \"string\") {\n throw new TypeError(`${name} line text must be a string`);\n }\n if (typeof line.stateLabel !== \"string\" || !isStateLabel(line.stateLabel)) {\n throw new TypeError(\n `unknown state label: ${JSON.stringify(line.stateLabel)} (allowed: ${STATE_LABELS.join(\", \")})`,\n );\n }\n }\n const seen = new Set<string>();\n for (const line of lines) {\n if (seen.has(line.memoryId)) {\n throw new RangeError(`duplicate memoryId in ${name}: ${line.memoryId}`);\n }\n seen.add(line.memoryId);\n }\n}\n\nexport function checkStateViewZeroDiff(input: {\n baseline: readonly StateViewLine[];\n annotated: readonly StateViewLine[];\n}): ZeroDiffCheck {\n if (input === null || typeof input !== \"object\") {\n throw new TypeError(\"input must be an object\");\n }\n if (!Array.isArray(input.baseline)) {\n throw new TypeError(\"baseline must be an array\");\n }\n if (!Array.isArray(input.annotated)) {\n throw new TypeError(\"annotated must be an array\");\n }\n const baseline = input.baseline;\n const annotated = input.annotated;\n validateLines(baseline, \"baseline\");\n validateLines(annotated, \"annotated\");\n for (const line of baseline) {\n if (line.stateLabel !== \"current\") {\n throw new RangeError(\n `baseline may only contain current lines, got ${JSON.stringify(line.stateLabel)}`,\n );\n }\n }\n\n const hasHistorical = annotated.some(\n (line) => line.stateLabel === \"historical\" || line.stateLabel === \"transition\",\n );\n if (hasHistorical) {\n return { ok: true, reason: \"not_applicable\" };\n }\n\n const baselineText = new Map<string, string>();\n for (const line of baseline) {\n baselineText.set(line.memoryId, line.text);\n }\n for (const line of annotated) {\n if (baselineText.has(line.memoryId) && baselineText.get(line.memoryId) !== line.text) {\n return { ok: false, error: \"current_line_changed\", memoryId: line.memoryId };\n }\n }\n\n if (baseline.length !== annotated.length) {\n return { ok: false, error: \"order_changed\" };\n }\n for (let i = 0; i < baseline.length; i++) {\n if (baseline[i].memoryId !== annotated[i].memoryId) {\n return { ok: false, error: \"order_changed\" };\n }\n }\n return { ok: true, reason: \"verified\" };\n}\n"],"mappings":";;;AAuCA,IAAM,eAAe,OAAO;AAAA,EAC1B,CAAC,WAAW,cAAc,YAAY;AACxC;AAEA,SAAS,aAAa,OAAoC;AACxD,SAAQ,aAAmC,SAAS,KAAK;AAC3D;AAEA,SAAS,cAAc,OAAiC,MAAoB;AAC1E,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS,QAAQ,OAAO,SAAS,UAAU;AAC7C,YAAM,IAAI,UAAU,GAAG,IAAI,yBAAyB;AAAA,IACtD;AACA,QAAI,OAAO,KAAK,aAAa,UAAU;AACrC,YAAM,IAAI,UAAU,GAAG,IAAI,iCAAiC;AAAA,IAC9D;AACA,QAAI,OAAO,KAAK,SAAS,UAAU;AACjC,YAAM,IAAI,UAAU,GAAG,IAAI,6BAA6B;AAAA,IAC1D;AACA,QAAI,OAAO,KAAK,eAAe,YAAY,CAAC,aAAa,KAAK,UAAU,GAAG;AACzE,YAAM,IAAI;AAAA,QACR,wBAAwB,KAAK,UAAU,KAAK,UAAU,CAAC,cAAc,aAAa,KAAK,IAAI,CAAC;AAAA,MAC9F;AAAA,IACF;AAAA,EACF;AACA,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,IAAI,KAAK,QAAQ,GAAG;AAC3B,YAAM,IAAI,WAAW,yBAAyB,IAAI,KAAK,KAAK,QAAQ,EAAE;AAAA,IACxE;AACA,SAAK,IAAI,KAAK,QAAQ;AAAA,EACxB;AACF;AAEO,SAAS,uBAAuB,OAGrB;AAChB,MAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,UAAM,IAAI,UAAU,yBAAyB;AAAA,EAC/C;AACA,MAAI,CAAC,MAAM,QAAQ,MAAM,QAAQ,GAAG;AAClC,UAAM,IAAI,UAAU,2BAA2B;AAAA,EACjD;AACA,MAAI,CAAC,MAAM,QAAQ,MAAM,SAAS,GAAG;AACnC,UAAM,IAAI,UAAU,4BAA4B;AAAA,EAClD;AACA,QAAM,WAAW,MAAM;AACvB,QAAM,YAAY,MAAM;AACxB,gBAAc,UAAU,UAAU;AAClC,gBAAc,WAAW,WAAW;AACpC,aAAW,QAAQ,UAAU;AAC3B,QAAI,KAAK,eAAe,WAAW;AACjC,YAAM,IAAI;AAAA,QACR,gDAAgD,KAAK,UAAU,KAAK,UAAU,CAAC;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,UAAU;AAAA,IAC9B,CAAC,SAAS,KAAK,eAAe,gBAAgB,KAAK,eAAe;AAAA,EACpE;AACA,MAAI,eAAe;AACjB,WAAO,EAAE,IAAI,MAAM,QAAQ,iBAAiB;AAAA,EAC9C;AAEA,QAAM,eAAe,oBAAI,IAAoB;AAC7C,aAAW,QAAQ,UAAU;AAC3B,iBAAa,IAAI,KAAK,UAAU,KAAK,IAAI;AAAA,EAC3C;AACA,aAAW,QAAQ,WAAW;AAC5B,QAAI,aAAa,IAAI,KAAK,QAAQ,KAAK,aAAa,IAAI,KAAK,QAAQ,MAAM,KAAK,MAAM;AACpF,aAAO,EAAE,IAAI,OAAO,OAAO,wBAAwB,UAAU,KAAK,SAAS;AAAA,IAC7E;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,UAAU,QAAQ;AACxC,WAAO,EAAE,IAAI,OAAO,OAAO,gBAAgB;AAAA,EAC7C;AACA,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,QAAI,SAAS,CAAC,EAAE,aAAa,UAAU,CAAC,EAAE,UAAU;AAClD,aAAO,EAAE,IAAI,OAAO,OAAO,gBAAgB;AAAA,IAC7C;AAAA,EACF;AACA,SAAO,EAAE,IAAI,MAAM,QAAQ,WAAW;AACxC;","names":[]}
@@ -11,6 +11,11 @@ import "../chunk-PZ5AY32C.js";
11
11
  import { createHash, randomUUID } from "crypto";
12
12
  import * as fs from "fs/promises";
13
13
  import * as path from "path";
14
+ function stripTrailingSlashes(value) {
15
+ let end = value.length;
16
+ while (end > 0 && value[end - 1] === "/") end -= 1;
17
+ return end === value.length ? value : value.slice(0, end);
18
+ }
14
19
  function normalizeConvergePeerUrl(peerUrl) {
15
20
  const trimmed = peerUrl.trim();
16
21
  try {
@@ -19,10 +24,10 @@ function normalizeConvergePeerUrl(peerUrl) {
19
24
  url.password = "";
20
25
  url.search = "";
21
26
  url.hash = "";
22
- url.pathname = url.pathname.replace(/\/+$/, "");
27
+ url.pathname = stripTrailingSlashes(url.pathname);
23
28
  return url.toString().replace(/\/$/, "");
24
29
  } catch {
25
- return trimmed.replace(/\/+$/, "");
30
+ return stripTrailingSlashes(trimmed);
26
31
  }
27
32
  }
28
33
  function hashPeerNamespace(peerUrl, namespace) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/reconcile/cursor.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport {\n type ReconcilePlanEntry,\n type ReconcileSemanticAgreement,\n semanticAgreementKey,\n} from \"./plan.js\";\n\nexport type ConvergeRefreshTarget = \"local\" | \"receiver\";\n\nexport interface ConvergeCursorFileState {\n path: string;\n sha256: string;\n mtimeMs?: number;\n bytes?: number;\n}\n\nexport interface ConvergeCursorState {\n version: 1;\n peerUrl: string;\n namespace: string;\n lastConvergedAt?: string;\n baseFiles: ConvergeCursorFileState[];\n semanticAgreements?: ReconcileSemanticAgreement[];\n completedPaths?: string[];\n pendingRefreshes?: ConvergeRefreshTarget[];\n}\n\nexport function normalizeConvergePeerUrl(peerUrl: string): string {\n const trimmed = peerUrl.trim();\n try {\n const url = new URL(trimmed);\n url.username = \"\";\n url.password = \"\";\n url.search = \"\";\n url.hash = \"\";\n url.pathname = url.pathname.replace(/\\/+$/, \"\");\n return url.toString().replace(/\\/$/, \"\");\n } catch {\n return trimmed.replace(/\\/+$/, \"\");\n }\n}\n\nexport function hashPeerNamespace(peerUrl: string, namespace: string): string {\n const normalizedUrl = normalizeConvergePeerUrl(peerUrl);\n const normalizedNs = namespace.trim().toLowerCase();\n return createHash(\"sha256\")\n .update(`${normalizedUrl}\\0${normalizedNs}`)\n .digest(\"hex\")\n .slice(0, 16);\n}\n\nexport function defaultConvergeCursorPath(\n memoryDir: string,\n peerUrl: string,\n namespace: string,\n): string {\n const key = hashPeerNamespace(peerUrl, namespace);\n return path.join(path.resolve(memoryDir), \".remnic\", \"state\", \"converge-cursors\", `${key}.json`);\n}\n\nfunction normalizeSemanticFileState(input: unknown): { path: string; sha256: string } | undefined {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) return undefined;\n const file = input as Record<string, unknown>;\n if (typeof file.path !== \"string\" || typeof file.sha256 !== \"string\") return undefined;\n return { path: file.path, sha256: file.sha256 };\n}\n\nfunction digestAfterReconcile(entry: ReconcilePlanEntry): string | undefined {\n if (entry.action === \"push\") return entry.localSha256;\n if (entry.action === \"pull\") return entry.peerSha256;\n if (entry.action === \"conflict\") {\n if (entry.resolution === \"local-wins\") return entry.localSha256;\n if (entry.resolution === \"peer-wins\") return entry.peerSha256;\n return undefined;\n }\n if (entry.action !== \"identical\") return undefined;\n if (entry.localSha256 && entry.peerSha256 && entry.localSha256 !== entry.peerSha256) return undefined;\n return entry.localSha256 ?? entry.peerSha256;\n}\n\nexport function deriveConvergeCursorBase(\n entries: readonly ReconcilePlanEntry[],\n namespace: string,\n priorSemanticAgreements: readonly ReconcileSemanticAgreement[] = [],\n): Pick<ConvergeCursorState, \"baseFiles\" | \"semanticAgreements\"> {\n const baseFiles: ConvergeCursorFileState[] = [];\n const semanticAgreementsByPathPair = new Map(\n priorSemanticAgreements.map((agreement) => [semanticAgreementKey(agreement), agreement])\n );\n for (const entry of entries) {\n if (entry.namespace !== namespace) continue;\n if (entry.semanticAgreement) {\n semanticAgreementsByPathPair.set(semanticAgreementKey(entry.semanticAgreement), entry.semanticAgreement);\n continue;\n }\n const sha256 = digestAfterReconcile(entry);\n if (sha256) baseFiles.push({ path: entry.path, sha256 });\n }\n baseFiles.sort((left, right) => left.path.localeCompare(right.path));\n const semanticAgreements = [...semanticAgreementsByPathPair.values()];\n semanticAgreements.sort((left, right) =>\n left.local.path.localeCompare(right.local.path) || left.peer.path.localeCompare(right.peer.path)\n );\n return { baseFiles, semanticAgreements };\n}\n\nexport function normalizeConvergeCursor(input: unknown): ConvergeCursorState {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(\"converge cursor must be an object\");\n }\n const obj = input as Record<string, unknown>;\n if (obj.version !== 1) {\n throw new Error(\"converge cursor version must be 1\");\n }\n if (typeof obj.peerUrl !== \"string\" || !obj.peerUrl.trim()) {\n throw new Error(\"converge cursor missing peerUrl\");\n }\n if (typeof obj.namespace !== \"string\" || !obj.namespace.trim()) {\n throw new Error(\"converge cursor missing namespace\");\n }\n const baseFiles: ConvergeCursorFileState[] = [];\n if (Array.isArray(obj.baseFiles)) {\n for (const item of obj.baseFiles) {\n if (item && typeof item === \"object\") {\n const fileItem = item as Record<string, unknown>;\n if (typeof fileItem.path === \"string\" && typeof fileItem.sha256 === \"string\") {\n baseFiles.push({\n path: fileItem.path,\n sha256: fileItem.sha256,\n mtimeMs: typeof fileItem.mtimeMs === \"number\" ? fileItem.mtimeMs : undefined,\n bytes: typeof fileItem.bytes === \"number\" ? fileItem.bytes : undefined,\n });\n }\n }\n }\n }\n const semanticAgreements: ReconcileSemanticAgreement[] = [];\n if (Array.isArray(obj.semanticAgreements)) {\n for (const item of obj.semanticAgreements) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const agreement = item as Record<string, unknown>;\n const local = normalizeSemanticFileState(agreement.local);\n const peer = normalizeSemanticFileState(agreement.peer);\n if (local && peer) semanticAgreements.push({ local, peer });\n }\n }\n const completedPaths: string[] = [];\n if (Array.isArray(obj.completedPaths)) {\n for (const item of obj.completedPaths) {\n if (typeof item === \"string\") {\n completedPaths.push(item);\n }\n }\n }\n const pendingRefreshes: ConvergeRefreshTarget[] = [];\n if (Array.isArray(obj.pendingRefreshes)) {\n if (obj.pendingRefreshes.includes(\"local\")) pendingRefreshes.push(\"local\");\n if (obj.pendingRefreshes.includes(\"receiver\")) pendingRefreshes.push(\"receiver\");\n }\n return {\n version: 1,\n peerUrl: obj.peerUrl.trim(),\n namespace: obj.namespace.trim(),\n lastConvergedAt: typeof obj.lastConvergedAt === \"string\" ? obj.lastConvergedAt : undefined,\n baseFiles,\n semanticAgreements,\n completedPaths,\n pendingRefreshes,\n };\n}\n\nexport async function readConvergeCursor(\n cursorPath: string,\n): Promise<ConvergeCursorState | null> {\n try {\n const raw = await fs.readFile(path.resolve(cursorPath), \"utf-8\");\n const parsed = JSON.parse(raw);\n return normalizeConvergeCursor(parsed);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n return null;\n }\n}\n\nexport async function writeConvergeCursor(\n cursorPath: string,\n cursor: ConvergeCursorState,\n): Promise<void> {\n const normalized = normalizeConvergeCursor(cursor);\n const target = path.resolve(cursorPath);\n await fs.mkdir(path.dirname(target), { recursive: true });\n const tmp = path.join(\n path.dirname(target),\n `.converge-cursor.${process.pid}.${randomUUID()}.tmp`,\n );\n await fs.writeFile(tmp, JSON.stringify(normalized, null, 2) + \"\\n\", \"utf-8\");\n try {\n await fs.rename(tmp, target);\n } catch (error) {\n await fs.unlink(tmp).catch(() => {});\n throw error;\n }\n}\n\nexport async function markConvergeRefreshPending(\n cursorPath: string,\n options: {\n peerUrl: string;\n namespace: string;\n target: ConvergeRefreshTarget;\n },\n): Promise<void> {\n const current = await readConvergeCursor(cursorPath);\n const pendingRefreshes = new Set(current?.pendingRefreshes ?? []);\n pendingRefreshes.add(options.target);\n await writeConvergeCursor(cursorPath, {\n version: 1,\n peerUrl: current?.peerUrl ?? options.peerUrl,\n namespace: current?.namespace ?? options.namespace,\n lastConvergedAt: current?.lastConvergedAt,\n baseFiles: current?.baseFiles ?? [],\n semanticAgreements: current?.semanticAgreements ?? [],\n completedPaths: current?.completedPaths ?? [],\n pendingRefreshes: [...pendingRefreshes].sort(),\n });\n}\n\nexport async function clearConvergeRefreshPending(\n cursorPath: string,\n target: ConvergeRefreshTarget,\n): Promise<void> {\n const current = await readConvergeCursor(cursorPath);\n if (!current?.pendingRefreshes?.includes(target)) return;\n await writeConvergeCursor(cursorPath, {\n ...current,\n pendingRefreshes: current.pendingRefreshes.filter((pending) => pending !== target),\n });\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/reconcile/cursor.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport {\n type ReconcilePlanEntry,\n type ReconcileSemanticAgreement,\n semanticAgreementKey,\n} from \"./plan.js\";\n\nexport type ConvergeRefreshTarget = \"local\" | \"receiver\";\n\nexport interface ConvergeCursorFileState {\n path: string;\n sha256: string;\n mtimeMs?: number;\n bytes?: number;\n}\n\nexport interface ConvergeCursorState {\n version: 1;\n peerUrl: string;\n namespace: string;\n lastConvergedAt?: string;\n baseFiles: ConvergeCursorFileState[];\n semanticAgreements?: ReconcileSemanticAgreement[];\n completedPaths?: string[];\n pendingRefreshes?: ConvergeRefreshTarget[];\n}\n\n/**\n * Linear trailing-slash trim. `/\\/+$/` backtracks quadratically on long\n * slash runs that do not end in a slash (CodeQL js/polynomial-redos); a\n * bounded character loop cannot.\n */\nfunction stripTrailingSlashes(value: string): string {\n let end = value.length;\n while (end > 0 && value[end - 1] === \"/\") end -= 1;\n return end === value.length ? value : value.slice(0, end);\n}\n\nexport function normalizeConvergePeerUrl(peerUrl: string): string {\n const trimmed = peerUrl.trim();\n try {\n const url = new URL(trimmed);\n url.username = \"\";\n url.password = \"\";\n url.search = \"\";\n url.hash = \"\";\n url.pathname = stripTrailingSlashes(url.pathname);\n return url.toString().replace(/\\/$/, \"\");\n } catch {\n return stripTrailingSlashes(trimmed);\n }\n}\n\nexport function hashPeerNamespace(peerUrl: string, namespace: string): string {\n const normalizedUrl = normalizeConvergePeerUrl(peerUrl);\n const normalizedNs = namespace.trim().toLowerCase();\n return createHash(\"sha256\")\n .update(`${normalizedUrl}\\0${normalizedNs}`)\n .digest(\"hex\")\n .slice(0, 16);\n}\n\nexport function defaultConvergeCursorPath(\n memoryDir: string,\n peerUrl: string,\n namespace: string,\n): string {\n const key = hashPeerNamespace(peerUrl, namespace);\n return path.join(path.resolve(memoryDir), \".remnic\", \"state\", \"converge-cursors\", `${key}.json`);\n}\n\nfunction normalizeSemanticFileState(input: unknown): { path: string; sha256: string } | undefined {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) return undefined;\n const file = input as Record<string, unknown>;\n if (typeof file.path !== \"string\" || typeof file.sha256 !== \"string\") return undefined;\n return { path: file.path, sha256: file.sha256 };\n}\n\nfunction digestAfterReconcile(entry: ReconcilePlanEntry): string | undefined {\n if (entry.action === \"push\") return entry.localSha256;\n if (entry.action === \"pull\") return entry.peerSha256;\n if (entry.action === \"conflict\") {\n if (entry.resolution === \"local-wins\") return entry.localSha256;\n if (entry.resolution === \"peer-wins\") return entry.peerSha256;\n return undefined;\n }\n if (entry.action !== \"identical\") return undefined;\n if (entry.localSha256 && entry.peerSha256 && entry.localSha256 !== entry.peerSha256) return undefined;\n return entry.localSha256 ?? entry.peerSha256;\n}\n\nexport function deriveConvergeCursorBase(\n entries: readonly ReconcilePlanEntry[],\n namespace: string,\n priorSemanticAgreements: readonly ReconcileSemanticAgreement[] = [],\n): Pick<ConvergeCursorState, \"baseFiles\" | \"semanticAgreements\"> {\n const baseFiles: ConvergeCursorFileState[] = [];\n const semanticAgreementsByPathPair = new Map(\n priorSemanticAgreements.map((agreement) => [semanticAgreementKey(agreement), agreement])\n );\n for (const entry of entries) {\n if (entry.namespace !== namespace) continue;\n if (entry.semanticAgreement) {\n semanticAgreementsByPathPair.set(semanticAgreementKey(entry.semanticAgreement), entry.semanticAgreement);\n continue;\n }\n const sha256 = digestAfterReconcile(entry);\n if (sha256) baseFiles.push({ path: entry.path, sha256 });\n }\n baseFiles.sort((left, right) => left.path.localeCompare(right.path));\n const semanticAgreements = [...semanticAgreementsByPathPair.values()];\n semanticAgreements.sort((left, right) =>\n left.local.path.localeCompare(right.local.path) || left.peer.path.localeCompare(right.peer.path)\n );\n return { baseFiles, semanticAgreements };\n}\n\nexport function normalizeConvergeCursor(input: unknown): ConvergeCursorState {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(\"converge cursor must be an object\");\n }\n const obj = input as Record<string, unknown>;\n if (obj.version !== 1) {\n throw new Error(\"converge cursor version must be 1\");\n }\n if (typeof obj.peerUrl !== \"string\" || !obj.peerUrl.trim()) {\n throw new Error(\"converge cursor missing peerUrl\");\n }\n if (typeof obj.namespace !== \"string\" || !obj.namespace.trim()) {\n throw new Error(\"converge cursor missing namespace\");\n }\n const baseFiles: ConvergeCursorFileState[] = [];\n if (Array.isArray(obj.baseFiles)) {\n for (const item of obj.baseFiles) {\n if (item && typeof item === \"object\") {\n const fileItem = item as Record<string, unknown>;\n if (typeof fileItem.path === \"string\" && typeof fileItem.sha256 === \"string\") {\n baseFiles.push({\n path: fileItem.path,\n sha256: fileItem.sha256,\n mtimeMs: typeof fileItem.mtimeMs === \"number\" ? fileItem.mtimeMs : undefined,\n bytes: typeof fileItem.bytes === \"number\" ? fileItem.bytes : undefined,\n });\n }\n }\n }\n }\n const semanticAgreements: ReconcileSemanticAgreement[] = [];\n if (Array.isArray(obj.semanticAgreements)) {\n for (const item of obj.semanticAgreements) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const agreement = item as Record<string, unknown>;\n const local = normalizeSemanticFileState(agreement.local);\n const peer = normalizeSemanticFileState(agreement.peer);\n if (local && peer) semanticAgreements.push({ local, peer });\n }\n }\n const completedPaths: string[] = [];\n if (Array.isArray(obj.completedPaths)) {\n for (const item of obj.completedPaths) {\n if (typeof item === \"string\") {\n completedPaths.push(item);\n }\n }\n }\n const pendingRefreshes: ConvergeRefreshTarget[] = [];\n if (Array.isArray(obj.pendingRefreshes)) {\n if (obj.pendingRefreshes.includes(\"local\")) pendingRefreshes.push(\"local\");\n if (obj.pendingRefreshes.includes(\"receiver\")) pendingRefreshes.push(\"receiver\");\n }\n return {\n version: 1,\n peerUrl: obj.peerUrl.trim(),\n namespace: obj.namespace.trim(),\n lastConvergedAt: typeof obj.lastConvergedAt === \"string\" ? obj.lastConvergedAt : undefined,\n baseFiles,\n semanticAgreements,\n completedPaths,\n pendingRefreshes,\n };\n}\n\nexport async function readConvergeCursor(\n cursorPath: string,\n): Promise<ConvergeCursorState | null> {\n try {\n const raw = await fs.readFile(path.resolve(cursorPath), \"utf-8\");\n const parsed = JSON.parse(raw);\n return normalizeConvergeCursor(parsed);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n return null;\n }\n}\n\nexport async function writeConvergeCursor(\n cursorPath: string,\n cursor: ConvergeCursorState,\n): Promise<void> {\n const normalized = normalizeConvergeCursor(cursor);\n const target = path.resolve(cursorPath);\n await fs.mkdir(path.dirname(target), { recursive: true });\n const tmp = path.join(\n path.dirname(target),\n `.converge-cursor.${process.pid}.${randomUUID()}.tmp`,\n );\n await fs.writeFile(tmp, JSON.stringify(normalized, null, 2) + \"\\n\", \"utf-8\");\n try {\n await fs.rename(tmp, target);\n } catch (error) {\n await fs.unlink(tmp).catch(() => {});\n throw error;\n }\n}\n\nexport async function markConvergeRefreshPending(\n cursorPath: string,\n options: {\n peerUrl: string;\n namespace: string;\n target: ConvergeRefreshTarget;\n },\n): Promise<void> {\n const current = await readConvergeCursor(cursorPath);\n const pendingRefreshes = new Set(current?.pendingRefreshes ?? []);\n pendingRefreshes.add(options.target);\n await writeConvergeCursor(cursorPath, {\n version: 1,\n peerUrl: current?.peerUrl ?? options.peerUrl,\n namespace: current?.namespace ?? options.namespace,\n lastConvergedAt: current?.lastConvergedAt,\n baseFiles: current?.baseFiles ?? [],\n semanticAgreements: current?.semanticAgreements ?? [],\n completedPaths: current?.completedPaths ?? [],\n pendingRefreshes: [...pendingRefreshes].sort(),\n });\n}\n\nexport async function clearConvergeRefreshPending(\n cursorPath: string,\n target: ConvergeRefreshTarget,\n): Promise<void> {\n const current = await readConvergeCursor(cursorPath);\n if (!current?.pendingRefreshes?.includes(target)) return;\n await writeConvergeCursor(cursorPath, {\n ...current,\n pendingRefreshes: current.pendingRefreshes.filter((pending) => pending !== target),\n });\n}\n"],"mappings":"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","names":[]}