@remnic/core 9.69.88 → 9.69.90
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 +74 -72
- package/dist/access-authorization-probe.js +75 -73
- package/dist/access-boundary.js +74 -72
- package/dist/access-cli.js +168 -165
- package/dist/access-cli.js.map +1 -1
- package/dist/access-extraction-force-flush.js +74 -72
- package/dist/access-http-briefing.js +75 -73
- package/dist/access-http-query.js +76 -74
- package/dist/access-http.js +98 -96
- package/dist/access-identity-continuity-surface.js +74 -72
- package/dist/access-lcm-surface.js +74 -72
- package/dist/access-mcp-output-schemas.d.ts.map +1 -1
- package/dist/access-mcp-output-schemas.js +1 -1
- package/dist/access-mcp.js +86 -84
- package/dist/access-memory-search-fanout.js +3 -3
- package/dist/access-namespace-preflight.js +74 -72
- package/dist/access-observe-write-category.js +11 -10
- package/dist/access-observe-write-surface.js +74 -72
- package/dist/access-offline-manifest.js +10 -9
- package/dist/access-operations-batch.js +76 -74
- package/dist/access-operations.js +83 -81
- package/dist/access-recall-concurrency.js +74 -72
- package/dist/access-recall-corpus-versions.d.ts +12 -0
- package/dist/access-recall-corpus-versions.d.ts.map +1 -0
- package/dist/access-recall-corpus-versions.js +10 -0
- package/dist/access-recall-diagnostics.js +5 -5
- package/dist/access-recall-response.d.ts +4 -0
- package/dist/access-recall-response.d.ts.map +1 -1
- package/dist/access-recall-response.js +74 -72
- package/dist/access-recall-surface.d.ts +8 -0
- package/dist/access-recall-surface.d.ts.map +1 -1
- package/dist/access-recall-surface.js +74 -72
- package/dist/access-schema.js +10 -9
- package/dist/access-service.d.ts +5 -0
- package/dist/access-service.d.ts.map +1 -1
- package/dist/access-service.js +74 -72
- package/dist/access-surface-catalog.js +76 -74
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/active-memory-bridge.js +3 -3
- package/dist/active-recall.js +27 -24
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/registry.js +3 -3
- package/dist/{auto-sync-U5N3CB5Y.js → auto-sync-PAWBFQWL.js} +5 -5
- package/dist/briefing.js +19 -19
- package/dist/buffer.js +8 -8
- package/dist/calibration.js +2 -2
- package/dist/capabilities.d.ts +2 -1
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +1 -1
- package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-7FJQINUR.js} +2 -2
- package/dist/causal-consolidation.js +19 -19
- package/dist/{chunk-BMXEBWBT.js → chunk-2EMROIXS.js} +2 -1
- package/dist/{chunk-BMXEBWBT.js.map → chunk-2EMROIXS.js.map} +1 -1
- package/dist/{chunk-MCTM4YPL.js → chunk-2FLFJTCI.js} +4 -2
- package/dist/chunk-2FLFJTCI.js.map +1 -0
- package/dist/{chunk-RDJ6C7NZ.js → chunk-2IWBHZ3H.js} +5 -5
- package/dist/{chunk-UP75KL3L.js → chunk-2JRB3Z5N.js} +2 -2
- package/dist/{chunk-BXLOS5AJ.js → chunk-2NLLXCJG.js} +2 -2
- package/dist/{chunk-KN6CIN7I.js → chunk-32HO62I4.js} +2 -2
- package/dist/{chunk-JLPNONPH.js → chunk-35A7GCHG.js} +2 -2
- package/dist/{chunk-MXCAJKMA.js → chunk-37ZQYFX4.js} +6 -6
- package/dist/{chunk-LW3HKRL7.js → chunk-3BTHXB7Z.js} +3 -3
- package/dist/{chunk-C7V3KPKJ.js → chunk-47LTKAGL.js} +2 -2
- package/dist/{chunk-3O5BB45T.js → chunk-4DXNOVNW.js} +10 -10
- package/dist/{chunk-65I2LZEK.js → chunk-4G2YCKLT.js} +2 -2
- package/dist/{chunk-OK52IY3W.js → chunk-4GEBLO7S.js} +10 -10
- package/dist/{chunk-M6C7SOR6.js → chunk-4I6PEEFA.js} +3 -3
- package/dist/{chunk-Z4TXB4K7.js → chunk-5BUCKFRE.js} +2 -2
- package/dist/{chunk-BGI4NUAO.js → chunk-5S7SNRSJ.js} +2 -2
- package/dist/{chunk-JVPWRNHA.js → chunk-5YR4UGF2.js} +5 -5
- package/dist/{chunk-YJ7MW627.js → chunk-6BG364RN.js} +2 -2
- package/dist/{chunk-D5BSQR63.js → chunk-76LNUSS5.js} +2 -2
- package/dist/{chunk-7CRUDH7G.js → chunk-77HNHT6S.js} +2 -2
- package/dist/{chunk-OWYHHW67.js → chunk-7XI2UJHL.js} +4 -4
- package/dist/{chunk-BJVO4H5C.js → chunk-7Z2UKRNJ.js} +4 -4
- package/dist/{chunk-2WLMWP2T.js → chunk-A3K2KKSG.js} +2 -2
- package/dist/chunk-A5ZYP4K5.js +130 -0
- package/dist/chunk-A5ZYP4K5.js.map +1 -0
- package/dist/{chunk-AWG3TIAY.js → chunk-ACCOC6UM.js} +2 -2
- package/dist/{chunk-3JDA3XF5.js → chunk-AEGNDL24.js} +2 -2
- package/dist/{chunk-2NAD4YCI.js → chunk-AEUMONCD.js} +2 -2
- package/dist/{chunk-C6U57KG4.js → chunk-AF5PW35O.js} +3 -3
- package/dist/{chunk-IOSZHHJC.js → chunk-ANGZWYL2.js} +6 -6
- package/dist/{chunk-K6T33R4Q.js → chunk-AXGJMDBS.js} +156 -7
- package/dist/chunk-AXGJMDBS.js.map +1 -0
- package/dist/{chunk-6LYAEM54.js → chunk-AXHU56C3.js} +2 -2
- package/dist/{chunk-GWM6T5EQ.js → chunk-BCGMG2RD.js} +2 -2
- package/dist/{chunk-HXCJF4XU.js → chunk-BFIZXFUG.js} +2 -2
- package/dist/{chunk-DBYAY6UW.js → chunk-BTOHGPHC.js} +3 -3
- package/dist/{chunk-5X4MXNEU.js → chunk-C6HPNPNK.js} +3 -3
- package/dist/{chunk-4MP7XR5J.js → chunk-CAKHZAXH.js} +2 -2
- package/dist/{chunk-YSBL7VPO.js → chunk-CDWFWOSZ.js} +2 -2
- package/dist/{chunk-QAW55ZHJ.js → chunk-CZ44FH45.js} +4 -4
- package/dist/{chunk-T3FMRLWQ.js → chunk-D5HQ3VEX.js} +4 -4
- package/dist/{chunk-S7LWX2PQ.js → chunk-DPG5HQLE.js} +4 -4
- package/dist/{chunk-C7ZDKWPS.js → chunk-DVSAMW5T.js} +3 -3
- package/dist/{chunk-WBYQA3VN.js → chunk-E5H4TM4Y.js} +3 -3
- package/dist/{chunk-4RL3JOB3.js → chunk-EEDI3OXB.js} +2 -2
- package/dist/{chunk-3TB2XQ3C.js → chunk-EUL3S3LE.js} +4 -4
- package/dist/{chunk-Q4AUIFUA.js → chunk-F23U5YE7.js} +7 -7
- package/dist/{chunk-ZZZ4I455.js → chunk-GDVORIFM.js} +2 -2
- package/dist/{chunk-QB57WIS6.js → chunk-GXETU7AE.js} +98 -73
- package/dist/chunk-GXETU7AE.js.map +1 -0
- package/dist/{chunk-SWBC3UER.js → chunk-HCPUVB7S.js} +3 -3
- package/dist/{chunk-R3X2T2LP.js → chunk-HFOY2SBG.js} +2 -2
- package/dist/{chunk-LU7E2MXE.js → chunk-HQCUUVG2.js} +20 -20
- package/dist/{chunk-FJLQXMTU.js → chunk-I6B3S62A.js} +2 -2
- package/dist/{chunk-RBITPCMK.js → chunk-IDSSDL4W.js} +9 -9
- package/dist/{chunk-OCFXVDBZ.js → chunk-IVEHY2VT.js} +54 -123
- package/dist/chunk-IVEHY2VT.js.map +1 -0
- package/dist/{chunk-B3OFQP5Y.js → chunk-IY47KPML.js} +6 -6
- package/dist/{chunk-AXC4WSF3.js → chunk-JDOBIFBK.js} +2 -2
- package/dist/{chunk-P2ODTYOF.js → chunk-JGXHQV5N.js} +3 -3
- package/dist/{chunk-7LNHRQKR.js → chunk-JLIGUFPF.js} +2 -2
- package/dist/{chunk-EDIH6X2P.js → chunk-JZ66PN72.js} +2 -2
- package/dist/{chunk-BLVR4WYU.js → chunk-KICEAGKM.js} +2 -2
- package/dist/{chunk-S2GE2K36.js → chunk-KNI4SGQE.js} +109 -96
- package/dist/chunk-KNI4SGQE.js.map +1 -0
- package/dist/{chunk-VDX2J7OX.js → chunk-KQAFEZQX.js} +2 -2
- package/dist/{chunk-PEBHPCX2.js → chunk-KTG23JDX.js} +2 -2
- package/dist/{chunk-BOZJD5PK.js → chunk-KYOZ5E6V.js} +2 -2
- package/dist/{chunk-2DLWLNO4.js → chunk-L3TZXELN.js} +4 -4
- package/dist/{chunk-VALKBYBN.js → chunk-M3N2TUZ7.js} +2 -2
- package/dist/{chunk-76M5OK7V.js → chunk-M7T2NKET.js} +5 -5
- package/dist/chunk-MSAI3Q7D.js +372 -0
- package/dist/chunk-MSAI3Q7D.js.map +1 -0
- package/dist/{chunk-Z5LP6ILP.js → chunk-MZAH3CBT.js} +2 -2
- package/dist/{chunk-QI7K7BZ5.js → chunk-NJW2ZG64.js} +2 -2
- package/dist/{chunk-CZJA2EQE.js → chunk-NSKXRTVZ.js} +2 -2
- package/dist/{chunk-4O4XCBOS.js → chunk-NUSQ3YEL.js} +2 -2
- package/dist/{chunk-4OQET73E.js → chunk-O57FCN42.js} +15 -15
- package/dist/{chunk-WKY7N3L7.js → chunk-OEBUAC3O.js} +10 -10
- package/dist/{chunk-Y23L4YJV.js → chunk-OEIA4IHU.js} +2 -2
- package/dist/{chunk-66DKTOBY.js → chunk-OGZC2WUX.js} +2 -2
- package/dist/{chunk-3SGTV7RD.js → chunk-P62DSJUK.js} +6 -6
- package/dist/{chunk-FKD656D2.js → chunk-PH2V7EXZ.js} +2 -2
- package/dist/{chunk-KKNZ7PUZ.js → chunk-QAIKLICT.js} +2 -2
- package/dist/{chunk-SSUDD72S.js → chunk-QPWUG2S3.js} +2 -2
- package/dist/{chunk-QI2E6ISQ.js → chunk-R2TVWQLR.js} +2 -2
- package/dist/chunk-R2TVWQLR.js.map +1 -0
- package/dist/{chunk-GZDTVYK2.js → chunk-R36IBI2M.js} +3 -3
- package/dist/{chunk-W3XXFPRI.js → chunk-R5B3OWI4.js} +64 -64
- package/dist/{chunk-VL4X7ZHC.js → chunk-RFIJRZ4K.js} +2 -2
- package/dist/{chunk-PWF4JXKD.js → chunk-RKDSELA3.js} +1 -1
- package/dist/chunk-RKDSELA3.js.map +1 -0
- package/dist/{chunk-AEHVZY3X.js → chunk-RPVHRZ5C.js} +2 -2
- package/dist/{chunk-X5SHE2O3.js → chunk-RVBLCU5C.js} +4 -4
- package/dist/{chunk-BUQKSQXL.js → chunk-S533KGX6.js} +5 -5
- package/dist/{chunk-STEOT4DI.js → chunk-SCPHU3RW.js} +7 -7
- package/dist/{chunk-LV5H6FTN.js → chunk-SFSD5Q6O.js} +3 -3
- package/dist/{chunk-AE5U5NMS.js → chunk-SMLKHXPF.js} +2 -2
- package/dist/{chunk-AEU4EQGV.js → chunk-T7R5HI6A.js} +1 -1
- package/dist/{chunk-H5BJWPUI.js → chunk-TVQZAQPE.js} +2 -2
- package/dist/{chunk-H56VY4BY.js → chunk-U36GYZ2P.js} +10 -5
- package/dist/chunk-U36GYZ2P.js.map +1 -0
- package/dist/{chunk-XOV7NRY5.js → chunk-U46P4UAR.js} +3 -3
- package/dist/{chunk-DZ42MDZE.js → chunk-UCJINCZT.js} +2 -2
- package/dist/{chunk-5E6RYRYW.js → chunk-UG5V3Z3R.js} +7 -7
- package/dist/{chunk-IW3RMBPB.js → chunk-VAOC6GHN.js} +2 -2
- package/dist/{chunk-6UQFJULG.js → chunk-VBNA2JEN.js} +2 -2
- package/dist/{chunk-HLB7GKGG.js → chunk-VOZNBQNL.js} +2 -2
- package/dist/{chunk-NYKIUQL6.js → chunk-WHIGRW7T.js} +2 -2
- package/dist/{chunk-AZSGSRIM.js → chunk-WHTMVTU4.js} +3 -3
- package/dist/{chunk-AERXJCOG.js → chunk-WL7N5VGG.js} +5 -5
- package/dist/{chunk-TFA6HPOA.js → chunk-WQUGCOKF.js} +4 -4
- package/dist/{chunk-A4VSOUCB.js → chunk-WTZQM74L.js} +5 -5
- package/dist/{chunk-DQEMWVMT.js → chunk-X7Y7WX73.js} +1 -1
- package/dist/{chunk-T2YX56QI.js → chunk-XWSUK5GL.js} +4 -4
- package/dist/{chunk-ACX55QDO.js → chunk-XYOT5GQU.js} +3 -3
- package/dist/{chunk-Z6EZCN6Z.js → chunk-Y7427SL7.js} +10 -10
- package/dist/{chunk-4KN2JLQV.js → chunk-YHZWVDP7.js} +2 -2
- package/dist/chunk-YVRQ5JRA.js +49 -0
- package/dist/chunk-YVRQ5JRA.js.map +1 -0
- package/dist/{chunk-5MNUBT7T.js → chunk-ZFTODDTX.js} +2 -2
- package/dist/{chunk-VVX5PZFS.js → chunk-ZHXSOMYH.js} +2 -2
- package/dist/{chunk-CRXRZA3G.js → chunk-ZQTYWSO3.js} +2 -2
- package/dist/cli.js +126 -122
- package/dist/coding/export-okf-codegraph.js +17 -17
- package/dist/compounding/engine.js +19 -19
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +27 -24
- package/dist/connectors/codex-materialize-runner.js +18 -18
- package/dist/connectors/index.js +20 -20
- package/dist/contradiction/index.js +3 -3
- package/dist/{contradiction-scan-TAGMOUQ2.js → contradiction-scan-GGRTVB7C.js} +3 -3
- package/dist/convergence-refresh.js +20 -20
- package/dist/conversation-index/backend.js +2 -2
- package/dist/corpus-watermark.js +20 -20
- package/dist/day-summary.js +2 -2
- package/dist/deep-recall-http-glue.js +11 -10
- package/dist/embedding-fallback.js +2 -2
- package/dist/entity-retrieval.js +19 -19
- package/dist/explicit-capture.js +2 -2
- package/dist/external-wiki-access.js +75 -73
- package/dist/extraction-judge.js +3 -3
- package/dist/extraction-normalization.js +3 -3
- package/dist/extraction-prompt.js +2 -2
- package/dist/extraction.js +32 -32
- package/dist/{first-start-migration-7OATHJKB.js → first-start-migration-OM3PHMZO.js} +2 -2
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +198 -195
- package/dist/lcm/engine.js +4 -4
- package/dist/lcm/index.js +10 -10
- package/dist/local-llm-config.js +1 -1
- package/dist/local-llm.js +3 -3
- package/dist/location/index.js +20 -20
- package/dist/maintenance/memory-governance.js +18 -18
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +18 -18
- package/dist/maintenance/rebuild-memory-projection.js +19 -19
- package/dist/memory-browse-operations.js +75 -73
- package/dist/memory-browse.js +5 -5
- package/dist/namespaces/migrate.js +19 -19
- package/dist/namespaces/principal.js +2 -2
- package/dist/namespaces/search.js +13 -13
- package/dist/namespaces/storage.js +18 -18
- 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-impression-drain.js +5 -5
- 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 +21 -21
- package/dist/operator-toolkit.js +39 -36
- package/dist/orchestration/compression-guideline-coordinator.js +2 -2
- package/dist/orchestration/maintenance.js +33 -33
- package/dist/orchestration/orchestrator-helpers.d.ts +1 -0
- package/dist/orchestration/orchestrator-helpers.d.ts.map +1 -1
- package/dist/orchestration/recall-entry.d.ts.map +1 -1
- package/dist/orchestration/recall-search-pipeline.d.ts.map +1 -1
- package/dist/orchestrator.js +168 -165
- package/dist/outcome-boost-config.d.ts +17 -0
- package/dist/outcome-boost-config.d.ts.map +1 -0
- package/dist/outcome-boost-config.js +1 -0
- package/dist/outcome-boost-config.js.map +1 -0
- package/dist/qmd.js +4 -4
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-navigate-access.js +2 -2
- package/dist/recall-navigate-disclosure.js +2 -2
- package/dist/recall-navigate.js +2 -2
- package/dist/recall-navigation-operations.js +75 -73
- package/dist/recall-navigation.js +74 -72
- package/dist/recall-state-view-admission.js +5 -5
- package/dist/recall-why-service.js +9 -9
- package/dist/recall-why.js +3 -3
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.js +2 -2
- package/dist/rerank-outcome.d.ts +73 -0
- package/dist/rerank-outcome.d.ts.map +1 -0
- package/dist/rerank-outcome.js +28 -0
- package/dist/rerank-outcome.js.map +1 -0
- package/dist/{resolution-K4A3VPKZ.js → resolution-BROE3TRO.js} +4 -4
- package/dist/resolution-BROE3TRO.js.map +1 -0
- package/dist/resume-bundles.js +28 -25
- package/dist/search/embed-helper.js +2 -2
- package/dist/search/factory.js +12 -12
- package/dist/search/index.js +18 -18
- package/dist/search/lancedb-backend.js +2 -2
- package/dist/search/meilisearch-backend.js +2 -2
- package/dist/search/orama-backend.js +2 -2
- package/dist/semantic-consolidation.js +19 -19
- package/dist/semantic-rule-promotion.js +18 -18
- package/dist/semantic-rule-verifier.js +18 -18
- package/dist/shared-context/manager.js +2 -2
- package/dist/source-agent-qualifier.js +26 -26
- package/dist/standup/build.js +18 -18
- package/dist/storage.js +17 -17
- package/dist/summarizer.js +4 -4
- package/dist/support-passport/index.js +77 -75
- 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/{tier-stats-VF6DS52E.js → tier-stats-M2FMMD2N.js} +2 -2
- 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 +18 -18
- package/dist/types.d.ts +4 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/verified-recall.js +18 -18
- package/dist/who-knows-cli.js +19 -19
- package/dist/who-knows.js +18 -18
- package/package.json +13 -3
- package/src/access-mcp-output-schemas.ts +2 -0
- package/src/access-recall-corpus-versions.ts +59 -0
- package/src/access-recall-response.ts +3 -0
- package/src/access-recall-surface.ts +22 -23
- package/src/access-service-raw-excerpt-read-gate.test.ts +1 -1
- package/src/access-service.ts +3 -0
- package/src/capabilities.test.ts +1 -0
- package/src/capabilities.ts +6 -8
- package/src/config.ts +3 -0
- package/src/index.ts +1 -1
- 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/orchestration/orchestrator-helpers.ts +1 -1
- package/src/orchestration/recall-entry.ts +32 -16
- package/src/orchestration/recall-internal.ts +2 -2
- package/src/orchestration/recall-search-pipeline.ts +3 -0
- package/src/outcome-boost-config.ts +16 -0
- package/src/recall-retrieval-failure.test.ts +456 -4
- package/src/rerank-outcome.test.ts +218 -0
- package/src/rerank-outcome.ts +219 -0
- package/src/support-passport/offline-sync-guard.ts +16 -2
- package/src/types.ts +3 -3
- package/dist/chunk-H56VY4BY.js.map +0 -1
- package/dist/chunk-K6T33R4Q.js.map +0 -1
- package/dist/chunk-MCTM4YPL.js.map +0 -1
- package/dist/chunk-OCFXVDBZ.js.map +0 -1
- package/dist/chunk-PWF4JXKD.js.map +0 -1
- package/dist/chunk-QB57WIS6.js.map +0 -1
- package/dist/chunk-QI2E6ISQ.js.map +0 -1
- package/dist/chunk-S2GE2K36.js.map +0 -1
- /package/dist/{capsule-crypto-YO5QJ6L3.js.map → access-recall-corpus-versions.js.map} +0 -0
- /package/dist/{auto-sync-U5N3CB5Y.js.map → auto-sync-PAWBFQWL.js.map} +0 -0
- /package/dist/{contradiction-scan-TAGMOUQ2.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
- /package/dist/{chunk-RDJ6C7NZ.js.map → chunk-2IWBHZ3H.js.map} +0 -0
- /package/dist/{chunk-UP75KL3L.js.map → chunk-2JRB3Z5N.js.map} +0 -0
- /package/dist/{chunk-BXLOS5AJ.js.map → chunk-2NLLXCJG.js.map} +0 -0
- /package/dist/{chunk-KN6CIN7I.js.map → chunk-32HO62I4.js.map} +0 -0
- /package/dist/{chunk-JLPNONPH.js.map → chunk-35A7GCHG.js.map} +0 -0
- /package/dist/{chunk-MXCAJKMA.js.map → chunk-37ZQYFX4.js.map} +0 -0
- /package/dist/{chunk-LW3HKRL7.js.map → chunk-3BTHXB7Z.js.map} +0 -0
- /package/dist/{chunk-C7V3KPKJ.js.map → chunk-47LTKAGL.js.map} +0 -0
- /package/dist/{chunk-3O5BB45T.js.map → chunk-4DXNOVNW.js.map} +0 -0
- /package/dist/{chunk-65I2LZEK.js.map → chunk-4G2YCKLT.js.map} +0 -0
- /package/dist/{chunk-OK52IY3W.js.map → chunk-4GEBLO7S.js.map} +0 -0
- /package/dist/{chunk-M6C7SOR6.js.map → chunk-4I6PEEFA.js.map} +0 -0
- /package/dist/{chunk-Z4TXB4K7.js.map → chunk-5BUCKFRE.js.map} +0 -0
- /package/dist/{chunk-BGI4NUAO.js.map → chunk-5S7SNRSJ.js.map} +0 -0
- /package/dist/{chunk-JVPWRNHA.js.map → chunk-5YR4UGF2.js.map} +0 -0
- /package/dist/{chunk-YJ7MW627.js.map → chunk-6BG364RN.js.map} +0 -0
- /package/dist/{chunk-D5BSQR63.js.map → chunk-76LNUSS5.js.map} +0 -0
- /package/dist/{chunk-7CRUDH7G.js.map → chunk-77HNHT6S.js.map} +0 -0
- /package/dist/{chunk-OWYHHW67.js.map → chunk-7XI2UJHL.js.map} +0 -0
- /package/dist/{chunk-BJVO4H5C.js.map → chunk-7Z2UKRNJ.js.map} +0 -0
- /package/dist/{chunk-2WLMWP2T.js.map → chunk-A3K2KKSG.js.map} +0 -0
- /package/dist/{chunk-AWG3TIAY.js.map → chunk-ACCOC6UM.js.map} +0 -0
- /package/dist/{chunk-3JDA3XF5.js.map → chunk-AEGNDL24.js.map} +0 -0
- /package/dist/{chunk-2NAD4YCI.js.map → chunk-AEUMONCD.js.map} +0 -0
- /package/dist/{chunk-C6U57KG4.js.map → chunk-AF5PW35O.js.map} +0 -0
- /package/dist/{chunk-IOSZHHJC.js.map → chunk-ANGZWYL2.js.map} +0 -0
- /package/dist/{chunk-6LYAEM54.js.map → chunk-AXHU56C3.js.map} +0 -0
- /package/dist/{chunk-GWM6T5EQ.js.map → chunk-BCGMG2RD.js.map} +0 -0
- /package/dist/{chunk-HXCJF4XU.js.map → chunk-BFIZXFUG.js.map} +0 -0
- /package/dist/{chunk-DBYAY6UW.js.map → chunk-BTOHGPHC.js.map} +0 -0
- /package/dist/{chunk-5X4MXNEU.js.map → chunk-C6HPNPNK.js.map} +0 -0
- /package/dist/{chunk-4MP7XR5J.js.map → chunk-CAKHZAXH.js.map} +0 -0
- /package/dist/{chunk-YSBL7VPO.js.map → chunk-CDWFWOSZ.js.map} +0 -0
- /package/dist/{chunk-QAW55ZHJ.js.map → chunk-CZ44FH45.js.map} +0 -0
- /package/dist/{chunk-T3FMRLWQ.js.map → chunk-D5HQ3VEX.js.map} +0 -0
- /package/dist/{chunk-S7LWX2PQ.js.map → chunk-DPG5HQLE.js.map} +0 -0
- /package/dist/{chunk-C7ZDKWPS.js.map → chunk-DVSAMW5T.js.map} +0 -0
- /package/dist/{chunk-WBYQA3VN.js.map → chunk-E5H4TM4Y.js.map} +0 -0
- /package/dist/{chunk-4RL3JOB3.js.map → chunk-EEDI3OXB.js.map} +0 -0
- /package/dist/{chunk-3TB2XQ3C.js.map → chunk-EUL3S3LE.js.map} +0 -0
- /package/dist/{chunk-Q4AUIFUA.js.map → chunk-F23U5YE7.js.map} +0 -0
- /package/dist/{chunk-ZZZ4I455.js.map → chunk-GDVORIFM.js.map} +0 -0
- /package/dist/{chunk-SWBC3UER.js.map → chunk-HCPUVB7S.js.map} +0 -0
- /package/dist/{chunk-R3X2T2LP.js.map → chunk-HFOY2SBG.js.map} +0 -0
- /package/dist/{chunk-LU7E2MXE.js.map → chunk-HQCUUVG2.js.map} +0 -0
- /package/dist/{chunk-FJLQXMTU.js.map → chunk-I6B3S62A.js.map} +0 -0
- /package/dist/{chunk-RBITPCMK.js.map → chunk-IDSSDL4W.js.map} +0 -0
- /package/dist/{chunk-B3OFQP5Y.js.map → chunk-IY47KPML.js.map} +0 -0
- /package/dist/{chunk-AXC4WSF3.js.map → chunk-JDOBIFBK.js.map} +0 -0
- /package/dist/{chunk-P2ODTYOF.js.map → chunk-JGXHQV5N.js.map} +0 -0
- /package/dist/{chunk-7LNHRQKR.js.map → chunk-JLIGUFPF.js.map} +0 -0
- /package/dist/{chunk-EDIH6X2P.js.map → chunk-JZ66PN72.js.map} +0 -0
- /package/dist/{chunk-BLVR4WYU.js.map → chunk-KICEAGKM.js.map} +0 -0
- /package/dist/{chunk-VDX2J7OX.js.map → chunk-KQAFEZQX.js.map} +0 -0
- /package/dist/{chunk-PEBHPCX2.js.map → chunk-KTG23JDX.js.map} +0 -0
- /package/dist/{chunk-BOZJD5PK.js.map → chunk-KYOZ5E6V.js.map} +0 -0
- /package/dist/{chunk-2DLWLNO4.js.map → chunk-L3TZXELN.js.map} +0 -0
- /package/dist/{chunk-VALKBYBN.js.map → chunk-M3N2TUZ7.js.map} +0 -0
- /package/dist/{chunk-76M5OK7V.js.map → chunk-M7T2NKET.js.map} +0 -0
- /package/dist/{chunk-Z5LP6ILP.js.map → chunk-MZAH3CBT.js.map} +0 -0
- /package/dist/{chunk-QI7K7BZ5.js.map → chunk-NJW2ZG64.js.map} +0 -0
- /package/dist/{chunk-CZJA2EQE.js.map → chunk-NSKXRTVZ.js.map} +0 -0
- /package/dist/{chunk-4O4XCBOS.js.map → chunk-NUSQ3YEL.js.map} +0 -0
- /package/dist/{chunk-4OQET73E.js.map → chunk-O57FCN42.js.map} +0 -0
- /package/dist/{chunk-WKY7N3L7.js.map → chunk-OEBUAC3O.js.map} +0 -0
- /package/dist/{chunk-Y23L4YJV.js.map → chunk-OEIA4IHU.js.map} +0 -0
- /package/dist/{chunk-66DKTOBY.js.map → chunk-OGZC2WUX.js.map} +0 -0
- /package/dist/{chunk-3SGTV7RD.js.map → chunk-P62DSJUK.js.map} +0 -0
- /package/dist/{chunk-FKD656D2.js.map → chunk-PH2V7EXZ.js.map} +0 -0
- /package/dist/{chunk-KKNZ7PUZ.js.map → chunk-QAIKLICT.js.map} +0 -0
- /package/dist/{chunk-SSUDD72S.js.map → chunk-QPWUG2S3.js.map} +0 -0
- /package/dist/{chunk-GZDTVYK2.js.map → chunk-R36IBI2M.js.map} +0 -0
- /package/dist/{chunk-W3XXFPRI.js.map → chunk-R5B3OWI4.js.map} +0 -0
- /package/dist/{chunk-VL4X7ZHC.js.map → chunk-RFIJRZ4K.js.map} +0 -0
- /package/dist/{chunk-AEHVZY3X.js.map → chunk-RPVHRZ5C.js.map} +0 -0
- /package/dist/{chunk-X5SHE2O3.js.map → chunk-RVBLCU5C.js.map} +0 -0
- /package/dist/{chunk-BUQKSQXL.js.map → chunk-S533KGX6.js.map} +0 -0
- /package/dist/{chunk-STEOT4DI.js.map → chunk-SCPHU3RW.js.map} +0 -0
- /package/dist/{chunk-LV5H6FTN.js.map → chunk-SFSD5Q6O.js.map} +0 -0
- /package/dist/{chunk-AE5U5NMS.js.map → chunk-SMLKHXPF.js.map} +0 -0
- /package/dist/{chunk-AEU4EQGV.js.map → chunk-T7R5HI6A.js.map} +0 -0
- /package/dist/{chunk-H5BJWPUI.js.map → chunk-TVQZAQPE.js.map} +0 -0
- /package/dist/{chunk-XOV7NRY5.js.map → chunk-U46P4UAR.js.map} +0 -0
- /package/dist/{chunk-DZ42MDZE.js.map → chunk-UCJINCZT.js.map} +0 -0
- /package/dist/{chunk-5E6RYRYW.js.map → chunk-UG5V3Z3R.js.map} +0 -0
- /package/dist/{chunk-IW3RMBPB.js.map → chunk-VAOC6GHN.js.map} +0 -0
- /package/dist/{chunk-6UQFJULG.js.map → chunk-VBNA2JEN.js.map} +0 -0
- /package/dist/{chunk-HLB7GKGG.js.map → chunk-VOZNBQNL.js.map} +0 -0
- /package/dist/{chunk-NYKIUQL6.js.map → chunk-WHIGRW7T.js.map} +0 -0
- /package/dist/{chunk-AZSGSRIM.js.map → chunk-WHTMVTU4.js.map} +0 -0
- /package/dist/{chunk-AERXJCOG.js.map → chunk-WL7N5VGG.js.map} +0 -0
- /package/dist/{chunk-TFA6HPOA.js.map → chunk-WQUGCOKF.js.map} +0 -0
- /package/dist/{chunk-A4VSOUCB.js.map → chunk-WTZQM74L.js.map} +0 -0
- /package/dist/{chunk-DQEMWVMT.js.map → chunk-X7Y7WX73.js.map} +0 -0
- /package/dist/{chunk-T2YX56QI.js.map → chunk-XWSUK5GL.js.map} +0 -0
- /package/dist/{chunk-ACX55QDO.js.map → chunk-XYOT5GQU.js.map} +0 -0
- /package/dist/{chunk-Z6EZCN6Z.js.map → chunk-Y7427SL7.js.map} +0 -0
- /package/dist/{chunk-4KN2JLQV.js.map → chunk-YHZWVDP7.js.map} +0 -0
- /package/dist/{chunk-5MNUBT7T.js.map → chunk-ZFTODDTX.js.map} +0 -0
- /package/dist/{chunk-VVX5PZFS.js.map → chunk-ZHXSOMYH.js.map} +0 -0
- /package/dist/{chunk-CRXRZA3G.js.map → chunk-ZQTYWSO3.js.map} +0 -0
- /package/dist/{resolution-K4A3VPKZ.js.map → contradiction-scan-GGRTVB7C.js.map} +0 -0
- /package/dist/{first-start-migration-7OATHJKB.js.map → first-start-migration-OM3PHMZO.js.map} +0 -0
- /package/dist/{tier-stats-VF6DS52E.js.map → tier-stats-M2FMMD2N.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/offline-sync-embedding-generation.ts"],"sourcesContent":["// Embedding-index generation semantics for offline sync (issue #3146, PR\n// #3148). Extracted from offline-sync.ts so the god-file line-count ratchet\n// does not grow when the rules gain behavior. The snapshot walker treats\n// every `state/embeddings/` shard set — or a legacy `state/embeddings.json`\n// marker — as ONE generation, in both directions:\n//\n// 1. Atomic replacement (apply side): an incoming generation is staged\n// complete, verified byte-for-byte, and published through the store's\n// single backup-swap state machine. A crash or write failure can never\n// leave a mix of the local and incoming generation on disk, and a\n// local-only shard of a replaced generation is removed by the swap, not\n// merged into the incoming set.\n// 2. Filter-to-omit, never filter-to-delete (push side): when an exclusion\n// filter removes ANY member of a local generation from a push, the\n// WHOLE generation is omitted — files and deletion metadata — and the\n// receiver keeps its copy. A filtered generation must never look\n// deleted, and a partially filtered snapshot must never look like a\n// complete generation.\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { lstat, mkdir, readFile, readdir, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n type EmbeddingIndexFile,\n EmbeddingIndexFileStore,\n type EmbeddingIndexIdentity,\n type EmbeddingIndexStoreIo,\n EmbeddingIndexStorageError,\n parseEmbeddingIndexDocument,\n serializeEmbeddingShard,\n shardEntriesForIndex,\n validateShardMembership,\n} from \"./embedding-index-storage.js\";\nimport {\n assertEmbeddingGenerationLockHeld,\n type EmbeddingGenerationFence,\n embeddingGenerationLockPath,\n withEmbeddingGenerationLock,\n} from \"./embedding-generation-lock.js\";\nimport type { OfflineSyncExcludeFile, OfflineSyncFileTarget } from \"./offline-sync-file-io.js\";\nimport { EMBEDDING_SHARD_FILE_PATTERN } from \"./offline-sync-runtime-state.js\";\nimport { log } from \"./logger.js\";\nimport type {\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\";\nexport const EMBEDDING_SHARD_DIR_BASENAME = \"embeddings\";\n\n/**\n * Canonical `state` dir prefix (\"state\" or \"namespaces/<ns>/state\") for a\n * path's segments, or null when the path is not canonical runtime state.\n */\nfunction canonicalStateDirPrefix(parts: string[]): string | null {\n if (parts[0] === \"state\") return \"state\";\n if (parts[0] === \"namespaces\" && parts.length >= 4 && parts[2] === \"state\") {\n return `namespaces/${parts[1]}/state`;\n }\n return null;\n}\n\n/** The sharded-generation directory when `relPath` is one of its shards. */\nexport function embeddingShardDirOf(relPath: string): string | null {\n const parts = relPath.split(\"/\");\n if (parts.length < 3) return null;\n if (!EMBEDDING_SHARD_FILE_PATTERN.test(parts[parts.length - 1] ?? \"\")) return null;\n if (parts[parts.length - 2] !== EMBEDDING_SHARD_DIR_BASENAME) return null;\n if (canonicalStateDirPrefix(parts) === null) return null;\n return parts.slice(0, -1).join(\"/\");\n}\n\n/**\n * True when `dirPath` is a canonical embeddings generation dir\n * (`state/embeddings` or `namespaces/<ns>/state/embeddings`). Encodes the\n * snapshot-field shape contract without a ReDoS-shaped literal (issue #2439).\n */\nexport function isEmbeddingGenerationDirPath(dirPath: string): boolean {\n const membership = embeddingGenerationMembership(`${dirPath}/shard-0000.json`);\n return membership !== null && membership.shardDir === dirPath;\n}\n\n/** The state dir when `relPath` is the legacy single-file marker. */\nexport function embeddingMarkerDirOf(relPath: string): string | null {\n const parts = relPath.split(\"/\");\n if ((parts[parts.length - 1] ?? \"\") !== EMBEDDING_MARKER_BASENAME) return null;\n if (canonicalStateDirPrefix(parts) === null) return null;\n return parts.slice(0, -1).join(\"/\");\n}\n\n/**\n * Membership of `relPath` in an embedding generation: shards belong to their\n * `.../embeddings` directory, the legacy marker belongs to the sibling\n * `.../embeddings` directory of its state dir.\n */\nexport function embeddingGenerationMembership(relPath: string): { kind: \"shard\" | \"marker\"; shardDir: string } | null {\n const shardDir = embeddingShardDirOf(relPath);\n if (shardDir) return { kind: \"shard\", shardDir };\n const markerDir = embeddingMarkerDirOf(relPath);\n if (markerDir) return { kind: \"marker\", shardDir: `${markerDir}/${EMBEDDING_SHARD_DIR_BASENAME}` };\n return null;\n}\n\nexport interface IncomingEmbeddingGenerations {\n /** Generation dirs with at least one incoming shard. */\n shardDirs: Set<string>;\n /** State dirs whose incoming snapshot carries the legacy marker. */\n legacyMarkerDirs: Set<string>;\n}\n\n/** Classify incoming snapshot paths into embedding generations. */\nexport function detectIncomingEmbeddingGenerations(incomingPaths: Iterable<string>): IncomingEmbeddingGenerations {\n const shardDirs = new Set<string>();\n const legacyMarkerDirs = new Set<string>();\n for (const relPath of incomingPaths) {\n const membership = embeddingGenerationMembership(relPath);\n if (!membership) continue;\n if (membership.kind === \"shard\") shardDirs.add(membership.shardDir);\n else legacyMarkerDirs.add(membership.shardDir);\n }\n return { shardDirs, legacyMarkerDirs };\n}\n\nfunction shardRelPath(shardDirRel: string, shardIndex: number): string {\n return `${shardDirRel}/shard-${String(shardIndex).padStart(4, \"0\")}.json`;\n}\n\nfunction describeIndexReadFailure(\n read: { outcome: \"absent\" } | { outcome: \"foreign\" } | { outcome: \"unreadable\"; reason: string }\n): string {\n if (read.outcome === \"unreadable\") return read.reason;\n if (read.outcome === \"foreign\") return \"unrecognized index format\";\n return \"generation document is absent\";\n}\n\nfunction sha256Hex(buffer: Buffer): string {\n return createHash(\"sha256\").update(buffer).digest(\"hex\");\n}\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\nexport interface EmbeddingGenerationTransactionIo {\n /** Storage-backed local read: hydrates unchanged shards (metadata-only\n * pulls skip their content) and decrypts secure-store files. */\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n writeStagingFile?: (target: OfflineSyncFileStagingWriteTarget) => Promise<void>;\n readStagingFile?: (target: OfflineSyncFileStagingReadTarget) => Promise<Buffer>;\n deleteFile?: (target: OfflineSyncFileDeleteTarget) => Promise<void>;\n}\n\nexport interface EmbeddingGenerationTransactionInput {\n root: SafeArchiveRoot;\n /** The generation dir, e.g. `state/embeddings`. */\n shardDirRel: string;\n /** Incoming shard rel paths — the complete incoming sharded generation. */\n incomingShardPaths: string[];\n /** Incoming legacy marker (rel path + verified content), when the\n * incoming generation is legacy-layout. Mutually exclusive with\n * `incomingShardPaths`. */\n incomingMarker: { path: string; sha256: string; buffer: Buffer | null } | null;\n /** True when the incoming snapshot ALSO carries the legacy marker while\n * shards form the generation (mixed remote): the per-file loop then writes\n * the marker as the inert remote artifact, so this transaction must NOT\n * remove a local marker. */\n incomingMarkerPresent: boolean;\n /** Incoming shard records (sha256 for local hydration of unchanged\n * metadata-only pulls). */\n incomingShardStates: ReadonlyMap<string, OfflineSyncFileState>;\n /** Verified incoming content by rel path (absent for shards the metadata\n * hydration skipped because the local hash already matches). */\n incomingBuffers: ReadonlyMap<string, Buffer>;\n /**\n * Shared-base states (pre-census): lets the transaction re-evaluate\n * divergence against ACTUAL disk contents while holding the mutation\n * lock, instead of trusting the census taken before the lock\n * (codex P1: a daemon mutation between census and lock was discarded).\n */\n baseStates?: ReadonlyMap<string, { sha256: string }>;\n io: EmbeddingGenerationTransactionIo;\n now: number;\n}\n\nexport interface EmbeddingGenerationTransactionResult {\n shardDirRel: string;\n upserted: number;\n deleted: number;\n /** nextBase states for files the transaction published. */\n writtenStates: Map<string, OfflineSyncFileState>;\n /** nextBase paths the transaction removed (stale shards, demoted marker). */\n removedPaths: Set<string>;\n /** Paths the per-file apply loop must skip — all handled here. */\n handledPaths: Set<string>;\n /** True when the generation was deferred (not published) because the disk\n * diverged from the shared base while the lock was held. */\n deferredLocalDivergence?: boolean;\n}\n\n/**\n * Content for ONE incoming generation member: the verified incoming buffer,\n * or the LOCAL file hash-verified against the incoming record (metadata-only\n * pulls skip content whose local hash already matches — the local bytes ARE\n * the incoming content). Shared by the shard and legacy-marker branches.\n */\nasync function hydratedIncomingBuffer(\n io: EmbeddingGenerationTransactionIo,\n root: SafeArchiveRoot,\n relPath: string,\n expectedSha256: string,\n incoming: Buffer | null | undefined,\n): Promise<Buffer> {\n if (incoming) return incoming;\n const filePath = await resolveSafeArchiveTarget(root, relPath);\n const local = io.readFile\n ? await io.readFile({ root: root.abs, path: relPath, filePath })\n : await readFile(filePath);\n if (sha256Hex(local) !== expectedSha256) {\n throw new EmbeddingIndexStorageError(\n `cannot hydrate unchanged embedding index file ${relPath}: local digest does not match the incoming record; local generation preserved`,\n );\n }\n return local;\n}\n\n/**\n * Apply ONE incoming embedding generation atomically (issue #3148, round 4):\n * recover an interrupted replacement, validate the complete incoming\n * generation (legacy markers are converted to the sharded layout so the\n * one-way layout is preserved), stage it, verify the staged bytes, then\n * publish through the shared backup-swap. Any failure before the swap leaves\n * the local generation untouched; a crash in the swap gap is rolled back by\n * the store's recovery on next use.\n */\n/**\n * Enumerate and hash the ACTUAL local generation on disk (legacy marker +\n * every shard) through the configured secure IO — the fresh in-lock census\n * the stale pre-lock apply census cannot be trusted for (codex P1).\n */\n/** Scope the shared vault base to this physical embedding generation. */\nfunction baseStatesForGeneration(\n base: ReadonlyMap<string, { sha256: string }> | undefined,\n shardDirRel: string,\n): Map<string, { sha256: string }> {\n return new Map([...base ?? []].filter(([relPath]) => embeddingGenerationMembership(relPath)?.shardDir === shardDirRel));\n}\n\nasync function censusGenerationState(\n io: EmbeddingGenerationTransactionIo,\n root: SafeArchiveRoot,\n markerRel: string,\n markerAbs: string,\n shardDirAbs: string,\n shardDirRel: string,\n): Promise<Map<string, string>> {\n const census = new Map<string, string>();\n const readSha = async (relPath: string, filePath: string) =>\n sha256Hex(io.readFile ? await io.readFile({ root: root.abs, path: relPath, filePath }) : await readFile(filePath));\n if (await pathExists(markerAbs)) census.set(markerRel, await readSha(markerRel, markerAbs));\n const names = await readdir(shardDirAbs).catch((err: NodeJS.ErrnoException) => {\n if (err.code === \"ENOENT\") return [] as string[];\n throw err;\n });\n for (const name of names.filter((candidate) => EMBEDDING_SHARD_FILE_PATTERN.test(candidate)).sort()) {\n const relPath = `${shardDirRel}/${name}`;\n census.set(relPath, await readSha(relPath, path.join(shardDirAbs, name)));\n }\n return census;\n}\n\n/** Incoming member states for the divergence helper (digests as fallback). */\nfunction incomingGenerationStates(input: EmbeddingGenerationTransactionInput): { path: string; sha256: string }[] {\n const states = input.incomingShardPaths.map((relPath) => ({\n path: relPath,\n sha256: input.incomingShardStates.get(relPath)?.sha256 ?? sha256Hex(input.incomingBuffers.get(relPath) ?? Buffer.alloc(0)),\n }));\n if (input.incomingMarker) {\n states.push({ path: input.incomingMarker.path, sha256: input.incomingMarker.sha256 });\n }\n return states;\n}\n\nexport async function applyEmbeddingGenerationTransaction(\n input: EmbeddingGenerationTransactionInput\n): Promise<EmbeddingGenerationTransactionResult> {\n const { root, shardDirRel, io } = input;\n const stateDirRel = shardDirRel.slice(0, -`/${EMBEDDING_SHARD_DIR_BASENAME}`.length);\n const stateDirAbs = await resolveSafeArchiveTarget(root, stateDirRel);\n return await withEmbeddingGenerationLock(stateDirAbs, async (section) => {\n const lockPath = embeddingGenerationLockPath(stateDirAbs);\n const fence: EmbeddingGenerationFence = () => assertEmbeddingGenerationLockHeld(lockPath, section);\n const markerRel = `${stateDirRel}/${EMBEDDING_MARKER_BASENAME}`;\n const shardDirAbs = await resolveSafeArchiveTarget(root, shardDirRel);\n const markerAbs = await resolveSafeArchiveTarget(root, markerRel);\n const store = new EmbeddingIndexFileStore(\n markerAbs,\n shardDirAbs,\n await resolveSafeArchiveTarget(root, `${stateDirRel}/embedding-fallback-status.json`)\n );\n\n // 1. Close a pending rename gap (old generation restored) before staging:\n // the swap below must never build on a half-replaced generation. The\n // fixed backup path is validated first: a planted symlink (or any\n // escape) must fail closed instead of being renamed into the published\n // position or removed through. The restored target is re-resolved so a\n // symlinked restoration cannot slip past the subsequent IO.\n const backupRel = `${stateDirRel}/embeddings.pre-replace.tmp`;\n await resolveSafeArchiveTarget(root, backupRel);\n if (await store.recoverIfInterrupted(fence)) {\n await resolveSafeArchiveTarget(root, shardDirRel);\n }\n\n // Codex P1: the apply census was taken BEFORE this lock, so it may be\n // stale. Re-enumerate and hash the ACTUAL local generation through the\n // secure IO and defer the WHOLE generation when the disk no longer\n // matches the shared base — a concurrent daemon mutation must never be\n // silently discarded by the swap.\n // No shared base (fresh catch-up) = no divergence semantics to protect.\n const baseStates = baseStatesForGeneration(input.baseStates, shardDirRel);\n if (baseStates.size > 0) {\n const localCensus = await censusGenerationState(io, root, markerRel, markerAbs, shardDirAbs, shardDirRel);\n const baseArr = [...baseStates].map(([relPath, state]) => ({ path: relPath, sha256: state.sha256 }));\n const censusArr = [...localCensus].map(([relPath, sha256]) => ({ path: relPath, sha256 }));\n const deferrals = divergedEmbeddingGenerationDeferrals({\n incomingFiles: incomingGenerationStates(input),\n baseFiles: baseArr,\n currentFiles: censusArr,\n });\n const addedOrRemovedSinceBase =\n censusArr.some((member) => !baseStates.has(member.path)) ||\n baseArr.some((member) => !localCensus.has(member.path));\n if (deferrals.length > 0 || addedOrRemovedSinceBase) {\n const handled = new Set<string>(input.incomingShardPaths);\n if (input.incomingMarker) handled.add(input.incomingMarker.path);\n if (input.incomingMarkerPresent) handled.add(markerRel);\n for (const relPath of localCensus.keys()) handled.add(relPath);\n log.warn(\n `embedding generation ${shardDirRel} deferred: disk diverged from the shared base under the mutation lock (${deferrals.length > 0 ? deferrals.join(\", \") : \"generation membership changed since base\"}); nothing published, nothing removed`,\n );\n return {\n shardDirRel,\n upserted: 0,\n deleted: 0,\n writtenStates: new Map<string, OfflineSyncFileState>(),\n removedPaths: new Set<string>(),\n handledPaths: handled,\n deferredLocalDivergence: true,\n };\n }\n }\n\n const published = new Map<string, Buffer>();\n let identity: EmbeddingIndexIdentity | null = null;\n // Divergence re-evaluation happens HERE, under the lock, against real\n // disk bytes: the apply-side census may already be stale.\n // 2. Build the complete incoming generation (final rel path → plaintext\n // bytes) and validate every document BEFORE touching local state.\n if (input.incomingMarker) {\n const markerBuffer = await hydratedIncomingBuffer(\n io,\n root,\n input.incomingMarker.path,\n input.incomingMarker.sha256,\n input.incomingMarker.buffer,\n );\n const read = parseEmbeddingIndexDocument(markerBuffer.toString(\"utf-8\"));\n if (read.outcome !== \"ok\") {\n throw new EmbeddingIndexStorageError(\n `refusing incoming embedding index generation ${markerRel}: ${describeIndexReadFailure(read)}; local generation preserved`\n );\n }\n identity = { provider: read.file.provider, model: read.file.model };\n const groups = shardEntriesForIndex(read.file);\n for (const [shardIndex, entries] of groups) {\n if (Object.keys(entries).length === 0) continue;\n published.set(\n shardRelPath(shardDirRel, shardIndex),\n Buffer.from(serializeEmbeddingShard(read.file, shardIndex, entries), \"utf-8\")\n );\n }\n } else {\n for (const relPath of input.incomingShardPaths) {\n // Metadata-only pulls skip content whose local hash already matches\n // the incoming record: the LOCAL bytes ARE the incoming content, so\n // read and hash-verify them instead of failing (codex rounds 5-6).\n const state = input.incomingShardStates.get(relPath);\n const buffer = await hydratedIncomingBuffer(\n io,\n root,\n relPath,\n state?.sha256 ?? \"\",\n input.incomingBuffers.get(relPath),\n );\n const read = parseEmbeddingIndexDocument(buffer.toString(\"utf-8\"));\n if (read.outcome !== \"ok\") {\n throw new EmbeddingIndexStorageError(\n `refusing incoming embedding index shard ${relPath}: ${describeIndexReadFailure(read)}; local generation preserved`\n );\n }\n validateShardMembership(relPath.split(\"/\").pop() ?? \"\", read.file);\n const shardIdentity = { provider: read.file.provider, model: read.file.model };\n if (!identity) identity = shardIdentity;\n if (identity.provider !== shardIdentity.provider || identity.model !== shardIdentity.model) {\n throw new EmbeddingIndexStorageError(\n `refusing mixed-identity incoming embedding index generation in ${shardDirRel}: ${relPath} is ${shardIdentity.provider}/${shardIdentity.model} but the generation is ${identity.provider}/${identity.model}; local generation preserved`\n );\n }\n published.set(relPath, buffer);\n }\n if (published.size === 0) {\n throw new EmbeddingIndexStorageError(\n `incoming embedding index generation ${shardDirRel} is empty; local generation preserved`\n );\n }\n }\n\n const stagingRel = `${stateDirRel}/embeddings.staging.tmp-sync-${process.pid}-${input.now}-${randomBytes(8).toString(\"hex\")}`;\n const stagingAbs = await resolveSafeArchiveTarget(root, stagingRel);\n try {\n await mkdir(stagingAbs, { recursive: true });\n\n // 3. Stage the complete generation. With storage-backed IO the staged\n // ciphertext binds its FINAL canonical path (`aadRelPath`), so after\n // the directory swap it decrypts at the published path — a physical\n // staging-path AAD would make the published generation unreadable.\n for (const [relPath, buffer] of published) {\n const stagedRel = `${stagingRel}/${path.basename(relPath)}`;\n const stagedAbs = await resolveSafeArchiveTarget(root, stagedRel);\n const finalAbs = await resolveSafeArchiveTarget(root, relPath);\n if (io.writeStagingFile) {\n await io.writeStagingFile({\n root: root.abs,\n path: stagedRel,\n filePath: stagedAbs,\n content: buffer,\n finalAadFilePath: finalAbs,\n });\n } else {\n await writeFile(stagedAbs, buffer, { mode: 0o600 });\n }\n }\n\n // 4. Verify the staged bytes against the incoming content before the\n // published generation is touched at all.\n for (const [relPath, buffer] of published) {\n const stagedRel = `${stagingRel}/${path.basename(relPath)}`;\n const stagedAbs = await resolveSafeArchiveTarget(root, stagedRel);\n const staged = io.readStagingFile\n ? await io.readStagingFile({\n root: root.abs,\n path: stagedRel,\n filePath: stagedAbs,\n finalAadFilePath: await resolveSafeArchiveTarget(root, relPath),\n })\n : await readFile(stagedAbs);\n if (!staged.equals(buffer)) {\n throw new EmbeddingIndexStorageError(\n `staged embedding index file ${stagedRel} does not match the incoming content; local generation preserved`\n );\n }\n }\n\n // 5. Publish with the ONE swap state machine shared with persist(). The\n // old directory moves aside wholesale, so local shards absent from\n // the incoming generation are removed by the swap — never merged.\n const localShardRels = (\n await readdir(shardDirAbs).catch((err) => {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [] as string[];\n throw err;\n })\n )\n .filter((name) => EMBEDDING_SHARD_FILE_PATTERN.test(name))\n .map((name) => `${shardDirRel}/${name}`)\n .sort();\n await store.publishSwappedGeneration(stagingAbs, fence);\n\n const writtenStates = new Map<string, OfflineSyncFileState>();\n for (const [relPath, buffer] of published) {\n writtenStates.set(relPath, {\n path: relPath,\n sha256: sha256Hex(buffer),\n bytes: buffer.length,\n mtimeMs: input.now,\n });\n }\n const removedPaths = new Set<string>(localShardRels.filter((rel) => !published.has(rel)));\n let deleted = removedPaths.size;\n let markerCleanupFailed = false;\n if ((await pathExists(markerAbs)) && !input.incomingMarker && !input.incomingMarkerPresent) {\n // Publication is already committed. Keep its base advancement even if\n // marker cleanup fails, retaining the marker in base for a retry.\n try {\n if (io.deleteFile) await io.deleteFile({ root: root.abs, path: markerRel, filePath: markerAbs });\n else await rm(markerAbs, { force: true });\n removedPaths.add(markerRel);\n deleted += 1;\n } catch (err) {\n markerCleanupFailed = true;\n log.warn(`embedding generation ${shardDirRel}: marker cleanup deferred after publish: ${err}`);\n }\n }\n return {\n shardDirRel,\n upserted: published.size,\n deleted,\n writtenStates,\n removedPaths,\n handledPaths: new Set([...published.keys(), ...removedPaths, ...(markerCleanupFailed ? [markerRel] : [])]),\n };\n } catch (err) {\n await rm(stagingAbs, { recursive: true, force: true }).catch(() => undefined);\n throw err;\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Push-side whole-generation omission\n// ---------------------------------------------------------------------------\n\nexport interface EmbeddingGenerationOmissionOptions {\n rootAbs: string;\n userExcludeRegexps?: readonly RegExp[];\n excludeFile?: OfflineSyncExcludeFile;\n /** Recorded deletion-revision paths: a tombstoned member counts as a\n * generation member for omission detection even though it is absent on\n * disk (its exclusion must omit the WHOLE generation). */\n tombstonedPaths?: readonly string[];\n /**\n * Per-path push exclusion predicate (structural + node-local defaults +\n * user regexps). Defaults to the built-in default excludes + the supplied\n * user regexps, matching the walk that consumes the result.\n */\n isExcludedRelPath?: (relPath: string) => boolean;\n}\n\nexport interface EmbeddingGenerationOmission {\n /** Existing member paths omitted because their generation is partial. */\n omittedPaths: Set<string>;\n /** Generation dirs whose members are omitted (snapshot field value). */\n omittedDirs: string[];\n}\n\n/**\n * Compute the push-side whole-generation omission set: when ANY on-disk\n * member of an embedding generation is excluded by a push filter, EVERY\n * member of that generation is omitted (issue #3148, round 4).\n */\nexport async function computeOmittedEmbeddingGenerationPaths(\n options: EmbeddingGenerationOmissionOptions\n): Promise<EmbeddingGenerationOmission> {\n const omittedPaths = new Set<string>();\n const omittedDirs: string[] = [];\n const stateDirs = [\"state\"];\n let namespaceNames: string[] = [];\n try {\n namespaceNames = (await readdir(path.join(options.rootAbs, \"namespaces\"), { withFileTypes: true }))\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n } catch {\n // no namespaces\n }\n for (const ns of namespaceNames) stateDirs.push(`namespaces/${ns}/state`);\n const isExcluded = options.isExcludedRelPath ??\n ((relPath: string) =>\n matchesOfflineSyncDefaultExclude(relPath) ||\n Boolean(options.userExcludeRegexps?.some((re) => re.test(relPath))));\n\n for (const stateDir of stateDirs) {\n const markerRel = `${stateDir}/${EMBEDDING_MARKER_BASENAME}`;\n const shardDirRel = `${stateDir}/${EMBEDDING_SHARD_DIR_BASENAME}`;\n const shardDirAbs = path.join(options.rootAbs, ...shardDirRel.split(\"/\"));\n const memberRels: string[] = [];\n if (await pathExists(path.join(options.rootAbs, ...markerRel.split(\"/\")))) {\n memberRels.push(markerRel);\n }\n let shardNames: string[] = [];\n try {\n shardNames = (await readdir(shardDirAbs, { withFileTypes: true }))\n .filter((entry) => entry.isFile() && EMBEDDING_SHARD_FILE_PATTERN.test(entry.name))\n .map((entry) => entry.name);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n for (const name of shardNames) memberRels.push(`${shardDirRel}/${name}`);\n // A tombstoned member is part of the generation even though it is\n // already absent on disk: its exclusion must omit the WHOLE generation,\n // not just drop its revision individually (codex round 6, XkFf).\n for (const tombstoned of options.tombstonedPaths ?? []) {\n const membership = embeddingGenerationMembership(tombstoned);\n if (membership?.shardDir === shardDirRel && !memberRels.includes(tombstoned)) {\n memberRels.push(tombstoned);\n }\n }\n if (memberRels.length === 0) continue;\n\n const excludedMembers: string[] = [];\n for (const relPath of memberRels) {\n let excluded = isExcluded(relPath);\n if (!excluded && options.excludeFile) {\n excluded = await options.excludeFile({\n root: options.rootAbs,\n path: relPath,\n filePath: path.join(options.rootAbs, ...relPath.split(\"/\")),\n });\n }\n if (excluded) excludedMembers.push(relPath);\n }\n if (excludedMembers.length === 0) continue;\n omittedDirs.push(shardDirRel);\n omittedPaths.add(shardDirRel); // skip new shards after the omission header\n for (const relPath of memberRels) omittedPaths.add(relPath);\n }\n return { omittedPaths, omittedDirs };\n}\n\n/** Reject an exclusion introduced after the snapshot header was computed. */\nexport async function assertEmbeddingGenerationStillIncluded(\n rootAbs: string, shardDirRel: string, excludeFile: OfflineSyncExcludeFile | undefined,\n isExcludedRelPath: (relPath: string) => boolean, tombstonedPaths: readonly string[],\n): Promise<void> {\n const current = await computeOmittedEmbeddingGenerationPaths({ rootAbs, excludeFile, isExcludedRelPath, tombstonedPaths });\n if (current.omittedDirs.includes(shardDirRel)) {\n throw new EmbeddingIndexStorageError(\n `embedding generation ${shardDirRel} became partially excluded during snapshot capture; retry with a fresh omission header`,\n );\n }\n}\n\n/** True when a path belongs to a generation the push omitted. */\nexport function isPathInOmittedEmbeddingGeneration(relPath: string, omittedDirs: ReadonlySet<string>): boolean {\n const membership = embeddingGenerationMembership(relPath);\n return membership !== null && omittedDirs.has(membership.shardDir);\n}\n\nexport type { EmbeddingIndexFile };\n\nimport { matchesOfflineSyncDefaultExclude } from \"./offline-sync-exclude-globs.js\";\nimport type { OfflineSyncDeletionRevision } from \"./offline-sync.js\";\n\nexport interface PushEmbeddingGenerationState {\n /** Generation dirs omitted by the push filters (snapshot header value). */\n omittedDirs: string[];\n /** All omitted member paths (walk skip set). */\n omittedPaths: Set<string>;\n /** Deletions with whole-generation suppression applied. */\n deletions: OfflineSyncDeletionRevision[];\n}\n\n/**\n * One-call push-side generation state for streaming snapshot builders: the\n * whole-generation omission set (from user regexps, excludeFile, and default\n * excludes) plus the deletion list with omitted-generation revisions\n * suppressed — including revisions for members that are already absent, so a\n * filtered generation can never be announced as deleted.\n */\nexport async function resolvePushEmbeddingGenerationState(options: {\n rootAbs: string;\n includeTranscripts: boolean;\n userExcludeRegexps?: readonly RegExp[];\n excludeFile?: OfflineSyncExcludeFile;\n deletions: readonly OfflineSyncDeletionRevision[];\n}): Promise<PushEmbeddingGenerationState> {\n const omission = await computeOmittedEmbeddingGenerationPaths({\n rootAbs: options.rootAbs,\n userExcludeRegexps: options.userExcludeRegexps,\n excludeFile: options.excludeFile,\n // RAW pre-filter tombstones: a deleted member's exclusion must omit the\n // whole generation even though the member is already absent on disk.\n tombstonedPaths: options.deletions.map((deletion) => deletion.path),\n isExcludedRelPath: (relPath) =>\n matchesOfflineSyncDefaultExclude(relPath) ||\n Boolean(options.userExcludeRegexps?.some((re) => re.test(relPath))),\n });\n const omittedDirs = new Set(omission.omittedDirs);\n const deletions = options.deletions.filter((deletion) => {\n if (matchesOfflineSyncDefaultExclude(deletion.path)) return false;\n if (options.userExcludeRegexps?.some((re) => re.test(deletion.path))) return false;\n const membership = embeddingGenerationMembership(deletion.path);\n if (membership && omittedDirs.has(membership.shardDir)) return false;\n return true;\n });\n return { omittedDirs: omission.omittedDirs, omittedPaths: omission.omittedPaths, deletions };\n}\n\n\ninterface StorageBackedIndexIoHost {\n readOfflineSyncFile(filePath: string, opts?: { aadFilePath?: string }): Promise<Buffer>;\n writeOfflineSyncStagingFile(\n filePath: string,\n content: Buffer,\n opts?: { aadFilePath?: string },\n ): Promise<void>;\n}\n\n/**\n * Daemon wiring for the index store IO backed by a StorageManager:\n * canonical-path secure reads/writes, so sync-published encrypted shards\n * decrypt in the daemon and daemon-written shards decrypt on sync. Shard\n * STAGING writes bind the FINAL published path.\n */\nexport function storageBackedIndexStoreIo(storage: StorageBackedIndexIoHost): EmbeddingIndexStoreIo {\n return {\n readUtf8: async (filePath) => (await storage.readOfflineSyncFile(filePath)).toString(\"utf-8\"),\n writeUtf8: (filePath, contents, opts) =>\n storage.writeOfflineSyncStagingFile(\n filePath,\n Buffer.from(contents, \"utf-8\"),\n opts?.finalAadFilePath === undefined ? undefined : { aadFilePath: opts.finalAadFilePath },\n ),\n };\n}\n\nexport interface EmbeddingGenerationRemovalInput {\n root: SafeArchiveRoot;\n /** The generation dir, e.g. `state/embeddings`. */\n shardDirRel: string;\n io: Pick<EmbeddingGenerationTransactionIo, \"deleteFile\" | \"readFile\">;\n /** Incoming deletion revisions by path, threaded so each removed member's\n * tombstone is recorded through the configured delete hook AFTER the\n * atomic empty publication (round 6: raw removal must not lose them). */\n deletionMtimeByPath?: ReadonlyMap<string, number>;\n now: number;\n /**\n * Shared-base states: when the live generation diverged from the base\n * (daemon indexed, added, or removed members after the census), the\n * removal DEFERS instead of erasing the local work (codex P1).\n */\n baseStates?: ReadonlyMap<string, { sha256: string }>;\n}\n\n/**\n * Remove a LOCAL embedding generation atomically because the remote deleted\n * it wholesale (every member has a deletion revision): recover first, then\n * demote the published directory through the store's single swap state\n * machine and delete the backup — a crash or delete failure can never leave\n * a partial same-identity generation serving silently missing memories.\n * The local legacy marker, when present, is removed through the same delete\n * hook the per-file path uses.\n */\nexport async function applyEmbeddingGenerationRemoval(\n input: EmbeddingGenerationRemovalInput,\n): Promise<EmbeddingGenerationTransactionResult> {\n const { root, shardDirRel, io } = input;\n const stateDirRel = shardDirRel.slice(0, -(`/${EMBEDDING_SHARD_DIR_BASENAME}`.length));\n const stateDirAbs = await resolveSafeArchiveTarget(root, stateDirRel);\n return await withEmbeddingGenerationLock(stateDirAbs, async (section) => {\n const lockPath = embeddingGenerationLockPath(stateDirAbs);\n const fence: EmbeddingGenerationFence = () => assertEmbeddingGenerationLockHeld(lockPath, section);\n const markerRel = `${stateDirRel}/${EMBEDDING_MARKER_BASENAME}`;\n const shardDirAbs = await resolveSafeArchiveTarget(root, shardDirRel);\n const markerAbs = await resolveSafeArchiveTarget(root, markerRel);\n const store = new EmbeddingIndexFileStore(\n markerAbs,\n shardDirAbs,\n await resolveSafeArchiveTarget(root, `${stateDirRel}/embedding-fallback-status.json`),\n );\n await store.recoverIfInterrupted(fence);\n\n // Codex P1: the deletion census is stale by the time the lock is held.\n // When the live generation no longer matches the shared base (daemon\n // indexed, added, or removed members), DEFER the removal — the local\n // work survives and a later sync re-evaluates with a fresh base.\n // No shared base (fresh catch-up) = no divergence semantics to protect.\n const baseStates = baseStatesForGeneration(input.baseStates, shardDirRel);\n if (baseStates.size > 0) {\n const localCensus = await censusGenerationState(io, root, markerRel, markerAbs, shardDirAbs, shardDirRel);\n const baseArr = [...baseStates].map(([relPath, state]) => ({ path: relPath, sha256: state.sha256 }));\n const censusArr = [...localCensus].map(([relPath, sha256]) => ({ path: relPath, sha256 }));\n const changedSinceBase =\n censusArr.some((member) => {\n // A MODIFIED member must also defer: removing the generation would\n // erase the daemon's rewrite, not just the remote's stale copy.\n const baseSha = baseStates.get(member.path)?.sha256;\n return baseSha === undefined || baseSha !== member.sha256;\n }) || baseArr.some((member) => !localCensus.has(member.path));\n if (changedSinceBase) {\n const removedPaths = new Set<string>([...localCensus.keys()]);\n log.warn(\n `embedding generation removal ${shardDirRel} deferred: disk diverged from the shared base under the mutation lock; local generation preserved`,\n );\n return {\n shardDirRel,\n upserted: 0,\n deleted: 0,\n writtenStates: new Map<string, OfflineSyncFileState>(),\n removedPaths,\n handledPaths: new Set(removedPaths),\n deferredLocalDivergence: true,\n };\n }\n }\n const localShardRels = (await readdir(shardDirAbs).catch((err) => {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [] as string[];\n throw err;\n }))\n .filter((name) => EMBEDDING_SHARD_FILE_PATTERN.test(name))\n .map((name) => `${shardDirRel}/${name}`)\n .sort();\n await store.removePublishedGeneration(fence);\n const removedPaths = new Set(localShardRels);\n let deleted = removedPaths.size;\n const markerPresent = await pathExists(markerAbs);\n if (markerPresent) {\n removedPaths.add(markerRel);\n deleted += 1;\n }\n // Preserve the replicated tombstones through the configured hooks AFTER\n // the atomic publication: raw removal must not lose the deletion\n // revisions, or a downstream sync without base evidence retains stale\n // entries. EVERY member (shards and marker) is recorded exactly ONCE with\n // the remote revision when known, so a first hook call without a revision\n // is never overwritten by an older replicated one. The storage hook\n // tolerates already-absent paths.\n let firstError: unknown = null;\n for (const relPath of removedPaths) {\n const memberAbs = relPath === markerRel ? markerAbs : await resolveSafeArchiveTarget(root, relPath);\n const mtimeMs = input.deletionMtimeByPath?.get(relPath) ?? input.now;\n if (io.deleteFile) {\n try {\n await io.deleteFile({\n root: root.abs,\n path: relPath,\n filePath: await resolveSafeArchiveTarget(root, relPath),\n mtimeMs,\n });\n } catch (err) {\n firstError ??= err;\n log.warn(`embedding generation removal: tombstone recording failed for ${relPath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n } else if (relPath === markerRel && markerPresent) {\n await rm(markerAbs, { force: true });\n }\n }\n if (firstError) throw firstError;\n return {\n shardDirRel,\n upserted: 0,\n deleted,\n writtenStates: new Map(),\n removedPaths,\n handledPaths: new Set(removedPaths),\n };\n });\n}\n\n/** Defer a whole generation when the shared remote base would erase a local change. */\nexport function divergedEmbeddingGenerationDeferrals(options: {\n incomingFiles: readonly { path: string; sha256: string }[];\n baseFiles: readonly { path: string; sha256: string }[];\n currentFiles: readonly { path: string; sha256: string }[];\n}): string[] {\n const base = new Map(options.baseFiles.map((f) => [f.path, f.sha256]));\n const current = new Map(options.currentFiles.map((f) => [f.path, f.sha256]));\n const incomingByPath = new Map(options.incomingFiles.map((f) => [f.path, f.sha256]));\n const sharedDirs = new Set(options.baseFiles.map((f) => embeddingGenerationMembership(f.path)?.shardDir));\n const conflictedDirs = new Set<string>();\n for (const relPath of new Set([...base.keys(), ...current.keys(), ...incomingByPath.keys()])) {\n const membership = embeddingGenerationMembership(relPath);\n // Without a shared generation base this is an initial remote-authoritative\n // import, not evidence of local indexing after a synchronized snapshot.\n if (!membership || !sharedDirs.has(membership.shardDir)) continue;\n const currentSha = current.get(relPath);\n if (currentSha !== base.get(relPath) && currentSha !== incomingByPath.get(relPath)) {\n conflictedDirs.add(membership.shardDir);\n }\n }\n if (conflictedDirs.size === 0) return [];\n const deferred: string[] = [];\n // Include local/base members too: an all-absent remote generation still\n // needs a concrete deferral so its removal cannot erase a local change.\n for (const relPath of new Set([...base.keys(), ...current.keys(), ...incomingByPath.keys()])) {\n const membership = embeddingGenerationMembership(relPath);\n if (membership && conflictedDirs.has(membership.shardDir)) deferred.push(relPath);\n }\n return deferred.sort((left, right) => left.localeCompare(right));\n}\n"],"mappings":"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","names":["removedPaths"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/access-mcp-output-schemas.ts"],"sourcesContent":["/**\n * Output-schema registry for MCP tools — extracted from access-mcp.ts to\n * keep that file under the 3000-LOC structural ratchet.\n *\n * Contains the per-suffix JSON-Schema declarations (derived from\n * production TS return contracts) and the application helper that\n * assigns schemas to tool objects.\n */\n\nconst T_STRING = { type: \"string\" } as const;\nconst T_NUMBER = { type: \"number\" } as const;\nconst T_BOOLEAN = { type: \"boolean\" } as const;\nconst T_ARRAY = { type: \"array\" } as const;\nconst T_OBJECT = { type: \"object\" } as const;\nconst T_NULLABLE_OBJECT = { type: [\"object\", \"null\"] } as const;\nconst T_NULLABLE_STRING = { type: [\"string\", \"null\"] } as const;\n\n/** Build a JSON Schema object type with the given properties. */\nfunction objectSchema(\n properties: Record<string, Readonly<Record<string, unknown>>>,\n required?: readonly string[]\n): Record<string, unknown> {\n return {\n type: \"object\",\n properties,\n ...(required && required.length > 0 ? { required } : {}),\n additionalProperties: true,\n };\n}\n\n/** RecallNavigationResult-shaped schema — shared by memory_expand/memory_traverse. */\nfunction navigationResultSchema(): Record<string, unknown> {\n return objectSchema(\n {\n ok: T_BOOLEAN,\n action: T_STRING,\n memoryId: T_STRING,\n namespace: T_STRING,\n items: T_ARRAY,\n truncated: T_BOOLEAN,\n budget: objectSchema({ chars: T_NUMBER, used: T_NUMBER }),\n disclosureSpend: objectSchema({\n chunk: objectSchema({ count: T_NUMBER, estimatedTokens: T_NUMBER }),\n section: objectSchema({ count: T_NUMBER, estimatedTokens: T_NUMBER }),\n raw: objectSchema({ count: T_NUMBER, estimatedTokens: T_NUMBER }),\n unspecified: objectSchema({ count: T_NUMBER, estimatedTokens: T_NUMBER }),\n }),\n error: T_NULLABLE_STRING,\n message: T_NULLABLE_STRING,\n rendered: T_STRING,\n },\n [\"ok\", \"action\", \"rendered\"]\n );\n}\n\n/** MemoryStoreBrowseResult-shaped schema — shared by memory_ls/tree/find. */\nfunction browseResultSchema(): Record<string, unknown> {\n return objectSchema(\n {\n ok: T_BOOLEAN,\n verb: T_STRING,\n namespace: T_STRING,\n path: T_STRING,\n total: T_NUMBER,\n entries: T_ARRAY,\n truncated: T_BOOLEAN,\n rendered: T_STRING,\n error: T_NULLABLE_STRING,\n message: T_NULLABLE_STRING,\n },\n [\"ok\", \"verb\", \"rendered\"],\n );\n}\n\n/**\n * Per-suffix outputSchema registry. Tools not present here fall back to\n * `{ type: \"object\", additionalProperties: true }` in the constructor pass.\n * The `chatgpt_memory_inspector` tool ships its own precise schema and is\n * intentionally absent — the apply pass skips tools that already have one.\n */\nconst TOOL_OUTPUT_SCHEMAS: Readonly<Record<string, Record<string, unknown>>> = {\n recall: objectSchema({\n query: T_STRING,\n namespace: T_STRING,\n context: T_STRING,\n contextComposition: objectSchema({\n context: T_STRING,\n footer: T_STRING,\n degradation: objectSchema({\n state: T_STRING,\n reason: T_STRING,\n detail: T_STRING,\n budget: objectSchema({\n contextBudget: T_NUMBER,\n fullChars: T_NUMBER,\n deliveredChars: T_NUMBER,\n }),\n }),\n }),\n count: T_NUMBER,\n memoryIds: T_ARRAY,\n results: T_ARRAY,\n fallbackUsed: T_BOOLEAN,\n sourcesUsed: T_ARRAY,\n retrievalFailure: objectSchema({\n reason: T_STRING,\n detail: T_STRING,\n }),\n }),\n recall_explain: objectSchema({\n found: T_BOOLEAN,\n snapshot: T_OBJECT,\n intent: T_NULLABLE_OBJECT,\n graph: T_NULLABLE_OBJECT,\n }),\n recall_tier_explain: objectSchema({ snapshotFound: T_BOOLEAN, tierExplain: T_NULLABLE_OBJECT }),\n recall_xray: objectSchema({ snapshotFound: T_BOOLEAN, snapshot: T_OBJECT }),\n recall_why: objectSchema({ reportFound: T_BOOLEAN, report: T_OBJECT, summary: T_STRING }),\n who_knows: objectSchema({ topic: T_STRING, results: T_ARRAY }),\n promotion_candidates: objectSchema({ namespace: T_STRING, targetNamespace: T_STRING, candidates: T_ARRAY }),\n set_coding_context: objectSchema({ ok: T_BOOLEAN }),\n wearables_status: objectSchema({\n enabled: T_BOOLEAN,\n timezone: T_STRING,\n sources: T_ARRAY,\n connectorsInstalled: T_ARRAY,\n }),\n wearables_sync: objectSchema({ summaries: T_ARRAY }, [\"summaries\"]),\n transcript_day: objectSchema({ transcripts: T_ARRAY }, [\"transcripts\"]),\n transcript_search: objectSchema({ results: T_ARRAY }, [\"results\"]),\n transcript_memories: objectSchema({ memories: T_ARRAY }, [\"memories\"]),\n location_status: objectSchema({ enabled: T_BOOLEAN, timezone: T_STRING, sources: T_ARRAY, recentDays: T_ARRAY }),\n location_check: objectSchema({ results: T_ARRAY }, [\"results\"]),\n location_sync: objectSchema({ days: T_ARRAY }, [\"days\"]),\n location_backfill: objectSchema({ days: T_ARRAY }, [\"days\"]),\n location_day: objectSchema({ date: T_STRING, found: T_BOOLEAN, sources: T_ARRAY, observationCount: T_NUMBER }),\n meetings_list: objectSchema({ enabled: T_BOOLEAN, days: T_ARRAY }),\n meetings_get: objectSchema({ enabled: T_BOOLEAN, found: T_BOOLEAN, id: T_STRING, record: T_NULLABLE_STRING }),\n meetings_build: objectSchema({\n date: T_STRING,\n enabled: T_BOOLEAN,\n meetings: T_ARRAY,\n built: T_NUMBER,\n skipped: T_NUMBER,\n removed: T_ARRAY,\n }),\n deep_recall: objectSchema(\n { ok: T_BOOLEAN, error: T_NULLABLE_STRING, entries: T_ARRAY, trace: T_ARRAY, rendered: T_STRING },\n [\"entries\", \"trace\"]\n ),\n // RecallNavigationResult union (recall-navigation.ts): success carries\n // items/budget/disclosureSpend; error carries error/message. ok/action/\n // rendered are the fields every variant returns.\n memory_expand: navigationResultSchema(),\n memory_traverse: navigationResultSchema(),\n // MemoryStoreBrowseResult union (memory-browse.ts): success carries\n // entries/total/truncated; typed refusals carry error/message. ok/verb/\n // rendered are the fields every variant returns.\n memory_ls: browseResultSchema(),\n memory_tree: browseResultSchema(),\n memory_find: browseResultSchema(),\n standup: objectSchema({\n date: T_STRING,\n yesterday: T_STRING,\n today: T_STRING,\n highlights: T_ARRAY,\n priorities: T_ARRAY,\n blockers: T_ARRAY,\n activityGrid: T_STRING,\n markdown: T_STRING,\n }),\n action_confidence: objectSchema({\n schemaVersion: T_NUMBER,\n decision: T_STRING,\n confidence: T_NUMBER,\n risk: T_STRING,\n contextReadiness: T_STRING,\n intendedAction: T_STRING,\n attentionPolicy: T_STRING,\n principle: T_STRING,\n reasons: T_ARRAY,\n blockers: T_ARRAY,\n factors: T_ARRAY,\n retrievedMemoryCount: T_NUMBER,\n scopeMismatchCount: T_NUMBER,\n safeToAct: T_BOOLEAN,\n }),\n day_summary: objectSchema({\n summary: T_STRING,\n bullets: T_ARRAY,\n next_actions: T_ARRAY,\n risks_or_open_loops: T_ARRAY,\n }),\n capsule_export: objectSchema({\n archivePath: T_STRING,\n manifestPath: T_STRING,\n encryptedArchivePath: T_NULLABLE_STRING,\n manifest: T_OBJECT,\n }),\n capsule_import: objectSchema({ imported: T_ARRAY, skipped: T_ARRAY, manifest: T_OBJECT }),\n capsule_list: objectSchema({ namespace: T_STRING, capsulesDir: T_STRING, capsules: T_ARRAY }),\n entity_synthesis_run: objectSchema({\n namespace: T_STRING,\n requested: T_NUMBER,\n processed: T_NUMBER,\n remaining: T_NUMBER,\n }),\n memory_governance_run: objectSchema({\n namespace: T_STRING,\n runId: T_STRING,\n traceId: T_STRING,\n mode: T_STRING,\n reviewQueueCount: T_NUMBER,\n proposedActionCount: T_NUMBER,\n appliedActionCount: T_NUMBER,\n summaryPath: T_STRING,\n reportPath: T_STRING,\n }),\n procedure_mining_run: objectSchema({ namespace: T_STRING, clustersProcessed: T_NUMBER, proceduresWritten: T_NUMBER }),\n pattern_reinforcement_run: objectSchema({\n namespace: T_STRING,\n ran: T_BOOLEAN,\n clustersFound: T_NUMBER,\n canonicalsUpdated: T_NUMBER,\n duplicatesSuperseded: T_NUMBER,\n }),\n procedural_stats: objectSchema({ namespace: T_STRING, counts: T_OBJECT, recent: T_OBJECT }),\n procedure_library_maintenance: objectSchema({\n enabled: T_BOOLEAN,\n namespace: T_STRING,\n report: T_OBJECT,\n }),\n memory_get: objectSchema({ found: T_BOOLEAN, namespace: T_STRING, memory: T_NULLABLE_OBJECT }),\n memory_timeline: objectSchema({ found: T_BOOLEAN, namespace: T_STRING, count: T_NUMBER, timeline: T_ARRAY }),\n memory_store: objectSchema({\n schemaVersion: T_NUMBER,\n operation: T_STRING,\n namespace: T_STRING,\n dryRun: T_BOOLEAN,\n accepted: T_BOOLEAN,\n queued: T_BOOLEAN,\n status: T_STRING,\n memoryId: T_STRING,\n }),\n suggestion_submit: objectSchema({\n schemaVersion: T_NUMBER,\n operation: T_STRING,\n namespace: T_STRING,\n dryRun: T_BOOLEAN,\n accepted: T_BOOLEAN,\n queued: T_BOOLEAN,\n status: T_STRING,\n memoryId: T_STRING,\n }),\n entity_get: objectSchema({ found: T_BOOLEAN, namespace: T_STRING, entity: T_NULLABLE_OBJECT }),\n review_queue_list: objectSchema({ found: T_BOOLEAN, runId: T_STRING, reviewQueue: T_ARRAY }),\n observe: objectSchema({\n accepted: T_NUMBER,\n sessionKey: T_STRING,\n namespace: T_STRING,\n effectiveNamespace: T_STRING,\n lcmArchived: T_BOOLEAN,\n extractionQueued: T_BOOLEAN,\n transcriptPersisted: T_BOOLEAN,\n }),\n lcm_search: objectSchema({\n query: T_STRING,\n namespace: T_STRING,\n results: T_ARRAY,\n count: T_NUMBER,\n lcmEnabled: T_BOOLEAN,\n }),\n lcm_compaction_flush: objectSchema({\n enabled: T_BOOLEAN,\n flushed: T_BOOLEAN,\n sessionKey: T_STRING,\n namespace: T_STRING,\n }),\n extraction_force_flush: objectSchema({\n flushed: T_BOOLEAN,\n sessionKey: T_STRING,\n namespace: T_STRING,\n effectiveNamespace: T_STRING,\n }),\n lcm_compaction_record: objectSchema({\n enabled: T_BOOLEAN,\n recorded: T_BOOLEAN,\n sessionKey: T_STRING,\n namespace: T_STRING,\n }),\n continuity_audit_generate: objectSchema({ enabled: T_BOOLEAN, period: T_STRING, reportPath: T_STRING }),\n continuity_incident_open: objectSchema({ created: T_BOOLEAN, incident: T_NULLABLE_OBJECT }),\n continuity_incident_close: objectSchema({ closed: T_BOOLEAN, incident: T_NULLABLE_OBJECT }),\n continuity_incident_list: objectSchema({ incidents: T_ARRAY }),\n continuity_loop_add_or_update: objectSchema({ saved: T_BOOLEAN, loop: T_NULLABLE_OBJECT }),\n continuity_loop_review: objectSchema({ reviewed: T_BOOLEAN, loop: T_NULLABLE_OBJECT }),\n identity_anchor_get: objectSchema({ found: T_BOOLEAN, anchor: T_NULLABLE_STRING }),\n identity_anchor_update: objectSchema({ updated: T_BOOLEAN, sections: T_ARRAY }),\n memory_identity: objectSchema({ found: T_BOOLEAN, identity: T_NULLABLE_STRING, message: T_STRING }),\n work_task: objectSchema({\n action: T_STRING,\n task: T_NULLABLE_OBJECT,\n tasks: T_ARRAY,\n count: T_NUMBER,\n deleted: T_BOOLEAN,\n }),\n work_project: objectSchema({\n action: T_STRING,\n project: T_NULLABLE_OBJECT,\n projects: T_ARRAY,\n count: T_NUMBER,\n deleted: T_BOOLEAN,\n }),\n work_board: objectSchema({ action: T_STRING, markdown: T_STRING, snapshot: T_OBJECT, result: T_OBJECT }),\n shared_context_write_output: objectSchema({ written: T_BOOLEAN, path: T_STRING }),\n shared_feedback_record: objectSchema({ recorded: T_BOOLEAN }),\n shared_priorities_append: objectSchema({ appended: T_BOOLEAN }),\n shared_context_cross_signals_run: objectSchema({\n crossSignalsMarkdownPath: T_STRING,\n crossSignalsPath: T_STRING,\n sourceCount: T_NUMBER,\n feedbackCount: T_NUMBER,\n overlapCount: T_NUMBER,\n }),\n shared_context_curate_daily: objectSchema({\n roundtablePath: T_STRING,\n crossSignalsMarkdownPath: T_STRING,\n crossSignalsPath: T_STRING,\n overlapCount: T_NUMBER,\n }),\n compounding_weekly_synthesize: objectSchema({\n weekId: T_STRING,\n reportPath: T_STRING,\n reportJsonPath: T_STRING,\n rubricsPath: T_STRING,\n rubricsIndexPath: T_STRING,\n mistakesCount: T_NUMBER,\n promotionCandidateCount: T_NUMBER,\n }),\n compounding_promote_candidate: objectSchema({\n enabled: T_BOOLEAN,\n dryRun: T_BOOLEAN,\n weekId: T_STRING,\n promoted: T_ARRAY,\n skipped: T_ARRAY,\n tombstoneBlocked: T_ARRAY,\n }),\n compression_guidelines_optimize: objectSchema({\n enabled: T_BOOLEAN,\n dryRun: T_BOOLEAN,\n eventCount: T_NUMBER,\n nextGuidelineVersion: T_NUMBER,\n changedRules: T_NUMBER,\n semanticRefinementApplied: T_BOOLEAN,\n persisted: T_BOOLEAN,\n }),\n compression_guidelines_activate: objectSchema({\n enabled: T_BOOLEAN,\n activated: T_BOOLEAN,\n guidelineVersion: { type: [\"number\", \"null\"] } as const,\n }),\n memory_search: objectSchema({ query: T_STRING, results: T_ARRAY, count: T_NUMBER }),\n external_wiki_search: objectSchema(\n {\n query: T_STRING,\n hits: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n wikiId: T_STRING,\n title: T_STRING,\n path: T_STRING,\n snippet: T_STRING,\n score: T_NUMBER,\n rank: T_NUMBER,\n citations: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n path: T_STRING,\n lineStart: T_NUMBER,\n lineEnd: T_NUMBER,\n note: T_STRING,\n },\n required: [\"path\", \"lineStart\", \"lineEnd\", \"note\"],\n additionalProperties: false,\n },\n },\n indexBlurb: T_STRING,\n },\n required: [\"wikiId\", \"title\", \"path\", \"snippet\", \"score\", \"rank\", \"citations\"],\n additionalProperties: false,\n },\n },\n count: T_NUMBER,\n degradedWikiIds: T_ARRAY,\n },\n [\"query\", \"hits\", \"count\", \"degradedWikiIds\"]\n ),\n memory_profile: objectSchema({ profile: T_STRING }),\n memory_entities_list: objectSchema({ entities: T_ARRAY, count: T_NUMBER }),\n memory_questions: objectSchema({ questions: T_ARRAY, count: T_NUMBER }),\n memory_last_recall: objectSchema({\n sessionKey: T_STRING,\n recordedAt: T_STRING,\n queryHash: T_STRING,\n queryLen: T_NUMBER,\n memoryIds: T_ARRAY,\n namespace: T_STRING,\n recallNamespaces: T_ARRAY,\n plannerMode: T_STRING,\n requestedMode: T_STRING,\n source: T_STRING,\n fallbackUsed: T_BOOLEAN,\n sourcesUsed: T_ARRAY,\n latencyMs: T_NUMBER,\n includedMemories: T_ARRAY,\n message: T_NULLABLE_STRING,\n }),\n memory_intent_debug: objectSchema({\n recordedAt: T_STRING,\n promptHash: T_STRING,\n promptLength: T_NUMBER,\n retrievalQueryHash: T_STRING,\n retrievalQueryLength: T_NUMBER,\n plannerEnabled: T_BOOLEAN,\n plannedMode: T_STRING,\n effectiveMode: T_STRING,\n recallResultLimit: T_NUMBER,\n queryIntent: T_OBJECT,\n graphExpandedIntentDetected: T_BOOLEAN,\n graphDecision: T_OBJECT,\n message: T_NULLABLE_STRING,\n }),\n memory_qmd_debug: objectSchema({\n recordedAt: T_STRING,\n queryHash: T_STRING,\n queryLength: T_NUMBER,\n collection: T_STRING,\n namespaces: T_ARRAY,\n fetchLimit: T_NUMBER,\n primaryResultCount: T_NUMBER,\n hybridResultCount: T_NUMBER,\n queryAwareSeedCount: T_NUMBER,\n resultCount: T_NUMBER,\n intentHint: T_STRING,\n explainEnabled: T_BOOLEAN,\n hybridTopUpUsed: T_BOOLEAN,\n hybridTopUpSkippedReason: T_STRING,\n results: T_ARRAY,\n message: T_NULLABLE_STRING,\n }),\n memory_graph_explain: objectSchema({ explanation: T_STRING }),\n graph_snapshot: objectSchema({ nodes: T_ARRAY, edges: T_ARRAY }),\n memory_feedback: objectSchema({ recorded: T_BOOLEAN, enabled: T_BOOLEAN }),\n memory_promote: objectSchema({ promoted: T_BOOLEAN, memoryId: T_STRING }),\n memory_outcome: objectSchema({\n ok: T_BOOLEAN,\n memoryId: T_STRING,\n mw_success: T_NUMBER,\n mw_fail: T_NUMBER,\n reason: T_STRING,\n message: T_STRING,\n }),\n memory_action_apply: objectSchema({ recorded: T_BOOLEAN, event: T_OBJECT }),\n context_checkpoint: objectSchema({ saved: T_BOOLEAN }),\n briefing: objectSchema({\n markdown: T_STRING,\n json: T_OBJECT,\n window: T_OBJECT,\n format: T_STRING,\n namespace: T_STRING,\n }),\n review_list: objectSchema({ pairs: T_ARRAY, total: T_NUMBER, durationMs: T_NUMBER }),\n review_resolve: objectSchema({ pairId: T_STRING, verb: T_STRING, affectedIds: T_ARRAY, message: T_STRING }),\n contradiction_scan_run: objectSchema({\n scanned: T_NUMBER,\n candidates: T_NUMBER,\n judged: T_NUMBER,\n queued: T_NUMBER,\n cooledDown: T_NUMBER,\n elapsedMs: T_NUMBER,\n }),\n preference_drift_scan: objectSchema({\n schemaVersion: T_NUMBER,\n generatedAt: T_STRING,\n mode: T_STRING,\n namespace: T_STRING,\n scanned: T_NUMBER,\n eligible: T_NUMBER,\n findings: T_ARRAY,\n counts: T_OBJECT,\n appliedCount: T_NUMBER,\n reviewItemsOpened: T_NUMBER,\n elapsedMs: T_NUMBER,\n skippedReason: T_STRING,\n }),\n memory_summarize_hourly: objectSchema({\n ok: T_BOOLEAN,\n message: T_STRING,\n sessionsConsidered: T_NUMBER,\n sessionsWithEntries: T_NUMBER,\n summariesWritten: T_NUMBER,\n staleStore: T_BOOLEAN,\n newestEntryTimestamp: T_NULLABLE_STRING,\n scanFailed: T_BOOLEAN,\n warning: T_STRING,\n }),\n conversation_index_update: objectSchema({\n enabled: T_BOOLEAN,\n sessions: T_NUMBER,\n chunks: T_NUMBER,\n skipped: T_NUMBER,\n embeddedRuns: T_NUMBER,\n }),\n profiling_report: objectSchema({\n enabled: T_BOOLEAN,\n format: T_STRING,\n traces: T_ARRAY,\n stats: T_OBJECT,\n bottleneck: T_NULLABLE_STRING,\n }),\n graph_edge_decay_run: objectSchema({ ranAt: T_STRING, disabled: T_BOOLEAN, reason: T_STRING, results: T_ARRAY }),\n live_connectors_run: objectSchema({\n ranAt: T_STRING,\n force: T_BOOLEAN,\n totalDocsImported: T_NUMBER,\n ranCount: T_NUMBER,\n skippedCount: T_NUMBER,\n errorCount: T_NUMBER,\n results: T_ARRAY,\n }),\n peer_list: objectSchema({ peers: T_ARRAY }),\n peer_get: objectSchema({ found: T_BOOLEAN, peer: T_NULLABLE_OBJECT }),\n peer_set: objectSchema({ ok: T_BOOLEAN, created: T_BOOLEAN, peer: T_OBJECT }),\n peer_delete: objectSchema({ ok: T_BOOLEAN, deleted: T_BOOLEAN }),\n peer_profile_get: objectSchema({\n found: T_BOOLEAN,\n profile: {\n type: \"object\",\n properties: {\n peerId: T_STRING,\n updatedAt: T_STRING,\n fields: { type: \"object\", additionalProperties: T_STRING },\n provenance: {\n type: \"object\",\n additionalProperties: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n observedAt: T_STRING,\n signal: T_STRING,\n sourceSessionId: T_STRING,\n note: T_STRING,\n },\n required: [\"observedAt\", \"signal\"],\n additionalProperties: true,\n },\n },\n },\n },\n required: [\"peerId\", \"updatedAt\", \"fields\", \"provenance\"],\n additionalProperties: true,\n },\n }),\n peer_forget: objectSchema({ ok: T_BOOLEAN, purged: T_BOOLEAN }),\n console_state: objectSchema({\n capturedAt: T_STRING,\n bufferState: T_OBJECT,\n extractionQueue: T_OBJECT,\n dedupRecent: T_ARRAY,\n maintenanceLedgerTail: T_ARRAY,\n qmdProbe: T_OBJECT,\n daemon: T_OBJECT,\n embeddingIndex: T_OBJECT,\n errors: T_ARRAY,\n }),\n dreams_status: objectSchema({ phases: T_OBJECT, windowStart: T_STRING, windowEnd: T_STRING }),\n dreams_run: objectSchema({ phase: T_STRING, durationMs: T_NUMBER, itemsProcessed: T_NUMBER }),\n coding_decision: objectSchema({\n subcommand: T_STRING,\n records: T_ARRAY,\n count: T_NUMBER,\n found: T_BOOLEAN,\n memoryId: T_STRING,\n status: T_STRING,\n supersededMemoryId: T_STRING,\n replacementMemoryId: T_STRING,\n }),\n coding_architecture: objectSchema({\n subcommand: T_STRING,\n found: T_BOOLEAN,\n refreshed: T_BOOLEAN,\n memoryId: T_STRING,\n }),\n coding_delta: objectSchema({\n subcommand: T_STRING,\n ok: T_BOOLEAN,\n kind: T_STRING,\n delta: T_OBJECT,\n nextState: T_OBJECT,\n }),\n memory_correct_plan: objectSchema({\n planId: T_STRING,\n namespace: T_STRING,\n diff: T_STRING,\n actions: T_ARRAY,\n confidence: T_NUMBER,\n }),\n memory_correct_apply: objectSchema({\n planId: T_STRING,\n status: T_STRING,\n results: T_ARRAY,\n auditMemoryId: T_STRING,\n appliedAt: T_STRING,\n }),\n memory_chat: objectSchema({\n reply: T_STRING,\n chatSessionId: T_STRING,\n pendingPlan: {\n type: \"object\",\n properties: { planId: T_STRING, preview: T_STRING },\n required: [\"planId\", \"preview\"],\n additionalProperties: true,\n },\n skippedTools: { type: \"array\", items: T_STRING },\n }),\n codegraph_index: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_list_projects: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_delete_project: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_index_status: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_search_graph: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_trace_path: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_detect_changes: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_query_graph: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_get_schema: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_get_snippet: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_get_architecture: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_search_code: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_manage_adr: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_ingest_traces: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n};\n\n/**\n * Apply outputSchema from the registry to every tool that lacks one.\n * Suffix resolution strips the canonical or legacy prefix so both\n * `remnic_*` and `engram.*` aliases inherit the same schema.\n * Tools that already have an explicit outputSchema are skipped.\n */\nexport function applyToolOutputSchemas<T extends { name: string; outputSchema?: unknown }>(\n tools: ReadonlyArray<T>,\n canonicalPrefix: string,\n legacyPrefix: string\n): T[] {\n return tools.map((tool) => {\n if (tool.outputSchema) return tool;\n const name = tool.name as string;\n const suffix = name.startsWith(canonicalPrefix)\n ? name.slice(canonicalPrefix.length)\n : name.startsWith(legacyPrefix)\n ? name.slice(legacyPrefix.length)\n : name;\n return { ...tool, outputSchema: TOOL_OUTPUT_SCHEMAS[suffix] ?? { type: \"object\", additionalProperties: true } };\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/offline-sync.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport {\n lstat,\n mkdir,\n open,\n readdir,\n readFile,\n rename,\n rm,\n stat,\n unlink,\n utimes,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n DEFAULT_TRANSFER_EXCLUDE_DIRS,\n} from \"./transfer/exclusions.js\";\nimport {\n prepareSafeArchiveRoot,\n resolveSafeArchiveTarget,\n sha256Bytes,\n validateArchiveRelativePath,\n type SafeArchiveRoot,\n} from \"./transfer/fs-utils.js\";\nimport { parseFlexibleIsoTimestamp } from \"./utils/iso-timestamp.js\";\nimport { EmbeddingIndexStorageError } from \"./embedding-index-storage.js\";\nimport { matchesOfflineSyncDefaultExclude } from \"./offline-sync-exclude-globs.js\";\nimport {\n EMBEDDING_SHARD_DIR_BASENAME,\n applyEmbeddingGenerationRemoval,\n applyEmbeddingGenerationTransaction,\n assertEmbeddingGenerationStillIncluded,\n computeOmittedEmbeddingGenerationPaths,\n detectIncomingEmbeddingGenerations,\n divergedEmbeddingGenerationDeferrals,\n embeddingGenerationMembership,\n embeddingMarkerDirOf,\n embeddingShardDirOf,\n isEmbeddingGenerationDirPath,\n isPathInOmittedEmbeddingGeneration,\n type EmbeddingGenerationTransactionIo,\n type EmbeddingGenerationTransactionResult,\n} from \"./offline-sync-embedding-generation.js\";\nimport { withEmbeddingGenerationLock, withEmbeddingGenerationLockIter } from \"./embedding-generation-lock.js\";\nimport {\n isCanonicalRuntimeStatePath,\n shouldDeleteAbsentIncomingOfflineRuntimeFile,\n shouldPreferIncomingOfflineRuntimeFile,\n} from \"./offline-sync-runtime-state.js\";\nexport { shouldPreferIncomingOfflineRuntimeFile } from \"./offline-sync-runtime-state.js\";\nexport { computeOmittedEmbeddingGenerationPaths } from \"./offline-sync-embedding-generation.js\";\nexport {\n compileOfflineSyncExcludeGlobs,\n globToRegExp,\n parseOfflineSyncExcludes,\n} from \"./offline-sync-exclude-globs.js\";\nimport {\n isEncryptedOfflineSyncFile,\n readPlainOfflineSyncFileChunk,\n sha256OfflineSyncFile,\n shouldExcludeOfflineSyncFile,\n type OfflineSyncExcludeFile,\n type OfflineSyncFileTarget,\n plainFileDigest,\n SYNC_INTERNAL_DIR,\n setSafeFileMtime,\n assertNonNegativeFinite,\n assertOfflineSyncMtimeMs,\n OFFLINE_SYNC_FAST_BASE_MTIME_TOLERANCE_MS,\n} from \"./offline-sync-file-io.js\";\nimport { CENSUS_MAX_MTIME_MS, isSha256Hex } from \"./census-validation.js\";\nimport {\n cleanupOfflineUpload,\n digestOfflineUploadStagingContent,\n pruneOfflineUploadStaging,\n writeOfflineUploadChunk,\n writeSafeFileFromUpload,\n hashText,\n} from \"./offline-sync-upload-staging.js\";\nexport type { OfflineSyncExcludeFile, OfflineSyncFileTarget } from \"./offline-sync-file-io.js\";\n\nexport const OFFLINE_SYNC_SNAPSHOT_FORMAT = \"remnic.offline-sync.snapshot.v1\";\nexport const OFFLINE_SYNC_CHANGESET_FORMAT = \"remnic.offline-sync.changeset.v1\";\nexport const OFFLINE_SYNC_STATE_VERSION = 1;\nexport const OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES = 64 * 1024 * 1024;\nexport const OFFLINE_SYNC_FILE_CONTENT_TRANSFER_CHUNK_BYTES = 8 * 1024 * 1024;\nexport const OFFLINE_SYNC_APPLY_MAX_BODY_BYTES = 16 * 1024 * 1024;\nexport const OFFLINE_SYNC_SNAPSHOT_BASE_MAX_BODY_BYTES = 64 * 1024 * 1024;\nexport const OFFLINE_SYNC_MAX_MTIME_MS = CENSUS_MAX_MTIME_MS;\n\nexport interface OfflineSyncFileState {\n path: string;\n sha256: string;\n /** Byte length of the transferable content, after any readFile hook such as secure-store decryption. */\n bytes: number;\n mtimeMs: number;\n}\n\nexport interface OfflineSyncFileRecord extends OfflineSyncFileState {\n contentBase64?: string;\n}\n\nexport interface OfflineSyncFileDigest {\n sha256: string;\n bytes: number;\n}\n\nexport interface OfflineSyncDeletionRevision {\n path: string;\n mtimeMs: number;\n}\n\nexport interface OfflineSyncSnapshot {\n format: typeof OFFLINE_SYNC_SNAPSHOT_FORMAT;\n schemaVersion: 1;\n createdAt: string;\n sourceId: string;\n includeTranscripts: boolean;\n files: OfflineSyncFileRecord[];\n deletions?: OfflineSyncDeletionRevision[];\n /**\n * Embedding generation dirs whose on-disk members were ALL omitted from\n * `files` because a push filter excluded at least one member (PR #3148\n * round 4). Their absence here is NOT a delete instruction: a receiver\n * keeps its local copy and its base entries until the generation is\n * pushed unfiltered or genuinely deleted with deletion metadata.\n */\n omittedEmbeddingGenerationDirs?: string[];\n}\n\nexport type OfflineSyncChange =\n | {\n type: \"upsert\";\n path: string;\n baseSha256?: string;\n file: OfflineSyncFileRecord & { contentBase64: string };\n }\n | {\n type: \"delete\";\n path: string;\n baseSha256: string;\n mtimeMs?: number;\n };\n\nexport interface OfflineSyncChangeset {\n format: typeof OFFLINE_SYNC_CHANGESET_FORMAT;\n schemaVersion: 1;\n createdAt: string;\n sourceId: string;\n includeTranscripts: boolean;\n changes: OfflineSyncChange[];\n}\n\nexport interface OfflineSyncState {\n version: typeof OFFLINE_SYNC_STATE_VERSION;\n remoteId: string;\n namespace?: string;\n includeTranscripts: boolean;\n lastSyncedAt: string;\n baseFiles: OfflineSyncFileState[];\n}\n\nexport interface OfflineSyncConflict {\n path: string;\n reason:\n | \"both_modified\"\n | \"local_deleted_remote_modified\"\n | \"local_modified_remote_deleted\"\n | \"remote_exists_for_local_create\"\n | \"remote_changed_for_local_update\"\n | \"remote_deleted_for_local_update\"\n | \"remote_changed_for_local_delete\";\n baseSha256?: string;\n localSha256?: string;\n incomingSha256?: string;\n conflictPath?: string;\n}\n\nexport interface OfflineSyncApplySnapshotResult {\n upserted: number;\n deleted: number;\n skipped: number;\n pendingLocal: number;\n conflicts: OfflineSyncConflict[];\n nextBaseFiles: OfflineSyncFileState[];\n}\n\nexport interface OfflineSyncApplyChangesetResult {\n appliedUpserts: number;\n appliedDeletes: number;\n skipped: number;\n conflicts: OfflineSyncConflict[];\n currentFiles: OfflineSyncFileState[];\n currentFilesComplete?: boolean;\n}\n\nexport interface OfflineSyncChangesetSummary {\n upserts: number;\n deletes: number;\n total: number;\n}\n\nexport interface OfflineSyncFileDeleteTarget extends OfflineSyncFileTarget {\n mtimeMs?: number;\n}\n\nexport type OfflineSyncRecordDeletionRevision = (\n target: OfflineSyncFileDeleteTarget & { mtimeMs: number },\n) => Promise<void>;\n\nexport interface OfflineSyncFileWriteTarget extends OfflineSyncFileTarget {\n content: Buffer;\n}\n\nexport interface OfflineSyncFileWriteChunksTarget extends OfflineSyncFileTarget {\n chunks: AsyncIterable<Buffer>;\n}\n\nexport interface OfflineSyncFileStagingWriteTarget extends OfflineSyncFileWriteTarget {\n /**\n * ABSOLUTE final path whose canonical AAD the staged ciphertext binds\n * (secure-store deployments): the offline-sync embedding generation\n * transaction stages under a staging dir and publishes by rename, so the\n * ciphertext must decrypt at the FINAL path. The AAD derives through the\n * same filePathAad logic as ordinary reads (platform-consistent).\n */\n finalAadFilePath?: string;\n}\n\nexport interface OfflineSyncFileStagingReadTarget extends OfflineSyncFileTarget {\n /** See {@link OfflineSyncFileStagingWriteTarget.finalAadFilePath}. */\n finalAadFilePath?: string;\n}\n\nexport interface OfflineSyncFileContentChunk extends Omit<OfflineSyncFileState, \"sha256\"> {\n sha256?: string;\n offset: number;\n chunkBytes: number;\n content: Buffer;\n}\n\nexport interface OfflineSyncApplyFileContentChunkResult {\n path: string;\n sha256: string;\n bytes: number;\n mtimeMs: number;\n offset: number;\n chunkBytes: number;\n done: boolean;\n applied: boolean;\n skipped: boolean;\n conflict?: OfflineSyncConflict;\n currentFile?: OfflineSyncFileState;\n}\n\ninterface OfflineUploadStaging {\n kind: \"single\" | \"chunks\";\n relPath: string;\n filePath: string;\n}\n\ninterface OfflineSyncFileRecordOptions {\n root: SafeArchiveRoot;\n relPath: string;\n filePath: string;\n includeContent: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n signal?: AbortSignal;\n}\n\nconst OFFLINE_SYNC_FAST_BASE_CTIME_TOLERANCE_MS = 1;\nconst EXCLUDED_FILE_NAMES = new Set([\n \".sync-state.json\",\n]);\n\nconst EXCLUDED_FILE_PREFIXES = [\n \".remnic-sync.\",\n \".remnic-sync-state.\",\n];\n\n/**\n * Convert a tiny subset of glob syntax (`*`, `**`, `?`, literal text) into a\n * regular expression anchored at the start and end of the input. The matcher\n * is intentionally narrow — it is only used for operator-supplied\n * `offlineSyncExcludes` entries, not for full shell-style globbing.\n * `*` and `?` match within a single path segment. `**` is cross-segment\n * wherever it appears: a `star-star-slash` prefix (leading or embedded)\n * matches zero or more whole segments, and a trailing `dir/star-star`\n * matches everything under `dir/` at any depth.\n */\n\n\nfunction sha256Buffer(buffer: Buffer): { sha256: string; bytes: number } {\n return sha256Bytes(buffer);\n}\n\nfunction throwIfOfflineSyncAborted(signal: AbortSignal | undefined): void {\n if (!signal?.aborted) return;\n throw new Error(\"offline sync request aborted\");\n}\n\nfunction compareByPath<T extends { path: string }>(left: T, right: T): number {\n return left.path.localeCompare(right.path);\n}\n\nfunction assertSha256(value: unknown, field: string): string {\n if (!isSha256Hex(value)) {\n throw new Error(`${field} must be a 64-character sha256 hex string`);\n }\n return value.toLowerCase();\n}\n\nfunction assertNonNegativeInteger(value: unknown, field: string): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value) ||\n !Number.isInteger(value) ||\n value < 0\n ) {\n throw new Error(`${field} must be a non-negative integer`);\n }\n return value;\n}\n\n\n\nfunction assertBoolean(value: unknown, field: string): boolean {\n if (typeof value !== \"boolean\") {\n throw new Error(`${field} must be a boolean`);\n }\n return value;\n}\n\nfunction normalizeSourceId(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0 || value.length > 512) {\n throw new Error(`${field} must be a non-empty string no longer than 512 characters`);\n }\n return value.trim();\n}\n\nfunction normalizeFileState(input: unknown, fieldPrefix: string): OfflineSyncFileState {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(`${fieldPrefix} must be an object`);\n }\n const obj = input as Record<string, unknown>;\n const relPath = normalizeRelativePath(obj.path, `${fieldPrefix}.path`);\n return {\n path: relPath,\n sha256: assertSha256(obj.sha256, `${fieldPrefix}.sha256`),\n bytes: assertNonNegativeInteger(obj.bytes, `${fieldPrefix}.bytes`),\n mtimeMs: assertOfflineSyncMtimeMs(obj.mtimeMs, `${fieldPrefix}.mtimeMs`),\n };\n}\n\nfunction normalizeFileRecord(\n input: unknown,\n fieldPrefix: string,\n requireContent: boolean,\n): OfflineSyncFileRecord {\n const state = normalizeFileState(input, fieldPrefix);\n const obj = input as Record<string, unknown>;\n const contentBase64 = obj.contentBase64;\n if (requireContent && typeof contentBase64 !== \"string\") {\n throw new Error(`${fieldPrefix}.contentBase64 is required`);\n }\n if (contentBase64 !== undefined && typeof contentBase64 !== \"string\") {\n throw new Error(`${fieldPrefix}.contentBase64 must be a base64 string`);\n }\n return {\n ...state,\n ...(contentBase64 !== undefined ? { contentBase64 } : {}),\n };\n}\n\nfunction normalizeFileStates(input: readonly unknown[] | undefined): OfflineSyncFileState[] {\n if (!input) return [];\n if (!Array.isArray(input)) {\n throw new Error(\"baseFiles must be an array\");\n }\n return input.map((entry, index) => normalizeFileState(entry, `baseFiles[${index}]`));\n}\n\nfunction normalizeDeletionRevisions(\n input: unknown,\n fieldPrefix: string,\n): OfflineSyncDeletionRevision[] | undefined {\n if (input === undefined) return undefined;\n if (!Array.isArray(input)) {\n throw new Error(`${fieldPrefix} must be an array`);\n }\n const deletions = input.map((entry, index): OfflineSyncDeletionRevision => {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n throw new Error(`${fieldPrefix}[${index}] must be an object`);\n }\n const obj = entry as Record<string, unknown>;\n return {\n path: normalizeRelativePath(obj.path, `${fieldPrefix}[${index}].path`),\n mtimeMs: assertOfflineSyncMtimeMs(obj.mtimeMs, `${fieldPrefix}[${index}].mtimeMs`),\n };\n });\n assertUniquePaths(deletions, fieldPrefix);\n return deletions.sort(compareByPath);\n}\n\nfunction snapshotBuilderDeletions(options: {\n deletions?: readonly OfflineSyncDeletionRevision[];\n files: readonly OfflineSyncFileState[];\n paths?: readonly string[];\n includeTranscripts: boolean;\n excludeNodeLocalState?: boolean;\n userExcludeRegexps?: readonly RegExp[];\n /** Generation dirs omitted by the push enumeration (PR #3148): revisions\n * for ANY member — including already-absent ones — are suppressed, so a\n * filtered generation can never be announced as deleted. */\n omittedGenerationDirs?: ReadonlySet<string>;\n}): OfflineSyncDeletionRevision[] | undefined {\n const deletions = normalizeDeletionRevisions(options.deletions, \"deletions\");\n if (deletions === undefined) return undefined;\n if (deletions.length === 0) return deletions;\n const presentPaths = new Set(options.files.map((file) => file.path.toLowerCase()));\n const scopedPaths = options.paths\n ? new Set(options.paths.map((relPath) => relPath.toLowerCase()))\n : undefined;\n return deletions.filter((deletion) =>\n (scopedPaths === undefined || scopedPaths.has(deletion.path.toLowerCase())) &&\n !presentPaths.has(deletion.path.toLowerCase()) &&\n !isDeletionInOmittedGeneration(deletion.path, options.omittedGenerationDirs) &&\n !(options.excludeNodeLocalState === false\n ? shouldExcludeRelPath(deletion.path, options.includeTranscripts)\n : shouldExcludePushRelPath(\n deletion.path,\n options.includeTranscripts,\n options.userExcludeRegexps,\n )));\n}\n\nfunction isDeletionInOmittedGeneration(\n relPath: string,\n omittedGenerationDirs: ReadonlySet<string> | undefined,\n): boolean {\n if (!omittedGenerationDirs || omittedGenerationDirs.size === 0) return false;\n const membership = embeddingGenerationMembership(relPath);\n return membership !== null && omittedGenerationDirs.has(membership.shardDir);\n}\n\nexport async function filterOfflineSyncDeletionRevisions(options: {\n root: string;\n deletions: readonly OfflineSyncDeletionRevision[];\n includeTranscripts?: boolean;\n userExcludeRegexps?: readonly RegExp[];\n excludeFile?: OfflineSyncExcludeFile;\n}): Promise<OfflineSyncDeletionRevision[]> {\n const deletions = normalizeDeletionRevisions(options.deletions, \"deletions\");\n if (deletions === undefined) throw new Error(\"deletions must be an array\");\n if (deletions.length === 0) return deletions;\n const root = await prepareSafeArchiveRoot(\n path.resolve(options.root),\n \"filterOfflineSyncDeletionRevisions\",\n \"root\",\n );\n const includeTranscripts = options.includeTranscripts !== false;\n const omission = await computeOmittedEmbeddingGenerationPaths({\n rootAbs: root.abs,\n userExcludeRegexps: options.userExcludeRegexps,\n excludeFile: options.excludeFile,\n isExcludedRelPath: (relPath) =>\n shouldExcludePushRelPath(relPath, includeTranscripts, options.userExcludeRegexps),\n });\n const omittedDirs = new Set(omission.omittedDirs);\n const filtered: OfflineSyncDeletionRevision[] = [];\n for (const deletion of deletions) {\n if (\n shouldExcludePushRelPath(deletion.path, includeTranscripts, options.userExcludeRegexps) ||\n isDeletionInOmittedGeneration(deletion.path, omittedDirs)\n ) {\n continue;\n }\n const filePath = path.join(root.abs, ...deletion.path.split(\"/\"));\n const present = await lstat(filePath).then(\n () => true,\n (error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw error;\n },\n );\n if (!present) filtered.push(deletion);\n }\n return filtered;\n}\n\nexport function normalizeOfflineSyncSnapshot(\n input: unknown,\n options: { requireContent?: boolean } = {},\n): OfflineSyncSnapshot {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(\"offline sync snapshot must be an object\");\n }\n const obj = input as Record<string, unknown>;\n if (obj.format !== OFFLINE_SYNC_SNAPSHOT_FORMAT) {\n throw new Error(`offline sync snapshot format must be ${OFFLINE_SYNC_SNAPSHOT_FORMAT}`);\n }\n if (obj.schemaVersion !== 1) {\n throw new Error(\"offline sync snapshot schemaVersion must be 1\");\n }\n const createdAt = normalizeIsoString(obj.createdAt, \"createdAt\");\n const sourceId = normalizeSourceId(obj.sourceId, \"sourceId\");\n const includeTranscripts = assertBoolean(obj.includeTranscripts, \"includeTranscripts\");\n if (!Array.isArray(obj.files)) {\n throw new Error(\"offline sync snapshot files must be an array\");\n }\n const files = obj.files\n .map((entry, index) =>\n normalizeFileRecord(entry, `files[${index}]`, options.requireContent === true))\n .filter((file) => !shouldIgnoreIncomingRuntimePath(file.path))\n .sort(compareByPath);\n const deletions = normalizeDeletionRevisions(obj.deletions, \"deletions\")\n ?.filter((deletion) => !shouldIgnoreIncomingRuntimePath(deletion.path));\n const entries = deletions && deletions.length > 0 ? [...files, ...deletions] : files;\n assertUniquePaths(entries, \"offline sync snapshot\");\n if (!includeTranscripts) {\n const transcriptPath = entries\n .find((entry) => entry.path.split(\"/\")[0] === \"transcripts\")?.path;\n if (transcriptPath) {\n throw new Error(\n `offline sync snapshot includeTranscripts is false but contains transcript path: ${transcriptPath}`,\n );\n }\n }\n const excludedPath = entries\n .find((entry) => shouldExcludeRelPath(entry.path, true))?.path;\n if (excludedPath) {\n throw new Error(`offline sync snapshot contains excluded path: ${excludedPath}`);\n }\n let omittedEmbeddingGenerationDirs: string[] | undefined;\n if (obj.omittedEmbeddingGenerationDirs !== undefined) {\n if (!Array.isArray(obj.omittedEmbeddingGenerationDirs)) {\n throw new Error(\"offline sync snapshot omittedEmbeddingGenerationDirs must be an array\");\n }\n const seenDirs = new Set<string>();\n for (const [index, entry] of obj.omittedEmbeddingGenerationDirs.entries()) {\n if (\n typeof entry !== \"string\" ||\n !isEmbeddingGenerationDirPath(entry) ||\n seenDirs.has(entry)\n ) {\n throw new Error(\n `omittedEmbeddingGenerationDirs[${index}] must be a unique canonical embeddings generation dir`,\n );\n }\n seenDirs.add(entry);\n }\n omittedEmbeddingGenerationDirs = [...seenDirs].sort((left, right) => left.localeCompare(right));\n }\n return {\n format: OFFLINE_SYNC_SNAPSHOT_FORMAT,\n schemaVersion: 1,\n createdAt,\n sourceId,\n includeTranscripts,\n files,\n ...(deletions === undefined ? {} : { deletions }),\n ...(omittedEmbeddingGenerationDirs === undefined ? {} : { omittedEmbeddingGenerationDirs }),\n };\n}\n\nexport function normalizeOfflineSyncChangeset(\n input: unknown,\n): OfflineSyncChangeset {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(\"offline sync changeset must be an object\");\n }\n const obj = input as Record<string, unknown>;\n if (obj.format !== OFFLINE_SYNC_CHANGESET_FORMAT) {\n throw new Error(`offline sync changeset format must be ${OFFLINE_SYNC_CHANGESET_FORMAT}`);\n }\n if (obj.schemaVersion !== 1) {\n throw new Error(\"offline sync changeset schemaVersion must be 1\");\n }\n const createdAt = normalizeIsoString(obj.createdAt, \"createdAt\");\n const sourceId = normalizeSourceId(obj.sourceId, \"sourceId\");\n const includeTranscripts = assertBoolean(obj.includeTranscripts, \"includeTranscripts\");\n if (!Array.isArray(obj.changes)) {\n throw new Error(\"offline sync changeset changes must be an array\");\n }\n const changes = obj.changes.map((entry, index): OfflineSyncChange => {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n throw new Error(`changes[${index}] must be an object`);\n }\n const change = entry as Record<string, unknown>;\n const type = change.type;\n const relPath = normalizeRelativePath(change.path, `changes[${index}].path`);\n if (type === \"upsert\") {\n const file = normalizeFileRecord(\n change.file,\n `changes[${index}].file`,\n true,\n ) as OfflineSyncFileRecord & { contentBase64: string };\n if (file.path !== relPath) {\n throw new Error(`changes[${index}].file.path must match changes[${index}].path`);\n }\n const baseSha256 =\n change.baseSha256 === undefined\n ? undefined\n : assertSha256(change.baseSha256, `changes[${index}].baseSha256`);\n return {\n type: \"upsert\",\n path: relPath,\n ...(baseSha256 ? { baseSha256 } : {}),\n file,\n };\n }\n if (type === \"delete\") {\n const mtimeMs = change.mtimeMs === undefined\n ? undefined\n : assertOfflineSyncMtimeMs(change.mtimeMs, `changes[${index}].mtimeMs`);\n return {\n type: \"delete\",\n path: relPath,\n baseSha256: assertSha256(change.baseSha256, `changes[${index}].baseSha256`),\n ...(mtimeMs === undefined ? {} : { mtimeMs }),\n };\n }\n throw new Error(`changes[${index}].type must be \"upsert\" or \"delete\"`);\n }).filter((change) => !shouldIgnoreIncomingRuntimePath(change.path));\n assertUniquePaths(changes, \"offline sync changeset\");\n if (!includeTranscripts) {\n const transcriptPath = changes.find((change) => change.path.split(\"/\")[0] === \"transcripts\")?.path;\n if (transcriptPath) {\n throw new Error(\n `offline sync changeset includeTranscripts is false but contains transcript path: ${transcriptPath}`,\n );\n }\n }\n const excludedPath = changes.find((change) => shouldExcludeRelPath(change.path, true))?.path;\n if (excludedPath) {\n throw new Error(`offline sync changeset contains excluded path: ${excludedPath}`);\n }\n return {\n format: OFFLINE_SYNC_CHANGESET_FORMAT,\n schemaVersion: 1,\n createdAt,\n sourceId,\n includeTranscripts,\n changes: changes.sort(compareByPath),\n };\n}\n\nfunction normalizeIsoString(input: unknown, field: string): string {\n if (typeof input !== \"string\" || input.trim().length === 0) {\n throw new Error(`${field} must be an ISO timestamp string`);\n }\n const parsed = parseFlexibleIsoTimestamp(input.trim());\n if (parsed === null) {\n throw new Error(`${field} must be a parseable ISO timestamp`);\n }\n return new Date(parsed).toISOString();\n}\n\nfunction normalizeRelativePath(input: unknown, field: string): string {\n if (typeof input !== \"string\") {\n throw new Error(`${field} must be a POSIX relative path string`);\n }\n return validateArchiveRelativePath(input, field);\n}\n\nfunction assertUniquePaths(entries: readonly { path: string }[], context: string): void {\n const seen = new Set<string>();\n for (const entry of entries) {\n const key = entry.path.toLowerCase();\n if (seen.has(key)) {\n throw new Error(`${context} contains duplicate path: ${entry.path}`);\n }\n seen.add(key);\n }\n}\n\nexport function isInternalRemnicStatePath(relPosix: string): boolean {\n const normalized = relPosix.includes(\"\\\\\") ? relPosix.replaceAll(\"\\\\\", \"/\") : relPosix;\n return normalized === \".remnic\"\n || normalized.startsWith(\".remnic/\")\n || normalized.endsWith(\"/.remnic\")\n || normalized.includes(\"/.remnic/\");\n}\n\nfunction shouldExcludeRelPath(relPosix: string, includeTranscripts: boolean): boolean {\n if (isInternalRemnicStatePath(relPosix)) return true;\n const parts = relPosix.split(\"/\");\n if (parts.some((part) => DEFAULT_TRANSFER_EXCLUDE_DIRS.has(part))) return true;\n if (parts.some((part) => part === SYNC_INTERNAL_DIR)) return true;\n if (!includeTranscripts && parts[0] === \"transcripts\") return true;\n const basename = parts[parts.length - 1] ?? \"\";\n if (isCanonicalRuntimeStatePath(parts) && basename.includes(\".tmp-\")) return true;\n if (EXCLUDED_FILE_NAMES.has(basename)) return true;\n if (EXCLUDED_FILE_PREFIXES.some((prefix) => basename.startsWith(prefix))) return true;\n return false;\n}\n\n/**\n * Push-side variant of `shouldExcludeRelPath` for issue #1786. Combines the\n * legacy structural exclude (private dirs, sync internal, tmp runtime state,\n * excluded file names/prefixes) with the new push-only exclusion layers:\n * - the `state/*.sqlite`, `state/index_tags.json`, etc. defaults that\n * describe node-local runtime state each node rebuilds from synced\n * records, and\n * - operator-supplied `offlineSyncExcludes` regexps.\n *\n * Used ONLY by push-side enumeration/validation paths. Apply-side callers\n * must use the legacy `shouldExcludeRelPath` so a remote snapshot containing\n * `state/lcm.sqlite` can still be accepted on first sync -- the remote's\n * view is authoritative for that file until the local LCM is bootstrapped.\n */\nfunction shouldExcludePushRelPath(\n relPosix: string,\n includeTranscripts: boolean,\n userExcludeRegexps?: readonly RegExp[],\n): boolean {\n if (shouldExcludeRelPath(relPosix, includeTranscripts)) return true;\n // Issue #1786: node-local runtime state (live sqlite, derived indexes,\n // per-node governance run logs) is rebuilt by each node, never synced.\n if (matchesOfflineSyncDefaultExclude(relPosix)) return true;\n if (userExcludeRegexps && userExcludeRegexps.some((re) => re.test(relPosix))) return true;\n return false;\n}\n\n// Precompiled once at module load — this check sits on the hot\n// enumeration path for every walked file (Kilo review, PR #1793).\n\n\n/**\n * Compile operator-supplied `offlineSyncExcludes` glob strings into a\n * pre-validated array of regular expressions. Empty input is allowed and\n * returns an empty list. Throws on any invalid entry — callers should treat\n * a thrown error as a fatal configuration mistake and refuse to start the\n * sync run rather than silently dropping the bad entry.\n */\n\nfunction shouldIgnoreIncomingRuntimePath(relPosix: string): boolean {\n if (isInternalRemnicStatePath(relPosix)) return true;\n const parts = relPosix.split(\"/\");\n const basename = parts[parts.length - 1] ?? \"\";\n return isCanonicalRuntimeStatePath(parts) && basename.includes(\".tmp-\");\n}\n\nfunction filterBaseFilesForMode(\n files: readonly OfflineSyncFileState[],\n includeTranscripts: boolean,\n): OfflineSyncFileState[] {\n return files.filter((file) => !shouldExcludeRelPath(file.path, includeTranscripts));\n}\n\nfunction canReuseFastBaseFileState(\n baseEntry: OfflineSyncFileState,\n st: { size: number; mtimeMs: number; ctimeMs: number },\n baseCapturedAtMs: number | null,\n): boolean {\n if (baseEntry.bytes !== st.size) return false;\n if (Math.abs(baseEntry.mtimeMs - st.mtimeMs) > OFFLINE_SYNC_FAST_BASE_MTIME_TOLERANCE_MS) {\n return false;\n }\n if (baseCapturedAtMs === null) return false;\n // Node reports stat times as fractional milliseconds while Date snapshots are\n // whole milliseconds, so allow only a tiny precision window around capture.\n return st.ctimeMs - baseCapturedAtMs <= OFFLINE_SYNC_FAST_BASE_CTIME_TOLERANCE_MS;\n}\n\nasync function canReuseFastBaseFileStateFromDisk(\n baseEntry: OfflineSyncFileState,\n st: { size: number; mtimeMs: number; ctimeMs: number },\n baseCapturedAtMs: number | null,\n): Promise<boolean> {\n return canReuseFastBaseFileState(baseEntry, st, baseCapturedAtMs);\n}\n\nasync function readOfflineSyncFileRecord(\n options: OfflineSyncFileRecordOptions,\n): Promise<OfflineSyncFileRecord> {\n throwIfOfflineSyncAborted(options.signal);\n const relPath = validateArchiveRelativePath(options.relPath, \"offlineSyncFile.path\");\n let content: Buffer | null = null;\n let digest: OfflineSyncFileDigest;\n if (options.includeContent) {\n content = options.readFile\n ? await options.readFile({ root: options.root.abs, path: relPath, filePath: options.filePath })\n : await readFile(options.filePath);\n throwIfOfflineSyncAborted(options.signal);\n digest = sha256Buffer(content);\n } else if (options.readFileDigest) {\n digest = await options.readFileDigest({ root: options.root.abs, path: relPath, filePath: options.filePath });\n throwIfOfflineSyncAborted(options.signal);\n } else if (options.readFile) {\n content = await options.readFile({ root: options.root.abs, path: relPath, filePath: options.filePath });\n throwIfOfflineSyncAborted(options.signal);\n digest = sha256Buffer(content);\n content = null;\n } else {\n digest = await sha256OfflineSyncFile(options.filePath, options.signal);\n }\n throwIfOfflineSyncAborted(options.signal);\n const st = await stat(options.filePath);\n return {\n path: relPath,\n sha256: digest.sha256,\n bytes: digest.bytes,\n mtimeMs: st.mtimeMs,\n ...(content ? { contentBase64: content.toString(\"base64\") } : {}),\n };\n}\n\nexport async function* iterateOfflineSyncSnapshotFileRecords(options: {\n root: string;\n includeContent?: boolean;\n includeTranscripts?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n excludeFile?: OfflineSyncExcludeFile;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * Precomputed whole-generation omission set (PR #3148 round 4): paths the\n * walk must skip because their embedding generation lost ANY member to a\n * push filter. When omitted and push excludes are active, the set is\n * computed here so streaming census consumers get the same semantics.\n */\n skipEmbeddingGenerationPaths?: ReadonlySet<string>;\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n signal?: AbortSignal;\n}): AsyncIterable<OfflineSyncFileRecord> {\n throwIfOfflineSyncAborted(options.signal);\n const rootAbs = path.resolve(options.root);\n const root = await prepareSafeArchiveRoot(rootAbs, \"iterateOfflineSyncSnapshotFileRecords\", \"root\");\n const includeTranscripts = options.includeTranscripts !== false;\n const pushExcludes = options.excludeNodeLocalState !== false;\n const skipGenerationPaths = options.skipEmbeddingGenerationPaths ??\n (pushExcludes\n ? (await computeOmittedEmbeddingGenerationPaths({\n rootAbs: root.abs,\n userExcludeRegexps: options.userExcludeRegexps,\n excludeFile: options.excludeFile,\n isExcludedRelPath: (relPath) =>\n shouldExcludePushRelPath(relPath, includeTranscripts, options.userExcludeRegexps),\n })).omittedPaths\n : undefined);\n\n async function* walk(dirAbs: string, includeContent = options.includeContent === true): AsyncIterable<OfflineSyncFileRecord> {\n throwIfOfflineSyncAborted(options.signal);\n let entries = await readdir(dirAbs, { withFileTypes: true });\n entries = entries.sort((left, right) => left.name.localeCompare(right.name));\n for (const entry of entries) {\n const abs = path.join(dirAbs, entry.name);\n const relPosix = path.relative(root.abs, abs).split(path.sep).join(\"/\");\n if (\n options.excludeNodeLocalState === false\n ? shouldExcludeRelPath(relPosix, includeTranscripts)\n : shouldExcludePushRelPath(relPosix, includeTranscripts, options.userExcludeRegexps)\n ) continue;\n if (skipGenerationPaths?.has(relPosix)) continue;\n if (entry.isSymbolicLink()) continue;\n if (entry.isDirectory()) {\n if (isEmbeddingGenerationDirPath(relPosix)) {\n yield* withEmbeddingGenerationLockIter(path.dirname(abs), (content) => walk(abs, content), includeContent,\n () => assertEmbeddingGenerationStillIncluded(root.abs, relPosix, options.excludeFile,\n (rel) => shouldExcludePushRelPath(rel, includeTranscripts, options.userExcludeRegexps),\n []));\n continue;\n }\n yield* walk(abs, includeContent);\n continue;\n }\n if (!entry.isFile()) continue;\n if (await shouldExcludeOfflineSyncFile(options.excludeFile, {\n root: root.abs,\n path: relPosix,\n filePath: abs,\n })) continue;\n yield await readOfflineSyncFileRecord({\n root,\n relPath: relPosix,\n filePath: abs,\n includeContent,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n signal: options.signal,\n });\n }\n }\n\n yield* walk(root.abs);\n}\n\nexport async function buildOfflineSyncSnapshot(options: {\n root: string;\n sourceId: string;\n includeContent?: boolean;\n deletions?: readonly OfflineSyncDeletionRevision[];\n includeTranscripts?: boolean;\n now?: Date;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n excludeFile?: OfflineSyncExcludeFile;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n signal?: AbortSignal;\n}): Promise<OfflineSyncSnapshot> {\n throwIfOfflineSyncAborted(options.signal);\n const includeTranscripts = options.includeTranscripts !== false;\n const pushExcludes = options.excludeNodeLocalState !== false;\n const normalizedDeletions = normalizeDeletionRevisions(options.deletions, \"deletions\");\n const omission = pushExcludes\n ? await computeOmittedEmbeddingGenerationPaths({\n rootAbs: path.resolve(options.root),\n userExcludeRegexps: options.userExcludeRegexps,\n excludeFile: options.excludeFile,\n tombstonedPaths: (normalizedDeletions ?? []).map((deletion) => deletion.path),\n isExcludedRelPath: (relPath) =>\n shouldExcludePushRelPath(relPath, includeTranscripts, options.userExcludeRegexps),\n })\n : undefined;\n const files: OfflineSyncFileRecord[] = [];\n for await (const file of iterateOfflineSyncSnapshotFileRecords({\n ...options,\n skipEmbeddingGenerationPaths: omission?.omittedPaths,\n })) files.push(file);\n throwIfOfflineSyncAborted(options.signal);\n\n const sortedFiles = files.sort(compareByPath);\n const deletions = snapshotBuilderDeletions({\n deletions: options.deletions,\n files: sortedFiles,\n includeTranscripts,\n excludeNodeLocalState: options.excludeNodeLocalState,\n userExcludeRegexps: options.userExcludeRegexps,\n omittedGenerationDirs: omission && omission.omittedDirs.length > 0\n ? new Set(omission.omittedDirs)\n : undefined,\n });\n return {\n format: OFFLINE_SYNC_SNAPSHOT_FORMAT,\n schemaVersion: 1,\n createdAt: (options.now ?? new Date()).toISOString(),\n sourceId: normalizeSourceId(options.sourceId, \"sourceId\"),\n includeTranscripts,\n files: sortedFiles,\n ...(deletions === undefined ? {} : { deletions }),\n ...(omission && omission.omittedDirs.length > 0\n ? { omittedEmbeddingGenerationDirs: omission.omittedDirs }\n : {}),\n };\n}\n\nexport async function buildOfflineSyncSnapshotFromBase(options: {\n root: string;\n sourceId: string;\n baseFiles?: readonly OfflineSyncFileState[];\n deletions?: readonly OfflineSyncDeletionRevision[];\n baseCapturedAt?: Date;\n includeContent?: boolean;\n includeTranscripts?: boolean;\n now?: Date;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n excludeFile?: OfflineSyncExcludeFile;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n signal?: AbortSignal;\n}): Promise<OfflineSyncSnapshot> {\n throwIfOfflineSyncAborted(options.signal);\n const rootAbs = path.resolve(options.root);\n const root = await prepareSafeArchiveRoot(rootAbs, \"buildOfflineSyncSnapshotFromBase\", \"root\");\n const includeTranscripts = options.includeTranscripts !== false;\n const base = byPath(filterBaseFilesForMode(\n normalizeFileStates(options.baseFiles),\n includeTranscripts,\n ));\n const rawBaseCapturedAtMs = options.baseCapturedAt?.getTime();\n const baseCapturedAtMs = rawBaseCapturedAtMs !== undefined && Number.isFinite(rawBaseCapturedAtMs)\n ? rawBaseCapturedAtMs\n : null;\n const pushExcludes = options.excludeNodeLocalState !== false;\n const normalizedDeletions = normalizeDeletionRevisions(options.deletions, \"deletions\");\n const omission = pushExcludes\n ? await computeOmittedEmbeddingGenerationPaths({\n rootAbs: root.abs,\n userExcludeRegexps: options.userExcludeRegexps,\n excludeFile: options.excludeFile,\n tombstonedPaths: (normalizedDeletions ?? []).map((deletion) => deletion.path),\n isExcludedRelPath: (relPath) =>\n shouldExcludePushRelPath(relPath, includeTranscripts, options.userExcludeRegexps),\n })\n : undefined;\n const files: OfflineSyncFileRecord[] = [];\n\n async function walk(dirAbs: string): Promise<void> {\n throwIfOfflineSyncAborted(options.signal);\n let entries = await readdir(dirAbs, { withFileTypes: true });\n entries = entries.sort((left, right) => left.name.localeCompare(right.name));\n for (const entry of entries) {\n throwIfOfflineSyncAborted(options.signal);\n const abs = path.join(dirAbs, entry.name);\n const relPosix = path.relative(root.abs, abs).split(path.sep).join(\"/\");\n if (\n options.excludeNodeLocalState === false\n ? shouldExcludeRelPath(relPosix, includeTranscripts)\n : shouldExcludePushRelPath(relPosix, includeTranscripts, options.userExcludeRegexps)\n ) continue;\n if (omission?.omittedPaths.has(relPosix)) continue;\n if (entry.isSymbolicLink()) continue;\n if (entry.isDirectory()) {\n if (isEmbeddingGenerationDirPath(relPosix)) {\n await withEmbeddingGenerationLock(path.dirname(abs), async () => {\n await assertEmbeddingGenerationStillIncluded(root.abs, relPosix, options.excludeFile,\n (rel) => shouldExcludePushRelPath(rel, includeTranscripts, options.userExcludeRegexps),\n (normalizedDeletions ?? []).map((deletion) => deletion.path));\n await walk(abs);\n });\n continue;\n }\n await walk(abs);\n continue;\n }\n if (!entry.isFile()) continue;\n if (await shouldExcludeOfflineSyncFile(options.excludeFile, {\n root: root.abs,\n path: relPosix,\n filePath: abs,\n })) continue;\n const st = await stat(abs);\n const baseEntry = base.get(relPosix);\n if (\n options.includeContent !== true &&\n baseEntry &&\n baseCapturedAtMs !== null &&\n await canReuseFastBaseFileStateFromDisk(baseEntry, st, baseCapturedAtMs)\n ) {\n files.push(baseEntry);\n continue;\n }\n files.push(await readOfflineSyncFileRecord({\n root,\n relPath: relPosix,\n filePath: abs,\n includeContent: options.includeContent === true,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n signal: options.signal,\n }));\n }\n }\n\n await walk(root.abs);\n throwIfOfflineSyncAborted(options.signal);\n\n const sortedFiles = files.sort(compareByPath);\n const deletions = snapshotBuilderDeletions({\n deletions: options.deletions,\n files: sortedFiles,\n includeTranscripts,\n excludeNodeLocalState: options.excludeNodeLocalState,\n userExcludeRegexps: options.userExcludeRegexps,\n omittedGenerationDirs: omission && omission.omittedDirs.length > 0\n ? new Set(omission.omittedDirs)\n : undefined,\n });\n return {\n format: OFFLINE_SYNC_SNAPSHOT_FORMAT,\n schemaVersion: 1,\n createdAt: (options.now ?? new Date()).toISOString(),\n sourceId: normalizeSourceId(options.sourceId, \"sourceId\"),\n includeTranscripts,\n files: sortedFiles,\n ...(deletions === undefined ? {} : { deletions }),\n ...(omission && omission.omittedDirs.length > 0\n ? { omittedEmbeddingGenerationDirs: omission.omittedDirs }\n : {}),\n };\n}\n\nexport async function buildOfflineSyncSnapshotForPaths(options: {\n root: string;\n sourceId: string;\n paths: readonly string[];\n deletions?: readonly OfflineSyncDeletionRevision[];\n includeContent?: boolean;\n includeTranscripts?: boolean;\n now?: Date;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n excludeFile?: OfflineSyncExcludeFile;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n signal?: AbortSignal;\n}): Promise<OfflineSyncSnapshot> {\n throwIfOfflineSyncAborted(options.signal);\n const rootAbs = path.resolve(options.root);\n const root = await prepareSafeArchiveRoot(rootAbs, \"buildOfflineSyncSnapshotForPaths\", \"root\");\n const includeTranscripts = options.includeTranscripts !== false;\n const files: OfflineSyncFileRecord[] = [];\n const seen = new Set<string>();\n\n for (const rawPath of options.paths) {\n throwIfOfflineSyncAborted(options.signal);\n const relPath = normalizeRelativePath(rawPath, \"paths[]\");\n if (seen.has(relPath)) continue;\n seen.add(relPath);\n if (\n options.excludeNodeLocalState === false\n ? shouldExcludeRelPath(relPath, includeTranscripts)\n : shouldExcludePushRelPath(relPath, includeTranscripts, options.userExcludeRegexps)\n ) {\n throw new Error(`offline sync snapshot path is excluded: ${relPath}`);\n }\n const filePath = await resolveSafeArchiveTarget(root, relPath);\n const st = await lstat(filePath).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (!st || st.isSymbolicLink() || !st.isFile()) continue;\n if (await shouldExcludeOfflineSyncFile(options.excludeFile, {\n root: root.abs,\n path: relPath,\n filePath,\n })) {\n throw new Error(`offline sync snapshot path is excluded: ${relPath}`);\n }\n files.push(await readOfflineSyncFileRecord({\n root,\n relPath,\n filePath,\n includeContent: options.includeContent === true,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n signal: options.signal,\n }));\n }\n throwIfOfflineSyncAborted(options.signal);\n\n const sortedFiles = files.sort(compareByPath);\n const deletions = snapshotBuilderDeletions({\n deletions: options.deletions,\n files: sortedFiles,\n paths: [...seen],\n includeTranscripts,\n excludeNodeLocalState: options.excludeNodeLocalState,\n userExcludeRegexps: options.userExcludeRegexps,\n });\n return {\n format: OFFLINE_SYNC_SNAPSHOT_FORMAT,\n schemaVersion: 1,\n createdAt: (options.now ?? new Date()).toISOString(),\n sourceId: normalizeSourceId(options.sourceId, \"sourceId\"),\n includeTranscripts,\n files: sortedFiles,\n ...(deletions === undefined ? {} : { deletions }),\n };\n}\n\nexport async function readOfflineSyncFileContentChunk(options: {\n root: string;\n path: string;\n offset?: number;\n length?: number;\n includeTranscripts?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n excludeFile?: OfflineSyncExcludeFile;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n}): Promise<OfflineSyncFileContentChunk> {\n const rootAbs = path.resolve(options.root);\n const root = await prepareSafeArchiveRoot(rootAbs, \"readOfflineSyncFileContentChunk\", \"root\");\n const includeTranscripts = options.includeTranscripts !== false;\n const relPath = normalizeRelativePath(options.path, \"path\");\n if (\n options.excludeNodeLocalState === false\n ? shouldExcludeRelPath(relPath, includeTranscripts)\n : shouldExcludePushRelPath(relPath, includeTranscripts, options.userExcludeRegexps)\n ) {\n throw new Error(`offline sync file content path is excluded: ${relPath}`);\n }\n const offset = options.offset === undefined\n ? 0\n : assertNonNegativeInteger(options.offset, \"offset\");\n const requestedLength = options.length === undefined\n ? OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES\n : assertNonNegativeInteger(options.length, \"length\");\n if (requestedLength < 1 || requestedLength > OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES) {\n throw new Error(\n `length must be an integer from 1 to ${OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES}`,\n );\n }\n const filePath = await resolveSafeArchiveTarget(root, relPath);\n const st = await lstat(filePath).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (!st || st.isSymbolicLink() || !st.isFile()) {\n throw new Error(`offline sync file content path not found: ${relPath}`);\n }\n if (await shouldExcludeOfflineSyncFile(options.excludeFile, {\n root: root.abs,\n path: relPath,\n filePath,\n })) {\n throw new Error(`offline sync file content path is excluded: ${relPath}`);\n }\n const encrypted = await isEncryptedOfflineSyncFile(filePath);\n if (!encrypted) {\n if (offset > st.size) {\n throw new Error(`offset must be <= file size for ${relPath}`);\n }\n // Plain files need the whole-file sha256 for the response contract\n // (x-remnic-file-sha256; peer transports reject chunks without it), but\n // must stay memory-bounded for large files: the digest is computed by a\n // streamed hash pass (never buffering the file) and cached by\n // (path, bytes, mtimeMs) so per-chunk requests after the first are O(1).\n const chunk = await readPlainOfflineSyncFileChunk({\n filePath,\n offset,\n length: requestedLength,\n bytes: st.size,\n });\n const digest = await plainFileDigest(filePath);\n return {\n path: relPath,\n sha256: digest,\n bytes: st.size,\n mtimeMs: st.mtimeMs,\n offset,\n chunkBytes: chunk.length,\n content: chunk,\n };\n }\n if (!options.readFile) {\n throw new Error(`offline sync file content requires a secure-store read hook: ${relPath}`);\n }\n const content = await options.readFile({ root: root.abs, path: relPath, filePath });\n if (offset > content.length) {\n throw new Error(`offset must be <= file size for ${relPath}`);\n }\n const digest = sha256Buffer(content);\n const end = Math.min(content.length, offset + requestedLength);\n const chunk = content.subarray(offset, end);\n return {\n path: relPath,\n sha256: digest.sha256,\n bytes: digest.bytes,\n mtimeMs: st.mtimeMs,\n offset,\n chunkBytes: chunk.length,\n content: Buffer.from(chunk),\n };\n}\n\nexport async function buildOfflineSyncChangeset(options: {\n root: string;\n sourceId: string;\n baseFiles?: readonly OfflineSyncFileState[];\n deletions?: readonly OfflineSyncDeletionRevision[];\n baseCapturedAt?: Date;\n excludePaths?: readonly string[];\n includeTranscripts?: boolean;\n now?: Date;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n}): Promise<OfflineSyncChangeset> {\n const includeTranscripts = options.includeTranscripts !== false;\n const current = await buildOfflineSyncSnapshotFromBase({\n root: options.root,\n sourceId: options.sourceId,\n baseFiles: options.baseFiles,\n deletions: options.deletions,\n baseCapturedAt: options.baseCapturedAt,\n includeContent: false,\n includeTranscripts,\n now: options.now,\n userExcludeRegexps: options.userExcludeRegexps,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n });\n return buildOfflineSyncChangesetFromSnapshot({\n root: options.root,\n sourceId: options.sourceId,\n baseFiles: options.baseFiles,\n currentFiles: current.files,\n deletions: current.deletions,\n excludePaths: options.excludePaths,\n includeTranscripts,\n now: options.now,\n userExcludeRegexps: options.userExcludeRegexps,\n readFile: options.readFile,\n });\n}\n\nexport async function buildOfflineSyncChangesetFromSnapshot(options: {\n root: string;\n sourceId: string;\n currentFiles: readonly OfflineSyncFileState[];\n baseFiles?: readonly OfflineSyncFileState[];\n deletions?: readonly OfflineSyncDeletionRevision[];\n excludePaths?: readonly string[];\n includeTranscripts?: boolean;\n now?: Date;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n}): Promise<OfflineSyncChangeset> {\n const includeTranscripts = options.includeTranscripts !== false;\n const excludedPaths = new Set(\n (options.excludePaths ?? []).map((relPath) => normalizeRelativePath(relPath, \"excludePaths[]\")),\n );\n const base = byPath(filterBaseFilesForMode(\n normalizeFileStates(options.baseFiles),\n includeTranscripts,\n ));\n const currentMap = byPath(filterBaseFilesForMode(\n normalizeFileStates(options.currentFiles),\n includeTranscripts,\n ));\n const deletions = normalizeDeletionRevisions(options.deletions, \"deletions\");\n const deletionMtimeByPath = deletions === undefined\n ? undefined\n : new Map(deletions.map((deletion) => [deletion.path, deletion.mtimeMs] as const));\n const changes: OfflineSyncChange[] = [];\n\n for (const relPath of unionPaths(base, currentMap)) {\n if (excludedPaths.has(relPath)) continue;\n // Issue #1786: node-local runtime state must never appear in a push-side\n // changeset — each node rebuilds it from synced records.\n if (shouldExcludePushRelPath(relPath, includeTranscripts, options.userExcludeRegexps)) continue;\n // Runtime state is remote-authoritative in offline sync: local edits and\n // deletes are not pushed; the pull phase restores or removes these files\n // from the remote snapshot.\n if (shouldPreferIncomingOfflineRuntimeFile(relPath)) continue;\n const baseEntry = base.get(relPath);\n const currentEntry = currentMap.get(relPath);\n if (currentEntry && currentEntry.sha256 !== baseEntry?.sha256) {\n const file = await buildOfflineSyncSnapshotForPaths({\n root: options.root,\n sourceId: options.sourceId,\n paths: [relPath],\n includeContent: true,\n includeTranscripts,\n now: options.now,\n userExcludeRegexps: options.userExcludeRegexps,\n readFile: options.readFile,\n });\n const record = file.files[0];\n if (!record || typeof record.contentBase64 !== \"string\" || record.sha256 !== currentEntry.sha256) {\n throw new Error(`offline sync file changed while building changeset: ${relPath}`);\n }\n changes.push({\n type: \"upsert\",\n path: relPath,\n ...(baseEntry ? { baseSha256: baseEntry.sha256 } : {}),\n file: record as OfflineSyncFileRecord & { contentBase64: string },\n });\n continue;\n }\n if (!currentEntry && baseEntry) {\n const mtimeMs = deletionMtimeByPath?.get(relPath);\n changes.push({\n type: \"delete\",\n path: relPath,\n baseSha256: baseEntry.sha256,\n ...(mtimeMs === undefined ? {} : { mtimeMs }),\n });\n }\n }\n\n return {\n format: OFFLINE_SYNC_CHANGESET_FORMAT,\n schemaVersion: 1,\n createdAt: (options.now ?? new Date()).toISOString(),\n sourceId: normalizeSourceId(options.sourceId, \"sourceId\"),\n includeTranscripts,\n changes: changes.sort(compareByPath),\n };\n}\n\nexport function summarizeOfflineSyncChangeset(\n changeset: OfflineSyncChangeset,\n): OfflineSyncChangesetSummary {\n const upserts = changeset.changes.filter((change) => change.type === \"upsert\").length;\n const deletes = changeset.changes.filter((change) => change.type === \"delete\").length;\n return {\n upserts,\n deletes,\n total: changeset.changes.length,\n };\n}\n\nexport async function summarizeOfflineSyncPendingChanges(options: {\n root: string;\n sourceId: string;\n baseFiles?: readonly OfflineSyncFileState[];\n baseCapturedAt?: Date;\n includeTranscripts?: boolean;\n now?: Date;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n}): Promise<OfflineSyncChangesetSummary> {\n const includeTranscripts = options.includeTranscripts !== false;\n const current = await buildOfflineSyncSnapshotFromBase({\n root: options.root,\n sourceId: options.sourceId,\n baseFiles: options.baseFiles,\n baseCapturedAt: options.baseCapturedAt,\n includeContent: false,\n includeTranscripts,\n now: options.now,\n userExcludeRegexps: options.userExcludeRegexps,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n });\n return summarizeOfflineSyncPendingFiles({\n baseFiles: options.baseFiles,\n currentFiles: current.files,\n includeTranscripts,\n userExcludeRegexps: options.userExcludeRegexps,\n });\n}\n\nexport function summarizeOfflineSyncPendingFiles(options: {\n baseFiles?: readonly OfflineSyncFileState[];\n currentFiles: readonly OfflineSyncFileState[];\n includeTranscripts?: boolean;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n}): OfflineSyncChangesetSummary {\n const includeTranscripts = options.includeTranscripts !== false;\n const base = byPath(filterBaseFilesForMode(\n normalizeFileStates(options.baseFiles),\n includeTranscripts,\n ));\n const currentMap = byPath(filterBaseFilesForMode(\n normalizeFileStates(options.currentFiles),\n includeTranscripts,\n ));\n let upserts = 0;\n let deletes = 0;\n for (const relPath of unionPaths(base, currentMap)) {\n if (shouldPreferIncomingOfflineRuntimeFile(relPath)) continue;\n if (shouldExcludePushRelPath(relPath, includeTranscripts, options.userExcludeRegexps)) continue;\n const baseEntry = base.get(relPath);\n const currentEntry = currentMap.get(relPath);\n if (currentEntry && currentEntry.sha256 !== baseEntry?.sha256) {\n upserts += 1;\n continue;\n }\n if (!currentEntry && baseEntry) {\n deletes += 1;\n }\n }\n\n return {\n upserts,\n deletes,\n total: upserts + deletes,\n };\n}\n\nexport async function applyOfflineSyncSnapshot(options: {\n root: string;\n snapshot: unknown;\n baseFiles?: readonly OfflineSyncFileState[];\n currentFiles?: readonly OfflineSyncFileState[];\n deferredPaths?: readonly string[];\n allowMissingConflictContent?: boolean;\n /**\n * Explicit INCOMING content source for snapshot records without inline\n * `contentBase64` (oversized generation members the client fetched\n * chunk-wise into a private staging root). Consulted only for such\n * records; return null to keep the metadata-only behavior (the local\n * file must hash-match the record). Returned buffers are digest-verified\n * against the incoming record before anything is published.\n */\n readIncomingFile?: (target: { path: string; sha256: string; bytes: number }) => Promise<Buffer | null>;\n writeConflictCopies?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n writeFile?: (target: OfflineSyncFileWriteTarget) => Promise<void>;\n writeStagingFile?: (target: OfflineSyncFileStagingWriteTarget) => Promise<void>;\n readStagingFile?: (target: OfflineSyncFileStagingReadTarget) => Promise<Buffer>;\n deleteFile?: (target: OfflineSyncFileDeleteTarget) => Promise<void>;\n recordDeletionRevision?: OfflineSyncRecordDeletionRevision;\n}): Promise<OfflineSyncApplySnapshotResult> {\n const snapshot = normalizeOfflineSyncSnapshot(options.snapshot);\n const baseMap = byPath(filterBaseFilesForMode(\n normalizeFileStates(options.baseFiles),\n snapshot.includeTranscripts,\n ));\n const incomingMap = byPath(snapshot.files);\n const deletionMtimeByPath = snapshot.deletions === undefined\n ? undefined\n : new Map(snapshot.deletions.map((deletion) => [deletion.path, deletion.mtimeMs] as const));\n const incomingBuffers = await verifyRecordContents(snapshot.files, \"offline sync snapshot\", {\n requireContent: false,\n readIncomingFile: options.readIncomingFile,\n });\n const root = await ensureSyncRoot(options.root, \"applyOfflineSyncSnapshot\");\n const currentFiles = options.currentFiles\n ? filterBaseFilesForMode(normalizeFileStates(options.currentFiles), snapshot.includeTranscripts).sort(compareByPath)\n : (await buildOfflineSyncSnapshot({\n root: root.abs,\n sourceId: \"local\",\n includeContent: false,\n includeTranscripts: snapshot.includeTranscripts,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n excludeNodeLocalState: false,\n })).files;\n const currentMap = byPath(currentFiles);\n const deferredPaths = new Set([...(options.deferredPaths ?? []),\n ...divergedEmbeddingGenerationDeferrals({\n incomingFiles: snapshot.files, baseFiles: [...baseMap.values()], currentFiles,\n }),\n ]);\n const omittedGenerationDirs = new Set(snapshot.omittedEmbeddingGenerationDirs ?? []);\n if (deletionMtimeByPath && options.recordDeletionRevision) {\n for (const [relPath, mtimeMs] of deletionMtimeByPath) {\n if (\n currentMap.has(relPath) ||\n deferredPaths.has(relPath) ||\n (omittedGenerationDirs.size > 0 &&\n isPathInOmittedEmbeddingGeneration(relPath, omittedGenerationDirs)) ||\n matchesOfflineSyncDefaultExclude(relPath)\n ) {\n continue;\n }\n await options.recordDeletionRevision({\n root: root.abs,\n path: relPath,\n filePath: await resolveSafeArchiveTarget(root, relPath),\n mtimeMs,\n });\n }\n }\n const nextBase = new Map(baseMap);\n const conflicts: OfflineSyncConflict[] = [];\n let upserted = 0;\n let deleted = 0;\n let skipped = 0;\n let pendingLocal = 0;\n const conflictIncomingBuffer = (relPath: string): Buffer | undefined => {\n if (options.writeConflictCopies === false) return undefined;\n const buffer = incomingBuffers.get(relPath);\n if (buffer || options.allowMissingConflictContent === true) return buffer;\n return requiredBuffer(incomingBuffers, relPath);\n };\n\n // Embedding generations travel and replace as ONE unit (issue #3148).\n // Incoming shards form the generation; an incoming legacy marker is a\n // complete generation too (converted to the sharded layout, preserving the\n // one-way migration). A deferral anywhere in a generation defers the WHOLE\n // generation; a generation the push omitted by filter is announced by the\n // snapshot and its absence is never a delete instruction.\n const incomingGenerations = detectIncomingEmbeddingGenerations(incomingMap.keys());\n const generationDirs = new Set([\n ...incomingGenerations.shardDirs,\n ...incomingGenerations.legacyMarkerDirs,\n ]);\n const deferredGenerationDirs = new Set<string>();\n for (const deferredPath of deferredPaths) {\n const membership = embeddingGenerationMembership(deferredPath);\n if (membership) {\n deferredGenerationDirs.add(membership.shardDir);\n }\n }\n const transactionResults: EmbeddingGenerationTransactionResult[] = [];\n // Included and omitted cannot describe the same generation.\n for (const shardDir of generationDirs) {\n if (omittedGenerationDirs.has(shardDir)) {\n throw new EmbeddingIndexStorageError(\n `offline sync snapshot both includes and omits embedding generation ${shardDir}; refusing to apply`,\n );\n }\n }\n // Fail closed BEFORE any publication: custom storage IO (encrypted or\n // otherwise) without the staging pair would make the generation transaction\n // fall back to unencrypted raw writes — a plaintext downgrade of the staged\n // generation. Callers must wire both staging hooks (the CLI does).\n if (\n generationDirs.size > 0 &&\n (options.writeFile || options.readFile || options.readFileDigest || options.deleteFile) &&\n !(options.writeStagingFile && options.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 for (const shardDir of generationDirs) {\n if (deferredGenerationDirs.has(shardDir)) continue;\n if (\n incomingGenerations.legacyMarkerDirs.has(shardDir) &&\n !incomingGenerations.shardDirs.has(shardDir)\n ) {\n // Cross-layout: an incoming legacy marker replaces a local sharded\n // generation as a whole (codex round 4). When shards are ALSO\n // incoming, the sharded set is the generation and the marker is\n // written as an inert artifact by the per-file loop below.\n const markerRel = [...incomingMap.keys()].find(\n (relPath) => embeddingMarkerDirOf(relPath) === shardDir.slice(0, -`/${EMBEDDING_SHARD_DIR_BASENAME}`.length),\n );\n if (!markerRel) continue;\n transactionResults.push(await applyEmbeddingGenerationTransaction({\n root,\n shardDirRel: shardDir,\n incomingShardPaths: [],\n incomingMarker: {\n path: markerRel,\n sha256: incomingMap.get(markerRel)!.sha256,\n buffer: incomingBuffers.get(markerRel) ?? null,\n },\n incomingMarkerPresent: false,\n incomingShardStates: new Map(),\n incomingBuffers,\n baseStates: baseMap,\n io: {\n readFile: options.readFile,\n writeStagingFile: options.writeStagingFile,\n readStagingFile: options.readStagingFile,\n deleteFile: options.deleteFile,\n },\n now: Date.now(),\n }));\n continue;\n }\n transactionResults.push(await applyEmbeddingGenerationTransaction({\n root,\n shardDirRel: shardDir,\n incomingShardPaths: [...incomingMap.keys()]\n .filter((relPath) => embeddingShardDirOf(relPath) === shardDir)\n .sort(),\n incomingMarker: null,\n incomingMarkerPresent: Boolean(\n incomingGenerations.legacyMarkerDirs.has(shardDir),\n ),\n incomingShardStates: new Map(\n [...incomingMap.values()]\n .filter((relPath) => embeddingShardDirOf(relPath.path) === shardDir)\n .map((state) => [state.path, state]),\n ),\n incomingBuffers,\n baseStates: baseMap,\n io: {\n readFile: options.readFile,\n writeStagingFile: options.writeStagingFile,\n readStagingFile: options.readStagingFile,\n deleteFile: options.deleteFile,\n },\n now: Date.now(),\n }));\n }\n // Whole-generation removal (codex round 6 P1): when the remote deleted a\n // previously shared sharded index, the deletion revisions cover EVERY\n // local member. Remove that generation as ONE atomic swap instead of\n // deleting shards one-by-one, so a crash or delete failure can never\n // expose a partial same-identity generation serving missing memories.\n const localGenerationDirs = new Set<string>();\n for (const relPath of currentMap.keys()) {\n const membership = embeddingGenerationMembership(relPath);\n if (membership?.kind === \"shard\") localGenerationDirs.add(membership.shardDir);\n }\n for (const shardDir of localGenerationDirs) {\n if (\n generationDirs.has(shardDir) ||\n deferredGenerationDirs.has(shardDir) ||\n omittedGenerationDirs.has(shardDir)\n ) {\n continue;\n }\n const localMembers = [...currentMap.keys()].filter(\n (relPath) => embeddingGenerationMembership(relPath)?.shardDir === shardDir,\n );\n if (localMembers.length === 0) continue;\n // Tombstone or shared-base absence authorizes whole-generation removal.\n const baseMembers = localMembers.filter((relPath) => baseMap.has(relPath));\n // Tombstone evidence is satisfied by the members the REMOTE knew: the\n // remote cannot tombstone local-only extras or an inert legacy marker,\n // and the removal sweeps those once the remote deletion is established.\n // Non-empty same-generation tombstones establish remote absence on\n // their own: they may name shards already absent locally (removed in an\n // earlier round), so the set is NOT required to intersect localMembers\n // (codex round 6, XiOb).\n const tombstonedMembers =\n deletionMtimeByPath === undefined\n ? []\n : [...deletionMtimeByPath.keys()].filter(\n (relPath) => embeddingGenerationMembership(relPath)?.shardDir === shardDir,\n );\n const tombstoneCovered = tombstonedMembers.length > 0;\n const baseEvidenced =\n baseMembers.length > 0 && baseMembers.every((relPath) => !incomingMap.has(relPath));\n if (!tombstoneCovered && !baseEvidenced) continue;\n transactionResults.push(await applyEmbeddingGenerationRemoval({\n root,\n shardDirRel: shardDir,\n io: { deleteFile: options.deleteFile, readFile: options.readFile },\n deletionMtimeByPath,\n baseStates: baseMap,\n now: Date.now(),\n }));\n }\n\n const transactionHandled = new Set<string>();\n let generationUpserted = 0;\n let generationDeleted = 0;\n for (const result of transactionResults) {\n if (result.deferredLocalDivergence) {\n for (const relPath of result.handledPaths) deferredPaths.add(relPath);\n deferredGenerationDirs.add(result.shardDirRel);\n continue;\n }\n generationUpserted += result.upserted;\n generationDeleted += result.deleted;\n for (const relPath of result.handledPaths) transactionHandled.add(relPath);\n // Record converted shard paths directly; they may not be in any input map.\n for (const [relPath, state] of result.writtenStates) {\n nextBase.set(relPath, state);\n transactionHandled.add(relPath);\n }\n for (const relPath of result.removedPaths) {\n nextBase.delete(relPath);\n transactionHandled.add(relPath);\n }\n }\n\n for (const relPath of unionPaths(baseMap, incomingMap, currentMap)) {\n const base = baseMap.get(relPath);\n const incoming = incomingMap.get(relPath);\n const currentEntry = currentMap.get(relPath);\n\n if (deferredPaths.has(relPath)) {\n if (base) nextBase.set(relPath, base);\n else nextBase.delete(relPath);\n skipped += 1;\n continue;\n }\n\n // The generation transaction already published or removed this path and\n // applied its nextBase bookkeeping above; nothing left to do.\n if (transactionHandled.has(relPath)) continue;\n\n // A deferral anywhere in a generation defers the WHOLE generation: no\n // partial replacement in either direction, local files and base entries\n // stay exactly as they are.\n const membership = embeddingGenerationMembership(relPath);\n if (membership && deferredGenerationDirs.has(membership.shardDir)) {\n if (base) nextBase.set(relPath, base);\n else nextBase.delete(relPath);\n skipped += 1;\n continue;\n }\n\n if (incoming) {\n if (currentEntry?.sha256 === incoming.sha256) {\n if (await setSafeFileMtime(root, relPath, incoming.mtimeMs)) {\n nextBase.set(relPath, toFileState(incoming));\n } else {\n if (base) nextBase.set(relPath, base);\n else nextBase.delete(relPath);\n pendingLocal += 1;\n }\n skipped += 1;\n continue;\n }\n // Remote unchanged from the shared base while the local file drifted:\n // keep the local copy (no content is needed to make that decision).\n // Members of a replaced generation never reach this branch — the\n // generation transaction or the deferral guard handled them above.\n if (\n shouldPreferIncomingOfflineRuntimeFile(relPath) &&\n currentEntry && base && incoming.sha256 === base.sha256\n ) {\n nextBase.set(relPath, base);\n skipped += 1;\n continue;\n }\n if (shouldPreferIncomingOfflineRuntimeFile(relPath)) {\n await writeSafeFile(root, relPath, requiredBuffer(incomingBuffers, relPath), options.writeFile, incoming.mtimeMs);\n nextBase.set(relPath, toFileState(incoming));\n upserted += 1;\n continue;\n }\n if (!currentEntry && base && incoming.sha256 === base.sha256) {\n nextBase.set(relPath, base);\n pendingLocal += 1;\n skipped += 1;\n continue;\n }\n if (!currentEntry && base && incoming.sha256 !== base.sha256) {\n conflicts.push(await recordConflict({\n root,\n relPath,\n reason: \"local_deleted_remote_modified\",\n baseSha256: base.sha256,\n incomingSha256: incoming.sha256,\n incomingBuffer: conflictIncomingBuffer(relPath),\n writeConflictCopies: options.writeConflictCopies !== false,\n sourceId: snapshot.sourceId,\n writeFile: options.writeFile,\n }));\n nextBase.set(relPath, base);\n continue;\n }\n if (!currentEntry && !base) {\n await writeSafeFile(root, relPath, requiredBuffer(incomingBuffers, relPath), options.writeFile, incoming.mtimeMs);\n nextBase.set(relPath, toFileState(incoming));\n upserted += 1;\n continue;\n }\n if (base && currentEntry && currentEntry.sha256 === base.sha256) {\n await writeSafeFile(root, relPath, requiredBuffer(incomingBuffers, relPath), options.writeFile, incoming.mtimeMs);\n nextBase.set(relPath, toFileState(incoming));\n upserted += 1;\n continue;\n }\n if (base && incoming.sha256 === base.sha256) {\n nextBase.set(relPath, base);\n pendingLocal += 1;\n skipped += 1;\n continue;\n }\n conflicts.push(await recordConflict({\n root,\n relPath,\n reason: base ? \"both_modified\" : \"remote_exists_for_local_create\",\n baseSha256: base?.sha256,\n localSha256: currentEntry?.sha256,\n incomingSha256: incoming.sha256,\n incomingBuffer: conflictIncomingBuffer(relPath),\n writeConflictCopies: options.writeConflictCopies !== false,\n sourceId: snapshot.sourceId,\n writeFile: options.writeFile,\n }));\n if (base) nextBase.set(relPath, base);\n continue;\n }\n\n // Node-local runtime state (#1786): a push-filtered remote snapshot\n // never carries these paths, so their absence is NOT a delete\n // instruction. Drop any stale base entry (pre-#1786 state files still\n // carry them) and leave the local file untouched — deleting a live\n // sqlite WAL/SHM here would corrupt the local LCM store.\n if (matchesOfflineSyncDefaultExclude(relPath)) {\n nextBase.delete(relPath);\n skipped += 1;\n continue;\n }\n if (!currentEntry) {\n nextBase.delete(relPath);\n skipped += 1;\n continue;\n }\n if (\n shouldPreferIncomingOfflineRuntimeFile(relPath) &&\n membership !== null && omittedGenerationDirs.has(membership.shardDir)\n ) {\n // The push omitted this whole generation because a filter excluded at\n // least one member (snapshot.omittedEmbeddingGenerationDirs): absence\n // is NOT a deletion — keep the local generation and its base entries\n // until it is pushed unfiltered or deleted with deletion metadata.\n pendingLocal += 1;\n skipped += 1;\n continue;\n }\n if (\n shouldPreferIncomingOfflineRuntimeFile(relPath) &&\n (base || shouldDeleteAbsentIncomingOfflineRuntimeFile(relPath))\n ) {\n await deleteSafeFile(\n root,\n relPath,\n options.deleteFile,\n deletionMtimeByPath?.get(relPath),\n );\n nextBase.delete(relPath);\n deleted += 1;\n continue;\n }\n if (shouldPreferIncomingOfflineRuntimeFile(relPath)) {\n pendingLocal += 1;\n skipped += 1;\n continue;\n }\n if (base && currentEntry.sha256 === base.sha256) {\n await deleteSafeFile(\n root,\n relPath,\n options.deleteFile,\n deletionMtimeByPath?.get(relPath),\n );\n nextBase.delete(relPath);\n deleted += 1;\n continue;\n }\n if (base) {\n conflicts.push({\n path: relPath,\n reason: \"local_modified_remote_deleted\",\n baseSha256: base.sha256,\n localSha256: currentEntry.sha256,\n });\n nextBase.set(relPath, base);\n continue;\n }\n pendingLocal += 1;\n skipped += 1;\n }\n\n return {\n upserted: upserted + generationUpserted,\n deleted: deleted + generationDeleted,\n skipped,\n pendingLocal,\n conflicts,\n nextBaseFiles: [...nextBase.values()].sort(compareByPath),\n };\n}\n\nexport async function applyOfflineSyncChangeset(options: {\n root: string;\n changeset: unknown;\n currentFiles?: readonly OfflineSyncFileState[];\n returnCurrentFiles?: boolean;\n writeConflictCopies?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n writeFile?: (target: OfflineSyncFileWriteTarget) => Promise<void>;\n deleteFile?: (target: OfflineSyncFileDeleteTarget) => Promise<void>;\n recordDeletionRevision?: OfflineSyncRecordDeletionRevision;\n}): Promise<OfflineSyncApplyChangesetResult> {\n let changeset: OfflineSyncChangeset;\n try {\n changeset = normalizeOfflineSyncChangeset(options.changeset);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n message.startsWith(\"offline sync\")\n ? message\n : `offline sync changeset invalid: ${message}`,\n );\n }\n const root = await ensureSyncRoot(options.root, \"applyOfflineSyncChangeset\");\n const records = changeset.changes\n .filter((change): change is Extract<OfflineSyncChange, { type: \"upsert\" }> => change.type === \"upsert\")\n .map((change) => change.file);\n const incomingBuffers = await verifyRecordContents(records, \"offline sync changeset\");\n const currentFiles = options.currentFiles\n ? filterBaseFilesForMode(normalizeFileStates(options.currentFiles), changeset.includeTranscripts).sort(compareByPath)\n : (await buildOfflineSyncSnapshotForPaths({\n root: root.abs,\n sourceId: \"local\",\n paths: changeset.changes.map((change) => change.path),\n includeContent: false,\n includeTranscripts: changeset.includeTranscripts,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n excludeNodeLocalState: false,\n })).files;\n const currentMap = byPath(currentFiles);\n const conflicts: OfflineSyncConflict[] = [];\n let appliedUpserts = 0;\n let appliedDeletes = 0;\n let skipped = 0;\n\n for (const change of changeset.changes) {\n const currentEntry = currentMap.get(change.path);\n if (change.type === \"upsert\") {\n if (currentEntry?.sha256 === change.file.sha256) {\n if (await setSafeFileMtime(root, change.path, change.file.mtimeMs)) {\n skipped += 1;\n } else {\n await writeSafeFile(root, change.path, requiredBuffer(incomingBuffers, change.path), options.writeFile, change.file.mtimeMs);\n currentMap.set(change.path, toFileState(change.file));\n appliedUpserts += 1;\n }\n continue;\n }\n if (!change.baseSha256) {\n if (!currentEntry) {\n await writeSafeFile(root, change.path, requiredBuffer(incomingBuffers, change.path), options.writeFile, change.file.mtimeMs);\n currentMap.set(change.path, toFileState(change.file));\n appliedUpserts += 1;\n continue;\n }\n conflicts.push(await recordConflict({\n root,\n relPath: change.path,\n reason: \"remote_exists_for_local_create\",\n localSha256: currentEntry.sha256,\n incomingSha256: change.file.sha256,\n incomingBuffer: incomingBuffers.get(change.path),\n writeConflictCopies: options.writeConflictCopies !== false,\n sourceId: changeset.sourceId,\n writeFile: options.writeFile,\n }));\n continue;\n }\n if (currentEntry?.sha256 === change.baseSha256) {\n await writeSafeFile(root, change.path, requiredBuffer(incomingBuffers, change.path), options.writeFile, change.file.mtimeMs);\n currentMap.set(change.path, toFileState(change.file));\n appliedUpserts += 1;\n continue;\n }\n conflicts.push(await recordConflict({\n root,\n relPath: change.path,\n reason: currentEntry ? \"remote_changed_for_local_update\" : \"remote_deleted_for_local_update\",\n baseSha256: change.baseSha256,\n localSha256: currentEntry?.sha256,\n incomingSha256: change.file.sha256,\n incomingBuffer: incomingBuffers.get(change.path),\n writeConflictCopies: options.writeConflictCopies !== false,\n sourceId: changeset.sourceId,\n writeFile: options.writeFile,\n }));\n continue;\n }\n\n if (!currentEntry) {\n if (change.mtimeMs !== undefined && options.recordDeletionRevision) {\n await options.recordDeletionRevision({\n root: root.abs,\n path: change.path,\n filePath: await resolveSafeArchiveTarget(root, change.path),\n mtimeMs: change.mtimeMs,\n });\n }\n skipped += 1;\n continue;\n }\n if (currentEntry.sha256 === change.baseSha256) {\n await deleteSafeFile(root, change.path, options.deleteFile, change.mtimeMs);\n currentMap.delete(change.path);\n appliedDeletes += 1;\n continue;\n }\n conflicts.push({\n path: change.path,\n reason: \"remote_changed_for_local_delete\",\n baseSha256: change.baseSha256,\n localSha256: currentEntry.sha256,\n });\n }\n\n return {\n appliedUpserts,\n appliedDeletes,\n skipped,\n conflicts,\n currentFiles: options.returnCurrentFiles === false\n ? [...currentMap.values()].sort(compareByPath)\n : (await buildOfflineSyncSnapshot({\n root: root.abs,\n sourceId: \"local\",\n includeContent: false,\n includeTranscripts: changeset.includeTranscripts,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n excludeNodeLocalState: false,\n })).files,\n ...(options.returnCurrentFiles === false ? { currentFilesComplete: false } : {}),\n };\n}\n\nasync function verifyRecordContents(\n records: readonly OfflineSyncFileRecord[],\n context: string,\n options: {\n requireContent?: boolean;\n readIncomingFile?: (target: { path: string; sha256: string; bytes: number }) => Promise<Buffer | null>;\n } = {},\n): Promise<Map<string, Buffer>> {\n const buffers = new Map<string, Buffer>();\n for (const record of records) {\n if (typeof record.contentBase64 !== \"string\") {\n if (options.readIncomingFile) {\n // Explicit INCOMING content source for records whose bytes travel\n // out-of-band (chunked fetch into the client's private staging\n // root). Never the local current-state file: the buffer is\n // digest-verified against the incoming record before anything is\n // published. null keeps the metadata-only behavior below.\n const incoming = await options.readIncomingFile({\n path: record.path,\n sha256: record.sha256,\n bytes: record.bytes,\n });\n if (incoming) {\n const digest = sha256Buffer(incoming);\n if (digest.sha256 !== record.sha256 || digest.bytes !== record.bytes) {\n throw new Error(`${context}: incoming content checksum mismatch for ${record.path}`);\n }\n buffers.set(record.path, incoming);\n continue;\n }\n }\n if (options.requireContent === false) continue;\n throw new Error(`${context}: contentBase64 is required for ${record.path}`);\n }\n const buffer = Buffer.from(record.contentBase64, \"base64\");\n const digest = sha256Buffer(buffer);\n if (digest.sha256 !== record.sha256 || digest.bytes !== record.bytes) {\n throw new Error(\n `${context}: content checksum mismatch for ${record.path}`,\n );\n }\n buffers.set(record.path, buffer);\n }\n return buffers;\n}\n\nfunction requiredBuffer(buffers: Map<string, Buffer>, relPath: string): Buffer {\n const buffer = buffers.get(relPath);\n if (!buffer) {\n throw new Error(`missing decoded content for ${relPath}`);\n }\n return buffer;\n}\n\nasync function ensureSyncRoot(rootPath: string, errorPrefix: string): Promise<SafeArchiveRoot> {\n const rootAbs = path.resolve(rootPath);\n await mkdir(rootAbs, { recursive: true });\n return prepareSafeArchiveRoot(rootAbs, errorPrefix, \"root\");\n}\n\nfunction byPath<T extends OfflineSyncFileState>(files: readonly T[]): Map<string, T> {\n const out = new Map<string, T>();\n for (const file of files) {\n out.set(validateArchiveRelativePath(file.path, \"offlineSync\"), file);\n }\n return out;\n}\n\nfunction unionPaths(...maps: Array<Map<string, unknown>>): string[] {\n const paths = new Set<string>();\n for (const map of maps) {\n for (const key of map.keys()) paths.add(key);\n }\n return [...paths].sort();\n}\n\nfunction toFileState(file: OfflineSyncFileState): OfflineSyncFileState {\n return {\n path: file.path,\n sha256: file.sha256,\n bytes: file.bytes,\n mtimeMs: file.mtimeMs,\n };\n}\n\nasync function writeSafeFile(\n root: SafeArchiveRoot,\n relPath: string,\n content: Buffer,\n writeFileHook?: (target: OfflineSyncFileWriteTarget) => Promise<void>,\n mtimeMs?: number,\n): Promise<void> {\n const target = await resolveSafeArchiveTarget(root, relPath);\n if (writeFileHook) {\n await writeFileHook({ root: root.abs, path: relPath, filePath: target, content });\n await setSafeFileMtime(root, relPath, mtimeMs);\n return;\n }\n await mkdir(path.dirname(target), { recursive: true });\n const tmp = path.join(\n path.dirname(target),\n `.remnic-sync.${process.pid}.${randomUUID()}.tmp`,\n );\n await writeFile(tmp, content);\n try {\n const targetStat = await lstat(target).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (targetStat?.isSymbolicLink()) {\n throw new Error(`offline sync target is a symlink: ${relPath}`);\n }\n await rename(tmp, target);\n await setSafeFileMtime(root, relPath, mtimeMs);\n } catch (error) {\n await unlink(tmp).catch(() => {});\n throw error;\n }\n}\n\n\n/**\n * Read the local file digest for a single relative path without applying\n * push-side exclude rules. Used by apply-side helpers that need to check\n * the current local state of a path that the push-side exclude would\n * reject (e.g. `state/lcm.sqlite`). Returns `null` if the file does not\n * exist, is not a regular file, or is a symlink.\n */\nasync function readLocalFileState(options: {\n rootAbs: string;\n relPath: string;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n signal?: AbortSignal;\n}): Promise<OfflineSyncFileState | null> {\n const filePath = await resolveSafeArchiveTarget(\n await prepareSafeArchiveRoot(options.rootAbs, \"readLocalFileState\", \"rootAbs\"),\n options.relPath,\n );\n const st = await lstat(filePath).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (!st || st.isSymbolicLink() || !st.isFile()) return null;\n throwIfOfflineSyncAborted(options.signal);\n let digest: OfflineSyncFileDigest;\n if (options.readFileDigest) {\n digest = await options.readFileDigest({ root: options.rootAbs, path: options.relPath, filePath });\n } else if (options.readFile) {\n const content = await options.readFile({ root: options.rootAbs, path: options.relPath, filePath });\n digest = sha256Buffer(content);\n } else {\n digest = await sha256OfflineSyncFile(filePath, options.signal);\n }\n throwIfOfflineSyncAborted(options.signal);\n return {\n path: options.relPath,\n sha256: digest.sha256,\n bytes: digest.bytes,\n mtimeMs: st.mtimeMs,\n };\n}\n\nexport async function applyOfflineSyncFileContentChunk(options: {\n root: string;\n sourceId: string;\n path: string;\n sha256: string;\n bytes: number;\n mtimeMs: number;\n offset?: number;\n content: Buffer;\n baseSha256?: string;\n includeTranscripts?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n writeFile?: (target: OfflineSyncFileWriteTarget) => Promise<void>;\n writeStagingFile?: (target: OfflineSyncFileStagingWriteTarget) => Promise<void>;\n writeFileChunks?: (target: OfflineSyncFileWriteChunksTarget) => Promise<void>;\n}): Promise<OfflineSyncApplyFileContentChunkResult> {\n const root = await ensureSyncRoot(options.root, \"applyOfflineSyncFileContentChunk\");\n const sourceId = normalizeSourceId(options.sourceId, \"sourceId\");\n const relPath = normalizeRelativePath(options.path, \"path\");\n const includeTranscripts = options.includeTranscripts !== false;\n if (shouldExcludeRelPath(relPath, includeTranscripts)) {\n throw new Error(`offline sync file content path is excluded: ${relPath}`);\n }\n const sha256 = assertSha256(options.sha256, \"sha256\");\n const bytes = assertNonNegativeInteger(options.bytes, \"bytes\");\n const mtimeMs = assertOfflineSyncMtimeMs(options.mtimeMs, \"mtimeMs\");\n const offset = options.offset === undefined\n ? 0\n : assertNonNegativeInteger(options.offset, \"offset\");\n const baseSha256 = options.baseSha256 === undefined\n ? undefined\n : assertSha256(options.baseSha256, \"baseSha256\");\n const preferIncomingRuntimeFile = shouldPreferIncomingOfflineRuntimeFile(relPath);\n if (!Buffer.isBuffer(options.content)) {\n throw new Error(\"content must be a Buffer\");\n }\n if (options.content.length > OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES) {\n throw new Error(\n `content chunk must be ${OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES} bytes or fewer`,\n );\n }\n if (bytes > 0 && options.content.length === 0) {\n throw new Error(\"content chunk must be non-empty before EOF\");\n }\n if (offset > bytes || offset + options.content.length > bytes) {\n throw new Error(`content chunk range exceeds declared file size for ${relPath}`);\n }\n if (options.writeFile && !options.writeFileChunks) {\n throw new Error(\"offline sync upload storage hooks require writeFileChunks\");\n }\n if (options.writeFile && !options.writeStagingFile) {\n throw new Error(\"offline sync upload storage hooks require writeStagingFile\");\n }\n const baseResult = {\n path: relPath,\n sha256,\n bytes,\n mtimeMs,\n offset,\n chunkBytes: options.content.length,\n done: offset + options.content.length === bytes,\n };\n const currentFileConflict = async (\n currentFile: OfflineSyncFileState | undefined,\n ): Promise<{ conflict: OfflineSyncConflict; currentFile?: OfflineSyncFileState } | null> => {\n if (!baseSha256 && currentFile && !preferIncomingRuntimeFile) {\n const conflict = await recordConflict({\n root,\n relPath,\n reason: \"remote_exists_for_local_create\",\n localSha256: currentFile.sha256,\n incomingSha256: sha256,\n writeConflictCopies: false,\n sourceId,\n writeFile: options.writeFile,\n });\n return {\n conflict,\n currentFile,\n };\n }\n if (baseSha256 && currentFile?.sha256 !== baseSha256 && !preferIncomingRuntimeFile) {\n const conflict = await recordConflict({\n root,\n relPath,\n reason: currentFile ? \"remote_changed_for_local_update\" : \"remote_deleted_for_local_update\",\n baseSha256,\n localSha256: currentFile?.sha256,\n incomingSha256: sha256,\n writeConflictCopies: false,\n sourceId,\n writeFile: options.writeFile,\n });\n return {\n conflict,\n ...(currentFile ? { currentFile } : {}),\n };\n }\n return null;\n };\n if (offset === 0) {\n await pruneOfflineUploadStaging(root);\n const currentFile = await readLocalFileState({\n rootAbs: root.abs,\n relPath,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n });\n if (currentFile && currentFile.sha256 === sha256) {\n await setSafeFileMtime(root, relPath, mtimeMs);\n return {\n ...baseResult,\n done: true,\n chunkBytes: 0,\n applied: false,\n skipped: true,\n currentFile: toFileState(currentFile),\n };\n }\n const conflictResult = await currentFileConflict(currentFile ? toFileState(currentFile) : undefined);\n if (conflictResult) {\n return {\n ...baseResult,\n done: true,\n chunkBytes: 0,\n applied: false,\n skipped: false,\n ...conflictResult,\n };\n }\n }\n\n const upload = await writeOfflineUploadChunk({\n root,\n sourceId,\n relPath,\n sha256,\n bytes,\n offset,\n content: options.content,\n readFile: options.readFile,\n writeFile: options.writeFile,\n writeStagingFile: options.writeStagingFile,\n });\n const done = baseResult.done;\n if (!done) {\n return {\n ...baseResult,\n applied: false,\n skipped: false,\n };\n }\n\n const digest = await digestOfflineUploadStagingContent({\n root,\n upload,\n readFile: options.readFile,\n });\n if (digest.sha256 !== sha256 || digest.bytes !== bytes) {\n await cleanupOfflineUpload(upload).catch(() => {});\n throw new Error(`offline sync upload checksum mismatch for ${relPath}`);\n }\n\n const currentFile = await readLocalFileState({\n rootAbs: root.abs,\n relPath,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n });\n const uploadedState: OfflineSyncFileState = {\n path: relPath,\n sha256,\n bytes,\n mtimeMs,\n };\n\n try {\n if (currentFile && currentFile.sha256 === sha256) {\n await setSafeFileMtime(root, relPath, mtimeMs);\n return {\n ...baseResult,\n applied: false,\n skipped: true,\n currentFile: uploadedState,\n };\n }\n\n const conflictResult = await currentFileConflict(currentFile ? toFileState(currentFile) : undefined);\n if (conflictResult) {\n return {\n ...baseResult,\n applied: false,\n skipped: false,\n ...conflictResult,\n };\n }\n\n await writeSafeFileFromUpload(root, relPath, upload, options.readFile, options.writeFileChunks, mtimeMs);\n return {\n ...baseResult,\n applied: true,\n skipped: false,\n currentFile: uploadedState,\n };\n } finally {\n await cleanupOfflineUpload(upload).catch(() => {});\n }\n}\n\n\nasync function deleteSafeFile(\n root: SafeArchiveRoot,\n relPath: string,\n deleteFile?: (target: OfflineSyncFileDeleteTarget) => Promise<void>,\n mtimeMs?: number,\n): Promise<void> {\n const target = await resolveSafeArchiveTarget(root, relPath);\n if (deleteFile) {\n await deleteFile({\n root: root.abs,\n path: relPath,\n filePath: target,\n ...(mtimeMs === undefined ? {} : { mtimeMs }),\n });\n return;\n }\n await unlink(target).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n throw error;\n });\n}\n\nasync function recordConflict(options: {\n root: SafeArchiveRoot;\n relPath: string;\n reason: OfflineSyncConflict[\"reason\"];\n baseSha256?: string;\n localSha256?: string;\n incomingSha256?: string;\n incomingBuffer?: Buffer;\n writeConflictCopies: boolean;\n sourceId: string;\n writeFile?: (target: OfflineSyncFileWriteTarget) => Promise<void>;\n}): Promise<OfflineSyncConflict> {\n let conflictPath: string | undefined;\n if (options.writeConflictCopies && options.incomingBuffer) {\n const sourceHash = hashText(options.sourceId).slice(0, 12);\n const stamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n conflictPath = `${SYNC_INTERNAL_DIR}/conflicts/${stamp}-${sourceHash}/${options.relPath}`;\n await writeSafeFile(options.root, conflictPath, options.incomingBuffer, options.writeFile);\n }\n return {\n path: options.relPath,\n reason: options.reason,\n baseSha256: options.baseSha256,\n localSha256: options.localSha256,\n incomingSha256: options.incomingSha256,\n ...(conflictPath ? { conflictPath } : {}),\n };\n}\n\nexport function defaultOfflineSyncStatePath(\n memoryDir: string,\n remoteId: string,\n namespace?: string,\n): string {\n const key = hashText(`${remoteId}\\0${namespace ?? \"\"}`).slice(0, 16);\n return path.join(path.resolve(memoryDir), SYNC_INTERNAL_DIR, \"state\", `${key}.json`);\n}\n\nexport async function readOfflineSyncState(\n statePath: string,\n): Promise<OfflineSyncState | null> {\n let raw: string;\n try {\n raw = await readFile(path.resolve(statePath), \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n const parsed = JSON.parse(raw) as unknown;\n return normalizeOfflineSyncState(parsed);\n}\n\nexport async function writeOfflineSyncState(\n statePath: string,\n state: OfflineSyncState,\n): Promise<void> {\n const normalized = normalizeOfflineSyncState(state);\n const target = path.resolve(statePath);\n await mkdir(path.dirname(target), { recursive: true });\n const tmp = path.join(\n path.dirname(target),\n `.remnic-sync-state.${process.pid}.${randomUUID()}.tmp`,\n );\n await writeFile(tmp, JSON.stringify(normalized, null, 2) + \"\\n\", \"utf-8\");\n try {\n await rename(tmp, target);\n } catch (error) {\n await unlink(tmp).catch(() => {});\n throw error;\n }\n}\n\nexport function offlineSyncStateFromSnapshot(options: {\n remoteId: string;\n namespace?: string;\n snapshot: OfflineSyncSnapshot;\n baseFiles?: readonly OfflineSyncFileState[];\n}): OfflineSyncState {\n const snapshot = normalizeOfflineSyncSnapshot(options.snapshot);\n return normalizeOfflineSyncState({\n version: OFFLINE_SYNC_STATE_VERSION,\n remoteId: options.remoteId,\n namespace: options.namespace,\n includeTranscripts: snapshot.includeTranscripts,\n lastSyncedAt: new Date().toISOString(),\n baseFiles: options.baseFiles ?? snapshot.files.map(toFileState),\n });\n}\n\nexport function normalizeOfflineSyncState(input: unknown): OfflineSyncState {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(\"offline sync state must be an object\");\n }\n const obj = input as Record<string, unknown>;\n if (obj.version !== OFFLINE_SYNC_STATE_VERSION) {\n throw new Error(`offline sync state version must be ${OFFLINE_SYNC_STATE_VERSION}`);\n }\n const namespace =\n typeof obj.namespace === \"string\" && obj.namespace.trim().length > 0\n ? obj.namespace.trim()\n : undefined;\n const baseFiles = normalizeFileStates(obj.baseFiles as readonly unknown[] | undefined)\n .sort(compareByPath);\n assertUniquePaths(baseFiles, \"offline sync state\");\n return {\n version: OFFLINE_SYNC_STATE_VERSION,\n remoteId: normalizeSourceId(obj.remoteId, \"remoteId\"),\n ...(namespace ? { namespace } : {}),\n includeTranscripts: assertBoolean(obj.includeTranscripts, \"includeTranscripts\"),\n lastSyncedAt: normalizeIsoString(obj.lastSyncedAt, \"lastSyncedAt\"),\n baseFiles,\n };\n}\n\nexport function fileStatesFromSnapshot(snapshot: OfflineSyncSnapshot): OfflineSyncFileState[] {\n return normalizeOfflineSyncSnapshot(snapshot).files.map(toFileState).sort(compareByPath);\n}\n"],"mappings":"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","names":["chunk","digest","currentFile"]}
|