@remnic/core 9.63.5 → 9.63.7

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 (262) hide show
  1. package/dist/access-admin-ops-surface.d.ts +1 -1
  2. package/dist/access-admin-ops-surface.js +27 -25
  3. package/dist/access-authorization-probe.d.ts +1 -1
  4. package/dist/access-authorization-probe.js +28 -26
  5. package/dist/access-boundary.d.ts +1 -1
  6. package/dist/access-boundary.js +27 -25
  7. package/dist/access-cli.js +83 -81
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-extraction-force-flush.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.js +27 -25
  11. package/dist/access-http-lcm-compaction.d.ts +1 -1
  12. package/dist/access-http-lifecycle-flush.d.ts +1 -1
  13. package/dist/access-http-offline-stream.d.ts +1 -1
  14. package/dist/access-http-query.js +29 -27
  15. package/dist/access-http.d.ts +2 -2
  16. package/dist/access-http.js +43 -41
  17. package/dist/access-identity-continuity-surface.js +27 -25
  18. package/dist/access-lcm-surface.d.ts +1 -1
  19. package/dist/access-lcm-surface.js +27 -25
  20. package/dist/access-mcp.d.ts +1 -1
  21. package/dist/access-mcp.js +34 -32
  22. package/dist/access-namespace-preflight.js +27 -25
  23. package/dist/access-observe-write-surface.d.ts +1 -1
  24. package/dist/access-observe-write-surface.js +27 -25
  25. package/dist/access-offline-manifest.js +6 -5
  26. package/dist/access-operations-batch.js +29 -27
  27. package/dist/access-operations.d.ts +4 -4
  28. package/dist/access-operations.js +33 -31
  29. package/dist/access-recall-concurrency.d.ts +1 -1
  30. package/dist/access-recall-concurrency.js +27 -25
  31. package/dist/access-recall-response.d.ts +1 -1
  32. package/dist/access-recall-response.js +27 -25
  33. package/dist/access-recall-surface.d.ts +1 -1
  34. package/dist/access-recall-surface.js +27 -25
  35. package/dist/access-schema.d.ts +88 -88
  36. package/dist/access-schema.js +6 -5
  37. package/dist/access-service-helpers.d.ts +1 -1
  38. package/dist/access-service.d.ts +1 -1
  39. package/dist/access-service.js +27 -25
  40. package/dist/access-surface-catalog.d.ts +1 -1
  41. package/dist/access-surface-catalog.js +29 -27
  42. package/dist/access-surface-catalog.js.map +1 -1
  43. package/dist/active-recall.js +5 -3
  44. package/dist/active-recall.js.map +1 -1
  45. package/dist/adapters/index.js +4 -4
  46. package/dist/adapters/registry.js +2 -2
  47. package/dist/{auto-sync-BKRJDMKX.js → auto-sync-3SHMZVQS.js} +5 -3
  48. package/dist/{auto-sync-BKRJDMKX.js.map → auto-sync-3SHMZVQS.js.map} +1 -1
  49. package/dist/briefing.js +10 -10
  50. package/dist/calibration.d.ts +2 -1
  51. package/dist/calibration.js +7 -0
  52. package/dist/calibration.js.map +1 -1
  53. package/dist/causal-consolidation.js +11 -11
  54. package/dist/census-validation.d.ts +19 -0
  55. package/dist/census-validation.js +14 -0
  56. package/dist/census-validation.js.map +1 -0
  57. package/dist/{chunk-LEPOP46W.js → chunk-227UFSEQ.js} +4 -4
  58. package/dist/{chunk-Z4N7SVVF.js → chunk-2L7DKNVE.js} +12 -7
  59. package/dist/chunk-2L7DKNVE.js.map +1 -0
  60. package/dist/{chunk-3Z5TGRFA.js → chunk-3NZAVWU5.js} +9 -9
  61. package/dist/{chunk-I5FLIB2J.js → chunk-3S3PNR5H.js} +2 -2
  62. package/dist/{chunk-R6UMNP5C.js → chunk-3T6HIIKA.js} +2 -2
  63. package/dist/{chunk-77QZW2D6.js → chunk-3TDAA7VA.js} +2 -2
  64. package/dist/{chunk-TWTUGCTY.js → chunk-3YTTAGPB.js} +6 -1
  65. package/dist/chunk-3YTTAGPB.js.map +1 -0
  66. package/dist/{chunk-DXDAQZ2K.js → chunk-42TIIO2M.js} +2 -2
  67. package/dist/{chunk-Y7COCXY2.js → chunk-4F67JJPG.js} +2 -2
  68. package/dist/{chunk-PB4WVYGC.js → chunk-5S5DUJFJ.js} +2 -2
  69. package/dist/{chunk-KYTRF64R.js → chunk-5SCFDQEJ.js} +2 -2
  70. package/dist/{chunk-GG4DN63W.js → chunk-62Y5AGCM.js} +2 -2
  71. package/dist/{chunk-KHCUVYCY.js → chunk-6UKSOXAO.js} +3 -3
  72. package/dist/{chunk-F6JYBVL6.js → chunk-7ZAC2C2U.js} +24 -24
  73. package/dist/{chunk-GF7RQWXC.js → chunk-AJRJDXYR.js} +2 -2
  74. package/dist/{chunk-YEQCMA5L.js → chunk-BOSIHHOH.js} +2 -2
  75. package/dist/{chunk-7LF2OHIJ.js → chunk-BRHKW7GY.js} +2 -2
  76. package/dist/{chunk-LX4TNSAE.js → chunk-CBY54QYW.js} +4 -4
  77. package/dist/chunk-FEHIOYML.js +168 -0
  78. package/dist/chunk-FEHIOYML.js.map +1 -0
  79. package/dist/{chunk-6YMEU6OQ.js → chunk-G72IPMR7.js} +2 -2
  80. package/dist/{chunk-7AF243WZ.js → chunk-GBVRVYF4.js} +1 -1
  81. package/dist/{chunk-GTD4Q62X.js → chunk-H4GQ2Y24.js} +3 -3
  82. package/dist/{chunk-QI5RDDEL.js → chunk-HXZNTZ3Y.js} +6 -6
  83. package/dist/{chunk-CIAI24TQ.js → chunk-IBZQQOM5.js} +3 -3
  84. package/dist/{chunk-RYST72N5.js → chunk-IINVXO3U.js} +4 -154
  85. package/dist/chunk-IINVXO3U.js.map +1 -0
  86. package/dist/{chunk-R7TZ2HCS.js → chunk-JG22O53B.js} +58 -3
  87. package/dist/chunk-JG22O53B.js.map +1 -0
  88. package/dist/{chunk-VPHSMJ2E.js → chunk-JPWSYHLB.js} +2 -2
  89. package/dist/{chunk-X7LEDA74.js → chunk-KFB4YNXM.js} +2 -2
  90. package/dist/{chunk-IPLYGWQF.js → chunk-KQAFEZQX.js} +5 -5
  91. package/dist/chunk-LQWOFU6L.js +17 -0
  92. package/dist/chunk-LQWOFU6L.js.map +1 -0
  93. package/dist/{chunk-ZUPKNWRZ.js → chunk-MIUL6AUZ.js} +3 -3
  94. package/dist/{chunk-EJY3HJMT.js → chunk-MYI3RKI6.js} +2 -2
  95. package/dist/{chunk-NA56NSKL.js → chunk-OOJCXJBN.js} +2 -2
  96. package/dist/{chunk-7KQB4EBS.js → chunk-OPPBTPUU.js} +4 -4
  97. package/dist/{chunk-ERPBRXVZ.js → chunk-PZKWPXRF.js} +2 -2
  98. package/dist/{chunk-FHKXVTM5.js → chunk-Q5XKKDFQ.js} +16 -16
  99. package/dist/{chunk-QRWMS6SI.js → chunk-Q6OL23WM.js} +2 -2
  100. package/dist/{chunk-OW7NVMGQ.js → chunk-QIZOU3FN.js} +2 -2
  101. package/dist/{chunk-V3KIRICY.js → chunk-QQYHYW2N.js} +3 -3
  102. package/dist/{chunk-YFCEBB5P.js → chunk-QTXNS3HB.js} +2 -2
  103. package/dist/{chunk-2QSZNTDO.js → chunk-RKNJBZ55.js} +4 -4
  104. package/dist/{chunk-E4KMY4KR.js → chunk-SNEUAZ6B.js} +2 -2
  105. package/dist/{chunk-TSTI6A3A.js → chunk-SYJW273H.js} +11 -11
  106. package/dist/{chunk-EFKZT6AY.js → chunk-T42L3S6A.js} +6 -11
  107. package/dist/chunk-T42L3S6A.js.map +1 -0
  108. package/dist/{chunk-YXMHUBN2.js → chunk-TOP3FSDW.js} +25 -102
  109. package/dist/chunk-TOP3FSDW.js.map +1 -0
  110. package/dist/{chunk-PBRCYYO7.js → chunk-ULZFZL7K.js} +2 -2
  111. package/dist/{chunk-UGHCZS6K.js → chunk-VFZQXYN5.js} +2 -2
  112. package/dist/{chunk-IVXVLDNT.js → chunk-WKJTMXME.js} +37 -54
  113. package/dist/chunk-WKJTMXME.js.map +1 -0
  114. package/dist/{chunk-NKB43PGI.js → chunk-WZDTSBGQ.js} +2 -2
  115. package/dist/{chunk-2UM6WHME.js → chunk-XE2QCCT2.js} +2 -2
  116. package/dist/{chunk-FPEZ74F7.js → chunk-XNJQZLAP.js} +3 -3
  117. package/dist/{chunk-SYVGVK4S.js → chunk-XTMYB2HY.js} +2 -2
  118. package/dist/{chunk-OETHJBAL.js → chunk-XV6PUXJ5.js} +71 -71
  119. package/dist/{chunk-UCLMKNHA.js → chunk-YIMV2KYM.js} +2 -2
  120. package/dist/{chunk-DYZR3Z6D.js → chunk-YMQKPSB2.js} +4 -4
  121. package/dist/{chunk-AYVCKGA6.js → chunk-YTXNDEUS.js} +2 -2
  122. package/dist/{chunk-L3CHRBHE.js → chunk-ZRUEP4IK.js} +17 -11
  123. package/dist/chunk-ZRUEP4IK.js.map +1 -0
  124. package/dist/{cli-BFBDYV0D.d.ts → cli-BTNj5DzK.d.ts} +1 -1
  125. package/dist/cli.d.ts +2 -2
  126. package/dist/cli.js +59 -57
  127. package/dist/compounding/engine.js +10 -10
  128. package/dist/config.js +5 -3
  129. package/dist/connectors/codex-materialize-runner.js +10 -10
  130. package/dist/connectors/index.js +10 -10
  131. package/dist/consolidation-provenance-check.js +2 -2
  132. package/dist/convergence-refresh.js +12 -12
  133. package/dist/conversation-index/backend.js +2 -2
  134. package/dist/corpus-watermark.js +12 -12
  135. package/dist/entity-retrieval.js +10 -10
  136. package/dist/external-wiki-access.d.ts +1 -1
  137. package/dist/external-wiki-access.js +28 -26
  138. package/dist/external-wiki-mcp-tools.d.ts +1 -1
  139. package/dist/extraction-judge.d.ts +2 -1
  140. package/dist/extraction-judge.js +6 -1
  141. package/dist/extraction-normalization.js +2 -2
  142. package/dist/extraction-prompt.d.ts +20 -1
  143. package/dist/extraction-prompt.js +11 -1
  144. package/dist/extraction.js +13 -13
  145. package/dist/{first-start-migration-4NETATFF.js → first-start-migration-Q2VB2E2D.js} +4 -4
  146. package/dist/harmonic-retrieval.js +1 -1
  147. package/dist/index.d.ts +680 -680
  148. package/dist/index.js +92 -90
  149. package/dist/maintenance/memory-governance.js +10 -10
  150. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +10 -10
  151. package/dist/maintenance/rebuild-memory-projection.js +11 -11
  152. package/dist/mcp-memory-inspector-app.d.ts +1 -1
  153. package/dist/namespaces/migrate.js +11 -11
  154. package/dist/namespaces/search.js +4 -4
  155. package/dist/namespaces/storage.js +10 -10
  156. package/dist/offline-sync.js +3 -2
  157. package/dist/operator-doctor-corpus.js +13 -13
  158. package/dist/operator-toolkit.js +24 -22
  159. package/dist/orchestration/maintenance.js +16 -16
  160. package/dist/orchestrator.js +85 -83
  161. package/dist/{public-http-8PcrDIYi.d.ts → public-http-BmPktTe3.d.ts} +1 -1
  162. package/dist/reconcile/cursor.js +7 -3
  163. package/dist/reconcile/cursor.js.map +1 -1
  164. package/dist/reconcile/manifest.js +3 -7
  165. package/dist/reconcile/plan.d.ts +15 -1
  166. package/dist/reconcile/plan.js +6 -10
  167. package/dist/resume-bundles.js +6 -4
  168. package/dist/schemas.d.ts +108 -108
  169. package/dist/search/factory.js +3 -3
  170. package/dist/search/index.js +3 -3
  171. package/dist/semantic-consolidation.js +16 -16
  172. package/dist/semantic-rule-promotion.js +10 -10
  173. package/dist/semantic-rule-verifier.js +10 -10
  174. package/dist/shared-context/manager.d.ts +8 -8
  175. package/dist/source-agent-qualifier.js +10 -10
  176. package/dist/storage.js +9 -9
  177. package/dist/support-passport/index.d.ts +4 -4
  178. package/dist/support-passport/index.js +30 -28
  179. package/dist/transfer/autodetect.js +1 -1
  180. package/dist/transfer/backup.js +1 -1
  181. package/dist/transfer/capsule-export.js +2 -2
  182. package/dist/transfer/types.d.ts +66 -66
  183. package/dist/verified-recall.js +10 -10
  184. package/package.json +2 -2
  185. package/src/calibration.ts +3 -1
  186. package/src/census-validation.ts +25 -0
  187. package/src/coding/architecture-surfaces.test.ts +9 -10
  188. package/src/coding/architecture-surfaces.ts +2 -35
  189. package/src/coding/codegraph-runtime-loader.test.ts +228 -0
  190. package/src/coding/codegraph-runtime.ts +30 -50
  191. package/src/coding/codegraph-surfaces.ts +2 -2
  192. package/src/coding/coding-knowledge-config.ts +35 -1
  193. package/src/coding/decision-surfaces.test.ts +9 -10
  194. package/src/coding/decision-surfaces.ts +2 -40
  195. package/src/coding/session-delta-surfaces.test.ts +9 -10
  196. package/src/coding/session-delta-surfaces.ts +2 -33
  197. package/src/extraction-judge.ts +3 -1
  198. package/src/extraction-output-language.test.ts +116 -0
  199. package/src/extraction-prompt.ts +70 -1
  200. package/src/extraction.ts +23 -95
  201. package/src/offline-sync.ts +4 -4
  202. package/src/reconcile/census-parity.test.ts +152 -0
  203. package/src/reconcile/cursor.ts +5 -5
  204. package/src/reconcile/manifest.ts +4 -11
  205. package/src/reconcile/plan.ts +18 -15
  206. package/dist/chunk-EFKZT6AY.js.map +0 -1
  207. package/dist/chunk-IVXVLDNT.js.map +0 -1
  208. package/dist/chunk-L3CHRBHE.js.map +0 -1
  209. package/dist/chunk-R7TZ2HCS.js.map +0 -1
  210. package/dist/chunk-RYST72N5.js.map +0 -1
  211. package/dist/chunk-TWTUGCTY.js.map +0 -1
  212. package/dist/chunk-YXMHUBN2.js.map +0 -1
  213. package/dist/chunk-Z4N7SVVF.js.map +0 -1
  214. package/dist/{access-service-cKQrte9Z.d.ts → access-service-CocW74uA.d.ts} +64 -64
  215. /package/dist/{chunk-LEPOP46W.js.map → chunk-227UFSEQ.js.map} +0 -0
  216. /package/dist/{chunk-3Z5TGRFA.js.map → chunk-3NZAVWU5.js.map} +0 -0
  217. /package/dist/{chunk-I5FLIB2J.js.map → chunk-3S3PNR5H.js.map} +0 -0
  218. /package/dist/{chunk-R6UMNP5C.js.map → chunk-3T6HIIKA.js.map} +0 -0
  219. /package/dist/{chunk-77QZW2D6.js.map → chunk-3TDAA7VA.js.map} +0 -0
  220. /package/dist/{chunk-DXDAQZ2K.js.map → chunk-42TIIO2M.js.map} +0 -0
  221. /package/dist/{chunk-Y7COCXY2.js.map → chunk-4F67JJPG.js.map} +0 -0
  222. /package/dist/{chunk-PB4WVYGC.js.map → chunk-5S5DUJFJ.js.map} +0 -0
  223. /package/dist/{chunk-KYTRF64R.js.map → chunk-5SCFDQEJ.js.map} +0 -0
  224. /package/dist/{chunk-GG4DN63W.js.map → chunk-62Y5AGCM.js.map} +0 -0
  225. /package/dist/{chunk-KHCUVYCY.js.map → chunk-6UKSOXAO.js.map} +0 -0
  226. /package/dist/{chunk-F6JYBVL6.js.map → chunk-7ZAC2C2U.js.map} +0 -0
  227. /package/dist/{chunk-GF7RQWXC.js.map → chunk-AJRJDXYR.js.map} +0 -0
  228. /package/dist/{chunk-YEQCMA5L.js.map → chunk-BOSIHHOH.js.map} +0 -0
  229. /package/dist/{chunk-7LF2OHIJ.js.map → chunk-BRHKW7GY.js.map} +0 -0
  230. /package/dist/{chunk-LX4TNSAE.js.map → chunk-CBY54QYW.js.map} +0 -0
  231. /package/dist/{chunk-6YMEU6OQ.js.map → chunk-G72IPMR7.js.map} +0 -0
  232. /package/dist/{chunk-7AF243WZ.js.map → chunk-GBVRVYF4.js.map} +0 -0
  233. /package/dist/{chunk-GTD4Q62X.js.map → chunk-H4GQ2Y24.js.map} +0 -0
  234. /package/dist/{chunk-QI5RDDEL.js.map → chunk-HXZNTZ3Y.js.map} +0 -0
  235. /package/dist/{chunk-CIAI24TQ.js.map → chunk-IBZQQOM5.js.map} +0 -0
  236. /package/dist/{chunk-VPHSMJ2E.js.map → chunk-JPWSYHLB.js.map} +0 -0
  237. /package/dist/{chunk-X7LEDA74.js.map → chunk-KFB4YNXM.js.map} +0 -0
  238. /package/dist/{chunk-IPLYGWQF.js.map → chunk-KQAFEZQX.js.map} +0 -0
  239. /package/dist/{chunk-ZUPKNWRZ.js.map → chunk-MIUL6AUZ.js.map} +0 -0
  240. /package/dist/{chunk-EJY3HJMT.js.map → chunk-MYI3RKI6.js.map} +0 -0
  241. /package/dist/{chunk-NA56NSKL.js.map → chunk-OOJCXJBN.js.map} +0 -0
  242. /package/dist/{chunk-7KQB4EBS.js.map → chunk-OPPBTPUU.js.map} +0 -0
  243. /package/dist/{chunk-ERPBRXVZ.js.map → chunk-PZKWPXRF.js.map} +0 -0
  244. /package/dist/{chunk-FHKXVTM5.js.map → chunk-Q5XKKDFQ.js.map} +0 -0
  245. /package/dist/{chunk-QRWMS6SI.js.map → chunk-Q6OL23WM.js.map} +0 -0
  246. /package/dist/{chunk-OW7NVMGQ.js.map → chunk-QIZOU3FN.js.map} +0 -0
  247. /package/dist/{chunk-V3KIRICY.js.map → chunk-QQYHYW2N.js.map} +0 -0
  248. /package/dist/{chunk-YFCEBB5P.js.map → chunk-QTXNS3HB.js.map} +0 -0
  249. /package/dist/{chunk-2QSZNTDO.js.map → chunk-RKNJBZ55.js.map} +0 -0
  250. /package/dist/{chunk-E4KMY4KR.js.map → chunk-SNEUAZ6B.js.map} +0 -0
  251. /package/dist/{chunk-TSTI6A3A.js.map → chunk-SYJW273H.js.map} +0 -0
  252. /package/dist/{chunk-PBRCYYO7.js.map → chunk-ULZFZL7K.js.map} +0 -0
  253. /package/dist/{chunk-UGHCZS6K.js.map → chunk-VFZQXYN5.js.map} +0 -0
  254. /package/dist/{chunk-NKB43PGI.js.map → chunk-WZDTSBGQ.js.map} +0 -0
  255. /package/dist/{chunk-2UM6WHME.js.map → chunk-XE2QCCT2.js.map} +0 -0
  256. /package/dist/{chunk-FPEZ74F7.js.map → chunk-XNJQZLAP.js.map} +0 -0
  257. /package/dist/{chunk-SYVGVK4S.js.map → chunk-XTMYB2HY.js.map} +0 -0
  258. /package/dist/{chunk-OETHJBAL.js.map → chunk-XV6PUXJ5.js.map} +0 -0
  259. /package/dist/{chunk-UCLMKNHA.js.map → chunk-YIMV2KYM.js.map} +0 -0
  260. /package/dist/{chunk-DYZR3Z6D.js.map → chunk-YMQKPSB2.js.map} +0 -0
  261. /package/dist/{chunk-AYVCKGA6.js.map → chunk-YTXNDEUS.js.map} +0 -0
  262. /package/dist/{first-start-migration-4NETATFF.js.map → first-start-migration-Q2VB2E2D.js.map} +0 -0
@@ -3,21 +3,21 @@ import {
3
3
  blendGraphExpandedRecallScore,
4
4
  graphPathRelativeToStorage,
5
5
  mergeGraphExpandedResults
6
- } from "./chunk-OETHJBAL.js";
7
- import "./chunk-Y7COCXY2.js";
8
- import "./chunk-PB4WVYGC.js";
9
- import "./chunk-LX4TNSAE.js";
10
- import "./chunk-I74SUMNI.js";
11
- import "./chunk-ILNPU5W5.js";
12
- import "./chunk-7HYPN2GC.js";
6
+ } from "./chunk-XV6PUXJ5.js";
7
+ import "./chunk-4F67JJPG.js";
8
+ import "./chunk-5S5DUJFJ.js";
13
9
  import {
14
10
  formatCompressionGuidelinesForRecall
15
11
  } from "./chunk-UXREWVW4.js";
12
+ import "./chunk-CBY54QYW.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-KBL3JJR6.js";
18
- import "./chunk-FQ7HAWWC.js";
19
17
  import "./chunk-VDC6RZI4.js";
20
18
  import "./chunk-UWK5OXUJ.js";
19
+ import "./chunk-KBL3JJR6.js";
20
+ import "./chunk-FQ7HAWWC.js";
21
21
  import "./chunk-M4AHBM72.js";
22
22
  import "./chunk-TPDBFYEG.js";
23
23
  import "./chunk-UXPUUL3G.js";
@@ -29,43 +29,44 @@ import "./chunk-V5OCT34X.js";
29
29
  import "./chunk-TECVW3JP.js";
30
30
  import "./chunk-C5JF6EZ7.js";
31
31
  import "./chunk-KWIGDKM2.js";
32
- import "./chunk-E4KMY4KR.js";
32
+ import "./chunk-SNEUAZ6B.js";
33
33
  import "./chunk-VI637ILW.js";
34
34
  import "./chunk-47DU4SGJ.js";
35
35
  import "./chunk-SEF4IOFE.js";
36
+ import "./chunk-EGBDFJ36.js";
36
37
  import "./chunk-ECZU5BJH.js";
37
38
  import "./chunk-UHGBNIOS.js";
38
39
  import "./chunk-2NKY7OC6.js";
39
40
  import "./chunk-4EX5WZ4M.js";
40
41
  import "./chunk-YRFAYOFQ.js";
41
- import "./chunk-EGBDFJ36.js";
42
42
  import "./chunk-EUYWQ7TS.js";
43
43
  import "./chunk-6DNMUYEE.js";
44
44
  import "./chunk-T67LUYCR.js";
45
45
  import "./chunk-ODZKV2F7.js";
46
+ import "./chunk-QJ622LTI.js";
47
+ import "./chunk-ZOKZIR5K.js";
46
48
  import "./chunk-5IZL4DCV.js";
47
49
  import "./chunk-UYCIS6V5.js";
50
+ import "./chunk-KATEWTQJ.js";
48
51
  import "./chunk-LUDXM7MD.js";
49
52
  import "./chunk-6TCXIRP5.js";
50
- import "./chunk-QJ622LTI.js";
51
- import "./chunk-ZOKZIR5K.js";
52
53
  import "./chunk-X7XN6YU4.js";
53
- import "./chunk-KATEWTQJ.js";
54
+ import "./chunk-D3V3UMET.js";
54
55
  import "./chunk-YDBIWGNI.js";
55
56
  import "./chunk-PRDJMOST.js";
56
- import "./chunk-D3V3UMET.js";
57
57
  import "./chunk-ZZTOURJI.js";
58
58
  import "./chunk-ROI7BK7H.js";
59
59
  import "./chunk-23L3IXFD.js";
60
60
  import "./chunk-3GPTTA4J.js";
61
61
  import "./chunk-H63EDPFJ.js";
62
62
  import "./chunk-HTIIXNJQ.js";
63
+ import "./chunk-XXSOVESA.js";
63
64
  import "./chunk-PHRLJFWZ.js";
64
65
  import "./chunk-64NJRYU2.js";
65
66
  import "./chunk-MEW53VQJ.js";
66
67
  import "./chunk-YAZNBMNF.js";
67
- import "./chunk-XXSOVESA.js";
68
- import "./chunk-YXMHUBN2.js";
68
+ import "./chunk-OH7QLI6W.js";
69
+ import "./chunk-TOP3FSDW.js";
69
70
  import "./chunk-4RA3C3EV.js";
70
71
  import "./chunk-RWMSMTQP.js";
71
72
  import "./chunk-4NZHHGVL.js";
@@ -75,13 +76,12 @@ import "./chunk-WLZYGLJ4.js";
75
76
  import "./chunk-SZ4HFZKB.js";
76
77
  import "./chunk-4POAMKV6.js";
77
78
  import "./chunk-WAS4HV46.js";
78
- import "./chunk-OH7QLI6W.js";
79
79
  import "./chunk-BLDBT6HZ.js";
80
80
  import "./chunk-PWFCHOB3.js";
81
- import "./chunk-TWTUGCTY.js";
82
- import "./chunk-6YMEU6OQ.js";
83
- import "./chunk-R7TZ2HCS.js";
81
+ import "./chunk-3YTTAGPB.js";
82
+ import "./chunk-G72IPMR7.js";
84
83
  import "./chunk-VL35ZFSZ.js";
84
+ import "./chunk-T3GIETKV.js";
85
85
  import "./chunk-645WOU5I.js";
86
86
  import "./chunk-BUYVPUEM.js";
87
87
  import "./chunk-IAIPNEHD.js";
@@ -89,28 +89,27 @@ import "./chunk-TVIVY7KU.js";
89
89
  import "./chunk-YVVQUAOO.js";
90
90
  import "./chunk-LUPVCGYK.js";
91
91
  import "./chunk-DGFU5MSX.js";
92
- import "./chunk-PBRCYYO7.js";
92
+ import "./chunk-DFEODULB.js";
93
+ import "./chunk-ULZFZL7K.js";
93
94
  import "./chunk-GKUA4MGB.js";
94
95
  import "./chunk-5AUY5Z5E.js";
95
96
  import "./chunk-SVH57F5Z.js";
96
- import "./chunk-T3GIETKV.js";
97
97
  import "./chunk-J6QIAYNR.js";
98
98
  import "./chunk-VEWZZM3H.js";
99
99
  import "./chunk-6NAPOLRO.js";
100
100
  import "./chunk-PYIR4SSB.js";
101
- import "./chunk-DFEODULB.js";
102
- import "./chunk-SYVGVK4S.js";
101
+ import "./chunk-XTMYB2HY.js";
103
102
  import "./chunk-3I4FUAVJ.js";
104
- import "./chunk-F6JYBVL6.js";
103
+ import "./chunk-7ZAC2C2U.js";
105
104
  import "./chunk-MMACM5G2.js";
106
105
  import "./chunk-54BGIBCR.js";
107
106
  import "./chunk-H4CKS5B2.js";
108
107
  import "./chunk-FXZTL7F7.js";
108
+ import "./chunk-PYHOAXTI.js";
109
109
  import "./chunk-UP6MOYCB.js";
110
110
  import "./chunk-BV2TIZ4F.js";
111
- import "./chunk-HDDRVXX4.js";
112
- import "./chunk-PYHOAXTI.js";
113
111
  import "./chunk-Z734BLO3.js";
112
+ import "./chunk-HDDRVXX4.js";
114
113
  import "./chunk-OZKVVUJB.js";
115
114
  import "./chunk-2DL3OFLD.js";
116
115
  import "./chunk-G4IAEX6D.js";
@@ -122,52 +121,53 @@ import "./chunk-AJVLDJU6.js";
122
121
  import "./chunk-EEC4PCG5.js";
123
122
  import "./chunk-PYIFUBRK.js";
124
123
  import "./chunk-IIFFC3RL.js";
125
- import "./chunk-QRWMS6SI.js";
124
+ import "./chunk-Q6OL23WM.js";
126
125
  import "./chunk-DQTCGVFK.js";
127
126
  import "./chunk-AXFWMRKI.js";
128
127
  import "./chunk-YLBE6PLR.js";
129
128
  import "./chunk-CDKHKZL5.js";
130
129
  import "./chunk-HSSERO3E.js";
131
130
  import "./chunk-NOUJNHWG.js";
132
- import "./chunk-2UM6WHME.js";
131
+ import "./chunk-XE2QCCT2.js";
133
132
  import "./chunk-HL4DB7TO.js";
134
133
  import "./chunk-HDQUQBPW.js";
135
134
  import "./chunk-6FC3IZ26.js";
136
135
  import "./chunk-OJP3N7UK.js";
137
- import "./chunk-7LF2OHIJ.js";
138
- import "./chunk-R6UMNP5C.js";
139
- import "./chunk-OW7NVMGQ.js";
136
+ import "./chunk-BRHKW7GY.js";
137
+ import "./chunk-3T6HIIKA.js";
138
+ import "./chunk-QIZOU3FN.js";
140
139
  import "./chunk-NRLELHAY.js";
141
140
  import "./chunk-AM4T6CHX.js";
142
141
  import "./chunk-7DRSWPUV.js";
143
142
  import "./chunk-3T74IZB3.js";
144
143
  import "./chunk-2LA3H54D.js";
145
- import "./chunk-3Z5TGRFA.js";
146
- import "./chunk-V3KIRICY.js";
144
+ import "./chunk-3NZAVWU5.js";
145
+ import "./chunk-QQYHYW2N.js";
147
146
  import "./chunk-KFY3SGN7.js";
148
147
  import "./chunk-CMTINOFS.js";
149
- import "./chunk-UGHCZS6K.js";
148
+ import "./chunk-VFZQXYN5.js";
150
149
  import "./chunk-RMMVQQA6.js";
151
150
  import "./chunk-UR6PBX2J.js";
152
151
  import "./chunk-6GUG4YNM.js";
153
152
  import "./chunk-JXS5PDQ7.js";
154
- import "./chunk-7AF243WZ.js";
153
+ import "./chunk-GBVRVYF4.js";
155
154
  import "./chunk-C7SRUWBW.js";
156
155
  import "./chunk-OZKOPQCM.js";
157
156
  import "./chunk-MCA2X4WH.js";
157
+ import "./chunk-ACPCA4NO.js";
158
158
  import "./chunk-YNDLCWXS.js";
159
159
  import "./chunk-AUDJPF4N.js";
160
160
  import "./chunk-44442YCH.js";
161
161
  import "./chunk-Y4Z4I6WK.js";
162
- import "./chunk-KHCUVYCY.js";
162
+ import "./chunk-6UKSOXAO.js";
163
163
  import "./chunk-KJTKLXTH.js";
164
164
  import "./chunk-2DQ2XREU.js";
165
- import "./chunk-ACPCA4NO.js";
166
165
  import "./chunk-OKTXM5H4.js";
167
- import "./chunk-7KQB4EBS.js";
166
+ import "./chunk-OPPBTPUU.js";
168
167
  import "./chunk-NOB2T2FC.js";
169
168
  import "./chunk-CUDSA46O.js";
170
- import "./chunk-DXDAQZ2K.js";
169
+ import "./chunk-JG22O53B.js";
170
+ import "./chunk-42TIIO2M.js";
171
171
  import "./chunk-5JMAGU26.js";
172
172
  import "./chunk-MYVPLJOO.js";
173
173
  import "./chunk-H3FZVNRN.js";
@@ -178,7 +178,7 @@ import "./chunk-2GBFKHBZ.js";
178
178
  import "./chunk-6TBIWIAG.js";
179
179
  import "./chunk-2AD5SXO4.js";
180
180
  import "./chunk-YDPAE2RD.js";
181
- import "./chunk-RYST72N5.js";
181
+ import "./chunk-IINVXO3U.js";
182
182
  import "./chunk-ZKOPY4WW.js";
183
183
  import "./chunk-62OKGIJA.js";
184
184
  import "./chunk-7RAJ3GXO.js";
@@ -196,34 +196,34 @@ import "./chunk-KFZY2OFH.js";
196
196
  import "./chunk-QW27DOHG.js";
197
197
  import "./chunk-C6WMSXCJ.js";
198
198
  import "./chunk-KD3QD3A5.js";
199
- import "./chunk-TSTI6A3A.js";
199
+ import "./chunk-SYJW273H.js";
200
200
  import "./chunk-V7IZKJI3.js";
201
201
  import "./chunk-SEDEKFYQ.js";
202
- import "./chunk-2QSZNTDO.js";
202
+ import "./chunk-RKNJBZ55.js";
203
+ import "./chunk-J64TK33U.js";
203
204
  import "./chunk-RSUYKGGZ.js";
204
205
  import "./chunk-42NQ7AVG.js";
205
206
  import "./chunk-TMSXWOBZ.js";
206
- import "./chunk-TB6CBZ5V.js";
207
- import "./chunk-J64TK33U.js";
208
207
  import "./chunk-7RXCMVFQ.js";
208
+ import "./chunk-TB6CBZ5V.js";
209
209
  import "./chunk-3HSRWJTC.js";
210
- import "./chunk-NA56NSKL.js";
211
- import "./chunk-UCLMKNHA.js";
212
- import "./chunk-VPHSMJ2E.js";
213
- import "./chunk-X7LEDA74.js";
214
- import "./chunk-GTD4Q62X.js";
210
+ import "./chunk-OOJCXJBN.js";
211
+ import "./chunk-YIMV2KYM.js";
212
+ import "./chunk-JPWSYHLB.js";
213
+ import "./chunk-KFB4YNXM.js";
214
+ import "./chunk-H4GQ2Y24.js";
215
215
  import "./chunk-HIEWDJ2O.js";
216
216
  import "./chunk-A5KNZSNA.js";
217
217
  import "./chunk-D24OXEPB.js";
218
- import "./chunk-DYZR3Z6D.js";
219
- import "./chunk-NKB43PGI.js";
220
- import "./chunk-I5FLIB2J.js";
218
+ import "./chunk-YMQKPSB2.js";
219
+ import "./chunk-WZDTSBGQ.js";
220
+ import "./chunk-3S3PNR5H.js";
221
221
  import "./chunk-7T4TOGMS.js";
222
222
  import "./chunk-7YQ6ESEA.js";
223
- import "./chunk-CIAI24TQ.js";
224
- import "./chunk-QI5RDDEL.js";
225
- import "./chunk-LTBKKSCX.js";
223
+ import "./chunk-IBZQQOM5.js";
224
+ import "./chunk-HXZNTZ3Y.js";
226
225
  import "./chunk-EQWEIIKQ.js";
226
+ import "./chunk-LTBKKSCX.js";
227
227
  import "./chunk-7BY7V4YX.js";
228
228
  import "./chunk-MDVBCPOS.js";
229
229
  import "./chunk-35NN3ZFA.js";
@@ -236,12 +236,12 @@ import "./chunk-GZ3R6XOE.js";
236
236
  import "./chunk-CK5KOVHW.js";
237
237
  import "./chunk-DJUKBGAD.js";
238
238
  import "./chunk-G73MCJKL.js";
239
- import "./chunk-ERPBRXVZ.js";
239
+ import "./chunk-PZKWPXRF.js";
240
240
  import {
241
241
  filterRecallCandidates,
242
242
  hasIdentityRecoveryIntent,
243
243
  resolveEffectiveIdentityInjectionMode
244
- } from "./chunk-IVXVLDNT.js";
244
+ } from "./chunk-WKJTMXME.js";
245
245
  import "./chunk-GDASG7NC.js";
246
246
  import "./chunk-GDB4J2H3.js";
247
247
  import "./chunk-PMVPCZJZ.js";
@@ -256,13 +256,13 @@ import "./chunk-H7XKCNR6.js";
256
256
  import "./chunk-3F3CVVDS.js";
257
257
  import "./chunk-SOBJ6NEY.js";
258
258
  import "./chunk-QICOU4RY.js";
259
- import "./chunk-YFCEBB5P.js";
259
+ import "./chunk-QTXNS3HB.js";
260
260
  import "./chunk-CVILPI77.js";
261
261
  import "./chunk-2HIJHXB3.js";
262
262
  import "./chunk-AQEJKOKI.js";
263
263
  import "./chunk-HTP6XRUI.js";
264
- import "./chunk-EIR5VLIH.js";
265
264
  import "./chunk-IISBCCWR.js";
265
+ import "./chunk-EIR5VLIH.js";
266
266
  import "./chunk-PD66CVSD.js";
267
267
  import "./chunk-LTHVM4XN.js";
268
268
  import "./chunk-EI6V5UXY.js";
@@ -277,10 +277,10 @@ import "./chunk-QDW3E4RD.js";
277
277
  import "./chunk-NS5ETDYD.js";
278
278
  import "./chunk-C37ZRXX7.js";
279
279
  import "./chunk-7ZNJN5WZ.js";
280
- import "./chunk-77QZW2D6.js";
281
- import "./chunk-EJY3HJMT.js";
282
- import "./chunk-ZUPKNWRZ.js";
283
- import "./chunk-KYTRF64R.js";
280
+ import "./chunk-3TDAA7VA.js";
281
+ import "./chunk-MYI3RKI6.js";
282
+ import "./chunk-MIUL6AUZ.js";
283
+ import "./chunk-5SCFDQEJ.js";
284
284
  import "./chunk-UFGFMWAD.js";
285
285
  import "./chunk-YMOPYG3K.js";
286
286
  import "./chunk-2LSZVONP.js";
@@ -329,16 +329,16 @@ import "./chunk-CSAKJVXW.js";
329
329
  import "./chunk-K2XUWZBM.js";
330
330
  import "./chunk-OD4FM2U7.js";
331
331
  import "./chunk-ZY2MNJR6.js";
332
- import "./chunk-YEQCMA5L.js";
332
+ import "./chunk-BOSIHHOH.js";
333
333
  import "./chunk-RDFF2NAU.js";
334
334
  import "./chunk-GPFZFCRN.js";
335
- import "./chunk-AYVCKGA6.js";
336
- import "./chunk-FHKXVTM5.js";
337
- import "./chunk-46WM6JX2.js";
335
+ import "./chunk-YTXNDEUS.js";
336
+ import "./chunk-Q5XKKDFQ.js";
338
337
  import "./chunk-UHVXE24Y.js";
338
+ import "./chunk-46WM6JX2.js";
339
339
  import "./chunk-SXIMQLGV.js";
340
- import "./chunk-GF7RQWXC.js";
341
- import "./chunk-GG4DN63W.js";
340
+ import "./chunk-AJRJDXYR.js";
341
+ import "./chunk-62Y5AGCM.js";
342
342
  import "./chunk-OQIRBGUU.js";
343
343
  import "./chunk-VANZKHTN.js";
344
344
  import "./chunk-CYEPCZN5.js";
@@ -347,15 +347,15 @@ import "./chunk-VYISFWVX.js";
347
347
  import "./chunk-W7IGLX4G.js";
348
348
  import "./chunk-6KTXE6A3.js";
349
349
  import "./chunk-GUMZC2BO.js";
350
- import "./chunk-LEPOP46W.js";
350
+ import "./chunk-227UFSEQ.js";
351
+ import "./chunk-ET356KSB.js";
351
352
  import "./chunk-72A4L5JJ.js";
352
353
  import "./chunk-A7Q43EUZ.js";
353
- import "./chunk-ET356KSB.js";
354
354
  import "./chunk-S2V7RUCL.js";
355
355
  import "./chunk-AR253JBM.js";
356
+ import "./chunk-SCU65EZI.js";
356
357
  import "./chunk-PO7NXBG2.js";
357
358
  import "./chunk-S2HLHAZ4.js";
358
- import "./chunk-SCU65EZI.js";
359
359
  import "./chunk-DM2T26WE.js";
360
360
  import "./chunk-LDXUBPMO.js";
361
361
  import "./chunk-UG6VXIOK.js";
@@ -363,16 +363,16 @@ import "./chunk-AAD2ZS6P.js";
363
363
  import "./chunk-MUJ4QFUQ.js";
364
364
  import "./chunk-LCU5R6TQ.js";
365
365
  import "./chunk-BT7NVCML.js";
366
- import "./chunk-YXZG5TVN.js";
367
366
  import "./chunk-3ONXXHQO.js";
367
+ import "./chunk-YXZG5TVN.js";
368
368
  import "./chunk-5GINB5LC.js";
369
- import "./chunk-G7D6GZ5J.js";
370
369
  import "./chunk-UFKPQBXH.js";
371
370
  import "./chunk-XCB6QDL6.js";
372
371
  import "./chunk-RBOJCG4T.js";
373
372
  import "./chunk-ZVPVTPGI.js";
374
373
  import "./chunk-5WITETWU.js";
375
374
  import "./chunk-6CIAGZ6X.js";
375
+ import "./chunk-G7D6GZ5J.js";
376
376
  import "./chunk-VYEPACWY.js";
377
377
  import "./chunk-URS5GSM7.js";
378
378
  import "./chunk-ZLQ37WJX.js";
@@ -387,6 +387,7 @@ import "./chunk-RGMVMVMF.js";
387
387
  import "./chunk-N7RWREIQ.js";
388
388
  import "./chunk-UBCBDJOB.js";
389
389
  import "./chunk-TOTT6S2V.js";
390
+ import "./chunk-FEHIOYML.js";
390
391
  import "./chunk-P32IDSHD.js";
391
392
  import "./chunk-WNIUPHWV.js";
392
393
  import "./chunk-IJ6WHMFB.js";
@@ -403,10 +404,10 @@ import "./chunk-Z7L72ZHL.js";
403
404
  import "./chunk-4O4TKIXQ.js";
404
405
  import "./chunk-TBBDFYXW.js";
405
406
  import "./chunk-YCVB7X56.js";
406
- import "./chunk-IPLYGWQF.js";
407
- import "./chunk-J4EB7DNW.js";
407
+ import "./chunk-KQAFEZQX.js";
408
408
  import "./chunk-WEHSQBFR.js";
409
409
  import "./chunk-X7Y7WX73.js";
410
+ import "./chunk-J4EB7DNW.js";
410
411
  import "./chunk-BJMBJZ2Y.js";
411
412
  import "./chunk-UKJAGEXH.js";
412
413
  import "./chunk-FP2373TW.js";
@@ -417,9 +418,9 @@ import "./chunk-3QL24R5Y.js";
417
418
  import "./chunk-SYOIVK7K.js";
418
419
  import "./chunk-ZN7SMKAK.js";
419
420
  import "./chunk-LNEWDF2A.js";
420
- import "./chunk-FPEZ74F7.js";
421
- import "./chunk-EFKZT6AY.js";
422
- import "./chunk-L3CHRBHE.js";
421
+ import "./chunk-XNJQZLAP.js";
422
+ import "./chunk-T42L3S6A.js";
423
+ import "./chunk-ZRUEP4IK.js";
423
424
  import "./chunk-HZNYJN77.js";
424
425
  import "./chunk-Q57GOHLF.js";
425
426
  import "./chunk-AW4QUFQF.js";
@@ -439,11 +440,12 @@ import "./chunk-JDSVLVCG.js";
439
440
  import "./chunk-HBVPYRDW.js";
440
441
  import "./chunk-5GKPFL3S.js";
441
442
  import "./chunk-JAKIDQB2.js";
442
- import "./chunk-Z4N7SVVF.js";
443
+ import "./chunk-2L7DKNVE.js";
443
444
  import "./chunk-UI3NYK34.js";
444
445
  import "./chunk-GCGJW34D.js";
445
- import "./chunk-AREGMX2J.js";
446
446
  import "./chunk-LC2BDILZ.js";
447
+ import "./chunk-AREGMX2J.js";
448
+ import "./chunk-LQWOFU6L.js";
447
449
  import "./chunk-P7FMDTKL.js";
448
450
  import "./chunk-MZWSOLMT.js";
449
451
  import "./chunk-MRV7VSQK.js";
@@ -1,5 +1,5 @@
1
1
  import { IncomingMessage, ServerResponse } from 'node:http';
2
- import { f as EngramAccessService } from './access-service-cKQrte9Z.js';
2
+ import { f as EngramAccessService } from './access-service-CocW74uA.js';
3
3
 
4
4
  declare const SUPPORT_PASSPORT_PUBLIC_HTTP_ROUTES: readonly [{
5
5
  readonly method: "GET";
@@ -1,3 +1,10 @@
1
+ import {
2
+ semanticAgreementKey
3
+ } from "../chunk-ZRUEP4IK.js";
4
+ import "../chunk-HBVPYRDW.js";
5
+ import "../chunk-GCGJW34D.js";
6
+ import "../chunk-LQWOFU6L.js";
7
+ import "../chunk-VUFL7X3H.js";
1
8
  import "../chunk-PZ5AY32C.js";
2
9
 
3
10
  // src/reconcile/cursor.ts
@@ -45,9 +52,6 @@ function digestAfterReconcile(entry) {
45
52
  if (entry.localSha256 && entry.peerSha256 && entry.localSha256 !== entry.peerSha256) return void 0;
46
53
  return entry.localSha256 ?? entry.peerSha256;
47
54
  }
48
- function semanticAgreementKey(agreement) {
49
- return `${agreement.local.path}\0${agreement.peer.path}`;
50
- }
51
55
  function deriveConvergeCursorBase(entries, namespace, priorSemanticAgreements = []) {
52
56
  const baseFiles = [];
53
57
  const semanticAgreementsByPathPair = new Map(
@@ -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 type { ReconcilePlanEntry, ReconcileSemanticAgreement } 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\nfunction semanticAgreementKey(agreement: ReconcileSemanticAgreement): string {\n return `${agreement.local.path}\\0${agreement.peer.path}`;\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\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":";;;;;;;;;;AAAA,SAAS,YAAY,kBAAkB;AACvC,YAAY,QAAQ;AACpB,YAAY,UAAU;AA2Bf,SAAS,yBAAyB,SAAyB;AAChE,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,OAAO;AAC3B,QAAI,WAAW;AACf,QAAI,WAAW;AACf,QAAI,SAAS;AACb,QAAI,OAAO;AACX,QAAI,WAAW,IAAI,SAAS,QAAQ,QAAQ,EAAE;AAC9C,WAAO,IAAI,SAAS,EAAE,QAAQ,OAAO,EAAE;AAAA,EACzC,QAAQ;AACN,WAAO,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EACnC;AACF;AAEO,SAAS,kBAAkB,SAAiB,WAA2B;AAC5E,QAAM,gBAAgB,yBAAyB,OAAO;AACtD,QAAM,eAAe,UAAU,KAAK,EAAE,YAAY;AAClD,SAAO,WAAW,QAAQ,EACvB,OAAO,GAAG,aAAa,KAAK,YAAY,EAAE,EAC1C,OAAO,KAAK,EACZ,MAAM,GAAG,EAAE;AAChB;AAEO,SAAS,0BACd,WACA,SACA,WACQ;AACR,QAAM,MAAM,kBAAkB,SAAS,SAAS;AAChD,SAAY,UAAU,aAAQ,SAAS,GAAG,WAAW,SAAS,oBAAoB,GAAG,GAAG,OAAO;AACjG;AAEA,SAAS,2BAA2B,OAA8D;AAChG,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AACxE,QAAM,OAAO;AACb,MAAI,OAAO,KAAK,SAAS,YAAY,OAAO,KAAK,WAAW,SAAU,QAAO;AAC7E,SAAO,EAAE,MAAM,KAAK,MAAM,QAAQ,KAAK,OAAO;AAChD;AAEA,SAAS,qBAAqB,OAA+C;AAC3E,MAAI,MAAM,WAAW,OAAQ,QAAO,MAAM;AAC1C,MAAI,MAAM,WAAW,OAAQ,QAAO,MAAM;AAC1C,MAAI,MAAM,WAAW,YAAY;AAC/B,QAAI,MAAM,eAAe,aAAc,QAAO,MAAM;AACpD,QAAI,MAAM,eAAe,YAAa,QAAO,MAAM;AACnD,WAAO;AAAA,EACT;AACA,MAAI,MAAM,WAAW,YAAa,QAAO;AACzC,MAAI,MAAM,eAAe,MAAM,cAAc,MAAM,gBAAgB,MAAM,WAAY,QAAO;AAC5F,SAAO,MAAM,eAAe,MAAM;AACpC;AAEO,SAAS,yBACd,SACA,WACA,0BAAiE,CAAC,GACH;AAC/D,QAAM,YAAuC,CAAC;AAC9C,QAAM,+BAA+B,IAAI;AAAA,IACvC,wBAAwB,IAAI,CAAC,cAAc,CAAC,qBAAqB,SAAS,GAAG,SAAS,CAAC;AAAA,EACzF;AACA,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,cAAc,UAAW;AACnC,QAAI,MAAM,mBAAmB;AAC3B,mCAA6B,IAAI,qBAAqB,MAAM,iBAAiB,GAAG,MAAM,iBAAiB;AACvG;AAAA,IACF;AACA,UAAM,SAAS,qBAAqB,KAAK;AACzC,QAAI,OAAQ,WAAU,KAAK,EAAE,MAAM,MAAM,MAAM,OAAO,CAAC;AAAA,EACzD;AACA,YAAU,KAAK,CAAC,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC;AACnE,QAAM,qBAAqB,CAAC,GAAG,6BAA6B,OAAO,CAAC;AACpE,qBAAmB;AAAA,IAAK,CAAC,MAAM,UAC7B,KAAK,MAAM,KAAK,cAAc,MAAM,MAAM,IAAI,KAAK,KAAK,KAAK,KAAK,cAAc,MAAM,KAAK,IAAI;AAAA,EACjG;AACA,SAAO,EAAE,WAAW,mBAAmB;AACzC;AAEO,SAAS,wBAAwB,OAAqC;AAC3E,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AACA,QAAM,MAAM;AACZ,MAAI,IAAI,YAAY,GAAG;AACrB,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AACA,MAAI,OAAO,IAAI,YAAY,YAAY,CAAC,IAAI,QAAQ,KAAK,GAAG;AAC1D,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AACA,MAAI,OAAO,IAAI,cAAc,YAAY,CAAC,IAAI,UAAU,KAAK,GAAG;AAC9D,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AACA,QAAM,YAAuC,CAAC;AAC9C,MAAI,MAAM,QAAQ,IAAI,SAAS,GAAG;AAChC,eAAW,QAAQ,IAAI,WAAW;AAChC,UAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,cAAM,WAAW;AACjB,YAAI,OAAO,SAAS,SAAS,YAAY,OAAO,SAAS,WAAW,UAAU;AAC5E,oBAAU,KAAK;AAAA,YACb,MAAM,SAAS;AAAA,YACf,QAAQ,SAAS;AAAA,YACjB,SAAS,OAAO,SAAS,YAAY,WAAW,SAAS,UAAU;AAAA,YACnE,OAAO,OAAO,SAAS,UAAU,WAAW,SAAS,QAAQ;AAAA,UAC/D,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,qBAAmD,CAAC;AAC1D,MAAI,MAAM,QAAQ,IAAI,kBAAkB,GAAG;AACzC,eAAW,QAAQ,IAAI,oBAAoB;AACzC,UAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,EAAG;AAC9D,YAAM,YAAY;AAClB,YAAM,QAAQ,2BAA2B,UAAU,KAAK;AACxD,YAAM,OAAO,2BAA2B,UAAU,IAAI;AACtD,UAAI,SAAS,KAAM,oBAAmB,KAAK,EAAE,OAAO,KAAK,CAAC;AAAA,IAC5D;AAAA,EACF;AACA,QAAM,iBAA2B,CAAC;AAClC,MAAI,MAAM,QAAQ,IAAI,cAAc,GAAG;AACrC,eAAW,QAAQ,IAAI,gBAAgB;AACrC,UAAI,OAAO,SAAS,UAAU;AAC5B,uBAAe,KAAK,IAAI;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACA,QAAM,mBAA4C,CAAC;AACnD,MAAI,MAAM,QAAQ,IAAI,gBAAgB,GAAG;AACvC,QAAI,IAAI,iBAAiB,SAAS,OAAO,EAAG,kBAAiB,KAAK,OAAO;AACzE,QAAI,IAAI,iBAAiB,SAAS,UAAU,EAAG,kBAAiB,KAAK,UAAU;AAAA,EACjF;AACA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,IAAI,QAAQ,KAAK;AAAA,IAC1B,WAAW,IAAI,UAAU,KAAK;AAAA,IAC9B,iBAAiB,OAAO,IAAI,oBAAoB,WAAW,IAAI,kBAAkB;AAAA,IACjF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,mBACpB,YACqC;AACrC,MAAI;AACF,UAAM,MAAM,MAAS,YAAc,aAAQ,UAAU,GAAG,OAAO;AAC/D,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,wBAAwB,MAAM;AAAA,EACvC,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,SAAU,QAAO;AAC/D,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,oBACpB,YACA,QACe;AACf,QAAM,aAAa,wBAAwB,MAAM;AACjD,QAAM,SAAc,aAAQ,UAAU;AACtC,QAAS,SAAW,aAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,QAAM,MAAW;AAAA,IACV,aAAQ,MAAM;AAAA,IACnB,oBAAoB,QAAQ,GAAG,IAAI,WAAW,CAAC;AAAA,EACjD;AACA,QAAS,aAAU,KAAK,KAAK,UAAU,YAAY,MAAM,CAAC,IAAI,MAAM,OAAO;AAC3E,MAAI;AACF,UAAS,UAAO,KAAK,MAAM;AAAA,EAC7B,SAAS,OAAO;AACd,UAAS,UAAO,GAAG,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACnC,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,2BACpB,YACA,SAKe;AACf,QAAM,UAAU,MAAM,mBAAmB,UAAU;AACnD,QAAM,mBAAmB,IAAI,IAAI,SAAS,oBAAoB,CAAC,CAAC;AAChE,mBAAiB,IAAI,QAAQ,MAAM;AACnC,QAAM,oBAAoB,YAAY;AAAA,IACpC,SAAS;AAAA,IACT,SAAS,SAAS,WAAW,QAAQ;AAAA,IACrC,WAAW,SAAS,aAAa,QAAQ;AAAA,IACzC,iBAAiB,SAAS;AAAA,IAC1B,WAAW,SAAS,aAAa,CAAC;AAAA,IAClC,oBAAoB,SAAS,sBAAsB,CAAC;AAAA,IACpD,gBAAgB,SAAS,kBAAkB,CAAC;AAAA,IAC5C,kBAAkB,CAAC,GAAG,gBAAgB,EAAE,KAAK;AAAA,EAC/C,CAAC;AACH;AAEA,eAAsB,4BACpB,YACA,QACe;AACf,QAAM,UAAU,MAAM,mBAAmB,UAAU;AACnD,MAAI,CAAC,SAAS,kBAAkB,SAAS,MAAM,EAAG;AAClD,QAAM,oBAAoB,YAAY;AAAA,IACpC,GAAG;AAAA,IACH,kBAAkB,QAAQ,iBAAiB,OAAO,CAAC,YAAY,YAAY,MAAM;AAAA,EACnF,CAAC;AACH;","names":[]}
@@ -4,8 +4,8 @@ import {
4
4
  buildReconcileManifest,
5
5
  buildReconcileManifestFile,
6
6
  collapseActiveFactDuplicates
7
- } from "../chunk-EFKZT6AY.js";
8
- import "../chunk-L3CHRBHE.js";
7
+ } from "../chunk-T42L3S6A.js";
8
+ import "../chunk-ZRUEP4IK.js";
9
9
  import "../chunk-J6A3CX5N.js";
10
10
  import "../chunk-7RJUVTVF.js";
11
11
  import "../chunk-JOEJG4SD.js";
@@ -15,12 +15,8 @@ import "../chunk-JDSVLVCG.js";
15
15
  import "../chunk-HBVPYRDW.js";
16
16
  import "../chunk-5GKPFL3S.js";
17
17
  import "../chunk-JAKIDQB2.js";
18
- import "../chunk-Z4N7SVVF.js";
19
- import "../chunk-UI3NYK34.js";
20
18
  import "../chunk-GCGJW34D.js";
21
- import "../chunk-AREGMX2J.js";
22
- import "../chunk-LC2BDILZ.js";
23
- import "../chunk-P7FMDTKL.js";
19
+ import "../chunk-LQWOFU6L.js";
24
20
  import "../chunk-VUFL7X3H.js";
25
21
  import "../chunk-XQ3HXAQH.js";
26
22
  import "../chunk-A6XUJE5D.js";
@@ -170,6 +170,20 @@ interface ReconcileOptions {
170
170
  declare class ReconcilePlanInputError extends Error {
171
171
  constructor(message: string);
172
172
  }
173
+ /**
174
+ * Total ordering for plan entries (§12): namespace, then path. Both are unique
175
+ * per entry, so equal keys are impossible and the comparator never has to
176
+ * return 0 for distinct rows — the output is byte-identical across runs, which
177
+ * is what makes a convergence report diffable. Cursor and manifest sort with
178
+ * this same export; a local copy on either side is how ordering drifts (§2477).
179
+ */
180
+ declare function compareReconcilePlanEntries(a: ReconcilePlanEntry, b: ReconcilePlanEntry): number;
181
+ /**
182
+ * Identity of a semantic-duplicate pair: the ordered (local, peer) path pair.
183
+ * Cursor derivation and manifest collapse must key prior agreements with this
184
+ * same export or a stored cursor stops matching the plan that wrote it.
185
+ */
186
+ declare function semanticAgreementKey(agreement: ReconcileSemanticAgreement): string;
173
187
  /**
174
188
  * Plan one namespace. Exposed for callers that stream namespaces one at a time.
175
189
  *
@@ -190,4 +204,4 @@ declare function summarizeReconcilePlan(entries: readonly ReconcilePlanEntry[]):
190
204
  */
191
205
  declare function planReconciliation(namespaces: readonly ReconcileNamespaceInput[], options?: ReconcileOptions): ReconcilePlan;
192
206
 
193
- export { type ReconcileAction, type ReconcileConflictPolicy, type ReconcileFileState, type ReconcileNamespaceInput, type ReconcileNamespaceReport, type ReconcileOptions, type ReconcilePlan, type ReconcilePlanEntry, ReconcilePlanInputError, type ReconcileReason, type ReconcileResolution, type ReconcileSemanticAgreement, type ReconcileSemanticChange, type ReconcileSemanticFileState, planNamespaceReconciliation, planReconciliation, summarizeReconcilePlan };
207
+ export { type ReconcileAction, type ReconcileConflictPolicy, type ReconcileFileState, type ReconcileNamespaceInput, type ReconcileNamespaceReport, type ReconcileOptions, type ReconcilePlan, type ReconcilePlanEntry, ReconcilePlanInputError, type ReconcileReason, type ReconcileResolution, type ReconcileSemanticAgreement, type ReconcileSemanticChange, type ReconcileSemanticFileState, compareReconcilePlanEntries, planNamespaceReconciliation, planReconciliation, semanticAgreementKey, summarizeReconcilePlan };
@@ -1,26 +1,22 @@
1
1
  import {
2
2
  ReconcilePlanInputError,
3
+ compareReconcilePlanEntries,
3
4
  planNamespaceReconciliation,
4
5
  planReconciliation,
6
+ semanticAgreementKey,
5
7
  summarizeReconcilePlan
6
- } from "../chunk-L3CHRBHE.js";
8
+ } from "../chunk-ZRUEP4IK.js";
7
9
  import "../chunk-HBVPYRDW.js";
8
- import "../chunk-Z4N7SVVF.js";
9
- import "../chunk-UI3NYK34.js";
10
10
  import "../chunk-GCGJW34D.js";
11
- import "../chunk-AREGMX2J.js";
12
- import "../chunk-LC2BDILZ.js";
13
- import "../chunk-P7FMDTKL.js";
11
+ import "../chunk-LQWOFU6L.js";
14
12
  import "../chunk-VUFL7X3H.js";
15
- import "../chunk-XQ3HXAQH.js";
16
- import "../chunk-A6XUJE5D.js";
17
- import "../chunk-5UZXUTVO.js";
18
- import "../chunk-VS2IYZRU.js";
19
13
  import "../chunk-PZ5AY32C.js";
20
14
  export {
21
15
  ReconcilePlanInputError,
16
+ compareReconcilePlanEntries,
22
17
  planNamespaceReconciliation,
23
18
  planReconciliation,
19
+ semanticAgreementKey,
24
20
  summarizeReconcilePlan
25
21
  };
26
22
  //# sourceMappingURL=plan.js.map
@@ -4,12 +4,12 @@ import {
4
4
  recordResumeBundle,
5
5
  resolveResumeBundleDir,
6
6
  validateResumeBundle
7
- } from "./chunk-OW7NVMGQ.js";
7
+ } from "./chunk-QIZOU3FN.js";
8
8
  import "./chunk-NRLELHAY.js";
9
9
  import "./chunk-AM4T6CHX.js";
10
10
  import "./chunk-KFY3SGN7.js";
11
11
  import "./chunk-NOB2T2FC.js";
12
- import "./chunk-RYST72N5.js";
12
+ import "./chunk-IINVXO3U.js";
13
13
  import "./chunk-ZKOPY4WW.js";
14
14
  import "./chunk-62OKGIJA.js";
15
15
  import "./chunk-7RAJ3GXO.js";
@@ -27,6 +27,7 @@ import "./chunk-KFZY2OFH.js";
27
27
  import "./chunk-S4DDLTPX.js";
28
28
  import "./chunk-HTP6XRUI.js";
29
29
  import "./chunk-TOTT6S2V.js";
30
+ import "./chunk-FEHIOYML.js";
30
31
  import "./chunk-P32IDSHD.js";
31
32
  import "./chunk-WNIUPHWV.js";
32
33
  import "./chunk-IJ6WHMFB.js";
@@ -42,11 +43,12 @@ import "./chunk-YCVB7X56.js";
42
43
  import "./chunk-HBVPYRDW.js";
43
44
  import "./chunk-5GKPFL3S.js";
44
45
  import "./chunk-JAKIDQB2.js";
45
- import "./chunk-Z4N7SVVF.js";
46
+ import "./chunk-2L7DKNVE.js";
46
47
  import "./chunk-UI3NYK34.js";
47
48
  import "./chunk-GCGJW34D.js";
48
- import "./chunk-AREGMX2J.js";
49
49
  import "./chunk-LC2BDILZ.js";
50
+ import "./chunk-AREGMX2J.js";
51
+ import "./chunk-LQWOFU6L.js";
50
52
  import "./chunk-P7FMDTKL.js";
51
53
  import "./chunk-EYIEWJNI.js";
52
54
  import "./chunk-JUC24CTX.js";