@remnic/core 10.0.13 → 10.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abstraction-nodes.js +3 -2
- package/dist/access-admin-ops-surface.js +96 -92
- package/dist/access-authorization-probe.js +97 -93
- package/dist/access-boundary.js +96 -92
- package/dist/access-cli.js +203 -198
- package/dist/access-cli.js.map +1 -1
- package/dist/access-extraction-force-flush.js +96 -92
- package/dist/access-http-briefing.js +97 -93
- package/dist/access-http-query.js +98 -94
- package/dist/access-http.js +121 -117
- package/dist/access-idempotency.js +3 -2
- package/dist/access-identity-continuity-surface.js +96 -92
- package/dist/access-lcm-surface.js +96 -92
- package/dist/access-mcp.js +110 -106
- package/dist/access-namespace-preflight.js +96 -92
- package/dist/access-observe-write-category.js +18 -17
- package/dist/access-observe-write-surface.js +96 -92
- package/dist/access-offline-manifest.js +17 -15
- package/dist/access-operations-batch.js +101 -97
- package/dist/access-operations.js +108 -104
- package/dist/access-recall-concurrency.js +96 -92
- package/dist/access-recall-diagnostics.js +2 -2
- package/dist/access-recall-response.js +96 -92
- package/dist/access-recall-surface.js +96 -92
- package/dist/access-schema.d.ts +2 -2
- package/dist/access-schema.js +13 -12
- package/dist/access-service.js +96 -92
- package/dist/access-surface-catalog.js +98 -94
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/active-recall.js +43 -39
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/{auto-sync-DGJOZYGT.js → auto-sync-7WWAKW6F.js} +8 -8
- package/dist/briefing.js +32 -28
- package/dist/buffer.js +13 -13
- package/dist/calibration.d.ts.map +1 -1
- package/dist/calibration.js +6 -3
- package/dist/calibration.js.map +1 -1
- package/dist/{capsule-merge-M4HETD27.js → capsule-merge-LGYURS3C.js} +6 -5
- package/dist/{capsule-merge-M4HETD27.js.map → capsule-merge-LGYURS3C.js.map} +1 -1
- package/dist/capture-write-lock-backoff.d.ts +50 -0
- package/dist/capture-write-lock-backoff.d.ts.map +1 -0
- package/dist/capture-write-lock-backoff.js +30 -0
- package/dist/capture-write-lock.d.ts +6 -0
- package/dist/capture-write-lock.d.ts.map +1 -0
- package/dist/capture-write-lock.js +15 -0
- package/dist/causal-behavior.js +4 -3
- package/dist/causal-behavior.js.map +1 -1
- package/dist/causal-chain.js +4 -3
- package/dist/causal-consolidation.js +36 -32
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-retrieval.js +4 -3
- package/dist/causal-retrieval.js.map +1 -1
- package/dist/causal-trajectory-graph.js +7 -6
- package/dist/causal-trajectory-graph.js.map +1 -1
- package/dist/causal-trajectory.js +3 -2
- package/dist/{chunk-KZO43HPY.js → chunk-22RM2ZUJ.js} +112 -112
- package/dist/{chunk-ZUMXY4KA.js → chunk-22W2XWGH.js} +3 -3
- package/dist/{chunk-MZBWIJJN.js → chunk-23ZQPP2G.js} +24 -19
- package/dist/chunk-23ZQPP2G.js.map +1 -0
- package/dist/{chunk-PCWXLAJY.js → chunk-2PTH4PRL.js} +2 -2
- package/dist/{chunk-ZIZ2G47N.js → chunk-2PYHLSXK.js} +2 -2
- package/dist/{chunk-B6O2YLUR.js → chunk-2Z5DIDQD.js} +6 -1
- package/dist/chunk-2Z5DIDQD.js.map +1 -0
- package/dist/{chunk-7OAIOE5P.js → chunk-33G67YZF.js} +2 -2
- package/dist/{chunk-AV2OQF2O.js → chunk-3F3HA3R2.js} +2 -2
- package/dist/{chunk-RP5SJ3XR.js → chunk-3GNIJUUE.js} +2 -2
- package/dist/{chunk-QZZPUREO.js → chunk-3GYSZHMT.js} +3 -3
- package/dist/{chunk-QWWMS4AE.js → chunk-3MO4LWYU.js} +1 -1
- package/dist/chunk-3MO4LWYU.js.map +1 -0
- package/dist/{chunk-SWIKABKI.js → chunk-3Q3XD3NO.js} +2 -2
- package/dist/{chunk-AL6EHLB5.js → chunk-3X3PNU3T.js} +2 -2
- package/dist/{chunk-BTJ6CAIA.js → chunk-4IYIGN53.js} +10 -10
- package/dist/{chunk-BZTRPCCH.js → chunk-4PDTVVSW.js} +2 -2
- package/dist/{chunk-HM7RHKS4.js → chunk-4RNBLLZR.js} +2 -2
- package/dist/{chunk-Y3VDGK2O.js → chunk-4SCZZ3U7.js} +282 -84
- package/dist/chunk-4SCZZ3U7.js.map +1 -0
- package/dist/{chunk-JUWJYXI4.js → chunk-5ATSXCAG.js} +4 -4
- package/dist/{chunk-EHRE7ZG3.js → chunk-5B5WYAHQ.js} +2 -2
- package/dist/{chunk-WCGJK4NQ.js → chunk-5FNZ3G6X.js} +10 -10
- package/dist/{chunk-Y6DZ33PA.js → chunk-5GX5457J.js} +4 -4
- package/dist/{chunk-EMFBC7L3.js → chunk-5KGYTX5O.js} +2 -2
- package/dist/{chunk-OFCHT2TN.js → chunk-5LRV557D.js} +2 -2
- package/dist/{chunk-DXHVD4DS.js → chunk-5SMR542T.js} +3 -3
- package/dist/{chunk-S7LWX2PQ.js → chunk-655FVTCD.js} +2 -2
- package/dist/{chunk-DGRMWDQY.js → chunk-66BCOVW2.js} +7 -7
- package/dist/chunk-6EDW54SQ.js +298 -0
- package/dist/chunk-6EDW54SQ.js.map +1 -0
- package/dist/{chunk-5MDM7UE4.js → chunk-6WGMZQGG.js} +2 -2
- package/dist/chunk-77R7BQZ2.js +152 -0
- package/dist/chunk-77R7BQZ2.js.map +1 -0
- package/dist/{chunk-IPLYGWQF.js → chunk-7LCGFUMB.js} +6 -6
- package/dist/{chunk-5ZJYHOJT.js → chunk-7VQ6AI7H.js} +8 -8
- package/dist/{chunk-KYY4EACB.js → chunk-7Z3DLNSD.js} +2 -2
- package/dist/{chunk-LNH76ZJX.js → chunk-AIYXVWUH.js} +27 -2
- package/dist/{chunk-LNH76ZJX.js.map → chunk-AIYXVWUH.js.map} +1 -1
- package/dist/{chunk-G7NYVKD6.js → chunk-B2NXOVZN.js} +2 -2
- package/dist/{chunk-B43NMCGQ.js → chunk-BK2BVLZW.js} +2 -2
- package/dist/{chunk-QJ622LTI.js → chunk-BQOGQULP.js} +30 -8
- package/dist/chunk-BQOGQULP.js.map +1 -0
- package/dist/{chunk-BOOFTFFE.js → chunk-C2RW36YR.js} +2 -2
- package/dist/{chunk-XERVJYH2.js → chunk-C6JMGAMO.js} +7 -3
- package/dist/chunk-C6JMGAMO.js.map +1 -0
- package/dist/{chunk-5JMI26Q7.js → chunk-CBH2Z4UA.js} +2 -2
- package/dist/{chunk-P2S6P7X6.js → chunk-CFZ4SXXH.js} +2 -2
- package/dist/{chunk-YRH3C2OJ.js → chunk-CIIHIAJ2.js} +13 -5
- package/dist/chunk-CIIHIAJ2.js.map +1 -0
- package/dist/{chunk-6M56RFFJ.js → chunk-CJRENHVZ.js} +3 -3
- package/dist/{chunk-EGDYVYU7.js → chunk-CLWBFR7Q.js} +3 -3
- package/dist/{chunk-375ARKRS.js → chunk-D5SSBCYY.js} +70 -59
- package/dist/chunk-D5SSBCYY.js.map +1 -0
- package/dist/{chunk-KI6UOSNR.js → chunk-DEY7B77Y.js} +2 -2
- package/dist/chunk-DEY7B77Y.js.map +1 -0
- package/dist/{chunk-6VAHJ2F6.js → chunk-DMDWFQMR.js} +2 -2
- package/dist/{chunk-BLVHDY2U.js → chunk-DOWACHYO.js} +5 -2
- package/dist/chunk-DOWACHYO.js.map +1 -0
- package/dist/{chunk-UZSBCQEC.js → chunk-DPSOFK4D.js} +2 -2
- package/dist/{chunk-IZT3BVDW.js → chunk-DQR2LD3V.js} +2 -2
- package/dist/{chunk-K4QY55XV.js → chunk-EH4BQ7LT.js} +2 -2
- package/dist/chunk-EHHQJTAU.js +131 -0
- package/dist/chunk-EHHQJTAU.js.map +1 -0
- package/dist/{chunk-EBA5DA77.js → chunk-EOU6V4IN.js} +2 -2
- package/dist/{chunk-GD7BWGIB.js → chunk-EU6IRUCY.js} +6 -4
- package/dist/{chunk-GD7BWGIB.js.map → chunk-EU6IRUCY.js.map} +1 -1
- package/dist/{chunk-7KYJNHGM.js → chunk-EUCYTCFP.js} +2 -2
- package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
- package/dist/{chunk-CKUUP64O.js → chunk-F2772ATT.js} +2 -2
- package/dist/{chunk-46EST7JO.js → chunk-F2XNSIPP.js} +2 -2
- package/dist/{chunk-2KRNPFPK.js → chunk-FLI6DEIU.js} +2 -2
- package/dist/{chunk-OAIWPB2I.js → chunk-FT4UQYOV.js} +2 -2
- package/dist/{chunk-HYNEDMYJ.js → chunk-G2OYFTUD.js} +2 -2
- package/dist/{chunk-XTN54NML.js → chunk-G3T6YMBO.js} +4 -4
- package/dist/{chunk-CNG2XVZG.js → chunk-G3UUAQOD.js} +2 -2
- package/dist/{chunk-2ZQJLBV6.js → chunk-GCVDFX66.js} +4 -4
- package/dist/{chunk-ON4ILX3G.js → chunk-GFAM2LTC.js} +2 -2
- package/dist/{chunk-2LUSQV4U.js → chunk-GKJJNO7C.js} +2 -2
- package/dist/{chunk-T2YX56QI.js → chunk-GQJKVQJR.js} +2 -2
- package/dist/{chunk-5AOAQR37.js → chunk-GWVNGDJW.js} +3 -3
- package/dist/{chunk-YDH2FSDI.js → chunk-GZXXPCWJ.js} +3 -3
- package/dist/{chunk-5JCLELOP.js → chunk-H5IUN433.js} +2 -2
- package/dist/{chunk-IWHEJXR2.js → chunk-H6FREOYX.js} +8 -8
- package/dist/{chunk-B7CANWCA.js → chunk-HBAOOSHU.js} +2 -2
- package/dist/{chunk-Q4E24IRR.js → chunk-HDN7IVIO.js} +14 -11
- package/dist/chunk-HDN7IVIO.js.map +1 -0
- package/dist/{chunk-T3FMRLWQ.js → chunk-HFSPY26A.js} +2 -2
- package/dist/{chunk-B657ZGDH.js → chunk-HQSK2INQ.js} +2 -2
- package/dist/{chunk-RT6D3WN7.js → chunk-IJMDBYCO.js} +2 -2
- package/dist/{chunk-CS2JEHTB.js → chunk-IUCPLBDS.js} +9 -9
- package/dist/{chunk-XRBHXUTQ.js → chunk-IWD33CF4.js} +6 -6
- package/dist/{chunk-4IHBN6WU.js → chunk-JKMIGCK6.js} +2 -2
- package/dist/{chunk-YYO447A7.js → chunk-JNIVZNIB.js} +41 -253
- package/dist/chunk-JNIVZNIB.js.map +1 -0
- package/dist/{chunk-ROBHL3GL.js → chunk-JWX2Q6HS.js} +2 -2
- package/dist/{chunk-3I3U6FFT.js → chunk-K7BN34IA.js} +2 -2
- package/dist/{chunk-4O6WRBGE.js → chunk-KJXP6RUG.js} +5 -1
- package/dist/chunk-KJXP6RUG.js.map +1 -0
- package/dist/{chunk-4THZGKQ2.js → chunk-KLJVTZ3R.js} +3 -3
- package/dist/{chunk-4G4B3Z2B.js → chunk-KW4AJ7T3.js} +2 -2
- package/dist/{chunk-HT2C4EXO.js → chunk-L5VCT7LU.js} +8 -4
- package/dist/chunk-L5VCT7LU.js.map +1 -0
- package/dist/{chunk-ZI7LMSNI.js → chunk-LLHZZOIB.js} +2 -2
- package/dist/{chunk-LS2FHUML.js → chunk-LQ5SS4OP.js} +3 -3
- package/dist/{chunk-NSFOERZQ.js → chunk-LWFWZTWX.js} +3 -3
- package/dist/{chunk-BMWN7B3Y.js → chunk-LXATZLSC.js} +3 -3
- package/dist/{chunk-OYKQ6T4V.js → chunk-MATDGSJ7.js} +2 -2
- package/dist/{chunk-3NFN4Y4P.js → chunk-MGCKZWAE.js} +5 -5
- package/dist/{chunk-O4KYRDRT.js → chunk-MJIOGYKX.js} +2 -2
- package/dist/{chunk-6OMUHXHP.js → chunk-ML7ZJAKJ.js} +2 -2
- package/dist/{chunk-GKIXBH7Y.js → chunk-MO6N4QYY.js} +4 -4
- package/dist/{chunk-A2E4WNW4.js → chunk-MWWAQXZ6.js} +2 -2
- package/dist/{chunk-VYPFEVOM.js → chunk-NHUX6GXA.js} +6 -6
- package/dist/{chunk-AKREOU5F.js → chunk-NZCKG25S.js} +2 -2
- package/dist/{chunk-4NDWE44P.js → chunk-NZFFGO5O.js} +2 -2
- package/dist/{chunk-WWSRLS4M.js → chunk-O2YPCFJT.js} +17 -17
- package/dist/{chunk-ZSJGYC3C.js → chunk-OQJKY3Z5.js} +2 -2
- package/dist/{chunk-U7VPOXVM.js → chunk-OQR42XCN.js} +82 -78
- package/dist/chunk-OQR42XCN.js.map +1 -0
- package/dist/{chunk-OFEHITAZ.js → chunk-OXNTOHL6.js} +2 -2
- package/dist/{chunk-FQD2KPQH.js → chunk-P55FACBG.js} +2 -2
- package/dist/chunk-PGRZ3FYC.js +34 -0
- package/dist/chunk-PGRZ3FYC.js.map +1 -0
- package/dist/{chunk-JYZSRNR7.js → chunk-PIITB2YZ.js} +2 -2
- package/dist/{chunk-PBVNVKYN.js → chunk-PIN5OPBA.js} +2 -2
- package/dist/chunk-PPUNC7UX.js +73 -0
- package/dist/chunk-PPUNC7UX.js.map +1 -0
- package/dist/{chunk-EQWEIIKQ.js → chunk-PQM3B54K.js} +6 -1
- package/dist/chunk-PQM3B54K.js.map +1 -0
- package/dist/{chunk-4TTGRETU.js → chunk-PRU7OF3Y.js} +5 -5
- package/dist/{chunk-K2FSASGZ.js → chunk-PVHQSLNN.js} +7 -7
- package/dist/{chunk-SVDU4OHO.js → chunk-Q35L7TYB.js} +2 -2
- package/dist/{chunk-5VC7J76U.js → chunk-QPH52AZB.js} +2 -2
- package/dist/{chunk-6T42L5FI.js → chunk-QS3OLP5I.js} +2 -2
- package/dist/{chunk-P34FDDB5.js → chunk-QSEUUQUF.js} +2 -2
- package/dist/chunk-QUIRIG2P.js +31 -0
- package/dist/chunk-QUIRIG2P.js.map +1 -0
- package/dist/{chunk-PAAJWQH5.js → chunk-QUMKDRCF.js} +2 -2
- package/dist/{chunk-KZEMFD6E.js → chunk-R2H4ZFBJ.js} +3 -3
- package/dist/{chunk-X3VID2TT.js → chunk-RI2KCQHP.js} +7 -3
- package/dist/chunk-RI2KCQHP.js.map +1 -0
- package/dist/{chunk-JFVCDEIC.js → chunk-RP7PQWZM.js} +7 -7
- package/dist/{chunk-KC46VZR5.js → chunk-RTTPBBAN.js} +9 -9
- package/dist/{chunk-ZQ3WU6JO.js → chunk-RXFCU3CY.js} +2 -2
- package/dist/{chunk-CBP4HWCL.js → chunk-RYYVMZBR.js} +3 -3
- package/dist/{chunk-2NCBDGND.js → chunk-SA6GMZJY.js} +3 -3
- package/dist/{chunk-VFTK5WKI.js → chunk-STBX5X6B.js} +2 -2
- package/dist/{chunk-WVHRNAXL.js → chunk-SWWHIJUJ.js} +2 -2
- package/dist/{chunk-WADSXS4K.js → chunk-SX4QDWXK.js} +2 -2
- package/dist/{chunk-WETFW255.js → chunk-T7ASDYNK.js} +2 -2
- package/dist/{chunk-XZLWYZ7C.js → chunk-THEPGZBM.js} +2 -2
- package/dist/{chunk-YEM7K3KD.js → chunk-TMC7HBED.js} +6 -6
- package/dist/{chunk-RWRQ67OR.js → chunk-TPNCXSXP.js} +2 -2
- package/dist/{chunk-LZKOVXMX.js → chunk-TRMJ6BYC.js} +2 -2
- package/dist/{chunk-A6TVQ3QP.js → chunk-UGYUBENJ.js} +3 -3
- package/dist/{chunk-AAM66QCP.js → chunk-UZRSI6NX.js} +2 -2
- package/dist/{chunk-XHWJRUVP.js → chunk-V3TXIXXY.js} +3 -3
- package/dist/{chunk-2CXQZXWM.js → chunk-V4MB5ONM.js} +6 -6
- package/dist/{chunk-UOKPJFO3.js → chunk-VNZMZPAC.js} +3 -3
- package/dist/{chunk-FZB4TS2W.js → chunk-VPXIKBPX.js} +5 -5
- package/dist/{chunk-CYEK6Z3P.js → chunk-VW6VIJOS.js} +2 -2
- package/dist/{chunk-QUA7RLK6.js → chunk-W3FVQBGF.js} +2 -2
- package/dist/{chunk-6OQ6N5RP.js → chunk-WGTR573G.js} +22 -22
- package/dist/{chunk-W3K3HITK.js → chunk-WLT6LTQP.js} +2 -2
- package/dist/{chunk-6Z2AZ4AJ.js → chunk-XKRXN63M.js} +2 -2
- package/dist/{chunk-3J5JKBYD.js → chunk-XLBFX63V.js} +80 -77
- package/dist/chunk-XLBFX63V.js.map +1 -0
- package/dist/{chunk-FZVROZKC.js → chunk-XVZA6VXC.js} +4 -4
- package/dist/{chunk-DA2INEB5.js → chunk-XYGQSDTH.js} +4 -4
- package/dist/chunk-YET735EZ.js +99 -0
- package/dist/chunk-YET735EZ.js.map +1 -0
- package/dist/{chunk-RBJQYMMT.js → chunk-YRULQW5J.js} +4 -4
- package/dist/{chunk-QUNDYIYZ.js → chunk-YYEOR4XN.js} +3 -3
- package/dist/{chunk-6WHJ2EAB.js → chunk-Z64TS5V4.js} +2 -2
- package/dist/{chunk-NHLLKEKK.js → chunk-ZAJLJ35W.js} +2 -2
- package/dist/{chunk-M7V65M6H.js → chunk-ZKHSAMTE.js} +2 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +154 -150
- package/dist/coding/export-okf-codegraph.js +32 -28
- package/dist/coding/export-okf-codegraph.js.map +1 -1
- package/dist/coding/pre-action-gate.js +4 -3
- package/dist/commitment-ledger.js +3 -2
- package/dist/compounding/engine.js +34 -30
- package/dist/config.js +43 -39
- package/dist/connectors/codex-materialize-runner.js +32 -28
- package/dist/connectors/index.js +32 -28
- package/dist/console/trace.d.ts +5 -14
- package/dist/console/trace.d.ts.map +1 -1
- package/dist/consolidation-provenance-check.d.ts.map +1 -1
- package/dist/consolidation-provenance-check.js +8 -6
- package/dist/consolidation-undo.js +5 -4
- package/dist/consolidation-undo.js.map +1 -1
- package/dist/contradiction/index.js +9 -7
- package/dist/converge-config.d.ts +2 -0
- package/dist/converge-config.d.ts.map +1 -1
- package/dist/converge-config.js +7 -3
- package/dist/convergence-refresh.js +34 -30
- package/dist/corpus-watermark.js +34 -30
- package/dist/correction/correction-planner.d.ts.map +1 -1
- package/dist/cue-anchors.js +4 -3
- package/dist/dashboard-runtime.js +2 -2
- package/dist/deep-recall-http-glue.js +14 -13
- package/dist/deep-recall.js +2 -2
- package/dist/{dreams-ledger-567VKVOU.js → dreams-ledger-UCHHRQ4R.js} +3 -2
- package/dist/embedding-fallback.js +5 -4
- package/dist/embedding-generation-lock.js +4 -3
- package/dist/entity-retrieval.js +33 -29
- package/dist/eval-trajectory-store.js +4 -3
- package/dist/eval-trajectory.js +4 -3
- package/dist/evals.js +3 -2
- package/dist/explicit-capture.js +11 -8
- package/dist/external-wiki-access.js +97 -93
- package/dist/extraction-quote-grounding.d.ts +67 -0
- package/dist/extraction-quote-grounding.d.ts.map +1 -0
- package/dist/extraction-quote-grounding.js +27 -0
- package/dist/extraction-quote-grounding.js.map +1 -0
- package/dist/extraction-source-grounding-helpers.d.ts +8 -0
- package/dist/extraction-source-grounding-helpers.d.ts.map +1 -1
- package/dist/extraction-source-grounding-helpers.js +11 -1
- package/dist/extraction-source-grounding-rules.d.ts +3 -1
- package/dist/extraction-source-grounding-rules.d.ts.map +1 -1
- package/dist/extraction-source-grounding-rules.js +3 -2
- package/dist/extraction-source-grounding.d.ts +1 -1
- package/dist/extraction-source-grounding.d.ts.map +1 -1
- package/dist/extraction-source-grounding.js +4 -3
- package/dist/extraction-span-materialize.js +2 -2
- package/dist/extraction.js +44 -39
- package/dist/{first-start-migration-HYAMKJ6V.js → first-start-migration-QVD22WWS.js} +9 -8
- package/dist/{first-start-migration-HYAMKJ6V.js.map → first-start-migration-QVD22WWS.js.map} +1 -1
- package/dist/{forget-OHAJ6PSU.js → forget-GXBWFKRC.js} +5 -4
- package/dist/{forget-OHAJ6PSU.js.map → forget-GXBWFKRC.js.map} +1 -1
- package/dist/{graph-edge-decay-CZ3SYLM4.js → graph-edge-decay-BYPZVJT4.js} +10 -9
- package/dist/graph-edge-decay-BYPZVJT4.js.map +1 -0
- package/dist/graph-jsonl.js +8 -7
- package/dist/graph-snapshot.js +8 -7
- package/dist/graph-write-lock.js +4 -3
- package/dist/graph.js +9 -8
- package/dist/harmonic-construction.js +5 -4
- package/dist/harmonic-retrieval.js +36 -32
- package/dist/harmonic-source-lookup.js +3 -2
- package/dist/http-retry.js +2 -1
- package/dist/http-retry.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +244 -237
- package/dist/json-store.d.ts.map +1 -1
- package/dist/json-store.js +2 -1
- package/dist/lcm/engine.js +4 -4
- package/dist/lcm/index.js +12 -12
- package/dist/location/index.js +35 -31
- package/dist/maintenance/dreams-ledger.d.ts.map +1 -1
- package/dist/maintenance/memory-governance.d.ts.map +1 -1
- package/dist/maintenance/memory-governance.js +32 -28
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +32 -28
- package/dist/maintenance/rebuild-memory-projection-runner.js +34 -30
- package/dist/maintenance/rebuild-memory-projection.js +33 -29
- package/dist/memory-browse-operations.js +97 -93
- package/dist/memory-browse.js +7 -7
- package/dist/memory-subject.js +5 -4
- package/dist/namespaces/migrate.js +33 -29
- package/dist/namespaces/search.js +11 -10
- package/dist/namespaces/storage.d.ts.map +1 -1
- package/dist/namespaces/storage.js +32 -28
- package/dist/objective-state-writers.js +4 -3
- package/dist/objective-state.js +3 -2
- package/dist/offline-sync-changeset-generations.js +7 -6
- package/dist/offline-sync-embedding-generation.js +6 -5
- package/dist/offline-sync-impression-drain.js +4 -4
- package/dist/offline-sync-snapshot-stream.js +10 -9
- package/dist/offline-sync.d.ts.map +1 -1
- package/dist/offline-sync.js +11 -10
- package/dist/operator-doctor-corpus.js +35 -31
- package/dist/operator-toolkit.js +58 -54
- package/dist/orchestration/maintenance.js +44 -40
- package/dist/orchestrator.js +205 -200
- package/dist/page-versioning.js +5 -4
- package/dist/profiling.d.ts.map +1 -1
- package/dist/profiling.js +2 -1
- package/dist/qmd-daemon-session.js +2 -2
- package/dist/qmd.js +4 -4
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-navigate-access.js +2 -2
- package/dist/recall-navigate-disclosure.js +2 -2
- package/dist/recall-navigate.js +2 -2
- package/dist/recall-navigation-operations.js +97 -93
- package/dist/recall-navigation.js +96 -92
- package/dist/recall-state-view-admission.js +7 -7
- package/dist/recall-state.js +4 -3
- package/dist/recall-why-service.js +7 -7
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.js +2 -2
- package/dist/reconcile/cursor.js +4 -2
- package/dist/reconcile/cursor.js.map +1 -1
- package/dist/reconcile/manifest.js +9 -6
- package/dist/reconcile/plan.js +4 -2
- package/dist/{resolution-EKJHREVJ.js → resolution-ZU5BIAJA.js} +10 -8
- package/dist/resolution-ZU5BIAJA.js.map +1 -0
- package/dist/resume-bundles.js +48 -44
- package/dist/retrieval-agents.d.ts +1 -1
- package/dist/retrieval-agents.d.ts.map +1 -1
- package/dist/retrieval-agents.js +7 -1
- package/dist/salvage-envelope.js +7 -6
- package/dist/search/document-scanner.d.ts.map +1 -1
- package/dist/search/document-scanner.js +2 -1
- package/dist/search/factory.js +10 -9
- package/dist/search/index.js +16 -15
- package/dist/search/lancedb-backend.js +3 -2
- package/dist/search/meilisearch-backend.js +3 -2
- package/dist/search/orama-backend.js +3 -2
- package/dist/semantic-consolidation.js +37 -33
- package/dist/semantic-rule-promotion.js +32 -28
- package/dist/semantic-rule-verifier.js +32 -28
- package/dist/source-agent-qualifier.js +40 -35
- package/dist/standup/build.js +32 -28
- package/dist/storage/content-hash-index.d.ts +10 -0
- package/dist/storage/content-hash-index.d.ts.map +1 -1
- package/dist/storage/entity-canonical-id-migration.d.ts.map +1 -1
- package/dist/storage/entity-store.d.ts +32 -1
- package/dist/storage/entity-store.d.ts.map +1 -1
- package/dist/storage/memory-read-store.d.ts.map +1 -1
- package/dist/storage/supersession-audit.d.ts.map +1 -1
- package/dist/storage/tombstone-blocked-capture-index.d.ts +3 -0
- package/dist/storage/tombstone-blocked-capture-index.d.ts.map +1 -1
- package/dist/storage/tombstone-blocked-capture-mutation.d.ts +23 -3
- package/dist/storage/tombstone-blocked-capture-mutation.d.ts.map +1 -1
- package/dist/storage.d.ts +6 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +33 -29
- package/dist/subject-config.js +6 -5
- package/dist/summarizer.js +4 -4
- package/dist/summary-snapshot.js +4 -3
- package/dist/support-passport/index.js +99 -95
- package/dist/{tier-stats-RQM76XYY.js → tier-stats-C3IAMS4X.js} +6 -5
- package/dist/{tier-stats-RQM76XYY.js.map → tier-stats-C3IAMS4X.js.map} +1 -1
- package/dist/{trace-LXXCMZJA.js → trace-QBQVS5BC.js} +5 -21
- package/dist/trace-QBQVS5BC.js.map +1 -0
- package/dist/transcript.d.ts.map +1 -1
- package/dist/transcript.js +2 -1
- package/dist/transfer/autodetect.js +1 -1
- package/dist/transfer/backup.js +1 -1
- package/dist/transfer/capsule-export.js +3 -3
- package/dist/transfer/capsule-import.js +7 -6
- package/dist/transfer/export-okf.js +32 -28
- package/dist/trust-zones.js +3 -2
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/utility-learner.js +4 -3
- package/dist/utility-runtime.js +5 -4
- package/dist/utility-telemetry.js +3 -2
- package/dist/utils/macos-replication-junk.d.ts +32 -0
- package/dist/utils/macos-replication-junk.d.ts.map +1 -0
- package/dist/utils/malformed-entity-record.d.ts +24 -0
- package/dist/utils/malformed-entity-record.d.ts.map +1 -0
- package/dist/utils/serialize-mutations.js +3 -2
- package/dist/utils/sleep.d.ts +6 -0
- package/dist/utils/sleep.d.ts.map +1 -1
- package/dist/verified-recall.js +32 -28
- package/dist/who-knows-cli.js +33 -29
- package/dist/who-knows.js +32 -28
- package/dist/work-product-ledger.js +3 -2
- package/dist/write-envelope.js +6 -5
- package/package.json +22 -2
- package/src/calibration.ts +3 -2
- package/src/capture-write-lock-backoff.test.ts +534 -0
- package/src/capture-write-lock-backoff.ts +140 -0
- package/src/capture-write-lock.ts +8 -0
- package/src/cli.ts +2 -2
- package/src/console/trace.ts +5 -36
- package/src/consolidation-provenance-check.ts +2 -0
- package/src/converge-config.ts +80 -1
- package/src/correction/correction-planner.ts +3 -2
- package/src/extraction-quote-grounding.test.ts +546 -0
- package/src/extraction-quote-grounding.ts +232 -0
- package/src/extraction-source-grounding-helpers.ts +35 -0
- package/src/extraction-source-grounding-rules.ts +90 -65
- package/src/extraction-source-grounding.ts +11 -2
- package/src/index.ts +1 -1
- package/src/json-store.ts +3 -0
- package/src/macos-replication-junk-scanners.test.ts +275 -0
- package/src/maintenance/dreams-ledger.ts +2 -0
- package/src/maintenance/memory-governance.ts +2 -0
- package/src/namespaces/storage.ts +2 -0
- package/src/offline-sync-macos-junk.test.ts +169 -0
- package/src/offline-sync.ts +7 -0
- package/src/profiling.ts +2 -1
- package/src/providers/codex-subscription.test.ts +15 -3
- package/src/retrieval-agents.ts +29 -12
- package/src/search/document-scanner.ts +4 -0
- package/src/storage/content-hash-index.ts +10 -0
- package/src/storage/entity-canonical-id-migration.ts +56 -13
- package/src/storage/entity-store.ts +173 -15
- package/src/storage/memory-read-store.ts +30 -5
- package/src/storage/supersession-audit.ts +2 -0
- package/src/storage/tombstone-blocked-capture-index.ts +8 -1
- package/src/storage/tombstone-blocked-capture-mutation.ts +133 -43
- package/src/storage.ts +16 -2
- package/src/transcript.ts +11 -10
- package/src/types.ts +9 -0
- package/src/utils/macos-replication-junk.test.ts +46 -0
- package/src/utils/macos-replication-junk.ts +65 -0
- package/src/utils/malformed-entity-record.ts +101 -0
- package/src/utils/sleep.ts +28 -0
- package/dist/chunk-375ARKRS.js.map +0 -1
- package/dist/chunk-3J5JKBYD.js.map +0 -1
- package/dist/chunk-4O6WRBGE.js.map +0 -1
- package/dist/chunk-6MINUTGJ.js +0 -64
- package/dist/chunk-6MINUTGJ.js.map +0 -1
- package/dist/chunk-7LEQREP2.js +0 -9
- package/dist/chunk-7LEQREP2.js.map +0 -1
- package/dist/chunk-B6O2YLUR.js.map +0 -1
- package/dist/chunk-BLVHDY2U.js.map +0 -1
- package/dist/chunk-EQWEIIKQ.js.map +0 -1
- package/dist/chunk-HT2C4EXO.js.map +0 -1
- package/dist/chunk-KI6UOSNR.js.map +0 -1
- package/dist/chunk-MZBWIJJN.js.map +0 -1
- package/dist/chunk-Q4E24IRR.js.map +0 -1
- package/dist/chunk-QJ622LTI.js.map +0 -1
- package/dist/chunk-QWWMS4AE.js.map +0 -1
- package/dist/chunk-U7VPOXVM.js.map +0 -1
- package/dist/chunk-X3VID2TT.js.map +0 -1
- package/dist/chunk-XERVJYH2.js.map +0 -1
- package/dist/chunk-Y3VDGK2O.js.map +0 -1
- package/dist/chunk-YRH3C2OJ.js.map +0 -1
- package/dist/chunk-YYO447A7.js.map +0 -1
- package/dist/trace-LXXCMZJA.js.map +0 -1
- /package/dist/{auto-sync-DGJOZYGT.js.map → auto-sync-7WWAKW6F.js.map} +0 -0
- /package/dist/{dreams-ledger-567VKVOU.js.map → capture-write-lock-backoff.js.map} +0 -0
- /package/dist/{graph-edge-decay-CZ3SYLM4.js.map → capture-write-lock.js.map} +0 -0
- /package/dist/{chunk-KZO43HPY.js.map → chunk-22RM2ZUJ.js.map} +0 -0
- /package/dist/{chunk-ZUMXY4KA.js.map → chunk-22W2XWGH.js.map} +0 -0
- /package/dist/{chunk-PCWXLAJY.js.map → chunk-2PTH4PRL.js.map} +0 -0
- /package/dist/{chunk-ZIZ2G47N.js.map → chunk-2PYHLSXK.js.map} +0 -0
- /package/dist/{chunk-7OAIOE5P.js.map → chunk-33G67YZF.js.map} +0 -0
- /package/dist/{chunk-AV2OQF2O.js.map → chunk-3F3HA3R2.js.map} +0 -0
- /package/dist/{chunk-RP5SJ3XR.js.map → chunk-3GNIJUUE.js.map} +0 -0
- /package/dist/{chunk-QZZPUREO.js.map → chunk-3GYSZHMT.js.map} +0 -0
- /package/dist/{chunk-SWIKABKI.js.map → chunk-3Q3XD3NO.js.map} +0 -0
- /package/dist/{chunk-AL6EHLB5.js.map → chunk-3X3PNU3T.js.map} +0 -0
- /package/dist/{chunk-BTJ6CAIA.js.map → chunk-4IYIGN53.js.map} +0 -0
- /package/dist/{chunk-BZTRPCCH.js.map → chunk-4PDTVVSW.js.map} +0 -0
- /package/dist/{chunk-HM7RHKS4.js.map → chunk-4RNBLLZR.js.map} +0 -0
- /package/dist/{chunk-JUWJYXI4.js.map → chunk-5ATSXCAG.js.map} +0 -0
- /package/dist/{chunk-EHRE7ZG3.js.map → chunk-5B5WYAHQ.js.map} +0 -0
- /package/dist/{chunk-WCGJK4NQ.js.map → chunk-5FNZ3G6X.js.map} +0 -0
- /package/dist/{chunk-Y6DZ33PA.js.map → chunk-5GX5457J.js.map} +0 -0
- /package/dist/{chunk-EMFBC7L3.js.map → chunk-5KGYTX5O.js.map} +0 -0
- /package/dist/{chunk-OFCHT2TN.js.map → chunk-5LRV557D.js.map} +0 -0
- /package/dist/{chunk-DXHVD4DS.js.map → chunk-5SMR542T.js.map} +0 -0
- /package/dist/{chunk-S7LWX2PQ.js.map → chunk-655FVTCD.js.map} +0 -0
- /package/dist/{chunk-DGRMWDQY.js.map → chunk-66BCOVW2.js.map} +0 -0
- /package/dist/{chunk-5MDM7UE4.js.map → chunk-6WGMZQGG.js.map} +0 -0
- /package/dist/{chunk-IPLYGWQF.js.map → chunk-7LCGFUMB.js.map} +0 -0
- /package/dist/{chunk-5ZJYHOJT.js.map → chunk-7VQ6AI7H.js.map} +0 -0
- /package/dist/{chunk-KYY4EACB.js.map → chunk-7Z3DLNSD.js.map} +0 -0
- /package/dist/{chunk-G7NYVKD6.js.map → chunk-B2NXOVZN.js.map} +0 -0
- /package/dist/{chunk-B43NMCGQ.js.map → chunk-BK2BVLZW.js.map} +0 -0
- /package/dist/{chunk-BOOFTFFE.js.map → chunk-C2RW36YR.js.map} +0 -0
- /package/dist/{chunk-5JMI26Q7.js.map → chunk-CBH2Z4UA.js.map} +0 -0
- /package/dist/{chunk-P2S6P7X6.js.map → chunk-CFZ4SXXH.js.map} +0 -0
- /package/dist/{chunk-6M56RFFJ.js.map → chunk-CJRENHVZ.js.map} +0 -0
- /package/dist/{chunk-EGDYVYU7.js.map → chunk-CLWBFR7Q.js.map} +0 -0
- /package/dist/{chunk-6VAHJ2F6.js.map → chunk-DMDWFQMR.js.map} +0 -0
- /package/dist/{chunk-UZSBCQEC.js.map → chunk-DPSOFK4D.js.map} +0 -0
- /package/dist/{chunk-IZT3BVDW.js.map → chunk-DQR2LD3V.js.map} +0 -0
- /package/dist/{chunk-K4QY55XV.js.map → chunk-EH4BQ7LT.js.map} +0 -0
- /package/dist/{chunk-EBA5DA77.js.map → chunk-EOU6V4IN.js.map} +0 -0
- /package/dist/{chunk-7KYJNHGM.js.map → chunk-EUCYTCFP.js.map} +0 -0
- /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
- /package/dist/{chunk-CKUUP64O.js.map → chunk-F2772ATT.js.map} +0 -0
- /package/dist/{chunk-46EST7JO.js.map → chunk-F2XNSIPP.js.map} +0 -0
- /package/dist/{chunk-2KRNPFPK.js.map → chunk-FLI6DEIU.js.map} +0 -0
- /package/dist/{chunk-OAIWPB2I.js.map → chunk-FT4UQYOV.js.map} +0 -0
- /package/dist/{chunk-HYNEDMYJ.js.map → chunk-G2OYFTUD.js.map} +0 -0
- /package/dist/{chunk-XTN54NML.js.map → chunk-G3T6YMBO.js.map} +0 -0
- /package/dist/{chunk-CNG2XVZG.js.map → chunk-G3UUAQOD.js.map} +0 -0
- /package/dist/{chunk-2ZQJLBV6.js.map → chunk-GCVDFX66.js.map} +0 -0
- /package/dist/{chunk-ON4ILX3G.js.map → chunk-GFAM2LTC.js.map} +0 -0
- /package/dist/{chunk-2LUSQV4U.js.map → chunk-GKJJNO7C.js.map} +0 -0
- /package/dist/{chunk-T2YX56QI.js.map → chunk-GQJKVQJR.js.map} +0 -0
- /package/dist/{chunk-5AOAQR37.js.map → chunk-GWVNGDJW.js.map} +0 -0
- /package/dist/{chunk-YDH2FSDI.js.map → chunk-GZXXPCWJ.js.map} +0 -0
- /package/dist/{chunk-5JCLELOP.js.map → chunk-H5IUN433.js.map} +0 -0
- /package/dist/{chunk-IWHEJXR2.js.map → chunk-H6FREOYX.js.map} +0 -0
- /package/dist/{chunk-B7CANWCA.js.map → chunk-HBAOOSHU.js.map} +0 -0
- /package/dist/{chunk-T3FMRLWQ.js.map → chunk-HFSPY26A.js.map} +0 -0
- /package/dist/{chunk-B657ZGDH.js.map → chunk-HQSK2INQ.js.map} +0 -0
- /package/dist/{chunk-RT6D3WN7.js.map → chunk-IJMDBYCO.js.map} +0 -0
- /package/dist/{chunk-CS2JEHTB.js.map → chunk-IUCPLBDS.js.map} +0 -0
- /package/dist/{chunk-XRBHXUTQ.js.map → chunk-IWD33CF4.js.map} +0 -0
- /package/dist/{chunk-4IHBN6WU.js.map → chunk-JKMIGCK6.js.map} +0 -0
- /package/dist/{chunk-ROBHL3GL.js.map → chunk-JWX2Q6HS.js.map} +0 -0
- /package/dist/{chunk-3I3U6FFT.js.map → chunk-K7BN34IA.js.map} +0 -0
- /package/dist/{chunk-4THZGKQ2.js.map → chunk-KLJVTZ3R.js.map} +0 -0
- /package/dist/{chunk-4G4B3Z2B.js.map → chunk-KW4AJ7T3.js.map} +0 -0
- /package/dist/{chunk-ZI7LMSNI.js.map → chunk-LLHZZOIB.js.map} +0 -0
- /package/dist/{chunk-LS2FHUML.js.map → chunk-LQ5SS4OP.js.map} +0 -0
- /package/dist/{chunk-NSFOERZQ.js.map → chunk-LWFWZTWX.js.map} +0 -0
- /package/dist/{chunk-BMWN7B3Y.js.map → chunk-LXATZLSC.js.map} +0 -0
- /package/dist/{chunk-OYKQ6T4V.js.map → chunk-MATDGSJ7.js.map} +0 -0
- /package/dist/{chunk-3NFN4Y4P.js.map → chunk-MGCKZWAE.js.map} +0 -0
- /package/dist/{chunk-O4KYRDRT.js.map → chunk-MJIOGYKX.js.map} +0 -0
- /package/dist/{chunk-6OMUHXHP.js.map → chunk-ML7ZJAKJ.js.map} +0 -0
- /package/dist/{chunk-GKIXBH7Y.js.map → chunk-MO6N4QYY.js.map} +0 -0
- /package/dist/{chunk-A2E4WNW4.js.map → chunk-MWWAQXZ6.js.map} +0 -0
- /package/dist/{chunk-VYPFEVOM.js.map → chunk-NHUX6GXA.js.map} +0 -0
- /package/dist/{chunk-AKREOU5F.js.map → chunk-NZCKG25S.js.map} +0 -0
- /package/dist/{chunk-4NDWE44P.js.map → chunk-NZFFGO5O.js.map} +0 -0
- /package/dist/{chunk-WWSRLS4M.js.map → chunk-O2YPCFJT.js.map} +0 -0
- /package/dist/{chunk-ZSJGYC3C.js.map → chunk-OQJKY3Z5.js.map} +0 -0
- /package/dist/{chunk-OFEHITAZ.js.map → chunk-OXNTOHL6.js.map} +0 -0
- /package/dist/{chunk-FQD2KPQH.js.map → chunk-P55FACBG.js.map} +0 -0
- /package/dist/{chunk-JYZSRNR7.js.map → chunk-PIITB2YZ.js.map} +0 -0
- /package/dist/{chunk-PBVNVKYN.js.map → chunk-PIN5OPBA.js.map} +0 -0
- /package/dist/{chunk-4TTGRETU.js.map → chunk-PRU7OF3Y.js.map} +0 -0
- /package/dist/{chunk-K2FSASGZ.js.map → chunk-PVHQSLNN.js.map} +0 -0
- /package/dist/{chunk-SVDU4OHO.js.map → chunk-Q35L7TYB.js.map} +0 -0
- /package/dist/{chunk-5VC7J76U.js.map → chunk-QPH52AZB.js.map} +0 -0
- /package/dist/{chunk-6T42L5FI.js.map → chunk-QS3OLP5I.js.map} +0 -0
- /package/dist/{chunk-P34FDDB5.js.map → chunk-QSEUUQUF.js.map} +0 -0
- /package/dist/{chunk-PAAJWQH5.js.map → chunk-QUMKDRCF.js.map} +0 -0
- /package/dist/{chunk-KZEMFD6E.js.map → chunk-R2H4ZFBJ.js.map} +0 -0
- /package/dist/{chunk-JFVCDEIC.js.map → chunk-RP7PQWZM.js.map} +0 -0
- /package/dist/{chunk-KC46VZR5.js.map → chunk-RTTPBBAN.js.map} +0 -0
- /package/dist/{chunk-ZQ3WU6JO.js.map → chunk-RXFCU3CY.js.map} +0 -0
- /package/dist/{chunk-CBP4HWCL.js.map → chunk-RYYVMZBR.js.map} +0 -0
- /package/dist/{chunk-2NCBDGND.js.map → chunk-SA6GMZJY.js.map} +0 -0
- /package/dist/{chunk-VFTK5WKI.js.map → chunk-STBX5X6B.js.map} +0 -0
- /package/dist/{chunk-WVHRNAXL.js.map → chunk-SWWHIJUJ.js.map} +0 -0
- /package/dist/{chunk-WADSXS4K.js.map → chunk-SX4QDWXK.js.map} +0 -0
- /package/dist/{chunk-WETFW255.js.map → chunk-T7ASDYNK.js.map} +0 -0
- /package/dist/{chunk-XZLWYZ7C.js.map → chunk-THEPGZBM.js.map} +0 -0
- /package/dist/{chunk-YEM7K3KD.js.map → chunk-TMC7HBED.js.map} +0 -0
- /package/dist/{chunk-RWRQ67OR.js.map → chunk-TPNCXSXP.js.map} +0 -0
- /package/dist/{chunk-LZKOVXMX.js.map → chunk-TRMJ6BYC.js.map} +0 -0
- /package/dist/{chunk-A6TVQ3QP.js.map → chunk-UGYUBENJ.js.map} +0 -0
- /package/dist/{chunk-AAM66QCP.js.map → chunk-UZRSI6NX.js.map} +0 -0
- /package/dist/{chunk-XHWJRUVP.js.map → chunk-V3TXIXXY.js.map} +0 -0
- /package/dist/{chunk-2CXQZXWM.js.map → chunk-V4MB5ONM.js.map} +0 -0
- /package/dist/{chunk-UOKPJFO3.js.map → chunk-VNZMZPAC.js.map} +0 -0
- /package/dist/{chunk-FZB4TS2W.js.map → chunk-VPXIKBPX.js.map} +0 -0
- /package/dist/{chunk-CYEK6Z3P.js.map → chunk-VW6VIJOS.js.map} +0 -0
- /package/dist/{chunk-QUA7RLK6.js.map → chunk-W3FVQBGF.js.map} +0 -0
- /package/dist/{chunk-6OQ6N5RP.js.map → chunk-WGTR573G.js.map} +0 -0
- /package/dist/{chunk-W3K3HITK.js.map → chunk-WLT6LTQP.js.map} +0 -0
- /package/dist/{chunk-6Z2AZ4AJ.js.map → chunk-XKRXN63M.js.map} +0 -0
- /package/dist/{chunk-FZVROZKC.js.map → chunk-XVZA6VXC.js.map} +0 -0
- /package/dist/{chunk-DA2INEB5.js.map → chunk-XYGQSDTH.js.map} +0 -0
- /package/dist/{chunk-RBJQYMMT.js.map → chunk-YRULQW5J.js.map} +0 -0
- /package/dist/{chunk-QUNDYIYZ.js.map → chunk-YYEOR4XN.js.map} +0 -0
- /package/dist/{chunk-6WHJ2EAB.js.map → chunk-Z64TS5V4.js.map} +0 -0
- /package/dist/{chunk-NHLLKEKK.js.map → chunk-ZAJLJ35W.js.map} +0 -0
- /package/dist/{chunk-M7V65M6H.js.map → chunk-ZKHSAMTE.js.map} +0 -0
- /package/dist/{resolution-EKJHREVJ.js.map → dreams-ledger-UCHHRQ4R.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/profiling.ts"],"sourcesContent":["// Performance profiling collector for recall and extraction traces.\n// Zero external dependencies — uses only node:fs and node:path.\n\nimport {\n existsSync,\n mkdirSync,\n writeFileSync,\n promises as fsp,\n} from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport { log } from \"./logger.js\";\nimport { isMacOsReplicationJunkBasename } from \"./utils/macos-replication-junk.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ProfileSpan {\n name: string;\n startOffsetMs: number;\n durationMs: number;\n}\n\nexport interface ProfileParallelGroupMember {\n name: string;\n durationMs: number;\n resolvedIndex: number;\n}\n\nexport interface ProfileParallelGroup {\n name: string;\n startOffsetMs: number;\n wallMs: number;\n members: ProfileParallelGroupMember[];\n}\n\nexport interface ProfileTrace {\n ts: string;\n kind: \"recall\" | \"extraction\";\n traceId: string;\n sessionKey?: string;\n totalMs: number;\n spans: ProfileSpan[];\n parallelGroups?: ProfileParallelGroup[];\n configSnapshot?: Record<string, unknown>;\n}\n\nexport interface ProfilingConfig {\n enabled: boolean;\n storageDir: string;\n maxTraces: number;\n}\n\nexport interface ParallelGroupHandle {\n name: string;\n startOffsetMs: number;\n traceId?: string;\n}\n\nexport interface ProfilingStats {\n byKind: Record<string, { count: number; avgMs: number; p50Ms: number; p95Ms: number; maxMs: number }>;\n bySpan: Record<string, { count: number; avgMs: number; p50Ms: number; p95Ms: number; maxMs: number }>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction percentile(sorted: number[], p: number): number {\n if (sorted.length === 0) return 0;\n const idx = Math.ceil((p / 100) * sorted.length) - 1;\n return sorted[Math.max(0, Math.min(idx, sorted.length - 1))];\n}\n\nfunction aggregateStats(values: number[]): { count: number; avgMs: number; p50Ms: number; p95Ms: number; maxMs: number } {\n const count = values.length;\n if (count === 0) return { count: 0, avgMs: 0, p50Ms: 0, p95Ms: 0, maxMs: 0 };\n const sorted = [...values].sort((a, b) => a - b);\n const sum = sorted.reduce((s, v) => s + v, 0);\n return {\n count,\n avgMs: Math.round(sum / count),\n p50Ms: Math.round(percentile(sorted, 50)),\n p95Ms: Math.round(percentile(sorted, 95)),\n maxMs: sorted[sorted.length - 1],\n };\n}\n\nlet traceCounter = 0;\n\n// ---------------------------------------------------------------------------\n// ProfilingCollector\n// ---------------------------------------------------------------------------\n\nexport class ProfilingCollector {\n private enabled: boolean;\n private storageDir: string;\n private maxTraces: number;\n private traces: ProfileTrace[] = [];\n private prunePromise: Promise<void> | null = null;\n\n // Active trace state — keyed by traceId so concurrent pipelines are isolated.\n private activeTraces = new Map<\n string,\n {\n kind: \"recall\" | \"extraction\";\n start: number;\n sessionKey?: string;\n configSnapshot?: Record<string, unknown>;\n spans: ProfileSpan[];\n spanStarts: Map<string, number>;\n parallelGroups: ProfileParallelGroup[];\n }\n >();\n private latestTraceId = \"\";\n\n constructor(config: ProfilingConfig) {\n this.enabled = config.enabled;\n this.storageDir = config.storageDir;\n this.maxTraces = Math.max(0, config.maxTraces);\n }\n\n get isEnabled(): boolean {\n return this.enabled;\n }\n\n // ---- Trace lifecycle ---------------------------------------------------\n\n startTrace(kind: \"recall\" | \"extraction\", sessionKey?: string, configSnapshot?: Record<string, unknown>): string {\n if (!this.enabled) return \"\";\n traceCounter++;\n const traceId = `t${traceCounter}-${Date.now().toString(36)}`;\n this.activeTraces.set(traceId, {\n kind,\n start: Date.now(),\n sessionKey,\n configSnapshot,\n spans: [],\n spanStarts: new Map(),\n parallelGroups: [],\n });\n this.latestTraceId = traceId;\n log.debug(`profiling: started trace ${traceId} kind=${kind}`);\n return traceId;\n }\n\n startSpan(name: string, traceId?: string): void {\n const tid = traceId ?? this.latestTraceId;\n const t = tid ? this.activeTraces.get(tid) : undefined;\n if (!t) return;\n const offset = Date.now() - t.start;\n t.spanStarts.set(name, Date.now());\n log.debug(`profiling: span ${name} started at +${offset}ms (trace=${tid})`);\n }\n\n endSpan(name: string, traceId?: string): void {\n const tid = traceId ?? this.latestTraceId;\n const t = tid ? this.activeTraces.get(tid) : undefined;\n if (!t) return;\n const start = t.spanStarts.get(name);\n if (start === undefined) return;\n const duration = Date.now() - start;\n const startOffset = start - t.start;\n t.spans.push({ name, startOffsetMs: startOffset, durationMs: duration });\n t.spanStarts.delete(name);\n log.debug(`profiling: span ${name} ended ${duration}ms (trace=${tid})`);\n }\n\n endTrace(traceId?: string): ProfileTrace | null {\n const tid = traceId ?? this.latestTraceId;\n const t = tid ? this.activeTraces.get(tid) : undefined;\n if (!t) return null;\n\n // Auto-close any spans still open when the trace finalizes.\n const now = Date.now();\n for (const [name, start] of t.spanStarts) {\n const duration = now - start;\n const startOffset = start - t.start;\n t.spans.push({ name, startOffsetMs: startOffset, durationMs: duration });\n log.debug(`profiling: auto-closed span ${name} at trace end (${duration}ms, trace=${tid})`);\n }\n t.spanStarts.clear();\n\n const trace: ProfileTrace = {\n ts: new Date().toISOString(),\n kind: t.kind,\n traceId: tid,\n totalMs: Date.now() - t.start,\n spans: t.spans,\n configSnapshot: t.configSnapshot,\n };\n\n if (t.sessionKey) {\n trace.sessionKey = t.sessionKey;\n }\n if (t.parallelGroups.length > 0) {\n trace.parallelGroups = t.parallelGroups;\n }\n\n // Remove from active map.\n this.activeTraces.delete(tid);\n\n if (!this.enabled) {\n log.debug(\"profiling: trace discarded (disabled)\");\n return null;\n }\n\n // Persist.\n this.persistTrace(trace);\n\n // Buffer in memory (FIFO).\n this.traces.push(trace);\n if (this.traces.length > this.maxTraces) {\n this.traces.shift();\n }\n\n // Single-flight: if a prune is already running, piggyback on it;\n // otherwise start one. This prevents concurrent prunes from racing\n // on stale directory snapshots.\n if (!this.prunePromise) {\n this.prunePromise = this.pruneFiles().finally(() => {\n this.prunePromise = null;\n });\n }\n log.debug(`profiling: trace ${trace.traceId} finalized totalMs=${trace.totalMs}`);\n return trace;\n }\n\n // ---- Parallel group tracking -------------------------------------------\n\n startParallelGroup(name: string, traceId?: string): ParallelGroupHandle {\n const tid = traceId ?? this.latestTraceId;\n const t = tid ? this.activeTraces.get(tid) : undefined;\n const startOffsetMs = t ? Date.now() - t.start : 0;\n return { name, startOffsetMs, traceId: tid };\n }\n\n async endParallelGroup(\n handle: ParallelGroupHandle,\n members: Array<{ name: string; promise: Promise<unknown> }>,\n ): Promise<void> {\n const wallStart = Date.now();\n\n let nextResolvedIndex = 0;\n const resolutionOrder = new Map<string, number>();\n\n const timed = members.map(async (m) => {\n const t0 = Date.now();\n try {\n await m.promise;\n } catch {\n // settled — still record order\n }\n resolutionOrder.set(m.name, nextResolvedIndex++);\n return { name: m.name, durationMs: Date.now() - t0 };\n });\n const timedResults = await Promise.allSettled(timed);\n\n const tid = handle.traceId ?? this.latestTraceId;\n const t = tid ? this.activeTraces.get(tid) : undefined;\n if (!t) return;\n\n const wallMs = Date.now() - wallStart;\n\n const groupMembers: ProfileParallelGroupMember[] = members.map((m, i) => {\n const timedResult = timedResults[i].status === \"fulfilled\"\n ? timedResults[i].value\n : { name: m.name, durationMs: wallMs };\n return {\n name: timedResult.name,\n durationMs: timedResult.durationMs,\n resolvedIndex: resolutionOrder.get(m.name) ?? i,\n };\n });\n\n t.parallelGroups.push({\n name: handle.name,\n startOffsetMs: handle.startOffsetMs,\n wallMs,\n members: groupMembers,\n });\n\n log.debug(`profiling: parallel group ${handle.name} wallMs=${wallMs} (trace=${tid})`);\n }\n\n // ---- Query methods -----------------------------------------------------\n\n getRecentTraces(limit?: number): ProfileTrace[] {\n if (limit === undefined || limit === Infinity) {\n return [...this.traces];\n }\n if (!Number.isFinite(limit)) {\n return [];\n }\n const n = Math.floor(limit);\n if (n <= 0) {\n return [];\n }\n return this.traces.slice(-n);\n }\n\n getStats(): ProfilingStats {\n const byKind: Record<string, number[]> = {};\n const bySpan: Record<string, number[]> = {};\n\n for (const trace of this.traces) {\n if (!byKind[trace.kind]) byKind[trace.kind] = [];\n byKind[trace.kind].push(trace.totalMs);\n\n for (const span of trace.spans) {\n if (!bySpan[span.name]) bySpan[span.name] = [];\n bySpan[span.name].push(span.durationMs);\n }\n }\n\n const result: ProfilingStats = { byKind: {}, bySpan: {} };\n for (const [k, v] of Object.entries(byKind)) {\n result.byKind[k] = aggregateStats(v);\n }\n for (const [k, v] of Object.entries(bySpan)) {\n result.bySpan[k] = aggregateStats(v);\n }\n return result;\n }\n\n identifyBottleneck(): string | null {\n if (this.traces.length === 0) return null;\n const latest = this.traces[this.traces.length - 1];\n if (latest.spans.length === 0) return null;\n let slowest = latest.spans[0];\n for (const span of latest.spans) {\n if (span.durationMs > slowest.durationMs) slowest = span;\n }\n return slowest.name;\n }\n\n // ---- Persistence -------------------------------------------------------\n\n private persistTrace(trace: ProfileTrace): void {\n const filename = `${trace.kind}-${trace.traceId}.jsonl`;\n const filepath = join(this.storageDir, filename);\n try {\n // Created on first persist, never at construction: constructing a\n // collector (plugin registration, a discovery pass, CLI metadata) must\n // not touch the operator's memory dir when no trace is ever written.\n if (!existsSync(this.storageDir)) {\n mkdirSync(this.storageDir, { recursive: true });\n log.debug(`profiling: created storage dir ${this.storageDir}`);\n }\n writeFileSync(filepath, JSON.stringify(trace) + \"\\n\", \"utf-8\");\n log.debug(`profiling: persisted ${filename}`);\n } catch (err) {\n log.warn(`profiling: failed to persist ${filename}`, err);\n }\n }\n\n async pruneFiles(): Promise<void> {\n try {\n const dir = this.storageDir;\n const entries = await fsp.readdir(dir);\n const jsonlFiles = entries.filter((f) => !isMacOsReplicationJunkBasename(f) && f.endsWith(\".jsonl\"));\n const withMtime = await Promise.all(\n jsonlFiles.map(async (f) => ({\n name: f,\n mtime: (await fsp.stat(join(dir, f))).mtimeMs,\n })),\n );\n const files = withMtime.sort((a, b) => a.mtime - b.mtime).map((f) => f.name);\n\n while (files.length > this.maxTraces) {\n const oldest = files.shift()!;\n await fsp.unlink(join(dir, oldest));\n log.debug(`profiling: pruned ${oldest}`);\n }\n } catch (err) {\n log.warn(\"profiling: prune failed\", err);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// ASCII formatter\n// ---------------------------------------------------------------------------\n\nexport function formatProfileTraceAscii(trace: ProfileTrace): string {\n const lines: string[] = [];\n const BAR_WIDTH = 40;\n\n lines.push(`=== Profile: ${trace.kind} ===`);\n lines.push(`Trace ID : ${trace.traceId}`);\n lines.push(`Total : ${trace.totalMs}ms`);\n if (trace.sessionKey) lines.push(`Session : ${trace.sessionKey}`);\n lines.push(\"\");\n\n // Identify bottleneck.\n let bottleneckName: string | null = null;\n if (trace.spans.length > 0) {\n let slowest = trace.spans[0];\n for (const s of trace.spans) {\n if (s.durationMs > slowest.durationMs) slowest = s;\n }\n bottleneckName = slowest.name;\n }\n\n // Spans.\n if (trace.spans.length > 0) {\n const maxDuration = Math.max(...trace.spans.map((s) => s.durationMs), 1);\n lines.push(\"Spans:\");\n for (const span of trace.spans) {\n const barLen = Math.max(1, Math.round((span.durationMs / maxDuration) * BAR_WIDTH));\n const bar = \"\\u2588\".repeat(barLen);\n const suffix = span.name === bottleneckName ? \" \\u2190 bottleneck\" : \"\";\n lines.push(` ${span.name.padEnd(30)} ${String(span.durationMs).padStart(6)}ms ${bar}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Parallel groups.\n if (trace.parallelGroups && trace.parallelGroups.length > 0) {\n lines.push(\"Parallel Groups:\");\n for (const group of trace.parallelGroups) {\n lines.push(` ${group.name}:`);\n lines.push(` Wall time : ${group.wallMs}ms`);\n const efficiency = parallelEfficiency(group);\n if (efficiency !== null) {\n lines.push(` Efficiency : ${efficiency}%`);\n }\n for (const member of group.members) {\n lines.push(` [${String(member.resolvedIndex).padStart(2)}] ${member.name.padEnd(28)} ${String(member.durationMs).padStart(6)}ms`);\n }\n }\n lines.push(\"\");\n }\n\n lines.push(\"---\");\n return lines.join(\"\\n\");\n}\n\nfunction parallelEfficiency(group: ProfileParallelGroup): number | null {\n if (group.members.length <= 1) return null;\n const idealMs = Math.max(...group.members.map((m) => m.durationMs));\n if (group.wallMs === 0) return null;\n return Math.round((idealMs / group.wallMs) * 100);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-7T4TOGMS.js";
|
|
4
4
|
import {
|
|
5
5
|
defineOperation
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XLBFX63V.js";
|
|
7
7
|
|
|
8
8
|
// src/external-wiki-access.ts
|
|
9
9
|
import { z } from "zod";
|
|
@@ -26,4 +26,4 @@ var externalWikiSearchOperation = defineOperation({
|
|
|
26
26
|
export {
|
|
27
27
|
externalWikiSearchOperation
|
|
28
28
|
};
|
|
29
|
-
//# sourceMappingURL=chunk-
|
|
29
|
+
//# sourceMappingURL=chunk-DPSOFK4D.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveCorpusNamespaceRoots
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-QSEUUQUF.js";
|
|
4
4
|
import {
|
|
5
5
|
capabilityAllowsNamespace
|
|
6
6
|
} from "./chunk-IG747LRN.js";
|
|
@@ -200,4 +200,4 @@ async function readAggregateExtractionWatermark(options) {
|
|
|
200
200
|
export {
|
|
201
201
|
readAggregateExtractionWatermark
|
|
202
202
|
};
|
|
203
|
-
//# sourceMappingURL=chunk-
|
|
203
|
+
//# sourceMappingURL=chunk-DQR2LD3V.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-4Q26RNSR.js";
|
|
4
4
|
import {
|
|
5
5
|
isRecallDisclosure
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-3MO4LWYU.js";
|
|
7
7
|
import {
|
|
8
8
|
EngramAccessInputError
|
|
9
9
|
} from "./chunk-3MUKQQ7A.js";
|
|
@@ -165,4 +165,4 @@ export {
|
|
|
165
165
|
handleRecallWhyHttpQuery,
|
|
166
166
|
handleRecallXrayHttpQuery
|
|
167
167
|
};
|
|
168
|
-
//# sourceMappingURL=chunk-
|
|
168
|
+
//# sourceMappingURL=chunk-EH4BQ7LT.js.map
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normalizeCaptureWriteLockWaitMs,
|
|
3
|
+
resolveCaptureWriteLockBackoffLimits
|
|
4
|
+
} from "./chunk-YET735EZ.js";
|
|
5
|
+
import {
|
|
6
|
+
readEnvVar
|
|
7
|
+
} from "./chunk-P2QRMMVQ.js";
|
|
8
|
+
|
|
9
|
+
// src/converge-config.ts
|
|
10
|
+
var CONVERGE_CONFLICT_POLICIES = [
|
|
11
|
+
"newest-wins",
|
|
12
|
+
"manual"
|
|
13
|
+
];
|
|
14
|
+
var DEFAULT_CONVERGE_CONFLICT_POLICY = "newest-wins";
|
|
15
|
+
var DEFAULT_CONVERGE_PEER_REQUEST_TIMEOUT_MS = 3e4;
|
|
16
|
+
var MAX_CONVERGE_PEER_REQUEST_TIMEOUT_MS = 36e5;
|
|
17
|
+
function normalizeConvergePeerRequestTimeoutMs(value, label) {
|
|
18
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value <= 0) {
|
|
19
|
+
throw new Error(`${label} must be a positive integer number of milliseconds; got ${JSON.stringify(value)}`);
|
|
20
|
+
}
|
|
21
|
+
return Math.min(value, MAX_CONVERGE_PEER_REQUEST_TIMEOUT_MS);
|
|
22
|
+
}
|
|
23
|
+
function envConvergePeerRequestTimeoutMs() {
|
|
24
|
+
const raw = process.env.REMNIC_CONVERGE_PEER_TIMEOUT_MS;
|
|
25
|
+
if (raw === void 0 || raw.trim() === "") return DEFAULT_CONVERGE_PEER_REQUEST_TIMEOUT_MS;
|
|
26
|
+
return normalizeConvergePeerRequestTimeoutMs(Number(raw), "REMNIC_CONVERGE_PEER_TIMEOUT_MS");
|
|
27
|
+
}
|
|
28
|
+
function parsePeerRequestTimeoutMs(value, label) {
|
|
29
|
+
if (value === void 0) return DEFAULT_CONVERGE_PEER_REQUEST_TIMEOUT_MS;
|
|
30
|
+
return normalizeConvergePeerRequestTimeoutMs(value, label);
|
|
31
|
+
}
|
|
32
|
+
function parseOptionalCaptureLockMs(value, label) {
|
|
33
|
+
if (value === void 0) return void 0;
|
|
34
|
+
return normalizeCaptureWriteLockWaitMs(value, label);
|
|
35
|
+
}
|
|
36
|
+
function envCaptureLockMs(name) {
|
|
37
|
+
const raw = readEnvVar(name);
|
|
38
|
+
if (raw === void 0) return void 0;
|
|
39
|
+
const trimmed = raw.trim();
|
|
40
|
+
if (trimmed.length === 0) return void 0;
|
|
41
|
+
if (trimmed.length > 15) {
|
|
42
|
+
throw new Error(`${name} must be a positive integer number of milliseconds; got ${JSON.stringify(raw)}`);
|
|
43
|
+
}
|
|
44
|
+
for (let index = 0; index < trimmed.length; index += 1) {
|
|
45
|
+
const code = trimmed.charCodeAt(index);
|
|
46
|
+
if (code < 48 || code > 57) {
|
|
47
|
+
throw new Error(`${name} must be a positive integer number of milliseconds; got ${JSON.stringify(raw)}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return normalizeCaptureWriteLockWaitMs(Number(trimmed), name);
|
|
51
|
+
}
|
|
52
|
+
function resolveConvergeCaptureWriteLockBackoff(config) {
|
|
53
|
+
return resolveCaptureWriteLockBackoffLimits({
|
|
54
|
+
captureWriteLockInitialDelayMs: config?.captureWriteLockInitialDelayMs ?? envCaptureLockMs("REMNIC_CONVERGE_CAPTURE_LOCK_INITIAL_DELAY_MS"),
|
|
55
|
+
captureWriteLockMaxDelayMs: config?.captureWriteLockMaxDelayMs ?? envCaptureLockMs("REMNIC_CONVERGE_CAPTURE_LOCK_MAX_DELAY_MS"),
|
|
56
|
+
captureWriteLockDeadlineMs: config?.captureWriteLockDeadlineMs ?? envCaptureLockMs("REMNIC_CONVERGE_CAPTURE_LOCK_DEADLINE_MS")
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
function parseConvergeConfig(block) {
|
|
60
|
+
if (block === void 0) {
|
|
61
|
+
return { conflictPolicy: DEFAULT_CONVERGE_CONFLICT_POLICY };
|
|
62
|
+
}
|
|
63
|
+
if (block === null || typeof block !== "object" || Array.isArray(block)) {
|
|
64
|
+
throw new Error("converge must be a plain object");
|
|
65
|
+
}
|
|
66
|
+
const prototype = Object.getPrototypeOf(block);
|
|
67
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
68
|
+
throw new Error("converge must be a plain object");
|
|
69
|
+
}
|
|
70
|
+
const {
|
|
71
|
+
conflictPolicy: rawConflictPolicy,
|
|
72
|
+
peerRequestTimeoutMs,
|
|
73
|
+
captureWriteLockInitialDelayMs,
|
|
74
|
+
captureWriteLockMaxDelayMs,
|
|
75
|
+
captureWriteLockDeadlineMs,
|
|
76
|
+
...unknown
|
|
77
|
+
} = block;
|
|
78
|
+
let conflictPolicy = rawConflictPolicy;
|
|
79
|
+
const unknownKey = Object.keys(unknown)[0];
|
|
80
|
+
if (unknownKey !== void 0) {
|
|
81
|
+
throw new Error(`converge contains unknown key ${JSON.stringify(unknownKey)}`);
|
|
82
|
+
}
|
|
83
|
+
if (conflictPolicy === void 0) {
|
|
84
|
+
conflictPolicy = DEFAULT_CONVERGE_CONFLICT_POLICY;
|
|
85
|
+
}
|
|
86
|
+
if (typeof conflictPolicy === "string" && CONVERGE_CONFLICT_POLICIES.includes(conflictPolicy)) {
|
|
87
|
+
const initialDelayMs = parseOptionalCaptureLockMs(
|
|
88
|
+
captureWriteLockInitialDelayMs,
|
|
89
|
+
"converge.captureWriteLockInitialDelayMs"
|
|
90
|
+
);
|
|
91
|
+
const maxDelayMs = parseOptionalCaptureLockMs(captureWriteLockMaxDelayMs, "converge.captureWriteLockMaxDelayMs");
|
|
92
|
+
const deadlineMs = parseOptionalCaptureLockMs(captureWriteLockDeadlineMs, "converge.captureWriteLockDeadlineMs");
|
|
93
|
+
if (initialDelayMs !== void 0 && maxDelayMs !== void 0 && initialDelayMs > maxDelayMs) {
|
|
94
|
+
throw new Error(
|
|
95
|
+
`converge.captureWriteLockInitialDelayMs (${initialDelayMs}) must be <= converge.captureWriteLockMaxDelayMs (${maxDelayMs})`
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
if (maxDelayMs !== void 0 && deadlineMs !== void 0 && maxDelayMs > deadlineMs) {
|
|
99
|
+
throw new Error(
|
|
100
|
+
`converge.captureWriteLockMaxDelayMs (${maxDelayMs}) must be <= converge.captureWriteLockDeadlineMs (${deadlineMs})`
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
if (initialDelayMs !== void 0 && deadlineMs !== void 0 && initialDelayMs > deadlineMs) {
|
|
104
|
+
throw new Error(
|
|
105
|
+
`converge.captureWriteLockInitialDelayMs (${initialDelayMs}) must be <= converge.captureWriteLockDeadlineMs (${deadlineMs})`
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
conflictPolicy,
|
|
110
|
+
...peerRequestTimeoutMs !== void 0 ? { peerRequestTimeoutMs: parsePeerRequestTimeoutMs(peerRequestTimeoutMs, "converge.peerRequestTimeoutMs") } : {},
|
|
111
|
+
...initialDelayMs !== void 0 ? { captureWriteLockInitialDelayMs: initialDelayMs } : {},
|
|
112
|
+
...maxDelayMs !== void 0 ? { captureWriteLockMaxDelayMs: maxDelayMs } : {},
|
|
113
|
+
...deadlineMs !== void 0 ? { captureWriteLockDeadlineMs: deadlineMs } : {}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
throw new Error(
|
|
117
|
+
`converge.conflictPolicy must be one of ${CONVERGE_CONFLICT_POLICIES.join(", ")}; got ${JSON.stringify(conflictPolicy)}`
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export {
|
|
122
|
+
CONVERGE_CONFLICT_POLICIES,
|
|
123
|
+
DEFAULT_CONVERGE_CONFLICT_POLICY,
|
|
124
|
+
DEFAULT_CONVERGE_PEER_REQUEST_TIMEOUT_MS,
|
|
125
|
+
MAX_CONVERGE_PEER_REQUEST_TIMEOUT_MS,
|
|
126
|
+
normalizeConvergePeerRequestTimeoutMs,
|
|
127
|
+
envConvergePeerRequestTimeoutMs,
|
|
128
|
+
resolveConvergeCaptureWriteLockBackoff,
|
|
129
|
+
parseConvergeConfig
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=chunk-EHHQJTAU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/converge-config.ts"],"sourcesContent":["import {\n type CaptureWriteLockBackoffLimits,\n normalizeCaptureWriteLockWaitMs,\n resolveCaptureWriteLockBackoffLimits,\n} from \"./capture-write-lock-backoff.js\";\nimport { readEnvVar } from \"./runtime/env.js\";\nimport type { ConvergeConfig, ConvergeConflictPolicy } from \"./types.js\";\n\nexport const CONVERGE_CONFLICT_POLICIES = [\n \"newest-wins\",\n \"manual\",\n] as const satisfies readonly ConvergeConflictPolicy[];\n\nexport const DEFAULT_CONVERGE_CONFLICT_POLICY: ConvergeConflictPolicy = \"newest-wins\";\n\n/** Default per-request peer HTTP timeout. Boot-scale corpora (100k+ files in one\n * namespace) can take well over 30s to serve a manifest snapshot. */\nexport const DEFAULT_CONVERGE_PEER_REQUEST_TIMEOUT_MS = 30_000;\n/** Ceiling for the configured timeout — a peer that has not answered in an hour\n * is unreachable, not slow. */\nexport const MAX_CONVERGE_PEER_REQUEST_TIMEOUT_MS = 3_600_000;\n/**\n * ONE normalization policy for every override source (config JSON, env, CLI\n * flag, programmatic options): malformed values are rejected, valid values\n * clamped to the one-hour ceiling. Returns the clamped ms value.\n */\nexport function normalizeConvergePeerRequestTimeoutMs(value: unknown, label: string): number {\n if (typeof value !== \"number\" || !Number.isInteger(value) || value <= 0) {\n throw new Error(`${label} must be a positive integer number of milliseconds; got ${JSON.stringify(value)}`);\n }\n return Math.min(value, MAX_CONVERGE_PEER_REQUEST_TIMEOUT_MS);\n}\n\n/** Env override, evaluated lazily so tests control time. Junk is rejected. */\nexport function envConvergePeerRequestTimeoutMs(): number {\n const raw = process.env.REMNIC_CONVERGE_PEER_TIMEOUT_MS;\n if (raw === undefined || raw.trim() === \"\") return DEFAULT_CONVERGE_PEER_REQUEST_TIMEOUT_MS;\n return normalizeConvergePeerRequestTimeoutMs(Number(raw), \"REMNIC_CONVERGE_PEER_TIMEOUT_MS\");\n}\n\n/** Config-block value: absent -> default, present -> normalized. */\nfunction parsePeerRequestTimeoutMs(value: unknown, label: string): number {\n if (value === undefined) return DEFAULT_CONVERGE_PEER_REQUEST_TIMEOUT_MS;\n return normalizeConvergePeerRequestTimeoutMs(value, label);\n}\n\nfunction parseOptionalCaptureLockMs(value: unknown, label: string): number | undefined {\n if (value === undefined) return undefined;\n return normalizeCaptureWriteLockWaitMs(value, label);\n}\n\n/**\n * Config values win over env. An omitted knob stays omitted here so the\n * caller can still fall through to the built-in default. Env is read with\n * the REMNIC_ name and the legacy ENGRAM_ name.\n */\nfunction envCaptureLockMs(name: string): number | undefined {\n const raw = readEnvVar(name);\n if (raw === undefined) return undefined;\n const trimmed = raw.trim();\n if (trimmed.length === 0) return undefined;\n if (trimmed.length > 15) {\n throw new Error(`${name} must be a positive integer number of milliseconds; got ${JSON.stringify(raw)}`);\n }\n for (let index = 0; index < trimmed.length; index += 1) {\n const code = trimmed.charCodeAt(index);\n if (code < 48 || code > 57) {\n throw new Error(`${name} must be a positive integer number of milliseconds; got ${JSON.stringify(raw)}`);\n }\n }\n return normalizeCaptureWriteLockWaitMs(Number(trimmed), name);\n}\n\nexport function resolveConvergeCaptureWriteLockBackoff(\n config: ConvergeConfig | undefined\n): CaptureWriteLockBackoffLimits {\n return resolveCaptureWriteLockBackoffLimits({\n captureWriteLockInitialDelayMs:\n config?.captureWriteLockInitialDelayMs ?? envCaptureLockMs(\"REMNIC_CONVERGE_CAPTURE_LOCK_INITIAL_DELAY_MS\"),\n captureWriteLockMaxDelayMs:\n config?.captureWriteLockMaxDelayMs ?? envCaptureLockMs(\"REMNIC_CONVERGE_CAPTURE_LOCK_MAX_DELAY_MS\"),\n captureWriteLockDeadlineMs:\n config?.captureWriteLockDeadlineMs ?? envCaptureLockMs(\"REMNIC_CONVERGE_CAPTURE_LOCK_DEADLINE_MS\"),\n });\n}\n\nexport function parseConvergeConfig(block: unknown): ConvergeConfig {\n if (block === undefined) {\n return { conflictPolicy: DEFAULT_CONVERGE_CONFLICT_POLICY };\n }\n if (block === null || typeof block !== \"object\" || Array.isArray(block)) {\n throw new Error(\"converge must be a plain object\");\n }\n const prototype = Object.getPrototypeOf(block);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new Error(\"converge must be a plain object\");\n }\n const {\n conflictPolicy: rawConflictPolicy,\n peerRequestTimeoutMs,\n captureWriteLockInitialDelayMs,\n captureWriteLockMaxDelayMs,\n captureWriteLockDeadlineMs,\n ...unknown\n } = block as Record<string, unknown>;\n let conflictPolicy: unknown = rawConflictPolicy;\n const unknownKey = Object.keys(unknown)[0];\n if (unknownKey !== undefined) {\n throw new Error(`converge contains unknown key ${JSON.stringify(unknownKey)}`);\n }\n if (conflictPolicy === undefined) {\n conflictPolicy = DEFAULT_CONVERGE_CONFLICT_POLICY;\n }\n if (\n typeof conflictPolicy === \"string\" &&\n CONVERGE_CONFLICT_POLICIES.includes(conflictPolicy as ConvergeConflictPolicy)\n ) {\n const initialDelayMs = parseOptionalCaptureLockMs(\n captureWriteLockInitialDelayMs,\n \"converge.captureWriteLockInitialDelayMs\"\n );\n const maxDelayMs = parseOptionalCaptureLockMs(captureWriteLockMaxDelayMs, \"converge.captureWriteLockMaxDelayMs\");\n const deadlineMs = parseOptionalCaptureLockMs(captureWriteLockDeadlineMs, \"converge.captureWriteLockDeadlineMs\");\n // Reject an inverted schedule at parse time. Omitted knobs stay omitted\n // and are filled from defaults only when the acquire runs.\n if (initialDelayMs !== undefined && maxDelayMs !== undefined && initialDelayMs > maxDelayMs) {\n throw new Error(\n `converge.captureWriteLockInitialDelayMs (${initialDelayMs}) must be <= converge.captureWriteLockMaxDelayMs (${maxDelayMs})`\n );\n }\n if (maxDelayMs !== undefined && deadlineMs !== undefined && maxDelayMs > deadlineMs) {\n throw new Error(\n `converge.captureWriteLockMaxDelayMs (${maxDelayMs}) must be <= converge.captureWriteLockDeadlineMs (${deadlineMs})`\n );\n }\n if (initialDelayMs !== undefined && deadlineMs !== undefined && initialDelayMs > deadlineMs) {\n throw new Error(\n `converge.captureWriteLockInitialDelayMs (${initialDelayMs}) must be <= converge.captureWriteLockDeadlineMs (${deadlineMs})`\n );\n }\n return {\n conflictPolicy: conflictPolicy as ConvergeConflictPolicy,\n ...(peerRequestTimeoutMs !== undefined\n ? { peerRequestTimeoutMs: parsePeerRequestTimeoutMs(peerRequestTimeoutMs, \"converge.peerRequestTimeoutMs\") }\n : {}),\n ...(initialDelayMs !== undefined ? { captureWriteLockInitialDelayMs: initialDelayMs } : {}),\n ...(maxDelayMs !== undefined ? { captureWriteLockMaxDelayMs: maxDelayMs } : {}),\n ...(deadlineMs !== undefined ? { captureWriteLockDeadlineMs: deadlineMs } : {}),\n };\n }\n\n throw new Error(\n `converge.conflictPolicy must be one of ${CONVERGE_CONFLICT_POLICIES.join(\", \")}; got ${JSON.stringify(conflictPolicy)}`\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
import {
|
|
11
11
|
listJsonFiles,
|
|
12
12
|
readJsonFile
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-2Z5DIDQD.js";
|
|
14
14
|
|
|
15
15
|
// src/utility-telemetry.ts
|
|
16
16
|
import path from "path";
|
|
@@ -151,4 +151,4 @@ export {
|
|
|
151
151
|
readUtilityTelemetryEvents,
|
|
152
152
|
getUtilityTelemetryStatus
|
|
153
153
|
};
|
|
154
|
-
//# sourceMappingURL=chunk-
|
|
154
|
+
//# sourceMappingURL=chunk-EOU6V4IN.js.map
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
buildExplicitCaptureDedupKey,
|
|
3
|
-
isTombstoneBlockedCaptureWriteLockBusy,
|
|
4
3
|
normalizeExplicitCaptureContent
|
|
5
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-6EDW54SQ.js";
|
|
6
5
|
import {
|
|
7
6
|
TAG_LIMITS,
|
|
8
7
|
composeMemoryEnvelope
|
|
9
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-5LRV557D.js";
|
|
9
|
+
import {
|
|
10
|
+
isTombstoneBlockedCaptureWriteLockBusy
|
|
11
|
+
} from "./chunk-YET735EZ.js";
|
|
10
12
|
import {
|
|
11
13
|
isSupportPassportPrivateMemory
|
|
12
14
|
} from "./chunk-PWPIERBM.js";
|
|
@@ -787,4 +789,4 @@ export {
|
|
|
787
789
|
shouldProcessInlineExplicitCapture,
|
|
788
790
|
InlineExplicitCaptureProcessor
|
|
789
791
|
};
|
|
790
|
-
//# sourceMappingURL=chunk-
|
|
792
|
+
//# sourceMappingURL=chunk-EU6IRUCY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/explicit-capture.ts"],"sourcesContent":["import { composeMemoryEnvelope, TAG_LIMITS } from \"./write-envelope.js\";\nimport { resolveNamespaceCapabilities } from \"./capabilities.js\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport type { Orchestrator } from \"./orchestrator.js\";\nimport { log } from \"./logger.js\";\nimport { isSafeRouteNamespace } from \"./routing/engine.js\";\nimport { sanitizeMemoryContent } from \"./sanitize.js\";\nimport type { CaptureMode, MemoryCategory, MemoryLifecycleEvent, PluginConfig } from \"./types.js\";\nimport {\n buildExplicitCaptureDedupKey,\n isTombstoneBlockedCaptureWriteLockBusy,\n normalizeExplicitCaptureContent,\n} from \"./storage/tombstone-blocked-capture-index.js\";\nimport type { StorageManager } from \"./storage.js\";\nimport { isSupportPassportPrivateMemory } from \"./support-passport/card-projection.js\";\n\nexport type ExplicitCaptureInput = {\n content: string;\n category?: string;\n confidence?: number;\n namespace?: string;\n tags?: string[];\n entityRef?: string;\n sourceConnector?: string;\n ttl?: string;\n sourceReason?: string;\n};\n\nexport type ValidExplicitCapture = {\n content: string;\n category: MemoryCategory;\n confidence: number;\n namespace?: string;\n tags: string[];\n entityRef?: string;\n sourceConnector?: string;\n expiresAt?: string;\n sourceReason?: string;\n /**\n * When true, `namespace` was already resolved AND authorized by the caller\n * (the access service's `resolveCodingScopedWriteNamespace`, which auth-checks\n * the base and derives a session-owned `project-*` overlay). The persist /\n * queue layer then routes to it directly instead of re-validating against the\n * static policy allow-list — which would otherwise reject legitimately-derived\n * dynamic project namespaces (#1434). Callers that do NOT pre-authorize the\n * namespace must leave this unset so the allow-list guard still applies.\n */\n namespacePreResolved?: boolean;\n};\n\nexport type ExplicitCaptureSource = \"memory_store\" | \"memory_capture\" | \"suggestion_submit\" | \"inline\";\ntype ExplicitCaptureValidationMode = \"legacy_tool\" | \"strict_explicit\";\n\n// Bounded body {0,100000} instead of an unbounded lazy *? so scanning for the\n// closing tag cannot backtrack polynomially on unterminated <memory_note>\n// markup in hostile turn text (CodeQL js/polynomial-redos). 100 000 chars far\n// exceeds any real inline note, so matching is behavior-preserving; the outer\n// \\s* groups were also dropped (body absorbs whitespace; captures are trimmed).\nconst INLINE_NOTE_RE = /<memory_note>([\\s\\S]{0,100000}?)<\\/memory_note>/gi;\nconst INLINE_NOTE_MARKUP_RE = /<memory_note>[\\s\\S]{0,100000}?<\\/memory_note>/i;\nconst INLINE_ALLOWED_CATEGORIES = new Set<MemoryCategory>([\n \"fact\",\n \"preference\",\n \"correction\",\n \"entity\",\n \"decision\",\n \"relationship\",\n \"principle\",\n \"commitment\",\n \"moment\",\n \"skill\",\n \"rule\",\n \"procedure\",\n \"reasoning_trace\",\n]);\n\nconst SECRET_PATTERNS: RegExp[] = [\n /\\bsk-[A-Za-z0-9]{16,}\\b/,\n /\\bAKIA[0-9A-Z]{16}\\b/,\n /\\bBearer\\s+[A-Za-z0-9._-]{16,}\\b/i,\n /\\b(?:api[_-]?key|secret|token|password|passwd)\\s*[:=]\\s*[^\\s]{8,}\\b/i,\n /\\b(?:authorization)\\s*:\\s*[^\\s]{8,}\\b/i,\n];\nconst SECRET_REDACTION_PATTERNS: Array<{ pattern: RegExp; replacement: string }> = [\n { pattern: /\\bsk-[A-Za-z0-9]{16,}\\b/g, replacement: \"[redacted openai key]\" },\n { pattern: /\\bAKIA[0-9A-Z]{16}\\b/g, replacement: \"[redacted aws key]\" },\n { pattern: /\\bBearer\\s+[A-Za-z0-9._-]{16,}\\b/gi, replacement: \"Bearer [redacted token]\" },\n {\n pattern: /\\b(?:api[_-]?key|secret|token|password|passwd)\\s*[:=]\\s*[^\\s]{8,}\\b/gi,\n replacement: \"[redacted credential]\",\n },\n {\n pattern: /\\b(?:authorization)\\s*:\\s*[^\\s]{8,}\\b/gi,\n replacement: \"authorization: [redacted credential]\",\n },\n];\nconst EXPLICIT_CAPTURE_REVIEW_TAGS = [\"explicit-capture\", \"queued-review\"];\n\nfunction explicitCaptureActor(source: ExplicitCaptureSource): string {\n switch (source) {\n case \"inline\":\n return \"inline.memory_note\";\n case \"memory_store\":\n return \"tool.memory_store\";\n case \"suggestion_submit\":\n return \"tool.suggestion_submit\";\n default:\n return \"tool.memory_capture\";\n }\n}\n\nfunction asTrimmed(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction redactSecrets(value: string): string {\n let redacted = value;\n for (const { pattern, replacement } of SECRET_REDACTION_PATTERNS) {\n redacted = redacted.replace(pattern, replacement);\n }\n return redacted;\n}\n\nfunction containsSecretLikeValue(value: string): boolean {\n return SECRET_PATTERNS.some((pattern) => pattern.test(value));\n}\n\nfunction assertNoSecretLikeMetadata(field: string, value: string | undefined): void {\n const trimmed = asTrimmed(value);\n if (trimmed && containsSecretLikeValue(trimmed)) {\n throw new Error(`${field} appears to contain a secret or credential`);\n }\n}\n\nfunction assertNoSecretLikeMetadataList(field: string, values: string[] | undefined): void {\n for (const value of values ?? []) {\n assertNoSecretLikeMetadata(field, value);\n }\n}\n\nfunction sanitizeReviewText(value: string | undefined, fallback: string): string {\n const redacted = redactSecrets(asTrimmed(value) ?? fallback);\n const sanitized = sanitizeMemoryContent(redacted);\n const safe = sanitized.text.trim();\n return safe.length > 0 ? safe : fallback;\n}\n\nfunction sanitizeReviewMetadata(value: string | undefined): string | undefined {\n const trimmed = asTrimmed(value);\n if (!trimmed) return undefined;\n return sanitizeReviewText(trimmed, \"[redacted]\");\n}\n\nfunction sanitizeReviewTags(tags: string[] | undefined): string[] {\n return Array.from(\n new Set(\n (tags ?? [])\n .map((tag) => sanitizeReviewMetadata(tag))\n .filter((tag): tag is string => typeof tag === \"string\" && tag.length > 0)\n )\n );\n}\n\nfunction normalizeExplicitCaptureError(error: unknown): string {\n if (error instanceof Error && error.message.trim().length > 0) return error.message.trim();\n const rendered = String(error).trim();\n return rendered.length > 0 ? rendered : \"explicit capture failed\";\n}\n\nfunction isUnsupportedExplicitCaptureNamespaceError(error: unknown): boolean {\n return normalizeExplicitCaptureError(error).startsWith(\"unsupported namespace:\");\n}\n\nfunction resolveExplicitCaptureReviewNamespace(\n orchestrator: Orchestrator,\n namespace: string | undefined\n): string | undefined {\n const normalized = asTrimmed(namespace);\n if (!normalized) return undefined;\n return resolveExplicitCaptureNamespace(orchestrator, normalized);\n}\n\nfunction resolveExplicitCaptureNamespace(\n orchestrator: Orchestrator,\n namespace: string | undefined\n): string | undefined {\n const normalized = asTrimmed(namespace);\n if (!normalized) return undefined;\n if (!resolveNamespaceCapabilities(orchestrator.config).namespaces) {\n if (normalized !== orchestrator.config.defaultNamespace) {\n throw new Error(`unsupported namespace: ${normalized}`);\n }\n return normalized;\n }\n const allowed = new Set(\n [\n orchestrator.config.defaultNamespace,\n orchestrator.config.sharedNamespace,\n ...orchestrator.config.namespacePolicies.map((policy) => policy.name),\n ]\n .map((value) => value.trim())\n .filter(Boolean)\n );\n if (!allowed.has(normalized)) {\n throw new Error(`unsupported namespace: ${normalized}`);\n }\n return normalized;\n}\n\nfunction parseExplicitCaptureTtl(ttl: string | undefined): string | undefined {\n const raw = asTrimmed(ttl);\n if (!raw) return undefined;\n\n const absoluteMs = Date.parse(raw);\n if (Number.isFinite(absoluteMs)) {\n return new Date(absoluteMs).toISOString();\n }\n\n const relative = raw.match(/^(\\d+)\\s*([mhdw])$/i);\n if (!relative) {\n throw new Error(\"ttl must be an ISO-8601 timestamp or relative duration like 30m, 12h, 7d, or 2w\");\n }\n\n const amount = Number.parseInt(relative[1] ?? \"\", 10);\n const unit = (relative[2] ?? \"\").toLowerCase();\n if (!Number.isFinite(amount) || amount <= 0) {\n throw new Error(\"ttl duration must be a positive integer\");\n }\n\n const multiplier =\n unit === \"m\" ? 60_000 : unit === \"h\" ? 60 * 60_000 : unit === \"d\" ? 24 * 60 * 60_000 : 7 * 24 * 60 * 60_000;\n return new Date(Date.now() + amount * multiplier).toISOString();\n}\n\nfunction parseInlineConfidence(value: string): number {\n const trimmed = value.trim();\n if (!/^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i.test(trimmed)) {\n return Number.NaN;\n }\n const parsed = Number(trimmed);\n return Number.isFinite(parsed) ? parsed : Number.NaN;\n}\n\nfunction parseInlineNote(block: string): ExplicitCaptureInput {\n const lines = block.replace(/\\r/g, \"\").split(\"\\n\");\n const note: Partial<ExplicitCaptureInput> = {};\n let idx = 0;\n\n while (idx < lines.length) {\n const rawLine = lines[idx] ?? \"\";\n const line = rawLine.trim();\n idx += 1;\n if (line.length === 0) continue;\n const colonIdx = line.indexOf(\":\");\n if (colonIdx < 0) continue;\n const key = line.slice(0, colonIdx).trim();\n const value = line.slice(colonIdx + 1).trim();\n\n if (key === \"content\" && value === \"|\") {\n const contentLines: string[] = [];\n while (idx < lines.length) {\n const next = lines[idx] ?? \"\";\n if (next.startsWith(\" \") || next.startsWith(\"\\t\")) {\n contentLines.push(next.replace(/^( |\\t)/, \"\"));\n idx += 1;\n continue;\n }\n if (next.trim().length === 0) {\n contentLines.push(\"\");\n idx += 1;\n continue;\n }\n break;\n }\n note.content = contentLines.join(\"\\n\").trim();\n continue;\n }\n\n switch (key) {\n case \"content\":\n note.content = value;\n break;\n case \"category\":\n note.category = value;\n break;\n case \"confidence\":\n note.confidence = parseInlineConfidence(value);\n break;\n case \"namespace\":\n note.namespace = value;\n break;\n case \"tags\":\n note.tags = value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n break;\n case \"entityRef\":\n note.entityRef = value;\n break;\n case \"ttl\":\n note.ttl = value;\n break;\n case \"sourceReason\":\n note.sourceReason = value;\n break;\n default:\n break;\n }\n }\n\n return { content: \"\", ...note };\n}\n\nfunction parseInlineExplicitCaptureCandidates(text: string): ExplicitCaptureInput[] {\n const notes: ExplicitCaptureInput[] = [];\n for (const match of text.matchAll(INLINE_NOTE_RE)) {\n notes.push(parseInlineNote(match[1] ?? \"\"));\n }\n return notes;\n}\n\nexport function parseInlineExplicitCaptureNotes(text: string): ExplicitCaptureInput[] {\n return parseInlineExplicitCaptureCandidates(text).filter((note) => asTrimmed(note.content));\n}\n\nexport function hasInlineExplicitCaptureMarkup(text: string): boolean {\n return INLINE_NOTE_MARKUP_RE.test(text);\n}\n\nexport function stripInlineExplicitCaptureNotes(text: string): string {\n return text.replace(INLINE_NOTE_RE, \"\").trim();\n}\n\nexport function validateExplicitCaptureInput(\n input: ExplicitCaptureInput,\n mode: ExplicitCaptureValidationMode = \"strict_explicit\"\n): ValidExplicitCapture {\n const content = asTrimmed(input.content);\n if (!content) throw new Error(\"content is required\");\n if (mode === \"strict_explicit\") {\n if (content.length < 10) throw new Error(\"content must be at least 10 characters\");\n if (content.length > 4000) throw new Error(\"content must be 4000 characters or fewer\");\n }\n if (/<memory_note>/i.test(content) || /<\\/memory_note>/i.test(content)) {\n throw new Error(\"nested memory_note blocks are not allowed\");\n }\n\n const category = (asTrimmed(input.category) ?? \"fact\") as MemoryCategory;\n if (!INLINE_ALLOWED_CATEGORIES.has(category)) {\n throw new Error(`unsupported category: ${input.category ?? category}`);\n }\n\n const sanitized = sanitizeMemoryContent(content);\n if (!sanitized.clean) {\n throw new Error(\"content failed memory sanitization\");\n }\n for (const pattern of SECRET_PATTERNS) {\n if (pattern.test(content)) {\n throw new Error(\"content appears to contain a secret or credential\");\n }\n }\n assertNoSecretLikeMetadata(\"sourceReason\", input.sourceReason);\n assertNoSecretLikeMetadata(\"entityRef\", input.entityRef);\n assertNoSecretLikeMetadata(\"ttl\", input.ttl);\n assertNoSecretLikeMetadataList(\"tags\", input.tags);\n\n if (input.confidence !== undefined && !Number.isFinite(input.confidence)) {\n throw new Error(\"confidence must be a finite number\");\n }\n const confidence = input.confidence === undefined ? 0.95 : Number(input.confidence);\n if (confidence < 0 || confidence > 1) {\n throw new Error(\"confidence must be between 0 and 1\");\n }\n const requestedNamespace = asTrimmed(input.namespace);\n if (requestedNamespace && !isSafeRouteNamespace(requestedNamespace)) {\n throw new Error(`unsafe namespace: ${requestedNamespace}`);\n }\n const expiresAt = parseExplicitCaptureTtl(input.ttl);\n\n // #2014 review round: enforce the composer's tag contract HERE so a capture\n // that passes validation can never fail later at strict compose time\n // (validated-then-thrown was a broken contract). Same limits as TAG_LIMITS.\n const dedupedTags = Array.from(new Set((input.tags ?? []).map((tag) => tag.trim()).filter(Boolean)));\n if (dedupedTags.length > TAG_LIMITS.maxTags) {\n throw new Error(`too many tags: ${dedupedTags.length} exceeds the ${TAG_LIMITS.maxTags}-tag limit`);\n }\n for (const tag of dedupedTags) {\n if (tag.length > TAG_LIMITS.maxTagLength) {\n throw new Error(`tag exceeds ${TAG_LIMITS.maxTagLength} characters: ${JSON.stringify(tag.slice(0, 40))}…`);\n }\n }\n\n return {\n content,\n category,\n confidence,\n namespace: asTrimmed(input.namespace),\n tags: dedupedTags,\n entityRef: asTrimmed(input.entityRef),\n sourceReason: asTrimmed(input.sourceReason),\n // Trimmed like the other optional metadata (#2017 review round): a\n // whitespace-only connector previously passed validation and then blew\n // up at strict compose time - validated input must always compose.\n sourceConnector: asTrimmed(input.sourceConnector),\n expiresAt,\n };\n}\n\nasync function findDuplicateExplicitCapture(\n orchestrator: Orchestrator,\n resolvedNamespace: string | undefined,\n candidate: ValidExplicitCapture,\n storageOverride?: StorageManager\n): Promise<{ id: string; tombstoneBlocked: boolean } | null> {\n const storage = storageOverride ?? (await orchestrator.getStorage(resolvedNamespace));\n // Tombstone-blocked rows are absent from the active fact hash index. An\n // authoritative miss can therefore skip the corpus scan only after the\n // targeted blocked-row index reports a miss and remains authoritative.\n let authoritativeFactHashMiss = false;\n if (candidate.category === \"fact\" && typeof storage.hasFactContentHash === \"function\") {\n try {\n const hasHash = await storage.hasFactContentHash(candidate.content);\n if (!hasHash) {\n const authoritative =\n typeof storage.isFactContentHashAuthoritative === \"function\"\n ? await storage.isFactContentHashAuthoritative()\n : false;\n authoritativeFactHashMiss = authoritative;\n }\n } catch (err) {\n // Fail open: hash indexes are only an optimization, so fall back to the\n // full corpus scan when either index cannot answer.\n void err;\n }\n }\n if (authoritativeFactHashMiss) {\n const checkBlockedIndex = storage.checkTombstoneBlockedExplicitCapture;\n if (typeof checkBlockedIndex === \"function\") {\n try {\n const result = await checkBlockedIndex.call(\n storage,\n candidate.content,\n candidate.category,\n candidate.sourceConnector\n );\n if (!result.has && result.authoritative) return null;\n } catch (err) {\n // Fail open: an unavailable targeted index must not hide a durable\n // pending-review duplicate.\n void err;\n }\n } else {\n const hasBlockedIndex = storage.hasTombstoneBlockedExplicitCapture;\n if (typeof hasBlockedIndex === \"function\") {\n try {\n const hasBlocked = await hasBlockedIndex.call(\n storage,\n candidate.content,\n candidate.category,\n candidate.sourceConnector\n );\n if (!hasBlocked) {\n const isIndexAuthoritative =\n typeof storage.isTombstoneBlockedExplicitCaptureIndexAuthoritative === \"function\"\n ? await storage.isTombstoneBlockedExplicitCaptureIndexAuthoritative()\n : false;\n if (isIndexAuthoritative) return null;\n }\n } catch (err) {\n // Fail open: an unavailable targeted index must not hide a durable\n // pending-review duplicate.\n void err;\n }\n }\n }\n }\n const hotMemories = await storage.readAllMemories();\n const coldMemories = typeof storage.readAllColdMemories === \"function\" ? await storage.readAllColdMemories() : [];\n const existing = [...hotMemories, ...coldMemories];\n const normalizedCandidate = normalizeExplicitCaptureContent(candidate.content);\n const match = existing.find((memory) => {\n if (isSupportPassportPrivateMemory(memory)) return false;\n const status = memory.frontmatter.status ?? \"active\";\n if (status !== \"active\" && (status !== \"pending_review\" || !memory.frontmatter.blockedBy)) {\n return false;\n }\n if (memory.frontmatter.category !== candidate.category) return false;\n if (normalizeExplicitCaptureContent(memory.content) !== normalizedCandidate) return false;\n // Connector-aware dedup: same content from different connectors is NOT\n // a duplicate. Operator (undefined) and connector-tagged memories are\n // always distinct. Normalize empty strings to undefined.\n const existingConnector = memory.frontmatter.sourceConnector?.trim() || undefined;\n const newConnector = candidate.sourceConnector?.trim() || undefined;\n if (existingConnector !== newConnector) return false;\n return true;\n });\n return match\n ? {\n id: match.frontmatter.id,\n tombstoneBlocked: match.frontmatter.status === \"pending_review\" && Boolean(match.frontmatter.blockedBy),\n }\n : null;\n}\nasync function persistExplicitCaptureUnlocked(\n orchestrator: Orchestrator,\n candidate: ValidExplicitCapture,\n source: ExplicitCaptureSource,\n resolvedNamespace: string | undefined,\n storage: StorageManager\n): Promise<{ id: string; duplicateOf?: string; tombstoneBlocked?: boolean }> {\n const duplicate = await findDuplicateExplicitCapture(orchestrator, resolvedNamespace, candidate, storage);\n if (duplicate) {\n return duplicate.tombstoneBlocked\n ? { id: duplicate.id, duplicateOf: duplicate.id, tombstoneBlocked: true }\n : { id: duplicate.id, duplicateOf: duplicate.id };\n }\n\n // #1645 (review thread yG-): surface the tombstone block so callers\n // (memory_store tool, access-service HTTP/MCP) can report the capture as\n // queued for review instead of a successfully stored active memory.\n // Sealed-envelope write (issue #1989 PR2).\n const captureEnvelope = composeMemoryEnvelope(\n {\n content: candidate.content,\n category: candidate.category,\n confidence: candidate.confidence,\n tags: candidate.tags,\n ...(candidate.entityRef ? { entityRef: candidate.entityRef } : {}),\n ...(candidate.expiresAt ? { ttl: candidate.expiresAt } : {}),\n ...(candidate.sourceConnector ? { sourceConnector: candidate.sourceConnector } : {}),\n ...(candidate.sourceReason ? { sourceReason: candidate.sourceReason } : {}),\n },\n { source: source === \"inline\" ? \"explicit-inline\" : \"explicit\" }\n );\n const { id, duplicateOf, tombstoneBlocked } = await storage.writeSealedMemory(captureEnvelope);\n if (duplicateOf) return { id, duplicateOf, tombstoneBlocked };\n // #1522: catalog touch handled at the storage chokepoint — the StorageManager's\n // post-write hook records the namespace touch automatically.\n\n const created = new Date().toISOString();\n const event: MemoryLifecycleEvent = {\n eventId: `mle-${randomUUID()}`,\n memoryId: id,\n eventType: tombstoneBlocked ? \"explicit_capture_queued\" : \"explicit_capture_accepted\",\n timestamp: created,\n actor: explicitCaptureActor(source),\n reasonCode: candidate.sourceReason,\n ruleVersion: \"explicit-capture.v1\",\n };\n await storage.appendMemoryLifecycleEvents([event]);\n\n return { id, duplicateOf, tombstoneBlocked };\n}\n\nexport async function persistExplicitCapture(\n orchestrator: Orchestrator,\n candidate: ValidExplicitCapture,\n source: ExplicitCaptureSource\n): Promise<{ id: string; duplicateOf?: string; tombstoneBlocked?: boolean }> {\n const resolvedNamespace = candidate.namespacePreResolved\n ? asTrimmed(candidate.namespace)\n : resolveExplicitCaptureNamespace(orchestrator, candidate.namespace);\n const storage = await orchestrator.getStorage(resolvedNamespace);\n const persist = () => persistExplicitCaptureUnlocked(orchestrator, candidate, source, resolvedNamespace, storage);\n if (typeof storage.withTombstoneBlockedCaptureWriteLock !== \"function\") return await persist();\n const lockIdentity = buildExplicitCaptureDedupKey(candidate.content, candidate.category, candidate.sourceConnector);\n return await storage.withTombstoneBlockedCaptureWriteLock(persist, lockIdentity);\n}\n\nfunction buildExplicitCaptureReviewContent(input: ExplicitCaptureInput, reason: string): string {\n const requestedContent = asTrimmed(input.content);\n const safeContent = sanitizeReviewText(requestedContent, \"[empty explicit capture]\");\n const safeCategory = sanitizeReviewMetadata(input.category);\n const safeNamespace = sanitizeReviewMetadata(input.namespace);\n const safeEntityRef = sanitizeReviewMetadata(input.entityRef);\n const safeTtl = sanitizeReviewMetadata(input.ttl);\n const safeSourceReason = sanitizeReviewMetadata(input.sourceReason);\n const safeTags = sanitizeReviewTags(input.tags);\n const lines = [\"Explicit capture queued for review.\", \"\", `Reason: ${reason}`, \"\", \"Submitted content:\", safeContent];\n const metadata = [\n safeCategory ? `Requested category: ${safeCategory}` : undefined,\n safeNamespace ? `Requested namespace: ${safeNamespace}` : undefined,\n safeEntityRef ? `Requested entityRef: ${safeEntityRef}` : undefined,\n safeTtl ? `Requested ttl: ${safeTtl}` : undefined,\n safeSourceReason ? `Requested sourceReason: ${safeSourceReason}` : undefined,\n safeTags.length > 0 ? `Requested tags: ${safeTags.join(\", \")}` : undefined,\n ].filter((entry): entry is string => typeof entry === \"string\" && entry.length > 0);\n if (metadata.length > 0) {\n lines.push(\"\", ...metadata);\n }\n return lines.join(\"\\n\");\n}\n\nfunction explicitCaptureReviewNamespaces(\n orchestrator: Orchestrator,\n queueNamespace: string | undefined\n): Array<string | undefined> {\n const config = orchestrator.config;\n return [asTrimmed(queueNamespace) ?? asTrimmed(config?.defaultNamespace)];\n}\n\nasync function findQueuedExplicitCaptureDuplicate(\n orchestrator: Orchestrator,\n namespace: string | undefined,\n content: string,\n sourceConnector?: string\n): Promise<string | null> {\n const storages = Array.from(\n new Set(\n await Promise.all(\n explicitCaptureReviewNamespaces(orchestrator, namespace).map((reviewNamespace) =>\n orchestrator.getStorage(reviewNamespace)\n )\n )\n )\n );\n const memorySets = await Promise.all(\n storages.map(async (storage) => {\n const hotMemories = await storage.readAllMemories();\n const coldMemories = typeof storage.readAllColdMemories === \"function\" ? await storage.readAllColdMemories() : [];\n return [...hotMemories, ...coldMemories];\n })\n );\n const existing = memorySets.flat();\n const normalized = normalizeExplicitCaptureContent(content);\n const match = existing.find((memory) => {\n const status = memory.frontmatter.status ?? \"active\";\n if (status !== \"pending_review\") return false;\n if (!(memory.frontmatter.tags ?? []).includes(\"queued-review\")) return false;\n if (normalizeExplicitCaptureContent(memory.content) !== normalized) return false;\n const existingConnector = memory.frontmatter.sourceConnector?.trim() || undefined;\n const newConnector = sourceConnector?.trim() || undefined;\n if (existingConnector !== newConnector) return false;\n return true;\n });\n return match?.frontmatter.id ?? null;\n}\n\nexport type ExplicitCaptureReviewQueueOptions = {\n /** A server-authorized namespace resolved from the authenticated session. */\n resolvedNamespace?: string;\n};\n\nexport async function queueExplicitCaptureForReview(\n orchestrator: Orchestrator,\n input: ExplicitCaptureInput,\n source: ExplicitCaptureSource,\n error: unknown,\n options: ExplicitCaptureReviewQueueOptions = {}\n): Promise<{ id: string; duplicateOf?: string }> {\n const reason = sanitizeReviewText(normalizeExplicitCaptureError(error), \"explicit capture failed\");\n const requestedNamespace = asTrimmed(input.namespace);\n const resolvedNamespace = asTrimmed(options.resolvedNamespace);\n // A caller-pre-authorized namespace (e.g. a session-owned project overlay\n // from the access service) routes directly; otherwise apply the static\n // policy allow-list guard (#1434).\n const queueNamespace =\n resolvedNamespace ??\n ((input as { namespacePreResolved?: boolean }).namespacePreResolved\n ? requestedNamespace\n : resolveExplicitCaptureReviewNamespace(orchestrator, requestedNamespace));\n const content = buildExplicitCaptureReviewContent(input, reason);\n const requestedCategory = asTrimmed(input.category);\n const reviewCategory =\n requestedCategory && INLINE_ALLOWED_CATEGORIES.has(requestedCategory as MemoryCategory)\n ? (requestedCategory as MemoryCategory)\n : \"fact\";\n const requestedTags = sanitizeReviewTags(input.tags);\n const storage = await orchestrator.getStorage(queueNamespace);\n const lockIdentity = buildExplicitCaptureDedupKey(content, reviewCategory, input.sourceConnector);\n const queue = async (): Promise<{ id: string; duplicateOf?: string }> => {\n const duplicateOf = await findQueuedExplicitCaptureDuplicate(\n orchestrator,\n queueNamespace,\n content,\n input.sourceConnector\n );\n if (duplicateOf) {\n return { id: duplicateOf, duplicateOf };\n }\n\n const reviewEnvelope = composeMemoryEnvelope(\n {\n content,\n category: reviewCategory,\n confidence: 0.2,\n tags: Array.from(new Set([...EXPLICIT_CAPTURE_REVIEW_TAGS, ...requestedTags])),\n ...(sanitizeReviewMetadata(input.entityRef) ? { entityRef: sanitizeReviewMetadata(input.entityRef) } : {}),\n ...(input.sourceConnector ? { sourceConnector: input.sourceConnector } : {}),\n },\n { source: source === \"inline\" ? \"explicit-inline-review\" : \"explicit-review\" },\n // The review queue is the FALLBACK for a capture that already failed\n // primary validation — it must never be un-queueable. The tag list is\n // machine-assembled (requested tags + the two fixed review tags), so 49+\n // requested tags would push past the 50-tag limit and strict compose\n // would throw, losing the capture (#2014 review round). Salvage clamps\n // instead; the fixed review tags sort first in the assembly above, so\n // they always survive the clamp.\n { salvage: true }\n );\n const { id } = await storage.writeSealedMemory(reviewEnvelope);\n try {\n const created = await storage.getMemoryById(id);\n if (created) {\n await storage.writeMemoryFrontmatter(\n created,\n {\n status: \"pending_review\",\n updated: new Date().toISOString(),\n },\n {\n actor: explicitCaptureActor(source),\n reasonCode: reason,\n ruleVersion: \"explicit-capture.v1\",\n }\n );\n }\n } finally {\n // Record the catalog write touch (issue #1499, round 5/6 codex P2; NIhUg).\n // A queued review capture writes memory to the namespace's root (the DEFAULT\n // root when undefined), so its `lastWriteAt` must reflect the write once\n // `writeMemory` returns an id. If the later pending-review frontmatter update\n // fails, the memory file is still durable and must not disappear from\n // writtenSince/maintenance scheduling. Guarded optional hook (rule #33).\n // #1522: catalog touch handled at the storage chokepoint.\n }\n const event: MemoryLifecycleEvent = {\n eventId: `mle-${randomUUID()}`,\n memoryId: id,\n eventType: \"explicit_capture_queued\",\n timestamp: new Date().toISOString(),\n actor: explicitCaptureActor(source),\n reasonCode: reason,\n ruleVersion: \"explicit-capture.v1\",\n };\n await storage.appendMemoryLifecycleEvents([event]);\n return { id };\n };\n if (typeof storage.withTombstoneBlockedCaptureWriteLock !== \"function\") return await queue();\n return await storage.withTombstoneBlockedCaptureWriteLock(queue, lockIdentity);\n}\n\nexport function shouldSkipImplicitExtraction(cfg: Pick<PluginConfig, \"captureMode\">): boolean {\n return cfg.captureMode === \"explicit\";\n}\n\nexport function shouldProcessInlineExplicitCapture(cfg: Pick<PluginConfig, \"captureMode\">): boolean {\n return cfg.captureMode !== \"implicit\";\n}\n\nexport interface InlineExplicitCaptureProcessRequest {\n content: string;\n captureMode: CaptureMode;\n dedupeKeys?: readonly string[];\n namespace?: string;\n namespacePreResolved?: boolean;\n reviewNamespace?: string;\n reviewNamespacePreResolved?: boolean;\n sourceConnector?: string;\n}\n\nexport interface InlineExplicitCaptureProcessResult {\n content: string;\n processed: number;\n accepted: number;\n queued: number;\n duplicates: number;\n failed: number;\n}\n\nexport interface InlineExplicitCaptureProcessorOptions {\n sourceConnector?: string;\n maxDedupeKeys?: number;\n}\n\nconst DEFAULT_INLINE_CAPTURE_DEDUPE_KEY_LIMIT = 1024;\n\nexport class InlineExplicitCaptureProcessor {\n private readonly observedKeys = new Set<string>();\n private readonly observedKeyOrder: string[] = [];\n private readonly maxDedupeKeys: number;\n private readonly processingTails = new Map<string, Promise<void>>();\n\n constructor(\n private readonly orchestrator: Orchestrator,\n private readonly options: InlineExplicitCaptureProcessorOptions = {}\n ) {\n const requestedLimit = options.maxDedupeKeys ?? DEFAULT_INLINE_CAPTURE_DEDUPE_KEY_LIMIT;\n this.maxDedupeKeys =\n Number.isFinite(requestedLimit) && requestedLimit > 0\n ? Math.max(1, Math.floor(requestedLimit))\n : DEFAULT_INLINE_CAPTURE_DEDUPE_KEY_LIMIT;\n }\n\n private enqueue<T>(key: string, operation: () => Promise<T>): Promise<T> {\n const previous = this.processingTails.get(key) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n this.processingTails.set(key, current);\n return previous.then(operation).finally(() => {\n if (this.processingTails.get(key) === current) this.processingTails.delete(key);\n release();\n });\n }\n\n private buildDedupeKeys(\n dedupeKeys: readonly string[] | undefined,\n input: ExplicitCaptureInput,\n namespacePreResolved: boolean,\n fallbackReviewNamespace?: string\n ): { replayKeys: string[]; validationFailureKey: string } {\n let fallbackNamespace: string | undefined;\n let effectiveNamespace = asTrimmed(input.namespace);\n if (!namespacePreResolved) {\n try {\n effectiveNamespace = resolveExplicitCaptureNamespace(this.orchestrator, effectiveNamespace);\n } catch {\n fallbackNamespace = asTrimmed(fallbackReviewNamespace) ?? this.orchestrator.config.defaultNamespace;\n effectiveNamespace = fallbackNamespace;\n }\n }\n const requestedNamespace = asTrimmed(input.namespace);\n const namespaceScope =\n fallbackNamespace === undefined\n ? effectiveNamespace ?? this.orchestrator.config.defaultNamespace\n : `${fallbackNamespace}\\u0000requested:${requestedNamespace ?? \"\"}`;\n const sourceConnectorScope = asTrimmed(input.sourceConnector) ?? \"\";\n const deliveryKeys = Array.from(\n new Set((dedupeKeys ?? []).map((key) => asTrimmed(key)).filter((key): key is string => key !== undefined))\n ).sort();\n const noteHash = createHash(\"sha256\")\n .update(\n JSON.stringify({\n content: normalizeExplicitCaptureContent(input.content),\n category: asTrimmed(input.category) ?? \"fact\",\n })\n )\n .digest(\"hex\");\n const validationTags = Array.from(\n new Set((input.tags ?? []).map((tag) => asTrimmed(tag)).filter((tag): tag is string => tag !== undefined))\n ).sort();\n const validationHash = createHash(\"sha256\")\n .update(\n JSON.stringify({\n content: asTrimmed(input.content) ?? \"\",\n category: asTrimmed(input.category) ?? \"fact\",\n confidence:\n input.confidence === undefined\n ? \"default\"\n : Number.isFinite(input.confidence)\n ? input.confidence\n : \"invalid\",\n namespace: asTrimmed(input.namespace),\n tags: validationTags,\n entityRef: asTrimmed(input.entityRef),\n sourceReason: asTrimmed(input.sourceReason),\n ttl: asTrimmed(input.ttl),\n deliveryKeys,\n })\n )\n .digest(\"hex\");\n const identityPrefix = `${namespaceScope}\\u0000${sourceConnectorScope}\\u0000`;\n const fallbackKey = `${identityPrefix}fallback:inline-memory-note:${noteHash}`;\n return {\n replayKeys:\n deliveryKeys.length > 0\n ? deliveryKeys.map((key) => `${identityPrefix}${key}:inline-memory-note:${noteHash}`)\n : [fallbackKey],\n validationFailureKey: `${identityPrefix}validation:inline-memory-note:${validationHash}`,\n };\n }\n\n private isNamespacePolicyAuthorized(namespace: string | undefined): boolean {\n try {\n resolveExplicitCaptureNamespace(this.orchestrator, namespace);\n return true;\n } catch {\n return false;\n }\n }\n\n private resolveReviewFallbackNamespace(\n request: InlineExplicitCaptureProcessRequest,\n input: ExplicitCaptureInput\n ): string | undefined {\n if (request.namespacePreResolved === true || this.isNamespacePolicyAuthorized(input.namespace)) return undefined;\n return request.reviewNamespacePreResolved === true\n ? asTrimmed(request.reviewNamespace)\n : this.orchestrator.config.defaultNamespace;\n }\n\n\n private remember(keys: readonly string[]): void {\n for (const key of keys) {\n if (this.observedKeys.has(key)) continue;\n this.observedKeys.add(key);\n this.observedKeyOrder.push(key);\n }\n while (this.observedKeyOrder.length > this.maxDedupeKeys) {\n const expired = this.observedKeyOrder.shift();\n if (expired) this.observedKeys.delete(expired);\n }\n }\n\n private async processNote(\n request: InlineExplicitCaptureProcessRequest,\n input: ExplicitCaptureInput,\n replayKeys: readonly string[],\n validationFailureKey: string\n ): Promise<Pick<InlineExplicitCaptureProcessResult, \"processed\" | \"accepted\" | \"queued\" | \"duplicates\" | \"failed\">> {\n const serializationKey = replayKeys.at(-1) ?? validationFailureKey;\n return this.enqueue(serializationKey, async () => {\n if (replayKeys.some((key) => this.observedKeys.has(key)) || this.observedKeys.has(validationFailureKey)) {\n return { processed: 0, accepted: 0, queued: 0, duplicates: 1, failed: 0 };\n }\n\n const classifyPersisted = (\n persisted: Awaited<ReturnType<typeof persistExplicitCapture>>\n ): Pick<InlineExplicitCaptureProcessResult, \"processed\" | \"accepted\" | \"queued\" | \"duplicates\" | \"failed\"> => {\n this.remember(replayKeys);\n if (persisted.duplicateOf) {\n return { processed: 1, accepted: 0, queued: 0, duplicates: 1, failed: 0 };\n }\n if (persisted.tombstoneBlocked) {\n this.orchestrator.requestQmdMaintenanceForTool(\"inline.memory_note.review\");\n return { processed: 1, accepted: 0, queued: 1, duplicates: 0, failed: 0 };\n }\n this.orchestrator.requestQmdMaintenanceForTool(\"inline.memory_note\");\n return { processed: 1, accepted: 1, queued: 0, duplicates: 0, failed: 0 };\n };\n const persistCandidate = async (candidate: ValidExplicitCapture) =>\n classifyPersisted(await persistExplicitCapture(this.orchestrator, candidate, \"inline\"));\n\n let validationSucceeded = false;\n let candidate: ValidExplicitCapture | undefined;\n try {\n candidate = validateExplicitCaptureInput(input);\n if (request.namespacePreResolved === true) candidate.namespacePreResolved = true;\n validationSucceeded = true;\n return await persistCandidate(candidate);\n } catch (error) {\n let captureError: unknown = error;\n if (validationSucceeded && candidate && isTombstoneBlockedCaptureWriteLockBusy(error)) {\n try {\n return await persistCandidate(candidate);\n } catch (retryError) {\n if (isTombstoneBlockedCaptureWriteLockBusy(retryError)) {\n log.warn(\n `explicit inline capture deferred after tombstone write lock contention: ${normalizeExplicitCaptureError(retryError)}`\n );\n return { processed: 0, accepted: 0, queued: 0, duplicates: 0, failed: 1 };\n }\n captureError = retryError;\n }\n }\n if (validationSucceeded && !isUnsupportedExplicitCaptureNamespaceError(captureError)) {\n log.warn(`explicit inline capture persistence failed: ${normalizeExplicitCaptureError(captureError)}`);\n return { processed: 0, accepted: 0, queued: 0, duplicates: 0, failed: 1 };\n }\n\n const queueInput = request.namespacePreResolved === true ? { ...input, namespacePreResolved: true } : input;\n const reviewNamespace = this.resolveReviewFallbackNamespace(request, input);\n try {\n const review = await queueExplicitCaptureForReview(\n this.orchestrator,\n queueInput,\n \"inline\",\n captureError,\n reviewNamespace ? { resolvedNamespace: reviewNamespace } : undefined\n );\n this.remember(validationSucceeded ? replayKeys : [validationFailureKey]);\n if (review.duplicateOf) {\n return { processed: 1, accepted: 0, queued: 0, duplicates: 1, failed: 0 };\n }\n this.orchestrator.requestQmdMaintenanceForTool(\"inline.memory_note.review\");\n return { processed: 1, accepted: 0, queued: 1, duplicates: 0, failed: 0 };\n } catch (queueError) {\n log.warn(\n `explicit inline capture rejected: ${normalizeExplicitCaptureError(captureError)}; review queue fallback failed: ${normalizeExplicitCaptureError(queueError)}`\n );\n return { processed: 0, accepted: 0, queued: 0, duplicates: 0, failed: 1 };\n }\n }\n });\n }\n\n async process(request: InlineExplicitCaptureProcessRequest): Promise<InlineExplicitCaptureProcessResult> {\n if (!shouldProcessInlineExplicitCapture({ captureMode: request.captureMode })) {\n return { content: request.content, processed: 0, accepted: 0, queued: 0, duplicates: 0, failed: 0 };\n }\n if (request.namespacePreResolved === true && !asTrimmed(request.namespace)) {\n throw new Error(\"namespacePreResolved requires a resolved namespace\");\n }\n if (request.reviewNamespacePreResolved === true && !asTrimmed(request.reviewNamespace)) {\n throw new Error(\"reviewNamespacePreResolved requires a resolved namespace\");\n }\n\n const notes = parseInlineExplicitCaptureCandidates(request.content);\n const content = hasInlineExplicitCaptureMarkup(request.content)\n ? stripInlineExplicitCaptureNotes(request.content)\n : request.content;\n const sourceConnector = asTrimmed(request.sourceConnector) ?? asTrimmed(this.options.sourceConnector);\n let processed = 0;\n let accepted = 0;\n let queued = 0;\n let duplicates = 0;\n let failed = 0;\n\n for (const note of notes) {\n const input: ExplicitCaptureInput = {\n ...note,\n ...(request.namespace !== undefined ? { namespace: request.namespace } : {}),\n ...(sourceConnector ? { sourceConnector } : {}),\n };\n const { replayKeys, validationFailureKey } = this.buildDedupeKeys(\n request.dedupeKeys,\n input,\n request.namespacePreResolved === true,\n this.resolveReviewFallbackNamespace(request, input)\n );\n const result = await this.processNote(request, input, replayKeys, validationFailureKey);\n processed += result.processed;\n accepted += result.accepted;\n queued += result.queued;\n duplicates += result.duplicates;\n failed += result.failed;\n }\n\n return { content, processed, accepted, queued, duplicates, failed };\n }\n}\n"],"mappings":"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","names":["candidate"]}
|
|
1
|
+
{"version":3,"sources":["../src/explicit-capture.ts"],"sourcesContent":["import { composeMemoryEnvelope, TAG_LIMITS } from \"./write-envelope.js\";\nimport { resolveNamespaceCapabilities } from \"./capabilities.js\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport type { Orchestrator } from \"./orchestrator.js\";\nimport { log } from \"./logger.js\";\nimport { isSafeRouteNamespace } from \"./routing/engine.js\";\nimport { sanitizeMemoryContent } from \"./sanitize.js\";\nimport type { CaptureMode, MemoryCategory, MemoryLifecycleEvent, PluginConfig } from \"./types.js\";\nimport {\n buildExplicitCaptureDedupKey,\n isTombstoneBlockedCaptureWriteLockBusy,\n normalizeExplicitCaptureContent,\n} from \"./storage/tombstone-blocked-capture-index.js\";\nimport type { StorageManager } from \"./storage.js\";\nimport { isSupportPassportPrivateMemory } from \"./support-passport/card-projection.js\";\n\nexport type ExplicitCaptureInput = {\n content: string;\n category?: string;\n confidence?: number;\n namespace?: string;\n tags?: string[];\n entityRef?: string;\n sourceConnector?: string;\n ttl?: string;\n sourceReason?: string;\n};\n\nexport type ValidExplicitCapture = {\n content: string;\n category: MemoryCategory;\n confidence: number;\n namespace?: string;\n tags: string[];\n entityRef?: string;\n sourceConnector?: string;\n expiresAt?: string;\n sourceReason?: string;\n /**\n * When true, `namespace` was already resolved AND authorized by the caller\n * (the access service's `resolveCodingScopedWriteNamespace`, which auth-checks\n * the base and derives a session-owned `project-*` overlay). The persist /\n * queue layer then routes to it directly instead of re-validating against the\n * static policy allow-list — which would otherwise reject legitimately-derived\n * dynamic project namespaces (#1434). Callers that do NOT pre-authorize the\n * namespace must leave this unset so the allow-list guard still applies.\n */\n namespacePreResolved?: boolean;\n};\n\nexport type ExplicitCaptureSource = \"memory_store\" | \"memory_capture\" | \"suggestion_submit\" | \"inline\";\ntype ExplicitCaptureValidationMode = \"legacy_tool\" | \"strict_explicit\";\n\n// Bounded body {0,100000} instead of an unbounded lazy *? so scanning for the\n// closing tag cannot backtrack polynomially on unterminated <memory_note>\n// markup in hostile turn text (CodeQL js/polynomial-redos). 100 000 chars far\n// exceeds any real inline note, so matching is behavior-preserving; the outer\n// \\s* groups were also dropped (body absorbs whitespace; captures are trimmed).\nconst INLINE_NOTE_RE = /<memory_note>([\\s\\S]{0,100000}?)<\\/memory_note>/gi;\nconst INLINE_NOTE_MARKUP_RE = /<memory_note>[\\s\\S]{0,100000}?<\\/memory_note>/i;\nconst INLINE_ALLOWED_CATEGORIES = new Set<MemoryCategory>([\n \"fact\",\n \"preference\",\n \"correction\",\n \"entity\",\n \"decision\",\n \"relationship\",\n \"principle\",\n \"commitment\",\n \"moment\",\n \"skill\",\n \"rule\",\n \"procedure\",\n \"reasoning_trace\",\n]);\n\nconst SECRET_PATTERNS: RegExp[] = [\n /\\bsk-[A-Za-z0-9]{16,}\\b/,\n /\\bAKIA[0-9A-Z]{16}\\b/,\n /\\bBearer\\s+[A-Za-z0-9._-]{16,}\\b/i,\n /\\b(?:api[_-]?key|secret|token|password|passwd)\\s*[:=]\\s*[^\\s]{8,}\\b/i,\n /\\b(?:authorization)\\s*:\\s*[^\\s]{8,}\\b/i,\n];\nconst SECRET_REDACTION_PATTERNS: Array<{ pattern: RegExp; replacement: string }> = [\n { pattern: /\\bsk-[A-Za-z0-9]{16,}\\b/g, replacement: \"[redacted openai key]\" },\n { pattern: /\\bAKIA[0-9A-Z]{16}\\b/g, replacement: \"[redacted aws key]\" },\n { pattern: /\\bBearer\\s+[A-Za-z0-9._-]{16,}\\b/gi, replacement: \"Bearer [redacted token]\" },\n {\n pattern: /\\b(?:api[_-]?key|secret|token|password|passwd)\\s*[:=]\\s*[^\\s]{8,}\\b/gi,\n replacement: \"[redacted credential]\",\n },\n {\n pattern: /\\b(?:authorization)\\s*:\\s*[^\\s]{8,}\\b/gi,\n replacement: \"authorization: [redacted credential]\",\n },\n];\nconst EXPLICIT_CAPTURE_REVIEW_TAGS = [\"explicit-capture\", \"queued-review\"];\n\nfunction explicitCaptureActor(source: ExplicitCaptureSource): string {\n switch (source) {\n case \"inline\":\n return \"inline.memory_note\";\n case \"memory_store\":\n return \"tool.memory_store\";\n case \"suggestion_submit\":\n return \"tool.suggestion_submit\";\n default:\n return \"tool.memory_capture\";\n }\n}\n\nfunction asTrimmed(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction redactSecrets(value: string): string {\n let redacted = value;\n for (const { pattern, replacement } of SECRET_REDACTION_PATTERNS) {\n redacted = redacted.replace(pattern, replacement);\n }\n return redacted;\n}\n\nfunction containsSecretLikeValue(value: string): boolean {\n return SECRET_PATTERNS.some((pattern) => pattern.test(value));\n}\n\nfunction assertNoSecretLikeMetadata(field: string, value: string | undefined): void {\n const trimmed = asTrimmed(value);\n if (trimmed && containsSecretLikeValue(trimmed)) {\n throw new Error(`${field} appears to contain a secret or credential`);\n }\n}\n\nfunction assertNoSecretLikeMetadataList(field: string, values: string[] | undefined): void {\n for (const value of values ?? []) {\n assertNoSecretLikeMetadata(field, value);\n }\n}\n\nfunction sanitizeReviewText(value: string | undefined, fallback: string): string {\n const redacted = redactSecrets(asTrimmed(value) ?? fallback);\n const sanitized = sanitizeMemoryContent(redacted);\n const safe = sanitized.text.trim();\n return safe.length > 0 ? safe : fallback;\n}\n\nfunction sanitizeReviewMetadata(value: string | undefined): string | undefined {\n const trimmed = asTrimmed(value);\n if (!trimmed) return undefined;\n return sanitizeReviewText(trimmed, \"[redacted]\");\n}\n\nfunction sanitizeReviewTags(tags: string[] | undefined): string[] {\n return Array.from(\n new Set(\n (tags ?? [])\n .map((tag) => sanitizeReviewMetadata(tag))\n .filter((tag): tag is string => typeof tag === \"string\" && tag.length > 0)\n )\n );\n}\n\nfunction normalizeExplicitCaptureError(error: unknown): string {\n if (error instanceof Error && error.message.trim().length > 0) return error.message.trim();\n const rendered = String(error).trim();\n return rendered.length > 0 ? rendered : \"explicit capture failed\";\n}\n\nfunction isUnsupportedExplicitCaptureNamespaceError(error: unknown): boolean {\n return normalizeExplicitCaptureError(error).startsWith(\"unsupported namespace:\");\n}\n\nfunction resolveExplicitCaptureReviewNamespace(\n orchestrator: Orchestrator,\n namespace: string | undefined\n): string | undefined {\n const normalized = asTrimmed(namespace);\n if (!normalized) return undefined;\n return resolveExplicitCaptureNamespace(orchestrator, normalized);\n}\n\nfunction resolveExplicitCaptureNamespace(\n orchestrator: Orchestrator,\n namespace: string | undefined\n): string | undefined {\n const normalized = asTrimmed(namespace);\n if (!normalized) return undefined;\n if (!resolveNamespaceCapabilities(orchestrator.config).namespaces) {\n if (normalized !== orchestrator.config.defaultNamespace) {\n throw new Error(`unsupported namespace: ${normalized}`);\n }\n return normalized;\n }\n const allowed = new Set(\n [\n orchestrator.config.defaultNamespace,\n orchestrator.config.sharedNamespace,\n ...orchestrator.config.namespacePolicies.map((policy) => policy.name),\n ]\n .map((value) => value.trim())\n .filter(Boolean)\n );\n if (!allowed.has(normalized)) {\n throw new Error(`unsupported namespace: ${normalized}`);\n }\n return normalized;\n}\n\nfunction parseExplicitCaptureTtl(ttl: string | undefined): string | undefined {\n const raw = asTrimmed(ttl);\n if (!raw) return undefined;\n\n const absoluteMs = Date.parse(raw);\n if (Number.isFinite(absoluteMs)) {\n return new Date(absoluteMs).toISOString();\n }\n\n const relative = raw.match(/^(\\d+)\\s*([mhdw])$/i);\n if (!relative) {\n throw new Error(\"ttl must be an ISO-8601 timestamp or relative duration like 30m, 12h, 7d, or 2w\");\n }\n\n const amount = Number.parseInt(relative[1] ?? \"\", 10);\n const unit = (relative[2] ?? \"\").toLowerCase();\n if (!Number.isFinite(amount) || amount <= 0) {\n throw new Error(\"ttl duration must be a positive integer\");\n }\n\n const multiplier =\n unit === \"m\" ? 60_000 : unit === \"h\" ? 60 * 60_000 : unit === \"d\" ? 24 * 60 * 60_000 : 7 * 24 * 60 * 60_000;\n return new Date(Date.now() + amount * multiplier).toISOString();\n}\n\nfunction parseInlineConfidence(value: string): number {\n const trimmed = value.trim();\n if (!/^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i.test(trimmed)) {\n return Number.NaN;\n }\n const parsed = Number(trimmed);\n return Number.isFinite(parsed) ? parsed : Number.NaN;\n}\n\nfunction parseInlineNote(block: string): ExplicitCaptureInput {\n const lines = block.replace(/\\r/g, \"\").split(\"\\n\");\n const note: Partial<ExplicitCaptureInput> = {};\n let idx = 0;\n\n while (idx < lines.length) {\n const rawLine = lines[idx] ?? \"\";\n const line = rawLine.trim();\n idx += 1;\n if (line.length === 0) continue;\n const colonIdx = line.indexOf(\":\");\n if (colonIdx < 0) continue;\n const key = line.slice(0, colonIdx).trim();\n const value = line.slice(colonIdx + 1).trim();\n\n if (key === \"content\" && value === \"|\") {\n const contentLines: string[] = [];\n while (idx < lines.length) {\n const next = lines[idx] ?? \"\";\n if (next.startsWith(\" \") || next.startsWith(\"\\t\")) {\n contentLines.push(next.replace(/^( |\\t)/, \"\"));\n idx += 1;\n continue;\n }\n if (next.trim().length === 0) {\n contentLines.push(\"\");\n idx += 1;\n continue;\n }\n break;\n }\n note.content = contentLines.join(\"\\n\").trim();\n continue;\n }\n\n switch (key) {\n case \"content\":\n note.content = value;\n break;\n case \"category\":\n note.category = value;\n break;\n case \"confidence\":\n note.confidence = parseInlineConfidence(value);\n break;\n case \"namespace\":\n note.namespace = value;\n break;\n case \"tags\":\n note.tags = value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n break;\n case \"entityRef\":\n note.entityRef = value;\n break;\n case \"ttl\":\n note.ttl = value;\n break;\n case \"sourceReason\":\n note.sourceReason = value;\n break;\n default:\n break;\n }\n }\n\n return { content: \"\", ...note };\n}\n\nfunction parseInlineExplicitCaptureCandidates(text: string): ExplicitCaptureInput[] {\n const notes: ExplicitCaptureInput[] = [];\n for (const match of text.matchAll(INLINE_NOTE_RE)) {\n notes.push(parseInlineNote(match[1] ?? \"\"));\n }\n return notes;\n}\n\nexport function parseInlineExplicitCaptureNotes(text: string): ExplicitCaptureInput[] {\n return parseInlineExplicitCaptureCandidates(text).filter((note) => asTrimmed(note.content));\n}\n\nexport function hasInlineExplicitCaptureMarkup(text: string): boolean {\n return INLINE_NOTE_MARKUP_RE.test(text);\n}\n\nexport function stripInlineExplicitCaptureNotes(text: string): string {\n return text.replace(INLINE_NOTE_RE, \"\").trim();\n}\n\nexport function validateExplicitCaptureInput(\n input: ExplicitCaptureInput,\n mode: ExplicitCaptureValidationMode = \"strict_explicit\"\n): ValidExplicitCapture {\n const content = asTrimmed(input.content);\n if (!content) throw new Error(\"content is required\");\n if (mode === \"strict_explicit\") {\n if (content.length < 10) throw new Error(\"content must be at least 10 characters\");\n if (content.length > 4000) throw new Error(\"content must be 4000 characters or fewer\");\n }\n if (/<memory_note>/i.test(content) || /<\\/memory_note>/i.test(content)) {\n throw new Error(\"nested memory_note blocks are not allowed\");\n }\n\n const category = (asTrimmed(input.category) ?? \"fact\") as MemoryCategory;\n if (!INLINE_ALLOWED_CATEGORIES.has(category)) {\n throw new Error(`unsupported category: ${input.category ?? category}`);\n }\n\n const sanitized = sanitizeMemoryContent(content);\n if (!sanitized.clean) {\n throw new Error(\"content failed memory sanitization\");\n }\n for (const pattern of SECRET_PATTERNS) {\n if (pattern.test(content)) {\n throw new Error(\"content appears to contain a secret or credential\");\n }\n }\n assertNoSecretLikeMetadata(\"sourceReason\", input.sourceReason);\n assertNoSecretLikeMetadata(\"entityRef\", input.entityRef);\n assertNoSecretLikeMetadata(\"ttl\", input.ttl);\n assertNoSecretLikeMetadataList(\"tags\", input.tags);\n\n if (input.confidence !== undefined && !Number.isFinite(input.confidence)) {\n throw new Error(\"confidence must be a finite number\");\n }\n const confidence = input.confidence === undefined ? 0.95 : Number(input.confidence);\n if (confidence < 0 || confidence > 1) {\n throw new Error(\"confidence must be between 0 and 1\");\n }\n const requestedNamespace = asTrimmed(input.namespace);\n if (requestedNamespace && !isSafeRouteNamespace(requestedNamespace)) {\n throw new Error(`unsafe namespace: ${requestedNamespace}`);\n }\n const expiresAt = parseExplicitCaptureTtl(input.ttl);\n\n // #2014 review round: enforce the composer's tag contract HERE so a capture\n // that passes validation can never fail later at strict compose time\n // (validated-then-thrown was a broken contract). Same limits as TAG_LIMITS.\n const dedupedTags = Array.from(new Set((input.tags ?? []).map((tag) => tag.trim()).filter(Boolean)));\n if (dedupedTags.length > TAG_LIMITS.maxTags) {\n throw new Error(`too many tags: ${dedupedTags.length} exceeds the ${TAG_LIMITS.maxTags}-tag limit`);\n }\n for (const tag of dedupedTags) {\n if (tag.length > TAG_LIMITS.maxTagLength) {\n throw new Error(`tag exceeds ${TAG_LIMITS.maxTagLength} characters: ${JSON.stringify(tag.slice(0, 40))}…`);\n }\n }\n\n return {\n content,\n category,\n confidence,\n namespace: asTrimmed(input.namespace),\n tags: dedupedTags,\n entityRef: asTrimmed(input.entityRef),\n sourceReason: asTrimmed(input.sourceReason),\n // Trimmed like the other optional metadata (#2017 review round): a\n // whitespace-only connector previously passed validation and then blew\n // up at strict compose time - validated input must always compose.\n sourceConnector: asTrimmed(input.sourceConnector),\n expiresAt,\n };\n}\n\nasync function findDuplicateExplicitCapture(\n orchestrator: Orchestrator,\n resolvedNamespace: string | undefined,\n candidate: ValidExplicitCapture,\n storageOverride?: StorageManager\n): Promise<{ id: string; tombstoneBlocked: boolean } | null> {\n const storage = storageOverride ?? (await orchestrator.getStorage(resolvedNamespace));\n // Tombstone-blocked rows are absent from the active fact hash index. An\n // authoritative miss can therefore skip the corpus scan only after the\n // targeted blocked-row index reports a miss and remains authoritative.\n let authoritativeFactHashMiss = false;\n if (candidate.category === \"fact\" && typeof storage.hasFactContentHash === \"function\") {\n try {\n const hasHash = await storage.hasFactContentHash(candidate.content);\n if (!hasHash) {\n const authoritative =\n typeof storage.isFactContentHashAuthoritative === \"function\"\n ? await storage.isFactContentHashAuthoritative()\n : false;\n authoritativeFactHashMiss = authoritative;\n }\n } catch (err) {\n // Fail open: hash indexes are only an optimization, so fall back to the\n // full corpus scan when either index cannot answer.\n void err;\n }\n }\n if (authoritativeFactHashMiss) {\n const checkBlockedIndex = storage.checkTombstoneBlockedExplicitCapture;\n if (typeof checkBlockedIndex === \"function\") {\n try {\n const result = await checkBlockedIndex.call(\n storage,\n candidate.content,\n candidate.category,\n candidate.sourceConnector\n );\n if (!result.has && result.authoritative) return null;\n } catch (err) {\n // Fail open: an unavailable targeted index must not hide a durable\n // pending-review duplicate.\n void err;\n }\n } else {\n const hasBlockedIndex = storage.hasTombstoneBlockedExplicitCapture;\n if (typeof hasBlockedIndex === \"function\") {\n try {\n const hasBlocked = await hasBlockedIndex.call(\n storage,\n candidate.content,\n candidate.category,\n candidate.sourceConnector\n );\n if (!hasBlocked) {\n const isIndexAuthoritative =\n typeof storage.isTombstoneBlockedExplicitCaptureIndexAuthoritative === \"function\"\n ? await storage.isTombstoneBlockedExplicitCaptureIndexAuthoritative()\n : false;\n if (isIndexAuthoritative) return null;\n }\n } catch (err) {\n // Fail open: an unavailable targeted index must not hide a durable\n // pending-review duplicate.\n void err;\n }\n }\n }\n }\n const hotMemories = await storage.readAllMemories();\n const coldMemories = typeof storage.readAllColdMemories === \"function\" ? await storage.readAllColdMemories() : [];\n const existing = [...hotMemories, ...coldMemories];\n const normalizedCandidate = normalizeExplicitCaptureContent(candidate.content);\n const match = existing.find((memory) => {\n if (isSupportPassportPrivateMemory(memory)) return false;\n const status = memory.frontmatter.status ?? \"active\";\n if (status !== \"active\" && (status !== \"pending_review\" || !memory.frontmatter.blockedBy)) {\n return false;\n }\n if (memory.frontmatter.category !== candidate.category) return false;\n if (normalizeExplicitCaptureContent(memory.content) !== normalizedCandidate) return false;\n // Connector-aware dedup: same content from different connectors is NOT\n // a duplicate. Operator (undefined) and connector-tagged memories are\n // always distinct. Normalize empty strings to undefined.\n const existingConnector = memory.frontmatter.sourceConnector?.trim() || undefined;\n const newConnector = candidate.sourceConnector?.trim() || undefined;\n if (existingConnector !== newConnector) return false;\n return true;\n });\n return match\n ? {\n id: match.frontmatter.id,\n tombstoneBlocked: match.frontmatter.status === \"pending_review\" && Boolean(match.frontmatter.blockedBy),\n }\n : null;\n}\nasync function persistExplicitCaptureUnlocked(\n orchestrator: Orchestrator,\n candidate: ValidExplicitCapture,\n source: ExplicitCaptureSource,\n resolvedNamespace: string | undefined,\n storage: StorageManager\n): Promise<{ id: string; duplicateOf?: string; tombstoneBlocked?: boolean }> {\n const duplicate = await findDuplicateExplicitCapture(orchestrator, resolvedNamespace, candidate, storage);\n if (duplicate) {\n return duplicate.tombstoneBlocked\n ? { id: duplicate.id, duplicateOf: duplicate.id, tombstoneBlocked: true }\n : { id: duplicate.id, duplicateOf: duplicate.id };\n }\n\n // #1645 (review thread yG-): surface the tombstone block so callers\n // (memory_store tool, access-service HTTP/MCP) can report the capture as\n // queued for review instead of a successfully stored active memory.\n // Sealed-envelope write (issue #1989 PR2).\n const captureEnvelope = composeMemoryEnvelope(\n {\n content: candidate.content,\n category: candidate.category,\n confidence: candidate.confidence,\n tags: candidate.tags,\n ...(candidate.entityRef ? { entityRef: candidate.entityRef } : {}),\n ...(candidate.expiresAt ? { ttl: candidate.expiresAt } : {}),\n ...(candidate.sourceConnector ? { sourceConnector: candidate.sourceConnector } : {}),\n ...(candidate.sourceReason ? { sourceReason: candidate.sourceReason } : {}),\n },\n { source: source === \"inline\" ? \"explicit-inline\" : \"explicit\" }\n );\n const { id, duplicateOf, tombstoneBlocked } = await storage.writeSealedMemory(captureEnvelope);\n if (duplicateOf) return { id, duplicateOf, tombstoneBlocked };\n // #1522: catalog touch handled at the storage chokepoint — the StorageManager's\n // post-write hook records the namespace touch automatically.\n\n const created = new Date().toISOString();\n const event: MemoryLifecycleEvent = {\n eventId: `mle-${randomUUID()}`,\n memoryId: id,\n eventType: tombstoneBlocked ? \"explicit_capture_queued\" : \"explicit_capture_accepted\",\n timestamp: created,\n actor: explicitCaptureActor(source),\n reasonCode: candidate.sourceReason,\n ruleVersion: \"explicit-capture.v1\",\n };\n await storage.appendMemoryLifecycleEvents([event]);\n\n return { id, duplicateOf, tombstoneBlocked };\n}\n\nexport async function persistExplicitCapture(\n orchestrator: Orchestrator,\n candidate: ValidExplicitCapture,\n source: ExplicitCaptureSource\n): Promise<{ id: string; duplicateOf?: string; tombstoneBlocked?: boolean }> {\n const resolvedNamespace = candidate.namespacePreResolved\n ? asTrimmed(candidate.namespace)\n : resolveExplicitCaptureNamespace(orchestrator, candidate.namespace);\n const storage = await orchestrator.getStorage(resolvedNamespace);\n const persist = () => persistExplicitCaptureUnlocked(orchestrator, candidate, source, resolvedNamespace, storage);\n if (typeof storage.withTombstoneBlockedCaptureWriteLock !== \"function\") return await persist();\n const lockIdentity = buildExplicitCaptureDedupKey(candidate.content, candidate.category, candidate.sourceConnector);\n return await storage.withTombstoneBlockedCaptureWriteLock(persist, lockIdentity);\n}\n\nfunction buildExplicitCaptureReviewContent(input: ExplicitCaptureInput, reason: string): string {\n const requestedContent = asTrimmed(input.content);\n const safeContent = sanitizeReviewText(requestedContent, \"[empty explicit capture]\");\n const safeCategory = sanitizeReviewMetadata(input.category);\n const safeNamespace = sanitizeReviewMetadata(input.namespace);\n const safeEntityRef = sanitizeReviewMetadata(input.entityRef);\n const safeTtl = sanitizeReviewMetadata(input.ttl);\n const safeSourceReason = sanitizeReviewMetadata(input.sourceReason);\n const safeTags = sanitizeReviewTags(input.tags);\n const lines = [\"Explicit capture queued for review.\", \"\", `Reason: ${reason}`, \"\", \"Submitted content:\", safeContent];\n const metadata = [\n safeCategory ? `Requested category: ${safeCategory}` : undefined,\n safeNamespace ? `Requested namespace: ${safeNamespace}` : undefined,\n safeEntityRef ? `Requested entityRef: ${safeEntityRef}` : undefined,\n safeTtl ? `Requested ttl: ${safeTtl}` : undefined,\n safeSourceReason ? `Requested sourceReason: ${safeSourceReason}` : undefined,\n safeTags.length > 0 ? `Requested tags: ${safeTags.join(\", \")}` : undefined,\n ].filter((entry): entry is string => typeof entry === \"string\" && entry.length > 0);\n if (metadata.length > 0) {\n lines.push(\"\", ...metadata);\n }\n return lines.join(\"\\n\");\n}\n\nfunction explicitCaptureReviewNamespaces(\n orchestrator: Orchestrator,\n queueNamespace: string | undefined\n): Array<string | undefined> {\n const config = orchestrator.config;\n return [asTrimmed(queueNamespace) ?? asTrimmed(config?.defaultNamespace)];\n}\n\nasync function findQueuedExplicitCaptureDuplicate(\n orchestrator: Orchestrator,\n namespace: string | undefined,\n content: string,\n sourceConnector?: string\n): Promise<string | null> {\n const storages = Array.from(\n new Set(\n await Promise.all(\n explicitCaptureReviewNamespaces(orchestrator, namespace).map((reviewNamespace) =>\n orchestrator.getStorage(reviewNamespace)\n )\n )\n )\n );\n const memorySets = await Promise.all(\n storages.map(async (storage) => {\n const hotMemories = await storage.readAllMemories();\n const coldMemories = typeof storage.readAllColdMemories === \"function\" ? await storage.readAllColdMemories() : [];\n return [...hotMemories, ...coldMemories];\n })\n );\n const existing = memorySets.flat();\n const normalized = normalizeExplicitCaptureContent(content);\n const match = existing.find((memory) => {\n const status = memory.frontmatter.status ?? \"active\";\n if (status !== \"pending_review\") return false;\n if (!(memory.frontmatter.tags ?? []).includes(\"queued-review\")) return false;\n if (normalizeExplicitCaptureContent(memory.content) !== normalized) return false;\n const existingConnector = memory.frontmatter.sourceConnector?.trim() || undefined;\n const newConnector = sourceConnector?.trim() || undefined;\n if (existingConnector !== newConnector) return false;\n return true;\n });\n return match?.frontmatter.id ?? null;\n}\n\nexport type ExplicitCaptureReviewQueueOptions = {\n /** A server-authorized namespace resolved from the authenticated session. */\n resolvedNamespace?: string;\n};\n\nexport async function queueExplicitCaptureForReview(\n orchestrator: Orchestrator,\n input: ExplicitCaptureInput,\n source: ExplicitCaptureSource,\n error: unknown,\n options: ExplicitCaptureReviewQueueOptions = {}\n): Promise<{ id: string; duplicateOf?: string }> {\n const reason = sanitizeReviewText(normalizeExplicitCaptureError(error), \"explicit capture failed\");\n const requestedNamespace = asTrimmed(input.namespace);\n const resolvedNamespace = asTrimmed(options.resolvedNamespace);\n // A caller-pre-authorized namespace (e.g. a session-owned project overlay\n // from the access service) routes directly; otherwise apply the static\n // policy allow-list guard (#1434).\n const queueNamespace =\n resolvedNamespace ??\n ((input as { namespacePreResolved?: boolean }).namespacePreResolved\n ? requestedNamespace\n : resolveExplicitCaptureReviewNamespace(orchestrator, requestedNamespace));\n const content = buildExplicitCaptureReviewContent(input, reason);\n const requestedCategory = asTrimmed(input.category);\n const reviewCategory =\n requestedCategory && INLINE_ALLOWED_CATEGORIES.has(requestedCategory as MemoryCategory)\n ? (requestedCategory as MemoryCategory)\n : \"fact\";\n const requestedTags = sanitizeReviewTags(input.tags);\n const storage = await orchestrator.getStorage(queueNamespace);\n const lockIdentity = buildExplicitCaptureDedupKey(content, reviewCategory, input.sourceConnector);\n const queue = async (): Promise<{ id: string; duplicateOf?: string }> => {\n const duplicateOf = await findQueuedExplicitCaptureDuplicate(\n orchestrator,\n queueNamespace,\n content,\n input.sourceConnector\n );\n if (duplicateOf) {\n return { id: duplicateOf, duplicateOf };\n }\n\n const reviewEnvelope = composeMemoryEnvelope(\n {\n content,\n category: reviewCategory,\n confidence: 0.2,\n tags: Array.from(new Set([...EXPLICIT_CAPTURE_REVIEW_TAGS, ...requestedTags])),\n ...(sanitizeReviewMetadata(input.entityRef) ? { entityRef: sanitizeReviewMetadata(input.entityRef) } : {}),\n ...(input.sourceConnector ? { sourceConnector: input.sourceConnector } : {}),\n },\n { source: source === \"inline\" ? \"explicit-inline-review\" : \"explicit-review\" },\n // The review queue is the FALLBACK for a capture that already failed\n // primary validation — it must never be un-queueable. The tag list is\n // machine-assembled (requested tags + the two fixed review tags), so 49+\n // requested tags would push past the 50-tag limit and strict compose\n // would throw, losing the capture (#2014 review round). Salvage clamps\n // instead; the fixed review tags sort first in the assembly above, so\n // they always survive the clamp.\n { salvage: true }\n );\n const { id } = await storage.writeSealedMemory(reviewEnvelope);\n try {\n const created = await storage.getMemoryById(id);\n if (created) {\n await storage.writeMemoryFrontmatter(\n created,\n {\n status: \"pending_review\",\n updated: new Date().toISOString(),\n },\n {\n actor: explicitCaptureActor(source),\n reasonCode: reason,\n ruleVersion: \"explicit-capture.v1\",\n }\n );\n }\n } finally {\n // Record the catalog write touch (issue #1499, round 5/6 codex P2; NIhUg).\n // A queued review capture writes memory to the namespace's root (the DEFAULT\n // root when undefined), so its `lastWriteAt` must reflect the write once\n // `writeMemory` returns an id. If the later pending-review frontmatter update\n // fails, the memory file is still durable and must not disappear from\n // writtenSince/maintenance scheduling. Guarded optional hook (rule #33).\n // #1522: catalog touch handled at the storage chokepoint.\n }\n const event: MemoryLifecycleEvent = {\n eventId: `mle-${randomUUID()}`,\n memoryId: id,\n eventType: \"explicit_capture_queued\",\n timestamp: new Date().toISOString(),\n actor: explicitCaptureActor(source),\n reasonCode: reason,\n ruleVersion: \"explicit-capture.v1\",\n };\n await storage.appendMemoryLifecycleEvents([event]);\n return { id };\n };\n if (typeof storage.withTombstoneBlockedCaptureWriteLock !== \"function\") return await queue();\n return await storage.withTombstoneBlockedCaptureWriteLock(queue, lockIdentity);\n}\n\nexport function shouldSkipImplicitExtraction(cfg: Pick<PluginConfig, \"captureMode\">): boolean {\n return cfg.captureMode === \"explicit\";\n}\n\nexport function shouldProcessInlineExplicitCapture(cfg: Pick<PluginConfig, \"captureMode\">): boolean {\n return cfg.captureMode !== \"implicit\";\n}\n\nexport interface InlineExplicitCaptureProcessRequest {\n content: string;\n captureMode: CaptureMode;\n dedupeKeys?: readonly string[];\n namespace?: string;\n namespacePreResolved?: boolean;\n reviewNamespace?: string;\n reviewNamespacePreResolved?: boolean;\n sourceConnector?: string;\n}\n\nexport interface InlineExplicitCaptureProcessResult {\n content: string;\n processed: number;\n accepted: number;\n queued: number;\n duplicates: number;\n failed: number;\n}\n\nexport interface InlineExplicitCaptureProcessorOptions {\n sourceConnector?: string;\n maxDedupeKeys?: number;\n}\n\nconst DEFAULT_INLINE_CAPTURE_DEDUPE_KEY_LIMIT = 1024;\n\nexport class InlineExplicitCaptureProcessor {\n private readonly observedKeys = new Set<string>();\n private readonly observedKeyOrder: string[] = [];\n private readonly maxDedupeKeys: number;\n private readonly processingTails = new Map<string, Promise<void>>();\n\n constructor(\n private readonly orchestrator: Orchestrator,\n private readonly options: InlineExplicitCaptureProcessorOptions = {}\n ) {\n const requestedLimit = options.maxDedupeKeys ?? DEFAULT_INLINE_CAPTURE_DEDUPE_KEY_LIMIT;\n this.maxDedupeKeys =\n Number.isFinite(requestedLimit) && requestedLimit > 0\n ? Math.max(1, Math.floor(requestedLimit))\n : DEFAULT_INLINE_CAPTURE_DEDUPE_KEY_LIMIT;\n }\n\n private enqueue<T>(key: string, operation: () => Promise<T>): Promise<T> {\n const previous = this.processingTails.get(key) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n this.processingTails.set(key, current);\n return previous.then(operation).finally(() => {\n if (this.processingTails.get(key) === current) this.processingTails.delete(key);\n release();\n });\n }\n\n private buildDedupeKeys(\n dedupeKeys: readonly string[] | undefined,\n input: ExplicitCaptureInput,\n namespacePreResolved: boolean,\n fallbackReviewNamespace?: string\n ): { replayKeys: string[]; validationFailureKey: string } {\n let fallbackNamespace: string | undefined;\n let effectiveNamespace = asTrimmed(input.namespace);\n if (!namespacePreResolved) {\n try {\n effectiveNamespace = resolveExplicitCaptureNamespace(this.orchestrator, effectiveNamespace);\n } catch {\n fallbackNamespace = asTrimmed(fallbackReviewNamespace) ?? this.orchestrator.config.defaultNamespace;\n effectiveNamespace = fallbackNamespace;\n }\n }\n const requestedNamespace = asTrimmed(input.namespace);\n const namespaceScope =\n fallbackNamespace === undefined\n ? effectiveNamespace ?? this.orchestrator.config.defaultNamespace\n : `${fallbackNamespace}\\u0000requested:${requestedNamespace ?? \"\"}`;\n const sourceConnectorScope = asTrimmed(input.sourceConnector) ?? \"\";\n const deliveryKeys = Array.from(\n new Set((dedupeKeys ?? []).map((key) => asTrimmed(key)).filter((key): key is string => key !== undefined))\n ).sort();\n const noteHash = createHash(\"sha256\")\n .update(\n JSON.stringify({\n content: normalizeExplicitCaptureContent(input.content),\n category: asTrimmed(input.category) ?? \"fact\",\n })\n )\n .digest(\"hex\");\n const validationTags = Array.from(\n new Set((input.tags ?? []).map((tag) => asTrimmed(tag)).filter((tag): tag is string => tag !== undefined))\n ).sort();\n const validationHash = createHash(\"sha256\")\n .update(\n JSON.stringify({\n content: asTrimmed(input.content) ?? \"\",\n category: asTrimmed(input.category) ?? \"fact\",\n confidence:\n input.confidence === undefined\n ? \"default\"\n : Number.isFinite(input.confidence)\n ? input.confidence\n : \"invalid\",\n namespace: asTrimmed(input.namespace),\n tags: validationTags,\n entityRef: asTrimmed(input.entityRef),\n sourceReason: asTrimmed(input.sourceReason),\n ttl: asTrimmed(input.ttl),\n deliveryKeys,\n })\n )\n .digest(\"hex\");\n const identityPrefix = `${namespaceScope}\\u0000${sourceConnectorScope}\\u0000`;\n const fallbackKey = `${identityPrefix}fallback:inline-memory-note:${noteHash}`;\n return {\n replayKeys:\n deliveryKeys.length > 0\n ? deliveryKeys.map((key) => `${identityPrefix}${key}:inline-memory-note:${noteHash}`)\n : [fallbackKey],\n validationFailureKey: `${identityPrefix}validation:inline-memory-note:${validationHash}`,\n };\n }\n\n private isNamespacePolicyAuthorized(namespace: string | undefined): boolean {\n try {\n resolveExplicitCaptureNamespace(this.orchestrator, namespace);\n return true;\n } catch {\n return false;\n }\n }\n\n private resolveReviewFallbackNamespace(\n request: InlineExplicitCaptureProcessRequest,\n input: ExplicitCaptureInput\n ): string | undefined {\n if (request.namespacePreResolved === true || this.isNamespacePolicyAuthorized(input.namespace)) return undefined;\n return request.reviewNamespacePreResolved === true\n ? asTrimmed(request.reviewNamespace)\n : this.orchestrator.config.defaultNamespace;\n }\n\n\n private remember(keys: readonly string[]): void {\n for (const key of keys) {\n if (this.observedKeys.has(key)) continue;\n this.observedKeys.add(key);\n this.observedKeyOrder.push(key);\n }\n while (this.observedKeyOrder.length > this.maxDedupeKeys) {\n const expired = this.observedKeyOrder.shift();\n if (expired) this.observedKeys.delete(expired);\n }\n }\n\n private async processNote(\n request: InlineExplicitCaptureProcessRequest,\n input: ExplicitCaptureInput,\n replayKeys: readonly string[],\n validationFailureKey: string\n ): Promise<Pick<InlineExplicitCaptureProcessResult, \"processed\" | \"accepted\" | \"queued\" | \"duplicates\" | \"failed\">> {\n const serializationKey = replayKeys.at(-1) ?? validationFailureKey;\n return this.enqueue(serializationKey, async () => {\n if (replayKeys.some((key) => this.observedKeys.has(key)) || this.observedKeys.has(validationFailureKey)) {\n return { processed: 0, accepted: 0, queued: 0, duplicates: 1, failed: 0 };\n }\n\n const classifyPersisted = (\n persisted: Awaited<ReturnType<typeof persistExplicitCapture>>\n ): Pick<InlineExplicitCaptureProcessResult, \"processed\" | \"accepted\" | \"queued\" | \"duplicates\" | \"failed\"> => {\n this.remember(replayKeys);\n if (persisted.duplicateOf) {\n return { processed: 1, accepted: 0, queued: 0, duplicates: 1, failed: 0 };\n }\n if (persisted.tombstoneBlocked) {\n this.orchestrator.requestQmdMaintenanceForTool(\"inline.memory_note.review\");\n return { processed: 1, accepted: 0, queued: 1, duplicates: 0, failed: 0 };\n }\n this.orchestrator.requestQmdMaintenanceForTool(\"inline.memory_note\");\n return { processed: 1, accepted: 1, queued: 0, duplicates: 0, failed: 0 };\n };\n const persistCandidate = async (candidate: ValidExplicitCapture) =>\n classifyPersisted(await persistExplicitCapture(this.orchestrator, candidate, \"inline\"));\n\n let validationSucceeded = false;\n let candidate: ValidExplicitCapture | undefined;\n try {\n candidate = validateExplicitCaptureInput(input);\n if (request.namespacePreResolved === true) candidate.namespacePreResolved = true;\n validationSucceeded = true;\n return await persistCandidate(candidate);\n } catch (error) {\n let captureError: unknown = error;\n if (validationSucceeded && candidate && isTombstoneBlockedCaptureWriteLockBusy(error)) {\n try {\n return await persistCandidate(candidate);\n } catch (retryError) {\n if (isTombstoneBlockedCaptureWriteLockBusy(retryError)) {\n log.warn(\n `explicit inline capture deferred after tombstone write lock contention: ${normalizeExplicitCaptureError(retryError)}`\n );\n return { processed: 0, accepted: 0, queued: 0, duplicates: 0, failed: 1 };\n }\n captureError = retryError;\n }\n }\n if (validationSucceeded && !isUnsupportedExplicitCaptureNamespaceError(captureError)) {\n log.warn(`explicit inline capture persistence failed: ${normalizeExplicitCaptureError(captureError)}`);\n return { processed: 0, accepted: 0, queued: 0, duplicates: 0, failed: 1 };\n }\n\n const queueInput = request.namespacePreResolved === true ? { ...input, namespacePreResolved: true } : input;\n const reviewNamespace = this.resolveReviewFallbackNamespace(request, input);\n try {\n const review = await queueExplicitCaptureForReview(\n this.orchestrator,\n queueInput,\n \"inline\",\n captureError,\n reviewNamespace ? { resolvedNamespace: reviewNamespace } : undefined\n );\n this.remember(validationSucceeded ? replayKeys : [validationFailureKey]);\n if (review.duplicateOf) {\n return { processed: 1, accepted: 0, queued: 0, duplicates: 1, failed: 0 };\n }\n this.orchestrator.requestQmdMaintenanceForTool(\"inline.memory_note.review\");\n return { processed: 1, accepted: 0, queued: 1, duplicates: 0, failed: 0 };\n } catch (queueError) {\n log.warn(\n `explicit inline capture rejected: ${normalizeExplicitCaptureError(captureError)}; review queue fallback failed: ${normalizeExplicitCaptureError(queueError)}`\n );\n return { processed: 0, accepted: 0, queued: 0, duplicates: 0, failed: 1 };\n }\n }\n });\n }\n\n async process(request: InlineExplicitCaptureProcessRequest): Promise<InlineExplicitCaptureProcessResult> {\n if (!shouldProcessInlineExplicitCapture({ captureMode: request.captureMode })) {\n return { content: request.content, processed: 0, accepted: 0, queued: 0, duplicates: 0, failed: 0 };\n }\n if (request.namespacePreResolved === true && !asTrimmed(request.namespace)) {\n throw new Error(\"namespacePreResolved requires a resolved namespace\");\n }\n if (request.reviewNamespacePreResolved === true && !asTrimmed(request.reviewNamespace)) {\n throw new Error(\"reviewNamespacePreResolved requires a resolved namespace\");\n }\n\n const notes = parseInlineExplicitCaptureCandidates(request.content);\n const content = hasInlineExplicitCaptureMarkup(request.content)\n ? stripInlineExplicitCaptureNotes(request.content)\n : request.content;\n const sourceConnector = asTrimmed(request.sourceConnector) ?? asTrimmed(this.options.sourceConnector);\n let processed = 0;\n let accepted = 0;\n let queued = 0;\n let duplicates = 0;\n let failed = 0;\n\n for (const note of notes) {\n const input: ExplicitCaptureInput = {\n ...note,\n ...(request.namespace !== undefined ? { namespace: request.namespace } : {}),\n ...(sourceConnector ? { sourceConnector } : {}),\n };\n const { replayKeys, validationFailureKey } = this.buildDedupeKeys(\n request.dedupeKeys,\n input,\n request.namespacePreResolved === true,\n this.resolveReviewFallbackNamespace(request, input)\n );\n const result = await this.processNote(request, input, replayKeys, validationFailureKey);\n processed += result.processed;\n accepted += result.accepted;\n queued += result.queued;\n duplicates += result.duplicates;\n failed += result.failed;\n }\n\n return { content, processed, accepted, queued, duplicates, failed };\n }\n}\n"],"mappings":"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","names":["candidate"]}
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
assertEmbeddingGenerationLockHeld,
|
|
8
8
|
embeddingGenerationLockPath,
|
|
9
9
|
withEmbeddingGenerationLock
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-LLHZZOIB.js";
|
|
11
11
|
import {
|
|
12
12
|
EmbeddingIndexFileStore,
|
|
13
13
|
EmbeddingIndexStorageError
|
|
@@ -672,4 +672,4 @@ export {
|
|
|
672
672
|
EmbeddingProviderUnavailableError,
|
|
673
673
|
EmbeddingFallback
|
|
674
674
|
};
|
|
675
|
-
//# sourceMappingURL=chunk-
|
|
675
|
+
//# sourceMappingURL=chunk-EUCYTCFP.js.map
|