@remnic/core 9.69.45 → 9.69.46
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.d.ts +6 -6
- package/dist/access-admin-ops-surface.js +25 -25
- package/dist/access-audit.js +2 -2
- package/dist/access-authorization-probe.d.ts +6 -6
- package/dist/access-authorization-probe.js +26 -26
- package/dist/access-boundary.d.ts +6 -6
- package/dist/access-boundary.js +25 -25
- package/dist/access-cli.js +70 -69
- package/dist/access-cli.js.map +1 -1
- package/dist/access-extraction-force-flush.d.ts +6 -6
- package/dist/access-extraction-force-flush.js +25 -25
- package/dist/access-http-briefing.d.ts +6 -6
- package/dist/access-http-briefing.js +26 -26
- package/dist/access-http-lcm-compaction.d.ts +6 -6
- package/dist/access-http-lifecycle-flush.d.ts +6 -6
- package/dist/access-http-offline-stream.d.ts +6 -6
- package/dist/access-http-query.js +27 -27
- package/dist/access-http.d.ts +7 -7
- package/dist/access-http.js +41 -41
- package/dist/access-identity-continuity-surface.d.ts +4 -4
- package/dist/access-identity-continuity-surface.js +25 -25
- package/dist/access-lcm-surface.d.ts +6 -6
- package/dist/access-lcm-surface.js +25 -25
- package/dist/access-mcp-shared-context-tools.d.ts +6 -6
- package/dist/access-mcp.d.ts +6 -6
- package/dist/access-mcp.js +33 -33
- package/dist/access-namespace-preflight.js +25 -25
- package/dist/access-observe-transcript.d.ts +4 -4
- package/dist/access-observe-write-category.d.ts +2 -2
- package/dist/access-observe-write-category.js +4 -4
- package/dist/access-observe-write-surface.d.ts +6 -6
- package/dist/access-observe-write-surface.js +25 -25
- package/dist/access-offline-manifest.d.ts +4 -4
- package/dist/access-operations-batch.js +26 -26
- package/dist/access-operations.d.ts +6 -6
- package/dist/access-operations.js +32 -32
- package/dist/access-recall-concurrency.d.ts +6 -6
- package/dist/access-recall-concurrency.js +25 -25
- package/dist/access-recall-response.d.ts +6 -6
- package/dist/access-recall-response.js +25 -25
- package/dist/access-recall-surface.d.ts +6 -6
- package/dist/access-recall-surface.js +25 -25
- package/dist/access-schema.js +3 -3
- package/dist/{access-service-CDteK_Gt.d.ts → access-service-DGynYlbE.d.ts} +4 -4
- package/dist/access-service-helpers.d.ts +6 -6
- package/dist/access-service.d.ts +6 -6
- package/dist/access-service.js +25 -25
- package/dist/access-surface-catalog.d.ts +6 -6
- package/dist/access-surface-catalog.js +27 -27
- package/dist/access-wearables-meetings-surface.d.ts +2 -2
- package/dist/bootstrap.d.ts +4 -4
- package/dist/briefing-window.d.ts +1 -1
- package/dist/briefing.d.ts +1 -1
- package/dist/briefing.js +8 -8
- package/dist/buffer.d.ts +1 -1
- package/dist/causal-consolidation.js +9 -9
- package/dist/{chunk-R4HFCATE.js → chunk-3NYM6JA4.js} +2 -2
- package/dist/{chunk-WNMVUWI7.js → chunk-3UQIS2GC.js} +2 -2
- package/dist/{chunk-46A4RGBC.js → chunk-47C6DF43.js} +3 -3
- package/dist/{chunk-NRFUYVW7.js → chunk-4ECS33D4.js} +2 -2
- package/dist/{chunk-C3MCMFNV.js → chunk-5EHPB6RL.js} +2 -2
- package/dist/{chunk-SPN5YFXN.js → chunk-62NYUFNH.js} +7 -7
- package/dist/{chunk-TFS5FAAC.js → chunk-66QOUYNS.js} +66 -47
- package/dist/chunk-66QOUYNS.js.map +1 -0
- package/dist/{chunk-OOBUWMPY.js → chunk-7BNB7KHB.js} +4 -4
- package/dist/{chunk-Z5YNVWRD.js → chunk-AN2O4KZY.js} +2 -2
- package/dist/{chunk-JUOJGZPV.js → chunk-AYP2FZFA.js} +2 -2
- package/dist/{chunk-T2ZNUWUY.js → chunk-AYZHHMTK.js} +2 -2
- package/dist/{chunk-LQVXSRAJ.js → chunk-B4EGAHHS.js} +2 -2
- package/dist/{chunk-JPNUKKSL.js → chunk-CFIHVWYZ.js} +2 -2
- package/dist/{chunk-D3DJYGU2.js → chunk-CWMMKFO7.js} +3 -3
- package/dist/{chunk-OREGA7GY.js → chunk-D5DTZBTV.js} +6 -6
- package/dist/{chunk-BOWAP64Q.js → chunk-DDBLZJRV.js} +2 -2
- package/dist/{chunk-SHEHQBCG.js → chunk-DUJYRVUD.js} +638 -45
- package/dist/chunk-DUJYRVUD.js.map +1 -0
- package/dist/{chunk-DSHSQGSN.js → chunk-EAZ3YZKN.js} +2 -2
- package/dist/{chunk-WCQ7L54B.js → chunk-EEHQY7ER.js} +2 -2
- package/dist/{chunk-2WMXZYMS.js → chunk-F5V7KRQS.js} +2 -2
- package/dist/{chunk-HVGCQMTQ.js → chunk-FMEP2RB5.js} +2 -2
- package/dist/{chunk-NGAFYIHQ.js → chunk-FSH6KRKO.js} +2 -2
- package/dist/{chunk-E5VOKZQV.js → chunk-GGY7WKMB.js} +1 -1
- package/dist/{chunk-UJXNBZYJ.js → chunk-GYYLZOSO.js} +4 -4
- package/dist/{chunk-NKDQXDFL.js → chunk-HXDXR2FH.js} +17 -17
- package/dist/{chunk-OFBJD3V5.js → chunk-HYWPUYLO.js} +2 -2
- package/dist/{chunk-KQAFEZQX.js → chunk-IPLYGWQF.js} +5 -5
- package/dist/{chunk-ZQ533JDE.js → chunk-IXMWTNNY.js} +2 -2
- package/dist/{chunk-WMTYEQO5.js → chunk-J5OXWG66.js} +2 -2
- package/dist/{chunk-C3YEB7CR.js → chunk-JOP7W24J.js} +4 -4
- package/dist/{chunk-5TKHJ5RW.js → chunk-KF57IQFX.js} +12 -12
- package/dist/chunk-M4DB6ZNN.js +87 -0
- package/dist/chunk-M4DB6ZNN.js.map +1 -0
- package/dist/{chunk-5XTILJRI.js → chunk-N46SNYMC.js} +2 -2
- package/dist/{chunk-HBGSZ62Z.js → chunk-ORQ7AZMU.js} +5 -5
- package/dist/{chunk-ZLVURGAJ.js → chunk-OV7GJ4KW.js} +2 -2
- package/dist/{chunk-6II55MXS.js → chunk-P7S7BVBJ.js} +2 -2
- package/dist/{chunk-IAT5WFEU.js → chunk-QUFJ3NJE.js} +258 -794
- package/dist/chunk-QUFJ3NJE.js.map +1 -0
- package/dist/{chunk-LZAJONO5.js → chunk-S3SND7SO.js} +2 -2
- package/dist/{chunk-K75H7FSO.js → chunk-S7KDHFF2.js} +2 -2
- package/dist/{chunk-Q4MI2KCG.js → chunk-SRRZZHA5.js} +2 -2
- package/dist/{chunk-AOMUIF3R.js → chunk-SW42MMAH.js} +2 -2
- package/dist/{chunk-B55FYF6F.js → chunk-T5NI5K46.js} +2 -2
- package/dist/{chunk-J6NEOCQC.js → chunk-TE6B2UU6.js} +2 -2
- package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
- package/dist/{chunk-T3F2HWIG.js → chunk-TZ44E732.js} +2 -2
- package/dist/{chunk-A2YN3FR4.js → chunk-U4ESGVZ2.js} +3 -3
- package/dist/{chunk-F6AYWLRN.js → chunk-UEJY6ZTQ.js} +2 -2
- package/dist/{chunk-7LKXP4QG.js → chunk-UGGOQKO6.js} +25 -25
- package/dist/{chunk-M7ECD3KN.js → chunk-UOREPQ3C.js} +2 -2
- package/dist/{chunk-IFULZYYQ.js → chunk-VGRVJ6Z6.js} +2 -2
- package/dist/{chunk-N6I257OM.js → chunk-WOBMSMUK.js} +3 -3
- package/dist/{chunk-VA5QRTZX.js → chunk-XLZZLUWL.js} +2 -2
- package/dist/{chunk-MDYZCPNQ.js → chunk-Y3XHIWVP.js} +2 -2
- package/dist/{chunk-2LRO73MN.js → chunk-YFVIA5A6.js} +2 -2
- package/dist/{chunk-YHSEUZV5.js → chunk-YUQPUK6H.js} +2 -2
- package/dist/{cli-CZDhIcxu.d.ts → cli-Cik3H7q1.d.ts} +3 -3
- package/dist/cli.d.ts +7 -7
- package/dist/cli.js +56 -56
- package/dist/coding/export-okf-codegraph.js +7 -7
- package/dist/compounding/engine.d.ts +1 -1
- package/dist/compounding/engine.js +8 -8
- package/dist/connectors/codex-materialize-runner.js +8 -8
- package/dist/connectors/index.js +8 -8
- package/dist/consolidation-provenance-check.d.ts +1 -1
- package/dist/consolidation-undo.d.ts +1 -1
- package/dist/contradiction/index.d.ts +2 -2
- package/dist/convergence-refresh.d.ts +1 -1
- package/dist/convergence-refresh.js +10 -10
- package/dist/corpus-watermark.js +10 -10
- package/dist/deep-recall-http-glue.d.ts +6 -6
- package/dist/deep-recall-http-glue.js +4 -4
- package/dist/deep-recall-mcp-tools.d.ts +6 -6
- package/dist/entity-retrieval.d.ts +1 -1
- package/dist/entity-retrieval.js +8 -8
- package/dist/explicit-capture.d.ts +4 -4
- package/dist/explicit-capture.js +2 -2
- package/dist/external-wiki-access.d.ts +6 -6
- package/dist/external-wiki-access.js +26 -26
- package/dist/external-wiki-mcp-tools.d.ts +6 -6
- package/dist/extraction.js +8 -8
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/{index-TBPe6NvB.d.ts → index-Zb6SUV4R.d.ts} +1 -1
- package/dist/index.d.ts +14 -14
- package/dist/index.js +70 -69
- package/dist/lcm/index.js +3 -3
- package/dist/location/index.d.ts +3 -3
- package/dist/location/index.js +10 -10
- package/dist/maintenance/memory-governance.js +8 -8
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +1 -1
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +8 -8
- package/dist/maintenance/rebuild-memory-projection.d.ts +1 -1
- package/dist/maintenance/rebuild-memory-projection.js +9 -9
- package/dist/{maintenance-B813YFWJ.d.ts → maintenance-Du_VRvVg.d.ts} +1 -1
- package/dist/mcp-memory-inspector-app.d.ts +6 -6
- package/dist/memory-age.d.ts +100 -0
- package/dist/memory-age.js +22 -0
- package/dist/memory-age.js.map +1 -0
- package/dist/memory-subject-cli.d.ts +6 -6
- package/dist/memory-subject.d.ts +6 -6
- package/dist/memory-worth-outcomes.d.ts +1 -1
- package/dist/namespaces/migrate.d.ts +1 -1
- package/dist/namespaces/migrate.js +9 -9
- package/dist/namespaces/search.js +3 -3
- package/dist/namespaces/storage.d.ts +1 -1
- package/dist/namespaces/storage.js +8 -8
- package/dist/operator-doctor-corpus.js +11 -11
- package/dist/operator-toolkit.d.ts +1 -1
- package/dist/operator-toolkit.js +16 -16
- package/dist/orchestration/compression-guideline-coordinator.d.ts +1 -1
- package/dist/orchestration/maintenance.d.ts +2 -2
- package/dist/orchestration/maintenance.js +16 -16
- package/dist/{orchestrator-BCvQavIS.d.ts → orchestrator-D9U3Zgjp.d.ts} +3 -3
- package/dist/orchestrator.d.ts +4 -4
- package/dist/orchestrator.js +70 -69
- package/dist/{public-http-NH72a6aa.d.ts → public-http-AabioFLh.d.ts} +1 -1
- package/dist/recall-navigation-http-glue.d.ts +6 -6
- package/dist/recall-navigation-mcp-tools.d.ts +6 -6
- package/dist/recall-navigation-operations.js +26 -26
- package/dist/recall-navigation.js +25 -25
- package/dist/search/factory.js +2 -2
- package/dist/search/index.js +4 -4
- package/dist/semantic-consolidation.js +9 -9
- package/dist/semantic-rule-promotion.js +8 -8
- package/dist/semantic-rule-verifier.js +8 -8
- package/dist/{service-Echc5Xso.d.ts → service-ByjbCuj7.d.ts} +1 -1
- package/dist/source-agent-qualifier.js +8 -8
- package/dist/standup/build.js +8 -8
- package/dist/{storage-ClkHCQSE.d.ts → storage-CbdF077z.d.ts} +16 -2
- package/dist/storage.d.ts +1 -1
- package/dist/storage.js +7 -7
- package/dist/support-passport/index.d.ts +9 -9
- package/dist/support-passport/index.js +28 -28
- package/dist/{tagging-ksktJ60G.d.ts → tagging-CF7DNV7_.d.ts} +1 -1
- package/dist/tier-migration.d.ts +1 -1
- package/dist/transfer/autodetect.js +1 -1
- package/dist/transfer/backup.js +1 -1
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/export-okf.js +8 -8
- package/dist/verified-recall.js +8 -8
- package/dist/who-knows-cli.d.ts +6 -6
- package/dist/who-knows-cli.js +9 -9
- package/dist/who-knows.d.ts +6 -6
- package/dist/who-knows.js +8 -8
- package/package.json +2 -2
- package/src/dedup/merge.test.ts +185 -8
- package/src/memory-age.test.ts +106 -0
- package/src/memory-age.ts +196 -0
- package/src/orchestration/recall-search-pipeline.test.ts +207 -1
- package/src/orchestration/recall-search-pipeline.ts +13 -9
- package/src/orchestration/semantic-merge-commit-effects.ts +31 -9
- package/src/orchestration/semantic-merge-persist.ts +16 -5
- package/src/storage/cas-revision-host.ts +22 -0
- package/src/storage/cas-revision-store.test.ts +44 -1
- package/src/storage/cas-revision-store.ts +23 -0
- package/src/storage/tombstone-blocked-capture-sync.ts +26 -1
- package/src/storage-frontmatter-cas.test.ts +49 -1
- package/src/storage.ts +1 -1
- package/dist/chunk-IAT5WFEU.js.map +0 -1
- package/dist/chunk-SHEHQBCG.js.map +0 -1
- package/dist/chunk-TFS5FAAC.js.map +0 -1
- /package/dist/{chunk-R4HFCATE.js.map → chunk-3NYM6JA4.js.map} +0 -0
- /package/dist/{chunk-WNMVUWI7.js.map → chunk-3UQIS2GC.js.map} +0 -0
- /package/dist/{chunk-46A4RGBC.js.map → chunk-47C6DF43.js.map} +0 -0
- /package/dist/{chunk-NRFUYVW7.js.map → chunk-4ECS33D4.js.map} +0 -0
- /package/dist/{chunk-C3MCMFNV.js.map → chunk-5EHPB6RL.js.map} +0 -0
- /package/dist/{chunk-SPN5YFXN.js.map → chunk-62NYUFNH.js.map} +0 -0
- /package/dist/{chunk-OOBUWMPY.js.map → chunk-7BNB7KHB.js.map} +0 -0
- /package/dist/{chunk-Z5YNVWRD.js.map → chunk-AN2O4KZY.js.map} +0 -0
- /package/dist/{chunk-JUOJGZPV.js.map → chunk-AYP2FZFA.js.map} +0 -0
- /package/dist/{chunk-T2ZNUWUY.js.map → chunk-AYZHHMTK.js.map} +0 -0
- /package/dist/{chunk-LQVXSRAJ.js.map → chunk-B4EGAHHS.js.map} +0 -0
- /package/dist/{chunk-JPNUKKSL.js.map → chunk-CFIHVWYZ.js.map} +0 -0
- /package/dist/{chunk-D3DJYGU2.js.map → chunk-CWMMKFO7.js.map} +0 -0
- /package/dist/{chunk-OREGA7GY.js.map → chunk-D5DTZBTV.js.map} +0 -0
- /package/dist/{chunk-BOWAP64Q.js.map → chunk-DDBLZJRV.js.map} +0 -0
- /package/dist/{chunk-DSHSQGSN.js.map → chunk-EAZ3YZKN.js.map} +0 -0
- /package/dist/{chunk-WCQ7L54B.js.map → chunk-EEHQY7ER.js.map} +0 -0
- /package/dist/{chunk-2WMXZYMS.js.map → chunk-F5V7KRQS.js.map} +0 -0
- /package/dist/{chunk-HVGCQMTQ.js.map → chunk-FMEP2RB5.js.map} +0 -0
- /package/dist/{chunk-NGAFYIHQ.js.map → chunk-FSH6KRKO.js.map} +0 -0
- /package/dist/{chunk-E5VOKZQV.js.map → chunk-GGY7WKMB.js.map} +0 -0
- /package/dist/{chunk-UJXNBZYJ.js.map → chunk-GYYLZOSO.js.map} +0 -0
- /package/dist/{chunk-NKDQXDFL.js.map → chunk-HXDXR2FH.js.map} +0 -0
- /package/dist/{chunk-OFBJD3V5.js.map → chunk-HYWPUYLO.js.map} +0 -0
- /package/dist/{chunk-KQAFEZQX.js.map → chunk-IPLYGWQF.js.map} +0 -0
- /package/dist/{chunk-ZQ533JDE.js.map → chunk-IXMWTNNY.js.map} +0 -0
- /package/dist/{chunk-WMTYEQO5.js.map → chunk-J5OXWG66.js.map} +0 -0
- /package/dist/{chunk-C3YEB7CR.js.map → chunk-JOP7W24J.js.map} +0 -0
- /package/dist/{chunk-5TKHJ5RW.js.map → chunk-KF57IQFX.js.map} +0 -0
- /package/dist/{chunk-5XTILJRI.js.map → chunk-N46SNYMC.js.map} +0 -0
- /package/dist/{chunk-HBGSZ62Z.js.map → chunk-ORQ7AZMU.js.map} +0 -0
- /package/dist/{chunk-ZLVURGAJ.js.map → chunk-OV7GJ4KW.js.map} +0 -0
- /package/dist/{chunk-6II55MXS.js.map → chunk-P7S7BVBJ.js.map} +0 -0
- /package/dist/{chunk-LZAJONO5.js.map → chunk-S3SND7SO.js.map} +0 -0
- /package/dist/{chunk-K75H7FSO.js.map → chunk-S7KDHFF2.js.map} +0 -0
- /package/dist/{chunk-Q4MI2KCG.js.map → chunk-SRRZZHA5.js.map} +0 -0
- /package/dist/{chunk-AOMUIF3R.js.map → chunk-SW42MMAH.js.map} +0 -0
- /package/dist/{chunk-B55FYF6F.js.map → chunk-T5NI5K46.js.map} +0 -0
- /package/dist/{chunk-J6NEOCQC.js.map → chunk-TE6B2UU6.js.map} +0 -0
- /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
- /package/dist/{chunk-T3F2HWIG.js.map → chunk-TZ44E732.js.map} +0 -0
- /package/dist/{chunk-A2YN3FR4.js.map → chunk-U4ESGVZ2.js.map} +0 -0
- /package/dist/{chunk-F6AYWLRN.js.map → chunk-UEJY6ZTQ.js.map} +0 -0
- /package/dist/{chunk-7LKXP4QG.js.map → chunk-UGGOQKO6.js.map} +0 -0
- /package/dist/{chunk-M7ECD3KN.js.map → chunk-UOREPQ3C.js.map} +0 -0
- /package/dist/{chunk-IFULZYYQ.js.map → chunk-VGRVJ6Z6.js.map} +0 -0
- /package/dist/{chunk-N6I257OM.js.map → chunk-WOBMSMUK.js.map} +0 -0
- /package/dist/{chunk-VA5QRTZX.js.map → chunk-XLZZLUWL.js.map} +0 -0
- /package/dist/{chunk-MDYZCPNQ.js.map → chunk-Y3XHIWVP.js.map} +0 -0
- /package/dist/{chunk-2LRO73MN.js.map → chunk-YFVIA5A6.js.map} +0 -0
- /package/dist/{chunk-YHSEUZV5.js.map → chunk-YUQPUK6H.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage/deletion-revision-store.ts","../src/storage/cas-revision-store.ts","../src/storage/cas-revision-host.ts","../src/storage/tombstone-blocked-capture-mutation.ts","../src/storage/tombstone-blocked-capture-sync.ts","../src/storage/tombstone-blocked-capture-index.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { lstat, mkdir, open, readFile, rename, unlink, type FileHandle } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { resolveSafeStoragePath } from \"../storage-paths.js\";\nimport type { MemoryFile, MemoryFrontmatter } from \"../types.js\";\nimport { isErrnoCode } from \"../utils/errno.js\";\nimport { withHeldFileLock, type HeldFileLockController } from \"../utils/serialize-mutations.js\";\nimport { log } from \"../logger.js\";\n\ntype DeletionRevisionMetadata = {\n version: 1;\n deletions: Array<{ path: string; mtimeMs: number }>;\n};\n\ntype InvalidationCommitMetadata = {\n version: 1;\n commits: Array<{ memoryId: string; fingerprint: string; committedAt: number }>;\n};\n\ntype InvalidationCommit = { fingerprint: string; committedAt: number };\n\ntype ManagedStoragePathGuard = (filePath: string, method: string) => string;\n\nexport type DeletionRevisionStoreOptions = {\n baseDir: string;\n deletionRevisionMetadataPath: string;\n invalidationCommitMetadataPath: string;\n deletionRevisionLockPath: string;\n assertManagedStoragePath: ManagedStoragePathGuard;\n};\n\nconst DELETION_REVISION_MAX_MTIME_MS = 8_640_000_000_000_000;\nconst DELETION_REVISION_LOCK_STALE_MS = 60_000;\nconst DELETION_REVISION_LOCK_MAX_WAIT_MS = 120_000;\nconst INVALIDATION_COMMIT_MAX_TIMESTAMP_MS = 8_640_000_000_000_000;\nconst INVALIDATION_PROOF_QUARANTINE_MAX_IDS = 1024;\n\nfunction canonicalizeInvalidationEvidence(value: unknown): unknown {\n if (Array.isArray(value)) return value.map((item) => canonicalizeInvalidationEvidence(item));\n if (value && typeof value === \"object\") {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n result[key] = canonicalizeInvalidationEvidence((value as Record<string, unknown>)[key]);\n }\n return result;\n }\n return value;\n}\n\nexport function invalidationCommitFingerprint(memory: Pick<MemoryFile, \"content\" | \"frontmatter\">): string {\n const frontmatter = { ...memory.frontmatter };\n delete frontmatter.accessCount;\n delete frontmatter.lastAccessed;\n return createHash(\"sha256\")\n .update(\n JSON.stringify(\n canonicalizeInvalidationEvidence({\n content: memory.content,\n frontmatter,\n }),\n ),\n )\n .digest(\"hex\");\n}\n\n/**\n * #2813 (P1): revision identity stamped onto an Error thrown by a\n * compare-and-swap write AFTER the durable mutation landed (a post-commit\n * step failed). Body equality cannot attribute a standing body — a\n * concurrent writer's identical deterministic merge is byte-for-byte the\n * same — so throw-path ownership must come from this receipt, never from\n * comparing content afterward.\n */\nexport function markCasCommittedRevision(err: unknown, revision: string): void {\n if (err instanceof Error) {\n (err as Error & { casCommittedRevision?: string }).casCommittedRevision = revision;\n }\n}\n\nexport function casCommittedRevisionOf(err: unknown): string | undefined {\n return err instanceof Error\n ? (err as Error & { casCommittedRevision?: string }).casCommittedRevision\n : undefined;\n}\n\n/**\n * #2813 (P1, round 3): the CAS receipt mint — the token the next durable\n * content write records in the per-target sidecar (CasRevisionStore). NOT a\n * bare wall-clock read: the stamp is strictly greater than the target's\n * previous token (max(clock, prev + 1ms)), so two commits to the same target\n * can never share a receipt — not within one millisecond, not across a\n * backward clock step. It is a per-target monotonic sequence wearing\n * ISO-8601 clothes; public `frontmatter.updated` never carries it (#2807).\n */\nexport function nextCasRevisionIso(previous: string | undefined, now = new Date()): string {\n const previousMs = previous !== undefined ? new Date(previous).getTime() : Number.NaN;\n if (Number.isFinite(previousMs) && now.getTime() <= previousMs) {\n return new Date(previousMs + 1).toISOString();\n }\n return now.toISOString();\n}\n\n/**\n * #2813 P1 (#2807 CI repair): whether a durable frontmatter rewrite changed\n * anything SEMANTIC. Comparison is STRUCTURAL, through the same\n * canonicalizing fingerprint the invalidation proof uses — a `!==` field\n * loop would flag every array-valued field (tags, lineage, sources) because\n * two parses of identical bytes are never reference-equal. Access\n * telemetry (`accessCount`/`lastAccessed` — exactly the fields the\n * fingerprint strips) is not semantic: an access bump must not advance the\n * target's CAS revision token, or it would invalidate every pending\n * conditional write. Every other change — status flips, caller-supplied\n * `updated`, provenance — is a semantic mutation and mints a new token at\n * the write chokepoint, so a receipt issued before it can never\n * \"recognise\" the record afterwards (#2807 round 5).\n */\nexport function isSemanticFrontmatterChange(\n before: MemoryFrontmatter,\n after: MemoryFrontmatter,\n): boolean {\n return invalidationCommitFingerprint({ content: \"\", frontmatter: before })\n !== invalidationCommitFingerprint({ content: \"\", frontmatter: after });\n}\n\n/**\n * Runs a compare-and-swap write's post-commit steps. The durable mutation\n * has already landed by the time `run` executes, so any throw it raises is\n * stamped with the commit receipt — callers must attribute the standing\n * body by that identity, never by body equality (#2813 P1).\n */\nexport async function withCasCommitReceipt<T>(revision: string, run: () => Promise<T>): Promise<T> {\n try {\n return await run();\n } catch (err) {\n markCasCommittedRevision(err, revision);\n throw err;\n }\n}\n\nfunction isValidInvalidationCommitTimestamp(value: unknown): value is number {\n return (\n typeof value === \"number\" &&\n Number.isFinite(value) &&\n value >= 0 &&\n value <= INVALIDATION_COMMIT_MAX_TIMESTAMP_MS\n );\n}\n\nfunction isValidInvalidationCommitFingerprint(value: unknown): value is string {\n return typeof value === \"string\" && /^[a-f0-9]{64}$/.test(value);\n}\n\nfunction isValidMemoryId(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0 && !value.includes(\"\\0\");\n}\n\nexport function isValidManagedStoragePath(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length > 0 &&\n !value.includes(\"\\\\\") &&\n !value.includes(\"\\0\") &&\n !path.posix.isAbsolute(value) &&\n path.posix.normalize(value) === value &&\n value !== \".\" &&\n value !== \"..\" &&\n !value.startsWith(\"../\")\n );\n}\n\nfunction deletionRevisionPathIdentity(value: string): string {\n return value.normalize(\"NFC\").toUpperCase().toLowerCase();\n}\n\nexport class DeletionRevisionStore {\n private readonly options: DeletionRevisionStoreOptions;\n private readonly invalidationProofQuarantine = new Set<string>();\n private invalidationProofQuarantineFull = false;\n private invalidationProofQuarantineFullAt: number | null = null;\n\n constructor(options: DeletionRevisionStoreOptions) {\n this.options = options;\n }\n private quarantineInvalidationProof(memoryId: string): void {\n if (this.invalidationProofQuarantineFull) {\n const nextBoundary = Date.now() + 1;\n this.invalidationProofQuarantineFullAt = Math.max(\n this.invalidationProofQuarantineFullAt ?? 0,\n nextBoundary,\n );\n return;\n }\n if (this.invalidationProofQuarantine.has(memoryId)) return;\n if (this.invalidationProofQuarantine.size >= INVALIDATION_PROOF_QUARANTINE_MAX_IDS) {\n this.invalidationProofQuarantineFull = true;\n this.invalidationProofQuarantineFullAt = Date.now() + 1;\n return;\n }\n this.invalidationProofQuarantine.add(memoryId);\n }\n private async resolveConfiguredStoragePath(targetPath: string): Promise<string> {\n const baseDir = path.resolve(this.options.baseDir);\n const relativePath = path.relative(baseDir, path.resolve(targetPath));\n return resolveSafeStoragePath(baseDir, relativePath);\n }\n\n private async resolveManagedStoragePath(filePath: string, method: string): Promise<{\n target: string;\n relativePath: string;\n }> {\n const assertedPath = this.options.assertManagedStoragePath(filePath, method);\n const target = await this.resolveConfiguredStoragePath(assertedPath);\n const relativePath = path.relative(path.resolve(this.options.baseDir), target).split(path.sep).join(\"/\");\n return { target, relativePath };\n }\n\n private parseDeletionRevisionMetadata(raw: string): Map<string, number> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\"Deletion revision metadata is invalid.\");\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"Deletion revision metadata is invalid.\");\n }\n const root = parsed as Record<string, unknown>;\n if (\n Object.keys(root).sort().join(\",\") !== \"deletions,version\" ||\n root.version !== 1 ||\n !Array.isArray(root.deletions)\n ) {\n throw new Error(\"Deletion revision metadata is invalid.\");\n }\n const revisions = new Map<string, number>();\n const pathByIdentity = new Map<string, string>();\n for (const rawEntry of root.deletions) {\n if (!rawEntry || typeof rawEntry !== \"object\" || Array.isArray(rawEntry)) {\n throw new Error(\"Deletion revision metadata is invalid.\");\n }\n const entry = rawEntry as Record<string, unknown>;\n if (\n Object.keys(entry).sort().join(\",\") !== \"mtimeMs,path\" ||\n !isValidManagedStoragePath(entry.path) ||\n typeof entry.mtimeMs !== \"number\" ||\n !Number.isFinite(entry.mtimeMs) ||\n entry.mtimeMs < 0 ||\n entry.mtimeMs > DELETION_REVISION_MAX_MTIME_MS ||\n revisions.has(entry.path)\n ) {\n throw new Error(\"Deletion revision metadata is invalid.\");\n }\n const identity = deletionRevisionPathIdentity(entry.path);\n if (pathByIdentity.has(identity)) {\n throw new Error(\"Deletion revision metadata is invalid.\");\n }\n pathByIdentity.set(identity, entry.path);\n revisions.set(entry.path, entry.mtimeMs);\n }\n return new Map([...revisions.entries()].sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0)));\n }\n private async readDeletionRevisionMetadata(): Promise<Map<string, number>> {\n const metadataPath = await this.resolveConfiguredStoragePath(this.options.deletionRevisionMetadataPath);\n let raw: string;\n try {\n raw = await readFile(metadataPath, \"utf8\");\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) return new Map();\n throw new Error(\"Deletion revision metadata is unavailable.\");\n }\n return this.parseDeletionRevisionMetadata(raw);\n }\n\n private async writeDeletionRevisionMetadata(\n revisions: ReadonlyMap<string, number>,\n lock: HeldFileLockController,\n ): Promise<void> {\n const metadataPath = await this.resolveConfiguredStoragePath(this.options.deletionRevisionMetadataPath);\n const deletions = [...revisions.entries()]\n .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))\n .map(([entryPath, mtimeMs]) => ({ path: entryPath, mtimeMs }));\n const metadata: DeletionRevisionMetadata = { version: 1, deletions };\n const temporaryPath = await this.resolveConfiguredStoragePath(\n `${metadataPath}.${process.pid}.${randomUUID()}.tmp`,\n );\n let handle: FileHandle | null = null;\n try {\n handle = await open(temporaryPath, \"wx\", 0o600);\n await handle.writeFile(`${JSON.stringify(metadata)}\\n`, \"utf8\");\n await handle.sync();\n await handle.close();\n handle = null;\n if (!(await lock.refresh())) {\n throw new Error(\"Deletion revision metadata lock was lost.\");\n }\n const renameTarget = await this.resolveConfiguredStoragePath(this.options.deletionRevisionMetadataPath);\n await rename(temporaryPath, renameTarget);\n } finally {\n if (handle !== null) {\n await handle.close().catch((error: unknown) => {\n log.warn(\"failed to close deletion revision metadata temporary file\", error);\n });\n }\n const cleanupPath = await this.resolveConfiguredStoragePath(temporaryPath).catch((error: unknown) => {\n log.warn(\"failed to resolve deletion revision metadata temporary file for cleanup\", error);\n return null;\n });\n if (cleanupPath !== null) {\n await unlink(cleanupPath).catch((error: unknown) => {\n if (!isErrnoCode(error, \"ENOENT\")) {\n log.warn(\"failed to clean up deletion revision metadata temporary file\", error);\n }\n });\n }\n }\n }\n\n private async withDeletionRevisionLock<T>(task: (lock: HeldFileLockController) => Promise<T>): Promise<T> {\n const lockPath = await this.resolveConfiguredStoragePath(this.options.deletionRevisionLockPath);\n return withHeldFileLock(\n lockPath,\n {\n staleMs: DELETION_REVISION_LOCK_STALE_MS,\n maxWaitMs: DELETION_REVISION_LOCK_MAX_WAIT_MS,\n },\n async (acquired, lock) => {\n if (!acquired) throw new Error(\"Deletion revision metadata lock is unavailable.\");\n return task(lock);\n },\n );\n }\n\n async readDeletionRevisions(): Promise<ReadonlyMap<string, number>> {\n return this.withDeletionRevisionLock(async () => this.readDeletionRevisionMetadata());\n }\n\n private parseInvalidationCommitMetadata(raw: string): Map<string, InvalidationCommit> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\"Invalidation commit metadata is invalid.\");\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"Invalidation commit metadata is invalid.\");\n }\n const root = parsed as Record<string, unknown>;\n if (\n Object.keys(root).sort().join(\",\") !== \"commits,version\" ||\n root.version !== 1 ||\n !Array.isArray(root.commits)\n ) {\n throw new Error(\"Invalidation commit metadata is invalid.\");\n }\n const commits = new Map<string, InvalidationCommit>();\n for (const rawEntry of root.commits) {\n if (!rawEntry || typeof rawEntry !== \"object\" || Array.isArray(rawEntry)) {\n throw new Error(\"Invalidation commit metadata is invalid.\");\n }\n const entry = rawEntry as Record<string, unknown>;\n if (\n Object.keys(entry).sort().join(\",\") !== \"committedAt,fingerprint,memoryId\" ||\n !isValidMemoryId(entry.memoryId) ||\n !isValidInvalidationCommitFingerprint(entry.fingerprint) ||\n !isValidInvalidationCommitTimestamp(entry.committedAt) ||\n commits.has(entry.memoryId)\n ) {\n throw new Error(\"Invalidation commit metadata is invalid.\");\n }\n commits.set(entry.memoryId, {\n fingerprint: entry.fingerprint,\n committedAt: entry.committedAt,\n });\n }\n return commits;\n }\n\n private async readInvalidationCommitMetadata(): Promise<Map<string, InvalidationCommit>> {\n const metadataPath = await this.resolveConfiguredStoragePath(this.options.invalidationCommitMetadataPath);\n let raw: string;\n try {\n raw = await readFile(metadataPath, \"utf8\");\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) return new Map();\n throw new Error(\"Invalidation commit metadata is unavailable.\");\n }\n return this.parseInvalidationCommitMetadata(raw);\n }\n\n private async writeInvalidationCommitMetadata(\n commits: ReadonlyMap<string, InvalidationCommit>,\n lock: HeldFileLockController,\n ): Promise<void> {\n const metadataPath = await this.resolveConfiguredStoragePath(this.options.invalidationCommitMetadataPath);\n const entries = [...commits.entries()]\n .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))\n .map(([memoryId, value]) => ({\n memoryId,\n fingerprint: value.fingerprint,\n committedAt: value.committedAt,\n }));\n const metadata: InvalidationCommitMetadata = { version: 1, commits: entries };\n const temporaryPath = await this.resolveConfiguredStoragePath(\n `${metadataPath}.${process.pid}.${randomUUID()}.tmp`,\n );\n const metadataDir = await this.resolveConfiguredStoragePath(path.dirname(metadataPath));\n let handle: FileHandle | null = null;\n let renamed = false;\n try {\n await mkdir(metadataDir, { recursive: true });\n handle = await open(temporaryPath, \"wx\", 0o600);\n await handle.writeFile(`${JSON.stringify(metadata)}\\n`, \"utf8\");\n await handle.sync();\n await handle.close();\n handle = null;\n if (!(await lock.refresh())) {\n throw new Error(\"Invalidation commit metadata lock was lost.\");\n }\n const renameTarget = await this.resolveConfiguredStoragePath(this.options.invalidationCommitMetadataPath);\n await rename(temporaryPath, renameTarget);\n renamed = true;\n } finally {\n if (handle !== null) {\n await handle.close().catch((error: unknown) => {\n log.warn(\"failed to close invalidation commit metadata temporary file\", error);\n });\n }\n const cleanupPath = await this.resolveConfiguredStoragePath(temporaryPath).catch((error: unknown) => {\n log.warn(\"failed to resolve invalidation commit metadata temporary file for cleanup\", error);\n return null;\n });\n if (cleanupPath !== null) {\n await unlink(cleanupPath).catch((error: unknown) => {\n if (!isErrnoCode(error, \"ENOENT\")) {\n log.warn(\n `failed to clean up invalidation commit metadata temporary file after ${renamed ? \"commit\" : \"failure\"}`,\n error,\n );\n }\n });\n }\n }\n }\n\n async hasCommittedInvalidation(memory: Pick<MemoryFile, \"content\" | \"frontmatter\">): Promise<boolean> {\n const memoryId = memory.frontmatter.id;\n const fingerprint = invalidationCommitFingerprint(memory);\n return this.withDeletionRevisionLock(async () => {\n const entry = (await this.readInvalidationCommitMetadata()).get(memoryId);\n if (entry?.fingerprint !== fingerprint) return false;\n if (this.invalidationProofQuarantine.has(memoryId)) return false;\n if (!this.invalidationProofQuarantineFull) return true;\n const fullAt = this.invalidationProofQuarantineFullAt;\n return fullAt !== null && entry.committedAt >= fullAt;\n });\n }\n\n async recordCommittedInvalidation(memory: MemoryFile): Promise<void> {\n const fingerprint = invalidationCommitFingerprint(memory);\n await this.withDeletionRevisionLock(async (lock) => {\n const fullAt = this.invalidationProofQuarantineFullAt;\n const committedAt = fullAt === null ? Date.now() : Math.max(Date.now(), fullAt + 1);\n const commits = await this.readInvalidationCommitMetadata();\n commits.set(memory.frontmatter.id, {\n fingerprint,\n committedAt,\n });\n await this.writeInvalidationCommitMetadata(commits, lock);\n this.invalidationProofQuarantine.delete(memory.frontmatter.id);\n });\n }\n\n async clearCommittedInvalidation(memory: Pick<MemoryFile, \"content\" | \"frontmatter\">): Promise<void> {\n const memoryId = memory.frontmatter.id;\n this.quarantineInvalidationProof(memoryId);\n const fingerprint = invalidationCommitFingerprint(memory);\n let cleared = false;\n try {\n await this.withDeletionRevisionLock(async (lock) => {\n const commits = await this.readInvalidationCommitMetadata();\n const current = commits.get(memoryId);\n if (current?.fingerprint !== fingerprint) return;\n commits.delete(memoryId);\n await this.writeInvalidationCommitMetadata(commits, lock);\n });\n cleared = true;\n } finally {\n if (cleared) this.invalidationProofQuarantine.delete(memoryId);\n }\n }\n\n async recordReplicatedDeletionRevision(filePath: string, mtimeMs: number): Promise<void> {\n const { relativePath } = await this.resolveManagedStoragePath(\n filePath,\n \"storage.recordReplicatedDeletionRevision\",\n );\n if (\n typeof mtimeMs !== \"number\" ||\n !Number.isFinite(mtimeMs) ||\n mtimeMs < 0 ||\n mtimeMs > DELETION_REVISION_MAX_MTIME_MS\n ) {\n throw new Error(\"Deletion revision timestamp is invalid.\");\n }\n if (!isValidManagedStoragePath(relativePath)) {\n throw new Error(\"Deletion revision path is invalid.\");\n }\n await this.withDeletionRevisionLock(async (lock) => {\n const revisions = await this.readDeletionRevisionMetadata();\n const identity = deletionRevisionPathIdentity(relativePath);\n let existingPath: string | undefined;\n for (const candidatePath of revisions.keys()) {\n if (deletionRevisionPathIdentity(candidatePath) === identity) {\n existingPath = candidatePath;\n break;\n }\n }\n const existingMtimeMs = existingPath === undefined ? undefined : revisions.get(existingPath);\n if (existingMtimeMs !== undefined && existingMtimeMs >= mtimeMs) return;\n const updated = new Map(revisions);\n if (existingPath !== undefined) updated.delete(existingPath);\n updated.set(relativePath, mtimeMs);\n await this.writeDeletionRevisionMetadata(updated, lock);\n });\n }\n\n async writeManagedStorageFile(filePath: string, write: () => Promise<void>): Promise<void> {\n const { relativePath } = await this.resolveManagedStoragePath(filePath, \"storage.writeManagedStorageFile\");\n if (!isValidManagedStoragePath(relativePath)) {\n throw new Error(\"Deletion revision path is invalid.\");\n }\n await this.withDeletionRevisionLock(async (lock) => {\n const before = await this.readDeletionRevisionMetadata();\n const identity = deletionRevisionPathIdentity(relativePath);\n const existingPath = [...before.keys()].find(\n (candidatePath) => deletionRevisionPathIdentity(candidatePath) === identity,\n );\n await write();\n if (existingPath === undefined) return;\n const updated = new Map(before);\n updated.delete(existingPath);\n await this.writeDeletionRevisionMetadata(updated, lock);\n });\n }\n\n async deleteManagedStorageFile(filePath: string, deletionMtimeMs?: number | null): Promise<boolean> {\n const { target, relativePath } = await this.resolveManagedStoragePath(\n filePath,\n \"storage.deleteManagedStorageFile\",\n );\n if (\n deletionMtimeMs !== undefined &&\n deletionMtimeMs !== null &&\n (typeof deletionMtimeMs !== \"number\" ||\n !Number.isFinite(deletionMtimeMs) ||\n deletionMtimeMs < 0 ||\n deletionMtimeMs > DELETION_REVISION_MAX_MTIME_MS)\n ) {\n throw new Error(\"Deletion revision timestamp is invalid.\");\n }\n return this.withDeletionRevisionLock(async (lock) => {\n const safeTarget = await this.resolveConfiguredStoragePath(target);\n try {\n await lstat(safeTarget);\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) return false;\n throw error;\n }\n if (!isValidManagedStoragePath(relativePath)) {\n throw new Error(\"Deletion revision path is invalid.\");\n }\n const revision = deletionMtimeMs === null ? undefined : (deletionMtimeMs ?? Date.now());\n const before = await this.readDeletionRevisionMetadata();\n const identity = deletionRevisionPathIdentity(relativePath);\n let existingPath: string | undefined;\n for (const candidatePath of before.keys()) {\n if (deletionRevisionPathIdentity(candidatePath) === identity) {\n existingPath = candidatePath;\n break;\n }\n }\n const existing = existingPath === undefined ? undefined : before.get(existingPath);\n const changed =\n (existingPath !== undefined && existingPath !== relativePath) ||\n (revision === undefined ? existing !== undefined : existing !== revision);\n if (changed) {\n const updated = new Map(before);\n if (existingPath !== undefined) updated.delete(existingPath);\n if (revision !== undefined) updated.set(relativePath, revision);\n await this.writeDeletionRevisionMetadata(updated, lock);\n }\n try {\n const unlinkTarget = await this.resolveConfiguredStoragePath(target);\n await unlink(unlinkTarget);\n return true;\n } catch (error) {\n if (changed) await this.writeDeletionRevisionMetadata(before, lock);\n if (isErrnoCode(error, \"ENOENT\")) return false;\n throw error;\n }\n });\n }\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, unlink, type FileHandle } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { resolveSafeStoragePath } from \"../storage-paths.js\";\nimport { isErrnoCode } from \"../utils/errno.js\";\nimport { withHeldFileLock, type HeldFileLockController } from \"../utils/serialize-mutations.js\";\nimport { log } from \"../logger.js\";\nimport { isValidManagedStoragePath, nextCasRevisionIso } from \"./deletion-revision-store.js\";\n\ntype CasRevisionShard = {\n version: 1;\n path: string;\n revision: string;\n /** Two-phase receipt state (#2813 P1 C). Absent on pre-two-phase shards,\n * which read as committed. */\n state?: \"pending\" | \"committed\";\n /** The standing COMMITTED token the pending reservation replaced. An\n * abort restores it, so a discarded reservation never erases the\n * target's receipt history. */\n previous?: string;\n /** #2807 crash-recovery evidence, pending markers only. sha256 of the\n * durable memory file's BYTES — a fingerprint, never memory content.\n * `baselineDigest` is the fingerprint captured at reserve time; null\n * means the file was absent. Absent on legacy pending markers, which\n * carry no evidence. */\n baselineDigest?: string | null;\n /** #2807: the fingerprint the durable file shows once the reserved\n * write has landed; recorded by `writeLanded` before `commit` publishes.\n * null means the file was absent when the write landed. May also be\n * pre-recorded at reserve from the caller's expected bytes. */\n expectedDigest?: string | null;\n /** True after `writeLanded()` verifies the durable write. New pending\n * markers write false. Absent on legacy pending shards: those treat\n * a present `expectedDigest` as already landed. */\n writeLanded?: boolean;\n /** #2813 (P1 B): sha256 hex digest of the durable memory file when committed. */\n committedDigest?: string | null;\n /** #2870: sha256 of the durable file's canonical SEMANTIC text — the\n * file with the access-telemetry frontmatter keys (`accessCount:`,\n * `lastAccessed:`) stripped, the same exclusion set\n * `invalidationCommitFingerprint` applies to parsed records. Promotion\n * binds to THIS, never to the byte digest: an access-tracking flush\n * rewrites exactly those two lines without minting a receipt\n * (`isSemanticFrontmatterChange` is false), and must not invalidate a\n * valid promotion. null means the file was absent at commit. */\n committedSemanticFingerprint?: string | null;\n};\n\ntype CasRevisionMetadata = {\n version: 1;\n revisions: Array<{ path: string; revision: string }>;\n};\n\n/** #2813 (P1 A): truthful outcome of a standing-receipt read.\n * - `present` — the target's standing receipt token.\n * - `absent` — no receipt was ever minted (a pre-sidecar legacy record, or\n * a fresh target); `undefined` semantics stay correct for those.\n * - `unavailable` — the sidecar could not be read (unreadable, unsafe, or\n * PENDING finalization), so receipt identity is UNKNOWN. The fail-open\n * `readRevision` collapses this into `undefined`; callers that transact\n * on receipt identity MUST refuse instead. */\nexport type CasRevisionReadStatus =\n | { status: \"present\"; revision: string; committedDigest?: string; committedSemanticFingerprint?: string }\n | { status: \"absent\" }\n | { status: \"unavailable\"; reason: string };\n\n/** #2813 (P1 C): a write-ahead receipt transaction. `pendingRevision` is a\n * RESERVATION, never ownership: no reader may attribute the record from it\n * while the marker is pending. `commit` publishes the COMMITTED receipt\n * after the durable memory write lands; `abort` discards the reservation\n * (restoring the previous standing token) when the write failed. If\n * `commit` itself fails after the write, the pending marker REMAINS so\n * readers report recovery-needed and promotion/rollback refuse until\n * {@link CasRevisionStore.reconcilePendingRevision} runs with the known\n * write outcome or {@link CasRevisionStore.recoverPendingRevision} decides\n * from the recorded evidence (#2807). */\nexport interface CasRevisionTransaction {\n readonly pendingRevision: string;\n /** #2807: record the durable file's post-write fingerprint in the\n * PENDING marker — the crash evidence recovery compares. Call immediately\n * after the durable write lands, before `commit`. */\n writeLanded(): Promise<void>;\n commit(): Promise<void>;\n abort(): Promise<void>;\n}\n\ntype CasShardView =\n | { kind: \"missing\" }\n | { kind: \"foreign\" }\n | { kind: \"committed\"; revision: string; committedDigest?: string; committedSemanticFingerprint?: string; foreign: boolean }\n | {\n kind: \"pending\";\n revision: string;\n previous?: string;\n foreign: boolean;\n baselineDigest?: string | null;\n expectedDigest?: string | null;\n writeLanded?: boolean;\n };\n\nconst ACCESS_TELEMETRY_FRONTMATTER_KEY = /^(?:accessCount|lastAccessed):/;\n\n/**\n * #2870: canonical SEMANTIC text of a durable memory file — the file with\n * the access-telemetry frontmatter keys (`accessCount:`, `lastAccessed:`)\n * removed. This is the file-level twin of `invalidationCommitFingerprint`\n * (deletion-revision-store.ts): the same exclusion set, computed without\n * parsing, so the CAS receipt can record it at commit time from the same\n * bytes the digests come from. Only TOP-LEVEL frontmatter lines are\n * stripped — serialized frontmatter is flat `key: value` lines, and nested\n * blocks (links:) are indented and never match. A file without a leading\n * frontmatter block is returned unchanged.\n */\nexport function canonicalSemanticFileText(raw: string): string {\n const lines = raw.split(\"\\n\");\n if (lines[0] !== \"---\") return raw;\n const closing = lines.indexOf(\"---\", 1);\n if (closing === -1) return raw;\n const frontmatter = lines\n .slice(1, closing)\n .filter((line) => !ACCESS_TELEMETRY_FRONTMATTER_KEY.test(line));\n return [...lines.slice(0, 1), ...frontmatter, ...lines.slice(closing)].join(\"\\n\");\n}\nconst CAS_REVISION_LOCK_STALE_MS = 60_000;\nconst CAS_REVISION_LOCK_MAX_WAIT_MS = 120_000;\nconst SHA256_HEX = /^[0-9a-f]{64}$/;\n\nfunction isDigestOrNullOrUndefined(value: unknown): boolean {\n if (value === undefined || value === null) return true;\n return typeof value === \"string\" && SHA256_HEX.test(value);\n}\n\nfunction pendingWriteHasLanded(view: {\n writeLanded?: boolean;\n expectedDigest?: string | null;\n}): boolean {\n if (view.writeLanded === true) return true;\n if (view.writeLanded === false) return false;\n return view.expectedDigest !== undefined;\n}\n\n\n/**\n * #2813 (P1, #2807 CI repair): durable per-target CAS receipt identity,\n * SEPARATE from public `frontmatter.updated` (business/event time — the\n * support-passport contract keeps caller values verbatim). A receipt minted\n * here is unique and strictly monotonic per target across content commits\n * and semantic frontmatter writes; rollback ownership compares ONLY this\n * token. Attribution scope is per-path in-process serialization (the\n * capture locks around every CAS); the memory files themselves carry no\n * cross-process write lock, so a cross-process same-path race keeps the\n * last-write-wins outcome the corpus already has.\n *\n * Receipts publish through a TWO-PHASE transaction (#2813 P1 C), because\n * neither single-phase ordering is safe: mint-before-write publishes\n * ownership for a write that can still fail, and mint-after-write leaves a\n * written record with no receipt. Under the per-target shard lock:\n * 1. reserve — the next token is minted and durably recorded as a\n * PENDING marker (write-ahead), carrying the standing token it\n * replaced;\n * 2. write — the caller performs the durable memory write;\n * 3. publish — the marker is atomically rewritten COMMITTED.\n * A failed write aborts the reservation (restoring the previous token); a\n * failed publish leaves the PENDING marker standing, which readers must\n * treat as unavailable/recovery-needed — never ownership, never absence —\n * so promotion and rollback refuse until recovery reconciles.\n *\n * Every sidecar path (shard, lock, temporary) is resolved through\n * {@link resolveSafeStoragePath} (#2813 P1 A): a symlinked\n * `.offline-sync/cas-revisions` directory — or any symlinked ancestor that\n * escapes the memory root — is rejected before any lock, read, rename, or\n * unlink, so sidecar traffic can never be redirected outside the root.\n */\nexport class CasRevisionStore {\n private readonly baseDir: string;\n private readonly legacyMetadataPath: string;\n\n constructor(baseDir: string) {\n this.baseDir = baseDir;\n // Legacy global metadata location for backward-compatible fallback reads.\n this.legacyMetadataPath = path.join(baseDir, \".offline-sync\", \"cas-revisions.v1.json\");\n }\n\n private parseCasRevisionMetadata(raw: string): Map<string, string> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\"CAS revision metadata is invalid.\");\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"CAS revision metadata is invalid.\");\n }\n const root = parsed as Record<string, unknown>;\n if (\n Object.keys(root).sort().join(\",\") !== \"revisions,version\" ||\n root.version !== 1 ||\n !Array.isArray(root.revisions)\n ) {\n throw new Error(\"CAS revision metadata is invalid.\");\n }\n const revisions = new Map<string, string>();\n for (const rawEntry of root.revisions) {\n if (!rawEntry || typeof rawEntry !== \"object\" || Array.isArray(rawEntry)) {\n throw new Error(\"CAS revision metadata is invalid.\");\n }\n const entry = rawEntry as Record<string, unknown>;\n if (\n Object.keys(entry).sort().join(\",\") !== \"path,revision\" ||\n typeof entry.path !== \"string\" ||\n !isValidManagedStoragePath(entry.path) ||\n typeof entry.revision !== \"string\" ||\n entry.revision.length === 0 ||\n revisions.has(entry.path)\n ) {\n throw new Error(\"CAS revision metadata is invalid.\");\n }\n revisions.set(entry.path, entry.revision);\n }\n return revisions;\n }\n\n private async readLegacyMetadata(): Promise<Map<string, string>> {\n const baseDir = path.resolve(this.baseDir);\n const legacyPath = await resolveSafeStoragePath(baseDir, path.relative(baseDir, this.legacyMetadataPath));\n let raw: string;\n try {\n raw = await readFile(legacyPath, \"utf8\");\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) return new Map();\n throw new Error(\"CAS revision metadata is unavailable.\");\n }\n return this.parseCasRevisionMetadata(raw);\n }\n\n /** #2813 (P1 A): every sidecar path is resolved (and symlink-audited)\n * inside the memory root before it is used for a lock, read, rename, or\n * unlink. A symlinked `.offline-sync`, `.offline-sync/cas-revisions`, or\n * shard file makes this throw, so no sidecar traffic can follow a link\n * out of the root. */\n private async getSafeShardInfo(relativePath: string): Promise<{ shardPath: string; lockPath: string }> {\n const baseDir = path.resolve(this.baseDir);\n const hash = createHash(\"sha256\").update(relativePath).digest(\"hex\");\n const shardPath = await resolveSafeStoragePath(baseDir, \".offline-sync\", \"cas-revisions\", `${hash}.json`);\n const lockPath = await resolveSafeStoragePath(baseDir, \".offline-sync\", \"cas-revisions\", `${hash}.json.lock`);\n return { shardPath, lockPath };\n }\n\n private async readShardView(shardPath: string, relativePath: string): Promise<CasShardView> {\n let raw: string;\n try {\n raw = await readFile(shardPath, \"utf8\");\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) return { kind: \"missing\" };\n throw error;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\"CAS revision shard is unreadable.\");\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return { kind: \"foreign\" };\n }\n const root = parsed as Record<string, unknown>;\n if (root.state !== undefined) {\n // Two-phase shard: strict shape. A state-bearing shard that does not\n // validate is corruption — unavailability, never a usable identity.\n if (\n root.version !== 1 ||\n typeof root.path !== \"string\" ||\n typeof root.revision !== \"string\" ||\n root.revision.length === 0 ||\n (root.state !== \"pending\" && root.state !== \"committed\") ||\n (root.previous !== undefined &&\n (typeof root.previous !== \"string\" || root.previous.length === 0)) ||\n !isDigestOrNullOrUndefined(root.baselineDigest) ||\n !isDigestOrNullOrUndefined(root.expectedDigest) ||\n (root.writeLanded !== undefined && typeof root.writeLanded !== \"boolean\")\n ) {\n throw new Error(\"CAS revision shard is unreadable.\");\n }\n const foreign = root.path !== relativePath;\n const committedDigest =\n typeof root.committedDigest === \"string\" ? root.committedDigest : undefined;\n const committedSemanticFingerprint =\n typeof root.committedSemanticFingerprint === \"string\"\n ? root.committedSemanticFingerprint\n : undefined;\n return root.state === \"pending\"\n ? {\n kind: \"pending\",\n revision: root.revision,\n previous: root.previous,\n foreign,\n baselineDigest: root.baselineDigest as string | null | undefined,\n expectedDigest: root.expectedDigest as string | null | undefined,\n ...(typeof root.writeLanded === \"boolean\" ? { writeLanded: root.writeLanded } : {}),\n }\n : {\n kind: \"committed\",\n revision: root.revision,\n committedDigest,\n committedSemanticFingerprint,\n foreign,\n };\n }\n // Pre-two-phase shard: a full-shape match reads as committed; anything\n // else keeps the legacy fall-through (legacy metadata, then absence).\n if (\n root.version === 1 &&\n root.path === relativePath &&\n typeof root.revision === \"string\" &&\n root.revision.length > 0\n ) {\n const committedDigest =\n typeof root.committedDigest === \"string\" ? root.committedDigest : undefined;\n const committedSemanticFingerprint =\n typeof root.committedSemanticFingerprint === \"string\"\n ? root.committedSemanticFingerprint\n : undefined;\n return {\n kind: \"committed\",\n revision: root.revision,\n committedDigest,\n committedSemanticFingerprint,\n foreign: false,\n };\n }\n return { kind: \"foreign\" };\n }\n\n private async readStandingRevision(relativePath: string): Promise<\n { revision: string; committedDigest?: string; committedSemanticFingerprint?: string } | undefined\n > {\n try {\n return await this.readStandingRevisionStrict(relativePath);\n } catch (error) {\n log.warn(`CasRevisionStore failed to read standing revision for ${relativePath}: ${error}`);\n return undefined;\n }\n }\n\n /** #2813 (P1 A): strict core of {@link readStandingRevision}. Returns\n * undefined ONLY when no receipt exists for the target — the shard is\n * absent (or names another target) and the legacy metadata holds no\n * entry. THROWS when the standing receipt cannot be determined: an\n * unreadable or corrupt shard, a PENDING reservation awaiting\n * finalization or recovery, or unreadable or invalid legacy metadata.\n * Fail-open callers collapse the throw into undefined; truthful callers\n * ({@link readRevisionStatus}) report `unavailable` so a transaction can\n * refuse instead of mistaking the failure for absence. */\n private async readStandingRevisionStrict(\n relativePath: string,\n ): Promise<\n { revision: string; committedDigest?: string; committedSemanticFingerprint?: string } | undefined\n > {\n const { shardPath } = await this.getSafeShardInfo(relativePath);\n const view = await this.readShardView(shardPath, relativePath);\n if (view.kind === \"pending\") {\n throw new Error(\n `CAS revision receipt for ${relativePath} is pending finalization (recovery needed).`,\n );\n }\n if (view.kind === \"committed\" && !view.foreign) {\n return {\n revision: view.revision,\n committedDigest: view.committedDigest,\n committedSemanticFingerprint: view.committedSemanticFingerprint,\n };\n }\n const legacyMap = await this.readLegacyMetadata();\n const legacyRev = legacyMap.get(relativePath);\n return legacyRev === undefined ? undefined : { revision: legacyRev };\n }\n\n private async writeShard(\n shardPath: string,\n relativePath: string,\n revision: string,\n lock: HeldFileLockController,\n state: \"pending\" | \"committed\",\n previous?: string,\n evidence?: {\n baselineDigest?: string | null;\n expectedDigest?: string | null;\n committedDigest?: string | null;\n committedSemanticFingerprint?: string | null;\n writeLanded?: boolean;\n },\n ): Promise<void> {\n let payload: CasRevisionShard;\n if (state === \"committed\") {\n payload = { version: 1, path: relativePath, revision, state };\n if (evidence?.committedDigest !== undefined) {\n payload.committedDigest = evidence.committedDigest;\n }\n if (evidence?.committedSemanticFingerprint !== undefined) {\n payload.committedSemanticFingerprint = evidence.committedSemanticFingerprint;\n }\n } else {\n payload = { version: 1, path: relativePath, revision, state };\n if (previous !== undefined) payload.previous = previous;\n if (evidence !== undefined) {\n if (evidence.baselineDigest !== undefined) payload.baselineDigest = evidence.baselineDigest;\n if (evidence.expectedDigest !== undefined) payload.expectedDigest = evidence.expectedDigest;\n if (evidence.writeLanded !== undefined) payload.writeLanded = evidence.writeLanded;\n }\n }\n const baseDir = path.resolve(this.baseDir);\n const temporaryPath = await resolveSafeStoragePath(\n baseDir,\n path.relative(baseDir, `${shardPath}.${process.pid}.${randomUUID()}.tmp`),\n );\n let handle: FileHandle | null = null;\n try {\n await mkdir(path.dirname(shardPath), { recursive: true });\n handle = await open(temporaryPath, \"wx\", 0o600);\n await handle.writeFile(`${JSON.stringify(payload)}\\n`, \"utf8\");\n await handle.sync();\n await handle.close();\n handle = null;\n if (!(await lock.refresh())) {\n throw new Error(\"CAS revision shard lock was lost.\");\n }\n await rename(temporaryPath, shardPath);\n } finally {\n if (handle !== null) {\n await handle.close().catch((error: unknown) => {\n log.warn(\"failed to close CAS revision shard temporary file\", error);\n });\n }\n await unlink(temporaryPath).catch((error: unknown) => {\n if (!isErrnoCode(error, \"ENOENT\")) {\n log.warn(\"failed to clean up CAS revision shard temporary file\", error);\n }\n });\n }\n }\n\n private async resolveRelativePath(filePath: string): Promise<string> {\n const baseDir = path.resolve(this.baseDir);\n const target = await resolveSafeStoragePath(baseDir, path.relative(baseDir, path.resolve(baseDir, filePath)));\n return path.relative(baseDir, target).split(path.sep).join(\"/\");\n }\n\n private async withShardLock<T>(\n relativePath: string,\n task: (lock: HeldFileLockController) => Promise<T>,\n ): Promise<T> {\n const { lockPath } = await this.getSafeShardInfo(relativePath);\n return await withHeldFileLock(\n lockPath,\n { staleMs: CAS_REVISION_LOCK_STALE_MS, maxWaitMs: CAS_REVISION_LOCK_MAX_WAIT_MS },\n async (acquired, lock) => {\n if (!acquired) throw new Error(\"CAS revision lock is unavailable.\");\n return await task(lock);\n },\n );\n }\n\n /** The target's standing revision token, or undefined when no receipt was\n * ever minted for it. Fail-open on storage/read errors. */\n async readRevision(filePath: string): Promise<string | undefined> {\n try {\n const relativePath = await this.resolveRelativePath(filePath);\n return (await this.readStandingRevision(relativePath))?.revision;\n } catch (error) {\n log.warn(`CasRevisionStore.readRevision failed for ${filePath}: ${error}`);\n return undefined;\n }\n }\n\n /** #2813 (P1 A): the truthful standing-receipt read. `absent` means no\n * receipt was ever minted for the target — undefined semantics stay\n * correct for those records. `unavailable` means the sidecar could not\n * be read OR a reservation is pending finalization; callers that\n * transact on receipt identity MUST refuse rather than treat the\n * failure as absence. */\n async readRevisionStatus(filePath: string): Promise<CasRevisionReadStatus> {\n try {\n const relativePath = await this.resolveRelativePath(filePath);\n const standing = await this.readStandingRevisionStrict(relativePath);\n return standing === undefined\n ? { status: \"absent\" }\n : {\n status: \"present\",\n revision: standing.revision,\n ...(standing.committedDigest !== undefined\n ? { committedDigest: standing.committedDigest }\n : {}),\n ...(standing.committedSemanticFingerprint !== undefined\n ? { committedSemanticFingerprint: standing.committedSemanticFingerprint }\n : {}),\n };\n } catch (error) {\n return { status: \"unavailable\", reason: error instanceof Error ? error.message : String(error) };\n }\n }\n\n /** #2813 (P1 C): reserve the NEXT revision token as a durable PENDING\n * marker under the target's shard lock — the write-ahead record of a\n * receipt transaction. The token is strictly greater than the standing\n * token (max(clock, prev + 1ms)), so two commits can never share a\n * receipt — not within one millisecond, not across a backward clock\n * step. Refuses while another reservation is pending (recovery needed)\n * or the standing receipt cannot be determined. The caller MUST either\n * `commit` after its durable write lands or `abort` when it fails.\n * #2807: the marker records the reserve-time fingerprint (`baselineDigest`)\n * and optional expected post-write fingerprint (`expectedDigest`) with\n * `writeLanded: false`. {@link recoverPendingRevision} decides crashes\n * before or after the memory write from that evidence. */\n async beginRevisionTransaction(\n filePath: string,\n expectedContent?: string | Buffer | null,\n ): Promise<CasRevisionTransaction> {\n const relativePath = await this.resolveRelativePath(filePath);\n return await this.withShardLock(relativePath, async (lock) => {\n const standingInfo = await this.readStandingRevisionStrict(relativePath);\n const standing = standingInfo?.revision;\n const next = nextCasRevisionIso(standing);\n const baselineDigest = await this.digestDurableFile(relativePath);\n const expectedDigest =\n expectedContent != null ? this.digestContent(expectedContent) : undefined;\n const { shardPath } = await this.getSafeShardInfo(relativePath);\n await this.writeShard(shardPath, relativePath, next, lock, \"pending\", standing, {\n baselineDigest,\n ...(expectedDigest !== undefined ? { expectedDigest } : {}),\n writeLanded: false,\n });\n return {\n pendingRevision: next,\n writeLanded: () => this.recordPendingWriteLanded(relativePath, next),\n commit: () => this.finalizeRevisionTransaction(relativePath, next, \"commit\"),\n abort: () => this.finalizeRevisionTransaction(relativePath, next, \"abort\"),\n };\n });\n }\n\n public digestContent(content: string | Buffer): string {\n const bytes = typeof content === \"string\" ? Buffer.from(content, \"utf8\") : content;\n return createHash(\"sha256\").update(bytes).digest(\"hex\");\n }\n\n public async digestDurableFile(filePath: string): Promise<string | null> {\n const bytes = await this.readDurableBytes(filePath);\n return bytes === null ? null : createHash(\"sha256\").update(bytes).digest(\"hex\");\n }\n\n /** #2870: canonical SEMANTIC fingerprint of the durable file — its text\n * with the access-telemetry frontmatter keys stripped\n * ({@link canonicalSemanticFileText}), hashed. Null means the file was\n * absent. A fingerprint, never memory content. */\n public async semanticFingerprintDurableFile(filePath: string): Promise<string | null> {\n const bytes = await this.readDurableBytes(filePath);\n return bytes === null\n ? null\n : createHash(\"sha256\").update(canonicalSemanticFileText(bytes.toString(\"utf8\"))).digest(\"hex\");\n }\n\n private async readDurableBytes(filePath: string): Promise<Buffer | null> {\n const relativePath = await this.resolveRelativePath(filePath);\n const baseDir = path.resolve(this.baseDir);\n const target = await resolveSafeStoragePath(baseDir, relativePath);\n try {\n return await readFile(target);\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) return null;\n throw new Error(\n `CAS revision evidence: durable memory file ${relativePath} is unreadable: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n }\n\n /** #2807: mark the reserved write as landed. Verifies a pre-recorded\n * expected digest against the durable file, or records the file digest\n * when none was reserved. Sets `writeLanded: true`. Idempotent. */\n private async recordPendingWriteLanded(relativePath: string, token: string): Promise<void> {\n await this.withShardLock(relativePath, async (lock) => {\n const { shardPath } = await this.getSafeShardInfo(relativePath);\n const view = await this.readShardView(shardPath, relativePath);\n if (view.kind !== \"pending\" || view.foreign || view.revision !== token) {\n throw new Error(\n `CAS revision evidence recording refused for ${relativePath}: the pending marker does not match the reserved token.`,\n );\n }\n if (pendingWriteHasLanded(view) && view.writeLanded !== false) return;\n const currentDigest = await this.digestDurableFile(relativePath);\n if (view.expectedDigest !== undefined && currentDigest !== view.expectedDigest) {\n throw new Error(\n `CAS revision evidence recording refused for ${relativePath}: the durable file does not match the reserved expected digest.`,\n );\n }\n await this.writeShard(shardPath, relativePath, token, lock, \"pending\", view.previous, {\n baselineDigest: view.baselineDigest === undefined ? null : view.baselineDigest,\n expectedDigest: view.expectedDigest !== undefined ? view.expectedDigest : currentDigest,\n writeLanded: true,\n });\n });\n }\n\n private async finalizeRevisionTransaction(\n relativePath: string,\n token: string,\n outcome: \"commit\" | \"abort\",\n ): Promise<void> {\n await this.withShardLock(relativePath, async (lock) => {\n const { shardPath } = await this.getSafeShardInfo(relativePath);\n const view = await this.readShardView(shardPath, relativePath);\n if (view.kind === \"pending\" && !view.foreign && view.revision === token) {\n if (outcome === \"commit\") {\n const committedDigest =\n view.expectedDigest ?? (await this.digestDurableFile(relativePath));\n // #2870: publish the canonical semantic fingerprint alongside the\n // byte digest so promotion can bind semantic identity without\n // refusing on access-only telemetry flushes.\n const committedSemanticFingerprint =\n await this.semanticFingerprintDurableFile(relativePath);\n await this.writeShard(shardPath, relativePath, token, lock, \"committed\", undefined, {\n committedDigest,\n committedSemanticFingerprint,\n });\n } else if (view.previous !== undefined) {\n await this.writeShard(shardPath, relativePath, view.previous, lock, \"committed\");\n } else {\n await unlink(shardPath);\n }\n return;\n }\n if (outcome === \"commit\" && view.kind === \"committed\" && !view.foreign && view.revision === token) {\n return;\n }\n if (outcome === \"abort\" && view.kind === \"missing\") {\n return;\n }\n throw new Error(\n `CAS revision transaction ${outcome} refused for ${relativePath}: the pending marker does not match the reserved token.`,\n );\n });\n }\n\n /** #2837: remove the target's receipt shard once its durable memory file\n * has been deleted, so orphan shards cannot accumulate. Under the shard\n * lock: a PENDING marker is crash-recovery evidence for\n * {@link recoverPendingRevision} and is KEPT (\"pending\"); a shard naming\n * another target is KEPT (\"foreign\") — never destroy a receipt you cannot\n * attribute. Never touches the durable memory file or the legacy global\n * metadata: a stale legacy entry keeps per-path monotonicity if the path\n * is ever reused. */\n async removeRevisionShard(\n filePath: string,\n ): Promise<\"removed\" | \"absent\" | \"pending\" | \"foreign\"> {\n const relativePath = await this.resolveRelativePath(filePath);\n return await this.withShardLock(relativePath, async () => {\n const { shardPath } = await this.getSafeShardInfo(relativePath);\n const view = await this.readShardView(shardPath, relativePath);\n if (view.kind === \"missing\") return \"absent\";\n if (view.kind === \"pending\") return view.foreign ? \"foreign\" : \"pending\";\n if (view.kind === \"foreign\" || view.foreign) return \"foreign\";\n await unlink(shardPath);\n return \"removed\";\n });\n }\n\n /** #2813 (P1 C): recovery for a reservation left PENDING by a crash or a\n * failed publication. The caller supplies the KNOWN outcome of the\n * durable memory write: `fileWriteLanded` publishes the pending token as\n * the COMMITTED receipt; otherwise the reservation is discarded and the\n * previous standing token restored. Idempotent — an already-committed or\n * absent shard is reported, not mutated. */\n async reconcilePendingRevision(\n filePath: string,\n fileWriteLanded: boolean,\n ): Promise<\"reconciled\" | \"committed\" | \"absent\"> {\n const relativePath = await this.resolveRelativePath(filePath);\n return await this.withShardLock(relativePath, async (lock) => {\n const { shardPath } = await this.getSafeShardInfo(relativePath);\n const view = await this.readShardView(shardPath, relativePath);\n if (view.kind === \"committed\") return \"committed\";\n if (view.kind !== \"pending\") return \"absent\";\n if (view.foreign) {\n throw new Error(\n `CAS revision pending marker for ${relativePath} names another target; manual recovery is required.`,\n );\n }\n if (fileWriteLanded) {\n const committedDigest =\n view.expectedDigest ?? (await this.digestDurableFile(relativePath));\n const committedSemanticFingerprint =\n await this.semanticFingerprintDurableFile(relativePath);\n await this.writeShard(shardPath, relativePath, view.revision, lock, \"committed\", undefined, {\n committedDigest,\n committedSemanticFingerprint,\n });\n } else if (view.previous !== undefined) {\n await this.writeShard(shardPath, relativePath, view.previous, lock, \"committed\");\n } else {\n await unlink(shardPath);\n }\n return \"reconciled\";\n });\n }\n\n /** #2807 (P1): evidence-based recovery for a reservation left PENDING by\n * a crash between reserve and finalize. Under the shard lock, the durable\n * file's current fingerprint is compared against the marker:\n * - matches `expectedDigest` → publish the pending token as COMMITTED;\n * - matches `baselineDigest` (including both absent) → abort and restore;\n * - anything else THROWS. Recovery never guesses.\n *\n * `onlyWithWriteEvidence` is the unlocked read path. A marker whose write\n * has not landed (`writeLanded` false, or legacy with no expectedDigest)\n * may belong to a live writer, so it returns `reserved`. A landed marker\n * whose file no longer matches `expectedDigest` throws ambiguity. */\n async recoverPendingRevision(\n filePath: string,\n options?: { onlyWithWriteEvidence?: boolean },\n ): Promise<\"committed\" | \"aborted\" | \"absent\" | \"reserved\"> {\n const relativePath = await this.resolveRelativePath(filePath);\n return await this.withShardLock(relativePath, async (lock) => {\n const { shardPath } = await this.getSafeShardInfo(relativePath);\n const view = await this.readShardView(shardPath, relativePath);\n if (view.kind === \"missing\" || view.kind === \"foreign\") return \"absent\";\n if (view.kind === \"committed\") return view.foreign ? \"absent\" : \"committed\";\n if (view.foreign) {\n throw new Error(\n `CAS revision pending marker for ${relativePath} names another target; manual recovery is required.`,\n );\n }\n const currentDigest = await this.digestDurableFile(relativePath);\n const landed = pendingWriteHasLanded(view);\n if (options?.onlyWithWriteEvidence && !landed) {\n return \"reserved\";\n }\n if (view.expectedDigest !== undefined && currentDigest === view.expectedDigest) {\n await this.writeShard(shardPath, relativePath, view.revision, lock, \"committed\", undefined, {\n committedDigest: view.expectedDigest,\n committedSemanticFingerprint: await this.semanticFingerprintDurableFile(relativePath),\n });\n return \"committed\";\n }\n if (options?.onlyWithWriteEvidence) {\n const evidence =\n view.expectedDigest === undefined\n ? \"the pending marker carries no crash evidence (written by an older version)\"\n : \"the durable file matches neither the expected commit fingerprint nor the reserve-time baseline\";\n throw new Error(\n `CAS revision recovery for ${relativePath} is ambiguous: ${evidence} (pending token ${view.revision}` +\n `${view.previous !== undefined ? `, previous ${view.previous}` : \"\"}). ` +\n `Inspect the durable file and the shard at ${shardPath}, then run ` +\n `reconcilePendingRevision with the known write outcome. Refusing to guess.`,\n );\n }\n if (view.baselineDigest !== undefined && currentDigest === view.baselineDigest) {\n if (view.previous !== undefined) {\n await this.writeShard(shardPath, relativePath, view.previous, lock, \"committed\");\n } else {\n await unlink(shardPath);\n }\n return \"aborted\";\n }\n const evidence =\n view.baselineDigest === undefined && view.expectedDigest === undefined\n ? \"the pending marker carries no crash evidence (written by an older version)\"\n : \"the durable file matches neither the expected commit fingerprint nor the reserve-time baseline\";\n throw new Error(\n `CAS revision recovery for ${relativePath} is ambiguous: ${evidence} (pending token ${view.revision}` +\n `${view.previous !== undefined ? `, previous ${view.previous}` : \"\"}). ` +\n `Inspect the durable file and the shard at ${shardPath}, then run ` +\n `reconcilePendingRevision with the known write outcome. Refusing to guess.`,\n );\n });\n }\n}\n","import { log } from \"../logger.js\";\nimport {\n CasRevisionStore,\n type CasRevisionReadStatus,\n type CasRevisionTransaction,\n} from \"./cas-revision-store.js\";\n\n/**\n * StorageManager CAS receipt host (#2813 / #2807).\n * Owns fail-open reads, lazy pending recovery, durable digest, and begin-revision.\n * Tests patch the inherited CasRevisionStore seam on `casRevisions`.\n */\nexport class CasRevisionHost extends CasRevisionStore {\n /** Standing CAS revision token — receipt identity, never public `updated` (#2807). Fail-open on read errors. */\n async readCasRevision(filePath: string): Promise<string | undefined> {\n try {\n return await this.readRevision(filePath);\n } catch (err) {\n log.warn(`storage.readCasRevision failed for ${filePath}: ${err}`);\n return undefined;\n }\n }\n\n /** #2813 (P1 A): truthful CAS receipt probe — distinguishes a genuinely\n * ABSENT receipt (target predates the sidecar; `undefined` semantics stay\n * correct) from an UNAVAILABLE one (unreadable shard: receipt identity is\n * unknown). Transactional callers that must refuse on unknown identity\n * route here; `readCasRevision` stays fail-open for advisory reads.\n * #2807 (P1): a PENDING marker left by a crash is lazily recovered on\n * this first read when its evidence is decisive; a reserve-only marker\n * may belong to a live writer and defers to the path-locked write path,\n * and ambiguity stays `unavailable` with an actionable reason. */\n async readCasRevisionStatus(filePath: string): Promise<CasRevisionReadStatus> {\n const status = await this.readRevisionStatus(filePath);\n if (status.status !== \"unavailable\" || !/pending/i.test(status.reason)) return status;\n // #2807: an evidenced PENDING marker (its write already landed) is\n // lazily recovered here. A reserve-only marker may belong to a LIVE\n // transaction — this read holds no capture path lock — so it is left\n // for the path-locked write path, which cannot race the owner.\n try {\n const outcome = await this.recoverPendingRevision(filePath, {\n onlyWithWriteEvidence: true,\n });\n if (outcome === \"reserved\") return status;\n } catch (error) {\n return {\n status: \"unavailable\",\n reason: error instanceof Error ? error.message : String(error),\n };\n }\n return await this.readRevisionStatus(filePath);\n }\n\n async readDurableFileDigest(filePath: string): Promise<string | null> {\n try {\n return await this.digestDurableFile(filePath);\n } catch (err) {\n log.warn(`storage.readDurableFileDigest failed for ${filePath}: ${err}`);\n return null;\n }\n }\n\n /** #2807 (P1): reconcile any crash-orphaned PENDING marker for this\n * target BEFORE the next semantic mutation reserves a new token —\n * otherwise a crashed reservation would make the memory permanently\n * unwritable. Decisive evidence heals; ambiguity throws so the\n * mutation fails closed with the actionable recovery error. */\n async beginRevision(\n pathname: string,\n expectedContent?: string | Buffer | null,\n ): Promise<CasRevisionTransaction> {\n await this.recoverPendingRevision(pathname);\n return await this.beginRevisionTransaction(pathname, expectedContent);\n }\n\n /** #2837: best-effort post-deletion sweep of the target's receipt shard.\n * The durable memory file is already gone, so a failed sweep must never\n * fail the deletion itself — it logs instead. A PENDING shard (crash\n * recovery evidence) and a foreign shard (another target's receipt) are\n * kept, with a warning naming the recovery path. */\n async sweepShardAfterDeletion(filePath: string): Promise<void> {\n try {\n const outcome = await this.removeRevisionShard(filePath);\n if (outcome === \"pending\") {\n log.warn(\n `CAS revision shard for ${filePath} kept after memory deletion: a pending reservation stands — run recovery before the path is reused`,\n );\n } else if (outcome === \"foreign\") {\n log.warn(\n `CAS revision shard for ${filePath} kept after memory deletion: the shard names another target`,\n );\n }\n } catch (err) {\n log.warn(`failed to sweep CAS revision shard for deleted memory ${filePath}: ${err}`);\n }\n }\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { createHash } from \"node:crypto\";\nimport { mkdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { withHeldFileLock } from \"../utils/serialize-mutations.js\";\nimport type { MemoryFile, MemoryFrontmatter } from \"../types.js\";\nimport type { CasRevisionTransaction } from \"./cas-revision-store.js\";\nconst TOMBSTONE_CAPTURE_WRITE_LOCK_STALE_MS = 60_000;\nconst CAPTURE_WRITE_LOCK_MAX_ATTEMPTS = 3;\nconst CAPTURE_WRITE_LOCK_RETRY_BASE_MS = 25;\nconst CAPTURE_WRITE_LOCK_BUSY_MESSAGE = \"tombstone-blocked capture write lock remained busy\";\n\nexport function isTombstoneBlockedCaptureWriteLockBusy(error: unknown): boolean {\n return error instanceof Error && error.message === CAPTURE_WRITE_LOCK_BUSY_MESSAGE;\n}\n\nexport function normalizeExplicitCaptureContent(value: string): string {\n return value.toLowerCase().replace(/\\s+/g, \" \").trim();\n}\n\nexport function buildExplicitCaptureDedupKey(\n content: string,\n category: string,\n sourceConnector: string | undefined\n): string {\n const encode = (label: string, value: string): string => `${label} ${value.length} ${value}`;\n return [\n encode(\"category\", category),\n encode(\"connector\", sourceConnector?.trim() ?? \"\"),\n encode(\"content\", normalizeExplicitCaptureContent(content)),\n ].join(\" \");\n}\n\nexport function buildCapturePathLockIdentity(pathname: string): string {\n return `path ${pathname.length} ${pathname}`;\n}\n\nexport function captureIdentityHash(memory: MemoryFile): string {\n return createHash(\"sha256\")\n .update(\n buildExplicitCaptureDedupKey(memory.content, memory.frontmatter.category, memory.frontmatter.sourceConnector)\n )\n .digest(\"hex\");\n}\n\nexport type TombstoneBlockedCaptureWriteLockOptions = {\n readonly stateDir: string;\n readonly withHeldFileLock?: typeof withHeldFileLock;\n};\n\nexport class TombstoneBlockedCaptureWriteLock {\n private readonly context = new AsyncLocalStorage<ReadonlySet<string>>();\n\n constructor(private readonly options: TombstoneBlockedCaptureWriteLockOptions) {}\n\n private captureWriteLockPathForHash(identityHash: string): string {\n const filename =\n identityHash.length === 0 ? \"explicit-capture-write.lock\" : `explicit-capture-write-${identityHash}.lock`;\n return path.join(this.options.stateDir, \"tombstone-blocked-capture\", filename);\n }\n\n private async withSingleCaptureWriteLock<T>(lockPath: string, task: () => Promise<T>): Promise<T> {\n await mkdir(path.dirname(lockPath), { recursive: true });\n const retry = Symbol(\"retry\");\n const permanentFailure = Symbol(\"permanent-failure\");\n const runWithHeldFileLock = this.options.withHeldFileLock ?? withHeldFileLock;\n for (let attempt = 0; attempt < CAPTURE_WRITE_LOCK_MAX_ATTEMPTS; attempt += 1) {\n const result = await runWithHeldFileLock<T | typeof retry | typeof permanentFailure>(\n lockPath,\n {\n staleMs: TOMBSTONE_CAPTURE_WRITE_LOCK_STALE_MS,\n maxWaitMs: 1_000,\n pollMs: 25,\n },\n async (acquired, controller) => {\n if (acquired) return await task();\n return controller.failure === \"error\" ? permanentFailure : retry;\n }\n );\n if (result === permanentFailure) {\n throw new Error(\"tombstone-blocked capture write lock acquisition failed\");\n }\n if (result !== retry) return result;\n if (attempt === CAPTURE_WRITE_LOCK_MAX_ATTEMPTS - 1) break;\n const delayState = Promise.withResolvers<void>();\n setTimeout(delayState.resolve, CAPTURE_WRITE_LOCK_RETRY_BASE_MS * 2 ** attempt);\n await delayState.promise;\n }\n throw new Error(CAPTURE_WRITE_LOCK_BUSY_MESSAGE);\n }\n private async withPhysicalCaptureWriteLocks<T>(\n task: () => Promise<T>,\n identityHashes: readonly string[]\n ): Promise<T> {\n const lockPaths = [...new Set(identityHashes.map((hash) => this.captureWriteLockPathForHash(hash)))];\n const acquire = async (index: number): Promise<T> => {\n if (index === lockPaths.length) return await task();\n return await this.withSingleCaptureWriteLock(lockPaths[index], () => acquire(index + 1));\n };\n return await acquire(0);\n }\n\n async withCaptureWriteLock<T>(task: () => Promise<T>, identity?: string | readonly string[]): Promise<T> {\n const identities =\n Array.isArray(identity) && identity.length > 0 ? identity : [typeof identity === \"string\" ? identity : \"\"];\n return await this.withCaptureWriteLocks(task, identities, []);\n }\n\n async withCaptureWriteLockHashes<T>(task: () => Promise<T>, identityHashes: readonly string[]): Promise<T> {\n return await this.withCaptureWriteLocks(task, [], identityHashes);\n }\n\n async withCaptureWriteLockAndHashes<T>(\n task: () => Promise<T>,\n identity: string | readonly string[] | undefined,\n identityHashes: readonly string[]\n ): Promise<T> {\n const identities =\n Array.isArray(identity) && identity.length > 0 ? identity : [typeof identity === \"string\" ? identity : \"\"];\n return await this.withCaptureWriteLocks(task, identities, identityHashes);\n }\n\n private async withCaptureWriteLocks<T>(\n task: () => Promise<T>,\n identities: readonly string[],\n identityHashes: readonly string[]\n ): Promise<T> {\n const current = this.context.getStore();\n const hashToken = (key: string): string =>\n `\\u0000${key.length === 0 ? \"\" : createHash(\"sha256\").update(key).digest(\"hex\")}`;\n const identityHash = (key: string): string =>\n key.length === 0 ? \"\" : createHash(\"sha256\").update(key).digest(\"hex\");\n const identityKeys = [...new Set(identities)];\n const hashes = [...new Set(identityHashes)];\n const requested = [\n ...identityKeys\n .filter((key) => !current || (!current.has(key) && !current.has(hashToken(key))))\n .map((key) => ({ hash: identityHash(key), pathLock: key.startsWith(\"path \") })),\n ...hashes.filter((hash) => !current || !current.has(`\\u0000${hash}`)).map((hash) => ({ hash, pathLock: false })),\n ]\n .filter((entry, index, entries) => entries.findIndex((candidate) => candidate.hash === entry.hash) === index)\n .sort(\n (left, right) =>\n Number(left.pathLock) - Number(right.pathLock) ||\n this.captureWriteLockPathForHash(left.hash).localeCompare(this.captureWriteLockPathForHash(right.hash))\n );\n const physicalMissing = requested.map((entry) => entry.hash);\n if (current && requested.length > 0) {\n const held = [...current]\n .filter((token) => token.startsWith(\"\\u0000\"))\n .map((token) => {\n const hash = token.slice(1);\n const pathLock = [...current].some(\n (key) => !key.startsWith(\"\\u0000\") && key.startsWith(\"path \") && hashToken(key) === token\n );\n return { hash, pathLock };\n });\n const requestedFirst = requested[0];\n const heldLast = held\n .sort(\n (left, right) =>\n Number(left.pathLock) - Number(right.pathLock) ||\n this.captureWriteLockPathForHash(left.hash).localeCompare(this.captureWriteLockPathForHash(right.hash))\n )\n .at(-1);\n if (\n heldLast &&\n requestedFirst &&\n (Number(requestedFirst.pathLock) < Number(heldLast.pathLock) ||\n (requestedFirst.pathLock === heldLast.pathLock &&\n this.captureWriteLockPathForHash(requestedFirst.hash) < this.captureWriteLockPathForHash(heldLast.hash)))\n ) {\n throw new Error(CAPTURE_WRITE_LOCK_BUSY_MESSAGE);\n }\n }\n const next = new Set(current);\n for (const key of identityKeys) {\n next.add(key);\n next.add(hashToken(key));\n }\n for (const hash of hashes) next.add(`\\u0000${hash}`);\n const run = () => this.context.run(next, task);\n if (physicalMissing.length === 0) return await run();\n return await this.withPhysicalCaptureWriteLocks(run, physicalMissing);\n }\n}\n\nexport type TombstoneBlockedMutationHost = {\n readCurrent: () => Promise<MemoryFile | null>;\n isBlocked: (memory: MemoryFile | null) => boolean;\n isQueuedReview: (memory: MemoryFile | null) => boolean;\n memoryIdentity: (memory: MemoryFile) => string;\n prepareWrite: () => Promise<string>;\n commitWrite: (marker: string) => Promise<void>;\n discardWrite: (marker: string) => Promise<void>;\n markUntrusted: () => void;\n writeStorageSecureFile: (pathname: string, fileContent: string) => Promise<void>;\n withCaptureWriteLock: (task: () => Promise<void>, identity: string | readonly string[]) => Promise<void>;\n logWarning: (message: string) => void;\n beginDurableMemoryRevision?: (pathname: string, expectedContent?: string | Buffer | null) => Promise<CasRevisionTransaction | undefined>;\n};\n\nexport type TombstoneBlockedMutation = {\n blocked: boolean;\n pathname: string;\n fileContent: string;\n identity: string | readonly string[];\n updateIndex: (rebuildMarker?: string, current?: MemoryFile | null) => Promise<void>;\n beforeIndexUpdate?: () => Promise<void>;\n coordinate?: boolean;\n shouldMintRevision?: (current: MemoryFile | null) => boolean;\n};\n\nexport async function runTombstoneBlockedMutation(\n host: TombstoneBlockedMutationHost,\n mutation: TombstoneBlockedMutation\n): Promise<string | undefined> {\n let lockIdentity: string | readonly string[] = mutation.identity;\n for (;;) {\n let retryIdentity: string | undefined;\n let mintedRevision: string | undefined;\n const mutate = async (): Promise<void> => {\n const current = await host.readCurrent();\n const currentBlocked = host.isBlocked(current);\n const currentQueuedReview = host.isQueuedReview(current);\n if (current !== null && (mutation.coordinate === true || currentBlocked || currentQueuedReview)) {\n const currentIdentity = host.memoryIdentity(current);\n const heldIdentities = Array.isArray(lockIdentity) ? lockIdentity : [lockIdentity];\n if (!heldIdentities.includes(currentIdentity)) {\n retryIdentity = currentIdentity;\n return;\n }\n }\n const rebuildMarker = mutation.blocked || currentBlocked ? await host.prepareWrite() : undefined;\n const discardRebuildMarker = async (): Promise<void> => {\n if (!rebuildMarker) return;\n try {\n await host.discardWrite(rebuildMarker);\n } catch (cleanupError) {\n host.markUntrusted();\n host.logWarning(`storage.tombstoneBlocked failed to clear write marker: ${cleanupError}`);\n }\n };\n let transaction: CasRevisionTransaction | undefined;\n try {\n // #2813 (P1 C): a two-phase receipt transaction under this same\n // path lock. The PENDING reservation is minted BEFORE the durable\n // file publish, so a failed reservation leaves the memory file\n // untouched — never a mutated record without a receipt. The\n // COMMITTED receipt publishes only AFTER the write lands, so a\n // failed write can never leave the reservation posing as\n // ownership.\n transaction = mutation.shouldMintRevision?.(current)\n ? await host.beginDurableMemoryRevision?.(mutation.pathname, mutation.fileContent)\n : undefined;\n await host.writeStorageSecureFile(mutation.pathname, mutation.fileContent);\n } catch (err) {\n // The memory write failed (or never ran): abort the reservation so\n // no pending marker survives a write that did not land. A failed\n // abort keeps the marker — ambiguity, recovered later.\n if (transaction) {\n try {\n await transaction.abort();\n } catch (abortError) {\n host.logWarning(\n `storage.tombstoneBlocked failed to abort the reserved receipt (pending marker preserved): ${abortError}`,\n );\n }\n }\n await discardRebuildMarker();\n throw err;\n }\n if (transaction) {\n // #2807: record the post-write fingerprint in the PENDING marker\n // BEFORE publishing, so a crash between the durable write and the\n // COMMITTED receipt is decisively recoverable. The evidence only\n // guards that crash window — a recording failure must not fail the\n // landed write, so commit still runs and publishes truthfully.\n try {\n await transaction.writeLanded();\n } catch (evidenceError) {\n host.logWarning(\n `storage.tombstoneBlocked failed to record receipt crash evidence (pending marker preserved): ${evidenceError}`,\n );\n }\n try {\n await transaction.commit();\n } catch (err) {\n // #2813 (P1 C): the memory file LANDED but the COMMITTED receipt\n // never published. The PENDING marker stays: readers must see\n // unavailable/recovery-needed — never ownership, never absence —\n // and promotion/rollback refuse until recovery reconciles. The\n // reservation must NOT be aborted: the write is on disk.\n host.logWarning(\n `storage.tombstoneBlocked receipt publication failed after the memory write (pending marker preserved for recovery): ${err}`,\n );\n await discardRebuildMarker();\n throw err;\n }\n }\n mintedRevision = transaction?.pendingRevision;\n if (rebuildMarker) {\n try {\n await host.commitWrite(rebuildMarker);\n } catch (err) {\n host.markUntrusted();\n host.logWarning(`storage.tombstoneBlocked committed write marker failed: ${err}`);\n }\n }\n if (rebuildMarker) await mutation.beforeIndexUpdate?.();\n await mutation.updateIndex(rebuildMarker, currentBlocked && current !== null ? current : undefined);\n };\n\n await host.withCaptureWriteLock(mutate, lockIdentity);\n if (retryIdentity === undefined) return mintedRevision;\n const identities = Array.isArray(lockIdentity) ? [...lockIdentity, retryIdentity] : [lockIdentity, retryIdentity];\n lockIdentity = [...new Set(identities)];\n }\n}\n\n\nexport function tombstoneBlocked(frontmatter: MemoryFrontmatter): boolean {\n return frontmatter.status === \"pending_review\" && Boolean(frontmatter.blockedBy);\n}\n\nexport function isQueuedReviewFrontmatter(frontmatter: MemoryFrontmatter): boolean {\n return frontmatter.status === \"pending_review\" && (frontmatter.tags ?? []).includes(\"queued-review\");\n}\n\nexport function isQueuedReviewMemory(memory: MemoryFile | null): memory is MemoryFile {\n return memory !== null && isQueuedReviewFrontmatter(memory.frontmatter);\n}\n","import { createHash, randomUUID, type Hash } from \"node:crypto\";\nimport { unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { log } from \"../logger.js\";\nimport type { MemoryFile, MemoryFrontmatter } from \"../types.js\";\nimport { markProjectedMemoryPathInvalid } from \"../memory-projection-store.js\";\nimport { pathMayCarryEntityRefs, requestEntityCanonicalIdReconcile } from \"./entity-canonical-id-references.js\";\nimport { withRawEntityPageMutation } from \"./entity-canonical-id-lock.js\";\nimport { readMaybeEncryptedFileFromChunks, writeMaybeEncryptedFileFromChunks } from \"../secure-store/secure-fs.js\";\nimport * as archiveMutation from \"../archive-mutation-version.js\";\nimport { invalidationCommitFingerprint, isSemanticFrontmatterChange } from \"./deletion-revision-store.js\";\nimport { CasRevisionHost } from \"./cas-revision-host.js\";\nimport type { CasRevisionTransaction } from \"./cas-revision-store.js\";\nimport {\n buildExplicitCaptureDedupKey,\n buildCapturePathLockIdentity,\n captureIdentityHash,\n tombstoneBlocked,\n isQueuedReviewMemory,\n runTombstoneBlockedMutation,\n type TombstoneBlockedMutationHost,\n} from \"./tombstone-blocked-capture-mutation.js\";\nimport { TombstoneBlockedCaptureIndex } from \"./tombstone-blocked-capture-index.js\";\nimport type { TombstoneBlockedCaptureIndexOptions } from \"./tombstone-blocked-capture-index.js\";\n\nconst OFFLINE_SYNC_BUFFER_LIMIT_BYTES = 1_048_576;\nconst OFFLINE_SYNC_STAGE_READ_BYTES = 64 * 1024;\nconst OFFLINE_SYNC_FRONTMATTER_DELIMITER = Buffer.from(\"\\n---\\n\", \"utf8\");\n\nconst CASED_CHARACTER = /\\p{Cased}/u;\nconst CASE_IGNORABLE_CHARACTER = /\\p{Case_Ignorable}/u;\n\ntype StreamedOfflineSyncIdentity = {\n identityHash: string;\n};\n\ntype PreparedOfflineSyncChunks = {\n after: MemoryFile | null;\n chunks: AsyncIterable<Buffer>;\n stagePath?: string;\n streamedIdentity?: StreamedOfflineSyncIdentity;\n};\n\ntype ExplicitContentNormalizerSink = {\n write: (chunk: string) => void;\n beginConditionalSigma: () => void;\n resolveConditionalSigma: (useFinalSigma: boolean) => void;\n};\n\nfunction createExplicitContentNormalizer(sink: ExplicitContentNormalizerSink): {\n push: (text: string) => void;\n finish: () => void;\n} {\n let started = false;\n let pendingSpace = false;\n let output = \"\";\n let precededByCased = false;\n let pendingSigma = false;\n const flush = () => {\n if (output.length > 0) {\n sink.write(output);\n output = \"\";\n }\n };\n const emit = (text: string) => {\n for (const character of text) {\n if (/\\s/u.test(character)) {\n if (started) pendingSpace = true;\n continue;\n }\n if (pendingSpace) {\n output += \" \";\n pendingSpace = false;\n }\n output += character;\n started = true;\n if (output.length >= OFFLINE_SYNC_STAGE_READ_BYTES) flush();\n }\n };\n const resolveSigma = (followedByCased: boolean) => {\n flush();\n sink.resolveConditionalSigma(!followedByCased);\n pendingSigma = false;\n };\n const push = (text: string) => {\n for (const character of text) {\n const caseIgnorable = CASE_IGNORABLE_CHARACTER.test(character);\n const cased = CASED_CHARACTER.test(character);\n if (pendingSigma) {\n if (caseIgnorable) {\n emit(character.toLowerCase());\n continue;\n }\n resolveSigma(cased);\n }\n if (character === \"Σ\" && precededByCased) {\n flush();\n sink.beginConditionalSigma();\n pendingSigma = true;\n precededByCased = true;\n continue;\n }\n emit(character.toLowerCase());\n if (!caseIgnorable) precededByCased = cased;\n }\n };\n return {\n push,\n finish() {\n if (pendingSigma) resolveSigma(false);\n flush();\n },\n };\n}\n\nasync function forEachStagedTextChunk(\n stagePath: string,\n offset: number,\n onText: (text: string) => void,\n key: Buffer | null,\n memoryDir: string\n): Promise<void> {\n const decoder = new TextDecoder(\"utf-8\");\n let remaining = offset;\n for await (const chunk of readMaybeEncryptedFileFromChunks(stagePath, key, memoryDir)) {\n const textChunk = remaining >= chunk.length ? null : chunk.subarray(remaining);\n remaining = Math.max(0, remaining - chunk.length);\n if (textChunk === null || textChunk.length === 0) continue;\n const text = decoder.decode(textChunk, { stream: true });\n if (text.length > 0) onText(text);\n }\n const finalText = decoder.decode();\n if (finalText.length > 0) onText(finalText);\n}\n\nasync function findStagedBodyOffset(stagePath: string, key: Buffer | null, memoryDir: string): Promise<number | null> {\n let scannedBytes = 0;\n let tail = Buffer.alloc(0);\n for await (const chunk of readMaybeEncryptedFileFromChunks(stagePath, key, memoryDir)) {\n const window = tail.length > 0 ? Buffer.concat([tail, chunk]) : chunk;\n const windowStart = scannedBytes - tail.length;\n for (let searchFrom = 0; ; ) {\n const delimiterStart = window.indexOf(OFFLINE_SYNC_FRONTMATTER_DELIMITER, searchFrom);\n if (delimiterStart < 0) break;\n if (windowStart + delimiterStart >= 4) {\n return windowStart + delimiterStart + OFFLINE_SYNC_FRONTMATTER_DELIMITER.length;\n }\n searchFrom = delimiterStart + 1;\n }\n scannedBytes += chunk.length;\n const tailLength = Math.min(OFFLINE_SYNC_FRONTMATTER_DELIMITER.length - 1, window.length);\n tail = Buffer.from(window.subarray(window.length - tailLength));\n }\n return null;\n}\n\nasync function readStagedPrefix(\n stagePath: string,\n byteLimit: number,\n key: Buffer | null,\n memoryDir: string\n): Promise<Buffer> {\n const chunks: Buffer[] = [];\n let bytesRead = 0;\n for await (const chunk of readMaybeEncryptedFileFromChunks(stagePath, key, memoryDir)) {\n const length = Math.min(chunk.length, byteLimit - bytesRead);\n if (length > 0) chunks.push(chunk.subarray(0, length));\n bytesRead += length;\n if (bytesRead >= byteLimit) break;\n }\n return Buffer.concat(chunks, bytesRead);\n}\n\nexport type OfflineSyncMemoryParser = (filePath: string, content: Buffer) => MemoryFile | null;\n\nexport function parseTombstoneBlockedOfflineSyncMemory(\n filePath: string,\n content: Buffer,\n memoryDir: string,\n parseFrontmatter: (raw: string) => { frontmatter: MemoryFrontmatter; content: string } | null,\n normalizeFrontmatterForPath: (frontmatter: MemoryFrontmatter, pathRel: string, content?: string) => MemoryFrontmatter,\n toMemoryPathRel: (baseDir: string, filePath: string) => string\n): MemoryFile | null {\n const parsed = parseFrontmatter(content.toString(\"utf8\"));\n if (!parsed) return null;\n return {\n path: filePath,\n frontmatter: normalizeFrontmatterForPath(parsed.frontmatter, toMemoryPathRel(memoryDir, filePath), parsed.content),\n content: parsed.content,\n };\n}\n\nexport abstract class TombstoneBlockedCaptureIndexHost {\n private tombstoneBlockedCaptureIndex: TombstoneBlockedCaptureIndex | null = null;\n protected abstract tombstoneBlockedCaptureIndexOptions(): TombstoneBlockedCaptureIndexOptions;\n protected abstract writeStorageSecureFile(\n filePath: string,\n content: string | Buffer,\n forceEncrypt?: boolean\n ): Promise<void>;\n protected abstract assertManagedStoragePath(filePath: string, method: string): string;\n protected abstract notifyCatalogWriteForPath(filePath: string): void;\n protected abstract readMemoryByPath(filePath: string): Promise<MemoryFile | null>;\n protected abstract invalidateAllMemoriesCache(): void;\n protected abstract invalidateKnowledgeIndexCache(): void;\n protected abstract invalidateColdMemoriesCache(): void;\n protected abstract bumpArtifactWriteVersion(): number;\n protected abstract bumpMemoryStatusVersion(): void;\n protected abstract bumpMemoryCorpusVersion(): void;\n protected abstract markFactHashIndexNotAuthoritative(): void;\n /** #2837: durable unlink plus deletion-revision record, WITHOUT the CAS\n * shard sweep — the concrete {@link deleteManagedStorageFile} composes the\n * two so every deletion funnel (invalidation, maintenance purge, archive\n * move, offline sync) sweeps. */\n protected abstract deleteManagedStorageFileDurable(filePath: string, deletionMtimeMs?: number | null): Promise<boolean>;\n protected abstract writeManagedStorageFile(filePath: string, write: () => Promise<void>): Promise<void>;\n\n /** #2813 (P1 C, #2807): reserve the target's next durable CAS revision\n * token as a two-phase receipt transaction — a PENDING write-ahead\n * marker under the mutation's path lock, published COMMITTED only after\n * the durable file write lands. Receipt identity lives in the per-target\n * sidecar, never in public `frontmatter.updated`. The default host keeps\n * no receipt identity; StorageManager records it. */\n protected async beginDurableMemoryRevision(_pathname: string, _expectedContent?: string | Buffer | null): Promise<CasRevisionTransaction | undefined> {\n return undefined;\n }\n\n /** #2837 (shard cleanup): after a managed memory file is durably deleted,\n * sweep its per-target CAS receipt shard so orphan shards cannot grow\n * forever. The sweep runs under the shard's own lock and is best-effort —\n * the memory file is already gone, so a sweep failure logs and never\n * fails the delete. The sweeper is a second CasRevisionHost over the same\n * memory dir; the host is stateless and every mutation serializes through\n * the sidecar's file locks, so it shares the same shard files\n * StorageManager's own host operates on. */\n private deletedMemoryShardSweeper: CasRevisionHost | null = null;\n\n protected async deleteManagedStorageFile(filePath: string, deletionMtimeMs?: number | null): Promise<boolean> {\n const deleted = await this.deleteManagedStorageFileDurable(filePath, deletionMtimeMs);\n if (!deleted) return false;\n if (this.deletedMemoryShardSweeper === null) {\n this.deletedMemoryShardSweeper = new CasRevisionHost(this.tombstoneBlockedCaptureIndexOptions().memoryDir);\n }\n await this.deletedMemoryShardSweeper.sweepShardAfterDeletion(filePath);\n return true;\n }\n\n private async writeStorageSecureFileChunks(filePath: string, chunks: AsyncIterable<Buffer>): Promise<void> {\n const options = this.tombstoneBlockedCaptureIndexOptions();\n await writeMaybeEncryptedFileFromChunks(\n filePath,\n chunks,\n options.secureStoreWriteKeyProvider(),\n {},\n options.memoryDir\n );\n this.notifyCatalogWriteForPath(filePath);\n }\n\n protected getTombstoneBlockedCaptureIndex(): TombstoneBlockedCaptureIndex {\n if (this.tombstoneBlockedCaptureIndex === null) {\n this.tombstoneBlockedCaptureIndex = new TombstoneBlockedCaptureIndex(this.tombstoneBlockedCaptureIndexOptions());\n }\n return this.tombstoneBlockedCaptureIndex;\n }\n async withTombstoneBlockedCaptureWriteLock<T>(\n task: () => Promise<T>,\n identity?: string | readonly string[]\n ): Promise<T> {\n return await this.getTombstoneBlockedCaptureIndex().withCaptureWriteLock(task, identity);\n }\n\n /** Read selected memories while their mutation locks remain held. */\n async readMemorySnapshotsIfUnchanged(expected: readonly MemoryFile[]): Promise<MemoryFile[] | null> {\n return await this.withMemorySnapshotsIfUnchanged(expected, async (memories) => memories);\n }\n\n async withMemorySnapshotsIfUnchanged<T>(\n expected: readonly MemoryFile[],\n task: (memories: MemoryFile[]) => Promise<T>\n ): Promise<T | null> {\n if (expected.length === 0) return await task([]);\n const pathnames = [...new Set(expected.map((memory) => memory.path))];\n if (pathnames.length !== expected.length) return null;\n return await this.withTombstoneBlockedCaptureWriteLock(async () => {\n const current = await Promise.all(pathnames.map((pathname) => this.readMemoryByPath(pathname)));\n for (let index = 0; index < expected.length; index += 1) {\n const actual = current[index];\n const snapshot = expected[index];\n if (\n !actual ||\n !snapshot ||\n actual.frontmatter.id !== snapshot.frontmatter.id ||\n invalidationCommitFingerprint(actual) !== invalidationCommitFingerprint(snapshot)\n ) {\n return null;\n }\n }\n return await task(current as MemoryFile[]);\n }, pathnames.map(buildCapturePathLockIdentity));\n }\n\n protected async withTombstoneBlockedCaptureWriteLockAndHashes<T>(\n task: () => Promise<T>,\n identity: string | readonly string[] | undefined,\n identityHashes: readonly string[]\n ): Promise<T> {\n return await this.getTombstoneBlockedCaptureIndex().withCaptureWriteLockAndHashes(task, identity, identityHashes);\n }\n\n private async writeTombstoneBlockedMutation(\n blocked: boolean,\n pathname: string,\n fileContent: string,\n identity: string | readonly string[],\n updateIndex: (rebuildMarker?: string, current?: MemoryFile | null) => Promise<void>,\n beforeIndexUpdate?: () => Promise<void>,\n coordinate = false,\n shouldMintRevision?: (current: MemoryFile | null) => boolean\n ): Promise<string | undefined> {\n const host: TombstoneBlockedMutationHost = {\n readCurrent: () => this.readMemoryByPath(pathname),\n isBlocked: (memory) => this.isTombstoneBlockedMemory(memory),\n isQueuedReview: (memory) => isQueuedReviewMemory(memory),\n memoryIdentity: (memory) => this.offlineSyncMemoryIdentity(memory),\n prepareWrite: () => this.getTombstoneBlockedCaptureIndex().prepareWrite(),\n commitWrite: (marker) => this.getTombstoneBlockedCaptureIndex().commitWrite(marker),\n discardWrite: (marker) => this.getTombstoneBlockedCaptureIndex().discardWrite(marker),\n markUntrusted: () => this.getTombstoneBlockedCaptureIndex().markUntrusted(),\n writeStorageSecureFile: (target, content) => this.writeStorageSecureFile(target, content),\n withCaptureWriteLock: (task, lockIdentity) => this.withTombstoneBlockedCaptureWriteLock(task, lockIdentity),\n logWarning: (message) => log.warn(message),\n beginDurableMemoryRevision: (targetPath, expectedContent) =>\n this.beginDurableMemoryRevision(targetPath, expectedContent),\n };\n return await runTombstoneBlockedMutation(host, {\n blocked,\n pathname,\n fileContent,\n identity,\n updateIndex,\n beforeIndexUpdate,\n coordinate,\n shouldMintRevision,\n });\n }\n\n protected async writeTombstoneBlockedMemory(\n pathname: string,\n fileContent: string,\n frontmatter: MemoryFrontmatter,\n content: string,\n beforeIndexUpdate?: () => Promise<void>\n ): Promise<void> {\n await this.writeTombstoneBlockedMutation(\n tombstoneBlocked(frontmatter),\n pathname,\n fileContent,\n [\n buildCapturePathLockIdentity(pathname),\n buildExplicitCaptureDedupKey(content, frontmatter.category, frontmatter.sourceConnector),\n ],\n (rebuildMarker) =>\n this.getTombstoneBlockedCaptureIndex().addWrittenMemory(pathname, frontmatter, content, rebuildMarker),\n beforeIndexUpdate\n );\n }\n\n protected async withTombstoneBlockedMemoryPathLock<T>(\n pathname: string,\n task: (current: MemoryFile | null) => Promise<T>,\n additionalPathnames: readonly string[] = []\n ): Promise<T> {\n let lockIdentities = [pathname, ...additionalPathnames].map(buildCapturePathLockIdentity);\n for (;;) {\n let retryIdentity: string | undefined;\n let result: T | undefined;\n await this.withTombstoneBlockedCaptureWriteLock(async () => {\n const current = await this.readMemoryByPath(pathname);\n if (current !== null) {\n const currentIdentity = this.offlineSyncMemoryIdentity(current);\n if (!lockIdentities.includes(currentIdentity)) {\n retryIdentity = currentIdentity;\n return;\n }\n }\n result = await task(current);\n }, lockIdentities);\n if (retryIdentity !== undefined) {\n lockIdentities = [...new Set([...lockIdentities, retryIdentity])];\n continue;\n }\n return result!;\n }\n }\n\n protected async writeTombstoneBlockedChunk(\n pathname: string,\n fileContent: string,\n frontmatter: MemoryFrontmatter,\n content: string,\n findDuplicate: () => Promise<MemoryFile | null>,\n afterWrite: (current: MemoryFile | null) => Promise<void>\n ): Promise<string> {\n const incomingIdentity = buildExplicitCaptureDedupKey(content, frontmatter.category, frontmatter.sourceConnector);\n let lockIdentities = [buildCapturePathLockIdentity(pathname), incomingIdentity];\n for (;;) {\n let retryIdentity: string | undefined;\n let result = frontmatter.id;\n await this.withTombstoneBlockedCaptureWriteLock(async () => {\n const current = await this.readMemoryByPath(pathname);\n if (current !== null) {\n const currentIdentity = this.offlineSyncMemoryIdentity(current);\n if (!lockIdentities.includes(currentIdentity)) {\n retryIdentity = currentIdentity;\n return;\n }\n }\n if (tombstoneBlocked(frontmatter)) {\n const duplicate = await findDuplicate();\n if (duplicate) {\n result = duplicate.frontmatter.id;\n return;\n }\n }\n await this.writeTombstoneBlockedMemory(pathname, fileContent, frontmatter, content);\n await afterWrite(current);\n }, lockIdentities);\n if (retryIdentity === undefined) return result;\n lockIdentities = [...new Set([...lockIdentities, retryIdentity])];\n }\n }\n\n protected async writeTombstoneBlockedUpdate(\n before: MemoryFile,\n fileContent: string,\n frontmatter: MemoryFrontmatter,\n content: string,\n beforeIndexUpdate?: () => Promise<void>\n ): Promise<string | undefined> {\n return await this.writeTombstoneBlockedMutation(\n tombstoneBlocked(before.frontmatter) || tombstoneBlocked(frontmatter),\n before.path,\n fileContent,\n [\n buildCapturePathLockIdentity(before.path),\n this.offlineSyncMemoryIdentity(before),\n buildExplicitCaptureDedupKey(content, frontmatter.category, frontmatter.sourceConnector),\n ],\n (rebuildMarker, current) =>\n this.getTombstoneBlockedCaptureIndex().syncUpdatedMemory(\n current ?? before,\n frontmatter,\n content,\n rebuildMarker\n ),\n beforeIndexUpdate,\n true,\n () => true\n );\n }\n\n protected async writeTombstoneBlockedFrontmatter(\n before: MemoryFile,\n fileContent: string,\n frontmatter: MemoryFrontmatter,\n beforeIndexUpdate?: () => Promise<void>\n ): Promise<string | undefined> {\n return await this.writeTombstoneBlockedMutation(\n tombstoneBlocked(before.frontmatter) || tombstoneBlocked(frontmatter),\n before.path,\n fileContent,\n [\n buildCapturePathLockIdentity(before.path),\n this.offlineSyncMemoryIdentity(before),\n buildExplicitCaptureDedupKey(before.content, frontmatter.category, frontmatter.sourceConnector),\n ],\n (rebuildMarker, current) =>\n this.getTombstoneBlockedCaptureIndex().syncUpdatedFrontmatter(current ?? before, frontmatter, rebuildMarker),\n beforeIndexUpdate,\n true,\n (current) => isSemanticFrontmatterChange((current ?? before).frontmatter, frontmatter)\n );\n }\n\n\n private isTombstoneBlockedMemory(memory: MemoryFile | null): memory is MemoryFile {\n return memory !== null && memory.frontmatter.status === \"pending_review\" && Boolean(memory.frontmatter.blockedBy);\n }\n\n private offlineSyncMemoryIdentity(memory: MemoryFile): string {\n return buildExplicitCaptureDedupKey(\n memory.content,\n memory.frontmatter.category,\n memory.frontmatter.sourceConnector\n );\n }\n private async isDuplicateTombstoneBlockedOfflineSync(\n target: string,\n incoming: MemoryFile,\n streamedIdentity?: StreamedOfflineSyncIdentity\n ): Promise<boolean> {\n const before = await this.readMemoryByPath(target);\n const duplicate = streamedIdentity\n ? true\n : await this.getTombstoneBlockedCaptureIndex().has(\n incoming.content,\n incoming.frontmatter.category,\n incoming.frontmatter.sourceConnector\n );\n if (!duplicate) return false;\n const incomingIdentity = streamedIdentity?.identityHash ?? this.offlineSyncMemoryIdentity(incoming);\n const options = this.tombstoneBlockedCaptureIndexOptions();\n const existing = [...(await options.readAllMemories()), ...(await options.readAllColdMemories())];\n const exactMatch = existing.some(\n (memory) =>\n this.isTombstoneBlockedMemory(memory) &&\n (streamedIdentity ? captureIdentityHash(memory) : this.offlineSyncMemoryIdentity(memory)) === incomingIdentity\n );\n if (!exactMatch) return false;\n if (before === null) return true;\n if (!this.isTombstoneBlockedMemory(before)) return false;\n const beforeIdentity = streamedIdentity ? captureIdentityHash(before) : this.offlineSyncMemoryIdentity(before);\n if (beforeIdentity !== incomingIdentity) return false;\n return streamedIdentity\n ? isDeepStrictEqual(before.frontmatter, incoming.frontmatter)\n : before.content === incoming.content && isDeepStrictEqual(before.frontmatter, incoming.frontmatter);\n }\n\n private async invalidateAfterOfflineSyncMutation(\n filePath: string,\n ownedMarker?: string,\n archiveChanged = true,\n blockedKeySetMayHaveChanged = true\n ): Promise<void> {\n this.invalidateAllMemoriesCache();\n this.invalidateKnowledgeIndexCache();\n this.markFactHashIndexNotAuthoritative();\n if (filePath.includes(`${path.sep}cold${path.sep}`)) {\n this.invalidateColdMemoriesCache();\n }\n if (blockedKeySetMayHaveChanged) {\n await this.rebuildTombstoneBlockedCaptureAfterInvalidationForPath(filePath, ownedMarker);\n } else if (ownedMarker !== undefined) {\n // The index only holds tombstone-blocked explicit-capture keys, so a\n // write where neither side is blocked cannot have changed it. Rebuilding\n // here re-reads the whole corpus per replicated file — measured 15-31s\n // per write against a ~190k-file corpus, which turns a boot-scale\n // `converge apply` into a multi-week run. Clear the committed marker and\n // keep the index as-is.\n try {\n await this.getTombstoneBlockedCaptureIndex().clearCommittedWriteMarker(ownedMarker);\n } catch (err) {\n this.getTombstoneBlockedCaptureIndex().markUntrusted();\n log.warn(`storage.offlineSyncFile committed write succeeded; marker cleanup failed: ${err}`);\n }\n }\n if (filePath.includes(`${path.sep}artifacts${path.sep}`)) {\n this.bumpArtifactWriteVersion();\n }\n const memoryDir = this.tombstoneBlockedCaptureIndexOptions().memoryDir;\n archiveMutation.bumpArchiveMutationForPath(memoryDir, archiveChanged, filePath);\n this.bumpMemoryStatusVersion();\n }\n\n protected async runTombstoneBlockedArchive(\n memory: MemoryFile,\n task: (current: MemoryFile, markDurable: () => void) => Promise<string | null>\n ): Promise<string | null> {\n let archivedPath: string | null = null;\n const archived = await this.runTombstoneBlockedInvalidation(memory, async (current, rebuildMarker, markDurable) => {\n let archiveDurable = false;\n const markArchiveDurable = () => {\n archiveDurable = true;\n markDurable();\n };\n archivedPath = await task(current, markArchiveDurable);\n if (rebuildMarker !== undefined && (archivedPath !== null || archiveDurable)) {\n await this.rebuildTombstoneBlockedCaptureAfterInvalidation(rebuildMarker);\n } else if (rebuildMarker !== undefined) {\n const index = this.getTombstoneBlockedCaptureIndex();\n try {\n await index.discardWrite(rebuildMarker);\n } catch {\n index.markUntrusted();\n }\n }\n return archivedPath !== null;\n });\n return archived ? archivedPath : null;\n }\n\n protected async runTombstoneBlockedInvalidation(\n memory: MemoryFile,\n task: (current: MemoryFile, rebuildMarker: string | undefined, markDurable: () => void) => Promise<boolean>,\n propagateErrors = false,\n coordinate = false\n ): Promise<boolean> {\n let lockIdentities = [\n buildCapturePathLockIdentity(memory.path),\n ...(coordinate || this.isTombstoneBlockedMemory(memory) || isQueuedReviewMemory(memory)\n ? [this.offlineSyncMemoryIdentity(memory)]\n : []),\n ];\n for (;;) {\n const attempt = async () => {\n const options = this.tombstoneBlockedCaptureIndexOptions();\n const current =\n (await this.readMemoryByPath(memory.path)) ??\n (await options.readAllMemories()).find((candidate) => candidate.frontmatter.id === memory.frontmatter.id) ??\n (await options.readAllColdMemories()).find((candidate) => candidate.frontmatter.id === memory.frontmatter.id);\n if (!current) return { result: false };\n const blocked = this.isTombstoneBlockedMemory(current);\n const queuedReview = isQueuedReviewMemory(current);\n if (blocked || queuedReview) {\n const currentIdentity = this.offlineSyncMemoryIdentity(current);\n if (!lockIdentities.includes(currentIdentity)) return { retryIdentity: currentIdentity };\n }\n const blockedIndex = blocked ? this.getTombstoneBlockedCaptureIndex() : null;\n let rebuildMarker: string | undefined;\n let durable = false;\n try {\n if (blockedIndex) rebuildMarker = await blockedIndex.prepareWrite();\n const result = await task(current, rebuildMarker, () => {\n durable = true;\n });\n if (!result && rebuildMarker && !durable && blockedIndex) {\n try {\n await blockedIndex.discardWrite(rebuildMarker);\n } catch {\n blockedIndex.markUntrusted();\n }\n }\n return { result };\n } catch (error) {\n if (rebuildMarker && !durable && blockedIndex) {\n try {\n await blockedIndex.discardWrite(rebuildMarker);\n } catch {\n blockedIndex.markUntrusted();\n }\n }\n if (propagateErrors) throw error;\n return { result: false };\n }\n };\n const result = await this.withTombstoneBlockedCaptureWriteLock(attempt, lockIdentities);\n if (result.retryIdentity !== undefined) {\n lockIdentities = [...new Set([...lockIdentities, result.retryIdentity])];\n continue;\n }\n return result.result;\n }\n }\n async deleteMemoryForMaintenance(\n memory: MemoryFile,\n shouldDelete: (current: MemoryFile) => boolean = () => true\n ): Promise<MemoryFile | null> {\n let deleted: MemoryFile | null = null;\n const removed = await this.runTombstoneBlockedInvalidation(\n memory,\n async (current, rebuildMarker, markDurable) => {\n if (!shouldDelete(current)) return false;\n if (!(await this.deleteManagedStorageFile(current.path))) return false;\n markDurable();\n deleted = current;\n const memoryDir = this.tombstoneBlockedCaptureIndexOptions().memoryDir;\n archiveMutation.bumpArchiveMutationForPath(memoryDir, true, current.path);\n markProjectedMemoryPathInvalid(memoryDir, current.frontmatter.id);\n this.invalidateAllMemoriesCache();\n if (current.path.includes(`${path.sep}cold${path.sep}`)) {\n this.invalidateColdMemoriesCache();\n }\n await this.rebuildTombstoneBlockedCaptureAfterInvalidation(rebuildMarker);\n this.bumpMemoryCorpusVersion();\n this.bumpMemoryStatusVersion();\n return true;\n },\n true,\n true\n );\n return removed ? deleted : null;\n }\n\n protected async runTombstoneBlockedOfflineSyncMutation(\n target: string,\n after: MemoryFile | null,\n write: () => Promise<boolean | void>,\n coordinate = false,\n streamedIdentity?: StreamedOfflineSyncIdentity\n ): Promise<void> {\n for (;;) {\n const before = await this.readMemoryByPath(target);\n const targetIdentity = before === null ? undefined : this.offlineSyncMemoryIdentity(before);\n const afterIdentity = after === null || streamedIdentity ? undefined : this.offlineSyncMemoryIdentity(after);\n const mustCoordinate =\n coordinate || targetIdentity !== undefined || afterIdentity !== undefined || streamedIdentity !== undefined;\n const identities = [\n ...(mustCoordinate ? [buildCapturePathLockIdentity(target)] : []),\n ...(targetIdentity === undefined ? [] : [targetIdentity]),\n ...(afterIdentity === undefined ? [] : [afterIdentity]),\n ];\n let retryIdentity: string | undefined;\n const mutate = async (): Promise<void> => {\n const current = await this.readMemoryByPath(target);\n if (current !== null) {\n const currentIdentity = this.offlineSyncMemoryIdentity(current);\n if (currentIdentity !== targetIdentity) {\n retryIdentity = currentIdentity;\n return;\n }\n }\n if (\n this.isTombstoneBlockedMemory(after) &&\n (await this.isDuplicateTombstoneBlockedOfflineSync(target, after, streamedIdentity))\n ) {\n return;\n }\n const affectsBlockedIndex =\n coordinate || this.isTombstoneBlockedMemory(current) || this.isTombstoneBlockedMemory(after);\n const marker = affectsBlockedIndex ? await this.getTombstoneBlockedCaptureIndex().prepareWrite() : undefined;\n let durable = false;\n try {\n const changed = await write();\n durable = true;\n if (marker) {\n try {\n await this.getTombstoneBlockedCaptureIndex().commitWrite(marker);\n } catch (err) {\n this.getTombstoneBlockedCaptureIndex().markUntrusted();\n log.warn(`storage.offlineSyncFile committed write marker failed: ${err}`);\n }\n }\n await this.invalidateAfterOfflineSyncMutation(\n target,\n marker,\n changed !== false,\n this.isTombstoneBlockedMemory(current) || this.isTombstoneBlockedMemory(after)\n );\n } catch (err) {\n if (marker && !durable) {\n try {\n await this.getTombstoneBlockedCaptureIndex().discardWrite(marker);\n } catch (cleanupError) {\n this.getTombstoneBlockedCaptureIndex().markUntrusted();\n log.warn(`storage.offlineSyncFile failed to clear write marker: ${cleanupError}`);\n }\n }\n throw err;\n }\n };\n if (!mustCoordinate) {\n await mutate();\n } else if (streamedIdentity) {\n await this.withTombstoneBlockedCaptureWriteLockAndHashes(mutate, identities, [streamedIdentity.identityHash]);\n } else {\n await this.withTombstoneBlockedCaptureWriteLock(mutate, identities);\n }\n if (retryIdentity !== undefined) continue;\n return;\n }\n }\n\n protected async writeTombstoneBlockedOfflineSyncFile(target: string, content: Buffer): Promise<void> {\n const options = this.tombstoneBlockedCaptureIndexOptions();\n const after = options.parseMemory?.(target, content) ?? null;\n await withRawEntityPageMutation(path.dirname(options.stateDir), target, async () => {\n await this.runTombstoneBlockedOfflineSyncMutation(target, after, () =>\n this.writeManagedStorageFile(target, () => this.writeStorageSecureFile(target, content))\n );\n });\n }\n\n private async prepareTombstoneBlockedOfflineSyncChunks(\n target: string,\n chunks: AsyncIterable<Buffer>\n ): Promise<PreparedOfflineSyncChunks> {\n const parseMemory = this.tombstoneBlockedCaptureIndexOptions().parseMemory;\n if (!parseMemory) return { after: null, chunks };\n\n const iterator = chunks[Symbol.asyncIterator]();\n const buffered: Buffer[] = [];\n let bufferedBytes = 0;\n let firstOverflow: Buffer | undefined;\n for (;;) {\n const next = await iterator.next();\n if (next.done) break;\n if (bufferedBytes + next.value.length > OFFLINE_SYNC_BUFFER_LIMIT_BYTES) {\n firstOverflow = next.value;\n break;\n }\n bufferedBytes += next.value.length;\n buffered.push(next.value);\n }\n const overflow = firstOverflow;\n if (overflow === undefined) {\n let after: MemoryFile | null = null;\n try {\n after = parseMemory(target, Buffer.concat(buffered));\n } catch {\n after = null;\n }\n const replay = (async function* (): AsyncIterable<Buffer> {\n for (const chunk of buffered) yield chunk;\n })();\n return { after, chunks: replay };\n }\n\n const options = this.tombstoneBlockedCaptureIndexOptions();\n const stagePath = path.join(\n options.stateDir,\n \"tombstone-blocked-capture\",\n \"offline-sync-staging\",\n `${randomUUID()}.stage`\n );\n const stagedChunks = (async function* (): AsyncIterable<Buffer> {\n for (const chunk of buffered) yield chunk;\n yield overflow;\n for (;;) {\n const next = await iterator.next();\n if (next.done) break;\n yield next.value;\n }\n })();\n try {\n await writeMaybeEncryptedFileFromChunks(\n stagePath,\n stagedChunks,\n options.secureStoreWriteKeyProvider(),\n { atomic: false },\n options.memoryDir\n );\n return await this.describeStagedOfflineSyncChunks(target, stagePath, parseMemory);\n } catch (err) {\n await unlink(stagePath).catch(() => {});\n throw err;\n }\n }\n\n private async describeStagedOfflineSyncChunks(\n target: string,\n stagePath: string,\n parseMemory: OfflineSyncMemoryParser\n ): Promise<PreparedOfflineSyncChunks> {\n const options = this.tombstoneBlockedCaptureIndexOptions();\n const key = options.secureStoreKeyProvider();\n const bodyOffset = await findStagedBodyOffset(stagePath, key, options.memoryDir);\n if (bodyOffset === null) {\n return { after: null, chunks: this.readStagedOfflineSyncChunks(stagePath), stagePath };\n }\n const prefix = await readStagedPrefix(stagePath, bodyOffset, key, options.memoryDir);\n let after: MemoryFile | null = null;\n try {\n after = parseMemory(target, prefix.subarray(0, bodyOffset));\n } catch {\n after = null;\n }\n if (after === null) {\n return { after: null, chunks: this.readStagedOfflineSyncChunks(stagePath), stagePath };\n }\n const streamedIdentity = await this.computeStagedOfflineSyncIdentity(stagePath, bodyOffset, after);\n return {\n after,\n chunks: this.readStagedOfflineSyncChunks(stagePath),\n stagePath,\n streamedIdentity,\n };\n }\n\n private async computeStagedOfflineSyncIdentity(\n stagePath: string,\n bodyOffset: number,\n after: MemoryFile\n ): Promise<StreamedOfflineSyncIdentity> {\n let normalizedLength = 0;\n const countNormalizer = createExplicitContentNormalizer({\n write: (chunk) => {\n normalizedLength += chunk.length;\n },\n beginConditionalSigma: () => {\n normalizedLength += 1;\n },\n resolveConditionalSigma: () => {},\n });\n const options = this.tombstoneBlockedCaptureIndexOptions();\n const key = options.secureStoreKeyProvider();\n await forEachStagedTextChunk(stagePath, bodyOffset, (text) => countNormalizer.push(text), key, options.memoryDir);\n countNormalizer.finish();\n\n const category = after.frontmatter.category;\n const connector = after.frontmatter.sourceConnector?.trim() ?? \"\";\n const encode = (label: string, value: string): string => `${label} ${value.length} ${value}`;\n const identityPrefix = [\n encode(\"category\", category),\n encode(\"connector\", connector),\n `content ${normalizedLength} `,\n ].join(\" \");\n let identityHash = createHash(\"sha256\");\n let normalSigmaIdentityHash: Hash | undefined;\n identityHash.update(identityPrefix);\n const identityNormalizer = createExplicitContentNormalizer({\n write: (chunk) => {\n identityHash.update(chunk);\n normalSigmaIdentityHash?.update(chunk);\n },\n beginConditionalSigma: () => {\n normalSigmaIdentityHash = identityHash.copy().update(\"σ\");\n identityHash.update(\"ς\");\n },\n resolveConditionalSigma: (useFinalSigma) => {\n if (!useFinalSigma) {\n if (normalSigmaIdentityHash === undefined) throw new Error(\"conditional sigma hash state is missing\");\n identityHash = normalSigmaIdentityHash;\n }\n normalSigmaIdentityHash = undefined;\n },\n });\n await forEachStagedTextChunk(\n stagePath,\n bodyOffset,\n (text) => identityNormalizer.push(text),\n key,\n options.memoryDir\n );\n identityNormalizer.finish();\n return {\n identityHash: identityHash.digest(\"hex\"),\n };\n }\n\n private async *readStagedOfflineSyncChunks(stagePath: string): AsyncIterable<Buffer> {\n const options = this.tombstoneBlockedCaptureIndexOptions();\n for await (const chunk of readMaybeEncryptedFileFromChunks(\n stagePath,\n options.secureStoreKeyProvider(),\n options.memoryDir\n )) {\n yield chunk;\n }\n }\n\n protected async writeTombstoneBlockedOfflineSyncFileChunks(\n target: string,\n chunks: AsyncIterable<Buffer>\n ): Promise<void> {\n const coordinate = this.getTombstoneBlockedCaptureIndex().shouldRebuildAfterInvalidationForPath(target);\n const prepared: PreparedOfflineSyncChunks = coordinate\n ? await this.prepareTombstoneBlockedOfflineSyncChunks(target, chunks)\n : { after: null, chunks };\n const streamedIdentity = prepared.streamedIdentity;\n const baseDir = path.dirname(this.tombstoneBlockedCaptureIndexOptions().stateDir);\n try {\n await withRawEntityPageMutation(baseDir, target, async () => {\n await this.runTombstoneBlockedOfflineSyncMutation(\n target,\n prepared.after,\n () => this.writeManagedStorageFile(target, () => this.writeStorageSecureFileChunks(target, prepared.chunks)),\n coordinate,\n streamedIdentity\n );\n });\n } finally {\n if (prepared.stagePath !== undefined) await unlink(prepared.stagePath).catch(() => {});\n }\n }\n\n async writeOfflineSyncFile(filePath: string, content: Buffer): Promise<void> {\n const target = this.assertManagedStoragePath(filePath, \"storage.writeOfflineSyncFile\");\n await this.writeTombstoneBlockedOfflineSyncFile(target, content);\n await this.requestSyncReconcileIfMigrationPath(target);\n }\n\n async writeOfflineSyncFileChunks(filePath: string, chunks: AsyncIterable<Buffer>): Promise<void> {\n const target = this.assertManagedStoragePath(filePath, \"storage.writeOfflineSyncFileChunks\");\n await this.writeTombstoneBlockedOfflineSyncFileChunks(target, chunks);\n await this.requestSyncReconcileIfMigrationPath(target);\n }\n\n /**\n * Opaque replicated bytes can restore legacy memory references or entity\n * relationship targets. Other sync traffic must not request reconciliation.\n */\n private async requestSyncReconcileIfMigrationPath(target: string): Promise<void> {\n const stateDir = this.tombstoneBlockedCaptureIndexOptions().stateDir;\n if (!pathMayCarryEntityRefs(path.dirname(stateDir), target)) return;\n await requestEntityCanonicalIdReconcile(stateDir);\n }\n\n async deleteOfflineSyncFile(filePath: string, deletionMtimeMs?: number | null): Promise<void> {\n const target = this.assertManagedStoragePath(filePath, \"storage.deleteOfflineSyncFile\");\n await this.deleteTombstoneBlockedOfflineSyncFile(target, deletionMtimeMs);\n await this.requestSyncReconcileIfMigrationPath(target);\n }\n\n protected async deleteTombstoneBlockedOfflineSyncFile(\n target: string,\n deletionMtimeMs?: number | null\n ): Promise<void> {\n const stateDir = this.tombstoneBlockedCaptureIndexOptions().stateDir;\n await withRawEntityPageMutation(path.dirname(stateDir), target, async () => {\n await this.runTombstoneBlockedOfflineSyncMutation(target, null, async () => {\n return await this.deleteManagedStorageFile(target, deletionMtimeMs);\n });\n });\n }\n\n async checkTombstoneBlockedExplicitCapture(\n ...args: [string, string, string?]\n ): Promise<{ has: boolean; authoritative: boolean }> {\n return this.getTombstoneBlockedCaptureIndex().check(...args);\n }\n\n async hasTombstoneBlockedExplicitCapture(...args: [string, string, string?]): Promise<boolean> {\n return this.getTombstoneBlockedCaptureIndex().has(...args);\n }\n\n async isTombstoneBlockedExplicitCaptureIndexAuthoritative(): Promise<boolean> {\n return this.getTombstoneBlockedCaptureIndex().isAuthoritative();\n }\n\n protected async rebuildTombstoneBlockedCaptureAfterInvalidationForPath(\n filePath: string,\n ownedMarker?: string\n ): Promise<void> {\n const index = this.getTombstoneBlockedCaptureIndex();\n if (index.shouldRebuildAfterInvalidationForPath(filePath)) {\n await this.rebuildTombstoneBlockedCaptureAfterInvalidation(ownedMarker);\n }\n }\n protected async rebuildTombstoneBlockedCaptureAfterInvalidation(ownedMarker?: string): Promise<void> {\n await this.getTombstoneBlockedCaptureIndex().rebuildAfterInvalidation(ownedMarker);\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, readdir, rename, stat, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { log } from \"../logger.js\";\nimport type { MemoryFile, MemoryFrontmatter } from \"../types.js\";\nimport { RECALL_FALLBACK_DIRS } from \"../utils/category-dir.js\";\nimport { isErrnoCode } from \"../utils/errno.js\";\nimport type { withHeldFileLock } from \"../utils/serialize-mutations.js\";\nimport {\n CONTENT_HASH_INDEX_RETRY_MAX_DELAY_MS,\n ContentHashIndex,\n type ContentHashIndexLockOptions,\n} from \"./content-hash-index.js\";\nimport {\n TombstoneBlockedCaptureWriteLock,\n buildExplicitCaptureDedupKey,\n} from \"./tombstone-blocked-capture-mutation.js\";\nimport type { OfflineSyncMemoryParser } from \"./tombstone-blocked-capture-sync.js\";\nexport {\n buildExplicitCaptureDedupKey,\n isTombstoneBlockedCaptureWriteLockBusy,\n normalizeExplicitCaptureContent,\n} from \"./tombstone-blocked-capture-mutation.js\";\nexport {\n parseTombstoneBlockedOfflineSyncMemory,\n type OfflineSyncMemoryParser,\n TombstoneBlockedCaptureIndexHost,\n} from \"./tombstone-blocked-capture-sync.js\";\n\nconst REBUILD_MAX_ATTEMPTS = 3;\nconst execFileAsync = promisify(execFile);\nconst REBUILD_RETRY_BASE_MS = 50;\n\nconst ABANDONED_MARKER_MIN_AGE_MS = 60_000;\nconst MARKER_PROCESS_START_TOLERANCE_MS = 2_000;\nconst DOTNET_UNIX_EPOCH_TICKS = 621_355_968_000_000_000;\nconst MARKER_PROCESS_STARTED_AT_MS = Date.now() - process.uptime() * 1000;\n\ntype RebuildMarker = {\n path: string;\n committed: boolean;\n pid?: number;\n ownerId?: string;\n createdAt?: number;\n processStartedAtMs?: number;\n malformed?: boolean;\n};\n\nexport type TombstoneBlockedCaptureIndexOptions = {\n readonly stateDir: string;\n readonly memoryDir: string;\n readonly secureStoreKeyProvider: () => Buffer | null;\n readonly secureStoreWriteKeyProvider: () => Buffer | null;\n readonly lockOptions: () => ContentHashIndexLockOptions;\n readonly readAllMemories: () => Promise<MemoryFile[]>;\n readonly readAllColdMemories: () => Promise<MemoryFile[]>;\n readonly parseMemory?: OfflineSyncMemoryParser;\n readonly withHeldFileLock?: typeof withHeldFileLock;\n};\n\n/**\n * Durable targeted deduplication for tombstone-blocked explicit captures.\n *\n * The active fact-hash index intentionally excludes blocked rows. This small\n * companion index keeps the blocked identity visible without making every\n * authoritative active-index miss scan the full corpus.\n */\nexport class TombstoneBlockedCaptureIndex {\n private readonly options: TombstoneBlockedCaptureIndexOptions;\n private index: ContentHashIndex | null = null;\n private loadPromise: Promise<ContentHashIndex> | null = null;\n private refreshPromise: Promise<ContentHashIndex> | null = null;\n private authoritative = false;\n private readonly captureWriteLock: TombstoneBlockedCaptureWriteLock;\n\n constructor(options: TombstoneBlockedCaptureIndexOptions) {\n this.options = options;\n this.captureWriteLock = new TombstoneBlockedCaptureWriteLock(options);\n }\n\n private createIndex(): ContentHashIndex {\n return new ContentHashIndex(\n path.join(this.options.stateDir, \"tombstone-blocked-capture\"),\n this.options.secureStoreKeyProvider,\n this.options.secureStoreWriteKeyProvider,\n this.options.memoryDir,\n this.options.lockOptions()\n );\n }\n\n private indexPath(): string {\n return path.join(this.options.stateDir, \"tombstone-blocked-capture\", \"fact-hashes.txt\");\n }\n\n private rebuildMarkerPath(): string {\n return path.join(this.options.stateDir, \"tombstone-blocked-capture\", \"rebuild-required\");\n }\n\n private async readRebuildMarkers(): Promise<RebuildMarker[]> {\n try {\n const entries = (await readdir(this.rebuildMarkerPath())).filter((entry) => !entry.startsWith(\".\"));\n return (\n await Promise.all(\n entries.map(async (entry) => {\n const markerPath = path.join(this.rebuildMarkerPath(), entry);\n try {\n const raw = (await readFile(markerPath, \"utf8\")).trim();\n if (raw === \"committed\") return { path: markerPath, committed: true };\n let value: Record<string, unknown>;\n let malformed = false;\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n malformed = true;\n value = {};\n } else {\n value = parsed as Record<string, unknown>;\n }\n } catch {\n malformed = true;\n value = {};\n }\n const state = value.state;\n if (state !== \"pending\" && state !== \"committed\") malformed = true;\n const markerStat = await stat(markerPath).catch(() => null);\n // A torn payload can lose its JSON metadata, but the atomic\n // marker filename and filesystem mtime still identify its owner\n // and age. Preserve both so stale malformed markers can be\n // reaped without treating a fresh pre-commit gap as abandoned.\n const createdAt =\n typeof value.createdAt === \"number\" && Number.isFinite(value.createdAt)\n ? value.createdAt\n : markerStat?.mtimeMs;\n if (typeof value.pid !== \"number\" || !Number.isInteger(value.pid)) malformed = true;\n const ownerId =\n typeof value.ownerId === \"string\" && value.ownerId.length > 0\n ? value.ownerId\n : path.basename(markerPath);\n if (typeof value.ownerId !== \"string\" || value.ownerId.length === 0) malformed = true;\n const processStartedAtMs =\n typeof value.processStartedAtMs === \"number\" &&\n Number.isFinite(value.processStartedAtMs) &&\n value.processStartedAtMs > 0\n ? value.processStartedAtMs\n : undefined;\n return {\n path: markerPath,\n committed: state === \"committed\",\n ...(typeof value.pid === \"number\" && Number.isInteger(value.pid) ? { pid: value.pid } : {}),\n ...(ownerId.length > 0 ? { ownerId } : {}),\n ...(typeof createdAt === \"number\" && Number.isFinite(createdAt) ? { createdAt } : {}),\n ...(processStartedAtMs === undefined ? {} : { processStartedAtMs }),\n ...(malformed ? { malformed: true } : {}),\n };\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return null;\n throw err;\n }\n })\n )\n ).filter((marker): marker is RebuildMarker => marker !== null);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return [];\n throw err;\n }\n }\n private async isAbandonedMarker(marker: RebuildMarker): Promise<boolean> {\n if (marker.committed || marker.createdAt === undefined) return false;\n if (Date.now() - marker.createdAt < ABANDONED_MARKER_MIN_AGE_MS) return false;\n if (marker.malformed) return true;\n return marker.pid !== undefined && !(await this.isProcessAlive(marker.pid, marker.processStartedAtMs));\n }\n\n private async isProcessAlive(pid: number, processStartedAtMs?: number): Promise<boolean> {\n try {\n process.kill(pid, 0);\n } catch (err) {\n return !isErrnoCode(err, \"ESRCH\");\n }\n if (processStartedAtMs === undefined) return true;\n const runningStartedAtMs = await this.readProcessStartedAtMs(pid);\n if (runningStartedAtMs === null) return true;\n return runningStartedAtMs <= processStartedAtMs + MARKER_PROCESS_START_TOLERANCE_MS;\n }\n private async readProcessStartedAtMs(pid: number): Promise<number | null> {\n try {\n if (process.platform === \"win32\") {\n const { stdout } = await execFileAsync(\n \"powershell.exe\",\n [\n \"-NoLogo\",\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n `(Get-Process -Id ${pid} -ErrorAction Stop).StartTime.ToUniversalTime().Ticks`,\n ],\n { encoding: \"utf8\", timeout: 1_000 }\n );\n const ticks = Number(stdout.trim());\n return Number.isFinite(ticks) ? (ticks - DOTNET_UNIX_EPOCH_TICKS) / 10_000 : null;\n }\n const { stdout } = await execFileAsync(\"ps\", [\"-p\", String(pid), \"-o\", \"lstart=\"], {\n encoding: \"utf8\",\n timeout: 1_000,\n });\n const output = stdout.trim();\n if (!output) return null;\n const startedAtMs = Date.parse(output);\n return Number.isFinite(startedAtMs) ? startedAtMs : null;\n } catch {\n return null;\n }\n }\n\n private async getClearableRebuildMarkerPaths(markers: readonly RebuildMarker[]): Promise<string[]> {\n const paths = await Promise.all(\n markers.map(async (marker) => (marker.committed || (await this.isAbandonedMarker(marker)) ? marker.path : null))\n );\n return paths.filter((markerPath): markerPath is string => markerPath !== null);\n }\n\n private async getRebuildMarkers(): Promise<RebuildMarker[]> {\n return await this.readRebuildMarkers();\n }\n\n // A pending marker protects the pre-commit gap; only committed markers are safe for another writer to clear.\n private async writeMarkerAtomically(markerPath: string, payload: string): Promise<void> {\n const temporaryPath = `${markerPath}.tmp-${process.pid}-${randomUUID()}`;\n try {\n await writeFile(temporaryPath, payload, \"utf8\");\n await rename(temporaryPath, markerPath);\n } finally {\n await unlink(temporaryPath).catch((err: unknown) => {\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n });\n }\n }\n\n private async markRebuildRequired(committed = false): Promise<string> {\n const markerDir = this.rebuildMarkerPath();\n await mkdir(markerDir, { recursive: true });\n const ownerId = randomUUID();\n const markerPath = path.join(markerDir, ownerId);\n await this.writeMarkerAtomically(\n markerPath,\n `${JSON.stringify({\n state: committed ? \"committed\" : \"pending\",\n pid: process.pid,\n ownerId,\n createdAt: Date.now(),\n processStartedAtMs: MARKER_PROCESS_STARTED_AT_MS,\n })}\\n`\n );\n return markerPath;\n }\n\n private async markRebuildCommitted(markerPath: string): Promise<void> {\n await this.writeMarkerAtomically(\n markerPath,\n `${JSON.stringify({\n state: \"committed\",\n pid: process.pid,\n ownerId: path.basename(markerPath),\n createdAt: Date.now(),\n processStartedAtMs: MARKER_PROCESS_STARTED_AT_MS,\n })}\\n`\n );\n }\n\n private async clearRebuildRequired(markerPaths: readonly string[]): Promise<void> {\n await Promise.all(\n markerPaths.map(async (markerPath) => {\n try {\n await unlink(markerPath);\n } catch (err) {\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n }\n })\n );\n }\n\n private async hasRebuildRequired(excludedMarkers: readonly string[] = []): Promise<boolean> {\n const excluded = new Set(excludedMarkers);\n return (await this.getRebuildMarkers()).some((marker) => !excluded.has(marker.path));\n }\n\n private async setAuthoritative(rebuilt: boolean): Promise<void> {\n this.authoritative = rebuilt && !(await this.getRebuildMarkers()).some((marker) => !marker.committed);\n }\n private isBlocked(memory: MemoryFile): boolean {\n return memory.frontmatter.status === \"pending_review\" && Boolean(memory.frontmatter.blockedBy);\n }\n\n private async rebuild(index: ContentHashIndex): Promise<boolean> {\n return await index.rebuildUnderLock(async () => {\n index.clear();\n const existing = [...(await this.options.readAllMemories()), ...(await this.options.readAllColdMemories())];\n for (const memory of existing) {\n if (!this.isBlocked(memory)) continue;\n index.add(\n buildExplicitCaptureDedupKey(memory.content, memory.frontmatter.category, memory.frontmatter.sourceConnector)\n );\n }\n });\n }\n\n private async hasPersistedIndexOrMarkers(): Promise<boolean> {\n try {\n await stat(this.indexPath());\n return true;\n } catch (err) {\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n return (await this.readRebuildMarkers()).length > 0;\n }\n }\n\n private async getIndex(): Promise<ContentHashIndex> {\n if (this.index) return this.index;\n if (!this.loadPromise) {\n const index = this.createIndex();\n this.loadPromise = (async () => {\n await index.load();\n const rebuildMarkers = await this.getRebuildMarkers();\n const clearableRebuildMarkers = await this.getClearableRebuildMarkerPaths(rebuildMarkers);\n let persisted = !index.requiresFormatMigration;\n try {\n await stat(this.indexPath());\n if (rebuildMarkers.length > 0) persisted = false;\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) persisted = false;\n else throw err;\n }\n if (!persisted) {\n const lockOptions = this.options.lockOptions();\n const maxAttempts = lockOptions.retryMaxAttempts ?? REBUILD_MAX_ATTEMPTS;\n const baseMs = lockOptions.retryBaseMs ?? REBUILD_RETRY_BASE_MS;\n let rebuilt = false;\n for (let attempt = 0; attempt < maxAttempts; attempt += 1) {\n rebuilt = await this.rebuild(index);\n if (rebuilt || attempt === maxAttempts - 1) break;\n const wait = Math.min(baseMs * 2 ** attempt, CONTENT_HASH_INDEX_RETRY_MAX_DELAY_MS);\n const delayState = Promise.withResolvers<void>();\n setTimeout(delayState.resolve, wait);\n await delayState.promise;\n }\n if (!rebuilt) {\n throw new Error(\"tombstone-blocked capture index rebuild lock unavailable\");\n }\n await this.clearRebuildRequired(clearableRebuildMarkers);\n }\n await this.setAuthoritative(true);\n this.index = index;\n return index;\n })().catch((err) => {\n this.loadPromise = null;\n throw err;\n });\n }\n return this.loadPromise;\n }\n\n async withCaptureWriteLock<T>(task: () => Promise<T>, identity?: string | readonly string[]): Promise<T> {\n return await this.captureWriteLock.withCaptureWriteLock(task, identity);\n }\n\n async withCaptureWriteLockHashes<T>(task: () => Promise<T>, identityHashes: readonly string[]): Promise<T> {\n return await this.captureWriteLock.withCaptureWriteLockHashes(task, identityHashes);\n }\n async withCaptureWriteLockAndHashes<T>(\n task: () => Promise<T>,\n identity: string | readonly string[] | undefined,\n identityHashes: readonly string[]\n ): Promise<T> {\n return await this.captureWriteLock.withCaptureWriteLockAndHashes(task, identity, identityHashes);\n }\n\n private async reload(): Promise<ContentHashIndex> {\n if (!this.refreshPromise) {\n this.refreshPromise = (async () => {\n this.index = null;\n this.loadPromise = null;\n return await this.getIndex();\n })().finally(() => {\n this.refreshPromise = null;\n });\n }\n return this.refreshPromise;\n }\n\n /** Return blocked-row membership and authority from one index snapshot. */\n async check(\n content: string,\n category: string,\n sourceConnector?: string\n ): Promise<{ has: boolean; authoritative: boolean }> {\n const key = buildExplicitCaptureDedupKey(content, category, sourceConnector);\n let index = await this.getIndex();\n if ((await this.hasRebuildRequired()) || !(await index.isDiskFingerprintCurrent())) {\n index = await this.reload();\n }\n return { has: index.has(key), authoritative: this.authoritative };\n }\n\n /** Return whether a blocked row matches this explicit-capture identity. */\n async has(content: string, category: string, sourceConnector?: string): Promise<boolean> {\n return (await this.check(content, category, sourceConnector)).has;\n }\n\n /** Return whether the in-memory index is safe to answer an authoritative miss. */\n async isAuthoritative(): Promise<boolean> {\n const index = await this.getIndex();\n if ((await this.hasRebuildRequired()) || !(await index.isDiskFingerprintCurrent())) {\n await this.reload();\n }\n return this.authoritative;\n }\n\n /** Reserve durable rebuild intent before a blocked memory file is committed. */\n async prepareWrite(): Promise<string> {\n return this.markRebuildRequired();\n }\n\n /** Mark a prepared write committed once its memory file is durable. */\n async commitWrite(rebuildMarker: string): Promise<void> {\n await this.markRebuildCommitted(rebuildMarker);\n }\n\n /** Drop a pending marker when the protected memory write never commits. */\n async discardWrite(rebuildMarker: string): Promise<void> {\n await this.clearRebuildRequired([rebuildMarker]);\n }\n\n /** Add a newly persisted blocked row to the durable targeted index. */\n async add(memory: MemoryFile, rebuildMarker?: string): Promise<void> {\n if (!this.isBlocked(memory)) return;\n let index = await this.getIndex();\n if (\n (await this.hasRebuildRequired(rebuildMarker ? [rebuildMarker] : [])) ||\n !(await index.isDiskFingerprintCurrent())\n ) {\n index = await this.reload();\n }\n index.add(\n buildExplicitCaptureDedupKey(memory.content, memory.frontmatter.category, memory.frontmatter.sourceConnector)\n );\n const marker = rebuildMarker ?? (await this.markRebuildRequired(true));\n if (rebuildMarker) await this.markRebuildCommitted(rebuildMarker);\n await index.saveMergingWithDisk();\n await index.flushReconcileRetry();\n if (index.hasPendingChanges) {\n this.markUntrusted();\n return;\n }\n await this.clearRebuildRequired([marker]);\n await this.setAuthoritative(true);\n }\n\n /** Rebuild the index after a blocked row changes or is removed. */\n async rebuildIfLoaded(ownedMarker?: string): Promise<void> {\n const index = this.index ?? ((await this.hasPersistedIndexOrMarkers()) ? this.getIndex() : null);\n if (!index) return;\n const rebuildMarkers = await this.getRebuildMarkers();\n const rebuildMarker = await this.markRebuildRequired(true);\n const clearableRebuildMarkers = await this.getClearableRebuildMarkerPaths(rebuildMarkers);\n const rebuilt = await this.rebuild(await index);\n if (rebuilt) {\n await this.clearRebuildRequired([\n ...clearableRebuildMarkers,\n ...(ownedMarker === undefined || clearableRebuildMarkers.includes(ownedMarker) ? [] : [ownedMarker]),\n rebuildMarker,\n ]);\n }\n await this.setAuthoritative(rebuilt);\n }\n\n /** Rebuild when either side of a write is blocked and its identity changed. */\n async sync(before: MemoryFile, after: MemoryFile, rebuildMarker?: string): Promise<void> {\n const beforeBlocked = this.isBlocked(before);\n const afterBlocked = this.isBlocked(after);\n if (!beforeBlocked && !afterBlocked) return;\n const beforeKey = buildExplicitCaptureDedupKey(\n before.content,\n before.frontmatter.category,\n before.frontmatter.sourceConnector\n );\n const afterKey = buildExplicitCaptureDedupKey(\n after.content,\n after.frontmatter.category,\n after.frontmatter.sourceConnector\n );\n if (beforeBlocked && afterBlocked && beforeKey === afterKey) {\n if (rebuildMarker) {\n await this.markRebuildCommitted(rebuildMarker);\n await this.clearRebuildRequired([rebuildMarker]);\n }\n return;\n }\n const existingMarkers = await this.getRebuildMarkers();\n const marker = rebuildMarker ?? (await this.markRebuildRequired(true));\n const clearableExistingMarkers = await this.getClearableRebuildMarkerPaths(existingMarkers);\n if (rebuildMarker) await this.markRebuildCommitted(rebuildMarker);\n const rebuilt = await this.rebuild(await this.getIndex());\n if (rebuilt) {\n await this.clearRebuildRequired([...clearableExistingMarkers, marker]);\n }\n await this.setAuthoritative(rebuilt);\n }\n markUntrusted(): void {\n this.authoritative = false;\n }\n\n private async failOpen(operation: string, action: () => Promise<void>): Promise<void> {\n try {\n await action();\n } catch (err) {\n this.markUntrusted();\n log.warn(`storage.${operation} completed but failed to update tombstone-blocked capture index: ${err}`);\n }\n }\n\n async addWrittenMemory(\n pathname: string,\n frontmatter: MemoryFrontmatter,\n content: string,\n rebuildMarker?: string\n ): Promise<void> {\n await this.failOpen(\"writeMemory\", () => this.add({ path: pathname, frontmatter, content }, rebuildMarker));\n }\n\n async rebuildAfterInvalidation(ownedMarker?: string): Promise<void> {\n await this.failOpen(\"invalidateMemory\", () => this.rebuildIfLoaded(ownedMarker));\n }\n\n /**\n * Drop an already-committed write marker without re-reading the corpus. The\n * offline-sync mutation path commits its marker around the file write, then\n * must clear it even when the write cannot have changed the blocked key set\n * (neither side tombstone-blocked) — otherwise the marker lingers until some\n * later rebuild clears it. Mirrors the tail of `add`/`sync`.\n */\n async clearCommittedWriteMarker(rebuildMarker: string): Promise<void> {\n await this.clearRebuildRequired([rebuildMarker]);\n // getIndex() may have rebuilt while this marker was still pending and\n // left authoritative=false. After the marker is gone, restore authority\n // if no other uncommitted marker remains.\n await this.setAuthoritative(true);\n }\n\n async syncUpdatedMemory(\n before: MemoryFile,\n frontmatter: MemoryFrontmatter,\n content: string,\n rebuildMarker?: string\n ): Promise<void> {\n await this.failOpen(\"updateMemory\", () => this.sync(before, { ...before, frontmatter, content }, rebuildMarker));\n }\n\n async syncUpdatedFrontmatter(\n before: MemoryFile,\n frontmatter: MemoryFrontmatter,\n rebuildMarker?: string\n ): Promise<void> {\n await this.failOpen(\"writeMemoryFrontmatter\", () => this.sync(before, { ...before, frontmatter }, rebuildMarker));\n }\n shouldRebuildAfterInvalidationForPath(filePath: string): boolean {\n const relative = path.relative(path.resolve(this.options.memoryDir), path.resolve(filePath));\n const category = relative.split(path.sep)[0];\n return category === \"cold\" || RECALL_FALLBACK_DIRS.includes(category);\n }\n}\n"],"mappings":"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","names":["createHash","randomUUID","mkdir","open","readFile","rename","unlink","path","path","readFile","createHash","randomUUID","mkdir","open","rename","unlink","evidence","createHash","mkdir","path","createHash","path","mkdir","createHash","randomUUID","unlink","path","randomUUID","mkdir","readFile","rename","unlink","path","path","readFile","stdout","randomUUID","rename","unlink","mkdir","path","result","randomUUID","unlink","createHash"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runLocationSync
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-U4ESGVZ2.js";
|
|
4
4
|
import {
|
|
5
5
|
log
|
|
6
6
|
} from "./chunk-3WCASNQZ.js";
|
|
@@ -58,4 +58,4 @@ export {
|
|
|
58
58
|
LOCATION_SYNC_DEFAULT_INTERVAL_MS,
|
|
59
59
|
startLocationAutoSync
|
|
60
60
|
};
|
|
61
|
-
//# sourceMappingURL=chunk-
|
|
61
|
+
//# sourceMappingURL=chunk-EAZ3YZKN.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveDefaultNamespaceRoot,
|
|
3
3
|
resolveNamespaceStorageRoot
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-J5OXWG66.js";
|
|
5
5
|
import {
|
|
6
6
|
MutationSerializer,
|
|
7
7
|
withHeldFileLock
|
|
@@ -1473,4 +1473,4 @@ export {
|
|
|
1473
1473
|
isNamespaceKind,
|
|
1474
1474
|
NamespaceCatalog
|
|
1475
1475
|
};
|
|
1476
|
-
//# sourceMappingURL=chunk-
|
|
1476
|
+
//# sourceMappingURL=chunk-EEHQY7ER.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
canonicalCategoryForAlias,
|
|
3
3
|
categoryAliasCoercion
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-AYP2FZFA.js";
|
|
5
5
|
|
|
6
6
|
// src/access-observe-write-category.ts
|
|
7
7
|
function splitCanonicalWriteRequest(request) {
|
|
@@ -22,4 +22,4 @@ function splitCanonicalWriteRequest(request) {
|
|
|
22
22
|
export {
|
|
23
23
|
splitCanonicalWriteRequest
|
|
24
24
|
};
|
|
25
|
-
//# sourceMappingURL=chunk-
|
|
25
|
+
//# sourceMappingURL=chunk-F5V7KRQS.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SupportPassportCreateGrantRequestSchema,
|
|
3
3
|
defineOperation
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-HXDXR2FH.js";
|
|
5
5
|
import {
|
|
6
6
|
SupportPassportCardCategorySchema,
|
|
7
7
|
SupportPassportMemoryIdSchema,
|
|
@@ -220,4 +220,4 @@ var supportPassportGrantAskOperation = defineOperation({
|
|
|
220
220
|
result: await ctx.service.supportPassportAskGrant(grantId, secret, question, ctx.abortSignal)
|
|
221
221
|
})
|
|
222
222
|
});
|
|
223
|
-
//# sourceMappingURL=chunk-
|
|
223
|
+
//# sourceMappingURL=chunk-FMEP2RB5.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
parseEntityFile
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-QUFJ3NJE.js";
|
|
4
4
|
import {
|
|
5
5
|
inferMemoryStatus
|
|
6
6
|
} from "./chunk-7RJUVTVF.js";
|
|
@@ -253,4 +253,4 @@ export {
|
|
|
253
253
|
WHO_KNOWS_MCP_TOOLS,
|
|
254
254
|
handleWhoKnowsHttpQuery
|
|
255
255
|
};
|
|
256
|
-
//# sourceMappingURL=chunk-
|
|
256
|
+
//# sourceMappingURL=chunk-FSH6KRKO.js.map
|