@remnic/core 9.45.2 → 9.45.4
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/abort-error.d.ts +2 -1
- package/dist/abort-error.js +3 -1
- package/dist/access-admin-ops-surface.d.ts +14 -10
- package/dist/access-admin-ops-surface.js +84 -76
- package/dist/access-audit.js +2 -2
- package/dist/access-authorization-probe.d.ts +14 -10
- package/dist/access-authorization-probe.js +85 -77
- package/dist/access-boundary.d.ts +15 -11
- package/dist/access-boundary.js +84 -76
- package/dist/access-citation-namespace.js +2 -2
- package/dist/access-cli.js +193 -181
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +16 -0
- package/dist/access-coding-context-resolution.js +13 -0
- package/dist/access-coding-context-resolution.js.map +1 -0
- package/dist/access-extraction-force-flush.d.ts +14 -10
- package/dist/access-extraction-force-flush.js +84 -76
- package/dist/access-health-types.d.ts +2 -1
- package/dist/access-http-lcm-compaction.d.ts +16 -12
- package/dist/access-http-lcm-compaction.js +3 -3
- package/dist/access-http-lifecycle-flush.d.ts +14 -10
- package/dist/access-http-lifecycle-flush.js +2 -2
- package/dist/access-http-offline-stream.d.ts +123 -0
- package/dist/access-http-offline-stream.js +10 -0
- package/dist/access-http-offline-stream.js.map +1 -0
- package/dist/access-http-query.js +84 -76
- package/dist/access-http.d.ts +15 -10
- package/dist/access-http.js +105 -92
- package/dist/access-identity-continuity-surface.d.ts +9 -8
- package/dist/access-identity-continuity-surface.js +84 -76
- package/dist/access-lcm-surface.d.ts +14 -10
- package/dist/access-lcm-surface.js +84 -76
- package/dist/access-mcp-output-schemas.js +1 -1
- package/dist/access-mcp.d.ts +14 -10
- package/dist/access-mcp.js +95 -83
- package/dist/access-memory-search-fanout.d.ts +3 -2
- package/dist/{access-namespace-preflight-5yZ4g6F8.d.ts → access-namespace-preflight-CWUDwB4M.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +4 -3
- package/dist/access-namespace-preflight.js +84 -76
- package/dist/access-observe-helpers.d.ts +1 -0
- package/dist/access-observe-helpers.js +1 -1
- package/dist/access-observe-write-surface.d.ts +16 -10
- package/dist/access-observe-write-surface.js +84 -76
- package/dist/access-offline-manifest.d.ts +104 -0
- package/dist/access-offline-manifest.js +45 -0
- package/dist/access-offline-manifest.js.map +1 -0
- package/dist/access-operations-batch.js +86 -78
- package/dist/access-operations.d.ts +18 -14
- package/dist/access-operations.js +91 -80
- package/dist/access-recall-concurrency.d.ts +16 -26
- package/dist/access-recall-concurrency.js +86 -77
- package/dist/access-recall-response.d.ts +18 -14
- package/dist/access-recall-response.js +84 -76
- package/dist/access-recall-surface.d.ts +29 -24
- package/dist/access-recall-surface.js +84 -76
- package/dist/access-schema.d.ts +84 -84
- package/dist/access-schema.js +3 -3
- package/dist/{access-service-CiJRsgAB.d.ts → access-service-CsU-ljFD.d.ts} +25 -16
- package/dist/access-service-helpers.d.ts +14 -10
- package/dist/access-service.d.ts +14 -10
- package/dist/access-service.js +84 -76
- package/dist/access-surface-catalog.d.ts +14 -10
- package/dist/access-surface-catalog.js +4 -0
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-wearables-meetings-surface.d.ts +4 -3
- package/dist/action-confidence.d.ts +2 -1
- package/dist/active-memory-bridge.d.ts +2 -1
- package/dist/active-recall.d.ts +2 -1
- package/dist/active-recall.js +10 -8
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/registry.js +3 -3
- package/dist/{auto-sync-5OE5QOZB.js → auto-sync-UPTUVE4X.js} +6 -6
- package/dist/behavior-learner.d.ts +2 -1
- package/dist/behavior-learner.js +1 -1
- package/dist/behavior-signals.d.ts +2 -1
- package/dist/bootstrap.d.ts +9 -8
- package/dist/briefing.d.ts +3 -2
- package/dist/briefing.js +23 -22
- package/dist/buffer-surprise-report.d.ts +2 -1
- package/dist/buffer-turn-helpers.d.ts +2 -1
- package/dist/buffer.d.ts +3 -2
- package/dist/buffer.js +12 -11
- package/dist/bulk-import/index.d.ts +4 -3
- package/dist/calibration.d.ts +2 -1
- package/dist/capabilities.d.ts +2 -1
- package/dist/{capsule-merge-IDWJPCWK.js → capsule-merge-Q6AR3XL7.js} +67 -54
- package/dist/capsule-merge-Q6AR3XL7.js.map +1 -0
- package/dist/{catalog-scBmy0sO.d.ts → catalog-bctMURhN.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +2 -1
- package/dist/causal-behavior.js +2 -2
- package/dist/causal-chain.js +2 -2
- package/dist/causal-consolidation.d.ts +2 -1
- package/dist/causal-consolidation.js +27 -26
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-retrieval.js +2 -2
- package/dist/causal-trajectory-graph.d.ts +2 -1
- package/dist/causal-trajectory.js +1 -1
- package/dist/{chunk-VUPTKTDV.js → chunk-2MRHJNWL.js} +3 -3
- package/dist/{chunk-JBPKEARU.js → chunk-2QSZNTDO.js} +7 -7
- package/dist/{chunk-5IVLTFOV.js → chunk-44N6ESJ4.js} +2 -2
- package/dist/{chunk-WOCNN776.js → chunk-4POAMKV6.js} +100 -41
- package/dist/chunk-4POAMKV6.js.map +1 -0
- package/dist/{chunk-HO3QBJEY.js → chunk-5546W5SI.js} +2 -2
- package/dist/{chunk-U7GW7NE7.js → chunk-5CEECY6P.js} +10 -10
- package/dist/{chunk-4UH4BTGK.js → chunk-5SNZSWWR.js} +82 -82
- package/dist/{chunk-6CZPDBJS.js → chunk-5U7ID3EZ.js} +3 -3
- package/dist/{chunk-GF22HWS2.js → chunk-6NNNURLK.js} +7 -7
- package/dist/chunk-773TRRGT.js +36 -0
- package/dist/chunk-773TRRGT.js.map +1 -0
- package/dist/chunk-7CITSYSH.js +242 -0
- package/dist/chunk-7CITSYSH.js.map +1 -0
- package/dist/{chunk-227UFSEQ.js → chunk-7RZJWZ46.js} +5 -5
- package/dist/{chunk-E5UK4VPE.js → chunk-7SHJHPTY.js} +5 -5
- package/dist/{chunk-UVIKWC7M.js → chunk-7YERSTN7.js} +17 -17
- package/dist/{chunk-DLVPUX7U.js → chunk-7YKVM5H3.js} +8 -6
- package/dist/chunk-7YKVM5H3.js.map +1 -0
- package/dist/{chunk-3CE77VAP.js → chunk-A4JMGKCD.js} +87 -74
- package/dist/chunk-A4JMGKCD.js.map +1 -0
- package/dist/chunk-A5KNZSNA.js +26 -0
- package/dist/chunk-A5KNZSNA.js.map +1 -0
- package/dist/{chunk-S2NCTZGJ.js → chunk-AJQ57VV3.js} +15 -15
- package/dist/chunk-AJQ57VV3.js.map +1 -0
- package/dist/{chunk-CUM2BBPN.js → chunk-AUMWZSE7.js} +19 -10
- package/dist/chunk-AUMWZSE7.js.map +1 -0
- package/dist/{chunk-XYTOI63Z.js → chunk-BGHFOD5A.js} +19 -11
- package/dist/chunk-BGHFOD5A.js.map +1 -0
- package/dist/{chunk-BUE5E2HL.js → chunk-BGLY7EEM.js} +5 -314
- package/dist/chunk-BGLY7EEM.js.map +1 -0
- package/dist/chunk-BIPBQQFI.js +44 -0
- package/dist/chunk-BIPBQQFI.js.map +1 -0
- package/dist/{chunk-S5SLVSVY.js → chunk-BQIFZ2MP.js} +5 -5
- package/dist/chunk-BTTPKDIL.js +34 -0
- package/dist/{chunk-PVGDJXVK.js.map → chunk-BTTPKDIL.js.map} +1 -1
- package/dist/{chunk-E53DSZEN.js → chunk-C26TE27X.js} +3 -3
- package/dist/{chunk-LZ4LDKHZ.js → chunk-CLB32OHM.js} +6 -6
- package/dist/{chunk-Q6IP2ARR.js → chunk-CSOYVTRX.js} +2 -2
- package/dist/{chunk-XOQSEF7X.js → chunk-CVILPI77.js} +6 -6
- package/dist/chunk-D3I2MCN7.js +29 -0
- package/dist/chunk-D3I2MCN7.js.map +1 -0
- package/dist/{chunk-A5OJCXZL.js → chunk-DSUAAZZX.js} +15 -4
- package/dist/chunk-DSUAAZZX.js.map +1 -0
- package/dist/{chunk-HREE4JHI.js → chunk-DYVMXPCF.js} +486 -287
- package/dist/chunk-DYVMXPCF.js.map +1 -0
- package/dist/{chunk-J7VGGECD.js → chunk-DZPFMQZ7.js} +1 -1
- package/dist/chunk-DZPFMQZ7.js.map +1 -0
- package/dist/{chunk-PDLBLTOK.js → chunk-EITZHSX6.js} +9 -9
- package/dist/{chunk-D3J5SLQK.js → chunk-EJHEWCGQ.js} +81 -20
- package/dist/chunk-EJHEWCGQ.js.map +1 -0
- package/dist/{chunk-WUNIWKY4.js → chunk-ELIL2A37.js} +6 -6
- package/dist/{chunk-E6PNLPGJ.js → chunk-FZP32336.js} +806 -470
- package/dist/chunk-FZP32336.js.map +1 -0
- package/dist/{chunk-4L6HUREQ.js → chunk-G7A5HLUS.js} +23 -17
- package/dist/chunk-G7A5HLUS.js.map +1 -0
- package/dist/{chunk-CINZGPSJ.js → chunk-GUMZC2BO.js} +2 -2
- package/dist/{chunk-H24WNPA2.js → chunk-GWFSVJ4P.js} +3 -3
- package/dist/{chunk-7XC2HX75.js → chunk-GYPQL6XN.js} +157 -16
- package/dist/chunk-GYPQL6XN.js.map +1 -0
- package/dist/{chunk-TSH56VPU.js → chunk-HAYSYUAB.js} +2 -2
- package/dist/{chunk-TDHTVMPG.js → chunk-HFPASSFV.js} +7 -2
- package/dist/chunk-HFPASSFV.js.map +1 -0
- package/dist/chunk-J2WC5LF4.js +395 -0
- package/dist/chunk-J2WC5LF4.js.map +1 -0
- package/dist/{chunk-PKNLM44P.js → chunk-JH6BPLOP.js} +9 -9
- package/dist/{chunk-KXB4VXHY.js → chunk-JIYDRBVZ.js} +2 -2
- package/dist/chunk-JV3C2MNQ.js +74 -0
- package/dist/chunk-JV3C2MNQ.js.map +1 -0
- package/dist/{chunk-AV5ZEH4M.js → chunk-KVJRXN2E.js} +2 -2
- package/dist/{chunk-JVLCVFQ4.js → chunk-KXEFRMCF.js} +3 -3
- package/dist/{chunk-WFTIGIIS.js → chunk-L6CQ7WIW.js} +5 -5
- package/dist/{chunk-EJUEXZHX.js → chunk-LLJMAULE.js} +2 -2
- package/dist/{chunk-N5Z4EVOR.js → chunk-LNEWDF2A.js} +36 -11
- package/dist/chunk-LNEWDF2A.js.map +1 -0
- package/dist/{chunk-AS7YMSL6.js → chunk-M23RF3LJ.js} +4 -4
- package/dist/{chunk-UYLMNVY6.js → chunk-MDISBSYA.js} +16 -9
- package/dist/chunk-MDISBSYA.js.map +1 -0
- package/dist/{chunk-3F2LKUMU.js → chunk-NIS256NW.js} +2 -2
- package/dist/{chunk-YIAA2X3D.js → chunk-NK5RGJ65.js} +3 -3
- package/dist/chunk-NLDVVWCL.js +84 -0
- package/dist/chunk-NLDVVWCL.js.map +1 -0
- package/dist/{chunk-OQ5PRDDS.js → chunk-NTOIP2E6.js} +6 -6
- package/dist/{chunk-HLPD7B7P.js → chunk-NUEQKLNB.js} +2 -2
- package/dist/{chunk-4J7G5SY4.js → chunk-NZBZ7IS2.js} +72 -24
- package/dist/chunk-NZBZ7IS2.js.map +1 -0
- package/dist/{chunk-3TBLDMJA.js → chunk-O4KMGRXE.js} +5 -2
- package/dist/chunk-O4KMGRXE.js.map +1 -0
- package/dist/{chunk-33PLLLL7.js → chunk-P7NGM24P.js} +6 -6
- package/dist/{chunk-7TWUCYER.js → chunk-PNRA7FAD.js} +7 -7
- package/dist/{chunk-5I4M26Q7.js → chunk-QBSFOKY6.js} +4 -4
- package/dist/{chunk-QJAQNXWI.js → chunk-QCECHYZL.js} +76 -79
- package/dist/chunk-QCECHYZL.js.map +1 -0
- package/dist/{chunk-P4DRWEYC.js → chunk-QVSBTCVP.js} +2 -2
- package/dist/{chunk-AAIUERNB.js → chunk-R5RFK3CB.js} +6 -6
- package/dist/{chunk-WDISJRMG.js → chunk-RMMVQQA6.js} +2 -2
- package/dist/{chunk-KWMXR7XS.js → chunk-S2V7RUCL.js} +8 -1
- package/dist/{chunk-KWMXR7XS.js.map → chunk-S2V7RUCL.js.map} +1 -1
- package/dist/{chunk-5SM35XZR.js → chunk-S5NZBKKQ.js} +2 -2
- package/dist/{chunk-VNA7W7QF.js → chunk-SVH57F5Z.js} +12 -4
- package/dist/chunk-SVH57F5Z.js.map +1 -0
- package/dist/{chunk-WIPEXG6R.js → chunk-SXIMQLGV.js} +2 -2
- package/dist/{chunk-RVLJEII5.js → chunk-SYUBB3WM.js} +256 -187
- package/dist/chunk-SYUBB3WM.js.map +1 -0
- package/dist/{chunk-OAEQLRCY.js → chunk-TN76AKO3.js} +5 -5
- package/dist/{chunk-QN25OCUF.js → chunk-TQ4GD737.js} +5 -5
- package/dist/{chunk-VCD4PSK2.js → chunk-TQZ4DVBC.js} +7 -4
- package/dist/chunk-TQZ4DVBC.js.map +1 -0
- package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
- package/dist/{chunk-DNWXFTLD.js → chunk-TYISDI6B.js} +2 -2
- package/dist/{chunk-4LMA77JH.js → chunk-U2VLVBBH.js} +3 -3
- package/dist/{chunk-5ZE7QHTK.js → chunk-ULVR5KG7.js} +5 -5
- package/dist/{chunk-NVRYW264.js → chunk-UQWIKLQK.js} +18 -15
- package/dist/chunk-UQWIKLQK.js.map +1 -0
- package/dist/{chunk-YV32N67O.js → chunk-URS5GSM7.js} +1 -1
- package/dist/chunk-URS5GSM7.js.map +1 -0
- package/dist/{chunk-4B77XSG5.js → chunk-UV72DEZD.js} +5 -5
- package/dist/{chunk-S2BBISHU.js → chunk-VANZKHTN.js} +3 -3
- package/dist/chunk-VHFXP27N.js +250 -0
- package/dist/chunk-VHFXP27N.js.map +1 -0
- package/dist/{chunk-3Y224NYC.js → chunk-VYISFWVX.js} +2 -2
- package/dist/{chunk-TIHMZFIV.js → chunk-W3IC7QOY.js} +3 -3
- package/dist/{chunk-NRV4Y3PM.js → chunk-W4FBGYGK.js} +1 -1
- package/dist/{chunk-P2BM76KT.js → chunk-WAS4HV46.js} +174 -43
- package/dist/chunk-WAS4HV46.js.map +1 -0
- package/dist/{chunk-57QKLRBV.js → chunk-WB7JSQCP.js} +2 -1
- package/dist/chunk-WB7JSQCP.js.map +1 -0
- package/dist/chunk-WGP57SR3.js +68 -0
- package/dist/chunk-WGP57SR3.js.map +1 -0
- package/dist/{chunk-ECK75GDJ.js → chunk-WQIHRA5F.js} +43 -24
- package/dist/chunk-WQIHRA5F.js.map +1 -0
- package/dist/{chunk-MU7ZHSZE.js → chunk-WZFAPHIK.js} +2 -2
- package/dist/{chunk-T2TTP3KU.js → chunk-X4IDNPOS.js} +2 -2
- package/dist/{chunk-BLAKS3CP.js → chunk-XL3TATMJ.js} +3 -3
- package/dist/{chunk-W4XJFLAL.js → chunk-XPRJSHNI.js} +2 -2
- package/dist/{chunk-5TFP4CUL.js → chunk-XQ3HXAQH.js} +14 -11
- package/dist/chunk-XQ3HXAQH.js.map +1 -0
- package/dist/{chunk-VWAXN2BN.js → chunk-XSFHWBQO.js} +93 -31
- package/dist/chunk-XSFHWBQO.js.map +1 -0
- package/dist/{chunk-DL7ZD3JH.js → chunk-XTAUXTDO.js} +14 -9
- package/dist/chunk-XTAUXTDO.js.map +1 -0
- package/dist/{chunk-JE7EK33X.js → chunk-Y7HRYCNW.js} +2 -2
- package/dist/{chunk-E6EE5B67.js → chunk-YK6BDDHP.js} +4 -4
- package/dist/{chunk-ES36HTSC.js → chunk-YLHM5BQQ.js} +3 -3
- package/dist/{chunk-RN7DY3FC.js → chunk-YMAQDHQM.js} +31 -12
- package/dist/chunk-YMAQDHQM.js.map +1 -0
- package/dist/{chunk-ULARSG5Z.js → chunk-YN6ASZUG.js} +10 -8
- package/dist/{chunk-ULARSG5Z.js.map → chunk-YN6ASZUG.js.map} +1 -1
- package/dist/{chunk-IKKWIPYN.js → chunk-YYQAKIDJ.js} +37 -1
- package/dist/chunk-YYQAKIDJ.js.map +1 -0
- package/dist/{chunk-BJKPPZ6Z.js → chunk-ZFGZ6PZ2.js} +2 -2
- package/dist/{chunk-CJ2ZR7UA.js → chunk-ZI32MKDW.js} +267 -214
- package/dist/chunk-ZI32MKDW.js.map +1 -0
- package/dist/{chunk-64UDOIMI.js → chunk-ZLQ37WJX.js} +2 -2
- package/dist/chunk-ZMAYKGPN.js +351 -0
- package/dist/chunk-ZMAYKGPN.js.map +1 -0
- package/dist/{cli-BUGN3d6_.d.ts → cli-BBHDtG36.d.ts} +5 -5
- package/dist/cli.d.ts +16 -12
- package/dist/cli.js +138 -124
- package/dist/compounding/engine.d.ts +3 -2
- package/dist/compounding/engine.js +24 -23
- package/dist/compounding/preference-consolidator.d.ts +2 -1
- package/dist/compression-optimizer.d.ts +2 -1
- package/dist/config.d.ts +2 -1
- package/dist/config.js +10 -8
- package/dist/connectors/codex-materialize-runner.d.ts +2 -1
- package/dist/connectors/codex-materialize-runner.js +23 -22
- package/dist/connectors/codex-materialize.d.ts +2 -1
- package/dist/connectors/index.d.ts +2 -1
- package/dist/connectors/index.js +26 -25
- package/dist/consolidation-provenance-check.d.ts +3 -2
- package/dist/consolidation-provenance-check.js +4 -4
- package/dist/consolidation-undo.d.ts +3 -2
- package/dist/consolidation-undo.js +10 -7
- package/dist/consolidation-undo.js.map +1 -1
- package/dist/contradiction/index.d.ts +3 -2
- package/dist/converge-config.d.ts +2 -1
- package/dist/convergence-refresh.d.ts +4 -3
- package/dist/convergence-refresh.js +27 -26
- package/dist/conversation-index/backend.d.ts +2 -1
- package/dist/conversation-index/backend.js +2 -2
- package/dist/conversation-index/chunker.d.ts +2 -1
- package/dist/conversation-index/faiss-adapter.d.ts +2 -1
- package/dist/conversation-index/indexer.d.ts +2 -1
- package/dist/conversation-index/search.d.ts +2 -1
- package/dist/corpus-watermark.d.ts +2 -1
- package/dist/corpus-watermark.js +42 -41
- package/dist/day-summary.d.ts +2 -1
- package/dist/delinearize.d.ts +2 -1
- package/dist/direct-answer-wiring.d.ts +2 -1
- package/dist/direct-answer-wiring.js +2 -2
- package/dist/direct-answer.d.ts +2 -1
- package/dist/embedding-fallback.d.ts +2 -1
- package/dist/embedding-fallback.js +2 -2
- package/dist/enrichment/index.d.ts +2 -1
- package/dist/entity-retrieval-boundaries.js +1 -1
- package/dist/entity-retrieval.d.ts +3 -2
- package/dist/entity-retrieval.js +24 -23
- package/dist/entity-schema.d.ts +2 -1
- package/dist/explicit-capture.d.ts +9 -8
- package/dist/explicit-capture.js +11 -9
- package/dist/external-wiki-access.d.ts +127 -0
- package/dist/external-wiki-access.js +186 -0
- package/dist/external-wiki-access.js.map +1 -0
- package/dist/external-wiki-cli.d.ts +13 -0
- package/dist/external-wiki-cli.js +96 -0
- package/dist/external-wiki-cli.js.map +1 -0
- package/dist/external-wiki-collection-registration.d.ts +39 -0
- package/dist/external-wiki-collection-registration.js +79 -0
- package/dist/external-wiki-collection-registration.js.map +1 -0
- package/dist/external-wiki-collection.d.ts +50 -0
- package/dist/external-wiki-collection.js +387 -0
- package/dist/external-wiki-collection.js.map +1 -0
- package/dist/external-wiki-config.d.ts +13 -0
- package/dist/external-wiki-config.js +13 -0
- package/dist/external-wiki-config.js.map +1 -0
- package/dist/external-wiki-guard.d.ts +11 -0
- package/dist/external-wiki-guard.js +18 -0
- package/dist/external-wiki-guard.js.map +1 -0
- package/dist/external-wiki-mcp-tools.d.ts +123 -0
- package/dist/external-wiki-mcp-tools.js +8 -0
- package/dist/external-wiki-mcp-tools.js.map +1 -0
- package/dist/external-wiki-search.d.ts +42 -0
- package/dist/external-wiki-search.js +11 -0
- package/dist/external-wiki-search.js.map +1 -0
- package/dist/external-wiki.d.ts +43 -0
- package/dist/external-wiki.js +16 -0
- package/dist/external-wiki.js.map +1 -0
- package/dist/extraction-error-classification.d.ts +2 -1
- package/dist/extraction-faithfulness.d.ts +2 -1
- package/dist/extraction-judge-telemetry.d.ts +2 -1
- package/dist/extraction-judge-training.d.ts +2 -1
- package/dist/extraction-judge.d.ts +2 -1
- package/dist/extraction-liveness.d.ts +2 -1
- package/dist/extraction-source-grounding-helpers.d.ts +5 -3
- package/dist/extraction-source-grounding-helpers.js +1 -1
- package/dist/extraction-source-grounding-rules.d.ts +2 -1
- package/dist/extraction-source-grounding-rules.js +2 -2
- package/dist/extraction-source-grounding.d.ts +2 -1
- package/dist/extraction-source-grounding.js +5 -5
- package/dist/extraction.d.ts +2 -1
- package/dist/extraction.js +45 -43
- package/dist/fallback-llm.d.ts +2 -1
- package/dist/graph-dashboard-diff.d.ts +2 -1
- package/dist/graph-dashboard-key.d.ts +2 -1
- package/dist/graph-dashboard-parser.d.ts +2 -1
- package/dist/graph-edge-reinforcement.d.ts +2 -1
- package/dist/graph-snapshot.d.ts +2 -1
- package/dist/graph.d.ts +2 -1
- package/dist/harmonic-retrieval.js +2 -2
- package/dist/importance.d.ts +2 -1
- package/dist/importers/index.d.ts +2 -1
- package/dist/in-flight-reads.d.ts +2 -1
- package/dist/index.d.ts +732 -720
- package/dist/index.js +291 -259
- package/dist/intent.d.ts +2 -1
- package/dist/lcm/engine.d.ts +2 -1
- package/dist/lcm/engine.js +3 -3
- package/dist/lcm/index.d.ts +2 -1
- package/dist/lcm/index.js +8 -8
- package/dist/lcm/tools.d.ts +2 -1
- package/dist/lifecycle.d.ts +2 -1
- package/dist/live-connectors-runner.d.ts +2 -1
- package/dist/local-llm.d.ts +2 -1
- package/dist/local-llm.js +2 -2
- package/dist/local-model-endpoint.d.ts +2 -1
- package/dist/maintenance/memory-governance.d.ts +2 -1
- package/dist/maintenance/memory-governance.js +24 -23
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +24 -23
- package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
- package/dist/maintenance/rebuild-memory-projection.js +26 -25
- package/dist/{maintenance-LbuS2rUA.d.ts → maintenance-D2mveyCd.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +14 -10
- package/dist/mcp-read-only-tools.js +1 -1
- package/dist/memory-action-policy.d.ts +2 -1
- package/dist/memory-cache.d.ts +2 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
- package/dist/memory-projection-store.d.ts +2 -1
- package/dist/memory-provenance.d.ts +2 -1
- package/dist/memory-worth-outcomes.d.ts +3 -2
- package/dist/models-json.d.ts +2 -1
- package/dist/namespaces/migrate.d.ts +4 -3
- package/dist/namespaces/migrate.js +40 -39
- package/dist/namespaces/principal.d.ts +2 -1
- package/dist/namespaces/search.d.ts +2 -1
- package/dist/namespaces/search.js +18 -18
- package/dist/namespaces/storage.d.ts +4 -3
- package/dist/namespaces/storage.js +23 -22
- package/dist/native-knowledge.d.ts +2 -1
- package/dist/offline-sync-impression-drain.d.ts +2 -1
- package/dist/offline-sync-impression-drain.js +11 -9
- package/dist/offline-sync.d.ts +29 -3
- package/dist/offline-sync.js +6 -2
- package/dist/operator-doctor-corpus.d.ts +2 -1
- package/dist/operator-doctor-corpus.js +45 -44
- package/dist/operator-doctor-replica.d.ts +2 -1
- package/dist/operator-doctor-replica.js +3 -3
- package/dist/operator-toolkit.d.ts +4 -3
- package/dist/operator-toolkit.js +59 -55
- package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
- package/dist/orchestration/maintenance.d.ts +5 -4
- package/dist/orchestration/maintenance.js +36 -33
- package/dist/{orchestrator-rHiWt32X.d.ts → orchestrator-DJYlwiUv.d.ts} +14 -7
- package/dist/orchestrator.d.ts +9 -8
- package/dist/orchestrator.js +201 -189
- package/dist/page-versioning.js +3 -3
- package/dist/patterns-cli.d.ts +2 -1
- package/dist/{pipeline-W_97O8BV.d.ts → pipeline-CNjY4wk3.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +2 -1
- package/dist/policy-runtime.js +1 -1
- package/dist/proactive-contention.d.ts +2 -1
- package/dist/provenance.d.ts +2 -1
- package/dist/provenance.js +2 -2
- package/dist/{qmd-LWtMofAf.d.ts → qmd-C0UDZidt.d.ts} +9 -7
- package/dist/qmd-preflight.d.ts +5 -4
- package/dist/qmd-preflight.js +2 -2
- package/dist/qmd-recall-cache.d.ts +2 -1
- package/dist/qmd.d.ts +4 -3
- package/dist/qmd.js +5 -5
- package/dist/recall-concurrency-config.d.ts +2 -1
- package/dist/recall-disclosure-escalation.d.ts +2 -1
- package/dist/recall-explain-renderer.d.ts +2 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +2 -1
- package/dist/recall-planner-llm.d.ts +2 -1
- package/dist/recall-state.d.ts +2 -1
- package/dist/recall-tag-filter.d.ts +2 -1
- package/dist/recall-timings.d.ts +2 -1
- package/dist/recall-xray-cli.d.ts +2 -1
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +2 -1
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +8 -1
- package/dist/recall-xray.js +2 -2
- package/dist/reconcile/cursor.d.ts +12 -2
- package/dist/reconcile/cursor.js +46 -7
- package/dist/reconcile/cursor.js.map +1 -1
- package/dist/reconcile/manifest.d.ts +9 -2
- package/dist/reconcile/manifest.js +15 -268
- package/dist/reconcile/manifest.js.map +1 -1
- package/dist/reconcile/plan.d.ts +6 -2
- package/dist/reconcile/plan.js +4 -4
- package/dist/replay/normalizers/chatgpt.d.ts +2 -1
- package/dist/replay/normalizers/claude.d.ts +2 -1
- package/dist/replay/normalizers/openclaw.d.ts +2 -1
- package/dist/replay/normalizers/shared.d.ts +2 -1
- package/dist/replay/runner.d.ts +2 -1
- package/dist/replay/types.d.ts +2 -1
- package/dist/replica-divergence.d.ts +2 -1
- package/dist/replica-divergence.js +2 -2
- package/dist/replica-peers-config.d.ts +2 -1
- package/dist/resolve-auth-token.d.ts +2 -1
- package/dist/resume-bundles.js +12 -10
- package/dist/retrieval-agents.d.ts +4 -3
- package/dist/retrieval-agents.js +2 -2
- package/dist/retrieval-tiers.d.ts +2 -1
- package/dist/routing/engine.d.ts +2 -1
- package/dist/routing/store.d.ts +2 -1
- package/dist/salvage-envelope.d.ts +2 -1
- package/dist/schemas.d.ts +76 -76
- package/dist/{scope-profiles-BiQKOE-p.d.ts → scope-profiles-BJzp2F5A.d.ts} +1 -1
- package/dist/search/embed-helper.d.ts +2 -1
- package/dist/search/embed-helper.js +3 -3
- package/dist/search/factory.d.ts +4 -2
- package/dist/search/factory.js +20 -18
- package/dist/search/index.d.ts +2 -1
- package/dist/search/index.js +22 -22
- package/dist/search/lancedb-backend.d.ts +2 -1
- package/dist/search/lancedb-backend.js +4 -4
- package/dist/search/meilisearch-backend.d.ts +2 -1
- package/dist/search/meilisearch-backend.js +4 -4
- package/dist/search/noop-backend.d.ts +2 -1
- package/dist/search/orama-backend.d.ts +2 -1
- package/dist/search/orama-backend.js +4 -4
- package/dist/search/port.d.ts +18 -1
- package/dist/search/port.js +1 -1
- package/dist/search/remote-backend.d.ts +2 -1
- package/dist/search/remote-backend.js +2 -2
- package/dist/secure-store/index.js +2 -2
- package/dist/{semantic-consolidation-dHYCyqgh.d.ts → semantic-consolidation-D4KAZO2G.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +3 -2
- package/dist/semantic-consolidation.js +25 -24
- package/dist/semantic-rule-promotion.js +23 -22
- package/dist/semantic-rule-verifier.d.ts +2 -1
- package/dist/semantic-rule-verifier.js +24 -23
- package/dist/{service-DJG3KCQ4.d.ts → service-BeDxSqE-.d.ts} +2 -2
- package/dist/session-observer-bands.d.ts +2 -1
- package/dist/session-observer-state.d.ts +2 -1
- package/dist/shared-context/manager.d.ts +10 -9
- package/dist/shared-context/manager.js +2 -2
- package/dist/signal.d.ts +2 -1
- package/dist/source-agent-qualifier.d.ts +2 -1
- package/dist/source-agent-qualifier.js +42 -40
- package/dist/{storage-F9FVh-w9.d.ts → storage-DfjxusTE.d.ts} +24 -12
- package/dist/storage.d.ts +3 -2
- package/dist/storage.js +25 -24
- package/dist/summarizer.d.ts +2 -1
- package/dist/summarizer.js +5 -5
- package/dist/summary-snapshot.d.ts +2 -1
- package/dist/temporal-supersession.d.ts +3 -2
- package/dist/temporal-timeline-recall.d.ts +2 -1
- package/dist/temporal-validity.d.ts +2 -1
- package/dist/threading.d.ts +2 -1
- package/dist/tier-migration.d.ts +3 -2
- package/dist/tier-routing.d.ts +2 -1
- package/dist/tool-scoped-memory.d.ts +5 -1
- package/dist/tool-scoped-memory.js +3 -1
- package/dist/topics.d.ts +2 -1
- package/dist/transcript.d.ts +2 -1
- package/dist/transfer/capsule-import.js +4 -4
- package/dist/transfer/types.d.ts +66 -66
- package/dist/trust-score-stage.d.ts +2 -1
- package/dist/trust-score.d.ts +2 -1
- package/dist/{types-rEwubvim.d.ts → types-yX_FwERf.d.ts} +8 -1
- package/dist/types.d.ts +2 -1
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +2 -1
- package/dist/verified-recall.js +24 -23
- package/dist/write-envelope.d.ts +2 -1
- package/package.json +2 -2
- package/src/abort-error.ts +17 -0
- package/src/access-admin-ops-surface.ts +1 -0
- package/src/access-boundary.ts +1 -0
- package/src/access-coding-context-resolution.ts +42 -0
- package/src/access-extraction-force-flush.ts +38 -2
- package/src/access-http-lcm-compaction.ts +5 -2
- package/src/access-http-offline-stream.ts +79 -0
- package/src/access-http.test.ts +310 -3
- package/src/access-http.ts +85 -21
- package/src/access-mcp-output-schemas.ts +36 -0
- package/src/access-mcp.test.ts +95 -1
- package/src/access-mcp.ts +7 -9
- package/src/access-observe-helpers.ts +64 -22
- package/src/access-observe-write-surface.ts +8 -0
- package/src/access-offline-manifest.ts +54 -0
- package/src/access-operations-batch.ts +3 -3
- package/src/access-operations.ts +13 -7
- package/src/access-recall-concurrency.ts +3 -27
- package/src/access-recall-surface.ts +3 -0
- package/src/access-service-health.test.ts +32 -7
- package/src/access-service-namespace.test.ts +55 -0
- package/src/access-service-observe-idempotency.test.ts +34 -2
- package/src/access-service-observe-lcm-parity.test.ts +138 -3
- package/src/access-service-observe-scope.test.ts +160 -1
- package/src/access-service-offline-file-content.test.ts +345 -1
- package/src/access-service.ts +86 -59
- package/src/access-surface-catalog.ts +4 -0
- package/src/admin/admin-surfaces.ts +2 -0
- package/src/binary-lifecycle/pipeline.test.ts +106 -1
- package/src/binary-lifecycle/pipeline.ts +3 -0
- package/src/coding/git-context.test.ts +47 -0
- package/src/coding/git-context.ts +129 -27
- package/src/config.test.ts +24 -0
- package/src/config.ts +9 -12
- package/src/connector-provenance.test.ts +101 -0
- package/src/consolidation-undo.ts +3 -0
- package/src/converge-conflict-policy-type.test.ts +15 -0
- package/src/convergence-refresh.ts +14 -2
- package/src/correction/correction-access-wiring.ts +9 -7
- package/src/correction/correction-executor.test.ts +206 -2
- package/src/correction/correction-executor.ts +29 -20
- package/src/correction/correction-planner.test.ts +36 -0
- package/src/correction/correction-planner.ts +9 -15
- package/src/correction/correction-service.ts +3 -1
- package/src/correction/correction-storage-integration.test.ts +77 -0
- package/src/correction/correction-surfaces.test.ts +41 -28
- package/src/correction/passive-capture.test.ts +59 -0
- package/src/correction/passive-capture.ts +4 -1
- package/src/entity-retrieval-boundaries.ts +17 -4
- package/src/entity-retrieval.ts +27 -6
- package/src/external-wiki-access.test.ts +65 -0
- package/src/external-wiki-access.ts +31 -0
- package/src/external-wiki-cli.ts +92 -0
- package/src/external-wiki-collection-registration.test.ts +163 -0
- package/src/external-wiki-collection-registration.ts +101 -0
- package/src/external-wiki-collection.test.ts +502 -0
- package/src/external-wiki-collection.ts +503 -0
- package/src/external-wiki-config.test.ts +135 -0
- package/src/external-wiki-config.ts +100 -0
- package/src/external-wiki-guard.ts +83 -0
- package/src/external-wiki-mcp-tools.ts +23 -0
- package/src/external-wiki-search.test.ts +301 -0
- package/src/external-wiki-search.ts +362 -0
- package/src/external-wiki.test.ts +240 -0
- package/src/external-wiki.ts +453 -0
- package/src/extraction-scope-source-agent.test.ts +21 -0
- package/src/extraction-source-grounding-helpers.ts +243 -53
- package/src/extraction-source-grounding-rules.ts +133 -39
- package/src/extraction-source-grounding.test.ts +363 -33
- package/src/extraction-timeout.test.ts +1 -0
- package/src/extraction-watermark.test.ts +150 -7
- package/src/extraction.ts +8 -1
- package/src/index.ts +8 -0
- package/src/mcp-read-only-tools.ts +1 -0
- package/src/offline-sync.test.ts +194 -0
- package/src/offline-sync.ts +217 -13
- package/src/orchestration/external-wiki-recall-guard.test.ts +94 -0
- package/src/orchestration/extraction-persist.ts +19 -2
- package/src/orchestration/extraction-run-helpers.ts +37 -19
- package/src/orchestration/extraction-run.test.ts +171 -2
- package/src/orchestration/extraction-run.ts +11 -13
- package/src/orchestration/extraction-watermark.ts +106 -17
- package/src/orchestration/generic-recall-paths.ts +14 -0
- package/src/orchestration/orchestrator-helpers.ts +2 -0
- package/src/orchestration/orchestrator-init.ts +9 -0
- package/src/orchestration/recall-internal-deps.ts +6 -0
- package/src/orchestration/recall-internal.ts +154 -33
- package/src/orchestration/recall-rerank-coordinator.ts +60 -25
- package/src/orchestration/recall-search-pipeline.test.ts +75 -1
- package/src/orchestration/recall-search-pipeline.ts +50 -10
- package/src/orchestrator-convergence-refresh.test.ts +36 -2
- package/src/orchestrator.ts +13 -3
- package/src/page-versioning.ts +5 -19
- package/src/procedural/procedure-recall.ts +5 -1
- package/src/provenance-surfaces.test.ts +3 -0
- package/src/qmd-client.test.ts +78 -17
- package/src/qmd.test.ts +24 -0
- package/src/qmd.ts +224 -315
- package/src/recall-explain-renderer.ts +3 -0
- package/src/recall-rerank-coordinator.test.ts +61 -0
- package/src/recall-xray-renderer.test.ts +6 -0
- package/src/recall-xray.test.ts +88 -1
- package/src/recall-xray.ts +15 -0
- package/src/reconcile/cursor.test.ts +48 -0
- package/src/reconcile/cursor.ts +58 -11
- package/src/reconcile/manifest.test.ts +4 -0
- package/src/reconcile/manifest.ts +41 -51
- package/src/reconcile/plan.test.ts +4 -0
- package/src/reconcile/plan.ts +29 -16
- package/src/search/factory.ts +6 -6
- package/src/search/port.ts +25 -9
- package/src/secure-store/secure-fs.ts +20 -12
- package/src/secure-store/secure-store.test.ts +41 -2
- package/src/spaces/index.test.ts +61 -2
- package/src/spaces/index.ts +44 -18
- package/src/storage/entity-alias-config.ts +97 -0
- package/src/storage/entity-canonical-id-lock.ts +53 -23
- package/src/storage/entity-canonical-id-migration.ts +53 -22
- package/src/storage/entity-canonical-id-references.ts +3 -0
- package/src/storage/entity-id-safety.ts +7 -0
- package/src/storage/entity-store.ts +6 -2
- package/src/storage/memory-frontmatter-metadata.ts +4 -9
- package/src/storage/memory-migration-serialization.ts +10 -15
- package/src/storage/tombstone-blocked-capture-mutation.ts +52 -64
- package/src/storage/tombstone-blocked-capture-sync.ts +244 -199
- package/src/storage-deletion-revisions.test.ts +91 -0
- package/src/storage-fact-hash-index-defer.test.ts +446 -163
- package/src/storage.ts +534 -245
- package/src/tool-scoped-memory.ts +10 -0
- package/src/transfer/capsule-import.ts +13 -0
- package/src/transfer/capsule-merge.ts +13 -0
- package/src/trust-score-recall-paths.test.ts +75 -1
- package/src/types.ts +7 -3
- package/dist/capsule-merge-IDWJPCWK.js.map +0 -1
- package/dist/chunk-3CE77VAP.js.map +0 -1
- package/dist/chunk-3TBLDMJA.js.map +0 -1
- package/dist/chunk-4J7G5SY4.js.map +0 -1
- package/dist/chunk-4L6HUREQ.js.map +0 -1
- package/dist/chunk-57QKLRBV.js.map +0 -1
- package/dist/chunk-5TFP4CUL.js.map +0 -1
- package/dist/chunk-7XC2HX75.js.map +0 -1
- package/dist/chunk-A5OJCXZL.js.map +0 -1
- package/dist/chunk-BUE5E2HL.js.map +0 -1
- package/dist/chunk-CJ2ZR7UA.js.map +0 -1
- package/dist/chunk-CUM2BBPN.js.map +0 -1
- package/dist/chunk-D3J5SLQK.js.map +0 -1
- package/dist/chunk-DL7ZD3JH.js.map +0 -1
- package/dist/chunk-DLVPUX7U.js.map +0 -1
- package/dist/chunk-E6PNLPGJ.js.map +0 -1
- package/dist/chunk-ECK75GDJ.js.map +0 -1
- package/dist/chunk-HREE4JHI.js.map +0 -1
- package/dist/chunk-IKKWIPYN.js.map +0 -1
- package/dist/chunk-J7VGGECD.js.map +0 -1
- package/dist/chunk-N5Z4EVOR.js.map +0 -1
- package/dist/chunk-NVRYW264.js.map +0 -1
- package/dist/chunk-P2BM76KT.js.map +0 -1
- package/dist/chunk-PVGDJXVK.js +0 -21
- package/dist/chunk-QJAQNXWI.js.map +0 -1
- package/dist/chunk-RN7DY3FC.js.map +0 -1
- package/dist/chunk-RVLJEII5.js.map +0 -1
- package/dist/chunk-S2NCTZGJ.js.map +0 -1
- package/dist/chunk-TDHTVMPG.js.map +0 -1
- package/dist/chunk-UYLMNVY6.js.map +0 -1
- package/dist/chunk-VCD4PSK2.js.map +0 -1
- package/dist/chunk-VNA7W7QF.js.map +0 -1
- package/dist/chunk-VWAXN2BN.js.map +0 -1
- package/dist/chunk-WOCNN776.js.map +0 -1
- package/dist/chunk-XYTOI63Z.js.map +0 -1
- package/dist/chunk-YV32N67O.js.map +0 -1
- /package/dist/{auto-sync-5OE5QOZB.js.map → auto-sync-UPTUVE4X.js.map} +0 -0
- /package/dist/{chunk-VUPTKTDV.js.map → chunk-2MRHJNWL.js.map} +0 -0
- /package/dist/{chunk-JBPKEARU.js.map → chunk-2QSZNTDO.js.map} +0 -0
- /package/dist/{chunk-5IVLTFOV.js.map → chunk-44N6ESJ4.js.map} +0 -0
- /package/dist/{chunk-HO3QBJEY.js.map → chunk-5546W5SI.js.map} +0 -0
- /package/dist/{chunk-U7GW7NE7.js.map → chunk-5CEECY6P.js.map} +0 -0
- /package/dist/{chunk-4UH4BTGK.js.map → chunk-5SNZSWWR.js.map} +0 -0
- /package/dist/{chunk-6CZPDBJS.js.map → chunk-5U7ID3EZ.js.map} +0 -0
- /package/dist/{chunk-GF22HWS2.js.map → chunk-6NNNURLK.js.map} +0 -0
- /package/dist/{chunk-227UFSEQ.js.map → chunk-7RZJWZ46.js.map} +0 -0
- /package/dist/{chunk-E5UK4VPE.js.map → chunk-7SHJHPTY.js.map} +0 -0
- /package/dist/{chunk-UVIKWC7M.js.map → chunk-7YERSTN7.js.map} +0 -0
- /package/dist/{chunk-S5SLVSVY.js.map → chunk-BQIFZ2MP.js.map} +0 -0
- /package/dist/{chunk-E53DSZEN.js.map → chunk-C26TE27X.js.map} +0 -0
- /package/dist/{chunk-LZ4LDKHZ.js.map → chunk-CLB32OHM.js.map} +0 -0
- /package/dist/{chunk-Q6IP2ARR.js.map → chunk-CSOYVTRX.js.map} +0 -0
- /package/dist/{chunk-XOQSEF7X.js.map → chunk-CVILPI77.js.map} +0 -0
- /package/dist/{chunk-PDLBLTOK.js.map → chunk-EITZHSX6.js.map} +0 -0
- /package/dist/{chunk-WUNIWKY4.js.map → chunk-ELIL2A37.js.map} +0 -0
- /package/dist/{chunk-CINZGPSJ.js.map → chunk-GUMZC2BO.js.map} +0 -0
- /package/dist/{chunk-H24WNPA2.js.map → chunk-GWFSVJ4P.js.map} +0 -0
- /package/dist/{chunk-TSH56VPU.js.map → chunk-HAYSYUAB.js.map} +0 -0
- /package/dist/{chunk-PKNLM44P.js.map → chunk-JH6BPLOP.js.map} +0 -0
- /package/dist/{chunk-KXB4VXHY.js.map → chunk-JIYDRBVZ.js.map} +0 -0
- /package/dist/{chunk-AV5ZEH4M.js.map → chunk-KVJRXN2E.js.map} +0 -0
- /package/dist/{chunk-JVLCVFQ4.js.map → chunk-KXEFRMCF.js.map} +0 -0
- /package/dist/{chunk-WFTIGIIS.js.map → chunk-L6CQ7WIW.js.map} +0 -0
- /package/dist/{chunk-EJUEXZHX.js.map → chunk-LLJMAULE.js.map} +0 -0
- /package/dist/{chunk-AS7YMSL6.js.map → chunk-M23RF3LJ.js.map} +0 -0
- /package/dist/{chunk-3F2LKUMU.js.map → chunk-NIS256NW.js.map} +0 -0
- /package/dist/{chunk-YIAA2X3D.js.map → chunk-NK5RGJ65.js.map} +0 -0
- /package/dist/{chunk-OQ5PRDDS.js.map → chunk-NTOIP2E6.js.map} +0 -0
- /package/dist/{chunk-HLPD7B7P.js.map → chunk-NUEQKLNB.js.map} +0 -0
- /package/dist/{chunk-33PLLLL7.js.map → chunk-P7NGM24P.js.map} +0 -0
- /package/dist/{chunk-7TWUCYER.js.map → chunk-PNRA7FAD.js.map} +0 -0
- /package/dist/{chunk-5I4M26Q7.js.map → chunk-QBSFOKY6.js.map} +0 -0
- /package/dist/{chunk-P4DRWEYC.js.map → chunk-QVSBTCVP.js.map} +0 -0
- /package/dist/{chunk-AAIUERNB.js.map → chunk-R5RFK3CB.js.map} +0 -0
- /package/dist/{chunk-WDISJRMG.js.map → chunk-RMMVQQA6.js.map} +0 -0
- /package/dist/{chunk-5SM35XZR.js.map → chunk-S5NZBKKQ.js.map} +0 -0
- /package/dist/{chunk-WIPEXG6R.js.map → chunk-SXIMQLGV.js.map} +0 -0
- /package/dist/{chunk-OAEQLRCY.js.map → chunk-TN76AKO3.js.map} +0 -0
- /package/dist/{chunk-QN25OCUF.js.map → chunk-TQ4GD737.js.map} +0 -0
- /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
- /package/dist/{chunk-DNWXFTLD.js.map → chunk-TYISDI6B.js.map} +0 -0
- /package/dist/{chunk-4LMA77JH.js.map → chunk-U2VLVBBH.js.map} +0 -0
- /package/dist/{chunk-5ZE7QHTK.js.map → chunk-ULVR5KG7.js.map} +0 -0
- /package/dist/{chunk-4B77XSG5.js.map → chunk-UV72DEZD.js.map} +0 -0
- /package/dist/{chunk-S2BBISHU.js.map → chunk-VANZKHTN.js.map} +0 -0
- /package/dist/{chunk-3Y224NYC.js.map → chunk-VYISFWVX.js.map} +0 -0
- /package/dist/{chunk-TIHMZFIV.js.map → chunk-W3IC7QOY.js.map} +0 -0
- /package/dist/{chunk-NRV4Y3PM.js.map → chunk-W4FBGYGK.js.map} +0 -0
- /package/dist/{chunk-MU7ZHSZE.js.map → chunk-WZFAPHIK.js.map} +0 -0
- /package/dist/{chunk-T2TTP3KU.js.map → chunk-X4IDNPOS.js.map} +0 -0
- /package/dist/{chunk-BLAKS3CP.js.map → chunk-XL3TATMJ.js.map} +0 -0
- /package/dist/{chunk-W4XJFLAL.js.map → chunk-XPRJSHNI.js.map} +0 -0
- /package/dist/{chunk-JE7EK33X.js.map → chunk-Y7HRYCNW.js.map} +0 -0
- /package/dist/{chunk-E6EE5B67.js.map → chunk-YK6BDDHP.js.map} +0 -0
- /package/dist/{chunk-ES36HTSC.js.map → chunk-YLHM5BQQ.js.map} +0 -0
- /package/dist/{chunk-BJKPPZ6Z.js.map → chunk-ZFGZ6PZ2.js.map} +0 -0
- /package/dist/{chunk-64UDOIMI.js.map → chunk-ZLQ37WJX.js.map} +0 -0
package/dist/chunk-PVGDJXVK.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// src/abort-error.ts
|
|
2
|
-
function abortError(message) {
|
|
3
|
-
const err = new Error(message);
|
|
4
|
-
Object.defineProperty(err, "name", { value: "AbortError" });
|
|
5
|
-
return err;
|
|
6
|
-
}
|
|
7
|
-
function isAbortError(err) {
|
|
8
|
-
return err instanceof Error && err.name === "AbortError";
|
|
9
|
-
}
|
|
10
|
-
function throwIfAborted(signal, message = "operation aborted") {
|
|
11
|
-
if (signal?.aborted) {
|
|
12
|
-
throw abortError(message);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export {
|
|
17
|
-
abortError,
|
|
18
|
-
isAbortError,
|
|
19
|
-
throwIfAborted
|
|
20
|
-
};
|
|
21
|
-
//# sourceMappingURL=chunk-PVGDJXVK.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/qmd.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { log } from \"./logger.js\";\nimport { clearQmdResultCaches, getCachedQmdSearch, setCachedQmdSearch } from \"./memory-cache.js\";\nimport {\n abortError,\n isAbortError,\n throwIfAborted,\n} from \"./abort-error.js\";\nimport type { QmdSearchExplain, QmdSearchResult } from \"./types.js\";\nimport {\n resolveEnsureCollectionArgs,\n type SearchBackend,\n type SearchDegradation,\n type SearchExecutionOptions,\n type SearchQueryOptions,\n} from \"./search/port.js\";\nimport { launchProcess, type CommandChildProcess } from \"./runtime/child-process.js\";\nimport { mergeEnv } from \"./runtime/env.js\";\nimport {\n classifyProbeFailure,\n compareQmdVersions,\n getQmdPostInstallProbeTargets,\n parseQmdVersion,\n parseQmdVersionOutput,\n QMD_PROBE_RETRY_BACKOFF_MS,\n QMD_PROBE_TIMEOUT_MS,\n QMD_SUPPORTED_VERSION,\n qmdVersionToString,\n resolveQmdCapabilities,\n shouldAutoUpgradeQmd,\n versionAtLeast,\n type QmdProbeFailureKind,\n} from \"./qmd-preflight.js\";\nimport { fetchQmdStatus, embedQmdFiles, EMPTY_QMD_STATUS, type QmdStatusReport } from \"./qmd-status.js\";\n// Re-export version-check / probe-preflight helpers (moved to qmd-preflight.ts,\n// issue #1841) so existing imports from \"./qmd.js\" keep resolving.\nexport {\n compareQmdVersions,\n getQmdPostInstallProbeTargets,\n parseQmdVersion,\n parseQmdVersionOutput,\n QMD_SUPPORTED_VERSION,\n resolveQmdCapabilities,\n shouldAutoUpgradeQmd,\n versionAtLeast,\n};\n\nexport interface QmdClientOptions {\n slowLog?: { enabled: boolean; thresholdMs: number };\n updateTimeoutMs?: number;\n updateMinIntervalMs?: number;\n qmdPath?: string;\n daemonUrl?: string;\n daemonRecheckIntervalMs?: number;\n qmdSupportedVersion?: string;\n qmdAutoUpgradeEnabled?: boolean;\n qmdAutoUpgradeCheckIntervalMs?: number;\n qmdChunkStrategy?: QmdChunkStrategy;\n qmdCandidateLimit?: number;\n qmdQueryRerankEnabled?: boolean;\n qmdIndexName?: string;\n qmdForceCpu?: boolean;\n qmdGpuBackend?: \"auto\" | \"metal\" | \"cuda\" | \"vulkan\" | \"false\";\n qmdEmbedParallelism?: number;\n qmdEmbedModel?: string;\n qmdRerankModel?: string;\n qmdGenerateModel?: string;\n /** Daemon search plan; default \"hybrid\" preserves lex+vec+hyde. Issue #1335. */\n qmdSearchStrategy?: QmdSearchStrategy;\n /** Subprocess fallback command; default \"query\" keeps LLM expansion. Issue #1335. */\n qmdSubprocessStrategy?: QmdSubprocessStrategy;\n /** Override automatic qmd fallback probes; defaults to known install paths. */\n qmdFallbackPaths?: string[];\n /** Per-call daemon search timeout in ms; default 8000. Issue #1335. */\n qmdDaemonTimeoutMs?: number;\n}\n\nexport type QmdVersionTuple = [number, number, number];\nexport type QmdChunkStrategy = \"auto\" | \"regex\";\nexport type QmdStructuredSearchType = \"lex\" | \"vec\" | \"hyde\";\n/**\n * Daemon search plan. Issue #1335.\n * - \"hybrid\" → lex + vec + hyde (DEFAULT — full recall; runs an embedding pass\n * plus a HyDE generate pass, which dominates latency on CPU-only models).\n * - \"lex-vec\" → lex + vec (drops the expensive HyDE generate leg).\n * - \"lex\" → lex only (BM25; fastest, no model inference).\n */\nexport type QmdSearchStrategy = \"hybrid\" | \"lex-vec\" | \"lex\";\n/**\n * Subprocess fallback command (used only when the daemon is unavailable). Issue #1335.\n * - \"query\" → `qmd query` (DEFAULT — LLM query expansion + rerank; see CLAUDE.md\n * gotcha #7, this is intentional and must remain the default).\n * - \"search\" → `qmd search` (BM25-only; fast, but no expansion/rerank).\n */\nexport type QmdSubprocessStrategy = \"query\" | \"search\";\nexport interface QmdStructuredSearch {\n type: QmdStructuredSearchType;\n query: string;\n}\n\nexport interface QmdCapabilities {\n version: string | null;\n parsedVersion: QmdVersionTuple | null;\n stableSdk: boolean;\n unifiedSearch: boolean;\n getDocumentBody: boolean;\n maintenanceApi: boolean;\n legacySkillInstall: boolean;\n intentHints: boolean;\n explainTraces: boolean;\n candidateLimit: boolean;\n v2McpQueryTool: boolean;\n structuredSearches: boolean;\n queryRerankToggle: boolean;\n chunkStrategy: boolean;\n qmdBench: boolean;\n perCollectionModels: boolean;\n jsonLineNumbers: boolean;\n editorLinks: boolean;\n doctor: boolean;\n versionedSkills: boolean;\n absoluteSnippetLines: boolean;\n fullQueryOutput: boolean;\n forceCpu: boolean;\n gpuBackendOverride: boolean;\n embedParallelism: boolean;\n modelEnvConsistency: boolean;\n scopedEmbed: boolean;\n safeStatusDeviceProbe: boolean;\n mcpIndexSelection: boolean;\n outputFormatFlag: boolean;\n}\n\nexport interface QmdVersionStatus {\n installedVersion: string | null;\n supportedVersion: string;\n supported: boolean;\n newerThanSupported: boolean;\n upgradeAvailable: boolean;\n capabilities: QmdCapabilities;\n}\n\nexport interface QmdDoctorReport {\n available: boolean;\n skipped?: string;\n report?: unknown;\n raw?: string;\n error?: string;\n}\n\nexport { parseQmdStatusOutput } from \"./qmd-status.js\";\nexport type { QmdStatusReport } from \"./qmd-status.js\";\n\nconst QMD_TIMEOUT_MS = 30_000;\n// Daemon timeout for search calls. Keep under RECALL_TIMEOUT_MS (75s) so a slow\n// daemon fails fast. Default only — override via `qmdDaemonTimeoutMs` (#1335).\n// Keep ≥ 5s for normal post-load searches to complete reliably.\nconst QMD_DAEMON_TIMEOUT_MS = 8_000;\nconst QMD_UPDATE_BACKOFF_MS = 15 * 60 * 1000; // 15m\nconst QMD_EMBED_BACKOFF_MS = 60 * 60 * 1000; // 60m\nconst QMD_CLI_WARN_THROTTLE_MS = 15 * 60 * 1000; // 15m\nconst QMD_PACKAGE_NAME = \"@tobilu/qmd\";\nconst QMD_AUTO_UPGRADE_TIMEOUT_MS = 120_000;\nconst QMD_AUTO_UPGRADE_CHECK_INTERVAL_MS = 24 * 60 * 60_000;\nconst QMD_STRUCTURED_HYDE_MAX_CHARS = 320;\nconst QMD_FALLBACK_PATHS = [\n path.join(os.homedir(), \".bun\", \"bin\", \"qmd\"),\n \"/usr/local/bin/qmd\",\n \"/opt/homebrew/bin/qmd\",\n];\nconst QMD_GLOBAL_STATE_KEY = \"__openclawEngramQmdGlobalState\";\n\ntype QmdGlobalState = {\n warnedGlobalUpdateBehavior: boolean;\n lastGlobalUpdateRunAtMs: number | null;\n lastGlobalUpdateFailAtMs: number | null;\n lastGlobalEmbedRunAtMs: number | null;\n lastGlobalEmbedFailAtMs: number | null;\n lastCliWarnAtMs: number | null;\n lastUpdateByCollectionMs: Record<string, number>;\n lastUpdateFailByCollectionMs: Record<string, number>;\n lastEmbedByCollectionMs: Record<string, number>;\n lastEmbedFailByCollectionMs: Record<string, number>;\n lastAutoUpgradeCheckAtMs: number | null;\n lastAutoUpgradeStatus: string | null;\n lastAutoUpgradeCheckByTargetMs: Record<string, number>;\n lastAutoUpgradeStatusByTarget: Record<string, string>;\n};\n\ntype QmdRuntimeEnv = Record<string, string | undefined>;\n\nfunction getGlobalQmdState(): QmdGlobalState {\n const g = globalThis as any;\n if (!g[QMD_GLOBAL_STATE_KEY]) {\n g[QMD_GLOBAL_STATE_KEY] = {\n warnedGlobalUpdateBehavior: false,\n lastGlobalUpdateRunAtMs: null,\n lastGlobalUpdateFailAtMs: null,\n lastGlobalEmbedRunAtMs: null,\n lastGlobalEmbedFailAtMs: null,\n lastCliWarnAtMs: null,\n lastUpdateByCollectionMs: {},\n lastUpdateFailByCollectionMs: {},\n lastEmbedByCollectionMs: {},\n lastEmbedFailByCollectionMs: {},\n lastAutoUpgradeCheckAtMs: null,\n lastAutoUpgradeStatus: null,\n lastAutoUpgradeCheckByTargetMs: {},\n lastAutoUpgradeStatusByTarget: {},\n } satisfies QmdGlobalState;\n }\n const state = g[QMD_GLOBAL_STATE_KEY] as QmdGlobalState;\n state.lastAutoUpgradeCheckByTargetMs ??= {};\n state.lastAutoUpgradeStatusByTarget ??= {};\n return state;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction errorMessage(err: unknown): string {\n if (typeof err === \"string\") return err;\n if (err instanceof Error) return err.message;\n if (err && typeof err === \"object\" && \"message\" in err && typeof (err as { message?: unknown }).message === \"string\") {\n return (err as { message: string }).message;\n }\n return String(err);\n}\n\nfunction isCallerCancellation(err: unknown, signal?: AbortSignal): boolean {\n if (signal?.aborted) return true;\n if (isAbortError(err)) return true;\n if (err && typeof err === \"object\") {\n const code = \"code\" in err ? (err as { code?: unknown }).code : undefined;\n if (code === \"ABORT_ERR\" || code === \"ERR_CANCELED\") return true;\n }\n return false;\n}\n\nfunction isDaemonTimeoutError(err: unknown): boolean {\n return /timed out/i.test(errorMessage(err));\n}\n\nfunction sleepWithSignal(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n throwIfAborted(signal);\n const timer = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n cleanup();\n reject(abortError(\"operation aborted while waiting\"));\n };\n const cleanup = () => {\n signal?.removeEventListener(\"abort\", onAbort);\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction isSqliteBusyError(msg: string): boolean {\n const lower = msg.toLowerCase();\n return (\n lower.includes(\"database is locked\") ||\n lower.includes(\"sqlite_busy\") ||\n lower.includes(\"sqlite_busy_recovery\") ||\n lower.includes(\"sqliterror: database is locked\")\n );\n}\n\nfunction stripControlChars(s: string): string {\n // Remove ANSI escapes and other control characters that explode logs.\n return s.replace(/\\x1b\\[[0-9;]*[A-Za-z]/g, \"\").replace(/[\\u0000-\\u001f\\u007f]/g, \"\");\n}\n\nfunction truncateForLog(s: string, max = 2000): string {\n const cleaned = stripControlChars(s);\n return cleaned.length > max ? cleaned.slice(0, max) + \"…(truncated)\" : cleaned;\n}\n\nfunction isVectorDimensionMismatchError(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err);\n return (\n /dimension mismatch/i.test(msg) ||\n (/vectors?_vec/i.test(msg) && /float\\[\\d+\\]/i.test(msg)) ||\n (/embedding/i.test(msg) && /dimensions?/i.test(msg))\n );\n}\n\nfunction normalizeSearchOptions(options?: SearchQueryOptions): SearchQueryOptions | undefined {\n if (!options) return undefined;\n const intent = typeof options.intent === \"string\" ? options.intent.trim() : \"\";\n const normalized: SearchQueryOptions = {};\n if (intent.length > 0) {\n normalized.intent = intent;\n }\n if (options.explain === true) {\n normalized.explain = true;\n }\n if (options.rerank === false) {\n normalized.rerank = false;\n }\n if (options.chunkStrategy === \"auto\" || options.chunkStrategy === \"regex\") {\n normalized.chunkStrategy = options.chunkStrategy;\n }\n if (\n typeof options.candidateLimit === \"number\" &&\n Number.isFinite(options.candidateLimit) &&\n options.candidateLimit > 0\n ) {\n normalized.candidateLimit = Math.floor(options.candidateLimit);\n }\n const structuredSearches = normalizeStructuredSearches(options.structuredSearches);\n if (structuredSearches.length > 0) {\n normalized.structuredSearches = structuredSearches;\n }\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n}\n\nfunction normalizeStructuredSearches(value: unknown): QmdStructuredSearch[] {\n if (!Array.isArray(value)) return [];\n const normalized: QmdStructuredSearch[] = [];\n for (const entry of value) {\n if (!entry || typeof entry !== \"object\") continue;\n const candidate = entry as { type?: unknown; query?: unknown };\n const type = candidate.type;\n const query = typeof candidate.query === \"string\" ? candidate.query.trim() : \"\";\n if ((type === \"lex\" || type === \"vec\" || type === \"hyde\") && query.length > 0) {\n normalized.push({ type, query });\n }\n if (normalized.length >= 10) break;\n }\n return normalized;\n}\n\nfunction buildSyntheticHydeQuery(query: string, intent?: string): string {\n const base = intent && intent.trim().length > 0\n ? `A relevant Remnic memory for ${intent.trim()} would answer: ${query.trim()}`\n : `A relevant Remnic memory would answer: ${query.trim()}`;\n return base.length > QMD_STRUCTURED_HYDE_MAX_CHARS\n ? base.slice(0, QMD_STRUCTURED_HYDE_MAX_CHARS)\n : base;\n}\n\n/**\n * Build the structured sub-queries the daemon `query` tool runs in one request.\n *\n * The default `\"hybrid\"` plan (lex + vec + hyde) intentionally exercises QMD's\n * full RRF + rerank path for best recall. On CPU-only models the `hyde` leg\n * (1.7B generate + embed) dominates wall-clock — operators on constrained\n * hardware can trade recall for latency via `qmdSearchStrategy` (issue #1335)\n * without losing the default behavior. A per-call `structuredSearches` override\n * always wins so callers with stronger query-document structure stay in control.\n */\nexport function buildDefaultStructuredSearches(\n query: string,\n options?: SearchQueryOptions,\n strategy: QmdSearchStrategy = \"hybrid\",\n): QmdStructuredSearch[] {\n const explicit = normalizeStructuredSearches(options?.structuredSearches);\n if (explicit.length > 0) return explicit;\n const trimmed = query.trim();\n if (!trimmed) return [];\n const lex: QmdStructuredSearch = { type: \"lex\", query: trimmed };\n if (strategy === \"lex\") return [lex];\n const vec: QmdStructuredSearch = { type: \"vec\", query: trimmed };\n if (strategy === \"lex-vec\") return [lex, vec];\n return [\n lex,\n vec,\n { type: \"hyde\", query: buildSyntheticHydeQuery(trimmed, options?.intent) },\n ];\n}\n\nfunction parseExplainScores(value: unknown): number[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const scores = value.filter((entry): entry is number => typeof entry === \"number\");\n return scores.length > 0 ? scores : undefined;\n}\n\nexport function parseQmdExplain(value: unknown): QmdSearchExplain | undefined {\n if (!value || typeof value !== \"object\") return undefined;\n const candidate = value as Record<string, unknown>;\n const rrf =\n typeof candidate.rrf === \"number\"\n ? candidate.rrf\n : candidate.rrf && typeof candidate.rrf === \"object\" &&\n typeof (candidate.rrf as Record<string, unknown>).totalScore === \"number\"\n ? ((candidate.rrf as Record<string, unknown>).totalScore as number)\n : undefined;\n const rrfObj =\n candidate.rrf && typeof candidate.rrf === \"object\"\n ? (candidate.rrf as Record<string, unknown>)\n : undefined;\n const parsed: QmdSearchExplain = {\n ftsScores: parseExplainScores(candidate.ftsScores),\n vectorScores: parseExplainScores(candidate.vectorScores),\n rrf,\n rrfRank: typeof rrfObj?.rank === \"number\" ? rrfObj.rank : undefined,\n rrfPositionScore:\n typeof rrfObj?.positionScore === \"number\" ? rrfObj.positionScore : undefined,\n rrfBaseScore: typeof rrfObj?.baseScore === \"number\" ? rrfObj.baseScore : undefined,\n rrfTopRankBonus:\n typeof rrfObj?.topRankBonus === \"number\" ? rrfObj.topRankBonus : undefined,\n rerankScore: typeof candidate.rerankScore === \"number\" ? candidate.rerankScore : undefined,\n blendedScore: typeof candidate.blendedScore === \"number\" ? candidate.blendedScore : undefined,\n };\n return Object.values(parsed).some((entry) => entry !== undefined) ? parsed : undefined;\n}\n\nclass AsyncMutex {\n private locked = false;\n private queue: Array<{\n resolve: (release: () => void) => void;\n reject: (reason: Error) => void;\n signal?: AbortSignal;\n onAbort: () => void;\n }> = [];\n\n async runExclusive<T>(fn: () => Promise<T>, signal?: AbortSignal): Promise<T> {\n const release = await this.acquire(signal);\n try {\n throwIfAborted(signal);\n return await fn();\n } finally {\n release();\n }\n }\n\n private acquire(signal?: AbortSignal): Promise<() => void> {\n throwIfAborted(signal);\n if (!this.locked) {\n this.locked = true;\n return Promise.resolve(() => this.release());\n }\n\n return new Promise((resolve, reject) => {\n const waiter = {\n resolve: (release: () => void) => {\n signal?.removeEventListener(\"abort\", waiter.onAbort);\n resolve(release);\n },\n reject: (reason: Error) => {\n signal?.removeEventListener(\"abort\", waiter.onAbort);\n reject(reason);\n },\n signal,\n onAbort: () => {\n this.queue = this.queue.filter((entry) => entry !== waiter);\n reject(abortError(\"operation aborted while waiting for qmd mutex\"));\n },\n };\n signal?.addEventListener(\"abort\", waiter.onAbort, { once: true });\n this.queue.push(waiter);\n });\n }\n\n private release(): void {\n while (this.queue.length > 0) {\n const next = this.queue.shift();\n if (!next) break;\n if (next.signal?.aborted) {\n next.reject(abortError(\"operation aborted while waiting for qmd mutex\"));\n continue;\n }\n this.locked = true;\n next.resolve(() => this.release());\n return;\n }\n this.locked = false;\n }\n}\n\nconst QMD_MUTEX = new AsyncMutex();\n\nfunction runQmd(\n args: string[],\n timeoutMs: number = QMD_TIMEOUT_MS,\n qmdPath: string = \"qmd\",\n signal?: AbortSignal,\n runtimeEnv?: QmdRuntimeEnv,\n): Promise<{ stdout: string; stderr: string }> {\n // Serialize all qmd calls. This avoids SQLite lock contention when multiple\n // channels/agents trigger QMD operations at nearly the same time.\n return QMD_MUTEX.runExclusive(async () => {\n throwIfAborted(signal, `qmd ${args.join(\" \")} aborted before start`);\n const maxAttempts = isLikelyWriteCommand(args) ? 3 : 1;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await runQmdOnce(args, timeoutMs, qmdPath, signal, runtimeEnv);\n } catch (err) {\n if (isAbortError(err)) throw err;\n const msg = err instanceof Error ? err.message : String(err);\n if (attempt < maxAttempts && isSqliteBusyError(msg)) {\n // Another qmd call (or an external qmd process) currently holds the DB.\n // Back off briefly and retry.\n await sleepWithSignal(1500 * attempt, signal);\n continue;\n }\n throw err;\n }\n }\n // unreachable\n throw new Error(\"qmd command failed\");\n }, signal);\n}\n\nfunction isLikelyWriteCommand(args: string[]): boolean {\n const cmd = getQmdCommandName(args);\n return cmd === \"update\" || cmd === \"embed\" || cmd === \"cleanup\" || cmd === \"collection\";\n}\n\nexport function getQmdCommandName(args: string[]): string {\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i] ?? \"\";\n if (arg === \"--index\") {\n i += 1;\n continue;\n }\n if (arg.startsWith(\"--index=\")) {\n continue;\n }\n if (arg.startsWith(\"-\")) {\n continue;\n }\n return arg;\n }\n return \"\";\n}\n\nfunction runQmdOnce(\n args: string[],\n timeoutMs: number,\n qmdPath: string,\n signal?: AbortSignal,\n runtimeEnv?: QmdRuntimeEnv,\n): Promise<{ stdout: string; stderr: string }> {\n const isVersionCheck = args.length === 1 && args[0] === \"--version\";\n return runCommandWithTimeout(qmdPath, args, {\n timeoutMs,\n signal,\n env: runtimeEnv,\n label: `qmd ${args.join(\" \")}`,\n isSuccessExitCode: (code) => code === 0 || (isVersionCheck && code === 1),\n });\n}\n\nfunction runCommandWithTimeout(\n command: string,\n args: string[],\n options: {\n timeoutMs: number;\n signal?: AbortSignal;\n env?: QmdRuntimeEnv;\n label?: string;\n isSuccessExitCode?: (code: number | null) => boolean;\n },\n): Promise<{ stdout: string; stderr: string }> {\n const label = options.label ?? `${command} ${args.join(\" \")}`;\n const isSuccessExitCode = options.isSuccessExitCode ?? ((code: number | null) => code === 0);\n return new Promise((resolve, reject) => {\n throwIfAborted(options.signal, `${label} aborted before spawn`);\n const child = launchProcess(command, args, {\n env: mergeEnv({ NO_COLOR: \"1\", ...options.env }),\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n if (!child.stdout || !child.stderr) {\n reject(new Error(`${label} failed to open stdio pipes`));\n return;\n }\n\n let stdout = \"\";\n let stderr = \"\";\n let settled = false;\n\n const timer = setTimeout(() => {\n settled = true;\n cleanup();\n child.kill(\"SIGKILL\");\n // Flag the deadline breach so classifyProbeFailure can tell a genuine\n // timeout from a non-zero-exit error whose message merely embeds stderr.\n reject(\n Object.assign(new Error(`${label} timed out after ${options.timeoutMs}ms`), {\n timedOut: true as const,\n }),\n );\n }, options.timeoutMs);\n const onAbort = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n cleanup();\n child.kill(\"SIGKILL\");\n reject(abortError(`${label} aborted`));\n };\n const cleanup = () => {\n options.signal?.removeEventListener(\"abort\", onAbort);\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n child.stdout.on(\"data\", (data: Buffer) => {\n stdout += data.toString();\n });\n child.stderr.on(\"data\", (data: Buffer) => {\n stderr += data.toString();\n });\n child.on(\"error\", (err) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n cleanup();\n reject(err);\n });\n child.on(\"close\", (code) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n cleanup();\n if (isSuccessExitCode(code)) {\n resolve({ stdout, stderr });\n } else {\n reject(\n new Error(\n `${label} failed (code ${code}): ${truncateForLog(stderr || stdout)}`,\n ),\n );\n }\n });\n });\n}\n\nfunction runProcessCommand(\n command: string,\n args: string[],\n timeoutMs: number,\n signal?: AbortSignal,\n): Promise<{ stdout: string; stderr: string }> {\n return runCommandWithTimeout(command, args, {\n timeoutMs,\n signal,\n });\n}\n\n// ---------------------------------------------------------------------------\n// QMD Stdio Daemon Session (MCP over stdio child process)\n// ---------------------------------------------------------------------------\n\nlet nextJsonRpcId = 1;\n\nclass QmdDaemonSession {\n private child: CommandChildProcess | null = null;\n private initialized = false;\n private buffer = \"\";\n private startPromise: Promise<boolean> | null = null;\n private pendingRequests = new Map<\n number,\n {\n resolve: (value: unknown) => void;\n reject: (reason: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n cleanup: () => void;\n }\n >();\n private readonly qmdPath: string;\n private readonly runtimeEnv: QmdRuntimeEnv;\n private readonly indexName?: string;\n\n constructor(qmdPath: string, runtimeEnv: QmdRuntimeEnv = {}, indexName?: string) {\n this.qmdPath = qmdPath;\n this.runtimeEnv = runtimeEnv;\n this.indexName = indexName?.trim() || undefined;\n }\n\n /** Spawn the qmd mcp child process and perform MCP handshake. */\n async start(): Promise<boolean> {\n if (this.child && !this.child.killed && this.initialized) {\n return true;\n }\n if (this.startPromise) {\n return this.startPromise;\n }\n this.startPromise = (async () => {\n // Reuse already-running uninitialized process to avoid zombie accumulation.\n const processAlreadyRunning = this.child != null && !this.child.killed;\n if (!processAlreadyRunning) {\n if (this.child) {\n this.cleanup({ killChild: true });\n }\n try {\n const args = this.indexName ? [\"--index\", this.indexName, \"mcp\"] : [\"mcp\"];\n const child = launchProcess(this.qmdPath, args, {\n env: mergeEnv({ NO_COLOR: \"1\", ...this.runtimeEnv }),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n this.child = child;\n this.buffer = \"\";\n\n child.stdout?.on(\"data\", (data: Buffer) => {\n if (this.child !== child) return;\n this.handleStdoutData(data);\n });\n child.stderr?.on(\"data\", (data: Buffer) => {\n if (this.child !== child) return;\n const msg = data.toString().trim();\n if (msg) log.debug(`QMD mcp stderr: ${stripControlChars(msg)}`);\n });\n child.stdin?.on(\"error\", (err) => {\n // Swallow EPIPE/ERR_STREAM_DESTROYED from killed child processes.\n log.debug(`QMD mcp stdin error (suppressed): ${err.message}`);\n });\n child.on(\"error\", (err) => {\n if (this.child !== child) return;\n log.debug(`QMD mcp process error: ${err.message}`);\n this.cleanup({ child });\n });\n child.on(\"close\", (code) => {\n if (this.child !== child) return;\n log.debug(`QMD mcp process exited (code ${code})`);\n this.cleanup({ child });\n });\n } catch (err) {\n log.debug(`QMD mcp: failed to spawn process: ${err}`);\n this.cleanup({ killChild: true });\n return false;\n }\n } else {\n log.debug(\"QMD mcp: process already running, retrying handshake\");\n }\n\n try {\n // Use a generous timeout — large collections (75K+ files) can take 60-90s\n // to load their vector index. We keep the process alive across retries so\n // only one mcp instance is running at a time.\n const result = await this.sendRequest(\n \"initialize\",\n {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: \"openclaw-remnic\", version: \"1.0.0\" },\n },\n 60_000,\n );\n if (!result) {\n // Null result (non-timeout failure) — kill and let the next probe respawn.\n this.cleanup({ killChild: true });\n return false;\n }\n this.sendNotification(\"notifications/initialized\");\n this.initialized = true;\n log.info(\"QMD mcp: stdio session initialized\");\n return true;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (/timed out/i.test(msg)) {\n // Handshake timeout — process is still loading. Keep it alive for the\n // next retry (daemonRecheckIntervalMs). Do NOT kill and respawn.\n log.debug(`QMD mcp: handshake timed out — process still loading, will retry later`);\n // Reset initialized flag but leave child running.\n this.initialized = false;\n } else {\n log.debug(`QMD mcp: failed to start stdio session: ${err}`);\n this.cleanup({ killChild: true });\n }\n return false;\n } finally {\n this.startPromise = null;\n }\n })();\n return this.startPromise;\n }\n\n /** Call an MCP tool and return the parsed result. */\n async callTool(\n name: string,\n args: Record<string, unknown>,\n timeoutMs: number = 30_000,\n signal?: AbortSignal,\n ): Promise<unknown> {\n if (!this.child || this.child.killed || !this.initialized) {\n throw new Error(\"QMD mcp process not running\");\n }\n return this.sendRequest(\"tools/call\", { name, arguments: args }, timeoutMs, signal);\n }\n\n /** Kill stdio process and clear state so the next probe can restart. */\n invalidate(): void {\n this.cleanup({ killChild: true });\n }\n\n /** Kill stdio process and wait briefly for the child handle to close. */\n async close(timeoutMs = 1_000): Promise<void> {\n const target = this.child;\n if (!target) {\n this.cleanup({ killChild: true });\n return;\n }\n\n let closed = false;\n const closedPromise = new Promise<void>((resolve) => {\n target.once(\"close\", () => {\n closed = true;\n resolve();\n });\n });\n\n this.cleanup({ killChild: true });\n await Promise.race([closedPromise, sleep(timeoutMs)]);\n if (!closed) {\n try {\n target.kill(\"SIGKILL\");\n } catch {\n // Ignore process-kill races during shutdown.\n }\n await Promise.race([closedPromise, sleep(250)]);\n }\n }\n\n isActive(): boolean {\n return this.child !== null && !this.child.killed && this.initialized;\n }\n\n /** True while the process is spawned but the MCP handshake has not yet completed. */\n isLoading(): boolean {\n return this.child !== null && !this.child.killed && !this.initialized;\n }\n\n private sendRequest(\n method: string,\n params: Record<string, unknown>,\n timeoutMs: number,\n signal?: AbortSignal,\n ): Promise<unknown> {\n return new Promise((resolve, reject) => {\n throwIfAborted(signal, `QMD mcp ${method} aborted before request`);\n if (!this.child || !this.child.stdin || this.child.killed) {\n reject(new Error(\"QMD mcp process not available\"));\n return;\n }\n\n const id = nextJsonRpcId++;\n const timer = setTimeout(() => {\n this.pendingRequests.delete(id);\n cleanup();\n reject(new Error(`QMD mcp ${method} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n const onAbort = () => {\n clearTimeout(timer);\n this.pendingRequests.delete(id);\n cleanup();\n reject(abortError(`QMD mcp ${method} aborted`));\n };\n const cleanup = () => {\n signal?.removeEventListener(\"abort\", onAbort);\n };\n\n this.pendingRequests.set(id, { resolve, reject, timer, cleanup });\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n const message = JSON.stringify({ jsonrpc: \"2.0\", id, method, params }) + \"\\n\";\n this.child.stdin.write(message, (err) => {\n if (err) {\n clearTimeout(timer);\n this.pendingRequests.delete(id);\n cleanup();\n reject(new Error(`Failed to write to QMD mcp stdin: ${err.message}`));\n }\n });\n });\n }\n\n private sendNotification(method: string, params?: Record<string, unknown>): void {\n if (!this.child || !this.child.stdin || this.child.killed) return;\n if (this.child.stdin.destroyed) return;\n const msg: Record<string, unknown> = { jsonrpc: \"2.0\", method };\n if (params) msg.params = params;\n try {\n this.child.stdin.write(JSON.stringify(msg) + \"\\n\");\n } catch {\n // Ignore EPIPE / write-after-close\n }\n }\n\n private handleStdoutData(data: Buffer): void {\n this.buffer += data.toString();\n let newlineIdx: number;\n while ((newlineIdx = this.buffer.indexOf(\"\\n\")) !== -1) {\n const line = this.buffer.slice(0, newlineIdx).trim();\n this.buffer = this.buffer.slice(newlineIdx + 1);\n if (!line) continue;\n try {\n const msg = JSON.parse(line);\n this.handleMessage(msg);\n } catch {\n log.debug(`QMD mcp: unparseable stdout: ${truncateForLog(line, 200)}`);\n }\n }\n }\n\n private handleMessage(msg: Record<string, unknown>): void {\n if (msg.id !== undefined && msg.id !== null) {\n const pending = this.pendingRequests.get(msg.id as number);\n if (pending) {\n clearTimeout(pending.timer);\n this.pendingRequests.delete(msg.id as number);\n pending.cleanup();\n if (msg.error) {\n pending.reject(new Error(JSON.stringify(msg.error)));\n } else {\n pending.resolve(msg.result);\n }\n }\n return;\n }\n if (msg.method) {\n log.debug(`QMD mcp notification: ${msg.method}`);\n }\n }\n\n private cleanup(opts?: { killChild?: boolean; child?: CommandChildProcess | null }): void {\n const target = opts?.child ?? this.child;\n if (!target) return;\n if (opts?.child && this.child !== opts.child) {\n return;\n }\n if (opts?.killChild && !target.killed) {\n target.kill(\"SIGTERM\");\n }\n this.initialized = false;\n for (const [, pending] of this.pendingRequests) {\n clearTimeout(pending.timer);\n pending.cleanup();\n pending.reject(new Error(\"QMD mcp process terminated\"));\n }\n this.pendingRequests.clear();\n this.startPromise = null;\n this.child = null;\n this.buffer = \"\";\n }\n}\n\n/** Matches `#<hex-docid> <score>% <rest-of-line>` — rest is split in a second pass. */\nconst QMD_RESULT_LINE_RE = /^#([0-9a-fA-F]+)\\s+(\\d+)%\\s+(.+)/;\n\n/**\n * Splits `collection/path.ext - Title text` into path and title.\n * Non-greedy `.+?` finds the FIRST dot-extension (2+ alphabetic chars)\n * followed by ` - `, accepting any indexed file type while skipping\n * version-like segments (e.g. `v1.2` where `.2` is a single digit).\n */\nconst QMD_PATH_TITLE_RE = /^(.+?\\.[a-zA-Z]{2,10})\\s+-\\s+(.*)$/;\n\nfunction parseQmdMarkdownResultText(\n text: string,\n transport: QmdSearchResult[\"transport\"],\n): QmdSearchResult[] {\n const results: QmdSearchResult[] = [];\n for (const line of text.split(\"\\n\")) {\n const m = QMD_RESULT_LINE_RE.exec(line.trim());\n if (!m) continue;\n const rest = m[3]; // \"collection/path.md - Title with - dashes\"\n // Find the path by looking for known file extensions followed by \" - \"\n const pathTitleSplit = QMD_PATH_TITLE_RE.exec(rest);\n if (!pathTitleSplit) continue;\n results.push({\n docid: m[1],\n path: pathTitleSplit[1] ?? \"unknown\",\n snippet: \"\",\n score: parseInt(m[2], 10) / 100,\n transport,\n });\n }\n return results;\n}\n\nfunction parseMcpSearchResult(\n result: unknown,\n transport: QmdSearchResult[\"transport\"] = \"daemon\",\n): QmdSearchResult[] {\n const resultObj = result as Record<string, unknown> | null;\n if (!resultObj) return [];\n const results: QmdSearchResult[] = [];\n const pushDocs = (docs: unknown[]) => {\n for (const doc of docs) {\n const d = doc as Record<string, unknown>;\n results.push({\n docid: typeof d.docid === \"string\" ? d.docid.replace(/^#/, \"\") : \"\",\n path: typeof d.file === \"string\"\n ? d.file\n : typeof d.path === \"string\"\n ? d.path\n : (typeof d.docid === \"string\" ? d.docid.replace(/^#/, \"\") : \"unknown\"),\n snippet: typeof d.snippet === \"string\" ? d.snippet : \"\",\n score: typeof d.score === \"number\" ? d.score : 0,\n line: typeof d.line === \"number\" && Number.isFinite(d.line)\n ? Math.max(1, Math.floor(d.line))\n : undefined,\n explain: parseQmdExplain(d.explain),\n transport,\n });\n }\n };\n const topStructured = resultObj.structuredContent as Record<string, unknown> | undefined;\n const topDocs = topStructured?.results ?? topStructured?.documents;\n if (Array.isArray(topDocs)) pushDocs(topDocs);\n const content = resultObj.content;\n if (Array.isArray(content)) {\n for (const item of content) {\n const structured = item?.structuredContent;\n const docResults = structured?.results ?? structured?.documents;\n if (Array.isArray(docResults)) pushDocs(docResults);\n if (typeof item?.text === \"string\") {\n try {\n const parsed = JSON.parse(item.text);\n const textResults = parsed?.results ?? parsed?.documents;\n if (Array.isArray(textResults)) pushDocs(textResults);\n } catch {\n const existingKeys = new Set(results.map((r) => `${r.docid.toLowerCase()}|${r.path}`));\n const parsed = parseQmdMarkdownResultText(item.text, transport);\n for (const p of parsed) {\n const key = `${p.docid.toLowerCase()}|${p.path}`;\n if (!existingKeys.has(key)) {\n results.push(p);\n existingKeys.add(key);\n }\n }\n }\n }\n }\n }\n return results;\n}\n\nfunction parseQmdSearchStdout(\n stdout: string,\n transport: QmdSearchResult[\"transport\"] = \"subprocess\",\n): QmdSearchResult[] {\n const trimmedOut = stdout.trim();\n if (!trimmedOut || trimmedOut === \"No results found.\") return [];\n const parsed = JSON.parse(trimmedOut);\n if (!Array.isArray(parsed)) return [];\n return parsed.map(\n (entry: Record<string, unknown>): QmdSearchResult => ({\n docid: (entry.docid as string) ?? \"\",\n path:\n (entry.file as string) ??\n (entry.path as string) ??\n (entry.docid as string) ??\n \"unknown\",\n snippet: (entry.snippet as string) ?? \"\",\n score: typeof entry.score === \"number\" ? entry.score : 0,\n line: typeof entry.line === \"number\" && Number.isFinite(entry.line)\n ? Math.max(1, Math.floor(entry.line))\n : undefined,\n explain: parseQmdExplain(entry.explain),\n transport,\n }),\n );\n}\n\ntype SharedDaemonSessionEntry = {\n refs: number;\n session: QmdDaemonSession;\n};\n\nconst SHARED_DAEMON_SESSIONS = new Map<string, SharedDaemonSessionEntry>();\n\nfunction stableRuntimeEnvKey(runtimeEnv: QmdRuntimeEnv): string {\n return JSON.stringify(\n Object.keys(runtimeEnv)\n .sort()\n .map((key) => [key, runtimeEnv[key]]),\n );\n}\n\nfunction recordAutoUpgradeStatus(\n state: QmdGlobalState,\n targetKey: string,\n status: string,\n): void {\n state.lastAutoUpgradeStatusByTarget[targetKey] = status;\n state.lastAutoUpgradeStatus = status;\n}\n\nfunction retainSharedDaemonSession(\n qmdPath: string,\n runtimeEnv: QmdRuntimeEnv = {},\n indexName?: string,\n cliVersion?: string | null,\n): QmdDaemonSession {\n const normalizedPath = qmdPath.trim() || \"qmd\";\n const normalizedIndex = indexName?.trim() || \"\";\n const normalizedVersion = cliVersion?.trim() || \"\";\n const sessionKey = `${normalizedPath}\\0${normalizedIndex}\\0${normalizedVersion}\\0${stableRuntimeEnvKey(runtimeEnv)}`;\n const existing = SHARED_DAEMON_SESSIONS.get(sessionKey);\n if (existing) {\n existing.refs += 1;\n return existing.session;\n }\n\n const session = new QmdDaemonSession(normalizedPath, runtimeEnv, normalizedIndex || undefined);\n SHARED_DAEMON_SESSIONS.set(sessionKey, {\n refs: 1,\n session,\n });\n return session;\n}\n\nasync function releaseSharedDaemonSession(session: QmdDaemonSession | null): Promise<void> {\n if (!session) return;\n\n for (const [qmdPath, entry] of SHARED_DAEMON_SESSIONS.entries()) {\n if (entry.session !== session) continue;\n entry.refs = Math.max(0, entry.refs - 1);\n if (entry.refs === 0) {\n SHARED_DAEMON_SESSIONS.delete(qmdPath);\n await entry.session.close();\n }\n return;\n }\n}\n\n// Test-only seams (#1537): lifecycle tests assert the pool reaches zero after\n// every holder disposes — the property the stop()-teardown fix restores.\nexport const sharedDaemonSessionCountForTest = (): number => SHARED_DAEMON_SESSIONS.size;\nexport { retainSharedDaemonSession as retainSharedDaemonSessionForTest };\nexport { releaseSharedDaemonSession as releaseSharedDaemonSessionForTest };\n\n// ---------------------------------------------------------------------------\n// QmdClient\n// ---------------------------------------------------------------------------\n\nexport class QmdClient implements SearchBackend {\n private available: boolean | null = null;\n private _lastUpdateFailAtMs: number | null = null;\n private lastEmbedFailAtMs: number | null = null;\n private lastUpdateRunAtMs: number | null = null;\n\n get lastUpdateFailedAtMs(): number | null {\n return this._lastUpdateFailAtMs;\n }\n\n get lastUpdateRanAtMs(): number | null {\n return this.lastUpdateRunAtMs;\n }\n\n resetUpdateThrottles(): void {\n this._lastUpdateFailAtMs = null;\n this.lastUpdateRunAtMs = null;\n this.lastEmbedFailAtMs = null;\n const gs = getGlobalQmdState();\n gs.lastGlobalUpdateRunAtMs = null;\n gs.lastGlobalUpdateFailAtMs = null;\n gs.lastGlobalEmbedRunAtMs = null;\n gs.lastGlobalEmbedFailAtMs = null;\n gs.lastEmbedByCollectionMs = {};\n gs.lastEmbedFailByCollectionMs = {};\n }\n\n private readonly updateTimeoutMs: number;\n private readonly updateMinIntervalMs: number;\n private readonly slowLog?: { enabled: boolean; thresholdMs: number };\n private readonly configuredQmdPath?: string;\n private readonly qmdSupportedVersion: string;\n private readonly qmdAutoUpgradeEnabled: boolean;\n private readonly qmdAutoUpgradeCheckIntervalMs: number;\n private readonly qmdChunkStrategy?: QmdChunkStrategy;\n private readonly qmdCandidateLimit?: number;\n private readonly qmdQueryRerankEnabled: boolean;\n private readonly qmdIndexName?: string;\n private readonly qmdSearchStrategy: QmdSearchStrategy;\n private readonly qmdSubprocessStrategy: QmdSubprocessStrategy;\n private readonly qmdFallbackPaths: string[];\n private readonly daemonTimeoutMs: number;\n private readonly qmdRuntimeEnv: QmdRuntimeEnv;\n private qmdPathSource: \"auto-path\" | \"auto-fallback\" | \"configured\" = \"auto-path\";\n private cliVersion: string | null = null;\n private lastCliProbeError: string | null = null;\n private qmdCapabilities: QmdCapabilities = resolveQmdCapabilities(null);\n\n // Daemon mode fields\n private daemonSession: QmdDaemonSession | null = null;\n private daemonAvailable = false;\n private daemonSessionPath: string | null = null;\n private lastDaemonCheckAtMs = 0;\n private readonly daemonEnabled: boolean;\n private readonly daemonRecheckIntervalMs: number;\n /** Consecutive transient daemon failures before invalidating the session. */\n private daemonTransientFailures = 0;\n private static readonly DAEMON_MAX_TRANSIENT_FAILURES = 3;\n\n constructor(\n private readonly collection: string,\n private readonly maxResults: number,\n opts?: QmdClientOptions,\n ) {\n this.slowLog = opts?.slowLog;\n this.updateTimeoutMs = opts?.updateTimeoutMs ?? 120_000;\n this.updateMinIntervalMs = Math.max(0, opts?.updateMinIntervalMs ?? 15 * 60_000);\n this.configuredQmdPath = opts?.qmdPath?.trim() ? opts.qmdPath.trim() : undefined;\n this.qmdSupportedVersion =\n parseQmdVersion(opts?.qmdSupportedVersion ?? null) !== null\n ? (opts?.qmdSupportedVersion ?? QMD_SUPPORTED_VERSION)\n : QMD_SUPPORTED_VERSION;\n this.qmdAutoUpgradeEnabled = opts?.qmdAutoUpgradeEnabled === true;\n this.qmdAutoUpgradeCheckIntervalMs = Math.max(\n 60_000,\n Math.floor(opts?.qmdAutoUpgradeCheckIntervalMs ?? QMD_AUTO_UPGRADE_CHECK_INTERVAL_MS),\n );\n this.qmdChunkStrategy =\n opts?.qmdChunkStrategy === \"auto\" || opts?.qmdChunkStrategy === \"regex\"\n ? opts.qmdChunkStrategy\n : undefined;\n this.qmdCandidateLimit =\n typeof opts?.qmdCandidateLimit === \"number\" &&\n Number.isFinite(opts.qmdCandidateLimit) &&\n opts.qmdCandidateLimit > 0\n ? Math.floor(opts.qmdCandidateLimit)\n : undefined;\n this.qmdQueryRerankEnabled = opts?.qmdQueryRerankEnabled !== false;\n this.qmdIndexName = opts?.qmdIndexName?.trim() || undefined;\n // Default \"hybrid\" preserves the historical lex+vec+hyde daemon plan. Issue #1335.\n this.qmdSearchStrategy =\n opts?.qmdSearchStrategy === \"lex\" || opts?.qmdSearchStrategy === \"lex-vec\"\n ? opts.qmdSearchStrategy\n : \"hybrid\";\n // Default \"query\" keeps `qmd query` (LLM expansion + rerank) per gotcha #7. Issue #1335.\n this.qmdSubprocessStrategy = opts?.qmdSubprocessStrategy === \"search\" ? \"search\" : \"query\";\n this.qmdFallbackPaths = opts?.qmdFallbackPaths\n ? opts.qmdFallbackPaths.map((candidate) => candidate.trim()).filter(Boolean)\n : QMD_FALLBACK_PATHS;\n // Default 8000ms preserves the historical hardcoded daemon timeout. Issue #1335.\n // Floor of 1000ms avoids absurdly small values; callers wanting CPU-only HyDE\n // headroom can raise this (e.g. 20000) without code changes.\n this.daemonTimeoutMs =\n typeof opts?.qmdDaemonTimeoutMs === \"number\" && Number.isFinite(opts.qmdDaemonTimeoutMs)\n ? Math.max(1_000, Math.floor(opts.qmdDaemonTimeoutMs))\n : QMD_DAEMON_TIMEOUT_MS;\n this.qmdRuntimeEnv = this.buildRuntimeEnv(opts);\n if (this.configuredQmdPath) {\n this.qmdPath = this.configuredQmdPath;\n this.qmdPathSource = \"configured\";\n }\n this.daemonEnabled = Boolean(opts?.daemonUrl);\n this.daemonRecheckIntervalMs = opts?.daemonRecheckIntervalMs ?? 15_000;\n }\n\n private qmdPath: string = \"qmd\";\n\n private buildRuntimeEnv(opts?: QmdClientOptions): QmdRuntimeEnv {\n const env: QmdRuntimeEnv = {};\n if (opts?.qmdForceCpu === true) {\n env.QMD_FORCE_CPU = \"1\";\n }\n if (opts?.qmdGpuBackend) {\n env.QMD_LLAMA_GPU = opts.qmdGpuBackend;\n }\n if (\n typeof opts?.qmdEmbedParallelism === \"number\" &&\n Number.isFinite(opts.qmdEmbedParallelism) &&\n opts.qmdEmbedParallelism > 0\n ) {\n env.QMD_EMBED_PARALLELISM = String(Math.min(8, Math.max(1, Math.floor(opts.qmdEmbedParallelism))));\n }\n if (opts?.qmdEmbedModel?.trim()) {\n env.QMD_EMBED_MODEL = opts.qmdEmbedModel.trim();\n }\n if (opts?.qmdRerankModel?.trim()) {\n env.QMD_RERANK_MODEL = opts.qmdRerankModel.trim();\n }\n if (opts?.qmdGenerateModel?.trim()) {\n env.QMD_GENERATE_MODEL = opts.qmdGenerateModel.trim();\n }\n return env;\n }\n\n async probe(): Promise<boolean> {\n const cliOk = await this.probeCli();\n if (this.daemonEnabled) {\n await this.probeDaemon();\n }\n return cliOk || this.daemonAvailable;\n }\n\n async checkAvailability(execution?: SearchExecutionOptions): Promise<boolean> {\n const cliAvailable = await this.probeCli({\n allowAutoUpgrade: false,\n preserveStateOnFailure: true,\n signal: execution?.signal,\n });\n if (this.daemonAvailable && this.daemonSession?.isActive()) {\n return true;\n }\n if (this.daemonAvailable) {\n this.daemonAvailable = false;\n this.lastDaemonCheckAtMs = 0;\n }\n return cliAvailable;\n }\n\n private async probeDaemon(): Promise<boolean> {\n this.lastDaemonCheckAtMs = Date.now();\n const normalizedPath = this.qmdPath.trim() || \"qmd\";\n const daemonIndexName =\n this.qmdIndexName && this.qmdCapabilities.mcpIndexSelection\n ? this.qmdIndexName\n : undefined;\n const daemonSessionPath = `${normalizedPath}\\0${daemonIndexName ?? \"\"}\\0${this.cliVersion ?? \"\"}`;\n if (!this.daemonSession || this.daemonSessionPath !== daemonSessionPath) {\n await releaseSharedDaemonSession(this.daemonSession);\n this.daemonSession = retainSharedDaemonSession(\n normalizedPath,\n this.qmdRuntimeEnv,\n daemonIndexName,\n this.cliVersion,\n );\n this.daemonSessionPath = daemonSessionPath;\n }\n try {\n // Race start() against a short window: fail fast if still loading; the\n // underlying promise continues so the process is NOT killed.\n const PROBE_QUICK_TIMEOUT_MS = 3_000;\n const ok = await Promise.race([\n this.daemonSession.start(),\n new Promise<false>((resolve) => setTimeout(() => resolve(false), PROBE_QUICK_TIMEOUT_MS)),\n ]);\n if (!ok) {\n const loading = this.daemonSession.isLoading();\n log.debug(`QMD daemon: stdio session not ready within ${PROBE_QUICK_TIMEOUT_MS}ms probe window${loading ? \" (still loading)\" : \"\"}`);\n this.daemonAvailable = false;\n return false;\n }\n log.info(`QMD daemon: stdio session active (collection=${this.collection})`);\n this.daemonAvailable = true;\n this.daemonTransientFailures = 0;\n return true;\n } catch (err) {\n log.debug(`QMD daemon: probe failed: ${err}`);\n this.daemonAvailable = false;\n return false;\n }\n }\n\n /**\n * Run a single `qmd --version` probe against `qmdPath`. Extracted as its own\n * method so tests can inject a fake probe runner that exercises the preflight\n * retry/classification paths without spawning a real qmd binary. Issue #1841.\n */\n private runVersionProbe(\n qmdPath: string,\n signal?: AbortSignal,\n ): Promise<{ stdout: string; stderr: string }> {\n return runQmd([\"--version\"], QMD_PROBE_TIMEOUT_MS, qmdPath, signal, this.qmdRuntimeEnv);\n }\n\n private async probeCli(\n options: {\n allowAutoUpgrade?: boolean;\n preserveStateOnFailure?: boolean;\n signal?: AbortSignal;\n } = {},\n ): Promise<boolean> {\n const priorState = options.preserveStateOnFailure === true\n ? {\n available: this.available,\n qmdPath: this.qmdPath,\n qmdPathSource: this.qmdPathSource,\n cliVersion: this.cliVersion,\n lastCliProbeError: this.lastCliProbeError,\n qmdCapabilities: this.qmdCapabilities,\n }\n : null;\n const restorePriorState = (): void => {\n if (!priorState) return;\n this.available = priorState.available;\n this.qmdPath = priorState.qmdPath;\n this.qmdPathSource = priorState.qmdPathSource;\n this.cliVersion = priorState.cliVersion;\n this.lastCliProbeError = priorState.lastCliProbeError;\n this.qmdCapabilities = priorState.qmdCapabilities;\n };\n let configuredProbeFailure: string | null = null;\n const markProbeFailure = (err: unknown): void => {\n this.lastCliProbeError = err instanceof Error ? err.message : String(err);\n };\n const restoreConfiguredProbeFailure = (): void => {\n if (!this.configuredQmdPath || !configuredProbeFailure) return;\n this.qmdPath = this.configuredQmdPath;\n this.qmdPathSource = \"configured\";\n this.lastCliProbeError = configuredProbeFailure;\n };\n const recordProbeSuccess = async (\n result: { stdout: string; stderr: string },\n qmdPath: string,\n source: typeof this.qmdPathSource,\n ): Promise<void> => {\n this.available = true;\n this.qmdPath = qmdPath;\n this.qmdPathSource = source;\n this.cliVersion = parseQmdVersionOutput(result.stdout, result.stderr);\n this.qmdCapabilities = resolveQmdCapabilities(this.cliVersion);\n this.lastCliProbeError = null;\n if (options.allowAutoUpgrade !== false) {\n await this.maybeAutoUpgradeQmd();\n }\n };\n\n if (this.configuredQmdPath) {\n const configuredPath = this.configuredQmdPath;\n // Retry only transient probes; ENOENT/EACCES is a hard misconfiguration (#1841).\n let failureKind: QmdProbeFailureKind = \"other\";\n let retries = 0;\n let callerCancelled = false;\n for (let attempt = 0; attempt <= QMD_PROBE_RETRY_BACKOFF_MS.length; attempt += 1) {\n try {\n const result = await this.runVersionProbe(configuredPath, options.signal);\n await recordProbeSuccess(result, configuredPath, \"configured\");\n return true;\n } catch (err) {\n markProbeFailure(err);\n configuredProbeFailure = this.lastCliProbeError;\n // Detect caller cancellation first — non-actionable noise (#1841).\n if (isCallerCancellation(err, options.signal)) {\n callerCancelled = true;\n break;\n }\n failureKind = classifyProbeFailure(err);\n // Never retry a hard misconfiguration (missing/not-executable) — only\n // transient slowness. (Caller cancellation is handled above.)\n if (\n failureKind === \"transient\" &&\n attempt < QMD_PROBE_RETRY_BACKOFF_MS.length\n ) {\n try {\n await sleepWithSignal(\n QMD_PROBE_RETRY_BACKOFF_MS[attempt] ?? 500,\n options.signal,\n );\n } catch {\n // Aborted mid-backoff: caller cancelled — stop, emit no warning.\n callerCancelled = true;\n break;\n }\n retries += 1;\n continue;\n }\n break;\n }\n }\n // Distinct warnings for slow binary vs misconfiguration; suppress on caller cancellation (#1841).\n if (!callerCancelled) {\n if (failureKind === \"transient\") {\n this.logCliProbeWarning(\n `QMD: qmdPath ${configuredPath} version check timed out (host may be under load); retried ${retries} time${retries === 1 ? \"\" : \"s\"}`,\n );\n } else if (failureKind === \"missing\") {\n this.logCliProbeWarning(\n `QMD: configured qmdPath not found or not executable (${configuredPath}): ${this.lastCliProbeError}`,\n );\n } else {\n // Preserve the historical generic message for exit-code/other failures.\n this.logCliProbeWarning(\n `QMD: configured qmdPath failed (${configuredPath}): ${this.lastCliProbeError}`,\n );\n }\n }\n }\n\n // Try PATH first\n try {\n const result = await this.runVersionProbe(\"qmd\", options.signal);\n await recordProbeSuccess(result, \"qmd\", \"auto-path\");\n return true;\n } catch (err) {\n markProbeFailure(err);\n // Try fallback paths\n for (const fallbackPath of this.qmdFallbackPaths) {\n try {\n const result = await this.runVersionProbe(fallbackPath, options.signal);\n await recordProbeSuccess(result, fallbackPath, \"auto-fallback\");\n log.info(`QMD: found at ${fallbackPath}`);\n return true;\n } catch (fallbackErr) {\n markProbeFailure(fallbackErr);\n // Continue to next fallback\n }\n }\n if (priorState) {\n restorePriorState();\n } else {\n this.available = false;\n restoreConfiguredProbeFailure();\n }\n return false;\n }\n }\n\n private async maybeAutoUpgradeQmd(): Promise<void> {\n if (!this.qmdAutoUpgradeEnabled) return;\n const state = getGlobalQmdState();\n const targetKey = this.autoUpgradeTargetKey();\n const now = Date.now();\n const lastCheckAtMs = state.lastAutoUpgradeCheckByTargetMs[targetKey];\n if (\n Number.isFinite(lastCheckAtMs) &&\n now - lastCheckAtMs < this.qmdAutoUpgradeCheckIntervalMs\n ) {\n return;\n }\n state.lastAutoUpgradeCheckByTargetMs[targetKey] = now;\n state.lastAutoUpgradeCheckAtMs = now;\n\n const installed = parseQmdVersion(this.cliVersion);\n const supported = parseQmdVersion(this.qmdSupportedVersion);\n if (!installed || !supported) {\n const status = `skipped: unable to parse installed=${this.cliVersion ?? \"unknown\"} supported=${this.qmdSupportedVersion}`;\n recordAutoUpgradeStatus(state, targetKey, status);\n log.warn(`QMD auto-upgrade skipped: ${status}`);\n return;\n }\n if (compareQmdVersions(installed, supported) >= 0) {\n recordAutoUpgradeStatus(\n state,\n targetKey,\n `current: installed=${qmdVersionToString(installed)} supported=${qmdVersionToString(supported)}`,\n );\n return;\n }\n if (this.qmdPathSource === \"configured\") {\n const status = `skipped: configured qmdPath=${this.qmdPath}`;\n recordAutoUpgradeStatus(state, targetKey, status);\n log.warn(\n `QMD auto-upgrade skipped because qmdPath is explicitly configured (${this.qmdPath}); install ${QMD_PACKAGE_NAME}@${this.qmdSupportedVersion} manually for that path.`,\n );\n return;\n }\n\n const packageSpec = `${QMD_PACKAGE_NAME}@${this.qmdSupportedVersion}`;\n try {\n log.warn(\n `QMD auto-upgrade: installed=${qmdVersionToString(installed)} supported=${qmdVersionToString(supported)}; running npm install -g ${packageSpec}`,\n );\n await runProcessCommand(\n \"npm\",\n [\"install\", \"-g\", packageSpec],\n QMD_AUTO_UPGRADE_TIMEOUT_MS,\n );\n const postInstall = await this.probePostInstallQmdVersion(supported);\n this.qmdPath = postInstall.qmdPath;\n this.qmdPathSource = postInstall.source;\n this.cliVersion = postInstall.version;\n this.qmdCapabilities = resolveQmdCapabilities(this.cliVersion);\n await releaseSharedDaemonSession(this.daemonSession);\n this.daemonSession = null;\n this.daemonSessionPath = null;\n this.daemonAvailable = false;\n this.daemonTransientFailures = 0;\n const upgraded = parseQmdVersion(this.cliVersion);\n if (!upgraded || compareQmdVersions(upgraded, supported) < 0) {\n const status = `failed: post-install version=${this.cliVersion ?? \"unknown\"} target=${this.qmdSupportedVersion}`;\n recordAutoUpgradeStatus(state, targetKey, status);\n log.warn(`QMD auto-upgrade did not reach supported version: ${status}`);\n return;\n }\n recordAutoUpgradeStatus(\n state,\n targetKey,\n `upgraded: installed=${this.cliVersion ?? \"unknown\"} target=${this.qmdSupportedVersion}`,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n recordAutoUpgradeStatus(state, targetKey, `failed: ${msg}`);\n log.warn(`QMD auto-upgrade failed: ${msg}`);\n }\n }\n\n private async probePostInstallQmdVersion(supported: QmdVersionTuple): Promise<{\n qmdPath: string;\n source: \"auto-path\" | \"auto-fallback\";\n version: string | null;\n }> {\n let lastErr: unknown;\n let lastResult: { qmdPath: string; source: \"auto-path\" | \"auto-fallback\"; version: string | null } | null = null;\n for (const candidate of getQmdPostInstallProbeTargets(this.qmdPath, this.qmdPathSource)) {\n try {\n const result = await runQmd(\n [\"--version\"],\n QMD_PROBE_TIMEOUT_MS,\n candidate.qmdPath,\n undefined,\n this.qmdRuntimeEnv,\n );\n const postInstall = {\n ...candidate,\n version: parseQmdVersionOutput(result.stdout, result.stderr),\n };\n lastResult = postInstall;\n const parsed = parseQmdVersion(postInstall.version);\n if (parsed && compareQmdVersions(parsed, supported) >= 0) {\n return postInstall;\n }\n } catch (err) {\n lastErr = err;\n }\n }\n if (lastResult) return lastResult;\n throw lastErr instanceof Error ? lastErr : new Error(String(lastErr));\n }\n\n private autoUpgradeTargetKey(): string {\n return JSON.stringify({\n path: this.qmdPath.trim() || \"qmd\",\n source: this.qmdPathSource,\n index: this.qmdIndexName ?? \"\",\n supportedVersion: this.qmdSupportedVersion,\n runtimeEnv: stableRuntimeEnvKey(this.qmdRuntimeEnv),\n });\n }\n\n private logCliProbeWarning(message: string): void {\n const state = getGlobalQmdState();\n const now = Date.now();\n const canWarn =\n state.lastCliWarnAtMs === null || now - state.lastCliWarnAtMs >= QMD_CLI_WARN_THROTTLE_MS;\n if (!canWarn) {\n log.debug(message);\n return;\n }\n state.lastCliWarnAtMs = now;\n if (this.daemonAvailable) {\n // Daemon mode is healthy; keep this as debug noise rather than warning.\n log.debug(message);\n return;\n }\n log.warn(message);\n }\n\n /** Re-probe daemon if it was down and recheck interval has elapsed. */\n private async maybeProbeDaemon(): Promise<void> {\n if (!this.daemonEnabled) return;\n // If daemon is marked healthy and session is active, nothing to do.\n if (this.daemonAvailable && this.daemonSession?.isActive()) return;\n // If recently checked and failed, respect the recheck interval.\n if (this.daemonAvailable === false) {\n const elapsed = Date.now() - this.lastDaemonCheckAtMs;\n if (elapsed < this.daemonRecheckIntervalMs) return;\n }\n this.daemonAvailable = false;\n await this.probeDaemon();\n }\n\n isAvailable(): boolean {\n return this.available === true || this.daemonAvailable;\n }\n\n /** Debug string for troubleshooting availability issues. */\n debugStatus(): string {\n const cliPath = this.available ? this.qmdPath : (this.configuredQmdPath ?? \"unavailable\");\n const cliVersion = this.cliVersion ?? \"unknown\";\n const status = this.getVersionStatus();\n const enabledFeatures = Object.entries(status.capabilities)\n .filter(([key, value]) => key !== \"version\" && key !== \"parsedVersion\" && value === true)\n .map(([key]) => key)\n .join(\",\");\n const globalState = getGlobalQmdState();\n const autoUpgradeStatus =\n globalState.lastAutoUpgradeStatusByTarget[this.autoUpgradeTargetKey()] ??\n globalState.lastAutoUpgradeStatus;\n const probeError = this.lastCliProbeError ? ` cliProbeError=${this.lastCliProbeError}` : \"\";\n return `cli=${this.available} daemon=${this.daemonAvailable} session=${!!this.daemonSession} cliPath=${cliPath} cliPathSource=${this.qmdPathSource} cliVersion=${cliVersion} supportedVersion=${status.supportedVersion} upgradeAvailable=${status.upgradeAvailable} qmdFeatures=${enabledFeatures || \"none\"}${autoUpgradeStatus ? ` autoUpgrade=${autoUpgradeStatus}` : \"\"}${probeError}`;\n }\n\n getVersionStatus(): QmdVersionStatus {\n const installed = parseQmdVersion(this.cliVersion);\n const supported = parseQmdVersion(this.qmdSupportedVersion) ?? parseQmdVersion(QMD_SUPPORTED_VERSION)!;\n const cmp = compareQmdVersions(installed, supported);\n return {\n installedVersion: this.cliVersion,\n supportedVersion: qmdVersionToString(supported),\n supported: installed !== null && cmp >= 0,\n newerThanSupported: installed !== null && cmp > 0,\n upgradeAvailable: installed !== null && cmp < 0,\n capabilities: this.qmdCapabilities,\n };\n }\n\n async doctor(): Promise<QmdDoctorReport> {\n if (!this.isAvailable()) {\n return { available: false, skipped: \"qmd unavailable\" };\n }\n if (!this.qmdCapabilities.doctor) {\n return {\n available: false,\n skipped: `qmd doctor requires qmd >=2.5.0; installed ${this.cliVersion ?? \"unknown\"}`,\n };\n }\n try {\n const { stdout } = await this.runQmdCommand([\"doctor\", \"--json\"], QMD_TIMEOUT_MS);\n const trimmed = stdout.trim();\n if (!trimmed) return { available: true, report: null };\n try {\n return { available: true, report: JSON.parse(trimmed) };\n } catch {\n return { available: true, raw: trimmed };\n }\n } catch (err) {\n return {\n available: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n /**\n * Query QMD collection status for embedding backlog metrics.\n * Runs `qmd status -c <collection>` and parses the text output.\n * Returns null fields when the command fails or output is unparseable.\n */\n async status(): Promise<QmdStatusReport> {\n if (!this.isAvailable()) {\n return EMPTY_QMD_STATUS;\n }\n if (!this.qmdCapabilities.safeStatusDeviceProbe) {\n return EMPTY_QMD_STATUS;\n }\n return fetchQmdStatus((args, timeoutMs) => this.runQmdCommand(args, timeoutMs), this.collection, QMD_TIMEOUT_MS);\n }\n\n isDaemonMode(): boolean {\n return this.daemonAvailable;\n }\n\n async dispose(): Promise<void> {\n await releaseSharedDaemonSession(this.daemonSession);\n this.daemonSession = null;\n this.daemonSessionPath = null;\n this.daemonAvailable = false;\n this.daemonTransientFailures = 0;\n }\n\n /**\n * Record a daemon search success — resets the transient failure counter.\n */\n private recordDaemonSuccess(): void {\n this.daemonTransientFailures = 0;\n }\n\n /**\n * Handle a non-timeout, non-cancellation daemon error.\n * Tolerates up to DAEMON_MAX_TRANSIENT_FAILURES consecutive failures\n * before invalidating the session. This prevents a single transient\n * error from pushing all concurrent searches through the subprocess\n * mutex for the full recheck interval.\n */\n private handleDaemonTransientError(label: string, err: unknown, durationMs: number): void {\n // If daemon was already marked unavailable by a concurrent call, don't\n // increment further — the counter will reset on the next successful probe.\n if (!this.daemonAvailable) {\n log.debug(`QMD daemon ${label} failed after ${durationMs}ms (daemon already unavailable, ignoring): ${err}`);\n return;\n }\n this.daemonTransientFailures += 1;\n if (this.daemonTransientFailures >= QmdClient.DAEMON_MAX_TRANSIENT_FAILURES) {\n log.debug(`QMD daemon ${label} failed after ${durationMs}ms (${this.daemonTransientFailures} consecutive failures, invalidating): ${err}`);\n this.daemonSession?.invalidate();\n this.daemonAvailable = false;\n this.daemonTransientFailures = 0;\n } else {\n log.debug(`QMD daemon ${label} failed after ${durationMs}ms (transient ${this.daemonTransientFailures}/${QmdClient.DAEMON_MAX_TRANSIENT_FAILURES}): ${err}`);\n }\n }\n\n private async runQmdCommand(\n args: string[],\n timeoutMs: number,\n signal?: AbortSignal,\n ): Promise<{ stdout: string; stderr: string }> {\n const commandArgs =\n this.qmdIndexName && this.qmdCapabilities.mcpIndexSelection\n ? [\"--index\", this.qmdIndexName, ...args]\n : args;\n return runQmd(commandArgs, timeoutMs, this.qmdPath, signal, this.qmdRuntimeEnv);\n }\n\n private supportsIntentHints(): boolean {\n return this.qmdCapabilities.intentHints;\n }\n\n private supportsExplainTraces(): boolean {\n return this.qmdCapabilities.explainTraces;\n }\n\n private supportsCandidateLimit(): boolean {\n return this.qmdCapabilities.candidateLimit;\n }\n\n private supportsRerankToggle(): boolean {\n return this.qmdCapabilities.queryRerankToggle;\n }\n\n private supportsChunkStrategy(): boolean {\n return this.qmdCapabilities.chunkStrategy;\n }\n\n /**\n * QMD v2 (>= 2.0.0) uses a new MCP tool API:\n * - `search` and `vsearch` tools removed; only `query` tool exists\n * - `query` accepts `{ searches: [{ type, query }], collections?: string[] }`\n * instead of `{ query: string, collection?: string }`\n * - `collection` (singular) → `collections` (plural array)\n */\n private isQmdV2(): boolean {\n return this.qmdCapabilities.v2McpQueryTool;\n }\n\n private resolveSearchOptions(options?: SearchQueryOptions): SearchQueryOptions | undefined {\n const normalized = normalizeSearchOptions(options);\n const withDefaults: SearchQueryOptions = { ...(normalized ?? {}) };\n if (this.qmdCandidateLimit !== undefined && withDefaults.candidateLimit === undefined) {\n withDefaults.candidateLimit = this.qmdCandidateLimit;\n }\n if (!this.qmdQueryRerankEnabled && withDefaults.rerank === undefined) {\n withDefaults.rerank = false;\n }\n if (this.qmdChunkStrategy && withDefaults.chunkStrategy === undefined) {\n withDefaults.chunkStrategy = this.qmdChunkStrategy;\n }\n const resolved: SearchQueryOptions = {};\n if (withDefaults.intent && this.supportsIntentHints()) {\n resolved.intent = withDefaults.intent;\n }\n if (withDefaults.explain === true && this.supportsExplainTraces()) {\n resolved.explain = true;\n }\n if (\n typeof withDefaults.candidateLimit === \"number\" &&\n withDefaults.candidateLimit > 0 &&\n this.supportsCandidateLimit()\n ) {\n resolved.candidateLimit = Math.floor(withDefaults.candidateLimit);\n }\n if (withDefaults.rerank === false && this.supportsRerankToggle()) {\n resolved.rerank = false;\n }\n if (withDefaults.chunkStrategy && this.supportsChunkStrategy()) {\n resolved.chunkStrategy = withDefaults.chunkStrategy;\n }\n if (this.qmdCapabilities.structuredSearches) {\n const structuredSearches = normalizeStructuredSearches(withDefaults.structuredSearches);\n if (structuredSearches.length > 0) {\n resolved.structuredSearches = structuredSearches;\n }\n }\n return Object.keys(resolved).length > 0 ? resolved : undefined;\n }\n\n resolveSupportedSearchOptions(options?: SearchQueryOptions): SearchQueryOptions | undefined {\n return this.resolveSearchOptions(options);\n }\n\n private addResolvedSearchOptionsToArgs(args: string[], options?: SearchQueryOptions): void {\n if (options?.intent) {\n args.push(\"--intent\", options.intent);\n }\n if (options?.explain === true) {\n args.push(\"--explain\");\n }\n if (typeof options?.candidateLimit === \"number\" && options.candidateLimit > 0) {\n args.push(\"--candidate-limit\", String(Math.floor(options.candidateLimit)));\n }\n if (options?.rerank === false) {\n args.push(\"--no-rerank\");\n }\n if (options?.chunkStrategy) {\n args.push(\"--chunk-strategy\", options.chunkStrategy);\n }\n }\n\n private addQmdJsonOutputArgs(args: string[]): void {\n if (this.qmdCapabilities.outputFormatFlag) {\n args.push(\"--format\", \"json\");\n } else {\n args.push(\"--json\");\n }\n }\n\n private addResolvedSearchOptionsToMcpArgs(\n args: Record<string, unknown>,\n options?: SearchQueryOptions,\n ): void {\n if (options?.intent) {\n args.intent = options.intent;\n }\n if (options?.explain === true) {\n args.explain = true;\n }\n if (typeof options?.candidateLimit === \"number\" && options.candidateLimit > 0) {\n args.candidateLimit = Math.floor(options.candidateLimit);\n }\n if (options?.rerank === false) {\n args.rerank = false;\n }\n // QMD MCP query does not expose chunkStrategy even though CLI/SDK\n // search and embed do. Keep chunk strategy on CLI/embed paths only.\n }\n\n private buildEmbedArgs(collection: string, force = false): string[] {\n const args = [\"embed\"];\n if (force) args.push(\"-f\");\n args.push(\"-c\", collection);\n if (this.qmdChunkStrategy && this.qmdCapabilities.chunkStrategy) {\n args.push(\"--chunk-strategy\", this.qmdChunkStrategy);\n }\n return args;\n }\n\n async search(\n query: string,\n collection?: string,\n maxResults?: number,\n options?: SearchQueryOptions,\n execution?: SearchExecutionOptions,\n ): Promise<QmdSearchResult[]> {\n const trimmed = query.trim();\n if (!trimmed) return [];\n await this.maybeProbeDaemon();\n if (!this.isAvailable()) {\n this.notifyDegradation(execution?.onDegradation, \"backend_unavailable\");\n return [];\n }\n\n const col = collection ?? this.collection;\n const n = maxResults ?? this.maxResults;\n const searchOptions = this.resolveSearchOptions(options);\n\n // Short-lived search result cache — avoids redundant daemon calls for\n // repeated queries within the same recall cycle (e.g., primary + hybrid\n // top-up, or conversation recall using the same collection).\n const optionsFingerprint = searchOptions ? JSON.stringify(searchOptions) : \"\";\n // Key must capture daemon/subprocess strategies to avoid cross-instance collisions (#1335).\n const strategyFingerprint = `${this.qmdSearchStrategy}:${this.qmdSubprocessStrategy}`;\n const cacheKey = createHash(\"sha256\")\n .update(`${strategyFingerprint}:${col}:${n}:${optionsFingerprint}:${trimmed}`)\n .digest(\"hex\");\n const cached = getCachedQmdSearch(cacheKey);\n if (cached) {\n // No degradation on cache hit by design (#1536): only trustworthy results are cached.\n log.debug(`QMD search cache hit (${cached.length} results)`);\n return cached as QmdSearchResult[];\n }\n\n // Try daemon first (bypasses QMD_MUTEX — daemon handles its own concurrency)\n if (this.daemonAvailable) {\n let results: QmdSearchResult[] | null;\n try {\n results = await this.searchViaDaemon(trimmed, col, n, searchOptions, execution?.signal);\n } catch (err) {\n if (isCallerCancellation(err, execution?.signal)) {\n throw isAbortError(err) ? err : abortError(\"QMD daemon search aborted\");\n }\n throw err;\n }\n // When the daemon is available, trust its outcome and skip the subprocess.\n // The subprocess runs `qmd query` (BM25 + LLM expansion) which hangs at\n // 99% CPU on large collections (75K+ files) making it strictly worse than\n // the daemon for this workload. Specifically:\n // results !== null → daemon succeeded (even with 0 hits) → return as-is\n // results === null → daemon timed-out or errored → still skip subprocess\n // because subprocess will also hang or timeout\n if (results !== null) {\n if (results.length === 0) {\n log.debug(\"QMD daemon search returned 0 results; skipping subprocess\");\n }\n setCachedQmdSearch(cacheKey, results);\n return results;\n }\n // Daemon timed out or had a transient error — skip subprocess for large\n // collections. Return empty rather than hanging the caller.\n log.warn(\"QMD daemon search timed out/failed; skipping subprocess (daemon-only mode)\");\n this.notifyDegradation(execution?.onDegradation, \"daemon_timeout\");\n return [];\n }\n\n // If the daemon process is spawned but still loading (handshake not yet complete),\n // skip subprocess — it would add load and block under QMD_MUTEX without helping.\n // Return empty and let the next recheck cycle pick up the daemon once ready.\n if (this.daemonSession?.isLoading()) {\n log.debug(\"QMD search: daemon loading, skipping subprocess\");\n this.notifyDegradation(execution?.onDegradation, \"daemon_loading\");\n return [];\n }\n\n // Subprocess fallback (only reached when daemon is unavailable and not loading)\n let subprocessDegraded = false;\n const subprocessResults = await this.searchViaSubprocess(\n trimmed,\n col,\n n,\n searchOptions,\n execution?.signal,\n (degradation) => {\n subprocessDegraded = true;\n this.notifyDegradation(execution?.onDegradation, degradation.code, degradation.detail);\n },\n );\n // Never cache a degraded empty result: a 60s TTL hit would serve the\n // failure as a genuine no-matches WITHOUT re-reporting the degradation\n // (codex review on #1544). Only trustworthy results are cacheable.\n if (!subprocessDegraded) {\n setCachedQmdSearch(cacheKey, subprocessResults);\n }\n return subprocessResults;\n }\n\n async searchGlobal(\n query: string,\n maxResults?: number,\n execution?: SearchExecutionOptions,\n ): Promise<QmdSearchResult[]> {\n const trimmed = query.trim();\n if (!trimmed) return [];\n await this.maybeProbeDaemon();\n if (!this.isAvailable()) {\n this.notifyDegradation(execution?.onDegradation, \"backend_unavailable\");\n return [];\n }\n\n const n = maxResults ?? 6;\n const searchOptions = this.resolveSearchOptions();\n\n // Try daemon first\n if (this.daemonAvailable) {\n // Global search: no collection filter\n let results: QmdSearchResult[] | null;\n try {\n results = await this.searchViaDaemon(trimmed, undefined, n, searchOptions, execution?.signal);\n } catch (err) {\n if (isCallerCancellation(err, execution?.signal)) {\n throw isAbortError(err) ? err : abortError(\"QMD daemon global search aborted\");\n }\n throw err;\n }\n // Same rationale as search() — trust daemon outcome, skip subprocess.\n if (results !== null) {\n if (results.length === 0) {\n log.debug(\"QMD daemon global search returned 0 results; skipping subprocess\");\n }\n return results;\n }\n log.warn(\"QMD daemon global search timed out/failed; skipping subprocess (daemon-only mode)\");\n this.notifyDegradation(execution?.onDegradation, \"daemon_timeout\");\n return [];\n }\n\n // If the daemon is spawned but still loading, skip subprocess — same as search().\n if (this.daemonSession?.isLoading()) {\n log.debug(\"QMD searchGlobal: daemon loading, skipping subprocess\");\n this.notifyDegradation(execution?.onDegradation, \"daemon_loading\");\n return [];\n }\n\n // Subprocess fallback (only reached when daemon is unavailable and not loading)\n return this.searchGlobalViaSubprocess(\n trimmed,\n n,\n searchOptions,\n execution?.signal,\n execution?.onDegradation,\n );\n }\n\n /**\n * BM25 keyword search (fast, ~0.3s). Uses `qmd search`.\n */\n async bm25Search(\n query: string,\n collection?: string,\n maxResults?: number,\n execution?: SearchExecutionOptions,\n ): Promise<QmdSearchResult[]> {\n const trimmed = query.trim();\n if (!trimmed) return [];\n await this.maybeProbeDaemon();\n if (!this.isAvailable()) {\n this.notifyDegradation(execution?.onDegradation, \"backend_unavailable\");\n return [];\n }\n const col = collection ?? this.collection;\n const n = maxResults ?? this.maxResults;\n\n // Try daemon first — BM25 via daemon is much faster than subprocess.\n if (this.daemonAvailable && this.daemonSession) {\n let results: QmdSearchResult[] | null;\n try {\n results = await this.bm25SearchViaDaemon(trimmed, col, n, execution?.signal);\n } catch (err) {\n if (isCallerCancellation(err, execution?.signal)) {\n throw isAbortError(err) ? err : abortError(\"QMD daemon bm25 aborted\");\n }\n throw err;\n }\n // When daemon is available, trust its outcome and skip subprocess (same\n // rationale as search() — subprocess hangs at 99% CPU on 75K+ files).\n if (results !== null) {\n if (results.length === 0) {\n log.debug(\"QMD daemon bm25 returned 0 results; skipping subprocess\");\n }\n return results;\n }\n log.warn(\"QMD daemon bm25 timed out/failed; skipping subprocess (daemon-only mode)\");\n this.notifyDegradation(execution?.onDegradation, \"daemon_timeout\");\n return [];\n }\n if (this.daemonSession?.isLoading()) {\n log.debug(\"QMD bm25: daemon loading, skipping subprocess\");\n this.notifyDegradation(execution?.onDegradation, \"daemon_loading\");\n return [];\n }\n return this.bm25SearchViaSubprocess(trimmed, col, n, execution?.signal, execution?.onDegradation);\n }\n\n /**\n * Vector similarity search (~3-4s). Uses `qmd vsearch`.\n */\n async vectorSearch(\n query: string,\n collection?: string,\n maxResults?: number,\n execution?: SearchExecutionOptions,\n ): Promise<QmdSearchResult[]> {\n const trimmed = query.trim();\n if (!trimmed) return [];\n await this.maybeProbeDaemon();\n if (!this.isAvailable()) {\n this.notifyDegradation(execution?.onDegradation, \"backend_unavailable\");\n return [];\n }\n const col = collection ?? this.collection;\n const n = maxResults ?? this.maxResults;\n\n // Try daemon first — keeps models warm, avoids cold subprocess loads.\n if (this.daemonAvailable && this.daemonSession) {\n let results: QmdSearchResult[] | null;\n try {\n results = await this.vsearchViaDaemon(trimmed, col, n, execution?.signal);\n } catch (err) {\n if (isCallerCancellation(err, execution?.signal)) {\n throw isAbortError(err) ? err : abortError(\"QMD daemon vsearch aborted\");\n }\n throw err;\n }\n // When daemon is available, trust its outcome and skip subprocess (same\n // rationale as search() — subprocess hangs at 99% CPU on 75K+ files).\n if (results !== null) {\n if (results.length === 0) {\n log.debug(\"QMD daemon vsearch returned 0 results; skipping subprocess\");\n }\n return results;\n }\n log.warn(\"QMD daemon vsearch timed out/failed; skipping subprocess (daemon-only mode)\");\n this.notifyDegradation(execution?.onDegradation, \"daemon_timeout\");\n return [];\n }\n if (this.daemonSession?.isLoading()) {\n log.debug(\"QMD vsearch: daemon loading, skipping subprocess\");\n this.notifyDegradation(execution?.onDegradation, \"daemon_loading\");\n return [];\n }\n return this.vsearchViaSubprocess(trimmed, col, n, execution?.signal, execution?.onDegradation);\n }\n\n /**\n * Hybrid search: runs BM25 + vector in parallel, merges/dedupes by path\n * keeping the best score and first non-empty snippet.\n */\n async hybridSearch(\n query: string,\n collection?: string,\n maxResults?: number,\n execution?: SearchExecutionOptions,\n ): Promise<QmdSearchResult[]> {\n const n = maxResults ?? this.maxResults;\n const trimmed = query.trim();\n if (!trimmed) return [];\n\n const [bm25Results, vectorResults] = await Promise.all([\n this.bm25Search(trimmed, collection, n, execution),\n this.vectorSearch(trimmed, collection, n, execution),\n ]);\n\n // Merge by path, keeping best score\n const merged = new Map<string, QmdSearchResult>();\n for (const r of [...bm25Results, ...vectorResults]) {\n const key = r.path || r.docid;\n const existing = merged.get(key);\n if (!existing || r.score > existing.score) {\n merged.set(key, {\n ...r,\n snippet: r.snippet || existing?.snippet || \"\",\n });\n }\n }\n\n // Sort by score descending, take top N\n return [...merged.values()]\n .sort((a, b) => b.score - a.score)\n .slice(0, n);\n }\n\n private async searchViaDaemon(\n query: string,\n collection: string | undefined,\n maxResults: number,\n options?: SearchQueryOptions,\n signal?: AbortSignal,\n ): Promise<QmdSearchResult[] | null> {\n if (!this.daemonSession || !this.daemonAvailable) return null;\n\n const startedAtMs = Date.now();\n const v2 = this.isQmdV2();\n try {\n let args: Record<string, unknown>;\n if (v2) {\n // QMD v2: query tool expects { searches: [...], collections?: [...] }\n // The MCP tool is structured-only in 2.x; use lex+vec+hyde by default\n // to exercise QMD's RRF + rerank path and let callers override when\n // they have stronger query-document structure. Operators on CPU-only\n // models can downgrade the plan via qmdSearchStrategy (issue #1335).\n const searches = buildDefaultStructuredSearches(query, options, this.qmdSearchStrategy);\n args = { searches, limit: maxResults };\n if (collection) {\n args.collections = [collection];\n }\n this.addResolvedSearchOptionsToMcpArgs(args, options);\n } else {\n // QMD v1: query tool accepts { query, collection?, limit }\n args = { query, limit: maxResults };\n if (collection) {\n args.collection = collection;\n }\n this.addResolvedSearchOptionsToMcpArgs(args, options);\n }\n\n const result = await this.daemonSession.callTool(\"query\", args, this.daemonTimeoutMs, signal);\n const durationMs = Date.now() - startedAtMs;\n\n if (this.slowLog?.enabled && durationMs >= this.slowLog.thresholdMs) {\n log.warn(\n `SLOW QMD daemon query: durationMs=${durationMs} collection=${collection ?? \"global\"} maxResults=${maxResults} queryChars=${query.length} v2=${v2}`,\n );\n }\n\n const results = parseMcpSearchResult(result, \"daemon\");\n\n log.debug(`QMD daemon search: ${results.length} results in ${durationMs}ms (v2=${v2})`);\n this.recordDaemonSuccess();\n return results;\n } catch (err) {\n const durationMs = Date.now() - startedAtMs;\n if (isCallerCancellation(err, signal)) {\n log.debug(`QMD daemon search aborted/cancelled after ${durationMs}ms`);\n throw isAbortError(err) ? err : abortError(\"QMD daemon search aborted\");\n }\n // Timeout: don't invalidate session — daemon is still running, just slow.\n if (isDaemonTimeoutError(err)) {\n log.debug(`QMD daemon search timed out after ${durationMs}ms, falling back to subprocess`);\n return null;\n }\n // Transient error: tolerate a few before invalidating.\n this.handleDaemonTransientError(\"search\", err, durationMs);\n return null;\n }\n }\n\n private async bm25SearchViaDaemon(\n query: string,\n collection: string,\n maxResults: number,\n signal?: AbortSignal,\n ): Promise<QmdSearchResult[] | null> {\n if (!this.daemonSession || !this.daemonAvailable) return null;\n\n const startedAtMs = Date.now();\n const v2 = this.isQmdV2();\n try {\n let result: unknown;\n if (v2) {\n // QMD v2: no `search` tool — use `query` with lex-only sub-query\n result = await this.daemonSession.callTool(\n \"query\",\n {\n searches: [{ type: \"lex\", query }],\n collections: [collection],\n limit: maxResults,\n },\n this.daemonTimeoutMs,\n signal,\n );\n } else {\n // QMD v1: dedicated `search` tool for BM25\n result = await this.daemonSession.callTool(\n \"search\",\n { query, limit: maxResults, collection },\n this.daemonTimeoutMs,\n signal,\n );\n }\n const durationMs = Date.now() - startedAtMs;\n const results = parseMcpSearchResult(result);\n log.debug(`QMD daemon bm25: ${results.length} results in ${durationMs}ms (v2=${v2})`);\n this.recordDaemonSuccess();\n return results;\n } catch (err) {\n const durationMs = Date.now() - startedAtMs;\n if (isCallerCancellation(err, signal)) {\n log.debug(`QMD daemon bm25 aborted/cancelled after ${durationMs}ms`);\n throw isAbortError(err) ? err : abortError(\"QMD daemon bm25 aborted\");\n }\n if (isDaemonTimeoutError(err)) {\n log.debug(`QMD daemon bm25 timed out after ${durationMs}ms, falling back to subprocess`);\n return null;\n }\n this.handleDaemonTransientError(\"bm25\", err, durationMs);\n return null;\n }\n }\n\n private async vsearchViaDaemon(\n query: string,\n collection: string,\n maxResults: number,\n signal?: AbortSignal,\n ): Promise<QmdSearchResult[] | null> {\n if (!this.daemonSession || !this.daemonAvailable) return null;\n\n const startedAtMs = Date.now();\n const v2 = this.isQmdV2();\n try {\n let result: unknown;\n if (v2) {\n // QMD v2: no `vsearch` tool — use `query` with vec-only sub-query\n result = await this.daemonSession.callTool(\n \"query\",\n {\n searches: [{ type: \"vec\", query }],\n collections: [collection],\n limit: maxResults,\n },\n this.daemonTimeoutMs,\n signal,\n );\n } else {\n // QMD v1: dedicated `vsearch` tool for vector search\n result = await this.daemonSession.callTool(\n \"vsearch\",\n { query, limit: maxResults, collection },\n this.daemonTimeoutMs,\n signal,\n );\n }\n const durationMs = Date.now() - startedAtMs;\n const results = parseMcpSearchResult(result);\n log.debug(`QMD daemon vsearch: ${results.length} results in ${durationMs}ms (v2=${v2})`);\n this.recordDaemonSuccess();\n return results;\n } catch (err) {\n const durationMs = Date.now() - startedAtMs;\n if (isCallerCancellation(err, signal)) {\n log.debug(`QMD daemon vsearch aborted/cancelled after ${durationMs}ms`);\n throw isAbortError(err) ? err : abortError(\"QMD daemon vsearch aborted\");\n }\n if (isDaemonTimeoutError(err)) {\n log.debug(`QMD daemon vsearch timed out after ${durationMs}ms, falling back to subprocess`);\n return null;\n }\n this.handleDaemonTransientError(\"vsearch\", err, durationMs);\n return null;\n }\n }\n\n /**\n * Report a backend degradation to the caller's observer (#1536): an empty\n * result caused by unavailability/loading/timeout is otherwise\n * indistinguishable from \"no matches\" (CLAUDE.md rule 34). Observer\n * failures are swallowed — observability must never break search.\n */\n private notifyDegradation(\n onDegradation: SearchExecutionOptions[\"onDegradation\"],\n code: SearchDegradation[\"code\"],\n detail?: string,\n ): void {\n if (!onDegradation) return;\n try {\n onDegradation({ backend: \"qmd\", code, ...(detail !== undefined ? { detail } : {}) });\n } catch (err) {\n log.debug(`QMD degradation observer threw: ${err}`);\n }\n }\n\n /**\n * Condense an error into a degradation `detail` string that is safe to\n * serialize on LastRecallSnapshot and expose via last-recall MCP/HTTP\n * surfaces (cursor review on #1544): first line only, path-like tokens\n * redacted (absolute, home-rooted, and Windows drive paths can leak\n * usernames and filesystem layout), capped at 160 chars. The unredacted\n * error still reaches operators via the warn log at the failure site.\n */\n private degradationDetail(err: unknown, sensitive?: string[]): string {\n let message = String(err instanceof Error ? err.message : err);\n // Strip known-sensitive strings BEFORE any line-splitting: runQmdCommand\n // error labels embed the full command line including the raw recall\n // query, and a multi-line query would otherwise leave its first-line\n // prefix behind after the first-line cut (codex round-6 P1 on #1544).\n // Whole values first, then their individual line fragments so truncated\n // embeddings cannot leak partial prompt text either.\n for (const value of sensitive ?? []) {\n if (typeof value !== \"string\" || value.length === 0) continue;\n message = message.split(value).join(\"<query>\");\n for (const fragment of value.split(\"\\n\")) {\n const trimmed = fragment.trim();\n if (trimmed.length >= 4) {\n message = message.split(trimmed).join(\"<query>\");\n }\n }\n }\n const firstLine = message.split(\"\\n\")[0] ?? \"\";\n const redacted = firstLine.replace(/(?:~|\\/|[A-Za-z]:\\\\)[^\\s'\"`]+/g, \"<path>\");\n return redacted.length > 160 ? `${redacted.slice(0, 159)}…` : redacted;\n }\n\n private async searchViaSubprocess(\n query: string,\n collection: string,\n maxResults: number,\n options?: SearchQueryOptions,\n signal?: AbortSignal,\n onDegradation?: SearchExecutionOptions[\"onDegradation\"],\n ): Promise<QmdSearchResult[]> {\n if (this.available === false) return [];\n\n // INTENTIONAL — DO NOT change the default command from `query` to `search`.\n // `qmd query` performs LLM query expansion + reranking that Remnic depends on\n // (Remnic's own reranking is disabled because `qmd query` handles it). This is\n // CLAUDE.md gotcha #7. On very large collections `qmd query` can be slow/hang\n // (issue #1335), so operators may opt into BM25-only `qmd search` by setting\n // `qmdSubprocessStrategy: \"search\"` — but that trades away expansion + rerank,\n // so it stays opt-in and the default remains `query`.\n if (this.qmdSubprocessStrategy === \"search\") {\n return this.bm25SearchViaSubprocess(query, collection, maxResults, signal, onDegradation);\n }\n\n const startedAtMs = Date.now();\n try {\n const args = [\"query\", query, \"-c\", collection];\n this.addQmdJsonOutputArgs(args);\n args.push(\"-n\", String(maxResults));\n this.addResolvedSearchOptionsToArgs(args, options);\n const { stdout } = await this.runQmdCommand(args, QMD_TIMEOUT_MS, signal);\n const durationMs = Date.now() - startedAtMs;\n if (this.slowLog?.enabled && durationMs >= this.slowLog.thresholdMs) {\n log.warn(\n `SLOW QMD query: durationMs=${durationMs} collection=${collection} maxResults=${maxResults} queryChars=${query.length}`,\n );\n }\n\n return parseQmdSearchStdout(stdout, \"subprocess\");\n } catch (err) {\n if (isCallerCancellation(err, signal)) {\n throw isAbortError(err) ? err : abortError(\"QMD subprocess search aborted\");\n }\n // Sanitized in the LOG too: the raw error label embeds the argv,\n // which includes the user's recall query (codex round-5 P1 on #1544).\n const detail = this.degradationDetail(err, [query]);\n log.warn(`QMD subprocess search failed (returning empty): ${detail}`);\n this.notifyDegradation(onDegradation, \"subprocess_error\", detail);\n return [];\n }\n }\n\n private async bm25SearchViaSubprocess(\n query: string,\n collection: string,\n maxResults: number,\n signal?: AbortSignal,\n onDegradation?: SearchExecutionOptions[\"onDegradation\"],\n ): Promise<QmdSearchResult[]> {\n if (this.available === false) return [];\n const startedAtMs = Date.now();\n try {\n const args = [\"search\", query, \"-c\", collection];\n this.addQmdJsonOutputArgs(args);\n args.push(\"-n\", String(maxResults));\n const { stdout } = await this.runQmdCommand(args, QMD_TIMEOUT_MS, signal);\n log.debug(`QMD bm25: ${Date.now() - startedAtMs}ms`);\n return parseQmdSearchStdout(stdout);\n } catch (err) {\n if (isCallerCancellation(err, signal)) {\n throw isAbortError(err) ? err : abortError(\"QMD subprocess bm25 aborted\");\n }\n const detail = this.degradationDetail(err, [query]);\n log.warn(`QMD bm25 subprocess search failed (returning empty): ${detail}`);\n this.notifyDegradation(onDegradation, \"subprocess_error\", detail);\n return [];\n }\n }\n\n private async vsearchViaSubprocess(\n query: string,\n collection: string,\n maxResults: number,\n signal?: AbortSignal,\n onDegradation?: SearchExecutionOptions[\"onDegradation\"],\n ): Promise<QmdSearchResult[]> {\n if (this.available === false) return [];\n const startedAtMs = Date.now();\n try {\n const { stdout } = await this.runQmdCommand(\n [\"vsearch\", query, \"-c\", collection, \"--json\", \"-n\", String(maxResults)],\n QMD_TIMEOUT_MS,\n signal,\n );\n log.debug(`QMD vsearch: ${Date.now() - startedAtMs}ms`);\n return parseQmdSearchStdout(stdout);\n } catch (err) {\n if (isCallerCancellation(err, signal)) {\n throw isAbortError(err) ? err : abortError(\"QMD subprocess vsearch aborted\");\n }\n const detail = this.degradationDetail(err, [query]);\n log.warn(`QMD vsearch subprocess failed (returning empty): ${detail}`);\n this.notifyDegradation(onDegradation, \"subprocess_error\", detail);\n return [];\n }\n }\n\n private async searchGlobalViaSubprocess(\n query: string,\n maxResults: number,\n options?: SearchQueryOptions,\n signal?: AbortSignal,\n onDegradation?: SearchExecutionOptions[\"onDegradation\"],\n ): Promise<QmdSearchResult[]> {\n if (this.available === false) return [];\n\n const startedAtMs = Date.now();\n try {\n // Mirror searchViaSubprocess: default `qmd query` keeps LLM expansion +\n // rerank (gotcha #7); `qmdSubprocessStrategy: \"search\"` opts into BM25-only\n // `qmd search` for both scoped AND global recall so the gate stays uniform\n // across every subprocess path (gotcha #39). Issue #1335.\n const bm25 = this.qmdSubprocessStrategy === \"search\";\n const args = bm25 ? [\"search\", query] : [\"query\", query];\n this.addQmdJsonOutputArgs(args);\n args.push(\"-n\", String(maxResults));\n // BM25 `qmd search` takes no expansion/rerank options — only forward them\n // for the `query` command.\n if (!bm25) {\n this.addResolvedSearchOptionsToArgs(args, options);\n }\n const { stdout } = await this.runQmdCommand(args, QMD_TIMEOUT_MS, signal);\n const durationMs = Date.now() - startedAtMs;\n if (this.slowLog?.enabled && durationMs >= this.slowLog.thresholdMs) {\n log.warn(\n `SLOW QMD global ${bm25 ? \"search\" : \"query\"}: durationMs=${durationMs} maxResults=${maxResults} queryChars=${query.length}`,\n );\n }\n\n return parseQmdSearchStdout(stdout);\n } catch (err) {\n if (isCallerCancellation(err, signal)) {\n throw isAbortError(err) ? err : abortError(\"QMD subprocess global search aborted\");\n }\n const detail = this.degradationDetail(err, [query]);\n log.warn(`QMD global subprocess search failed (returning empty): ${detail}`);\n this.notifyDegradation(onDegradation, \"subprocess_error\", detail);\n return [];\n }\n }\n\n async update(execution?: SearchExecutionOptions): Promise<void> {\n await this.runUpdateForCollection(\n this.collection,\n { perCollectionThrottle: false },\n execution?.signal,\n );\n }\n\n async updateStrict(execution?: SearchExecutionOptions): Promise<void> {\n await this.runUpdateForCollection(\n this.collection,\n { perCollectionThrottle: false, strict: true },\n execution?.signal,\n );\n }\n\n async updateCollection(\n collection: string,\n execution?: SearchExecutionOptions,\n ): Promise<void> {\n await this.runUpdateForCollection(\n collection,\n { perCollectionThrottle: true },\n execution?.signal,\n );\n }\n\n async updateCollectionStrict(\n collection: string,\n execution?: SearchExecutionOptions,\n ): Promise<void> {\n await this.runUpdateForCollection(\n collection,\n { perCollectionThrottle: true, strict: true, force: true },\n execution?.signal,\n );\n }\n\n updatesAllCollections(): boolean {\n return true;\n }\n\n private async runUpdateForCollection(\n collection: string,\n options: { perCollectionThrottle: boolean; strict?: boolean; force?: boolean },\n signal?: AbortSignal,\n ): Promise<void> {\n if (this.available === false) {\n if (options.strict) {\n throw new Error(\"QMD unavailable\");\n }\n return;\n }\n const name = collection.trim();\n if (!name) {\n if (options.strict) {\n throw new Error(\"QMD collection name is required\");\n }\n return;\n }\n const globalState = getGlobalQmdState();\n const now = Date.now();\n if (!options.force && options.perCollectionThrottle) {\n if (\n globalState.lastGlobalUpdateFailAtMs &&\n now - globalState.lastGlobalUpdateFailAtMs < QMD_UPDATE_BACKOFF_MS\n ) {\n log.debug(\"QMD update: suppressed by global failure backoff\");\n if (options.strict) throw new Error(\"QMD update skipped by global failure backoff\");\n return;\n }\n const lastCollectionRun = globalState.lastUpdateByCollectionMs[name];\n if (\n Number.isFinite(lastCollectionRun) &&\n now - lastCollectionRun < this.updateMinIntervalMs\n ) {\n log.debug(`QMD update: suppressed by per-collection min-interval gate (${name})`);\n if (options.strict) throw new Error(\"QMD update skipped by per-collection min-interval gate\");\n return;\n }\n const lastCollectionFail = globalState.lastUpdateFailByCollectionMs[name];\n if (\n Number.isFinite(lastCollectionFail) &&\n now - lastCollectionFail < QMD_UPDATE_BACKOFF_MS\n ) {\n log.debug(`QMD update: suppressed by per-collection failure backoff (${name})`);\n if (options.strict) throw new Error(\"QMD update skipped by per-collection failure backoff\");\n return;\n }\n } else if (!options.force) {\n if (\n this.lastUpdateRunAtMs &&\n now - this.lastUpdateRunAtMs < this.updateMinIntervalMs\n ) {\n log.debug(\"QMD update: suppressed due to min-interval gate\");\n if (options.strict) throw new Error(\"QMD update skipped by min-interval gate\");\n return;\n }\n if (\n this._lastUpdateFailAtMs &&\n now - this._lastUpdateFailAtMs < QMD_UPDATE_BACKOFF_MS\n ) {\n log.debug(\"QMD update: suppressed due to recent failures (backoff)\");\n if (options.strict) throw new Error(\"QMD update skipped by recent failure backoff\");\n return;\n }\n if (\n globalState.lastGlobalUpdateRunAtMs &&\n now - globalState.lastGlobalUpdateRunAtMs < this.updateMinIntervalMs\n ) {\n log.debug(\"QMD update: suppressed by global min-interval gate\");\n if (options.strict) throw new Error(\"QMD update skipped by global min-interval gate\");\n return;\n }\n if (\n globalState.lastGlobalUpdateFailAtMs &&\n now - globalState.lastGlobalUpdateFailAtMs < QMD_UPDATE_BACKOFF_MS\n ) {\n log.debug(\"QMD update: suppressed by global failure backoff\");\n if (options.strict) throw new Error(\"QMD update skipped by global failure backoff\");\n return;\n }\n }\n try {\n if (!globalState.warnedGlobalUpdateBehavior) {\n globalState.warnedGlobalUpdateBehavior = true;\n log.warn(\n \"QMD update runs globally across collections in current CLI versions; Engram now rate-limits update calls to reduce gateway load.\",\n );\n }\n const startedAtMs = Date.now();\n await this.runQmdCommand([\"update\", \"-c\", name], this.updateTimeoutMs, signal);\n const durationMs = Date.now() - startedAtMs;\n if (this.slowLog?.enabled && durationMs >= this.slowLog.thresholdMs) {\n log.warn(`SLOW QMD update: durationMs=${durationMs}`);\n }\n const at = Date.now();\n if (options.perCollectionThrottle) {\n globalState.lastUpdateByCollectionMs[name] = at;\n globalState.lastGlobalUpdateRunAtMs = at;\n } else {\n this.lastUpdateRunAtMs = at;\n globalState.lastGlobalUpdateRunAtMs = at;\n }\n // A successful index refresh makes newly-persisted facts searchable, so\n // any cached pre-refresh QMD search/recall bundle is now stale. Clear the\n // global QMD result caches here, at the single success point EVERY update\n // path funnels through (direct calls, wearable/OpenClaw sync reindex, and\n // the namespace router's per-backend update), so no caller can forget and\n // serve a stale bundle past the refresh (#1904, Codex/Cursor).\n clearQmdResultCaches();\n log.debug(`QMD update completed for collection=${name}`);\n } catch (err) {\n const at = Date.now();\n if (options.perCollectionThrottle) {\n globalState.lastUpdateFailByCollectionMs[name] = at;\n globalState.lastGlobalUpdateFailAtMs = at;\n } else {\n this._lastUpdateFailAtMs = at;\n globalState.lastGlobalUpdateFailAtMs = at;\n }\n const msg = err instanceof Error ? err.message : String(err);\n log.warn(`QMD update failed for collection ${name}: ${msg}`);\n if (options.strict) {\n throw err;\n }\n }\n }\n\n async embed(): Promise<void> {\n await this.runEmbedForCollection(this.collection, { perCollectionThrottle: false });\n }\n\n async embedStrict(): Promise<void> {\n await this.runEmbedForCollection(this.collection, { perCollectionThrottle: false, strict: true });\n }\n\n async embedCollection(collection: string): Promise<void> {\n await this.runEmbedForCollection(collection, { perCollectionThrottle: true });\n }\n\n async embedCollectionStrict(collection: string): Promise<void> {\n await this.runEmbedForCollection(collection, { perCollectionThrottle: true, strict: true });\n }\n\n /** Trigger a collection-level embed for fresh writes (debounced by prioritized-embed). */\n async embedFiles(filePaths: string[]): Promise<boolean> {\n if (this.available === false || filePaths.length === 0) {\n return false;\n }\n const result = await embedQmdFiles(\n (args, timeoutMs) => this.runQmdCommand(args, timeoutMs),\n this.collection,\n filePaths,\n 300_000,\n this.buildEmbedArgs(this.collection),\n );\n if (result.ok) clearQmdResultCaches();\n return result.ok;\n }\n\n private async runEmbedForCollection(\n collection: string,\n options: { perCollectionThrottle: boolean; strict?: boolean },\n ): Promise<void> {\n if (this.available === false) {\n if (options.strict) throw new Error(\"QMD unavailable\");\n return;\n }\n const name = collection.trim();\n if (!name) {\n if (options.strict) throw new Error(\"QMD collection name is required\");\n return;\n }\n const globalState = getGlobalQmdState();\n const now = Date.now();\n if (options.perCollectionThrottle) {\n if (\n globalState.lastGlobalEmbedFailAtMs &&\n now - globalState.lastGlobalEmbedFailAtMs < QMD_EMBED_BACKOFF_MS\n ) {\n log.debug(`QMD embed: suppressed by global failure backoff (${name})`);\n if (options.strict) throw new Error(\"QMD embed skipped by global failure backoff\");\n return;\n }\n const lastCollectionRun = globalState.lastEmbedByCollectionMs[name];\n if (\n Number.isFinite(lastCollectionRun) &&\n now - lastCollectionRun < this.updateMinIntervalMs\n ) {\n log.debug(`QMD embed: suppressed by per-collection min-interval gate (${name})`);\n if (options.strict) throw new Error(\"QMD embed skipped by per-collection min-interval gate\");\n return;\n }\n const lastCollectionFail = globalState.lastEmbedFailByCollectionMs[name];\n if (\n Number.isFinite(lastCollectionFail) &&\n now - lastCollectionFail < QMD_EMBED_BACKOFF_MS\n ) {\n log.debug(`QMD embed: suppressed by per-collection failure backoff (${name})`);\n if (options.strict) throw new Error(\"QMD embed skipped by per-collection failure backoff\");\n return;\n }\n } else {\n if (\n this.lastEmbedFailAtMs &&\n now - this.lastEmbedFailAtMs < QMD_EMBED_BACKOFF_MS\n ) {\n log.debug(\"QMD embed: suppressed due to recent failures (backoff)\");\n if (options.strict) throw new Error(\"QMD embed skipped by recent failure backoff\");\n return;\n }\n if (\n globalState.lastGlobalEmbedRunAtMs &&\n now - globalState.lastGlobalEmbedRunAtMs < this.updateMinIntervalMs\n ) {\n log.debug(\"QMD embed: suppressed by global min-interval gate\");\n if (options.strict) throw new Error(\"QMD embed skipped by global min-interval gate\");\n return;\n }\n if (\n globalState.lastGlobalEmbedFailAtMs &&\n now - globalState.lastGlobalEmbedFailAtMs < QMD_EMBED_BACKOFF_MS\n ) {\n log.debug(\"QMD embed: suppressed by global failure backoff\");\n if (options.strict) throw new Error(\"QMD embed skipped by global failure backoff\");\n return;\n }\n }\n try {\n const startedAtMs = Date.now();\n await this.runQmdCommand(this.buildEmbedArgs(name), 300_000);\n const durationMs = Date.now() - startedAtMs;\n if (this.slowLog?.enabled && durationMs >= this.slowLog.thresholdMs) {\n log.warn(`SLOW QMD embed: durationMs=${durationMs}`);\n }\n const at = Date.now();\n if (options.perCollectionThrottle) {\n globalState.lastEmbedByCollectionMs[name] = at;\n }\n globalState.lastGlobalEmbedRunAtMs = at;\n // A successful embed changes vector searchability, so cached pre-embed\n // bundles may now be stale. Clear at this single success point (#1904).\n clearQmdResultCaches();\n log.debug(`QMD embed completed for collection=${name}`);\n } catch (err) {\n let failure: unknown = err;\n if (isVectorDimensionMismatchError(err)) {\n try {\n log.warn(`QMD embed for collection ${name} hit a vector dimension mismatch; retrying with force re-embed`);\n await this.runQmdCommand(this.buildEmbedArgs(name, true), 300_000);\n const recoveredAt = Date.now();\n if (options.perCollectionThrottle) {\n globalState.lastEmbedByCollectionMs[name] = recoveredAt;\n delete globalState.lastEmbedFailByCollectionMs[name];\n } else {\n this.lastEmbedFailAtMs = null;\n }\n globalState.lastGlobalEmbedRunAtMs = recoveredAt;\n globalState.lastGlobalEmbedFailAtMs = null;\n // Recovery also changed vector searchability — clear cached bundles.\n clearQmdResultCaches();\n log.warn(`QMD embed for collection ${name} recovered by forcing a full vector rebuild`);\n return;\n } catch (retryErr) {\n failure = retryErr;\n const retryMsg = retryErr instanceof Error ? retryErr.message : String(retryErr);\n log.warn(`QMD force re-embed failed for collection ${name}: ${retryMsg}`);\n }\n }\n const at = Date.now();\n if (options.perCollectionThrottle) {\n globalState.lastEmbedFailByCollectionMs[name] = at;\n } else {\n this.lastEmbedFailAtMs = at;\n }\n globalState.lastGlobalEmbedFailAtMs = at;\n const msg = failure instanceof Error ? failure.message : String(failure);\n log.warn(`QMD embed failed for collection ${name}: ${msg}`);\n if (options.strict) {\n throw failure;\n }\n }\n }\n\n async checkCollection(\n collectionOrExecution?: string | SearchExecutionOptions,\n execution?: SearchExecutionOptions,\n ): Promise<\"present\" | \"missing\" | \"unknown\" | \"skipped\"> {\n const { collection, execution: effectiveExecution } = resolveEnsureCollectionArgs(\n collectionOrExecution,\n execution,\n );\n if (this.available === false && !this.daemonAvailable) return \"unknown\";\n // If only daemon is available (no CLI), skip collection check\n if (this.available === false) return \"skipped\";\n const targetCollection = collection ?? this.collection;\n try {\n const { stdout } = await this.runQmdCommand([\"collection\", \"list\"], QMD_TIMEOUT_MS, effectiveExecution?.signal);\n // Parse text output: \"openclaw-engram (qmd://openclaw-engram/)\"\n const collectionRegex = new RegExp(\n `^${escapeRegExp(targetCollection)}\\\\s+\\\\(qmd://`,\n \"m\",\n );\n if (collectionRegex.test(stdout)) {\n return \"present\";\n }\n return \"missing\";\n } catch (err) {\n // Treat command/probe failures as unknown so callers do not disable features\n // permanently after a transient CLI or daemon hiccup.\n log.debug(\n `QMD collection check unavailable for \"${targetCollection}\" (will not disable features): ${err instanceof Error ? err.message : String(err)}`,\n );\n return \"unknown\";\n }\n }\n\n async ensureCollection(\n memoryDir: string,\n collectionOrExecution?: string | SearchExecutionOptions,\n execution?: SearchExecutionOptions,\n ): Promise<\"present\" | \"missing\" | \"unknown\" | \"skipped\"> {\n const { collection, execution: effectiveExecution } = resolveEnsureCollectionArgs(\n collectionOrExecution,\n execution,\n );\n const targetCollection = collection ?? this.collection;\n const collectionState = await this.checkCollection(targetCollection, effectiveExecution);\n if (collectionState !== \"missing\") return collectionState;\n\n try {\n await this.runQmdCommand(\n [\"collection\", \"add\", memoryDir, \"--name\", targetCollection],\n QMD_TIMEOUT_MS,\n effectiveExecution?.signal,\n );\n log.info(\n `QMD collection \"${targetCollection}\" auto-created at ${memoryDir}`,\n );\n return \"present\";\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (isCallerCancellation(err, effectiveExecution?.signal)) {\n log.debug(\n `QMD collection auto-create for \"${targetCollection}\" was cancelled; keeping collection state unknown`,\n );\n return \"unknown\";\n }\n const postCreateState = await this.checkCollection(targetCollection, effectiveExecution);\n if (postCreateState === \"present\") {\n log.info(\n `QMD collection \"${targetCollection}\" is present after auto-create failure; continuing`,\n );\n return \"present\";\n }\n if (/\\balready exists\\b|\\bexists already\\b/i.test(msg)) {\n log.info(\n `QMD collection \"${targetCollection}\" already exists after concurrent auto-create; continuing`,\n );\n return \"present\";\n }\n if (postCreateState !== \"missing\") return postCreateState;\n log.warn(\n `QMD collection \"${targetCollection}\" not found and auto-create failed: ${msg}`,\n );\n return \"missing\";\n }\n }\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/entity-retrieval.ts"],"sourcesContent":["import { resolveNamespaceCapabilities } from \"./capabilities.js\";\nimport { createHash } from \"node:crypto\";\nimport { sanitizeMemoryContent } from \"./sanitize.js\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { collectNativeKnowledgeChunks, type NativeKnowledgeChunk } from \"./native-knowledge.js\";\nimport { compareEntityTimestamps, normalizeEntityName, type StorageManager } from \"./storage.js\";\nimport { normalizeEntityText, resolveRequestedEntitySectionKeys } from \"./entity-schema.js\";\nimport type { EntityStructuredSection, MemoryFile, PluginConfig, TranscriptEntry } from \"./types.js\";\nimport { containsPhrase } from \"./entity-retrieval-boundaries.js\";\n\nconst ENTITY_INDEX_VERSION = 3;\nconst RECENT_TRANSCRIPT_LOOKBACK_HOURS = 24;\nconst INSTRUCTION_LIKE_RE = /\\b(always|never|must|should|remember to|do not|don't|process|workflow|template|checklist|instruction)\\b/i;\nconst METADATA_WRAPPER_RE = /^(source|context|metadata|notes?):/i;\nconst ENTITY_PRONOUN_RE = /\\b(he|him|his|she|her|they|them|their|it|its)\\b/i;\nconst BELIEF_LEDGER_SECTION_KEY = \"belief_ledger\";\nconst BELIEF_LEDGER_FACT_RE = /^claim=([^;]+);\\s*status=([^;]+);\\s*updatedAt=([^;]+);\\s*(.+)$/;\n\ntype EntityQueryMode = \"direct\" | \"timeline\" | \"follow_up\";\n\ntype EntityMentionIndexEntry = {\n canonicalId: string;\n name: string;\n type: string;\n aliases: string[];\n summary?: string;\n facts: string[];\n timelineFacts: string[];\n structuredSections: EntityStructuredSection[];\n timeline: Array<{\n timestamp: string;\n text: string;\n source?: string;\n sessionKey?: string;\n principal?: string;\n }>;\n relationships: Array<{ target: string; label: string }>;\n activity: Array<{ date: string; note: string }>;\n factCount: number;\n memorySnippets: string[];\n nativeChunks: Array<{\n chunkId: string;\n title: string;\n sourceKind: NativeKnowledgeChunk[\"sourceKind\"];\n sourcePath: string;\n snippet: string;\n derivedDate?: string;\n }>;\n};\n\ntype EntityMentionIndex = {\n version: number;\n updatedAt: string;\n entityStatusVersion?: number;\n entities: EntityMentionIndexEntry[];\n};\n\ntype EntityCandidate = {\n entry: EntityMentionIndexEntry;\n alias: string;\n score: number;\n source: \"query\" | \"recent_turn\";\n};\n\ntype EntityHintSnippet = {\n text: string;\n score: number;\n kind: \"summary\" | \"fact\" | \"section\" | \"relationship\" | \"activity\" | \"memory\" | \"native\";\n};\n\nexport interface BuildEntityRecallSectionOptions {\n config: PluginConfig;\n storage: StorageManager;\n namespaceStorage?: (namespace: string) => Promise<StorageManager>;\n query: string;\n recallNamespaces?: string[];\n recentTurns: number;\n maxHints: number;\n maxSupportingFacts: number;\n maxRelatedEntities: number;\n maxChars: number;\n transcriptEntries: TranscriptEntry[];\n}\n\nfunction tokenize(value: string): string[] {\n return normalizeEntityText(value).split(/\\s+/).filter((token) => token.length >= 2);\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return [...new Set(values.map((value) => value.trim()).filter((value) => value.length > 0))];\n}\n\nfunction compactLine(value: string, maxLength: number = 220): string {\n const normalized = value.replace(/\\s+/g, \" \").trim();\n if (normalized.length <= maxLength) return normalized;\n return `${normalized.slice(0, Math.max(0, maxLength - 1)).trimEnd()}…`;\n}\n\nfunction dedupeHintSnippetsByText(snippets: EntityHintSnippet[]): EntityHintSnippet[] {\n const seen = new Set<string>();\n const result: EntityHintSnippet[] = [];\n for (const snippet of snippets) {\n const key = normalizeEntityText(snippet.text);\n if (seen.has(key)) continue;\n seen.add(key);\n result.push(snippet);\n }\n return result;\n}\n\nfunction isBeliefLedgerSection(section: Pick<EntityStructuredSection, \"key\">): boolean {\n return normalizeEntityText(section.key).replace(/\\s+/g, \"_\") === BELIEF_LEDGER_SECTION_KEY;\n}\n\nfunction beliefLedgerFactKeys(sections: EntityStructuredSection[]): Set<string> {\n const keys = new Set<string>();\n for (const section of sections) {\n if (!isBeliefLedgerSection(section)) continue;\n for (const fact of section.facts) {\n keys.add(normalizeEntityText(fact));\n }\n }\n return keys;\n}\n\nfunction recallFactsForStructuredSection(section: EntityStructuredSection): string[] {\n if (!isBeliefLedgerSection(section)) return section.facts;\n return currentActiveBeliefLedgerFactTexts(section.facts);\n}\n\nfunction currentActiveBeliefLedgerFactTexts(facts: string[]): string[] {\n const byClaim = new Map<string, { status: string; updatedAtMs: number; texts: string[] }>();\n for (const fact of facts) {\n const match = BELIEF_LEDGER_FACT_RE.exec(fact.trim());\n if (!match) continue;\n const [, claimId, status, updatedAt, text] = match;\n const updatedAtMs = Date.parse(updatedAt);\n if (!claimId?.trim() || !status?.trim() || !Number.isFinite(updatedAtMs) || !text?.trim()) continue;\n const normalizedStatus = status.trim().toLowerCase();\n const normalizedClaimId = claimId.trim();\n const current = byClaim.get(normalizedClaimId);\n const inactiveTieWins =\n current &&\n updatedAtMs === current.updatedAtMs &&\n current.status === \"active\" &&\n normalizedStatus !== \"active\";\n if (!current || updatedAtMs > current.updatedAtMs || inactiveTieWins) {\n byClaim.set(normalizedClaimId, { status: normalizedStatus, updatedAtMs, texts: [text.trim()] });\n continue;\n }\n if (updatedAtMs === current.updatedAtMs && current.status === normalizedStatus) {\n current.texts.push(text.trim());\n }\n }\n const result: string[] = [];\n for (const current of byClaim.values()) {\n if (current.status === \"active\") {\n result.push(...current.texts);\n }\n }\n return result;\n}\n\nfunction relationLine(entry: EntityMentionIndexEntry, relationship: { target: string; label: string }): string {\n const normalizedLabel = relationship.label.replace(/\\s+/g, \" \").trim();\n if (normalizedLabel.length === 0) return `${entry.name} is connected to ${relationship.target}`;\n return `${entry.name} ${normalizedLabel} ${relationship.target}`;\n}\n\nfunction detectEntityQueryMode(query: string): EntityQueryMode | null {\n const normalized = normalizeEntityText(query);\n if (!normalized) return null;\n if (\n /^(what about|and what about|how about|what happened (with|to) (he|him|his|she|her|they|them|their|it|its)|did (he|she|they|it)|is (he|she|they|it)|was (he|she|they|it))\\b/.test(normalized)\n ) {\n return \"follow_up\";\n }\n if (\n /^(who is|who s|what do we know about|what does|tell me about|what can you tell me about|what s new with|what happened with|what happened to|status of|where is|how is)\\b/.test(normalized)\n ) {\n if (/^what does\\b/.test(normalized)) {\n if (/^what does (?:this|that|it|the|a|an|my|our|your|their)\\b/.test(normalized)) {\n return null;\n }\n if (\n /^what does [a-z0-9-]+ (?:error|warning|exception|failure|stack|trace|code|message|log)\\b/.test(normalized)\n && /\\b(mean|means|indicate|indicates|imply|implies)\\b/.test(normalized)\n ) {\n return null;\n }\n }\n return /what happened|what s new|status of|how is|where is/.test(normalized) ? \"timeline\" : \"direct\";\n }\n if (ENTITY_PRONOUN_RE.test(normalized) && normalized.split(/\\s+/).length <= 8) {\n return \"follow_up\";\n }\n return null;\n}\n\nfunction scoreAliasMatch(query: string, alias: string): number {\n const normalizedQuery = normalizeEntityText(query);\n const normalizedAlias = normalizeEntityText(alias);\n if (!normalizedAlias) return 0;\n if (normalizedQuery === normalizedAlias) return 10;\n if (containsPhrase(normalizedQuery, normalizedAlias)) return 8 + Math.min(normalizedAlias.split(/\\s+/).length, 3);\n const queryTokens = new Set(tokenize(normalizedQuery));\n const aliasTokens = tokenize(normalizedAlias);\n if (aliasTokens.length === 0) return 0;\n const overlap = aliasTokens.filter((token) => queryTokens.has(token)).length;\n if (overlap === 0) return 0;\n // Cross-entity contamination guard (#682 PR 2/3 R-2). For multi-token\n // aliases, partial-token overlap that hits ONLY shared common tokens\n // (like \"person\" in \"Person-A1\" / \"Person-B1\") would surface every\n // similarly-prefixed entity for a query that named only one. Require\n // that the overlap include at least one DISTINCTIVE alias token —\n // i.e. a token that does not also appear in any other entity's\n // alias-token vocabulary. Since this function is pure / per-pair, we\n // approximate \"distinctive\" by requiring the overlap to include at\n // least one token that is not a substring-of common identifier\n // affixes. The aliasTokens with length > 1 must contribute at least\n // one non-affix overlap. \"Alice Example\" ([\"alice\", \"example\"])\n // matched by query \"Tell me about Alice\" → overlap = 1 on \"alice\",\n // and \"alice\" is not an affix → score = 1. \"Person-A1\" tokens\n // [\"person\", \"a1\"] matched by query \"Who is Person-B1?\" → overlap =\n // 1 on \"person\", and \"person\" IS an affix → score = 0.\n if (aliasTokens.length > 1) {\n const nonAffixOverlap = aliasTokens.filter(\n (token) => queryTokens.has(token) && !isAliasAffixToken(token),\n ).length;\n if (nonAffixOverlap === 0) return 0;\n }\n return overlap;\n}\n\n/**\n * Tokens that look like type prefixes / generic role identifiers and\n * therefore should not, on their own, count as evidence that a\n * multi-token alias matches a query (#682 PR 2/3 R-2).\n *\n * Kept as a small explicit list rather than a regex so additions are\n * deliberate. The list mirrors the entity types listed in\n * `entity-schema.ts` plus the most common generic role identifiers\n * that frequently appear as the leading token of a display name.\n */\nconst ALIAS_AFFIX_TOKENS = new Set<string>([\n \"person\", \"people\", \"user\", \"users\", \"team\", \"teams\",\n \"project\", \"projects\", \"topic\", \"topics\",\n \"org\", \"orgs\", \"organization\", \"organizations\", \"company\", \"companies\",\n \"place\", \"places\", \"tool\", \"tools\", \"service\", \"services\",\n \"system\", \"systems\", \"agent\", \"agents\", \"bot\", \"bots\",\n]);\n\nfunction isAliasAffixToken(token: string): boolean {\n return ALIAS_AFFIX_TOKENS.has(token);\n}\n\nfunction isLikelyInstructionLike(value: string): boolean {\n return INSTRUCTION_LIKE_RE.test(value) || METADATA_WRAPPER_RE.test(value);\n}\n\nfunction sanitizeEntityFact(fact: string): string {\n const sanitized = sanitizeMemoryContent(fact);\n const clean = sanitized.text.trim();\n if (!clean) return \"\";\n if (INSTRUCTION_LIKE_RE.test(clean) && clean.length > 100) return \"\";\n return clean;\n}\n\nfunction scoreHintSnippet(snippet: EntityHintSnippet, queryTokens: string[]): EntityHintSnippet | null {\n const normalized = normalizeEntityText(snippet.text);\n if (!normalized) return null;\n const scored = { ...snippet };\n if (isLikelyInstructionLike(scored.text) && scored.kind !== \"summary\") {\n scored.score -= 3;\n }\n const overlap = queryTokens.filter((token) => normalized.includes(token)).length;\n scored.score += overlap * 2;\n if (METADATA_WRAPPER_RE.test(scored.text)) scored.score -= 2;\n if (scored.text.length <= 160) scored.score += 1;\n return scored.score > 0 ? scored : null;\n}\n\nfunction sortTimelineEntriesDesc(\n left: EntityMentionIndexEntry[\"timeline\"][number],\n right: EntityMentionIndexEntry[\"timeline\"][number],\n): number {\n const timestampOrder = compareEntityTimestamps(right.timestamp, left.timestamp);\n if (timestampOrder !== 0) {\n return timestampOrder;\n }\n return right.text.localeCompare(left.text);\n}\n\nfunction jaccardSimilarity(a: string, b: string): number {\n const aTokens = new Set(tokenize(a));\n const bTokens = new Set(tokenize(b));\n if (aTokens.size === 0 || bTokens.size === 0) return 0;\n let intersection = 0;\n for (const token of aTokens) {\n if (bTokens.has(token)) intersection += 1;\n }\n const union = new Set([...aTokens, ...bTokens]).size;\n return union === 0 ? 0 : intersection / union;\n}\n\nfunction buildAliasIndex(entries: EntityMentionIndexEntry[]): Map<string, EntityMentionIndexEntry[]> {\n const index = new Map<string, EntityMentionIndexEntry[]>();\n for (const entry of entries) {\n const aliases = uniqueStrings([entry.name, ...entry.aliases]).map(normalizeEntityText).filter(Boolean);\n for (const alias of aliases) {\n const existing = index.get(alias) ?? [];\n existing.push(entry);\n index.set(alias, existing);\n }\n }\n return index;\n}\n\nasync function readNativeChunks(\n config: PluginConfig,\n recallNamespaces?: string[],\n): Promise<NativeKnowledgeChunk[]> {\n if (!config.nativeKnowledge?.enabled) return [];\n return collectNativeKnowledgeChunks({\n workspaceDir: config.workspaceDir,\n memoryDir: config.memoryDir,\n config: config.nativeKnowledge,\n recallNamespaces: resolveNamespaceCapabilities(config).namespaces ? recallNamespaces : undefined,\n defaultNamespace: config.defaultNamespace,\n }).catch(() => []);\n}\n\nasync function resolveEntityIndexStorages(\n storage: StorageManager,\n config: PluginConfig,\n recallNamespaces?: string[],\n namespaceStorage?: (namespace: string) => Promise<StorageManager>,\n): Promise<StorageManager[]> {\n if (\n !resolveNamespaceCapabilities(config).namespaces ||\n !namespaceStorage ||\n !recallNamespaces ||\n recallNamespaces.length === 0\n ) {\n return [storage];\n }\n\n const storages: StorageManager[] = [];\n const seenDirs = new Set<string>();\n for (const namespace of uniqueStrings(recallNamespaces)) {\n try {\n const scopedStorage = await namespaceStorage(namespace);\n const storageDir = path.resolve(scopedStorage.dir);\n if (seenDirs.has(storageDir)) continue;\n seenDirs.add(storageDir);\n storages.push(scopedStorage);\n } catch {\n continue;\n }\n }\n\n return storages.length > 0 ? storages : [storage];\n}\n\nfunction entityIndexStatePath(storage: StorageManager): string {\n return path.join(storage.dir, \"state\", \"entity-mention-index.json\");\n}\n\nasync function readEntityIndexState(storage: StorageManager): Promise<EntityMentionIndex | null> {\n const raw = await readFile(entityIndexStatePath(storage), \"utf-8\").catch(() => \"\");\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<EntityMentionIndex>;\n if (parsed.version !== ENTITY_INDEX_VERSION || !Array.isArray(parsed.entities)) return null;\n return parsed as EntityMentionIndex;\n } catch {\n return null;\n }\n}\n\n\nasync function readCurrentPersistedEntityIndex(\n storage: StorageManager,\n config: PluginConfig,\n recallNamespaces?: string[],\n namespaceStorage?: (namespace: string) => Promise<StorageManager>,\n): Promise<EntityMentionIndex | null> {\n if (\n resolveNamespaceCapabilities(config).namespaces &&\n namespaceStorage &&\n recallNamespaces &&\n recallNamespaces.length > 0\n ) {\n return null;\n }\n const index = await readEntityIndexState(storage);\n if (!index || index.entityStatusVersion !== storage.getMemoryStatusVersion()) {\n return null;\n }\n return index;\n}\nconst namespaceEntityIndexCache = new Map<string, EntityMentionIndex>();\nconst MAX_NAMESPACE_ENTITY_INDEX_CACHE_ENTRIES = 32;\n\nfunction namespaceEntityIndexCacheKey(\n storages: StorageManager[],\n recallNamespaces: string[],\n): string {\n const namespaceKey = uniqueStrings(recallNamespaces).sort().join(\"\\u001f\");\n const storageKey = storages\n .map((scopedStorage) => {\n const aliases = Object.entries(scopedStorage.entityAliases)\n .sort(([left], [right]) => left.localeCompare(right));\n return (\n `${path.resolve(scopedStorage.dir)}@${scopedStorage.getMemoryStatusVersion()}` +\n `:${scopedStorage.getMemoryCorpusVersion()}:${scopedStorage.hotCacheKeyId()}:${JSON.stringify(aliases)}`\n );\n })\n .sort()\n .join(\"\\u001f\");\n return `${namespaceKey}\\u001e${storageKey}`;\n}\n\nfunction rememberNamespaceEntityIndex(key: string, index: EntityMentionIndex): void {\n if (namespaceEntityIndexCache.size >= MAX_NAMESPACE_ENTITY_INDEX_CACHE_ENTRIES) {\n const oldestKey = namespaceEntityIndexCache.keys().next().value;\n if (typeof oldestKey === \"string\") namespaceEntityIndexCache.delete(oldestKey);\n }\n namespaceEntityIndexCache.set(key, index);\n}\n\nasync function writeEntityIndexState(storage: StorageManager, index: EntityMentionIndex): Promise<void> {\n const statePath = entityIndexStatePath(storage);\n await mkdir(path.dirname(statePath), { recursive: true });\n const nextContent = JSON.stringify(index, null, 2) + \"\\n\";\n const currentContent = await readFile(statePath, \"utf-8\").catch(() => \"\");\n if (currentContent === nextContent) return;\n await writeFile(statePath, nextContent, \"utf-8\");\n}\n\nfunction nativePseudoCanonicalId(chunk: NativeKnowledgeChunk): string {\n return `native:${createHash(\"sha256\").update(chunk.sourcePath).digest(\"hex\").slice(0, 12)}`;\n}\n\nfunction createPseudoNativeEntry(chunk: NativeKnowledgeChunk): EntityMentionIndexEntry {\n const canonicalId = nativePseudoCanonicalId(chunk);\n return {\n canonicalId,\n name: chunk.title,\n type: chunk.sourceKind,\n aliases: uniqueStrings(chunk.aliases ?? []),\n facts: [],\n structuredSections: [],\n timelineFacts: [],\n timeline: [],\n relationships: [],\n activity: [],\n factCount: 0,\n memorySnippets: [],\n nativeChunks: [\n {\n chunkId: chunk.chunkId,\n title: chunk.title,\n sourceKind: chunk.sourceKind,\n sourcePath: chunk.sourcePath,\n snippet: compactLine(chunk.content, 180),\n derivedDate: chunk.derivedDate,\n },\n ],\n };\n}\n\nfunction mergeNativeChunk(entry: EntityMentionIndexEntry, chunk: NativeKnowledgeChunk): void {\n const existing = entry.nativeChunks.find((item) => item.chunkId === chunk.chunkId);\n if (existing) return;\n entry.nativeChunks.push({\n chunkId: chunk.chunkId,\n title: chunk.title,\n sourceKind: chunk.sourceKind,\n sourcePath: chunk.sourcePath,\n snippet: compactLine(chunk.content, 180),\n derivedDate: chunk.derivedDate,\n });\n entry.aliases = uniqueStrings([...entry.aliases, ...(chunk.aliases ?? [])]);\n}\n\nfunction hasFreshNativeExplicitMention(\n index: EntityMentionIndex,\n nativeChunks: NativeKnowledgeChunk[],\n query: string,\n): boolean {\n if (nativeChunks.length === 0) return false;\n const nativeCanonicalIds = new Set(nativeChunks.map(nativePseudoCanonicalId));\n const freshNativeIndex: EntityMentionIndex = {\n ...index,\n entities: [\n ...index.entities.filter((entry) => !nativeCanonicalIds.has(entry.canonicalId)),\n ...nativeChunks.map(createPseudoNativeEntry),\n ],\n };\n return resolveLanguageIndependentExplicitCandidates(freshNativeIndex, query).length > 0;\n}\n\nasync function buildEntityMentionIndex(\n storage: StorageManager,\n config: PluginConfig,\n recallNamespaces?: string[],\n namespaceStorage?: (namespace: string) => Promise<StorageManager>,\n nativeChunksOverride?: NativeKnowledgeChunk[],\n resolvedStorages?: StorageManager[],\n): Promise<EntityMentionIndex> {\n const storages = resolvedStorages ?? await resolveEntityIndexStorages(\n storage,\n config,\n recallNamespaces,\n namespaceStorage,\n );\n const shouldPersistIndex =\n storages.length === 1 && path.resolve(storages[0]!.dir) === path.resolve(storage.dir);\n const entityStatusVersionBefore = shouldPersistIndex ? storage.getMemoryStatusVersion() : undefined;\n const [previousIndex, entityFileSets, memorySets, nativeChunks] = await Promise.all([\n shouldPersistIndex ? readEntityIndexState(storage) : Promise.resolve(null),\n Promise.all(storages.map((scopedStorage) => scopedStorage.readAllEntityFiles())),\n Promise.all(storages.map((scopedStorage) => scopedStorage.readAllMemories())),\n nativeChunksOverride ? Promise.resolve(nativeChunksOverride) : readNativeChunks(config, recallNamespaces),\n ]);\n // Pair each entity with the storage that owns it (#1534): canonical ids must\n // reflect that store's aliases and historical migration mappings, never another\n // namespace's.\n const entityRecords = entityFileSets.flatMap((set, index) =>\n set.map((entity) => ({ entity, storage: storages[index]! })),\n );\n const memories = memorySets.flat();\n\n const entities = new Map<string, EntityMentionIndexEntry>();\n for (const { entity, storage: entityStorage } of entityRecords) {\n const canonicalId =\n typeof entityStorage.normalizeEntityName === \"function\"\n ? entityStorage.normalizeEntityName(entity.name, entity.type)\n : normalizeEntityName(entity.name, entity.type, entityStorage.entityAliases);\n const rawStructuredSections = entity.structuredSections ?? [];\n const rawBeliefLedgerFactKeys = beliefLedgerFactKeys(rawStructuredSections);\n const sanitizedFacts = entity.facts\n .map((fact) => sanitizeEntityFact(fact))\n .filter(Boolean)\n .filter((fact) => !rawBeliefLedgerFactKeys.has(normalizeEntityText(fact)))\n .map((fact) => compactLine(fact, 180));\n const sanitizedTimelineFacts = entity.timeline\n .map((entry) => sanitizeEntityFact(entry.text))\n .filter(Boolean)\n .map((fact) => compactLine(fact, 180));\n entities.set(canonicalId, {\n canonicalId,\n name: entity.name,\n type: entity.type,\n aliases: uniqueStrings(entity.aliases),\n summary: entity.synthesis?.trim() || entity.summary?.trim() || undefined,\n facts: sanitizedFacts,\n timelineFacts: uniqueStrings(sanitizedTimelineFacts),\n structuredSections: rawStructuredSections.map((section) => ({\n key: section.key,\n title: section.title,\n facts: recallFactsForStructuredSection(section)\n .map((fact) => sanitizeEntityFact(fact))\n .filter(Boolean)\n .map((fact) => compactLine(fact, 180)),\n })).filter((section) => section.facts.length > 0),\n timeline: entity.timeline.map((entry) => ({ ...entry })),\n relationships: entity.relationships.map((relationship) => ({ ...relationship })),\n activity: entity.activity.map((activity) => ({ ...activity })),\n factCount: sanitizedFacts.length,\n memorySnippets: [],\n nativeChunks: [],\n });\n }\n\n for (const memory of memories) {\n const entityRef = typeof memory.frontmatter.entityRef === \"string\" ? memory.frontmatter.entityRef : \"\";\n if (!entityRef) continue;\n const entry = entities.get(entityRef);\n if (!entry) continue;\n const snippet = await readMemorySnippet(memory);\n if (!entry.memorySnippets.includes(snippet)) {\n entry.memorySnippets.push(snippet);\n }\n }\n\n const aliasIndex = buildAliasIndex([...entities.values()]);\n for (const chunk of nativeChunks) {\n const existingPseudo = entities.get(nativePseudoCanonicalId(chunk));\n if (existingPseudo) {\n mergeNativeChunk(existingPseudo, chunk);\n continue;\n }\n const candidateAliases = uniqueStrings([chunk.title, ...(chunk.aliases ?? [])]).map(normalizeEntityText).filter(Boolean);\n let matched = false;\n for (const alias of candidateAliases) {\n for (const entry of aliasIndex.get(alias) ?? []) {\n mergeNativeChunk(entry, chunk);\n matched = true;\n }\n }\n if (matched) continue;\n const pseudoEntry = createPseudoNativeEntry(chunk);\n entities.set(pseudoEntry.canonicalId, pseudoEntry);\n }\n\n const sortedEntities = [...entities.values()].sort((left, right) => left.name.localeCompare(right.name));\n const previousEntities = previousIndex ? JSON.stringify(previousIndex.entities) : \"\";\n const nextEntities = JSON.stringify(sortedEntities);\n const entityStatusVersionAfter = shouldPersistIndex ? storage.getMemoryStatusVersion() : undefined;\n const canPersistIndex = shouldPersistIndex && entityStatusVersionBefore === entityStatusVersionAfter;\n const index: EntityMentionIndex = {\n version: ENTITY_INDEX_VERSION,\n updatedAt:\n previousIndex && previousEntities === nextEntities\n ? previousIndex.updatedAt\n : new Date().toISOString(),\n entityStatusVersion: canPersistIndex ? entityStatusVersionAfter : undefined,\n entities: sortedEntities,\n };\n if (canPersistIndex) {\n await writeEntityIndexState(storage, index);\n }\n return index;\n}\n\nfunction resolveExplicitCandidates(\n index: EntityMentionIndex,\n query: string,\n): EntityCandidate[] {\n const candidates: EntityCandidate[] = [];\n for (const entry of index.entities) {\n const aliases = uniqueStrings([entry.name, ...entry.aliases]);\n let bestAlias = \"\";\n let bestScore = 0;\n for (const alias of aliases) {\n const score = scoreAliasMatch(query, alias);\n if (score > bestScore) {\n bestAlias = alias;\n bestScore = score;\n }\n }\n if (bestScore <= 0) continue;\n candidates.push({ entry, alias: bestAlias, score: bestScore, source: \"query\" });\n }\n return candidates.sort((left, right) => right.score - left.score);\n}\n\nconst EXPLICIT_ENTITY_MENTION_SCORE = 9;\n\nconst IMPLICIT_ENTITY_STOP_WORDS = new Set([\n \"a\",\n \"an\",\n \"and\",\n \"are\",\n \"as\",\n \"at\",\n \"be\",\n \"by\",\n \"can\",\n \"do\",\n \"for\",\n \"from\",\n \"has\",\n \"how\",\n \"i\",\n \"if\",\n \"in\",\n \"is\",\n \"it\",\n \"me\",\n \"my\",\n \"of\",\n \"on\",\n \"or\",\n \"the\",\n \"to\",\n \"was\",\n \"what\",\n \"when\",\n \"where\",\n \"who\",\n \"why\",\n \"with\",\n \"you\",\n \"your\",\n]);\n\nfunction isDistinctiveImplicitAlias(normalizedAlias: string): boolean {\n const tokens = normalizedAlias.split(/\\s+/).filter(Boolean);\n if (tokens.length > 1 && tokens.every((token) => IMPLICIT_ENTITY_STOP_WORDS.has(token))) return false;\n if (tokens.length !== 1) return true;\n const token = tokens[0]!;\n return Array.from(token).length > 1 && !IMPLICIT_ENTITY_STOP_WORDS.has(token);\n}\n\nfunction isShortLatinAlias(alias: string): boolean {\n return /^[A-Za-z]{2,3}$/.test(alias.trim());\n}\n\nfunction hasStrongShortLatinAliasMention(query: string, alias: string): boolean {\n const normalizedAlias = alias.trim();\n const titleCaseAlias = `${normalizedAlias[0]!.toUpperCase()}${normalizedAlias.slice(1).toLowerCase()}`;\n const forms = new Set([normalizedAlias, normalizedAlias.toUpperCase(), titleCaseAlias]);\n return [...forms].some((form) => {\n if (form === form.toLowerCase()) return false;\n const escaped = form.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(`(?:^|[^A-Za-z0-9])${escaped}(?:$|[^A-Za-z0-9])`).test(query);\n });\n}\n\nfunction resolveLanguageIndependentExplicitCandidates(\n index: EntityMentionIndex,\n query: string,\n): EntityCandidate[] {\n const canonicalIdsByAlias = new Map<string, Set<string>>();\n for (const entry of index.entities) {\n for (const alias of uniqueStrings([entry.name, ...entry.aliases])) {\n const normalizedAlias = normalizeEntityText(alias);\n if (!normalizedAlias) continue;\n const canonicalIds = canonicalIdsByAlias.get(normalizedAlias) ?? new Set<string>();\n canonicalIds.add(entry.canonicalId);\n canonicalIdsByAlias.set(normalizedAlias, canonicalIds);\n }\n }\n\n const candidates: EntityCandidate[] = [];\n for (const entry of index.entities) {\n let bestAlias = \"\";\n let bestScore = 0;\n for (const alias of uniqueStrings([entry.name, ...entry.aliases])) {\n const normalizedAlias = normalizeEntityText(alias);\n const score = scoreAliasMatch(query, alias);\n if (\n !normalizedAlias ||\n !isDistinctiveImplicitAlias(normalizedAlias) ||\n (isShortLatinAlias(alias) && !hasStrongShortLatinAliasMention(query, alias)) ||\n canonicalIdsByAlias.get(normalizedAlias)?.size !== 1 ||\n score < EXPLICIT_ENTITY_MENTION_SCORE ||\n score <= bestScore\n ) {\n continue;\n }\n bestAlias = alias;\n bestScore = score;\n }\n if (bestAlias) {\n candidates.push({ entry, alias: bestAlias, score: bestScore, source: \"query\" });\n }\n }\n\n return candidates.sort(\n (left, right) => right.score - left.score || left.entry.name.localeCompare(right.entry.name),\n );\n}\n\nfunction resolveRecentTurnCandidates(\n index: EntityMentionIndex,\n transcriptEntries: TranscriptEntry[],\n recentTurns: number,\n): EntityCandidate[] {\n if (recentTurns <= 0 || transcriptEntries.length === 0) return [];\n const recentEntries = transcriptEntries.slice(-recentTurns);\n const candidates = new Map<string, EntityCandidate>();\n for (let indexOffset = recentEntries.length - 1; indexOffset >= 0; indexOffset -= 1) {\n const turn = recentEntries[indexOffset];\n const recencyBoost = recentEntries.length - indexOffset;\n const roleWeight = turn.role === \"user\" ? 2 : turn.role === \"assistant\" ? -1 : 0;\n for (const entry of index.entities) {\n const aliases = uniqueStrings([entry.name, ...entry.aliases]);\n for (const alias of aliases) {\n const score = scoreAliasMatch(turn.content, alias);\n if (score <= 0) continue;\n const current = candidates.get(entry.canonicalId);\n const weightedScore = score + Math.max(0, 6 - recencyBoost) + roleWeight;\n if (!current || weightedScore > current.score) {\n candidates.set(entry.canonicalId, {\n entry,\n alias,\n score: weightedScore,\n source: \"recent_turn\",\n });\n }\n }\n }\n }\n return [...candidates.values()].sort((left, right) => right.score - left.score);\n}\n\nasync function readMemorySnippet(memory: MemoryFile): Promise<string> {\n const content = memory.content.replace(/\\s+/g, \" \").trim();\n return compactLine(content, 180);\n}\n\nasync function buildHintSnippets(\n entry: EntityMentionIndexEntry,\n queryTokens: string[],\n mode: EntityQueryMode,\n maxSupportingFacts: number,\n requestedSectionKeys: Set<string>,\n): Promise<EntityHintSnippet[]> {\n const snippets: EntityHintSnippet[] = [];\n const aliasTokens = new Set(tokenize(uniqueStrings([entry.name, ...entry.aliases]).join(\" \")));\n if (entry.summary) {\n snippets.push({ text: compactLine(entry.summary, 180), score: 10, kind: \"summary\" });\n }\n\n if (requestedSectionKeys.size > 0) {\n for (const section of entry.structuredSections) {\n if (!requestedSectionKeys.has(normalizeEntityText(section.key).replace(/\\s+/g, \"_\"))) continue;\n for (const fact of section.facts) {\n snippets.push({ text: fact, score: mode === \"direct\" ? 8 : 9, kind: \"section\" });\n }\n }\n } else {\n for (const fact of entry.timelineFacts) {\n snippets.push({ text: fact, score: mode === \"direct\" ? 6 : 7, kind: \"fact\" });\n }\n for (const section of entry.structuredSections) {\n for (const fact of section.facts) {\n const normalizedFact = normalizeEntityText(fact);\n const hasNonAliasQueryOverlap = queryTokens.some((token) =>\n !aliasTokens.has(token) && normalizedFact.includes(token)\n );\n if (entry.timelineFacts.length > 0 && !hasNonAliasQueryOverlap) {\n continue;\n }\n snippets.push({ text: fact, score: mode === \"direct\" ? 6 : 7, kind: \"fact\" });\n }\n }\n if (entry.timelineFacts.length === 0 && entry.structuredSections.length === 0) {\n for (const fact of entry.facts) {\n if (!fact.trim()) continue;\n snippets.push({ text: fact, score: mode === \"direct\" ? 6 : 7, kind: \"fact\" });\n }\n }\n }\n\n if (requestedSectionKeys.size === 0) {\n for (const relationship of entry.relationships) {\n snippets.push({\n text: compactLine(relationLine(entry, relationship), 180),\n score: mode === \"direct\" && entry.type.toLowerCase() === \"person\" ? 6 : 4,\n kind: \"relationship\",\n });\n }\n\n for (const activity of entry.activity) {\n snippets.push({\n text: compactLine(`${activity.date}: ${activity.note}`, 180),\n score: 4,\n kind: \"activity\",\n });\n }\n\n for (const memorySnippet of entry.memorySnippets.slice(0, Math.min(maxSupportingFacts, 4))) {\n snippets.push({\n text: memorySnippet,\n score: 5,\n kind: \"memory\",\n });\n }\n\n for (const chunk of entry.nativeChunks) {\n snippets.push({\n text: compactLine(chunk.snippet, 180),\n score: 3,\n kind: \"native\",\n });\n }\n }\n\n const deduped = new Map<string, EntityHintSnippet>();\n for (const snippet of snippets) {\n const scored = scoreHintSnippet(snippet, queryTokens);\n if (!scored) continue;\n const normalized = normalizeEntityText(scored.text);\n const existing = deduped.get(normalized);\n if (!existing || scored.score > existing.score) deduped.set(normalized, scored);\n }\n\n return [...deduped.values()]\n .filter((snippet) => snippet.score > 0)\n .sort((left, right) => right.score - left.score)\n .slice(0, maxSupportingFacts);\n}\n\nfunction summarizeUncertainty(snippets: EntityHintSnippet[]): string | null {\n const direct = snippets.filter((snippet) =>\n snippet.kind === \"summary\"\n || snippet.kind === \"fact\"\n || snippet.kind === \"section\"\n || snippet.kind === \"memory\"\n );\n if (direct.length < 2) return null;\n for (let index = 0; index < direct.length; index += 1) {\n for (let compare = index + 1; compare < direct.length; compare += 1) {\n if (jaccardSimilarity(direct[index].text, direct[compare].text) < 0.2) {\n return \"Evidence is mixed across stored facts; treat the hints below as partial and verify before answering definitively.\";\n }\n }\n }\n return null;\n}\n\nfunction formatEntityHintSection(\n candidates: Array<{\n candidate: EntityCandidate;\n snippets: EntityHintSnippet[];\n uncertainty: string | null;\n }>,\n queryTokens: string[],\n mode: EntityQueryMode,\n maxRelatedEntities: number,\n maxChars: number,\n): string | null {\n if (candidates.length === 0) return null;\n const lines: string[] = [\"## entity_answer_hints\", \"\"];\n for (const { candidate, snippets, uncertainty } of candidates) {\n const hasSummary = Boolean(candidate.entry.summary?.trim());\n const preferredTopSnippets = hasSummary\n ? snippets.filter((snippet) => snippet.kind !== \"fact\")\n : snippets;\n let topSnippets = (\n preferredTopSnippets.length > 0 ? preferredTopSnippets : snippets\n ).slice(0, 3);\n const buildTimelineSnippets = (seedExcludedTexts: Set<string>): EntityHintSnippet[] => {\n const explicitTimelinePool = dedupeHintSnippetsByText(\n (candidate.entry.timeline ?? [])\n .slice()\n .sort(sortTimelineEntriesDesc)\n .map((entry) => sanitizeEntityFact(entry.text))\n .filter(Boolean)\n .map((text) => scoreHintSnippet({\n text: compactLine(text, 180),\n score: 7,\n kind: \"activity\" as const,\n }, queryTokens))\n .filter((snippet): snippet is EntityHintSnippet => snippet !== null)\n .filter((snippet) => !seedExcludedTexts.has(normalizeEntityText(snippet.text))),\n ).slice(0, 2);\n const activityTimelinePool = dedupeHintSnippetsByText(\n snippets\n .filter((snippet) => (\n snippet.kind === \"activity\" || snippet.kind === \"memory\"\n ) && !seedExcludedTexts.has(normalizeEntityText(snippet.text))),\n ).slice(0, 2);\n return explicitTimelinePool.length > 0\n ? explicitTimelinePool\n : activityTimelinePool.length > 0\n ? activityTimelinePool\n : dedupeHintSnippetsByText(\n snippets\n .filter((snippet) => (\n snippet.kind === \"fact\" || snippet.kind === \"summary\"\n ) && !seedExcludedTexts.has(normalizeEntityText(snippet.text))),\n ).slice(0, 2);\n };\n const baseTopSnippetTexts = new Set(topSnippets.map((snippet) => normalizeEntityText(snippet.text)));\n const timelinePool = mode !== \"direct\" ? buildTimelineSnippets(baseTopSnippetTexts) : [];\n if (mode !== \"direct\" && hasSummary && topSnippets.length < 2) {\n if (timelinePool.length > 0) {\n topSnippets = [...topSnippets, timelinePool[0]!].slice(0, 3);\n }\n }\n const topSnippetTexts = new Set(topSnippets.map((snippet) => normalizeEntityText(snippet.text)));\n lines.push(`- target: ${candidate.entry.name} (${candidate.entry.type})`);\n if (candidate.source === \"recent_turn\") {\n lines.push(`- resolution: carried forward from recent turns via alias \"${candidate.alias}\"`);\n } else {\n lines.push(`- resolution: matched alias \"${candidate.alias}\" in the query`);\n }\n if (uncertainty) lines.push(`- uncertainty: ${uncertainty}`);\n if (topSnippets.length > 0) {\n lines.push(\"- likely answer:\");\n for (const snippet of topSnippets) {\n lines.push(` - ${snippet.text}`);\n }\n }\n if (mode !== \"direct\") {\n const fallbackTimeline = timelinePool.filter(\n (snippet) => !topSnippetTexts.has(normalizeEntityText(snippet.text)),\n );\n if (fallbackTimeline.length > 0) {\n lines.push(\"- recent timeline:\");\n for (const snippet of fallbackTimeline) {\n lines.push(` - ${snippet.text}`);\n }\n }\n }\n const related = candidate.entry.relationships.slice(0, maxRelatedEntities).map((relationship) => relationship.target);\n if (related.length > 0) {\n lines.push(`- related entities: ${related.join(\", \")}`);\n }\n lines.push(`- support counts: facts=${candidate.entry.factCount}, memories=${candidate.entry.memorySnippets.length}, native=${candidate.entry.nativeChunks.length}`);\n lines.push(\"\");\n }\n\n let result = lines.join(\"\\n\");\n if (result.length > maxChars) {\n result = `${result.slice(0, Math.max(0, maxChars - 15)).trimEnd()}\\n\\n...(trimmed)\\n`;\n }\n return result.trim().length > 0 ? result.trimEnd() : null;\n}\n\nexport async function buildEntityRecallSection(options: BuildEntityRecallSectionOptions): Promise<string | null> {\n const prefixedMode = detectEntityQueryMode(options.query);\n const persistedIndex = prefixedMode\n ? null\n : await readCurrentPersistedEntityIndex(\n options.storage,\n options.config,\n options.recallNamespaces,\n options.namespaceStorage,\n );\n let nativeChunks: NativeKnowledgeChunk[] | undefined;\n if (\n !prefixedMode &&\n persistedIndex &&\n resolveLanguageIndependentExplicitCandidates(persistedIndex, options.query).length === 0\n ) {\n nativeChunks = await readNativeChunks(options.config, options.recallNamespaces);\n if (!hasFreshNativeExplicitMention(persistedIndex, nativeChunks, options.query)) {\n return null;\n }\n }\n const namespaceScoped =\n resolveNamespaceCapabilities(options.config).namespaces &&\n options.namespaceStorage !== undefined &&\n (options.recallNamespaces?.length ?? 0) > 0;\n const resolvedStorages = namespaceScoped\n ? await resolveEntityIndexStorages(\n options.storage,\n options.config,\n options.recallNamespaces,\n options.namespaceStorage,\n )\n : undefined;\n const namespaceCacheKey =\n resolvedStorages && options.recallNamespaces\n ? namespaceEntityIndexCacheKey(resolvedStorages, options.recallNamespaces)\n : undefined;\n let index: EntityMentionIndex | undefined = namespaceCacheKey\n ? namespaceEntityIndexCache.get(namespaceCacheKey)\n : undefined;\n if (!index) {\n index = await buildEntityMentionIndex(\n options.storage,\n options.config,\n options.recallNamespaces,\n options.namespaceStorage,\n nativeChunks,\n resolvedStorages,\n );\n if (namespaceCacheKey) rememberNamespaceEntityIndex(namespaceCacheKey, index);\n }\n const explicitCandidates = resolveExplicitCandidates(index, options.query);\n const queryCandidates = prefixedMode\n ? explicitCandidates\n : resolveLanguageIndependentExplicitCandidates(index, options.query);\n const mode = prefixedMode ?? (queryCandidates.length > 0 ? \"direct\" : null);\n if (!mode) return null;\n\n const candidates = queryCandidates.length > 0\n ? queryCandidates\n : resolveRecentTurnCandidates(index, options.transcriptEntries, options.recentTurns);\n\n if (candidates.length === 0) return null;\n\n const queryTokens = tokenize(options.query);\n const candidateLimit = queryCandidates.length === 0 && mode === \"follow_up\"\n ? 1\n : options.maxHints;\n const rankedCandidates = candidates.slice(0, candidateLimit);\n const enriched = await Promise.all(\n rankedCandidates.map(async (candidate) => {\n const requestedSectionKeys = new Set(\n resolveRequestedEntitySectionKeys(\n options.query,\n candidate.entry.type,\n candidate.entry.structuredSections,\n options.config.entitySchemas,\n ),\n );\n const snippets = await buildHintSnippets(\n candidate.entry,\n queryTokens,\n mode,\n options.maxSupportingFacts,\n requestedSectionKeys,\n );\n return {\n candidate,\n snippets,\n uncertainty: summarizeUncertainty(snippets),\n };\n }),\n );\n\n const section = formatEntityHintSection(enriched, queryTokens, mode, options.maxRelatedEntities, options.maxChars);\n if (!section) return null;\n return section;\n}\n\nexport async function readRecentEntityTranscriptEntries(\n transcriptEntriesPromise: Promise<TranscriptEntry[]>,\n recentTurns: number,\n): Promise<TranscriptEntry[]> {\n if (recentTurns <= 0) return [];\n const transcriptEntries = await transcriptEntriesPromise.catch(() => []);\n if (transcriptEntries.length === 0) return [];\n return transcriptEntries.slice(-Math.max(1, recentTurns * 2));\n}\n\nexport const entityIndexVersion = ENTITY_INDEX_VERSION;\nexport const entityRecentTranscriptLookbackHours = RECENT_TRANSCRIPT_LOOKBACK_HOURS;\n"],"mappings":"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","names":["index","token"]}
|