@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,143 @@
|
|
|
1
|
+
import {
|
|
2
|
+
scanSignals
|
|
3
|
+
} from "./chunk-XYIK4LF6.js";
|
|
4
|
+
import {
|
|
5
|
+
log
|
|
6
|
+
} from "./chunk-KWBU5S5U.js";
|
|
7
|
+
|
|
8
|
+
// src/bootstrap.ts
|
|
9
|
+
import path from "path";
|
|
10
|
+
import { readdir, readFile } from "fs/promises";
|
|
11
|
+
var BootstrapEngine = class {
|
|
12
|
+
constructor(config, orchestrator) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
this.orchestrator = orchestrator;
|
|
15
|
+
}
|
|
16
|
+
config;
|
|
17
|
+
orchestrator;
|
|
18
|
+
async run(options) {
|
|
19
|
+
const dryRun = options.dryRun === true;
|
|
20
|
+
const since = options.since ?? /* @__PURE__ */ new Date(0);
|
|
21
|
+
const end = /* @__PURE__ */ new Date();
|
|
22
|
+
const limit = Math.max(0, options.limit ?? Number.POSITIVE_INFINITY);
|
|
23
|
+
const sessions = await this.resolveSessions(options.sessionsDir, since, end);
|
|
24
|
+
const selected = sessions.slice(0, Number.isFinite(limit) ? limit : sessions.length);
|
|
25
|
+
const beforeCount = dryRun ? 0 : (await this.orchestrator.storage.readAllMemories()).length;
|
|
26
|
+
let turnsProcessed = 0;
|
|
27
|
+
let highSignalTurns = 0;
|
|
28
|
+
let skipped = 0;
|
|
29
|
+
for (const session of selected) {
|
|
30
|
+
for (const entry of session.entries) {
|
|
31
|
+
if (entry.role !== "user") continue;
|
|
32
|
+
turnsProcessed += 1;
|
|
33
|
+
const content = typeof entry.content === "string" ? entry.content.trim() : "";
|
|
34
|
+
if (!content) {
|
|
35
|
+
skipped += 1;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const signal = scanSignals(content, this.config.highSignalPatterns);
|
|
39
|
+
if (signal.level !== "high") {
|
|
40
|
+
skipped += 1;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
highSignalTurns += 1;
|
|
44
|
+
if (!dryRun) {
|
|
45
|
+
await this.orchestrator.processTurn("user", content, session.sessionKey);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
let memoriesCreated = 0;
|
|
50
|
+
if (!dryRun && highSignalTurns > 0) {
|
|
51
|
+
await this.orchestrator.waitForExtractionIdle();
|
|
52
|
+
const afterCount = (await this.orchestrator.storage.readAllMemories()).length;
|
|
53
|
+
memoriesCreated = Math.max(0, afterCount - beforeCount);
|
|
54
|
+
}
|
|
55
|
+
const result = {
|
|
56
|
+
sessionsScanned: selected.length,
|
|
57
|
+
turnsProcessed,
|
|
58
|
+
highSignalTurns,
|
|
59
|
+
memoriesCreated,
|
|
60
|
+
skipped
|
|
61
|
+
};
|
|
62
|
+
log.info(
|
|
63
|
+
`bootstrap complete: sessions=${result.sessionsScanned}, turns=${result.turnsProcessed}, high=${result.highSignalTurns}, created=${result.memoriesCreated}, skipped=${result.skipped}, dryRun=${dryRun}`
|
|
64
|
+
);
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
async resolveSessions(sessionsDir, since, until) {
|
|
68
|
+
if (sessionsDir && sessionsDir.trim().length > 0) {
|
|
69
|
+
return this.readSessionsFromDir(sessionsDir, since, until);
|
|
70
|
+
}
|
|
71
|
+
const keys = await this.orchestrator.transcript.listSessionKeys();
|
|
72
|
+
const sessions = [];
|
|
73
|
+
for (const key of keys) {
|
|
74
|
+
const entries = await this.orchestrator.transcript.readRange(
|
|
75
|
+
since.toISOString(),
|
|
76
|
+
until.toISOString(),
|
|
77
|
+
key
|
|
78
|
+
);
|
|
79
|
+
if (entries.length > 0) {
|
|
80
|
+
sessions.push({ sessionKey: key, entries });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return sessions;
|
|
84
|
+
}
|
|
85
|
+
async readSessionsFromDir(baseDir, since, until) {
|
|
86
|
+
const files = await this.listJsonlFiles(baseDir);
|
|
87
|
+
const bySession = /* @__PURE__ */ new Map();
|
|
88
|
+
for (const filePath of files) {
|
|
89
|
+
let raw = "";
|
|
90
|
+
try {
|
|
91
|
+
raw = await readFile(filePath, "utf-8");
|
|
92
|
+
} catch {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const lines = raw.split("\n").filter((line) => line.trim().length > 0);
|
|
96
|
+
for (const line of lines) {
|
|
97
|
+
let parsed;
|
|
98
|
+
try {
|
|
99
|
+
parsed = JSON.parse(line);
|
|
100
|
+
} catch {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const ts = new Date(String(parsed?.timestamp ?? ""));
|
|
104
|
+
if (Number.isNaN(ts.getTime())) continue;
|
|
105
|
+
if (ts < since || ts > until) continue;
|
|
106
|
+
const role = String(parsed?.role ?? "");
|
|
107
|
+
const content = typeof parsed?.content === "string" ? parsed.content : "";
|
|
108
|
+
if (!role || !content) continue;
|
|
109
|
+
const sessionKey = typeof parsed?.sessionKey === "string" && parsed.sessionKey.length > 0 ? parsed.sessionKey : path.relative(baseDir, filePath);
|
|
110
|
+
const list = bySession.get(sessionKey) ?? [];
|
|
111
|
+
list.push({
|
|
112
|
+
role,
|
|
113
|
+
content,
|
|
114
|
+
timestamp: ts.toISOString(),
|
|
115
|
+
sessionKey
|
|
116
|
+
});
|
|
117
|
+
bySession.set(sessionKey, list);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return Array.from(bySession.entries()).map(([sessionKey, entries]) => ({
|
|
121
|
+
sessionKey,
|
|
122
|
+
entries: entries.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime())
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
async listJsonlFiles(dir) {
|
|
126
|
+
const out = [];
|
|
127
|
+
const entries = await readdir(dir, { withFileTypes: true }).catch(() => []);
|
|
128
|
+
for (const entry of entries) {
|
|
129
|
+
const full = path.join(dir, entry.name);
|
|
130
|
+
if (entry.isDirectory()) {
|
|
131
|
+
out.push(...await this.listJsonlFiles(full));
|
|
132
|
+
} else if (entry.isFile() && full.endsWith(".jsonl")) {
|
|
133
|
+
out.push(full);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
export {
|
|
141
|
+
BootstrapEngine
|
|
142
|
+
};
|
|
143
|
+
//# sourceMappingURL=chunk-YNI4S5WT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bootstrap.ts"],"sourcesContent":["import path from \"node:path\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { scanSignals } from \"./signal.js\";\nimport { log } from \"./logger.js\";\nimport type { PluginConfig } from \"./types.js\";\nimport type { Orchestrator } from \"./orchestrator.js\";\n\nexport type BootstrapResult = {\n sessionsScanned: number;\n turnsProcessed: number;\n highSignalTurns: number;\n memoriesCreated: number;\n skipped: number;\n};\n\nexport type BootstrapOptions = {\n dryRun?: boolean;\n sessionsDir?: string;\n limit?: number;\n since?: Date;\n};\n\ntype BootstrapEntry = {\n role: string;\n content: string;\n timestamp: string;\n sessionKey?: string;\n};\n\nexport class BootstrapEngine {\n constructor(private config: PluginConfig, private orchestrator: Orchestrator) {}\n\n async run(options: BootstrapOptions): Promise<BootstrapResult> {\n const dryRun = options.dryRun === true;\n const since = options.since ?? new Date(0);\n const end = new Date();\n const limit = Math.max(0, options.limit ?? Number.POSITIVE_INFINITY);\n\n const sessions = await this.resolveSessions(options.sessionsDir, since, end);\n const selected = sessions.slice(0, Number.isFinite(limit) ? limit : sessions.length);\n\n const beforeCount = dryRun ? 0 : (await this.orchestrator.storage.readAllMemories()).length;\n let turnsProcessed = 0;\n let highSignalTurns = 0;\n let skipped = 0;\n\n for (const session of selected) {\n for (const entry of session.entries) {\n if (entry.role !== \"user\") continue;\n turnsProcessed += 1;\n\n const content = typeof entry.content === \"string\" ? entry.content.trim() : \"\";\n if (!content) {\n skipped += 1;\n continue;\n }\n\n const signal = scanSignals(content, this.config.highSignalPatterns);\n if (signal.level !== \"high\") {\n skipped += 1;\n continue;\n }\n\n highSignalTurns += 1;\n if (!dryRun) {\n await this.orchestrator.processTurn(\"user\", content, session.sessionKey);\n }\n }\n }\n\n let memoriesCreated = 0;\n if (!dryRun && highSignalTurns > 0) {\n await this.orchestrator.waitForExtractionIdle();\n const afterCount = (await this.orchestrator.storage.readAllMemories()).length;\n memoriesCreated = Math.max(0, afterCount - beforeCount);\n }\n\n const result: BootstrapResult = {\n sessionsScanned: selected.length,\n turnsProcessed,\n highSignalTurns,\n memoriesCreated,\n skipped,\n };\n log.info(\n `bootstrap complete: sessions=${result.sessionsScanned}, turns=${result.turnsProcessed}, high=${result.highSignalTurns}, created=${result.memoriesCreated}, skipped=${result.skipped}, dryRun=${dryRun}`,\n );\n return result;\n }\n\n private async resolveSessions(\n sessionsDir: string | undefined,\n since: Date,\n until: Date,\n ): Promise<Array<{ sessionKey: string; entries: BootstrapEntry[] }>> {\n if (sessionsDir && sessionsDir.trim().length > 0) {\n return this.readSessionsFromDir(sessionsDir, since, until);\n }\n\n const keys = await this.orchestrator.transcript.listSessionKeys();\n const sessions: Array<{ sessionKey: string; entries: BootstrapEntry[] }> = [];\n for (const key of keys) {\n const entries = await this.orchestrator.transcript.readRange(\n since.toISOString(),\n until.toISOString(),\n key,\n );\n if (entries.length > 0) {\n sessions.push({ sessionKey: key, entries });\n }\n }\n return sessions;\n }\n\n private async readSessionsFromDir(\n baseDir: string,\n since: Date,\n until: Date,\n ): Promise<Array<{ sessionKey: string; entries: BootstrapEntry[] }>> {\n const files = await this.listJsonlFiles(baseDir);\n const bySession = new Map<string, BootstrapEntry[]>();\n\n for (const filePath of files) {\n let raw = \"\";\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch {\n continue;\n }\n const lines = raw.split(\"\\n\").filter((line) => line.trim().length > 0);\n for (const line of lines) {\n let parsed: any;\n try {\n parsed = JSON.parse(line);\n } catch {\n continue;\n }\n const ts = new Date(String(parsed?.timestamp ?? \"\"));\n if (Number.isNaN(ts.getTime())) continue;\n if (ts < since || ts > until) continue;\n const role = String(parsed?.role ?? \"\");\n const content = typeof parsed?.content === \"string\" ? parsed.content : \"\";\n if (!role || !content) continue;\n const sessionKey = typeof parsed?.sessionKey === \"string\" && parsed.sessionKey.length > 0\n ? parsed.sessionKey\n : path.relative(baseDir, filePath);\n const list = bySession.get(sessionKey) ?? [];\n list.push({\n role,\n content,\n timestamp: ts.toISOString(),\n sessionKey,\n });\n bySession.set(sessionKey, list);\n }\n }\n\n return Array.from(bySession.entries()).map(([sessionKey, entries]) => ({\n sessionKey,\n entries: entries.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()),\n }));\n }\n\n private async listJsonlFiles(dir: string): Promise<string[]> {\n const out: string[] = [];\n const entries = await readdir(dir, { withFileTypes: true }).catch(() => []);\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n out.push(...(await this.listJsonlFiles(full)));\n } else if (entry.isFile() && full.endsWith(\".jsonl\")) {\n out.push(full);\n }\n }\n return out;\n }\n}\n\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
// src/session-integrity.ts
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { readFile, readdir, unlink, writeFile } from "fs/promises";
|
|
4
|
+
function isObjectRecord(input) {
|
|
5
|
+
return Boolean(input) && typeof input === "object";
|
|
6
|
+
}
|
|
7
|
+
function isTranscriptEntry(raw) {
|
|
8
|
+
if (!isObjectRecord(raw)) return false;
|
|
9
|
+
if (raw.role !== "user" && raw.role !== "assistant") return false;
|
|
10
|
+
return typeof raw.timestamp === "string" && raw.timestamp.length > 0 && typeof raw.content === "string" && typeof raw.sessionKey === "string" && raw.sessionKey.length > 0 && typeof raw.turnId === "string" && raw.turnId.length > 0;
|
|
11
|
+
}
|
|
12
|
+
async function listTranscriptFiles(memoryDir) {
|
|
13
|
+
const transcriptsDir = path.join(memoryDir, "transcripts");
|
|
14
|
+
const out = [];
|
|
15
|
+
const stack = [transcriptsDir];
|
|
16
|
+
while (stack.length > 0) {
|
|
17
|
+
const dir = stack.pop();
|
|
18
|
+
if (!dir) continue;
|
|
19
|
+
let entries;
|
|
20
|
+
try {
|
|
21
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
22
|
+
} catch {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
for (const entry of entries) {
|
|
26
|
+
const fullPath = path.join(dir, entry.name);
|
|
27
|
+
if (entry.isDirectory()) {
|
|
28
|
+
stack.push(fullPath);
|
|
29
|
+
} else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
|
|
30
|
+
out.push(fullPath);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return out.sort((a, b) => a.localeCompare(b));
|
|
35
|
+
}
|
|
36
|
+
async function parseTranscriptFile(filePath) {
|
|
37
|
+
const bySession = /* @__PURE__ */ new Map();
|
|
38
|
+
const malformed = [];
|
|
39
|
+
const invalid = [];
|
|
40
|
+
const invalidBySession = /* @__PURE__ */ new Map();
|
|
41
|
+
let raw = "";
|
|
42
|
+
try {
|
|
43
|
+
raw = await readFile(filePath, "utf-8");
|
|
44
|
+
} catch {
|
|
45
|
+
return { bySession, malformed, invalid, invalidBySession };
|
|
46
|
+
}
|
|
47
|
+
const lines = raw.split("\n");
|
|
48
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
49
|
+
const line = lines[index]?.trim() ?? "";
|
|
50
|
+
if (!line) continue;
|
|
51
|
+
let parsed;
|
|
52
|
+
try {
|
|
53
|
+
parsed = JSON.parse(line);
|
|
54
|
+
} catch {
|
|
55
|
+
malformed.push({
|
|
56
|
+
code: "transcript_malformed_line",
|
|
57
|
+
severity: "warn",
|
|
58
|
+
message: "Transcript line is not valid JSON.",
|
|
59
|
+
filePath,
|
|
60
|
+
line: index + 1
|
|
61
|
+
});
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (!isTranscriptEntry(parsed)) {
|
|
65
|
+
const sessionKey = isObjectRecord(parsed) && typeof parsed.sessionKey === "string" && parsed.sessionKey.length > 0 ? parsed.sessionKey : void 0;
|
|
66
|
+
invalid.push({
|
|
67
|
+
code: "transcript_invalid_entry",
|
|
68
|
+
severity: "warn",
|
|
69
|
+
message: "Transcript entry is missing required fields.",
|
|
70
|
+
filePath,
|
|
71
|
+
line: index + 1,
|
|
72
|
+
sessionKey
|
|
73
|
+
});
|
|
74
|
+
if (sessionKey) {
|
|
75
|
+
invalidBySession.set(sessionKey, (invalidBySession.get(sessionKey) ?? 0) + 1);
|
|
76
|
+
}
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const list = bySession.get(parsed.sessionKey) ?? [];
|
|
80
|
+
list.push({ filePath, lineNumber: index + 1, entry: parsed });
|
|
81
|
+
bySession.set(parsed.sessionKey, list);
|
|
82
|
+
}
|
|
83
|
+
return { bySession, malformed, invalid, invalidBySession };
|
|
84
|
+
}
|
|
85
|
+
function analyzeSessionEntries(sessionKey, refs) {
|
|
86
|
+
function parseTimestampForSort(timestamp) {
|
|
87
|
+
const parsed = Date.parse(timestamp);
|
|
88
|
+
if (Number.isFinite(parsed)) return parsed;
|
|
89
|
+
return Number.MAX_SAFE_INTEGER;
|
|
90
|
+
}
|
|
91
|
+
const issues = [];
|
|
92
|
+
const sorted = [...refs].sort((a, b) => {
|
|
93
|
+
const tsA = parseTimestampForSort(a.entry.timestamp);
|
|
94
|
+
const tsB = parseTimestampForSort(b.entry.timestamp);
|
|
95
|
+
if (tsA !== tsB) return tsA - tsB;
|
|
96
|
+
const rawTimestampCmp = a.entry.timestamp.localeCompare(b.entry.timestamp);
|
|
97
|
+
if (rawTimestampCmp !== 0) return rawTimestampCmp;
|
|
98
|
+
return a.entry.turnId.localeCompare(b.entry.turnId);
|
|
99
|
+
});
|
|
100
|
+
const turnIdSeen = /* @__PURE__ */ new Set();
|
|
101
|
+
let duplicateTurnIds = 0;
|
|
102
|
+
let brokenChains = 0;
|
|
103
|
+
for (let i = 0; i < sorted.length; i += 1) {
|
|
104
|
+
const current = sorted[i];
|
|
105
|
+
if (turnIdSeen.has(current.entry.turnId)) {
|
|
106
|
+
duplicateTurnIds += 1;
|
|
107
|
+
issues.push({
|
|
108
|
+
code: "transcript_duplicate_turn_id",
|
|
109
|
+
severity: "warn",
|
|
110
|
+
message: `Duplicate turnId detected: ${current.entry.turnId}`,
|
|
111
|
+
sessionKey,
|
|
112
|
+
filePath: current.filePath,
|
|
113
|
+
line: current.lineNumber
|
|
114
|
+
});
|
|
115
|
+
} else {
|
|
116
|
+
turnIdSeen.add(current.entry.turnId);
|
|
117
|
+
}
|
|
118
|
+
if (i > 0) {
|
|
119
|
+
const previous = sorted[i - 1];
|
|
120
|
+
if (previous && previous.entry.role === current.entry.role) {
|
|
121
|
+
brokenChains += 1;
|
|
122
|
+
issues.push({
|
|
123
|
+
code: "transcript_broken_chain",
|
|
124
|
+
severity: "warn",
|
|
125
|
+
message: `Adjacent turns have the same role (${current.entry.role}).`,
|
|
126
|
+
sessionKey,
|
|
127
|
+
filePath: current.filePath,
|
|
128
|
+
line: current.lineNumber
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
let incompleteTurns = 0;
|
|
134
|
+
if (sorted.length > 0 && sorted[sorted.length - 1]?.entry.role === "user") {
|
|
135
|
+
incompleteTurns = 1;
|
|
136
|
+
const last = sorted[sorted.length - 1];
|
|
137
|
+
issues.push({
|
|
138
|
+
code: "transcript_incomplete_turn",
|
|
139
|
+
severity: "warn",
|
|
140
|
+
message: "Session ends on a user turn without assistant response.",
|
|
141
|
+
sessionKey,
|
|
142
|
+
filePath: last?.filePath,
|
|
143
|
+
line: last?.lineNumber
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
stats: {
|
|
148
|
+
sessionKey,
|
|
149
|
+
entries: sorted.length,
|
|
150
|
+
malformedLines: 0,
|
|
151
|
+
invalidEntries: 0,
|
|
152
|
+
duplicateTurnIds,
|
|
153
|
+
brokenChains,
|
|
154
|
+
incompleteTurns
|
|
155
|
+
},
|
|
156
|
+
issues
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function validateCheckpointRaw(checkpoint) {
|
|
160
|
+
if (!isObjectRecord(checkpoint)) return false;
|
|
161
|
+
return typeof checkpoint.sessionKey === "string" && checkpoint.sessionKey.length > 0 && typeof checkpoint.capturedAt === "string" && typeof checkpoint.ttl === "string" && Array.isArray(checkpoint.turns);
|
|
162
|
+
}
|
|
163
|
+
async function analyzeCheckpoint(memoryDir) {
|
|
164
|
+
const checkpointPath = path.join(memoryDir, "state", "checkpoint.json");
|
|
165
|
+
const issues = [];
|
|
166
|
+
const checkpoint = {
|
|
167
|
+
present: false,
|
|
168
|
+
healthy: true,
|
|
169
|
+
path: checkpointPath
|
|
170
|
+
};
|
|
171
|
+
let raw = "";
|
|
172
|
+
try {
|
|
173
|
+
raw = await readFile(checkpointPath, "utf-8");
|
|
174
|
+
} catch {
|
|
175
|
+
issues.push({
|
|
176
|
+
code: "checkpoint_missing",
|
|
177
|
+
severity: "info",
|
|
178
|
+
message: "No checkpoint file present.",
|
|
179
|
+
filePath: checkpointPath
|
|
180
|
+
});
|
|
181
|
+
return { checkpoint, issues };
|
|
182
|
+
}
|
|
183
|
+
checkpoint.present = true;
|
|
184
|
+
let parsed;
|
|
185
|
+
try {
|
|
186
|
+
parsed = JSON.parse(raw);
|
|
187
|
+
} catch {
|
|
188
|
+
checkpoint.healthy = false;
|
|
189
|
+
issues.push({
|
|
190
|
+
code: "checkpoint_invalid_json",
|
|
191
|
+
severity: "error",
|
|
192
|
+
message: "Checkpoint file is invalid JSON.",
|
|
193
|
+
filePath: checkpointPath
|
|
194
|
+
});
|
|
195
|
+
return { checkpoint, issues };
|
|
196
|
+
}
|
|
197
|
+
if (!validateCheckpointRaw(parsed)) {
|
|
198
|
+
checkpoint.healthy = false;
|
|
199
|
+
issues.push({
|
|
200
|
+
code: "checkpoint_invalid_metadata",
|
|
201
|
+
severity: "error",
|
|
202
|
+
message: "Checkpoint file is missing required metadata fields.",
|
|
203
|
+
filePath: checkpointPath
|
|
204
|
+
});
|
|
205
|
+
return { checkpoint, issues };
|
|
206
|
+
}
|
|
207
|
+
checkpoint.sessionKey = parsed.sessionKey;
|
|
208
|
+
checkpoint.expiresAt = parsed.ttl;
|
|
209
|
+
const ttlMs = Date.parse(parsed.ttl);
|
|
210
|
+
const capturedAtMs = Date.parse(parsed.capturedAt);
|
|
211
|
+
if (!Number.isFinite(ttlMs) || !Number.isFinite(capturedAtMs) || ttlMs <= capturedAtMs) {
|
|
212
|
+
checkpoint.healthy = false;
|
|
213
|
+
issues.push({
|
|
214
|
+
code: "checkpoint_invalid_metadata",
|
|
215
|
+
severity: "error",
|
|
216
|
+
message: "Checkpoint timestamps are invalid or inconsistent.",
|
|
217
|
+
filePath: checkpointPath,
|
|
218
|
+
sessionKey: parsed.sessionKey
|
|
219
|
+
});
|
|
220
|
+
return { checkpoint, issues };
|
|
221
|
+
}
|
|
222
|
+
if (ttlMs < Date.now()) {
|
|
223
|
+
checkpoint.healthy = false;
|
|
224
|
+
issues.push({
|
|
225
|
+
code: "checkpoint_expired",
|
|
226
|
+
severity: "warn",
|
|
227
|
+
message: "Checkpoint TTL has expired.",
|
|
228
|
+
filePath: checkpointPath,
|
|
229
|
+
sessionKey: parsed.sessionKey
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
for (const turn of parsed.turns) {
|
|
233
|
+
if (!isTranscriptEntry(turn)) {
|
|
234
|
+
checkpoint.healthy = false;
|
|
235
|
+
issues.push({
|
|
236
|
+
code: "checkpoint_invalid_metadata",
|
|
237
|
+
severity: "error",
|
|
238
|
+
message: "Checkpoint contains invalid turn entries.",
|
|
239
|
+
filePath: checkpointPath,
|
|
240
|
+
sessionKey: parsed.sessionKey
|
|
241
|
+
});
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return { checkpoint, issues };
|
|
246
|
+
}
|
|
247
|
+
async function analyzeSessionIntegrity(options) {
|
|
248
|
+
const memoryDir = options.memoryDir;
|
|
249
|
+
const reportIssues = [];
|
|
250
|
+
const allSessionRefs = /* @__PURE__ */ new Map();
|
|
251
|
+
const invalidBySession = /* @__PURE__ */ new Map();
|
|
252
|
+
const sessions = /* @__PURE__ */ new Map();
|
|
253
|
+
const files = await listTranscriptFiles(memoryDir);
|
|
254
|
+
for (const filePath of files) {
|
|
255
|
+
const parsed = await parseTranscriptFile(filePath);
|
|
256
|
+
reportIssues.push(...parsed.malformed, ...parsed.invalid);
|
|
257
|
+
for (const [sessionKey, count] of parsed.invalidBySession.entries()) {
|
|
258
|
+
invalidBySession.set(sessionKey, (invalidBySession.get(sessionKey) ?? 0) + count);
|
|
259
|
+
}
|
|
260
|
+
for (const [sessionKey, refs] of parsed.bySession.entries()) {
|
|
261
|
+
const existing = allSessionRefs.get(sessionKey) ?? [];
|
|
262
|
+
existing.push(...refs);
|
|
263
|
+
allSessionRefs.set(sessionKey, existing);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
for (const [sessionKey, refs] of allSessionRefs.entries()) {
|
|
267
|
+
const analyzed = analyzeSessionEntries(sessionKey, refs);
|
|
268
|
+
reportIssues.push(...analyzed.issues);
|
|
269
|
+
sessions.set(sessionKey, {
|
|
270
|
+
...analyzed.stats,
|
|
271
|
+
malformedLines: 0,
|
|
272
|
+
invalidEntries: invalidBySession.get(sessionKey) ?? 0
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
const checkpoint = await analyzeCheckpoint(memoryDir);
|
|
276
|
+
reportIssues.push(...checkpoint.issues);
|
|
277
|
+
const severeIssueCount = reportIssues.filter((issue) => issue.severity !== "info").length;
|
|
278
|
+
return {
|
|
279
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
280
|
+
memoryDir,
|
|
281
|
+
healthy: severeIssueCount === 0,
|
|
282
|
+
sessions: [...sessions.values()].sort((a, b) => a.sessionKey.localeCompare(b.sessionKey)),
|
|
283
|
+
checkpoint: checkpoint.checkpoint,
|
|
284
|
+
issues: reportIssues
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
function collectTranscriptRewriteTargets(report) {
|
|
288
|
+
const set = /* @__PURE__ */ new Set();
|
|
289
|
+
for (const issue of report.issues) {
|
|
290
|
+
if (!issue.filePath) continue;
|
|
291
|
+
if (issue.code === "transcript_malformed_line" || issue.code === "transcript_invalid_entry") {
|
|
292
|
+
set.add(issue.filePath);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return [...set].sort((a, b) => a.localeCompare(b));
|
|
296
|
+
}
|
|
297
|
+
function planSessionRepair(options) {
|
|
298
|
+
const actions = [];
|
|
299
|
+
const transcriptTargets = collectTranscriptRewriteTargets(options.report);
|
|
300
|
+
for (const targetPath of transcriptTargets) {
|
|
301
|
+
actions.push({
|
|
302
|
+
kind: "rewrite_transcript",
|
|
303
|
+
targetPath,
|
|
304
|
+
description: "Rewrite transcript file with only valid JSON transcript entries."
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
const checkpointNeedsRepair = options.report.issues.some(
|
|
308
|
+
(issue) => issue.code === "checkpoint_invalid_json" || issue.code === "checkpoint_invalid_metadata" || issue.code === "checkpoint_expired"
|
|
309
|
+
);
|
|
310
|
+
if (checkpointNeedsRepair && options.report.checkpoint.present) {
|
|
311
|
+
actions.push({
|
|
312
|
+
kind: "remove_checkpoint",
|
|
313
|
+
targetPath: options.report.checkpoint.path,
|
|
314
|
+
description: "Remove invalid or expired checkpoint file."
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
if (options.sessionFilesDir && options.allowSessionFileRepair === true) {
|
|
318
|
+
actions.push({
|
|
319
|
+
kind: "repair_session_files",
|
|
320
|
+
targetPath: options.sessionFilesDir,
|
|
321
|
+
description: "Session file repair was requested; no automatic rewiring is performed.",
|
|
322
|
+
details: "No-op by design. OpenClaw session files require explicit manual review."
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
return {
|
|
326
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
327
|
+
dryRun: options.dryRun,
|
|
328
|
+
allowSessionFileRepair: options.allowSessionFileRepair === true,
|
|
329
|
+
actions
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
async function rewriteTranscriptFile(targetPath) {
|
|
333
|
+
let raw = "";
|
|
334
|
+
try {
|
|
335
|
+
raw = await readFile(targetPath, "utf-8");
|
|
336
|
+
} catch {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
const lines = raw.split("\n");
|
|
340
|
+
const validLines = [];
|
|
341
|
+
for (const line of lines) {
|
|
342
|
+
const trimmed = line.trim();
|
|
343
|
+
if (!trimmed) continue;
|
|
344
|
+
try {
|
|
345
|
+
const parsed = JSON.parse(trimmed);
|
|
346
|
+
if (!isTranscriptEntry(parsed)) continue;
|
|
347
|
+
validLines.push(JSON.stringify(parsed));
|
|
348
|
+
} catch {
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
const body = validLines.length > 0 ? `${validLines.join("\n")}
|
|
352
|
+
` : "";
|
|
353
|
+
await writeFile(targetPath, body, "utf-8");
|
|
354
|
+
}
|
|
355
|
+
async function applySessionRepair(options) {
|
|
356
|
+
const { plan } = options;
|
|
357
|
+
if (plan.dryRun) {
|
|
358
|
+
return {
|
|
359
|
+
applied: false,
|
|
360
|
+
actionsAttempted: plan.actions.length,
|
|
361
|
+
actionsApplied: 0,
|
|
362
|
+
errors: []
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
let actionsApplied = 0;
|
|
366
|
+
const errors = [];
|
|
367
|
+
for (const action of plan.actions) {
|
|
368
|
+
try {
|
|
369
|
+
if (action.kind === "rewrite_transcript") {
|
|
370
|
+
await rewriteTranscriptFile(action.targetPath);
|
|
371
|
+
actionsApplied += 1;
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
if (action.kind === "remove_checkpoint") {
|
|
375
|
+
try {
|
|
376
|
+
await unlink(action.targetPath);
|
|
377
|
+
} catch (err) {
|
|
378
|
+
const code = typeof err === "object" && err && "code" in err ? String(err.code ?? "") : "";
|
|
379
|
+
if (code !== "ENOENT") {
|
|
380
|
+
throw err;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
actionsApplied += 1;
|
|
384
|
+
continue;
|
|
385
|
+
}
|
|
386
|
+
if (action.kind === "repair_session_files") {
|
|
387
|
+
actionsApplied += 1;
|
|
388
|
+
}
|
|
389
|
+
} catch (err) {
|
|
390
|
+
errors.push(`Failed ${action.kind} ${action.targetPath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return {
|
|
394
|
+
applied: true,
|
|
395
|
+
actionsAttempted: plan.actions.length,
|
|
396
|
+
actionsApplied,
|
|
397
|
+
errors
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
export {
|
|
402
|
+
analyzeSessionIntegrity,
|
|
403
|
+
planSessionRepair,
|
|
404
|
+
applySessionRepair
|
|
405
|
+
};
|
|
406
|
+
//# sourceMappingURL=chunk-YRMVARQP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/session-integrity.ts"],"sourcesContent":["import path from \"node:path\";\nimport { readFile, readdir, unlink, writeFile } from \"node:fs/promises\";\nimport type { Checkpoint, TranscriptEntry } from \"./types.js\";\n\nexport type SessionIntegrityIssueCode =\n | \"transcript_malformed_line\"\n | \"transcript_invalid_entry\"\n | \"transcript_duplicate_turn_id\"\n | \"transcript_broken_chain\"\n | \"transcript_incomplete_turn\"\n | \"checkpoint_missing\"\n | \"checkpoint_invalid_json\"\n | \"checkpoint_invalid_metadata\"\n | \"checkpoint_expired\";\n\nexport interface SessionIntegrityIssue {\n code: SessionIntegrityIssueCode;\n severity: \"info\" | \"warn\" | \"error\";\n message: string;\n filePath?: string;\n line?: number;\n sessionKey?: string;\n}\n\nexport interface SessionTranscriptStats {\n sessionKey: string;\n entries: number;\n malformedLines: number;\n invalidEntries: number;\n duplicateTurnIds: number;\n brokenChains: number;\n incompleteTurns: number;\n}\n\nexport interface SessionIntegrityReport {\n generatedAt: string;\n memoryDir: string;\n healthy: boolean;\n sessions: SessionTranscriptStats[];\n checkpoint: {\n present: boolean;\n healthy: boolean;\n path: string;\n sessionKey?: string;\n expiresAt?: string;\n };\n issues: SessionIntegrityIssue[];\n}\n\ntype SessionEntryRef = {\n filePath: string;\n lineNumber: number;\n entry: TranscriptEntry;\n};\n\ntype FileSessionParse = {\n bySession: Map<string, SessionEntryRef[]>;\n malformed: SessionIntegrityIssue[];\n invalid: SessionIntegrityIssue[];\n invalidBySession: Map<string, number>;\n};\n\nexport interface SessionRepairAction {\n kind: \"rewrite_transcript\" | \"remove_checkpoint\" | \"repair_session_files\";\n description: string;\n targetPath: string;\n details?: string;\n}\n\nexport interface SessionRepairPlan {\n generatedAt: string;\n dryRun: boolean;\n allowSessionFileRepair: boolean;\n actions: SessionRepairAction[];\n}\n\nexport interface SessionRepairApplyResult {\n applied: boolean;\n actionsAttempted: number;\n actionsApplied: number;\n errors: string[];\n}\n\nexport interface AnalyzeSessionIntegrityOptions {\n memoryDir: string;\n}\n\nexport interface PlanSessionRepairOptions {\n report: SessionIntegrityReport;\n dryRun: boolean;\n allowSessionFileRepair?: boolean;\n sessionFilesDir?: string;\n}\n\nexport interface ApplySessionRepairOptions {\n plan: SessionRepairPlan;\n}\n\nfunction isObjectRecord(input: unknown): input is Record<string, unknown> {\n return Boolean(input) && typeof input === \"object\";\n}\n\nfunction isTranscriptEntry(raw: unknown): raw is TranscriptEntry {\n if (!isObjectRecord(raw)) return false;\n if (raw.role !== \"user\" && raw.role !== \"assistant\") return false;\n return (\n typeof raw.timestamp === \"string\" &&\n raw.timestamp.length > 0 &&\n typeof raw.content === \"string\" &&\n typeof raw.sessionKey === \"string\" &&\n raw.sessionKey.length > 0 &&\n typeof raw.turnId === \"string\" &&\n raw.turnId.length > 0\n );\n}\n\nasync function listTranscriptFiles(memoryDir: string): Promise<string[]> {\n const transcriptsDir = path.join(memoryDir, \"transcripts\");\n const out: string[] = [];\n const stack = [transcriptsDir];\n while (stack.length > 0) {\n const dir = stack.pop();\n if (!dir) continue;\n let entries: Array<{ name: string; isDirectory(): boolean; isFile(): boolean }>;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n stack.push(fullPath);\n } else if (entry.isFile() && entry.name.endsWith(\".jsonl\")) {\n out.push(fullPath);\n }\n }\n }\n return out.sort((a, b) => a.localeCompare(b));\n}\n\nasync function parseTranscriptFile(filePath: string): Promise<FileSessionParse> {\n const bySession = new Map<string, SessionEntryRef[]>();\n const malformed: SessionIntegrityIssue[] = [];\n const invalid: SessionIntegrityIssue[] = [];\n const invalidBySession = new Map<string, number>();\n\n let raw = \"\";\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch {\n return { bySession, malformed, invalid, invalidBySession };\n }\n\n const lines = raw.split(\"\\n\");\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index]?.trim() ?? \"\";\n if (!line) continue;\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n malformed.push({\n code: \"transcript_malformed_line\",\n severity: \"warn\",\n message: \"Transcript line is not valid JSON.\",\n filePath,\n line: index + 1,\n });\n continue;\n }\n if (!isTranscriptEntry(parsed)) {\n const sessionKey =\n isObjectRecord(parsed) &&\n typeof parsed.sessionKey === \"string\" &&\n parsed.sessionKey.length > 0\n ? parsed.sessionKey\n : undefined;\n invalid.push({\n code: \"transcript_invalid_entry\",\n severity: \"warn\",\n message: \"Transcript entry is missing required fields.\",\n filePath,\n line: index + 1,\n sessionKey,\n });\n if (sessionKey) {\n invalidBySession.set(sessionKey, (invalidBySession.get(sessionKey) ?? 0) + 1);\n }\n continue;\n }\n\n const list = bySession.get(parsed.sessionKey) ?? [];\n list.push({ filePath, lineNumber: index + 1, entry: parsed });\n bySession.set(parsed.sessionKey, list);\n }\n return { bySession, malformed, invalid, invalidBySession };\n}\n\nfunction analyzeSessionEntries(\n sessionKey: string,\n refs: SessionEntryRef[],\n): { stats: SessionTranscriptStats; issues: SessionIntegrityIssue[] } {\n function parseTimestampForSort(timestamp: string): number {\n const parsed = Date.parse(timestamp);\n if (Number.isFinite(parsed)) return parsed;\n return Number.MAX_SAFE_INTEGER;\n }\n\n const issues: SessionIntegrityIssue[] = [];\n const sorted = [...refs].sort((a, b) => {\n const tsA = parseTimestampForSort(a.entry.timestamp);\n const tsB = parseTimestampForSort(b.entry.timestamp);\n if (tsA !== tsB) return tsA - tsB;\n const rawTimestampCmp = a.entry.timestamp.localeCompare(b.entry.timestamp);\n if (rawTimestampCmp !== 0) return rawTimestampCmp;\n return a.entry.turnId.localeCompare(b.entry.turnId);\n });\n const turnIdSeen = new Set<string>();\n let duplicateTurnIds = 0;\n let brokenChains = 0;\n\n for (let i = 0; i < sorted.length; i += 1) {\n const current = sorted[i];\n if (turnIdSeen.has(current.entry.turnId)) {\n duplicateTurnIds += 1;\n issues.push({\n code: \"transcript_duplicate_turn_id\",\n severity: \"warn\",\n message: `Duplicate turnId detected: ${current.entry.turnId}`,\n sessionKey,\n filePath: current.filePath,\n line: current.lineNumber,\n });\n } else {\n turnIdSeen.add(current.entry.turnId);\n }\n\n if (i > 0) {\n const previous = sorted[i - 1];\n if (previous && previous.entry.role === current.entry.role) {\n brokenChains += 1;\n issues.push({\n code: \"transcript_broken_chain\",\n severity: \"warn\",\n message: `Adjacent turns have the same role (${current.entry.role}).`,\n sessionKey,\n filePath: current.filePath,\n line: current.lineNumber,\n });\n }\n }\n }\n\n let incompleteTurns = 0;\n if (sorted.length > 0 && sorted[sorted.length - 1]?.entry.role === \"user\") {\n incompleteTurns = 1;\n const last = sorted[sorted.length - 1];\n issues.push({\n code: \"transcript_incomplete_turn\",\n severity: \"warn\",\n message: \"Session ends on a user turn without assistant response.\",\n sessionKey,\n filePath: last?.filePath,\n line: last?.lineNumber,\n });\n }\n\n return {\n stats: {\n sessionKey,\n entries: sorted.length,\n malformedLines: 0,\n invalidEntries: 0,\n duplicateTurnIds,\n brokenChains,\n incompleteTurns,\n },\n issues,\n };\n}\n\nfunction validateCheckpointRaw(checkpoint: unknown): checkpoint is Checkpoint {\n if (!isObjectRecord(checkpoint)) return false;\n return (\n typeof checkpoint.sessionKey === \"string\" &&\n checkpoint.sessionKey.length > 0 &&\n typeof checkpoint.capturedAt === \"string\" &&\n typeof checkpoint.ttl === \"string\" &&\n Array.isArray(checkpoint.turns)\n );\n}\n\nasync function analyzeCheckpoint(memoryDir: string): Promise<{\n checkpoint: SessionIntegrityReport[\"checkpoint\"];\n issues: SessionIntegrityIssue[];\n}> {\n const checkpointPath = path.join(memoryDir, \"state\", \"checkpoint.json\");\n const issues: SessionIntegrityIssue[] = [];\n const checkpoint: SessionIntegrityReport[\"checkpoint\"] = {\n present: false,\n healthy: true,\n path: checkpointPath,\n };\n\n let raw = \"\";\n try {\n raw = await readFile(checkpointPath, \"utf-8\");\n } catch {\n issues.push({\n code: \"checkpoint_missing\",\n severity: \"info\",\n message: \"No checkpoint file present.\",\n filePath: checkpointPath,\n });\n return { checkpoint, issues };\n }\n\n checkpoint.present = true;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n checkpoint.healthy = false;\n issues.push({\n code: \"checkpoint_invalid_json\",\n severity: \"error\",\n message: \"Checkpoint file is invalid JSON.\",\n filePath: checkpointPath,\n });\n return { checkpoint, issues };\n }\n\n if (!validateCheckpointRaw(parsed)) {\n checkpoint.healthy = false;\n issues.push({\n code: \"checkpoint_invalid_metadata\",\n severity: \"error\",\n message: \"Checkpoint file is missing required metadata fields.\",\n filePath: checkpointPath,\n });\n return { checkpoint, issues };\n }\n\n checkpoint.sessionKey = parsed.sessionKey;\n checkpoint.expiresAt = parsed.ttl;\n\n const ttlMs = Date.parse(parsed.ttl);\n const capturedAtMs = Date.parse(parsed.capturedAt);\n if (!Number.isFinite(ttlMs) || !Number.isFinite(capturedAtMs) || ttlMs <= capturedAtMs) {\n checkpoint.healthy = false;\n issues.push({\n code: \"checkpoint_invalid_metadata\",\n severity: \"error\",\n message: \"Checkpoint timestamps are invalid or inconsistent.\",\n filePath: checkpointPath,\n sessionKey: parsed.sessionKey,\n });\n return { checkpoint, issues };\n }\n\n if (ttlMs < Date.now()) {\n checkpoint.healthy = false;\n issues.push({\n code: \"checkpoint_expired\",\n severity: \"warn\",\n message: \"Checkpoint TTL has expired.\",\n filePath: checkpointPath,\n sessionKey: parsed.sessionKey,\n });\n }\n\n for (const turn of parsed.turns) {\n if (!isTranscriptEntry(turn)) {\n checkpoint.healthy = false;\n issues.push({\n code: \"checkpoint_invalid_metadata\",\n severity: \"error\",\n message: \"Checkpoint contains invalid turn entries.\",\n filePath: checkpointPath,\n sessionKey: parsed.sessionKey,\n });\n break;\n }\n }\n\n return { checkpoint, issues };\n}\n\nexport async function analyzeSessionIntegrity(\n options: AnalyzeSessionIntegrityOptions,\n): Promise<SessionIntegrityReport> {\n const memoryDir = options.memoryDir;\n const reportIssues: SessionIntegrityIssue[] = [];\n const allSessionRefs = new Map<string, SessionEntryRef[]>();\n const invalidBySession = new Map<string, number>();\n const sessions = new Map<string, SessionTranscriptStats>();\n\n const files = await listTranscriptFiles(memoryDir);\n for (const filePath of files) {\n const parsed = await parseTranscriptFile(filePath);\n reportIssues.push(...parsed.malformed, ...parsed.invalid);\n for (const [sessionKey, count] of parsed.invalidBySession.entries()) {\n invalidBySession.set(sessionKey, (invalidBySession.get(sessionKey) ?? 0) + count);\n }\n\n for (const [sessionKey, refs] of parsed.bySession.entries()) {\n const existing = allSessionRefs.get(sessionKey) ?? [];\n existing.push(...refs);\n allSessionRefs.set(sessionKey, existing);\n }\n }\n\n for (const [sessionKey, refs] of allSessionRefs.entries()) {\n const analyzed = analyzeSessionEntries(sessionKey, refs);\n reportIssues.push(...analyzed.issues);\n sessions.set(sessionKey, {\n ...analyzed.stats,\n malformedLines: 0,\n invalidEntries: invalidBySession.get(sessionKey) ?? 0,\n });\n }\n\n const checkpoint = await analyzeCheckpoint(memoryDir);\n reportIssues.push(...checkpoint.issues);\n\n const severeIssueCount = reportIssues.filter((issue) => issue.severity !== \"info\").length;\n\n return {\n generatedAt: new Date().toISOString(),\n memoryDir,\n healthy: severeIssueCount === 0,\n sessions: [...sessions.values()].sort((a, b) => a.sessionKey.localeCompare(b.sessionKey)),\n checkpoint: checkpoint.checkpoint,\n issues: reportIssues,\n };\n}\n\nfunction collectTranscriptRewriteTargets(report: SessionIntegrityReport): string[] {\n const set = new Set<string>();\n for (const issue of report.issues) {\n if (!issue.filePath) continue;\n if (\n issue.code === \"transcript_malformed_line\" ||\n issue.code === \"transcript_invalid_entry\"\n ) {\n set.add(issue.filePath);\n }\n }\n return [...set].sort((a, b) => a.localeCompare(b));\n}\n\nexport function planSessionRepair(options: PlanSessionRepairOptions): SessionRepairPlan {\n const actions: SessionRepairAction[] = [];\n const transcriptTargets = collectTranscriptRewriteTargets(options.report);\n for (const targetPath of transcriptTargets) {\n actions.push({\n kind: \"rewrite_transcript\",\n targetPath,\n description: \"Rewrite transcript file with only valid JSON transcript entries.\",\n });\n }\n\n const checkpointNeedsRepair = options.report.issues.some((issue) =>\n issue.code === \"checkpoint_invalid_json\" ||\n issue.code === \"checkpoint_invalid_metadata\" ||\n issue.code === \"checkpoint_expired\"\n );\n if (checkpointNeedsRepair && options.report.checkpoint.present) {\n actions.push({\n kind: \"remove_checkpoint\",\n targetPath: options.report.checkpoint.path,\n description: \"Remove invalid or expired checkpoint file.\",\n });\n }\n\n if (options.sessionFilesDir && options.allowSessionFileRepair === true) {\n actions.push({\n kind: \"repair_session_files\",\n targetPath: options.sessionFilesDir,\n description: \"Session file repair was requested; no automatic rewiring is performed.\",\n details: \"No-op by design. OpenClaw session files require explicit manual review.\",\n });\n }\n\n return {\n generatedAt: new Date().toISOString(),\n dryRun: options.dryRun,\n allowSessionFileRepair: options.allowSessionFileRepair === true,\n actions,\n };\n}\n\nasync function rewriteTranscriptFile(targetPath: string): Promise<void> {\n let raw = \"\";\n try {\n raw = await readFile(targetPath, \"utf-8\");\n } catch {\n return;\n }\n const lines = raw.split(\"\\n\");\n const validLines: string[] = [];\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed);\n if (!isTranscriptEntry(parsed)) continue;\n validLines.push(JSON.stringify(parsed));\n } catch {\n // drop malformed lines\n }\n }\n const body = validLines.length > 0 ? `${validLines.join(\"\\n\")}\\n` : \"\";\n await writeFile(targetPath, body, \"utf-8\");\n}\n\nexport async function applySessionRepair(\n options: ApplySessionRepairOptions,\n): Promise<SessionRepairApplyResult> {\n const { plan } = options;\n if (plan.dryRun) {\n return {\n applied: false,\n actionsAttempted: plan.actions.length,\n actionsApplied: 0,\n errors: [],\n };\n }\n\n let actionsApplied = 0;\n const errors: string[] = [];\n\n for (const action of plan.actions) {\n try {\n if (action.kind === \"rewrite_transcript\") {\n await rewriteTranscriptFile(action.targetPath);\n actionsApplied += 1;\n continue;\n }\n if (action.kind === \"remove_checkpoint\") {\n try {\n await unlink(action.targetPath);\n } catch (err) {\n const code = typeof err === \"object\" && err && \"code\" in err ? String((err as { code?: unknown }).code ?? \"\") : \"\";\n if (code !== \"ENOENT\") {\n throw err;\n }\n }\n actionsApplied += 1;\n continue;\n }\n if (action.kind === \"repair_session_files\") {\n // intentionally no-op; pointer/session rewiring is explicitly forbidden here.\n actionsApplied += 1;\n }\n } catch (err) {\n errors.push(`Failed ${action.kind} ${action.targetPath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return {\n applied: true,\n actionsAttempted: plan.actions.length,\n actionsApplied,\n errors,\n };\n}\n"],"mappings":"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","names":[]}
|