@hawkeyexl/manni 4.5.0 → 4.6.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/README.md +1 -1
- package/dist/batch-OZOACN4G.js +41 -0
- package/dist/build-Z5VOVADH.js +32 -0
- package/dist/calibrate-TZYT42DR.js +36 -0
- package/dist/capture-SL4MNDDP.js +34 -0
- package/dist/check-5OMA42Y6.js +26 -0
- package/dist/{check-ESNS7ZBC.js → check-OAJWC3WD.js} +7 -5
- package/dist/{check-RQIIIURI.js → check-PKY7KTQE.js} +13 -14
- package/dist/check-WB2QDHJQ.js +880 -0
- package/dist/check-WB2QDHJQ.js.map +1 -0
- package/dist/{chunk-F2OVHJNC.js → chunk-2JFPBZJK.js} +11 -11
- package/dist/{chunk-CP4ZM43V.js → chunk-2KRB3EG7.js} +2 -2
- package/dist/{chunk-QLUMKWQQ.js → chunk-2M6DVNI5.js} +10 -6
- package/dist/{chunk-QLUMKWQQ.js.map → chunk-2M6DVNI5.js.map} +1 -1
- package/dist/{chunk-HQFVJDEN.js → chunk-3NWX34ZI.js} +19 -19
- package/dist/{chunk-TCC737IS.js → chunk-5G53XATW.js} +4 -4
- package/dist/{chunk-B7XUEQF3.js → chunk-6KKZXB2O.js} +7 -5
- package/dist/{chunk-B7XUEQF3.js.map → chunk-6KKZXB2O.js.map} +1 -1
- package/dist/{chunk-SNEHX4VE.js → chunk-733Y2STG.js} +2 -2
- package/dist/{chunk-ELZ2IIOF.js → chunk-73TC4DYH.js} +2 -2
- package/dist/{chunk-QY3DOZMS.js → chunk-7WRP5FFP.js} +4 -4
- package/dist/{chunk-3R5Y3XOL.js → chunk-APKH2T6E.js} +29 -591
- package/dist/chunk-APKH2T6E.js.map +1 -0
- package/dist/{chunk-FLF6AECQ.js → chunk-B3TS4WRM.js} +17 -15
- package/dist/{chunk-FLF6AECQ.js.map → chunk-B3TS4WRM.js.map} +1 -1
- package/dist/chunk-BWCWTHYS.js +146 -0
- package/dist/chunk-BWCWTHYS.js.map +1 -0
- package/dist/{chunk-C6HZ6C5T.js → chunk-C3B2VJNC.js} +2 -2
- package/dist/{chunk-NN4ASVTY.js → chunk-C73RSUIC.js} +4 -4
- package/dist/chunk-CU57HT2E.js +116 -0
- package/dist/chunk-CU57HT2E.js.map +1 -0
- package/dist/chunk-CWXZ2MRT.js +222 -0
- package/dist/chunk-CWXZ2MRT.js.map +1 -0
- package/dist/{chunk-GAZFKZHM.js → chunk-DC5DDJVE.js} +6 -6
- package/dist/{chunk-52PDIZKV.js → chunk-ECVQNGTH.js} +3 -3
- package/dist/chunk-FLAO4ZS3.js +502 -0
- package/dist/chunk-FLAO4ZS3.js.map +1 -0
- package/dist/chunk-FQGLRJGX.js +174 -0
- package/dist/chunk-FQGLRJGX.js.map +1 -0
- package/dist/{chunk-XWFNO5PO.js → chunk-GAJIJKET.js} +3 -3
- package/dist/{chunk-QCBICNKC.js → chunk-GREQKO6M.js} +202 -54
- package/dist/chunk-GREQKO6M.js.map +1 -0
- package/dist/chunk-HX44GB4Z.js +30 -0
- package/dist/chunk-HX44GB4Z.js.map +1 -0
- package/dist/{chunk-7ZUCEMCY.js → chunk-IY7NYNPZ.js} +9 -11
- package/dist/{chunk-7ZUCEMCY.js.map → chunk-IY7NYNPZ.js.map} +1 -1
- package/dist/{chunk-527HHQPS.js → chunk-KCOFEWV5.js} +6 -4
- package/dist/{chunk-527HHQPS.js.map → chunk-KCOFEWV5.js.map} +1 -1
- package/dist/chunk-M2RLHZ4J.js +849 -0
- package/dist/chunk-M2RLHZ4J.js.map +1 -0
- package/dist/{chunk-K3U5F2QT.js → chunk-M6GSS72T.js} +12 -12
- package/dist/{chunk-UK2I3ACY.js → chunk-MHM4QEBV.js} +4 -4
- package/dist/{chunk-EL2BZTDL.js → chunk-MOWMCEOJ.js} +13 -11
- package/dist/{chunk-EL2BZTDL.js.map → chunk-MOWMCEOJ.js.map} +1 -1
- package/dist/{chunk-OIZ3XMKB.js → chunk-MWBJ3KTF.js} +4 -4
- package/dist/chunk-N7JSEDSC.js +233 -0
- package/dist/chunk-N7JSEDSC.js.map +1 -0
- package/dist/{chunk-MZC62HPZ.js → chunk-NBMPHD4I.js} +2 -2
- package/dist/{chunk-YA63PVWI.js → chunk-NHHOPZRA.js} +12 -10
- package/dist/{chunk-YA63PVWI.js.map → chunk-NHHOPZRA.js.map} +1 -1
- package/dist/{chunk-DX32P2DT.js → chunk-NTWW7J76.js} +2 -2
- package/dist/{chunk-6XTQDFGP.js → chunk-PCFG7E6B.js} +3 -3
- package/dist/{chunk-6XTQDFGP.js.map → chunk-PCFG7E6B.js.map} +1 -1
- package/dist/{chunk-SJO2FTPG.js → chunk-PL4UAF4S.js} +73 -1304
- package/dist/chunk-PL4UAF4S.js.map +1 -0
- package/dist/chunk-QCHVR4ZM.js +286 -0
- package/dist/chunk-QCHVR4ZM.js.map +1 -0
- package/dist/{chunk-JQU7FHYH.js → chunk-QW77LCOU.js} +10 -10
- package/dist/{chunk-IA7BMIPE.js → chunk-SM6NOMJS.js} +2 -2
- package/dist/{chunk-DE7JSWXV.js → chunk-SWSTHZBI.js} +8 -6
- package/dist/{chunk-DE7JSWXV.js.map → chunk-SWSTHZBI.js.map} +1 -1
- package/dist/{chunk-NGK3N6F2.js → chunk-T6SYGLWR.js} +3 -3
- package/dist/chunk-TH4JVQPF.js +133 -0
- package/dist/chunk-TH4JVQPF.js.map +1 -0
- package/dist/{chunk-TVIX653Q.js → chunk-TLXE7LYK.js} +4 -4
- package/dist/{chunk-HVFR66GQ.js → chunk-TUAAR3MM.js} +3280 -283
- package/dist/chunk-TUAAR3MM.js.map +1 -0
- package/dist/{chunk-TA42STP7.js → chunk-UAKNZVCD.js} +4 -4
- package/dist/{chunk-C3KI45RF.js → chunk-UJSGS2Y5.js} +4 -4
- package/dist/{chunk-ZX43SRZR.js → chunk-UWQ2UVHE.js} +8 -6
- package/dist/{chunk-ZX43SRZR.js.map → chunk-UWQ2UVHE.js.map} +1 -1
- package/dist/chunk-WQWKYAAK.js +86 -0
- package/dist/chunk-WQWKYAAK.js.map +1 -0
- package/dist/{chunk-LJ2RDH3F.js → chunk-XG6PVB5S.js} +1 -23
- package/dist/chunk-XG6PVB5S.js.map +1 -0
- package/dist/{chunk-Q35YIDBV.js → chunk-XKBEHKWO.js} +29 -264
- package/dist/chunk-XKBEHKWO.js.map +1 -0
- package/dist/chunk-XPEWUK7J.js +532 -0
- package/dist/chunk-XPEWUK7J.js.map +1 -0
- package/dist/{chunk-BOIF2XGG.js → chunk-XXDXIIQ4.js} +2 -2
- package/dist/chunk-YLK2J5YK.js +610 -0
- package/dist/chunk-YLK2J5YK.js.map +1 -0
- package/dist/{chunk-7OQAU4EA.js → chunk-Z4IZGEM3.js} +16 -12
- package/dist/{chunk-7OQAU4EA.js.map → chunk-Z4IZGEM3.js.map} +1 -1
- package/dist/{cli-E3H6ZP4I.js → cli-6EWVMEN6.js} +5 -3
- package/dist/{cli-E3H6ZP4I.js.map → cli-6EWVMEN6.js.map} +1 -1
- package/dist/{cli-MHTYPVOD.js → cli-6H7HVDMQ.js} +113 -20
- package/dist/{cli-MHTYPVOD.js.map → cli-6H7HVDMQ.js.map} +1 -1
- package/dist/{cli-HUIMNJT6.js → cli-EPVZHAZS.js} +19 -20
- package/dist/{cli-HUIMNJT6.js.map → cli-EPVZHAZS.js.map} +1 -1
- package/dist/{cli-6PGVHP7Y.js → cli-LUCSGTVI.js} +17 -19
- package/dist/{cli-6PGVHP7Y.js.map → cli-LUCSGTVI.js.map} +1 -1
- package/dist/{cli-PRZHQ3QB.js → cli-NIG4N3XM.js} +14 -15
- package/dist/{cli-PRZHQ3QB.js.map → cli-NIG4N3XM.js.map} +1 -1
- package/dist/{cli-TYGOHJOJ.js → cli-PSKNB66T.js} +225 -58
- package/dist/cli-PSKNB66T.js.map +1 -0
- package/dist/{cli-QKIJOXGW.js → cli-UO4NHIB3.js} +17 -17
- package/dist/{cli-AAG3N4NB.js → cli-UQ7A3YA2.js} +17 -18
- package/dist/{cli-AAG3N4NB.js.map → cli-UQ7A3YA2.js.map} +1 -1
- package/dist/{cli-YW6VWBHX.js → cli-YHYDLQAF.js} +10 -10
- package/dist/cli.js +11 -11
- package/dist/config-P4HDNTYD.js +26 -0
- package/dist/conformance-ZFCMKM6M.js +18 -0
- package/dist/docmeta.js +9 -9
- package/dist/github-7ZCH5PSO.js +26 -0
- package/dist/github-POT6724K.js +31 -0
- package/dist/host-6GURH5HE.js +23 -0
- package/dist/index.d.ts +72 -4
- package/dist/index.js +176 -166
- package/dist/index.js.map +1 -1
- package/dist/{json-4DCKDGUV.js → json-KT2K62L5.js} +12 -13
- package/dist/lint-5AQ5C2BV.js +29 -0
- package/dist/list-5JZKX2NK.js +28 -0
- package/dist/list-SWPFXQMU.js +30 -0
- package/dist/{page-QEDB7EVU.js → page-UPSXRP75.js} +11 -12
- package/dist/prepare-6GNEWCNH.js +155 -0
- package/dist/prepare-6GNEWCNH.js.map +1 -0
- package/dist/{pretty-SQX33UM2.js → pretty-Q6FQAOK4.js} +13 -14
- package/dist/{pretty-5DGEBZSV.js → pretty-SQRPFPSQ.js} +12 -13
- package/dist/provider-AMGRDY6V.js +34 -0
- package/dist/release-IECYCLTD.js +36 -0
- package/dist/release-IECYCLTD.js.map +1 -0
- package/dist/{reporters-OHSI3RMV.js → reporters-45MMC2ID.js} +11 -12
- package/dist/{reporters-YELDDYJD.js → reporters-XUV4MM64.js} +7 -5
- package/dist/reporters-XUV4MM64.js.map +1 -0
- package/dist/run-KMWY2IAN.js +32 -0
- package/dist/run-KMWY2IAN.js.map +1 -0
- package/dist/{term-2WMDZ4PY.js → term-PCJUCWNF.js} +16 -17
- package/dist/{term-2WMDZ4PY.js.map → term-PCJUCWNF.js.map} +1 -1
- package/dist/validate-IMNCZNWG.js +17 -0
- package/dist/validate-IMNCZNWG.js.map +1 -0
- package/package.json +2 -2
- package/plugin/manni/.claude-plugin/plugin.json +1 -1
- package/plugin/manni/hooks/hooks.json +47 -0
- package/dist/batch-GOE3UXOD.js +0 -36
- package/dist/build-M7BMEHL2.js +0 -33
- package/dist/calibrate-6RRAILUY.js +0 -31
- package/dist/capture-RJPQ6B4N.js +0 -32
- package/dist/check-BQD64X3N.js +0 -27
- package/dist/chunk-3R5Y3XOL.js.map +0 -1
- package/dist/chunk-3YHAYXBC.js +0 -164
- package/dist/chunk-3YHAYXBC.js.map +0 -1
- package/dist/chunk-HVFR66GQ.js.map +0 -1
- package/dist/chunk-LJ2RDH3F.js.map +0 -1
- package/dist/chunk-NAZRLJAK.js +0 -3090
- package/dist/chunk-NAZRLJAK.js.map +0 -1
- package/dist/chunk-Q35YIDBV.js.map +0 -1
- package/dist/chunk-QCBICNKC.js.map +0 -1
- package/dist/chunk-SJO2FTPG.js.map +0 -1
- package/dist/chunk-TU2WUBVZ.js +0 -2
- package/dist/cli-TYGOHJOJ.js.map +0 -1
- package/dist/github-3WMSTNTK.js +0 -32
- package/dist/github-OXSJQ4PS.js +0 -27
- package/dist/lint-YDHVVZHT.js +0 -30
- package/dist/list-3ZO2NIYO.js +0 -31
- package/dist/list-EJH6VAOW.js +0 -29
- package/dist/run-IP6NZHAG.js +0 -33
- package/dist/validate-G6HH3YXL.js +0 -16
- /package/dist/{batch-GOE3UXOD.js.map → batch-OZOACN4G.js.map} +0 -0
- /package/dist/{build-M7BMEHL2.js.map → build-Z5VOVADH.js.map} +0 -0
- /package/dist/{calibrate-6RRAILUY.js.map → calibrate-TZYT42DR.js.map} +0 -0
- /package/dist/{capture-RJPQ6B4N.js.map → capture-SL4MNDDP.js.map} +0 -0
- /package/dist/{check-BQD64X3N.js.map → check-5OMA42Y6.js.map} +0 -0
- /package/dist/{check-ESNS7ZBC.js.map → check-OAJWC3WD.js.map} +0 -0
- /package/dist/{check-RQIIIURI.js.map → check-PKY7KTQE.js.map} +0 -0
- /package/dist/{chunk-F2OVHJNC.js.map → chunk-2JFPBZJK.js.map} +0 -0
- /package/dist/{chunk-CP4ZM43V.js.map → chunk-2KRB3EG7.js.map} +0 -0
- /package/dist/{chunk-HQFVJDEN.js.map → chunk-3NWX34ZI.js.map} +0 -0
- /package/dist/{chunk-TCC737IS.js.map → chunk-5G53XATW.js.map} +0 -0
- /package/dist/{chunk-SNEHX4VE.js.map → chunk-733Y2STG.js.map} +0 -0
- /package/dist/{chunk-ELZ2IIOF.js.map → chunk-73TC4DYH.js.map} +0 -0
- /package/dist/{chunk-QY3DOZMS.js.map → chunk-7WRP5FFP.js.map} +0 -0
- /package/dist/{chunk-C6HZ6C5T.js.map → chunk-C3B2VJNC.js.map} +0 -0
- /package/dist/{chunk-NN4ASVTY.js.map → chunk-C73RSUIC.js.map} +0 -0
- /package/dist/{chunk-GAZFKZHM.js.map → chunk-DC5DDJVE.js.map} +0 -0
- /package/dist/{chunk-52PDIZKV.js.map → chunk-ECVQNGTH.js.map} +0 -0
- /package/dist/{chunk-XWFNO5PO.js.map → chunk-GAJIJKET.js.map} +0 -0
- /package/dist/{chunk-K3U5F2QT.js.map → chunk-M6GSS72T.js.map} +0 -0
- /package/dist/{chunk-UK2I3ACY.js.map → chunk-MHM4QEBV.js.map} +0 -0
- /package/dist/{chunk-OIZ3XMKB.js.map → chunk-MWBJ3KTF.js.map} +0 -0
- /package/dist/{chunk-MZC62HPZ.js.map → chunk-NBMPHD4I.js.map} +0 -0
- /package/dist/{chunk-DX32P2DT.js.map → chunk-NTWW7J76.js.map} +0 -0
- /package/dist/{chunk-JQU7FHYH.js.map → chunk-QW77LCOU.js.map} +0 -0
- /package/dist/{chunk-IA7BMIPE.js.map → chunk-SM6NOMJS.js.map} +0 -0
- /package/dist/{chunk-NGK3N6F2.js.map → chunk-T6SYGLWR.js.map} +0 -0
- /package/dist/{chunk-TVIX653Q.js.map → chunk-TLXE7LYK.js.map} +0 -0
- /package/dist/{chunk-TA42STP7.js.map → chunk-UAKNZVCD.js.map} +0 -0
- /package/dist/{chunk-C3KI45RF.js.map → chunk-UJSGS2Y5.js.map} +0 -0
- /package/dist/{chunk-BOIF2XGG.js.map → chunk-XXDXIIQ4.js.map} +0 -0
- /package/dist/{cli-QKIJOXGW.js.map → cli-UO4NHIB3.js.map} +0 -0
- /package/dist/{chunk-TU2WUBVZ.js.map → cli-YHYDLQAF.js.map} +0 -0
- /package/dist/{cli-YW6VWBHX.js.map → config-P4HDNTYD.js.map} +0 -0
- /package/dist/{github-3WMSTNTK.js.map → conformance-ZFCMKM6M.js.map} +0 -0
- /package/dist/{github-OXSJQ4PS.js.map → github-7ZCH5PSO.js.map} +0 -0
- /package/dist/{json-4DCKDGUV.js.map → github-POT6724K.js.map} +0 -0
- /package/dist/{lint-YDHVVZHT.js.map → host-6GURH5HE.js.map} +0 -0
- /package/dist/{list-3ZO2NIYO.js.map → json-KT2K62L5.js.map} +0 -0
- /package/dist/{list-EJH6VAOW.js.map → lint-5AQ5C2BV.js.map} +0 -0
- /package/dist/{page-QEDB7EVU.js.map → list-5JZKX2NK.js.map} +0 -0
- /package/dist/{pretty-5DGEBZSV.js.map → list-SWPFXQMU.js.map} +0 -0
- /package/dist/{pretty-SQX33UM2.js.map → page-UPSXRP75.js.map} +0 -0
- /package/dist/{reporters-OHSI3RMV.js.map → pretty-Q6FQAOK4.js.map} +0 -0
- /package/dist/{reporters-YELDDYJD.js.map → pretty-SQRPFPSQ.js.map} +0 -0
- /package/dist/{run-IP6NZHAG.js.map → provider-AMGRDY6V.js.map} +0 -0
- /package/dist/{validate-G6HH3YXL.js.map → reporters-45MMC2ID.js.map} +0 -0
|
@@ -5,12 +5,12 @@ import {
|
|
|
5
5
|
loadTemplateFile,
|
|
6
6
|
resolveLintRun,
|
|
7
7
|
resolveStructureTool
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-SWSTHZBI.js";
|
|
9
9
|
import {
|
|
10
10
|
parserByName,
|
|
11
11
|
parserForExtension,
|
|
12
12
|
unsupportedFormatMessage
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-73TC4DYH.js";
|
|
14
14
|
import {
|
|
15
15
|
BLOCK_KINDS,
|
|
16
16
|
BLOCK_KIND_NODE
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
} from "./chunk-YGFIQ6Y5.js";
|
|
21
21
|
import {
|
|
22
22
|
writeTextAtomic
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-TUAAR3MM.js";
|
|
24
24
|
import {
|
|
25
25
|
ToolError,
|
|
26
26
|
errorMessage
|
|
@@ -298,4 +298,4 @@ export {
|
|
|
298
298
|
BUILT_IN_DEFAULTS,
|
|
299
299
|
runTools
|
|
300
300
|
};
|
|
301
|
-
//# sourceMappingURL=chunk-
|
|
301
|
+
//# sourceMappingURL=chunk-MWBJ3KTF.js.map
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
pathKey
|
|
4
|
+
} from "./chunk-YLK2J5YK.js";
|
|
5
|
+
import {
|
|
6
|
+
DEFAULT_CAPTURE_DIR,
|
|
7
|
+
makeRedactor
|
|
8
|
+
} from "./chunk-CU57HT2E.js";
|
|
9
|
+
|
|
10
|
+
// src/tracevals/rules/ledger.ts
|
|
11
|
+
import { createHash } from "node:crypto";
|
|
12
|
+
import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
13
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
14
|
+
var LEDGER_ENTRIES = 10;
|
|
15
|
+
var HISTORY_ENTRIES = 5;
|
|
16
|
+
var NOTE_CHARS = 200;
|
|
17
|
+
var FACT_TURNS = 30;
|
|
18
|
+
var COMMAND_CHARS = 120;
|
|
19
|
+
var LIMIT = { commands: 10, wrote: 10, read: 5, skills: 10, agents: 10 };
|
|
20
|
+
var GAP_RUNS = 3;
|
|
21
|
+
var sha256 = (s) => createHash("sha256").update(s).digest("hex");
|
|
22
|
+
function idHash(id) {
|
|
23
|
+
return sha256(id).slice(0, 32);
|
|
24
|
+
}
|
|
25
|
+
function ledgerPath(projectDir, sessionId, agentId) {
|
|
26
|
+
const agent = agentId === null ? "" : `.${idHash(agentId)}`;
|
|
27
|
+
return join(projectDir, DEFAULT_CAPTURE_DIR, `${idHash(sessionId)}${agent}.ledger.json`);
|
|
28
|
+
}
|
|
29
|
+
var emptyLedger = () => ({ version: 1, turns: [], rules: {} });
|
|
30
|
+
var OUTCOMES = /* @__PURE__ */ new Set(["followed", "broken", "needs-review", "not-applicable"]);
|
|
31
|
+
function isEntry(v) {
|
|
32
|
+
if (typeof v !== "object" || v === null) return false;
|
|
33
|
+
const e = v;
|
|
34
|
+
return typeof e.turn === "number" && OUTCOMES.has(e.outcome) && typeof e.note === "string";
|
|
35
|
+
}
|
|
36
|
+
var isStrings = (v) => Array.isArray(v) && v.every((s) => typeof s === "string");
|
|
37
|
+
var FACT_LISTS = ["sources", "commands", "wrote", "read", "skills", "agents"];
|
|
38
|
+
function isFacts(v) {
|
|
39
|
+
if (typeof v !== "object" || v === null) return false;
|
|
40
|
+
const f = v;
|
|
41
|
+
return typeof f.turn === "number" && typeof f.inScope === "boolean" && FACT_LISTS.every((k) => isStrings(f[k]));
|
|
42
|
+
}
|
|
43
|
+
async function readLedger(path) {
|
|
44
|
+
let parsed;
|
|
45
|
+
try {
|
|
46
|
+
parsed = JSON.parse(await readFile(path, "utf-8"));
|
|
47
|
+
} catch {
|
|
48
|
+
return emptyLedger();
|
|
49
|
+
}
|
|
50
|
+
if (typeof parsed !== "object" || parsed === null) return emptyLedger();
|
|
51
|
+
const { version, turns, rules } = parsed;
|
|
52
|
+
if (version !== 1 || typeof rules !== "object" || rules === null) return emptyLedger();
|
|
53
|
+
const ledger = emptyLedger();
|
|
54
|
+
if (Array.isArray(turns)) ledger.turns = turns.filter(isFacts);
|
|
55
|
+
for (const [key, value] of Object.entries(rules)) {
|
|
56
|
+
if (typeof value !== "object" || value === null) continue;
|
|
57
|
+
const { text, entries } = value;
|
|
58
|
+
if (typeof text !== "string" || !Array.isArray(entries)) continue;
|
|
59
|
+
ledger.rules[key] = { text, entries: entries.filter(isEntry) };
|
|
60
|
+
}
|
|
61
|
+
return ledger;
|
|
62
|
+
}
|
|
63
|
+
var sourceOf = (key) => key.slice(0, key.lastIndexOf("#"));
|
|
64
|
+
function keyEntries(entries) {
|
|
65
|
+
const broken = entries.filter((e) => e.outcome === "broken").reverse();
|
|
66
|
+
const picked = [entries.at(-1), entries.find((e) => e.outcome === "followed"), ...broken];
|
|
67
|
+
return [...new Set(picked.filter((e) => e !== void 0))].slice(0, HISTORY_ENTRIES).sort((a, b) => a.turn - b.turn);
|
|
68
|
+
}
|
|
69
|
+
function gaps(turns, source) {
|
|
70
|
+
const runs = [];
|
|
71
|
+
let open;
|
|
72
|
+
for (const t of turns) {
|
|
73
|
+
if (t.sources.includes(source)) {
|
|
74
|
+
open = void 0;
|
|
75
|
+
} else if (open !== void 0) {
|
|
76
|
+
open.to = t.turn;
|
|
77
|
+
} else {
|
|
78
|
+
open = { from: t.turn, to: t.turn };
|
|
79
|
+
runs.push(open);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return runs.slice(-GAP_RUNS);
|
|
83
|
+
}
|
|
84
|
+
function historyBlock(ledger, key, text, before) {
|
|
85
|
+
const rule = ledger.rules[key];
|
|
86
|
+
if (rule?.text !== sha256(text)) return "";
|
|
87
|
+
const shown = keyEntries(
|
|
88
|
+
rule.entries.filter((e) => e.turn < before && e.outcome !== "not-applicable")
|
|
89
|
+
);
|
|
90
|
+
if (shown.length === 0) return "";
|
|
91
|
+
const entries = shown.map((e) => ({
|
|
92
|
+
turn: e.turn,
|
|
93
|
+
line: `- turn ${String(e.turn)}: ${e.outcome}.${e.note !== "" ? ` ${e.note}` : ""}`
|
|
94
|
+
}));
|
|
95
|
+
const holes = gaps(
|
|
96
|
+
ledger.turns.filter((t) => t.turn < before),
|
|
97
|
+
sourceOf(key)
|
|
98
|
+
).map((g) => ({
|
|
99
|
+
turn: g.from,
|
|
100
|
+
line: g.from === g.to ? `- (turn ${String(g.from)}: not in scope)` : `- (turns ${String(g.from)}\u2013${String(g.to)}: not in scope)`
|
|
101
|
+
}));
|
|
102
|
+
const lines = [...entries, ...holes].sort((a, b) => a.turn - b.turn).map((l) => l.line);
|
|
103
|
+
return `# This rule earlier in this session
|
|
104
|
+
|
|
105
|
+
${lines.join("\n")}`;
|
|
106
|
+
}
|
|
107
|
+
var posix = (p) => p.split(sep).join("/");
|
|
108
|
+
function projectPath(path, cwd, root) {
|
|
109
|
+
const abs = resolve(cwd, path);
|
|
110
|
+
const r = relative(root, abs);
|
|
111
|
+
return posix(r === "" || r.startsWith("..") || isAbsolute(r) ? abs : r);
|
|
112
|
+
}
|
|
113
|
+
var clipTo = (s, max) => s.length <= max ? s : `${s.slice(0, max - 1)}\u2026`;
|
|
114
|
+
function turnFacts(trace, turn, sources, opts) {
|
|
115
|
+
const w = turn.window;
|
|
116
|
+
const scrub = makeRedactor(opts.redact);
|
|
117
|
+
const take = (items, n = Number.POSITIVE_INFINITY) => [...new Set(items)].slice(0, n);
|
|
118
|
+
const clip = (s) => clipTo(s, COMMAND_CHARS);
|
|
119
|
+
const rel = (path) => projectPath(path, opts.cwd, opts.root);
|
|
120
|
+
const commands = w.toolCalls.flatMap(
|
|
121
|
+
(c) => c.name === "Bash" && typeof c.input.command === "string" ? [clip(scrub(c.input.command.replace(/\s+/g, " ").trim()))] : []
|
|
122
|
+
);
|
|
123
|
+
const reads = new Set(
|
|
124
|
+
w.fileAccesses.filter((a) => a.op === "read").map((a) => pathKey(resolve(opts.cwd, a.path)))
|
|
125
|
+
);
|
|
126
|
+
return {
|
|
127
|
+
turn: turn.from,
|
|
128
|
+
inScope: sources.length > 0,
|
|
129
|
+
sources: take(sources.map((s) => s.displayPath)),
|
|
130
|
+
commands: take(commands, LIMIT.commands),
|
|
131
|
+
wrote: take(
|
|
132
|
+
w.fileAccesses.filter((a) => a.op !== "read").map((a) => scrub(rel(a.path))),
|
|
133
|
+
LIMIT.wrote
|
|
134
|
+
),
|
|
135
|
+
read: take(
|
|
136
|
+
// A source with no file (the typed prompts, an inline plan) has path "",
|
|
137
|
+
// which would resolve to the cwd; it is never read.
|
|
138
|
+
sources.filter((s) => s.path !== "" && reads.has(pathKey(s.path))).map((s) => s.displayPath),
|
|
139
|
+
LIMIT.read
|
|
140
|
+
),
|
|
141
|
+
skills: take(
|
|
142
|
+
w.skillInvocations.map((s) => s.name),
|
|
143
|
+
LIMIT.skills
|
|
144
|
+
),
|
|
145
|
+
agents: w.empty ? [] : take(
|
|
146
|
+
trace.agentSpawns.filter((a) => a.index >= turn.from && a.index <= turn.to).map((a) => a.subagentType),
|
|
147
|
+
LIMIT.agents
|
|
148
|
+
)
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function recordFacts(ledger, facts) {
|
|
152
|
+
const turns = [...ledger.turns.filter((t) => t.turn !== facts.turn), facts].sort((a, b) => a.turn - b.turn).slice(-FACT_TURNS);
|
|
153
|
+
return { ...ledger, turns };
|
|
154
|
+
}
|
|
155
|
+
function trim(entries) {
|
|
156
|
+
const first = entries.find((e) => e.outcome === "followed");
|
|
157
|
+
const out = [...entries];
|
|
158
|
+
while (out.length > LEDGER_ENTRIES) {
|
|
159
|
+
const last = out.length - 1;
|
|
160
|
+
const loose = out.findIndex((e, i) => e !== first && e.outcome !== "broken" && i !== last);
|
|
161
|
+
out.splice(loose >= 0 ? loose : out.findIndex((e) => e !== first), 1);
|
|
162
|
+
}
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
function recordTurn(ledger, turn, results) {
|
|
166
|
+
const next = { ...ledger, rules: { ...ledger.rules } };
|
|
167
|
+
for (const r of results) {
|
|
168
|
+
const hash = sha256(r.text);
|
|
169
|
+
const prior = next.rules[r.key];
|
|
170
|
+
const kept = prior?.text === hash ? prior.entries.filter((e) => e.turn !== turn) : [];
|
|
171
|
+
const entries = trim(
|
|
172
|
+
[...kept, { turn, outcome: r.outcome, note: r.note.slice(0, NOTE_CHARS) }].sort(
|
|
173
|
+
(a, b) => a.turn - b.turn
|
|
174
|
+
)
|
|
175
|
+
);
|
|
176
|
+
next.rules[r.key] = { text: hash, entries };
|
|
177
|
+
}
|
|
178
|
+
return next;
|
|
179
|
+
}
|
|
180
|
+
function rollup(ledger) {
|
|
181
|
+
const keys = Object.keys(ledger.rules);
|
|
182
|
+
if (ledger.turns.length === 0 && keys.length === 0) return null;
|
|
183
|
+
const rules = keys.flatMap((key) => {
|
|
184
|
+
const entries = ledger.rules[key]?.entries ?? [];
|
|
185
|
+
const last = entries.at(-1);
|
|
186
|
+
if (last === void 0) return [];
|
|
187
|
+
const source = sourceOf(key);
|
|
188
|
+
const n = (o) => entries.filter((e) => e.outcome === o).length;
|
|
189
|
+
return [
|
|
190
|
+
{
|
|
191
|
+
source,
|
|
192
|
+
rule: key.slice(source.length + 1),
|
|
193
|
+
followed: n("followed"),
|
|
194
|
+
broken: n("broken"),
|
|
195
|
+
repaired: entries.filter(
|
|
196
|
+
(e, i) => e.outcome === "broken" && entries.slice(i + 1).some((f) => f.outcome === "followed")
|
|
197
|
+
).length,
|
|
198
|
+
needsReview: n("needs-review"),
|
|
199
|
+
notApplicable: n("not-applicable"),
|
|
200
|
+
notInScope: ledger.turns.filter((t) => !t.sources.includes(source)).length,
|
|
201
|
+
last: { turn: last.turn, outcome: last.outcome }
|
|
202
|
+
}
|
|
203
|
+
];
|
|
204
|
+
});
|
|
205
|
+
return { turns: ledger.turns.length, rules };
|
|
206
|
+
}
|
|
207
|
+
async function writeLedger(path, ledger) {
|
|
208
|
+
await mkdir(dirname(path), { recursive: true });
|
|
209
|
+
const tmp = `${path}.${String(process.pid)}.tmp`;
|
|
210
|
+
await writeFile(tmp, `${JSON.stringify(ledger, null, 2)}
|
|
211
|
+
`, "utf-8");
|
|
212
|
+
try {
|
|
213
|
+
await rename(tmp, path);
|
|
214
|
+
} catch (err) {
|
|
215
|
+
await rm(tmp, { force: true });
|
|
216
|
+
throw err;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export {
|
|
221
|
+
idHash,
|
|
222
|
+
ledgerPath,
|
|
223
|
+
readLedger,
|
|
224
|
+
historyBlock,
|
|
225
|
+
projectPath,
|
|
226
|
+
clipTo,
|
|
227
|
+
turnFacts,
|
|
228
|
+
recordFacts,
|
|
229
|
+
recordTurn,
|
|
230
|
+
rollup,
|
|
231
|
+
writeLedger
|
|
232
|
+
};
|
|
233
|
+
//# sourceMappingURL=chunk-N7JSEDSC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tracevals/rules/ledger.ts"],"sourcesContent":["/**\n * The session ledger (proposal 0079, \"The ledger\"). What each turn of one\n * session did, and what the in-loop judge found for each rule, so a rule\n * about a procedure that spans turns is judged with what earlier turns did.\n *\n * Only the hook writes it, one file per session and one per subagent, so\n * parallel SubagentStops never share a file. `check` by hand reads it and\n * never writes it. A missing or unreadable ledger is an empty history.\n */\nimport { createHash } from \"node:crypto\";\nimport { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport { DEFAULT_CAPTURE_DIR } from \"../capture/types.js\";\nimport { makeRedactor } from \"../judge/redact.js\";\nimport type { Trace } from \"../trace/types.js\";\nimport { pathKey, type RuleSource } from \"./sources.js\";\nimport type { TurnSlice } from \"./turn.js\";\n\nexport type LedgerOutcome = \"followed\" | \"broken\" | \"needs-review\" | \"not-applicable\";\n\nexport interface LedgerEntry {\n /** The turn's first event, as an ordinal in the trace. */\n turn: number;\n outcome: LedgerOutcome;\n /** The judge's reasoning, cut to `NOTE_CHARS`. */\n note: string;\n}\n\n/** What one turn did, read from the trace with no model. */\nexport interface TurnFacts {\n turn: number;\n /** Whether any rule source governed the turn. */\n inScope: boolean;\n /** The rule sources in scope, by display path. */\n sources: string[];\n /** Bash commands, each clipped to `COMMAND_CHARS`. */\n commands: string[];\n /** Files written or edited, relative to the project. */\n wrote: string[];\n /** Rule sources the turn read. */\n read: string[];\n skills: string[];\n /** Subagent types the turn spawned. */\n agents: string[];\n}\n\nexport interface Ledger {\n version: 1;\n /** The last `FACT_TURNS` turns the hook saw, oldest first. */\n turns: TurnFacts[];\n /** Keyed `<source>#<id>`. `text` is the rule text's sha256, so an edited rule starts fresh. */\n rules: Record<string, { text: string; entries: LedgerEntry[] }>;\n}\n\nexport const LEDGER_ENTRIES = 10;\nexport const HISTORY_ENTRIES = 5;\nexport const NOTE_CHARS = 200;\nexport const FACT_TURNS = 30;\nexport const COMMAND_CHARS = 120;\nconst LIMIT = { commands: 10, wrote: 10, read: 5, skills: 10, agents: 10 } as const;\n/** Runs of turns a rule's source missed, shown in its history. */\nconst GAP_RUNS = 3;\n\nconst sha256 = (s: string): string => createHash(\"sha256\").update(s).digest(\"hex\");\n\n/** A session or agent id, hashed so nothing in it can climb out of the directory. */\nexport function idHash(id: string): string {\n return sha256(id).slice(0, 32);\n}\n\n/** `<project>/.manni/tracevals/sessions/<session hash>[.<agent id hash>].ledger.json` */\nexport function ledgerPath(projectDir: string, sessionId: string, agentId: string | null): string {\n const agent = agentId === null ? \"\" : `.${idHash(agentId)}`;\n return join(projectDir, DEFAULT_CAPTURE_DIR, `${idHash(sessionId)}${agent}.ledger.json`);\n}\n\nexport const emptyLedger = (): Ledger => ({ version: 1, turns: [], rules: {} });\n\nconst OUTCOMES = new Set<unknown>([\"followed\", \"broken\", \"needs-review\", \"not-applicable\"]);\n\nfunction isEntry(v: unknown): v is LedgerEntry {\n if (typeof v !== \"object\" || v === null) return false;\n const e = v as Record<string, unknown>;\n return typeof e.turn === \"number\" && OUTCOMES.has(e.outcome) && typeof e.note === \"string\";\n}\n\nconst isStrings = (v: unknown): v is string[] =>\n Array.isArray(v) && v.every((s) => typeof s === \"string\");\n\nconst FACT_LISTS = [\"sources\", \"commands\", \"wrote\", \"read\", \"skills\", \"agents\"] as const;\n\nfunction isFacts(v: unknown): v is TurnFacts {\n if (typeof v !== \"object\" || v === null) return false;\n const f = v as Record<string, unknown>;\n return (\n typeof f.turn === \"number\" &&\n typeof f.inScope === \"boolean\" &&\n FACT_LISTS.every((k) => isStrings(f[k]))\n );\n}\n\n/** Never throws: anything but a well-formed ledger reads as an empty one. */\nexport async function readLedger(path: string): Promise<Ledger> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(await readFile(path, \"utf-8\"));\n } catch {\n return emptyLedger();\n }\n if (typeof parsed !== \"object\" || parsed === null) return emptyLedger();\n const { version, turns, rules } = parsed as Record<string, unknown>;\n if (version !== 1 || typeof rules !== \"object\" || rules === null) return emptyLedger();\n const ledger = emptyLedger();\n if (Array.isArray(turns)) ledger.turns = turns.filter(isFacts);\n for (const [key, value] of Object.entries(rules)) {\n if (typeof value !== \"object\" || value === null) continue;\n const { text, entries } = value as Record<string, unknown>;\n if (typeof text !== \"string\" || !Array.isArray(entries)) continue;\n ledger.rules[key] = { text, entries: entries.filter(isEntry) };\n }\n return ledger;\n}\n\n/** The source half of a `<source>#<id>` key. */\nconst sourceOf = (key: string): string => key.slice(0, key.lastIndexOf(\"#\"));\n\n/**\n * The entries a rule's history keeps in view: its latest, its first\n * `followed`, then its `broken` ones from newest back, at most\n * `HISTORY_ENTRIES`, oldest first.\n */\nfunction keyEntries(entries: LedgerEntry[]): LedgerEntry[] {\n const broken = entries.filter((e) => e.outcome === \"broken\").reverse();\n const picked = [entries.at(-1), entries.find((e) => e.outcome === \"followed\"), ...broken];\n return [...new Set(picked.filter((e): e is LedgerEntry => e !== undefined))]\n .slice(0, HISTORY_ENTRIES)\n .sort((a, b) => a.turn - b.turn);\n}\n\n/** The last `GAP_RUNS` runs of consecutive recorded turns whose sources leave `source` out. */\nfunction gaps(turns: TurnFacts[], source: string): { from: number; to: number }[] {\n const runs: { from: number; to: number }[] = [];\n let open: { from: number; to: number } | undefined;\n for (const t of turns) {\n if (t.sources.includes(source)) {\n open = undefined;\n } else if (open !== undefined) {\n open.to = t.turn;\n } else {\n open = { from: t.turn, to: t.turn };\n runs.push(open);\n }\n }\n return runs.slice(-GAP_RUNS);\n}\n\n/**\n * The block a rule's item carries, or \"\" when the ledger holds nothing for it\n * before `before` other than turns it did not apply to. Runs of recorded\n * turns where its source was not in scope are marked, so a hole in the\n * history does not read as quiet.\n */\nexport function historyBlock(ledger: Ledger, key: string, text: string, before: number): string {\n const rule = ledger.rules[key];\n if (rule?.text !== sha256(text)) return \"\";\n const shown = keyEntries(\n rule.entries.filter((e) => e.turn < before && e.outcome !== \"not-applicable\"),\n );\n if (shown.length === 0) return \"\";\n const entries = shown.map((e) => ({\n turn: e.turn,\n line: `- turn ${String(e.turn)}: ${e.outcome}.${e.note !== \"\" ? ` ${e.note}` : \"\"}`,\n }));\n const holes = gaps(\n ledger.turns.filter((t) => t.turn < before),\n sourceOf(key),\n ).map((g) => ({\n turn: g.from,\n line:\n g.from === g.to\n ? `- (turn ${String(g.from)}: not in scope)`\n : `- (turns ${String(g.from)}–${String(g.to)}: not in scope)`,\n }));\n const lines = [...entries, ...holes].sort((a, b) => a.turn - b.turn).map((l) => l.line);\n return `# This rule earlier in this session\\n\\n${lines.join(\"\\n\")}`;\n}\n\nconst posix = (p: string): string => p.split(sep).join(\"/\");\n\n/** A path as the turn named it, relative to the project root when it is under it. */\nexport function projectPath(path: string, cwd: string, root: string): string {\n const abs = resolve(cwd, path);\n const r = relative(root, abs);\n return posix(r === \"\" || r.startsWith(\"..\") || isAbsolute(r) ? abs : r);\n}\n\n/** `s` cut to at most `max` characters, the last an ellipsis when cut. */\nexport const clipTo = (s: string, max: number): string =>\n s.length <= max ? s : `${s.slice(0, max - 1)}…`;\n\n/**\n * What the turn did, read from its window. Commands and paths pass through\n * the judge's redactor. `sources` are the rule sources in scope, none for a\n * turn that stopped before they were resolved.\n */\nexport function turnFacts(\n trace: Trace,\n turn: TurnSlice,\n sources: Pick<RuleSource, \"path\" | \"displayPath\">[],\n opts: { cwd: string; root: string; redact: readonly string[] },\n): TurnFacts {\n const w = turn.window;\n const scrub = makeRedactor(opts.redact);\n const take = (items: string[], n = Number.POSITIVE_INFINITY): string[] =>\n [...new Set(items)].slice(0, n);\n const clip = (s: string): string => clipTo(s, COMMAND_CHARS);\n const rel = (path: string): string => projectPath(path, opts.cwd, opts.root);\n const commands = w.toolCalls.flatMap((c) =>\n c.name === \"Bash\" && typeof c.input.command === \"string\"\n ? [clip(scrub(c.input.command.replace(/\\s+/g, \" \").trim()))]\n : [],\n );\n const reads = new Set(\n w.fileAccesses.filter((a) => a.op === \"read\").map((a) => pathKey(resolve(opts.cwd, a.path))),\n );\n return {\n turn: turn.from,\n inScope: sources.length > 0,\n sources: take(sources.map((s) => s.displayPath)),\n commands: take(commands, LIMIT.commands),\n wrote: take(\n w.fileAccesses.filter((a) => a.op !== \"read\").map((a) => scrub(rel(a.path))),\n LIMIT.wrote,\n ),\n read: take(\n // A source with no file (the typed prompts, an inline plan) has path \"\",\n // which would resolve to the cwd; it is never read.\n sources.filter((s) => s.path !== \"\" && reads.has(pathKey(s.path))).map((s) => s.displayPath),\n LIMIT.read,\n ),\n skills: take(\n w.skillInvocations.map((s) => s.name),\n LIMIT.skills,\n ),\n agents: w.empty\n ? []\n : take(\n trace.agentSpawns\n .filter((a) => a.index >= turn.from && a.index <= turn.to)\n .map((a) => a.subagentType),\n LIMIT.agents,\n ),\n };\n}\n\n/** The ledger with this turn's facts, replacing any earlier record of the same turn. */\nexport function recordFacts(ledger: Ledger, facts: TurnFacts): Ledger {\n const turns = [...ledger.turns.filter((t) => t.turn !== facts.turn), facts]\n .sort((a, b) => a.turn - b.turn)\n .slice(-FACT_TURNS);\n return { ...ledger, turns };\n}\n\nexport interface TurnResult {\n key: string;\n text: string;\n outcome: LedgerOutcome;\n note: string;\n}\n\n/**\n * Cut a rule's entries to `LEDGER_ENTRIES`. The first `followed`, every\n * `broken` and the latest are pinned, so the others go first, oldest first.\n * Only when every entry is pinned does the oldest `broken` go.\n */\nfunction trim(entries: LedgerEntry[]): LedgerEntry[] {\n const first = entries.find((e) => e.outcome === \"followed\");\n const out = [...entries];\n while (out.length > LEDGER_ENTRIES) {\n const last = out.length - 1;\n const loose = out.findIndex((e, i) => e !== first && e.outcome !== \"broken\" && i !== last);\n out.splice(loose >= 0 ? loose : out.findIndex((e) => e !== first), 1);\n }\n return out;\n}\n\n/** The ledger with this turn's results, replacing any earlier record of the same turn. */\nexport function recordTurn(ledger: Ledger, turn: number, results: TurnResult[]): Ledger {\n const next: Ledger = { ...ledger, rules: { ...ledger.rules } };\n for (const r of results) {\n const hash = sha256(r.text);\n const prior = next.rules[r.key];\n const kept = prior?.text === hash ? prior.entries.filter((e) => e.turn !== turn) : [];\n const entries = trim(\n [...kept, { turn, outcome: r.outcome, note: r.note.slice(0, NOTE_CHARS) }].sort(\n (a, b) => a.turn - b.turn,\n ),\n );\n next.rules[r.key] = { text: hash, entries };\n }\n return next;\n}\n\nexport interface RuleRollup {\n source: string;\n rule: string;\n followed: number;\n broken: number;\n /** Broken entries that a later `followed` entry came after. */\n repaired: number;\n needsReview: number;\n notApplicable: number;\n /** Recorded turns where the rule's source was not in scope. */\n notInScope: number;\n last: { turn: number; outcome: LedgerOutcome };\n}\n\nexport interface SessionRollup {\n /** Turns the ledger records. */\n turns: number;\n rules: RuleRollup[];\n}\n\n/** Each rule's record over the session, or null when the ledger holds nothing. */\nexport function rollup(ledger: Ledger): SessionRollup | null {\n const keys = Object.keys(ledger.rules);\n if (ledger.turns.length === 0 && keys.length === 0) return null;\n const rules = keys.flatMap((key): RuleRollup[] => {\n const entries = ledger.rules[key]?.entries ?? [];\n const last = entries.at(-1);\n if (last === undefined) return [];\n const source = sourceOf(key);\n const n = (o: LedgerOutcome): number => entries.filter((e) => e.outcome === o).length;\n return [\n {\n source,\n rule: key.slice(source.length + 1),\n followed: n(\"followed\"),\n broken: n(\"broken\"),\n repaired: entries.filter(\n (e, i) =>\n e.outcome === \"broken\" && entries.slice(i + 1).some((f) => f.outcome === \"followed\"),\n ).length,\n needsReview: n(\"needs-review\"),\n notApplicable: n(\"not-applicable\"),\n notInScope: ledger.turns.filter((t) => !t.sources.includes(source)).length,\n last: { turn: last.turn, outcome: last.outcome },\n },\n ];\n });\n return { turns: ledger.turns.length, rules };\n}\n\n/** Temp file and rename, so a reader never sees half a ledger. Throws on failure. */\nexport async function writeLedger(path: string, ledger: Ledger): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n const tmp = `${path}.${String(process.pid)}.tmp`;\n await writeFile(tmp, `${JSON.stringify(ledger, null, 2)}\\n`, \"utf-8\");\n try {\n await rename(tmp, path);\n } catch (err) {\n await rm(tmp, { force: true });\n throw err;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
TERM_FIELDS,
|
|
4
4
|
displayPath
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-C73RSUIC.js";
|
|
6
6
|
|
|
7
7
|
// src/term/reporters/json.ts
|
|
8
8
|
function termEntry(term) {
|
|
@@ -49,4 +49,4 @@ export {
|
|
|
49
49
|
renderFindingsJson,
|
|
50
50
|
renderFormatsJson
|
|
51
51
|
};
|
|
52
|
-
//# sourceMappingURL=chunk-
|
|
52
|
+
//# sourceMappingURL=chunk-NBMPHD4I.js.map
|
|
@@ -19,10 +19,10 @@ import {
|
|
|
19
19
|
sha256,
|
|
20
20
|
splitBody,
|
|
21
21
|
urlManifestRefusal
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-Z4IZGEM3.js";
|
|
23
23
|
import {
|
|
24
24
|
turnBudgetSkipReason
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-XG6PVB5S.js";
|
|
26
26
|
import {
|
|
27
27
|
isExecutionGrant,
|
|
28
28
|
unknownGrantsMessage
|
|
@@ -33,7 +33,7 @@ import {
|
|
|
33
33
|
import {
|
|
34
34
|
externalWriteWarnings,
|
|
35
35
|
offerExternalHomes
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-GREQKO6M.js";
|
|
37
37
|
import {
|
|
38
38
|
LOCATION_KEYWORD,
|
|
39
39
|
Validator,
|
|
@@ -41,21 +41,23 @@ import {
|
|
|
41
41
|
readManifestOrEmpty,
|
|
42
42
|
readManifestValue,
|
|
43
43
|
spliceManifestValue
|
|
44
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-TUAAR3MM.js";
|
|
45
45
|
import {
|
|
46
46
|
writeFileAtomic
|
|
47
|
-
} from "./chunk-
|
|
47
|
+
} from "./chunk-KCOFEWV5.js";
|
|
48
|
+
import {
|
|
49
|
+
noticeOnce,
|
|
50
|
+
warn
|
|
51
|
+
} from "./chunk-HX44GB4Z.js";
|
|
48
52
|
import {
|
|
49
53
|
assertKnownProvider,
|
|
50
54
|
assertLocalFlag,
|
|
51
55
|
assertModelHasProvider,
|
|
52
56
|
localNotice,
|
|
53
|
-
noticeOnce,
|
|
54
57
|
providerSpecFor,
|
|
55
58
|
resolveIdentity,
|
|
56
|
-
selectProvider
|
|
57
|
-
|
|
58
|
-
} from "./chunk-Q35YIDBV.js";
|
|
59
|
+
selectProvider
|
|
60
|
+
} from "./chunk-QCHVR4ZM.js";
|
|
59
61
|
import {
|
|
60
62
|
errorMessage
|
|
61
63
|
} from "./chunk-G3T47CFV.js";
|
|
@@ -1039,4 +1041,4 @@ export {
|
|
|
1039
1041
|
makeGenerateScripts,
|
|
1040
1042
|
runRun
|
|
1041
1043
|
};
|
|
1042
|
-
//# sourceMappingURL=chunk-
|
|
1044
|
+
//# sourceMappingURL=chunk-NHHOPZRA.js.map
|