@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/evals.ts"],"sourcesContent":["import path from \"node:path\";\nimport { cp, mkdir, readFile, readdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { listJsonFiles, listNamedFiles, readJsonFile } from \"./json-store.js\";\n\nexport type EvalRunStatus = \"running\" | \"completed\" | \"failed\" | \"partial\";\n\nexport interface EvalBenchmarkCase {\n id: string;\n prompt: string;\n expectedSignals?: string[];\n notes?: string;\n}\n\nexport type EvalBenchmarkType = \"standard\" | \"memory-red-team\";\n\nexport interface EvalBenchmarkManifest {\n schemaVersion: 1;\n benchmarkId: string;\n benchmarkType?: EvalBenchmarkType;\n title: string;\n description?: string;\n tags?: string[];\n sourceLinks?: string[];\n attackClass?: string;\n targetSurface?: string;\n cases: EvalBenchmarkCase[];\n}\n\nexport interface EvalRunMetrics {\n recallPrecisionAtK?: number;\n actionOutcomeScore?: number;\n objectiveStateCoverage?: number;\n causalPathRecall?: number;\n trustViolationRate?: number;\n creationRecoveryScore?: number;\n}\n\nexport interface EvalRunSummary {\n schemaVersion: 1;\n runId: string;\n benchmarkId: string;\n status: EvalRunStatus;\n startedAt: string;\n completedAt?: string;\n totalCases: number;\n passedCases: number;\n failedCases: number;\n metrics?: EvalRunMetrics;\n notes?: string;\n gitRef?: string;\n}\n\nexport interface EvalShadowRecallRecord {\n schemaVersion: 1;\n traceId: string;\n recordedAt: string;\n sessionKey: string;\n promptHash: string;\n promptLength: number;\n retrievalQueryHash: string;\n retrievalQueryLength: number;\n recallMode: \"no_recall\" | \"minimal\" | \"full\" | \"graph_mode\";\n recallResultLimit: number;\n source: \"none\" | \"hot_qmd\" | \"hot_embedding\" | \"cold_fallback\" | \"recent_scan\";\n recalledMemoryCount: number;\n injected: boolean;\n contextChars: number;\n memoryIds: string[];\n policyVersion?: string;\n identityInjectionMode?: \"recovery_only\" | \"minimal\" | \"full\" | \"none\";\n identityInjectedChars?: number;\n identityInjectionTruncated?: boolean;\n durationMs: number;\n timings?: Record<string, string>;\n}\n\nexport interface EvalHarnessStatus {\n enabled: boolean;\n shadowModeEnabled: boolean;\n rootDir: string;\n benchmarkDir: string;\n runsDir: string;\n benchmarks: {\n total: number;\n valid: number;\n invalid: number;\n redTeam: number;\n totalCases: number;\n attackClasses: string[];\n tags: string[];\n targetSurfaces: string[];\n sourceLinks: string[];\n };\n runs: {\n total: number;\n invalid: number;\n completed: number;\n failed: number;\n partial: number;\n running: number;\n latestRunId?: string;\n latestBenchmarkId?: string;\n latestCompletedAt?: string;\n };\n shadows: {\n total: number;\n invalid: number;\n latestTraceId?: string;\n latestRecordedAt?: string;\n latestSessionKey?: string;\n };\n baselines: {\n enabled: boolean;\n total: number;\n invalid: number;\n latestSnapshotId?: string;\n latestCreatedAt?: string;\n latestBenchmarkCount?: number;\n };\n latestRun?: EvalRunSummary;\n latestShadow?: EvalShadowRecallRecord;\n latestBaseline?: EvalBaselineSnapshot;\n invalidBenchmarks: Array<{\n path: string;\n error: string;\n }>;\n invalidRuns: Array<{\n path: string;\n error: string;\n }>;\n invalidShadows: Array<{\n path: string;\n error: string;\n }>;\n invalidBaselines: Array<{\n path: string;\n error: string;\n }>;\n}\n\nexport interface EvalBenchmarkDelta {\n benchmarkId: string;\n baseRunId: string;\n candidateRunId: string;\n basePassRate: number;\n candidatePassRate: number;\n passRateDelta: number;\n metricDeltas: Partial<Record<keyof EvalRunMetrics, number>>;\n regressions: string[];\n improvements: string[];\n}\n\nexport interface EvalCiGateReport {\n passed: boolean;\n baseRootDir: string;\n candidateRootDir: string;\n comparedBenchmarks: number;\n missingCandidateBenchmarks: string[];\n invalidArtifacts: {\n base: {\n benchmarks: number;\n runs: number;\n shadows: number;\n };\n candidate: {\n benchmarks: number;\n runs: number;\n shadows: number;\n };\n };\n regressions: string[];\n improvements: string[];\n deltas: EvalBenchmarkDelta[];\n}\n\nexport interface EvalBaselineDeltaReport {\n passed: boolean;\n baselineSnapshotId: string;\n baselineCreatedAt: string;\n baselineSourceRootDir: string;\n candidateRootDir: string;\n comparedBenchmarks: number;\n missingCandidateBenchmarks: string[];\n invalidArtifacts: {\n candidate: {\n benchmarks: number;\n runs: number;\n shadows: number;\n baselines: number;\n };\n };\n regressions: string[];\n improvements: string[];\n deltas: EvalBenchmarkDelta[];\n markdownReport: string;\n}\n\nexport interface EvalStoredBaselineCiGateReport extends EvalBaselineDeltaReport {\n baseRootDir: string;\n baselineResolvedFrom: \"base\" | \"candidate\";\n}\n\nexport interface EvalBaselineSnapshotBenchmark {\n benchmarkId: string;\n runId: string;\n completedAt?: string;\n gitRef?: string;\n passRate: number;\n metrics?: EvalRunMetrics;\n}\n\nexport interface EvalBaselineSnapshot {\n schemaVersion: 1;\n snapshotId: string;\n createdAt: string;\n sourceRootDir: string;\n benchmarkCount: number;\n benchmarks: EvalBaselineSnapshotBenchmark[];\n notes?: string;\n gitRef?: string;\n}\n\nexport interface EvalBenchmarkPackSummary {\n sourcePath: string;\n manifestPath: string;\n benchmarkId: string;\n benchmarkType: EvalBenchmarkType;\n title: string;\n attackClass?: string;\n targetSurface?: string;\n totalCases: number;\n tags: string[];\n sourceLinks: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction assertString(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${field} must be a non-empty string`);\n }\n return value.trim();\n}\n\nfunction optionalStringArray(value: unknown, field: string): string[] | undefined {\n if (value === undefined) return undefined;\n if (!Array.isArray(value)) {\n throw new Error(`${field} must be an array of strings`);\n }\n const out = value\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n if (out.length !== value.length) {\n throw new Error(`${field} must be an array of non-empty strings`);\n }\n return out;\n}\n\nexport function resolveEvalStoreDir(memoryDir: string, overrideDir?: string): string {\n if (typeof overrideDir === \"string\" && overrideDir.trim().length > 0) {\n return overrideDir.trim();\n }\n return path.join(memoryDir, \"state\", \"evals\");\n}\n\nfunction assertSafePathSegment(value: string, field: string): string {\n if (value === \".\" || value === \"..\" || value.includes(\"/\") || value.includes(\"\\\\\")) {\n throw new Error(`${field} must be a safe path segment`);\n }\n return value;\n}\n\nfunction assertSafeBenchmarkId(benchmarkId: string): string {\n return assertSafePathSegment(benchmarkId, \"benchmarkId\");\n}\n\nexport function validateEvalBenchmarkManifest(\n raw: unknown,\n options?: { memoryRedTeamBenchEnabled?: boolean },\n): EvalBenchmarkManifest {\n if (!isRecord(raw)) throw new Error(\"benchmark manifest must be an object\");\n if (raw.schemaVersion !== 1) throw new Error(\"schemaVersion must be 1\");\n if (!Array.isArray(raw.cases)) throw new Error(\"cases must be an array\");\n const benchmarkTypeRaw =\n typeof raw.benchmarkType === \"string\" && raw.benchmarkType.trim().length > 0\n ? raw.benchmarkType.trim()\n : \"standard\";\n if (![\"standard\", \"memory-red-team\"].includes(benchmarkTypeRaw)) {\n throw new Error(\"benchmarkType must be one of standard|memory-red-team\");\n }\n\n const cases = raw.cases.map((item, index) => {\n if (!isRecord(item)) throw new Error(`cases[${index}] must be an object`);\n return {\n id: assertString(item.id, `cases[${index}].id`),\n prompt: assertString(item.prompt, `cases[${index}].prompt`),\n expectedSignals: optionalStringArray(item.expectedSignals, `cases[${index}].expectedSignals`),\n notes: typeof item.notes === \"string\" && item.notes.trim().length > 0 ? item.notes.trim() : undefined,\n } satisfies EvalBenchmarkCase;\n });\n\n const benchmarkType = benchmarkTypeRaw as EvalBenchmarkType;\n if (benchmarkType === \"memory-red-team\" && options?.memoryRedTeamBenchEnabled !== true) {\n throw new Error(\"memory-red-team benchmark packs require memoryRedTeamBenchEnabled\");\n }\n const attackClass =\n typeof raw.attackClass === \"string\" && raw.attackClass.trim().length > 0\n ? raw.attackClass.trim()\n : undefined;\n const targetSurface =\n typeof raw.targetSurface === \"string\" && raw.targetSurface.trim().length > 0\n ? raw.targetSurface.trim()\n : undefined;\n if (benchmarkType === \"memory-red-team\" && attackClass === undefined) {\n throw new Error(\"attackClass must be a non-empty string\");\n }\n if (benchmarkType === \"memory-red-team\" && targetSurface === undefined) {\n throw new Error(\"targetSurface must be a non-empty string\");\n }\n\n return {\n schemaVersion: 1,\n benchmarkId: assertString(raw.benchmarkId, \"benchmarkId\"),\n benchmarkType,\n title: assertString(raw.title, \"title\"),\n description:\n typeof raw.description === \"string\" && raw.description.trim().length > 0\n ? raw.description.trim()\n : undefined,\n tags: optionalStringArray(raw.tags, \"tags\"),\n sourceLinks: optionalStringArray(raw.sourceLinks, \"sourceLinks\"),\n attackClass,\n targetSurface,\n cases,\n };\n}\n\nexport function validateEvalRunSummary(raw: unknown): EvalRunSummary {\n if (!isRecord(raw)) throw new Error(\"eval run summary must be an object\");\n if (raw.schemaVersion !== 1) throw new Error(\"schemaVersion must be 1\");\n const status = assertString(raw.status, \"status\");\n if (![\"running\", \"completed\", \"failed\", \"partial\"].includes(status)) {\n throw new Error(\"status must be one of running|completed|failed|partial\");\n }\n\n const totalCases = Number(raw.totalCases);\n const passedCases = Number(raw.passedCases);\n const failedCases = Number(raw.failedCases);\n if (!Number.isFinite(totalCases) || totalCases < 0) throw new Error(\"totalCases must be a non-negative number\");\n if (!Number.isFinite(passedCases) || passedCases < 0) throw new Error(\"passedCases must be a non-negative number\");\n if (!Number.isFinite(failedCases) || failedCases < 0) throw new Error(\"failedCases must be a non-negative number\");\n\n const metrics = parseOptionalEvalRunMetrics(raw.metrics);\n\n return {\n schemaVersion: 1,\n runId: assertString(raw.runId, \"runId\"),\n benchmarkId: assertString(raw.benchmarkId, \"benchmarkId\"),\n status: status as EvalRunStatus,\n startedAt: assertString(raw.startedAt, \"startedAt\"),\n completedAt:\n typeof raw.completedAt === \"string\" && raw.completedAt.trim().length > 0\n ? raw.completedAt.trim()\n : undefined,\n totalCases,\n passedCases,\n failedCases,\n metrics,\n notes: typeof raw.notes === \"string\" && raw.notes.trim().length > 0 ? raw.notes.trim() : undefined,\n gitRef: typeof raw.gitRef === \"string\" && raw.gitRef.trim().length > 0 ? raw.gitRef.trim() : undefined,\n };\n}\n\nexport function validateEvalBaselineSnapshot(raw: unknown): EvalBaselineSnapshot {\n if (!isRecord(raw)) throw new Error(\"eval baseline snapshot must be an object\");\n if (raw.schemaVersion !== 1) throw new Error(\"schemaVersion must be 1\");\n if (!Array.isArray(raw.benchmarks)) throw new Error(\"benchmarks must be an array\");\n\n const benchmarks = raw.benchmarks.map((item, index) => {\n if (!isRecord(item)) throw new Error(`benchmarks[${index}] must be an object`);\n const passRate = Number(item.passRate);\n if (!Number.isFinite(passRate) || passRate < 0 || passRate > 1) {\n throw new Error(`benchmarks[${index}].passRate must be a number between 0 and 1`);\n }\n\n const metrics = parseOptionalEvalRunMetrics(item.metrics);\n\n return {\n benchmarkId: assertString(item.benchmarkId, `benchmarks[${index}].benchmarkId`),\n runId: assertString(item.runId, `benchmarks[${index}].runId`),\n completedAt:\n typeof item.completedAt === \"string\" && item.completedAt.trim().length > 0\n ? item.completedAt.trim()\n : undefined,\n gitRef:\n typeof item.gitRef === \"string\" && item.gitRef.trim().length > 0\n ? item.gitRef.trim()\n : undefined,\n passRate,\n metrics,\n } satisfies EvalBaselineSnapshotBenchmark;\n });\n\n const benchmarkCount = Number(raw.benchmarkCount);\n if (!Number.isFinite(benchmarkCount) || benchmarkCount < 0) {\n throw new Error(\"benchmarkCount must be a non-negative number\");\n }\n if (benchmarkCount !== benchmarks.length) {\n throw new Error(\"benchmarkCount must match benchmarks.length\");\n }\n\n return {\n schemaVersion: 1,\n snapshotId: assertString(raw.snapshotId, \"snapshotId\"),\n createdAt: assertString(raw.createdAt, \"createdAt\"),\n sourceRootDir: assertString(raw.sourceRootDir, \"sourceRootDir\"),\n benchmarkCount,\n benchmarks,\n notes: typeof raw.notes === \"string\" && raw.notes.trim().length > 0 ? raw.notes.trim() : undefined,\n gitRef: typeof raw.gitRef === \"string\" && raw.gitRef.trim().length > 0 ? raw.gitRef.trim() : undefined,\n };\n}\n\nfunction parseOptionalEvalRunMetrics(raw: unknown): EvalRunMetrics | undefined {\n if (!isRecord(raw)) return undefined;\n return {\n recallPrecisionAtK: typeof raw.recallPrecisionAtK === \"number\" ? raw.recallPrecisionAtK : undefined,\n actionOutcomeScore: typeof raw.actionOutcomeScore === \"number\" ? raw.actionOutcomeScore : undefined,\n objectiveStateCoverage: typeof raw.objectiveStateCoverage === \"number\" ? raw.objectiveStateCoverage : undefined,\n causalPathRecall: typeof raw.causalPathRecall === \"number\" ? raw.causalPathRecall : undefined,\n trustViolationRate: typeof raw.trustViolationRate === \"number\" ? raw.trustViolationRate : undefined,\n creationRecoveryScore: typeof raw.creationRecoveryScore === \"number\" ? raw.creationRecoveryScore : undefined,\n } satisfies EvalRunMetrics;\n}\n\nexport function validateEvalShadowRecallRecord(raw: unknown): EvalShadowRecallRecord {\n if (!isRecord(raw)) throw new Error(\"eval shadow recall record must be an object\");\n if (raw.schemaVersion !== 1) throw new Error(\"schemaVersion must be 1\");\n\n const recallMode = assertString(raw.recallMode, \"recallMode\");\n if (![\"no_recall\", \"minimal\", \"full\", \"graph_mode\"].includes(recallMode)) {\n throw new Error(\"recallMode must be one of no_recall|minimal|full|graph_mode\");\n }\n\n const source = assertString(raw.source, \"source\");\n if (![\"none\", \"hot_qmd\", \"hot_embedding\", \"cold_fallback\", \"recent_scan\"].includes(source)) {\n throw new Error(\"source must be one of none|hot_qmd|hot_embedding|cold_fallback|recent_scan\");\n }\n\n const promptLength = Number(raw.promptLength);\n const retrievalQueryLength = Number(raw.retrievalQueryLength);\n const recallResultLimit = Number(raw.recallResultLimit);\n const recalledMemoryCount = Number(raw.recalledMemoryCount);\n const contextChars = Number(raw.contextChars);\n const durationMs = Number(raw.durationMs);\n\n for (const [field, value] of [\n [\"promptLength\", promptLength],\n [\"retrievalQueryLength\", retrievalQueryLength],\n [\"recallResultLimit\", recallResultLimit],\n [\"recalledMemoryCount\", recalledMemoryCount],\n [\"contextChars\", contextChars],\n [\"durationMs\", durationMs],\n ] as const) {\n if (!Number.isFinite(value) || value < 0) {\n throw new Error(`${field} must be a non-negative number`);\n }\n }\n\n const memoryIds = optionalStringArray(raw.memoryIds, \"memoryIds\") ?? [];\n if (typeof raw.injected !== \"boolean\") throw new Error(\"injected must be a boolean\");\n\n let timings: Record<string, string> | undefined;\n if (raw.timings !== undefined) {\n if (!isRecord(raw.timings)) throw new Error(\"timings must be an object of strings\");\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(raw.timings)) {\n if (typeof value !== \"string\") throw new Error(\"timings must be an object of strings\");\n out[key] = value;\n }\n timings = out;\n }\n\n const identityInjectionModeRaw =\n typeof raw.identityInjectionMode === \"string\" && raw.identityInjectionMode.trim().length > 0\n ? raw.identityInjectionMode.trim()\n : undefined;\n if (\n identityInjectionModeRaw !== undefined &&\n ![\"recovery_only\", \"minimal\", \"full\", \"none\"].includes(identityInjectionModeRaw)\n ) {\n throw new Error(\"identityInjectionMode must be one of recovery_only|minimal|full|none\");\n }\n\n return {\n schemaVersion: 1,\n traceId: assertString(raw.traceId, \"traceId\"),\n recordedAt: assertString(raw.recordedAt, \"recordedAt\"),\n sessionKey: assertString(raw.sessionKey, \"sessionKey\"),\n promptHash: assertString(raw.promptHash, \"promptHash\"),\n promptLength,\n retrievalQueryHash: assertString(raw.retrievalQueryHash, \"retrievalQueryHash\"),\n retrievalQueryLength,\n recallMode: recallMode as EvalShadowRecallRecord[\"recallMode\"],\n recallResultLimit,\n source: source as EvalShadowRecallRecord[\"source\"],\n recalledMemoryCount,\n injected: raw.injected,\n contextChars,\n memoryIds,\n policyVersion:\n typeof raw.policyVersion === \"string\" && raw.policyVersion.trim().length > 0\n ? raw.policyVersion.trim()\n : undefined,\n identityInjectionMode: identityInjectionModeRaw as EvalShadowRecallRecord[\"identityInjectionMode\"],\n identityInjectedChars:\n typeof raw.identityInjectedChars === \"number\" && Number.isFinite(raw.identityInjectedChars)\n ? raw.identityInjectedChars\n : undefined,\n identityInjectionTruncated:\n typeof raw.identityInjectionTruncated === \"boolean\" ? raw.identityInjectionTruncated : undefined,\n durationMs,\n timings,\n };\n}\n\ninterface EvalStoreSnapshot {\n status: EvalHarnessStatus;\n manifests: EvalBenchmarkManifest[];\n runs: EvalRunSummary[];\n shadows: EvalShadowRecallRecord[];\n baselines: EvalBaselineSnapshot[];\n}\n\ninterface EvalStoreSnapshotOptions {\n rootDir: string;\n enabled: boolean;\n shadowModeEnabled: boolean;\n baselineSnapshotsEnabled?: boolean;\n memoryRedTeamBenchEnabled?: boolean;\n}\n\nconst LOWER_IS_BETTER_METRICS = new Set<keyof EvalRunMetrics>([\"trustViolationRate\"]);\n\nfunction computePassRate(run: EvalRunSummary): number {\n return run.totalCases > 0 ? run.passedCases / run.totalCases : 0;\n}\n\nfunction latestCompletedRunsByBenchmark(runs: EvalRunSummary[]): Map<string, EvalRunSummary> {\n const sorted = [...runs]\n .filter((run) => run.status === \"completed\")\n .sort((a, b) => {\n const aTime = Date.parse(a.completedAt ?? a.startedAt);\n const bTime = Date.parse(b.completedAt ?? b.startedAt);\n return (Number.isNaN(bTime) ? 0 : bTime) - (Number.isNaN(aTime) ? 0 : aTime);\n });\n const out = new Map<string, EvalRunSummary>();\n for (const run of sorted) {\n if (!out.has(run.benchmarkId)) {\n out.set(run.benchmarkId, run);\n }\n }\n return out;\n}\n\nfunction compareMetricDeltas(\n baseMetrics: EvalRunMetrics | undefined,\n candidateMetrics: EvalRunMetrics | undefined,\n): {\n deltas: Partial<Record<keyof EvalRunMetrics, number>>;\n regressions: string[];\n improvements: string[];\n} {\n const deltas: Partial<Record<keyof EvalRunMetrics, number>> = {};\n const regressions: string[] = [];\n const improvements: string[] = [];\n if (!baseMetrics || !candidateMetrics) {\n return { deltas, regressions, improvements };\n }\n\n for (const metric of Object.keys(baseMetrics) as Array<keyof EvalRunMetrics>) {\n const baseValue = baseMetrics[metric];\n const candidateValue = candidateMetrics[metric];\n if (typeof baseValue !== \"number\" || typeof candidateValue !== \"number\") continue;\n const delta = candidateValue - baseValue;\n deltas[metric] = delta;\n if (delta === 0) continue;\n const lowerIsBetter = LOWER_IS_BETTER_METRICS.has(metric);\n const improved = lowerIsBetter ? delta < 0 : delta > 0;\n const summary = `${metric} ${baseValue} -> ${candidateValue}`;\n if (improved) {\n improvements.push(summary);\n } else {\n regressions.push(summary);\n }\n }\n\n return { deltas, regressions, improvements };\n}\n\nfunction formatEvalBaselineDeltaMarkdown(report: EvalBaselineDeltaReport): string {\n const lines = [\n \"# Eval Baseline Delta Report\",\n \"\",\n `- Passed: ${report.passed ? \"yes\" : \"no\"}`,\n `- Baseline snapshot: ${report.baselineSnapshotId}`,\n `- Baseline created: ${report.baselineCreatedAt}`,\n `- Baseline source root: ${report.baselineSourceRootDir}`,\n `- Candidate root: ${report.candidateRootDir}`,\n `- Benchmarks compared: ${report.comparedBenchmarks}`,\n ];\n\n if (report.missingCandidateBenchmarks.length > 0) {\n lines.push(`- Missing candidate benchmarks: ${report.missingCandidateBenchmarks.join(\", \")}`);\n }\n\n lines.push(\n `- Invalid candidate artifacts: benchmarks=${report.invalidArtifacts.candidate.benchmarks}, runs=${report.invalidArtifacts.candidate.runs}, shadows=${report.invalidArtifacts.candidate.shadows}, baselines=${report.invalidArtifacts.candidate.baselines}`,\n \"\",\n \"## Regressions\",\n );\n if (report.regressions.length === 0) {\n lines.push(\"- none\");\n } else {\n for (const regression of report.regressions) lines.push(`- ${regression}`);\n }\n\n lines.push(\"\", \"## Improvements\");\n if (report.improvements.length === 0) {\n lines.push(\"- none\");\n } else {\n for (const improvement of report.improvements) lines.push(`- ${improvement}`);\n }\n\n lines.push(\"\", \"## Benchmark Deltas\");\n if (report.deltas.length === 0) {\n lines.push(\"- none\");\n } else {\n for (const delta of report.deltas) {\n lines.push(\n `- ${delta.benchmarkId}: passRate ${delta.basePassRate} -> ${delta.candidatePassRate} (delta ${delta.passRateDelta})`,\n );\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nasync function collectEvalStoreSnapshot(options: EvalStoreSnapshotOptions): Promise<EvalStoreSnapshot> {\n const rootDir = options.rootDir;\n const benchmarkDir = path.join(rootDir, \"benchmarks\");\n const runsDir = path.join(rootDir, \"runs\");\n const shadowDir = path.join(rootDir, \"shadow\");\n const baselineDir = path.join(rootDir, \"baselines\");\n const benchmarkFiles = await listNamedFiles(benchmarkDir, \"manifest.json\");\n const runFiles = await listJsonFiles(runsDir);\n const shadowFiles = await listJsonFiles(shadowDir);\n const baselineFiles = await listJsonFiles(baselineDir);\n\n const invalidBenchmarks: Array<{ path: string; error: string }> = [];\n const invalidRuns: Array<{ path: string; error: string }> = [];\n const invalidShadows: Array<{ path: string; error: string }> = [];\n const invalidBaselines: Array<{ path: string; error: string }> = [];\n const manifests: EvalBenchmarkManifest[] = [];\n\n for (const filePath of benchmarkFiles) {\n try {\n manifests.push(\n validateEvalBenchmarkManifest(await readJsonFile(filePath), {\n memoryRedTeamBenchEnabled: options.memoryRedTeamBenchEnabled,\n }),\n );\n } catch (error) {\n invalidBenchmarks.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const runs: EvalRunSummary[] = [];\n for (const filePath of runFiles) {\n try {\n runs.push(validateEvalRunSummary(await readJsonFile(filePath)));\n } catch (error) {\n invalidRuns.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const shadows: EvalShadowRecallRecord[] = [];\n for (const filePath of shadowFiles) {\n try {\n shadows.push(validateEvalShadowRecallRecord(await readJsonFile(filePath)));\n } catch (error) {\n invalidShadows.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const baselines: EvalBaselineSnapshot[] = [];\n for (const filePath of baselineFiles) {\n try {\n baselines.push(validateEvalBaselineSnapshot(await readJsonFile(filePath)));\n } catch (error) {\n invalidBaselines.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n runs.sort((a, b) => {\n const aTime = Date.parse(a.completedAt ?? a.startedAt);\n const bTime = Date.parse(b.completedAt ?? b.startedAt);\n return (Number.isNaN(bTime) ? 0 : bTime) - (Number.isNaN(aTime) ? 0 : aTime);\n });\n shadows.sort((a, b) => b.recordedAt.localeCompare(a.recordedAt));\n baselines.sort((a, b) => b.createdAt.localeCompare(a.createdAt));\n\n const tags = new Set<string>();\n const attackClasses = new Set<string>();\n const sourceLinks = new Set<string>();\n const targetSurfaces = new Set<string>();\n let totalCases = 0;\n let redTeam = 0;\n for (const manifest of manifests) {\n totalCases += manifest.cases.length;\n if (manifest.benchmarkType === \"memory-red-team\") {\n redTeam += 1;\n if (manifest.attackClass) attackClasses.add(manifest.attackClass);\n if (manifest.targetSurface) targetSurfaces.add(manifest.targetSurface);\n }\n for (const tag of manifest.tags ?? []) tags.add(tag);\n for (const link of manifest.sourceLinks ?? []) sourceLinks.add(link);\n }\n\n return {\n status: {\n enabled: options.enabled,\n shadowModeEnabled: options.shadowModeEnabled,\n rootDir,\n benchmarkDir,\n runsDir,\n benchmarks: {\n total: benchmarkFiles.length,\n valid: manifests.length,\n invalid: invalidBenchmarks.length,\n redTeam,\n totalCases,\n attackClasses: [...attackClasses].sort(),\n tags: [...tags].sort(),\n targetSurfaces: [...targetSurfaces].sort(),\n sourceLinks: [...sourceLinks].sort(),\n },\n runs: {\n total: runFiles.length,\n invalid: invalidRuns.length,\n completed: runs.filter((run) => run.status === \"completed\").length,\n failed: runs.filter((run) => run.status === \"failed\").length,\n partial: runs.filter((run) => run.status === \"partial\").length,\n running: runs.filter((run) => run.status === \"running\").length,\n latestRunId: runs[0]?.runId,\n latestBenchmarkId: runs[0]?.benchmarkId,\n latestCompletedAt: runs[0]?.completedAt,\n },\n shadows: {\n total: shadowFiles.length,\n invalid: invalidShadows.length,\n latestTraceId: shadows[0]?.traceId,\n latestRecordedAt: shadows[0]?.recordedAt,\n latestSessionKey: shadows[0]?.sessionKey,\n },\n baselines: {\n enabled: options.baselineSnapshotsEnabled === true,\n total: baselineFiles.length,\n invalid: invalidBaselines.length,\n latestSnapshotId: baselines[0]?.snapshotId,\n latestCreatedAt: baselines[0]?.createdAt,\n latestBenchmarkCount: baselines[0]?.benchmarkCount,\n },\n latestRun: runs[0],\n latestShadow: shadows[0],\n latestBaseline: baselines[0],\n invalidBenchmarks,\n invalidRuns,\n invalidShadows,\n invalidBaselines,\n },\n manifests,\n runs,\n shadows,\n baselines,\n };\n}\n\nasync function resolveBenchmarkManifestPath(sourcePath: string): Promise<{ sourceKind: \"file\" | \"directory\"; manifestPath: string }> {\n const info = await stat(sourcePath);\n if (info.isDirectory()) {\n return {\n sourceKind: \"directory\",\n manifestPath: path.join(sourcePath, \"manifest.json\"),\n };\n }\n if (info.isFile()) {\n return {\n sourceKind: \"file\",\n manifestPath: sourcePath,\n };\n }\n throw new Error(\"benchmark pack source must be a file or directory\");\n}\n\nexport async function validateEvalBenchmarkPack(\n sourcePath: string,\n options?: { memoryRedTeamBenchEnabled?: boolean },\n): Promise<EvalBenchmarkPackSummary> {\n const trimmedSourcePath = sourcePath.trim();\n if (trimmedSourcePath.length === 0) {\n throw new Error(\"benchmark pack path must be a non-empty string\");\n }\n const { manifestPath } = await resolveBenchmarkManifestPath(trimmedSourcePath);\n const manifest = validateEvalBenchmarkManifest(await readJsonFile(manifestPath), {\n memoryRedTeamBenchEnabled: options?.memoryRedTeamBenchEnabled,\n });\n return {\n sourcePath: trimmedSourcePath,\n manifestPath,\n benchmarkId: assertSafeBenchmarkId(manifest.benchmarkId),\n benchmarkType: manifest.benchmarkType ?? \"standard\",\n title: manifest.title,\n attackClass: manifest.attackClass,\n targetSurface: manifest.targetSurface,\n totalCases: manifest.cases.length,\n tags: [...(manifest.tags ?? [])],\n sourceLinks: [...(manifest.sourceLinks ?? [])],\n };\n}\n\nexport async function importEvalBenchmarkPack(options: {\n sourcePath: string;\n memoryDir: string;\n evalStoreDir?: string;\n force?: boolean;\n memoryRedTeamBenchEnabled?: boolean;\n}): Promise<EvalBenchmarkPackSummary & { targetDir: string; overwritten: boolean }> {\n const summary = await validateEvalBenchmarkPack(options.sourcePath, {\n memoryRedTeamBenchEnabled: options.memoryRedTeamBenchEnabled,\n });\n const rootDir = resolveEvalStoreDir(options.memoryDir, options.evalStoreDir);\n const benchmarkDir = path.join(rootDir, \"benchmarks\");\n const targetDir = path.join(benchmarkDir, summary.benchmarkId);\n const { sourceKind, manifestPath } = await resolveBenchmarkManifestPath(summary.sourcePath);\n\n let overwritten = false;\n try {\n await stat(targetDir);\n if (options.force !== true) {\n throw new Error(`benchmark pack already exists at ${targetDir}; rerun with force to replace it`);\n }\n overwritten = true;\n await rm(targetDir, { recursive: true, force: true });\n } catch (error) {\n if (!(error instanceof Error) || !(\"code\" in error) || (error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n await mkdir(benchmarkDir, { recursive: true });\n if (sourceKind === \"directory\") {\n await cp(summary.sourcePath, targetDir, { recursive: true });\n } else {\n await mkdir(targetDir, { recursive: true });\n await cp(manifestPath, path.join(targetDir, \"manifest.json\"));\n }\n\n return {\n ...summary,\n targetDir,\n overwritten,\n };\n}\n\nexport async function recordEvalShadowRecall(options: {\n memoryDir: string;\n evalStoreDir?: string;\n record: EvalShadowRecallRecord;\n}): Promise<string> {\n const rootDir = resolveEvalStoreDir(options.memoryDir, options.evalStoreDir);\n const validated = validateEvalShadowRecallRecord(options.record);\n const day = validated.recordedAt.slice(0, 10);\n const shadowDir = path.join(rootDir, \"shadow\", day);\n const targetPath = path.join(shadowDir, `${validated.traceId}.json`);\n await mkdir(shadowDir, { recursive: true });\n await writeFile(targetPath, JSON.stringify(validated, null, 2), \"utf-8\");\n return targetPath;\n}\n\nexport async function getEvalHarnessStatus(options: {\n memoryDir: string;\n evalStoreDir?: string;\n enabled: boolean;\n shadowModeEnabled: boolean;\n baselineSnapshotsEnabled?: boolean;\n memoryRedTeamBenchEnabled?: boolean;\n}): Promise<EvalHarnessStatus> {\n return (\n await collectEvalStoreSnapshot({\n rootDir: resolveEvalStoreDir(options.memoryDir, options.evalStoreDir),\n enabled: options.enabled,\n shadowModeEnabled: options.shadowModeEnabled,\n baselineSnapshotsEnabled: options.baselineSnapshotsEnabled,\n memoryRedTeamBenchEnabled: options.memoryRedTeamBenchEnabled,\n })\n ).status;\n}\n\nexport async function createEvalBaselineSnapshot(options: {\n memoryDir: string;\n evalStoreDir?: string;\n baselineSnapshotsEnabled: boolean;\n snapshotId: string;\n createdAt?: string;\n notes?: string;\n gitRef?: string;\n}): Promise<{ targetPath: string; snapshot: EvalBaselineSnapshot }> {\n if (options.baselineSnapshotsEnabled !== true) {\n throw new Error(\"benchmark baseline snapshots are disabled\");\n }\n\n const snapshotId = assertSafePathSegment(assertString(options.snapshotId, \"snapshotId\"), \"snapshotId\");\n const rootDir = resolveEvalStoreDir(options.memoryDir, options.evalStoreDir);\n const store = await collectEvalStoreSnapshot({\n rootDir,\n enabled: true,\n shadowModeEnabled: true,\n baselineSnapshotsEnabled: true,\n memoryRedTeamBenchEnabled: true,\n });\n const latestRuns = latestCompletedRunsByBenchmark(store.runs);\n const benchmarks = [...latestRuns.values()]\n .sort((a, b) => a.benchmarkId.localeCompare(b.benchmarkId))\n .map((run) => ({\n benchmarkId: run.benchmarkId,\n runId: run.runId,\n completedAt: run.completedAt,\n gitRef: run.gitRef,\n passRate: computePassRate(run),\n metrics: run.metrics,\n } satisfies EvalBaselineSnapshotBenchmark));\n\n const snapshot = validateEvalBaselineSnapshot({\n schemaVersion: 1,\n snapshotId,\n createdAt: options.createdAt ?? new Date().toISOString(),\n sourceRootDir: rootDir,\n benchmarkCount: benchmarks.length,\n benchmarks,\n notes: options.notes,\n gitRef: options.gitRef,\n });\n\n const targetPath = path.join(rootDir, \"baselines\", `${snapshot.snapshotId}.json`);\n await mkdir(path.dirname(targetPath), { recursive: true });\n await writeFile(targetPath, JSON.stringify(snapshot, null, 2), \"utf-8\");\n return { targetPath, snapshot };\n}\n\nexport async function runEvalBaselineDeltaReport(options: {\n memoryDir: string;\n evalStoreDir?: string;\n benchmarkDeltaReporterEnabled: boolean;\n snapshotId: string;\n}): Promise<EvalBaselineDeltaReport> {\n if (options.benchmarkDeltaReporterEnabled !== true) {\n throw new Error(\"benchmark delta reporter is disabled\");\n }\n\n const snapshotId = assertSafePathSegment(assertString(options.snapshotId, \"snapshotId\"), \"snapshotId\");\n const candidateRootDir = resolveEvalStoreDir(options.memoryDir, options.evalStoreDir);\n const candidateSnapshot = await collectEvalStoreSnapshot({\n rootDir: candidateRootDir,\n enabled: true,\n shadowModeEnabled: true,\n baselineSnapshotsEnabled: true,\n memoryRedTeamBenchEnabled: true,\n });\n const baselineSnapshot = candidateSnapshot.baselines.find((snapshot) => snapshot.snapshotId === snapshotId);\n if (!baselineSnapshot) {\n throw new Error(`benchmark baseline snapshot not found: ${snapshotId}`);\n }\n\n return buildEvalBaselineDeltaReport({\n baselineSnapshot,\n candidateSnapshot,\n });\n}\n\nexport async function runEvalStoredBaselineCiGate(options: {\n baseMemoryDir?: string;\n baseEvalStoreDir: string;\n candidateMemoryDir?: string;\n candidateEvalStoreDir: string;\n snapshotId: string;\n}): Promise<EvalStoredBaselineCiGateReport> {\n const snapshotId = assertSafePathSegment(assertString(options.snapshotId, \"snapshotId\"), \"snapshotId\");\n const baseRootDir = resolveEvalStoreDir(options.baseMemoryDir ?? options.baseEvalStoreDir, options.baseEvalStoreDir);\n const candidateRootDir = resolveEvalStoreDir(\n options.candidateMemoryDir ?? options.candidateEvalStoreDir,\n options.candidateEvalStoreDir,\n );\n const [baseSnapshot, candidateSnapshot] = await Promise.all([\n collectEvalStoreSnapshot({\n rootDir: baseRootDir,\n enabled: true,\n shadowModeEnabled: true,\n baselineSnapshotsEnabled: true,\n memoryRedTeamBenchEnabled: true,\n }),\n collectEvalStoreSnapshot({\n rootDir: candidateRootDir,\n enabled: true,\n shadowModeEnabled: true,\n baselineSnapshotsEnabled: true,\n memoryRedTeamBenchEnabled: true,\n }),\n ]);\n const baselineSnapshot =\n baseSnapshot.baselines.find((snapshot) => snapshot.snapshotId === snapshotId) ??\n candidateSnapshot.baselines.find((snapshot) => snapshot.snapshotId === snapshotId);\n if (!baselineSnapshot) {\n throw new Error(`benchmark baseline snapshot not found: ${snapshotId}`);\n }\n\n return {\n baseRootDir,\n baselineResolvedFrom: baseSnapshot.baselines.some((snapshot) => snapshot.snapshotId === snapshotId) ? \"base\" : \"candidate\",\n ...buildEvalBaselineDeltaReport({\n baselineSnapshot,\n candidateSnapshot,\n }),\n };\n}\n\nfunction buildEvalBaselineDeltaReport(options: {\n baselineSnapshot: EvalBaselineSnapshot;\n candidateSnapshot: EvalStoreSnapshot;\n}): EvalBaselineDeltaReport {\n const { baselineSnapshot, candidateSnapshot } = options;\n\n const regressions: string[] = [];\n const improvements: string[] = [];\n\n if (candidateSnapshot.status.invalidBenchmarks.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidBenchmarks.length} invalid benchmark manifest(s)`);\n }\n if (candidateSnapshot.status.invalidRuns.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidRuns.length} invalid run summary file(s)`);\n }\n if (candidateSnapshot.status.invalidShadows.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidShadows.length} invalid shadow record(s)`);\n }\n if (candidateSnapshot.status.invalidBaselines.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidBaselines.length} invalid baseline snapshot file(s)`);\n }\n\n const candidateRuns = latestCompletedRunsByBenchmark(candidateSnapshot.runs);\n const baselineBenchmarks = new Map(\n baselineSnapshot.benchmarks.map((benchmark) => [benchmark.benchmarkId, benchmark] as const),\n );\n const missingCandidateBenchmarks = [...baselineBenchmarks.keys()]\n .filter((benchmarkId) => !candidateRuns.has(benchmarkId))\n .sort();\n for (const benchmarkId of missingCandidateBenchmarks) {\n regressions.push(`candidate is missing latest completed benchmark run for ${benchmarkId}`);\n }\n\n const deltas: EvalBenchmarkDelta[] = [];\n for (const benchmarkId of [...baselineBenchmarks.keys()].sort()) {\n const baseBenchmark = baselineBenchmarks.get(benchmarkId);\n const candidateRun = candidateRuns.get(benchmarkId);\n if (!baseBenchmark || !candidateRun) continue;\n\n const passRateDelta = computePassRate(candidateRun) - baseBenchmark.passRate;\n const delta: EvalBenchmarkDelta = {\n benchmarkId,\n baseRunId: baseBenchmark.runId,\n candidateRunId: candidateRun.runId,\n basePassRate: baseBenchmark.passRate,\n candidatePassRate: computePassRate(candidateRun),\n passRateDelta,\n metricDeltas: {},\n regressions: [],\n improvements: [],\n };\n\n if (passRateDelta < 0) {\n delta.regressions.push(`passRate ${baseBenchmark.passRate} -> ${delta.candidatePassRate}`);\n regressions.push(`${benchmarkId} pass rate regressed (${baseBenchmark.passRate} -> ${delta.candidatePassRate})`);\n } else if (passRateDelta > 0) {\n delta.improvements.push(`passRate ${baseBenchmark.passRate} -> ${delta.candidatePassRate}`);\n improvements.push(`${benchmarkId} pass rate improved (${baseBenchmark.passRate} -> ${delta.candidatePassRate})`);\n }\n\n const metricDelta = compareMetricDeltas(baseBenchmark.metrics, candidateRun.metrics);\n delta.metricDeltas = metricDelta.deltas;\n for (const regression of metricDelta.regressions) {\n delta.regressions.push(regression);\n regressions.push(`${benchmarkId} ${regression}`);\n }\n for (const improvement of metricDelta.improvements) {\n delta.improvements.push(improvement);\n improvements.push(`${benchmarkId} ${improvement}`);\n }\n deltas.push(delta);\n }\n\n const report: EvalBaselineDeltaReport = {\n passed: regressions.length === 0,\n baselineSnapshotId: baselineSnapshot.snapshotId,\n baselineCreatedAt: baselineSnapshot.createdAt,\n baselineSourceRootDir: baselineSnapshot.sourceRootDir,\n candidateRootDir: candidateSnapshot.status.rootDir,\n comparedBenchmarks: deltas.length,\n missingCandidateBenchmarks,\n invalidArtifacts: {\n candidate: {\n benchmarks: candidateSnapshot.status.invalidBenchmarks.length,\n runs: candidateSnapshot.status.invalidRuns.length,\n shadows: candidateSnapshot.status.invalidShadows.length,\n baselines: candidateSnapshot.status.invalidBaselines.length,\n },\n },\n regressions,\n improvements,\n deltas,\n markdownReport: \"\",\n };\n report.markdownReport = formatEvalBaselineDeltaMarkdown(report);\n return report;\n}\n\nfunction resolveRequiredEvalStoreRoot(options: { memoryDir?: string; evalStoreDir?: string }, label: string): string {\n if (typeof options.evalStoreDir === \"string\" && options.evalStoreDir.trim().length > 0) {\n return options.evalStoreDir.trim();\n }\n if (typeof options.memoryDir === \"string\" && options.memoryDir.trim().length > 0) {\n return resolveEvalStoreDir(options.memoryDir.trim());\n }\n throw new Error(`${label} requires memoryDir or evalStoreDir`);\n}\n\nexport async function runEvalBenchmarkCiGate(options: {\n baseMemoryDir?: string;\n candidateMemoryDir?: string;\n baseEvalStoreDir?: string;\n candidateEvalStoreDir?: string;\n}): Promise<EvalCiGateReport> {\n const baseRootDir = resolveRequiredEvalStoreRoot(\n { memoryDir: options.baseMemoryDir, evalStoreDir: options.baseEvalStoreDir },\n \"base\",\n );\n const candidateRootDir = resolveRequiredEvalStoreRoot(\n { memoryDir: options.candidateMemoryDir, evalStoreDir: options.candidateEvalStoreDir },\n \"candidate\",\n );\n const baseSnapshot = await collectEvalStoreSnapshot({\n rootDir: baseRootDir,\n enabled: true,\n shadowModeEnabled: true,\n memoryRedTeamBenchEnabled: true,\n });\n const candidateSnapshot = await collectEvalStoreSnapshot({\n rootDir: candidateRootDir,\n enabled: true,\n shadowModeEnabled: true,\n memoryRedTeamBenchEnabled: true,\n });\n\n const regressions: string[] = [];\n const improvements: string[] = [];\n\n if (baseSnapshot.status.invalidBenchmarks.length > 0) {\n regressions.push(`base store has ${baseSnapshot.status.invalidBenchmarks.length} invalid benchmark manifest(s)`);\n }\n if (baseSnapshot.status.invalidRuns.length > 0) {\n regressions.push(`base store has ${baseSnapshot.status.invalidRuns.length} invalid run summary file(s)`);\n }\n if (baseSnapshot.status.invalidShadows.length > 0) {\n regressions.push(`base store has ${baseSnapshot.status.invalidShadows.length} invalid shadow record(s)`);\n }\n if (candidateSnapshot.status.invalidBenchmarks.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidBenchmarks.length} invalid benchmark manifest(s)`);\n }\n if (candidateSnapshot.status.invalidRuns.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidRuns.length} invalid run summary file(s)`);\n }\n if (candidateSnapshot.status.invalidShadows.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidShadows.length} invalid shadow record(s)`);\n }\n\n const baseRuns = latestCompletedRunsByBenchmark(baseSnapshot.runs);\n const candidateRuns = latestCompletedRunsByBenchmark(candidateSnapshot.runs);\n const missingCandidateBenchmarks = [...baseRuns.keys()]\n .filter((benchmarkId) => !candidateRuns.has(benchmarkId))\n .sort();\n for (const benchmarkId of missingCandidateBenchmarks) {\n regressions.push(`candidate is missing latest completed benchmark run for ${benchmarkId}`);\n }\n\n const deltas: EvalBenchmarkDelta[] = [];\n for (const benchmarkId of [...baseRuns.keys()].sort()) {\n const baseRun = baseRuns.get(benchmarkId);\n const candidateRun = candidateRuns.get(benchmarkId);\n if (!baseRun || !candidateRun) continue;\n\n const basePassRate = computePassRate(baseRun);\n const candidatePassRate = computePassRate(candidateRun);\n const passRateDelta = candidatePassRate - basePassRate;\n const delta: EvalBenchmarkDelta = {\n benchmarkId,\n baseRunId: baseRun.runId,\n candidateRunId: candidateRun.runId,\n basePassRate,\n candidatePassRate,\n passRateDelta,\n metricDeltas: {},\n regressions: [],\n improvements: [],\n };\n\n if (passRateDelta < 0) {\n delta.regressions.push(`passRate ${basePassRate} -> ${candidatePassRate}`);\n regressions.push(`${benchmarkId} pass rate regressed (${basePassRate} -> ${candidatePassRate})`);\n } else if (passRateDelta > 0) {\n delta.improvements.push(`passRate ${basePassRate} -> ${candidatePassRate}`);\n improvements.push(`${benchmarkId} pass rate improved (${basePassRate} -> ${candidatePassRate})`);\n }\n\n const metricDelta = compareMetricDeltas(baseRun.metrics, candidateRun.metrics);\n delta.metricDeltas = metricDelta.deltas;\n for (const regression of metricDelta.regressions) {\n delta.regressions.push(regression);\n regressions.push(`${benchmarkId} ${regression}`);\n }\n for (const improvement of metricDelta.improvements) {\n delta.improvements.push(improvement);\n improvements.push(`${benchmarkId} ${improvement}`);\n }\n deltas.push(delta);\n }\n\n return {\n passed: regressions.length === 0,\n baseRootDir: baseSnapshot.status.rootDir,\n candidateRootDir: candidateSnapshot.status.rootDir,\n comparedBenchmarks: deltas.length,\n missingCandidateBenchmarks,\n invalidArtifacts: {\n base: {\n benchmarks: baseSnapshot.status.invalidBenchmarks.length,\n runs: baseSnapshot.status.invalidRuns.length,\n shadows: baseSnapshot.status.invalidShadows.length,\n },\n candidate: {\n benchmarks: candidateSnapshot.status.invalidBenchmarks.length,\n runs: candidateSnapshot.status.invalidRuns.length,\n shadows: candidateSnapshot.status.invalidShadows.length,\n },\n },\n regressions,\n improvements,\n deltas,\n };\n}\n"],"mappings":";;;;;;;AAAA,OAAO,UAAU;AACjB,SAAS,IAAI,OAA0B,IAAI,MAAM,iBAAiB;AA0OlE,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,aAAa,OAAgB,OAAuB;AAC3D,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,GAAG;AAC1D,UAAM,IAAI,MAAM,GAAG,KAAK,6BAA6B;AAAA,EACvD;AACA,SAAO,MAAM,KAAK;AACpB;AAEA,SAAS,oBAAoB,OAAgB,OAAqC;AAChF,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,UAAM,IAAI,MAAM,GAAG,KAAK,8BAA8B;AAAA,EACxD;AACA,QAAM,MAAM,MACT,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,EACzD,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACnC,MAAI,IAAI,WAAW,MAAM,QAAQ;AAC/B,UAAM,IAAI,MAAM,GAAG,KAAK,wCAAwC;AAAA,EAClE;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,WAAmB,aAA8B;AACnF,MAAI,OAAO,gBAAgB,YAAY,YAAY,KAAK,EAAE,SAAS,GAAG;AACpE,WAAO,YAAY,KAAK;AAAA,EAC1B;AACA,SAAO,KAAK,KAAK,WAAW,SAAS,OAAO;AAC9C;AAEA,SAAS,sBAAsB,OAAe,OAAuB;AACnE,MAAI,UAAU,OAAO,UAAU,QAAQ,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,IAAI,GAAG;AAClF,UAAM,IAAI,MAAM,GAAG,KAAK,8BAA8B;AAAA,EACxD;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,aAA6B;AAC1D,SAAO,sBAAsB,aAAa,aAAa;AACzD;AAEO,SAAS,8BACd,KACA,SACuB;AACvB,MAAI,CAAC,SAAS,GAAG,EAAG,OAAM,IAAI,MAAM,sCAAsC;AAC1E,MAAI,IAAI,kBAAkB,EAAG,OAAM,IAAI,MAAM,yBAAyB;AACtE,MAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,EAAG,OAAM,IAAI,MAAM,wBAAwB;AACvE,QAAM,mBACJ,OAAO,IAAI,kBAAkB,YAAY,IAAI,cAAc,KAAK,EAAE,SAAS,IACvE,IAAI,cAAc,KAAK,IACvB;AACN,MAAI,CAAC,CAAC,YAAY,iBAAiB,EAAE,SAAS,gBAAgB,GAAG;AAC/D,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAEA,QAAM,QAAQ,IAAI,MAAM,IAAI,CAAC,MAAM,UAAU;AAC3C,QAAI,CAAC,SAAS,IAAI,EAAG,OAAM,IAAI,MAAM,SAAS,KAAK,qBAAqB;AACxE,WAAO;AAAA,MACL,IAAI,aAAa,KAAK,IAAI,SAAS,KAAK,MAAM;AAAA,MAC9C,QAAQ,aAAa,KAAK,QAAQ,SAAS,KAAK,UAAU;AAAA,MAC1D,iBAAiB,oBAAoB,KAAK,iBAAiB,SAAS,KAAK,mBAAmB;AAAA,MAC5F,OAAO,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,KAAK,EAAE,SAAS,IAAI,KAAK,MAAM,KAAK,IAAI;AAAA,IAC9F;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB;AACtB,MAAI,kBAAkB,qBAAqB,SAAS,8BAA8B,MAAM;AACtF,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AACA,QAAM,cACJ,OAAO,IAAI,gBAAgB,YAAY,IAAI,YAAY,KAAK,EAAE,SAAS,IACnE,IAAI,YAAY,KAAK,IACrB;AACN,QAAM,gBACJ,OAAO,IAAI,kBAAkB,YAAY,IAAI,cAAc,KAAK,EAAE,SAAS,IACvE,IAAI,cAAc,KAAK,IACvB;AACN,MAAI,kBAAkB,qBAAqB,gBAAgB,QAAW;AACpE,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AACA,MAAI,kBAAkB,qBAAqB,kBAAkB,QAAW;AACtE,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAEA,SAAO;AAAA,IACL,eAAe;AAAA,IACf,aAAa,aAAa,IAAI,aAAa,aAAa;AAAA,IACxD;AAAA,IACA,OAAO,aAAa,IAAI,OAAO,OAAO;AAAA,IACtC,aACE,OAAO,IAAI,gBAAgB,YAAY,IAAI,YAAY,KAAK,EAAE,SAAS,IACnE,IAAI,YAAY,KAAK,IACrB;AAAA,IACN,MAAM,oBAAoB,IAAI,MAAM,MAAM;AAAA,IAC1C,aAAa,oBAAoB,IAAI,aAAa,aAAa;AAAA,IAC/D;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,KAA8B;AACnE,MAAI,CAAC,SAAS,GAAG,EAAG,OAAM,IAAI,MAAM,oCAAoC;AACxE,MAAI,IAAI,kBAAkB,EAAG,OAAM,IAAI,MAAM,yBAAyB;AACtE,QAAM,SAAS,aAAa,IAAI,QAAQ,QAAQ;AAChD,MAAI,CAAC,CAAC,WAAW,aAAa,UAAU,SAAS,EAAE,SAAS,MAAM,GAAG;AACnE,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AAEA,QAAM,aAAa,OAAO,IAAI,UAAU;AACxC,QAAM,cAAc,OAAO,IAAI,WAAW;AAC1C,QAAM,cAAc,OAAO,IAAI,WAAW;AAC1C,MAAI,CAAC,OAAO,SAAS,UAAU,KAAK,aAAa,EAAG,OAAM,IAAI,MAAM,0CAA0C;AAC9G,MAAI,CAAC,OAAO,SAAS,WAAW,KAAK,cAAc,EAAG,OAAM,IAAI,MAAM,2CAA2C;AACjH,MAAI,CAAC,OAAO,SAAS,WAAW,KAAK,cAAc,EAAG,OAAM,IAAI,MAAM,2CAA2C;AAEjH,QAAM,UAAU,4BAA4B,IAAI,OAAO;AAEvD,SAAO;AAAA,IACL,eAAe;AAAA,IACf,OAAO,aAAa,IAAI,OAAO,OAAO;AAAA,IACtC,aAAa,aAAa,IAAI,aAAa,aAAa;AAAA,IACxD;AAAA,IACA,WAAW,aAAa,IAAI,WAAW,WAAW;AAAA,IAClD,aACE,OAAO,IAAI,gBAAgB,YAAY,IAAI,YAAY,KAAK,EAAE,SAAS,IACnE,IAAI,YAAY,KAAK,IACrB;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,OAAO,IAAI,UAAU,YAAY,IAAI,MAAM,KAAK,EAAE,SAAS,IAAI,IAAI,MAAM,KAAK,IAAI;AAAA,IACzF,QAAQ,OAAO,IAAI,WAAW,YAAY,IAAI,OAAO,KAAK,EAAE,SAAS,IAAI,IAAI,OAAO,KAAK,IAAI;AAAA,EAC/F;AACF;AAEO,SAAS,6BAA6B,KAAoC;AAC/E,MAAI,CAAC,SAAS,GAAG,EAAG,OAAM,IAAI,MAAM,0CAA0C;AAC9E,MAAI,IAAI,kBAAkB,EAAG,OAAM,IAAI,MAAM,yBAAyB;AACtE,MAAI,CAAC,MAAM,QAAQ,IAAI,UAAU,EAAG,OAAM,IAAI,MAAM,6BAA6B;AAEjF,QAAM,aAAa,IAAI,WAAW,IAAI,CAAC,MAAM,UAAU;AACrD,QAAI,CAAC,SAAS,IAAI,EAAG,OAAM,IAAI,MAAM,cAAc,KAAK,qBAAqB;AAC7E,UAAM,WAAW,OAAO,KAAK,QAAQ;AACrC,QAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,WAAW,KAAK,WAAW,GAAG;AAC9D,YAAM,IAAI,MAAM,cAAc,KAAK,6CAA6C;AAAA,IAClF;AAEA,UAAM,UAAU,4BAA4B,KAAK,OAAO;AAExD,WAAO;AAAA,MACL,aAAa,aAAa,KAAK,aAAa,cAAc,KAAK,eAAe;AAAA,MAC9E,OAAO,aAAa,KAAK,OAAO,cAAc,KAAK,SAAS;AAAA,MAC5D,aACE,OAAO,KAAK,gBAAgB,YAAY,KAAK,YAAY,KAAK,EAAE,SAAS,IACrE,KAAK,YAAY,KAAK,IACtB;AAAA,MACN,QACE,OAAO,KAAK,WAAW,YAAY,KAAK,OAAO,KAAK,EAAE,SAAS,IAC3D,KAAK,OAAO,KAAK,IACjB;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,iBAAiB,OAAO,IAAI,cAAc;AAChD,MAAI,CAAC,OAAO,SAAS,cAAc,KAAK,iBAAiB,GAAG;AAC1D,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,MAAI,mBAAmB,WAAW,QAAQ;AACxC,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AAEA,SAAO;AAAA,IACL,eAAe;AAAA,IACf,YAAY,aAAa,IAAI,YAAY,YAAY;AAAA,IACrD,WAAW,aAAa,IAAI,WAAW,WAAW;AAAA,IAClD,eAAe,aAAa,IAAI,eAAe,eAAe;AAAA,IAC9D;AAAA,IACA;AAAA,IACA,OAAO,OAAO,IAAI,UAAU,YAAY,IAAI,MAAM,KAAK,EAAE,SAAS,IAAI,IAAI,MAAM,KAAK,IAAI;AAAA,IACzF,QAAQ,OAAO,IAAI,WAAW,YAAY,IAAI,OAAO,KAAK,EAAE,SAAS,IAAI,IAAI,OAAO,KAAK,IAAI;AAAA,EAC/F;AACF;AAEA,SAAS,4BAA4B,KAA0C;AAC7E,MAAI,CAAC,SAAS,GAAG,EAAG,QAAO;AAC3B,SAAO;AAAA,IACL,oBAAoB,OAAO,IAAI,uBAAuB,WAAW,IAAI,qBAAqB;AAAA,IAC1F,oBAAoB,OAAO,IAAI,uBAAuB,WAAW,IAAI,qBAAqB;AAAA,IAC1F,wBAAwB,OAAO,IAAI,2BAA2B,WAAW,IAAI,yBAAyB;AAAA,IACtG,kBAAkB,OAAO,IAAI,qBAAqB,WAAW,IAAI,mBAAmB;AAAA,IACpF,oBAAoB,OAAO,IAAI,uBAAuB,WAAW,IAAI,qBAAqB;AAAA,IAC1F,uBAAuB,OAAO,IAAI,0BAA0B,WAAW,IAAI,wBAAwB;AAAA,EACrG;AACF;AAEO,SAAS,+BAA+B,KAAsC;AACnF,MAAI,CAAC,SAAS,GAAG,EAAG,OAAM,IAAI,MAAM,6CAA6C;AACjF,MAAI,IAAI,kBAAkB,EAAG,OAAM,IAAI,MAAM,yBAAyB;AAEtE,QAAM,aAAa,aAAa,IAAI,YAAY,YAAY;AAC5D,MAAI,CAAC,CAAC,aAAa,WAAW,QAAQ,YAAY,EAAE,SAAS,UAAU,GAAG;AACxE,UAAM,IAAI,MAAM,6DAA6D;AAAA,EAC/E;AAEA,QAAM,SAAS,aAAa,IAAI,QAAQ,QAAQ;AAChD,MAAI,CAAC,CAAC,QAAQ,WAAW,iBAAiB,iBAAiB,aAAa,EAAE,SAAS,MAAM,GAAG;AAC1F,UAAM,IAAI,MAAM,4EAA4E;AAAA,EAC9F;AAEA,QAAM,eAAe,OAAO,IAAI,YAAY;AAC5C,QAAM,uBAAuB,OAAO,IAAI,oBAAoB;AAC5D,QAAM,oBAAoB,OAAO,IAAI,iBAAiB;AACtD,QAAM,sBAAsB,OAAO,IAAI,mBAAmB;AAC1D,QAAM,eAAe,OAAO,IAAI,YAAY;AAC5C,QAAM,aAAa,OAAO,IAAI,UAAU;AAExC,aAAW,CAAC,OAAO,KAAK,KAAK;AAAA,IAC3B,CAAC,gBAAgB,YAAY;AAAA,IAC7B,CAAC,wBAAwB,oBAAoB;AAAA,IAC7C,CAAC,qBAAqB,iBAAiB;AAAA,IACvC,CAAC,uBAAuB,mBAAmB;AAAA,IAC3C,CAAC,gBAAgB,YAAY;AAAA,IAC7B,CAAC,cAAc,UAAU;AAAA,EAC3B,GAAY;AACV,QAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AACxC,YAAM,IAAI,MAAM,GAAG,KAAK,gCAAgC;AAAA,IAC1D;AAAA,EACF;AAEA,QAAM,YAAY,oBAAoB,IAAI,WAAW,WAAW,KAAK,CAAC;AACtE,MAAI,OAAO,IAAI,aAAa,UAAW,OAAM,IAAI,MAAM,4BAA4B;AAEnF,MAAI;AACJ,MAAI,IAAI,YAAY,QAAW;AAC7B,QAAI,CAAC,SAAS,IAAI,OAAO,EAAG,OAAM,IAAI,MAAM,sCAAsC;AAClF,UAAM,MAA8B,CAAC;AACrC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,OAAO,GAAG;AACtD,UAAI,OAAO,UAAU,SAAU,OAAM,IAAI,MAAM,sCAAsC;AACrF,UAAI,GAAG,IAAI;AAAA,IACb;AACA,cAAU;AAAA,EACZ;AAEA,QAAM,2BACJ,OAAO,IAAI,0BAA0B,YAAY,IAAI,sBAAsB,KAAK,EAAE,SAAS,IACvF,IAAI,sBAAsB,KAAK,IAC/B;AACN,MACE,6BAA6B,UAC7B,CAAC,CAAC,iBAAiB,WAAW,QAAQ,MAAM,EAAE,SAAS,wBAAwB,GAC/E;AACA,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AAEA,SAAO;AAAA,IACL,eAAe;AAAA,IACf,SAAS,aAAa,IAAI,SAAS,SAAS;AAAA,IAC5C,YAAY,aAAa,IAAI,YAAY,YAAY;AAAA,IACrD,YAAY,aAAa,IAAI,YAAY,YAAY;AAAA,IACrD,YAAY,aAAa,IAAI,YAAY,YAAY;AAAA,IACrD;AAAA,IACA,oBAAoB,aAAa,IAAI,oBAAoB,oBAAoB;AAAA,IAC7E;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,IAAI;AAAA,IACd;AAAA,IACA;AAAA,IACA,eACE,OAAO,IAAI,kBAAkB,YAAY,IAAI,cAAc,KAAK,EAAE,SAAS,IACvE,IAAI,cAAc,KAAK,IACvB;AAAA,IACN,uBAAuB;AAAA,IACvB,uBACE,OAAO,IAAI,0BAA0B,YAAY,OAAO,SAAS,IAAI,qBAAqB,IACtF,IAAI,wBACJ;AAAA,IACN,4BACE,OAAO,IAAI,+BAA+B,YAAY,IAAI,6BAA6B;AAAA,IACzF;AAAA,IACA;AAAA,EACF;AACF;AAkBA,IAAM,0BAA0B,oBAAI,IAA0B,CAAC,oBAAoB,CAAC;AAEpF,SAAS,gBAAgB,KAA6B;AACpD,SAAO,IAAI,aAAa,IAAI,IAAI,cAAc,IAAI,aAAa;AACjE;AAEA,SAAS,+BAA+B,MAAqD;AAC3F,QAAM,SAAS,CAAC,GAAG,IAAI,EACpB,OAAO,CAAC,QAAQ,IAAI,WAAW,WAAW,EAC1C,KAAK,CAAC,GAAG,MAAM;AACd,UAAM,QAAQ,KAAK,MAAM,EAAE,eAAe,EAAE,SAAS;AACrD,UAAM,QAAQ,KAAK,MAAM,EAAE,eAAe,EAAE,SAAS;AACrD,YAAQ,OAAO,MAAM,KAAK,IAAI,IAAI,UAAU,OAAO,MAAM,KAAK,IAAI,IAAI;AAAA,EACxE,CAAC;AACH,QAAM,MAAM,oBAAI,IAA4B;AAC5C,aAAW,OAAO,QAAQ;AACxB,QAAI,CAAC,IAAI,IAAI,IAAI,WAAW,GAAG;AAC7B,UAAI,IAAI,IAAI,aAAa,GAAG;AAAA,IAC9B;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBACP,aACA,kBAKA;AACA,QAAM,SAAwD,CAAC;AAC/D,QAAM,cAAwB,CAAC;AAC/B,QAAM,eAAyB,CAAC;AAChC,MAAI,CAAC,eAAe,CAAC,kBAAkB;AACrC,WAAO,EAAE,QAAQ,aAAa,aAAa;AAAA,EAC7C;AAEA,aAAW,UAAU,OAAO,KAAK,WAAW,GAAkC;AAC5E,UAAM,YAAY,YAAY,MAAM;AACpC,UAAM,iBAAiB,iBAAiB,MAAM;AAC9C,QAAI,OAAO,cAAc,YAAY,OAAO,mBAAmB,SAAU;AACzE,UAAM,QAAQ,iBAAiB;AAC/B,WAAO,MAAM,IAAI;AACjB,QAAI,UAAU,EAAG;AACjB,UAAM,gBAAgB,wBAAwB,IAAI,MAAM;AACxD,UAAM,WAAW,gBAAgB,QAAQ,IAAI,QAAQ;AACrD,UAAM,UAAU,GAAG,MAAM,IAAI,SAAS,OAAO,cAAc;AAC3D,QAAI,UAAU;AACZ,mBAAa,KAAK,OAAO;AAAA,IAC3B,OAAO;AACL,kBAAY,KAAK,OAAO;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,aAAa,aAAa;AAC7C;AAEA,SAAS,gCAAgC,QAAyC;AAChF,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,aAAa,OAAO,SAAS,QAAQ,IAAI;AAAA,IACzC,wBAAwB,OAAO,kBAAkB;AAAA,IACjD,uBAAuB,OAAO,iBAAiB;AAAA,IAC/C,2BAA2B,OAAO,qBAAqB;AAAA,IACvD,qBAAqB,OAAO,gBAAgB;AAAA,IAC5C,0BAA0B,OAAO,kBAAkB;AAAA,EACrD;AAEA,MAAI,OAAO,2BAA2B,SAAS,GAAG;AAChD,UAAM,KAAK,mCAAmC,OAAO,2BAA2B,KAAK,IAAI,CAAC,EAAE;AAAA,EAC9F;AAEA,QAAM;AAAA,IACJ,6CAA6C,OAAO,iBAAiB,UAAU,UAAU,UAAU,OAAO,iBAAiB,UAAU,IAAI,aAAa,OAAO,iBAAiB,UAAU,OAAO,eAAe,OAAO,iBAAiB,UAAU,SAAS;AAAA,IACzP;AAAA,IACA;AAAA,EACF;AACA,MAAI,OAAO,YAAY,WAAW,GAAG;AACnC,UAAM,KAAK,QAAQ;AAAA,EACrB,OAAO;AACL,eAAW,cAAc,OAAO,YAAa,OAAM,KAAK,KAAK,UAAU,EAAE;AAAA,EAC3E;AAEA,QAAM,KAAK,IAAI,iBAAiB;AAChC,MAAI,OAAO,aAAa,WAAW,GAAG;AACpC,UAAM,KAAK,QAAQ;AAAA,EACrB,OAAO;AACL,eAAW,eAAe,OAAO,aAAc,OAAM,KAAK,KAAK,WAAW,EAAE;AAAA,EAC9E;AAEA,QAAM,KAAK,IAAI,qBAAqB;AACpC,MAAI,OAAO,OAAO,WAAW,GAAG;AAC9B,UAAM,KAAK,QAAQ;AAAA,EACrB,OAAO;AACL,eAAW,SAAS,OAAO,QAAQ;AACjC,YAAM;AAAA,QACJ,KAAK,MAAM,WAAW,cAAc,MAAM,YAAY,OAAO,MAAM,iBAAiB,WAAW,MAAM,aAAa;AAAA,MACpH;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,eAAe,yBAAyB,SAA+D;AACrG,QAAM,UAAU,QAAQ;AACxB,QAAM,eAAe,KAAK,KAAK,SAAS,YAAY;AACpD,QAAM,UAAU,KAAK,KAAK,SAAS,MAAM;AACzC,QAAM,YAAY,KAAK,KAAK,SAAS,QAAQ;AAC7C,QAAM,cAAc,KAAK,KAAK,SAAS,WAAW;AAClD,QAAM,iBAAiB,MAAM,eAAe,cAAc,eAAe;AACzE,QAAM,WAAW,MAAM,cAAc,OAAO;AAC5C,QAAM,cAAc,MAAM,cAAc,SAAS;AACjD,QAAM,gBAAgB,MAAM,cAAc,WAAW;AAErD,QAAM,oBAA4D,CAAC;AACnE,QAAM,cAAsD,CAAC;AAC7D,QAAM,iBAAyD,CAAC;AAChE,QAAM,mBAA2D,CAAC;AAClE,QAAM,YAAqC,CAAC;AAE5C,aAAW,YAAY,gBAAgB;AACrC,QAAI;AACF,gBAAU;AAAA,QACR,8BAA8B,MAAM,aAAa,QAAQ,GAAG;AAAA,UAC1D,2BAA2B,QAAQ;AAAA,QACrC,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,wBAAkB,KAAK;AAAA,QACrB,MAAM;AAAA,QACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,OAAyB,CAAC;AAChC,aAAW,YAAY,UAAU;AAC/B,QAAI;AACF,WAAK,KAAK,uBAAuB,MAAM,aAAa,QAAQ,CAAC,CAAC;AAAA,IAChE,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,UAAoC,CAAC;AAC3C,aAAW,YAAY,aAAa;AAClC,QAAI;AACF,cAAQ,KAAK,+BAA+B,MAAM,aAAa,QAAQ,CAAC,CAAC;AAAA,IAC3E,SAAS,OAAO;AACd,qBAAe,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,YAAoC,CAAC;AAC3C,aAAW,YAAY,eAAe;AACpC,QAAI;AACF,gBAAU,KAAK,6BAA6B,MAAM,aAAa,QAAQ,CAAC,CAAC;AAAA,IAC3E,SAAS,OAAO;AACd,uBAAiB,KAAK;AAAA,QACpB,MAAM;AAAA,QACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF;AAEA,OAAK,KAAK,CAAC,GAAG,MAAM;AAClB,UAAM,QAAQ,KAAK,MAAM,EAAE,eAAe,EAAE,SAAS;AACrD,UAAM,QAAQ,KAAK,MAAM,EAAE,eAAe,EAAE,SAAS;AACrD,YAAQ,OAAO,MAAM,KAAK,IAAI,IAAI,UAAU,OAAO,MAAM,KAAK,IAAI,IAAI;AAAA,EACxE,CAAC;AACD,UAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,cAAc,EAAE,UAAU,CAAC;AAC/D,YAAU,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,cAAc,EAAE,SAAS,CAAC;AAE/D,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,gBAAgB,oBAAI,IAAY;AACtC,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,iBAAiB,oBAAI,IAAY;AACvC,MAAI,aAAa;AACjB,MAAI,UAAU;AACd,aAAW,YAAY,WAAW;AAChC,kBAAc,SAAS,MAAM;AAC7B,QAAI,SAAS,kBAAkB,mBAAmB;AAChD,iBAAW;AACX,UAAI,SAAS,YAAa,eAAc,IAAI,SAAS,WAAW;AAChE,UAAI,SAAS,cAAe,gBAAe,IAAI,SAAS,aAAa;AAAA,IACvE;AACA,eAAW,OAAO,SAAS,QAAQ,CAAC,EAAG,MAAK,IAAI,GAAG;AACnD,eAAW,QAAQ,SAAS,eAAe,CAAC,EAAG,aAAY,IAAI,IAAI;AAAA,EACrE;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,SAAS,QAAQ;AAAA,MACjB,mBAAmB,QAAQ;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,QACV,OAAO,eAAe;AAAA,QACtB,OAAO,UAAU;AAAA,QACjB,SAAS,kBAAkB;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,eAAe,CAAC,GAAG,aAAa,EAAE,KAAK;AAAA,QACvC,MAAM,CAAC,GAAG,IAAI,EAAE,KAAK;AAAA,QACrB,gBAAgB,CAAC,GAAG,cAAc,EAAE,KAAK;AAAA,QACzC,aAAa,CAAC,GAAG,WAAW,EAAE,KAAK;AAAA,MACrC;AAAA,MACA,MAAM;AAAA,QACJ,OAAO,SAAS;AAAA,QAChB,SAAS,YAAY;AAAA,QACrB,WAAW,KAAK,OAAO,CAAC,QAAQ,IAAI,WAAW,WAAW,EAAE;AAAA,QAC5D,QAAQ,KAAK,OAAO,CAAC,QAAQ,IAAI,WAAW,QAAQ,EAAE;AAAA,QACtD,SAAS,KAAK,OAAO,CAAC,QAAQ,IAAI,WAAW,SAAS,EAAE;AAAA,QACxD,SAAS,KAAK,OAAO,CAAC,QAAQ,IAAI,WAAW,SAAS,EAAE;AAAA,QACxD,aAAa,KAAK,CAAC,GAAG;AAAA,QACtB,mBAAmB,KAAK,CAAC,GAAG;AAAA,QAC5B,mBAAmB,KAAK,CAAC,GAAG;AAAA,MAC9B;AAAA,MACA,SAAS;AAAA,QACP,OAAO,YAAY;AAAA,QACnB,SAAS,eAAe;AAAA,QACxB,eAAe,QAAQ,CAAC,GAAG;AAAA,QAC3B,kBAAkB,QAAQ,CAAC,GAAG;AAAA,QAC9B,kBAAkB,QAAQ,CAAC,GAAG;AAAA,MAChC;AAAA,MACA,WAAW;AAAA,QACT,SAAS,QAAQ,6BAA6B;AAAA,QAC9C,OAAO,cAAc;AAAA,QACrB,SAAS,iBAAiB;AAAA,QAC1B,kBAAkB,UAAU,CAAC,GAAG;AAAA,QAChC,iBAAiB,UAAU,CAAC,GAAG;AAAA,QAC/B,sBAAsB,UAAU,CAAC,GAAG;AAAA,MACtC;AAAA,MACA,WAAW,KAAK,CAAC;AAAA,MACjB,cAAc,QAAQ,CAAC;AAAA,MACvB,gBAAgB,UAAU,CAAC;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,6BAA6B,YAAyF;AACnI,QAAM,OAAO,MAAM,KAAK,UAAU;AAClC,MAAI,KAAK,YAAY,GAAG;AACtB,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,cAAc,KAAK,KAAK,YAAY,eAAe;AAAA,IACrD;AAAA,EACF;AACA,MAAI,KAAK,OAAO,GAAG;AACjB,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB;AAAA,EACF;AACA,QAAM,IAAI,MAAM,mDAAmD;AACrE;AAEA,eAAsB,0BACpB,YACA,SACmC;AACnC,QAAM,oBAAoB,WAAW,KAAK;AAC1C,MAAI,kBAAkB,WAAW,GAAG;AAClC,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,QAAM,EAAE,aAAa,IAAI,MAAM,6BAA6B,iBAAiB;AAC7E,QAAM,WAAW,8BAA8B,MAAM,aAAa,YAAY,GAAG;AAAA,IAC/E,2BAA2B,SAAS;AAAA,EACtC,CAAC;AACD,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,IACA,aAAa,sBAAsB,SAAS,WAAW;AAAA,IACvD,eAAe,SAAS,iBAAiB;AAAA,IACzC,OAAO,SAAS;AAAA,IAChB,aAAa,SAAS;AAAA,IACtB,eAAe,SAAS;AAAA,IACxB,YAAY,SAAS,MAAM;AAAA,IAC3B,MAAM,CAAC,GAAI,SAAS,QAAQ,CAAC,CAAE;AAAA,IAC/B,aAAa,CAAC,GAAI,SAAS,eAAe,CAAC,CAAE;AAAA,EAC/C;AACF;AAEA,eAAsB,wBAAwB,SAMsC;AAClF,QAAM,UAAU,MAAM,0BAA0B,QAAQ,YAAY;AAAA,IAClE,2BAA2B,QAAQ;AAAA,EACrC,CAAC;AACD,QAAM,UAAU,oBAAoB,QAAQ,WAAW,QAAQ,YAAY;AAC3E,QAAM,eAAe,KAAK,KAAK,SAAS,YAAY;AACpD,QAAM,YAAY,KAAK,KAAK,cAAc,QAAQ,WAAW;AAC7D,QAAM,EAAE,YAAY,aAAa,IAAI,MAAM,6BAA6B,QAAQ,UAAU;AAE1F,MAAI,cAAc;AAClB,MAAI;AACF,UAAM,KAAK,SAAS;AACpB,QAAI,QAAQ,UAAU,MAAM;AAC1B,YAAM,IAAI,MAAM,oCAAoC,SAAS,kCAAkC;AAAA,IACjG;AACA,kBAAc;AACd,UAAM,GAAG,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACtD,SAAS,OAAO;AACd,QAAI,EAAE,iBAAiB,UAAU,EAAE,UAAU,UAAW,MAAgC,SAAS,UAAU;AACzG,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,MAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAC7C,MAAI,eAAe,aAAa;AAC9B,UAAM,GAAG,QAAQ,YAAY,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC7D,OAAO;AACL,UAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,UAAM,GAAG,cAAc,KAAK,KAAK,WAAW,eAAe,CAAC;AAAA,EAC9D;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,uBAAuB,SAIzB;AAClB,QAAM,UAAU,oBAAoB,QAAQ,WAAW,QAAQ,YAAY;AAC3E,QAAM,YAAY,+BAA+B,QAAQ,MAAM;AAC/D,QAAM,MAAM,UAAU,WAAW,MAAM,GAAG,EAAE;AAC5C,QAAM,YAAY,KAAK,KAAK,SAAS,UAAU,GAAG;AAClD,QAAM,aAAa,KAAK,KAAK,WAAW,GAAG,UAAU,OAAO,OAAO;AACnE,QAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,QAAM,UAAU,YAAY,KAAK,UAAU,WAAW,MAAM,CAAC,GAAG,OAAO;AACvE,SAAO;AACT;AAEA,eAAsB,qBAAqB,SAOZ;AAC7B,UACE,MAAM,yBAAyB;AAAA,IAC7B,SAAS,oBAAoB,QAAQ,WAAW,QAAQ,YAAY;AAAA,IACpE,SAAS,QAAQ;AAAA,IACjB,mBAAmB,QAAQ;AAAA,IAC3B,0BAA0B,QAAQ;AAAA,IAClC,2BAA2B,QAAQ;AAAA,EACrC,CAAC,GACD;AACJ;AAEA,eAAsB,2BAA2B,SAQmB;AAClE,MAAI,QAAQ,6BAA6B,MAAM;AAC7C,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,QAAM,aAAa,sBAAsB,aAAa,QAAQ,YAAY,YAAY,GAAG,YAAY;AACrG,QAAM,UAAU,oBAAoB,QAAQ,WAAW,QAAQ,YAAY;AAC3E,QAAM,QAAQ,MAAM,yBAAyB;AAAA,IAC3C;AAAA,IACA,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,EAC7B,CAAC;AACD,QAAM,aAAa,+BAA+B,MAAM,IAAI;AAC5D,QAAM,aAAa,CAAC,GAAG,WAAW,OAAO,CAAC,EACvC,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,cAAc,EAAE,WAAW,CAAC,EACzD,IAAI,CAAC,SAAS;AAAA,IACb,aAAa,IAAI;AAAA,IACjB,OAAO,IAAI;AAAA,IACX,aAAa,IAAI;AAAA,IACjB,QAAQ,IAAI;AAAA,IACZ,UAAU,gBAAgB,GAAG;AAAA,IAC7B,SAAS,IAAI;AAAA,EACf,EAA0C;AAE5C,QAAM,WAAW,6BAA6B;AAAA,IAC5C,eAAe;AAAA,IACf;AAAA,IACA,WAAW,QAAQ,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACvD,eAAe;AAAA,IACf,gBAAgB,WAAW;AAAA,IAC3B;AAAA,IACA,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAED,QAAM,aAAa,KAAK,KAAK,SAAS,aAAa,GAAG,SAAS,UAAU,OAAO;AAChF,QAAM,MAAM,KAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACzD,QAAM,UAAU,YAAY,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,OAAO;AACtE,SAAO,EAAE,YAAY,SAAS;AAChC;AAEA,eAAsB,2BAA2B,SAKZ;AACnC,MAAI,QAAQ,kCAAkC,MAAM;AAClD,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAEA,QAAM,aAAa,sBAAsB,aAAa,QAAQ,YAAY,YAAY,GAAG,YAAY;AACrG,QAAM,mBAAmB,oBAAoB,QAAQ,WAAW,QAAQ,YAAY;AACpF,QAAM,oBAAoB,MAAM,yBAAyB;AAAA,IACvD,SAAS;AAAA,IACT,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,EAC7B,CAAC;AACD,QAAM,mBAAmB,kBAAkB,UAAU,KAAK,CAAC,aAAa,SAAS,eAAe,UAAU;AAC1G,MAAI,CAAC,kBAAkB;AACrB,UAAM,IAAI,MAAM,0CAA0C,UAAU,EAAE;AAAA,EACxE;AAEA,SAAO,6BAA6B;AAAA,IAClC;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,4BAA4B,SAMN;AAC1C,QAAM,aAAa,sBAAsB,aAAa,QAAQ,YAAY,YAAY,GAAG,YAAY;AACrG,QAAM,cAAc,oBAAoB,QAAQ,iBAAiB,QAAQ,kBAAkB,QAAQ,gBAAgB;AACnH,QAAM,mBAAmB;AAAA,IACvB,QAAQ,sBAAsB,QAAQ;AAAA,IACtC,QAAQ;AAAA,EACV;AACA,QAAM,CAAC,cAAc,iBAAiB,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC1D,yBAAyB;AAAA,MACvB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,0BAA0B;AAAA,MAC1B,2BAA2B;AAAA,IAC7B,CAAC;AAAA,IACD,yBAAyB;AAAA,MACvB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,0BAA0B;AAAA,MAC1B,2BAA2B;AAAA,IAC7B,CAAC;AAAA,EACH,CAAC;AACD,QAAM,mBACJ,aAAa,UAAU,KAAK,CAAC,aAAa,SAAS,eAAe,UAAU,KAC5E,kBAAkB,UAAU,KAAK,CAAC,aAAa,SAAS,eAAe,UAAU;AACnF,MAAI,CAAC,kBAAkB;AACrB,UAAM,IAAI,MAAM,0CAA0C,UAAU,EAAE;AAAA,EACxE;AAEA,SAAO;AAAA,IACL;AAAA,IACA,sBAAsB,aAAa,UAAU,KAAK,CAAC,aAAa,SAAS,eAAe,UAAU,IAAI,SAAS;AAAA,IAC/G,GAAG,6BAA6B;AAAA,MAC9B;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,6BAA6B,SAGV;AAC1B,QAAM,EAAE,kBAAkB,kBAAkB,IAAI;AAEhD,QAAM,cAAwB,CAAC;AAC/B,QAAM,eAAyB,CAAC;AAEhC,MAAI,kBAAkB,OAAO,kBAAkB,SAAS,GAAG;AACzD,gBAAY,KAAK,uBAAuB,kBAAkB,OAAO,kBAAkB,MAAM,gCAAgC;AAAA,EAC3H;AACA,MAAI,kBAAkB,OAAO,YAAY,SAAS,GAAG;AACnD,gBAAY,KAAK,uBAAuB,kBAAkB,OAAO,YAAY,MAAM,8BAA8B;AAAA,EACnH;AACA,MAAI,kBAAkB,OAAO,eAAe,SAAS,GAAG;AACtD,gBAAY,KAAK,uBAAuB,kBAAkB,OAAO,eAAe,MAAM,2BAA2B;AAAA,EACnH;AACA,MAAI,kBAAkB,OAAO,iBAAiB,SAAS,GAAG;AACxD,gBAAY,KAAK,uBAAuB,kBAAkB,OAAO,iBAAiB,MAAM,oCAAoC;AAAA,EAC9H;AAEA,QAAM,gBAAgB,+BAA+B,kBAAkB,IAAI;AAC3E,QAAM,qBAAqB,IAAI;AAAA,IAC7B,iBAAiB,WAAW,IAAI,CAAC,cAAc,CAAC,UAAU,aAAa,SAAS,CAAU;AAAA,EAC5F;AACA,QAAM,6BAA6B,CAAC,GAAG,mBAAmB,KAAK,CAAC,EAC7D,OAAO,CAAC,gBAAgB,CAAC,cAAc,IAAI,WAAW,CAAC,EACvD,KAAK;AACR,aAAW,eAAe,4BAA4B;AACpD,gBAAY,KAAK,2DAA2D,WAAW,EAAE;AAAA,EAC3F;AAEA,QAAM,SAA+B,CAAC;AACtC,aAAW,eAAe,CAAC,GAAG,mBAAmB,KAAK,CAAC,EAAE,KAAK,GAAG;AAC/D,UAAM,gBAAgB,mBAAmB,IAAI,WAAW;AACxD,UAAM,eAAe,cAAc,IAAI,WAAW;AAClD,QAAI,CAAC,iBAAiB,CAAC,aAAc;AAErC,UAAM,gBAAgB,gBAAgB,YAAY,IAAI,cAAc;AACpE,UAAM,QAA4B;AAAA,MAChC;AAAA,MACA,WAAW,cAAc;AAAA,MACzB,gBAAgB,aAAa;AAAA,MAC7B,cAAc,cAAc;AAAA,MAC5B,mBAAmB,gBAAgB,YAAY;AAAA,MAC/C;AAAA,MACA,cAAc,CAAC;AAAA,MACf,aAAa,CAAC;AAAA,MACd,cAAc,CAAC;AAAA,IACjB;AAEA,QAAI,gBAAgB,GAAG;AACrB,YAAM,YAAY,KAAK,YAAY,cAAc,QAAQ,OAAO,MAAM,iBAAiB,EAAE;AACzF,kBAAY,KAAK,GAAG,WAAW,yBAAyB,cAAc,QAAQ,OAAO,MAAM,iBAAiB,GAAG;AAAA,IACjH,WAAW,gBAAgB,GAAG;AAC5B,YAAM,aAAa,KAAK,YAAY,cAAc,QAAQ,OAAO,MAAM,iBAAiB,EAAE;AAC1F,mBAAa,KAAK,GAAG,WAAW,wBAAwB,cAAc,QAAQ,OAAO,MAAM,iBAAiB,GAAG;AAAA,IACjH;AAEA,UAAM,cAAc,oBAAoB,cAAc,SAAS,aAAa,OAAO;AACnF,UAAM,eAAe,YAAY;AACjC,eAAW,cAAc,YAAY,aAAa;AAChD,YAAM,YAAY,KAAK,UAAU;AACjC,kBAAY,KAAK,GAAG,WAAW,IAAI,UAAU,EAAE;AAAA,IACjD;AACA,eAAW,eAAe,YAAY,cAAc;AAClD,YAAM,aAAa,KAAK,WAAW;AACnC,mBAAa,KAAK,GAAG,WAAW,IAAI,WAAW,EAAE;AAAA,IACnD;AACA,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,QAAM,SAAkC;AAAA,IACtC,QAAQ,YAAY,WAAW;AAAA,IAC/B,oBAAoB,iBAAiB;AAAA,IACrC,mBAAmB,iBAAiB;AAAA,IACpC,uBAAuB,iBAAiB;AAAA,IACxC,kBAAkB,kBAAkB,OAAO;AAAA,IAC3C,oBAAoB,OAAO;AAAA,IAC3B;AAAA,IACA,kBAAkB;AAAA,MAChB,WAAW;AAAA,QACT,YAAY,kBAAkB,OAAO,kBAAkB;AAAA,QACvD,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC3C,SAAS,kBAAkB,OAAO,eAAe;AAAA,QACjD,WAAW,kBAAkB,OAAO,iBAAiB;AAAA,MACvD;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,EAClB;AACA,SAAO,iBAAiB,gCAAgC,MAAM;AAC9D,SAAO;AACT;AAEA,SAAS,6BAA6B,SAAwD,OAAuB;AACnH,MAAI,OAAO,QAAQ,iBAAiB,YAAY,QAAQ,aAAa,KAAK,EAAE,SAAS,GAAG;AACtF,WAAO,QAAQ,aAAa,KAAK;AAAA,EACnC;AACA,MAAI,OAAO,QAAQ,cAAc,YAAY,QAAQ,UAAU,KAAK,EAAE,SAAS,GAAG;AAChF,WAAO,oBAAoB,QAAQ,UAAU,KAAK,CAAC;AAAA,EACrD;AACA,QAAM,IAAI,MAAM,GAAG,KAAK,qCAAqC;AAC/D;AAEA,eAAsB,uBAAuB,SAKf;AAC5B,QAAM,cAAc;AAAA,IAClB,EAAE,WAAW,QAAQ,eAAe,cAAc,QAAQ,iBAAiB;AAAA,IAC3E;AAAA,EACF;AACA,QAAM,mBAAmB;AAAA,IACvB,EAAE,WAAW,QAAQ,oBAAoB,cAAc,QAAQ,sBAAsB;AAAA,IACrF;AAAA,EACF;AACA,QAAM,eAAe,MAAM,yBAAyB;AAAA,IAClD,SAAS;AAAA,IACT,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,2BAA2B;AAAA,EAC7B,CAAC;AACD,QAAM,oBAAoB,MAAM,yBAAyB;AAAA,IACvD,SAAS;AAAA,IACT,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,2BAA2B;AAAA,EAC7B,CAAC;AAED,QAAM,cAAwB,CAAC;AAC/B,QAAM,eAAyB,CAAC;AAEhC,MAAI,aAAa,OAAO,kBAAkB,SAAS,GAAG;AACpD,gBAAY,KAAK,kBAAkB,aAAa,OAAO,kBAAkB,MAAM,gCAAgC;AAAA,EACjH;AACA,MAAI,aAAa,OAAO,YAAY,SAAS,GAAG;AAC9C,gBAAY,KAAK,kBAAkB,aAAa,OAAO,YAAY,MAAM,8BAA8B;AAAA,EACzG;AACA,MAAI,aAAa,OAAO,eAAe,SAAS,GAAG;AACjD,gBAAY,KAAK,kBAAkB,aAAa,OAAO,eAAe,MAAM,2BAA2B;AAAA,EACzG;AACA,MAAI,kBAAkB,OAAO,kBAAkB,SAAS,GAAG;AACzD,gBAAY,KAAK,uBAAuB,kBAAkB,OAAO,kBAAkB,MAAM,gCAAgC;AAAA,EAC3H;AACA,MAAI,kBAAkB,OAAO,YAAY,SAAS,GAAG;AACnD,gBAAY,KAAK,uBAAuB,kBAAkB,OAAO,YAAY,MAAM,8BAA8B;AAAA,EACnH;AACA,MAAI,kBAAkB,OAAO,eAAe,SAAS,GAAG;AACtD,gBAAY,KAAK,uBAAuB,kBAAkB,OAAO,eAAe,MAAM,2BAA2B;AAAA,EACnH;AAEA,QAAM,WAAW,+BAA+B,aAAa,IAAI;AACjE,QAAM,gBAAgB,+BAA+B,kBAAkB,IAAI;AAC3E,QAAM,6BAA6B,CAAC,GAAG,SAAS,KAAK,CAAC,EACnD,OAAO,CAAC,gBAAgB,CAAC,cAAc,IAAI,WAAW,CAAC,EACvD,KAAK;AACR,aAAW,eAAe,4BAA4B;AACpD,gBAAY,KAAK,2DAA2D,WAAW,EAAE;AAAA,EAC3F;AAEA,QAAM,SAA+B,CAAC;AACtC,aAAW,eAAe,CAAC,GAAG,SAAS,KAAK,CAAC,EAAE,KAAK,GAAG;AACrD,UAAM,UAAU,SAAS,IAAI,WAAW;AACxC,UAAM,eAAe,cAAc,IAAI,WAAW;AAClD,QAAI,CAAC,WAAW,CAAC,aAAc;AAE/B,UAAM,eAAe,gBAAgB,OAAO;AAC5C,UAAM,oBAAoB,gBAAgB,YAAY;AACtD,UAAM,gBAAgB,oBAAoB;AAC1C,UAAM,QAA4B;AAAA,MAChC;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,gBAAgB,aAAa;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,CAAC;AAAA,MACf,aAAa,CAAC;AAAA,MACd,cAAc,CAAC;AAAA,IACjB;AAEA,QAAI,gBAAgB,GAAG;AACrB,YAAM,YAAY,KAAK,YAAY,YAAY,OAAO,iBAAiB,EAAE;AACzE,kBAAY,KAAK,GAAG,WAAW,yBAAyB,YAAY,OAAO,iBAAiB,GAAG;AAAA,IACjG,WAAW,gBAAgB,GAAG;AAC5B,YAAM,aAAa,KAAK,YAAY,YAAY,OAAO,iBAAiB,EAAE;AAC1E,mBAAa,KAAK,GAAG,WAAW,wBAAwB,YAAY,OAAO,iBAAiB,GAAG;AAAA,IACjG;AAEA,UAAM,cAAc,oBAAoB,QAAQ,SAAS,aAAa,OAAO;AAC7E,UAAM,eAAe,YAAY;AACjC,eAAW,cAAc,YAAY,aAAa;AAChD,YAAM,YAAY,KAAK,UAAU;AACjC,kBAAY,KAAK,GAAG,WAAW,IAAI,UAAU,EAAE;AAAA,IACjD;AACA,eAAW,eAAe,YAAY,cAAc;AAClD,YAAM,aAAa,KAAK,WAAW;AACnC,mBAAa,KAAK,GAAG,WAAW,IAAI,WAAW,EAAE;AAAA,IACnD;AACA,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,SAAO;AAAA,IACL,QAAQ,YAAY,WAAW;AAAA,IAC/B,aAAa,aAAa,OAAO;AAAA,IACjC,kBAAkB,kBAAkB,OAAO;AAAA,IAC3C,oBAAoB,OAAO;AAAA,IAC3B;AAAA,IACA,kBAAkB;AAAA,MAChB,MAAM;AAAA,QACJ,YAAY,aAAa,OAAO,kBAAkB;AAAA,QAClD,MAAM,aAAa,OAAO,YAAY;AAAA,QACtC,SAAS,aAAa,OAAO,eAAe;AAAA,MAC9C;AAAA,MACA,WAAW;AAAA,QACT,YAAY,kBAAkB,OAAO,kBAAkB;AAAA,QACvD,MAAM,kBAAkB,OAAO,YAAY;AAAA,QAC3C,SAAS,kBAAkB,OAAO,eAAe;AAAA,MACnD;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// src/tokens.ts
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { randomBytes } from "crypto";
|
|
5
|
+
var TOKEN_PREFIXES = {
|
|
6
|
+
"openclaw": "remnic_oc_",
|
|
7
|
+
"claude-code": "remnic_cc_",
|
|
8
|
+
"codex": "remnic_cx_",
|
|
9
|
+
"hermes": "remnic_hm_",
|
|
10
|
+
"replit": "remnic_rl_",
|
|
11
|
+
"cursor": "remnic_cu_",
|
|
12
|
+
"cline": "remnic_cl_",
|
|
13
|
+
"github-copilot": "remnic_gh_",
|
|
14
|
+
"roo-code": "remnic_rc_",
|
|
15
|
+
"windsurf": "remnic_ws_",
|
|
16
|
+
"amp": "remnic_am_",
|
|
17
|
+
"generic-mcp": "remnic_gm_"
|
|
18
|
+
};
|
|
19
|
+
function defaultTokensPath() {
|
|
20
|
+
return path.join(process.env.HOME ?? "~", ".remnic", "tokens.json");
|
|
21
|
+
}
|
|
22
|
+
function legacyTokensPath() {
|
|
23
|
+
return path.join(process.env.HOME ?? "~", ".engram", "tokens.json");
|
|
24
|
+
}
|
|
25
|
+
function resolveReadPath(tokensPath) {
|
|
26
|
+
const primary = tokensPath ?? defaultTokensPath();
|
|
27
|
+
if (tokensPath) return primary;
|
|
28
|
+
if (fs.existsSync(primary)) return primary;
|
|
29
|
+
const legacy = legacyTokensPath();
|
|
30
|
+
return fs.existsSync(legacy) ? legacy : primary;
|
|
31
|
+
}
|
|
32
|
+
function ensureDir(filePath) {
|
|
33
|
+
const dir = path.dirname(filePath);
|
|
34
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
35
|
+
}
|
|
36
|
+
function loadTokenStore(tokensPath) {
|
|
37
|
+
const p = resolveReadPath(tokensPath);
|
|
38
|
+
try {
|
|
39
|
+
const raw = JSON.parse(fs.readFileSync(p, "utf8"));
|
|
40
|
+
if (Array.isArray(raw.tokens)) {
|
|
41
|
+
return { tokens: raw.tokens };
|
|
42
|
+
}
|
|
43
|
+
if (typeof raw === "object" && raw !== null && !Array.isArray(raw)) {
|
|
44
|
+
const migrated = [];
|
|
45
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
46
|
+
if (key === "tokens") continue;
|
|
47
|
+
if (typeof value === "string" && value.length > 0) {
|
|
48
|
+
migrated.push({ token: value, connector: key, createdAt: (/* @__PURE__ */ new Date()).toISOString() });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (migrated.length > 0) {
|
|
52
|
+
const store = { tokens: migrated };
|
|
53
|
+
try {
|
|
54
|
+
saveTokenStore(store, tokensPath);
|
|
55
|
+
} catch {
|
|
56
|
+
}
|
|
57
|
+
return store;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { tokens: [] };
|
|
61
|
+
} catch {
|
|
62
|
+
return { tokens: [] };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function saveTokenStore(store, tokensPath) {
|
|
66
|
+
const p = tokensPath ?? defaultTokensPath();
|
|
67
|
+
ensureDir(p);
|
|
68
|
+
fs.writeFileSync(p, JSON.stringify(store, null, 2) + "\n", { mode: 384 });
|
|
69
|
+
try {
|
|
70
|
+
fs.chmodSync(p, 384);
|
|
71
|
+
} catch {
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function generateToken(connector, tokensPath) {
|
|
75
|
+
const store = loadTokenStore(tokensPath);
|
|
76
|
+
store.tokens = store.tokens.filter((t) => t.connector !== connector);
|
|
77
|
+
const prefix = TOKEN_PREFIXES[connector] ?? "remnic_xx_";
|
|
78
|
+
const token = prefix + randomBytes(24).toString("hex");
|
|
79
|
+
const entry = {
|
|
80
|
+
token,
|
|
81
|
+
connector,
|
|
82
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
83
|
+
};
|
|
84
|
+
store.tokens.push(entry);
|
|
85
|
+
saveTokenStore(store, tokensPath);
|
|
86
|
+
return entry;
|
|
87
|
+
}
|
|
88
|
+
function listTokens(tokensPath) {
|
|
89
|
+
return loadTokenStore(tokensPath).tokens;
|
|
90
|
+
}
|
|
91
|
+
function revokeToken(connector, tokensPath) {
|
|
92
|
+
const store = loadTokenStore(tokensPath);
|
|
93
|
+
const before = store.tokens.length;
|
|
94
|
+
store.tokens = store.tokens.filter((t) => t.connector !== connector);
|
|
95
|
+
if (store.tokens.length < before) {
|
|
96
|
+
saveTokenStore(store, tokensPath);
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
function getAllValidTokens(tokensPath) {
|
|
102
|
+
return loadTokenStore(tokensPath).tokens.map((t) => t.token);
|
|
103
|
+
}
|
|
104
|
+
var TOKEN_CACHE_TTL_MS = 5e3;
|
|
105
|
+
var _cachedTokens = [];
|
|
106
|
+
var _cachedAt = 0;
|
|
107
|
+
var _cachedPath;
|
|
108
|
+
function getAllValidTokensCached(tokensPath) {
|
|
109
|
+
const now = Date.now();
|
|
110
|
+
if (now - _cachedAt < TOKEN_CACHE_TTL_MS && tokensPath === _cachedPath) return _cachedTokens;
|
|
111
|
+
_cachedTokens = getAllValidTokens(tokensPath);
|
|
112
|
+
_cachedAt = now;
|
|
113
|
+
_cachedPath = tokensPath;
|
|
114
|
+
return _cachedTokens;
|
|
115
|
+
}
|
|
116
|
+
function resolveConnectorFromToken(token, tokensPath) {
|
|
117
|
+
return loadTokenStore(tokensPath).tokens.find((t) => t.token === token)?.connector;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export {
|
|
121
|
+
loadTokenStore,
|
|
122
|
+
saveTokenStore,
|
|
123
|
+
generateToken,
|
|
124
|
+
listTokens,
|
|
125
|
+
revokeToken,
|
|
126
|
+
getAllValidTokens,
|
|
127
|
+
getAllValidTokensCached,
|
|
128
|
+
resolveConnectorFromToken
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=chunk-KL4CP4SB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tokens.ts"],"sourcesContent":["/**\n * Token management for Remnic multi-connector auth.\n *\n * Manages per-connector tokens in ~/.remnic/tokens.json.\n * Each connector gets a unique token with a recognizable prefix.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\n\nexport interface TokenEntry {\n token: string;\n connector: string;\n createdAt: string;\n}\n\nexport interface TokenStore {\n tokens: TokenEntry[];\n}\n\nconst TOKEN_PREFIXES: Record<string, string> = {\n \"openclaw\": \"remnic_oc_\",\n \"claude-code\": \"remnic_cc_\",\n \"codex\": \"remnic_cx_\",\n \"hermes\": \"remnic_hm_\",\n \"replit\": \"remnic_rl_\",\n \"cursor\": \"remnic_cu_\",\n \"cline\": \"remnic_cl_\",\n \"github-copilot\": \"remnic_gh_\",\n \"roo-code\": \"remnic_rc_\",\n \"windsurf\": \"remnic_ws_\",\n \"amp\": \"remnic_am_\",\n \"generic-mcp\": \"remnic_gm_\",\n};\n\nfunction defaultTokensPath(): string {\n return path.join(process.env.HOME ?? \"~\", \".remnic\", \"tokens.json\");\n}\n\nfunction legacyTokensPath(): string {\n return path.join(process.env.HOME ?? \"~\", \".engram\", \"tokens.json\");\n}\n\nfunction resolveReadPath(tokensPath?: string): string {\n const primary = tokensPath ?? defaultTokensPath();\n if (tokensPath) return primary;\n if (fs.existsSync(primary)) return primary;\n const legacy = legacyTokensPath();\n return fs.existsSync(legacy) ? legacy : primary;\n}\n\nfunction ensureDir(filePath: string): void {\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n}\n\nexport function loadTokenStore(tokensPath?: string): TokenStore {\n const p = resolveReadPath(tokensPath);\n try {\n const raw = JSON.parse(fs.readFileSync(p, \"utf8\"));\n if (Array.isArray(raw.tokens)) {\n return { tokens: raw.tokens };\n }\n // Migrate legacy flat-map format: { \"connector\": \"token_value\", ... }\n if (typeof raw === \"object\" && raw !== null && !Array.isArray(raw)) {\n const migrated: TokenEntry[] = [];\n for (const [key, value] of Object.entries(raw)) {\n if (key === \"tokens\") continue; // skip if tokens key exists but isn't array\n if (typeof value === \"string\" && value.length > 0) {\n migrated.push({ token: value, connector: key, createdAt: new Date().toISOString() });\n }\n }\n if (migrated.length > 0) {\n const store: TokenStore = { tokens: migrated };\n // Auto-migrate: rewrite in new format (best-effort, don't lose tokens on write failure)\n try {\n saveTokenStore(store, tokensPath);\n } catch {\n // Migration write failed (e.g., read-only fs) — still return parsed tokens\n }\n return store;\n }\n }\n return { tokens: [] };\n } catch {\n return { tokens: [] };\n }\n}\n\nexport function saveTokenStore(store: TokenStore, tokensPath?: string): void {\n const p = tokensPath ?? defaultTokensPath();\n ensureDir(p);\n fs.writeFileSync(p, JSON.stringify(store, null, 2) + \"\\n\", { mode: 0o600 });\n // Tighten permissions on pre-existing files (writeFileSync mode only applies to new files)\n try { fs.chmodSync(p, 0o600); } catch { /* ignore on platforms without chmod */ }\n}\n\nexport function generateToken(connector: string, tokensPath?: string): TokenEntry {\n const store = loadTokenStore(tokensPath);\n\n // Remove existing token for this connector\n store.tokens = store.tokens.filter((t) => t.connector !== connector);\n\n const prefix = TOKEN_PREFIXES[connector] ?? \"remnic_xx_\";\n const token = prefix + randomBytes(24).toString(\"hex\");\n const entry: TokenEntry = {\n token,\n connector,\n createdAt: new Date().toISOString(),\n };\n store.tokens.push(entry);\n saveTokenStore(store, tokensPath);\n return entry;\n}\n\nexport function listTokens(tokensPath?: string): TokenEntry[] {\n return loadTokenStore(tokensPath).tokens;\n}\n\nexport function revokeToken(connector: string, tokensPath?: string): boolean {\n const store = loadTokenStore(tokensPath);\n const before = store.tokens.length;\n store.tokens = store.tokens.filter((t) => t.connector !== connector);\n if (store.tokens.length < before) {\n saveTokenStore(store, tokensPath);\n return true;\n }\n return false;\n}\n\nexport function getAllValidTokens(tokensPath?: string): string[] {\n return loadTokenStore(tokensPath).tokens.map((t) => t.token);\n}\n\n// Cached token loader to avoid synchronous disk I/O on every HTTP request.\n// Re-reads tokens.json at most once per TTL interval (default 5s).\nconst TOKEN_CACHE_TTL_MS = 5_000;\nlet _cachedTokens: string[] = [];\nlet _cachedAt = 0;\nlet _cachedPath: string | undefined;\n\nexport function getAllValidTokensCached(tokensPath?: string): string[] {\n const now = Date.now();\n if (now - _cachedAt < TOKEN_CACHE_TTL_MS && tokensPath === _cachedPath) return _cachedTokens;\n _cachedTokens = getAllValidTokens(tokensPath);\n _cachedAt = now;\n _cachedPath = tokensPath;\n return _cachedTokens;\n}\n\nexport function resolveConnectorFromToken(token: string, tokensPath?: string): string | undefined {\n return loadTokenStore(tokensPath).tokens.find((t) => t.token === token)?.connector;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveProviderApiKey
|
|
3
|
+
} from "./chunk-LU3GQNDQ.js";
|
|
4
|
+
import {
|
|
5
|
+
buildChatCompletionTokenLimit,
|
|
6
|
+
shouldAssumeOpenAiChatCompletions
|
|
7
|
+
} from "./chunk-Y27UJK6V.js";
|
|
8
|
+
import {
|
|
9
|
+
extractJsonCandidates
|
|
10
|
+
} from "./chunk-UZB5KHKX.js";
|
|
11
|
+
import {
|
|
12
|
+
log
|
|
13
|
+
} from "./chunk-KWBU5S5U.js";
|
|
14
|
+
|
|
15
|
+
// src/fallback-llm.ts
|
|
16
|
+
var FallbackLlmClient = class {
|
|
17
|
+
gatewayConfig;
|
|
18
|
+
constructor(gatewayConfig) {
|
|
19
|
+
this.gatewayConfig = gatewayConfig;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Check if fallback is available (gateway config has at least one model).
|
|
23
|
+
*/
|
|
24
|
+
isAvailable(agentId) {
|
|
25
|
+
const models = this.getModelChain(agentId);
|
|
26
|
+
return models.length > 0;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Make a chat completion request using the gateway's default AI chain.
|
|
30
|
+
* Tries primary first, then each fallback in order.
|
|
31
|
+
* When agentId is provided, uses that agent persona's model chain instead of defaults.
|
|
32
|
+
*/
|
|
33
|
+
async chatCompletion(messages, options = {}) {
|
|
34
|
+
const models = this.getModelChain(options.agentId);
|
|
35
|
+
if (models.length === 0) {
|
|
36
|
+
log.warn("fallback LLM: no models configured in gateway");
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const runChain = async () => {
|
|
40
|
+
for (let i = 0; i < models.length; i++) {
|
|
41
|
+
const model = models[i];
|
|
42
|
+
const isFallback = i > 0;
|
|
43
|
+
try {
|
|
44
|
+
const result = await this.tryModel(model, messages, options);
|
|
45
|
+
if (result) {
|
|
46
|
+
if (isFallback) {
|
|
47
|
+
log.debug(`fallback LLM: succeeded using ${model.modelString} (fallback ${i})`);
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
content: result.content,
|
|
51
|
+
modelUsed: model.modelString,
|
|
52
|
+
usage: result.usage
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
} catch (err) {
|
|
56
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
57
|
+
log.debug(`fallback LLM: ${model.modelString} failed (${errorMsg}), trying next...`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
log.warn(`fallback LLM: all ${models.length} models in chain failed`);
|
|
61
|
+
return null;
|
|
62
|
+
};
|
|
63
|
+
if (typeof options.timeoutMs === "number") {
|
|
64
|
+
if (options.timeoutMs <= 0) {
|
|
65
|
+
log.warn("fallback LLM: timed out before request started");
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
let timeoutHandle;
|
|
69
|
+
try {
|
|
70
|
+
return await Promise.race([
|
|
71
|
+
runChain(),
|
|
72
|
+
new Promise((resolve) => {
|
|
73
|
+
timeoutHandle = setTimeout(() => {
|
|
74
|
+
log.warn(`fallback LLM: timed out after ${options.timeoutMs}ms`);
|
|
75
|
+
resolve(null);
|
|
76
|
+
}, options.timeoutMs);
|
|
77
|
+
})
|
|
78
|
+
]);
|
|
79
|
+
} finally {
|
|
80
|
+
if (timeoutHandle) clearTimeout(timeoutHandle);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return await runChain();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Make a request with structured output (Zod schema).
|
|
87
|
+
* Returns parsed JSON or null on failure.
|
|
88
|
+
*/
|
|
89
|
+
async parseWithSchema(messages, schema, options = {}) {
|
|
90
|
+
const detailed = await this.parseWithSchemaDetailed(messages, schema, options);
|
|
91
|
+
return detailed?.result ?? null;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Like parseWithSchema but also returns the model that was used,
|
|
95
|
+
* so callers can emit accurate trace events.
|
|
96
|
+
*/
|
|
97
|
+
async parseWithSchemaDetailed(messages, schema, options = {}) {
|
|
98
|
+
const response = await this.chatCompletion(messages, options);
|
|
99
|
+
if (!response?.content) return null;
|
|
100
|
+
try {
|
|
101
|
+
const candidates = extractJsonCandidates(response.content);
|
|
102
|
+
for (const c of candidates) {
|
|
103
|
+
try {
|
|
104
|
+
const parsed = JSON.parse(c);
|
|
105
|
+
return { result: schema.parse(parsed), modelUsed: response.modelUsed };
|
|
106
|
+
} catch {
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
} catch (err) {
|
|
111
|
+
log.warn("fallback LLM: failed to parse structured output:", err);
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get the full model chain from gateway config.
|
|
117
|
+
* Returns array of models in order: [primary, fallback1, fallback2, ...]
|
|
118
|
+
*
|
|
119
|
+
* When agentId is provided, looks up the matching entry in agents.list[]
|
|
120
|
+
* and uses that persona's model chain. Falls back to agents.defaults.model
|
|
121
|
+
* if agentId is not found or not provided.
|
|
122
|
+
*/
|
|
123
|
+
getModelChain(agentId) {
|
|
124
|
+
const chain = [];
|
|
125
|
+
const providers = this.gatewayConfig?.models?.providers;
|
|
126
|
+
if (!providers) return chain;
|
|
127
|
+
let modelConfig;
|
|
128
|
+
if (agentId) {
|
|
129
|
+
const persona = this.gatewayConfig?.agents?.list?.find(
|
|
130
|
+
(a) => a.id === agentId
|
|
131
|
+
);
|
|
132
|
+
if (persona?.model) {
|
|
133
|
+
modelConfig = persona.model;
|
|
134
|
+
log.debug(`fallback LLM: using agent persona "${agentId}" model chain`);
|
|
135
|
+
} else {
|
|
136
|
+
log.warn(
|
|
137
|
+
`fallback LLM: agent persona "${agentId}" not found or has no model config, falling back to defaults`
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (!modelConfig) {
|
|
142
|
+
modelConfig = this.gatewayConfig?.agents?.defaults?.model;
|
|
143
|
+
}
|
|
144
|
+
const modelStrings = [];
|
|
145
|
+
if (modelConfig?.primary) {
|
|
146
|
+
modelStrings.push(modelConfig.primary);
|
|
147
|
+
}
|
|
148
|
+
if (Array.isArray(modelConfig?.fallbacks)) {
|
|
149
|
+
for (const fb of modelConfig.fallbacks) {
|
|
150
|
+
if (typeof fb === "string" && !modelStrings.includes(fb)) {
|
|
151
|
+
modelStrings.push(fb);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
for (const modelString of modelStrings) {
|
|
156
|
+
const modelRef = this.parseModelString(modelString, providers);
|
|
157
|
+
if (modelRef) {
|
|
158
|
+
chain.push(modelRef);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return chain;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Parse a "provider/model" string and look up its config.
|
|
165
|
+
*/
|
|
166
|
+
parseModelString(modelString, providers) {
|
|
167
|
+
const parts = modelString.split("/");
|
|
168
|
+
if (parts.length < 2) {
|
|
169
|
+
log.warn(`fallback LLM: invalid model format: ${modelString}`);
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
const providerId = parts[0];
|
|
173
|
+
const modelId = parts.slice(1).join("/");
|
|
174
|
+
const providerConfig = providers[providerId];
|
|
175
|
+
if (!providerConfig) {
|
|
176
|
+
log.warn(`fallback LLM: provider not found: ${providerId}`);
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
return { providerId, modelId, providerConfig, modelString };
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Resolve the API key for a provider, handling OpenClaw secret ref formats.
|
|
183
|
+
* Results are cached per provider so exec calls only happen once.
|
|
184
|
+
*/
|
|
185
|
+
async resolveApiKey(providerId, providerConfig) {
|
|
186
|
+
return resolveProviderApiKey(providerId, providerConfig.apiKey, this.gatewayConfig);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Try to call a single model.
|
|
190
|
+
*/
|
|
191
|
+
async tryModel(model, messages, options) {
|
|
192
|
+
const rawKey = model.providerConfig.apiKey;
|
|
193
|
+
const needsResolution = rawKey === "secretref-managed" || typeof rawKey === "object" && rawKey !== null;
|
|
194
|
+
const resolvedApiKey = await this.resolveApiKey(model.providerId, model.providerConfig);
|
|
195
|
+
if (needsResolution && !resolvedApiKey) {
|
|
196
|
+
throw new Error(`API key for provider "${model.providerId}" could not be resolved from secret ref`);
|
|
197
|
+
}
|
|
198
|
+
const configWithResolvedKey = resolvedApiKey ? { ...model.providerConfig, apiKey: resolvedApiKey } : model.providerConfig;
|
|
199
|
+
switch (model.providerConfig.api) {
|
|
200
|
+
case "anthropic-messages":
|
|
201
|
+
return await this.callAnthropic(configWithResolvedKey, model.modelId, messages, options);
|
|
202
|
+
case "openai-completions":
|
|
203
|
+
default:
|
|
204
|
+
return await this.callOpenAI(
|
|
205
|
+
configWithResolvedKey,
|
|
206
|
+
model.modelId,
|
|
207
|
+
messages,
|
|
208
|
+
options,
|
|
209
|
+
shouldAssumeOpenAiChatCompletions(model.providerConfig.baseUrl)
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Call OpenAI-compatible API.
|
|
215
|
+
*/
|
|
216
|
+
async callOpenAI(config, modelId, messages, options, assumeOpenAI) {
|
|
217
|
+
const base = config.baseUrl.replace(/\/$/, "");
|
|
218
|
+
const url = base.endsWith("/v1") ? `${base}/chat/completions` : `${base}/v1/chat/completions`;
|
|
219
|
+
const headers = {
|
|
220
|
+
"Content-Type": "application/json",
|
|
221
|
+
...config.headers
|
|
222
|
+
};
|
|
223
|
+
if (config.apiKey && typeof config.apiKey === "string") {
|
|
224
|
+
if (config.authHeader !== false) {
|
|
225
|
+
headers["Authorization"] = `Bearer ${config.apiKey}`;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
const body = {
|
|
229
|
+
model: modelId,
|
|
230
|
+
messages,
|
|
231
|
+
temperature: options.temperature ?? 0.3,
|
|
232
|
+
...buildChatCompletionTokenLimit(modelId, options.maxTokens ?? 4096, {
|
|
233
|
+
assumeOpenAI
|
|
234
|
+
})
|
|
235
|
+
};
|
|
236
|
+
const response = await fetch(url, {
|
|
237
|
+
method: "POST",
|
|
238
|
+
headers,
|
|
239
|
+
body: JSON.stringify(body)
|
|
240
|
+
});
|
|
241
|
+
if (!response.ok) {
|
|
242
|
+
const error = await response.text();
|
|
243
|
+
throw new Error(`OpenAI API error: ${response.status} ${error}`);
|
|
244
|
+
}
|
|
245
|
+
const data = await response.json();
|
|
246
|
+
const content = data.choices?.[0]?.message?.content;
|
|
247
|
+
if (!content) {
|
|
248
|
+
throw new Error("Empty response from OpenAI API");
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
content,
|
|
252
|
+
usage: data.usage ? {
|
|
253
|
+
inputTokens: data.usage.prompt_tokens,
|
|
254
|
+
outputTokens: data.usage.completion_tokens,
|
|
255
|
+
totalTokens: data.usage.total_tokens
|
|
256
|
+
} : void 0
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Call Anthropic Messages API.
|
|
261
|
+
*/
|
|
262
|
+
async callAnthropic(config, modelId, messages, options) {
|
|
263
|
+
const url = `${config.baseUrl.replace(/\/$/, "")}/messages`;
|
|
264
|
+
const headers = {
|
|
265
|
+
"Content-Type": "application/json",
|
|
266
|
+
"anthropic-version": "2023-06-01",
|
|
267
|
+
...config.headers
|
|
268
|
+
};
|
|
269
|
+
if (config.apiKey && typeof config.apiKey === "string") {
|
|
270
|
+
headers["x-api-key"] = config.apiKey;
|
|
271
|
+
}
|
|
272
|
+
const systemMessage = messages.find((m) => m.role === "system")?.content;
|
|
273
|
+
const nonSystemMessages = messages.filter((m) => m.role !== "system");
|
|
274
|
+
const anthropicMessages = nonSystemMessages.map((m) => ({
|
|
275
|
+
role: m.role,
|
|
276
|
+
content: m.content
|
|
277
|
+
}));
|
|
278
|
+
const body = {
|
|
279
|
+
model: modelId,
|
|
280
|
+
messages: anthropicMessages,
|
|
281
|
+
max_tokens: options.maxTokens ?? 4096,
|
|
282
|
+
temperature: options.temperature ?? 0.3
|
|
283
|
+
};
|
|
284
|
+
if (systemMessage) {
|
|
285
|
+
body.system = systemMessage;
|
|
286
|
+
}
|
|
287
|
+
const response = await fetch(url, {
|
|
288
|
+
method: "POST",
|
|
289
|
+
headers,
|
|
290
|
+
body: JSON.stringify(body)
|
|
291
|
+
});
|
|
292
|
+
if (!response.ok) {
|
|
293
|
+
const error = await response.text();
|
|
294
|
+
throw new Error(`Anthropic API error: ${response.status} ${error}`);
|
|
295
|
+
}
|
|
296
|
+
const data = await response.json();
|
|
297
|
+
const content = data.content?.[0]?.text;
|
|
298
|
+
if (!content) {
|
|
299
|
+
throw new Error("Empty response from Anthropic API");
|
|
300
|
+
}
|
|
301
|
+
return {
|
|
302
|
+
content,
|
|
303
|
+
usage: data.usage ? {
|
|
304
|
+
inputTokens: data.usage.input_tokens,
|
|
305
|
+
outputTokens: data.usage.output_tokens,
|
|
306
|
+
totalTokens: (data.usage.input_tokens ?? 0) + (data.usage.output_tokens ?? 0)
|
|
307
|
+
} : void 0
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
export {
|
|
313
|
+
FallbackLlmClient
|
|
314
|
+
};
|
|
315
|
+
//# sourceMappingURL=chunk-KT4NEUNF.js.map
|