@remnic/core 9.69.75 → 9.69.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-admin-ops-surface.js +45 -45
- package/dist/access-authorization-probe.js +46 -46
- package/dist/access-boundary.js +45 -45
- package/dist/access-cli.js +113 -113
- package/dist/access-extraction-force-flush.js +45 -45
- package/dist/access-http-briefing.js +46 -46
- package/dist/access-http-query.js +47 -47
- package/dist/access-http.js +65 -65
- package/dist/access-identity-continuity-surface.js +45 -45
- package/dist/access-lcm-surface.js +45 -45
- package/dist/access-mcp.js +55 -55
- package/dist/access-namespace-preflight.js +45 -45
- package/dist/access-observe-write-category.js +8 -8
- package/dist/access-observe-write-surface.js +45 -45
- package/dist/access-offline-manifest.js +5 -5
- package/dist/access-operations-batch.js +46 -46
- package/dist/access-operations.js +53 -53
- package/dist/access-recall-concurrency.js +45 -45
- package/dist/access-recall-diagnostics.js +2 -2
- package/dist/access-recall-response.js +45 -45
- package/dist/access-recall-surface.js +45 -45
- package/dist/access-schema.js +5 -5
- package/dist/access-service.js +45 -45
- package/dist/access-surface-catalog.js +47 -47
- package/dist/active-recall.js +15 -14
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/{auto-sync-QJNIKZHV.js → auto-sync-WEUDMXUW.js} +4 -4
- package/dist/briefing-followup-timeout.d.ts +3 -0
- package/dist/briefing-followup-timeout.d.ts.map +1 -0
- package/dist/briefing-followup-timeout.js +10 -0
- package/dist/briefing.d.ts.map +1 -1
- package/dist/briefing.js +12 -10
- package/dist/buffer.js +6 -6
- package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-GWVG7LGC.js} +2 -2
- package/dist/capsule-crypto-GWVG7LGC.js.map +1 -0
- package/dist/causal-consolidation.js +12 -11
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/{chunk-O4QH33GV.js → chunk-2CH6MMO2.js} +6 -6
- package/dist/{chunk-VXNWOHOR.js → chunk-2GKLHU2D.js} +2 -2
- package/dist/{chunk-MB3HMRXM.js → chunk-2I6VHX6Q.js} +2 -2
- package/dist/{chunk-LVFI5LG7.js → chunk-2L5FSNPC.js} +5 -5
- package/dist/{chunk-U3NBO4IX.js → chunk-345MEMRU.js} +132 -37
- package/dist/chunk-345MEMRU.js.map +1 -0
- package/dist/{chunk-6BSPRNFF.js → chunk-3AGCSD42.js} +2 -2
- package/dist/{chunk-IGSVMAPQ.js → chunk-3K3PITOE.js} +2 -2
- package/dist/{chunk-ZUT4FK5W.js → chunk-5ELENZTA.js} +2 -2
- package/dist/{chunk-NF6LF76X.js → chunk-5X7ZTLFS.js} +2 -2
- package/dist/{chunk-S52VKUUW.js → chunk-6DTJBTHL.js} +3 -3
- package/dist/{chunk-LH6UP5SR.js → chunk-6MJGDUC7.js} +3 -3
- package/dist/{chunk-YYRMOMX3.js → chunk-7DZHRPCO.js} +2 -2
- package/dist/{chunk-SB4ZWVKI.js → chunk-7G6WUOLB.js} +4 -6
- package/dist/{chunk-SB4ZWVKI.js.map → chunk-7G6WUOLB.js.map} +1 -1
- package/dist/{chunk-LDOURFFA.js → chunk-7QXTCONH.js} +2 -2
- package/dist/{chunk-HPK66ZM5.js → chunk-7WO66MKJ.js} +2 -2
- package/dist/{chunk-ODP62HIA.js → chunk-A2XDQ3JW.js} +2 -2
- package/dist/{chunk-TY5JOP2W.js → chunk-ALOMLIRC.js} +84 -69
- package/dist/chunk-ALOMLIRC.js.map +1 -0
- package/dist/{chunk-MSRNAAWW.js → chunk-AVO2CBIL.js} +2 -2
- package/dist/{chunk-B5EZWPSM.js → chunk-AZ2X5LNA.js} +2 -2
- package/dist/{chunk-3NTVCMDD.js → chunk-B3OFQP5Y.js} +2 -2
- package/dist/chunk-B3OFQP5Y.js.map +1 -0
- package/dist/{chunk-IGEZE6QB.js → chunk-BMYZTZ5D.js} +4 -4
- package/dist/{chunk-XDOXR3U6.js → chunk-BNPLDVM6.js} +2 -2
- package/dist/{chunk-7JFQI6DQ.js → chunk-BOUFVFV2.js} +2 -2
- package/dist/{chunk-VDX2J7OX.js → chunk-BUKK5SWA.js} +2 -2
- package/dist/{chunk-KMHE76A2.js → chunk-CDEI5S5W.js} +2 -2
- package/dist/{chunk-UJX4I26O.js → chunk-CLSYE5OZ.js} +2 -2
- package/dist/{chunk-WDBKDYK2.js → chunk-CYCE3L2I.js} +46 -46
- package/dist/{chunk-GZBNEZIU.js → chunk-DBYAY6UW.js} +3 -3
- package/dist/{chunk-HZDOLAZV.js → chunk-DCPAAAIC.js} +2 -2
- package/dist/{chunk-6JA22L5X.js → chunk-DSQWTXHP.js} +8 -8
- package/dist/{chunk-WQC54W25.js → chunk-EJPF6XDQ.js} +2 -2
- package/dist/{chunk-CGO3A7SR.js → chunk-EVBI7S4J.js} +3 -3
- package/dist/{chunk-OB2YI57R.js → chunk-FMT52ROU.js} +43 -43
- package/dist/{chunk-62AE2EUZ.js → chunk-FVK5NQ3V.js} +2 -2
- package/dist/{chunk-3SL52JKD.js → chunk-FZVROZKC.js} +5 -5
- package/dist/{chunk-ZVTG7JTG.js → chunk-GARVFCV6.js} +2 -2
- package/dist/{chunk-Y52T5Y6B.js → chunk-GATQP7CE.js} +2 -2
- package/dist/{chunk-7COBZFUF.js → chunk-GXQ5GDUH.js} +2 -2
- package/dist/chunk-GZFKCLRC.js +17 -0
- package/dist/chunk-GZFKCLRC.js.map +1 -0
- package/dist/{chunk-VVX5PZFS.js → chunk-H36X4NRH.js} +2 -2
- package/dist/{chunk-2VH2JWYN.js → chunk-I4G4UWQA.js} +2 -2
- package/dist/{chunk-6OACG7JV.js → chunk-IBGEHKQ6.js} +3 -3
- package/dist/{chunk-BXCZPPRO.js → chunk-IILMR37Z.js} +16 -16
- package/dist/{chunk-X2PBZOYZ.js → chunk-IP5VLSLO.js} +2 -2
- package/dist/{chunk-IXLHREAB.js → chunk-IVH7INFM.js} +3 -3
- package/dist/{chunk-D4SPMHEW.js → chunk-JLPNONPH.js} +2 -2
- package/dist/{chunk-AEGQ5PJ7.js → chunk-JX6USXZR.js} +2 -2
- package/dist/{chunk-SA2JMMMS.js → chunk-K2SXIWEV.js} +2 -2
- package/dist/{chunk-VEBYLZQQ.js → chunk-KN6CIN7I.js} +2 -2
- package/dist/{chunk-WZKKI6S2.js → chunk-LEP46X5Y.js} +2 -2
- package/dist/{chunk-5UBH37SL.js → chunk-LI76ESJL.js} +4 -4
- package/dist/{chunk-AQJBFLUA.js → chunk-LZLJK2IA.js} +5 -5
- package/dist/{chunk-5LWVTSF7.js → chunk-MOQPEFLN.js} +4 -4
- package/dist/{chunk-6BFW7SGF.js → chunk-MQQPONTM.js} +2 -2
- package/dist/{chunk-5KNEOYTF.js → chunk-NGFRFDSK.js} +2 -2
- package/dist/{chunk-B6PY25JB.js → chunk-NHV6WCM5.js} +1 -1
- package/dist/{chunk-S5FWSNLI.js → chunk-NYZRJW5X.js} +2 -2
- package/dist/{chunk-JOMGKV72.js → chunk-OHRIBMSS.js} +2 -2
- package/dist/{chunk-YMSPN4W4.js → chunk-OJ3TV57W.js} +12 -7
- package/dist/chunk-OJ3TV57W.js.map +1 -0
- package/dist/{chunk-BXLOS5AJ.js → chunk-OWHERGF2.js} +2 -2
- package/dist/{chunk-F5O6WEDO.js → chunk-PWF4JXKD.js} +1 -1
- package/dist/chunk-PWF4JXKD.js.map +1 -0
- package/dist/{chunk-KPSJA45G.js → chunk-QIDMGBUY.js} +2 -2
- package/dist/{chunk-MKNENZCK.js → chunk-QJAGDPY7.js} +3 -3
- package/dist/{chunk-VIRTAUJO.js → chunk-RDUM6BKQ.js} +2 -2
- package/dist/{chunk-I6Y6QKWF.js → chunk-RGX4DGOG.js} +2 -2
- package/dist/{chunk-OMYCECTS.js → chunk-RJLV4BKR.js} +2 -2
- package/dist/{chunk-LBL77UXO.js → chunk-RKTT72XV.js} +4 -4
- package/dist/{chunk-AWEMJYN2.js → chunk-RMG22TH2.js} +2 -2
- package/dist/{chunk-GH5YSAAI.js → chunk-RRMIACBG.js} +11 -10
- package/dist/chunk-RRMIACBG.js.map +1 -0
- package/dist/{chunk-4GPI3GVE.js → chunk-SLEAJ67D.js} +5 -5
- package/dist/{chunk-YR6A6ZK7.js → chunk-SSUDD72S.js} +2 -2
- package/dist/{chunk-WDP7CJZQ.js → chunk-SUSMEKBE.js} +4 -4
- package/dist/{chunk-YZENVZWY.js → chunk-TY446V34.js} +2 -2
- package/dist/{chunk-PIG4WJFQ.js → chunk-UHESJ6TQ.js} +2 -2
- package/dist/{chunk-PIG4WJFQ.js.map → chunk-UHESJ6TQ.js.map} +1 -1
- package/dist/{chunk-YCYFXA6P.js → chunk-UKB7ZDKK.js} +2 -2
- package/dist/{chunk-DQEMWVMT.js → chunk-UVYI6VIX.js} +1 -1
- package/dist/{chunk-YF3JERFZ.js → chunk-VL4X7ZHC.js} +2 -2
- package/dist/{chunk-COHJUEBQ.js → chunk-WGXWZE3K.js} +2 -2
- package/dist/{chunk-ZHOXXHT5.js → chunk-WQZZDN5M.js} +4 -4
- package/dist/{chunk-25LKLNSJ.js → chunk-X33QB7LW.js} +2 -2
- package/dist/{chunk-JDES3G7T.js → chunk-X3NZ2HAO.js} +2 -2
- package/dist/{chunk-Q4AUIFUA.js → chunk-XAITGGX5.js} +4 -4
- package/dist/{chunk-5HP5F2SQ.js → chunk-XNYTMLPS.js} +3 -3
- package/dist/{chunk-UFBHEMNR.js → chunk-YL273SOF.js} +2 -2
- package/dist/{chunk-ZPED47SP.js → chunk-YUAOU2B2.js} +19 -25
- package/dist/chunk-YUAOU2B2.js.map +1 -0
- package/dist/{chunk-GFD7TWAZ.js → chunk-ZWWF7PI5.js} +4 -4
- package/dist/{chunk-5LPDXYU3.js → chunk-ZYBLNHUB.js} +5 -5
- package/dist/cli.js +85 -85
- package/dist/coding/export-okf-codegraph.js +11 -10
- package/dist/coding/export-okf-codegraph.js.map +1 -1
- package/dist/compounding/engine.js +11 -10
- package/dist/config-qmd.js +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +15 -14
- package/dist/connectors/codex-materialize-runner.js +11 -10
- package/dist/connectors/index.js +11 -10
- package/dist/convergence-refresh.js +13 -13
- package/dist/corpus-watermark.js +13 -12
- package/dist/deep-recall-http-glue.js +6 -6
- package/dist/directory-sidecars.d.ts +3 -0
- package/dist/directory-sidecars.d.ts.map +1 -1
- package/dist/directory-sidecars.js +7 -4
- package/dist/entity-retrieval.js +11 -10
- package/dist/external-wiki-access.js +46 -46
- package/dist/extraction-span-materialize.js +2 -2
- package/dist/extraction.js +19 -19
- package/dist/{first-start-migration-7OATHJKB.js → first-start-migration-GAT7G733.js} +4 -4
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/index.js +171 -171
- package/dist/lcm/engine.js +2 -2
- package/dist/lcm/index.js +5 -5
- package/dist/location/index.js +14 -14
- package/dist/maintenance/memory-governance.js +11 -10
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +11 -11
- package/dist/maintenance/rebuild-memory-projection.js +12 -12
- package/dist/memory-browse-operations.js +46 -46
- package/dist/memory-browse.js +5 -6
- package/dist/namespaces/migrate.js +12 -11
- package/dist/namespaces/search.js +5 -5
- package/dist/namespaces/storage.js +11 -10
- package/dist/offline-sync-impression-drain.js +2 -2
- package/dist/offline-sync.js +2 -2
- package/dist/operator-doctor-corpus.js +14 -13
- package/dist/operator-toolkit.js +24 -23
- package/dist/orchestration/maintenance.js +20 -20
- package/dist/orchestration/recall-recognition-search.d.ts +1 -0
- package/dist/orchestration/recall-recognition-search.d.ts.map +1 -1
- package/dist/orchestration/recall-search-pipeline.d.ts.map +1 -1
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +114 -114
- package/dist/qmd.d.ts +1 -1
- package/dist/qmd.d.ts.map +1 -1
- package/dist/qmd.js +1 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-navigate-access.js +2 -2
- package/dist/recall-navigate-disclosure.js +2 -2
- package/dist/recall-navigate.js +2 -2
- package/dist/recall-navigation-operations.js +46 -46
- package/dist/recall-navigation.js +45 -45
- package/dist/recall-state-view-admission.js +5 -6
- package/dist/recall-state.js +2 -2
- package/dist/recall-why-service.js +5 -6
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.js +2 -2
- package/dist/resume-bundles.js +16 -15
- package/dist/search/factory.js +4 -4
- package/dist/search/index.js +8 -8
- package/dist/semantic-consolidation.js +12 -11
- package/dist/semantic-rule-promotion.js +11 -10
- package/dist/semantic-rule-verifier.js +11 -10
- package/dist/source-agent-qualifier.js +15 -15
- package/dist/standup/build.js +11 -10
- package/dist/storage.d.ts +1 -19
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +10 -9
- package/dist/support-passport/index.js +48 -48
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +2 -2
- package/dist/transfer/export-okf.js +12 -11
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/verified-recall.js +11 -10
- package/dist/who-knows-cli.js +12 -11
- package/dist/who-knows.js +11 -10
- package/package.json +2 -2
- package/src/briefing-followup-timeout.test.ts +15 -0
- package/src/briefing-followup-timeout.ts +14 -0
- package/src/briefing.ts +8 -9
- package/src/config-qmd.ts +1 -1
- package/src/config.test.ts +2 -2
- package/src/config.ts +3 -4
- package/src/directory-sidecars-config.test.ts +34 -0
- package/src/directory-sidecars.test.ts +36 -1
- package/src/directory-sidecars.ts +41 -7
- package/src/orchestration/recall-internal.ts +1 -1
- package/src/orchestration/recall-recognition-search.test.ts +8 -0
- package/src/orchestration/recall-recognition-search.ts +5 -1
- package/src/orchestration/recall-search-pipeline.ts +5 -7
- package/src/orchestrator.ts +8 -0
- package/src/qmd.ts +4 -4
- package/src/recall-budget-config.test.ts +1 -1
- package/src/storage.ts +13 -22
- package/src/types.ts +3 -3
- package/dist/chunk-3NTVCMDD.js.map +0 -1
- package/dist/chunk-F5O6WEDO.js.map +0 -1
- package/dist/chunk-GH5YSAAI.js.map +0 -1
- package/dist/chunk-PCEYGOSL.js +0 -66
- package/dist/chunk-PCEYGOSL.js.map +0 -1
- package/dist/chunk-TY5JOP2W.js.map +0 -1
- package/dist/chunk-U3NBO4IX.js.map +0 -1
- package/dist/chunk-YMSPN4W4.js.map +0 -1
- package/dist/chunk-ZPED47SP.js.map +0 -1
- /package/dist/{auto-sync-QJNIKZHV.js.map → auto-sync-WEUDMXUW.js.map} +0 -0
- /package/dist/{capsule-crypto-YO5QJ6L3.js.map → briefing-followup-timeout.js.map} +0 -0
- /package/dist/{chunk-O4QH33GV.js.map → chunk-2CH6MMO2.js.map} +0 -0
- /package/dist/{chunk-VXNWOHOR.js.map → chunk-2GKLHU2D.js.map} +0 -0
- /package/dist/{chunk-MB3HMRXM.js.map → chunk-2I6VHX6Q.js.map} +0 -0
- /package/dist/{chunk-LVFI5LG7.js.map → chunk-2L5FSNPC.js.map} +0 -0
- /package/dist/{chunk-6BSPRNFF.js.map → chunk-3AGCSD42.js.map} +0 -0
- /package/dist/{chunk-IGSVMAPQ.js.map → chunk-3K3PITOE.js.map} +0 -0
- /package/dist/{chunk-ZUT4FK5W.js.map → chunk-5ELENZTA.js.map} +0 -0
- /package/dist/{chunk-NF6LF76X.js.map → chunk-5X7ZTLFS.js.map} +0 -0
- /package/dist/{chunk-S52VKUUW.js.map → chunk-6DTJBTHL.js.map} +0 -0
- /package/dist/{chunk-LH6UP5SR.js.map → chunk-6MJGDUC7.js.map} +0 -0
- /package/dist/{chunk-YYRMOMX3.js.map → chunk-7DZHRPCO.js.map} +0 -0
- /package/dist/{chunk-LDOURFFA.js.map → chunk-7QXTCONH.js.map} +0 -0
- /package/dist/{chunk-HPK66ZM5.js.map → chunk-7WO66MKJ.js.map} +0 -0
- /package/dist/{chunk-ODP62HIA.js.map → chunk-A2XDQ3JW.js.map} +0 -0
- /package/dist/{chunk-MSRNAAWW.js.map → chunk-AVO2CBIL.js.map} +0 -0
- /package/dist/{chunk-B5EZWPSM.js.map → chunk-AZ2X5LNA.js.map} +0 -0
- /package/dist/{chunk-IGEZE6QB.js.map → chunk-BMYZTZ5D.js.map} +0 -0
- /package/dist/{chunk-XDOXR3U6.js.map → chunk-BNPLDVM6.js.map} +0 -0
- /package/dist/{chunk-7JFQI6DQ.js.map → chunk-BOUFVFV2.js.map} +0 -0
- /package/dist/{chunk-VDX2J7OX.js.map → chunk-BUKK5SWA.js.map} +0 -0
- /package/dist/{chunk-KMHE76A2.js.map → chunk-CDEI5S5W.js.map} +0 -0
- /package/dist/{chunk-UJX4I26O.js.map → chunk-CLSYE5OZ.js.map} +0 -0
- /package/dist/{chunk-WDBKDYK2.js.map → chunk-CYCE3L2I.js.map} +0 -0
- /package/dist/{chunk-GZBNEZIU.js.map → chunk-DBYAY6UW.js.map} +0 -0
- /package/dist/{chunk-HZDOLAZV.js.map → chunk-DCPAAAIC.js.map} +0 -0
- /package/dist/{chunk-6JA22L5X.js.map → chunk-DSQWTXHP.js.map} +0 -0
- /package/dist/{chunk-WQC54W25.js.map → chunk-EJPF6XDQ.js.map} +0 -0
- /package/dist/{chunk-CGO3A7SR.js.map → chunk-EVBI7S4J.js.map} +0 -0
- /package/dist/{chunk-OB2YI57R.js.map → chunk-FMT52ROU.js.map} +0 -0
- /package/dist/{chunk-62AE2EUZ.js.map → chunk-FVK5NQ3V.js.map} +0 -0
- /package/dist/{chunk-3SL52JKD.js.map → chunk-FZVROZKC.js.map} +0 -0
- /package/dist/{chunk-ZVTG7JTG.js.map → chunk-GARVFCV6.js.map} +0 -0
- /package/dist/{chunk-Y52T5Y6B.js.map → chunk-GATQP7CE.js.map} +0 -0
- /package/dist/{chunk-7COBZFUF.js.map → chunk-GXQ5GDUH.js.map} +0 -0
- /package/dist/{chunk-VVX5PZFS.js.map → chunk-H36X4NRH.js.map} +0 -0
- /package/dist/{chunk-2VH2JWYN.js.map → chunk-I4G4UWQA.js.map} +0 -0
- /package/dist/{chunk-6OACG7JV.js.map → chunk-IBGEHKQ6.js.map} +0 -0
- /package/dist/{chunk-BXCZPPRO.js.map → chunk-IILMR37Z.js.map} +0 -0
- /package/dist/{chunk-X2PBZOYZ.js.map → chunk-IP5VLSLO.js.map} +0 -0
- /package/dist/{chunk-IXLHREAB.js.map → chunk-IVH7INFM.js.map} +0 -0
- /package/dist/{chunk-D4SPMHEW.js.map → chunk-JLPNONPH.js.map} +0 -0
- /package/dist/{chunk-AEGQ5PJ7.js.map → chunk-JX6USXZR.js.map} +0 -0
- /package/dist/{chunk-SA2JMMMS.js.map → chunk-K2SXIWEV.js.map} +0 -0
- /package/dist/{chunk-VEBYLZQQ.js.map → chunk-KN6CIN7I.js.map} +0 -0
- /package/dist/{chunk-WZKKI6S2.js.map → chunk-LEP46X5Y.js.map} +0 -0
- /package/dist/{chunk-5UBH37SL.js.map → chunk-LI76ESJL.js.map} +0 -0
- /package/dist/{chunk-AQJBFLUA.js.map → chunk-LZLJK2IA.js.map} +0 -0
- /package/dist/{chunk-5LWVTSF7.js.map → chunk-MOQPEFLN.js.map} +0 -0
- /package/dist/{chunk-6BFW7SGF.js.map → chunk-MQQPONTM.js.map} +0 -0
- /package/dist/{chunk-5KNEOYTF.js.map → chunk-NGFRFDSK.js.map} +0 -0
- /package/dist/{chunk-B6PY25JB.js.map → chunk-NHV6WCM5.js.map} +0 -0
- /package/dist/{chunk-S5FWSNLI.js.map → chunk-NYZRJW5X.js.map} +0 -0
- /package/dist/{chunk-JOMGKV72.js.map → chunk-OHRIBMSS.js.map} +0 -0
- /package/dist/{chunk-BXLOS5AJ.js.map → chunk-OWHERGF2.js.map} +0 -0
- /package/dist/{chunk-KPSJA45G.js.map → chunk-QIDMGBUY.js.map} +0 -0
- /package/dist/{chunk-MKNENZCK.js.map → chunk-QJAGDPY7.js.map} +0 -0
- /package/dist/{chunk-VIRTAUJO.js.map → chunk-RDUM6BKQ.js.map} +0 -0
- /package/dist/{chunk-I6Y6QKWF.js.map → chunk-RGX4DGOG.js.map} +0 -0
- /package/dist/{chunk-OMYCECTS.js.map → chunk-RJLV4BKR.js.map} +0 -0
- /package/dist/{chunk-LBL77UXO.js.map → chunk-RKTT72XV.js.map} +0 -0
- /package/dist/{chunk-AWEMJYN2.js.map → chunk-RMG22TH2.js.map} +0 -0
- /package/dist/{chunk-4GPI3GVE.js.map → chunk-SLEAJ67D.js.map} +0 -0
- /package/dist/{chunk-YR6A6ZK7.js.map → chunk-SSUDD72S.js.map} +0 -0
- /package/dist/{chunk-WDP7CJZQ.js.map → chunk-SUSMEKBE.js.map} +0 -0
- /package/dist/{chunk-YZENVZWY.js.map → chunk-TY446V34.js.map} +0 -0
- /package/dist/{chunk-YCYFXA6P.js.map → chunk-UKB7ZDKK.js.map} +0 -0
- /package/dist/{chunk-DQEMWVMT.js.map → chunk-UVYI6VIX.js.map} +0 -0
- /package/dist/{chunk-YF3JERFZ.js.map → chunk-VL4X7ZHC.js.map} +0 -0
- /package/dist/{chunk-COHJUEBQ.js.map → chunk-WGXWZE3K.js.map} +0 -0
- /package/dist/{chunk-ZHOXXHT5.js.map → chunk-WQZZDN5M.js.map} +0 -0
- /package/dist/{chunk-25LKLNSJ.js.map → chunk-X33QB7LW.js.map} +0 -0
- /package/dist/{chunk-JDES3G7T.js.map → chunk-X3NZ2HAO.js.map} +0 -0
- /package/dist/{chunk-Q4AUIFUA.js.map → chunk-XAITGGX5.js.map} +0 -0
- /package/dist/{chunk-5HP5F2SQ.js.map → chunk-XNYTMLPS.js.map} +0 -0
- /package/dist/{chunk-UFBHEMNR.js.map → chunk-YL273SOF.js.map} +0 -0
- /package/dist/{chunk-GFD7TWAZ.js.map → chunk-ZWWF7PI5.js.map} +0 -0
- /package/dist/{chunk-5LPDXYU3.js.map → chunk-ZYBLNHUB.js.map} +0 -0
- /package/dist/{first-start-migration-7OATHJKB.js.map → first-start-migration-GAT7G733.js.map} +0 -0
package/src/config.ts
CHANGED
|
@@ -43,6 +43,7 @@ import {
|
|
|
43
43
|
parseStandingBlockFreshDays,
|
|
44
44
|
parseStandingBlockMaxChars,
|
|
45
45
|
} from "./standing-memory-block.js";
|
|
46
|
+
import { parseDirectorySidecarsEnabled } from "./directory-sidecars.js";
|
|
46
47
|
import { parseRecognitionIndexMaxEntries, parseRecallRecognitionTier } from "./recall-recognition-tier.js";
|
|
47
48
|
import { parseRecallConcurrencyConfig } from "./recall-concurrency-config.js";
|
|
48
49
|
import { parseExtractionFields } from "./extraction-span-config.js";
|
|
@@ -1962,12 +1963,10 @@ export function parseConfig(
|
|
|
1962
1963
|
// Recall state views (issue #1952). Default false; exact false/0/"false"
|
|
1963
1964
|
// disable (parseRecallStateViews → coerceBooleanLike).
|
|
1964
1965
|
recallStateViews: parseRecallStateViews(cfg.recallStateViews),
|
|
1965
|
-
// Prefix-cache-stable standing memory block (issue #2971). Default
|
|
1966
|
-
// false, and nothing on the recall path reads these keys until the
|
|
1967
|
-
// server wiring slice lands — pre-wiring behavior is byte-identical.
|
|
1968
1966
|
recallStandingBlock: parseRecallStandingBlock(cfg.recallStandingBlock),
|
|
1969
1967
|
standingBlockFreshDays: parseStandingBlockFreshDays(cfg.standingBlockFreshDays),
|
|
1970
1968
|
standingBlockMaxChars: parseStandingBlockMaxChars(cfg.standingBlockMaxChars),
|
|
1969
|
+
directorySidecarsEnabled: parseDirectorySidecarsEnabled(cfg.directorySidecarsEnabled),
|
|
1971
1970
|
// Full-index recognition tier (issue #2975). Default false; nothing on the
|
|
1972
1971
|
// recall path reads these keys until the wiring slice lands.
|
|
1973
1972
|
recallRecognitionTier: parseRecallRecognitionTier(cfg.recallRecognitionTier),
|
|
@@ -3128,7 +3127,7 @@ export function parseConfig(
|
|
|
3128
3127
|
recallEnrichmentDeadlineMs:
|
|
3129
3128
|
typeof cfg.recallEnrichmentDeadlineMs === "number"
|
|
3130
3129
|
? Math.max(0, Math.floor(cfg.recallEnrichmentDeadlineMs))
|
|
3131
|
-
:
|
|
3130
|
+
: 60_000,
|
|
3132
3131
|
recallPipeline: recallPipelineConfig.pipeline,
|
|
3133
3132
|
recallMmrEnabled: cfg.recallMmrEnabled !== false,
|
|
3134
3133
|
recallMmrLambda:
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
|
|
4
|
+
import { parseConfig } from "./config.js";
|
|
5
|
+
import {
|
|
6
|
+
applyDirectorySidecarDrillDown,
|
|
7
|
+
isDirectorySidecarsEnabledForDir,
|
|
8
|
+
setDirectorySidecarsEnabledForDir,
|
|
9
|
+
} from "./directory-sidecars.js";
|
|
10
|
+
|
|
11
|
+
test("#3088 parseConfig directorySidecarsEnabled is off by default and opt-in only", () => {
|
|
12
|
+
assert.equal(parseConfig({}).directorySidecarsEnabled, false);
|
|
13
|
+
assert.equal(parseConfig({ directorySidecarsEnabled: "false" }).directorySidecarsEnabled, false);
|
|
14
|
+
assert.equal(parseConfig({ directorySidecarsEnabled: true }).directorySidecarsEnabled, true);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test("#3088 sidecar enable walks up from namespace storage roots", () => {
|
|
18
|
+
const root = "/tmp/remnic-sidecar-root";
|
|
19
|
+
const nested = `${root}/namespaces/team-a`;
|
|
20
|
+
setDirectorySidecarsEnabledForDir(root, true);
|
|
21
|
+
assert.equal(isDirectorySidecarsEnabledForDir(nested), true);
|
|
22
|
+
setDirectorySidecarsEnabledForDir(nested, false);
|
|
23
|
+
assert.equal(isDirectorySidecarsEnabledForDir(nested), false);
|
|
24
|
+
assert.equal(isDirectorySidecarsEnabledForDir("/tmp/other-memory"), false);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("#3088 drill-down skips when authorized namespace set is empty", async () => {
|
|
28
|
+
const hits = [{ path: "facts/a.md", snippet: "hello", score: 1 }];
|
|
29
|
+
const out = await applyDirectorySidecarDrillDown("/tmp/memory", "hello", hits, {
|
|
30
|
+
enabled: true,
|
|
31
|
+
namespaces: [],
|
|
32
|
+
});
|
|
33
|
+
assert.deepEqual(out, hits);
|
|
34
|
+
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
|
-
import { chmodSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { chmodSync, existsSync, mkdtempSync, mkdirSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { mkdir, readdir, readFile, stat } from "node:fs/promises";
|
|
4
4
|
import os from "node:os";
|
|
5
5
|
import path from "node:path";
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
DIRECTORY_SIDECAR_MARKER,
|
|
11
11
|
NEIGHBORHOOD_ABSTRACT_LABEL,
|
|
12
12
|
applyDirectorySidecarDrillDown,
|
|
13
|
+
directorySidecarAncestry,
|
|
13
14
|
findDirectorySidecarsForQuery,
|
|
14
15
|
loadDirectorySidecar,
|
|
15
16
|
parseDirectorySidecarsEnabled,
|
|
@@ -498,3 +499,37 @@ test("drill-down prefers the most specific matching directory", async () => {
|
|
|
498
499
|
rmSync(root, { recursive: true, force: true });
|
|
499
500
|
}
|
|
500
501
|
});
|
|
502
|
+
|
|
503
|
+
test("#3007 sidecar ancestry refuses a symlinked memory root", () => {
|
|
504
|
+
const root = store();
|
|
505
|
+
try {
|
|
506
|
+
const facts = path.join(root, "facts");
|
|
507
|
+
mkdirSync(facts);
|
|
508
|
+
const linked = path.join(root, "linked-root");
|
|
509
|
+
symlinkSync(root, linked);
|
|
510
|
+
assert.deepEqual(directorySidecarAncestry(linked, "facts/2026-01-01/fact.md"), []);
|
|
511
|
+
} finally {
|
|
512
|
+
rmSync(root, { recursive: true, force: true });
|
|
513
|
+
}
|
|
514
|
+
});
|
|
515
|
+
|
|
516
|
+
test("#3090 sidecar ancestry refuses a symlink above the category root", async () => {
|
|
517
|
+
const root = store();
|
|
518
|
+
try {
|
|
519
|
+
const outside = path.join(root, "outside");
|
|
520
|
+
mkdirSync(path.join(outside, "alpha", "facts", "2026-01-01"), { recursive: true });
|
|
521
|
+
writeFileSync(path.join(outside, "alpha", "facts", "2026-01-01", "fact.md"), "x");
|
|
522
|
+
mkdirSync(path.join(root, "namespaces"));
|
|
523
|
+
symlinkSync(outside, path.join(root, "namespaces", "alpha"));
|
|
524
|
+
const report = await refreshDirectorySidecarsAfterWrite(
|
|
525
|
+
root,
|
|
526
|
+
"namespaces/alpha/facts/2026-01-01/fact.md",
|
|
527
|
+
true,
|
|
528
|
+
);
|
|
529
|
+
assert.deepEqual(report, { written: [], removed: [] });
|
|
530
|
+
assert.equal(existsSync(path.join(outside, "alpha", "facts", "overview.md")), false);
|
|
531
|
+
assert.equal(existsSync(path.join(outside, "alpha", "facts", "2026-01-01", "overview.md")), false);
|
|
532
|
+
} finally {
|
|
533
|
+
rmSync(root, { recursive: true, force: true });
|
|
534
|
+
}
|
|
535
|
+
});
|
|
@@ -70,6 +70,22 @@ export function parseDirectorySidecarsEnabled(raw: unknown): boolean {
|
|
|
70
70
|
return coerceBooleanLike(raw, "directorySidecarsEnabled") === true;
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
const sidecarEnabledByDir = new Map<string, boolean>();
|
|
74
|
+
|
|
75
|
+
export function setDirectorySidecarsEnabledForDir(memoryDir: string, enabled: boolean): void {
|
|
76
|
+
sidecarEnabledByDir.set(path.resolve(memoryDir), enabled === true);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function isDirectorySidecarsEnabledForDir(memoryDir: string): boolean {
|
|
80
|
+
let dir = path.resolve(memoryDir);
|
|
81
|
+
for (;;) {
|
|
82
|
+
if (sidecarEnabledByDir.has(dir)) return sidecarEnabledByDir.get(dir) === true;
|
|
83
|
+
const parent = path.dirname(dir);
|
|
84
|
+
if (parent === dir) return false;
|
|
85
|
+
dir = parent;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
73
89
|
/** Basenames never treated as child memories (ours plus OKF's reserved ones). */
|
|
74
90
|
const RESERVED_CHILD_BASENAMES: Readonly<Record<string, true>> = Object.freeze({
|
|
75
91
|
...OKF_RESERVED_BASENAMES,
|
|
@@ -321,10 +337,21 @@ function childAbstractsFromDisk(dir: string): Map<string, string> {
|
|
|
321
337
|
*/
|
|
322
338
|
export function directorySidecarAncestry(memoryDir: string, changedPath: string): string[] {
|
|
323
339
|
const root = path.resolve(memoryDir);
|
|
340
|
+
if (!isRealDirectory(root)) return [];
|
|
324
341
|
const abs = path.isAbsolute(changedPath) ? path.resolve(changedPath) : path.resolve(root, changedPath);
|
|
325
342
|
const rel = path.relative(root, abs);
|
|
326
343
|
if (rel.startsWith("..") || path.isAbsolute(rel)) return [];
|
|
327
344
|
const parts = rel.split(path.sep).filter(Boolean);
|
|
345
|
+
let cursor = root;
|
|
346
|
+
for (let i = 0; i < parts.length; i++) {
|
|
347
|
+
cursor = path.join(cursor, parts[i] ?? "");
|
|
348
|
+
try {
|
|
349
|
+
if (lstatSync(cursor).isSymbolicLink()) return [];
|
|
350
|
+
} catch {
|
|
351
|
+
if (i === parts.length - 1) break;
|
|
352
|
+
return [];
|
|
353
|
+
}
|
|
354
|
+
}
|
|
328
355
|
const dirParts = isRealDirectory(abs) ? parts : parts.slice(0, -1);
|
|
329
356
|
let categoryAt = -1;
|
|
330
357
|
if (dirParts[0] === "namespaces" && dirParts.length >= 3 && CATEGORY_ROOTS.has(dirParts[2] ?? "")) {
|
|
@@ -335,7 +362,9 @@ export function directorySidecarAncestry(memoryDir: string, changedPath: string)
|
|
|
335
362
|
if (categoryAt === -1) return [];
|
|
336
363
|
const dirs: string[] = [];
|
|
337
364
|
for (let i = dirParts.length; i > categoryAt; i--) {
|
|
338
|
-
|
|
365
|
+
const dir = path.join(root, ...dirParts.slice(0, i));
|
|
366
|
+
if (!isRealDirectory(dir)) return [];
|
|
367
|
+
dirs.push(dir);
|
|
339
368
|
}
|
|
340
369
|
return dirs;
|
|
341
370
|
}
|
|
@@ -512,13 +541,18 @@ export async function applyDirectorySidecarDrillDown<T extends DirectorySidecarH
|
|
|
512
541
|
memoryDir: string,
|
|
513
542
|
query: string,
|
|
514
543
|
hits: readonly T[],
|
|
515
|
-
options: { enabled?: boolean; namespace?: string } = {},
|
|
544
|
+
options: { enabled?: boolean; namespace?: string; namespaces?: readonly string[] } = {},
|
|
516
545
|
): Promise<T[]> {
|
|
517
|
-
if (options.enabled !== true) return [
|
|
518
|
-
const
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
546
|
+
if (options.enabled !== true) return hits as T[];
|
|
547
|
+
const namespaces = options.namespaces;
|
|
548
|
+
if (namespaces !== undefined && namespaces.length === 0) return hits as T[];
|
|
549
|
+
const scopes = namespaces && namespaces.length > 0 ? namespaces : [options.namespace];
|
|
550
|
+
const matchLists = await Promise.all(
|
|
551
|
+
scopes.map((namespace) =>
|
|
552
|
+
findDirectorySidecarsForQuery(memoryDir, query, { namespace, refresh: false }),
|
|
553
|
+
),
|
|
554
|
+
);
|
|
555
|
+
const matches = matchLists.flat();
|
|
522
556
|
const fresh = matches.filter((match) => match.fresh && match.abstract.length > 0);
|
|
523
557
|
if (fresh.length === 0) return [...hits];
|
|
524
558
|
return hits.map((hit) => {
|
|
@@ -165,7 +165,7 @@ export class RecallInternalCoordinator {
|
|
|
165
165
|
const recallSectionDeadlineMs = this.deps.config.recallCoreDeadlineMs ?? 75_000;
|
|
166
166
|
const recallOuterTimeoutMs = this.deps.config.recallOuterTimeoutMs ?? 75_000;
|
|
167
167
|
const enrichmentSectionDeadlineMs =
|
|
168
|
-
this.deps.config.recallEnrichmentDeadlineMs ??
|
|
168
|
+
this.deps.config.recallEnrichmentDeadlineMs ?? 60_000;
|
|
169
169
|
// Wrap entire recall body in try/finally so profiling trace is always closed,
|
|
170
170
|
// even on unexpected exceptions (e.g., throwIfRecallAborted, phase-1 errors).
|
|
171
171
|
try {
|
|
@@ -15,6 +15,7 @@ import test from "node:test";
|
|
|
15
15
|
import { saveRecognitionIndex, type RecognitionIndex } from "../recall-recognition-tier.js";
|
|
16
16
|
import {
|
|
17
17
|
fetchQmdMemoryResultsWithRecognitionSwap,
|
|
18
|
+
recognitionHitScore,
|
|
18
19
|
type RecognitionSearchDeps,
|
|
19
20
|
} from "./recall-recognition-search.js";
|
|
20
21
|
import type { QmdSearchResult } from "../types.js";
|
|
@@ -30,6 +31,13 @@ function indexOf(ids: string[]): RecognitionIndex {
|
|
|
30
31
|
};
|
|
31
32
|
}
|
|
32
33
|
|
|
34
|
+
test("#3117 recognition hit scores stay on the retrieval 0-1 scale", () => {
|
|
35
|
+
assert.equal(recognitionHitScore(0), 1);
|
|
36
|
+
assert.ok(recognitionHitScore(1) < 1);
|
|
37
|
+
assert.ok(recognitionHitScore(1) > recognitionHitScore(2));
|
|
38
|
+
assert.ok(recognitionHitScore(99) > 0);
|
|
39
|
+
});
|
|
40
|
+
|
|
33
41
|
async function tmpDir(): Promise<string> {
|
|
34
42
|
return mkdtemp(path.join(os.tmpdir(), "remnic-recognition-search-"));
|
|
35
43
|
}
|
|
@@ -133,6 +133,10 @@ export async function fetchQmdMemoryResultsWithRecognitionSwap(
|
|
|
133
133
|
);
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
+
export function recognitionHitScore(rankOffset: number): number {
|
|
137
|
+
return 1 / (1 + rankOffset);
|
|
138
|
+
}
|
|
139
|
+
|
|
136
140
|
async function hitsFromIds(
|
|
137
141
|
namespace: string,
|
|
138
142
|
storage: RecognitionStorage,
|
|
@@ -152,7 +156,7 @@ async function hitsFromIds(
|
|
|
152
156
|
docid: `${namespace}:${rel}`,
|
|
153
157
|
namespace,
|
|
154
158
|
path: rel,
|
|
155
|
-
score:
|
|
159
|
+
score: recognitionHitScore(offset),
|
|
156
160
|
snippet: descriptionById.get(id) ?? id,
|
|
157
161
|
});
|
|
158
162
|
}
|
|
@@ -22,6 +22,7 @@ import { abortError } from "../abort-error.js";
|
|
|
22
22
|
import { type CapabilitySet, type GraphConstructionCapabilitySet, resolveCapabilities, resolveConversationContextCapabilities, resolveGraphConstructionCapabilities, resolveIndexingCapabilities, resolveMemoryLifecycleCapabilities, resolveNamespaceCapabilities, resolvePipelineProcessingCapabilities, resolveQmdCapabilities, resolveRecallEnhancementCapabilities } from "../capabilities.js";
|
|
23
23
|
import { EmbeddingFallback } from "../embedding-fallback.js";
|
|
24
24
|
import { StorageManager } from "../index.js";
|
|
25
|
+
import { applyDirectorySidecarDrillDown, isDirectorySidecarsEnabledForDir } from "../directory-sidecars.js";
|
|
25
26
|
import { inferIntentFromText, intentCompatibilityScore } from "../intent.js";
|
|
26
27
|
import { log } from "../logger.js";
|
|
27
28
|
import { NamespaceStorageRouter } from "../namespaces/storage.js";
|
|
@@ -314,7 +315,7 @@ export class RecallSearchPipelineCoordinator {
|
|
|
314
315
|
320,
|
|
315
316
|
Math.max(fetchLimit, qmdFetchLimit * 5),
|
|
316
317
|
);
|
|
317
|
-
const qmdRecallBudgetMs = this.deps.config.recallEnrichmentDeadlineMs ??
|
|
318
|
+
const qmdRecallBudgetMs = this.deps.config.recallEnrichmentDeadlineMs ?? 60_000;
|
|
318
319
|
const qmdRecallBudgetEnabled = qmdRecallBudgetMs > 0;
|
|
319
320
|
const startedAtMs = Date.now();
|
|
320
321
|
let lastPrimaryResultCount = 0;
|
|
@@ -342,9 +343,6 @@ export class RecallSearchPipelineCoordinator {
|
|
|
342
343
|
const debugSearchOptions = backendHonorsQmdSearchSignals
|
|
343
344
|
? resolvedSearchOptions
|
|
344
345
|
: undefined;
|
|
345
|
-
// Cross-lingual recall (#2197): lexical tiers cannot match a query whose
|
|
346
|
-
// dominant script differs from the corpus's, whatever the page fill.
|
|
347
|
-
// Supplement with the embedding-fallback tier ONCE, before widening.
|
|
348
346
|
const crossScriptVectorHits = options.crossScript
|
|
349
347
|
? await this.searchEmbeddingFallback(prompt, fetchLimit)
|
|
350
348
|
: [];
|
|
@@ -517,7 +515,7 @@ export class RecallSearchPipelineCoordinator {
|
|
|
517
515
|
if (filteredResults.length >= qmdFetchLimit) {
|
|
518
516
|
const capped = filteredResults.slice(0, qmdFetchLimit);
|
|
519
517
|
await emitDebugSnapshot(capped, fetchLimit);
|
|
520
|
-
return capped;
|
|
518
|
+
return await applyDirectorySidecarDrillDown(this.deps.storage?.dir ?? "", prompt, capped, { enabled: Boolean(this.deps.storage?.dir) && isDirectorySidecarsEnabledForDir(this.deps.storage.dir), namespaces: options.namespacesEnabled ? options.recallNamespaces ?? [] : undefined });
|
|
521
519
|
}
|
|
522
520
|
if (filteredResults.length > bestFiltered.length) {
|
|
523
521
|
bestFiltered = filteredResults;
|
|
@@ -526,7 +524,7 @@ export class RecallSearchPipelineCoordinator {
|
|
|
526
524
|
// hits). Keep widening until the backend itself underfills the page.
|
|
527
525
|
if (primaryResults.length < fetchLimit) {
|
|
528
526
|
await emitDebugSnapshot(filteredResults, fetchLimit);
|
|
529
|
-
return filteredResults;
|
|
527
|
+
return await applyDirectorySidecarDrillDown(this.deps.storage?.dir ?? "", prompt, filteredResults, { enabled: Boolean(this.deps.storage?.dir) && isDirectorySidecarsEnabledForDir(this.deps.storage.dir), namespaces: options.namespacesEnabled ? options.recallNamespaces ?? [] : undefined });
|
|
530
528
|
}
|
|
531
529
|
if (fetchLimit >= maxFetchLimit) {
|
|
532
530
|
break;
|
|
@@ -538,7 +536,7 @@ export class RecallSearchPipelineCoordinator {
|
|
|
538
536
|
|
|
539
537
|
const capped = bestFiltered.slice(0, qmdFetchLimit);
|
|
540
538
|
await emitDebugSnapshot(capped, fetchLimit);
|
|
541
|
-
return capped;
|
|
539
|
+
return await applyDirectorySidecarDrillDown(this.deps.storage?.dir ?? "", prompt, capped, { enabled: Boolean(this.deps.storage?.dir) && isDirectorySidecarsEnabledForDir(this.deps.storage.dir), namespaces: options.namespacesEnabled ? options.recallNamespaces ?? [] : undefined });
|
|
542
540
|
}
|
|
543
541
|
|
|
544
542
|
async searchEmbeddingFallback(
|
package/src/orchestrator.ts
CHANGED
|
@@ -143,6 +143,7 @@ import { WorkspaceOpsCoordinator } from "./orchestration/workspace-ops.js";
|
|
|
143
143
|
import { NamespaceReadFanoutCoordinator } from "./orchestration/namespace-read-fanout.js";
|
|
144
144
|
import { selfDeps } from "./orchestration/self-deps.js";
|
|
145
145
|
import { RecallEntryCoordinator } from "./orchestration/recall-entry.js";
|
|
146
|
+
import { setDirectorySidecarsEnabledForDir } from "./directory-sidecars.js";
|
|
146
147
|
import { SessionContextCoordinator, type SessionFlushOptions } from "./orchestration/session-context.js";
|
|
147
148
|
import { drainRecallWrites, trackRecallWrite } from "./orchestration/recall-background-writes.js";
|
|
148
149
|
import { XrayCaptureQueue } from "./orchestration/xray-capture-queue.js";
|
|
@@ -1971,6 +1972,13 @@ export class Orchestrator {
|
|
|
1971
1972
|
async initialize(): Promise<void> {
|
|
1972
1973
|
this.extractionQueueCoordinator.resumeAccepting();
|
|
1973
1974
|
await this.orchestratorInitCoordinator.initialize();
|
|
1975
|
+
{
|
|
1976
|
+
const memoryDir = this.storage?.dir;
|
|
1977
|
+
if (typeof memoryDir === "string" && memoryDir.length > 0) {
|
|
1978
|
+
const { directorySidecarsEnabled } = this.config;
|
|
1979
|
+
setDirectorySidecarsEnabledForDir(memoryDir, directorySidecarsEnabled);
|
|
1980
|
+
}
|
|
1981
|
+
}
|
|
1974
1982
|
if (isDependencyPropagationEnabled(this.config)) {
|
|
1975
1983
|
this._dependencyPropagationRecovery = this.dependencyPropagationDelivery
|
|
1976
1984
|
.recover()
|
package/src/qmd.ts
CHANGED
|
@@ -70,7 +70,7 @@ export interface QmdClientOptions {
|
|
|
70
70
|
qmdSubprocessStrategy?: QmdSubprocessStrategy;
|
|
71
71
|
/** Override automatic qmd fallback probes; defaults to known install paths. */
|
|
72
72
|
qmdFallbackPaths?: string[];
|
|
73
|
-
/** Per-call daemon search timeout in ms; default
|
|
73
|
+
/** Per-call daemon search timeout in ms; default 60000. Issue #1335/#3098. */
|
|
74
74
|
qmdDaemonTimeoutMs?: number;
|
|
75
75
|
}
|
|
76
76
|
|
|
@@ -152,9 +152,9 @@ export type { QmdStatusReport } from "./qmd-status.js";
|
|
|
152
152
|
|
|
153
153
|
const QMD_TIMEOUT_MS = 30_000;
|
|
154
154
|
// Daemon timeout for search calls. Keep under RECALL_TIMEOUT_MS (75s) so a slow
|
|
155
|
-
// daemon fails fast. Default only — override via `qmdDaemonTimeoutMs` (#1335).
|
|
156
|
-
//
|
|
157
|
-
const QMD_DAEMON_TIMEOUT_MS =
|
|
155
|
+
// daemon fails fast. Default only — override via `qmdDaemonTimeoutMs` (#1335/#3098).
|
|
156
|
+
// 60s covers multi-GB cold indexes that 8s missed; operators can still set 8s.
|
|
157
|
+
const QMD_DAEMON_TIMEOUT_MS = 60_000;
|
|
158
158
|
const QMD_UPDATE_BACKOFF_MS = 15 * 60 * 1000; // 15m
|
|
159
159
|
const QMD_EMBED_BACKOFF_MS = 60 * 60 * 1000; // 60m
|
|
160
160
|
const QMD_CLI_WARN_THROTTLE_MS = 15 * 60 * 1000; // 15m
|
|
@@ -8,7 +8,7 @@ test("parseConfig applies recall timeout and qmd recall cache defaults", () => {
|
|
|
8
8
|
|
|
9
9
|
assert.equal(config.recallOuterTimeoutMs, 75_000);
|
|
10
10
|
assert.equal(config.recallCoreDeadlineMs, 75_000);
|
|
11
|
-
assert.equal(config.recallEnrichmentDeadlineMs,
|
|
11
|
+
assert.equal(config.recallEnrichmentDeadlineMs, 60_000);
|
|
12
12
|
assert.equal(config.qmdRecallCacheTtlMs, 60_000);
|
|
13
13
|
assert.equal(config.qmdRecallCacheStaleTtlMs, 10 * 60_000);
|
|
14
14
|
assert.equal(config.qmdRecallCacheMaxEntries, 128);
|
package/src/storage.ts
CHANGED
|
@@ -248,8 +248,7 @@ import {
|
|
|
248
248
|
sealedWriteToLegacyArgs,
|
|
249
249
|
type SealedMemoryEnvelope,
|
|
250
250
|
} from "./write-envelope.js";
|
|
251
|
-
|
|
252
|
-
// skip-with-warning strategy (Finding 1 — Uhol). See ensureFactHashIndexAuthoritative.
|
|
251
|
+
import { isDirectorySidecarsEnabledForDir, refreshDirectorySidecarsAfterWrite } from "./directory-sidecars.js";
|
|
253
252
|
type SharedVersionKind = "memory-status" | "artifact-write" | "cold-write" | "memory-corpus" | "entity-mutation";
|
|
254
253
|
|
|
255
254
|
type OfflineSyncDigestCacheEntry = {
|
|
@@ -3973,25 +3972,7 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
|
|
|
3973
3972
|
return { id, tombstoneBlocked, ...(fm.blockedBy ? { blockedBy: fm.blockedBy } : {}), memory: { path: filePath, frontmatter: fm, content: sanitized.text } };
|
|
3974
3973
|
}
|
|
3975
3974
|
|
|
3976
|
-
/**
|
|
3977
|
-
* Sealed-envelope write entry point (issue #1989 PR2).
|
|
3978
|
-
*
|
|
3979
|
-
* Byte-identity with `writeMemory` is BY DELEGATION: the envelope-owned
|
|
3980
|
-
* fields are unpacked into the exact `writeMemory` arguments a legacy
|
|
3981
|
-
* caller would have passed, so the persisted output is produced by the
|
|
3982
|
-
* same code path. The composer's `persistedBody` was assembled with the
|
|
3983
|
-
* same `assemblePersistedBody` helper `writeMemory` uses, so fingerprints
|
|
3984
|
-
* derived from the envelope match the stored body (§13).
|
|
3985
|
-
*
|
|
3986
|
-
* Differences from a raw `writeMemory` call are REJECTIONS, not silent
|
|
3987
|
-
* changes: the composer enforces tag/attribute caps, strict validAt, and
|
|
3988
|
-
* plain-object attributes that the legacy path never validated.
|
|
3989
|
-
*
|
|
3990
|
-
* `envelope.ttl` maps to `expiresAt` verbatim; converting duration
|
|
3991
|
-
* expressions (`"90d"`) to instants remains the access layer's job (PR3).
|
|
3992
|
-
* `envelope.sourceReason` is access-layer metadata with no frontmatter
|
|
3993
|
-
* field and is deliberately not persisted here.
|
|
3994
|
-
*/
|
|
3975
|
+
/** Sealed-envelope write entry point (issue #1989 PR2). */
|
|
3995
3976
|
async writeSealedMemory(envelope: SealedMemoryEnvelope, extras: SealedWriteExtras = {}) {
|
|
3996
3977
|
if (!isSealedMemoryEnvelope(envelope)) {
|
|
3997
3978
|
throw new Error(
|
|
@@ -3999,7 +3980,17 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
|
|
|
3999
3980
|
);
|
|
4000
3981
|
}
|
|
4001
3982
|
const { category, content, options } = sealedWriteToLegacyArgs(envelope, extras);
|
|
4002
|
-
|
|
3983
|
+
const result = await this.writeMemory(category, content, options as WriteMemoryOptions);
|
|
3984
|
+
try {
|
|
3985
|
+
await refreshDirectorySidecarsAfterWrite(
|
|
3986
|
+
this.dir,
|
|
3987
|
+
result.memory?.path ?? "",
|
|
3988
|
+
isDirectorySidecarsEnabledForDir(this.dir),
|
|
3989
|
+
);
|
|
3990
|
+
} catch (err) {
|
|
3991
|
+
log.warn(`directory sidecar refresh failed after write: ${err}`);
|
|
3992
|
+
}
|
|
3993
|
+
return result;
|
|
4003
3994
|
}
|
|
4004
3995
|
|
|
4005
3996
|
async hasFactContentHash(content: string): Promise<boolean> {
|
package/src/types.ts
CHANGED
|
@@ -996,12 +996,12 @@ export interface PluginConfig
|
|
|
996
996
|
recallDirectAnswerEnabled: boolean;
|
|
997
997
|
/** Recall state views (issue #1952): label current/historical/transition on change-intent queries. Default false. */
|
|
998
998
|
recallStateViews: boolean;
|
|
999
|
-
/** Standing memory block (issue #2971)
|
|
999
|
+
/** Standing memory block (issue #2971). Default false. */
|
|
1000
1000
|
recallStandingBlock: boolean;
|
|
1001
|
-
/** Days a memory stays in the standing block's full-text fresh band. Default 14. */
|
|
1002
1001
|
standingBlockFreshDays: number;
|
|
1003
|
-
/** Hard character budget for the standing memory block. Default 2048. */
|
|
1004
1002
|
standingBlockMaxChars: number;
|
|
1003
|
+
/** Directory sidecars (issue #3088). Default false. */
|
|
1004
|
+
directorySidecarsEnabled: boolean;
|
|
1005
1005
|
/**
|
|
1006
1006
|
* Disclosure auto-escalation policy (issue #677 PR 4/4). `"auto"`
|
|
1007
1007
|
* escalates chunk → section when top-K confidence falls below
|