@remnic/core 9.69.88 → 9.69.89

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 (228) hide show
  1. package/dist/access-admin-ops-surface.js +28 -27
  2. package/dist/access-authorization-probe.js +29 -28
  3. package/dist/access-boundary.js +28 -27
  4. package/dist/access-cli.js +77 -76
  5. package/dist/access-cli.js.map +1 -1
  6. package/dist/access-extraction-force-flush.js +28 -27
  7. package/dist/access-http-briefing.js +29 -28
  8. package/dist/access-http-query.js +30 -29
  9. package/dist/access-http.js +47 -46
  10. package/dist/access-identity-continuity-surface.js +28 -27
  11. package/dist/access-lcm-surface.js +28 -27
  12. package/dist/access-mcp.js +37 -36
  13. package/dist/access-namespace-preflight.js +28 -27
  14. package/dist/access-observe-write-category.js +8 -7
  15. package/dist/access-observe-write-surface.js +28 -27
  16. package/dist/access-offline-manifest.js +5 -4
  17. package/dist/access-operations-batch.js +29 -28
  18. package/dist/access-operations.js +36 -35
  19. package/dist/access-recall-concurrency.js +28 -27
  20. package/dist/access-recall-response.js +28 -27
  21. package/dist/access-recall-surface.js +28 -27
  22. package/dist/access-schema.js +7 -6
  23. package/dist/access-service.js +28 -27
  24. package/dist/access-surface-catalog.js +30 -29
  25. package/dist/access-surface-catalog.js.map +1 -1
  26. package/dist/active-recall.js +9 -8
  27. package/dist/active-recall.js.map +1 -1
  28. package/dist/adapters/index.js +4 -4
  29. package/dist/adapters/registry.js +2 -2
  30. package/dist/briefing.js +6 -6
  31. package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-GWVG7LGC.js} +2 -2
  32. package/dist/causal-consolidation.js +7 -7
  33. package/dist/{chunk-S2GE2K36.js → chunk-22LMCQ5B.js} +41 -41
  34. package/dist/{chunk-2DLWLNO4.js → chunk-2FX374UI.js} +3 -3
  35. package/dist/{chunk-P2ODTYOF.js → chunk-3AGHSQPM.js} +2 -2
  36. package/dist/{chunk-LW3HKRL7.js → chunk-3QKO4QN7.js} +3 -3
  37. package/dist/{chunk-BOZJD5PK.js → chunk-3YD44CH2.js} +2 -2
  38. package/dist/{chunk-STEOT4DI.js → chunk-4HUCP4R4.js} +2 -2
  39. package/dist/{chunk-Z6EZCN6Z.js → chunk-5FNZ3G6X.js} +5 -5
  40. package/dist/{chunk-CZJA2EQE.js → chunk-5STPRPE7.js} +2 -2
  41. package/dist/{chunk-FKD656D2.js → chunk-64ZUALXK.js} +2 -2
  42. package/dist/{chunk-M6C7SOR6.js → chunk-6MNKDTDI.js} +2 -2
  43. package/dist/{chunk-BGI4NUAO.js → chunk-7D7OUO5W.js} +2 -2
  44. package/dist/{chunk-AEU4EQGV.js → chunk-7QE46QXI.js} +1 -1
  45. package/dist/{chunk-C7ZDKWPS.js → chunk-7WBSMXGC.js} +3 -3
  46. package/dist/{chunk-X5SHE2O3.js → chunk-A6RVIHHK.js} +2 -2
  47. package/dist/{chunk-D5BSQR63.js → chunk-AEJ3TE5H.js} +2 -2
  48. package/dist/{chunk-K6T33R4Q.js → chunk-AXGJMDBS.js} +156 -7
  49. package/dist/chunk-AXGJMDBS.js.map +1 -0
  50. package/dist/{chunk-GZDTVYK2.js → chunk-AZIOEOK4.js} +2 -2
  51. package/dist/{chunk-VDX2J7OX.js → chunk-BUKK5SWA.js} +2 -2
  52. package/dist/{chunk-5X4MXNEU.js → chunk-C6HPNPNK.js} +3 -3
  53. package/dist/{chunk-QB57WIS6.js → chunk-CALBQ2NG.js} +35 -27
  54. package/dist/chunk-CALBQ2NG.js.map +1 -0
  55. package/dist/{chunk-5MNUBT7T.js → chunk-DO4C4AXD.js} +2 -2
  56. package/dist/{chunk-MXCAJKMA.js → chunk-EAQQ2FD3.js} +2 -2
  57. package/dist/{chunk-4KN2JLQV.js → chunk-FC52YWAO.js} +2 -2
  58. package/dist/{chunk-CRXRZA3G.js → chunk-FEIXG5FA.js} +2 -2
  59. package/dist/{chunk-VVX5PZFS.js → chunk-H36X4NRH.js} +2 -2
  60. package/dist/{chunk-ZZZ4I455.js → chunk-IIARQTZ2.js} +2 -2
  61. package/dist/{chunk-VALKBYBN.js → chunk-IKDRGVVJ.js} +2 -2
  62. package/dist/{chunk-OCFXVDBZ.js → chunk-IVEHY2VT.js} +54 -123
  63. package/dist/chunk-IVEHY2VT.js.map +1 -0
  64. package/dist/{chunk-2NAD4YCI.js → chunk-IYIBGSHJ.js} +2 -2
  65. package/dist/{chunk-HLB7GKGG.js → chunk-J27JML5O.js} +2 -2
  66. package/dist/{chunk-NYKIUQL6.js → chunk-JB56XYHP.js} +2 -2
  67. package/dist/{chunk-OK52IY3W.js → chunk-JBH26P62.js} +5 -5
  68. package/dist/{chunk-IOSZHHJC.js → chunk-JUT3OR2L.js} +4 -4
  69. package/dist/{chunk-LU7E2MXE.js → chunk-JYM4Y6SO.js} +14 -14
  70. package/dist/{chunk-Z5LP6ILP.js → chunk-JZ4TJHR2.js} +2 -2
  71. package/dist/{chunk-BLVR4WYU.js → chunk-KTKHO3UI.js} +2 -2
  72. package/dist/{chunk-W3XXFPRI.js → chunk-MGZMC6WN.js} +32 -32
  73. package/dist/chunk-MSAI3Q7D.js +372 -0
  74. package/dist/chunk-MSAI3Q7D.js.map +1 -0
  75. package/dist/{chunk-H5BJWPUI.js → chunk-NJVR724O.js} +2 -2
  76. package/dist/{chunk-AWG3TIAY.js → chunk-NMZVDRVP.js} +2 -2
  77. package/dist/{chunk-JVPWRNHA.js → chunk-NOL7SEWN.js} +2 -2
  78. package/dist/{chunk-BXLOS5AJ.js → chunk-OWHERGF2.js} +2 -2
  79. package/dist/{chunk-YJ7MW627.js → chunk-PMNLL2TL.js} +2 -2
  80. package/dist/{chunk-WKY7N3L7.js → chunk-PULDSMCJ.js} +7 -7
  81. package/dist/{chunk-AE5U5NMS.js → chunk-QOXNTKXB.js} +2 -2
  82. package/dist/{chunk-AEHVZY3X.js → chunk-QZLCVO2V.js} +2 -2
  83. package/dist/{chunk-LV5H6FTN.js → chunk-RJLV4BKR.js} +2 -2
  84. package/dist/{chunk-C6U57KG4.js → chunk-RMDGAAZF.js} +2 -2
  85. package/dist/{chunk-4OQET73E.js → chunk-SLEAJ67D.js} +4 -4
  86. package/dist/{chunk-FJLQXMTU.js → chunk-ST2RQUXC.js} +2 -2
  87. package/dist/{chunk-6UQFJULG.js → chunk-SZG4WFAG.js} +2 -2
  88. package/dist/{chunk-SWBC3UER.js → chunk-TPEZ2SHV.js} +2 -2
  89. package/dist/{chunk-PEBHPCX2.js → chunk-UQDC3W77.js} +2 -2
  90. package/dist/{chunk-DQEMWVMT.js → chunk-UVYI6VIX.js} +1 -1
  91. package/dist/{chunk-QAW55ZHJ.js → chunk-VA4O3U7U.js} +3 -3
  92. package/dist/{chunk-A4VSOUCB.js → chunk-VDO32NLK.js} +3 -3
  93. package/dist/{chunk-3SGTV7RD.js → chunk-VHDKPGMG.js} +6 -6
  94. package/dist/{chunk-5E6RYRYW.js → chunk-WNRTXEWW.js} +4 -4
  95. package/dist/{chunk-Q4AUIFUA.js → chunk-XAITGGX5.js} +4 -4
  96. package/dist/{chunk-GWM6T5EQ.js → chunk-YPI4RQWV.js} +2 -2
  97. package/dist/{chunk-4MP7XR5J.js → chunk-YSWJXOOL.js} +2 -2
  98. package/dist/{chunk-QI7K7BZ5.js → chunk-ZG5DWWKK.js} +2 -2
  99. package/dist/cli.js +60 -59
  100. package/dist/coding/export-okf-codegraph.js +5 -5
  101. package/dist/compounding/engine.js +6 -6
  102. package/dist/config.js +9 -8
  103. package/dist/connectors/codex-materialize-runner.js +6 -6
  104. package/dist/connectors/index.js +6 -6
  105. package/dist/convergence-refresh.js +8 -8
  106. package/dist/corpus-watermark.js +8 -8
  107. package/dist/deep-recall-http-glue.js +8 -7
  108. package/dist/entity-retrieval.js +6 -6
  109. package/dist/external-wiki-access.js +29 -28
  110. package/dist/extraction.js +6 -6
  111. package/dist/{first-start-migration-7OATHJKB.js → first-start-migration-GAT7G733.js} +4 -4
  112. package/dist/harmonic-retrieval.js +1 -1
  113. package/dist/index.js +115 -114
  114. package/dist/lcm/engine.js +2 -2
  115. package/dist/lcm/index.js +5 -5
  116. package/dist/location/index.js +8 -8
  117. package/dist/maintenance/memory-governance.js +6 -6
  118. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +6 -6
  119. package/dist/maintenance/rebuild-memory-projection.js +7 -7
  120. package/dist/memory-browse-operations.js +29 -28
  121. package/dist/namespaces/migrate.js +7 -7
  122. package/dist/namespaces/search.js +4 -4
  123. package/dist/namespaces/storage.js +6 -6
  124. package/dist/offline-sync-changeset-generations.d.ts +82 -0
  125. package/dist/offline-sync-changeset-generations.d.ts.map +1 -0
  126. package/dist/offline-sync-changeset-generations.js +21 -0
  127. package/dist/offline-sync-changeset-generations.js.map +1 -0
  128. package/dist/offline-sync-embedding-generation.d.ts +50 -0
  129. package/dist/offline-sync-embedding-generation.d.ts.map +1 -1
  130. package/dist/offline-sync-embedding-generation.js +4 -2
  131. package/dist/offline-sync-snapshot-stream.js +5 -4
  132. package/dist/offline-sync.d.ts +12 -1
  133. package/dist/offline-sync.d.ts.map +1 -1
  134. package/dist/offline-sync.js +6 -5
  135. package/dist/operator-doctor-corpus.js +9 -9
  136. package/dist/operator-toolkit.js +18 -17
  137. package/dist/orchestration/maintenance.js +14 -14
  138. package/dist/orchestrator.js +78 -77
  139. package/dist/recall-navigation-operations.js +29 -28
  140. package/dist/recall-navigation.js +28 -27
  141. package/dist/resume-bundles.js +9 -8
  142. package/dist/search/factory.js +3 -3
  143. package/dist/search/index.js +7 -7
  144. package/dist/semantic-consolidation.js +7 -7
  145. package/dist/semantic-rule-promotion.js +6 -6
  146. package/dist/semantic-rule-verifier.js +6 -6
  147. package/dist/source-agent-qualifier.js +6 -6
  148. package/dist/standup/build.js +6 -6
  149. package/dist/storage.js +5 -5
  150. package/dist/support-passport/index.js +31 -30
  151. package/dist/support-passport/offline-sync-guard.d.ts +6 -2
  152. package/dist/support-passport/offline-sync-guard.d.ts.map +1 -1
  153. package/dist/transfer/backup.js +2 -2
  154. package/dist/transfer/capsule-export.js +2 -2
  155. package/dist/transfer/capsule-import.js +2 -2
  156. package/dist/transfer/export-okf.js +6 -6
  157. package/dist/verified-recall.js +6 -6
  158. package/dist/who-knows-cli.js +7 -7
  159. package/dist/who-knows.js +6 -6
  160. package/package.json +2 -2
  161. package/src/offline-sync-changeset-generations.test.ts +962 -0
  162. package/src/offline-sync-changeset-generations.ts +549 -0
  163. package/src/offline-sync-embedding-generation.ts +272 -4
  164. package/src/offline-sync.ts +75 -162
  165. package/src/support-passport/offline-sync-guard.ts +16 -2
  166. package/dist/chunk-K6T33R4Q.js.map +0 -1
  167. package/dist/chunk-OCFXVDBZ.js.map +0 -1
  168. package/dist/chunk-QB57WIS6.js.map +0 -1
  169. /package/dist/{capsule-crypto-YO5QJ6L3.js.map → capsule-crypto-GWVG7LGC.js.map} +0 -0
  170. /package/dist/{chunk-S2GE2K36.js.map → chunk-22LMCQ5B.js.map} +0 -0
  171. /package/dist/{chunk-2DLWLNO4.js.map → chunk-2FX374UI.js.map} +0 -0
  172. /package/dist/{chunk-P2ODTYOF.js.map → chunk-3AGHSQPM.js.map} +0 -0
  173. /package/dist/{chunk-LW3HKRL7.js.map → chunk-3QKO4QN7.js.map} +0 -0
  174. /package/dist/{chunk-BOZJD5PK.js.map → chunk-3YD44CH2.js.map} +0 -0
  175. /package/dist/{chunk-STEOT4DI.js.map → chunk-4HUCP4R4.js.map} +0 -0
  176. /package/dist/{chunk-Z6EZCN6Z.js.map → chunk-5FNZ3G6X.js.map} +0 -0
  177. /package/dist/{chunk-CZJA2EQE.js.map → chunk-5STPRPE7.js.map} +0 -0
  178. /package/dist/{chunk-FKD656D2.js.map → chunk-64ZUALXK.js.map} +0 -0
  179. /package/dist/{chunk-M6C7SOR6.js.map → chunk-6MNKDTDI.js.map} +0 -0
  180. /package/dist/{chunk-BGI4NUAO.js.map → chunk-7D7OUO5W.js.map} +0 -0
  181. /package/dist/{chunk-AEU4EQGV.js.map → chunk-7QE46QXI.js.map} +0 -0
  182. /package/dist/{chunk-C7ZDKWPS.js.map → chunk-7WBSMXGC.js.map} +0 -0
  183. /package/dist/{chunk-X5SHE2O3.js.map → chunk-A6RVIHHK.js.map} +0 -0
  184. /package/dist/{chunk-D5BSQR63.js.map → chunk-AEJ3TE5H.js.map} +0 -0
  185. /package/dist/{chunk-GZDTVYK2.js.map → chunk-AZIOEOK4.js.map} +0 -0
  186. /package/dist/{chunk-VDX2J7OX.js.map → chunk-BUKK5SWA.js.map} +0 -0
  187. /package/dist/{chunk-5X4MXNEU.js.map → chunk-C6HPNPNK.js.map} +0 -0
  188. /package/dist/{chunk-5MNUBT7T.js.map → chunk-DO4C4AXD.js.map} +0 -0
  189. /package/dist/{chunk-MXCAJKMA.js.map → chunk-EAQQ2FD3.js.map} +0 -0
  190. /package/dist/{chunk-4KN2JLQV.js.map → chunk-FC52YWAO.js.map} +0 -0
  191. /package/dist/{chunk-CRXRZA3G.js.map → chunk-FEIXG5FA.js.map} +0 -0
  192. /package/dist/{chunk-VVX5PZFS.js.map → chunk-H36X4NRH.js.map} +0 -0
  193. /package/dist/{chunk-ZZZ4I455.js.map → chunk-IIARQTZ2.js.map} +0 -0
  194. /package/dist/{chunk-VALKBYBN.js.map → chunk-IKDRGVVJ.js.map} +0 -0
  195. /package/dist/{chunk-2NAD4YCI.js.map → chunk-IYIBGSHJ.js.map} +0 -0
  196. /package/dist/{chunk-HLB7GKGG.js.map → chunk-J27JML5O.js.map} +0 -0
  197. /package/dist/{chunk-NYKIUQL6.js.map → chunk-JB56XYHP.js.map} +0 -0
  198. /package/dist/{chunk-OK52IY3W.js.map → chunk-JBH26P62.js.map} +0 -0
  199. /package/dist/{chunk-IOSZHHJC.js.map → chunk-JUT3OR2L.js.map} +0 -0
  200. /package/dist/{chunk-LU7E2MXE.js.map → chunk-JYM4Y6SO.js.map} +0 -0
  201. /package/dist/{chunk-Z5LP6ILP.js.map → chunk-JZ4TJHR2.js.map} +0 -0
  202. /package/dist/{chunk-BLVR4WYU.js.map → chunk-KTKHO3UI.js.map} +0 -0
  203. /package/dist/{chunk-W3XXFPRI.js.map → chunk-MGZMC6WN.js.map} +0 -0
  204. /package/dist/{chunk-H5BJWPUI.js.map → chunk-NJVR724O.js.map} +0 -0
  205. /package/dist/{chunk-AWG3TIAY.js.map → chunk-NMZVDRVP.js.map} +0 -0
  206. /package/dist/{chunk-JVPWRNHA.js.map → chunk-NOL7SEWN.js.map} +0 -0
  207. /package/dist/{chunk-BXLOS5AJ.js.map → chunk-OWHERGF2.js.map} +0 -0
  208. /package/dist/{chunk-YJ7MW627.js.map → chunk-PMNLL2TL.js.map} +0 -0
  209. /package/dist/{chunk-WKY7N3L7.js.map → chunk-PULDSMCJ.js.map} +0 -0
  210. /package/dist/{chunk-AE5U5NMS.js.map → chunk-QOXNTKXB.js.map} +0 -0
  211. /package/dist/{chunk-AEHVZY3X.js.map → chunk-QZLCVO2V.js.map} +0 -0
  212. /package/dist/{chunk-LV5H6FTN.js.map → chunk-RJLV4BKR.js.map} +0 -0
  213. /package/dist/{chunk-C6U57KG4.js.map → chunk-RMDGAAZF.js.map} +0 -0
  214. /package/dist/{chunk-4OQET73E.js.map → chunk-SLEAJ67D.js.map} +0 -0
  215. /package/dist/{chunk-FJLQXMTU.js.map → chunk-ST2RQUXC.js.map} +0 -0
  216. /package/dist/{chunk-6UQFJULG.js.map → chunk-SZG4WFAG.js.map} +0 -0
  217. /package/dist/{chunk-SWBC3UER.js.map → chunk-TPEZ2SHV.js.map} +0 -0
  218. /package/dist/{chunk-PEBHPCX2.js.map → chunk-UQDC3W77.js.map} +0 -0
  219. /package/dist/{chunk-DQEMWVMT.js.map → chunk-UVYI6VIX.js.map} +0 -0
  220. /package/dist/{chunk-QAW55ZHJ.js.map → chunk-VA4O3U7U.js.map} +0 -0
  221. /package/dist/{chunk-A4VSOUCB.js.map → chunk-VDO32NLK.js.map} +0 -0
  222. /package/dist/{chunk-3SGTV7RD.js.map → chunk-VHDKPGMG.js.map} +0 -0
  223. /package/dist/{chunk-5E6RYRYW.js.map → chunk-WNRTXEWW.js.map} +0 -0
  224. /package/dist/{chunk-Q4AUIFUA.js.map → chunk-XAITGGX5.js.map} +0 -0
  225. /package/dist/{chunk-GWM6T5EQ.js.map → chunk-YPI4RQWV.js.map} +0 -0
  226. /package/dist/{chunk-4MP7XR5J.js.map → chunk-YSWJXOOL.js.map} +0 -0
  227. /package/dist/{chunk-QI7K7BZ5.js.map → chunk-ZG5DWWKK.js.map} +0 -0
  228. /package/dist/{first-start-migration-7OATHJKB.js.map → first-start-migration-GAT7G733.js.map} +0 -0
@@ -19,7 +19,7 @@ import {
19
19
  import {
20
20
  exportOkfBundle,
21
21
  parseIncludeStatus
22
- } from "./chunk-BLVR4WYU.js";
22
+ } from "./chunk-KTKHO3UI.js";
23
23
  import {
24
24
  exportSqlite
25
25
  } from "./chunk-BV2TIZ4F.js";
@@ -31,7 +31,7 @@ import {
31
31
  } from "./chunk-2DL3OFLD.js";
32
32
  import {
33
33
  backupMemoryDir
34
- } from "./chunk-BXLOS5AJ.js";
34
+ } from "./chunk-OWHERGF2.js";
35
35
  import {
36
36
  exportMarkdownBundle
37
37
  } from "./chunk-765K3SAT.js";
@@ -58,7 +58,7 @@ import {
58
58
  } from "./chunk-IIFFC3RL.js";
59
59
  import {
60
60
  rebuildMemoryLifecycleLedger
61
- } from "./chunk-H5BJWPUI.js";
61
+ } from "./chunk-NJVR724O.js";
62
62
  import {
63
63
  rebuildObservations
64
64
  } from "./chunk-DQTCGVFK.js";
@@ -79,7 +79,7 @@ import {
79
79
  } from "./chunk-2524MOWK.js";
80
80
  import {
81
81
  searchVerifiedEpisodes
82
- } from "./chunk-4MP7XR5J.js";
82
+ } from "./chunk-YSWJXOOL.js";
83
83
  import {
84
84
  getUtilityLearningStatus,
85
85
  learnUtilityPromotionWeights
@@ -93,10 +93,10 @@ import {
93
93
  } from "./chunk-OJP3N7UK.js";
94
94
  import {
95
95
  promoteSemanticRuleFromMemory
96
- } from "./chunk-FJLQXMTU.js";
96
+ } from "./chunk-ST2RQUXC.js";
97
97
  import {
98
98
  searchVerifiedSemanticRules
99
- } from "./chunk-2NAD4YCI.js";
99
+ } from "./chunk-IYIBGSHJ.js";
100
100
  import {
101
101
  buildResumeBundleFromState,
102
102
  getResumeBundleStatus,
@@ -113,19 +113,6 @@ import {
113
113
  import {
114
114
  parseXrayCliOptions
115
115
  } from "./chunk-DBYAY6UW.js";
116
- import {
117
- collectPatternMemories,
118
- explainPatternMemory,
119
- parsePatternsExplainOptions,
120
- parsePatternsListOptions,
121
- parseStrictCliDate,
122
- renderPatternExplain,
123
- renderPatternsList
124
- } from "./chunk-3T74IZB3.js";
125
- import {
126
- readRuntimePolicySnapshot,
127
- sanitizeRuntimePolicyValues
128
- } from "./chunk-2LA3H54D.js";
129
116
  import {
130
117
  formatNamespaceMaintenanceHealthText,
131
118
  runBenchmarkRecall,
@@ -134,12 +121,25 @@ import {
134
121
  runOperatorInventory,
135
122
  runOperatorRepair,
136
123
  runOperatorSetup
137
- } from "./chunk-WKY7N3L7.js";
124
+ } from "./chunk-PULDSMCJ.js";
138
125
  import {
139
126
  analyzeSessionIntegrity,
140
127
  applySessionRepair,
141
128
  planSessionRepair
142
129
  } from "./chunk-KFY3SGN7.js";
130
+ import {
131
+ collectPatternMemories,
132
+ explainPatternMemory,
133
+ parsePatternsExplainOptions,
134
+ parsePatternsListOptions,
135
+ parseStrictCliDate,
136
+ renderPatternExplain,
137
+ renderPatternsList
138
+ } from "./chunk-3T74IZB3.js";
139
+ import {
140
+ readRuntimePolicySnapshot,
141
+ sanitizeRuntimePolicyValues
142
+ } from "./chunk-2LA3H54D.js";
143
143
  import {
144
144
  GITHUB_CONNECTOR_ID,
145
145
  GMAIL_CONNECTOR_ID,
@@ -176,7 +176,7 @@ import {
176
176
  rebuildMemoryProjection,
177
177
  repairMemoryProjection,
178
178
  verifyMemoryProjection
179
- } from "./chunk-C7ZDKWPS.js";
179
+ } from "./chunk-7WBSMXGC.js";
180
180
  import {
181
181
  buildConnectorRowsFromDefinitions,
182
182
  parseConnectorsListOptions,
@@ -210,7 +210,7 @@ import {
210
210
  import {
211
211
  EngramAccessHttpServer,
212
212
  MeetingsInputError
213
- } from "./chunk-LU7E2MXE.js";
213
+ } from "./chunk-JYM4Y6SO.js";
214
214
  import {
215
215
  WearablesInputError
216
216
  } from "./chunk-V7IZKJI3.js";
@@ -220,10 +220,10 @@ import {
220
220
  loadChatSession,
221
221
  processChatMessage,
222
222
  sessionBelongsToPrincipal
223
- } from "./chunk-IOSZHHJC.js";
223
+ } from "./chunk-JUT3OR2L.js";
224
224
  import {
225
225
  EngramAccessService
226
- } from "./chunk-QB57WIS6.js";
226
+ } from "./chunk-CALBQ2NG.js";
227
227
  import {
228
228
  WorkStorage
229
229
  } from "./chunk-MPC7TYTZ.js";
@@ -243,7 +243,7 @@ import {
243
243
  } from "./chunk-KN6CIN7I.js";
244
244
  import {
245
245
  readAggregateExtractionWatermark
246
- } from "./chunk-GZDTVYK2.js";
246
+ } from "./chunk-AZIOEOK4.js";
247
247
  import {
248
248
  getObjectiveStateStoreStatus
249
249
  } from "./chunk-HM7RHKS4.js";
@@ -252,7 +252,7 @@ import {
252
252
  } from "./chunk-66DKTOBY.js";
253
253
  import {
254
254
  searchHarmonicRetrieval
255
- } from "./chunk-AEU4EQGV.js";
255
+ } from "./chunk-7QE46QXI.js";
256
256
  import {
257
257
  getCueAnchorStoreStatus
258
258
  } from "./chunk-BMWN7B3Y.js";
@@ -261,12 +261,12 @@ import {
261
261
  readMemoryGovernanceRunArtifact,
262
262
  restoreMemoryGovernanceRun,
263
263
  runMemoryGovernance
264
- } from "./chunk-AWG3TIAY.js";
264
+ } from "./chunk-NMZVDRVP.js";
265
265
  import {
266
266
  listNamespaces,
267
267
  runNamespaceMigration,
268
268
  verifyNamespaces
269
- } from "./chunk-2DLWLNO4.js";
269
+ } from "./chunk-2FX374UI.js";
270
270
  import {
271
271
  resolveNamespaceChildRoot
272
272
  } from "./chunk-3UXOZBHV.js";
@@ -303,7 +303,7 @@ import {
303
303
  } from "./chunk-B3O3IRZN.js";
304
304
  import {
305
305
  meetingIdDate
306
- } from "./chunk-STEOT4DI.js";
306
+ } from "./chunk-4HUCP4R4.js";
307
307
  import {
308
308
  isValidTranscriptDate
309
309
  } from "./chunk-UHVXE24Y.js";
@@ -6698,7 +6698,7 @@ function registerCli(api, orchestrator, registerOptions = {}) {
6698
6698
  }
6699
6699
  }
6700
6700
  if (sourceArchive.endsWith(".enc")) {
6701
- const { isEncryptedCapsuleFile } = await import("./capsule-crypto-YO5QJ6L3.js");
6701
+ const { isEncryptedCapsuleFile } = await import("./capsule-crypto-GWVG7LGC.js");
6702
6702
  const encDetected = await isEncryptedCapsuleFile(sourceArchive).catch(() => true);
6703
6703
  if (encDetected) {
6704
6704
  throw new Error(
@@ -6861,7 +6861,7 @@ function registerCli(api, orchestrator, registerOptions = {}) {
6861
6861
  const { parseExportBundle } = await import("./transfer/types.js");
6862
6862
  let decryptedBuf;
6863
6863
  try {
6864
- const { decryptCapsuleFileInMemory } = await import("./capsule-crypto-YO5QJ6L3.js");
6864
+ const { decryptCapsuleFileInMemory } = await import("./capsule-crypto-GWVG7LGC.js");
6865
6865
  decryptedBuf = await decryptCapsuleFileInMemory(archivePath, memoryDir);
6866
6866
  } catch (decErr) {
6867
6867
  const msg = decErr instanceof Error ? decErr.message : String(decErr);
@@ -10136,4 +10136,4 @@ export {
10136
10136
  listMemoryMarkdownFilePaths,
10137
10137
  registerCli
10138
10138
  };
10139
- //# sourceMappingURL=chunk-W3XXFPRI.js.map
10139
+ //# sourceMappingURL=chunk-MGZMC6WN.js.map
@@ -0,0 +1,372 @@
1
+ import {
2
+ EMBEDDING_SHARD_DIR_BASENAME,
3
+ applyEmbeddingGenerationRemoval,
4
+ applyEmbeddingGenerationTransaction,
5
+ embeddingGenerationMembership,
6
+ embeddingShardDirOf,
7
+ isEmbeddingGenerationDirPath
8
+ } from "./chunk-AXGJMDBS.js";
9
+ import {
10
+ EMBEDDING_SHARD_FILE_PATTERN
11
+ } from "./chunk-TYT4TEQV.js";
12
+ import {
13
+ resolveSafeArchiveTarget
14
+ } from "./chunk-GCGJW34D.js";
15
+ import {
16
+ EmbeddingIndexStorageError
17
+ } from "./chunk-UCPGOUDZ.js";
18
+
19
+ // src/offline-sync-changeset-generations.ts
20
+ import { lstat, readdir } from "fs/promises";
21
+ var EMBEDDING_MARKER_BASENAME = "embeddings.json";
22
+ async function pathExists(absPath) {
23
+ try {
24
+ await lstat(absPath);
25
+ return true;
26
+ } catch (err) {
27
+ if (err.code === "ENOENT") return false;
28
+ throw err;
29
+ }
30
+ }
31
+ var SHA256_PATTERN = /^[0-9a-f]{64}$/;
32
+ function normalizeChangesetGenerations(raw, changes) {
33
+ if (raw === void 0) return void 0;
34
+ if (!Array.isArray(raw)) {
35
+ throw new Error("offline sync changeset embeddingGenerations must be an array");
36
+ }
37
+ const dirs = /* @__PURE__ */ new Set();
38
+ const generations = [];
39
+ for (const entry of raw) {
40
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
41
+ throw new Error("offline sync changeset embeddingGenerations entries must be objects");
42
+ }
43
+ const record = entry;
44
+ const shardDir = typeof record.shardDir === "string" ? record.shardDir : "";
45
+ if (!isEmbeddingGenerationDirPath(shardDir)) {
46
+ throw new Error(`offline sync changeset embeddingGenerations shardDir must be a canonical embeddings generation dir: ${shardDir}`);
47
+ }
48
+ if (dirs.has(shardDir)) {
49
+ throw new Error(`offline sync changeset embeddingGenerations has a duplicate shardDir: ${shardDir}`);
50
+ }
51
+ if (!Array.isArray(record.members) || record.members.length === 0) {
52
+ throw new Error(`offline sync changeset embeddingGenerations ${shardDir} must list its complete member set`);
53
+ }
54
+ const memberPaths = /* @__PURE__ */ new Set();
55
+ const members = [];
56
+ for (const rawMember of record.members) {
57
+ if (!rawMember || typeof rawMember !== "object" || Array.isArray(rawMember)) {
58
+ throw new Error(`offline sync changeset embeddingGenerations ${shardDir} members must be objects`);
59
+ }
60
+ const member = rawMember;
61
+ const memberPath = typeof member.path === "string" ? member.path : "";
62
+ if (embeddingShardDirOf(memberPath) !== shardDir) {
63
+ throw new Error(`offline sync changeset embeddingGenerations member ${memberPath} does not belong to generation ${shardDir}`);
64
+ }
65
+ if (memberPaths.has(memberPath)) {
66
+ throw new Error(`offline sync changeset embeddingGenerations ${shardDir} has a duplicate member: ${memberPath}`);
67
+ }
68
+ if (typeof member.sha256 !== "string" || !SHA256_PATTERN.test(member.sha256)) {
69
+ throw new Error(`offline sync changeset embeddingGenerations member ${memberPath} sha256 must be a lowercase sha256 hex digest`);
70
+ }
71
+ if (typeof member.bytes !== "number" || !Number.isInteger(member.bytes) || member.bytes < 0) {
72
+ throw new Error(`offline sync changeset embeddingGenerations member ${memberPath} bytes must be a non-negative integer`);
73
+ }
74
+ memberPaths.add(memberPath);
75
+ members.push({ path: memberPath, sha256: member.sha256, bytes: member.bytes });
76
+ }
77
+ dirs.add(shardDir);
78
+ generations.push({ shardDir, members });
79
+ }
80
+ const memberByPath = /* @__PURE__ */ new Map();
81
+ for (const generation of generations) {
82
+ for (const member of generation.members) memberByPath.set(member.path, member);
83
+ }
84
+ for (const change of changes) {
85
+ const membership = embeddingGenerationMembership(change.path);
86
+ if (!membership) continue;
87
+ const manifested = memberByPath.get(change.path);
88
+ if (change.type === "upsert") {
89
+ if (membership.kind !== "shard") continue;
90
+ if (!manifested) {
91
+ throw new Error(`offline sync changeset upserts of embedding shards require a manifest entry: ${change.path}`);
92
+ }
93
+ if (manifested.sha256 !== change.file.sha256 || manifested.bytes !== change.file.bytes) {
94
+ throw new Error(`offline sync changeset manifest member ${change.path} does not match the upserted record`);
95
+ }
96
+ continue;
97
+ }
98
+ if (manifested) {
99
+ throw new Error(`offline sync changeset delete of ${change.path} contradicts its manifest membership`);
100
+ }
101
+ }
102
+ return generations;
103
+ }
104
+ function deferGenerationConflicts(dirChanges, currentMap, reason) {
105
+ const conflicts = [];
106
+ const conflictedPaths = /* @__PURE__ */ new Set();
107
+ for (const change of dirChanges) {
108
+ conflictedPaths.add(change.path);
109
+ conflicts.push({
110
+ path: change.path,
111
+ reason,
112
+ ...change.type === "upsert" ? { incomingSha256: change.file.sha256 } : {},
113
+ ...change.baseSha256 !== void 0 ? { baseSha256: change.baseSha256 } : {},
114
+ localSha256: currentMap.get(change.path)?.sha256
115
+ });
116
+ }
117
+ return { conflicts, conflictedPaths };
118
+ }
119
+ async function applyChangesetEmbeddingGenerations(options) {
120
+ const result = {
121
+ transactionHandled: /* @__PURE__ */ new Set(),
122
+ conflicts: [],
123
+ conflictedPaths: /* @__PURE__ */ new Set(),
124
+ appliedUpserts: 0,
125
+ appliedDeletes: 0,
126
+ writtenStates: /* @__PURE__ */ new Map(),
127
+ removedPaths: /* @__PURE__ */ new Set()
128
+ };
129
+ const manifest = new Map(
130
+ (options.changeset.embeddingGenerations ?? []).map((generation) => [generation.shardDir, generation])
131
+ );
132
+ const shardUpsertChanges = /* @__PURE__ */ new Map();
133
+ const markerUpsertChanges = /* @__PURE__ */ new Map();
134
+ const deleteChangesByDir = /* @__PURE__ */ new Map();
135
+ const dirChanges = /* @__PURE__ */ new Map();
136
+ for (const change of options.changeset.changes) {
137
+ const membership = embeddingGenerationMembership(change.path);
138
+ if (!membership) continue;
139
+ const dir = membership.shardDir;
140
+ if (!dirChanges.has(dir)) dirChanges.set(dir, []);
141
+ dirChanges.get(dir).push(change);
142
+ if (change.type === "upsert") {
143
+ if (membership.kind === "shard") {
144
+ if (!shardUpsertChanges.has(dir)) shardUpsertChanges.set(dir, []);
145
+ shardUpsertChanges.get(dir).push(change);
146
+ } else {
147
+ if (!markerUpsertChanges.has(dir)) markerUpsertChanges.set(dir, []);
148
+ markerUpsertChanges.get(dir).push(change);
149
+ }
150
+ } else {
151
+ if (!deleteChangesByDir.has(dir)) deleteChangesByDir.set(dir, []);
152
+ deleteChangesByDir.get(dir).push(change);
153
+ }
154
+ }
155
+ if ((shardUpsertChanges.size > 0 || markerUpsertChanges.size > 0) && options.customIoPresent && !(options.io.writeStagingFile && options.io.readStagingFile)) {
156
+ throw new EmbeddingIndexStorageError(
157
+ "refusing to replace embedding generation: custom storage IO requires both writeStagingFile and readStagingFile hooks; unencrypted raw staging would plaintext-downgrade the index"
158
+ );
159
+ }
160
+ const runTransaction = async (shardDirRel, input) => {
161
+ const transaction = await applyEmbeddingGenerationTransaction({
162
+ ...input,
163
+ root: options.root,
164
+ io: options.io,
165
+ now: options.now
166
+ });
167
+ if (transaction.deferredLocalDivergence) {
168
+ const deferred = deferGenerationConflicts(
169
+ dirChanges.get(shardDirRel) ?? [],
170
+ options.currentMap,
171
+ "embedding_generation_diverged"
172
+ );
173
+ result.conflicts.push(...deferred.conflicts);
174
+ for (const conflicted of deferred.conflictedPaths) result.conflictedPaths.add(conflicted);
175
+ return transaction;
176
+ }
177
+ result.appliedUpserts += transaction.upserted;
178
+ result.appliedDeletes += transaction.deleted;
179
+ for (const [relPath, state] of transaction.writtenStates) {
180
+ result.writtenStates.set(relPath, state);
181
+ result.transactionHandled.add(relPath);
182
+ }
183
+ for (const relPath of transaction.removedPaths) {
184
+ result.removedPaths.add(relPath);
185
+ result.transactionHandled.add(relPath);
186
+ }
187
+ return transaction;
188
+ };
189
+ const manifestedInput = (shardDirRel, generation) => {
190
+ const upsertByPath = new Map(
191
+ (shardUpsertChanges.get(shardDirRel) ?? []).map((change) => [change.path, change])
192
+ );
193
+ const memberByPath = new Map(generation.members.map((member) => [member.path, member]));
194
+ const incomingShardPaths = generation.members.map((member) => member.path).sort();
195
+ const tombstones = (deleteChangesByDir.get(shardDirRel) ?? []).filter((change) => change.type === "delete");
196
+ const baseStates = /* @__PURE__ */ new Map();
197
+ for (const member of generation.members) {
198
+ const change = upsertByPath.get(member.path);
199
+ if (change) {
200
+ if (change.baseSha256 !== void 0) baseStates.set(member.path, { sha256: change.baseSha256 });
201
+ continue;
202
+ }
203
+ baseStates.set(member.path, { sha256: member.sha256 });
204
+ }
205
+ for (const change of tombstones) {
206
+ baseStates.set(change.path, { sha256: change.baseSha256 });
207
+ }
208
+ return {
209
+ shardDirRel,
210
+ incomingShardPaths,
211
+ incomingMarker: null,
212
+ incomingMarkerPresent: markerUpsertChanges.has(shardDirRel),
213
+ incomingShardStates: new Map(
214
+ incomingShardPaths.map((relPath) => [relPath, {
215
+ path: relPath,
216
+ sha256: upsertByPath.get(relPath)?.file.sha256 ?? memberByPath.get(relPath).sha256,
217
+ bytes: memberByPath.get(relPath).bytes,
218
+ mtimeMs: options.now
219
+ }])
220
+ ),
221
+ incomingBuffers: options.incomingBuffers,
222
+ baseStates,
223
+ // Manifested deletes are pre-authorized removals: the retry after a
224
+ // response loss must re-apply idempotently instead of diverging
225
+ // (#3150 review), and the swept members need their deletion revisions
226
+ // recorded after the swap (the per-file loop never sees them). The
227
+ // map is present whenever tombstones exist — even when none carries
228
+ // mtimeMs — so the recording pass runs and defaults to `now`.
229
+ justifiedRemovals: new Set(tombstones.map((change) => change.path)),
230
+ deletionMtimeByPath: tombstones.length === 0 ? void 0 : new Map(
231
+ tombstones.filter((change) => change.mtimeMs !== void 0).map((change) => [change.path, change.mtimeMs])
232
+ ),
233
+ // All-manifested members base-less = the sender claims a fresh
234
+ // creation; an existing local generation must match exactly or defer.
235
+ freshCreateClaim: baseStates.size === 0
236
+ };
237
+ };
238
+ const stateDirSuffix = `/${EMBEDDING_SHARD_DIR_BASENAME}`;
239
+ const allDirs = /* @__PURE__ */ new Set([
240
+ ...shardUpsertChanges.keys(),
241
+ ...markerUpsertChanges.keys(),
242
+ ...deleteChangesByDir.keys()
243
+ ]);
244
+ for (const shardDirRel of [...allDirs].sort()) {
245
+ const generation = manifest.get(shardDirRel);
246
+ if (shardUpsertChanges.has(shardDirRel) || generation && deleteChangesByDir.has(shardDirRel)) {
247
+ if (!generation) {
248
+ const deferred = deferGenerationConflicts(
249
+ dirChanges.get(shardDirRel) ?? [],
250
+ options.currentMap,
251
+ "embedding_generation_manifest_required"
252
+ );
253
+ result.conflicts.push(...deferred.conflicts);
254
+ for (const conflicted of deferred.conflictedPaths) result.conflictedPaths.add(conflicted);
255
+ continue;
256
+ }
257
+ await runTransaction(shardDirRel, manifestedInput(shardDirRel, generation));
258
+ continue;
259
+ }
260
+ if (markerUpsertChanges.has(shardDirRel)) {
261
+ const markerChange = (markerUpsertChanges.get(shardDirRel) ?? [])[0];
262
+ if (!markerChange) continue;
263
+ const stateDirRel2 = shardDirRel.slice(0, -stateDirSuffix.length);
264
+ const markerRel2 = `${stateDirRel2}/${EMBEDDING_MARKER_BASENAME}`;
265
+ const transaction = await runTransaction(shardDirRel, {
266
+ shardDirRel,
267
+ incomingShardPaths: [],
268
+ incomingMarker: {
269
+ path: markerRel2,
270
+ sha256: markerChange.file.sha256,
271
+ buffer: options.incomingBuffers.get(markerRel2) ?? null
272
+ },
273
+ incomingMarkerPresent: false,
274
+ incomingShardStates: /* @__PURE__ */ new Map(),
275
+ incomingBuffers: options.incomingBuffers,
276
+ baseStates: markerChange.baseSha256 === void 0 ? void 0 : /* @__PURE__ */ new Map([[markerRel2, { sha256: markerChange.baseSha256 }]])
277
+ });
278
+ if (!transaction.deferredLocalDivergence) result.transactionHandled.add(markerRel2);
279
+ continue;
280
+ }
281
+ const deletes = deleteChangesByDir.get(shardDirRel) ?? [];
282
+ const deletePaths = new Set(deletes.map((change) => change.path));
283
+ const stateDirRel = shardDirRel.slice(0, -stateDirSuffix.length);
284
+ const markerRel = `${stateDirRel}/${EMBEDDING_MARKER_BASENAME}`;
285
+ const localMembers = [];
286
+ if (await pathExists(await resolveSafeArchiveTarget(options.root, markerRel))) localMembers.push(markerRel);
287
+ let localShardNames = [];
288
+ try {
289
+ localShardNames = (await readdir(await resolveSafeArchiveTarget(options.root, shardDirRel))).filter((name) => EMBEDDING_SHARD_FILE_PATTERN.test(name));
290
+ } catch (err) {
291
+ if (err.code !== "ENOENT") throw err;
292
+ }
293
+ for (const name of localShardNames) localMembers.push(`${shardDirRel}/${name}`);
294
+ if (localMembers.length === 0) continue;
295
+ if (!localMembers.every((relPath) => deletePaths.has(relPath))) {
296
+ const deferred = deferGenerationConflicts(deletes, options.currentMap, "embedding_generation_manifest_required");
297
+ result.conflicts.push(...deferred.conflicts);
298
+ for (const conflicted of deferred.conflictedPaths) result.conflictedPaths.add(conflicted);
299
+ continue;
300
+ }
301
+ const tombstones = deletes.filter((change) => change.type === "delete");
302
+ const removal = await applyEmbeddingGenerationRemoval({
303
+ root: options.root,
304
+ shardDirRel,
305
+ io: { deleteFile: options.io.deleteFile, readFile: options.io.readFile },
306
+ deletionMtimeByPath: new Map(
307
+ tombstones.filter((change) => change.mtimeMs !== void 0).map((change) => [change.path, change.mtimeMs])
308
+ ),
309
+ baseStates: new Map(tombstones.map((change) => [change.path, { sha256: change.baseSha256 }])),
310
+ now: options.now
311
+ });
312
+ if (removal.deferredLocalDivergence) {
313
+ const deferred = deferGenerationConflicts(deletes, options.currentMap, "embedding_generation_diverged");
314
+ result.conflicts.push(...deferred.conflicts);
315
+ for (const conflicted of deferred.conflictedPaths) result.conflictedPaths.add(conflicted);
316
+ continue;
317
+ }
318
+ result.appliedDeletes += removal.deleted;
319
+ for (const relPath of removal.removedPaths) {
320
+ result.removedPaths.add(relPath);
321
+ result.transactionHandled.add(relPath);
322
+ }
323
+ }
324
+ return result;
325
+ }
326
+ function buildChangesetGenerationManifest(options) {
327
+ const currentByPath = new Map(options.currentFiles.map((state) => [state.path, state]));
328
+ const baseByPath = new Map(options.baseFiles.map((state) => [state.path, state]));
329
+ const touchedDirs = /* @__PURE__ */ new Map();
330
+ for (const change of options.changes) {
331
+ const membership = embeddingGenerationMembership(change.path);
332
+ if (membership) {
333
+ if (!touchedDirs.has(membership.shardDir)) touchedDirs.set(membership.shardDir, []);
334
+ touchedDirs.get(membership.shardDir).push(change);
335
+ }
336
+ }
337
+ const generations = [];
338
+ for (const [shardDirRel, changes] of [...touchedDirs].sort(([left], [right]) => left.localeCompare(right))) {
339
+ const memberPaths = /* @__PURE__ */ new Set();
340
+ for (const relPath of currentByPath.keys()) {
341
+ const membership = embeddingGenerationMembership(relPath);
342
+ if (membership?.shardDir === shardDirRel) memberPaths.add(relPath);
343
+ }
344
+ for (const relPath of baseByPath.keys()) {
345
+ const membership = embeddingGenerationMembership(relPath);
346
+ if (membership?.shardDir === shardDirRel) memberPaths.add(relPath);
347
+ }
348
+ for (const change of changes) memberPaths.add(change.path);
349
+ let omitted = false;
350
+ for (const relPath of memberPaths) {
351
+ if (options.isExcluded(relPath)) {
352
+ omitted = true;
353
+ break;
354
+ }
355
+ }
356
+ if (omitted) continue;
357
+ const members = [...memberPaths].filter((relPath) => currentByPath.has(relPath)).sort().map((relPath) => {
358
+ const state = currentByPath.get(relPath);
359
+ return { path: state.path, sha256: state.sha256, bytes: state.bytes };
360
+ });
361
+ if (members.length === 0) continue;
362
+ generations.push({ shardDir: shardDirRel, members });
363
+ }
364
+ return generations;
365
+ }
366
+
367
+ export {
368
+ normalizeChangesetGenerations,
369
+ applyChangesetEmbeddingGenerations,
370
+ buildChangesetGenerationManifest
371
+ };
372
+ //# sourceMappingURL=chunk-MSAI3Q7D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/offline-sync-changeset-generations.ts"],"sourcesContent":["// Changeset-side generation atomicity for offline sync (issue #3150).\n// Split from offline-sync-embedding-generation.ts to respect the 1200-line\n// new-file cap: the snapshot-side transaction machinery stays there, this\n// module owns the CHANGESET protocol — the `embeddingGenerations` manifest\n// (sender-side builder + receiver-side validation) and the routing that\n// applies manifested generations through the shared locked atomic swap.\nimport { createHash } from \"node:crypto\";\nimport { lstat, readdir } from \"node:fs/promises\";\nimport {\n EmbeddingIndexStorageError,\n} from \"./embedding-index-storage.js\";\nimport {\n EMBEDDING_SHARD_DIR_BASENAME,\n applyEmbeddingGenerationRemoval,\n applyEmbeddingGenerationTransaction,\n embeddingGenerationMembership,\n embeddingShardDirOf,\n isEmbeddingGenerationDirPath,\n type EmbeddingGenerationTransactionInput,\n type EmbeddingGenerationTransactionIo,\n type EmbeddingGenerationTransactionResult,\n} from \"./offline-sync-embedding-generation.js\";\nimport { EMBEDDING_SHARD_FILE_PATTERN } from \"./offline-sync-runtime-state.js\";\nimport type {\n OfflineSyncChange,\n OfflineSyncConflict,\n OfflineSyncFileDeleteTarget,\n OfflineSyncFileStagingReadTarget,\n OfflineSyncFileStagingWriteTarget,\n OfflineSyncFileState,\n} from \"./offline-sync.js\";\nimport { type SafeArchiveRoot, resolveSafeArchiveTarget } from \"./transfer/fs-utils.js\";\n\nconst EMBEDDING_MARKER_BASENAME = \"embeddings.json\";\n\nasync function pathExists(absPath: string): Promise<boolean> {\n try {\n await lstat(absPath);\n return true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw err;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Changeset-side generation atomicity (issue #3150)\n//\n// Inline changesets are DIFFS, not complete generations: a push that rewrites\n// two of five shards carries only those two records. To reuse the snapshot\n// path's single atomic swap without sweeping unchanged shards, the sender\n// attaches an `embeddingGenerations` manifest — the COMPLETE post-change\n// membership of every touched generation — and the receiver assembles the\n// full incoming set: changed members ride inline, unchanged members carry\n// over from local bytes hash-verified against the manifest, removed members\n// are swept by the swap. Everything below shares the generation lock and the\n// secure-staging rules with the snapshot path.\n// ---------------------------------------------------------------------------\n\nexport interface OfflineSyncChangesetGenerationMember {\n path: string;\n sha256: string;\n bytes: number;\n}\n\n/** Complete post-change membership of ONE sharded generation. */\nexport interface OfflineSyncChangesetGeneration {\n /** The generation dir, e.g. `state/embeddings`. */\n shardDir: string;\n members: OfflineSyncChangesetGenerationMember[];\n}\n\ntype OfflineSyncUpsertChange = Extract<OfflineSyncChange, { type: \"upsert\" }>;\n\nconst SHA256_PATTERN = /^[0-9a-f]{64}$/;\n\n/**\n * Validate the optional `embeddingGenerations` changeset field (receiver\n * boundary). Returns undefined when the field is absent (legacy sender);\n * throws on any incoherence — duplicate dirs or member paths, noncanonical\n * dirs, members outside their dir, or a manifested generation that does not\n * account for every upserted shard — so bad manifests fail closed BEFORE any\n * apply-time write.\n */\nexport function normalizeChangesetGenerations(\n raw: unknown,\n changes: readonly OfflineSyncChange[],\n): OfflineSyncChangesetGeneration[] | undefined {\n if (raw === undefined) return undefined;\n if (!Array.isArray(raw)) {\n throw new Error(\"offline sync changeset embeddingGenerations must be an array\");\n }\n const dirs = new Set<string>();\n const generations: OfflineSyncChangesetGeneration[] = [];\n for (const entry of raw) {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n throw new Error(\"offline sync changeset embeddingGenerations entries must be objects\");\n }\n const record = entry as Record<string, unknown>;\n const shardDir = typeof record.shardDir === \"string\" ? record.shardDir : \"\";\n if (!isEmbeddingGenerationDirPath(shardDir)) {\n throw new Error(`offline sync changeset embeddingGenerations shardDir must be a canonical embeddings generation dir: ${shardDir}`);\n }\n if (dirs.has(shardDir)) {\n throw new Error(`offline sync changeset embeddingGenerations has a duplicate shardDir: ${shardDir}`);\n }\n if (!Array.isArray(record.members) || record.members.length === 0) {\n throw new Error(`offline sync changeset embeddingGenerations ${shardDir} must list its complete member set`);\n }\n const memberPaths = new Set<string>();\n const members: OfflineSyncChangesetGenerationMember[] = [];\n for (const rawMember of record.members) {\n if (!rawMember || typeof rawMember !== \"object\" || Array.isArray(rawMember)) {\n throw new Error(`offline sync changeset embeddingGenerations ${shardDir} members must be objects`);\n }\n const member = rawMember as Record<string, unknown>;\n const memberPath = typeof member.path === \"string\" ? member.path : \"\";\n if (embeddingShardDirOf(memberPath) !== shardDir) {\n throw new Error(`offline sync changeset embeddingGenerations member ${memberPath} does not belong to generation ${shardDir}`);\n }\n if (memberPaths.has(memberPath)) {\n throw new Error(`offline sync changeset embeddingGenerations ${shardDir} has a duplicate member: ${memberPath}`);\n }\n if (typeof member.sha256 !== \"string\" || !SHA256_PATTERN.test(member.sha256)) {\n throw new Error(`offline sync changeset embeddingGenerations member ${memberPath} sha256 must be a lowercase sha256 hex digest`);\n }\n if (typeof member.bytes !== \"number\" || !Number.isInteger(member.bytes) || member.bytes < 0) {\n throw new Error(`offline sync changeset embeddingGenerations member ${memberPath} bytes must be a non-negative integer`);\n }\n memberPaths.add(memberPath);\n members.push({ path: memberPath, sha256: member.sha256, bytes: member.bytes });\n }\n dirs.add(shardDir);\n generations.push({ shardDir, members });\n }\n\n // Coherence with the change list: a manifest-bearing sender must account\n // for EVERY upserted shard, and no delete may target a surviving member.\n const memberByPath = new Map<string, OfflineSyncChangesetGenerationMember>();\n for (const generation of generations) {\n for (const member of generation.members) memberByPath.set(member.path, member);\n }\n for (const change of changes) {\n const membership = embeddingGenerationMembership(change.path);\n if (!membership) continue;\n const manifested = memberByPath.get(change.path);\n if (change.type === \"upsert\") {\n if (membership.kind !== \"shard\") continue;\n if (!manifested) {\n throw new Error(`offline sync changeset upserts of embedding shards require a manifest entry: ${change.path}`);\n }\n if (manifested.sha256 !== change.file.sha256 || manifested.bytes !== change.file.bytes) {\n throw new Error(`offline sync changeset manifest member ${change.path} does not match the upserted record`);\n }\n continue;\n }\n if (manifested) {\n throw new Error(`offline sync changeset delete of ${change.path} contradicts its manifest membership`);\n }\n }\n return generations;\n}\n\n/** Change-list conflicts for a deferred generation: visible, never silent. */\nfunction deferGenerationConflicts(\n dirChanges: readonly OfflineSyncChange[],\n currentMap: ReadonlyMap<string, OfflineSyncFileState>,\n reason: OfflineSyncConflict[\"reason\"],\n): { conflicts: OfflineSyncConflict[]; conflictedPaths: Set<string> } {\n const conflicts: OfflineSyncConflict[] = [];\n const conflictedPaths = new Set<string>();\n for (const change of dirChanges) {\n conflictedPaths.add(change.path);\n conflicts.push({\n path: change.path,\n reason,\n ...(change.type === \"upsert\" ? { incomingSha256: change.file.sha256 } : {}),\n ...(change.baseSha256 !== undefined ? { baseSha256: change.baseSha256 } : {}),\n localSha256: currentMap.get(change.path)?.sha256,\n });\n }\n return { conflicts, conflictedPaths };\n}\n\nexport interface ChangesetGenerationApplication {\n /** Paths the per-file apply loop must skip (published, swept, or removed). */\n transactionHandled: Set<string>;\n /** Conflicts for deferred generations — surfaced so the push side never\n * checkpoints a deferred generation as applied. */\n conflicts: OfflineSyncConflict[];\n conflictedPaths: Set<string>;\n appliedUpserts: number;\n appliedDeletes: number;\n /** Result-map updates for published members. */\n writtenStates: Map<string, OfflineSyncFileState>;\n /** Result-map removals for swept/removed members. */\n removedPaths: Set<string>;\n}\n\nexport interface ChangesetGenerationApplyOptions {\n root: SafeArchiveRoot;\n /** NORMALIZED changeset (manifest validated by normalizeChangesetGenerations). */\n changeset: { changes: readonly OfflineSyncChange[]; embeddingGenerations?: readonly OfflineSyncChangesetGeneration[] };\n incomingBuffers: ReadonlyMap<string, Buffer>;\n currentMap: ReadonlyMap<string, OfflineSyncFileState>;\n io: EmbeddingGenerationTransactionIo;\n /** True when the caller supplied ANY custom storage IO — the staging-pair\n * fail-closed rule then applies (mirrors the snapshot apply). */\n customIoPresent: boolean;\n now: number;\n}\n\n/** Change-list maps scoped per generation dir. */\ntype OfflineSyncChangesByDir = Map<string, OfflineSyncChange[]>;\n\n/**\n * Route a changeset's embedding-generation changes through the shared locked\n * transaction: manifested dirs publish atomically (changed members inline,\n * unchanged members carried over, removed members swept), manifested\n * shrink-deletes ride the same swap, full-evidence tombstones remove the\n * whole generation through the removal transaction, and everything that\n * cannot be proven (legacy manifest-less shard upserts, under-lock\n * divergence, remote-only members) is DEFERRED as conflicts with the disk\n * untouched — a mixed generation is never published and the push side never\n * checkpoints a deferred generation as applied.\n */\nexport async function applyChangesetEmbeddingGenerations(\n options: ChangesetGenerationApplyOptions,\n): Promise<ChangesetGenerationApplication> {\n const result: ChangesetGenerationApplication = {\n transactionHandled: new Set(),\n conflicts: [],\n conflictedPaths: new Set(),\n appliedUpserts: 0,\n appliedDeletes: 0,\n writtenStates: new Map(),\n removedPaths: new Set(),\n };\n const manifest = new Map(\n (options.changeset.embeddingGenerations ?? []).map((generation) => [generation.shardDir, generation]),\n );\n const shardUpsertChanges: Map<string, OfflineSyncUpsertChange[]> = new Map();\n const markerUpsertChanges: Map<string, OfflineSyncUpsertChange[]> = new Map();\n const deleteChangesByDir = new Map<string, OfflineSyncChange[]>();\n const dirChanges = new Map<string, OfflineSyncChange[]>();\n for (const change of options.changeset.changes) {\n const membership = embeddingGenerationMembership(change.path);\n if (!membership) continue;\n const dir = membership.shardDir;\n if (!dirChanges.has(dir)) dirChanges.set(dir, []);\n dirChanges.get(dir)!.push(change);\n if (change.type === \"upsert\") {\n if (membership.kind === \"shard\") {\n if (!shardUpsertChanges.has(dir)) shardUpsertChanges.set(dir, []);\n shardUpsertChanges.get(dir)!.push(change);\n } else {\n if (!markerUpsertChanges.has(dir)) markerUpsertChanges.set(dir, []);\n markerUpsertChanges.get(dir)!.push(change);\n }\n } else {\n if (!deleteChangesByDir.has(dir)) deleteChangesByDir.set(dir, []);\n deleteChangesByDir.get(dir)!.push(change);\n }\n }\n\n // Fail closed BEFORE any publication: custom storage IO without the\n // staging pair would stage the incoming generation in plaintext (same rule\n // and message as the snapshot apply).\n if (\n (shardUpsertChanges.size > 0 || markerUpsertChanges.size > 0) &&\n options.customIoPresent &&\n !(options.io.writeStagingFile && options.io.readStagingFile)\n ) {\n throw new EmbeddingIndexStorageError(\n \"refusing to replace embedding generation: custom storage IO requires both writeStagingFile and readStagingFile hooks; unencrypted raw staging would plaintext-downgrade the index\",\n );\n }\n\n const runTransaction = async (\n shardDirRel: string,\n input: Omit<EmbeddingGenerationTransactionInput, \"root\" | \"io\" | \"now\">,\n ): Promise<EmbeddingGenerationTransactionResult> => {\n const transaction = await applyEmbeddingGenerationTransaction({\n ...input,\n root: options.root,\n io: options.io,\n now: options.now,\n });\n if (transaction.deferredLocalDivergence) {\n const deferred = deferGenerationConflicts(\n dirChanges.get(shardDirRel) ?? [],\n options.currentMap,\n \"embedding_generation_diverged\",\n );\n result.conflicts.push(...deferred.conflicts);\n for (const conflicted of deferred.conflictedPaths) result.conflictedPaths.add(conflicted);\n return transaction;\n }\n result.appliedUpserts += transaction.upserted;\n result.appliedDeletes += transaction.deleted;\n for (const [relPath, state] of transaction.writtenStates) {\n result.writtenStates.set(relPath, state);\n result.transactionHandled.add(relPath);\n }\n for (const relPath of transaction.removedPaths) {\n result.removedPaths.add(relPath);\n result.transactionHandled.add(relPath);\n }\n return transaction;\n };\n\n /** Incoming set + reconstructed shared base for ONE manifested generation. */\n const manifestedInput = (\n shardDirRel: string,\n generation: OfflineSyncChangesetGeneration,\n ): Omit<EmbeddingGenerationTransactionInput, \"root\" | \"io\" | \"now\"> => {\n const upsertByPath = new Map(\n (shardUpsertChanges.get(shardDirRel) ?? []).map((change: OfflineSyncUpsertChange) => [change.path, change]),\n );\n const memberByPath = new Map(generation.members.map((member) => [member.path, member]));\n const incomingShardPaths = generation.members.map((member) => member.path).sort();\n const tombstones = (deleteChangesByDir.get(shardDirRel) ?? [])\n .filter((change): change is Extract<OfflineSyncChange, { type: \"delete\" }> => change.type === \"delete\");\n const baseStates = new Map<string, { sha256: string }>();\n for (const member of generation.members) {\n const change = upsertByPath.get(member.path);\n if (change) {\n if (change.baseSha256 !== undefined) baseStates.set(member.path, { sha256: change.baseSha256 });\n continue;\n }\n // Unchanged member: the manifest digest IS its shared-base evidence.\n baseStates.set(member.path, { sha256: member.sha256 });\n }\n for (const change of tombstones) {\n baseStates.set(change.path, { sha256: change.baseSha256 });\n }\n return {\n shardDirRel,\n incomingShardPaths,\n incomingMarker: null,\n incomingMarkerPresent: markerUpsertChanges.has(shardDirRel),\n incomingShardStates: new Map(\n incomingShardPaths.map((relPath) => [relPath, {\n path: relPath,\n sha256: upsertByPath.get(relPath)?.file.sha256 ?? memberByPath.get(relPath)!.sha256,\n bytes: memberByPath.get(relPath)!.bytes,\n mtimeMs: options.now,\n } satisfies OfflineSyncFileState]),\n ),\n incomingBuffers: options.incomingBuffers,\n baseStates,\n // Manifested deletes are pre-authorized removals: the retry after a\n // response loss must re-apply idempotently instead of diverging\n // (#3150 review), and the swept members need their deletion revisions\n // recorded after the swap (the per-file loop never sees them). The\n // map is present whenever tombstones exist — even when none carries\n // mtimeMs — so the recording pass runs and defaults to `now`.\n justifiedRemovals: new Set(tombstones.map((change) => change.path)),\n deletionMtimeByPath: tombstones.length === 0\n ? undefined\n : new Map(\n tombstones\n .filter((change) => change.mtimeMs !== undefined)\n .map((change) => [change.path, change.mtimeMs as number]),\n ),\n // All-manifested members base-less = the sender claims a fresh\n // creation; an existing local generation must match exactly or defer.\n freshCreateClaim: baseStates.size === 0,\n };\n };\n\n const stateDirSuffix = `/${EMBEDDING_SHARD_DIR_BASENAME}`;\n const allDirs = new Set<string>([\n ...shardUpsertChanges.keys(),\n ...markerUpsertChanges.keys(),\n ...deleteChangesByDir.keys(),\n ]);\n for (const shardDirRel of [...allDirs].sort()) {\n const generation = manifest.get(shardDirRel);\n if (shardUpsertChanges.has(shardDirRel) || (generation && deleteChangesByDir.has(shardDirRel))) {\n if (!generation) {\n // Legacy sender: shard upserts without a manifest cannot prove\n // complete membership — defer instead of risking a mixed generation.\n const deferred = deferGenerationConflicts(\n dirChanges.get(shardDirRel) ?? [],\n options.currentMap,\n \"embedding_generation_manifest_required\",\n );\n result.conflicts.push(...deferred.conflicts);\n for (const conflicted of deferred.conflictedPaths) result.conflictedPaths.add(conflicted);\n continue;\n }\n await runTransaction(shardDirRel, manifestedInput(shardDirRel, generation));\n continue;\n }\n if (markerUpsertChanges.has(shardDirRel)) {\n // Cross-layout: an incoming legacy marker replaces the generation as a\n // whole. No manifest exists (post-change membership is the marker), so\n // base evidence comes from the marker change alone; a receiver-local\n // sharded generation the marker base cannot account for defers via the\n // transaction's under-lock census check rather than being swept.\n const markerChange = (markerUpsertChanges.get(shardDirRel) ?? [])[0] as OfflineSyncUpsertChange | undefined;\n if (!markerChange) continue;\n const stateDirRel = shardDirRel.slice(0, -stateDirSuffix.length);\n const markerRel = `${stateDirRel}/${EMBEDDING_MARKER_BASENAME}`;\n const transaction = await runTransaction(shardDirRel, {\n shardDirRel,\n incomingShardPaths: [],\n incomingMarker: {\n path: markerRel,\n sha256: markerChange.file.sha256,\n buffer: options.incomingBuffers.get(markerRel) ?? null,\n },\n incomingMarkerPresent: false,\n incomingShardStates: new Map(),\n incomingBuffers: options.incomingBuffers,\n baseStates: markerChange.baseSha256 === undefined\n ? undefined\n : new Map([[markerRel, { sha256: markerChange.baseSha256 }]]),\n });\n // The conversion consumes the marker change whole: on a published\n // transaction the per-file loop must not re-write the legacy marker\n // outside the atomic swap (#3150 review). On deferral the marker\n // change is already in conflictedPaths, so it stays uncheckpointed.\n if (!transaction.deferredLocalDivergence) result.transactionHandled.add(markerRel);\n continue;\n }\n // Delete-only without a manifest: whole-generation removal ONLY when the\n // changeset tombstones EVERY local member (complete evidence, mirrors the\n // snapshot rule). Incomplete manifest-less deletion evidence defers the\n // whole directory as `embedding_generation_manifest_required` conflicts;\n // the complete published generation survives and is never broken apart by\n // independent shard deletes. Only non-generation files keep per-file deletes.\n const deletes = deleteChangesByDir.get(shardDirRel) ?? [];\n const deletePaths = new Set(deletes.map((change) => change.path));\n const stateDirRel = shardDirRel.slice(0, -stateDirSuffix.length);\n const markerRel = `${stateDirRel}/${EMBEDDING_MARKER_BASENAME}`;\n const localMembers: string[] = [];\n if (await pathExists(await resolveSafeArchiveTarget(options.root, markerRel))) localMembers.push(markerRel);\n let localShardNames: string[] = [];\n try {\n localShardNames = (await readdir(await resolveSafeArchiveTarget(options.root, shardDirRel)))\n .filter((name) => EMBEDDING_SHARD_FILE_PATTERN.test(name));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n for (const name of localShardNames) localMembers.push(`${shardDirRel}/${name}`);\n if (localMembers.length === 0) continue;\n if (!localMembers.every((relPath) => deletePaths.has(relPath))) {\n // Incomplete deletion evidence: applying the evidenced subset would\n // break the local generation apart. Defer the WHOLE dir as conflicts —\n // the complete published generation survives and the push side cannot\n // checkpoint the deletes as applied.\n const deferred = deferGenerationConflicts(deletes, options.currentMap, \"embedding_generation_manifest_required\");\n result.conflicts.push(...deferred.conflicts);\n for (const conflicted of deferred.conflictedPaths) result.conflictedPaths.add(conflicted);\n continue;\n }\n const tombstones = deletes.filter((change): change is Extract<OfflineSyncChange, { type: \"delete\" }> => change.type === \"delete\");\n const removal = await applyEmbeddingGenerationRemoval({\n root: options.root,\n shardDirRel,\n io: { deleteFile: options.io.deleteFile, readFile: options.io.readFile },\n deletionMtimeByPath: new Map(\n tombstones\n .filter((change) => change.mtimeMs !== undefined)\n .map((change) => [change.path, change.mtimeMs as number]),\n ),\n baseStates: new Map(tombstones.map((change) => [change.path, { sha256: change.baseSha256 }])),\n now: options.now,\n });\n if (removal.deferredLocalDivergence) {\n const deferred = deferGenerationConflicts(deletes, options.currentMap, \"embedding_generation_diverged\");\n result.conflicts.push(...deferred.conflicts);\n for (const conflicted of deferred.conflictedPaths) result.conflictedPaths.add(conflicted);\n continue;\n }\n result.appliedDeletes += removal.deleted;\n for (const relPath of removal.removedPaths) {\n result.removedPaths.add(relPath);\n result.transactionHandled.add(relPath);\n }\n }\n return result;\n}\n\nexport interface ChangesetGenerationManifestOptions {\n changes: readonly OfflineSyncChange[];\n /** The sender's complete current state (post-change generation members). */\n currentFiles: readonly OfflineSyncFileState[];\n baseFiles: readonly OfflineSyncFileState[];\n /** The exact exclusion predicate the change walk used — any member it\n * drops forces whole-generation omission (filter-to-omit, #3148). */\n isExcluded: (relPath: string) => boolean;\n}\n\n/**\n * Sender side: complete post-change membership for every generation touched\n * by the changeset. A touched generation with ANY excluded member is omitted\n * WHOLE — its changes are dropped by the caller contract below and no\n * manifest is emitted — so a filtered generation can never look like a\n * partial replacement on the receiver.\n */\nexport function buildChangesetGenerationManifest(\n options: ChangesetGenerationManifestOptions,\n): OfflineSyncChangesetGeneration[] {\n const currentByPath = new Map(options.currentFiles.map((state) => [state.path, state]));\n const baseByPath = new Map(options.baseFiles.map((state) => [state.path, state]));\n const touchedDirs = new Map<string, OfflineSyncChange[]>();\n for (const change of options.changes) {\n const membership = embeddingGenerationMembership(change.path);\n if (membership) {\n if (!touchedDirs.has(membership.shardDir)) touchedDirs.set(membership.shardDir, []);\n touchedDirs.get(membership.shardDir)!.push(change);\n }\n }\n const generations: OfflineSyncChangesetGeneration[] = [];\n for (const [shardDirRel, changes] of [...touchedDirs].sort(([left], [right]) => left.localeCompare(right))) {\n const memberPaths = new Set<string>();\n for (const relPath of currentByPath.keys()) {\n const membership = embeddingGenerationMembership(relPath);\n if (membership?.shardDir === shardDirRel) memberPaths.add(relPath);\n }\n for (const relPath of baseByPath.keys()) {\n const membership = embeddingGenerationMembership(relPath);\n if (membership?.shardDir === shardDirRel) memberPaths.add(relPath);\n }\n for (const change of changes) memberPaths.add(change.path);\n // Filter-to-omit: one excluded member omits the whole generation.\n let omitted = false;\n for (const relPath of memberPaths) {\n if (options.isExcluded(relPath)) {\n omitted = true;\n break;\n }\n }\n if (omitted) continue;\n const members = [...memberPaths]\n .filter((relPath) => currentByPath.has(relPath))\n .sort()\n .map((relPath) => {\n const state = currentByPath.get(relPath)!;\n return { path: state.path, sha256: state.sha256, bytes: state.bytes };\n });\n if (members.length === 0) continue;\n generations.push({ shardDir: shardDirRel, members });\n }\n return generations;\n}\n"],"mappings":"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","names":["stateDirRel","markerRel"]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-KJTKLXTH.js";
4
4
  import {
5
5
  StorageManager
6
- } from "./chunk-STEOT4DI.js";
6
+ } from "./chunk-4HUCP4R4.js";
7
7
  import {
8
8
  assertInjectedStorageRooted
9
9
  } from "./chunk-22DYJLFN.js";
@@ -260,4 +260,4 @@ export {
260
260
  backupExistingLedger,
261
261
  rebuildMemoryLifecycleLedger
262
262
  };
263
- //# sourceMappingURL=chunk-H5BJWPUI.js.map
263
+ //# sourceMappingURL=chunk-NJVR724O.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-TBBDFYXW.js";
4
4
  import {
5
5
  StorageManager
6
- } from "./chunk-STEOT4DI.js";
6
+ } from "./chunk-4HUCP4R4.js";
7
7
  import {
8
8
  bumpMemoryCorpusVersionForDir
9
9
  } from "./chunk-XCB6QDL6.js";
@@ -765,4 +765,4 @@ export {
765
765
  listMemoryGovernanceRuns,
766
766
  readMemoryGovernanceRunArtifact
767
767
  };
768
- //# sourceMappingURL=chunk-AWG3TIAY.js.map
768
+ //# sourceMappingURL=chunk-NMZVDRVP.js.map