@quickchatai/quickreview 1.2.0 → 1.3.1
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 +114 -50
- package/bin/qcr.js +1 -1
- package/config.example.toml +20 -6
- package/deploy/ansible/README.md +20 -12
- package/deploy/ansible/inventory.example.ini +1 -1
- package/deploy/collect-secrets.sh +1 -1
- package/deploy/qcr-update.sh +1 -1
- package/dist/extensions/cli/home.js +14 -0
- package/dist/extensions/cli/home.js.map +1 -0
- package/dist/extensions/cli/selfimprove.js +18 -0
- package/dist/extensions/cli/selfimprove.js.map +1 -0
- package/dist/extensions/home.js +350 -0
- package/dist/extensions/home.js.map +1 -0
- package/dist/extensions/login-route.js +1 -1
- package/dist/extensions/login-route.js.map +1 -1
- package/dist/extensions/onboarding.js +8 -7
- package/dist/extensions/onboarding.js.map +1 -1
- package/dist/extensions/selfimprove.js +49 -0
- package/dist/extensions/selfimprove.js.map +1 -0
- package/dist/extensions/setup-scan.js +23 -592
- package/dist/extensions/setup-scan.js.map +1 -1
- package/dist/extensions/setup.js +2 -47
- package/dist/extensions/setup.js.map +1 -1
- package/dist/src/archive/restore.js +18 -15
- package/dist/src/archive/restore.js.map +1 -1
- package/dist/src/botworker.js +13 -2
- package/dist/src/botworker.js.map +1 -1
- package/dist/src/channelfs.js +3 -26
- package/dist/src/channelfs.js.map +1 -1
- package/dist/src/cli.js +12 -50
- package/dist/src/cli.js.map +1 -1
- package/dist/src/config.js +16 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/daemon.js +26 -0
- package/dist/src/daemon.js.map +1 -1
- package/dist/src/debuground.js +1 -0
- package/dist/src/debuground.js.map +1 -1
- package/dist/src/debugroundpi.js +1 -0
- package/dist/src/debugroundpi.js.map +1 -1
- package/dist/src/engine/caserunner-sdk.js +15 -251
- package/dist/src/engine/caserunner-sdk.js.map +1 -1
- package/dist/src/home/adapters.js +349 -0
- package/dist/src/home/adapters.js.map +1 -0
- package/dist/src/home/advanced.js +318 -0
- package/dist/src/home/advanced.js.map +1 -0
- package/dist/src/home/advancedtools.js +57 -0
- package/dist/src/home/advancedtools.js.map +1 -0
- package/dist/src/home/autoreview.js +325 -0
- package/dist/src/home/autoreview.js.map +1 -0
- package/dist/src/home/daemonstatus.js +32 -0
- package/dist/src/home/daemonstatus.js.map +1 -0
- package/dist/src/home/devicelogin.js +61 -0
- package/dist/src/home/devicelogin.js.map +1 -0
- package/dist/src/home/launch.js +202 -0
- package/dist/src/home/launch.js.map +1 -0
- package/dist/src/home/loginowner.js +205 -0
- package/dist/src/home/loginowner.js.map +1 -0
- package/dist/src/home/memory.js +122 -0
- package/dist/src/home/memory.js.map +1 -0
- package/dist/src/home/model.js +811 -0
- package/dist/src/home/model.js.map +1 -0
- package/dist/src/home/panel.js +520 -0
- package/dist/src/home/panel.js.map +1 -0
- package/dist/src/home/ports.js +19 -0
- package/dist/src/home/ports.js.map +1 -0
- package/dist/src/home/review.js +163 -0
- package/dist/src/home/review.js.map +1 -0
- package/dist/src/home/reviews.js +478 -0
- package/dist/src/home/reviews.js.map +1 -0
- package/dist/src/home/setup.js +507 -0
- package/dist/src/home/setup.js.map +1 -0
- package/dist/src/home/setupadapters.js +214 -0
- package/dist/src/home/setupadapters.js.map +1 -0
- package/dist/src/home/setupcard.js +199 -0
- package/dist/src/home/setupcard.js.map +1 -0
- package/dist/src/home/setuptools.js +45 -0
- package/dist/src/home/setuptools.js.map +1 -0
- package/dist/src/home/spend.js +160 -0
- package/dist/src/home/spend.js.map +1 -0
- package/dist/src/home/switches.js +209 -0
- package/dist/src/home/switches.js.map +1 -0
- package/dist/src/home/switchon.js +439 -0
- package/dist/src/home/switchon.js.map +1 -0
- package/dist/src/home/toolnames.js +41 -0
- package/dist/src/home/toolnames.js.map +1 -0
- package/dist/src/home/tune.js +341 -0
- package/dist/src/home/tune.js.map +1 -0
- package/dist/src/home/words.js +7 -0
- package/dist/src/home/words.js.map +1 -0
- package/dist/src/homes.js +14 -0
- package/dist/src/homes.js.map +1 -1
- package/dist/src/install.js +1 -1
- package/dist/src/install.js.map +1 -1
- package/dist/src/ipc/workerspec.js +8 -0
- package/dist/src/ipc/workerspec.js.map +1 -1
- package/dist/src/live/publish.js +1 -1
- package/dist/src/live/publish.js.map +1 -1
- package/dist/src/livecli.js +1 -1
- package/dist/src/livecli.js.map +1 -1
- package/dist/src/loginrefresh/handover.js +121 -0
- package/dist/src/loginrefresh/handover.js.map +1 -0
- package/dist/src/loginrefresh/lock.js +54 -3
- package/dist/src/loginrefresh/lock.js.map +1 -1
- package/dist/src/loginrefresh/refresher.js +33 -5
- package/dist/src/loginrefresh/refresher.js.map +1 -1
- package/dist/src/loginrefresh/supervisor.js +18 -1
- package/dist/src/loginrefresh/supervisor.js.map +1 -1
- package/dist/src/npmverbs.js +42 -12
- package/dist/src/npmverbs.js.map +1 -1
- package/dist/src/onboard/choices.js +6 -3
- package/dist/src/onboard/choices.js.map +1 -1
- package/dist/src/onboard/engine.js +33 -292
- package/dist/src/onboard/engine.js.map +1 -1
- package/dist/src/onboard/steps/bringup.js +3 -2
- package/dist/src/onboard/steps/bringup.js.map +1 -1
- package/dist/src/onboard/steps/configfill.js +18 -7
- package/dist/src/onboard/steps/configfill.js.map +1 -1
- package/dist/src/onboard/steps/loginshare.js +213 -0
- package/dist/src/onboard/steps/loginshare.js.map +1 -0
- package/dist/src/onboard/steps/memory.js +14 -2
- package/dist/src/onboard/steps/memory.js.map +1 -1
- package/dist/src/onboard/steps/repoconfig.js +72 -0
- package/dist/src/onboard/steps/repoconfig.js.map +1 -0
- package/dist/src/onboard/toolnames.js +2 -2
- package/dist/src/onboard/toolnames.js.map +1 -1
- package/dist/src/piagentdir.js +13 -0
- package/dist/src/piagentdir.js.map +1 -0
- package/dist/src/pilogin.js +31 -16
- package/dist/src/pilogin.js.map +1 -1
- package/dist/src/qcrbin.js +16 -11
- package/dist/src/qcrbin.js.map +1 -1
- package/dist/src/reviewargs.js +122 -0
- package/dist/src/reviewargs.js.map +1 -0
- package/dist/src/reviewcli.js +7 -161
- package/dist/src/reviewcli.js.map +1 -1
- package/dist/src/reviewdetach.js +76 -11
- package/dist/src/reviewdetach.js.map +1 -1
- package/dist/src/scancli.js +39 -691
- package/dist/src/scancli.js.map +1 -1
- package/dist/src/selfimprove.js +66 -0
- package/dist/src/selfimprove.js.map +1 -0
- package/dist/src/setup/adapters.js +5 -223
- package/dist/src/setup/adapters.js.map +1 -1
- package/dist/src/setup/caserunner.js +15 -249
- package/dist/src/setup/caserunner.js.map +1 -1
- package/dist/src/setup/engine.js +32 -341
- package/dist/src/setup/engine.js.map +1 -1
- package/dist/src/setup/facts.js +3 -592
- package/dist/src/setup/facts.js.map +1 -1
- package/dist/src/setup/findings.js +3 -947
- package/dist/src/setup/findings.js.map +1 -1
- package/dist/src/setup/presentation.js +3 -8
- package/dist/src/setup/presentation.js.map +1 -1
- package/dist/src/setup/scan.js +3 -724
- package/dist/src/setup/scan.js.map +1 -1
- package/dist/src/setup/scanbuild.js +9 -92
- package/dist/src/setup/scanbuild.js.map +1 -1
- package/dist/src/setup/scanlease.js +3 -250
- package/dist/src/setup/scanlease.js.map +1 -1
- package/dist/src/setup/scanreport.js +3 -288
- package/dist/src/setup/scanreport.js.map +1 -1
- package/dist/src/setup/scanrun.js +3 -1732
- package/dist/src/setup/scanrun.js.map +1 -1
- package/dist/src/setup/scantree.js +3 -256
- package/dist/src/setup/scantree.js.map +1 -1
- package/dist/src/setup/stage2request.js +3 -258
- package/dist/src/setup/stage2request.js.map +1 -1
- package/dist/src/setup/unitcut.js +3 -436
- package/dist/src/setup/unitcut.js.map +1 -1
- package/dist/src/state.js +2 -0
- package/dist/src/state.js.map +1 -1
- package/dist/src/takeover.js +1 -0
- package/dist/src/takeover.js.map +1 -1
- package/dist/src/takeoverpi.js +2 -1
- package/dist/src/takeoverpi.js.map +1 -1
- package/dist/src/tui/board.js +1 -1
- package/dist/src/tui/board.js.map +1 -1
- package/dist/src/tui/companion.js +2 -1
- package/dist/src/tui/companion.js.map +1 -1
- package/dist/src/tui/deploytab.js +2 -2
- package/dist/src/tui/deploytab.js.map +1 -1
- package/dist/src/tui/index.js +9 -6
- package/dist/src/tui/index.js.map +1 -1
- package/dist/src/tui/memory.js +3 -16
- package/dist/src/tui/memory.js.map +1 -1
- package/dist/src/tui/memoryurl.js +22 -0
- package/dist/src/tui/memoryurl.js.map +1 -0
- package/dist/src/tui/remote.js +1 -1
- package/dist/src/tui/remote.js.map +1 -1
- package/dist/src/tui/route.js +2 -2
- package/dist/src/tui/route.js.map +1 -1
- package/dist/src/tui/setupstate.js +8 -5
- package/dist/src/tui/setupstate.js.map +1 -1
- package/dist/src/tui/sshtriage.js +1 -1
- package/dist/src/tui/sshtriage.js.map +1 -1
- package/dist/src/wire.js +6 -2
- package/dist/src/wire.js.map +1 -1
- package/dist/src/workerworld.js +4 -0
- package/dist/src/workerworld.js.map +1 -1
- package/docker/README.md +1 -1
- package/docker/entrypoint.sh +40 -6
- package/docker-compose.yml +16 -1
- package/extensions/cli/home.ts +14 -0
- package/extensions/cli/selfimprove.ts +18 -0
- package/extensions/home.ts +484 -0
- package/extensions/login-route.ts +1 -1
- package/extensions/onboarding.ts +8 -7
- package/extensions/selfimprove.ts +65 -0
- package/extensions/setup-scan.ts +79 -766
- package/extensions/setup.ts +14 -70
- package/package.json +6 -4
- package/prompts/onboarding.md +8 -7
- package/schemas/review-result.v1.json +60 -0
- package/scripts/deploy.sh +8 -6
- package/scripts/qcr-host.sh +28 -5
- package/scripts/vm-ghcr-login.sh +7 -4
- package/src/archive/restore.ts +18 -21
- package/src/botworker.ts +13 -2
- package/src/channelfs.ts +3 -26
- package/src/cli.ts +11 -54
- package/src/config.ts +38 -0
- package/src/daemon.ts +26 -0
- package/src/debuground.ts +3 -0
- package/src/debugroundpi.ts +1 -0
- package/src/engine/caserunner-sdk.ts +29 -314
- package/src/home/adapters.ts +418 -0
- package/src/home/advanced.ts +421 -0
- package/src/home/advancedtools.ts +96 -0
- package/src/home/autoreview.ts +385 -0
- package/src/home/daemonstatus.ts +55 -0
- package/src/home/devicelogin.ts +107 -0
- package/src/home/launch.ts +257 -0
- package/src/home/loginowner.ts +248 -0
- package/src/home/memory.ts +176 -0
- package/src/home/model.ts +965 -0
- package/src/home/panel.ts +666 -0
- package/src/home/ports.ts +338 -0
- package/src/home/review.ts +206 -0
- package/src/home/reviews.ts +565 -0
- package/src/home/setup.ts +689 -0
- package/src/home/setupadapters.ts +217 -0
- package/src/home/setupcard.ts +288 -0
- package/src/home/setuptools.ts +57 -0
- package/src/home/spend.ts +194 -0
- package/src/home/switches.ts +293 -0
- package/src/home/switchon.ts +554 -0
- package/src/home/toolnames.ts +46 -0
- package/src/home/tune.ts +405 -0
- package/src/home/words.ts +8 -0
- package/src/homes.ts +17 -0
- package/src/install.ts +1 -1
- package/src/ipc/workerspec.ts +15 -0
- package/src/live/publish.ts +4 -1
- package/src/livecli.ts +6 -1
- package/src/loginrefresh/handover.ts +138 -0
- package/src/loginrefresh/lock.ts +72 -3
- package/src/loginrefresh/refresher.ts +34 -5
- package/src/loginrefresh/supervisor.ts +25 -2
- package/src/npmverbs.ts +51 -11
- package/src/onboard/choices.ts +6 -3
- package/src/onboard/engine.ts +64 -434
- package/src/onboard/steps/bringup.ts +3 -2
- package/src/onboard/steps/configfill.ts +23 -7
- package/src/onboard/steps/loginshare.ts +258 -0
- package/src/onboard/steps/memory.ts +18 -2
- package/src/onboard/steps/repoconfig.ts +85 -0
- package/src/onboard/toolnames.ts +2 -2
- package/src/piagentdir.ts +12 -0
- package/src/pilogin.ts +32 -16
- package/src/qcrbin.ts +16 -11
- package/src/reviewargs.ts +119 -0
- package/src/reviewcli.ts +6 -167
- package/src/reviewdetach.ts +107 -13
- package/src/scancli.ts +75 -826
- package/src/selfimprove.ts +90 -0
- package/src/setup/adapters.ts +13 -221
- package/src/setup/caserunner.ts +34 -273
- package/src/setup/engine.ts +62 -496
- package/src/setup/facts.ts +3 -627
- package/src/setup/findings.ts +3 -1264
- package/src/setup/presentation.ts +3 -18
- package/src/setup/scan.ts +3 -1033
- package/src/setup/scanbuild.ts +20 -114
- package/src/setup/scanlease.ts +3 -297
- package/src/setup/scanreport.ts +3 -373
- package/src/setup/scanrun.ts +3 -2268
- package/src/setup/scantree.ts +3 -259
- package/src/setup/stage2request.ts +3 -347
- package/src/setup/unitcut.ts +3 -523
- package/src/state.ts +25 -0
- package/src/takeover.ts +5 -0
- package/src/takeoverpi.ts +3 -2
- package/src/tui/board.ts +1 -1
- package/src/tui/companion.ts +2 -1
- package/src/tui/deploytab.ts +2 -2
- package/src/tui/index.ts +9 -6
- package/src/tui/memory.ts +3 -15
- package/src/tui/memoryurl.ts +22 -0
- package/src/tui/remote.ts +1 -1
- package/src/tui/route.ts +2 -2
- package/src/tui/setupstate.ts +20 -16
- package/src/tui/sshtriage.ts +1 -1
- package/src/wire.ts +6 -2
- package/src/workerworld.ts +9 -1
- package/dist/src/live/projection.js +0 -450
- package/dist/src/live/projection.js.map +0 -1
- package/dist/src/live/read.js +0 -60
- package/dist/src/live/read.js.map +0 -1
- package/dist/src/onboard/launch.js +0 -75
- package/dist/src/onboard/launch.js.map +0 -1
- package/dist/src/setup/ledger.js +0 -207
- package/dist/src/setup/ledger.js.map +0 -1
- package/dist/src/setup/stage2.js +0 -617
- package/dist/src/setup/stage2.js.map +0 -1
- package/dist/src/setup/textsniff.js +0 -89
- package/dist/src/setup/textsniff.js.map +0 -1
- package/src/live/projection.ts +0 -491
- package/src/live/read.ts +0 -86
- package/src/onboard/launch.ts +0 -103
- package/src/setup/ledger.ts +0 -324
- package/src/setup/stage2.ts +0 -926
- package/src/setup/textsniff.ts +0 -95
package/dist/src/setup/ledger.js
DELETED
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
import { coverKey, rangesCover } from "./scan.js";
|
|
2
|
-
export const LEDGER_FILE = "scan/ledger.json";
|
|
3
|
-
export const LEDGER_VERSION = 1;
|
|
4
|
-
/** The depth a row was read at. */
|
|
5
|
-
export const depthOf = (e) => e.depth === "deep" ? "deep" : "standard";
|
|
6
|
-
const entryKey = (e) => `${e.lens}\0${coverKey(e.path, e.blob)}${e.range ? `\0${e.range.start}-${e.range.end}` : ""}${depthOf(e) === "deep" ? "\0deep" : ""}`;
|
|
7
|
-
export class Ledger {
|
|
8
|
-
state;
|
|
9
|
-
constructor(state) {
|
|
10
|
-
this.state = state;
|
|
11
|
-
}
|
|
12
|
-
/** The ledger, or why it cannot be read (then `entries` is empty and
|
|
13
|
-
* UNKNOWN, not absent). */
|
|
14
|
-
load() {
|
|
15
|
-
let text;
|
|
16
|
-
try {
|
|
17
|
-
text = this.state.read(LEDGER_FILE);
|
|
18
|
-
}
|
|
19
|
-
catch (err) {
|
|
20
|
-
return {
|
|
21
|
-
entries: [],
|
|
22
|
-
error: `${LEDGER_FILE} in ${this.state.location} cannot be read: ${String(err)}`,
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
if (text === null)
|
|
26
|
-
return { entries: [], error: null };
|
|
27
|
-
try {
|
|
28
|
-
const raw = JSON.parse(text);
|
|
29
|
-
if (typeof raw !== "object" ||
|
|
30
|
-
raw === null ||
|
|
31
|
-
raw.version !== LEDGER_VERSION ||
|
|
32
|
-
!Array.isArray(raw.entries)) {
|
|
33
|
-
throw new Error("not a version-1 ledger");
|
|
34
|
-
}
|
|
35
|
-
for (const e of raw.entries) {
|
|
36
|
-
if (typeof e?.path !== "string" ||
|
|
37
|
-
typeof e.blob !== "string" ||
|
|
38
|
-
typeof e.lens !== "string") {
|
|
39
|
-
throw new Error("an entry has no path, blob or lens");
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return { entries: raw.entries, error: null };
|
|
43
|
-
}
|
|
44
|
-
catch (err) {
|
|
45
|
-
return {
|
|
46
|
-
entries: [],
|
|
47
|
-
error: `${LEDGER_FILE} in ${this.state.location} is not a coverage ledger this version reads (${String(err)}) — ` +
|
|
48
|
-
"nothing will overwrite it; move it aside to start the ledger over",
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
/** Add (or replace, by file + content hash + lens + range + depth)
|
|
53
|
-
* finished rows. Throws when the stored ledger cannot be read — never
|
|
54
|
-
* writes over it. */
|
|
55
|
-
record(rows) {
|
|
56
|
-
const { entries, error } = this.load();
|
|
57
|
-
if (error !== null)
|
|
58
|
-
throw new Error(error);
|
|
59
|
-
const byKey = new Map(entries.map((e) => [entryKey(e), e]));
|
|
60
|
-
for (const r of rows)
|
|
61
|
-
byKey.set(entryKey(r), r);
|
|
62
|
-
const file = { version: LEDGER_VERSION, entries: [...byKey.values()] };
|
|
63
|
-
this.state.write(LEDGER_FILE, `${JSON.stringify(file)}\n`);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
/** `path\0blob` of each file's NEWEST reading by `lens` — the same newest
|
|
67
|
-
* row `FindingsStore.reconcile` settles findings against — complete at
|
|
68
|
-
* `depth` (`readings`). An older reading a later one superseded covers
|
|
69
|
-
* nothing: its findings may since have been settled `fixed`, so content that
|
|
70
|
-
* comes back to it (a revert) must be read again for them to come back too. */
|
|
71
|
-
export function coveredBy(entries, lens, depth = "standard") {
|
|
72
|
-
const out = new Set();
|
|
73
|
-
for (const [path, r] of readings(entries, lens, depth))
|
|
74
|
-
if (r.complete)
|
|
75
|
-
out.add(coverKey(path, r.blob));
|
|
76
|
-
return out;
|
|
77
|
-
}
|
|
78
|
-
/** Every path's newest reading by `lens`, as `depth` counts it. The newest
|
|
79
|
-
* content is settled by every row whatever its depth (a later reading of
|
|
80
|
-
* other content supersedes a deep one too); within it, a `"standard"` reading
|
|
81
|
-
* is made of every row — a deep reading is at least a standard one — and a
|
|
82
|
-
* `"deep"` reading of the deep rows alone, so a path whose newest content was
|
|
83
|
-
* read only at standard depth has no deep reading. */
|
|
84
|
-
export function readings(entries, lens, depth = "standard") {
|
|
85
|
-
const byPath = new Map();
|
|
86
|
-
for (const e of entries) {
|
|
87
|
-
if (e.lens !== lens)
|
|
88
|
-
continue;
|
|
89
|
-
const rows = byPath.get(e.path);
|
|
90
|
-
if (rows)
|
|
91
|
-
rows.push(e);
|
|
92
|
-
else
|
|
93
|
-
byPath.set(e.path, [e]);
|
|
94
|
-
}
|
|
95
|
-
const out = new Map();
|
|
96
|
-
for (const [path, rows] of byPath) {
|
|
97
|
-
// Stable by time: equal stamps keep ledger order, as `newestRead` does.
|
|
98
|
-
const sorted = rows
|
|
99
|
-
.map((e, i) => ({ e, i }))
|
|
100
|
-
.sort((a, b) => compareAt(a.e.at, b.e.at) || a.i - b.i);
|
|
101
|
-
const newest = sorted[sorted.length - 1].e;
|
|
102
|
-
const all = [];
|
|
103
|
-
for (let k = sorted.length - 1; k >= 0 && sorted[k].e.blob === newest.blob; k--)
|
|
104
|
-
all.push(sorted[k].e);
|
|
105
|
-
const streak = depth === "deep" ? all.filter((e) => depthOf(e) === "deep") : all;
|
|
106
|
-
if (streak.length === 0)
|
|
107
|
-
continue;
|
|
108
|
-
const whole = streak.some((e) => !e.range);
|
|
109
|
-
const ranges = streak.filter((e) => e.range).map((e) => e.range);
|
|
110
|
-
const total = ranges[0]?.total ?? 0;
|
|
111
|
-
out.set(path, {
|
|
112
|
-
blob: newest.blob,
|
|
113
|
-
newest: streak[0],
|
|
114
|
-
complete: whole || (ranges.length > 0 && rangesCover(ranges, 1, total)),
|
|
115
|
-
ranges: whole ? [] : ranges,
|
|
116
|
-
runs: [...new Set(streak.map((e) => e.run))],
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
return out;
|
|
120
|
-
}
|
|
121
|
-
/** `path\0blob` → the ranges of each newest reading by `lens` at `depth` that
|
|
122
|
-
* is not yet complete: the ranges a plan need not read again. */
|
|
123
|
-
export function partialRanges(entries, lens, depth = "standard") {
|
|
124
|
-
const out = new Map();
|
|
125
|
-
for (const [path, r] of readings(entries, lens, depth))
|
|
126
|
-
if (!r.complete && r.ranges.length > 0)
|
|
127
|
-
out.set(coverKey(path, r.blob), r.ranges);
|
|
128
|
-
return out;
|
|
129
|
-
}
|
|
130
|
-
/** One case's identity across its rows: the run it ran in and its id there. */
|
|
131
|
-
const caseId = (e) => `${e.run}\0${e.case}`;
|
|
132
|
-
/** Was `e` written at `key`'s settings — its depth too, when the key names one? */
|
|
133
|
-
function atKey(e, key) {
|
|
134
|
-
return (e.lens === key.lens &&
|
|
135
|
-
e.tier === key.tier &&
|
|
136
|
-
e.effort === key.effort &&
|
|
137
|
-
e.validator === key.validator &&
|
|
138
|
-
(key.depth === undefined || depthOf(e) === key.depth));
|
|
139
|
-
}
|
|
140
|
-
/** Rows written for `key` at all, and how many of their cases were priced —
|
|
141
|
-
* which is how a preview tells "never calibrated" from "calibrated, but the
|
|
142
|
-
* runner reports no cost". */
|
|
143
|
-
export function casesFor(entries, key) {
|
|
144
|
-
const cases = new Map();
|
|
145
|
-
for (const e of entries) {
|
|
146
|
-
if (!atKey(e, key))
|
|
147
|
-
continue;
|
|
148
|
-
const id = caseId(e);
|
|
149
|
-
cases.set(id, (cases.get(id) ?? false) || e.cost_usd !== null);
|
|
150
|
-
}
|
|
151
|
-
return { cases: cases.size, priced: [...cases.values()].filter(Boolean).length };
|
|
152
|
-
}
|
|
153
|
-
/** The measured price for `key`: every priced row's cost over its lines, or
|
|
154
|
-
* null when no priced case has finished at these settings. */
|
|
155
|
-
export function measuredRate(entries, key) {
|
|
156
|
-
return rateWhere(entries, (e) => atKey(e, key));
|
|
157
|
-
}
|
|
158
|
-
/** The measured price over the priced rows `keep` selects (stage 2 borrows
|
|
159
|
-
* another lens's price at the same settings this way), or null when none. */
|
|
160
|
-
export function rateWhere(entries, keep) {
|
|
161
|
-
let cost = 0;
|
|
162
|
-
let lines = 0;
|
|
163
|
-
const cases = new Set();
|
|
164
|
-
for (const e of entries) {
|
|
165
|
-
if (!keep(e) || e.cost_usd === null)
|
|
166
|
-
continue;
|
|
167
|
-
cost += e.cost_usd;
|
|
168
|
-
// The file's REAL lines — the count the preview showed. An empty file
|
|
169
|
-
// (an `__init__.py`) is 0 here as there; `Math.max(lines, 1)` belongs to
|
|
170
|
-
// splitting a case's cost across its rows, never to the rate's basis.
|
|
171
|
-
lines += e.lines;
|
|
172
|
-
cases.add(caseId(e));
|
|
173
|
-
}
|
|
174
|
-
if (cases.size === 0 || lines === 0)
|
|
175
|
-
return null;
|
|
176
|
-
return { usd_per_kline: (cost / lines) * 1000, cases: cases.size, lines, cost_usd: cost };
|
|
177
|
-
}
|
|
178
|
-
// ---- the delta's basis ----
|
|
179
|
-
/** Timestamp order, the one rule `readings` and `newestRead` both sort by. */
|
|
180
|
-
function compareAt(a, b) {
|
|
181
|
-
return a < b ? -1 : a > b ? 1 : 0;
|
|
182
|
-
}
|
|
183
|
-
/** Each path's NEWEST content hash read by `lens` — the reading findings
|
|
184
|
-
* are settled against. A path whose content is not that one has CHANGED
|
|
185
|
-
* since it was scanned, even when an older, superseded reading saw exactly
|
|
186
|
-
* this content (a revert): that reading's findings may since be `fixed`. */
|
|
187
|
-
export function newestRead(entries, lens) {
|
|
188
|
-
const newest = new Map();
|
|
189
|
-
for (const e of entries) {
|
|
190
|
-
if (e.lens !== lens)
|
|
191
|
-
continue;
|
|
192
|
-
const had = newest.get(e.path);
|
|
193
|
-
if (!had || compareAt(e.at, had.at) >= 0)
|
|
194
|
-
newest.set(e.path, e);
|
|
195
|
-
}
|
|
196
|
-
return new Map([...newest].map(([path, e]) => [path, e.blob]));
|
|
197
|
-
}
|
|
198
|
-
/** The sha of the LAST scan by `lens` — its newest row's — or null when the
|
|
199
|
-
* ledger holds none: what a delta re-scan compares the tree against. */
|
|
200
|
-
export function lastScanned(entries, lens) {
|
|
201
|
-
let last = null;
|
|
202
|
-
for (const e of entries)
|
|
203
|
-
if (e.lens === lens && (last === null || e.at >= last.at))
|
|
204
|
-
last = e;
|
|
205
|
-
return last === null ? null : { sha: last.sha, at: last.at, run: last.run };
|
|
206
|
-
}
|
|
207
|
-
//# sourceMappingURL=ledger.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../../src/setup/ledger.ts"],"names":[],"mappings":"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"}
|