@remnic/core 10.0.14 → 10.0.15
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/abstraction-nodes.js +3 -2
- package/dist/access-admin-ops-surface.js +33 -31
- package/dist/access-authorization-probe.js +34 -32
- package/dist/access-boundary.js +33 -31
- package/dist/access-cli.js +87 -85
- package/dist/access-cli.js.map +1 -1
- package/dist/access-extraction-force-flush.js +33 -31
- package/dist/access-http-briefing.js +34 -32
- package/dist/access-http-query.js +35 -33
- package/dist/access-http.js +52 -50
- package/dist/access-identity-continuity-surface.js +33 -31
- package/dist/access-lcm-surface.js +33 -31
- package/dist/access-mcp.js +44 -42
- package/dist/access-namespace-preflight.js +33 -31
- package/dist/access-observe-write-category.js +4 -3
- package/dist/access-observe-write-surface.js +33 -31
- package/dist/access-offline-manifest.js +3 -2
- package/dist/access-operations-batch.js +36 -34
- package/dist/access-operations.js +43 -41
- package/dist/access-recall-concurrency.js +33 -31
- package/dist/access-recall-response.js +33 -31
- package/dist/access-recall-surface.js +33 -31
- package/dist/access-schema.js +3 -2
- package/dist/access-service.js +33 -31
- package/dist/access-surface-catalog.js +35 -33
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/active-recall.js +14 -12
- package/dist/active-recall.js.map +1 -1
- package/dist/briefing.js +10 -8
- package/dist/calibration.d.ts.map +1 -1
- package/dist/calibration.js +6 -3
- package/dist/calibration.js.map +1 -1
- package/dist/causal-behavior.js +4 -3
- package/dist/causal-behavior.js.map +1 -1
- package/dist/causal-chain.js +4 -3
- package/dist/causal-consolidation.js +14 -12
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-retrieval.js +4 -3
- package/dist/causal-retrieval.js.map +1 -1
- package/dist/causal-trajectory.js +3 -2
- package/dist/{chunk-J7JWFZHI.js → chunk-22RM2ZUJ.js} +37 -37
- package/dist/{chunk-63B2IZYE.js → chunk-23ZQPP2G.js} +6 -1
- package/dist/chunk-23ZQPP2G.js.map +1 -0
- package/dist/{chunk-YFMBHQRG.js → chunk-2PTH4PRL.js} +2 -2
- package/dist/{chunk-TITG2NBS.js → chunk-2PYHLSXK.js} +2 -2
- package/dist/{chunk-B6O2YLUR.js → chunk-2Z5DIDQD.js} +6 -1
- package/dist/chunk-2Z5DIDQD.js.map +1 -0
- package/dist/{chunk-KH2LKDX7.js → chunk-33G67YZF.js} +2 -2
- package/dist/{chunk-LCKVXX5F.js → chunk-3GNIJUUE.js} +2 -2
- package/dist/{chunk-SWIKABKI.js → chunk-3Q3XD3NO.js} +2 -2
- package/dist/{chunk-4KY5GSMB.js → chunk-4PDTVVSW.js} +2 -2
- package/dist/{chunk-HM7RHKS4.js → chunk-4RNBLLZR.js} +2 -2
- package/dist/{chunk-PAZ35RJ4.js → chunk-4SCZZ3U7.js} +240 -55
- package/dist/chunk-4SCZZ3U7.js.map +1 -0
- package/dist/{chunk-Y4NKEXQT.js → chunk-5ATSXCAG.js} +3 -3
- package/dist/{chunk-JDZFIR2S.js → chunk-5KGYTX5O.js} +2 -2
- package/dist/{chunk-NW2E4CI2.js → chunk-5SMR542T.js} +2 -2
- package/dist/{chunk-S7LWX2PQ.js → chunk-655FVTCD.js} +2 -2
- package/dist/{chunk-ZSH2NRDV.js → chunk-6WGMZQGG.js} +2 -2
- package/dist/{chunk-W47S5TIH.js → chunk-7VQ6AI7H.js} +2 -2
- package/dist/{chunk-G7NYVKD6.js → chunk-B2NXOVZN.js} +2 -2
- package/dist/{chunk-N7KYEVLK.js → chunk-BK2BVLZW.js} +2 -2
- package/dist/{chunk-QJ622LTI.js → chunk-BQOGQULP.js} +30 -8
- package/dist/chunk-BQOGQULP.js.map +1 -0
- package/dist/{chunk-S2I7DL5Q.js → chunk-C2RW36YR.js} +2 -2
- package/dist/{chunk-P5NQN4JE.js → chunk-C6JMGAMO.js} +6 -2
- package/dist/chunk-C6JMGAMO.js.map +1 -0
- package/dist/{chunk-6LG7BWKW.js → chunk-CFZ4SXXH.js} +2 -2
- package/dist/{chunk-BLVHDY2U.js → chunk-DOWACHYO.js} +5 -2
- package/dist/chunk-DOWACHYO.js.map +1 -0
- package/dist/{chunk-4OSG5Y6M.js → chunk-DPSOFK4D.js} +2 -2
- package/dist/{chunk-QOZJCSFO.js → chunk-DQR2LD3V.js} +2 -2
- package/dist/{chunk-EBA5DA77.js → chunk-EOU6V4IN.js} +2 -2
- package/dist/{chunk-5WCJLQTM.js → chunk-F2772ATT.js} +2 -2
- package/dist/{chunk-46EST7JO.js → chunk-F2XNSIPP.js} +2 -2
- package/dist/{chunk-PZHQWFR3.js → chunk-G3UUAQOD.js} +2 -2
- package/dist/{chunk-YE36AJL7.js → chunk-GCVDFX66.js} +2 -2
- package/dist/{chunk-FFOVKNQV.js → chunk-GFAM2LTC.js} +2 -2
- package/dist/{chunk-T2YX56QI.js → chunk-GQJKVQJR.js} +2 -2
- package/dist/{chunk-L5DAHSEZ.js → chunk-GWVNGDJW.js} +2 -2
- package/dist/{chunk-N45NEBOD.js → chunk-GZXXPCWJ.js} +3 -3
- package/dist/{chunk-EPJDSQHF.js → chunk-H5IUN433.js} +2 -2
- package/dist/{chunk-EUAIYYYR.js → chunk-H6FREOYX.js} +7 -7
- package/dist/{chunk-FSIMZNBC.js → chunk-HBAOOSHU.js} +2 -2
- package/dist/{chunk-Q4E24IRR.js → chunk-HDN7IVIO.js} +14 -11
- package/dist/chunk-HDN7IVIO.js.map +1 -0
- package/dist/{chunk-T3FMRLWQ.js → chunk-HFSPY26A.js} +2 -2
- package/dist/{chunk-GH7AOMJD.js → chunk-IJMDBYCO.js} +2 -2
- package/dist/{chunk-JQ7XU625.js → chunk-IUCPLBDS.js} +6 -6
- package/dist/{chunk-WSGPFRBH.js → chunk-IWD33CF4.js} +2 -2
- package/dist/{chunk-4IHBN6WU.js → chunk-JKMIGCK6.js} +2 -2
- package/dist/{chunk-ROBHL3GL.js → chunk-JWX2Q6HS.js} +2 -2
- package/dist/{chunk-4O6WRBGE.js → chunk-KJXP6RUG.js} +5 -1
- package/dist/chunk-KJXP6RUG.js.map +1 -0
- package/dist/{chunk-JIHMUOOS.js → chunk-KLJVTZ3R.js} +3 -3
- package/dist/{chunk-FP4JYE66.js → chunk-KW4AJ7T3.js} +2 -2
- package/dist/{chunk-NIRQGDYC.js → chunk-L5VCT7LU.js} +5 -1
- package/dist/chunk-L5VCT7LU.js.map +1 -0
- package/dist/{chunk-LS2FHUML.js → chunk-LQ5SS4OP.js} +3 -3
- package/dist/{chunk-SIIRTDJ4.js → chunk-LWFWZTWX.js} +2 -2
- package/dist/{chunk-BMWN7B3Y.js → chunk-LXATZLSC.js} +3 -3
- package/dist/{chunk-B665A6BO.js → chunk-MJIOGYKX.js} +2 -2
- package/dist/{chunk-RTKV5XHL.js → chunk-MO6N4QYY.js} +2 -2
- package/dist/{chunk-N4C7QKOG.js → chunk-MWWAQXZ6.js} +2 -2
- package/dist/{chunk-ZJVMUBYF.js → chunk-NHUX6GXA.js} +6 -6
- package/dist/{chunk-CB6ANA2I.js → chunk-NZCKG25S.js} +2 -2
- package/dist/{chunk-UMTCNEVQ.js → chunk-O2YPCFJT.js} +11 -11
- package/dist/{chunk-TZNDKTX5.js → chunk-OQR42XCN.js} +37 -33
- package/dist/chunk-OQR42XCN.js.map +1 -0
- package/dist/{chunk-JYZSRNR7.js → chunk-PIITB2YZ.js} +2 -2
- package/dist/chunk-PPUNC7UX.js +73 -0
- package/dist/chunk-PPUNC7UX.js.map +1 -0
- package/dist/{chunk-EQWEIIKQ.js → chunk-PQM3B54K.js} +6 -1
- package/dist/chunk-PQM3B54K.js.map +1 -0
- package/dist/{chunk-UQDG3YLN.js → chunk-PRU7OF3Y.js} +3 -3
- package/dist/{chunk-EU534WGS.js → chunk-PVHQSLNN.js} +7 -7
- package/dist/{chunk-5VC7J76U.js → chunk-QPH52AZB.js} +2 -2
- package/dist/{chunk-XISROV24.js → chunk-QSEUUQUF.js} +2 -2
- package/dist/chunk-QUIRIG2P.js +31 -0
- package/dist/chunk-QUIRIG2P.js.map +1 -0
- package/dist/{chunk-FUFAXVBA.js → chunk-RI2KCQHP.js} +6 -2
- package/dist/chunk-RI2KCQHP.js.map +1 -0
- package/dist/{chunk-QX6JN3O4.js → chunk-RP7PQWZM.js} +6 -6
- package/dist/{chunk-O2IPAX26.js → chunk-RTTPBBAN.js} +4 -4
- package/dist/{chunk-W5MCEVUS.js → chunk-RYYVMZBR.js} +2 -2
- package/dist/{chunk-WLMZ2L5P.js → chunk-T7ASDYNK.js} +2 -2
- package/dist/{chunk-P7TOIOT7.js → chunk-THEPGZBM.js} +2 -2
- package/dist/{chunk-QODKDRSP.js → chunk-TMC7HBED.js} +4 -4
- package/dist/{chunk-I7S55EOB.js → chunk-TPNCXSXP.js} +2 -2
- package/dist/{chunk-SS3IS2JR.js → chunk-UGYUBENJ.js} +2 -2
- package/dist/{chunk-GELS5Z5Z.js → chunk-V3TXIXXY.js} +3 -3
- package/dist/{chunk-WVADKFWV.js → chunk-VNZMZPAC.js} +2 -2
- package/dist/{chunk-JPTPS4OB.js → chunk-VPXIKBPX.js} +2 -2
- package/dist/{chunk-OP6N4H6A.js → chunk-W3FVQBGF.js} +2 -2
- package/dist/{chunk-DPR2WTN3.js → chunk-WGTR573G.js} +16 -16
- package/dist/{chunk-W3K3HITK.js → chunk-WLT6LTQP.js} +2 -2
- package/dist/{chunk-GMXWTJNU.js → chunk-XKRXN63M.js} +2 -2
- package/dist/{chunk-ZV65I6ME.js → chunk-XLBFX63V.js} +28 -25
- package/dist/chunk-XLBFX63V.js.map +1 -0
- package/dist/{chunk-KR6ZKECI.js → chunk-XYGQSDTH.js} +3 -3
- package/dist/{chunk-6WHJ2EAB.js → chunk-Z64TS5V4.js} +2 -2
- package/dist/{chunk-NHLLKEKK.js → chunk-ZAJLJ35W.js} +2 -2
- package/dist/{chunk-O4SGYW7H.js → chunk-ZKHSAMTE.js} +2 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +72 -70
- package/dist/coding/export-okf-codegraph.js +9 -7
- package/dist/coding/export-okf-codegraph.js.map +1 -1
- package/dist/coding/pre-action-gate.js +4 -3
- package/dist/commitment-ledger.js +3 -2
- package/dist/compounding/engine.js +11 -9
- package/dist/config.js +14 -12
- package/dist/connectors/codex-materialize-runner.js +10 -8
- package/dist/connectors/index.js +10 -8
- package/dist/consolidation-provenance-check.d.ts.map +1 -1
- package/dist/consolidation-provenance-check.js +2 -1
- package/dist/contradiction/index.js +3 -2
- package/dist/convergence-refresh.js +12 -10
- package/dist/corpus-watermark.js +12 -10
- package/dist/correction/correction-planner.d.ts.map +1 -1
- package/dist/cue-anchors.js +4 -3
- package/dist/deep-recall-http-glue.js +4 -3
- package/dist/{dreams-ledger-567VKVOU.js → dreams-ledger-UCHHRQ4R.js} +3 -2
- package/dist/entity-retrieval.js +10 -8
- package/dist/eval-trajectory-store.js +4 -3
- package/dist/eval-trajectory.js +4 -3
- package/dist/evals.js +3 -2
- package/dist/external-wiki-access.js +34 -32
- package/dist/extraction.js +12 -10
- package/dist/{first-start-migration-6A5BJPDW.js → first-start-migration-QVD22WWS.js} +6 -5
- package/dist/{first-start-migration-6A5BJPDW.js.map → first-start-migration-QVD22WWS.js.map} +1 -1
- package/dist/harmonic-construction.js +5 -4
- package/dist/harmonic-retrieval.js +14 -12
- package/dist/harmonic-source-lookup.js +3 -2
- package/dist/index.js +87 -85
- package/dist/json-store.d.ts.map +1 -1
- package/dist/json-store.js +2 -1
- package/dist/location/index.js +12 -10
- package/dist/maintenance/dreams-ledger.d.ts.map +1 -1
- package/dist/maintenance/memory-governance.d.ts.map +1 -1
- package/dist/maintenance/memory-governance.js +10 -8
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +10 -8
- package/dist/maintenance/rebuild-memory-projection-runner.js +12 -10
- package/dist/maintenance/rebuild-memory-projection.js +11 -9
- package/dist/memory-browse-operations.js +34 -32
- package/dist/namespaces/migrate.js +11 -9
- package/dist/namespaces/search.js +7 -6
- package/dist/namespaces/storage.d.ts.map +1 -1
- package/dist/namespaces/storage.js +10 -8
- package/dist/objective-state-writers.js +4 -3
- package/dist/objective-state.js +3 -2
- package/dist/offline-sync-snapshot-stream.js +3 -2
- package/dist/offline-sync.d.ts.map +1 -1
- package/dist/offline-sync.js +2 -1
- package/dist/operator-doctor-corpus.js +13 -11
- package/dist/operator-toolkit.js +25 -23
- package/dist/orchestration/maintenance.js +20 -18
- package/dist/orchestrator.js +87 -85
- package/dist/profiling.d.ts.map +1 -1
- package/dist/profiling.js +2 -1
- package/dist/recall-navigation-operations.js +34 -32
- package/dist/recall-navigation.js +33 -31
- package/dist/{resolution-7AY36LGJ.js → resolution-ZU5BIAJA.js} +4 -3
- package/dist/resume-bundles.js +19 -17
- package/dist/retrieval-agents.d.ts +1 -1
- package/dist/retrieval-agents.d.ts.map +1 -1
- package/dist/retrieval-agents.js +7 -1
- package/dist/search/document-scanner.d.ts.map +1 -1
- package/dist/search/document-scanner.js +2 -1
- package/dist/search/factory.js +6 -5
- package/dist/search/index.js +6 -5
- package/dist/search/lancedb-backend.js +3 -2
- package/dist/search/meilisearch-backend.js +3 -2
- package/dist/search/orama-backend.js +3 -2
- package/dist/semantic-consolidation.js +11 -9
- package/dist/semantic-rule-promotion.js +10 -8
- package/dist/semantic-rule-verifier.js +10 -8
- package/dist/source-agent-qualifier.js +10 -8
- package/dist/standup/build.js +10 -8
- package/dist/storage/entity-canonical-id-migration.d.ts.map +1 -1
- package/dist/storage/entity-store.d.ts +32 -1
- package/dist/storage/entity-store.d.ts.map +1 -1
- package/dist/storage/memory-read-store.d.ts.map +1 -1
- package/dist/storage/supersession-audit.d.ts.map +1 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +9 -7
- package/dist/support-passport/index.js +36 -34
- package/dist/{tier-stats-RQM76XYY.js → tier-stats-C3IAMS4X.js} +6 -5
- package/dist/{tier-stats-RQM76XYY.js.map → tier-stats-C3IAMS4X.js.map} +1 -1
- package/dist/transcript.d.ts.map +1 -1
- package/dist/transcript.js +2 -1
- package/dist/transfer/export-okf.js +10 -8
- package/dist/trust-zones.js +3 -2
- package/dist/utility-learner.js +4 -3
- package/dist/utility-runtime.js +5 -4
- package/dist/utility-telemetry.js +3 -2
- package/dist/utils/macos-replication-junk.d.ts +32 -0
- package/dist/utils/macos-replication-junk.d.ts.map +1 -0
- package/dist/utils/malformed-entity-record.d.ts +24 -0
- package/dist/utils/malformed-entity-record.d.ts.map +1 -0
- package/dist/verified-recall.js +10 -8
- package/dist/who-knows-cli.js +11 -9
- package/dist/who-knows.js +10 -8
- package/dist/work-product-ledger.js +3 -2
- package/package.json +2 -2
- package/src/calibration.ts +3 -2
- package/src/cli.ts +2 -2
- package/src/consolidation-provenance-check.ts +2 -0
- package/src/correction/correction-planner.ts +3 -2
- package/src/json-store.ts +3 -0
- package/src/macos-replication-junk-scanners.test.ts +275 -0
- package/src/maintenance/dreams-ledger.ts +2 -0
- package/src/maintenance/memory-governance.ts +2 -0
- package/src/namespaces/storage.ts +2 -0
- package/src/offline-sync-macos-junk.test.ts +169 -0
- package/src/offline-sync.ts +7 -0
- package/src/profiling.ts +2 -1
- package/src/retrieval-agents.ts +29 -12
- package/src/search/document-scanner.ts +4 -0
- package/src/storage/entity-canonical-id-migration.ts +56 -13
- package/src/storage/entity-store.ts +173 -15
- package/src/storage/memory-read-store.ts +30 -5
- package/src/storage/supersession-audit.ts +2 -0
- package/src/storage.ts +3 -2
- package/src/transcript.ts +11 -10
- package/src/utils/macos-replication-junk.test.ts +46 -0
- package/src/utils/macos-replication-junk.ts +65 -0
- package/src/utils/malformed-entity-record.ts +101 -0
- package/dist/chunk-4O6WRBGE.js.map +0 -1
- package/dist/chunk-63B2IZYE.js.map +0 -1
- package/dist/chunk-B6O2YLUR.js.map +0 -1
- package/dist/chunk-BLVHDY2U.js.map +0 -1
- package/dist/chunk-EQWEIIKQ.js.map +0 -1
- package/dist/chunk-FUFAXVBA.js.map +0 -1
- package/dist/chunk-NIRQGDYC.js.map +0 -1
- package/dist/chunk-P5NQN4JE.js.map +0 -1
- package/dist/chunk-PAZ35RJ4.js.map +0 -1
- package/dist/chunk-Q4E24IRR.js.map +0 -1
- package/dist/chunk-QJ622LTI.js.map +0 -1
- package/dist/chunk-TZNDKTX5.js.map +0 -1
- package/dist/chunk-ZV65I6ME.js.map +0 -1
- /package/dist/{chunk-J7JWFZHI.js.map → chunk-22RM2ZUJ.js.map} +0 -0
- /package/dist/{chunk-YFMBHQRG.js.map → chunk-2PTH4PRL.js.map} +0 -0
- /package/dist/{chunk-TITG2NBS.js.map → chunk-2PYHLSXK.js.map} +0 -0
- /package/dist/{chunk-KH2LKDX7.js.map → chunk-33G67YZF.js.map} +0 -0
- /package/dist/{chunk-LCKVXX5F.js.map → chunk-3GNIJUUE.js.map} +0 -0
- /package/dist/{chunk-SWIKABKI.js.map → chunk-3Q3XD3NO.js.map} +0 -0
- /package/dist/{chunk-4KY5GSMB.js.map → chunk-4PDTVVSW.js.map} +0 -0
- /package/dist/{chunk-HM7RHKS4.js.map → chunk-4RNBLLZR.js.map} +0 -0
- /package/dist/{chunk-Y4NKEXQT.js.map → chunk-5ATSXCAG.js.map} +0 -0
- /package/dist/{chunk-JDZFIR2S.js.map → chunk-5KGYTX5O.js.map} +0 -0
- /package/dist/{chunk-NW2E4CI2.js.map → chunk-5SMR542T.js.map} +0 -0
- /package/dist/{chunk-S7LWX2PQ.js.map → chunk-655FVTCD.js.map} +0 -0
- /package/dist/{chunk-ZSH2NRDV.js.map → chunk-6WGMZQGG.js.map} +0 -0
- /package/dist/{chunk-W47S5TIH.js.map → chunk-7VQ6AI7H.js.map} +0 -0
- /package/dist/{chunk-G7NYVKD6.js.map → chunk-B2NXOVZN.js.map} +0 -0
- /package/dist/{chunk-N7KYEVLK.js.map → chunk-BK2BVLZW.js.map} +0 -0
- /package/dist/{chunk-S2I7DL5Q.js.map → chunk-C2RW36YR.js.map} +0 -0
- /package/dist/{chunk-6LG7BWKW.js.map → chunk-CFZ4SXXH.js.map} +0 -0
- /package/dist/{chunk-4OSG5Y6M.js.map → chunk-DPSOFK4D.js.map} +0 -0
- /package/dist/{chunk-QOZJCSFO.js.map → chunk-DQR2LD3V.js.map} +0 -0
- /package/dist/{chunk-EBA5DA77.js.map → chunk-EOU6V4IN.js.map} +0 -0
- /package/dist/{chunk-5WCJLQTM.js.map → chunk-F2772ATT.js.map} +0 -0
- /package/dist/{chunk-46EST7JO.js.map → chunk-F2XNSIPP.js.map} +0 -0
- /package/dist/{chunk-PZHQWFR3.js.map → chunk-G3UUAQOD.js.map} +0 -0
- /package/dist/{chunk-YE36AJL7.js.map → chunk-GCVDFX66.js.map} +0 -0
- /package/dist/{chunk-FFOVKNQV.js.map → chunk-GFAM2LTC.js.map} +0 -0
- /package/dist/{chunk-T2YX56QI.js.map → chunk-GQJKVQJR.js.map} +0 -0
- /package/dist/{chunk-L5DAHSEZ.js.map → chunk-GWVNGDJW.js.map} +0 -0
- /package/dist/{chunk-N45NEBOD.js.map → chunk-GZXXPCWJ.js.map} +0 -0
- /package/dist/{chunk-EPJDSQHF.js.map → chunk-H5IUN433.js.map} +0 -0
- /package/dist/{chunk-EUAIYYYR.js.map → chunk-H6FREOYX.js.map} +0 -0
- /package/dist/{chunk-FSIMZNBC.js.map → chunk-HBAOOSHU.js.map} +0 -0
- /package/dist/{chunk-T3FMRLWQ.js.map → chunk-HFSPY26A.js.map} +0 -0
- /package/dist/{chunk-GH7AOMJD.js.map → chunk-IJMDBYCO.js.map} +0 -0
- /package/dist/{chunk-JQ7XU625.js.map → chunk-IUCPLBDS.js.map} +0 -0
- /package/dist/{chunk-WSGPFRBH.js.map → chunk-IWD33CF4.js.map} +0 -0
- /package/dist/{chunk-4IHBN6WU.js.map → chunk-JKMIGCK6.js.map} +0 -0
- /package/dist/{chunk-ROBHL3GL.js.map → chunk-JWX2Q6HS.js.map} +0 -0
- /package/dist/{chunk-JIHMUOOS.js.map → chunk-KLJVTZ3R.js.map} +0 -0
- /package/dist/{chunk-FP4JYE66.js.map → chunk-KW4AJ7T3.js.map} +0 -0
- /package/dist/{chunk-LS2FHUML.js.map → chunk-LQ5SS4OP.js.map} +0 -0
- /package/dist/{chunk-SIIRTDJ4.js.map → chunk-LWFWZTWX.js.map} +0 -0
- /package/dist/{chunk-BMWN7B3Y.js.map → chunk-LXATZLSC.js.map} +0 -0
- /package/dist/{chunk-B665A6BO.js.map → chunk-MJIOGYKX.js.map} +0 -0
- /package/dist/{chunk-RTKV5XHL.js.map → chunk-MO6N4QYY.js.map} +0 -0
- /package/dist/{chunk-N4C7QKOG.js.map → chunk-MWWAQXZ6.js.map} +0 -0
- /package/dist/{chunk-ZJVMUBYF.js.map → chunk-NHUX6GXA.js.map} +0 -0
- /package/dist/{chunk-CB6ANA2I.js.map → chunk-NZCKG25S.js.map} +0 -0
- /package/dist/{chunk-UMTCNEVQ.js.map → chunk-O2YPCFJT.js.map} +0 -0
- /package/dist/{chunk-JYZSRNR7.js.map → chunk-PIITB2YZ.js.map} +0 -0
- /package/dist/{chunk-UQDG3YLN.js.map → chunk-PRU7OF3Y.js.map} +0 -0
- /package/dist/{chunk-EU534WGS.js.map → chunk-PVHQSLNN.js.map} +0 -0
- /package/dist/{chunk-5VC7J76U.js.map → chunk-QPH52AZB.js.map} +0 -0
- /package/dist/{chunk-XISROV24.js.map → chunk-QSEUUQUF.js.map} +0 -0
- /package/dist/{chunk-QX6JN3O4.js.map → chunk-RP7PQWZM.js.map} +0 -0
- /package/dist/{chunk-O2IPAX26.js.map → chunk-RTTPBBAN.js.map} +0 -0
- /package/dist/{chunk-W5MCEVUS.js.map → chunk-RYYVMZBR.js.map} +0 -0
- /package/dist/{chunk-WLMZ2L5P.js.map → chunk-T7ASDYNK.js.map} +0 -0
- /package/dist/{chunk-P7TOIOT7.js.map → chunk-THEPGZBM.js.map} +0 -0
- /package/dist/{chunk-QODKDRSP.js.map → chunk-TMC7HBED.js.map} +0 -0
- /package/dist/{chunk-I7S55EOB.js.map → chunk-TPNCXSXP.js.map} +0 -0
- /package/dist/{chunk-SS3IS2JR.js.map → chunk-UGYUBENJ.js.map} +0 -0
- /package/dist/{chunk-GELS5Z5Z.js.map → chunk-V3TXIXXY.js.map} +0 -0
- /package/dist/{chunk-WVADKFWV.js.map → chunk-VNZMZPAC.js.map} +0 -0
- /package/dist/{chunk-JPTPS4OB.js.map → chunk-VPXIKBPX.js.map} +0 -0
- /package/dist/{chunk-OP6N4H6A.js.map → chunk-W3FVQBGF.js.map} +0 -0
- /package/dist/{chunk-DPR2WTN3.js.map → chunk-WGTR573G.js.map} +0 -0
- /package/dist/{chunk-W3K3HITK.js.map → chunk-WLT6LTQP.js.map} +0 -0
- /package/dist/{chunk-GMXWTJNU.js.map → chunk-XKRXN63M.js.map} +0 -0
- /package/dist/{chunk-KR6ZKECI.js.map → chunk-XYGQSDTH.js.map} +0 -0
- /package/dist/{chunk-6WHJ2EAB.js.map → chunk-Z64TS5V4.js.map} +0 -0
- /package/dist/{chunk-NHLLKEKK.js.map → chunk-ZAJLJ35W.js.map} +0 -0
- /package/dist/{chunk-O4SGYW7H.js.map → chunk-ZKHSAMTE.js.map} +0 -0
- /package/dist/{dreams-ledger-567VKVOU.js.map → dreams-ledger-UCHHRQ4R.js.map} +0 -0
- /package/dist/{resolution-7AY36LGJ.js.map → resolution-ZU5BIAJA.js.map} +0 -0
|
@@ -5,6 +5,7 @@ import path from "node:path";
|
|
|
5
5
|
import { stripAttributesSuffix } from "../structured-attributes.js";
|
|
6
6
|
import type { MemoryFile } from "../types.js";
|
|
7
7
|
import { isErrnoCode } from "../utils/errno.js";
|
|
8
|
+
import { isMacOsReplicationJunkBasename } from "../utils/macos-replication-junk.js";
|
|
8
9
|
|
|
9
10
|
export interface SupersessionAuditLookup {
|
|
10
11
|
correctionsDir: string;
|
|
@@ -27,6 +28,7 @@ export async function hasSupersessionAudit(
|
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
for (const entry of entries) {
|
|
31
|
+
if (isMacOsReplicationJunkBasename(entry.name)) continue;
|
|
30
32
|
if (!entry.isFile() || !entry.name.endsWith(".md")) continue;
|
|
31
33
|
const memory = await lookup.readMemoryByPath(path.join(lookup.correctionsDir, entry.name));
|
|
32
34
|
if (
|
package/src/storage.ts
CHANGED
|
@@ -65,6 +65,7 @@ import { readEntityAliasConfigSync } from "./storage/entity-alias-config.js";
|
|
|
65
65
|
import { assertSafeEntityId } from "./storage/entity-id-safety.js";
|
|
66
66
|
export { normalizeEntityName } from "./entity-id-normalization.js";
|
|
67
67
|
import { isErrnoCode } from "./utils/errno.js";
|
|
68
|
+
import { isMacOsReplicationJunkBasename } from "./utils/macos-replication-junk.js";
|
|
68
69
|
import { getCategoryDir, categoryDirName } from "./utils/category-dir.js";
|
|
69
70
|
import { decodeYamlScalar } from "./utils/yaml-scalar.js";
|
|
70
71
|
import { qmdCollectionPathParts, qmdResultPathCandidates } from "./orchestration/qmd-result-resolver.js";
|
|
@@ -4882,7 +4883,7 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
|
|
|
4882
4883
|
|
|
4883
4884
|
const readDir = async (dir: string) => {
|
|
4884
4885
|
try {
|
|
4885
|
-
const entries = await readdir(dir, { withFileTypes: true });
|
|
4886
|
+
const entries = (await readdir(dir, { withFileTypes: true })).filter((e) => !isMacOsReplicationJunkBasename(e.name));
|
|
4886
4887
|
for (const entry of entries) {
|
|
4887
4888
|
checkCorpusReadAbort(options);
|
|
4888
4889
|
const fullPath = path.join(dir, entry.name);
|
|
@@ -7133,7 +7134,7 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
|
|
|
7133
7134
|
const summaries: MemorySummary[] = [];
|
|
7134
7135
|
|
|
7135
7136
|
for (const file of files) {
|
|
7136
|
-
if (!file.endsWith(".json")) continue;
|
|
7137
|
+
if (isMacOsReplicationJunkBasename(file) || !file.endsWith(".json")) continue;
|
|
7137
7138
|
const filePath = path.join(this.summariesDir, file);
|
|
7138
7139
|
const raw = await this.readStorageSecureFile(filePath);
|
|
7139
7140
|
summaries.push(JSON.parse(raw) as MemorySummary);
|
package/src/transcript.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { analyzeSessionIntegrity, type SessionIntegrityReport } from "./session-
|
|
|
6
6
|
import { isDailyFileDatedBefore, resolveSafeStoragePath } from "./storage-paths.js";
|
|
7
7
|
import { sessionStoragePaths } from "./session-identity.js";
|
|
8
8
|
import { estimateTokenCount } from "./token-estimate.js";
|
|
9
|
+
import { isMacOsReplicationJunkBasename } from "./utils/macos-replication-junk.js";
|
|
9
10
|
|
|
10
11
|
type DirectorySessionStatus = "missing" | "empty" | "matches" | "occupied";
|
|
11
12
|
type DirectoryOwnershipCacheEntry = {
|
|
@@ -166,7 +167,7 @@ export class TranscriptManager {
|
|
|
166
167
|
for (const idEnt of idEntries) {
|
|
167
168
|
if (!idEnt.isDirectory()) continue;
|
|
168
169
|
const chanDir = path.join(typeDir, idEnt.name);
|
|
169
|
-
const files = (await readdir(chanDir)).filter((f) => f.endsWith(".jsonl")).sort();
|
|
170
|
+
const files = (await readdir(chanDir)).filter((f) => f.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(f)).sort();
|
|
170
171
|
const last = files[files.length - 1];
|
|
171
172
|
if (!last) continue;
|
|
172
173
|
try {
|
|
@@ -261,7 +262,7 @@ export class TranscriptManager {
|
|
|
261
262
|
|
|
262
263
|
let names: string[];
|
|
263
264
|
try {
|
|
264
|
-
names = (await readdir(channelDir)).filter((file) => file.endsWith(".jsonl"));
|
|
265
|
+
names = (await readdir(channelDir)).filter((file) => file.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(file));
|
|
265
266
|
} catch {
|
|
266
267
|
return "occupied";
|
|
267
268
|
}
|
|
@@ -345,7 +346,7 @@ export class TranscriptManager {
|
|
|
345
346
|
): Promise<void> {
|
|
346
347
|
try {
|
|
347
348
|
const channelDir = await resolveSafeStoragePath(root, dir);
|
|
348
|
-
const names = (await readdir(channelDir)).filter((file) => file.endsWith(".jsonl"));
|
|
349
|
+
const names = (await readdir(channelDir)).filter((file) => file.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(file));
|
|
349
350
|
const fileSizes = await this.directoryJsonlFileSizes(root, dir, names);
|
|
350
351
|
if (!fileSizes) return;
|
|
351
352
|
this.directoryOwnershipCache.set(
|
|
@@ -380,7 +381,7 @@ export class TranscriptManager {
|
|
|
380
381
|
|
|
381
382
|
let names: string[];
|
|
382
383
|
try {
|
|
383
|
-
names = (await readdir(channelDir)).filter((file) => file.endsWith(".jsonl")).sort();
|
|
384
|
+
names = (await readdir(channelDir)).filter((file) => file.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(file)).sort();
|
|
384
385
|
} catch {
|
|
385
386
|
continue;
|
|
386
387
|
}
|
|
@@ -641,14 +642,14 @@ export class TranscriptManager {
|
|
|
641
642
|
try {
|
|
642
643
|
const channelFiles = await readdir(channelDir);
|
|
643
644
|
for (const file of channelFiles) {
|
|
644
|
-
if (file.endsWith(".jsonl")) {
|
|
645
|
+
if (file.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(file)) {
|
|
645
646
|
files.push(path.join(entry.name, channelTypeEntry.name, file));
|
|
646
647
|
}
|
|
647
648
|
}
|
|
648
649
|
} catch {
|
|
649
650
|
// Skip unreadable directories
|
|
650
651
|
}
|
|
651
|
-
} else if (channelTypeEntry.isFile() && channelTypeEntry.name.endsWith(".jsonl")) {
|
|
652
|
+
} else if (channelTypeEntry.isFile() && channelTypeEntry.name.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(channelTypeEntry.name)) {
|
|
652
653
|
// Legacy: channel type dir contains .jsonl files directly
|
|
653
654
|
files.push(path.join(entry.name, channelTypeEntry.name));
|
|
654
655
|
}
|
|
@@ -656,7 +657,7 @@ export class TranscriptManager {
|
|
|
656
657
|
} catch {
|
|
657
658
|
// Skip unreadable directories
|
|
658
659
|
}
|
|
659
|
-
} else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
|
|
660
|
+
} else if (entry.isFile() && entry.name.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(entry.name)) {
|
|
660
661
|
// Legacy flat file - still include for backward compatibility
|
|
661
662
|
files.push(entry.name);
|
|
662
663
|
}
|
|
@@ -865,7 +866,7 @@ export class TranscriptManager {
|
|
|
865
866
|
try {
|
|
866
867
|
const channelFiles = await readdir(channelDir);
|
|
867
868
|
for (const file of channelFiles) {
|
|
868
|
-
if (!file.endsWith(".jsonl")) continue;
|
|
869
|
+
if (isMacOsReplicationJunkBasename(file) || !file.endsWith(".jsonl")) continue;
|
|
869
870
|
|
|
870
871
|
const filePath = path.join(channelDir, file);
|
|
871
872
|
|
|
@@ -894,7 +895,7 @@ export class TranscriptManager {
|
|
|
894
895
|
} catch (err) {
|
|
895
896
|
log.debug(`failed to process channel directory ${entry.name}/${channelTypeEntry.name}:`, err);
|
|
896
897
|
}
|
|
897
|
-
} else if (channelTypeEntry.isFile() && channelTypeEntry.name.endsWith(".jsonl")) {
|
|
898
|
+
} else if (channelTypeEntry.isFile() && channelTypeEntry.name.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(channelTypeEntry.name)) {
|
|
898
899
|
// Legacy: channel type dir contains .jsonl files directly
|
|
899
900
|
const filePath = path.join(channelTypeDir, channelTypeEntry.name);
|
|
900
901
|
const cleaned = await this.cleanupTranscriptFile(filePath, cutoff);
|
|
@@ -906,7 +907,7 @@ export class TranscriptManager {
|
|
|
906
907
|
} catch (err) {
|
|
907
908
|
log.debug(`failed to process channel type directory ${entry.name}:`, err);
|
|
908
909
|
}
|
|
909
|
-
} else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
|
|
910
|
+
} else if (entry.isFile() && entry.name.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(entry.name)) {
|
|
910
911
|
// Handle legacy flat files - delete if older than retentionDays
|
|
911
912
|
if (this.isLegacyTranscriptFile(entry.name)) {
|
|
912
913
|
const dateStr = entry.name.slice(0, 10);
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
isMacOsReplicationJunkBasename,
|
|
6
|
+
isMacOsReplicationJunkRelativePath,
|
|
7
|
+
warnIgnoredMacOsReplicationJunk,
|
|
8
|
+
withoutMacOsReplicationJunk,
|
|
9
|
+
} from "./macos-replication-junk.js";
|
|
10
|
+
|
|
11
|
+
test("macOS replication junk is AppleDouble sidecars and .DS_Store only", () => {
|
|
12
|
+
assert.equal(isMacOsReplicationJunkBasename("._project-notes.md"), true);
|
|
13
|
+
assert.equal(isMacOsReplicationJunkBasename("._"), true);
|
|
14
|
+
assert.equal(isMacOsReplicationJunkBasename(".DS_Store"), true);
|
|
15
|
+
assert.equal(isMacOsReplicationJunkBasename("project-notes.md"), false);
|
|
16
|
+
assert.equal(isMacOsReplicationJunkBasename(".gitignore"), false);
|
|
17
|
+
assert.equal(isMacOsReplicationJunkBasename("DS_Store"), false);
|
|
18
|
+
assert.equal(isMacOsReplicationJunkRelativePath("namespaces/lab/entities/._project-notes.md"), true);
|
|
19
|
+
assert.equal(isMacOsReplicationJunkRelativePath("namespaces\\lab\\.DS_Store"), true);
|
|
20
|
+
assert.equal(isMacOsReplicationJunkRelativePath("entities/project-notes.md"), false);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test("withoutMacOsReplicationJunk keeps real names and counts junk once", () => {
|
|
24
|
+
const { kept, ignored } = withoutMacOsReplicationJunk(
|
|
25
|
+
["project-notes.md", "._project-notes.md", ".DS_Store", "correction-1.md"],
|
|
26
|
+
(name) => name
|
|
27
|
+
);
|
|
28
|
+
assert.deepEqual(kept, ["project-notes.md", "correction-1.md"]);
|
|
29
|
+
assert.equal(ignored, 2);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test("warnIgnoredMacOsReplicationJunk emits one summary per directory and count", () => {
|
|
33
|
+
const messages: string[] = [];
|
|
34
|
+
const warn = (message: string) => {
|
|
35
|
+
messages.push(message);
|
|
36
|
+
};
|
|
37
|
+
const directory = `junk-warn-${process.pid}-${Date.now()}`;
|
|
38
|
+
warnIgnoredMacOsReplicationJunk(directory, 2, warn);
|
|
39
|
+
warnIgnoredMacOsReplicationJunk(directory, 2, warn);
|
|
40
|
+
warnIgnoredMacOsReplicationJunk(directory, 0, warn);
|
|
41
|
+
warnIgnoredMacOsReplicationJunk(directory, 3, warn);
|
|
42
|
+
assert.deepEqual(messages, [
|
|
43
|
+
"ignored 2 macOS replication junk file(s) (._* and .DS_Store)",
|
|
44
|
+
"ignored 3 macOS replication junk file(s) (._* and .DS_Store)",
|
|
45
|
+
]);
|
|
46
|
+
});
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* macOS Finder metadata that arrives through Mac-to-Linux copies.
|
|
3
|
+
*
|
|
4
|
+
* AppleDouble sidecars are named `._` plus the real file's basename
|
|
5
|
+
* (`._project-notes.md` beside `project-notes.md`). Finder also writes
|
|
6
|
+
* `.DS_Store` into any directory it opens. Neither is a Remnic record.
|
|
7
|
+
* Directory scanners and replication must ignore them so they are never
|
|
8
|
+
* parsed as entities, memories, or sync objects.
|
|
9
|
+
*
|
|
10
|
+
* QMD's own indexer already drops every hidden path (`dot: false` plus a
|
|
11
|
+
* hidden-segment filter). Callers that build index inputs themselves still
|
|
12
|
+
* use this helper so the non-QMD scanners stay in parity.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const warnedJunkDirectories = new Set<string>();
|
|
16
|
+
|
|
17
|
+
/** True for an AppleDouble sidecar or a Finder `.DS_Store` file. */
|
|
18
|
+
export function isMacOsReplicationJunkBasename(basename: string): boolean {
|
|
19
|
+
return basename === ".DS_Store" || basename.startsWith("._");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** True when the final path segment is macOS replication junk. */
|
|
23
|
+
export function isMacOsReplicationJunkRelativePath(relPath: string): boolean {
|
|
24
|
+
const normalized = relPath.includes("\\") ? relPath.replaceAll("\\", "/") : relPath;
|
|
25
|
+
const slash = normalized.lastIndexOf("/");
|
|
26
|
+
const basename = slash === -1 ? normalized : normalized.slice(slash + 1);
|
|
27
|
+
return isMacOsReplicationJunkBasename(basename);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Drop junk names from a directory listing. `ignored` is the count of
|
|
32
|
+
* names removed, so the caller can emit one summary warning.
|
|
33
|
+
*/
|
|
34
|
+
export function withoutMacOsReplicationJunk<T>(
|
|
35
|
+
entries: readonly T[],
|
|
36
|
+
basenameOf: (entry: T) => string
|
|
37
|
+
): { kept: T[]; ignored: number } {
|
|
38
|
+
const kept: T[] = [];
|
|
39
|
+
let ignored = 0;
|
|
40
|
+
for (const entry of entries) {
|
|
41
|
+
if (isMacOsReplicationJunkBasename(basenameOf(entry))) {
|
|
42
|
+
ignored += 1;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
kept.push(entry);
|
|
46
|
+
}
|
|
47
|
+
return { kept, ignored };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Emit at most one junk warning per directory and count. A later scan of
|
|
52
|
+
* the same directory (entity migration, then entity load) stays quiet
|
|
53
|
+
* instead of repeating the same summary.
|
|
54
|
+
*/
|
|
55
|
+
export function warnIgnoredMacOsReplicationJunk(
|
|
56
|
+
directoryKey: string,
|
|
57
|
+
count: number,
|
|
58
|
+
warn: (message: string) => void
|
|
59
|
+
): void {
|
|
60
|
+
if (count <= 0) return;
|
|
61
|
+
const key = `${directoryKey}\0${count}`;
|
|
62
|
+
if (warnedJunkDirectories.has(key)) return;
|
|
63
|
+
warnedJunkDirectories.add(key);
|
|
64
|
+
warn(`ignored ${count} macOS replication junk file(s) (._* and .DS_Store)`);
|
|
65
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heading and type flags for an entity markdown body.
|
|
3
|
+
*
|
|
4
|
+
* The heading rule matches `parseEntityFile`: a line must start with `# `
|
|
5
|
+
* (hash, space) and the remainder must contain a name. A tab after `#`
|
|
6
|
+
* is not a heading. The type rule matches a `**Type:**` line with a
|
|
7
|
+
* non-empty value. A missing type line is still readable: the parser
|
|
8
|
+
* defaults the type to `other`.
|
|
9
|
+
*/
|
|
10
|
+
function entityRecordFlags(content: string): { hasName: boolean; hasType: boolean } {
|
|
11
|
+
const body = entityRecordBody(content);
|
|
12
|
+
let hasName = false;
|
|
13
|
+
let hasType = false;
|
|
14
|
+
let start = 0;
|
|
15
|
+
while (start <= body.length) {
|
|
16
|
+
const newline = body.indexOf("\n", start);
|
|
17
|
+
const end = newline === -1 ? body.length : newline;
|
|
18
|
+
let line = body.slice(start, end);
|
|
19
|
+
if (line.endsWith("\r")) line = line.slice(0, -1);
|
|
20
|
+
if (!hasName && line.startsWith("# ") && line.slice(2).trim().length > 0) hasName = true;
|
|
21
|
+
if (!hasType && line.startsWith("**Type:**") && line.slice("**Type:**".length).trim().length > 0) {
|
|
22
|
+
hasType = true;
|
|
23
|
+
}
|
|
24
|
+
if (hasName && hasType) return { hasName, hasType };
|
|
25
|
+
if (newline === -1) break;
|
|
26
|
+
start = newline + 1;
|
|
27
|
+
}
|
|
28
|
+
return { hasName, hasType };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* No `# ` name. A named file whose type line is absent stays readable:
|
|
33
|
+
* `parseEntityFile` defaults the type to `other`.
|
|
34
|
+
*/
|
|
35
|
+
export function isUnnamedEntityRecord(content: string): boolean {
|
|
36
|
+
return !entityRecordFlags(content).hasName;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function entityBodyHasText(content: string): boolean {
|
|
40
|
+
const body = entityRecordBody(content);
|
|
41
|
+
for (let i = 0; i < body.length; i++) {
|
|
42
|
+
const char = body.charCodeAt(i);
|
|
43
|
+
if (char !== 32 && char !== 9 && char !== 10 && char !== 13) return true;
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Unnamed entity body that still has text. An empty body under frontmatter
|
|
50
|
+
* stays readable so a canonical filename can supply the type. A tab heading,
|
|
51
|
+
* a blank `# ` heading, or prose with no name does not.
|
|
52
|
+
*/
|
|
53
|
+
export function isPopulatedUnnamedEntityRecord(content: string): boolean {
|
|
54
|
+
return isUnnamedEntityRecord(content) && entityBodyHasText(content);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Unnamed file that still looks like an entity record (`#` or `**Type:**`).
|
|
59
|
+
* Direct filename recall keeps unstructured placeholders such as "content".
|
|
60
|
+
*/
|
|
61
|
+
export function isShapedUnnamedEntityRecord(content: string): boolean {
|
|
62
|
+
if (!isUnnamedEntityRecord(content)) return false;
|
|
63
|
+
const body = entityRecordBody(content);
|
|
64
|
+
let start = 0;
|
|
65
|
+
while (start <= body.length) {
|
|
66
|
+
const newline = body.indexOf("\n", start);
|
|
67
|
+
const end = newline === -1 ? body.length : newline;
|
|
68
|
+
let line = body.slice(start, end);
|
|
69
|
+
if (line.endsWith("\r")) line = line.slice(0, -1);
|
|
70
|
+
if (line.startsWith("#") || line.startsWith("**Type:**")) return true;
|
|
71
|
+
if (newline === -1) break;
|
|
72
|
+
start = newline + 1;
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Migration gate. Canonical ids are derived from name and type, and the
|
|
79
|
+
* old startup throw required an explicit `**Type:**` line. Files that
|
|
80
|
+
* only have a heading stay on disk and are not renamed. Listing does not
|
|
81
|
+
* use this predicate: `parseEntityFile` defaults a missing type to `other`.
|
|
82
|
+
*/
|
|
83
|
+
export function isMalformedEntityRecord(content: string): boolean {
|
|
84
|
+
const flags = entityRecordFlags(content);
|
|
85
|
+
return !flags.hasName || !flags.hasType;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function entityRecordBody(content: string): string {
|
|
89
|
+
const firstNewline = content.indexOf("\n");
|
|
90
|
+
if (firstNewline === -1) return content;
|
|
91
|
+
const firstLine = content.slice(0, firstNewline).endsWith("\r")
|
|
92
|
+
? content.slice(0, firstNewline - 1)
|
|
93
|
+
: content.slice(0, firstNewline);
|
|
94
|
+
if (firstLine !== "---") return content;
|
|
95
|
+
const close = content.indexOf("\n---", firstNewline + 1);
|
|
96
|
+
if (close === -1) return content;
|
|
97
|
+
let rest = close + "\n---".length;
|
|
98
|
+
if (content.charAt(rest) === "\r") rest += 1;
|
|
99
|
+
if (content.charAt(rest) === "\n") rest += 1;
|
|
100
|
+
return content.slice(rest);
|
|
101
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/search/document-scanner.ts"],"sourcesContent":["import path from \"node:path\";\nimport { lstat, readdir, readFile, realpath } from \"node:fs/promises\";\nimport { RECALL_FALLBACK_DIRS } from \"../utils/category-dir.js\";\nimport { assertPathInsideRoot } from \"../utils/path-containment.js\";\nimport { isErrnoCode } from \"../utils/errno.js\";\n\nexport interface IndexableDocument {\n /** Memory ID from frontmatter or filename stem */\n docid: string;\n /** Absolute file path */\n path: string;\n /** Markdown body (no YAML frontmatter) */\n content: string;\n /** First ~200 chars for display */\n snippet: string;\n}\n\n/**\n * Parse YAML frontmatter from a markdown string.\n * Returns the frontmatter key-value pairs and body, or null if no frontmatter block.\n */\nfunction parseFrontmatter(raw: string): { data: Record<string, string>; body: string } | null {\n // Support both LF and CRLF line endings\n const normalized = raw.replace(/\\r\\n/g, \"\\n\");\n const match = normalized.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) return null;\n\n const fmBlock = match[1];\n const body = (match[2] ?? \"\").trim();\n const data: Record<string, string> = {};\n\n for (const line of fmBlock.split(\"\\n\")) {\n const colonIdx = line.indexOf(\":\");\n if (colonIdx === -1) continue;\n const key = line.slice(0, colonIdx).trim();\n const value = line.slice(colonIdx + 1).trim();\n data[key] = value;\n }\n\n return { data, body };\n}\n\n/**\n * Recursively scan a directory for `.md` files and return IndexableDocuments.\n */\nasync function scanDir(dir: string, memoryRootReal: string): Promise<IndexableDocument[]> {\n const docs: IndexableDocument[] = [];\n try {\n const dirStat = await lstat(dir);\n if (dirStat.isSymbolicLink()) {\n throw new Error(`Refusing to scan symlinked memory category directory: ${dir}`);\n }\n if (!dirStat.isDirectory()) {\n const error = new Error(`Memory category path is not a directory: ${dir}`) as NodeJS.ErrnoException;\n error.code = \"ENOTDIR\";\n throw error;\n }\n assertPathInsideRoot(memoryRootReal, await realpath(dir), dir);\n\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isSymbolicLink()) continue;\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n assertPathInsideRoot(memoryRootReal, await realpath(fullPath), fullPath);\n const sub = await scanDir(fullPath, memoryRootReal);\n docs.push(...sub);\n } else if (entry.name.endsWith(\".md\")) {\n try {\n assertPathInsideRoot(memoryRootReal, await realpath(fullPath), fullPath);\n const raw = await readFile(fullPath, \"utf-8\");\n const parsed = parseFrontmatter(raw);\n const body = parsed ? parsed.body : raw.trim();\n const docid = parsed?.data.id || path.basename(entry.name, \".md\");\n docs.push({\n docid,\n path: fullPath,\n content: body,\n snippet: body.slice(0, 200),\n });\n } catch {\n // Skip unreadable files\n }\n }\n }\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) {\n // Optional category directories may not exist yet.\n return docs;\n }\n throw err;\n }\n return docs;\n}\n\n/**\n * Scan every recall category subdir of memoryDir for indexable markdown\n * documents. The directory set is derived from `RECALL_FALLBACK_DIRS`\n * (utils/category-dir.ts → ALL_CATEGORY_DIRS minus non-recall queue dirs) —\n * the single source of truth — so adding a new category never requires\n * touching this scanner. Non-QMD backends (Orama / Meilisearch / LanceDB)\n * build their index through this helper; deriving from RECALL_FALLBACK_DIRS\n * keeps them in parity with writeMemory's category-dir routing (issue #1546)\n * and the QMD filesystem-fallback corpus. reasoning-traces/ and the other\n * category dirs are covered automatically (issue #564 PR 3 no longer needs a\n * hand-maintained list). scanDir tolerates missing dirs (ENOENT), so category\n * dirs that do not exist yet are skipped.\n */\nexport async function scanMemoryDir(memoryDir: string): Promise<IndexableDocument[]> {\n let memoryRootReal: string;\n try {\n memoryRootReal = await realpath(memoryDir);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) {\n return [];\n }\n throw err;\n }\n const perDir = await Promise.all(\n RECALL_FALLBACK_DIRS.map((dir) => scanDir(path.join(memoryDir, dir), memoryRootReal)),\n );\n return perDir.flat();\n}\n"],"mappings":";;;;;;;;;;;AAAA,OAAO,UAAU;AACjB,SAAS,OAAO,SAAS,UAAU,gBAAgB;AAoBnD,SAAS,iBAAiB,KAAoE;AAE5F,QAAM,aAAa,IAAI,QAAQ,SAAS,IAAI;AAC5C,QAAM,QAAQ,WAAW,MAAM,oCAAoC;AACnE,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,UAAU,MAAM,CAAC;AACvB,QAAM,QAAQ,MAAM,CAAC,KAAK,IAAI,KAAK;AACnC,QAAM,OAA+B,CAAC;AAEtC,aAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,UAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,QAAI,aAAa,GAAI;AACrB,UAAM,MAAM,KAAK,MAAM,GAAG,QAAQ,EAAE,KAAK;AACzC,UAAM,QAAQ,KAAK,MAAM,WAAW,CAAC,EAAE,KAAK;AAC5C,SAAK,GAAG,IAAI;AAAA,EACd;AAEA,SAAO,EAAE,MAAM,KAAK;AACtB;AAKA,eAAe,QAAQ,KAAa,gBAAsD;AACxF,QAAM,OAA4B,CAAC;AACnC,MAAI;AACF,UAAM,UAAU,MAAM,MAAM,GAAG;AAC/B,QAAI,QAAQ,eAAe,GAAG;AAC5B,YAAM,IAAI,MAAM,yDAAyD,GAAG,EAAE;AAAA,IAChF;AACA,QAAI,CAAC,QAAQ,YAAY,GAAG;AAC1B,YAAM,QAAQ,IAAI,MAAM,4CAA4C,GAAG,EAAE;AACzE,YAAM,OAAO;AACb,YAAM;AAAA,IACR;AACA,yBAAqB,gBAAgB,MAAM,SAAS,GAAG,GAAG,GAAG;AAE7D,UAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAC1D,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,eAAe,EAAG;AAC5B,YAAM,WAAW,KAAK,KAAK,KAAK,MAAM,IAAI;AAC1C,UAAI,MAAM,YAAY,GAAG;AACvB,6BAAqB,gBAAgB,MAAM,SAAS,QAAQ,GAAG,QAAQ;AACvE,cAAM,MAAM,MAAM,QAAQ,UAAU,cAAc;AAClD,aAAK,KAAK,GAAG,GAAG;AAAA,MAClB,WAAW,MAAM,KAAK,SAAS,KAAK,GAAG;AACrC,YAAI;AACF,+BAAqB,gBAAgB,MAAM,SAAS,QAAQ,GAAG,QAAQ;AACvE,gBAAM,MAAM,MAAM,SAAS,UAAU,OAAO;AAC5C,gBAAM,SAAS,iBAAiB,GAAG;AACnC,gBAAM,OAAO,SAAS,OAAO,OAAO,IAAI,KAAK;AAC7C,gBAAM,QAAQ,QAAQ,KAAK,MAAM,KAAK,SAAS,MAAM,MAAM,KAAK;AAChE,eAAK,KAAK;AAAA,YACR;AAAA,YACA,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,KAAK,MAAM,GAAG,GAAG;AAAA,UAC5B,CAAC;AAAA,QACH,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,YAAY,KAAK,QAAQ,GAAG;AAE9B,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAeA,eAAsB,cAAc,WAAiD;AACnF,MAAI;AACJ,MAAI;AACF,qBAAiB,MAAM,SAAS,SAAS;AAAA,EAC3C,SAAS,KAAK;AACZ,QAAI,YAAY,KAAK,QAAQ,GAAG;AAC9B,aAAO,CAAC;AAAA,IACV;AACA,UAAM;AAAA,EACR;AACA,QAAM,SAAS,MAAM,QAAQ;AAAA,IAC3B,qBAAqB,IAAI,CAAC,QAAQ,QAAQ,KAAK,KAAK,WAAW,GAAG,GAAG,cAAc,CAAC;AAAA,EACtF;AACA,SAAO,OAAO,KAAK;AACrB;","names":[]}
|