@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.
- package/dist/access-admin-ops-surface.js +28 -27
- package/dist/access-authorization-probe.js +29 -28
- package/dist/access-boundary.js +28 -27
- package/dist/access-cli.js +77 -76
- package/dist/access-cli.js.map +1 -1
- package/dist/access-extraction-force-flush.js +28 -27
- package/dist/access-http-briefing.js +29 -28
- package/dist/access-http-query.js +30 -29
- package/dist/access-http.js +47 -46
- package/dist/access-identity-continuity-surface.js +28 -27
- package/dist/access-lcm-surface.js +28 -27
- package/dist/access-mcp.js +37 -36
- package/dist/access-namespace-preflight.js +28 -27
- package/dist/access-observe-write-category.js +8 -7
- package/dist/access-observe-write-surface.js +28 -27
- package/dist/access-offline-manifest.js +5 -4
- package/dist/access-operations-batch.js +29 -28
- package/dist/access-operations.js +36 -35
- package/dist/access-recall-concurrency.js +28 -27
- package/dist/access-recall-response.js +28 -27
- package/dist/access-recall-surface.js +28 -27
- package/dist/access-schema.js +7 -6
- package/dist/access-service.js +28 -27
- package/dist/access-surface-catalog.js +30 -29
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/active-recall.js +9 -8
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/briefing.js +6 -6
- package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-GWVG7LGC.js} +2 -2
- package/dist/causal-consolidation.js +7 -7
- package/dist/{chunk-S2GE2K36.js → chunk-22LMCQ5B.js} +41 -41
- package/dist/{chunk-2DLWLNO4.js → chunk-2FX374UI.js} +3 -3
- package/dist/{chunk-P2ODTYOF.js → chunk-3AGHSQPM.js} +2 -2
- package/dist/{chunk-LW3HKRL7.js → chunk-3QKO4QN7.js} +3 -3
- package/dist/{chunk-BOZJD5PK.js → chunk-3YD44CH2.js} +2 -2
- package/dist/{chunk-STEOT4DI.js → chunk-4HUCP4R4.js} +2 -2
- package/dist/{chunk-Z6EZCN6Z.js → chunk-5FNZ3G6X.js} +5 -5
- package/dist/{chunk-CZJA2EQE.js → chunk-5STPRPE7.js} +2 -2
- package/dist/{chunk-FKD656D2.js → chunk-64ZUALXK.js} +2 -2
- package/dist/{chunk-M6C7SOR6.js → chunk-6MNKDTDI.js} +2 -2
- package/dist/{chunk-BGI4NUAO.js → chunk-7D7OUO5W.js} +2 -2
- package/dist/{chunk-AEU4EQGV.js → chunk-7QE46QXI.js} +1 -1
- package/dist/{chunk-C7ZDKWPS.js → chunk-7WBSMXGC.js} +3 -3
- package/dist/{chunk-X5SHE2O3.js → chunk-A6RVIHHK.js} +2 -2
- package/dist/{chunk-D5BSQR63.js → chunk-AEJ3TE5H.js} +2 -2
- package/dist/{chunk-K6T33R4Q.js → chunk-AXGJMDBS.js} +156 -7
- package/dist/chunk-AXGJMDBS.js.map +1 -0
- package/dist/{chunk-GZDTVYK2.js → chunk-AZIOEOK4.js} +2 -2
- package/dist/{chunk-VDX2J7OX.js → chunk-BUKK5SWA.js} +2 -2
- package/dist/{chunk-5X4MXNEU.js → chunk-C6HPNPNK.js} +3 -3
- package/dist/{chunk-QB57WIS6.js → chunk-CALBQ2NG.js} +35 -27
- package/dist/chunk-CALBQ2NG.js.map +1 -0
- package/dist/{chunk-5MNUBT7T.js → chunk-DO4C4AXD.js} +2 -2
- package/dist/{chunk-MXCAJKMA.js → chunk-EAQQ2FD3.js} +2 -2
- package/dist/{chunk-4KN2JLQV.js → chunk-FC52YWAO.js} +2 -2
- package/dist/{chunk-CRXRZA3G.js → chunk-FEIXG5FA.js} +2 -2
- package/dist/{chunk-VVX5PZFS.js → chunk-H36X4NRH.js} +2 -2
- package/dist/{chunk-ZZZ4I455.js → chunk-IIARQTZ2.js} +2 -2
- package/dist/{chunk-VALKBYBN.js → chunk-IKDRGVVJ.js} +2 -2
- package/dist/{chunk-OCFXVDBZ.js → chunk-IVEHY2VT.js} +54 -123
- package/dist/chunk-IVEHY2VT.js.map +1 -0
- package/dist/{chunk-2NAD4YCI.js → chunk-IYIBGSHJ.js} +2 -2
- package/dist/{chunk-HLB7GKGG.js → chunk-J27JML5O.js} +2 -2
- package/dist/{chunk-NYKIUQL6.js → chunk-JB56XYHP.js} +2 -2
- package/dist/{chunk-OK52IY3W.js → chunk-JBH26P62.js} +5 -5
- package/dist/{chunk-IOSZHHJC.js → chunk-JUT3OR2L.js} +4 -4
- package/dist/{chunk-LU7E2MXE.js → chunk-JYM4Y6SO.js} +14 -14
- package/dist/{chunk-Z5LP6ILP.js → chunk-JZ4TJHR2.js} +2 -2
- package/dist/{chunk-BLVR4WYU.js → chunk-KTKHO3UI.js} +2 -2
- package/dist/{chunk-W3XXFPRI.js → chunk-MGZMC6WN.js} +32 -32
- package/dist/chunk-MSAI3Q7D.js +372 -0
- package/dist/chunk-MSAI3Q7D.js.map +1 -0
- package/dist/{chunk-H5BJWPUI.js → chunk-NJVR724O.js} +2 -2
- package/dist/{chunk-AWG3TIAY.js → chunk-NMZVDRVP.js} +2 -2
- package/dist/{chunk-JVPWRNHA.js → chunk-NOL7SEWN.js} +2 -2
- package/dist/{chunk-BXLOS5AJ.js → chunk-OWHERGF2.js} +2 -2
- package/dist/{chunk-YJ7MW627.js → chunk-PMNLL2TL.js} +2 -2
- package/dist/{chunk-WKY7N3L7.js → chunk-PULDSMCJ.js} +7 -7
- package/dist/{chunk-AE5U5NMS.js → chunk-QOXNTKXB.js} +2 -2
- package/dist/{chunk-AEHVZY3X.js → chunk-QZLCVO2V.js} +2 -2
- package/dist/{chunk-LV5H6FTN.js → chunk-RJLV4BKR.js} +2 -2
- package/dist/{chunk-C6U57KG4.js → chunk-RMDGAAZF.js} +2 -2
- package/dist/{chunk-4OQET73E.js → chunk-SLEAJ67D.js} +4 -4
- package/dist/{chunk-FJLQXMTU.js → chunk-ST2RQUXC.js} +2 -2
- package/dist/{chunk-6UQFJULG.js → chunk-SZG4WFAG.js} +2 -2
- package/dist/{chunk-SWBC3UER.js → chunk-TPEZ2SHV.js} +2 -2
- package/dist/{chunk-PEBHPCX2.js → chunk-UQDC3W77.js} +2 -2
- package/dist/{chunk-DQEMWVMT.js → chunk-UVYI6VIX.js} +1 -1
- package/dist/{chunk-QAW55ZHJ.js → chunk-VA4O3U7U.js} +3 -3
- package/dist/{chunk-A4VSOUCB.js → chunk-VDO32NLK.js} +3 -3
- package/dist/{chunk-3SGTV7RD.js → chunk-VHDKPGMG.js} +6 -6
- package/dist/{chunk-5E6RYRYW.js → chunk-WNRTXEWW.js} +4 -4
- package/dist/{chunk-Q4AUIFUA.js → chunk-XAITGGX5.js} +4 -4
- package/dist/{chunk-GWM6T5EQ.js → chunk-YPI4RQWV.js} +2 -2
- package/dist/{chunk-4MP7XR5J.js → chunk-YSWJXOOL.js} +2 -2
- package/dist/{chunk-QI7K7BZ5.js → chunk-ZG5DWWKK.js} +2 -2
- package/dist/cli.js +60 -59
- package/dist/coding/export-okf-codegraph.js +5 -5
- package/dist/compounding/engine.js +6 -6
- package/dist/config.js +9 -8
- package/dist/connectors/codex-materialize-runner.js +6 -6
- package/dist/connectors/index.js +6 -6
- package/dist/convergence-refresh.js +8 -8
- package/dist/corpus-watermark.js +8 -8
- package/dist/deep-recall-http-glue.js +8 -7
- package/dist/entity-retrieval.js +6 -6
- package/dist/external-wiki-access.js +29 -28
- package/dist/extraction.js +6 -6
- package/dist/{first-start-migration-7OATHJKB.js → first-start-migration-GAT7G733.js} +4 -4
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/index.js +115 -114
- package/dist/lcm/engine.js +2 -2
- package/dist/lcm/index.js +5 -5
- package/dist/location/index.js +8 -8
- package/dist/maintenance/memory-governance.js +6 -6
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +6 -6
- package/dist/maintenance/rebuild-memory-projection.js +7 -7
- package/dist/memory-browse-operations.js +29 -28
- package/dist/namespaces/migrate.js +7 -7
- package/dist/namespaces/search.js +4 -4
- package/dist/namespaces/storage.js +6 -6
- package/dist/offline-sync-changeset-generations.d.ts +82 -0
- package/dist/offline-sync-changeset-generations.d.ts.map +1 -0
- package/dist/offline-sync-changeset-generations.js +21 -0
- package/dist/offline-sync-changeset-generations.js.map +1 -0
- package/dist/offline-sync-embedding-generation.d.ts +50 -0
- package/dist/offline-sync-embedding-generation.d.ts.map +1 -1
- package/dist/offline-sync-embedding-generation.js +4 -2
- package/dist/offline-sync-snapshot-stream.js +5 -4
- package/dist/offline-sync.d.ts +12 -1
- package/dist/offline-sync.d.ts.map +1 -1
- package/dist/offline-sync.js +6 -5
- package/dist/operator-doctor-corpus.js +9 -9
- package/dist/operator-toolkit.js +18 -17
- package/dist/orchestration/maintenance.js +14 -14
- package/dist/orchestrator.js +78 -77
- package/dist/recall-navigation-operations.js +29 -28
- package/dist/recall-navigation.js +28 -27
- package/dist/resume-bundles.js +9 -8
- package/dist/search/factory.js +3 -3
- package/dist/search/index.js +7 -7
- package/dist/semantic-consolidation.js +7 -7
- package/dist/semantic-rule-promotion.js +6 -6
- package/dist/semantic-rule-verifier.js +6 -6
- package/dist/source-agent-qualifier.js +6 -6
- package/dist/standup/build.js +6 -6
- package/dist/storage.js +5 -5
- package/dist/support-passport/index.js +31 -30
- package/dist/support-passport/offline-sync-guard.d.ts +6 -2
- package/dist/support-passport/offline-sync-guard.d.ts.map +1 -1
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +2 -2
- package/dist/transfer/export-okf.js +6 -6
- package/dist/verified-recall.js +6 -6
- package/dist/who-knows-cli.js +7 -7
- package/dist/who-knows.js +6 -6
- package/package.json +2 -2
- package/src/offline-sync-changeset-generations.test.ts +962 -0
- package/src/offline-sync-changeset-generations.ts +549 -0
- package/src/offline-sync-embedding-generation.ts +272 -4
- package/src/offline-sync.ts +75 -162
- package/src/support-passport/offline-sync-guard.ts +16 -2
- package/dist/chunk-K6T33R4Q.js.map +0 -1
- package/dist/chunk-OCFXVDBZ.js.map +0 -1
- package/dist/chunk-QB57WIS6.js.map +0 -1
- /package/dist/{capsule-crypto-YO5QJ6L3.js.map → capsule-crypto-GWVG7LGC.js.map} +0 -0
- /package/dist/{chunk-S2GE2K36.js.map → chunk-22LMCQ5B.js.map} +0 -0
- /package/dist/{chunk-2DLWLNO4.js.map → chunk-2FX374UI.js.map} +0 -0
- /package/dist/{chunk-P2ODTYOF.js.map → chunk-3AGHSQPM.js.map} +0 -0
- /package/dist/{chunk-LW3HKRL7.js.map → chunk-3QKO4QN7.js.map} +0 -0
- /package/dist/{chunk-BOZJD5PK.js.map → chunk-3YD44CH2.js.map} +0 -0
- /package/dist/{chunk-STEOT4DI.js.map → chunk-4HUCP4R4.js.map} +0 -0
- /package/dist/{chunk-Z6EZCN6Z.js.map → chunk-5FNZ3G6X.js.map} +0 -0
- /package/dist/{chunk-CZJA2EQE.js.map → chunk-5STPRPE7.js.map} +0 -0
- /package/dist/{chunk-FKD656D2.js.map → chunk-64ZUALXK.js.map} +0 -0
- /package/dist/{chunk-M6C7SOR6.js.map → chunk-6MNKDTDI.js.map} +0 -0
- /package/dist/{chunk-BGI4NUAO.js.map → chunk-7D7OUO5W.js.map} +0 -0
- /package/dist/{chunk-AEU4EQGV.js.map → chunk-7QE46QXI.js.map} +0 -0
- /package/dist/{chunk-C7ZDKWPS.js.map → chunk-7WBSMXGC.js.map} +0 -0
- /package/dist/{chunk-X5SHE2O3.js.map → chunk-A6RVIHHK.js.map} +0 -0
- /package/dist/{chunk-D5BSQR63.js.map → chunk-AEJ3TE5H.js.map} +0 -0
- /package/dist/{chunk-GZDTVYK2.js.map → chunk-AZIOEOK4.js.map} +0 -0
- /package/dist/{chunk-VDX2J7OX.js.map → chunk-BUKK5SWA.js.map} +0 -0
- /package/dist/{chunk-5X4MXNEU.js.map → chunk-C6HPNPNK.js.map} +0 -0
- /package/dist/{chunk-5MNUBT7T.js.map → chunk-DO4C4AXD.js.map} +0 -0
- /package/dist/{chunk-MXCAJKMA.js.map → chunk-EAQQ2FD3.js.map} +0 -0
- /package/dist/{chunk-4KN2JLQV.js.map → chunk-FC52YWAO.js.map} +0 -0
- /package/dist/{chunk-CRXRZA3G.js.map → chunk-FEIXG5FA.js.map} +0 -0
- /package/dist/{chunk-VVX5PZFS.js.map → chunk-H36X4NRH.js.map} +0 -0
- /package/dist/{chunk-ZZZ4I455.js.map → chunk-IIARQTZ2.js.map} +0 -0
- /package/dist/{chunk-VALKBYBN.js.map → chunk-IKDRGVVJ.js.map} +0 -0
- /package/dist/{chunk-2NAD4YCI.js.map → chunk-IYIBGSHJ.js.map} +0 -0
- /package/dist/{chunk-HLB7GKGG.js.map → chunk-J27JML5O.js.map} +0 -0
- /package/dist/{chunk-NYKIUQL6.js.map → chunk-JB56XYHP.js.map} +0 -0
- /package/dist/{chunk-OK52IY3W.js.map → chunk-JBH26P62.js.map} +0 -0
- /package/dist/{chunk-IOSZHHJC.js.map → chunk-JUT3OR2L.js.map} +0 -0
- /package/dist/{chunk-LU7E2MXE.js.map → chunk-JYM4Y6SO.js.map} +0 -0
- /package/dist/{chunk-Z5LP6ILP.js.map → chunk-JZ4TJHR2.js.map} +0 -0
- /package/dist/{chunk-BLVR4WYU.js.map → chunk-KTKHO3UI.js.map} +0 -0
- /package/dist/{chunk-W3XXFPRI.js.map → chunk-MGZMC6WN.js.map} +0 -0
- /package/dist/{chunk-H5BJWPUI.js.map → chunk-NJVR724O.js.map} +0 -0
- /package/dist/{chunk-AWG3TIAY.js.map → chunk-NMZVDRVP.js.map} +0 -0
- /package/dist/{chunk-JVPWRNHA.js.map → chunk-NOL7SEWN.js.map} +0 -0
- /package/dist/{chunk-BXLOS5AJ.js.map → chunk-OWHERGF2.js.map} +0 -0
- /package/dist/{chunk-YJ7MW627.js.map → chunk-PMNLL2TL.js.map} +0 -0
- /package/dist/{chunk-WKY7N3L7.js.map → chunk-PULDSMCJ.js.map} +0 -0
- /package/dist/{chunk-AE5U5NMS.js.map → chunk-QOXNTKXB.js.map} +0 -0
- /package/dist/{chunk-AEHVZY3X.js.map → chunk-QZLCVO2V.js.map} +0 -0
- /package/dist/{chunk-LV5H6FTN.js.map → chunk-RJLV4BKR.js.map} +0 -0
- /package/dist/{chunk-C6U57KG4.js.map → chunk-RMDGAAZF.js.map} +0 -0
- /package/dist/{chunk-4OQET73E.js.map → chunk-SLEAJ67D.js.map} +0 -0
- /package/dist/{chunk-FJLQXMTU.js.map → chunk-ST2RQUXC.js.map} +0 -0
- /package/dist/{chunk-6UQFJULG.js.map → chunk-SZG4WFAG.js.map} +0 -0
- /package/dist/{chunk-SWBC3UER.js.map → chunk-TPEZ2SHV.js.map} +0 -0
- /package/dist/{chunk-PEBHPCX2.js.map → chunk-UQDC3W77.js.map} +0 -0
- /package/dist/{chunk-DQEMWVMT.js.map → chunk-UVYI6VIX.js.map} +0 -0
- /package/dist/{chunk-QAW55ZHJ.js.map → chunk-VA4O3U7U.js.map} +0 -0
- /package/dist/{chunk-A4VSOUCB.js.map → chunk-VDO32NLK.js.map} +0 -0
- /package/dist/{chunk-3SGTV7RD.js.map → chunk-VHDKPGMG.js.map} +0 -0
- /package/dist/{chunk-5E6RYRYW.js.map → chunk-WNRTXEWW.js.map} +0 -0
- /package/dist/{chunk-Q4AUIFUA.js.map → chunk-XAITGGX5.js.map} +0 -0
- /package/dist/{chunk-GWM6T5EQ.js.map → chunk-YPI4RQWV.js.map} +0 -0
- /package/dist/{chunk-4MP7XR5J.js.map → chunk-YSWJXOOL.js.map} +0 -0
- /package/dist/{chunk-QI7K7BZ5.js.map → chunk-ZG5DWWKK.js.map} +0 -0
- /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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
96
|
+
} from "./chunk-ST2RQUXC.js";
|
|
97
97
|
import {
|
|
98
98
|
searchVerifiedSemanticRules
|
|
99
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
223
|
+
} from "./chunk-JUT3OR2L.js";
|
|
224
224
|
import {
|
|
225
225
|
EngramAccessService
|
|
226
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
264
|
+
} from "./chunk-NMZVDRVP.js";
|
|
265
265
|
import {
|
|
266
266
|
listNamespaces,
|
|
267
267
|
runNamespaceMigration,
|
|
268
268
|
verifyNamespaces
|
|
269
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
768
|
+
//# sourceMappingURL=chunk-NMZVDRVP.js.map
|