@remnic/core 10.0.27 → 10.0.29

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 (372) hide show
  1. package/dist/access-admin-ops-surface.js +54 -53
  2. package/dist/access-authorization-probe.js +55 -54
  3. package/dist/access-boundary.js +54 -53
  4. package/dist/access-citation-namespace.js +3 -2
  5. package/dist/access-cli.js +106 -105
  6. package/dist/access-cli.js.map +1 -1
  7. package/dist/access-extraction-force-flush.js +54 -53
  8. package/dist/access-http-briefing.js +55 -54
  9. package/dist/access-http-query.js +56 -55
  10. package/dist/access-http.js +73 -72
  11. package/dist/access-identity-continuity-surface.js +54 -53
  12. package/dist/access-lcm-surface.js +54 -53
  13. package/dist/access-mcp.js +65 -64
  14. package/dist/access-namespace-preflight.js +54 -53
  15. package/dist/access-observe-write-category.js +11 -11
  16. package/dist/access-observe-write-surface.js +54 -53
  17. package/dist/access-offline-manifest.js +10 -10
  18. package/dist/access-operations-batch.js +56 -55
  19. package/dist/access-operations.js +63 -62
  20. package/dist/access-recall-concurrency.js +54 -53
  21. package/dist/access-recall-diagnostics.js +2 -2
  22. package/dist/access-recall-response.js +54 -53
  23. package/dist/access-recall-surface.js +54 -53
  24. package/dist/access-schema.js +6 -5
  25. package/dist/access-service.js +54 -53
  26. package/dist/access-surface-catalog.js +56 -55
  27. package/dist/access-surface-catalog.js.map +1 -1
  28. package/dist/active-recall.js +24 -23
  29. package/dist/active-recall.js.map +1 -1
  30. package/dist/{auto-sync-UQESPLCB.js → auto-sync-MX2AHVPQ.js} +8 -8
  31. package/dist/briefing.js +20 -19
  32. package/dist/buffer.js +8 -8
  33. package/dist/calibration.js +2 -2
  34. package/dist/{capsule-merge-LGYURS3C.js → capsule-merge-LGYZAMO4.js} +3 -3
  35. package/dist/causal-consolidation.js +22 -21
  36. package/dist/causal-consolidation.js.map +1 -1
  37. package/dist/{chunk-G6XEYFCO.js → chunk-27OJ5G3D.js} +14 -14
  38. package/dist/{chunk-5LRV557D.js → chunk-2FIJQNL7.js} +2 -2
  39. package/dist/{chunk-ETPIYK4J.js → chunk-2VBDSZ7U.js} +2 -2
  40. package/dist/{chunk-QNKEMFZY.js → chunk-2WDMUQOH.js} +2 -2
  41. package/dist/{chunk-W6MOLW5S.js → chunk-2XVLY424.js} +4 -4
  42. package/dist/{chunk-P55FACBG.js → chunk-3BOQPLCF.js} +6 -6
  43. package/dist/{chunk-27SAUQ5R.js → chunk-3CHHQXAR.js} +2 -2
  44. package/dist/{chunk-3GYSZHMT.js → chunk-3CZRBTJK.js} +2 -2
  45. package/dist/{chunk-FJJWA7NL.js → chunk-3EJQXF3B.js} +2 -2
  46. package/dist/{chunk-HFSPY26A.js → chunk-3IXNL6SK.js} +2 -2
  47. package/dist/{chunk-PLD6SOU7.js → chunk-3SN2D43X.js} +2 -2
  48. package/dist/{chunk-COGLFRXT.js → chunk-4HNINU7Q.js} +31 -31
  49. package/dist/{chunk-CCDHRDQ3.js → chunk-4HYP4OKH.js} +2 -2
  50. package/dist/{chunk-GKJJNO7C.js → chunk-4OE4UE2Y.js} +6 -6
  51. package/dist/{chunk-7RTNJ6M2.js → chunk-4QPW6JVI.js} +2 -2
  52. package/dist/{chunk-5SMR542T.js → chunk-5GT4ESLR.js} +2 -2
  53. package/dist/{chunk-DWL6YIZH.js → chunk-5JI3XWI2.js} +2 -2
  54. package/dist/{chunk-27LPB4NS.js → chunk-5NPZFXQH.js} +2 -2
  55. package/dist/{chunk-Y6IF6H2U.js → chunk-5SMHQW45.js} +2 -2
  56. package/dist/{chunk-VN3GHPBU.js → chunk-654GT5UP.js} +2 -2
  57. package/dist/{chunk-3E6DGSGZ.js → chunk-6MC7UQ6D.js} +2 -2
  58. package/dist/{chunk-655FVTCD.js → chunk-74IN6PV5.js} +2 -2
  59. package/dist/{chunk-WFUO7NWX.js → chunk-7FZ4YVOH.js} +2 -2
  60. package/dist/{chunk-MWWAQXZ6.js → chunk-7HFTCBCZ.js} +2 -2
  61. package/dist/{chunk-7IOB5F7Y.js → chunk-7VB3Y5OL.js} +3 -3
  62. package/dist/{chunk-YEF5AAWN.js → chunk-A54E2ZTD.js} +2 -2
  63. package/dist/{chunk-DEY7B77Y.js → chunk-AHCELJMH.js} +2 -2
  64. package/dist/{chunk-PIWFNPQT.js → chunk-AL3TCNSJ.js} +4 -4
  65. package/dist/{chunk-EET24NSB.js → chunk-AUYFUBBE.js} +6 -6
  66. package/dist/{chunk-L3IP56F4.js → chunk-BIE3ZH3N.js} +33 -33
  67. package/dist/{chunk-A3IURDU2.js → chunk-C2AOL6MK.js} +3 -3
  68. package/dist/{chunk-BDQMMX3M.js → chunk-C2QVDLQV.js} +2 -2
  69. package/dist/{chunk-H75L4ZOH.js → chunk-CKR7LXEK.js} +71 -49
  70. package/dist/chunk-CKR7LXEK.js.map +1 -0
  71. package/dist/{chunk-AWLQNLTM.js → chunk-CSGFGQBI.js} +2 -2
  72. package/dist/{chunk-JHQAXATW.js → chunk-D4RV54HH.js} +2 -2
  73. package/dist/{chunk-33UAWCBN.js → chunk-DDLRKPR2.js} +6 -6
  74. package/dist/{chunk-3X3PNU3T.js → chunk-DLH3ECZP.js} +5 -5
  75. package/dist/chunk-DNIG3JME.js +892 -0
  76. package/dist/chunk-DNIG3JME.js.map +1 -0
  77. package/dist/{chunk-SA6GMZJY.js → chunk-DP3TSAYT.js} +2 -2
  78. package/dist/{chunk-H2X22KZW.js → chunk-FN6OFDBZ.js} +2 -2
  79. package/dist/{chunk-SU5V2LWR.js → chunk-G6DAE2LT.js} +2 -2
  80. package/dist/{chunk-V7KGDLBC.js → chunk-GQ7VWY6N.js} +2 -2
  81. package/dist/{chunk-SYUNCM26.js → chunk-GSKW64NB.js} +2 -2
  82. package/dist/{chunk-4WT6I4VG.js → chunk-GWB7ZD2A.js} +2 -2
  83. package/dist/{chunk-JYZLDZ2R.js → chunk-HG2VVIKI.js} +9 -9
  84. package/dist/{chunk-3VRMUNWL.js → chunk-HJ444KNS.js} +15 -7
  85. package/dist/chunk-HJ444KNS.js.map +1 -0
  86. package/dist/{chunk-23ZQPP2G.js → chunk-HOSJESKO.js} +3 -3
  87. package/dist/{chunk-EU6IRUCY.js → chunk-IDPZCHET.js} +2 -2
  88. package/dist/{chunk-VMHCC7LO.js → chunk-IO2UQVR2.js} +2 -2
  89. package/dist/{chunk-BWXKJDDH.js → chunk-ISMZ5UNE.js} +3 -3
  90. package/dist/{chunk-SX4QDWXK.js → chunk-IWUFKS4J.js} +2 -2
  91. package/dist/{chunk-I27WOMJ7.js → chunk-IY7DGT2Z.js} +2 -2
  92. package/dist/{chunk-STBX5X6B.js → chunk-JAYNUYSJ.js} +2 -2
  93. package/dist/{chunk-N34ZW6E4.js → chunk-K2REHR42.js} +2 -2
  94. package/dist/{chunk-UJPGQCXD.js → chunk-KFKFK6G6.js} +10 -10
  95. package/dist/{chunk-2HLMFRZ7.js → chunk-LDEKVBVO.js} +4 -4
  96. package/dist/{chunk-42KSEX6C.js → chunk-LDXNKEYB.js} +1 -1
  97. package/dist/chunk-LDXNKEYB.js.map +1 -0
  98. package/dist/{chunk-MPZYCRC6.js → chunk-M236YHUH.js} +5 -5
  99. package/dist/{chunk-L5VCT7LU.js → chunk-MCLZM5G7.js} +2 -2
  100. package/dist/{chunk-7Z3DLNSD.js → chunk-MGKH5KO3.js} +2 -2
  101. package/dist/{chunk-PUDYANAX.js → chunk-MMBLOJJB.js} +2 -2
  102. package/dist/{chunk-EFHNFTWB.js → chunk-MND4YJSX.js} +2 -2
  103. package/dist/{chunk-HJQXHLQQ.js → chunk-MROA6OFU.js} +2 -2
  104. package/dist/{chunk-BQOGQULP.js → chunk-MZZEMPCI.js} +2 -2
  105. package/dist/{chunk-ERAVI25Z.js → chunk-NAPHQ2MG.js} +2 -2
  106. package/dist/{chunk-L5TJWQEF.js → chunk-NB2YX6X2.js} +6 -6
  107. package/dist/{chunk-IHGLQJW6.js → chunk-NCPR2FOJ.js} +3 -3
  108. package/dist/{chunk-UKWRCQWT.js → chunk-NOMHXZD7.js} +2 -2
  109. package/dist/{chunk-DF2G4IXN.js → chunk-NPO4ZQFY.js} +3 -3
  110. package/dist/{chunk-LWFWZTWX.js → chunk-NQV6G6MU.js} +2 -2
  111. package/dist/{chunk-5HT35H4L.js → chunk-NRLWHZVS.js} +2 -2
  112. package/dist/{chunk-GCZHKBY2.js → chunk-OANSZGAG.js} +2 -2
  113. package/dist/{chunk-BHQPOCQE.js → chunk-OIIAIY7J.js} +3 -3
  114. package/dist/{chunk-FFGHFU7A.js → chunk-OXX4ORRL.js} +17 -17
  115. package/dist/{chunk-RTTPBBAN.js → chunk-OXYXMGRH.js} +4 -4
  116. package/dist/{chunk-K7BN34IA.js → chunk-PL26BCRN.js} +5 -5
  117. package/dist/{chunk-PM72NSEW.js → chunk-PYCTZ2HX.js} +2 -2
  118. package/dist/{chunk-AQ52ZFBC.js → chunk-PZEADMX4.js} +2 -2
  119. package/dist/{chunk-QPH52AZB.js → chunk-QNDOTDJK.js} +2 -2
  120. package/dist/{chunk-LZACDIM2.js → chunk-RBGRQEW3.js} +4 -4
  121. package/dist/{chunk-H3AW6QZF.js → chunk-RRJ462HP.js} +2 -2
  122. package/dist/{chunk-V4JZCTMK.js → chunk-TKBW4YLS.js} +2 -2
  123. package/dist/{chunk-4D2YH47Z.js → chunk-TRW7N4FS.js} +2 -2
  124. package/dist/{chunk-IHS2UGYM.js → chunk-TTIEXXL3.js} +366 -1109
  125. package/dist/chunk-TTIEXXL3.js.map +1 -0
  126. package/dist/{chunk-OQJKY3Z5.js → chunk-UAAAXSKQ.js} +2 -2
  127. package/dist/{chunk-S36KJNQH.js → chunk-UM73Q46J.js} +2 -2
  128. package/dist/{chunk-7EJCAFMS.js → chunk-UTXYOWDR.js} +2 -2
  129. package/dist/{chunk-AYHPSYZI.js → chunk-UUYAW3JH.js} +2 -2
  130. package/dist/{chunk-MSMGQDVW.js → chunk-UVUBLLM3.js} +3 -3
  131. package/dist/{chunk-JZIZBJCW.js → chunk-V4FI2TG6.js} +3 -3
  132. package/dist/{chunk-MO6N4QYY.js → chunk-VARNSLUW.js} +4 -4
  133. package/dist/{chunk-WJAGO5LL.js → chunk-VEB7NEON.js} +4 -4
  134. package/dist/{chunk-GMZNJZRP.js → chunk-VLBFSD7B.js} +2 -2
  135. package/dist/{chunk-NZFFGO5O.js → chunk-VXWOJPSY.js} +36 -3
  136. package/dist/chunk-VXWOJPSY.js.map +1 -0
  137. package/dist/{chunk-JNIVZNIB.js → chunk-WKVL2G7X.js} +4 -4
  138. package/dist/{chunk-KJXP6RUG.js → chunk-WNEVEMJ3.js} +4 -4
  139. package/dist/{chunk-HNEOLXRF.js → chunk-WQIYGYY6.js} +2 -2
  140. package/dist/{chunk-GQJKVQJR.js → chunk-WYLBEJQI.js} +2 -2
  141. package/dist/{chunk-36DZ242S.js → chunk-XNROYP5E.js} +2 -2
  142. package/dist/{chunk-XNAOCY67.js → chunk-XVZIBMSY.js} +3 -3
  143. package/dist/{chunk-PXTLPC3P.js → chunk-YGVZ4QOZ.js} +4 -4
  144. package/dist/{chunk-JX32ROLZ.js → chunk-YZTFQBYY.js} +4 -4
  145. package/dist/{chunk-XSXM5LYZ.js → chunk-ZCRDYQL6.js} +2 -2
  146. package/dist/{chunk-MAAL6OZV.js → chunk-ZG3HZZ6K.js} +90 -36
  147. package/dist/chunk-ZG3HZZ6K.js.map +1 -0
  148. package/dist/{chunk-Z3XVYXQ3.js → chunk-ZXTAHSQU.js} +2 -2
  149. package/dist/cli.js +89 -88
  150. package/dist/coding/export-okf-codegraph.js +21 -20
  151. package/dist/coding/export-okf-codegraph.js.map +1 -1
  152. package/dist/compounding/engine.js +23 -22
  153. package/dist/config.js +24 -23
  154. package/dist/connectors/codex-materialize-runner.js +21 -20
  155. package/dist/connectors/codex-materialize.js +2 -2
  156. package/dist/connectors/index.js +21 -20
  157. package/dist/consolidation-provenance-check.js +3 -3
  158. package/dist/consolidation-undo.js +2 -2
  159. package/dist/contradiction/index.js +6 -5
  160. package/dist/convergence-refresh.js +22 -21
  161. package/dist/corpus-watermark.js +22 -21
  162. package/dist/deep-recall-http-glue.js +7 -6
  163. package/dist/entity-canonical-id-migration-GD5MPFUF.js +28 -0
  164. package/dist/entity-retrieval.js +20 -19
  165. package/dist/explicit-capture.js +8 -7
  166. package/dist/external-wiki-access.js +55 -54
  167. package/dist/extraction.js +27 -26
  168. package/dist/harmonic-retrieval.js +21 -20
  169. package/dist/harmonic-source-lookup.js +3 -2
  170. package/dist/index.js +106 -105
  171. package/dist/local-llm-rate-limit.d.ts +3 -1
  172. package/dist/local-llm-rate-limit.d.ts.map +1 -1
  173. package/dist/local-llm-rate-limit.js +1 -1
  174. package/dist/local-llm.js +2 -2
  175. package/dist/location/index.js +23 -22
  176. package/dist/maintenance/memory-governance.js +20 -19
  177. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +20 -19
  178. package/dist/maintenance/rebuild-memory-projection-runner.js +22 -21
  179. package/dist/maintenance/rebuild-memory-projection.js +21 -20
  180. package/dist/memory-browse-operations.js +55 -54
  181. package/dist/memory-subject.js +4 -3
  182. package/dist/namespaces/migrate.js +21 -20
  183. package/dist/namespaces/search.js +7 -7
  184. package/dist/namespaces/storage.js +20 -19
  185. package/dist/offline-sync-file-io.js +3 -2
  186. package/dist/offline-sync-impression-drain.js +4 -4
  187. package/dist/offline-sync-snapshot-stream.js +6 -5
  188. package/dist/offline-sync-upload-staging.js +4 -3
  189. package/dist/offline-sync.js +5 -4
  190. package/dist/operator-doctor-corpus.js +23 -22
  191. package/dist/operator-toolkit.js +34 -33
  192. package/dist/orchestration/maintenance.js +35 -34
  193. package/dist/orchestration/orchestrator-init.d.ts +3 -0
  194. package/dist/orchestration/orchestrator-init.d.ts.map +1 -1
  195. package/dist/orchestrator.d.ts.map +1 -1
  196. package/dist/orchestrator.js +106 -105
  197. package/dist/page-versioning.js +2 -2
  198. package/dist/recall-explain-renderer.js +3 -3
  199. package/dist/recall-navigate-access.js +2 -2
  200. package/dist/recall-navigate-disclosure.js +2 -2
  201. package/dist/recall-navigate.js +2 -2
  202. package/dist/recall-navigation-operations.js +55 -54
  203. package/dist/recall-navigation.js +54 -53
  204. package/dist/recall-state.js +2 -2
  205. package/dist/recall-xray-cli.js +4 -4
  206. package/dist/recall-xray-renderer.js +3 -3
  207. package/dist/recall-xray.js +2 -2
  208. package/dist/reconcile/manifest.js +4 -3
  209. package/dist/{resolution-ZU5BIAJA.js → resolution-AMYTPT5X.js} +7 -6
  210. package/dist/resolution-AMYTPT5X.js.map +1 -0
  211. package/dist/resume-bundles.js +25 -24
  212. package/dist/retrieval-agents.js +3 -2
  213. package/dist/salvage-envelope.js +6 -5
  214. package/dist/search/document-scanner.js +2 -2
  215. package/dist/search/factory.js +6 -6
  216. package/dist/search/index.js +6 -6
  217. package/dist/search/lancedb-backend.js +3 -3
  218. package/dist/search/meilisearch-backend.js +3 -3
  219. package/dist/search/orama-backend.js +3 -3
  220. package/dist/secure-store/entity-file-read.d.ts +9 -0
  221. package/dist/secure-store/entity-file-read.d.ts.map +1 -0
  222. package/dist/secure-store/index.js +3 -2
  223. package/dist/secure-store/secure-fs.d.ts.map +1 -1
  224. package/dist/semantic-consolidation.js +22 -21
  225. package/dist/semantic-rule-promotion.js +20 -19
  226. package/dist/semantic-rule-verifier.js +20 -19
  227. package/dist/shared-context/manager.js +2 -2
  228. package/dist/source-agent-qualifier.js +24 -23
  229. package/dist/standup/build.js +20 -19
  230. package/dist/storage/entity-canonical-id-migration-runner.d.ts +12 -0
  231. package/dist/storage/entity-canonical-id-migration-runner.d.ts.map +1 -1
  232. package/dist/storage/entity-canonical-id-migration.d.ts +1 -0
  233. package/dist/storage/entity-canonical-id-migration.d.ts.map +1 -1
  234. package/dist/storage/entity-canonical-id-references.d.ts +14 -0
  235. package/dist/storage/entity-canonical-id-references.d.ts.map +1 -1
  236. package/dist/storage/entity-store.d.ts +4 -0
  237. package/dist/storage/entity-store.d.ts.map +1 -1
  238. package/dist/storage.d.ts +7 -2
  239. package/dist/storage.d.ts.map +1 -1
  240. package/dist/storage.js +19 -18
  241. package/dist/subject-config.js +5 -4
  242. package/dist/summarizer.js +3 -3
  243. package/dist/support-passport/index.js +57 -56
  244. package/dist/transfer/capsule-import.js +3 -3
  245. package/dist/transfer/export-okf.js +21 -20
  246. package/dist/types.d.ts +1 -1
  247. package/dist/types.d.ts.map +1 -1
  248. package/dist/types.js +1 -1
  249. package/dist/verified-recall.js +20 -19
  250. package/dist/who-knows-cli.js +21 -20
  251. package/dist/who-knows.js +20 -19
  252. package/dist/write-envelope.js +5 -4
  253. package/package.json +2 -2
  254. package/src/local-llm-rate-limit.test.ts +59 -1
  255. package/src/local-llm-rate-limit.ts +22 -7
  256. package/src/orchestration/orchestrator-init.ts +26 -3
  257. package/src/orchestrator.ts +1 -0
  258. package/src/secure-store/entity-file-read.ts +55 -0
  259. package/src/secure-store/secure-fs.ts +2 -1
  260. package/src/storage/entity-canonical-id-migration-runner.ts +36 -0
  261. package/src/storage/entity-canonical-id-migration.ts +1 -1
  262. package/src/storage/entity-canonical-id-references.ts +57 -2
  263. package/src/storage/entity-store.ts +138 -25
  264. package/src/storage.ts +15 -15
  265. package/src/types.ts +1 -1
  266. package/dist/chunk-3VRMUNWL.js.map +0 -1
  267. package/dist/chunk-42KSEX6C.js.map +0 -1
  268. package/dist/chunk-H75L4ZOH.js.map +0 -1
  269. package/dist/chunk-IHS2UGYM.js.map +0 -1
  270. package/dist/chunk-MAAL6OZV.js.map +0 -1
  271. package/dist/chunk-NZFFGO5O.js.map +0 -1
  272. /package/dist/{auto-sync-UQESPLCB.js.map → auto-sync-MX2AHVPQ.js.map} +0 -0
  273. /package/dist/{capsule-merge-LGYURS3C.js.map → capsule-merge-LGYZAMO4.js.map} +0 -0
  274. /package/dist/{chunk-G6XEYFCO.js.map → chunk-27OJ5G3D.js.map} +0 -0
  275. /package/dist/{chunk-5LRV557D.js.map → chunk-2FIJQNL7.js.map} +0 -0
  276. /package/dist/{chunk-ETPIYK4J.js.map → chunk-2VBDSZ7U.js.map} +0 -0
  277. /package/dist/{chunk-QNKEMFZY.js.map → chunk-2WDMUQOH.js.map} +0 -0
  278. /package/dist/{chunk-W6MOLW5S.js.map → chunk-2XVLY424.js.map} +0 -0
  279. /package/dist/{chunk-P55FACBG.js.map → chunk-3BOQPLCF.js.map} +0 -0
  280. /package/dist/{chunk-27SAUQ5R.js.map → chunk-3CHHQXAR.js.map} +0 -0
  281. /package/dist/{chunk-3GYSZHMT.js.map → chunk-3CZRBTJK.js.map} +0 -0
  282. /package/dist/{chunk-FJJWA7NL.js.map → chunk-3EJQXF3B.js.map} +0 -0
  283. /package/dist/{chunk-HFSPY26A.js.map → chunk-3IXNL6SK.js.map} +0 -0
  284. /package/dist/{chunk-PLD6SOU7.js.map → chunk-3SN2D43X.js.map} +0 -0
  285. /package/dist/{chunk-COGLFRXT.js.map → chunk-4HNINU7Q.js.map} +0 -0
  286. /package/dist/{chunk-CCDHRDQ3.js.map → chunk-4HYP4OKH.js.map} +0 -0
  287. /package/dist/{chunk-GKJJNO7C.js.map → chunk-4OE4UE2Y.js.map} +0 -0
  288. /package/dist/{chunk-7RTNJ6M2.js.map → chunk-4QPW6JVI.js.map} +0 -0
  289. /package/dist/{chunk-5SMR542T.js.map → chunk-5GT4ESLR.js.map} +0 -0
  290. /package/dist/{chunk-DWL6YIZH.js.map → chunk-5JI3XWI2.js.map} +0 -0
  291. /package/dist/{chunk-27LPB4NS.js.map → chunk-5NPZFXQH.js.map} +0 -0
  292. /package/dist/{chunk-Y6IF6H2U.js.map → chunk-5SMHQW45.js.map} +0 -0
  293. /package/dist/{chunk-VN3GHPBU.js.map → chunk-654GT5UP.js.map} +0 -0
  294. /package/dist/{chunk-3E6DGSGZ.js.map → chunk-6MC7UQ6D.js.map} +0 -0
  295. /package/dist/{chunk-655FVTCD.js.map → chunk-74IN6PV5.js.map} +0 -0
  296. /package/dist/{chunk-WFUO7NWX.js.map → chunk-7FZ4YVOH.js.map} +0 -0
  297. /package/dist/{chunk-MWWAQXZ6.js.map → chunk-7HFTCBCZ.js.map} +0 -0
  298. /package/dist/{chunk-7IOB5F7Y.js.map → chunk-7VB3Y5OL.js.map} +0 -0
  299. /package/dist/{chunk-YEF5AAWN.js.map → chunk-A54E2ZTD.js.map} +0 -0
  300. /package/dist/{chunk-DEY7B77Y.js.map → chunk-AHCELJMH.js.map} +0 -0
  301. /package/dist/{chunk-PIWFNPQT.js.map → chunk-AL3TCNSJ.js.map} +0 -0
  302. /package/dist/{chunk-EET24NSB.js.map → chunk-AUYFUBBE.js.map} +0 -0
  303. /package/dist/{chunk-L3IP56F4.js.map → chunk-BIE3ZH3N.js.map} +0 -0
  304. /package/dist/{chunk-A3IURDU2.js.map → chunk-C2AOL6MK.js.map} +0 -0
  305. /package/dist/{chunk-BDQMMX3M.js.map → chunk-C2QVDLQV.js.map} +0 -0
  306. /package/dist/{chunk-AWLQNLTM.js.map → chunk-CSGFGQBI.js.map} +0 -0
  307. /package/dist/{chunk-JHQAXATW.js.map → chunk-D4RV54HH.js.map} +0 -0
  308. /package/dist/{chunk-33UAWCBN.js.map → chunk-DDLRKPR2.js.map} +0 -0
  309. /package/dist/{chunk-3X3PNU3T.js.map → chunk-DLH3ECZP.js.map} +0 -0
  310. /package/dist/{chunk-SA6GMZJY.js.map → chunk-DP3TSAYT.js.map} +0 -0
  311. /package/dist/{chunk-H2X22KZW.js.map → chunk-FN6OFDBZ.js.map} +0 -0
  312. /package/dist/{chunk-SU5V2LWR.js.map → chunk-G6DAE2LT.js.map} +0 -0
  313. /package/dist/{chunk-V7KGDLBC.js.map → chunk-GQ7VWY6N.js.map} +0 -0
  314. /package/dist/{chunk-SYUNCM26.js.map → chunk-GSKW64NB.js.map} +0 -0
  315. /package/dist/{chunk-4WT6I4VG.js.map → chunk-GWB7ZD2A.js.map} +0 -0
  316. /package/dist/{chunk-JYZLDZ2R.js.map → chunk-HG2VVIKI.js.map} +0 -0
  317. /package/dist/{chunk-23ZQPP2G.js.map → chunk-HOSJESKO.js.map} +0 -0
  318. /package/dist/{chunk-EU6IRUCY.js.map → chunk-IDPZCHET.js.map} +0 -0
  319. /package/dist/{chunk-VMHCC7LO.js.map → chunk-IO2UQVR2.js.map} +0 -0
  320. /package/dist/{chunk-BWXKJDDH.js.map → chunk-ISMZ5UNE.js.map} +0 -0
  321. /package/dist/{chunk-SX4QDWXK.js.map → chunk-IWUFKS4J.js.map} +0 -0
  322. /package/dist/{chunk-I27WOMJ7.js.map → chunk-IY7DGT2Z.js.map} +0 -0
  323. /package/dist/{chunk-STBX5X6B.js.map → chunk-JAYNUYSJ.js.map} +0 -0
  324. /package/dist/{chunk-N34ZW6E4.js.map → chunk-K2REHR42.js.map} +0 -0
  325. /package/dist/{chunk-UJPGQCXD.js.map → chunk-KFKFK6G6.js.map} +0 -0
  326. /package/dist/{chunk-2HLMFRZ7.js.map → chunk-LDEKVBVO.js.map} +0 -0
  327. /package/dist/{chunk-MPZYCRC6.js.map → chunk-M236YHUH.js.map} +0 -0
  328. /package/dist/{chunk-L5VCT7LU.js.map → chunk-MCLZM5G7.js.map} +0 -0
  329. /package/dist/{chunk-7Z3DLNSD.js.map → chunk-MGKH5KO3.js.map} +0 -0
  330. /package/dist/{chunk-PUDYANAX.js.map → chunk-MMBLOJJB.js.map} +0 -0
  331. /package/dist/{chunk-EFHNFTWB.js.map → chunk-MND4YJSX.js.map} +0 -0
  332. /package/dist/{chunk-HJQXHLQQ.js.map → chunk-MROA6OFU.js.map} +0 -0
  333. /package/dist/{chunk-BQOGQULP.js.map → chunk-MZZEMPCI.js.map} +0 -0
  334. /package/dist/{chunk-ERAVI25Z.js.map → chunk-NAPHQ2MG.js.map} +0 -0
  335. /package/dist/{chunk-L5TJWQEF.js.map → chunk-NB2YX6X2.js.map} +0 -0
  336. /package/dist/{chunk-IHGLQJW6.js.map → chunk-NCPR2FOJ.js.map} +0 -0
  337. /package/dist/{chunk-UKWRCQWT.js.map → chunk-NOMHXZD7.js.map} +0 -0
  338. /package/dist/{chunk-DF2G4IXN.js.map → chunk-NPO4ZQFY.js.map} +0 -0
  339. /package/dist/{chunk-LWFWZTWX.js.map → chunk-NQV6G6MU.js.map} +0 -0
  340. /package/dist/{chunk-5HT35H4L.js.map → chunk-NRLWHZVS.js.map} +0 -0
  341. /package/dist/{chunk-GCZHKBY2.js.map → chunk-OANSZGAG.js.map} +0 -0
  342. /package/dist/{chunk-BHQPOCQE.js.map → chunk-OIIAIY7J.js.map} +0 -0
  343. /package/dist/{chunk-FFGHFU7A.js.map → chunk-OXX4ORRL.js.map} +0 -0
  344. /package/dist/{chunk-RTTPBBAN.js.map → chunk-OXYXMGRH.js.map} +0 -0
  345. /package/dist/{chunk-K7BN34IA.js.map → chunk-PL26BCRN.js.map} +0 -0
  346. /package/dist/{chunk-PM72NSEW.js.map → chunk-PYCTZ2HX.js.map} +0 -0
  347. /package/dist/{chunk-AQ52ZFBC.js.map → chunk-PZEADMX4.js.map} +0 -0
  348. /package/dist/{chunk-QPH52AZB.js.map → chunk-QNDOTDJK.js.map} +0 -0
  349. /package/dist/{chunk-LZACDIM2.js.map → chunk-RBGRQEW3.js.map} +0 -0
  350. /package/dist/{chunk-H3AW6QZF.js.map → chunk-RRJ462HP.js.map} +0 -0
  351. /package/dist/{chunk-V4JZCTMK.js.map → chunk-TKBW4YLS.js.map} +0 -0
  352. /package/dist/{chunk-4D2YH47Z.js.map → chunk-TRW7N4FS.js.map} +0 -0
  353. /package/dist/{chunk-OQJKY3Z5.js.map → chunk-UAAAXSKQ.js.map} +0 -0
  354. /package/dist/{chunk-S36KJNQH.js.map → chunk-UM73Q46J.js.map} +0 -0
  355. /package/dist/{chunk-7EJCAFMS.js.map → chunk-UTXYOWDR.js.map} +0 -0
  356. /package/dist/{chunk-AYHPSYZI.js.map → chunk-UUYAW3JH.js.map} +0 -0
  357. /package/dist/{chunk-MSMGQDVW.js.map → chunk-UVUBLLM3.js.map} +0 -0
  358. /package/dist/{chunk-JZIZBJCW.js.map → chunk-V4FI2TG6.js.map} +0 -0
  359. /package/dist/{chunk-MO6N4QYY.js.map → chunk-VARNSLUW.js.map} +0 -0
  360. /package/dist/{chunk-WJAGO5LL.js.map → chunk-VEB7NEON.js.map} +0 -0
  361. /package/dist/{chunk-GMZNJZRP.js.map → chunk-VLBFSD7B.js.map} +0 -0
  362. /package/dist/{chunk-JNIVZNIB.js.map → chunk-WKVL2G7X.js.map} +0 -0
  363. /package/dist/{chunk-KJXP6RUG.js.map → chunk-WNEVEMJ3.js.map} +0 -0
  364. /package/dist/{chunk-HNEOLXRF.js.map → chunk-WQIYGYY6.js.map} +0 -0
  365. /package/dist/{chunk-GQJKVQJR.js.map → chunk-WYLBEJQI.js.map} +0 -0
  366. /package/dist/{chunk-36DZ242S.js.map → chunk-XNROYP5E.js.map} +0 -0
  367. /package/dist/{chunk-XNAOCY67.js.map → chunk-XVZIBMSY.js.map} +0 -0
  368. /package/dist/{chunk-PXTLPC3P.js.map → chunk-YGVZ4QOZ.js.map} +0 -0
  369. /package/dist/{chunk-JX32ROLZ.js.map → chunk-YZTFQBYY.js.map} +0 -0
  370. /package/dist/{chunk-XSXM5LYZ.js.map → chunk-ZCRDYQL6.js.map} +0 -0
  371. /package/dist/{chunk-Z3XVYXQ3.js.map → chunk-ZXTAHSQU.js.map} +0 -0
  372. /package/dist/{resolution-ZU5BIAJA.js.map → entity-canonical-id-migration-GD5MPFUF.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/storage/entity-canonical-id-migration.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport {\n access,\n lstat,\n readFile,\n readdir,\n realpath,\n rename,\n stat as statFile,\n unlink,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { lstatSync, readFileSync } from \"node:fs\";\nimport { z } from \"zod\";\nimport { computeSupersessionKey, normalizeSupersessionKey } from \"../temporal-supersession.js\";\nimport type { EntityFile, MemoryFile } from \"../types.js\";\nimport { log } from \"../logger.js\";\nimport { isErrnoCode } from \"../utils/errno.js\";\nimport { withHeldFileLock } from \"../utils/serialize-mutations.js\";\nimport { RECALL_FALLBACK_DIRS } from \"../utils/category-dir.js\";\nimport { assertPathInsideRoot } from \"../utils/path-containment.js\";\nimport { withEntityCanonicalMutationLock } from \"./entity-canonical-id-lock.js\";\nimport { assertSafeEntityId } from \"./entity-id-safety.js\";\nimport { isMalformedEntityRecord } from \"../utils/malformed-entity-record.js\";\nimport {\n isMacOsReplicationJunkBasename,\n warnIgnoredMacOsReplicationJunk,\n} from \"../utils/macos-replication-junk.js\";\n\nimport {\n ENTITY_CANONICAL_ID_MIGRATION_FILE,\n ENTITY_CANONICAL_ID_RECONCILE_CONSUMING_MARKER,\n ENTITY_CANONICAL_ID_RECONCILE_MARKER,\n resolveHistoricalEntityCanonicalId,\n} from \"./entity-canonical-id-references.js\";\n\nconst ENTITY_CANONICAL_ID_MIGRATION_VERSION = 1;\nconst ENTITY_CANONICAL_ID_MIGRATION_LOCK_STALE_MS = 60_000;\nconst ENTITY_CANONICAL_ID_MIGRATION_LOCK_MAX_WAIT_MS = 300_000;\nconst TOMBSTONE_LOCK_STALE_MS = 30_000;\nconst TOMBSTONE_LOCK_MAX_WAIT_MS = 5_000;\nconst MEMORY_REWRITE_MAX_PASSES = 3;\nconst ENTITY_MAPPING_RESCAN_MAX_PASSES = 3;\n\nconst EntityCanonicalIdMigrationStateSchema = z.object({\n version: z.literal(ENTITY_CANONICAL_ID_MIGRATION_VERSION),\n complete: z.boolean(),\n mappings: z.record(z.string().min(1)),\n /**\n * Pairs the migration refused to resolve, PARKED rather than dropped.\n * Deleting the record would strand the collision: once an operator removes\n * the legacy file, no later scan can rediscover the mapping, so references\n * still naming the legacy id would never be rewritten. Optional so a journal\n * written by an older build still parses.\n */\n blocked: z.record(z.string().min(1)).optional(),\n});\n\ntype EntityCanonicalIdMigrationState = z.infer<typeof EntityCanonicalIdMigrationStateSchema>;\n\nexport interface EntityCanonicalIdMigrationDependencies {\n stateDir: string;\n entitiesDir: string;\n normalizeEntityName(raw: string, type: string): string;\n resolveEntityFilePath(id: string): string | null;\n readStorageSecureFile(filePath: string): Promise<string>;\n writeStorageSecureFile(filePath: string, content: string, forceEncrypt?: boolean): Promise<void>;\n isEncryptedStorageFile(filePath: string): Promise<boolean>;\n snapshotBeforeWrite(filePath: string, trigger: \"write\"): Promise<void>;\n parseEntityFile(content: string): EntityFile;\n serializeEntityFile(entity: EntityFile): string;\n serializeMemoryWithEntityRef(memory: MemoryFile, entityRef: string): string;\n readMemoryByPath(filePath: string): Promise<MemoryFile | null>;\n readAllMemories(): Promise<MemoryFile[]>;\n readAllColdMemories(): Promise<MemoryFile[]>;\n readArchivedMemories(): Promise<MemoryFile[]>;\n validateMemoryScanRoots?(): Promise<void>;\n rewriteProjectedEntityReferences(mappings: Readonly<Record<string, string>>): Promise<void>;\n rewriteProjectedMemoryEntityReference(\n memoryId: string,\n previousEntityRef: string,\n nextEntityRef: string,\n ): Promise<void>;\n invalidateKnowledgeIndexCache(): void;\n invalidateAllMemoriesCache(): void;\n invalidateColdMemoriesCache(): void;\n bumpMemoryStatusVersion(): void;\n readMigrationFingerprint?(): Promise<string>;\n}\n\nasync function fingerprintPath(filePath: string): Promise<string> {\n let fileStat;\n try {\n fileStat = await lstat(filePath);\n } catch (error) {\n if (!isErrnoCode(error, \"ENOENT\")) throw error;\n }\n return fileStat\n ? `${fileStat.dev}:${fileStat.ino}:${fileStat.mtimeMs}:${fileStat.ctimeMs}:${fileStat.size}`\n : \"missing\";\n}\n\nasync function fingerprintEntityEntries(entitiesDir: string): Promise<string> {\n let names: string[];\n try {\n names = (await readdir(entitiesDir))\n .filter((name) => path.extname(name) === \".md\" && !isMacOsReplicationJunkBasename(name))\n .sort();\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) return \"missing\";\n throw error;\n }\n const hash = createHash(\"sha256\");\n for (const name of names) {\n hash.update(`${name.length}:${name}:`);\n try {\n const entry = await lstat(path.join(entitiesDir, name), { bigint: true });\n hash.update(`${entry.dev}:${entry.ino}:${entry.size}:${entry.mtimeNs}:${entry.ctimeNs}`);\n } catch (error) {\n if (!isErrnoCode(error, \"ENOENT\")) throw error;\n hash.update(\"missing\");\n }\n hash.update(\"\\n\");\n }\n return hash.digest(\"hex\");\n}\n\n/**\n * Completion fingerprint for migration inputs only. Entity entry identities\n * catch same-path edits that do not change the directory inode; the cooperative\n * sentinel covers managed writes. Memory-corpus writes stay excluded so plain\n * fact writes do not reopen migration.\n */\nexport async function getFingerprint(\n baseDir: string,\n entitiesDir: string,\n getEntityMutationVersion: () => string,\n): Promise<string> {\n const [\n entityDirectoryFingerprint,\n entityEntriesFingerprint,\n aliasFingerprint,\n reconcileFingerprint,\n consumingFingerprint,\n ] = await Promise.all([\n fingerprintPath(entitiesDir),\n fingerprintEntityEntries(entitiesDir),\n fingerprintPath(path.join(baseDir, \"config\", \"aliases.json\")),\n fingerprintPath(path.join(baseDir, \"state\", ENTITY_CANONICAL_ID_RECONCILE_MARKER)),\n fingerprintPath(path.join(baseDir, \"state\", ENTITY_CANONICAL_ID_RECONCILE_CONSUMING_MARKER)),\n ]);\n return [\n entityDirectoryFingerprint,\n entityEntriesFingerprint,\n aliasFingerprint,\n reconcileFingerprint,\n consumingFingerprint,\n getEntityMutationVersion(),\n ].join(\":\");\n}\n\nexport async function validateRoots(\n baseDir: string,\n entitiesDir: string,\n stateDir: string,\n archiveDir: string,\n): Promise<void> {\n let baseStat;\n try {\n baseStat = await lstat(baseDir);\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) return;\n throw error;\n }\n if (baseStat.isSymbolicLink() || !baseStat.isDirectory()) {\n throw new Error(`Refusing entity canonical-id migration through unsafe memory root: ${baseDir}.`);\n }\n const memoryRoot = await realpath(baseDir);\n const roots = [\n entitiesDir,\n stateDir,\n ...RECALL_FALLBACK_DIRS.map((directory) => path.join(baseDir, directory)),\n path.join(baseDir, \"cold\"),\n archiveDir,\n ];\n for (const root of roots) {\n let rootStat;\n try {\n rootStat = await lstat(root);\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) continue;\n throw error;\n }\n if (rootStat.isSymbolicLink() || !rootStat.isDirectory()) {\n throw new Error(`Refusing entity canonical-id migration through unsafe memory root: ${root}.`);\n }\n assertPathInsideRoot(memoryRoot, await realpath(root), root);\n }\n}\n\nfunction statePath(deps: EntityCanonicalIdMigrationDependencies): string {\n return path.join(deps.stateDir, ENTITY_CANONICAL_ID_MIGRATION_FILE);\n}\n\nasync function assertSafeMigrationStateFile(\n deps: EntityCanonicalIdMigrationDependencies,\n): Promise<void> {\n const migrationStatePath = statePath(deps);\n let fileStat;\n try {\n fileStat = await lstat(migrationStatePath);\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) return;\n throw error;\n }\n if (fileStat.isSymbolicLink() || !fileStat.isFile()) {\n throw new Error(\n `Refusing entity canonical-id migration through unsafe migration state file: ${migrationStatePath}.`,\n );\n }\n const [stateRoot, stateFile] = await Promise.all([\n realpath(deps.stateDir),\n realpath(migrationStatePath),\n ]);\n assertPathInsideRoot(stateRoot, stateFile, migrationStatePath);\n}\nasync function assertSafeTombstoneFile(\n deps: EntityCanonicalIdMigrationDependencies,\n tombstonePath: string,\n): Promise<boolean> {\n let fileStat;\n try {\n fileStat = await lstat(tombstonePath);\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) return false;\n throw error;\n }\n if (fileStat.isSymbolicLink() || !fileStat.isFile()) {\n throw new Error(\n `Refusing entity canonical-id migration through unsafe tombstone ledger: ${tombstonePath}.`,\n );\n }\n const [stateRoot, tombstoneFile] = await Promise.all([\n realpath(deps.stateDir),\n realpath(tombstonePath),\n ]);\n assertPathInsideRoot(stateRoot, tombstoneFile, tombstonePath);\n return true;\n}\n\nfunction lockPath(deps: EntityCanonicalIdMigrationDependencies): string {\n return path.join(deps.stateDir, \"entity-canonical-id-migration.lock\");\n}\n\n\nasync function readState(\n deps: EntityCanonicalIdMigrationDependencies\n): Promise<EntityCanonicalIdMigrationState | null> {\n await assertSafeMigrationStateFile(deps);\n let raw: string;\n try {\n raw = await readFile(statePath(deps), \"utf-8\");\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) return null;\n throw error;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\"Invalid entity canonical-id migration state.\");\n }\n const result = EntityCanonicalIdMigrationStateSchema.safeParse(parsed);\n if (!result.success) throw new Error(\"Invalid entity canonical-id migration state.\");\n for (const mappings of [result.data.mappings, result.data.blocked ?? {}]) {\n for (const [legacyId, canonicalId] of Object.entries(mappings)) {\n assertSafeEntityId(legacyId);\n assertSafeEntityId(canonicalId);\n }\n }\n return result.data;\n}\n\nasync function writeState(\n deps: EntityCanonicalIdMigrationDependencies,\n state: EntityCanonicalIdMigrationState\n): Promise<void> {\n const destination = statePath(deps);\n const temporary = `${destination}.${process.pid}.${randomUUID()}.tmp`;\n try {\n await writeFile(temporary, `${JSON.stringify(state, null, 2)}\\n`, \"utf-8\");\n await rename(temporary, destination);\n } finally {\n await unlink(temporary).catch(() => undefined);\n }\n}\n\n/**\n * Every journal publish — additive merges, completion markers, prunes —\n * serializes under the entity MUTATION lock (issue #2213 review): entity\n * writers, post-persist repair settles, and tombstone appends revalidate\n * the journal identity under that lock, so an unlocked publish could land\n * inside their resolve→write window and strand the write on a superseded\n * id space.\n */\nasync function publishState(\n deps: EntityCanonicalIdMigrationDependencies,\n state: EntityCanonicalIdMigrationState\n): Promise<void> {\n await withEntityCanonicalMutationLock(deps.stateDir, async () => {\n await writeState(deps, state);\n });\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) return false;\n throw error;\n }\n}\n\nasync function sameFileIdentity(leftPath: string, rightPath: string): Promise<boolean> {\n try {\n const [left, right] = await Promise.all([statFile(leftPath), statFile(rightPath)]);\n return left.dev === right.dev && left.ino === right.ino;\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) return false;\n throw error;\n }\n}\n\nasync function assertNotSymlink(filePath: string, label: string): Promise<void> {\n let stat;\n try {\n stat = await lstat(filePath);\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) return;\n throw error;\n }\n if (stat.isSymbolicLink()) {\n throw new Error(`Refusing entity canonical-id migration through symlink: ${label}.`);\n }\n}\nasync function assertNotMemorySymlink(filePath: string): Promise<void> {\n let stat;\n try {\n stat = await lstat(filePath);\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) return;\n throw error;\n }\n if (stat.isSymbolicLink()) {\n throw new Error(`Refusing entity canonical-id migration through symlinked memory: ${filePath}.`);\n }\n}\nasync function assertEntityContentUnchanged(\n deps: EntityCanonicalIdMigrationDependencies,\n filePath: string,\n expectedContent: string,\n legacyId: string,\n): Promise<void> {\n const latestContent = await deps.readStorageSecureFile(filePath);\n if (latestContent !== expectedContent) {\n throw new Error(`Legacy entity id ${legacyId} changed while migration was running; retry migration.`);\n }\n}\n\nexport async function readSafeEntityEntries(entitiesDir: string): Promise<string[]> {\n const rootStat = await lstat(entitiesDir);\n if (rootStat.isSymbolicLink() || !rootStat.isDirectory()) {\n throw new Error(\"Refusing entity canonical-id migration through a symlinked or non-directory entities root.\");\n }\n const entries = await readdir(entitiesDir);\n for (const entry of entries) {\n await assertNotSymlink(path.join(entitiesDir, entry), entry);\n }\n return entries;\n}\n\n/**\n * Legacy ids the migration cannot resolve on its own, mapped to the canonical\n * id they collide with. Two entity files describing one entity is an ORDINARY\n * operator state, and picking a winner would silently drop whichever side lost.\n * So the pair is skipped and reported: reads of the legacy id keep working\n * exactly as they did before the migration ran.\n */\nexport type BlockedEntityPairs = Map<string, string>;\n\ninterface EntityScanNotes {\n junk: Set<string>;\n malformed: Set<string>;\n}\n\nasync function discoverMappings(\n deps: EntityCanonicalIdMigrationDependencies,\n knownMappings: Readonly<Record<string, string>> = {},\n blocked: BlockedEntityPairs = new Map(),\n scanNotes?: EntityScanNotes,\n): Promise<Record<string, string>> {\n const mappings: Record<string, string> = {};\n const canonicalOwners = new Map<string, string[]>();\n // Blocks describe THIS scan of the directory, so they are rebuilt per pass.\n // Accumulating them across a run would let a collision another writer has\n // since resolved keep pruning its now-valid mapping: the entity file gets\n // renamed while the pruned mapping skips the reference rewrite, stranding\n // memories on a filename that no longer exists.\n blocked.clear();\n const entityEntries = await readSafeEntityEntries(deps.entitiesDir);\n for (const entry of entityEntries) {\n // AppleDouble (`._*`) and `.DS_Store` are Finder metadata, not entity\n // files. A real file that cannot be parsed is left in place: this scan\n // runs during directory init, and aborting it took the daemon down.\n // Skipping is the same outcome as the old throw (the file is not\n // rewritten) without refusing to boot. Symlink checks above still run.\n if (isMacOsReplicationJunkBasename(entry)) {\n scanNotes?.junk.add(entry);\n continue;\n }\n if (!entry.endsWith(\".md\")) continue;\n const legacyId = entry.slice(0, -\".md\".length);\n assertSafeEntityId(legacyId);\n const legacyPath = deps.resolveEntityFilePath(legacyId);\n if (legacyPath === null) continue;\n const entityContent = await deps.readStorageSecureFile(legacyPath);\n if (isMalformedEntityRecord(entityContent)) {\n scanNotes?.malformed.add(entry);\n continue;\n }\n const entity = deps.parseEntityFile(entityContent);\n if (!entity.name.trim() || !entity.type.trim()) {\n scanNotes?.malformed.add(entry);\n continue;\n }\n const canonicalId = deps.normalizeEntityName(entity.name, entity.type);\n assertSafeEntityId(canonicalId);\n if (legacyId === canonicalId) continue;\n const canonicalPath = deps.resolveEntityFilePath(canonicalId);\n if (canonicalPath === null) continue;\n const canonicalExists = await fileExists(canonicalPath);\n if (\n canonicalExists\n && await sameFileIdentity(legacyPath, canonicalPath)\n && knownMappings[legacyId] === canonicalId\n ) continue;\n if (canonicalExists) {\n const canonicalContent = await deps.readStorageSecureFile(canonicalPath);\n if (entityContent !== canonicalContent) {\n blocked.set(legacyId, canonicalId);\n continue;\n }\n }\n canonicalOwners.set(canonicalId, [...(canonicalOwners.get(canonicalId) ?? []), legacyId]);\n mappings[legacyId] = canonicalId;\n }\n // A canonical id claimed by more than one legacy file has no non-arbitrary\n // winner, and readdir order is not stable (§6) - so the \"winner\" would differ\n // between hosts reading identical data. Block every claimant instead.\n for (const [canonicalId, claimants] of canonicalOwners) {\n if (claimants.length < 2) continue;\n for (const legacyId of claimants) {\n blocked.set(legacyId, canonicalId);\n delete mappings[legacyId];\n }\n }\n return mappings;\n}\n\nasync function rewriteReferences(\n deps: EntityCanonicalIdMigrationDependencies,\n mappings: Readonly<Record<string, string>>,\n refreshLock: () => Promise<boolean>\n): Promise<{ rewroteColdMemory: boolean }> {\n let rewroteColdMemory = false;\n for (let pass = 0; pass < MEMORY_REWRITE_MAX_PASSES; pass += 1) {\n deps.invalidateAllMemoriesCache();\n deps.invalidateColdMemoriesCache();\n const [hotMemories, coldMemories, archivedMemories] = await Promise.all([\n deps.readAllMemories(),\n deps.readAllColdMemories(),\n deps.readArchivedMemories(),\n ]);\n const seenPaths = new Set<string>();\n let rewroteAny = false;\n for (const memory of [...hotMemories, ...coldMemories, ...archivedMemories]) {\n const memoryPath = path.resolve(memory.path);\n if (seenPaths.has(memoryPath)) continue;\n seenPaths.add(memoryPath);\n const previousEntityRef = memory.frontmatter.entityRef;\n const canonicalId = previousEntityRef ? mappings[previousEntityRef] : undefined;\n if (!previousEntityRef || !canonicalId) continue;\n await assertNotMemorySymlink(memory.path);\n const observedMemoryFingerprint = await fingerprintPath(memory.path);\n if (observedMemoryFingerprint === \"missing\") continue;\n if (!(await refreshLock())) throw new Error(\"Lost entity canonical-id migration lock.\");\n const latestMemory = await deps.readMemoryByPath(memory.path);\n if (!latestMemory) continue;\n const latestMemoryFingerprint = await fingerprintPath(latestMemory.path);\n if (latestMemoryFingerprint !== observedMemoryFingerprint) continue;\n const latestPreviousEntityRef = latestMemory.frontmatter.entityRef;\n const latestCanonicalId = latestPreviousEntityRef ? mappings[latestPreviousEntityRef] : undefined;\n if (!latestPreviousEntityRef || !latestCanonicalId) continue;\n const memoryEncrypted = await deps.isEncryptedStorageFile(latestMemory.path);\n if ((await fingerprintPath(latestMemory.path)) !== latestMemoryFingerprint) continue;\n await deps.snapshotBeforeWrite(latestMemory.path, \"write\");\n if ((await fingerprintPath(latestMemory.path)) !== latestMemoryFingerprint) continue;\n await deps.writeStorageSecureFile(\n latestMemory.path,\n deps.serializeMemoryWithEntityRef(latestMemory, latestCanonicalId),\n memoryEncrypted,\n );\n await deps.rewriteProjectedMemoryEntityReference(\n latestMemory.frontmatter.id,\n latestPreviousEntityRef,\n latestCanonicalId,\n );\n rewroteAny = true;\n rewroteColdMemory ||= latestMemory.path.includes(`${path.sep}cold${path.sep}`);\n }\n if (!rewroteAny) return { rewroteColdMemory };\n }\n throw new Error(\"Memory references changed while entity canonical-id migration was running; retry migration.\");\n}\n\nfunction rewriteTombstoneLine(\n line: string,\n mappings: Readonly<Record<string, string>>,\n normalizedMappings: ReadonlyMap<string, string>,\n): string {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return line;\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return line;\n\n const tombstone = parsed as Record<string, unknown>;\n let changed = false;\n if (typeof tombstone.entityRef === \"string\") {\n const canonicalId = mappings[tombstone.entityRef];\n if (canonicalId) {\n tombstone.entityRef = canonicalId;\n changed = true;\n }\n }\n if (typeof tombstone.supersessionKey === \"string\") {\n const separator = tombstone.supersessionKey.indexOf(\"::\");\n if (separator < 0) return changed ? JSON.stringify(tombstone) : line;\n const normalizedLegacyId = normalizeSupersessionKey(tombstone.supersessionKey.slice(0, separator));\n const canonicalId = normalizedMappings.get(normalizedLegacyId);\n if (canonicalId) {\n const canonicalKey = computeSupersessionKey(canonicalId, tombstone.supersessionKey.slice(separator + 2));\n if (canonicalKey) {\n tombstone.supersessionKey = canonicalKey;\n changed = true;\n }\n }\n }\n return changed ? JSON.stringify(tombstone) : line;\n}\n\nasync function rewriteTombstoneReferences(\n deps: EntityCanonicalIdMigrationDependencies,\n mappings: Readonly<Record<string, string>>,\n refreshLock: () => Promise<boolean>\n): Promise<void> {\n const tombstonePath = path.join(deps.stateDir, \"tombstones.jsonl\");\n const normalizedMappings = new Map<string, string>();\n for (const [legacyId, canonicalId] of Object.entries(mappings)) {\n const normalizedLegacyId = normalizeSupersessionKey(legacyId);\n if (normalizedLegacyId && !normalizedMappings.has(normalizedLegacyId)) {\n normalizedMappings.set(normalizedLegacyId, canonicalId);\n }\n }\n\n await withHeldFileLock(\n path.join(deps.stateDir, \"tombstones.lock\"),\n {\n staleMs: TOMBSTONE_LOCK_STALE_MS,\n maxWaitMs: TOMBSTONE_LOCK_MAX_WAIT_MS,\n },\n async (acquired, tombstoneLock) => {\n if (!acquired) throw new Error(\"Timed out waiting for active tombstone migration.\");\n if (!(await assertSafeTombstoneFile(deps, tombstonePath))) return;\n const tombstoneEncrypted = await deps.isEncryptedStorageFile(tombstonePath);\n const original = await deps.readStorageSecureFile(tombstonePath);\n let changed = false;\n const rewritten = original\n .split(\"\\n\")\n .map((line) => {\n const next = rewriteTombstoneLine(line, mappings, normalizedMappings);\n changed ||= next !== line;\n return next;\n })\n .join(\"\\n\");\n if (!changed) return;\n if (!(await refreshLock())) throw new Error(\"Lost entity canonical-id migration lock.\");\n if (!(await tombstoneLock.refresh())) throw new Error(\"Lost tombstone migration lock.\");\n await deps.snapshotBeforeWrite(tombstonePath, \"write\");\n await deps.writeStorageSecureFile(tombstonePath, rewritten, tombstoneEncrypted);\n },\n );\n}\n\nasync function rewriteRelationshipTargets(\n deps: EntityCanonicalIdMigrationDependencies,\n mappings: Readonly<Record<string, string>>,\n refreshLock: () => Promise<boolean>\n): Promise<boolean> {\n let rewritten = false;\n const entries = await readSafeEntityEntries(deps.entitiesDir);\n for (const entry of entries) {\n if (!entry.endsWith(\".md\") || isMacOsReplicationJunkBasename(entry)) continue;\n const entityPath = deps.resolveEntityFilePath(entry.slice(0, -\".md\".length));\n if (entityPath === null) continue;\n const observedEntityFingerprint = await fingerprintPath(entityPath);\n if (observedEntityFingerprint === \"missing\") continue;\n const entityRaw = await deps.readStorageSecureFile(entityPath);\n if (isMalformedEntityRecord(entityRaw)) continue;\n const entity = deps.parseEntityFile(entityRaw);\n const relationships = entity.relationships.map((relationship) => {\n const target = mappings[relationship.target];\n return target ? { ...relationship, target } : relationship;\n });\n if (relationships.every((relationship, index) => relationship === entity.relationships[index])) continue;\n const rewroteEntity = await withEntityCanonicalMutationLock(\n deps.stateDir,\n async (refreshEntityLock) => {\n if (!(await refreshLock())) throw new Error(\"Lost entity canonical-id migration lock.\");\n const latestRaw = await deps.readStorageSecureFile(entityPath);\n if (isMalformedEntityRecord(latestRaw)) return false;\n const latestEntity = deps.parseEntityFile(latestRaw);\n if ((await fingerprintPath(entityPath)) !== observedEntityFingerprint) return false;\n const latestRelationships = latestEntity.relationships.map((relationship) => {\n const target = mappings[relationship.target];\n return target ? { ...relationship, target } : relationship;\n });\n if (latestRelationships.every((relationship, index) => relationship === latestEntity.relationships[index])) {\n return false;\n }\n const entityEncrypted = await deps.isEncryptedStorageFile(entityPath);\n if (!(await refreshEntityLock())) throw new Error(\"Lost entity mutation lock.\");\n if ((await fingerprintPath(entityPath)) !== observedEntityFingerprint) return false;\n await deps.snapshotBeforeWrite(entityPath, \"write\");\n if ((await fingerprintPath(entityPath)) !== observedEntityFingerprint) return false;\n await deps.writeStorageSecureFile(\n entityPath,\n deps.serializeEntityFile({ ...latestEntity, relationships: latestRelationships }),\n entityEncrypted,\n );\n return true;\n },\n );\n rewritten ||= rewroteEntity;\n }\n return rewritten;\n}\n\nasync function rewriteKnownReferences(\n deps: EntityCanonicalIdMigrationDependencies,\n mappings: Readonly<Record<string, string>>,\n refreshLock: () => Promise<boolean>,\n): Promise<boolean> {\n await rewriteRelationshipTargets(deps, mappings, refreshLock);\n let rewroteColdMemory = (await rewriteReferences(deps, mappings, refreshLock)).rewroteColdMemory;\n await rewriteTombstoneReferences(deps, mappings, refreshLock);\n await deps.rewriteProjectedEntityReferences(mappings);\n const finalMemoryPass = await rewriteReferences(deps, mappings, refreshLock);\n rewroteColdMemory ||= finalMemoryPass.rewroteColdMemory;\n return rewroteColdMemory;\n}\n\nfunction wouldCreateMappingCycle(\n mappings: Readonly<Record<string, string>>,\n legacyId: string,\n canonicalId: string,\n): boolean {\n let current = canonicalId;\n const seen = new Set<string>();\n while (true) {\n if (current === legacyId) return true;\n if (seen.has(current)) return false;\n seen.add(current);\n const next = mappings[current];\n if (!next || next === current) return false;\n current = next;\n }\n}\n\nfunction rejectMappingCycles(\n existing: Readonly<Record<string, string>>,\n discovered: Readonly<Record<string, string>>,\n): Record<string, string> {\n const accepted: Record<string, string> = {};\n const merged = { ...existing };\n for (const [legacyId, canonicalId] of Object.entries(discovered)) {\n if (\n merged[legacyId] === undefined &&\n wouldCreateMappingCycle(merged, legacyId, canonicalId)\n ) continue;\n accepted[legacyId] = canonicalId;\n merged[legacyId] = canonicalId;\n }\n return accepted;\n}\n\nfunction mergeDiscoveredMappings(\n existing: Readonly<Record<string, string>>,\n discovered: Readonly<Record<string, string>>,\n): Record<string, string> {\n const merged = { ...existing };\n const canonicalOwners = new Map<string, string>();\n for (const [legacyId, canonicalId] of Object.entries(discovered)) {\n const previousMapping = merged[legacyId];\n if (previousMapping !== undefined && previousMapping !== canonicalId) {\n continue;\n }\n if (previousMapping === undefined && wouldCreateMappingCycle(merged, legacyId, canonicalId)) continue;\n const previousOwner = canonicalOwners.get(canonicalId);\n if (previousOwner !== undefined && previousOwner !== legacyId) {\n throw new Error(\n `Cannot migrate legacy entity ids ${previousOwner} and ${legacyId}: both normalize to ${canonicalId}.`,\n );\n }\n merged[legacyId] = canonicalId;\n canonicalOwners.set(canonicalId, legacyId);\n }\n return merged;\n}\nfunction collapseMappings(mappings: Readonly<Record<string, string>>): Record<string, string> {\n const collapsed: Record<string, string> = {};\n for (const legacyId of Object.keys(mappings)) {\n let current = legacyId;\n const seen = new Set<string>();\n while (true) {\n const next = mappings[current];\n if (!next || next === current) break;\n if (seen.has(current)) {\n throw new Error(`Entity canonical-id migration mapping cycle includes ${legacyId}.`);\n }\n seen.add(current);\n current = next;\n }\n if (current !== legacyId) collapsed[legacyId] = current;\n }\n return collapsed;\n}\n\ntype EntityFileMigrationResult = {\n deferred: boolean;\n progressed: boolean;\n /** The pair collided on content; skipped and reported, never migrated. */\n blocked?: boolean;\n};\n\nasync function migrateEntityFilePair(\n deps: EntityCanonicalIdMigrationDependencies,\n legacyId: string,\n canonicalId: string,\n refreshMigrationLock: () => Promise<boolean>,\n): Promise<EntityFileMigrationResult> {\n return withEntityCanonicalMutationLock(deps.stateDir, async (refreshEntityLock) => {\n assertSafeEntityId(legacyId);\n assertSafeEntityId(canonicalId);\n const legacyPath = deps.resolveEntityFilePath(legacyId);\n const canonicalPath = deps.resolveEntityFilePath(canonicalId);\n if (legacyPath === null || canonicalPath === null) {\n throw new Error(\"Invalid entity canonical-id migration path.\");\n }\n await assertNotSymlink(legacyPath, legacyId);\n await assertNotSymlink(canonicalPath, canonicalId);\n const legacyExists = await fileExists(legacyPath);\n const canonicalExists = await fileExists(canonicalPath);\n if (!legacyExists && !canonicalExists) return { deferred: true, progressed: false };\n if (legacyExists && canonicalExists) {\n if (await sameFileIdentity(legacyPath, canonicalPath)) return { deferred: false, progressed: false };\n const [legacyContent, canonicalContent, legacyEncrypted, canonicalEncrypted] = await Promise.all([\n deps.readStorageSecureFile(legacyPath),\n deps.readStorageSecureFile(canonicalPath),\n deps.isEncryptedStorageFile(legacyPath),\n deps.isEncryptedStorageFile(canonicalPath),\n ]);\n if (legacyContent !== canonicalContent) {\n // A mapping persisted by an older build, or a file changed since\n // discovery. Same verdict as discovery: skip the pair, keep both files.\n return { deferred: false, progressed: false, blocked: true };\n }\n if (legacyEncrypted && !canonicalEncrypted) {\n if (!(await refreshMigrationLock()) || !(await refreshEntityLock())) {\n throw new Error(\"Lost entity canonical-id migration lock.\");\n }\n await deps.snapshotBeforeWrite(canonicalPath, \"write\");\n await deps.writeStorageSecureFile(canonicalPath, legacyContent, true);\n if ((await deps.readStorageSecureFile(canonicalPath)) !== legacyContent) {\n throw new Error(`Cannot verify migrated entity id ${canonicalId}.`);\n }\n }\n if (!(await refreshMigrationLock()) || !(await refreshEntityLock())) {\n throw new Error(\"Lost entity canonical-id migration lock.\");\n }\n await deps.snapshotBeforeWrite(legacyPath, \"write\");\n await assertNotSymlink(legacyPath, legacyId);\n await assertEntityContentUnchanged(deps, legacyPath, legacyContent, legacyId);\n await unlink(legacyPath);\n return { deferred: false, progressed: true };\n }\n if (!legacyExists) return { deferred: false, progressed: false };\n if (!(await refreshMigrationLock()) || !(await refreshEntityLock())) {\n throw new Error(\"Lost entity canonical-id migration lock.\");\n }\n const entityEncrypted = await deps.isEncryptedStorageFile(legacyPath);\n const entityContent = await deps.readStorageSecureFile(legacyPath);\n await assertNotSymlink(legacyPath, legacyId);\n await assertEntityContentUnchanged(deps, legacyPath, entityContent, legacyId);\n // A journal entry must not relocate Finder metadata or a record this scan\n // would leave in place. readStorageSecureFile has already decrypted, so\n // the check is on that plaintext. The mapping stays for a later repair.\n if (\n isMacOsReplicationJunkBasename(path.basename(legacyPath))\n || isMalformedEntityRecord(entityContent)\n ) {\n return { deferred: false, progressed: false };\n }\n let canonicalFingerprintAfterWrite: string | null = null;\n try {\n await deps.writeStorageSecureFile(canonicalPath, entityContent, entityEncrypted);\n canonicalFingerprintAfterWrite = await fingerprintPath(canonicalPath);\n if ((await deps.readStorageSecureFile(canonicalPath)) !== entityContent) {\n throw new Error(`Cannot verify migrated entity id ${canonicalId}.`);\n }\n if (!(await refreshMigrationLock()) || !(await refreshEntityLock())) {\n throw new Error(\"Lost entity canonical-id migration lock.\");\n }\n await deps.snapshotBeforeWrite(legacyPath, \"write\");\n await assertNotSymlink(legacyPath, legacyId);\n await assertEntityContentUnchanged(deps, legacyPath, entityContent, legacyId);\n await unlink(legacyPath);\n } catch (error) {\n if (!canonicalExists && canonicalFingerprintAfterWrite !== null) {\n try {\n if ((await fingerprintPath(canonicalPath)) === canonicalFingerprintAfterWrite) {\n await assertNotSymlink(canonicalPath, canonicalId);\n await unlink(canonicalPath);\n }\n } catch {\n // Preserve the migration error when cleanup races another writer.\n }\n }\n throw error;\n }\n return { deferred: false, progressed: true };\n });\n}\n\nexport async function migrateLegacyEntityCanonicalIds(\n deps: EntityCanonicalIdMigrationDependencies,\n): Promise<string | undefined> {\n return withHeldFileLock(\n lockPath(deps),\n {\n staleMs: ENTITY_CANONICAL_ID_MIGRATION_LOCK_STALE_MS,\n maxWaitMs: ENTITY_CANONICAL_ID_MIGRATION_LOCK_MAX_WAIT_MS,\n },\n async (acquired, lock) => {\n if (!acquired) throw new Error(\"Timed out waiting for active entity canonical-id migration.\");\n await deps.validateMemoryScanRoots?.();\n await readSafeEntityEntries(deps.entitiesDir);\n // A raw-byte writer (offline sync, consolidation-undo, governance\n // restore) may have landed memory bytes this process never vetted; the\n // marker requests ONE reference-reconciliation pass (issue #2213). The\n // observed generation is RENAMED aside before the pass so a request made\n // WHILE this run scans creates a fresh marker that survives finish() —\n // and a `.consuming` file left by a crashed run still owes its pass.\n const reconcileMarkerPath = path.join(deps.stateDir, ENTITY_CANONICAL_ID_RECONCILE_MARKER);\n const consumingMarkerPath = path.join(deps.stateDir, ENTITY_CANONICAL_ID_RECONCILE_CONSUMING_MARKER);\n let reconcileRequested = await fileExists(consumingMarkerPath);\n if (await fileExists(reconcileMarkerPath)) {\n try {\n await rename(reconcileMarkerPath, consumingMarkerPath);\n reconcileRequested = true;\n } catch (error) {\n if (!isErrnoCode(error, \"ENOENT\")) throw error;\n }\n }\n let state = await readState(deps);\n if (!state) {\n state = {\n version: ENTITY_CANONICAL_ID_MIGRATION_VERSION,\n complete: false,\n mappings: {},\n };\n }\n const blocked: BlockedEntityPairs = new Map();\n const scanNotes: EntityScanNotes = { junk: new Set(), malformed: new Set() };\n // Parks for pairs whose files are GONE, tracked separately from\n // collision parks: pruneBlocked drops these (the canonical file is gone\n // too), and the rescan's blocked.clear() would otherwise silence them\n // before finish() reports anything.\n const staleParked: BlockedEntityPairs = new Map();\n // ONE aggregated line per run, not one per pair per restart: this used to\n // abort the daemon, so the operator needs the whole list and the remedy.\n const finish = async (): Promise<string | undefined> => {\n if (blocked.size > 0) {\n const pairs = [...blocked].map(([legacyId, canonicalId]) => `${legacyId} -> ${canonicalId}`).join(\", \");\n log.warn(\n `entity canonical-id migration skipped ${blocked.size} unresolvable pair(s): ${pairs}. `\n + \"Both files were kept and the legacy id still resolves; merge or delete one side to migrate it.\",\n );\n }\n if (staleParked.size > 0) {\n const pairs = [...staleParked].map(([legacyId, canonicalId]) => `${legacyId} -> ${canonicalId}`).join(\", \");\n log.warn(\n `entity canonical-id migration dropped ${staleParked.size} mapping(s) whose entity files are gone: ${pairs}. `\n + \"The stale journal entries were removed; references to those legacy ids do not resolve either way.\",\n );\n }\n warnIgnoredMacOsReplicationJunk(deps.entitiesDir, scanNotes.junk.size, (message) => {\n log.warn(`entity canonical-id migration ${message}`);\n });\n if (scanNotes.malformed.size > 0) {\n const names = [...scanNotes.malformed].sort().join(\", \");\n log.warn(\n `entity canonical-id migration skipped ${scanNotes.malformed.size} malformed entity file(s): ${names}. `\n + \"Each file was left in place; startup continues. Fix or remove the file to migrate it.\",\n );\n }\n // Every finish() path either just rewrote references (main/reconcile\n // paths), has none to rewrite (empty mappings), or observed no marker\n // (stable no-op) — so the CONSUMED generation is removed here. A fresh\n // marker written mid-run is untouched, and a crash before this point\n // leaves `.consuming` set for the next run (the rewrite is idempotent).\n if (reconcileRequested) {\n await unlink(consumingMarkerPath).catch((error: unknown) => {\n if (!isErrnoCode(error, \"ENOENT\")) throw error;\n });\n }\n // A FRESH marker written while this run scanned means bytes landed the\n // pass may not have covered. Withholding the completion fingerprint\n // makes the runner's stability check fail, so it immediately retries —\n // and the retry consumes the fresh generation. ORDER MATTERS: read the\n // fingerprint BEFORE the marker check. A marker landing after the\n // fingerprint read but before the check is caught by the check; one\n // landing after the check is absent from the returned fingerprint, so\n // the live marker mismatches the runner's cached completion and the\n // next ensure() re-invokes. Checking first left a window where the\n // fingerprint could SEAL a marker the check never saw.\n const completionFingerprint = await deps.readMigrationFingerprint?.();\n if (await fileExists(reconcileMarkerPath)) return undefined;\n return completionFingerprint;\n };\n /**\n * Drop blocked pairs from the working set. Discovery only refuses to\n * ADD them; a mapping persisted by an earlier run would otherwise still\n * be applied - migrating one claimant and rewriting every reference onto\n * the canonical file, i.e. picking the winner this fix exists to avoid,\n * off stale state rather than what is on disk.\n */\n /** @returns true when a park was promoted back into the mapping set. */\n const pruneBlocked = async (): Promise<boolean> => {\n const current = state;\n if (!current) return false;\n // THIS scan's verdict wins over the journal: normalization can change\n // between runs, so a stale parked target would otherwise be promoted\n // later and rewrite references onto an id that does not exist.\n let revived = false;\n const parked: Record<string, string> = { ...(current.blocked ?? {}) };\n const active: Record<string, string> = {};\n for (const [legacyId, canonicalId] of Object.entries(current.mappings)) {\n if (!blocked.has(legacyId)) active[legacyId] = canonicalId;\n }\n for (const [legacyId, canonicalId] of blocked) parked[legacyId] = canonicalId;\n // A parked pair whose legacy file is gone was resolved by keeping the\n // canonical side. The rename is moot; the reference rewrite is not, and\n // this record is the only thing that can still perform it.\n // A park survives ONLY while this scan re-establishes the collision.\n // Anything else - the scan found a real migration, or found the source\n // needs none (already canonical under a newer normalization) - makes\n // the record obsolete, and keeping it lets a later deletion promote a\n // target the entity never occupied.\n for (const [legacyId, canonicalId] of Object.entries(parked)) {\n if (blocked.has(legacyId)) continue;\n delete parked[legacyId];\n if (active[legacyId] !== undefined) continue;\n const legacyPath = deps.resolveEntityFilePath(legacyId);\n if (legacyPath !== null && (await fileExists(legacyPath))) continue;\n // Resolve the parked target through ACTIVE moves before deciding\n // its file is gone: a parked A -> B beside an active B -> C must\n // promote to A -> C and rewrite, not drop because B was moved\n // out-of-band. Only a target with no surviving file may drop.\n let target = canonicalId;\n const seenTargets = new Set<string>();\n while (active[target] !== undefined && !seenTargets.has(target)) {\n seenTargets.add(target);\n target = active[target]!;\n }\n const targetPath = deps.resolveEntityFilePath(target);\n if (targetPath === null || !(await fileExists(targetPath))) {\n staleParked.set(legacyId, canonicalId);\n continue;\n }\n active[legacyId] = target;\n revived = true;\n }\n // Reviving a whole chain at once yields A -> B -> C, and each rewrite\n // surface makes a different number of passes over it - so collapse\n // transitively before anything consumes the set.\n const collapsed = collapseMappings(active);\n // Parked targets follow ACTIVE moves only: hopping over a still-blocked\n // link would jump to an id the migration has not been allowed to reach.\n for (const [legacyId, canonicalId] of Object.entries(parked)) {\n const moved = collapsed[canonicalId];\n if (moved !== undefined && moved !== legacyId) parked[legacyId] = moved;\n }\n const same = (a: Record<string, string>, b: Record<string, string>): boolean =>\n Object.keys(a).length === Object.keys(b).length\n && Object.entries(a).every(([key, value]) => b[key] === value);\n if (same(collapsed, current.mappings) && same(parked, current.blocked ?? {})) return revived;\n // Parking/removing an active mapping mid-entity-write would land an\n // alias/activity/relationship mutation on a now-unrelated canonical\n // claimant — the reconcile pass rewrites references, it cannot move\n // a misplaced mutation. publishState serializes under the lock.\n state = { ...current, mappings: collapsed, blocked: parked };\n await publishState(deps, state);\n return revived;\n };\n const previousMappings = state.mappings;\n const collapsedMappings = collapseMappings(previousMappings);\n const mappingsChanged =\n Object.keys(collapsedMappings).length !== Object.keys(previousMappings).length\n || Object.entries(collapsedMappings).some(([legacyId, canonicalId]) =>\n previousMappings[legacyId] !== canonicalId\n );\n state = { ...state, mappings: collapsedMappings };\n for (let migrationPass = 0; migrationPass < ENTITY_MAPPING_RESCAN_MAX_PASSES; migrationPass += 1) {\n if (!(await lock.refresh())) throw new Error(\"Lost entity canonical-id migration lock.\");\n const discoveredBefore = rejectMappingCycles(\n state.mappings,\n await discoverMappings(deps, state.mappings, blocked, scanNotes),\n );\n const revivedBefore = await pruneBlocked();\n const mergedBefore = collapseMappings(mergeDiscoveredMappings(state.mappings, discoveredBefore));\n // Stable completed journal → no-op (issue #2213). Retained mappings are\n // read-compat state whose references were already rewritten (to\n // convergence) before `complete: true` was persisted, so re-running\n // `rewriteKnownReferences` here re-read the ENTIRE hot+cold+archived\n // corpus — twice — and invalidated every memory cache on EVERY\n // `ensureDirectories()`. On a write-active daemon that was a\n // self-sustaining hot loop (multi-GB/s of re-reads, caches never warm,\n // recall degraded to the fallback path). A park revived by THIS run's\n // pruneBlocked still owes its reference rewrite: it falls through to\n // the main flow below, which demotes `complete` BEFORE rewriting — so\n // a crash mid-rewrite resumes, which the old in-place rewrite did not.\n if (\n state.complete\n && Object.keys(discoveredBefore).length === 0\n && !mappingsChanged\n && !revivedBefore\n ) {\n // Stable journal, but a raw-byte writer requested reconciliation:\n // run ONE bounded rewrite pass over the retained mappings, then let\n // finish() consume the marker.\n if (reconcileRequested && Object.keys(state.mappings).length > 0) {\n const rewroteColdMemory = await rewriteKnownReferences(\n deps,\n state.mappings,\n () => lock.refresh(),\n );\n deps.invalidateKnowledgeIndexCache();\n deps.invalidateAllMemoriesCache();\n if (rewroteColdMemory) deps.invalidateColdMemoriesCache();\n deps.bumpMemoryStatusVersion();\n }\n return finish();\n }\n if (\n state.complete\n || Object.keys(discoveredBefore).length > 0\n || Object.keys(mergedBefore).length !== Object.keys(state.mappings).length\n ) {\n state = { ...state, complete: false, mappings: mergedBefore };\n await publishState(deps, state);\n }\n if (Object.keys(state.mappings).length === 0) {\n if (!(await lock.refresh())) throw new Error(\"Lost entity canonical-id migration lock.\");\n const discoveredAfter = rejectMappingCycles(\n state.mappings,\n await discoverMappings(deps, state.mappings, blocked, scanNotes),\n );\n // Reconcile before declaring completion: this rescan can resolve a\n // park (another writer removed the legacy file), and completing\n // without promoting it strands its references behind a fingerprint\n // that already reflects the deletion - so no later run revisits it.\n const revivedInRescan = await pruneBlocked();\n if (Object.keys(discoveredAfter).length === 0 && !revivedInRescan) {\n await publishState(deps, { ...state, complete: true });\n return finish();\n }\n state = {\n ...state,\n complete: false,\n mappings: collapseMappings(mergeDiscoveredMappings(state.mappings, discoveredAfter)),\n };\n await publishState(deps, state);\n continue;\n }\n let pendingMappings = Object.entries(state.mappings);\n while (pendingMappings.length > 0) {\n const deferredMappings: Array<[string, string]> = [];\n let progressed = false;\n for (const [legacyId, canonicalId] of pendingMappings) {\n const result = await migrateEntityFilePair(\n deps,\n legacyId,\n canonicalId,\n () => lock.refresh(),\n );\n if (result.blocked) blocked.set(legacyId, canonicalId);\n else if (result.deferred) deferredMappings.push([legacyId, canonicalId]);\n progressed ||= result.progressed;\n }\n if (deferredMappings.length === 0) break;\n if (!progressed) {\n // Deferred means both files are missing: no later pass can help\n // these pairs, so park them all instead of Fatal-exiting.\n for (const [legacyId, canonicalId] of deferredMappings) {\n blocked.set(legacyId, canonicalId);\n staleParked.set(legacyId, canonicalId);\n }\n break;\n }\n pendingMappings = deferredMappings;\n }\n await pruneBlocked();\n\n const rewroteColdMemory = await rewriteKnownReferences(\n deps,\n state.mappings,\n () => lock.refresh(),\n );\n deps.invalidateKnowledgeIndexCache();\n deps.invalidateAllMemoriesCache();\n if (rewroteColdMemory) deps.invalidateColdMemoriesCache();\n deps.bumpMemoryStatusVersion();\n\n if (!(await lock.refresh())) throw new Error(\"Lost entity canonical-id migration lock.\");\n const discoveredAfter = rejectMappingCycles(\n state.mappings,\n await discoverMappings(deps, state.mappings, blocked, scanNotes),\n );\n // A park resolved after the rewrite pass is promoted here, and a\n // promotion still has to be APPLIED. Completing on `discoveredAfter`\n // alone fingerprints the post-deletion corpus, so the runner never\n // retries and those references stay stranded.\n const revivedAfterRewrite = await pruneBlocked();\n if (Object.keys(discoveredAfter).length === 0 && !revivedAfterRewrite) {\n await publishState(deps, { ...state, complete: true });\n return finish();\n }\n state = {\n ...state,\n complete: false,\n mappings: collapseMappings(mergeDiscoveredMappings(state.mappings, discoveredAfter)),\n };\n await publishState(deps, state);\n }\n throw new Error(\"Entity canonical-id migration mappings changed while migration was running; retry migration.\");\n }\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAAY,kBAAkB;AACvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,OACK;AACP,OAAO,UAAU;AAEjB,SAAS,SAAS;AAuBlB,IAAM,wCAAwC;AAC9C,IAAM,8CAA8C;AACpD,IAAM,iDAAiD;AACvD,IAAM,0BAA0B;AAChC,IAAM,6BAA6B;AACnC,IAAM,4BAA4B;AAClC,IAAM,mCAAmC;AAEzC,IAAM,wCAAwC,EAAE,OAAO;AAAA,EACrD,SAAS,EAAE,QAAQ,qCAAqC;AAAA,EACxD,UAAU,EAAE,QAAQ;AAAA,EACpB,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQpC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAChD,CAAC;AAkCD,eAAe,gBAAgB,UAAmC;AAChE,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM,QAAQ;AAAA,EACjC,SAAS,OAAO;AACd,QAAI,CAAC,YAAY,OAAO,QAAQ,EAAG,OAAM;AAAA,EAC3C;AACA,SAAO,WACH,GAAG,SAAS,GAAG,IAAI,SAAS,GAAG,IAAI,SAAS,OAAO,IAAI,SAAS,OAAO,IAAI,SAAS,IAAI,KACxF;AACN;AAEA,eAAe,yBAAyB,aAAsC;AAC5E,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,QAAQ,WAAW,GAC/B,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,SAAS,CAAC,+BAA+B,IAAI,CAAC,EACtF,KAAK;AAAA,EACV,SAAS,OAAO;AACd,QAAI,YAAY,OAAO,QAAQ,EAAG,QAAO;AACzC,UAAM;AAAA,EACR;AACA,QAAM,OAAO,WAAW,QAAQ;AAChC,aAAW,QAAQ,OAAO;AACxB,SAAK,OAAO,GAAG,KAAK,MAAM,IAAI,IAAI,GAAG;AACrC,QAAI;AACF,YAAM,QAAQ,MAAM,MAAM,KAAK,KAAK,aAAa,IAAI,GAAG,EAAE,QAAQ,KAAK,CAAC;AACxE,WAAK,OAAO,GAAG,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,MAAM,OAAO,IAAI,MAAM,OAAO,EAAE;AAAA,IACzF,SAAS,OAAO;AACd,UAAI,CAAC,YAAY,OAAO,QAAQ,EAAG,OAAM;AACzC,WAAK,OAAO,SAAS;AAAA,IACvB;AACA,SAAK,OAAO,IAAI;AAAA,EAClB;AACA,SAAO,KAAK,OAAO,KAAK;AAC1B;AAQA,eAAsB,eACpB,SACA,aACA,0BACiB;AACjB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpB,gBAAgB,WAAW;AAAA,IAC3B,yBAAyB,WAAW;AAAA,IACpC,gBAAgB,KAAK,KAAK,SAAS,UAAU,cAAc,CAAC;AAAA,IAC5D,gBAAgB,KAAK,KAAK,SAAS,SAAS,oCAAoC,CAAC;AAAA,IACjF,gBAAgB,KAAK,KAAK,SAAS,SAAS,8CAA8C,CAAC;AAAA,EAC7F,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,yBAAyB;AAAA,EAC3B,EAAE,KAAK,GAAG;AACZ;AAEA,eAAsB,cACpB,SACA,aACA,UACA,YACe;AACf,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM,OAAO;AAAA,EAChC,SAAS,OAAO;AACd,QAAI,YAAY,OAAO,QAAQ,EAAG;AAClC,UAAM;AAAA,EACR;AACA,MAAI,SAAS,eAAe,KAAK,CAAC,SAAS,YAAY,GAAG;AACxD,UAAM,IAAI,MAAM,sEAAsE,OAAO,GAAG;AAAA,EAClG;AACA,QAAM,aAAa,MAAM,SAAS,OAAO;AACzC,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,GAAG,qBAAqB,IAAI,CAAC,cAAc,KAAK,KAAK,SAAS,SAAS,CAAC;AAAA,IACxE,KAAK,KAAK,SAAS,MAAM;AAAA,IACzB;AAAA,EACF;AACA,aAAW,QAAQ,OAAO;AACxB,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,MAAM,IAAI;AAAA,IAC7B,SAAS,OAAO;AACd,UAAI,YAAY,OAAO,QAAQ,EAAG;AAClC,YAAM;AAAA,IACR;AACA,QAAI,SAAS,eAAe,KAAK,CAAC,SAAS,YAAY,GAAG;AACxD,YAAM,IAAI,MAAM,sEAAsE,IAAI,GAAG;AAAA,IAC/F;AACA,yBAAqB,YAAY,MAAM,SAAS,IAAI,GAAG,IAAI;AAAA,EAC7D;AACF;AAEA,SAAS,UAAU,MAAsD;AACvE,SAAO,KAAK,KAAK,KAAK,UAAU,kCAAkC;AACpE;AAEA,eAAe,6BACb,MACe;AACf,QAAM,qBAAqB,UAAU,IAAI;AACzC,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM,kBAAkB;AAAA,EAC3C,SAAS,OAAO;AACd,QAAI,YAAY,OAAO,QAAQ,EAAG;AAClC,UAAM;AAAA,EACR;AACA,MAAI,SAAS,eAAe,KAAK,CAAC,SAAS,OAAO,GAAG;AACnD,UAAM,IAAI;AAAA,MACR,+EAA+E,kBAAkB;AAAA,IACnG;AAAA,EACF;AACA,QAAM,CAAC,WAAW,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC/C,SAAS,KAAK,QAAQ;AAAA,IACtB,SAAS,kBAAkB;AAAA,EAC7B,CAAC;AACD,uBAAqB,WAAW,WAAW,kBAAkB;AAC/D;AACA,eAAe,wBACb,MACA,eACkB;AAClB,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM,aAAa;AAAA,EACtC,SAAS,OAAO;AACd,QAAI,YAAY,OAAO,QAAQ,EAAG,QAAO;AACzC,UAAM;AAAA,EACR;AACA,MAAI,SAAS,eAAe,KAAK,CAAC,SAAS,OAAO,GAAG;AACnD,UAAM,IAAI;AAAA,MACR,2EAA2E,aAAa;AAAA,IAC1F;AAAA,EACF;AACA,QAAM,CAAC,WAAW,aAAa,IAAI,MAAM,QAAQ,IAAI;AAAA,IACnD,SAAS,KAAK,QAAQ;AAAA,IACtB,SAAS,aAAa;AAAA,EACxB,CAAC;AACD,uBAAqB,WAAW,eAAe,aAAa;AAC5D,SAAO;AACT;AAEA,SAAS,SAAS,MAAsD;AACtE,SAAO,KAAK,KAAK,KAAK,UAAU,oCAAoC;AACtE;AAGA,eAAe,UACb,MACiD;AACjD,QAAM,6BAA6B,IAAI;AACvC,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,SAAS,UAAU,IAAI,GAAG,OAAO;AAAA,EAC/C,SAAS,OAAO;AACd,QAAI,YAAY,OAAO,QAAQ,EAAG,QAAO;AACzC,UAAM;AAAA,EACR;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,QAAM,SAAS,sCAAsC,UAAU,MAAM;AACrE,MAAI,CAAC,OAAO,QAAS,OAAM,IAAI,MAAM,8CAA8C;AACnF,aAAW,YAAY,CAAC,OAAO,KAAK,UAAU,OAAO,KAAK,WAAW,CAAC,CAAC,GAAG;AACxE,eAAW,CAAC,UAAU,WAAW,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC9D,yBAAmB,QAAQ;AAC3B,yBAAmB,WAAW;AAAA,IAChC;AAAA,EACF;AACA,SAAO,OAAO;AAChB;AAEA,eAAe,WACb,MACA,OACe;AACf,QAAM,cAAc,UAAU,IAAI;AAClC,QAAM,YAAY,GAAG,WAAW,IAAI,QAAQ,GAAG,IAAI,WAAW,CAAC;AAC/D,MAAI;AACF,UAAM,UAAU,WAAW,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,GAAM,OAAO;AACzE,UAAM,OAAO,WAAW,WAAW;AAAA,EACrC,UAAE;AACA,UAAM,OAAO,SAAS,EAAE,MAAM,MAAM,MAAS;AAAA,EAC/C;AACF;AAUA,eAAe,aACb,MACA,OACe;AACf,QAAM,gCAAgC,KAAK,UAAU,YAAY;AAC/D,UAAM,WAAW,MAAM,KAAK;AAAA,EAC9B,CAAC;AACH;AAEA,eAAe,WAAW,UAAoC;AAC5D,MAAI;AACF,UAAM,OAAO,QAAQ;AACrB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,YAAY,OAAO,QAAQ,EAAG,QAAO;AACzC,UAAM;AAAA,EACR;AACF;AAEA,eAAe,iBAAiB,UAAkB,WAAqC;AACrF,MAAI;AACF,UAAM,CAAC,MAAM,KAAK,IAAI,MAAM,QAAQ,IAAI,CAAC,SAAS,QAAQ,GAAG,SAAS,SAAS,CAAC,CAAC;AACjF,WAAO,KAAK,QAAQ,MAAM,OAAO,KAAK,QAAQ,MAAM;AAAA,EACtD,SAAS,OAAO;AACd,QAAI,YAAY,OAAO,QAAQ,EAAG,QAAO;AACzC,UAAM;AAAA,EACR;AACF;AAEA,eAAe,iBAAiB,UAAkB,OAA8B;AAC9E,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,MAAM,QAAQ;AAAA,EAC7B,SAAS,OAAO;AACd,QAAI,YAAY,OAAO,QAAQ,EAAG;AAClC,UAAM;AAAA,EACR;AACA,MAAI,KAAK,eAAe,GAAG;AACzB,UAAM,IAAI,MAAM,2DAA2D,KAAK,GAAG;AAAA,EACrF;AACF;AACA,eAAe,uBAAuB,UAAiC;AACrE,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,MAAM,QAAQ;AAAA,EAC7B,SAAS,OAAO;AACd,QAAI,YAAY,OAAO,QAAQ,EAAG;AAClC,UAAM;AAAA,EACR;AACA,MAAI,KAAK,eAAe,GAAG;AACzB,UAAM,IAAI,MAAM,oEAAoE,QAAQ,GAAG;AAAA,EACjG;AACF;AACA,eAAe,6BACb,MACA,UACA,iBACA,UACe;AACf,QAAM,gBAAgB,MAAM,KAAK,sBAAsB,QAAQ;AAC/D,MAAI,kBAAkB,iBAAiB;AACrC,UAAM,IAAI,MAAM,oBAAoB,QAAQ,wDAAwD;AAAA,EACtG;AACF;AAEA,eAAsB,sBAAsB,aAAwC;AAClF,QAAM,WAAW,MAAM,MAAM,WAAW;AACxC,MAAI,SAAS,eAAe,KAAK,CAAC,SAAS,YAAY,GAAG;AACxD,UAAM,IAAI,MAAM,4FAA4F;AAAA,EAC9G;AACA,QAAM,UAAU,MAAM,QAAQ,WAAW;AACzC,aAAW,SAAS,SAAS;AAC3B,UAAM,iBAAiB,KAAK,KAAK,aAAa,KAAK,GAAG,KAAK;AAAA,EAC7D;AACA,SAAO;AACT;AAgBA,eAAe,iBACb,MACA,gBAAkD,CAAC,GACnD,UAA8B,oBAAI,IAAI,GACtC,WACiC;AACjC,QAAM,WAAmC,CAAC;AAC1C,QAAM,kBAAkB,oBAAI,IAAsB;AAMlD,UAAQ,MAAM;AACd,QAAM,gBAAgB,MAAM,sBAAsB,KAAK,WAAW;AAClE,aAAW,SAAS,eAAe;AAMjC,QAAI,+BAA+B,KAAK,GAAG;AACzC,iBAAW,KAAK,IAAI,KAAK;AACzB;AAAA,IACF;AACA,QAAI,CAAC,MAAM,SAAS,KAAK,EAAG;AAC5B,UAAM,WAAW,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM;AAC7C,uBAAmB,QAAQ;AAC3B,UAAM,aAAa,KAAK,sBAAsB,QAAQ;AACtD,QAAI,eAAe,KAAM;AACzB,UAAM,gBAAgB,MAAM,KAAK,sBAAsB,UAAU;AACjE,QAAI,wBAAwB,aAAa,GAAG;AAC1C,iBAAW,UAAU,IAAI,KAAK;AAC9B;AAAA,IACF;AACA,UAAM,SAAS,KAAK,gBAAgB,aAAa;AACjD,QAAI,CAAC,OAAO,KAAK,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,GAAG;AAC9C,iBAAW,UAAU,IAAI,KAAK;AAC9B;AAAA,IACF;AACA,UAAM,cAAc,KAAK,oBAAoB,OAAO,MAAM,OAAO,IAAI;AACrE,uBAAmB,WAAW;AAC9B,QAAI,aAAa,YAAa;AAC9B,UAAM,gBAAgB,KAAK,sBAAsB,WAAW;AAC5D,QAAI,kBAAkB,KAAM;AAC5B,UAAM,kBAAkB,MAAM,WAAW,aAAa;AACtD,QACE,mBACG,MAAM,iBAAiB,YAAY,aAAa,KAChD,cAAc,QAAQ,MAAM,YAC/B;AACF,QAAI,iBAAiB;AACnB,YAAM,mBAAmB,MAAM,KAAK,sBAAsB,aAAa;AACvE,UAAI,kBAAkB,kBAAkB;AACtC,gBAAQ,IAAI,UAAU,WAAW;AACjC;AAAA,MACF;AAAA,IACF;AACA,oBAAgB,IAAI,aAAa,CAAC,GAAI,gBAAgB,IAAI,WAAW,KAAK,CAAC,GAAI,QAAQ,CAAC;AACxF,aAAS,QAAQ,IAAI;AAAA,EACvB;AAIA,aAAW,CAAC,aAAa,SAAS,KAAK,iBAAiB;AACtD,QAAI,UAAU,SAAS,EAAG;AAC1B,eAAW,YAAY,WAAW;AAChC,cAAQ,IAAI,UAAU,WAAW;AACjC,aAAO,SAAS,QAAQ;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,kBACb,MACA,UACA,aACyC;AACzC,MAAI,oBAAoB;AACxB,WAAS,OAAO,GAAG,OAAO,2BAA2B,QAAQ,GAAG;AAC9D,SAAK,2BAA2B;AAChC,SAAK,4BAA4B;AACjC,UAAM,CAAC,aAAa,cAAc,gBAAgB,IAAI,MAAM,QAAQ,IAAI;AAAA,MACtE,KAAK,gBAAgB;AAAA,MACrB,KAAK,oBAAoB;AAAA,MACzB,KAAK,qBAAqB;AAAA,IAC5B,CAAC;AACD,UAAM,YAAY,oBAAI,IAAY;AAClC,QAAI,aAAa;AACjB,eAAW,UAAU,CAAC,GAAG,aAAa,GAAG,cAAc,GAAG,gBAAgB,GAAG;AAC3E,YAAM,aAAa,KAAK,QAAQ,OAAO,IAAI;AAC3C,UAAI,UAAU,IAAI,UAAU,EAAG;AAC/B,gBAAU,IAAI,UAAU;AACxB,YAAM,oBAAoB,OAAO,YAAY;AAC7C,YAAM,cAAc,oBAAoB,SAAS,iBAAiB,IAAI;AACtE,UAAI,CAAC,qBAAqB,CAAC,YAAa;AACxC,YAAM,uBAAuB,OAAO,IAAI;AACxC,YAAM,4BAA4B,MAAM,gBAAgB,OAAO,IAAI;AACnE,UAAI,8BAA8B,UAAW;AAC7C,UAAI,CAAE,MAAM,YAAY,EAAI,OAAM,IAAI,MAAM,0CAA0C;AACtF,YAAM,eAAe,MAAM,KAAK,iBAAiB,OAAO,IAAI;AAC5D,UAAI,CAAC,aAAc;AACnB,YAAM,0BAA0B,MAAM,gBAAgB,aAAa,IAAI;AACvE,UAAI,4BAA4B,0BAA2B;AAC3D,YAAM,0BAA0B,aAAa,YAAY;AACzD,YAAM,oBAAoB,0BAA0B,SAAS,uBAAuB,IAAI;AACxF,UAAI,CAAC,2BAA2B,CAAC,kBAAmB;AACpD,YAAM,kBAAkB,MAAM,KAAK,uBAAuB,aAAa,IAAI;AAC3E,UAAK,MAAM,gBAAgB,aAAa,IAAI,MAAO,wBAAyB;AAC5E,YAAM,KAAK,oBAAoB,aAAa,MAAM,OAAO;AACzD,UAAK,MAAM,gBAAgB,aAAa,IAAI,MAAO,wBAAyB;AAC5E,YAAM,KAAK;AAAA,QACT,aAAa;AAAA,QACb,KAAK,6BAA6B,cAAc,iBAAiB;AAAA,QACjE;AAAA,MACF;AACA,YAAM,KAAK;AAAA,QACT,aAAa,YAAY;AAAA,QACzB;AAAA,QACA;AAAA,MACF;AACA,mBAAa;AACb,4BAAsB,aAAa,KAAK,SAAS,GAAG,KAAK,GAAG,OAAO,KAAK,GAAG,EAAE;AAAA,IAC/E;AACA,QAAI,CAAC,WAAY,QAAO,EAAE,kBAAkB;AAAA,EAC9C;AACA,QAAM,IAAI,MAAM,6FAA6F;AAC/G;AAEA,SAAS,qBACP,MACA,UACA,oBACQ;AACR,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,EAAG,QAAO;AAE3E,QAAM,YAAY;AAClB,MAAI,UAAU;AACd,MAAI,OAAO,UAAU,cAAc,UAAU;AAC3C,UAAM,cAAc,SAAS,UAAU,SAAS;AAChD,QAAI,aAAa;AACf,gBAAU,YAAY;AACtB,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,MAAI,OAAO,UAAU,oBAAoB,UAAU;AACjD,UAAM,YAAY,UAAU,gBAAgB,QAAQ,IAAI;AACxD,QAAI,YAAY,EAAG,QAAO,UAAU,KAAK,UAAU,SAAS,IAAI;AAChE,UAAM,qBAAqB,yBAAyB,UAAU,gBAAgB,MAAM,GAAG,SAAS,CAAC;AACjG,UAAM,cAAc,mBAAmB,IAAI,kBAAkB;AAC7D,QAAI,aAAa;AACf,YAAM,eAAe,uBAAuB,aAAa,UAAU,gBAAgB,MAAM,YAAY,CAAC,CAAC;AACvG,UAAI,cAAc;AAChB,kBAAU,kBAAkB;AAC5B,kBAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACA,SAAO,UAAU,KAAK,UAAU,SAAS,IAAI;AAC/C;AAEA,eAAe,2BACb,MACA,UACA,aACe;AACf,QAAM,gBAAgB,KAAK,KAAK,KAAK,UAAU,kBAAkB;AACjE,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,aAAW,CAAC,UAAU,WAAW,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC9D,UAAM,qBAAqB,yBAAyB,QAAQ;AAC5D,QAAI,sBAAsB,CAAC,mBAAmB,IAAI,kBAAkB,GAAG;AACrE,yBAAmB,IAAI,oBAAoB,WAAW;AAAA,IACxD;AAAA,EACF;AAEA,QAAM;AAAA,IACJ,KAAK,KAAK,KAAK,UAAU,iBAAiB;AAAA,IAC1C;AAAA,MACE,SAAS;AAAA,MACT,WAAW;AAAA,IACb;AAAA,IACA,OAAO,UAAU,kBAAkB;AACjC,UAAI,CAAC,SAAU,OAAM,IAAI,MAAM,mDAAmD;AAClF,UAAI,CAAE,MAAM,wBAAwB,MAAM,aAAa,EAAI;AAC3D,YAAM,qBAAqB,MAAM,KAAK,uBAAuB,aAAa;AAC1E,YAAM,WAAW,MAAM,KAAK,sBAAsB,aAAa;AAC/D,UAAI,UAAU;AACd,YAAM,YAAY,SACf,MAAM,IAAI,EACV,IAAI,CAAC,SAAS;AACb,cAAM,OAAO,qBAAqB,MAAM,UAAU,kBAAkB;AACpE,oBAAY,SAAS;AACrB,eAAO;AAAA,MACT,CAAC,EACA,KAAK,IAAI;AACZ,UAAI,CAAC,QAAS;AACd,UAAI,CAAE,MAAM,YAAY,EAAI,OAAM,IAAI,MAAM,0CAA0C;AACtF,UAAI,CAAE,MAAM,cAAc,QAAQ,EAAI,OAAM,IAAI,MAAM,gCAAgC;AACtF,YAAM,KAAK,oBAAoB,eAAe,OAAO;AACrD,YAAM,KAAK,uBAAuB,eAAe,WAAW,kBAAkB;AAAA,IAChF;AAAA,EACF;AACF;AAEA,eAAe,2BACb,MACA,UACA,aACkB;AAClB,MAAI,YAAY;AAChB,QAAM,UAAU,MAAM,sBAAsB,KAAK,WAAW;AAC5D,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,SAAS,KAAK,KAAK,+BAA+B,KAAK,EAAG;AACrE,UAAM,aAAa,KAAK,sBAAsB,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAC3E,QAAI,eAAe,KAAM;AACzB,UAAM,4BAA4B,MAAM,gBAAgB,UAAU;AAClE,QAAI,8BAA8B,UAAW;AAC7C,UAAM,YAAY,MAAM,KAAK,sBAAsB,UAAU;AAC7D,QAAI,wBAAwB,SAAS,EAAG;AACxC,UAAM,SAAS,KAAK,gBAAgB,SAAS;AAC7C,UAAM,gBAAgB,OAAO,cAAc,IAAI,CAAC,iBAAiB;AAC/D,YAAM,SAAS,SAAS,aAAa,MAAM;AAC3C,aAAO,SAAS,EAAE,GAAG,cAAc,OAAO,IAAI;AAAA,IAChD,CAAC;AACD,QAAI,cAAc,MAAM,CAAC,cAAc,UAAU,iBAAiB,OAAO,cAAc,KAAK,CAAC,EAAG;AAChG,UAAM,gBAAgB,MAAM;AAAA,MAC1B,KAAK;AAAA,MACL,OAAO,sBAAsB;AAC3B,YAAI,CAAE,MAAM,YAAY,EAAI,OAAM,IAAI,MAAM,0CAA0C;AACtF,cAAM,YAAY,MAAM,KAAK,sBAAsB,UAAU;AAC7D,YAAI,wBAAwB,SAAS,EAAG,QAAO;AAC/C,cAAM,eAAe,KAAK,gBAAgB,SAAS;AACnD,YAAK,MAAM,gBAAgB,UAAU,MAAO,0BAA2B,QAAO;AAC9E,cAAM,sBAAsB,aAAa,cAAc,IAAI,CAAC,iBAAiB;AAC3E,gBAAM,SAAS,SAAS,aAAa,MAAM;AAC3C,iBAAO,SAAS,EAAE,GAAG,cAAc,OAAO,IAAI;AAAA,QAChD,CAAC;AACD,YAAI,oBAAoB,MAAM,CAAC,cAAc,UAAU,iBAAiB,aAAa,cAAc,KAAK,CAAC,GAAG;AAC1G,iBAAO;AAAA,QACT;AACA,cAAM,kBAAkB,MAAM,KAAK,uBAAuB,UAAU;AACpE,YAAI,CAAE,MAAM,kBAAkB,EAAI,OAAM,IAAI,MAAM,4BAA4B;AAC9E,YAAK,MAAM,gBAAgB,UAAU,MAAO,0BAA2B,QAAO;AAC9E,cAAM,KAAK,oBAAoB,YAAY,OAAO;AAClD,YAAK,MAAM,gBAAgB,UAAU,MAAO,0BAA2B,QAAO;AAC9E,cAAM,KAAK;AAAA,UACT;AAAA,UACA,KAAK,oBAAoB,EAAE,GAAG,cAAc,eAAe,oBAAoB,CAAC;AAAA,UAChF;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,IACF;AACA,kBAAc;AAAA,EAChB;AACA,SAAO;AACT;AAEA,eAAe,uBACb,MACA,UACA,aACkB;AAClB,QAAM,2BAA2B,MAAM,UAAU,WAAW;AAC5D,MAAI,qBAAqB,MAAM,kBAAkB,MAAM,UAAU,WAAW,GAAG;AAC/E,QAAM,2BAA2B,MAAM,UAAU,WAAW;AAC5D,QAAM,KAAK,iCAAiC,QAAQ;AACpD,QAAM,kBAAkB,MAAM,kBAAkB,MAAM,UAAU,WAAW;AAC3E,wBAAsB,gBAAgB;AACtC,SAAO;AACT;AAEA,SAAS,wBACP,UACA,UACA,aACS;AACT,MAAI,UAAU;AACd,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,MAAM;AACX,QAAI,YAAY,SAAU,QAAO;AACjC,QAAI,KAAK,IAAI,OAAO,EAAG,QAAO;AAC9B,SAAK,IAAI,OAAO;AAChB,UAAM,OAAO,SAAS,OAAO;AAC7B,QAAI,CAAC,QAAQ,SAAS,QAAS,QAAO;AACtC,cAAU;AAAA,EACZ;AACF;AAEA,SAAS,oBACP,UACA,YACwB;AACxB,QAAM,WAAmC,CAAC;AAC1C,QAAM,SAAS,EAAE,GAAG,SAAS;AAC7B,aAAW,CAAC,UAAU,WAAW,KAAK,OAAO,QAAQ,UAAU,GAAG;AAChE,QACE,OAAO,QAAQ,MAAM,UACrB,wBAAwB,QAAQ,UAAU,WAAW,EACrD;AACF,aAAS,QAAQ,IAAI;AACrB,WAAO,QAAQ,IAAI;AAAA,EACrB;AACA,SAAO;AACT;AAEA,SAAS,wBACP,UACA,YACwB;AACxB,QAAM,SAAS,EAAE,GAAG,SAAS;AAC7B,QAAM,kBAAkB,oBAAI,IAAoB;AAChD,aAAW,CAAC,UAAU,WAAW,KAAK,OAAO,QAAQ,UAAU,GAAG;AAChE,UAAM,kBAAkB,OAAO,QAAQ;AACvC,QAAI,oBAAoB,UAAa,oBAAoB,aAAa;AACpE;AAAA,IACF;AACA,QAAI,oBAAoB,UAAa,wBAAwB,QAAQ,UAAU,WAAW,EAAG;AAC7F,UAAM,gBAAgB,gBAAgB,IAAI,WAAW;AACrD,QAAI,kBAAkB,UAAa,kBAAkB,UAAU;AAC7D,YAAM,IAAI;AAAA,QACR,oCAAoC,aAAa,QAAQ,QAAQ,uBAAuB,WAAW;AAAA,MACrG;AAAA,IACF;AACA,WAAO,QAAQ,IAAI;AACnB,oBAAgB,IAAI,aAAa,QAAQ;AAAA,EAC3C;AACA,SAAO;AACT;AACA,SAAS,iBAAiB,UAAoE;AAC5F,QAAM,YAAoC,CAAC;AAC3C,aAAW,YAAY,OAAO,KAAK,QAAQ,GAAG;AAC5C,QAAI,UAAU;AACd,UAAM,OAAO,oBAAI,IAAY;AAC7B,WAAO,MAAM;AACX,YAAM,OAAO,SAAS,OAAO;AAC7B,UAAI,CAAC,QAAQ,SAAS,QAAS;AAC/B,UAAI,KAAK,IAAI,OAAO,GAAG;AACrB,cAAM,IAAI,MAAM,wDAAwD,QAAQ,GAAG;AAAA,MACrF;AACA,WAAK,IAAI,OAAO;AAChB,gBAAU;AAAA,IACZ;AACA,QAAI,YAAY,SAAU,WAAU,QAAQ,IAAI;AAAA,EAClD;AACA,SAAO;AACT;AASA,eAAe,sBACb,MACA,UACA,aACA,sBACoC;AACpC,SAAO,gCAAgC,KAAK,UAAU,OAAO,sBAAsB;AACjF,uBAAmB,QAAQ;AAC3B,uBAAmB,WAAW;AAC9B,UAAM,aAAa,KAAK,sBAAsB,QAAQ;AACtD,UAAM,gBAAgB,KAAK,sBAAsB,WAAW;AAC5D,QAAI,eAAe,QAAQ,kBAAkB,MAAM;AACjD,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AACA,UAAM,iBAAiB,YAAY,QAAQ;AAC3C,UAAM,iBAAiB,eAAe,WAAW;AACjD,UAAM,eAAe,MAAM,WAAW,UAAU;AAChD,UAAM,kBAAkB,MAAM,WAAW,aAAa;AACtD,QAAI,CAAC,gBAAgB,CAAC,gBAAiB,QAAO,EAAE,UAAU,MAAM,YAAY,MAAM;AAClF,QAAI,gBAAgB,iBAAiB;AACnC,UAAI,MAAM,iBAAiB,YAAY,aAAa,EAAG,QAAO,EAAE,UAAU,OAAO,YAAY,MAAM;AACnG,YAAM,CAAC,eAAe,kBAAkB,iBAAiB,kBAAkB,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC/F,KAAK,sBAAsB,UAAU;AAAA,QACrC,KAAK,sBAAsB,aAAa;AAAA,QACxC,KAAK,uBAAuB,UAAU;AAAA,QACtC,KAAK,uBAAuB,aAAa;AAAA,MAC3C,CAAC;AACD,UAAI,kBAAkB,kBAAkB;AAGtC,eAAO,EAAE,UAAU,OAAO,YAAY,OAAO,SAAS,KAAK;AAAA,MAC7D;AACA,UAAI,mBAAmB,CAAC,oBAAoB;AAC1C,YAAI,CAAE,MAAM,qBAAqB,KAAM,CAAE,MAAM,kBAAkB,GAAI;AACnE,gBAAM,IAAI,MAAM,0CAA0C;AAAA,QAC5D;AACA,cAAM,KAAK,oBAAoB,eAAe,OAAO;AACrD,cAAM,KAAK,uBAAuB,eAAe,eAAe,IAAI;AACpE,YAAK,MAAM,KAAK,sBAAsB,aAAa,MAAO,eAAe;AACvE,gBAAM,IAAI,MAAM,oCAAoC,WAAW,GAAG;AAAA,QACpE;AAAA,MACF;AACA,UAAI,CAAE,MAAM,qBAAqB,KAAM,CAAE,MAAM,kBAAkB,GAAI;AACnE,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AACA,YAAM,KAAK,oBAAoB,YAAY,OAAO;AAClD,YAAM,iBAAiB,YAAY,QAAQ;AAC3C,YAAM,6BAA6B,MAAM,YAAY,eAAe,QAAQ;AAC5E,YAAM,OAAO,UAAU;AACvB,aAAO,EAAE,UAAU,OAAO,YAAY,KAAK;AAAA,IAC7C;AACA,QAAI,CAAC,aAAc,QAAO,EAAE,UAAU,OAAO,YAAY,MAAM;AAC/D,QAAI,CAAE,MAAM,qBAAqB,KAAM,CAAE,MAAM,kBAAkB,GAAI;AACnE,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AACA,UAAM,kBAAkB,MAAM,KAAK,uBAAuB,UAAU;AACpE,UAAM,gBAAgB,MAAM,KAAK,sBAAsB,UAAU;AACjE,UAAM,iBAAiB,YAAY,QAAQ;AAC3C,UAAM,6BAA6B,MAAM,YAAY,eAAe,QAAQ;AAI5E,QACE,+BAA+B,KAAK,SAAS,UAAU,CAAC,KACrD,wBAAwB,aAAa,GACxC;AACA,aAAO,EAAE,UAAU,OAAO,YAAY,MAAM;AAAA,IAC9C;AACA,QAAI,iCAAgD;AACpD,QAAI;AACF,YAAM,KAAK,uBAAuB,eAAe,eAAe,eAAe;AAC/E,uCAAiC,MAAM,gBAAgB,aAAa;AACpE,UAAK,MAAM,KAAK,sBAAsB,aAAa,MAAO,eAAe;AACvE,cAAM,IAAI,MAAM,oCAAoC,WAAW,GAAG;AAAA,MACpE;AACA,UAAI,CAAE,MAAM,qBAAqB,KAAM,CAAE,MAAM,kBAAkB,GAAI;AACnE,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AACA,YAAM,KAAK,oBAAoB,YAAY,OAAO;AAClD,YAAM,iBAAiB,YAAY,QAAQ;AAC3C,YAAM,6BAA6B,MAAM,YAAY,eAAe,QAAQ;AAC5E,YAAM,OAAO,UAAU;AAAA,IACzB,SAAS,OAAO;AACd,UAAI,CAAC,mBAAmB,mCAAmC,MAAM;AAC/D,YAAI;AACF,cAAK,MAAM,gBAAgB,aAAa,MAAO,gCAAgC;AAC7E,kBAAM,iBAAiB,eAAe,WAAW;AACjD,kBAAM,OAAO,aAAa;AAAA,UAC5B;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AACA,YAAM;AAAA,IACR;AACA,WAAO,EAAE,UAAU,OAAO,YAAY,KAAK;AAAA,EAC7C,CAAC;AACH;AAEA,eAAsB,gCACpB,MAC6B;AAC7B,SAAO;AAAA,IACL,SAAS,IAAI;AAAA,IACb;AAAA,MACE,SAAS;AAAA,MACT,WAAW;AAAA,IACb;AAAA,IACA,OAAO,UAAU,SAAS;AACxB,UAAI,CAAC,SAAU,OAAM,IAAI,MAAM,6DAA6D;AAC5F,YAAM,KAAK,0BAA0B;AACrC,YAAM,sBAAsB,KAAK,WAAW;AAO5C,YAAM,sBAAsB,KAAK,KAAK,KAAK,UAAU,oCAAoC;AACzF,YAAM,sBAAsB,KAAK,KAAK,KAAK,UAAU,8CAA8C;AACnG,UAAI,qBAAqB,MAAM,WAAW,mBAAmB;AAC7D,UAAI,MAAM,WAAW,mBAAmB,GAAG;AACzC,YAAI;AACF,gBAAM,OAAO,qBAAqB,mBAAmB;AACrD,+BAAqB;AAAA,QACvB,SAAS,OAAO;AACd,cAAI,CAAC,YAAY,OAAO,QAAQ,EAAG,OAAM;AAAA,QAC3C;AAAA,MACF;AACA,UAAI,QAAQ,MAAM,UAAU,IAAI;AAChC,UAAI,CAAC,OAAO;AACV,gBAAQ;AAAA,UACN,SAAS;AAAA,UACT,UAAU;AAAA,UACV,UAAU,CAAC;AAAA,QACb;AAAA,MACF;AACA,YAAM,UAA8B,oBAAI,IAAI;AAC5C,YAAM,YAA6B,EAAE,MAAM,oBAAI,IAAI,GAAG,WAAW,oBAAI,IAAI,EAAE;AAK3E,YAAM,cAAkC,oBAAI,IAAI;AAGhD,YAAM,SAAS,YAAyC;AACtD,YAAI,QAAQ,OAAO,GAAG;AACpB,gBAAM,QAAQ,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,UAAU,WAAW,MAAM,GAAG,QAAQ,OAAO,WAAW,EAAE,EAAE,KAAK,IAAI;AACtG,cAAI;AAAA,YACF,yCAAyC,QAAQ,IAAI,0BAA0B,KAAK;AAAA,UAEtF;AAAA,QACF;AACA,YAAI,YAAY,OAAO,GAAG;AACxB,gBAAM,QAAQ,CAAC,GAAG,WAAW,EAAE,IAAI,CAAC,CAAC,UAAU,WAAW,MAAM,GAAG,QAAQ,OAAO,WAAW,EAAE,EAAE,KAAK,IAAI;AAC1G,cAAI;AAAA,YACF,yCAAyC,YAAY,IAAI,4CAA4C,KAAK;AAAA,UAE5G;AAAA,QACF;AACA,wCAAgC,KAAK,aAAa,UAAU,KAAK,MAAM,CAAC,YAAY;AAClF,cAAI,KAAK,iCAAiC,OAAO,EAAE;AAAA,QACrD,CAAC;AACD,YAAI,UAAU,UAAU,OAAO,GAAG;AAChC,gBAAM,QAAQ,CAAC,GAAG,UAAU,SAAS,EAAE,KAAK,EAAE,KAAK,IAAI;AACvD,cAAI;AAAA,YACF,yCAAyC,UAAU,UAAU,IAAI,8BAA8B,KAAK;AAAA,UAEtG;AAAA,QACF;AAMA,YAAI,oBAAoB;AACtB,gBAAM,OAAO,mBAAmB,EAAE,MAAM,CAAC,UAAmB;AAC1D,gBAAI,CAAC,YAAY,OAAO,QAAQ,EAAG,OAAM;AAAA,UAC3C,CAAC;AAAA,QACH;AAWA,cAAM,wBAAwB,MAAM,KAAK,2BAA2B;AACpE,YAAI,MAAM,WAAW,mBAAmB,EAAG,QAAO;AAClD,eAAO;AAAA,MACT;AASA,YAAM,eAAe,YAA8B;AACjD,cAAM,UAAU;AAChB,YAAI,CAAC,QAAS,QAAO;AAIrB,YAAI,UAAU;AACd,cAAM,SAAiC,EAAE,GAAI,QAAQ,WAAW,CAAC,EAAG;AACpE,cAAM,SAAiC,CAAC;AACxC,mBAAW,CAAC,UAAU,WAAW,KAAK,OAAO,QAAQ,QAAQ,QAAQ,GAAG;AACtE,cAAI,CAAC,QAAQ,IAAI,QAAQ,EAAG,QAAO,QAAQ,IAAI;AAAA,QACjD;AACA,mBAAW,CAAC,UAAU,WAAW,KAAK,QAAS,QAAO,QAAQ,IAAI;AASlE,mBAAW,CAAC,UAAU,WAAW,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC5D,cAAI,QAAQ,IAAI,QAAQ,EAAG;AAC3B,iBAAO,OAAO,QAAQ;AACtB,cAAI,OAAO,QAAQ,MAAM,OAAW;AACpC,gBAAM,aAAa,KAAK,sBAAsB,QAAQ;AACtD,cAAI,eAAe,QAAS,MAAM,WAAW,UAAU,EAAI;AAK3D,cAAI,SAAS;AACb,gBAAM,cAAc,oBAAI,IAAY;AACpC,iBAAO,OAAO,MAAM,MAAM,UAAa,CAAC,YAAY,IAAI,MAAM,GAAG;AAC/D,wBAAY,IAAI,MAAM;AACtB,qBAAS,OAAO,MAAM;AAAA,UACxB;AACA,gBAAM,aAAa,KAAK,sBAAsB,MAAM;AACpD,cAAI,eAAe,QAAQ,CAAE,MAAM,WAAW,UAAU,GAAI;AAC1D,wBAAY,IAAI,UAAU,WAAW;AACrC;AAAA,UACF;AACA,iBAAO,QAAQ,IAAI;AACnB,oBAAU;AAAA,QACZ;AAIA,cAAM,YAAY,iBAAiB,MAAM;AAGzC,mBAAW,CAAC,UAAU,WAAW,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC5D,gBAAM,QAAQ,UAAU,WAAW;AACnC,cAAI,UAAU,UAAa,UAAU,SAAU,QAAO,QAAQ,IAAI;AAAA,QACpE;AACA,cAAM,OAAO,CAAC,GAA2B,MACvC,OAAO,KAAK,CAAC,EAAE,WAAW,OAAO,KAAK,CAAC,EAAE,UACtC,OAAO,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,KAAK,MAAM,EAAE,GAAG,MAAM,KAAK;AAC/D,YAAI,KAAK,WAAW,QAAQ,QAAQ,KAAK,KAAK,QAAQ,QAAQ,WAAW,CAAC,CAAC,EAAG,QAAO;AAKrF,gBAAQ,EAAE,GAAG,SAAS,UAAU,WAAW,SAAS,OAAO;AAC3D,cAAM,aAAa,MAAM,KAAK;AAC9B,eAAO;AAAA,MACT;AACA,YAAM,mBAAmB,MAAM;AAC/B,YAAM,oBAAoB,iBAAiB,gBAAgB;AAC3D,YAAM,kBACJ,OAAO,KAAK,iBAAiB,EAAE,WAAW,OAAO,KAAK,gBAAgB,EAAE,UACrE,OAAO,QAAQ,iBAAiB,EAAE;AAAA,QAAK,CAAC,CAAC,UAAU,WAAW,MAC/D,iBAAiB,QAAQ,MAAM;AAAA,MACjC;AACF,cAAQ,EAAE,GAAG,OAAO,UAAU,kBAAkB;AAChD,eAAS,gBAAgB,GAAG,gBAAgB,kCAAkC,iBAAiB,GAAG;AAChG,YAAI,CAAE,MAAM,KAAK,QAAQ,EAAI,OAAM,IAAI,MAAM,0CAA0C;AACvF,cAAM,mBAAmB;AAAA,UACvB,MAAM;AAAA,UACN,MAAM,iBAAiB,MAAM,MAAM,UAAU,SAAS,SAAS;AAAA,QACjE;AACA,cAAM,gBAAgB,MAAM,aAAa;AACzC,cAAM,eAAe,iBAAiB,wBAAwB,MAAM,UAAU,gBAAgB,CAAC;AAY/F,YACE,MAAM,YACH,OAAO,KAAK,gBAAgB,EAAE,WAAW,KACzC,CAAC,mBACD,CAAC,eACJ;AAIA,cAAI,sBAAsB,OAAO,KAAK,MAAM,QAAQ,EAAE,SAAS,GAAG;AAChE,kBAAMA,qBAAoB,MAAM;AAAA,cAC9B;AAAA,cACA,MAAM;AAAA,cACN,MAAM,KAAK,QAAQ;AAAA,YACrB;AACA,iBAAK,8BAA8B;AACnC,iBAAK,2BAA2B;AAChC,gBAAIA,mBAAmB,MAAK,4BAA4B;AACxD,iBAAK,wBAAwB;AAAA,UAC/B;AACA,iBAAO,OAAO;AAAA,QAChB;AACA,YACE,MAAM,YACH,OAAO,KAAK,gBAAgB,EAAE,SAAS,KACvC,OAAO,KAAK,YAAY,EAAE,WAAW,OAAO,KAAK,MAAM,QAAQ,EAAE,QACpE;AACA,kBAAQ,EAAE,GAAG,OAAO,UAAU,OAAO,UAAU,aAAa;AAC5D,gBAAM,aAAa,MAAM,KAAK;AAAA,QAChC;AACA,YAAI,OAAO,KAAK,MAAM,QAAQ,EAAE,WAAW,GAAG;AAC5C,cAAI,CAAE,MAAM,KAAK,QAAQ,EAAI,OAAM,IAAI,MAAM,0CAA0C;AACvF,gBAAMC,mBAAkB;AAAA,YACtB,MAAM;AAAA,YACN,MAAM,iBAAiB,MAAM,MAAM,UAAU,SAAS,SAAS;AAAA,UACjE;AAKA,gBAAM,kBAAkB,MAAM,aAAa;AAC3C,cAAI,OAAO,KAAKA,gBAAe,EAAE,WAAW,KAAK,CAAC,iBAAiB;AACjE,kBAAM,aAAa,MAAM,EAAE,GAAG,OAAO,UAAU,KAAK,CAAC;AACrD,mBAAO,OAAO;AAAA,UAChB;AACA,kBAAQ;AAAA,YACN,GAAG;AAAA,YACH,UAAU;AAAA,YACV,UAAU,iBAAiB,wBAAwB,MAAM,UAAUA,gBAAe,CAAC;AAAA,UACrF;AACA,gBAAM,aAAa,MAAM,KAAK;AAC9B;AAAA,QACF;AACA,YAAI,kBAAkB,OAAO,QAAQ,MAAM,QAAQ;AACnD,eAAO,gBAAgB,SAAS,GAAG;AACjC,gBAAM,mBAA4C,CAAC;AACnD,cAAI,aAAa;AACjB,qBAAW,CAAC,UAAU,WAAW,KAAK,iBAAiB;AACrD,kBAAM,SAAS,MAAM;AAAA,cACnB;AAAA,cACA;AAAA,cACA;AAAA,cACA,MAAM,KAAK,QAAQ;AAAA,YACrB;AACA,gBAAI,OAAO,QAAS,SAAQ,IAAI,UAAU,WAAW;AAAA,qBAC5C,OAAO,SAAU,kBAAiB,KAAK,CAAC,UAAU,WAAW,CAAC;AACvE,2BAAe,OAAO;AAAA,UACxB;AACA,cAAI,iBAAiB,WAAW,EAAG;AACnC,cAAI,CAAC,YAAY;AAGf,uBAAW,CAAC,UAAU,WAAW,KAAK,kBAAkB;AACtD,sBAAQ,IAAI,UAAU,WAAW;AACjC,0BAAY,IAAI,UAAU,WAAW;AAAA,YACvC;AACA;AAAA,UACF;AACA,4BAAkB;AAAA,QACpB;AACA,cAAM,aAAa;AAEnB,cAAM,oBAAoB,MAAM;AAAA,UAC9B;AAAA,UACA,MAAM;AAAA,UACN,MAAM,KAAK,QAAQ;AAAA,QACrB;AACA,aAAK,8BAA8B;AACnC,aAAK,2BAA2B;AAChC,YAAI,kBAAmB,MAAK,4BAA4B;AACxD,aAAK,wBAAwB;AAE7B,YAAI,CAAE,MAAM,KAAK,QAAQ,EAAI,OAAM,IAAI,MAAM,0CAA0C;AACvF,cAAM,kBAAkB;AAAA,UACtB,MAAM;AAAA,UACN,MAAM,iBAAiB,MAAM,MAAM,UAAU,SAAS,SAAS;AAAA,QACjE;AAKA,cAAM,sBAAsB,MAAM,aAAa;AAC/C,YAAI,OAAO,KAAK,eAAe,EAAE,WAAW,KAAK,CAAC,qBAAqB;AACrE,gBAAM,aAAa,MAAM,EAAE,GAAG,OAAO,UAAU,KAAK,CAAC;AACrD,iBAAO,OAAO;AAAA,QAChB;AACA,gBAAQ;AAAA,UACN,GAAG;AAAA,UACH,UAAU;AAAA,UACV,UAAU,iBAAiB,wBAAwB,MAAM,UAAU,eAAe,CAAC;AAAA,QACrF;AACA,cAAM,aAAa,MAAM,KAAK;AAAA,MAChC;AACA,YAAM,IAAI,MAAM,8FAA8F;AAAA,IAChH;AAAA,EACF;AACF;","names":["rewroteColdMemory","discoveredAfter"]}
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-7RJUVTVF.js";
13
13
  import {
14
14
  ContentHashIndex
15
- } from "./chunk-DEY7B77Y.js";
15
+ } from "./chunk-AHCELJMH.js";
16
16
  import {
17
17
  computeLegacyContentHash,
18
18
  normalizeLegacyContent
@@ -348,4 +348,4 @@ export {
348
348
  buildReconcileManifest,
349
349
  collapseActiveFactDuplicates
350
350
  };
351
- //# sourceMappingURL=chunk-SA6GMZJY.js.map
351
+ //# sourceMappingURL=chunk-DP3TSAYT.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getOperation
3
- } from "./chunk-L3IP56F4.js";
3
+ } from "./chunk-BIE3ZH3N.js";
4
4
  import {
5
5
  EngramAccessInputError
6
6
  } from "./chunk-3MUKQQ7A.js";
@@ -21,4 +21,4 @@ async function respondBriefingHttp(options) {
21
21
  export {
22
22
  respondBriefingHttp
23
23
  };
24
- //# sourceMappingURL=chunk-H2X22KZW.js.map
24
+ //# sourceMappingURL=chunk-FN6OFDBZ.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SUPPORT_PASSPORT_DRAFT_MAX_CONTENT_CHARACTERS,
3
3
  SUPPORT_PASSPORT_DRAFT_MAX_MEMORIES
4
- } from "./chunk-L3IP56F4.js";
4
+ } from "./chunk-BIE3ZH3N.js";
5
5
  import {
6
6
  SUPPORT_PASSPORT_SOURCE_MEMORY_ID_MAX_LENGTH
7
7
  } from "./chunk-PWPIERBM.js";
@@ -343,4 +343,4 @@ export {
343
343
  parseSupportPassportModelJob,
344
344
  SupportPassportModelBridge
345
345
  };
346
- //# sourceMappingURL=chunk-SU5V2LWR.js.map
346
+ //# sourceMappingURL=chunk-G6DAE2LT.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  RECALL_DISCLOSURE_LEVELS
3
- } from "./chunk-42KSEX6C.js";
3
+ } from "./chunk-LDXNKEYB.js";
4
4
 
5
5
  // src/recall-navigate.ts
6
6
  var RECALL_NAV_LINK_TYPES = [
@@ -48,4 +48,4 @@ export {
48
48
  expandRecallNode,
49
49
  traverseRecallLink
50
50
  };
51
- //# sourceMappingURL=chunk-V7KGDLBC.js.map
51
+ //# sourceMappingURL=chunk-GQ7VWY6N.js.map
@@ -3,7 +3,7 @@ import {
3
3
  getOperation,
4
4
  operationRequiresAuthorizedNamespace,
5
5
  operationUsesPrincipalNamespace
6
- } from "./chunk-L3IP56F4.js";
6
+ } from "./chunk-BIE3ZH3N.js";
7
7
  import {
8
8
  assertOperationAuthorizationAllowed
9
9
  } from "./chunk-IG747LRN.js";
@@ -60,4 +60,4 @@ export {
60
60
  authorizationProbeNamespaces,
61
61
  authorizationProbeRequiresPrincipalNamespace
62
62
  };
63
- //# sourceMappingURL=chunk-SYUNCM26.js.map
63
+ //# sourceMappingURL=chunk-GSKW64NB.js.map
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-6JMQR72P.js";
7
7
  import {
8
8
  StorageManager
9
- } from "./chunk-IHS2UGYM.js";
9
+ } from "./chunk-TTIEXXL3.js";
10
10
  import {
11
11
  normalizeEntityName
12
12
  } from "./chunk-YXZG5TVN.js";
@@ -962,4 +962,4 @@ export {
962
962
  resolveBriefingSaveDir,
963
963
  briefingFilename
964
964
  };
965
- //# sourceMappingURL=chunk-4WT6I4VG.js.map
965
+ //# sourceMappingURL=chunk-GWB7ZD2A.js.map
@@ -3,7 +3,7 @@ import {
3
3
  readNamespaceMaintenanceLastRanStatuses,
4
4
  readNamespaceMaintenanceStatuses,
5
5
  runNamespaceMaintenancePlan
6
- } from "./chunk-7IOB5F7Y.js";
6
+ } from "./chunk-7VB3Y5OL.js";
7
7
  import {
8
8
  analyzeSessionIntegrity,
9
9
  applySessionRepair,
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-CMTINOFS.js";
15
15
  import {
16
16
  summarizeCorpusAndReplica
17
- } from "./chunk-I27WOMJ7.js";
17
+ } from "./chunk-IY7DGT2Z.js";
18
18
  import {
19
19
  readJudgeVerdictStats
20
20
  } from "./chunk-OZKOPQCM.js";
@@ -27,7 +27,7 @@ import {
27
27
  } from "./chunk-JKMIGCK6.js";
28
28
  import {
29
29
  runConsolidationProvenanceCheck
30
- } from "./chunk-L5VCT7LU.js";
30
+ } from "./chunk-MCLZM5G7.js";
31
31
  import {
32
32
  resolveCuratedIncludeFilesStatePath,
33
33
  resolveNativeKnowledgeStatePath,
@@ -38,17 +38,17 @@ import {
38
38
  } from "./chunk-YBPYIAA5.js";
39
39
  import {
40
40
  parseConfig
41
- } from "./chunk-A3IURDU2.js";
41
+ } from "./chunk-C2AOL6MK.js";
42
42
  import {
43
43
  readAggregateExtractionWatermark
44
- } from "./chunk-27SAUQ5R.js";
44
+ } from "./chunk-3CHHQXAR.js";
45
45
  import {
46
46
  listNamespaces
47
- } from "./chunk-BHQPOCQE.js";
47
+ } from "./chunk-OIIAIY7J.js";
48
48
  import {
49
49
  listMemoryGovernanceRuns,
50
50
  readMemoryGovernanceRunArtifact
51
- } from "./chunk-33UAWCBN.js";
51
+ } from "./chunk-DDLRKPR2.js";
52
52
  import {
53
53
  analyzeGraphHealth
54
54
  } from "./chunk-4IYIGN53.js";
@@ -57,7 +57,7 @@ import {
57
57
  } from "./chunk-AWD36R4D.js";
58
58
  import {
59
59
  StorageManager
60
- } from "./chunk-IHS2UGYM.js";
60
+ } from "./chunk-TTIEXXL3.js";
61
61
  import {
62
62
  lintWorkspaceFiles
63
63
  } from "./chunk-DM2T26WE.js";
@@ -1683,4 +1683,4 @@ export {
1683
1683
  runBenchmarkRecall,
1684
1684
  runOperatorRepair
1685
1685
  };
1686
- //# sourceMappingURL=chunk-JYZLDZ2R.js.map
1686
+ //# sourceMappingURL=chunk-HG2VVIKI.js.map
@@ -68,6 +68,7 @@ function computeRateLimitDelayMs(attempt, settings, serverHintMs, random = Math.
68
68
  }
69
69
  var LocalLlmConcurrencyLimiter = class {
70
70
  active = 0;
71
+ activeBackground = 0;
71
72
  max;
72
73
  waiters = [];
73
74
  constructor(max) {
@@ -89,20 +90,22 @@ var LocalLlmConcurrencyLimiter = class {
89
90
  */
90
91
  acquire(options = {}) {
91
92
  const { signal, timeoutMs } = options;
93
+ const highPriority = options.highPriority === true;
92
94
  if (signal?.aborted) return Promise.resolve(null);
93
- if (this.max <= 0 || this.active < this.max && this.waiters.length === 0) {
95
+ if (this.canAcquire(highPriority) && (this.waiters.length === 0 || highPriority && !this.waiters[0].highPriority)) {
94
96
  this.active += 1;
95
- return Promise.resolve(this.releaser());
97
+ if (!highPriority) this.activeBackground += 1;
98
+ return Promise.resolve(this.releaser(highPriority));
96
99
  }
97
100
  if (timeoutMs !== void 0 && timeoutMs <= 0) return Promise.resolve(null);
98
101
  return new Promise((resolve) => {
99
102
  let timer;
100
103
  const waiter = {
101
- highPriority: options.highPriority === true,
104
+ highPriority,
102
105
  grant: () => {
103
106
  signal?.removeEventListener("abort", onAbort);
104
107
  if (timer) clearTimeout(timer);
105
- resolve(this.releaser());
108
+ resolve(this.releaser(highPriority));
106
109
  }
107
110
  };
108
111
  const onAbort = () => {
@@ -123,20 +126,25 @@ var LocalLlmConcurrencyLimiter = class {
123
126
  if (timeoutMs !== void 0) timer = setTimeout(onAbort, timeoutMs);
124
127
  });
125
128
  }
126
- releaser() {
129
+ canAcquire(highPriority) {
130
+ return this.max <= 0 || this.active < this.max && (highPriority || this.max === 1 || this.activeBackground < this.max - 1);
131
+ }
132
+ releaser(highPriority) {
127
133
  let released = false;
128
134
  return () => {
129
135
  if (released) return;
130
136
  released = true;
131
137
  this.active -= 1;
138
+ if (!highPriority) this.activeBackground -= 1;
132
139
  this.pump();
133
140
  };
134
141
  }
135
142
  pump() {
136
- while (this.waiters.length > 0 && (this.max <= 0 || this.active < this.max)) {
143
+ while (this.waiters.length > 0 && this.canAcquire(this.waiters[0].highPriority)) {
137
144
  const next = this.waiters.shift();
138
145
  if (!next) break;
139
146
  this.active += 1;
147
+ if (!next.highPriority) this.activeBackground += 1;
140
148
  next.grant();
141
149
  }
142
150
  }
@@ -286,4 +294,4 @@ export {
286
294
  resetLocalLlmRateLimitStateForTests,
287
295
  LocalLlmRateLimitSession
288
296
  };
289
- //# sourceMappingURL=chunk-3VRMUNWL.js.map
297
+ //# sourceMappingURL=chunk-HJ444KNS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/local-llm-rate-limit.ts"],"sourcesContent":["/**\n * Process-wide rate-limit handling for the local LLM client (COS-447).\n *\n * A LiteLLM proxy in front of the local models answers `429 No deployments\n * available` (and `503`/`408`) when every deployment is busy or in cooldown.\n * Before this module the client returned on the first 429 and the caller\n * loop immediately issued the next request, so one daemon could hammer the\n * proxy with thousands of calls per hour while it was saturated.\n *\n * This module provides three pieces that the client composes:\n *\n * - classification of rate-limit responses and of the retry hint\n * (`Retry-After` header as delta-seconds or HTTP-date, falling back to\n * LiteLLM's `Try again in N seconds` body text);\n * - exponential backoff with full jitter;\n * - process-wide state shared by every `LocalLlmClient` instance: a\n * concurrency semaphore for in-flight HTTP attempts and a per-endpoint\n * \"do not call before\" deadline, so one client's 429 slows every client\n * pointed at the same endpoint.\n *\n * State lives on `globalThis` so duplicated module copies in bundled output\n * still share one limiter.\n */\n\nexport const RATE_LIMIT_STATUSES: ReadonlySet<number> = new Set([408, 429, 503]);\n\nconst RATE_LIMIT_BODY_PATTERN = /no deployments available|cooldown_list|all deployments.*cooldown/i;\nconst TRY_AGAIN_PATTERN = /try again in (\\d+(?:\\.\\d+)?) ?(seconds?|secs?|s|milliseconds?|ms|minutes?|mins?)\\b/i;\n\n/** Upper bound on any server-provided wait we will record (sanity clamp). */\nexport const MAX_RECORDED_BACKOFF_MS = 10 * 60_000;\n\nexport const DEFAULT_RATE_LIMIT_RETRY_COUNT = 3;\nexport const DEFAULT_RATE_LIMIT_BACKOFF_BASE_MS = 1_000;\nexport const DEFAULT_RATE_LIMIT_BACKOFF_MAX_MS = 60_000;\nexport const DEFAULT_MAX_CONCURRENCY = 4;\n\nexport interface LocalLlmRateLimitSettings {\n retryCount: number;\n backoffBaseMs: number;\n backoffMaxMs: number;\n /** 0 disables the process-wide concurrency cap. */\n maxConcurrency: number;\n}\n\nfunction nonNegativeInt(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value) || value < 0) return fallback;\n return Math.floor(value);\n}\n\nexport function resolveRateLimitSettings(config: {\n localLlmRateLimitRetryCount?: number;\n localLlmRateLimitBackoffBaseMs?: number;\n localLlmRateLimitBackoffMaxMs?: number;\n localLlmMaxConcurrency?: number;\n}): LocalLlmRateLimitSettings {\n const backoffBaseMs = Math.max(\n 1,\n nonNegativeInt(config.localLlmRateLimitBackoffBaseMs, DEFAULT_RATE_LIMIT_BACKOFF_BASE_MS)\n );\n const backoffMaxMs = Math.max(\n backoffBaseMs,\n nonNegativeInt(config.localLlmRateLimitBackoffMaxMs, DEFAULT_RATE_LIMIT_BACKOFF_MAX_MS)\n );\n return {\n retryCount: nonNegativeInt(config.localLlmRateLimitRetryCount, DEFAULT_RATE_LIMIT_RETRY_COUNT),\n backoffBaseMs,\n backoffMaxMs,\n maxConcurrency: nonNegativeInt(config.localLlmMaxConcurrency, DEFAULT_MAX_CONCURRENCY),\n };\n}\n\n/**\n * True for responses that mean \"the endpoint is saturated, slow down\":\n * 408/429/503, or a 5xx whose body carries LiteLLM's cooldown wording.\n * 400s are never rate limits (context-window errors mention fallbacks).\n */\nexport function isRateLimitedResponse(status: number, bodyText: string): boolean {\n if (RATE_LIMIT_STATUSES.has(status)) return true;\n return status >= 500 && RATE_LIMIT_BODY_PATTERN.test(bodyText);\n}\n\n/**\n * Parse an HTTP `Retry-After` value (RFC 9110: delta-seconds or HTTP-date).\n * Returns milliseconds to wait, or null when absent/invalid.\n */\nexport function parseRetryAfterMs(value: string | null | undefined, nowMs: number = Date.now()): number | null {\n if (value === null || value === undefined) return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n if (/^\\d+(\\.\\d+)?$/.test(trimmed)) {\n return Math.min(MAX_RECORDED_BACKOFF_MS, Math.round(Number(trimmed) * 1000));\n }\n const dateMs = Date.parse(trimmed);\n if (Number.isNaN(dateMs)) return null;\n return Math.min(MAX_RECORDED_BACKOFF_MS, Math.max(0, dateMs - nowMs));\n}\n\n/** Parse LiteLLM's `Try again in N seconds` hint from an error body. */\nexport function parseTryAgainHintMs(bodyText: string): number | null {\n const match = bodyText.match(TRY_AGAIN_PATTERN);\n if (!match) return null;\n const amount = Number(match[1]);\n if (!Number.isFinite(amount)) return null;\n const unit = match[2].toLowerCase();\n let ms: number;\n if (unit.startsWith(\"ms\") || unit.startsWith(\"milli\")) ms = amount;\n else if (unit.startsWith(\"min\")) ms = amount * 60_000;\n else ms = amount * 1000;\n return Math.min(MAX_RECORDED_BACKOFF_MS, Math.round(ms));\n}\n\n/** Server-provided wait: `Retry-After` header first, then the body hint. */\nexport function serverRetryHintMs(\n retryAfterHeader: string | null | undefined,\n bodyText: string,\n nowMs: number = Date.now()\n): number | null {\n return parseRetryAfterMs(retryAfterHeader, nowMs) ?? parseTryAgainHintMs(bodyText);\n}\n\n/**\n * Exponential backoff with full jitter: uniform in [0, min(max, base * 2^(n-1))].\n * `attempt` is 1-based (the number of consecutive rate-limit responses).\n */\nexport function computeFullJitterBackoffMs(\n attempt: number,\n baseMs: number,\n maxMs: number,\n random: () => number = Math.random\n): number {\n const exponent = Math.max(0, Math.min(30, attempt - 1));\n const ceiling = Math.min(maxMs, baseMs * 2 ** exponent);\n return Math.floor(random() * ceiling);\n}\n\n/**\n * Delay before the next attempt after a rate-limit response. A server hint\n * is a floor (never call earlier than asked); jitter is added on top of the\n * exponential term so synchronized callers spread out.\n */\nexport function computeRateLimitDelayMs(\n attempt: number,\n settings: Pick<LocalLlmRateLimitSettings, \"backoffBaseMs\" | \"backoffMaxMs\">,\n serverHintMs: number | null,\n random: () => number = Math.random\n): number {\n const jittered = computeFullJitterBackoffMs(attempt, settings.backoffBaseMs, settings.backoffMaxMs, random);\n return serverHintMs === null ? jittered : Math.max(serverHintMs, jittered);\n}\n\ntype Waiter = { highPriority: boolean; grant: () => void };\n\n/** FIFO semaphore; finite caps above one reserve a permit for recall-critical work. */\nexport class LocalLlmConcurrencyLimiter {\n private active = 0;\n private activeBackground = 0;\n private max: number;\n private readonly waiters: Waiter[] = [];\n\n constructor(max: number) {\n this.max = max;\n }\n\n setMax(max: number): void {\n this.max = max;\n this.pump();\n }\n\n get inFlight(): number {\n return this.active;\n }\n\n get queued(): number {\n return this.waiters.length;\n }\n\n /**\n * Wait for a slot. Resolves to a release function, or null when the\n * signal aborts first. `max <= 0` means unlimited.\n */\n acquire(\n options: { highPriority?: boolean; signal?: AbortSignal; timeoutMs?: number } = {}\n ): Promise<(() => void) | null> {\n const { signal, timeoutMs } = options;\n const highPriority = options.highPriority === true;\n if (signal?.aborted) return Promise.resolve(null);\n if (\n this.canAcquire(highPriority) &&\n (this.waiters.length === 0 || (highPriority && !this.waiters[0].highPriority))\n ) {\n this.active += 1;\n if (!highPriority) this.activeBackground += 1;\n return Promise.resolve(this.releaser(highPriority));\n }\n if (timeoutMs !== undefined && timeoutMs <= 0) return Promise.resolve(null);\n return new Promise((resolve) => {\n let timer: NodeJS.Timeout | undefined;\n const waiter: Waiter = {\n highPriority,\n grant: () => {\n signal?.removeEventListener(\"abort\", onAbort);\n if (timer) clearTimeout(timer);\n resolve(this.releaser(highPriority));\n },\n };\n const onAbort = (): void => {\n const index = this.waiters.indexOf(waiter);\n if (index >= 0) this.waiters.splice(index, 1);\n signal?.removeEventListener(\"abort\", onAbort);\n if (timer) clearTimeout(timer);\n resolve(null);\n };\n if (waiter.highPriority) {\n const firstLow = this.waiters.findIndex((w) => !w.highPriority);\n if (firstLow < 0) this.waiters.push(waiter);\n else this.waiters.splice(firstLow, 0, waiter);\n } else {\n this.waiters.push(waiter);\n }\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (timeoutMs !== undefined) timer = setTimeout(onAbort, timeoutMs);\n });\n }\n\n private canAcquire(highPriority: boolean): boolean {\n return this.max <= 0 || (\n this.active < this.max &&\n (highPriority || this.max === 1 || this.activeBackground < this.max - 1)\n );\n }\n\n private releaser(highPriority: boolean): () => void {\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this.active -= 1;\n if (!highPriority) this.activeBackground -= 1;\n this.pump();\n };\n }\n\n private pump(): void {\n while (this.waiters.length > 0 && this.canAcquire(this.waiters[0].highPriority)) {\n const next = this.waiters.shift();\n if (!next) break;\n this.active += 1;\n if (!next.highPriority) this.activeBackground += 1;\n next.grant();\n }\n }\n}\n\ninterface EndpointBackoffState {\n untilMs: number;\n consecutiveRateLimits: number;\n}\n\ninterface RateLimitGlobalState {\n limiter: LocalLlmConcurrencyLimiter;\n endpoints: Map<string, EndpointBackoffState>;\n}\n\ndeclare global {\n // Shared across duplicated module copies in bundled output.\n var __remnicLocalLlmRateLimitState: RateLimitGlobalState | undefined;\n}\n\nfunction globalState(): RateLimitGlobalState {\n globalThis.__remnicLocalLlmRateLimitState ??= {\n limiter: new LocalLlmConcurrencyLimiter(DEFAULT_MAX_CONCURRENCY),\n endpoints: new Map(),\n };\n return globalThis.__remnicLocalLlmRateLimitState;\n}\n\n/** Process-wide limiter, resized to the caller's configured cap. */\nexport function getLocalLlmConcurrencyLimiter(maxConcurrency: number): LocalLlmConcurrencyLimiter {\n const { limiter } = globalState();\n limiter.setMax(maxConcurrency);\n return limiter;\n}\n\n/** Milliseconds until `endpoint` may be called again (0 when clear). */\nexport function endpointBackoffRemainingMs(endpoint: string, nowMs: number = Date.now()): number {\n const entry = globalState().endpoints.get(endpoint);\n return entry ? Math.max(0, entry.untilMs - nowMs) : 0;\n}\n\n/**\n * Record a rate-limit response for `endpoint`. Returns the consecutive\n * rate-limit count (1-based) to feed the backoff exponent.\n */\nexport function noteEndpointRateLimited(endpoint: string): number {\n const { endpoints } = globalState();\n const entry = endpoints.get(endpoint) ?? { untilMs: 0, consecutiveRateLimits: 0 };\n entry.consecutiveRateLimits += 1;\n endpoints.set(endpoint, entry);\n return entry.consecutiveRateLimits;\n}\n\n/** Push the endpoint's \"do not call before\" deadline out to at least `nowMs + delayMs`. */\nexport function extendEndpointBackoff(endpoint: string, delayMs: number, nowMs: number = Date.now()): void {\n const { endpoints } = globalState();\n const entry = endpoints.get(endpoint) ?? { untilMs: 0, consecutiveRateLimits: 0 };\n const bounded = Math.min(MAX_RECORDED_BACKOFF_MS, Math.max(0, delayMs));\n entry.untilMs = Math.max(entry.untilMs, nowMs + bounded);\n endpoints.set(endpoint, entry);\n}\n\n/**\n * Reset the backoff exponent after a non-rate-limited response. An already\n * recorded deadline is left to expire so concurrent callers that saw the\n * 429 still wait it out.\n */\nexport function noteEndpointRecovered(endpoint: string): void {\n const entry = globalState().endpoints.get(endpoint);\n if (entry) entry.consecutiveRateLimits = 0;\n}\n\n/** Test seam: drop all process-wide state. */\nexport function resetLocalLlmRateLimitStateForTests(): void {\n const state = globalState();\n state.endpoints.clear();\n state.limiter = new LocalLlmConcurrencyLimiter(DEFAULT_MAX_CONCURRENCY);\n}\n\nexport type RateLimitAttemptGate =\n | { kind: \"go\"; release: () => void }\n | { kind: \"aborted\" }\n | { kind: \"skip\"; reason: \"backoff\" | \"queue\"; remainingMs: number };\n\nexport type RateLimitDecision =\n | { kind: \"not-rate-limited\" }\n | { kind: \"retry\"; delayMs: number; hintMs: number | null; consecutive: number; retry: number }\n | { kind: \"give-up\"; delayMs: number; retries: number };\n\n/**\n * Per-request driver for the rate-limit policy. The client calls\n * `beforeAttempt` ahead of every HTTP attempt (waits out the shared endpoint\n * deadline, then takes a concurrency slot) and `onResponse` after every\n * non-ok response.\n */\nexport class LocalLlmRateLimitSession {\n private retries = 0;\n private readonly limiter: LocalLlmConcurrencyLimiter;\n readonly settings: LocalLlmRateLimitSettings;\n\n /**\n * @param waitBudgetMs the caller's per-attempt time budget. Waiting for the\n * endpoint backoff or a concurrency slot never exceeds it, and a backoff\n * longer than it skips the request instead (fail open to the caller).\n */\n constructor(\n private readonly endpoint: string,\n settings: LocalLlmRateLimitSettings,\n private readonly highPriority: boolean,\n private readonly waitBudgetMs: number = settings.backoffMaxMs\n ) {\n this.settings = settings;\n this.limiter = getLocalLlmConcurrencyLimiter(settings.maxConcurrency);\n }\n\n get retryCount(): number {\n return this.retries;\n }\n\n async beforeAttempt(signal?: AbortSignal): Promise<RateLimitAttemptGate> {\n const deadlineMs = Date.now() + Math.max(0, this.waitBudgetMs);\n // Recheck the shared deadline after every async wait: another attempt may\n // have recorded or extended a cooldown while this one slept or queued.\n for (;;) {\n const remainingMs = endpointBackoffRemainingMs(this.endpoint);\n if (remainingMs > 0) {\n if (remainingMs > Math.min(this.settings.backoffMaxMs, deadlineMs - Date.now())) {\n return { kind: \"skip\", reason: \"backoff\", remainingMs };\n }\n if (!(await waitWithSignal(remainingMs, signal))) return { kind: \"aborted\" };\n continue;\n }\n const release = await this.limiter.acquire({\n highPriority: this.highPriority,\n signal,\n timeoutMs: deadlineMs - Date.now(),\n });\n if (!release) return signal?.aborted ? { kind: \"aborted\" } : { kind: \"skip\", reason: \"queue\", remainingMs: 0 };\n if (endpointBackoffRemainingMs(this.endpoint) > 0) {\n release();\n continue;\n }\n return { kind: \"go\", release };\n }\n }\n\n onSuccess(): void {\n noteEndpointRecovered(this.endpoint);\n }\n\n onResponse(status: number, retryAfterHeader: string | null | undefined, bodyText: string): RateLimitDecision {\n if (!isRateLimitedResponse(status, bodyText)) {\n noteEndpointRecovered(this.endpoint);\n return { kind: \"not-rate-limited\" };\n }\n const consecutive = noteEndpointRateLimited(this.endpoint);\n const hintMs = serverRetryHintMs(retryAfterHeader, bodyText);\n const delayMs = computeRateLimitDelayMs(consecutive, this.settings, hintMs);\n extendEndpointBackoff(this.endpoint, delayMs);\n if (this.retries >= this.settings.retryCount || delayMs > Math.min(this.settings.backoffMaxMs, this.waitBudgetMs)) {\n return { kind: \"give-up\", delayMs, retries: this.retries };\n }\n this.retries += 1;\n return { kind: \"retry\", delayMs, hintMs, consecutive, retry: this.retries };\n }\n}\n\nfunction waitWithSignal(ms: number, signal?: AbortSignal): Promise<boolean> {\n return new Promise((resolve) => {\n if (signal?.aborted) {\n resolve(false);\n return;\n }\n const onAbort = (): void => {\n clearTimeout(timer);\n resolve(false);\n };\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve(true);\n }, ms);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n"],"mappings":"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","names":[]}
@@ -8,7 +8,7 @@ import {
8
8
  pruneOfflineUploadStaging,
9
9
  writeOfflineUploadChunk,
10
10
  writeSafeFileFromUpload
11
- } from "./chunk-3E6DGSGZ.js";
11
+ } from "./chunk-6MC7UQ6D.js";
12
12
  import {
13
13
  OFFLINE_SYNC_FAST_BASE_MTIME_TOLERANCE_MS,
14
14
  SYNC_INTERNAL_DIR,
@@ -19,7 +19,7 @@ import {
19
19
  setSafeFileMtime,
20
20
  sha256OfflineSyncFile,
21
21
  shouldExcludeOfflineSyncFile
22
- } from "./chunk-EFHNFTWB.js";
22
+ } from "./chunk-MND4YJSX.js";
23
23
  import {
24
24
  applyChangesetEmbeddingGenerations,
25
25
  normalizeChangesetGenerations
@@ -1792,4 +1792,4 @@ export {
1792
1792
  normalizeOfflineSyncState,
1793
1793
  fileStatesFromSnapshot
1794
1794
  };
1795
- //# sourceMappingURL=chunk-23ZQPP2G.js.map
1795
+ //# sourceMappingURL=chunk-HOSJESKO.js.map
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  TAG_LIMITS,
7
7
  composeMemoryEnvelope
8
- } from "./chunk-5LRV557D.js";
8
+ } from "./chunk-2FIJQNL7.js";
9
9
  import {
10
10
  isTombstoneBlockedCaptureWriteLockBusy
11
11
  } from "./chunk-YET735EZ.js";
@@ -789,4 +789,4 @@ export {
789
789
  shouldProcessInlineExplicitCapture,
790
790
  InlineExplicitCaptureProcessor
791
791
  };
792
- //# sourceMappingURL=chunk-EU6IRUCY.js.map
792
+ //# sourceMappingURL=chunk-IDPZCHET.js.map
@@ -2,7 +2,7 @@ import {
2
2
  SupportPassportError,
3
3
  SupportPassportOwnerCreateGrantRequestSchema,
4
4
  getOperation
5
- } from "./chunk-L3IP56F4.js";
5
+ } from "./chunk-BIE3ZH3N.js";
6
6
 
7
7
  // src/support-passport/access-http.ts
8
8
  var OWNER_ROOT = "/engram/v1/support-passport";
@@ -137,4 +137,4 @@ export {
137
137
  SUPPORT_PASSPORT_OWNER_HTTP_ROUTES,
138
138
  handleSupportPassportOwnerHttp
139
139
  };
140
- //# sourceMappingURL=chunk-VMHCC7LO.js.map
140
+ //# sourceMappingURL=chunk-IO2UQVR2.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createVersion
3
- } from "./chunk-3GYSZHMT.js";
3
+ } from "./chunk-3CZRBTJK.js";
4
4
  import {
5
5
  bumpMemoryCorpusVersionForDir
6
6
  } from "./chunk-M5GVCJSJ.js";
@@ -12,7 +12,7 @@ import {
12
12
  repairContentAfterJournalMove,
13
13
  requestEntityCanonicalIdReconcile,
14
14
  withRawEntityPageMutation
15
- } from "./chunk-NZFFGO5O.js";
15
+ } from "./chunk-VXWOJPSY.js";
16
16
  import {
17
17
  parseExportBundle
18
18
  } from "./chunk-WEHSQBFR.js";
@@ -294,4 +294,4 @@ function mintForkId(capsuleId, originalId, now) {
294
294
  export {
295
295
  importCapsule
296
296
  };
297
- //# sourceMappingURL=chunk-BWXKJDDH.js.map
297
+ //# sourceMappingURL=chunk-ISMZ5UNE.js.map
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  PROMOTION_CANDIDATES_DEFAULT_MIN_ACCESS,
7
7
  isSubjectGuardMode
8
- } from "./chunk-STBX5X6B.js";
8
+ } from "./chunk-JAYNUYSJ.js";
9
9
 
10
10
  // src/subject-config.ts
11
11
  function assertObjectBlock(value, key, shape) {
@@ -52,4 +52,4 @@ function parseSubjectRuntimeConfig(cfg) {
52
52
  export {
53
53
  parseSubjectRuntimeConfig
54
54
  };
55
- //# sourceMappingURL=chunk-SX4QDWXK.js.map
55
+ //# sourceMappingURL=chunk-IWUFKS4J.js.map
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  computeCorpusWatermarks,
6
6
  resolveCorpusNamespaceRoots
7
- } from "./chunk-JHQAXATW.js";
7
+ } from "./chunk-D4RV54HH.js";
8
8
 
9
9
  // src/operator-doctor-corpus.ts
10
10
  var DIGEST_PREFIX_LENGTH = 12;
@@ -78,4 +78,4 @@ export {
78
78
  corpusWatermarksFromCheck,
79
79
  summarizeCorpusAndReplica
80
80
  };
81
- //# sourceMappingURL=chunk-I27WOMJ7.js.map
81
+ //# sourceMappingURL=chunk-IY7DGT2Z.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ContentHashIndex
3
- } from "./chunk-DEY7B77Y.js";
3
+ } from "./chunk-AHCELJMH.js";
4
4
  import {
5
5
  sanitizeMemoryContent
6
6
  } from "./chunk-5GKPFL3S.js";
@@ -164,4 +164,4 @@ export {
164
164
  PROMOTION_CANDIDATES_MCP_TOOLS,
165
165
  backfillMemorySubjects
166
166
  };
167
- //# sourceMappingURL=chunk-STBX5X6B.js.map
167
+ //# sourceMappingURL=chunk-JAYNUYSJ.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isNamespaceKind
3
- } from "./chunk-CCDHRDQ3.js";
3
+ } from "./chunk-4HYP4OKH.js";
4
4
  import {
5
5
  EngramAccessInputError
6
6
  } from "./chunk-3MUKQQ7A.js";
@@ -40,4 +40,4 @@ export {
40
40
  positiveIntQueryParam,
41
41
  optionalNamespaceKindQueryParam
42
42
  };
43
- //# sourceMappingURL=chunk-N34ZW6E4.js.map
43
+ //# sourceMappingURL=chunk-K2REHR42.js.map