@remnic/core 1.0.0
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.d.ts +52 -0
- package/dist/abstraction-nodes.js +15 -0
- package/dist/abstraction-nodes.js.map +1 -0
- package/dist/access-cli.d.ts +5 -0
- package/dist/access-cli.js +308 -0
- package/dist/access-cli.js.map +1 -0
- package/dist/access-http.d.ts +158 -0
- package/dist/access-http.js +32 -0
- package/dist/access-http.js.map +1 -0
- package/dist/access-idempotency.d.ts +31 -0
- package/dist/access-idempotency.js +11 -0
- package/dist/access-idempotency.js.map +1 -0
- package/dist/access-mcp.d.ts +76 -0
- package/dist/access-mcp.js +8 -0
- package/dist/access-mcp.js.map +1 -0
- package/dist/access-schema.d.ts +266 -0
- package/dist/access-schema.js +29 -0
- package/dist/access-schema.js.map +1 -0
- package/dist/access-service.d.ts +614 -0
- package/dist/access-service.js +32 -0
- package/dist/access-service.js.map +1 -0
- package/dist/behavior-learner.d.ts +16 -0
- package/dist/behavior-learner.js +124 -0
- package/dist/behavior-learner.js.map +1 -0
- package/dist/behavior-signals.d.ts +15 -0
- package/dist/behavior-signals.js +11 -0
- package/dist/behavior-signals.js.map +1 -0
- package/dist/bootstrap.d.ts +46 -0
- package/dist/bootstrap.js +9 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/boxes.d.ts +93 -0
- package/dist/boxes.js +14 -0
- package/dist/boxes.js.map +1 -0
- package/dist/buffer.d.ts +22 -0
- package/dist/buffer.js +9 -0
- package/dist/buffer.js.map +1 -0
- package/dist/calibration.d.ts +81 -0
- package/dist/calibration.js +239 -0
- package/dist/calibration.js.map +1 -0
- package/dist/causal-behavior.d.ts +79 -0
- package/dist/causal-behavior.js +190 -0
- package/dist/causal-behavior.js.map +1 -0
- package/dist/causal-chain.d.ts +61 -0
- package/dist/causal-chain.js +24 -0
- package/dist/causal-chain.js.map +1 -0
- package/dist/causal-consolidation.d.ts +71 -0
- package/dist/causal-consolidation.js +211 -0
- package/dist/causal-consolidation.js.map +1 -0
- package/dist/causal-retrieval.d.ts +44 -0
- package/dist/causal-retrieval.js +184 -0
- package/dist/causal-retrieval.js.map +1 -0
- package/dist/causal-trajectory-graph.d.ts +13 -0
- package/dist/causal-trajectory-graph.js +59 -0
- package/dist/causal-trajectory-graph.js.map +1 -0
- package/dist/causal-trajectory.d.ts +68 -0
- package/dist/causal-trajectory.js +18 -0
- package/dist/causal-trajectory.js.map +1 -0
- package/dist/chunk-2CJCWDMR.js +87 -0
- package/dist/chunk-2CJCWDMR.js.map +1 -0
- package/dist/chunk-2NMMFZ5T.js +216 -0
- package/dist/chunk-2NMMFZ5T.js.map +1 -0
- package/dist/chunk-2PO5ZRKV.js +103 -0
- package/dist/chunk-2PO5ZRKV.js.map +1 -0
- package/dist/chunk-3QKK7QOS.js +154 -0
- package/dist/chunk-3QKK7QOS.js.map +1 -0
- package/dist/chunk-3SLRNYNG.js +26 -0
- package/dist/chunk-3SLRNYNG.js.map +1 -0
- package/dist/chunk-4A24LIM2.js +68 -0
- package/dist/chunk-4A24LIM2.js.map +1 -0
- package/dist/chunk-6HZ6AO2P.js +164 -0
- package/dist/chunk-6HZ6AO2P.js.map +1 -0
- package/dist/chunk-763GUIOU.js +302 -0
- package/dist/chunk-763GUIOU.js.map +1 -0
- package/dist/chunk-AAI7JARD.js +173 -0
- package/dist/chunk-AAI7JARD.js.map +1 -0
- package/dist/chunk-B7LOFDVE.js +112 -0
- package/dist/chunk-B7LOFDVE.js.map +1 -0
- package/dist/chunk-BDFZXRSO.js +318 -0
- package/dist/chunk-BDFZXRSO.js.map +1 -0
- package/dist/chunk-BOUYNNYD.js +707 -0
- package/dist/chunk-BOUYNNYD.js.map +1 -0
- package/dist/chunk-BRK4ODMI.js +60 -0
- package/dist/chunk-BRK4ODMI.js.map +1 -0
- package/dist/chunk-C6QPK5GG.js +111 -0
- package/dist/chunk-C6QPK5GG.js.map +1 -0
- package/dist/chunk-C7VW7C3F.js +117 -0
- package/dist/chunk-C7VW7C3F.js.map +1 -0
- package/dist/chunk-CDW777AI.js +621 -0
- package/dist/chunk-CDW777AI.js.map +1 -0
- package/dist/chunk-CULXMQJH.js +185 -0
- package/dist/chunk-CULXMQJH.js.map +1 -0
- package/dist/chunk-CXWFUJR2.js +1203 -0
- package/dist/chunk-CXWFUJR2.js.map +1 -0
- package/dist/chunk-DGXUHMOV.js +61 -0
- package/dist/chunk-DGXUHMOV.js.map +1 -0
- package/dist/chunk-DM2T26WE.js +61 -0
- package/dist/chunk-DM2T26WE.js.map +1 -0
- package/dist/chunk-DORBM6OB.js +81 -0
- package/dist/chunk-DORBM6OB.js.map +1 -0
- package/dist/chunk-DT5TVLJE.js +32 -0
- package/dist/chunk-DT5TVLJE.js.map +1 -0
- package/dist/chunk-EEQLFRUM.js +89 -0
- package/dist/chunk-EEQLFRUM.js.map +1 -0
- package/dist/chunk-EQINRHYR.js +672 -0
- package/dist/chunk-EQINRHYR.js.map +1 -0
- package/dist/chunk-ESSMF2FR.js +146 -0
- package/dist/chunk-ESSMF2FR.js.map +1 -0
- package/dist/chunk-ETOW6ACV.js +158 -0
- package/dist/chunk-ETOW6ACV.js.map +1 -0
- package/dist/chunk-FYIYMQ5N.js +221 -0
- package/dist/chunk-FYIYMQ5N.js.map +1 -0
- package/dist/chunk-G3AG3KZN.js +78 -0
- package/dist/chunk-G3AG3KZN.js.map +1 -0
- package/dist/chunk-GJR6D6KC.js +61 -0
- package/dist/chunk-GJR6D6KC.js.map +1 -0
- package/dist/chunk-GPGBSNKM.js +380 -0
- package/dist/chunk-GPGBSNKM.js.map +1 -0
- package/dist/chunk-H63EDPFJ.js +57 -0
- package/dist/chunk-H63EDPFJ.js.map +1 -0
- package/dist/chunk-HG2NKWR2.js +185 -0
- package/dist/chunk-HG2NKWR2.js.map +1 -0
- package/dist/chunk-HL4DB7TO.js +13 -0
- package/dist/chunk-HL4DB7TO.js.map +1 -0
- package/dist/chunk-HLBYLYRD.js +346 -0
- package/dist/chunk-HLBYLYRD.js.map +1 -0
- package/dist/chunk-HLXVTBF3.js +109 -0
- package/dist/chunk-HLXVTBF3.js.map +1 -0
- package/dist/chunk-IFFFR3MR.js +68 -0
- package/dist/chunk-IFFFR3MR.js.map +1 -0
- package/dist/chunk-ISY75RLM.js +1027 -0
- package/dist/chunk-ISY75RLM.js.map +1 -0
- package/dist/chunk-IZME7KW2.js +1886 -0
- package/dist/chunk-IZME7KW2.js.map +1 -0
- package/dist/chunk-J3BT33K7.js +720 -0
- package/dist/chunk-J3BT33K7.js.map +1 -0
- package/dist/chunk-J47FNDR7.js +113 -0
- package/dist/chunk-J47FNDR7.js.map +1 -0
- package/dist/chunk-JWPLJLDU.js +63 -0
- package/dist/chunk-JWPLJLDU.js.map +1 -0
- package/dist/chunk-K6WK37A6.js +865 -0
- package/dist/chunk-K6WK37A6.js.map +1 -0
- package/dist/chunk-KL4CP4SB.js +130 -0
- package/dist/chunk-KL4CP4SB.js.map +1 -0
- package/dist/chunk-KT4NEUNF.js +315 -0
- package/dist/chunk-KT4NEUNF.js.map +1 -0
- package/dist/chunk-KWBU5S5U.js +42 -0
- package/dist/chunk-KWBU5S5U.js.map +1 -0
- package/dist/chunk-L5RPWGFK.js +59 -0
- package/dist/chunk-L5RPWGFK.js.map +1 -0
- package/dist/chunk-L7WO3MZ4.js +128 -0
- package/dist/chunk-L7WO3MZ4.js.map +1 -0
- package/dist/chunk-LIRZNNUP.js +74 -0
- package/dist/chunk-LIRZNNUP.js.map +1 -0
- package/dist/chunk-LK6SGL53.js +22 -0
- package/dist/chunk-LK6SGL53.js.map +1 -0
- package/dist/chunk-LOBRX7VD.js +200 -0
- package/dist/chunk-LOBRX7VD.js.map +1 -0
- package/dist/chunk-LPSF4OQH.js +47 -0
- package/dist/chunk-LPSF4OQH.js.map +1 -0
- package/dist/chunk-LU3GQNDQ.js +152 -0
- package/dist/chunk-LU3GQNDQ.js.map +1 -0
- package/dist/chunk-M5KEYE5E.js +350 -0
- package/dist/chunk-M5KEYE5E.js.map +1 -0
- package/dist/chunk-M62O4P4T.js +41 -0
- package/dist/chunk-M62O4P4T.js.map +1 -0
- package/dist/chunk-MARWOCVP.js +48 -0
- package/dist/chunk-MARWOCVP.js.map +1 -0
- package/dist/chunk-MDDAA2AO.js +925 -0
- package/dist/chunk-MDDAA2AO.js.map +1 -0
- package/dist/chunk-MWGVGUIS.js +198 -0
- package/dist/chunk-MWGVGUIS.js.map +1 -0
- package/dist/chunk-N5AKDXAI.js +74 -0
- package/dist/chunk-N5AKDXAI.js.map +1 -0
- package/dist/chunk-NGAVDO7E.js +115 -0
- package/dist/chunk-NGAVDO7E.js.map +1 -0
- package/dist/chunk-NTTLPF7F.js +283 -0
- package/dist/chunk-NTTLPF7F.js.map +1 -0
- package/dist/chunk-ONRU4L2N.js +240 -0
- package/dist/chunk-ONRU4L2N.js.map +1 -0
- package/dist/chunk-ORZMT74A.js +209 -0
- package/dist/chunk-ORZMT74A.js.map +1 -0
- package/dist/chunk-OTAVQCSF.js +268 -0
- package/dist/chunk-OTAVQCSF.js.map +1 -0
- package/dist/chunk-PGK3VUHN.js +160 -0
- package/dist/chunk-PGK3VUHN.js.map +1 -0
- package/dist/chunk-Q6FETXJA.js +1362 -0
- package/dist/chunk-Q6FETXJA.js.map +1 -0
- package/dist/chunk-QANCTXQF.js +271 -0
- package/dist/chunk-QANCTXQF.js.map +1 -0
- package/dist/chunk-QCCCQT3O.js +189 -0
- package/dist/chunk-QCCCQT3O.js.map +1 -0
- package/dist/chunk-QDOSNLB4.js +1048 -0
- package/dist/chunk-QDOSNLB4.js.map +1 -0
- package/dist/chunk-QFQVZOGA.js +2168 -0
- package/dist/chunk-QFQVZOGA.js.map +1 -0
- package/dist/chunk-QPKFPHOO.js +178 -0
- package/dist/chunk-QPKFPHOO.js.map +1 -0
- package/dist/chunk-QSVPYQPG.js +268 -0
- package/dist/chunk-QSVPYQPG.js.map +1 -0
- package/dist/chunk-QWUUMMIK.js +3045 -0
- package/dist/chunk-QWUUMMIK.js.map +1 -0
- package/dist/chunk-QY2BHY5O.js +2378 -0
- package/dist/chunk-QY2BHY5O.js.map +1 -0
- package/dist/chunk-SCHEKPYH.js +349 -0
- package/dist/chunk-SCHEKPYH.js.map +1 -0
- package/dist/chunk-SCU65EZI.js +15 -0
- package/dist/chunk-SCU65EZI.js.map +1 -0
- package/dist/chunk-T4WRIV2C.js +170 -0
- package/dist/chunk-T4WRIV2C.js.map +1 -0
- package/dist/chunk-TKO4HZCK.js +1852 -0
- package/dist/chunk-TKO4HZCK.js.map +1 -0
- package/dist/chunk-TP4FZJIZ.js +93 -0
- package/dist/chunk-TP4FZJIZ.js.map +1 -0
- package/dist/chunk-TPB3I2AC.js +403 -0
- package/dist/chunk-TPB3I2AC.js.map +1 -0
- package/dist/chunk-TVVVQQAK.js +1431 -0
- package/dist/chunk-TVVVQQAK.js.map +1 -0
- package/dist/chunk-U4PV25RD.js +14 -0
- package/dist/chunk-U4PV25RD.js.map +1 -0
- package/dist/chunk-UCYSTFZR.js +284 -0
- package/dist/chunk-UCYSTFZR.js.map +1 -0
- package/dist/chunk-UHGBNIOS.js +205 -0
- package/dist/chunk-UHGBNIOS.js.map +1 -0
- package/dist/chunk-UIYZ5T3I.js +108 -0
- package/dist/chunk-UIYZ5T3I.js.map +1 -0
- package/dist/chunk-UV2FO7J4.js +747 -0
- package/dist/chunk-UV2FO7J4.js.map +1 -0
- package/dist/chunk-UZB5KHKX.js +63 -0
- package/dist/chunk-UZB5KHKX.js.map +1 -0
- package/dist/chunk-V3RXWQIE.js +626 -0
- package/dist/chunk-V3RXWQIE.js.map +1 -0
- package/dist/chunk-V4YC4LUK.js +444 -0
- package/dist/chunk-V4YC4LUK.js.map +1 -0
- package/dist/chunk-VEWZZM3H.js +133 -0
- package/dist/chunk-VEWZZM3H.js.map +1 -0
- package/dist/chunk-WWIQTB2Y.js +98 -0
- package/dist/chunk-WWIQTB2Y.js.map +1 -0
- package/dist/chunk-X7XN6YU4.js +24 -0
- package/dist/chunk-X7XN6YU4.js.map +1 -0
- package/dist/chunk-XKECPATV.js +202 -0
- package/dist/chunk-XKECPATV.js.map +1 -0
- package/dist/chunk-XYIK4LF6.js +75 -0
- package/dist/chunk-XYIK4LF6.js.map +1 -0
- package/dist/chunk-Y27UJK6V.js +39 -0
- package/dist/chunk-Y27UJK6V.js.map +1 -0
- package/dist/chunk-Y4Z4I6WK.js +9 -0
- package/dist/chunk-Y4Z4I6WK.js.map +1 -0
- package/dist/chunk-YAPUAHAY.js +10761 -0
- package/dist/chunk-YAPUAHAY.js.map +1 -0
- package/dist/chunk-YAZNBMNF.js +92 -0
- package/dist/chunk-YAZNBMNF.js.map +1 -0
- package/dist/chunk-YCN4BVDK.js +66 -0
- package/dist/chunk-YCN4BVDK.js.map +1 -0
- package/dist/chunk-YNCQ7E4M.js +388 -0
- package/dist/chunk-YNCQ7E4M.js.map +1 -0
- package/dist/chunk-YNI4S5WT.js +143 -0
- package/dist/chunk-YNI4S5WT.js.map +1 -0
- package/dist/chunk-YRMVARQP.js +406 -0
- package/dist/chunk-YRMVARQP.js.map +1 -0
- package/dist/chunk-Z5AAYHUC.js +79 -0
- package/dist/chunk-Z5AAYHUC.js.map +1 -0
- package/dist/chunk-Z5LAYHGJ.js +15 -0
- package/dist/chunk-Z5LAYHGJ.js.map +1 -0
- package/dist/chunk-ZJLY4QSU.js +823 -0
- package/dist/chunk-ZJLY4QSU.js.map +1 -0
- package/dist/chunk-ZKYI7UVO.js +276 -0
- package/dist/chunk-ZKYI7UVO.js.map +1 -0
- package/dist/chunk-ZPKBYX2F.js +297 -0
- package/dist/chunk-ZPKBYX2F.js.map +1 -0
- package/dist/chunking.d.ts +48 -0
- package/dist/chunking.js +11 -0
- package/dist/chunking.js.map +1 -0
- package/dist/cli.d.ts +1162 -0
- package/dist/cli.js +7187 -0
- package/dist/cli.js.map +1 -0
- package/dist/commitment-ledger.d.ts +83 -0
- package/dist/commitment-ledger.js +19 -0
- package/dist/commitment-ledger.js.map +1 -0
- package/dist/compression-optimizer.d.ts +37 -0
- package/dist/compression-optimizer.js +13 -0
- package/dist/compression-optimizer.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.js +12 -0
- package/dist/config.js.map +1 -0
- package/dist/cue-anchors.d.ts +50 -0
- package/dist/cue-anchors.js +15 -0
- package/dist/cue-anchors.js.map +1 -0
- package/dist/dashboard-runtime.d.ts +46 -0
- package/dist/dashboard-runtime.js +10 -0
- package/dist/dashboard-runtime.js.map +1 -0
- package/dist/day-summary.d.ts +6 -0
- package/dist/day-summary.js +10 -0
- package/dist/day-summary.js.map +1 -0
- package/dist/delinearize.d.ts +34 -0
- package/dist/delinearize.js +11 -0
- package/dist/delinearize.js.map +1 -0
- package/dist/embedding-fallback.d.ts +22 -0
- package/dist/embedding-fallback.js +8 -0
- package/dist/embedding-fallback.js.map +1 -0
- package/dist/engine-P26JFSVY.js +19 -0
- package/dist/engine-P26JFSVY.js.map +1 -0
- package/dist/entity-retrieval.d.ts +23 -0
- package/dist/entity-retrieval.js +24 -0
- package/dist/entity-retrieval.js.map +1 -0
- package/dist/evals.d.ts +282 -0
- package/dist/evals.js +32 -0
- package/dist/evals.js.map +1 -0
- package/dist/explicit-capture.d.ts +60 -0
- package/dist/explicit-capture.js +23 -0
- package/dist/explicit-capture.js.map +1 -0
- package/dist/extraction.d.ts +141 -0
- package/dist/extraction.js +22 -0
- package/dist/extraction.js.map +1 -0
- package/dist/fallback-llm.d.ts +95 -0
- package/dist/fallback-llm.js +12 -0
- package/dist/fallback-llm.js.map +1 -0
- package/dist/graph-dashboard-diff.d.ts +12 -0
- package/dist/graph-dashboard-diff.js +8 -0
- package/dist/graph-dashboard-diff.js.map +1 -0
- package/dist/graph-dashboard-key.d.ts +5 -0
- package/dist/graph-dashboard-key.js +7 -0
- package/dist/graph-dashboard-key.js.map +1 -0
- package/dist/graph-dashboard-parser.d.ts +20 -0
- package/dist/graph-dashboard-parser.js +8 -0
- package/dist/graph-dashboard-parser.js.map +1 -0
- package/dist/graph.d.ts +157 -0
- package/dist/graph.js +27 -0
- package/dist/graph.js.map +1 -0
- package/dist/harmonic-retrieval.d.ts +27 -0
- package/dist/harmonic-retrieval.js +12 -0
- package/dist/harmonic-retrieval.js.map +1 -0
- package/dist/himem.d.ts +23 -0
- package/dist/himem.js +7 -0
- package/dist/himem.js.map +1 -0
- package/dist/hygiene.d.ts +24 -0
- package/dist/hygiene.js +9 -0
- package/dist/hygiene.js.map +1 -0
- package/dist/identity-continuity.d.ts +17 -0
- package/dist/identity-continuity.js +19 -0
- package/dist/identity-continuity.js.map +1 -0
- package/dist/importance.d.ts +25 -0
- package/dist/importance.js +11 -0
- package/dist/importance.js.map +1 -0
- package/dist/index.d.ts +923 -0
- package/dist/index.js +2512 -0
- package/dist/index.js.map +1 -0
- package/dist/intent.d.ts +8 -0
- package/dist/intent.js +13 -0
- package/dist/intent.js.map +1 -0
- package/dist/json-extract.d.ts +14 -0
- package/dist/json-extract.js +9 -0
- package/dist/json-extract.js.map +1 -0
- package/dist/json-store.d.ts +5 -0
- package/dist/json-store.js +11 -0
- package/dist/json-store.js.map +1 -0
- package/dist/legacy-hook-compat.d.ts +3 -0
- package/dist/legacy-hook-compat.js +35 -0
- package/dist/legacy-hook-compat.js.map +1 -0
- package/dist/lifecycle.d.ts +52 -0
- package/dist/lifecycle.js +21 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/local-llm.d.ts +154 -0
- package/dist/local-llm.js +10 -0
- package/dist/local-llm.js.map +1 -0
- package/dist/logger.d.ts +15 -0
- package/dist/logger.js +9 -0
- package/dist/logger.js.map +1 -0
- package/dist/memory-action-policy.d.ts +13 -0
- package/dist/memory-action-policy.js +7 -0
- package/dist/memory-action-policy.js.map +1 -0
- package/dist/memory-cache.d.ts +35 -0
- package/dist/memory-cache.js +37 -0
- package/dist/memory-cache.js.map +1 -0
- package/dist/memory-lifecycle-ledger-utils.d.ts +13 -0
- package/dist/memory-lifecycle-ledger-utils.js +23 -0
- package/dist/memory-lifecycle-ledger-utils.js.map +1 -0
- package/dist/memory-projection-format.d.ts +4 -0
- package/dist/memory-projection-format.js +9 -0
- package/dist/memory-projection-format.js.map +1 -0
- package/dist/memory-projection-store-NxMkbocT.d.ts +221 -0
- package/dist/memory-projection-store.d.ts +3 -0
- package/dist/memory-projection-store.js +31 -0
- package/dist/memory-projection-store.js.map +1 -0
- package/dist/model-registry.d.ts +60 -0
- package/dist/model-registry.js +8 -0
- package/dist/model-registry.js.map +1 -0
- package/dist/native-knowledge.d.ts +94 -0
- package/dist/native-knowledge.js +26 -0
- package/dist/native-knowledge.js.map +1 -0
- package/dist/negative.d.ts +26 -0
- package/dist/negative.js +8 -0
- package/dist/negative.js.map +1 -0
- package/dist/objective-state-writers.d.ts +22 -0
- package/dist/objective-state-writers.js +313 -0
- package/dist/objective-state-writers.js.map +1 -0
- package/dist/objective-state.d.ts +75 -0
- package/dist/objective-state.js +17 -0
- package/dist/objective-state.js.map +1 -0
- package/dist/openai-chat-compat.d.ts +13 -0
- package/dist/openai-chat-compat.js +11 -0
- package/dist/openai-chat-compat.js.map +1 -0
- package/dist/operator-toolkit.d.ts +304 -0
- package/dist/operator-toolkit.js +41 -0
- package/dist/operator-toolkit.js.map +1 -0
- package/dist/opik-exporter.d.ts +72 -0
- package/dist/opik-exporter.js +361 -0
- package/dist/opik-exporter.js.map +1 -0
- package/dist/orchestrator-zTa-Qo-1.d.ts +1104 -0
- package/dist/orchestrator.d.ts +21 -0
- package/dist/orchestrator.js +145 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/policy-runtime.d.ts +37 -0
- package/dist/policy-runtime.js +13 -0
- package/dist/policy-runtime.js.map +1 -0
- package/dist/port-C1GZFv8h.d.ts +41 -0
- package/dist/profiling.d.ts +80 -0
- package/dist/profiling.js +10 -0
- package/dist/profiling.js.map +1 -0
- package/dist/qmd-recall-cache.d.ts +29 -0
- package/dist/qmd-recall-cache.js +13 -0
- package/dist/qmd-recall-cache.js.map +1 -0
- package/dist/qmd.d.ts +105 -0
- package/dist/qmd.js +13 -0
- package/dist/qmd.js.map +1 -0
- package/dist/recall-qos.d.ts +33 -0
- package/dist/recall-qos.js +10 -0
- package/dist/recall-qos.js.map +1 -0
- package/dist/recall-query-policy.d.ts +20 -0
- package/dist/recall-query-policy.js +11 -0
- package/dist/recall-query-policy.js.map +1 -0
- package/dist/recall-state.d.ts +113 -0
- package/dist/recall-state.js +12 -0
- package/dist/recall-state.js.map +1 -0
- package/dist/recall-tokenization.d.ts +4 -0
- package/dist/recall-tokenization.js +9 -0
- package/dist/recall-tokenization.js.map +1 -0
- package/dist/reconstruct.d.ts +16 -0
- package/dist/reconstruct.js +7 -0
- package/dist/reconstruct.js.map +1 -0
- package/dist/release-changelog.d.ts +7 -0
- package/dist/release-changelog.js +30 -0
- package/dist/release-changelog.js.map +1 -0
- package/dist/relevance.d.ts +18 -0
- package/dist/relevance.js +8 -0
- package/dist/relevance.js.map +1 -0
- package/dist/rerank.d.ts +57 -0
- package/dist/rerank.js +11 -0
- package/dist/rerank.js.map +1 -0
- package/dist/resolve-provider-secret.d.ts +16 -0
- package/dist/resolve-provider-secret.js +11 -0
- package/dist/resolve-provider-secret.js.map +1 -0
- package/dist/resume-bundles.d.ts +66 -0
- package/dist/resume-bundles.js +27 -0
- package/dist/resume-bundles.js.map +1 -0
- package/dist/retrieval-agents.d.ts +129 -0
- package/dist/retrieval-agents.js +23 -0
- package/dist/retrieval-agents.js.map +1 -0
- package/dist/retrieval.d.ts +19 -0
- package/dist/retrieval.js +10 -0
- package/dist/retrieval.js.map +1 -0
- package/dist/sanitize.d.ts +9 -0
- package/dist/sanitize.js +9 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/schemas.d.ts +688 -0
- package/dist/schemas.js +51 -0
- package/dist/schemas.js.map +1 -0
- package/dist/sdk-compat.d.ts +21 -0
- package/dist/sdk-compat.js +28 -0
- package/dist/sdk-compat.js.map +1 -0
- package/dist/semantic-consolidation.d.ts +42 -0
- package/dist/semantic-consolidation.js +12 -0
- package/dist/semantic-consolidation.js.map +1 -0
- package/dist/semantic-rule-promotion.d.ts +28 -0
- package/dist/semantic-rule-promotion.js +17 -0
- package/dist/semantic-rule-promotion.js.map +1 -0
- package/dist/semantic-rule-verifier.d.ts +19 -0
- package/dist/semantic-rule-verifier.js +18 -0
- package/dist/semantic-rule-verifier.js.map +1 -0
- package/dist/session-integrity.d.ts +67 -0
- package/dist/session-integrity.js +11 -0
- package/dist/session-integrity.js.map +1 -0
- package/dist/session-observer-bands.d.ts +6 -0
- package/dist/session-observer-bands.js +9 -0
- package/dist/session-observer-bands.js.map +1 -0
- package/dist/session-observer-state.d.ts +40 -0
- package/dist/session-observer-state.js +11 -0
- package/dist/session-observer-state.js.map +1 -0
- package/dist/signal.d.ts +6 -0
- package/dist/signal.js +9 -0
- package/dist/signal.js.map +1 -0
- package/dist/storage.d.ts +453 -0
- package/dist/storage.js +24 -0
- package/dist/storage.js.map +1 -0
- package/dist/store-contract.d.ts +10 -0
- package/dist/store-contract.js +21 -0
- package/dist/store-contract.js.map +1 -0
- package/dist/summarizer.d.ts +35 -0
- package/dist/summarizer.js +17 -0
- package/dist/summarizer.js.map +1 -0
- package/dist/summary-snapshot.d.ts +8 -0
- package/dist/summary-snapshot.js +13 -0
- package/dist/summary-snapshot.js.map +1 -0
- package/dist/temporal-index.d.ts +139 -0
- package/dist/temporal-index.js +29 -0
- package/dist/temporal-index.js.map +1 -0
- package/dist/threading.d.ts +62 -0
- package/dist/threading.js +8 -0
- package/dist/threading.js.map +1 -0
- package/dist/tier-migration.d.ts +44 -0
- package/dist/tier-migration.js +7 -0
- package/dist/tier-migration.js.map +1 -0
- package/dist/tier-routing.d.ts +21 -0
- package/dist/tier-routing.js +10 -0
- package/dist/tier-routing.js.map +1 -0
- package/dist/tmt.d.ts +79 -0
- package/dist/tmt.js +29 -0
- package/dist/tmt.js.map +1 -0
- package/dist/tokens.d.ts +24 -0
- package/dist/tokens.js +21 -0
- package/dist/tokens.js.map +1 -0
- package/dist/topics.d.ts +29 -0
- package/dist/topics.js +9 -0
- package/dist/topics.js.map +1 -0
- package/dist/transcript.d.ts +171 -0
- package/dist/transcript.js +9 -0
- package/dist/transcript.js.map +1 -0
- package/dist/trust-zones.d.ts +170 -0
- package/dist/trust-zones.js +32 -0
- package/dist/trust-zones.js.map +1 -0
- package/dist/types.d.ts +1243 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/utility-learner.d.ts +59 -0
- package/dist/utility-learner.js +17 -0
- package/dist/utility-learner.js.map +1 -0
- package/dist/utility-runtime.d.ts +21 -0
- package/dist/utility-runtime.js +16 -0
- package/dist/utility-runtime.js.map +1 -0
- package/dist/utility-telemetry.d.ts +68 -0
- package/dist/utility-telemetry.js +17 -0
- package/dist/utility-telemetry.js.map +1 -0
- package/dist/verified-recall.d.ts +17 -0
- package/dist/verified-recall.js +19 -0
- package/dist/verified-recall.js.map +1 -0
- package/dist/version-utils.d.ts +4 -0
- package/dist/version-utils.js +7 -0
- package/dist/version-utils.js.map +1 -0
- package/dist/work-product-ledger.d.ts +65 -0
- package/dist/work-product-ledger.js +18 -0
- package/dist/work-product-ledger.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// src/himem.ts
|
|
2
|
+
var NOTE_SIGNALS = [
|
|
3
|
+
/\bprefer(?:red|s|ring)?\b/i,
|
|
4
|
+
/\bwant(?:ed|s|ing)?\b/i,
|
|
5
|
+
/\bneed(?:ed|s|ing)?\b/i,
|
|
6
|
+
/\balways\b/i,
|
|
7
|
+
/\bnever\b/i,
|
|
8
|
+
/\bmust\b/i,
|
|
9
|
+
/\bshould\b/i,
|
|
10
|
+
/\bgoals?\b/i,
|
|
11
|
+
/\bdecid(?:ed|es|e|ing)\b/i,
|
|
12
|
+
/\bpolic(?:y|ies)\b/i,
|
|
13
|
+
/\brequir(?:ed|es?|ements?|ing)\b/i,
|
|
14
|
+
/\bconstraints?\b/i,
|
|
15
|
+
/\bstandards?\b/i,
|
|
16
|
+
/\bconventions?\b/i
|
|
17
|
+
];
|
|
18
|
+
var TEMPORAL_SIGNALS = [
|
|
19
|
+
/\byesterday\b/i,
|
|
20
|
+
/\btoday\b/i,
|
|
21
|
+
/\blast\s+(?:week|month|year|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\b/i,
|
|
22
|
+
/\bon\s+(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\b/i,
|
|
23
|
+
/\b(?:recently|earlier|this morning|this afternoon)\b/i
|
|
24
|
+
];
|
|
25
|
+
var VERB_EPISODE_SIGNALS = [
|
|
26
|
+
/\bdeployed\b/i,
|
|
27
|
+
/\bpushed\b/i,
|
|
28
|
+
/\bfixed\b/i,
|
|
29
|
+
/\bmerged\b/i,
|
|
30
|
+
/\breported\b/i,
|
|
31
|
+
/\bmentioned\b/i,
|
|
32
|
+
/\bsaid\b/i,
|
|
33
|
+
/\bhappened\b/i,
|
|
34
|
+
/\bfailed\b/i,
|
|
35
|
+
/\bcompleted\b/i,
|
|
36
|
+
/\bshipped\b/i
|
|
37
|
+
];
|
|
38
|
+
var NOTE_CATEGORIES = /* @__PURE__ */ new Set([
|
|
39
|
+
"preference",
|
|
40
|
+
"constraint",
|
|
41
|
+
"goal",
|
|
42
|
+
"habit",
|
|
43
|
+
"policy",
|
|
44
|
+
"standard",
|
|
45
|
+
"belief",
|
|
46
|
+
"decision",
|
|
47
|
+
"principle",
|
|
48
|
+
// durable operating rules emitted by extraction
|
|
49
|
+
"commitment",
|
|
50
|
+
// deadlines/promises — stable obligations
|
|
51
|
+
"relationship",
|
|
52
|
+
// durable facts about people/entities
|
|
53
|
+
"skill",
|
|
54
|
+
// capabilities — stable knowledge
|
|
55
|
+
"correction",
|
|
56
|
+
// user corrections — durable override of prior belief
|
|
57
|
+
"entity"
|
|
58
|
+
// stable facts about people, projects, tools, etc.
|
|
59
|
+
]);
|
|
60
|
+
var EPISODE_CATEGORIES = /* @__PURE__ */ new Set(["event", "action", "observation", "issue", "bug", "incident", "moment"]);
|
|
61
|
+
var NOTE_TAGS = /* @__PURE__ */ new Set(["preference", "constraint", "goal", "habit", "policy", "belief"]);
|
|
62
|
+
var EPISODE_TAGS = /* @__PURE__ */ new Set(["bug", "fix", "deploy", "incident", "release", "merge", "event"]);
|
|
63
|
+
function classifyMemoryKind(content, tags, category) {
|
|
64
|
+
const lowerContent = content.toLowerCase();
|
|
65
|
+
const lowerCategory = category.toLowerCase();
|
|
66
|
+
for (const re of TEMPORAL_SIGNALS) {
|
|
67
|
+
if (re.test(lowerContent)) return "episode";
|
|
68
|
+
}
|
|
69
|
+
if (NOTE_CATEGORIES.has(lowerCategory)) return "note";
|
|
70
|
+
if (EPISODE_CATEGORIES.has(lowerCategory)) return "episode";
|
|
71
|
+
let tagMatchesNote = false;
|
|
72
|
+
let tagMatchesEpisode = false;
|
|
73
|
+
for (const tag of tags) {
|
|
74
|
+
const lowerTag = tag.toLowerCase();
|
|
75
|
+
if (NOTE_TAGS.has(lowerTag)) tagMatchesNote = true;
|
|
76
|
+
if (EPISODE_TAGS.has(lowerTag)) tagMatchesEpisode = true;
|
|
77
|
+
}
|
|
78
|
+
if (tagMatchesNote) return "note";
|
|
79
|
+
if (tagMatchesEpisode) return "episode";
|
|
80
|
+
for (const re of VERB_EPISODE_SIGNALS) {
|
|
81
|
+
if (re.test(lowerContent)) return "episode";
|
|
82
|
+
}
|
|
83
|
+
for (const re of NOTE_SIGNALS) {
|
|
84
|
+
if (re.test(lowerContent)) return "note";
|
|
85
|
+
}
|
|
86
|
+
return "episode";
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export {
|
|
90
|
+
classifyMemoryKind
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=chunk-YAZNBMNF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/himem.ts"],"sourcesContent":["/**\n * HiMem — Episode/Note dual store (v8.0 Phase 2B)\n *\n * Classifies extracted memories as:\n * episode — time-specific events, actions, observations (event fidelity)\n * note — stable beliefs, preferences, decisions, constraints\n *\n * Based on the HiMem paper: episodes are ephemeral, notes are reconsolidated\n * into a stable belief layer. This classification gates reconsolidation.\n */\n\nexport type MemoryKind = \"episode\" | \"note\";\n\n/**\n * Keywords that signal a stable belief/preference/constraint.\n * Includes present and past tense to catch extraction phrasing like\n * \"user preferred X\" or \"team needed Y\".\n */\nconst NOTE_SIGNALS = [\n /\\bprefer(?:red|s|ring)?\\b/i,\n /\\bwant(?:ed|s|ing)?\\b/i,\n /\\bneed(?:ed|s|ing)?\\b/i,\n /\\balways\\b/i,\n /\\bnever\\b/i,\n /\\bmust\\b/i,\n /\\bshould\\b/i,\n /\\bgoals?\\b/i,\n /\\bdecid(?:ed|es|e|ing)\\b/i,\n /\\bpolic(?:y|ies)\\b/i,\n /\\brequir(?:ed|es?|ements?|ing)\\b/i,\n /\\bconstraints?\\b/i,\n /\\bstandards?\\b/i,\n /\\bconventions?\\b/i,\n];\n\n/**\n * Unambiguous date/time markers — checked at step 1 (highest priority) before\n * category overrides. Only include signals that cannot appear in stable-belief\n * sentences (e.g. \"today I prefer…\" is contrived; \"yesterday\" in a preference\n * is almost always a past event).\n *\n * Note: \"just\" excluded — it too often means \"merely/only\".\n */\nconst TEMPORAL_SIGNALS = [\n /\\byesterday\\b/i,\n /\\btoday\\b/i,\n /\\blast\\s+(?:week|month|year|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\\b/i,\n /\\bon\\s+(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\\b/i,\n /\\b(?:recently|earlier|this morning|this afternoon)\\b/i,\n];\n\n/**\n * Past-tense action verbs that suggest an episodic memory.\n * Checked AFTER category overrides (step 3.5) to avoid misclassifying\n * stable-knowledge sentences like \"User mentioned they always prefer X\"\n * where category=\"preference\" should win over the verb \"mentioned\".\n */\nconst VERB_EPISODE_SIGNALS = [\n /\\bdeployed\\b/i,\n /\\bpushed\\b/i,\n /\\bfixed\\b/i,\n /\\bmerged\\b/i,\n /\\breported\\b/i,\n /\\bmentioned\\b/i,\n /\\bsaid\\b/i,\n /\\bhappened\\b/i,\n /\\bfailed\\b/i,\n /\\bcompleted\\b/i,\n /\\bshipped\\b/i,\n];\n\n/** Category names that strongly suggest a note (stable belief) */\nconst NOTE_CATEGORIES = new Set([\n \"preference\",\n \"constraint\",\n \"goal\",\n \"habit\",\n \"policy\",\n \"standard\",\n \"belief\",\n \"decision\",\n \"principle\", // durable operating rules emitted by extraction\n \"commitment\", // deadlines/promises — stable obligations\n \"relationship\", // durable facts about people/entities\n \"skill\", // capabilities — stable knowledge\n \"correction\", // user corrections — durable override of prior belief\n \"entity\", // stable facts about people, projects, tools, etc.\n]);\n\n/** Category names that strongly suggest an episode */\nconst EPISODE_CATEGORIES = new Set([\"event\", \"action\", \"observation\", \"issue\", \"bug\", \"incident\", \"moment\"]);\n\n/** Tag values that signal a stable belief */\nconst NOTE_TAGS = new Set([\"preference\", \"constraint\", \"goal\", \"habit\", \"policy\", \"belief\"]);\n\n/** Tag values that signal a time-specific event */\nconst EPISODE_TAGS = new Set([\"bug\", \"fix\", \"deploy\", \"incident\", \"release\", \"merge\", \"event\"]);\n\n/**\n * Classify a memory fact as \"episode\" (time-specific event) or \"note\"\n * (stable belief/preference/decision).\n *\n * @param content - The memory's text content\n * @param tags - Tags from extraction (checked for episode/note signals)\n * @param category - Category from extraction\n * @returns \"episode\" | \"note\"\n */\nexport function classifyMemoryKind(\n content: string,\n tags: string[],\n category: string,\n): MemoryKind {\n const lowerContent = content.toLowerCase();\n const lowerCategory = category.toLowerCase();\n\n // 1. True temporal markers — unambiguous date/time references override everything.\n // These are safe at highest priority because genuine date/time phrases cannot\n // appear in a stable-belief sentence without making it episodic.\n for (const re of TEMPORAL_SIGNALS) {\n if (re.test(lowerContent)) return \"episode\";\n }\n\n // 2. Category-level override — strong semantic signal from extraction\n if (NOTE_CATEGORIES.has(lowerCategory)) return \"note\";\n if (EPISODE_CATEGORIES.has(lowerCategory)) return \"episode\";\n\n // 3. Tag-level signals — lower priority than category; note tags win over episode tags\n // to avoid non-deterministic results when tag order varies across LLM runs.\n let tagMatchesNote = false;\n let tagMatchesEpisode = false;\n for (const tag of tags) {\n const lowerTag = tag.toLowerCase();\n if (NOTE_TAGS.has(lowerTag)) tagMatchesNote = true;\n if (EPISODE_TAGS.has(lowerTag)) tagMatchesEpisode = true;\n }\n if (tagMatchesNote) return \"note\";\n if (tagMatchesEpisode) return \"episode\";\n\n // 3.5. Verb-based episode signals — run after category so that stable categories\n // (preference, principle, etc.) are not overridden by common narrative verbs\n // like \"mentioned\" or \"said\" (e.g. \"User mentioned they always prefer X\").\n for (const re of VERB_EPISODE_SIGNALS) {\n if (re.test(lowerContent)) return \"episode\";\n }\n\n // 4. Non-temporal note signals in content\n for (const re of NOTE_SIGNALS) {\n if (re.test(lowerContent)) return \"note\";\n }\n\n // 5. Default: episode (preserves fidelity, safer to not promote to stable note)\n return \"episode\";\n}\n\n"],"mappings":";AAkBA,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUA,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQA,IAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF,CAAC;AAGD,IAAM,qBAAqB,oBAAI,IAAI,CAAC,SAAS,UAAU,eAAe,SAAS,OAAO,YAAY,QAAQ,CAAC;AAG3G,IAAM,YAAY,oBAAI,IAAI,CAAC,cAAc,cAAc,QAAQ,SAAS,UAAU,QAAQ,CAAC;AAG3F,IAAM,eAAe,oBAAI,IAAI,CAAC,OAAO,OAAO,UAAU,YAAY,WAAW,SAAS,OAAO,CAAC;AAWvF,SAAS,mBACd,SACA,MACA,UACY;AACZ,QAAM,eAAe,QAAQ,YAAY;AACzC,QAAM,gBAAgB,SAAS,YAAY;AAK3C,aAAW,MAAM,kBAAkB;AACjC,QAAI,GAAG,KAAK,YAAY,EAAG,QAAO;AAAA,EACpC;AAGA,MAAI,gBAAgB,IAAI,aAAa,EAAG,QAAO;AAC/C,MAAI,mBAAmB,IAAI,aAAa,EAAG,QAAO;AAIlD,MAAI,iBAAiB;AACrB,MAAI,oBAAoB;AACxB,aAAW,OAAO,MAAM;AACtB,UAAM,WAAW,IAAI,YAAY;AACjC,QAAI,UAAU,IAAI,QAAQ,EAAG,kBAAiB;AAC9C,QAAI,aAAa,IAAI,QAAQ,EAAG,qBAAoB;AAAA,EACtD;AACA,MAAI,eAAgB,QAAO;AAC3B,MAAI,kBAAmB,QAAO;AAK9B,aAAW,MAAM,sBAAsB;AACrC,QAAI,GAAG,KAAK,YAAY,EAAG,QAAO;AAAA,EACpC;AAGA,aAAW,MAAM,cAAc;AAC7B,QAAI,GAAG,KAAK,YAAY,EAAG,QAAO;AAAA,EACpC;AAGA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// src/qmd-recall-cache.ts
|
|
2
|
+
var qmdRecallCache = /* @__PURE__ */ new Map();
|
|
3
|
+
function cloneCacheValue(value) {
|
|
4
|
+
return structuredClone(value);
|
|
5
|
+
}
|
|
6
|
+
function normalizeQuery(query) {
|
|
7
|
+
return query.trim().toLowerCase().replace(/\s+/g, " ");
|
|
8
|
+
}
|
|
9
|
+
function normalizePathScope(pathValue) {
|
|
10
|
+
if (typeof pathValue !== "string") return "";
|
|
11
|
+
return pathValue.trim().replace(/\\/g, "/");
|
|
12
|
+
}
|
|
13
|
+
function normalizeSearchOptions(options) {
|
|
14
|
+
if (!options) return {};
|
|
15
|
+
return Object.fromEntries(
|
|
16
|
+
Object.entries(options).filter(([, value]) => value !== void 0).sort(([left], [right]) => left.localeCompare(right))
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
function buildQmdRecallCacheKey(options) {
|
|
20
|
+
return JSON.stringify({
|
|
21
|
+
query: normalizeQuery(options.query),
|
|
22
|
+
namespaces: [...options.namespaces].sort(),
|
|
23
|
+
recallMode: options.recallMode,
|
|
24
|
+
maxResults: options.maxResults,
|
|
25
|
+
memoryDir: normalizePathScope(options.memoryDir),
|
|
26
|
+
collection: options.collection ?? "",
|
|
27
|
+
searchOptions: normalizeSearchOptions(options.searchOptions)
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function getCachedQmdRecall(cacheKey, options) {
|
|
31
|
+
const entry = qmdRecallCache.get(cacheKey);
|
|
32
|
+
if (!entry) return null;
|
|
33
|
+
const ageMs = Date.now() - entry.cachedAtMs;
|
|
34
|
+
if (ageMs <= options.freshTtlMs) {
|
|
35
|
+
return { value: cloneCacheValue(entry.value), source: "fresh", ageMs };
|
|
36
|
+
}
|
|
37
|
+
if (ageMs <= options.staleTtlMs) {
|
|
38
|
+
return { value: cloneCacheValue(entry.value), source: "stale", ageMs };
|
|
39
|
+
}
|
|
40
|
+
qmdRecallCache.delete(cacheKey);
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
function setCachedQmdRecall(cacheKey, value, options) {
|
|
44
|
+
qmdRecallCache.delete(cacheKey);
|
|
45
|
+
if (options.maxEntries <= 0) return;
|
|
46
|
+
qmdRecallCache.set(cacheKey, {
|
|
47
|
+
value: cloneCacheValue(value),
|
|
48
|
+
cachedAtMs: Date.now()
|
|
49
|
+
});
|
|
50
|
+
while (qmdRecallCache.size > options.maxEntries) {
|
|
51
|
+
const oldestKey = qmdRecallCache.keys().next().value;
|
|
52
|
+
if (typeof oldestKey !== "string") break;
|
|
53
|
+
qmdRecallCache.delete(oldestKey);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function clearQmdRecallCache() {
|
|
57
|
+
qmdRecallCache.clear();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export {
|
|
61
|
+
buildQmdRecallCacheKey,
|
|
62
|
+
getCachedQmdRecall,
|
|
63
|
+
setCachedQmdRecall,
|
|
64
|
+
clearQmdRecallCache
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=chunk-YCN4BVDK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/qmd-recall-cache.ts"],"sourcesContent":["import type { RecallPlanMode } from \"./types.js\";\nimport type { SearchQueryOptions } from \"./search/port.js\";\n\ntype QmdRecallCacheEntry = {\n value: unknown;\n cachedAtMs: number;\n};\n\nexport type QmdRecallCacheSource = \"fresh\" | \"stale\";\n\nexport interface QmdRecallCacheHit<T> {\n value: T;\n source: QmdRecallCacheSource;\n ageMs: number;\n}\n\nexport interface QmdRecallCacheKeyOptions {\n query: string;\n namespaces: string[];\n recallMode: RecallPlanMode;\n maxResults: number;\n memoryDir?: string;\n collection?: string;\n searchOptions?: SearchQueryOptions;\n}\n\nconst qmdRecallCache = new Map<string, QmdRecallCacheEntry>();\n\nfunction cloneCacheValue<T>(value: T): T {\n return structuredClone(value);\n}\n\nfunction normalizeQuery(query: string): string {\n return query.trim().toLowerCase().replace(/\\s+/g, \" \");\n}\n\nfunction normalizePathScope(pathValue: string | undefined): string {\n if (typeof pathValue !== \"string\") return \"\";\n return pathValue.trim().replace(/\\\\/g, \"/\");\n}\n\nfunction normalizeSearchOptions(\n options: SearchQueryOptions | undefined,\n): Record<string, unknown> {\n if (!options) return {};\n return Object.fromEntries(\n Object.entries(options)\n .filter(([, value]) => value !== undefined)\n .sort(([left], [right]) => left.localeCompare(right)),\n );\n}\n\nexport function buildQmdRecallCacheKey(\n options: QmdRecallCacheKeyOptions,\n): string {\n return JSON.stringify({\n query: normalizeQuery(options.query),\n namespaces: [...options.namespaces].sort(),\n recallMode: options.recallMode,\n maxResults: options.maxResults,\n memoryDir: normalizePathScope(options.memoryDir),\n collection: options.collection ?? \"\",\n searchOptions: normalizeSearchOptions(options.searchOptions),\n });\n}\n\nexport function getCachedQmdRecall<T>(\n cacheKey: string,\n options: {\n freshTtlMs: number;\n staleTtlMs: number;\n },\n): QmdRecallCacheHit<T> | null {\n const entry = qmdRecallCache.get(cacheKey);\n if (!entry) return null;\n\n const ageMs = Date.now() - entry.cachedAtMs;\n if (ageMs <= options.freshTtlMs) {\n return { value: cloneCacheValue(entry.value as T), source: \"fresh\", ageMs };\n }\n if (ageMs <= options.staleTtlMs) {\n return { value: cloneCacheValue(entry.value as T), source: \"stale\", ageMs };\n }\n\n qmdRecallCache.delete(cacheKey);\n return null;\n}\n\nexport function setCachedQmdRecall<T>(\n cacheKey: string,\n value: T,\n options: { maxEntries: number },\n): void {\n qmdRecallCache.delete(cacheKey);\n if (options.maxEntries <= 0) return;\n\n qmdRecallCache.set(cacheKey, {\n value: cloneCacheValue(value),\n cachedAtMs: Date.now(),\n });\n\n while (qmdRecallCache.size > options.maxEntries) {\n const oldestKey = qmdRecallCache.keys().next().value;\n if (typeof oldestKey !== \"string\") break;\n qmdRecallCache.delete(oldestKey);\n }\n}\n\nexport function clearQmdRecallCache(): void {\n qmdRecallCache.clear();\n}\n"],"mappings":";AA0BA,IAAM,iBAAiB,oBAAI,IAAiC;AAE5D,SAAS,gBAAmB,OAAa;AACvC,SAAO,gBAAgB,KAAK;AAC9B;AAEA,SAAS,eAAe,OAAuB;AAC7C,SAAO,MAAM,KAAK,EAAE,YAAY,EAAE,QAAQ,QAAQ,GAAG;AACvD;AAEA,SAAS,mBAAmB,WAAuC;AACjE,MAAI,OAAO,cAAc,SAAU,QAAO;AAC1C,SAAO,UAAU,KAAK,EAAE,QAAQ,OAAO,GAAG;AAC5C;AAEA,SAAS,uBACP,SACyB;AACzB,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,OAAO,EACnB,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS,EACzC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC;AAAA,EACxD;AACF;AAEO,SAAS,uBACd,SACQ;AACR,SAAO,KAAK,UAAU;AAAA,IACpB,OAAO,eAAe,QAAQ,KAAK;AAAA,IACnC,YAAY,CAAC,GAAG,QAAQ,UAAU,EAAE,KAAK;AAAA,IACzC,YAAY,QAAQ;AAAA,IACpB,YAAY,QAAQ;AAAA,IACpB,WAAW,mBAAmB,QAAQ,SAAS;AAAA,IAC/C,YAAY,QAAQ,cAAc;AAAA,IAClC,eAAe,uBAAuB,QAAQ,aAAa;AAAA,EAC7D,CAAC;AACH;AAEO,SAAS,mBACd,UACA,SAI6B;AAC7B,QAAM,QAAQ,eAAe,IAAI,QAAQ;AACzC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAQ,KAAK,IAAI,IAAI,MAAM;AACjC,MAAI,SAAS,QAAQ,YAAY;AAC/B,WAAO,EAAE,OAAO,gBAAgB,MAAM,KAAU,GAAG,QAAQ,SAAS,MAAM;AAAA,EAC5E;AACA,MAAI,SAAS,QAAQ,YAAY;AAC/B,WAAO,EAAE,OAAO,gBAAgB,MAAM,KAAU,GAAG,QAAQ,SAAS,MAAM;AAAA,EAC5E;AAEA,iBAAe,OAAO,QAAQ;AAC9B,SAAO;AACT;AAEO,SAAS,mBACd,UACA,OACA,SACM;AACN,iBAAe,OAAO,QAAQ;AAC9B,MAAI,QAAQ,cAAc,EAAG;AAE7B,iBAAe,IAAI,UAAU;AAAA,IAC3B,OAAO,gBAAgB,KAAK;AAAA,IAC5B,YAAY,KAAK,IAAI;AAAA,EACvB,CAAC;AAED,SAAO,eAAe,OAAO,QAAQ,YAAY;AAC/C,UAAM,YAAY,eAAe,KAAK,EAAE,KAAK,EAAE;AAC/C,QAAI,OAAO,cAAc,SAAU;AACnC,mBAAe,OAAO,SAAS;AAAA,EACjC;AACF;AAEO,SAAS,sBAA4B;AAC1C,iBAAe,MAAM;AACvB;","names":[]}
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isSafeRouteNamespace
|
|
3
|
+
} from "./chunk-HLXVTBF3.js";
|
|
4
|
+
import {
|
|
5
|
+
sanitizeMemoryContent
|
|
6
|
+
} from "./chunk-M62O4P4T.js";
|
|
7
|
+
|
|
8
|
+
// src/explicit-capture.ts
|
|
9
|
+
import { randomUUID } from "crypto";
|
|
10
|
+
var INLINE_NOTE_RE = /<memory_note>\s*([\s\S]*?)\s*<\/memory_note>/gi;
|
|
11
|
+
var INLINE_NOTE_MARKUP_RE = /<memory_note>\s*[\s\S]*?\s*<\/memory_note>/i;
|
|
12
|
+
var INLINE_ALLOWED_CATEGORIES = /* @__PURE__ */ new Set([
|
|
13
|
+
"fact",
|
|
14
|
+
"preference",
|
|
15
|
+
"correction",
|
|
16
|
+
"entity",
|
|
17
|
+
"decision",
|
|
18
|
+
"relationship",
|
|
19
|
+
"principle",
|
|
20
|
+
"commitment",
|
|
21
|
+
"moment",
|
|
22
|
+
"skill",
|
|
23
|
+
"rule"
|
|
24
|
+
]);
|
|
25
|
+
var SECRET_PATTERNS = [
|
|
26
|
+
/\bsk-[A-Za-z0-9]{16,}\b/,
|
|
27
|
+
/\bAKIA[0-9A-Z]{16}\b/,
|
|
28
|
+
/\bBearer\s+[A-Za-z0-9._-]{16,}\b/i,
|
|
29
|
+
/\b(?:api[_-]?key|secret|token|password|passwd)\s*[:=]\s*[^\s]{8,}\b/i,
|
|
30
|
+
/\b(?:authorization)\s*:\s*[^\s]{8,}\b/i
|
|
31
|
+
];
|
|
32
|
+
var SECRET_REDACTION_PATTERNS = [
|
|
33
|
+
{ pattern: /\bsk-[A-Za-z0-9]{16,}\b/g, replacement: "[redacted openai key]" },
|
|
34
|
+
{ pattern: /\bAKIA[0-9A-Z]{16}\b/g, replacement: "[redacted aws key]" },
|
|
35
|
+
{ pattern: /\bBearer\s+[A-Za-z0-9._-]{16,}\b/gi, replacement: "Bearer [redacted token]" },
|
|
36
|
+
{
|
|
37
|
+
pattern: /\b(?:api[_-]?key|secret|token|password|passwd)\s*[:=]\s*[^\s]{8,}\b/gi,
|
|
38
|
+
replacement: "[redacted credential]"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
pattern: /\b(?:authorization)\s*:\s*[^\s]{8,}\b/gi,
|
|
42
|
+
replacement: "authorization: [redacted credential]"
|
|
43
|
+
}
|
|
44
|
+
];
|
|
45
|
+
var EXPLICIT_CAPTURE_REVIEW_TAGS = ["explicit-capture", "queued-review"];
|
|
46
|
+
function explicitCaptureActor(source) {
|
|
47
|
+
switch (source) {
|
|
48
|
+
case "inline":
|
|
49
|
+
return "inline.memory_note";
|
|
50
|
+
case "memory_store":
|
|
51
|
+
return "tool.memory_store";
|
|
52
|
+
case "suggestion_submit":
|
|
53
|
+
return "tool.suggestion_submit";
|
|
54
|
+
default:
|
|
55
|
+
return "tool.memory_capture";
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function asTrimmed(value) {
|
|
59
|
+
const trimmed = value?.trim();
|
|
60
|
+
return trimmed && trimmed.length > 0 ? trimmed : void 0;
|
|
61
|
+
}
|
|
62
|
+
function normalizeCaptureContent(value) {
|
|
63
|
+
return value.toLowerCase().replace(/\s+/g, " ").trim();
|
|
64
|
+
}
|
|
65
|
+
function redactSecrets(value) {
|
|
66
|
+
let redacted = value;
|
|
67
|
+
for (const { pattern, replacement } of SECRET_REDACTION_PATTERNS) {
|
|
68
|
+
redacted = redacted.replace(pattern, replacement);
|
|
69
|
+
}
|
|
70
|
+
return redacted;
|
|
71
|
+
}
|
|
72
|
+
function normalizeExplicitCaptureError(error) {
|
|
73
|
+
if (error instanceof Error && error.message.trim().length > 0) return error.message.trim();
|
|
74
|
+
const rendered = String(error).trim();
|
|
75
|
+
return rendered.length > 0 ? rendered : "explicit capture failed";
|
|
76
|
+
}
|
|
77
|
+
function resolveExplicitCaptureReviewNamespace(orchestrator, namespace) {
|
|
78
|
+
const normalized = asTrimmed(namespace);
|
|
79
|
+
if (!normalized) return void 0;
|
|
80
|
+
return resolveExplicitCaptureNamespace(orchestrator, normalized);
|
|
81
|
+
}
|
|
82
|
+
function resolveExplicitCaptureNamespace(orchestrator, namespace) {
|
|
83
|
+
const normalized = asTrimmed(namespace);
|
|
84
|
+
if (!normalized) return void 0;
|
|
85
|
+
if (!orchestrator.config.namespacesEnabled) {
|
|
86
|
+
if (normalized !== orchestrator.config.defaultNamespace) {
|
|
87
|
+
throw new Error(`unsupported namespace: ${normalized}`);
|
|
88
|
+
}
|
|
89
|
+
return normalized;
|
|
90
|
+
}
|
|
91
|
+
const allowed = new Set([
|
|
92
|
+
orchestrator.config.defaultNamespace,
|
|
93
|
+
orchestrator.config.sharedNamespace,
|
|
94
|
+
...orchestrator.config.namespacePolicies.map((policy) => policy.name)
|
|
95
|
+
].map((value) => value.trim()).filter(Boolean));
|
|
96
|
+
if (!allowed.has(normalized)) {
|
|
97
|
+
throw new Error(`unsupported namespace: ${normalized}`);
|
|
98
|
+
}
|
|
99
|
+
return normalized;
|
|
100
|
+
}
|
|
101
|
+
function parseExplicitCaptureTtl(ttl) {
|
|
102
|
+
const raw = asTrimmed(ttl);
|
|
103
|
+
if (!raw) return void 0;
|
|
104
|
+
const absoluteMs = Date.parse(raw);
|
|
105
|
+
if (Number.isFinite(absoluteMs)) {
|
|
106
|
+
return new Date(absoluteMs).toISOString();
|
|
107
|
+
}
|
|
108
|
+
const relative = raw.match(/^(\d+)\s*([mhdw])$/i);
|
|
109
|
+
if (!relative) {
|
|
110
|
+
throw new Error("ttl must be an ISO-8601 timestamp or relative duration like 30m, 12h, 7d, or 2w");
|
|
111
|
+
}
|
|
112
|
+
const amount = Number.parseInt(relative[1] ?? "", 10);
|
|
113
|
+
const unit = (relative[2] ?? "").toLowerCase();
|
|
114
|
+
if (!Number.isFinite(amount) || amount <= 0) {
|
|
115
|
+
throw new Error("ttl duration must be a positive integer");
|
|
116
|
+
}
|
|
117
|
+
const multiplier = unit === "m" ? 6e4 : unit === "h" ? 60 * 6e4 : unit === "d" ? 24 * 60 * 6e4 : 7 * 24 * 60 * 6e4;
|
|
118
|
+
return new Date(Date.now() + amount * multiplier).toISOString();
|
|
119
|
+
}
|
|
120
|
+
function parseInlineNote(block) {
|
|
121
|
+
const lines = block.replace(/\r/g, "").split("\n");
|
|
122
|
+
const note = {};
|
|
123
|
+
let idx = 0;
|
|
124
|
+
while (idx < lines.length) {
|
|
125
|
+
const rawLine = lines[idx] ?? "";
|
|
126
|
+
const line = rawLine.trim();
|
|
127
|
+
idx += 1;
|
|
128
|
+
if (line.length === 0) continue;
|
|
129
|
+
const colonIdx = line.indexOf(":");
|
|
130
|
+
if (colonIdx < 0) continue;
|
|
131
|
+
const key = line.slice(0, colonIdx).trim();
|
|
132
|
+
const value = line.slice(colonIdx + 1).trim();
|
|
133
|
+
if (key === "content" && value === "|") {
|
|
134
|
+
const contentLines = [];
|
|
135
|
+
while (idx < lines.length) {
|
|
136
|
+
const next = lines[idx] ?? "";
|
|
137
|
+
if (next.startsWith(" ") || next.startsWith(" ")) {
|
|
138
|
+
contentLines.push(next.replace(/^( |\t)/, ""));
|
|
139
|
+
idx += 1;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (next.trim().length === 0) {
|
|
143
|
+
contentLines.push("");
|
|
144
|
+
idx += 1;
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
note.content = contentLines.join("\n").trim();
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
switch (key) {
|
|
153
|
+
case "content":
|
|
154
|
+
note.content = value;
|
|
155
|
+
break;
|
|
156
|
+
case "category":
|
|
157
|
+
note.category = value;
|
|
158
|
+
break;
|
|
159
|
+
case "confidence":
|
|
160
|
+
note.confidence = Number.parseFloat(value);
|
|
161
|
+
break;
|
|
162
|
+
case "namespace":
|
|
163
|
+
note.namespace = value;
|
|
164
|
+
break;
|
|
165
|
+
case "tags":
|
|
166
|
+
note.tags = value.split(",").map((entry) => entry.trim()).filter(Boolean);
|
|
167
|
+
break;
|
|
168
|
+
case "entityRef":
|
|
169
|
+
note.entityRef = value;
|
|
170
|
+
break;
|
|
171
|
+
case "ttl":
|
|
172
|
+
note.ttl = value;
|
|
173
|
+
break;
|
|
174
|
+
case "sourceReason":
|
|
175
|
+
note.sourceReason = value;
|
|
176
|
+
break;
|
|
177
|
+
default:
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return asTrimmed(note.content) ? note : null;
|
|
182
|
+
}
|
|
183
|
+
function parseInlineExplicitCaptureNotes(text) {
|
|
184
|
+
const notes = [];
|
|
185
|
+
for (const match of text.matchAll(INLINE_NOTE_RE)) {
|
|
186
|
+
const parsed = parseInlineNote(match[1] ?? "");
|
|
187
|
+
if (parsed) notes.push(parsed);
|
|
188
|
+
}
|
|
189
|
+
return notes;
|
|
190
|
+
}
|
|
191
|
+
function hasInlineExplicitCaptureMarkup(text) {
|
|
192
|
+
return INLINE_NOTE_MARKUP_RE.test(text);
|
|
193
|
+
}
|
|
194
|
+
function stripInlineExplicitCaptureNotes(text) {
|
|
195
|
+
return text.replace(INLINE_NOTE_RE, "").trim();
|
|
196
|
+
}
|
|
197
|
+
function validateExplicitCaptureInput(input, mode = "strict_explicit") {
|
|
198
|
+
const content = asTrimmed(input.content);
|
|
199
|
+
if (!content) throw new Error("content is required");
|
|
200
|
+
if (mode === "strict_explicit") {
|
|
201
|
+
if (content.length < 10) throw new Error("content must be at least 10 characters");
|
|
202
|
+
if (content.length > 4e3) throw new Error("content must be 4000 characters or fewer");
|
|
203
|
+
}
|
|
204
|
+
if (/<memory_note>/i.test(content) || /<\/memory_note>/i.test(content)) {
|
|
205
|
+
throw new Error("nested memory_note blocks are not allowed");
|
|
206
|
+
}
|
|
207
|
+
const category = asTrimmed(input.category) ?? "fact";
|
|
208
|
+
if (!INLINE_ALLOWED_CATEGORIES.has(category)) {
|
|
209
|
+
throw new Error(`unsupported category: ${input.category ?? category}`);
|
|
210
|
+
}
|
|
211
|
+
const sanitized = sanitizeMemoryContent(content);
|
|
212
|
+
if (!sanitized.clean) {
|
|
213
|
+
throw new Error("content failed memory sanitization");
|
|
214
|
+
}
|
|
215
|
+
for (const pattern of SECRET_PATTERNS) {
|
|
216
|
+
if (pattern.test(content)) {
|
|
217
|
+
throw new Error("content appears to contain a secret or credential");
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
const confidence = Number.isFinite(input.confidence) ? Number(input.confidence) : 0.95;
|
|
221
|
+
if (confidence < 0 || confidence > 1) {
|
|
222
|
+
throw new Error("confidence must be between 0 and 1");
|
|
223
|
+
}
|
|
224
|
+
const requestedNamespace = asTrimmed(input.namespace);
|
|
225
|
+
if (requestedNamespace && !isSafeRouteNamespace(requestedNamespace)) {
|
|
226
|
+
throw new Error(`unsafe namespace: ${requestedNamespace}`);
|
|
227
|
+
}
|
|
228
|
+
const expiresAt = parseExplicitCaptureTtl(input.ttl);
|
|
229
|
+
return {
|
|
230
|
+
content,
|
|
231
|
+
category,
|
|
232
|
+
confidence,
|
|
233
|
+
namespace: asTrimmed(input.namespace),
|
|
234
|
+
tags: Array.from(new Set((input.tags ?? []).map((tag) => tag.trim()).filter(Boolean))),
|
|
235
|
+
entityRef: asTrimmed(input.entityRef),
|
|
236
|
+
expiresAt,
|
|
237
|
+
sourceReason: asTrimmed(input.sourceReason)
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
async function findDuplicateExplicitCapture(orchestrator, resolvedNamespace, candidate) {
|
|
241
|
+
const storage = await orchestrator.getStorage(resolvedNamespace);
|
|
242
|
+
if (candidate.category === "fact" && typeof storage.hasFactContentHash === "function") {
|
|
243
|
+
try {
|
|
244
|
+
const hasHash = await storage.hasFactContentHash(
|
|
245
|
+
candidate.content
|
|
246
|
+
);
|
|
247
|
+
if (!hasHash) {
|
|
248
|
+
const authoritative = typeof storage.isFactContentHashAuthoritative === "function" ? await storage.isFactContentHashAuthoritative() : false;
|
|
249
|
+
if (authoritative) return null;
|
|
250
|
+
}
|
|
251
|
+
} catch (err) {
|
|
252
|
+
void err;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
const existing = await storage.readAllMemories();
|
|
256
|
+
const normalizedCandidate = normalizeCaptureContent(candidate.content);
|
|
257
|
+
const match = existing.find((memory) => {
|
|
258
|
+
const status = memory.frontmatter.status ?? "active";
|
|
259
|
+
if (status !== "active") return false;
|
|
260
|
+
if (memory.frontmatter.category !== candidate.category) return false;
|
|
261
|
+
return normalizeCaptureContent(memory.content) === normalizedCandidate;
|
|
262
|
+
});
|
|
263
|
+
return match?.frontmatter.id ?? null;
|
|
264
|
+
}
|
|
265
|
+
async function persistExplicitCapture(orchestrator, candidate, source) {
|
|
266
|
+
const resolvedNamespace = resolveExplicitCaptureNamespace(orchestrator, candidate.namespace);
|
|
267
|
+
const duplicateOf = await findDuplicateExplicitCapture(orchestrator, resolvedNamespace, candidate);
|
|
268
|
+
if (duplicateOf) {
|
|
269
|
+
return { id: duplicateOf, duplicateOf };
|
|
270
|
+
}
|
|
271
|
+
const storage = await orchestrator.getStorage(resolvedNamespace);
|
|
272
|
+
const id = await storage.writeMemory(candidate.category, candidate.content, {
|
|
273
|
+
confidence: candidate.confidence,
|
|
274
|
+
tags: candidate.tags,
|
|
275
|
+
entityRef: candidate.entityRef,
|
|
276
|
+
expiresAt: candidate.expiresAt,
|
|
277
|
+
source: source === "inline" ? "explicit-inline" : "explicit"
|
|
278
|
+
});
|
|
279
|
+
const created = (/* @__PURE__ */ new Date()).toISOString();
|
|
280
|
+
const event = {
|
|
281
|
+
eventId: `mle-${randomUUID()}`,
|
|
282
|
+
memoryId: id,
|
|
283
|
+
eventType: "explicit_capture_accepted",
|
|
284
|
+
timestamp: created,
|
|
285
|
+
actor: explicitCaptureActor(source),
|
|
286
|
+
reasonCode: candidate.sourceReason,
|
|
287
|
+
ruleVersion: "explicit-capture.v1"
|
|
288
|
+
};
|
|
289
|
+
await storage.appendMemoryLifecycleEvents([event]);
|
|
290
|
+
return { id };
|
|
291
|
+
}
|
|
292
|
+
function buildExplicitCaptureReviewContent(input, reason) {
|
|
293
|
+
const requestedContent = asTrimmed(input.content);
|
|
294
|
+
const sanitized = sanitizeMemoryContent(redactSecrets(requestedContent ?? "[empty explicit capture]"));
|
|
295
|
+
const safeContent = sanitized.text.trim().length > 0 ? sanitized.text.trim() : "[empty explicit capture]";
|
|
296
|
+
const lines = [
|
|
297
|
+
"Explicit capture queued for review.",
|
|
298
|
+
"",
|
|
299
|
+
`Reason: ${reason}`,
|
|
300
|
+
"",
|
|
301
|
+
"Submitted content:",
|
|
302
|
+
safeContent
|
|
303
|
+
];
|
|
304
|
+
const metadata = [
|
|
305
|
+
input.category ? `Requested category: ${input.category}` : void 0,
|
|
306
|
+
input.namespace ? `Requested namespace: ${input.namespace}` : void 0,
|
|
307
|
+
input.entityRef ? `Requested entityRef: ${input.entityRef}` : void 0,
|
|
308
|
+
input.ttl ? `Requested ttl: ${input.ttl}` : void 0,
|
|
309
|
+
input.sourceReason ? `Requested sourceReason: ${input.sourceReason}` : void 0,
|
|
310
|
+
input.tags && input.tags.length > 0 ? `Requested tags: ${input.tags.join(", ")}` : void 0
|
|
311
|
+
].filter((entry) => typeof entry === "string" && entry.length > 0);
|
|
312
|
+
if (metadata.length > 0) {
|
|
313
|
+
lines.push("", ...metadata);
|
|
314
|
+
}
|
|
315
|
+
return lines.join("\n");
|
|
316
|
+
}
|
|
317
|
+
async function findQueuedExplicitCaptureDuplicate(orchestrator, namespace, content) {
|
|
318
|
+
const storage = await orchestrator.getStorage(namespace);
|
|
319
|
+
const existing = await storage.readAllMemories();
|
|
320
|
+
const normalized = normalizeCaptureContent(content);
|
|
321
|
+
const match = existing.find((memory) => {
|
|
322
|
+
const status = memory.frontmatter.status ?? "active";
|
|
323
|
+
if (status !== "pending_review") return false;
|
|
324
|
+
if (!(memory.frontmatter.tags ?? []).includes("queued-review")) return false;
|
|
325
|
+
return normalizeCaptureContent(memory.content) === normalized;
|
|
326
|
+
});
|
|
327
|
+
return match?.frontmatter.id ?? null;
|
|
328
|
+
}
|
|
329
|
+
async function queueExplicitCaptureForReview(orchestrator, input, source, error) {
|
|
330
|
+
const reason = normalizeExplicitCaptureError(error);
|
|
331
|
+
const requestedNamespace = asTrimmed(input.namespace);
|
|
332
|
+
const queueNamespace = resolveExplicitCaptureReviewNamespace(orchestrator, requestedNamespace);
|
|
333
|
+
const content = buildExplicitCaptureReviewContent(input, reason);
|
|
334
|
+
const duplicateOf = await findQueuedExplicitCaptureDuplicate(orchestrator, queueNamespace, content);
|
|
335
|
+
if (duplicateOf) {
|
|
336
|
+
return { id: duplicateOf, duplicateOf };
|
|
337
|
+
}
|
|
338
|
+
const requestedCategory = asTrimmed(input.category);
|
|
339
|
+
const reviewCategory = requestedCategory && INLINE_ALLOWED_CATEGORIES.has(requestedCategory) ? requestedCategory : "fact";
|
|
340
|
+
const requestedTags = Array.isArray(input.tags) ? input.tags.map((tag) => tag.trim()).filter(Boolean) : [];
|
|
341
|
+
const storage = await orchestrator.getStorage(queueNamespace);
|
|
342
|
+
const id = await storage.writeMemory(reviewCategory, content, {
|
|
343
|
+
confidence: 0.2,
|
|
344
|
+
tags: Array.from(/* @__PURE__ */ new Set([...EXPLICIT_CAPTURE_REVIEW_TAGS, ...requestedTags])),
|
|
345
|
+
entityRef: asTrimmed(input.entityRef),
|
|
346
|
+
source: source === "inline" ? "explicit-inline-review" : "explicit-review"
|
|
347
|
+
});
|
|
348
|
+
const created = await storage.getMemoryById(id);
|
|
349
|
+
if (created) {
|
|
350
|
+
await storage.writeMemoryFrontmatter(created, {
|
|
351
|
+
status: "pending_review",
|
|
352
|
+
updated: (/* @__PURE__ */ new Date()).toISOString()
|
|
353
|
+
}, {
|
|
354
|
+
actor: explicitCaptureActor(source),
|
|
355
|
+
reasonCode: reason,
|
|
356
|
+
ruleVersion: "explicit-capture.v1"
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
const event = {
|
|
360
|
+
eventId: `mle-${randomUUID()}`,
|
|
361
|
+
memoryId: id,
|
|
362
|
+
eventType: "explicit_capture_queued",
|
|
363
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
364
|
+
actor: explicitCaptureActor(source),
|
|
365
|
+
reasonCode: reason,
|
|
366
|
+
ruleVersion: "explicit-capture.v1"
|
|
367
|
+
};
|
|
368
|
+
await storage.appendMemoryLifecycleEvents([event]);
|
|
369
|
+
return { id };
|
|
370
|
+
}
|
|
371
|
+
function shouldSkipImplicitExtraction(cfg) {
|
|
372
|
+
return cfg.captureMode === "explicit";
|
|
373
|
+
}
|
|
374
|
+
function shouldProcessInlineExplicitCapture(cfg) {
|
|
375
|
+
return cfg.captureMode !== "implicit";
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
export {
|
|
379
|
+
parseInlineExplicitCaptureNotes,
|
|
380
|
+
hasInlineExplicitCaptureMarkup,
|
|
381
|
+
stripInlineExplicitCaptureNotes,
|
|
382
|
+
validateExplicitCaptureInput,
|
|
383
|
+
persistExplicitCapture,
|
|
384
|
+
queueExplicitCaptureForReview,
|
|
385
|
+
shouldSkipImplicitExtraction,
|
|
386
|
+
shouldProcessInlineExplicitCapture
|
|
387
|
+
};
|
|
388
|
+
//# sourceMappingURL=chunk-YNCQ7E4M.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/explicit-capture.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { Orchestrator } from \"./orchestrator.js\";\nimport { isSafeRouteNamespace } from \"./routing/engine.js\";\nimport { sanitizeMemoryContent } from \"./sanitize.js\";\nimport { ContentHashIndex } from \"./storage.js\";\nimport type { CaptureMode, MemoryCategory, MemoryLifecycleEvent, PluginConfig } from \"./types.js\";\n\nexport type ExplicitCaptureInput = {\n content: string;\n category?: string;\n confidence?: number;\n namespace?: string;\n tags?: string[];\n entityRef?: 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 expiresAt?: string;\n sourceReason?: string;\n};\n\nexport type ExplicitCaptureSource = \"memory_store\" | \"memory_capture\" | \"suggestion_submit\" | \"inline\";\ntype ExplicitCaptureValidationMode = \"legacy_tool\" | \"strict_explicit\";\n\nconst INLINE_NOTE_RE = /<memory_note>\\s*([\\s\\S]*?)\\s*<\\/memory_note>/gi;\nconst INLINE_NOTE_MARKUP_RE = /<memory_note>\\s*[\\s\\S]*?\\s*<\\/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]);\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 normalizeCaptureContent(value: string): string {\n return value\n .toLowerCase()\n .replace(/\\s+/g, \" \")\n .trim();\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 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 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 (!orchestrator.config.namespacesEnabled) {\n if (normalized !== orchestrator.config.defaultNamespace) {\n throw new Error(`unsupported namespace: ${normalized}`);\n }\n return normalized;\n }\n const allowed = new Set([\n orchestrator.config.defaultNamespace,\n orchestrator.config.sharedNamespace,\n ...orchestrator.config.namespacePolicies.map((policy) => policy.name),\n ].map((value) => value.trim()).filter(Boolean));\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\n : unit === \"h\" ? 60 * 60_000\n : unit === \"d\" ? 24 * 60 * 60_000\n : 7 * 24 * 60 * 60_000;\n return new Date(Date.now() + amount * multiplier).toISOString();\n}\n\nfunction parseInlineNote(block: string): ExplicitCaptureInput | null {\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 = Number.parseFloat(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 asTrimmed(note.content) ? (note as ExplicitCaptureInput) : null;\n}\n\nexport function parseInlineExplicitCaptureNotes(text: string): ExplicitCaptureInput[] {\n const notes: ExplicitCaptureInput[] = [];\n for (const match of text.matchAll(INLINE_NOTE_RE)) {\n const parsed = parseInlineNote(match[1] ?? \"\");\n if (parsed) notes.push(parsed);\n }\n return notes;\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\n const confidence = Number.isFinite(input.confidence) ? Number(input.confidence) : 0.95;\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 return {\n content,\n category,\n confidence,\n namespace: asTrimmed(input.namespace),\n tags: Array.from(new Set((input.tags ?? []).map((tag) => tag.trim()).filter(Boolean))),\n entityRef: asTrimmed(input.entityRef),\n expiresAt,\n sourceReason: asTrimmed(input.sourceReason),\n };\n}\n\nasync function findDuplicateExplicitCapture(\n orchestrator: Orchestrator,\n resolvedNamespace: string | undefined,\n candidate: ValidExplicitCapture,\n): Promise<string | null> {\n const storage = await orchestrator.getStorage(resolvedNamespace);\n if (\n candidate.category === \"fact\"\n && typeof (storage as { hasFactContentHash?: (content: string) => Promise<boolean> }).hasFactContentHash === \"function\"\n ) {\n try {\n const hasHash = await (storage as { hasFactContentHash: (content: string) => Promise<boolean> }).hasFactContentHash(\n candidate.content,\n );\n if (!hasHash) {\n const authoritative =\n typeof (storage as { isFactContentHashAuthoritative?: () => Promise<boolean> | boolean }).isFactContentHashAuthoritative\n === \"function\"\n ? await (storage as { isFactContentHashAuthoritative: () => Promise<boolean> | boolean })\n .isFactContentHashAuthoritative()\n : false;\n if (authoritative) return null;\n }\n } catch (err) {\n // Fail open: hash index is only an optimization, so fall back to the full corpus scan.\n void err;\n }\n }\n const existing = await storage.readAllMemories();\n const normalizedCandidate = normalizeCaptureContent(candidate.content);\n const match = existing.find((memory) => {\n const status = memory.frontmatter.status ?? \"active\";\n if (status !== \"active\") return false;\n if (memory.frontmatter.category !== candidate.category) return false;\n return normalizeCaptureContent(memory.content) === normalizedCandidate;\n });\n return match?.frontmatter.id ?? null;\n}\n\nexport async function persistExplicitCapture(\n orchestrator: Orchestrator,\n candidate: ValidExplicitCapture,\n source: ExplicitCaptureSource,\n): Promise<{ id: string; duplicateOf?: string }> {\n const resolvedNamespace = resolveExplicitCaptureNamespace(orchestrator, candidate.namespace);\n const duplicateOf = await findDuplicateExplicitCapture(orchestrator, resolvedNamespace, candidate);\n if (duplicateOf) {\n return { id: duplicateOf, duplicateOf };\n }\n\n const storage = await orchestrator.getStorage(resolvedNamespace);\n const id = await storage.writeMemory(candidate.category, candidate.content, {\n confidence: candidate.confidence,\n tags: candidate.tags,\n entityRef: candidate.entityRef,\n expiresAt: candidate.expiresAt,\n source: source === \"inline\" ? \"explicit-inline\" : \"explicit\",\n });\n\n const created = new Date().toISOString();\n const event: MemoryLifecycleEvent = {\n eventId: `mle-${randomUUID()}`,\n memoryId: id,\n eventType: \"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 };\n}\n\nfunction buildExplicitCaptureReviewContent(input: ExplicitCaptureInput, reason: string): string {\n const requestedContent = asTrimmed(input.content);\n const sanitized = sanitizeMemoryContent(redactSecrets(requestedContent ?? \"[empty explicit capture]\"));\n const safeContent = sanitized.text.trim().length > 0 ? sanitized.text.trim() : \"[empty explicit capture]\";\n const lines = [\n \"Explicit capture queued for review.\",\n \"\",\n `Reason: ${reason}`,\n \"\",\n \"Submitted content:\",\n safeContent,\n ];\n const metadata = [\n input.category ? `Requested category: ${input.category}` : undefined,\n input.namespace ? `Requested namespace: ${input.namespace}` : undefined,\n input.entityRef ? `Requested entityRef: ${input.entityRef}` : undefined,\n input.ttl ? `Requested ttl: ${input.ttl}` : undefined,\n input.sourceReason ? `Requested sourceReason: ${input.sourceReason}` : undefined,\n input.tags && input.tags.length > 0 ? `Requested tags: ${input.tags.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\nasync function findQueuedExplicitCaptureDuplicate(\n orchestrator: Orchestrator,\n namespace: string | undefined,\n content: string,\n): Promise<string | null> {\n const storage = await orchestrator.getStorage(namespace);\n const existing = await storage.readAllMemories();\n const normalized = normalizeCaptureContent(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 return normalizeCaptureContent(memory.content) === normalized;\n });\n return match?.frontmatter.id ?? null;\n}\n\nexport async function queueExplicitCaptureForReview(\n orchestrator: Orchestrator,\n input: ExplicitCaptureInput,\n source: ExplicitCaptureSource,\n error: unknown,\n): Promise<{ id: string; duplicateOf?: string }> {\n const reason = normalizeExplicitCaptureError(error);\n const requestedNamespace = asTrimmed(input.namespace);\n const queueNamespace = resolveExplicitCaptureReviewNamespace(orchestrator, requestedNamespace);\n const content = buildExplicitCaptureReviewContent(input, reason);\n const duplicateOf = await findQueuedExplicitCaptureDuplicate(orchestrator, queueNamespace, content);\n if (duplicateOf) {\n return { id: duplicateOf, duplicateOf };\n }\n\n const requestedCategory = asTrimmed(input.category);\n const reviewCategory = requestedCategory && INLINE_ALLOWED_CATEGORIES.has(requestedCategory as MemoryCategory)\n ? requestedCategory as MemoryCategory\n : \"fact\";\n const requestedTags = Array.isArray(input.tags)\n ? input.tags.map((tag) => tag.trim()).filter(Boolean)\n : [];\n const storage = await orchestrator.getStorage(queueNamespace);\n const id = await storage.writeMemory(reviewCategory, content, {\n confidence: 0.2,\n tags: Array.from(new Set([...EXPLICIT_CAPTURE_REVIEW_TAGS, ...requestedTags])),\n entityRef: asTrimmed(input.entityRef),\n source: source === \"inline\" ? \"explicit-inline-review\" : \"explicit-review\",\n });\n const created = await storage.getMemoryById(id);\n if (created) {\n await storage.writeMemoryFrontmatter(created, {\n status: \"pending_review\",\n updated: new Date().toISOString(),\n }, {\n actor: explicitCaptureActor(source),\n reasonCode: reason,\n ruleVersion: \"explicit-capture.v1\",\n });\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\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"],"mappings":"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","names":[]}
|