@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,59 @@
|
|
|
1
|
+
import {
|
|
2
|
+
appendEdge
|
|
3
|
+
} from "./chunk-SCHEKPYH.js";
|
|
4
|
+
|
|
5
|
+
// src/causal-trajectory-graph.ts
|
|
6
|
+
function causalTrajectoryGraphNodeId(trajectoryId, stage) {
|
|
7
|
+
return `causal-trajectory/${trajectoryId}#${stage}`;
|
|
8
|
+
}
|
|
9
|
+
function buildCausalTrajectoryGraphEdges(record) {
|
|
10
|
+
const edges = [
|
|
11
|
+
{
|
|
12
|
+
from: causalTrajectoryGraphNodeId(record.trajectoryId, "goal"),
|
|
13
|
+
to: causalTrajectoryGraphNodeId(record.trajectoryId, "action"),
|
|
14
|
+
type: "causal",
|
|
15
|
+
weight: 1,
|
|
16
|
+
label: "goal_to_action",
|
|
17
|
+
ts: record.recordedAt
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
from: causalTrajectoryGraphNodeId(record.trajectoryId, "action"),
|
|
21
|
+
to: causalTrajectoryGraphNodeId(record.trajectoryId, "observation"),
|
|
22
|
+
type: "causal",
|
|
23
|
+
weight: 1,
|
|
24
|
+
label: "action_to_observation",
|
|
25
|
+
ts: record.recordedAt
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
from: causalTrajectoryGraphNodeId(record.trajectoryId, "observation"),
|
|
29
|
+
to: causalTrajectoryGraphNodeId(record.trajectoryId, "outcome"),
|
|
30
|
+
type: "causal",
|
|
31
|
+
weight: 1,
|
|
32
|
+
label: `observation_to_outcome:${record.outcomeKind}`,
|
|
33
|
+
ts: record.recordedAt
|
|
34
|
+
}
|
|
35
|
+
];
|
|
36
|
+
if (record.followUpSummary) {
|
|
37
|
+
edges.push({
|
|
38
|
+
from: causalTrajectoryGraphNodeId(record.trajectoryId, "outcome"),
|
|
39
|
+
to: causalTrajectoryGraphNodeId(record.trajectoryId, "follow_up"),
|
|
40
|
+
type: "causal",
|
|
41
|
+
weight: 1,
|
|
42
|
+
label: "outcome_to_follow_up",
|
|
43
|
+
ts: record.recordedAt
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return edges;
|
|
47
|
+
}
|
|
48
|
+
async function appendCausalTrajectoryGraphEdges(options) {
|
|
49
|
+
const edges = buildCausalTrajectoryGraphEdges(options.record);
|
|
50
|
+
for (const edge of edges) {
|
|
51
|
+
await appendEdge(options.memoryDir, edge);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export {
|
|
55
|
+
appendCausalTrajectoryGraphEdges,
|
|
56
|
+
buildCausalTrajectoryGraphEdges,
|
|
57
|
+
causalTrajectoryGraphNodeId
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=causal-trajectory-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/causal-trajectory-graph.ts"],"sourcesContent":["import { appendEdge, type GraphEdge } from \"./graph.js\";\nimport type { CausalTrajectoryRecord } from \"./causal-trajectory.js\";\n\nexport type CausalTrajectoryGraphStage = \"goal\" | \"action\" | \"observation\" | \"outcome\" | \"follow_up\";\n\nexport function causalTrajectoryGraphNodeId(trajectoryId: string, stage: CausalTrajectoryGraphStage): string {\n return `causal-trajectory/${trajectoryId}#${stage}`;\n}\n\nexport function buildCausalTrajectoryGraphEdges(record: CausalTrajectoryRecord): GraphEdge[] {\n const edges: GraphEdge[] = [\n {\n from: causalTrajectoryGraphNodeId(record.trajectoryId, \"goal\"),\n to: causalTrajectoryGraphNodeId(record.trajectoryId, \"action\"),\n type: \"causal\",\n weight: 1.0,\n label: \"goal_to_action\",\n ts: record.recordedAt,\n },\n {\n from: causalTrajectoryGraphNodeId(record.trajectoryId, \"action\"),\n to: causalTrajectoryGraphNodeId(record.trajectoryId, \"observation\"),\n type: \"causal\",\n weight: 1.0,\n label: \"action_to_observation\",\n ts: record.recordedAt,\n },\n {\n from: causalTrajectoryGraphNodeId(record.trajectoryId, \"observation\"),\n to: causalTrajectoryGraphNodeId(record.trajectoryId, \"outcome\"),\n type: \"causal\",\n weight: 1.0,\n label: `observation_to_outcome:${record.outcomeKind}`,\n ts: record.recordedAt,\n },\n ];\n\n if (record.followUpSummary) {\n edges.push({\n from: causalTrajectoryGraphNodeId(record.trajectoryId, \"outcome\"),\n to: causalTrajectoryGraphNodeId(record.trajectoryId, \"follow_up\"),\n type: \"causal\",\n weight: 1.0,\n label: \"outcome_to_follow_up\",\n ts: record.recordedAt,\n });\n }\n\n return edges;\n}\n\nexport async function appendCausalTrajectoryGraphEdges(options: {\n memoryDir: string;\n record: CausalTrajectoryRecord;\n}): Promise<void> {\n const edges = buildCausalTrajectoryGraphEdges(options.record);\n for (const edge of edges) {\n await appendEdge(options.memoryDir, edge);\n }\n}\n"],"mappings":";;;;;AAKO,SAAS,4BAA4B,cAAsB,OAA2C;AAC3G,SAAO,qBAAqB,YAAY,IAAI,KAAK;AACnD;AAEO,SAAS,gCAAgC,QAA6C;AAC3F,QAAM,QAAqB;AAAA,IACzB;AAAA,MACE,MAAM,4BAA4B,OAAO,cAAc,MAAM;AAAA,MAC7D,IAAI,4BAA4B,OAAO,cAAc,QAAQ;AAAA,MAC7D,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,IAAI,OAAO;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAM,4BAA4B,OAAO,cAAc,QAAQ;AAAA,MAC/D,IAAI,4BAA4B,OAAO,cAAc,aAAa;AAAA,MAClE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,IAAI,OAAO;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAM,4BAA4B,OAAO,cAAc,aAAa;AAAA,MACpE,IAAI,4BAA4B,OAAO,cAAc,SAAS;AAAA,MAC9D,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO,0BAA0B,OAAO,WAAW;AAAA,MACnD,IAAI,OAAO;AAAA,IACb;AAAA,EACF;AAEA,MAAI,OAAO,iBAAiB;AAC1B,UAAM,KAAK;AAAA,MACT,MAAM,4BAA4B,OAAO,cAAc,SAAS;AAAA,MAChE,IAAI,4BAA4B,OAAO,cAAc,WAAW;AAAA,MAChE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,IAAI,OAAO;AAAA,IACb,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAsB,iCAAiC,SAGrC;AAChB,QAAM,QAAQ,gCAAgC,QAAQ,MAAM;AAC5D,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,QAAQ,WAAW,IAAI;AAAA,EAC1C;AACF;","names":[]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { ObjectiveStateOutcome } from './objective-state.js';
|
|
2
|
+
|
|
3
|
+
interface CausalTrajectoryRecord {
|
|
4
|
+
schemaVersion: 1;
|
|
5
|
+
trajectoryId: string;
|
|
6
|
+
recordedAt: string;
|
|
7
|
+
sessionKey: string;
|
|
8
|
+
goal: string;
|
|
9
|
+
actionSummary: string;
|
|
10
|
+
observationSummary: string;
|
|
11
|
+
outcomeKind: ObjectiveStateOutcome;
|
|
12
|
+
outcomeSummary: string;
|
|
13
|
+
followUpSummary?: string;
|
|
14
|
+
objectiveStateSnapshotRefs?: string[];
|
|
15
|
+
entityRefs?: string[];
|
|
16
|
+
tags?: string[];
|
|
17
|
+
metadata?: Record<string, string>;
|
|
18
|
+
}
|
|
19
|
+
interface CausalTrajectoryStoreStatus {
|
|
20
|
+
enabled: boolean;
|
|
21
|
+
rootDir: string;
|
|
22
|
+
trajectoriesDir: string;
|
|
23
|
+
trajectories: {
|
|
24
|
+
total: number;
|
|
25
|
+
valid: number;
|
|
26
|
+
invalid: number;
|
|
27
|
+
byOutcome: Partial<Record<ObjectiveStateOutcome, number>>;
|
|
28
|
+
latestTrajectoryId?: string;
|
|
29
|
+
latestRecordedAt?: string;
|
|
30
|
+
latestSessionKey?: string;
|
|
31
|
+
};
|
|
32
|
+
latestTrajectory?: CausalTrajectoryRecord;
|
|
33
|
+
invalidTrajectories: Array<{
|
|
34
|
+
path: string;
|
|
35
|
+
error: string;
|
|
36
|
+
}>;
|
|
37
|
+
}
|
|
38
|
+
interface CausalTrajectorySearchResult {
|
|
39
|
+
record: CausalTrajectoryRecord;
|
|
40
|
+
score: number;
|
|
41
|
+
matchedFields: string[];
|
|
42
|
+
}
|
|
43
|
+
declare function resolveCausalTrajectoryStoreDir(memoryDir: string, overrideDir?: string): string;
|
|
44
|
+
declare function validateCausalTrajectoryRecord(raw: unknown): CausalTrajectoryRecord;
|
|
45
|
+
declare function recordCausalTrajectory(options: {
|
|
46
|
+
memoryDir: string;
|
|
47
|
+
causalTrajectoryStoreDir?: string;
|
|
48
|
+
actionGraphRecallEnabled?: boolean;
|
|
49
|
+
cmcEnabled?: boolean;
|
|
50
|
+
cmcStitchLookbackDays?: number;
|
|
51
|
+
cmcStitchMinScore?: number;
|
|
52
|
+
cmcStitchMaxEdgesPerTrajectory?: number;
|
|
53
|
+
record: CausalTrajectoryRecord;
|
|
54
|
+
}): Promise<string>;
|
|
55
|
+
declare function getCausalTrajectoryStoreStatus(options: {
|
|
56
|
+
memoryDir: string;
|
|
57
|
+
causalTrajectoryStoreDir?: string;
|
|
58
|
+
enabled: boolean;
|
|
59
|
+
}): Promise<CausalTrajectoryStoreStatus>;
|
|
60
|
+
declare function searchCausalTrajectories(options: {
|
|
61
|
+
memoryDir: string;
|
|
62
|
+
causalTrajectoryStoreDir?: string;
|
|
63
|
+
query: string;
|
|
64
|
+
maxResults: number;
|
|
65
|
+
sessionKey?: string;
|
|
66
|
+
}): Promise<CausalTrajectorySearchResult[]>;
|
|
67
|
+
|
|
68
|
+
export { type CausalTrajectoryRecord, type CausalTrajectorySearchResult, type CausalTrajectoryStoreStatus, getCausalTrajectoryStoreStatus, recordCausalTrajectory, resolveCausalTrajectoryStoreDir, searchCausalTrajectories, validateCausalTrajectoryRecord };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getCausalTrajectoryStoreStatus,
|
|
3
|
+
recordCausalTrajectory,
|
|
4
|
+
resolveCausalTrajectoryStoreDir,
|
|
5
|
+
searchCausalTrajectories,
|
|
6
|
+
validateCausalTrajectoryRecord
|
|
7
|
+
} from "./chunk-ORZMT74A.js";
|
|
8
|
+
import "./chunk-DT5TVLJE.js";
|
|
9
|
+
import "./chunk-DGXUHMOV.js";
|
|
10
|
+
import "./chunk-LPSF4OQH.js";
|
|
11
|
+
export {
|
|
12
|
+
getCausalTrajectoryStoreStatus,
|
|
13
|
+
recordCausalTrajectory,
|
|
14
|
+
resolveCausalTrajectoryStoreDir,
|
|
15
|
+
searchCausalTrajectories,
|
|
16
|
+
validateCausalTrajectoryRecord
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=causal-trajectory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import {
|
|
2
|
+
countRecallTokenOverlap,
|
|
3
|
+
normalizeRecallTokens
|
|
4
|
+
} from "./chunk-DT5TVLJE.js";
|
|
5
|
+
|
|
6
|
+
// src/semantic-consolidation.ts
|
|
7
|
+
function findSimilarClusters(memories, config) {
|
|
8
|
+
const excluded = new Set(config.excludeCategories);
|
|
9
|
+
const byCategory = /* @__PURE__ */ new Map();
|
|
10
|
+
for (const m of memories) {
|
|
11
|
+
const cat = m.frontmatter.category;
|
|
12
|
+
if (excluded.has(cat)) continue;
|
|
13
|
+
if (m.frontmatter.status && m.frontmatter.status !== "active") continue;
|
|
14
|
+
const list = byCategory.get(cat) ?? [];
|
|
15
|
+
list.push(m);
|
|
16
|
+
byCategory.set(cat, list);
|
|
17
|
+
}
|
|
18
|
+
const clusters = [];
|
|
19
|
+
let totalCandidates = 0;
|
|
20
|
+
for (const [category, mems] of byCategory) {
|
|
21
|
+
if (totalCandidates >= config.maxPerRun) break;
|
|
22
|
+
const tokenized = mems.map((m) => ({
|
|
23
|
+
memory: m,
|
|
24
|
+
tokens: new Set(normalizeRecallTokens(m.content, []))
|
|
25
|
+
}));
|
|
26
|
+
const clustered = /* @__PURE__ */ new Set();
|
|
27
|
+
for (let i = 0; i < tokenized.length && totalCandidates < config.maxPerRun; i++) {
|
|
28
|
+
if (clustered.has(tokenized[i].memory.frontmatter.id)) continue;
|
|
29
|
+
const cluster = [tokenized[i].memory];
|
|
30
|
+
let totalOverlap = 0;
|
|
31
|
+
let comparisons = 0;
|
|
32
|
+
for (let j = i + 1; j < tokenized.length; j++) {
|
|
33
|
+
if (clustered.has(tokenized[j].memory.frontmatter.id)) continue;
|
|
34
|
+
const aTokens = tokenized[i].tokens;
|
|
35
|
+
const bTokens = tokenized[j].tokens;
|
|
36
|
+
if (aTokens.size === 0 || bTokens.size === 0) continue;
|
|
37
|
+
const overlap = countRecallTokenOverlap(aTokens, [...bTokens].join(" "));
|
|
38
|
+
const maxTokens = Math.max(aTokens.size, bTokens.size);
|
|
39
|
+
const score = maxTokens > 0 ? overlap / maxTokens : 0;
|
|
40
|
+
if (score >= config.threshold) {
|
|
41
|
+
cluster.push(tokenized[j].memory);
|
|
42
|
+
totalOverlap += score;
|
|
43
|
+
comparisons++;
|
|
44
|
+
if (totalCandidates + cluster.length >= config.maxPerRun) break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (cluster.length >= config.minClusterSize) {
|
|
48
|
+
for (const m of cluster) clustered.add(m.frontmatter.id);
|
|
49
|
+
clusters.push({
|
|
50
|
+
category,
|
|
51
|
+
memories: cluster,
|
|
52
|
+
overlapScore: comparisons > 0 ? totalOverlap / comparisons : 0
|
|
53
|
+
});
|
|
54
|
+
totalCandidates += cluster.length;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return clusters;
|
|
59
|
+
}
|
|
60
|
+
function buildConsolidationPrompt(cluster) {
|
|
61
|
+
const memoryTexts = cluster.memories.map(
|
|
62
|
+
(m, i) => `Memory ${i + 1} (${m.frontmatter.id}, created ${m.frontmatter.created}):
|
|
63
|
+
${m.content}`
|
|
64
|
+
).join("\n\n");
|
|
65
|
+
return `You are a memory consolidation system. The following ${cluster.memories.length} memories in the "${cluster.category}" category contain overlapping information.
|
|
66
|
+
|
|
67
|
+
Synthesize them into ONE canonical memory that:
|
|
68
|
+
1. Preserves ALL unique information from every source memory
|
|
69
|
+
2. Removes redundancy and repetition
|
|
70
|
+
3. Uses clear, concise language
|
|
71
|
+
4. Maintains the same category and tone
|
|
72
|
+
5. Does NOT add information that isn't in the sources
|
|
73
|
+
|
|
74
|
+
${memoryTexts}
|
|
75
|
+
|
|
76
|
+
Write ONLY the consolidated memory content (no metadata, no explanation, no preamble):`;
|
|
77
|
+
}
|
|
78
|
+
function parseConsolidationResponse(response) {
|
|
79
|
+
return response.trim();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export {
|
|
83
|
+
findSimilarClusters,
|
|
84
|
+
buildConsolidationPrompt,
|
|
85
|
+
parseConsolidationResponse
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=chunk-2CJCWDMR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/semantic-consolidation.ts"],"sourcesContent":["/**\n * semantic-consolidation.ts — Semantic Consolidation Engine\n *\n * Finds clusters of semantically similar memories using token overlap,\n * synthesizes canonical versions via LLM, and archives the originals.\n * Reduces memory store bloat while preserving all unique information.\n */\n\nimport { log } from \"./logger.js\";\nimport type { MemoryFile } from \"./types.js\";\nimport { normalizeRecallTokens, countRecallTokenOverlap } from \"./recall-tokenization.js\";\n\nexport interface ConsolidationCluster {\n category: string;\n memories: MemoryFile[];\n overlapScore: number;\n canonicalContent?: string;\n}\n\nexport interface SemanticConsolidationResult {\n clustersFound: number;\n memoriesConsolidated: number;\n memoriesArchived: number;\n errors: number;\n clusters: ConsolidationCluster[];\n}\n\n/**\n * Find clusters of semantically similar memories using token overlap.\n */\nexport function findSimilarClusters(\n memories: MemoryFile[],\n config: {\n threshold: number;\n minClusterSize: number;\n excludeCategories: string[];\n maxPerRun: number;\n },\n): ConsolidationCluster[] {\n const excluded = new Set(config.excludeCategories);\n\n // Group by category first\n const byCategory = new Map<string, MemoryFile[]>();\n for (const m of memories) {\n const cat = m.frontmatter.category;\n if (excluded.has(cat)) continue;\n if (m.frontmatter.status && m.frontmatter.status !== \"active\") continue;\n const list = byCategory.get(cat) ?? [];\n list.push(m);\n byCategory.set(cat, list);\n }\n\n const clusters: ConsolidationCluster[] = [];\n let totalCandidates = 0;\n\n for (const [category, mems] of byCategory) {\n if (totalCandidates >= config.maxPerRun) break;\n\n // Token-normalize all memories in this category\n const tokenized = mems.map((m) => ({\n memory: m,\n tokens: new Set(normalizeRecallTokens(m.content, [])),\n }));\n\n // Track which memories are already clustered\n const clustered = new Set<string>();\n\n for (let i = 0; i < tokenized.length && totalCandidates < config.maxPerRun; i++) {\n if (clustered.has(tokenized[i].memory.frontmatter.id)) continue;\n\n const cluster: MemoryFile[] = [tokenized[i].memory];\n let totalOverlap = 0;\n let comparisons = 0;\n\n for (let j = i + 1; j < tokenized.length; j++) {\n if (clustered.has(tokenized[j].memory.frontmatter.id)) continue;\n\n const aTokens = tokenized[i].tokens;\n const bTokens = tokenized[j].tokens;\n if (aTokens.size === 0 || bTokens.size === 0) continue;\n\n // Bidirectional overlap: what fraction of tokens are shared\n const overlap = countRecallTokenOverlap(aTokens, [...bTokens].join(\" \"));\n const maxTokens = Math.max(aTokens.size, bTokens.size);\n const score = maxTokens > 0 ? overlap / maxTokens : 0;\n\n if (score >= config.threshold) {\n cluster.push(tokenized[j].memory);\n totalOverlap += score;\n comparisons++;\n // Enforce maxPerRun within a single cluster\n if (totalCandidates + cluster.length >= config.maxPerRun) break;\n }\n }\n\n if (cluster.length >= config.minClusterSize) {\n for (const m of cluster) clustered.add(m.frontmatter.id);\n clusters.push({\n category,\n memories: cluster,\n overlapScore: comparisons > 0 ? totalOverlap / comparisons : 0,\n });\n totalCandidates += cluster.length;\n }\n }\n }\n\n return clusters;\n}\n\n/**\n * Build the LLM prompt for synthesizing a canonical memory from a cluster.\n */\nexport function buildConsolidationPrompt(cluster: ConsolidationCluster): string {\n const memoryTexts = cluster.memories\n .map(\n (m, i) =>\n `Memory ${i + 1} (${m.frontmatter.id}, created ${m.frontmatter.created}):\\n${m.content}`,\n )\n .join(\"\\n\\n\");\n\n return `You are a memory consolidation system. The following ${cluster.memories.length} memories in the \"${cluster.category}\" category contain overlapping information.\n\nSynthesize them into ONE canonical memory that:\n1. Preserves ALL unique information from every source memory\n2. Removes redundancy and repetition\n3. Uses clear, concise language\n4. Maintains the same category and tone\n5. Does NOT add information that isn't in the sources\n\n${memoryTexts}\n\nWrite ONLY the consolidated memory content (no metadata, no explanation, no preamble):`;\n}\n\n/**\n * Parse the LLM response to extract the canonical content.\n */\nexport function parseConsolidationResponse(response: string): string {\n return response.trim();\n}\n"],"mappings":";;;;;;AA8BO,SAAS,oBACd,UACA,QAMwB;AACxB,QAAM,WAAW,IAAI,IAAI,OAAO,iBAAiB;AAGjD,QAAM,aAAa,oBAAI,IAA0B;AACjD,aAAW,KAAK,UAAU;AACxB,UAAM,MAAM,EAAE,YAAY;AAC1B,QAAI,SAAS,IAAI,GAAG,EAAG;AACvB,QAAI,EAAE,YAAY,UAAU,EAAE,YAAY,WAAW,SAAU;AAC/D,UAAM,OAAO,WAAW,IAAI,GAAG,KAAK,CAAC;AACrC,SAAK,KAAK,CAAC;AACX,eAAW,IAAI,KAAK,IAAI;AAAA,EAC1B;AAEA,QAAM,WAAmC,CAAC;AAC1C,MAAI,kBAAkB;AAEtB,aAAW,CAAC,UAAU,IAAI,KAAK,YAAY;AACzC,QAAI,mBAAmB,OAAO,UAAW;AAGzC,UAAM,YAAY,KAAK,IAAI,CAAC,OAAO;AAAA,MACjC,QAAQ;AAAA,MACR,QAAQ,IAAI,IAAI,sBAAsB,EAAE,SAAS,CAAC,CAAC,CAAC;AAAA,IACtD,EAAE;AAGF,UAAM,YAAY,oBAAI,IAAY;AAElC,aAAS,IAAI,GAAG,IAAI,UAAU,UAAU,kBAAkB,OAAO,WAAW,KAAK;AAC/E,UAAI,UAAU,IAAI,UAAU,CAAC,EAAE,OAAO,YAAY,EAAE,EAAG;AAEvD,YAAM,UAAwB,CAAC,UAAU,CAAC,EAAE,MAAM;AAClD,UAAI,eAAe;AACnB,UAAI,cAAc;AAElB,eAAS,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AAC7C,YAAI,UAAU,IAAI,UAAU,CAAC,EAAE,OAAO,YAAY,EAAE,EAAG;AAEvD,cAAM,UAAU,UAAU,CAAC,EAAE;AAC7B,cAAM,UAAU,UAAU,CAAC,EAAE;AAC7B,YAAI,QAAQ,SAAS,KAAK,QAAQ,SAAS,EAAG;AAG9C,cAAM,UAAU,wBAAwB,SAAS,CAAC,GAAG,OAAO,EAAE,KAAK,GAAG,CAAC;AACvE,cAAM,YAAY,KAAK,IAAI,QAAQ,MAAM,QAAQ,IAAI;AACrD,cAAM,QAAQ,YAAY,IAAI,UAAU,YAAY;AAEpD,YAAI,SAAS,OAAO,WAAW;AAC7B,kBAAQ,KAAK,UAAU,CAAC,EAAE,MAAM;AAChC,0BAAgB;AAChB;AAEA,cAAI,kBAAkB,QAAQ,UAAU,OAAO,UAAW;AAAA,QAC5D;AAAA,MACF;AAEA,UAAI,QAAQ,UAAU,OAAO,gBAAgB;AAC3C,mBAAW,KAAK,QAAS,WAAU,IAAI,EAAE,YAAY,EAAE;AACvD,iBAAS,KAAK;AAAA,UACZ;AAAA,UACA,UAAU;AAAA,UACV,cAAc,cAAc,IAAI,eAAe,cAAc;AAAA,QAC/D,CAAC;AACD,2BAAmB,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,yBAAyB,SAAuC;AAC9E,QAAM,cAAc,QAAQ,SACzB;AAAA,IACC,CAAC,GAAG,MACF,UAAU,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,OAAO;AAAA,EAAO,EAAE,OAAO;AAAA,EAC1F,EACC,KAAK,MAAM;AAEd,SAAO,wDAAwD,QAAQ,SAAS,MAAM,qBAAqB,QAAQ,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS3H,WAAW;AAAA;AAAA;AAGb;AAKO,SAAS,2BAA2B,UAA0B;AACnE,SAAO,SAAS,KAAK;AACvB;","names":[]}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
// src/compression-optimizer.ts
|
|
2
|
+
var MAX_DELTA = 0.15;
|
|
3
|
+
var SPARSE_SAMPLE = 5;
|
|
4
|
+
function clamp(value, min, max) {
|
|
5
|
+
return Math.min(max, Math.max(min, value));
|
|
6
|
+
}
|
|
7
|
+
function parseRecallQuality(reason) {
|
|
8
|
+
if (!reason) return "unknown";
|
|
9
|
+
const text = reason.toLowerCase();
|
|
10
|
+
if (/(recall[_\s-]?good|quality[:=]\s*(good|high)|improv(ed|e)|resolved)/i.test(text)) {
|
|
11
|
+
return "good";
|
|
12
|
+
}
|
|
13
|
+
if (/(recall[_\s-]?poor|quality[:=]\s*(poor|low)|degrad(ed|e)|miss(ed|ing)|irrelevant)/i.test(text)) {
|
|
14
|
+
return "poor";
|
|
15
|
+
}
|
|
16
|
+
return "unknown";
|
|
17
|
+
}
|
|
18
|
+
function nextGuidelineVersion(previousState) {
|
|
19
|
+
if (!previousState) return 1;
|
|
20
|
+
return Math.max(1, previousState.guidelineVersion + 1);
|
|
21
|
+
}
|
|
22
|
+
function nextOptimizerVersion(previousState) {
|
|
23
|
+
if (!previousState) return 1;
|
|
24
|
+
return Math.max(1, previousState.version + 1);
|
|
25
|
+
}
|
|
26
|
+
function roundDelta(value) {
|
|
27
|
+
return Math.round(value * 1e3) / 1e3;
|
|
28
|
+
}
|
|
29
|
+
function confidenceForDelta(delta) {
|
|
30
|
+
const magnitude = Math.abs(delta);
|
|
31
|
+
return magnitude >= 0.09 ? "high" : magnitude >= 0.04 ? "medium" : "low";
|
|
32
|
+
}
|
|
33
|
+
function directionForDelta(delta) {
|
|
34
|
+
return delta > 0 ? "increase" : delta < 0 ? "decrease" : "hold";
|
|
35
|
+
}
|
|
36
|
+
function computeCompressionGuidelineCandidate(events, options = {}) {
|
|
37
|
+
const generatedAt = options.generatedAtIso ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
38
|
+
const previousState = options.previousState ?? null;
|
|
39
|
+
const effectiveEvents = events.filter((event) => event.dryRun !== true);
|
|
40
|
+
const totalCounts = {
|
|
41
|
+
total: effectiveEvents.length,
|
|
42
|
+
applied: 0,
|
|
43
|
+
skipped: 0,
|
|
44
|
+
failed: 0
|
|
45
|
+
};
|
|
46
|
+
const actionMap = /* @__PURE__ */ new Map();
|
|
47
|
+
let windowFrom = effectiveEvents[0]?.timestamp ?? generatedAt;
|
|
48
|
+
let windowTo = effectiveEvents[0]?.timestamp ?? generatedAt;
|
|
49
|
+
for (const event of effectiveEvents) {
|
|
50
|
+
if (event.timestamp < windowFrom) windowFrom = event.timestamp;
|
|
51
|
+
if (event.timestamp > windowTo) windowTo = event.timestamp;
|
|
52
|
+
totalCounts[event.outcome] += 1;
|
|
53
|
+
let summary = actionMap.get(event.action);
|
|
54
|
+
if (!summary) {
|
|
55
|
+
summary = {
|
|
56
|
+
action: event.action,
|
|
57
|
+
total: 0,
|
|
58
|
+
outcomes: { applied: 0, skipped: 0, failed: 0 },
|
|
59
|
+
quality: { good: 0, poor: 0, unknown: 0 }
|
|
60
|
+
};
|
|
61
|
+
actionMap.set(event.action, summary);
|
|
62
|
+
}
|
|
63
|
+
summary.total += 1;
|
|
64
|
+
summary.outcomes[event.outcome] += 1;
|
|
65
|
+
const quality = parseRecallQuality(event.reason);
|
|
66
|
+
summary.quality[quality] += 1;
|
|
67
|
+
}
|
|
68
|
+
const actionSummaries = [...actionMap.values()].sort((a, b) => {
|
|
69
|
+
if (b.total !== a.total) return b.total - a.total;
|
|
70
|
+
return a.action.localeCompare(b.action);
|
|
71
|
+
});
|
|
72
|
+
const ruleUpdates = actionSummaries.map((summary) => {
|
|
73
|
+
const notes = [];
|
|
74
|
+
if (summary.total < SPARSE_SAMPLE) {
|
|
75
|
+
notes.push("Sparse sample size; holding baseline policy.");
|
|
76
|
+
return {
|
|
77
|
+
action: summary.action,
|
|
78
|
+
delta: 0,
|
|
79
|
+
direction: "hold",
|
|
80
|
+
confidence: "low",
|
|
81
|
+
notes
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
const successRate = summary.outcomes.applied / summary.total;
|
|
85
|
+
const failureRate = summary.outcomes.failed / summary.total;
|
|
86
|
+
const qualitySeen = summary.quality.good + summary.quality.poor;
|
|
87
|
+
const qualitySignal = qualitySeen > 0 ? (summary.quality.good - summary.quality.poor) / qualitySeen : 0;
|
|
88
|
+
const rawDelta = clamp((successRate - failureRate) * 0.12 + qualitySignal * 0.06, -MAX_DELTA, MAX_DELTA);
|
|
89
|
+
const delta = roundDelta(rawDelta);
|
|
90
|
+
const direction = directionForDelta(delta);
|
|
91
|
+
if (direction === "decrease" && summary.outcomes.failed > summary.outcomes.applied) {
|
|
92
|
+
notes.push("Failures exceed applied outcomes; conservative down-adjustment.");
|
|
93
|
+
} else if (direction === "increase" && summary.quality.good > summary.quality.poor) {
|
|
94
|
+
notes.push("Good recall quality markers support this action.");
|
|
95
|
+
} else if (direction === "decrease" && summary.quality.poor > summary.quality.good) {
|
|
96
|
+
notes.push("Poor recall quality markers exceed good markers.");
|
|
97
|
+
} else {
|
|
98
|
+
notes.push("Outcomes are stable; keep bounded adjustments.");
|
|
99
|
+
}
|
|
100
|
+
const confidence = confidenceForDelta(delta);
|
|
101
|
+
return {
|
|
102
|
+
action: summary.action,
|
|
103
|
+
delta,
|
|
104
|
+
direction,
|
|
105
|
+
confidence,
|
|
106
|
+
notes
|
|
107
|
+
};
|
|
108
|
+
});
|
|
109
|
+
return {
|
|
110
|
+
generatedAt,
|
|
111
|
+
sourceWindow: {
|
|
112
|
+
from: effectiveEvents.length > 0 ? windowFrom : generatedAt,
|
|
113
|
+
to: effectiveEvents.length > 0 ? windowTo : generatedAt
|
|
114
|
+
},
|
|
115
|
+
eventCounts: totalCounts,
|
|
116
|
+
actionSummaries,
|
|
117
|
+
ruleUpdates,
|
|
118
|
+
guidelineVersion: nextGuidelineVersion(previousState),
|
|
119
|
+
optimizerVersion: nextOptimizerVersion(previousState)
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
async function refineCompressionGuidelineCandidateSemantically(baseline, options) {
|
|
123
|
+
if (!options.enabled) return baseline;
|
|
124
|
+
if (typeof options.runRefinement !== "function") return baseline;
|
|
125
|
+
const timeoutMs = Math.max(1, Math.floor(options.timeoutMs));
|
|
126
|
+
let timeoutId = null;
|
|
127
|
+
const timeout = new Promise((resolve) => {
|
|
128
|
+
timeoutId = setTimeout(() => resolve(null), timeoutMs);
|
|
129
|
+
});
|
|
130
|
+
const refinementPromise = options.runRefinement(baseline).catch(() => null);
|
|
131
|
+
let refinement = null;
|
|
132
|
+
try {
|
|
133
|
+
refinement = await Promise.race([refinementPromise, timeout]);
|
|
134
|
+
} catch {
|
|
135
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
136
|
+
return baseline;
|
|
137
|
+
}
|
|
138
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
139
|
+
if (!refinement || !Array.isArray(refinement.updates) || refinement.updates.length === 0) {
|
|
140
|
+
return baseline;
|
|
141
|
+
}
|
|
142
|
+
const updatesByAction = /* @__PURE__ */ new Map();
|
|
143
|
+
for (const update of refinement.updates) {
|
|
144
|
+
if (!update || typeof update.action !== "string") continue;
|
|
145
|
+
updatesByAction.set(update.action, update);
|
|
146
|
+
}
|
|
147
|
+
let changed = false;
|
|
148
|
+
const ruleUpdates = baseline.ruleUpdates.map((rule) => {
|
|
149
|
+
const patch = updatesByAction.get(rule.action);
|
|
150
|
+
if (!patch) return rule;
|
|
151
|
+
const nextDelta = typeof patch.delta === "number" && Number.isFinite(patch.delta) ? roundDelta(clamp(patch.delta, -MAX_DELTA, MAX_DELTA)) : rule.delta;
|
|
152
|
+
const nextConfidence = patch.confidence ?? confidenceForDelta(nextDelta);
|
|
153
|
+
const nextDirection = directionForDelta(nextDelta);
|
|
154
|
+
const nextNotes = typeof patch.note === "string" && patch.note.trim().length > 0 ? [patch.note.trim()] : rule.notes;
|
|
155
|
+
if (nextDelta !== rule.delta || nextDirection !== rule.direction || nextConfidence !== rule.confidence || nextNotes.join("\n") !== rule.notes.join("\n")) {
|
|
156
|
+
changed = true;
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
...rule,
|
|
160
|
+
delta: nextDelta,
|
|
161
|
+
direction: nextDirection,
|
|
162
|
+
confidence: nextConfidence,
|
|
163
|
+
notes: nextNotes
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
if (!changed) return baseline;
|
|
167
|
+
return {
|
|
168
|
+
...baseline,
|
|
169
|
+
ruleUpdates
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function renderCompressionGuidelinesMarkdown(candidate) {
|
|
173
|
+
const actionLines = candidate.actionSummaries.length === 0 ? ["- (none)"] : candidate.actionSummaries.map((item) => `- ${item.action}: ${item.total}`);
|
|
174
|
+
const outcomeLines = [
|
|
175
|
+
`- applied: ${candidate.eventCounts.applied}`,
|
|
176
|
+
`- skipped: ${candidate.eventCounts.skipped}`,
|
|
177
|
+
`- failed: ${candidate.eventCounts.failed}`
|
|
178
|
+
];
|
|
179
|
+
const updateLines = candidate.ruleUpdates.length === 0 ? ["- No telemetry events available yet. Keep defaults conservative and gather action data first."] : candidate.ruleUpdates.map((update) => {
|
|
180
|
+
const sign = update.delta > 0 ? "+" : "";
|
|
181
|
+
return `- ${update.action}: ${update.direction} (${sign}${update.delta.toFixed(3)}, confidence=${update.confidence}) \u2014 ${update.notes.join(" ")}`;
|
|
182
|
+
});
|
|
183
|
+
return [
|
|
184
|
+
"# Compression Guidelines",
|
|
185
|
+
"",
|
|
186
|
+
`Generated: ${candidate.generatedAt}`,
|
|
187
|
+
`Source events analyzed: ${candidate.eventCounts.total}`,
|
|
188
|
+
`Source window: ${candidate.sourceWindow.from} -> ${candidate.sourceWindow.to}`,
|
|
189
|
+
`Guideline version: ${candidate.guidelineVersion}`,
|
|
190
|
+
"",
|
|
191
|
+
"## Action Distribution",
|
|
192
|
+
...actionLines,
|
|
193
|
+
"",
|
|
194
|
+
"## Outcome Distribution",
|
|
195
|
+
...outcomeLines,
|
|
196
|
+
"",
|
|
197
|
+
"## Suggested Guidelines",
|
|
198
|
+
...updateLines,
|
|
199
|
+
""
|
|
200
|
+
].join("\n");
|
|
201
|
+
}
|
|
202
|
+
function buildCompressionGuidelinesMarkdown(events, generatedAtIso = (/* @__PURE__ */ new Date()).toISOString(), previousState = null) {
|
|
203
|
+
const candidate = computeCompressionGuidelineCandidate(events, {
|
|
204
|
+
generatedAtIso,
|
|
205
|
+
previousState
|
|
206
|
+
});
|
|
207
|
+
return renderCompressionGuidelinesMarkdown(candidate);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export {
|
|
211
|
+
computeCompressionGuidelineCandidate,
|
|
212
|
+
refineCompressionGuidelineCandidateSemantically,
|
|
213
|
+
renderCompressionGuidelinesMarkdown,
|
|
214
|
+
buildCompressionGuidelinesMarkdown
|
|
215
|
+
};
|
|
216
|
+
//# sourceMappingURL=chunk-2NMMFZ5T.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/compression-optimizer.ts"],"sourcesContent":["import type {\n CompressionGuidelineOptimizerActionSummary,\n CompressionGuidelineOptimizerEventCounts,\n CompressionGuidelineOptimizerRuleUpdate,\n CompressionGuidelineOptimizerState,\n MemoryActionEvent,\n MemoryActionOutcome,\n MemoryActionType,\n} from \"./types.js\";\n\nexport interface CompressionGuidelineCandidate {\n generatedAt: string;\n sourceWindow: {\n from: string;\n to: string;\n };\n eventCounts: CompressionGuidelineOptimizerEventCounts;\n actionSummaries: CompressionGuidelineOptimizerActionSummary[];\n ruleUpdates: CompressionGuidelineOptimizerRuleUpdate[];\n guidelineVersion: number;\n optimizerVersion: number;\n}\n\nexport interface CompressionSemanticRuleRefinement {\n action: MemoryActionType;\n delta?: number;\n confidence?: \"low\" | \"medium\" | \"high\";\n note?: string;\n}\n\nexport interface CompressionSemanticRefinementResult {\n updates: CompressionSemanticRuleRefinement[];\n}\n\nexport interface CompressionSemanticRefinementOptions {\n enabled: boolean;\n timeoutMs: number;\n runRefinement?: (\n candidate: CompressionGuidelineCandidate,\n ) => Promise<CompressionSemanticRefinementResult | null>;\n}\n\nconst MAX_DELTA = 0.15;\nconst SPARSE_SAMPLE = 5;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction parseRecallQuality(reason: string | undefined): \"good\" | \"poor\" | \"unknown\" {\n if (!reason) return \"unknown\";\n const text = reason.toLowerCase();\n if (/(recall[_\\s-]?good|quality[:=]\\s*(good|high)|improv(ed|e)|resolved)/i.test(text)) {\n return \"good\";\n }\n if (/(recall[_\\s-]?poor|quality[:=]\\s*(poor|low)|degrad(ed|e)|miss(ed|ing)|irrelevant)/i.test(text)) {\n return \"poor\";\n }\n return \"unknown\";\n}\n\nfunction nextGuidelineVersion(previousState: CompressionGuidelineOptimizerState | null): number {\n if (!previousState) return 1;\n return Math.max(1, previousState.guidelineVersion + 1);\n}\n\nfunction nextOptimizerVersion(previousState: CompressionGuidelineOptimizerState | null): number {\n if (!previousState) return 1;\n return Math.max(1, previousState.version + 1);\n}\n\nfunction roundDelta(value: number): number {\n return Math.round(value * 1000) / 1000;\n}\n\nfunction confidenceForDelta(delta: number): \"low\" | \"medium\" | \"high\" {\n const magnitude = Math.abs(delta);\n return magnitude >= 0.09 ? \"high\" : magnitude >= 0.04 ? \"medium\" : \"low\";\n}\n\nfunction directionForDelta(delta: number): \"increase\" | \"decrease\" | \"hold\" {\n return delta > 0 ? \"increase\" : delta < 0 ? \"decrease\" : \"hold\";\n}\n\nexport function computeCompressionGuidelineCandidate(\n events: MemoryActionEvent[],\n options: {\n generatedAtIso?: string;\n previousState?: CompressionGuidelineOptimizerState | null;\n } = {},\n): CompressionGuidelineCandidate {\n const generatedAt = options.generatedAtIso ?? new Date().toISOString();\n const previousState = options.previousState ?? null;\n const effectiveEvents = events.filter((event) => event.dryRun !== true);\n const totalCounts: CompressionGuidelineOptimizerEventCounts = {\n total: effectiveEvents.length,\n applied: 0,\n skipped: 0,\n failed: 0,\n };\n\n const actionMap = new Map<MemoryActionType, CompressionGuidelineOptimizerActionSummary>();\n let windowFrom = effectiveEvents[0]?.timestamp ?? generatedAt;\n let windowTo = effectiveEvents[0]?.timestamp ?? generatedAt;\n\n for (const event of effectiveEvents) {\n if (event.timestamp < windowFrom) windowFrom = event.timestamp;\n if (event.timestamp > windowTo) windowTo = event.timestamp;\n totalCounts[event.outcome] += 1;\n\n let summary = actionMap.get(event.action);\n if (!summary) {\n summary = {\n action: event.action,\n total: 0,\n outcomes: { applied: 0, skipped: 0, failed: 0 },\n quality: { good: 0, poor: 0, unknown: 0 },\n };\n actionMap.set(event.action, summary);\n }\n\n summary.total += 1;\n summary.outcomes[event.outcome] += 1;\n const quality = parseRecallQuality(event.reason);\n summary.quality[quality] += 1;\n }\n\n const actionSummaries = [...actionMap.values()].sort((a, b) => {\n if (b.total !== a.total) return b.total - a.total;\n return a.action.localeCompare(b.action);\n });\n\n const ruleUpdates = actionSummaries.map((summary): CompressionGuidelineOptimizerRuleUpdate => {\n const notes: string[] = [];\n if (summary.total < SPARSE_SAMPLE) {\n notes.push(\"Sparse sample size; holding baseline policy.\");\n return {\n action: summary.action,\n delta: 0,\n direction: \"hold\",\n confidence: \"low\",\n notes,\n };\n }\n\n const successRate = summary.outcomes.applied / summary.total;\n const failureRate = summary.outcomes.failed / summary.total;\n const qualitySeen = summary.quality.good + summary.quality.poor;\n const qualitySignal = qualitySeen > 0\n ? (summary.quality.good - summary.quality.poor) / qualitySeen\n : 0;\n const rawDelta = clamp((successRate - failureRate) * 0.12 + qualitySignal * 0.06, -MAX_DELTA, MAX_DELTA);\n const delta = roundDelta(rawDelta);\n\n const direction = directionForDelta(delta);\n if (direction === \"decrease\" && summary.outcomes.failed > summary.outcomes.applied) {\n notes.push(\"Failures exceed applied outcomes; conservative down-adjustment.\");\n } else if (direction === \"increase\" && summary.quality.good > summary.quality.poor) {\n notes.push(\"Good recall quality markers support this action.\");\n } else if (direction === \"decrease\" && summary.quality.poor > summary.quality.good) {\n notes.push(\"Poor recall quality markers exceed good markers.\");\n } else {\n notes.push(\"Outcomes are stable; keep bounded adjustments.\");\n }\n\n const confidence = confidenceForDelta(delta);\n return {\n action: summary.action,\n delta,\n direction,\n confidence,\n notes,\n };\n });\n\n return {\n generatedAt,\n sourceWindow: {\n from: effectiveEvents.length > 0 ? windowFrom : generatedAt,\n to: effectiveEvents.length > 0 ? windowTo : generatedAt,\n },\n eventCounts: totalCounts,\n actionSummaries,\n ruleUpdates,\n guidelineVersion: nextGuidelineVersion(previousState),\n optimizerVersion: nextOptimizerVersion(previousState),\n };\n}\n\nexport async function refineCompressionGuidelineCandidateSemantically(\n baseline: CompressionGuidelineCandidate,\n options: CompressionSemanticRefinementOptions,\n): Promise<CompressionGuidelineCandidate> {\n if (!options.enabled) return baseline;\n if (typeof options.runRefinement !== \"function\") return baseline;\n\n const timeoutMs = Math.max(1, Math.floor(options.timeoutMs));\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n const timeout = new Promise<CompressionSemanticRefinementResult | null>((resolve) => {\n timeoutId = setTimeout(() => resolve(null), timeoutMs);\n });\n\n const refinementPromise = options.runRefinement(baseline).catch(() => null);\n\n let refinement: CompressionSemanticRefinementResult | null = null;\n try {\n refinement = await Promise.race([refinementPromise, timeout]);\n } catch {\n if (timeoutId) clearTimeout(timeoutId);\n return baseline;\n }\n if (timeoutId) clearTimeout(timeoutId);\n if (!refinement || !Array.isArray(refinement.updates) || refinement.updates.length === 0) {\n return baseline;\n }\n\n const updatesByAction = new Map<MemoryActionType, CompressionSemanticRuleRefinement>();\n for (const update of refinement.updates) {\n if (!update || typeof update.action !== \"string\") continue;\n updatesByAction.set(update.action, update);\n }\n\n let changed = false;\n const ruleUpdates = baseline.ruleUpdates.map((rule) => {\n const patch = updatesByAction.get(rule.action);\n if (!patch) return rule;\n\n const nextDelta =\n typeof patch.delta === \"number\" && Number.isFinite(patch.delta)\n ? roundDelta(clamp(patch.delta, -MAX_DELTA, MAX_DELTA))\n : rule.delta;\n const nextConfidence = patch.confidence ?? confidenceForDelta(nextDelta);\n const nextDirection = directionForDelta(nextDelta);\n const nextNotes =\n typeof patch.note === \"string\" && patch.note.trim().length > 0\n ? [patch.note.trim()]\n : rule.notes;\n\n if (\n nextDelta !== rule.delta ||\n nextDirection !== rule.direction ||\n nextConfidence !== rule.confidence ||\n nextNotes.join(\"\\n\") !== rule.notes.join(\"\\n\")\n ) {\n changed = true;\n }\n\n return {\n ...rule,\n delta: nextDelta,\n direction: nextDirection,\n confidence: nextConfidence,\n notes: nextNotes,\n };\n });\n\n if (!changed) return baseline;\n return {\n ...baseline,\n ruleUpdates,\n };\n}\n\nexport function renderCompressionGuidelinesMarkdown(candidate: CompressionGuidelineCandidate): string {\n const actionLines =\n candidate.actionSummaries.length === 0\n ? [\"- (none)\"]\n : candidate.actionSummaries.map((item) => `- ${item.action}: ${item.total}`);\n const outcomeLines: string[] = [\n `- applied: ${candidate.eventCounts.applied}`,\n `- skipped: ${candidate.eventCounts.skipped}`,\n `- failed: ${candidate.eventCounts.failed}`,\n ];\n const updateLines =\n candidate.ruleUpdates.length === 0\n ? [\"- No telemetry events available yet. Keep defaults conservative and gather action data first.\"]\n : candidate.ruleUpdates.map((update) => {\n const sign = update.delta > 0 ? \"+\" : \"\";\n return `- ${update.action}: ${update.direction} (${sign}${update.delta.toFixed(3)}, confidence=${update.confidence}) — ${update.notes.join(\" \")}`;\n });\n\n return [\n \"# Compression Guidelines\",\n \"\",\n `Generated: ${candidate.generatedAt}`,\n `Source events analyzed: ${candidate.eventCounts.total}`,\n `Source window: ${candidate.sourceWindow.from} -> ${candidate.sourceWindow.to}`,\n `Guideline version: ${candidate.guidelineVersion}`,\n \"\",\n \"## Action Distribution\",\n ...actionLines,\n \"\",\n \"## Outcome Distribution\",\n ...outcomeLines,\n \"\",\n \"## Suggested Guidelines\",\n ...updateLines,\n \"\",\n ].join(\"\\n\");\n}\n\nexport function buildCompressionGuidelinesMarkdown(\n events: MemoryActionEvent[],\n generatedAtIso: string = new Date().toISOString(),\n previousState: CompressionGuidelineOptimizerState | null = null,\n): string {\n const candidate = computeCompressionGuidelineCandidate(events, {\n generatedAtIso,\n previousState,\n });\n return renderCompressionGuidelinesMarkdown(candidate);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import {
|
|
2
|
+
log
|
|
3
|
+
} from "./chunk-KWBU5S5U.js";
|
|
4
|
+
|
|
5
|
+
// src/day-summary.ts
|
|
6
|
+
import { existsSync } from "fs";
|
|
7
|
+
import { readFile } from "fs/promises";
|
|
8
|
+
import path from "path";
|
|
9
|
+
import { fileURLToPath } from "url";
|
|
10
|
+
var PROMPT_RELATIVE_PATH = path.join("prompts", "day_summary.prompt.md");
|
|
11
|
+
var EMBEDDED_DAY_SUMMARY_PROMPT = `# Baseline day-summary prompt
|
|
12
|
+
|
|
13
|
+
You are writing an Engram end-of-day summary.
|
|
14
|
+
|
|
15
|
+
Your job:
|
|
16
|
+
- compress the day into a short, useful recap
|
|
17
|
+
- prioritize concrete events, decisions, mood/energy signals, and open loops
|
|
18
|
+
- include a few practical next actions for tomorrow
|
|
19
|
+
- avoid hype, fluff, therapy-speak, and invented facts
|
|
20
|
+
|
|
21
|
+
Output JSON with these keys:
|
|
22
|
+
- \`summary\` \u2014 one short paragraph
|
|
23
|
+
- \`bullets\` \u2014 2 to 5 bullets with the most important moments
|
|
24
|
+
- \`next_actions\` \u2014 1 to 3 concrete actions
|
|
25
|
+
- \`risks_or_open_loops\` \u2014 0 to 3 things that still need attention
|
|
26
|
+
|
|
27
|
+
Rules:
|
|
28
|
+
- stay grounded in the input only
|
|
29
|
+
- if the day was mixed, say so plainly
|
|
30
|
+
- do not overstate confidence or importance
|
|
31
|
+
- prefer specific verbs over vague abstractions
|
|
32
|
+
|
|
33
|
+
Brevity:
|
|
34
|
+
- keep the summary under 90 words
|
|
35
|
+
- keep bullets short and information-dense
|
|
36
|
+
- omit anything that does not change what tomorrow should care about
|
|
37
|
+
|
|
38
|
+
Structure:
|
|
39
|
+
- \`summary\` should be one paragraph only
|
|
40
|
+
- \`bullets\` should contain the most important moments, not generic restatements
|
|
41
|
+
- \`next_actions\` and \`risks_or_open_loops\` should be distinct and non-overlapping
|
|
42
|
+
|
|
43
|
+
Risk:
|
|
44
|
+
- explicitly surface unresolved blockers, dependencies, or fragile assumptions
|
|
45
|
+
- do not bury open loops inside the summary if they deserve separate attention
|
|
46
|
+
|
|
47
|
+
Tone:
|
|
48
|
+
- sound like a clear internal daily note, not a report template
|
|
49
|
+
- stay natural and direct while remaining compact`;
|
|
50
|
+
function candidateRoots() {
|
|
51
|
+
const currentFile = fileURLToPath(import.meta.url);
|
|
52
|
+
const here = path.dirname(currentFile);
|
|
53
|
+
const candidates = [path.resolve(here, ".."), path.resolve(here, "..", "..")];
|
|
54
|
+
const seen = /* @__PURE__ */ new Set();
|
|
55
|
+
return candidates.filter((candidate) => {
|
|
56
|
+
const normalized = path.resolve(candidate);
|
|
57
|
+
if (seen.has(normalized)) return false;
|
|
58
|
+
seen.add(normalized);
|
|
59
|
+
return true;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function resolvePromptPath() {
|
|
63
|
+
for (const root of candidateRoots()) {
|
|
64
|
+
const candidate = path.join(root, PROMPT_RELATIVE_PATH);
|
|
65
|
+
if (existsSync(candidate)) {
|
|
66
|
+
return candidate;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
async function loadDaySummaryPrompt() {
|
|
72
|
+
const promptPath = resolvePromptPath();
|
|
73
|
+
if (promptPath) {
|
|
74
|
+
try {
|
|
75
|
+
const raw = await readFile(promptPath, "utf-8");
|
|
76
|
+
const match = raw.match(/```(?:[a-zA-Z0-9_-]+)?\r?\n([\s\S]*?)\r?\n```/);
|
|
77
|
+
if (match?.[1]) {
|
|
78
|
+
return match[1].trim();
|
|
79
|
+
}
|
|
80
|
+
log.warn("day summary prompt file does not contain a fenced prompt block; using embedded fallback");
|
|
81
|
+
} catch (err) {
|
|
82
|
+
log.warn(`day summary prompt file read failed; using embedded fallback: ${err}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return EMBEDDED_DAY_SUMMARY_PROMPT;
|
|
86
|
+
}
|
|
87
|
+
function formatDaySummaryMemories(memories) {
|
|
88
|
+
if (typeof memories === "string") {
|
|
89
|
+
return memories.trim();
|
|
90
|
+
}
|
|
91
|
+
return memories.map((memory) => {
|
|
92
|
+
const category = memory.frontmatter.category || "fact";
|
|
93
|
+
const created = memory.frontmatter.created || "unknown";
|
|
94
|
+
return `[${memory.frontmatter.id}] (${category}, ${created})
|
|
95
|
+
${memory.content}`;
|
|
96
|
+
}).join("\n\n").trim();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export {
|
|
100
|
+
loadDaySummaryPrompt,
|
|
101
|
+
formatDaySummaryMemories
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=chunk-2PO5ZRKV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/day-summary.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { log } from \"./logger.js\";\nimport type { MemoryFile } from \"./types.js\";\n\nconst PROMPT_RELATIVE_PATH = path.join(\"prompts\", \"day_summary.prompt.md\");\n\n// Embedded fallback prompt for packaged/plugin-install builds where\n// prompts/day_summary.prompt.md may not be present in the runtime bundle.\nconst EMBEDDED_DAY_SUMMARY_PROMPT = `# Baseline day-summary prompt\n\nYou are writing an Engram end-of-day summary.\n\nYour job:\n- compress the day into a short, useful recap\n- prioritize concrete events, decisions, mood/energy signals, and open loops\n- include a few practical next actions for tomorrow\n- avoid hype, fluff, therapy-speak, and invented facts\n\nOutput JSON with these keys:\n- \\`summary\\` — one short paragraph\n- \\`bullets\\` — 2 to 5 bullets with the most important moments\n- \\`next_actions\\` — 1 to 3 concrete actions\n- \\`risks_or_open_loops\\` — 0 to 3 things that still need attention\n\nRules:\n- stay grounded in the input only\n- if the day was mixed, say so plainly\n- do not overstate confidence or importance\n- prefer specific verbs over vague abstractions\n\nBrevity:\n- keep the summary under 90 words\n- keep bullets short and information-dense\n- omit anything that does not change what tomorrow should care about\n\nStructure:\n- \\`summary\\` should be one paragraph only\n- \\`bullets\\` should contain the most important moments, not generic restatements\n- \\`next_actions\\` and \\`risks_or_open_loops\\` should be distinct and non-overlapping\n\nRisk:\n- explicitly surface unresolved blockers, dependencies, or fragile assumptions\n- do not bury open loops inside the summary if they deserve separate attention\n\nTone:\n- sound like a clear internal daily note, not a report template\n- stay natural and direct while remaining compact`;\n\nfunction candidateRoots(): string[] {\n const currentFile = fileURLToPath(import.meta.url);\n const here = path.dirname(currentFile);\n const candidates = [path.resolve(here, \"..\"), path.resolve(here, \"..\", \"..\")];\n\n const seen = new Set<string>();\n return candidates.filter((candidate) => {\n const normalized = path.resolve(candidate);\n if (seen.has(normalized)) return false;\n seen.add(normalized);\n return true;\n });\n}\n\nfunction resolvePromptPath(): string | null {\n for (const root of candidateRoots()) {\n const candidate = path.join(root, PROMPT_RELATIVE_PATH);\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nexport async function loadDaySummaryPrompt(): Promise<string> {\n const promptPath = resolvePromptPath();\n if (promptPath) {\n try {\n const raw = await readFile(promptPath, \"utf-8\");\n // CRLF-compatible regex: allow \\r\\n or \\n line endings\n const match = raw.match(/```(?:[a-zA-Z0-9_-]+)?\\r?\\n([\\s\\S]*?)\\r?\\n```/);\n if (match?.[1]) {\n return match[1].trim();\n }\n log.warn(\"day summary prompt file does not contain a fenced prompt block; using embedded fallback\");\n } catch (err) {\n log.warn(`day summary prompt file read failed; using embedded fallback: ${err}`);\n }\n }\n return EMBEDDED_DAY_SUMMARY_PROMPT;\n}\n\nexport function formatDaySummaryMemories(memories: string | MemoryFile[]): string {\n if (typeof memories === \"string\") {\n return memories.trim();\n }\n\n return memories\n .map((memory) => {\n const category = memory.frontmatter.category || \"fact\";\n const created = memory.frontmatter.created || \"unknown\";\n return `[${memory.frontmatter.id}] (${category}, ${created})\\n${memory.content}`;\n })\n .join(\"\\n\\n\")\n .trim();\n}\n"],"mappings":";;;;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB;AACzB,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAI9B,IAAM,uBAAuB,KAAK,KAAK,WAAW,uBAAuB;AAIzE,IAAM,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwCpC,SAAS,iBAA2B;AAClC,QAAM,cAAc,cAAc,YAAY,GAAG;AACjD,QAAM,OAAO,KAAK,QAAQ,WAAW;AACrC,QAAM,aAAa,CAAC,KAAK,QAAQ,MAAM,IAAI,GAAG,KAAK,QAAQ,MAAM,MAAM,IAAI,CAAC;AAE5E,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,WAAW,OAAO,CAAC,cAAc;AACtC,UAAM,aAAa,KAAK,QAAQ,SAAS;AACzC,QAAI,KAAK,IAAI,UAAU,EAAG,QAAO;AACjC,SAAK,IAAI,UAAU;AACnB,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,oBAAmC;AAC1C,aAAW,QAAQ,eAAe,GAAG;AACnC,UAAM,YAAY,KAAK,KAAK,MAAM,oBAAoB;AACtD,QAAI,WAAW,SAAS,GAAG;AACzB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,uBAAwC;AAC5D,QAAM,aAAa,kBAAkB;AACrC,MAAI,YAAY;AACd,QAAI;AACF,YAAM,MAAM,MAAM,SAAS,YAAY,OAAO;AAE9C,YAAM,QAAQ,IAAI,MAAM,+CAA+C;AACvE,UAAI,QAAQ,CAAC,GAAG;AACd,eAAO,MAAM,CAAC,EAAE,KAAK;AAAA,MACvB;AACA,UAAI,KAAK,yFAAyF;AAAA,IACpG,SAAS,KAAK;AACZ,UAAI,KAAK,iEAAiE,GAAG,EAAE;AAAA,IACjF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,yBAAyB,UAAyC;AAChF,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO,SAAS,KAAK;AAAA,EACvB;AAEA,SAAO,SACJ,IAAI,CAAC,WAAW;AACf,UAAM,WAAW,OAAO,YAAY,YAAY;AAChD,UAAM,UAAU,OAAO,YAAY,WAAW;AAC9C,WAAO,IAAI,OAAO,YAAY,EAAE,MAAM,QAAQ,KAAK,OAAO;AAAA,EAAM,OAAO,OAAO;AAAA,EAChF,CAAC,EACA,KAAK,MAAM,EACX,KAAK;AACV;","names":[]}
|