@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
|
@@ -1,450 +0,0 @@
|
|
|
1
|
-
// The round-progress v2 projection of a LiveEvent log.
|
|
2
|
-
//
|
|
3
|
-
// extensions/round-progress.ts publishes `state/round-progress/pr-<n>.json`
|
|
4
|
-
// (and the append-only transition log beside it) from inside the tmux pi, by
|
|
5
|
-
// listening to pi's events. This module reproduces both from the LiveEvent log
|
|
6
|
-
// alone, so the engine routes - which have no such extension - and a viewer
|
|
7
|
-
// reading a finished or running round all get the same snapshot, with the
|
|
8
|
-
// contract in packages/pi-plugin/src/round-progress.ts unchanged: board.ts, requiredpasses.ts and
|
|
9
|
-
// the supervisor read it as they always have.
|
|
10
|
-
//
|
|
11
|
-
// The extension is the REFERENCE. Every rule here mirrors the handler it
|
|
12
|
-
// stands for, line by line, because the golden test
|
|
13
|
-
// (tests/live-projection-golden.test.ts) holds the two byte-equal on the same
|
|
14
|
-
// events. The one place the log is coarser than pi's stream is time: a held
|
|
15
|
-
// update is stamped at its window's flush (~250 ms), so a heartbeat or a
|
|
16
|
-
// `started_at` taken from an update can differ from the extension's by that
|
|
17
|
-
// much. Nothing the supervisor decides on (the milestones' order, statuses,
|
|
18
|
-
// command identity) depends on it.
|
|
19
|
-
import { parseSessionCommandMarker } from "@quickchatai/pi-quickreview/src/session-command.js";
|
|
20
|
-
import { isLiveAgentStatus, } from "@quickchatai/pi-quickreview/src/round-progress.js";
|
|
21
|
-
function text(value) {
|
|
22
|
-
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
23
|
-
}
|
|
24
|
-
function number(value) {
|
|
25
|
-
return typeof value === "number" && Number.isFinite(value) ? Math.max(0, value) : 0;
|
|
26
|
-
}
|
|
27
|
-
function status(value, exitCode) {
|
|
28
|
-
if (isLiveAgentStatus(value))
|
|
29
|
-
return value;
|
|
30
|
-
return exitCode === 0 ? "completed" : exitCode === undefined ? "running" : "failed";
|
|
31
|
-
}
|
|
32
|
-
/** The round number rides the order's posting calls (`QCR_ROUND_NO=<k>`, with
|
|
33
|
-
* or without `export`); the head rides the Worktree line. */
|
|
34
|
-
function reviewIdentity(body) {
|
|
35
|
-
const round = /(?:^|\s)(?:export )?QCR_ROUND_NO=(\d+)(?=\s|$)/.exec(body);
|
|
36
|
-
const head = /\*\*Worktree\*\*:[^\n]* @ `([^`]+)`/.exec(body);
|
|
37
|
-
if (!round || !head)
|
|
38
|
-
return undefined;
|
|
39
|
-
const roundNo = Number(round[1]);
|
|
40
|
-
return Number.isInteger(roundNo) && roundNo > 0
|
|
41
|
-
? { round_no: roundNo, head_sha: head[1] }
|
|
42
|
-
: undefined;
|
|
43
|
-
}
|
|
44
|
-
function currentTool(progress) {
|
|
45
|
-
if (!Array.isArray(progress?.recent_tools))
|
|
46
|
-
return undefined;
|
|
47
|
-
const tools = progress.recent_tools;
|
|
48
|
-
const picked = [...tools].reverse().find((x) => x.status === "running") ?? tools.at(-1);
|
|
49
|
-
if (!picked)
|
|
50
|
-
return undefined;
|
|
51
|
-
const name = text(picked.tool) ?? "tool";
|
|
52
|
-
const args = text(picked.args);
|
|
53
|
-
return args ? `${name}: ${args.slice(0, 120)}` : name;
|
|
54
|
-
}
|
|
55
|
-
function asAgent(result, fallbackAgent, live = false) {
|
|
56
|
-
const agent = text(result.agent) ?? fallbackAgent;
|
|
57
|
-
if (!agent)
|
|
58
|
-
return undefined;
|
|
59
|
-
const progress = result.progress;
|
|
60
|
-
const native = result.native ?? { tool_count: 0 };
|
|
61
|
-
const error = text(progress?.error) ?? text(result.error_message);
|
|
62
|
-
const exit = result.exit_code;
|
|
63
|
-
const nativeFailed = (typeof exit === "number" && exit > 0) ||
|
|
64
|
-
result.stop_reason === "error" ||
|
|
65
|
-
result.stop_reason === "aborted";
|
|
66
|
-
const st = isLiveAgentStatus(progress?.status)
|
|
67
|
-
? progress.status
|
|
68
|
-
: nativeFailed
|
|
69
|
-
? "failed"
|
|
70
|
-
: live || exit === -1 || exit === undefined
|
|
71
|
-
? "running"
|
|
72
|
-
: status(undefined, exit);
|
|
73
|
-
const tool = currentTool(progress) ?? (live ? native.last_tool : undefined);
|
|
74
|
-
const last = text(progress?.last_message) ?? native.last_text;
|
|
75
|
-
return {
|
|
76
|
-
agent,
|
|
77
|
-
status: st,
|
|
78
|
-
duration_ms: number(progress?.duration_ms),
|
|
79
|
-
tool_count: number(progress?.tool_count) || native.tool_count,
|
|
80
|
-
...(tool ? { current_tool: tool } : {}),
|
|
81
|
-
...(last ? { last_message: last } : {}),
|
|
82
|
-
...(error ? { error } : {}),
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
export class RoundProgressProjection {
|
|
86
|
-
who;
|
|
87
|
-
snapshotState;
|
|
88
|
-
written;
|
|
89
|
-
log = [];
|
|
90
|
-
lastHeartbeat = 0;
|
|
91
|
-
clock = "";
|
|
92
|
-
agents = new Map();
|
|
93
|
-
callAgents = new Map();
|
|
94
|
-
runKeys = new Map();
|
|
95
|
-
endLogged = new Set();
|
|
96
|
-
/** The children of each open lens call, rebuilt from the changed slots. */
|
|
97
|
-
calls = new Map();
|
|
98
|
-
constructor(who) {
|
|
99
|
-
this.who = who;
|
|
100
|
-
}
|
|
101
|
-
/** The snapshot as its file would hold it now (the last write). */
|
|
102
|
-
get snapshot() {
|
|
103
|
-
return this.written === undefined
|
|
104
|
-
? undefined
|
|
105
|
-
: JSON.parse(this.written);
|
|
106
|
-
}
|
|
107
|
-
/** The bytes of `pr-<n>.json`. */
|
|
108
|
-
get snapshotJson() {
|
|
109
|
-
return this.written;
|
|
110
|
-
}
|
|
111
|
-
/** The transition lines, in order. */
|
|
112
|
-
get transitions() {
|
|
113
|
-
return this.log;
|
|
114
|
-
}
|
|
115
|
-
/** The bytes of `pr-<n>.jsonl` (before its size-cap rotation). */
|
|
116
|
-
get transitionsJsonl() {
|
|
117
|
-
return this.log.map((l) => `${JSON.stringify(l)}\n`).join("");
|
|
118
|
-
}
|
|
119
|
-
apply(event) {
|
|
120
|
-
this.clock = event.at;
|
|
121
|
-
switch (event.type) {
|
|
122
|
-
case "agent_start":
|
|
123
|
-
return this.agentStart();
|
|
124
|
-
case "message_start":
|
|
125
|
-
return this.messageStart(event.role, event.text);
|
|
126
|
-
case "turn_start":
|
|
127
|
-
case "message_delta":
|
|
128
|
-
return this.heartbeat();
|
|
129
|
-
case "tool_start":
|
|
130
|
-
return this.toolStart(event);
|
|
131
|
-
case "tool_update":
|
|
132
|
-
return this.toolUpdate(event);
|
|
133
|
-
case "tool_end":
|
|
134
|
-
return this.toolEnd(event);
|
|
135
|
-
case "agent_settled":
|
|
136
|
-
return this.settled();
|
|
137
|
-
default:
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
// ---- the extension's helpers --------------------------------------------------
|
|
142
|
-
nowIso() {
|
|
143
|
-
return this.clock;
|
|
144
|
-
}
|
|
145
|
-
bindRun(run, key) {
|
|
146
|
-
if (run === null)
|
|
147
|
-
return key;
|
|
148
|
-
const held = this.runKeys.get(run);
|
|
149
|
-
if (held !== undefined)
|
|
150
|
-
return held;
|
|
151
|
-
this.runKeys.set(run, key);
|
|
152
|
-
return key;
|
|
153
|
-
}
|
|
154
|
-
executionKeys(callId, names) {
|
|
155
|
-
const seen = new Map();
|
|
156
|
-
return names.map((agent) => {
|
|
157
|
-
const n = (seen.get(agent) ?? 0) + 1;
|
|
158
|
-
seen.set(agent, n);
|
|
159
|
-
return n === 1 ? `${callId}:${agent}` : `${callId}:${agent}#${n}`;
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
write() {
|
|
163
|
-
const snapshot = this.snapshotState;
|
|
164
|
-
if (!snapshot)
|
|
165
|
-
return;
|
|
166
|
-
snapshot.updated_at = this.nowIso();
|
|
167
|
-
snapshot.agents = [...this.agents.values()];
|
|
168
|
-
this.written = `${JSON.stringify(snapshot)}\n`;
|
|
169
|
-
}
|
|
170
|
-
transition(entry) {
|
|
171
|
-
const snapshot = this.snapshotState;
|
|
172
|
-
if (!snapshot)
|
|
173
|
-
return;
|
|
174
|
-
this.log.push({
|
|
175
|
-
at: this.nowIso(),
|
|
176
|
-
pr: this.who.pr,
|
|
177
|
-
session: this.who.session,
|
|
178
|
-
run_started_at: snapshot.run_started_at,
|
|
179
|
-
...(snapshot.command_id ? { command_id: snapshot.command_id } : {}),
|
|
180
|
-
...entry,
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
passEnded(agent) {
|
|
184
|
-
const key = agent.execution_id;
|
|
185
|
-
if (!key || agent.status === "running" || this.endLogged.has(key))
|
|
186
|
-
return;
|
|
187
|
-
this.endLogged.add(key);
|
|
188
|
-
this.transition({
|
|
189
|
-
event: "pass_end",
|
|
190
|
-
execution_id: key,
|
|
191
|
-
agent: agent.agent,
|
|
192
|
-
status: agent.status,
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
fanoutSeen() {
|
|
196
|
-
const snapshot = this.snapshotState;
|
|
197
|
-
if (!snapshot || this.agents.size === 0)
|
|
198
|
-
return;
|
|
199
|
-
snapshot.first_lens_started_at ??= this.nowIso();
|
|
200
|
-
snapshot.fanout_started_at ??= snapshot.first_lens_started_at;
|
|
201
|
-
}
|
|
202
|
-
activity(description) {
|
|
203
|
-
const snapshot = this.snapshotState;
|
|
204
|
-
if (!snapshot)
|
|
205
|
-
return;
|
|
206
|
-
snapshot.last_activity = description;
|
|
207
|
-
snapshot.last_activity_at = this.nowIso();
|
|
208
|
-
this.write();
|
|
209
|
-
}
|
|
210
|
-
heartbeat() {
|
|
211
|
-
if (!this.snapshotState)
|
|
212
|
-
return;
|
|
213
|
-
const now = Date.parse(this.clock);
|
|
214
|
-
if (now - this.lastHeartbeat < 1_000)
|
|
215
|
-
return;
|
|
216
|
-
this.lastHeartbeat = now;
|
|
217
|
-
this.write();
|
|
218
|
-
}
|
|
219
|
-
freshSnapshot(lastActivity) {
|
|
220
|
-
const at = this.nowIso();
|
|
221
|
-
this.agents.clear();
|
|
222
|
-
this.callAgents.clear();
|
|
223
|
-
this.runKeys.clear();
|
|
224
|
-
this.endLogged.clear();
|
|
225
|
-
return {
|
|
226
|
-
version: 2,
|
|
227
|
-
pr: this.who.pr,
|
|
228
|
-
session: this.who.session,
|
|
229
|
-
run_started_at: at,
|
|
230
|
-
updated_at: at,
|
|
231
|
-
parent_status: "active",
|
|
232
|
-
last_activity_at: at,
|
|
233
|
-
last_activity: lastActivity,
|
|
234
|
-
agents: [],
|
|
235
|
-
};
|
|
236
|
-
}
|
|
237
|
-
/** The children of a call after this line: the slots it carries laid over
|
|
238
|
-
* what the call's earlier lines left. */
|
|
239
|
-
merge(id, n, changed) {
|
|
240
|
-
const held = this.calls.get(id) ?? [];
|
|
241
|
-
for (const r of changed)
|
|
242
|
-
held[r.slot] = r;
|
|
243
|
-
const full = Array.from({ length: n }, (_, slot) => held[slot] ?? { slot });
|
|
244
|
-
this.calls.set(id, full);
|
|
245
|
-
return full;
|
|
246
|
-
}
|
|
247
|
-
// ---- the handlers ---------------------------------------------------------------
|
|
248
|
-
agentStart() {
|
|
249
|
-
// pi's automatic retry or queued continuation emits another agent_start
|
|
250
|
-
// inside the SAME outer run: an inner start keeps the run's command,
|
|
251
|
-
// milestones and passes.
|
|
252
|
-
if (this.snapshotState && this.snapshotState.parent_status === "active") {
|
|
253
|
-
this.activity("parent run continued");
|
|
254
|
-
return;
|
|
255
|
-
}
|
|
256
|
-
this.snapshotState = this.freshSnapshot("parent run started");
|
|
257
|
-
this.write();
|
|
258
|
-
this.transition({ event: "parent_start" });
|
|
259
|
-
}
|
|
260
|
-
messageStart(role, body) {
|
|
261
|
-
const snapshot = this.snapshotState;
|
|
262
|
-
if (!snapshot || role !== "user" || !body)
|
|
263
|
-
return;
|
|
264
|
-
const marker = parseSessionCommandMarker(body);
|
|
265
|
-
if (!marker)
|
|
266
|
-
return;
|
|
267
|
-
// A different command in a run that has one already is a new execution.
|
|
268
|
-
let current = snapshot;
|
|
269
|
-
if (current.command_id !== undefined && current.command_id !== marker.id) {
|
|
270
|
-
current = this.freshSnapshot("parent run started");
|
|
271
|
-
this.snapshotState = current;
|
|
272
|
-
}
|
|
273
|
-
current.command_id = marker.id;
|
|
274
|
-
current.command_sha256 = marker.payloadSha256;
|
|
275
|
-
const identity = reviewIdentity(body);
|
|
276
|
-
if (identity) {
|
|
277
|
-
current.round_no = identity.round_no;
|
|
278
|
-
current.head_sha = identity.head_sha;
|
|
279
|
-
}
|
|
280
|
-
const firstAcceptance = current.command_accepted_at === undefined;
|
|
281
|
-
current.command_accepted_at ??= this.nowIso();
|
|
282
|
-
current.preparing_at ??= current.command_accepted_at;
|
|
283
|
-
if (firstAcceptance)
|
|
284
|
-
this.transition({
|
|
285
|
-
event: "command_accepted",
|
|
286
|
-
...(current.round_no !== undefined ? { round_no: current.round_no } : {}),
|
|
287
|
-
...(current.head_sha !== undefined ? { head_sha: current.head_sha } : {}),
|
|
288
|
-
});
|
|
289
|
-
this.activity(`command ${marker.id} accepted; parent preparing compact fanout context`);
|
|
290
|
-
}
|
|
291
|
-
toolStart(ev) {
|
|
292
|
-
const snapshot = this.snapshotState;
|
|
293
|
-
if (!snapshot)
|
|
294
|
-
return;
|
|
295
|
-
const executions = ev.executions ?? [];
|
|
296
|
-
if (executions.length > 0) {
|
|
297
|
-
const names = executions.map(({ agent }) => agent);
|
|
298
|
-
const at = this.nowIso();
|
|
299
|
-
this.callAgents.set(ev.id, names);
|
|
300
|
-
const keys = this.executionKeys(ev.id, names);
|
|
301
|
-
for (const [index, agent] of names.entries()) {
|
|
302
|
-
const key = keys[index];
|
|
303
|
-
const phase = executions[index]?.phase;
|
|
304
|
-
this.agents.set(key, {
|
|
305
|
-
execution_id: key,
|
|
306
|
-
agent,
|
|
307
|
-
...(phase ? { phase } : {}),
|
|
308
|
-
status: "running",
|
|
309
|
-
duration_ms: 0,
|
|
310
|
-
tool_count: 0,
|
|
311
|
-
started_at: at,
|
|
312
|
-
});
|
|
313
|
-
this.transition({ event: "pass_start", execution_id: key, agent });
|
|
314
|
-
}
|
|
315
|
-
snapshot.first_lens_started_at ??= at;
|
|
316
|
-
snapshot.fanout_started_at ??= snapshot.first_lens_started_at;
|
|
317
|
-
snapshot.active_tool = `subagent: ${names.join(", ")}`;
|
|
318
|
-
this.activity(`${names.join(", ")} started`);
|
|
319
|
-
return;
|
|
320
|
-
}
|
|
321
|
-
snapshot.active_tool = ev.preview ? `${ev.tool}: ${ev.preview}` : ev.tool;
|
|
322
|
-
this.activity(snapshot.active_tool);
|
|
323
|
-
}
|
|
324
|
-
toolUpdate(ev) {
|
|
325
|
-
const snapshot = this.snapshotState;
|
|
326
|
-
if (!snapshot)
|
|
327
|
-
return;
|
|
328
|
-
const fallbacks = this.callAgents.get(ev.id) ?? [];
|
|
329
|
-
const reported = this.merge(ev.id, ev.n, ev.results);
|
|
330
|
-
// Native parallel mode marks a still-running slot with exitCode -1 and a
|
|
331
|
-
// finished one with its real exit code.
|
|
332
|
-
let changed = false;
|
|
333
|
-
const updated = reported.flatMap((result, index) => {
|
|
334
|
-
const agent = asAgent(result, fallbacks[index] ?? (fallbacks.length === 1 ? fallbacks[0] : undefined), ev.mode === "parallel" ? result.exit_code === -1 : true);
|
|
335
|
-
return agent ? [{ agent, run: result.id ?? null }] : [];
|
|
336
|
-
});
|
|
337
|
-
const updateKeys = this.executionKeys(ev.id, updated.map(({ agent }) => agent.agent));
|
|
338
|
-
for (const [index, { agent, run }] of updated.entries()) {
|
|
339
|
-
const key = this.bindRun(run, updateKeys[index]);
|
|
340
|
-
const previous = this.agents.get(key);
|
|
341
|
-
// A parallel slot can finish while its siblings still run: a terminal
|
|
342
|
-
// record carries its completion milestone from the first update that
|
|
343
|
-
// reports it, and a running one never carries one.
|
|
344
|
-
const { finished_at: previousFinished, ...kept } = previous ?? {};
|
|
345
|
-
const next = {
|
|
346
|
-
...kept,
|
|
347
|
-
...agent,
|
|
348
|
-
execution_id: key,
|
|
349
|
-
started_at: previous?.started_at ?? this.nowIso(),
|
|
350
|
-
...(agent.status === "running" ? {} : { finished_at: previousFinished ?? this.nowIso() }),
|
|
351
|
-
};
|
|
352
|
-
this.agents.set(key, next);
|
|
353
|
-
this.passEnded(next);
|
|
354
|
-
snapshot.active_tool = `subagent: ${agent.agent}`;
|
|
355
|
-
changed = true;
|
|
356
|
-
}
|
|
357
|
-
this.fanoutSeen();
|
|
358
|
-
if (changed)
|
|
359
|
-
this.write();
|
|
360
|
-
else
|
|
361
|
-
this.heartbeat();
|
|
362
|
-
}
|
|
363
|
-
toolEnd(ev) {
|
|
364
|
-
const snapshot = this.snapshotState;
|
|
365
|
-
if (!snapshot)
|
|
366
|
-
return;
|
|
367
|
-
const id = ev.id;
|
|
368
|
-
const fallbacks = this.callAgents.get(id) ?? [];
|
|
369
|
-
const reported = this.merge(id, ev.n, ev.results);
|
|
370
|
-
this.calls.delete(id);
|
|
371
|
-
const finalAgents = [];
|
|
372
|
-
const ended = reported.flatMap((result, index) => {
|
|
373
|
-
const agent = asAgent(result, fallbacks[index] ?? (fallbacks.length === 1 ? fallbacks[0] : undefined));
|
|
374
|
-
return agent ? [{ agent, run: result.id ?? null }] : [];
|
|
375
|
-
});
|
|
376
|
-
const endKeys = this.executionKeys(id, ended.map(({ agent }) => agent.agent));
|
|
377
|
-
for (const [index, { agent, run }] of ended.entries()) {
|
|
378
|
-
const key = this.bindRun(run, endKeys[index]);
|
|
379
|
-
const previous = this.agents.get(key);
|
|
380
|
-
// A child the call returns still running (a placeholder) carries no
|
|
381
|
-
// finish time, as in toolUpdate: the parser refuses the pair.
|
|
382
|
-
const { finished_at: previousFinished, ...kept } = previous ?? {};
|
|
383
|
-
const finalAgent = {
|
|
384
|
-
...kept,
|
|
385
|
-
...agent,
|
|
386
|
-
execution_id: key,
|
|
387
|
-
started_at: previous?.started_at ?? this.nowIso(),
|
|
388
|
-
...(agent.status === "running" ? {} : { finished_at: previousFinished ?? this.nowIso() }),
|
|
389
|
-
};
|
|
390
|
-
this.agents.set(key, finalAgent);
|
|
391
|
-
finalAgents.push(finalAgent);
|
|
392
|
-
this.passEnded(finalAgent);
|
|
393
|
-
}
|
|
394
|
-
if (finalAgents.length === 0 && fallbacks.length > 0) {
|
|
395
|
-
const failed = ev.is_error;
|
|
396
|
-
const fallbackKeys = this.executionKeys(id, fallbacks);
|
|
397
|
-
for (const [index, fallback] of fallbacks.entries()) {
|
|
398
|
-
const key = fallbackKeys[index];
|
|
399
|
-
const previous = this.agents.get(key);
|
|
400
|
-
if (previous && previous.status !== "running") {
|
|
401
|
-
finalAgents.push(previous);
|
|
402
|
-
continue;
|
|
403
|
-
}
|
|
404
|
-
const finalAgent = {
|
|
405
|
-
...(previous ?? {
|
|
406
|
-
execution_id: key,
|
|
407
|
-
agent: fallback,
|
|
408
|
-
duration_ms: 0,
|
|
409
|
-
tool_count: 0,
|
|
410
|
-
started_at: this.nowIso(),
|
|
411
|
-
}),
|
|
412
|
-
status: failed ? "failed" : "completed",
|
|
413
|
-
finished_at: previous?.finished_at ?? this.nowIso(),
|
|
414
|
-
};
|
|
415
|
-
this.agents.set(key, finalAgent);
|
|
416
|
-
finalAgents.push(finalAgent);
|
|
417
|
-
this.passEnded(finalAgent);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
this.fanoutSeen();
|
|
421
|
-
this.callAgents.delete(id);
|
|
422
|
-
snapshot.active_tool = undefined;
|
|
423
|
-
this.activity(finalAgents.length > 0
|
|
424
|
-
? `${finalAgents.map((agent) => `${agent.agent} ${agent.status}`).join(", ")}`
|
|
425
|
-
: `${ev.tool} ${ev.is_error ? "failed" : "completed"}`);
|
|
426
|
-
}
|
|
427
|
-
settled() {
|
|
428
|
-
const snapshot = this.snapshotState;
|
|
429
|
-
if (!snapshot)
|
|
430
|
-
return;
|
|
431
|
-
snapshot.parent_status = "settled";
|
|
432
|
-
snapshot.active_tool = undefined;
|
|
433
|
-
this.activity("parent session settled");
|
|
434
|
-
this.transition({ event: "parent_settle" });
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
/** Project a main log. The identity (PR, session) comes from its
|
|
438
|
-
* `session_start` line; a log with none, or for a round that has no PR number,
|
|
439
|
-
* projects to nothing - as the extension does nothing outside a numbered PR
|
|
440
|
-
* session. */
|
|
441
|
-
export function projectRoundProgress(events) {
|
|
442
|
-
const start = events.find((e) => e.type === "session_start");
|
|
443
|
-
if (start?.type !== "session_start" || start.stream !== "main" || start.pr === null)
|
|
444
|
-
return undefined;
|
|
445
|
-
const projection = new RoundProgressProjection({ pr: start.pr, session: start.session });
|
|
446
|
-
for (const e of events)
|
|
447
|
-
projection.apply(e);
|
|
448
|
-
return projection;
|
|
449
|
-
}
|
|
450
|
-
//# sourceMappingURL=projection.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../src/live/projection.ts"],"names":[],"mappings":"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"}
|
package/dist/src/live/read.js
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
// Finding and reading a round's LiveEvent logs: what `qcr review status` and
|
|
2
|
-
// `qcr live` do with a run directory. No writer and no engine here, so a
|
|
3
|
-
// daemon-side or TUI reader can import it.
|
|
4
|
-
import { readdirSync, statSync } from "node:fs";
|
|
5
|
-
import { join } from "node:path";
|
|
6
|
-
import { LIVE_MAIN_FILE, readLiveEvents, } from "@quickchatai/pi-quickreview/src/live/events.js";
|
|
7
|
-
import { projectRoundProgress } from "./projection.js";
|
|
8
|
-
const names = (dir) => {
|
|
9
|
-
try {
|
|
10
|
-
return readdirSync(dir);
|
|
11
|
-
}
|
|
12
|
-
catch {
|
|
13
|
-
return [];
|
|
14
|
-
}
|
|
15
|
-
};
|
|
16
|
-
/** Every round log directory under `<root>/state/live/`, oldest round first. */
|
|
17
|
-
export function listLiveRounds(root) {
|
|
18
|
-
const base = join(root, "state", "live");
|
|
19
|
-
const found = [];
|
|
20
|
-
for (const key of names(base)) {
|
|
21
|
-
for (const r of names(join(base, key))) {
|
|
22
|
-
const m = /^r(\d+)$/.exec(r);
|
|
23
|
-
if (m)
|
|
24
|
-
found.push({ dir: join(base, key, r), key, round: Number(m[1]) });
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return found.sort((a, b) => a.key.localeCompare(b.key) || a.round - b.round);
|
|
28
|
-
}
|
|
29
|
-
function mtime(path) {
|
|
30
|
-
try {
|
|
31
|
-
return statSync(path).mtimeMs;
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
return 0;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
/** The round that was written last. */
|
|
38
|
-
export function latestLiveRound(root) {
|
|
39
|
-
return listLiveRounds(root).reduce((best, r) => best === undefined ||
|
|
40
|
-
mtime(join(r.dir, LIVE_MAIN_FILE)) >= mtime(join(best.dir, LIVE_MAIN_FILE))
|
|
41
|
-
? r
|
|
42
|
-
: best, undefined);
|
|
43
|
-
}
|
|
44
|
-
/** The ids of the lens sessions a round logged, in file-name order. */
|
|
45
|
-
export function lensLogIds(dir) {
|
|
46
|
-
return names(dir)
|
|
47
|
-
.flatMap((f) => /^lens-(.+)\.jsonl$/.exec(f)?.[1] ?? [])
|
|
48
|
-
.sort();
|
|
49
|
-
}
|
|
50
|
-
/** Read one round's main log and project it. */
|
|
51
|
-
export function viewRound(ref) {
|
|
52
|
-
const { events } = readLiveEvents(join(ref.dir, LIVE_MAIN_FILE));
|
|
53
|
-
return {
|
|
54
|
-
ref,
|
|
55
|
-
events,
|
|
56
|
-
snapshot: projectRoundProgress(events)?.snapshot,
|
|
57
|
-
lenses: lensLogIds(ref.dir),
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=read.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/live/read.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
// `qcr onboard` mechanics: launch pi at the pinned version via npx
|
|
2
|
-
// (pi stays a non-dependency — this works from a bare clone with only Node and
|
|
3
|
-
// the checkout), hand it the onboarding system prompt + exactly one onboarding
|
|
4
|
-
// extension + a restricted built-in tool set, and on exit either exec the TUI
|
|
5
|
-
// (checklist complete) or say how to resume.
|
|
6
|
-
//
|
|
7
|
-
// Everything effectful is injected (spawn, completion read, log), so tests
|
|
8
|
-
// drive the whole flow with fakes; src/cli.ts cmdOnboard is the one real
|
|
9
|
-
// assembly.
|
|
10
|
-
import { join } from "node:path";
|
|
11
|
-
import { defaultSteps } from "./steps/index.js";
|
|
12
|
-
import { onboardingToolAllowlist } from "./toolnames.js";
|
|
13
|
-
// The pin reader lives in a leaf module: src/version.ts (on the daemon's import
|
|
14
|
-
// graph) needs it, and this module imports the whole step registry.
|
|
15
|
-
export { piPinFromPackageJson } from "./pipin.js";
|
|
16
|
-
/** Dedicated onboarding session store — never the reviewer/companion dirs, so
|
|
17
|
-
* onboarding cannot pollute (or be polluted by) any other pi session store. */
|
|
18
|
-
export function onboardingSessionDir(root) {
|
|
19
|
-
return join(root, "state", "onboarding", "pi-sessions");
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* The full npx argv for the onboarding pi session.
|
|
23
|
-
*
|
|
24
|
-
* `--approve` is the same never-block-on-input rule as buildPiCommand
|
|
25
|
-
* (src/sessions.ts) and the companion's piArgv: the wizard must never stall
|
|
26
|
-
* on pi's interactive "Trust project folder?" modal.
|
|
27
|
-
*
|
|
28
|
-
* VERIFY-ON-PIN: `--no-extensions`, `--no-skills`, `--no-context-files`,
|
|
29
|
-
* `-e <path>` and `--tools <list>` against the pinned pi version's --help —
|
|
30
|
-
* the intent (no ambient extensions, exactly one onboarding extension, a
|
|
31
|
-
* read-only built-in belt) is the design decision; the exact flag spellings
|
|
32
|
-
* are unverified statically and belong to the named onboarding smoke step.
|
|
33
|
-
*
|
|
34
|
-
* `--tools` is an allowlist over extension tools too (pi 1.4.0; pinned by
|
|
35
|
-
* tests/onboard-tools-sdk.test.ts on the real SDK), so it names every wizard
|
|
36
|
-
* tool, derived from the step registry: a step added there is active here
|
|
37
|
-
* with no second edit. bash, write and edit stay off it.
|
|
38
|
-
*/
|
|
39
|
-
export function onboardingPiArgv(pin, root, stepIds = defaultSteps().map((s) => s.id)) {
|
|
40
|
-
return [
|
|
41
|
-
"npx",
|
|
42
|
-
"-y",
|
|
43
|
-
`${pin.package}@${pin.version}`,
|
|
44
|
-
"--approve",
|
|
45
|
-
"--no-extensions",
|
|
46
|
-
"--no-skills",
|
|
47
|
-
"--no-context-files",
|
|
48
|
-
"-e",
|
|
49
|
-
join(root, "extensions", "cli", "onboarding.ts"),
|
|
50
|
-
"--system-prompt",
|
|
51
|
-
join(root, "prompts", "onboarding.md"),
|
|
52
|
-
"--tools",
|
|
53
|
-
onboardingToolAllowlist(stepIds).join(","),
|
|
54
|
-
"--session-dir",
|
|
55
|
-
onboardingSessionDir(root),
|
|
56
|
-
];
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Run the onboarding session and handle the handoff:
|
|
60
|
-
* - checklist complete after pi exits ⇒ open the TUI (same stdio);
|
|
61
|
-
* - otherwise print how to resume — `qcr onboard` again re-verifies
|
|
62
|
-
* completed steps and continues at the first unfinished one.
|
|
63
|
-
*/
|
|
64
|
-
export async function runOnboard(deps) {
|
|
65
|
-
const argv = onboardingPiArgv(deps.pin, deps.root);
|
|
66
|
-
deps.log(`onboarding: launching pi ${deps.pin.package}@${deps.pin.version} via npx (first run downloads it — give it a moment)`);
|
|
67
|
-
const code = await deps.spawn(argv[0], argv.slice(1));
|
|
68
|
-
if (deps.isComplete()) {
|
|
69
|
-
deps.log("onboarding: checklist verified complete — opening the TUI.");
|
|
70
|
-
return deps.spawn(deps.nodeBin ?? process.execPath, [deps.cliPath, "tui"]);
|
|
71
|
-
}
|
|
72
|
-
deps.log("onboarding: not finished yet. Run `qcr onboard` again to resume — completed steps are re-verified, not repeated.");
|
|
73
|
-
return code;
|
|
74
|
-
}
|
|
75
|
-
//# sourceMappingURL=launch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/onboard/launch.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,+EAA+E;AAC/E,+EAA+E;AAC/E,8EAA8E;AAC9E,6CAA6C;AAC7C,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,YAAY;AACZ,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,gFAAgF;AAChF,oEAAoE;AACpE,OAAO,EAAE,oBAAoB,EAAc,MAAM,YAAY,CAAC;AAG9D;+EAC+E;AAC/E,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAU,EACV,IAAY,EACZ,UAA6B,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5D,OAAO;QACL,KAAK;QACL,IAAI;QACJ,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE;QAC/B,WAAW;QACX,iBAAiB;QACjB,aAAa;QACb,oBAAoB;QACpB,IAAI;QACJ,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,CAAC;QAChD,iBAAiB;QACjB,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC;QACtC,SAAS;QACT,uBAAuB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1C,eAAe;QACf,oBAAoB,CAAC,IAAI,CAAC;KAC3B,CAAC;AACJ,CAAC;AAkBD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAoB;IACnD,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG,CACN,4BAA4B,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,sDAAsD,CACvH,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,GAAG,CACN,kHAAkH,CACnH,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC"}
|