@quickchatai/quickreview 1.2.0 → 1.3.2
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 +116 -53
- package/bin/qcr.js +1 -1
- package/config.example.toml +25 -7
- 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/extensions/vendor/openviking-pi/index.js +4 -0
- package/dist/extensions/vendor/openviking-pi/index.js.map +1 -1
- package/dist/extensions/vendor/openviking-pi/qcr-hooks.js +3 -1
- package/dist/extensions/vendor/openviking-pi/qcr-hooks.js.map +1 -1
- package/dist/extensions/vendor/openviking-pi/sync.js +81 -0
- package/dist/extensions/vendor/openviking-pi/sync.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 +14 -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 +33 -4
- 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/ledgercheck.js +39 -10
- package/dist/src/ledgercheck.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/session-command-supervisor.js +38 -9
- package/dist/src/session-command-supervisor.js.map +1 -1
- 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 +75 -9
- 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/alerts.js +4 -1
- package/dist/src/tui/alerts.js.map +1 -1
- package/dist/src/tui/board.js +2 -2
- 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/verdicts.js +12 -0
- package/dist/src/verdicts.js.map +1 -1
- package/dist/src/wire.js +9 -4
- package/dist/src/wire.js.map +1 -1
- package/dist/src/workerbreaker.js +32 -5
- package/dist/src/workerbreaker.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/extensions/vendor/openviking-pi/NOTICE +5 -0
- package/extensions/vendor/openviking-pi/README.md +39 -5
- package/extensions/vendor/openviking-pi/index.ts +4 -0
- package/extensions/vendor/openviking-pi/patches/0014-one-turn-sync-in-flight.patch +239 -0
- package/extensions/vendor/openviking-pi/qcr-hooks.ts +3 -1
- package/extensions/vendor/openviking-pi/sync.ts +80 -0
- package/extensions/vendor/openviking-pi/upstream.json +2 -1
- 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 +13 -54
- package/src/config.ts +38 -0
- package/src/daemon.ts +34 -4
- 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/ledgercheck.ts +45 -9
- 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/session-command-supervisor.ts +41 -8
- 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 +126 -11
- package/src/takeover.ts +5 -0
- package/src/takeoverpi.ts +3 -2
- package/src/tui/alerts.ts +9 -2
- package/src/tui/board.ts +2 -2
- 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/verdicts.ts +13 -0
- package/src/wire.ts +9 -4
- package/src/workerbreaker.ts +41 -5
- 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
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
// A bare `qcr`: the home. The app's pinned pi (src/picli.ts), with the plugin
|
|
2
|
+
// and the home's extension loaded, on the person's own pi home.
|
|
3
|
+
//
|
|
4
|
+
// pi home the person's own: $PI_CODING_AGENT_DIR as the person set it,
|
|
5
|
+
// else ~/.pi/agent. The launch never sets it, so the chat, the
|
|
6
|
+
// panel's login line (which reads the same dir) and every review
|
|
7
|
+
// use one login.
|
|
8
|
+
// quiet no logo, resource list, trust prompt, changelog or model
|
|
9
|
+
// warning, and nothing written to the person's global pi
|
|
10
|
+
// settings: the quiet start is project settings in the home's
|
|
11
|
+
// own working directory (in the app's state home), the per-run
|
|
12
|
+
// trust flag `--approve`, and an explicit `--model`. The
|
|
13
|
+
// project settings also carry the pinned pi's version as the
|
|
14
|
+
// last changelog seen, or pi would record it in the global
|
|
15
|
+
// settings on a first run.
|
|
16
|
+
// resume the sessions live in the state home (`--session-dir`), and
|
|
17
|
+
// `--continue` opens the most recent one there, or a new one.
|
|
18
|
+
// tools `[home] tools = "reviewer"` (the default) names the allowed
|
|
19
|
+
// tools (src/home/toolnames.ts) and starts no MCP server;
|
|
20
|
+
// "full" leaves pi's own defaults.
|
|
21
|
+
// GitHub the person's own `gh`. In the image (scripts/qcr-host.sh's
|
|
22
|
+
// home mode) there is no gh config: the wrapper hands the token
|
|
23
|
+
// over as a file (packages/pi-plugin/src/ghcred.ts), src/cli.ts
|
|
24
|
+
// takes it at startup, and the home passes it to pi as GH_TOKEN,
|
|
25
|
+
// in its environment only.
|
|
26
|
+
//
|
|
27
|
+
// `-ne` keeps the person's own extensions out: a plugin they installed in pi
|
|
28
|
+
// themselves would otherwise register its commands twice.
|
|
29
|
+
//
|
|
30
|
+
// Everything effectful is injected; `homeRunDeps()` is the real assembly.
|
|
31
|
+
import { spawnSync } from "node:child_process";
|
|
32
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
33
|
+
import { dirname, join } from "node:path";
|
|
34
|
+
import { parse } from "smol-toml";
|
|
35
|
+
import { HOME_DEFAULTS, parseHomeSection } from "../config.js";
|
|
36
|
+
import { pluginPackageDir } from "../coreext.js";
|
|
37
|
+
import { locateConfig, stateHome } from "../homes.js";
|
|
38
|
+
import { piCliPath, piPackageDir } from "../picli.js";
|
|
39
|
+
import { HOME_MODEL_ENV, HOME_TOOLS_ENV } from "./adapters.js";
|
|
40
|
+
import { reviewerToolAllowlist } from "./toolnames.js";
|
|
41
|
+
/** The home's places in the state home. */
|
|
42
|
+
export function homePaths(state) {
|
|
43
|
+
const cwd = join(state, "home");
|
|
44
|
+
return {
|
|
45
|
+
cwd,
|
|
46
|
+
settings: join(cwd, ".pi", "settings.json"),
|
|
47
|
+
sessions: join(cwd, "sessions"),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** The env shim pi loads for the home, in the app at `appRoot`. */
|
|
51
|
+
export function homeExtensionPath(appRoot) {
|
|
52
|
+
return join(appRoot, "extensions", "cli", "home.ts");
|
|
53
|
+
}
|
|
54
|
+
/** The home's project settings, over whatever the file already holds. */
|
|
55
|
+
export function homeProjectSettings(existing, piVersion) {
|
|
56
|
+
const base = typeof existing === "object" && existing !== null && !Array.isArray(existing)
|
|
57
|
+
? existing
|
|
58
|
+
: {};
|
|
59
|
+
return {
|
|
60
|
+
...base,
|
|
61
|
+
quietStartup: true,
|
|
62
|
+
...(piVersion === null ? {} : { lastChangelogVersion: piVersion }),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** What a bare `qcr` runs. */
|
|
66
|
+
export function homeLaunch(o) {
|
|
67
|
+
const p = homePaths(o.stateHome);
|
|
68
|
+
const tools = o.home.tools === "reviewer" ? ["--tools", reviewerToolAllowlist().join(","), "--no-mcp"] : [];
|
|
69
|
+
return {
|
|
70
|
+
args: [
|
|
71
|
+
o.piCli,
|
|
72
|
+
"--approve",
|
|
73
|
+
"--no-extensions",
|
|
74
|
+
"-e",
|
|
75
|
+
o.pluginDir,
|
|
76
|
+
"-e",
|
|
77
|
+
homeExtensionPath(o.appRoot),
|
|
78
|
+
"--model",
|
|
79
|
+
o.home.model,
|
|
80
|
+
...tools,
|
|
81
|
+
"--session-dir",
|
|
82
|
+
p.sessions,
|
|
83
|
+
"--continue",
|
|
84
|
+
],
|
|
85
|
+
cwd: p.cwd,
|
|
86
|
+
// PI_CODING_AGENT_DIR passes through as the person set it, or stays unset
|
|
87
|
+
env: {
|
|
88
|
+
...o.env,
|
|
89
|
+
PI_SKIP_VERSION_CHECK: "1",
|
|
90
|
+
[HOME_MODEL_ENV]: o.home.model,
|
|
91
|
+
[HOME_TOOLS_ENV]: o.home.tools,
|
|
92
|
+
...(o.githubToken ? { GH_TOKEN: o.githubToken } : {}),
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** A bare `qcr`: open the home. pi's exit code. */
|
|
97
|
+
export function runHome(deps) {
|
|
98
|
+
let piCli;
|
|
99
|
+
let pluginDir;
|
|
100
|
+
try {
|
|
101
|
+
piCli = deps.piCli();
|
|
102
|
+
pluginDir = deps.pluginDir();
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
deps.err(`qcr: ${err instanceof Error ? err.message : String(err)}`);
|
|
106
|
+
return 1;
|
|
107
|
+
}
|
|
108
|
+
const { home, problem } = deps.homeConfig();
|
|
109
|
+
if (problem)
|
|
110
|
+
deps.err(`qcr: ${problem}; the home opens on its defaults.`);
|
|
111
|
+
const p = homePaths(deps.stateHome);
|
|
112
|
+
try {
|
|
113
|
+
deps.mkdir(p.sessions);
|
|
114
|
+
deps.mkdir(dirname(p.settings));
|
|
115
|
+
let existing = undefined;
|
|
116
|
+
let before = null;
|
|
117
|
+
try {
|
|
118
|
+
before = deps.readFile(p.settings);
|
|
119
|
+
existing = JSON.parse(before);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// no settings yet, or not ours to read: written fresh below
|
|
123
|
+
}
|
|
124
|
+
const text = `${JSON.stringify(homeProjectSettings(existing, deps.piVersion()), null, 2)}\n`;
|
|
125
|
+
if (text !== before)
|
|
126
|
+
deps.writeFile(p.settings, text);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
deps.err(`qcr: can't prepare the home in ${p.cwd}: ${err instanceof Error ? err.message : String(err)}`);
|
|
130
|
+
return 1;
|
|
131
|
+
}
|
|
132
|
+
const launch = homeLaunch({
|
|
133
|
+
piCli,
|
|
134
|
+
pluginDir,
|
|
135
|
+
appRoot: deps.appRoot,
|
|
136
|
+
stateHome: deps.stateHome,
|
|
137
|
+
home,
|
|
138
|
+
env: deps.env,
|
|
139
|
+
githubToken: deps.githubToken(),
|
|
140
|
+
});
|
|
141
|
+
const r = deps.run(deps.execPath, launch.args, { cwd: launch.cwd, env: launch.env });
|
|
142
|
+
if (r.error) {
|
|
143
|
+
deps.err(`qcr: pi could not start: ${r.error.message}`);
|
|
144
|
+
return 1;
|
|
145
|
+
}
|
|
146
|
+
return r.status ?? 1;
|
|
147
|
+
}
|
|
148
|
+
/** The config's `[home]`, read on its own: the home opens even when the rest
|
|
149
|
+
* of the config would not load. */
|
|
150
|
+
export function readHomeConfig(env, read = (p) => readFileSync(p, "utf8")) {
|
|
151
|
+
const path = locateConfig({ env }).path;
|
|
152
|
+
let raw;
|
|
153
|
+
try {
|
|
154
|
+
raw = read(path);
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
if (err?.code === "ENOENT")
|
|
158
|
+
return { home: { ...HOME_DEFAULTS } };
|
|
159
|
+
return { home: { ...HOME_DEFAULTS }, problem: `can't read ${path}` };
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
return { home: parseHomeSection(parse(raw)["home"]) };
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
return {
|
|
166
|
+
home: { ...HOME_DEFAULTS },
|
|
167
|
+
problem: `${path}: ${err instanceof Error ? err.message : String(err)}`,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
export function homeRunDeps(appRoot, env = process.env) {
|
|
172
|
+
return {
|
|
173
|
+
env,
|
|
174
|
+
appRoot,
|
|
175
|
+
stateHome: stateHome(env),
|
|
176
|
+
piCli: () => piCliPath(),
|
|
177
|
+
pluginDir: () => pluginPackageDir(),
|
|
178
|
+
piVersion: () => {
|
|
179
|
+
try {
|
|
180
|
+
const pkg = JSON.parse(readFileSync(join(piPackageDir(), "package.json"), "utf8"));
|
|
181
|
+
return typeof pkg.version === "string" ? pkg.version : null;
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
// the person's own gh; the image's `qcr home` (src/cli.ts) passes the
|
|
188
|
+
// token the wrapper handed over
|
|
189
|
+
githubToken: () => null,
|
|
190
|
+
homeConfig: () => readHomeConfig(env),
|
|
191
|
+
readFile: (p) => readFileSync(p, "utf8"),
|
|
192
|
+
writeFile: (p, t) => writeFileSync(p, t),
|
|
193
|
+
mkdir: (p) => mkdirSync(p, { recursive: true }),
|
|
194
|
+
run: (cmd, args, opts) => {
|
|
195
|
+
const r = spawnSync(cmd, [...args], { stdio: "inherit", cwd: opts.cwd, env: opts.env });
|
|
196
|
+
return { status: r.status, ...(r.error ? { error: r.error } : {}) };
|
|
197
|
+
},
|
|
198
|
+
execPath: process.execPath,
|
|
199
|
+
err: (l) => console.error(l),
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=launch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/home/launch.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,gEAAgE;AAChE,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAC9E,8BAA8B;AAC9B,wEAAwE;AACxE,sEAAsE;AACtE,2EAA2E;AAC3E,4EAA4E;AAC5E,sEAAsE;AACtE,0EAA0E;AAC1E,wEAAwE;AACxE,wCAAwC;AACxC,0EAA0E;AAC1E,2EAA2E;AAC3E,2EAA2E;AAC3E,uEAAuE;AACvE,gDAAgD;AAChD,0EAA0E;AAC1E,6EAA6E;AAC7E,6EAA6E;AAC7E,8EAA8E;AAC9E,wCAAwC;AACxC,EAAE;AACF,6EAA6E;AAC7E,0DAA0D;AAC1D,EAAE;AACF,0EAA0E;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAmB,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAIvD,2CAA2C;AAC3C,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO;QACL,GAAG;QACH,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,eAAe,CAAC;QAC3C,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AACvD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,mBAAmB,CACjC,QAAiB,EACjB,SAAwB;IAExB,MAAM,IAAI,GACR,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC3E,CAAC,CAAE,QAAoC;QACvC,CAAC,CAAC,EAAE,CAAC;IACT,OAAO;QACL,GAAG,IAAI;QACP,YAAY,EAAE,IAAI;QAClB,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC;KACnE,CAAC;AACJ,CAAC;AAoBD,8BAA8B;AAC9B,MAAM,UAAU,UAAU,CAAC,CAAkB;IAC3C,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,KAAK,GACT,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,qBAAqB,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChG,OAAO;QACL,IAAI,EAAE;YACJ,CAAC,CAAC,KAAK;YACP,WAAW;YACX,iBAAiB;YACjB,IAAI;YACJ,CAAC,CAAC,SAAS;YACX,IAAI;YACJ,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5B,SAAS;YACT,CAAC,CAAC,IAAI,CAAC,KAAK;YACZ,GAAG,KAAK;YACR,eAAe;YACf,CAAC,CAAC,QAAQ;YACV,YAAY;SACb;QACD,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,0EAA0E;QAC1E,GAAG,EAAE;YACH,GAAG,CAAC,CAAC,GAAG;YACR,qBAAqB,EAAE,GAAG;YAC1B,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK;YAC9B,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK;YAC9B,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD;KACF,CAAC;AACJ,CAAC;AA2BD,mDAAmD;AACnD,MAAM,UAAU,OAAO,CAAC,IAAiB;IACvC,IAAI,KAAa,CAAC;IAClB,IAAI,SAAiB,CAAC;IACtB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAC5C,IAAI,OAAO;QAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,OAAO,mCAAmC,CAAC,CAAC;IAC1E,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChC,IAAI,QAAQ,GAAY,SAAS,CAAC;QAClC,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACnC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,4DAA4D;QAC9D,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;QAC7F,IAAI,IAAI,KAAK,MAAM;YAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,CACN,kCAAkC,CAAC,CAAC,GAAG,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC/F,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC;QACxB,KAAK;QACL,SAAS;QACT,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,IAAI;QACJ,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;KAChC,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IACrF,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACZ,IAAI,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AACvB,CAAC;AAED;mCACmC;AACnC,MAAM,UAAU,cAAc,CAC5B,GAAQ,EACR,OAA8B,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC;IAE5D,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC;IACxC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAAoC,EAAE,IAAI,KAAK,QAAQ;YAC1D,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,aAAa,EAAE,EAAE,CAAC;QACxC,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,aAAa,EAAE,EAAE,OAAO,EAAE,cAAc,IAAI,EAAE,EAAE,CAAC;IACvE,CAAC;IACD,IAAI,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAE,KAAK,CAAC,GAAG,CAA6B,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;IACrF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,IAAI,EAAE,EAAE,GAAG,aAAa,EAAE;YAC1B,OAAO,EAAE,GAAG,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;SACxE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,MAAW,OAAO,CAAC,GAAG;IACjE,OAAO;QACL,GAAG;QACH,OAAO;QACP,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC;QACzB,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE;QACxB,SAAS,EAAE,GAAG,EAAE,CAAC,gBAAgB,EAAE;QACnC,SAAS,EAAE,GAAG,EAAE;YACd,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAEhF,CAAC;gBACF,OAAO,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9D,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,sEAAsE;QACtE,gCAAgC;QAChC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI;QACvB,UAAU,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC;QACrC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC;QACxC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;QACxC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC/C,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YACvB,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACxF,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACtE,CAAC;QACD,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;KAC7B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// One login per box, as the home sees it: who refreshes
|
|
2
|
+
// the OpenAI login the home signed in to, whether it still works, and the
|
|
3
|
+
// re-login that replaces it safely.
|
|
4
|
+
//
|
|
5
|
+
// owner the daemon's refresher holds the login while auto-review runs
|
|
6
|
+
// on this machine (its single-instance lock, beside auth.json in
|
|
7
|
+
// the home's own pi agent dir, which the stack mounts:
|
|
8
|
+
// src/onboard/steps/loginshare.ts). Otherwise the home's pi refreshes it
|
|
9
|
+
// itself, by pi's own rule: a token inside pi's 5-minute window,
|
|
10
|
+
// under pi's own lock. While the refresher runs no token gets
|
|
11
|
+
// near that window, so the home's pi never refreshes: it borrows.
|
|
12
|
+
// expired the refresher's record says its refresh fails and the token is
|
|
13
|
+
// past its expiry (or the grant was refused); or the chat itself
|
|
14
|
+
// was refused for the login (extensions/home.ts reads pi's error);
|
|
15
|
+
// or auto-review is paused on it. The login line then says "login
|
|
16
|
+
// expired", with one key that signs in again.
|
|
17
|
+
// re-login pi's own device login (src/home/devicelogin.ts), with the
|
|
18
|
+
// entrypoint's handover around it (src/loginrefresh/handover.ts):
|
|
19
|
+
// a running refresher is paused first, and keeps its lock, so its
|
|
20
|
+
// refresh can never land on top of the new login; the pause is
|
|
21
|
+
// lifted after, and the refresher re-reads the new login at once,
|
|
22
|
+
// so auto-review resumes on it.
|
|
23
|
+
//
|
|
24
|
+
// Nothing here reads or prints a token: the refresher's status file carries
|
|
25
|
+
// expiry times and redacted errors only.
|
|
26
|
+
import { readFileSync } from "node:fs";
|
|
27
|
+
import { join } from "node:path";
|
|
28
|
+
import { PI_AUTH_ERROR_RE } from "@quickchatai/pi-quickreview/src/authwatch.js";
|
|
29
|
+
import { holdRefresher, refresherRuns } from "../loginrefresh/handover.js";
|
|
30
|
+
import { STATUS_FILE } from "../loginrefresh/refresher.js";
|
|
31
|
+
import { providerLabel } from "./model.js";
|
|
32
|
+
import { known, unknown, } from "./ports.js";
|
|
33
|
+
import { DEVICE_LOGIN_PROVIDERS, loginFailureText, } from "./setup.js";
|
|
34
|
+
/** What the login line says of a login that no longer works. */
|
|
35
|
+
export const LOGIN_EXPIRED = "login expired";
|
|
36
|
+
/** The key that signs in again, while typing (the panel's is `l`). */
|
|
37
|
+
export const RELOGIN_KEY = "alt+l";
|
|
38
|
+
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
39
|
+
const message = (err) => (err instanceof Error ? err.message : String(err));
|
|
40
|
+
/** A refresh refused for good: the grant is gone, not a network blip. */
|
|
41
|
+
const REFUSED = /invalid_grant|revoked|refresh_token_(?:reused|expired|invalidated)/i;
|
|
42
|
+
/** Why the refresher's record (its loginrefresh.status.json) says the login
|
|
43
|
+
* no longer works, or null. Pure. */
|
|
44
|
+
export function expiredWhy(record, now) {
|
|
45
|
+
if (!isObj(record))
|
|
46
|
+
return null;
|
|
47
|
+
const err = record["last_error"];
|
|
48
|
+
if (typeof err !== "string" || err === "")
|
|
49
|
+
return null;
|
|
50
|
+
if (REFUSED.test(err))
|
|
51
|
+
return LOGIN_EXPIRED;
|
|
52
|
+
const expires = typeof record["expires_at"] === "string" ? Date.parse(record["expires_at"]) : NaN;
|
|
53
|
+
return Number.isFinite(expires) && expires <= now ? LOGIN_EXPIRED : null;
|
|
54
|
+
}
|
|
55
|
+
/** An error pi showed in the chat that is the login's (pi-ai's refresh
|
|
56
|
+
* failure, or the provider refusing the token). */
|
|
57
|
+
export function isLoginError(text) {
|
|
58
|
+
return PI_AUTH_ERROR_RE.test(text) || /OAuth refresh failed/i.test(text);
|
|
59
|
+
}
|
|
60
|
+
/** The login in the home's own pi agent dir, beside the refresher that may
|
|
61
|
+
* hold it. */
|
|
62
|
+
export function hostLoginOwner(o) {
|
|
63
|
+
const read = o.read ?? ((p) => readFileSync(p, "utf8"));
|
|
64
|
+
const probe = {
|
|
65
|
+
...(o.flockBin ? { flockBin: o.flockBin } : {}),
|
|
66
|
+
...(o.daemonRuns ? { refresherRuns: o.daemonRuns } : {}),
|
|
67
|
+
};
|
|
68
|
+
return {
|
|
69
|
+
health: async () => {
|
|
70
|
+
const runs = await refresherRuns(o.loginDir, probe);
|
|
71
|
+
if (runs === null)
|
|
72
|
+
return unknown("can't tell whether auto-review's login refresher runs");
|
|
73
|
+
if (!runs)
|
|
74
|
+
return known({ refresher: "home" });
|
|
75
|
+
let record;
|
|
76
|
+
try {
|
|
77
|
+
record = JSON.parse(read(join(o.loginDir, STATUS_FILE)));
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// it has not written one yet: nothing says the login fails
|
|
81
|
+
return known({ refresher: "auto-review" });
|
|
82
|
+
}
|
|
83
|
+
const why = expiredWhy(record, o.now());
|
|
84
|
+
const checked = isObj(record) && typeof record["checked_at"] === "string"
|
|
85
|
+
? Date.parse(record["checked_at"])
|
|
86
|
+
: NaN;
|
|
87
|
+
return known({
|
|
88
|
+
refresher: "auto-review",
|
|
89
|
+
...(why ? { expired: why } : {}),
|
|
90
|
+
...(Number.isFinite(checked) ? { checkedAt: checked } : {}),
|
|
91
|
+
});
|
|
92
|
+
},
|
|
93
|
+
hold: () => holdRefresher(o.loginDir, { ...probe, ...(o.waitMs ? { waitMs: o.waitMs } : {}) }),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** "login expired" → one key, or `home_relogin`: sign in again. */
|
|
97
|
+
export class Relogin {
|
|
98
|
+
o;
|
|
99
|
+
signing = null;
|
|
100
|
+
closed = false;
|
|
101
|
+
constructor(o) {
|
|
102
|
+
this.o = o;
|
|
103
|
+
}
|
|
104
|
+
/** A re-login in flight: its code once pi has one. */
|
|
105
|
+
running() {
|
|
106
|
+
return this.signing === null ? null : this.signing.code ? { code: this.signing.code } : {};
|
|
107
|
+
}
|
|
108
|
+
changed() {
|
|
109
|
+
this.o.onChange?.();
|
|
110
|
+
}
|
|
111
|
+
/** Sign in again. The answer comes once the code is shown (or the login
|
|
112
|
+
* ended): the sign-in goes on in the background. */
|
|
113
|
+
async start() {
|
|
114
|
+
const m = this.o.model;
|
|
115
|
+
const s = this.signing;
|
|
116
|
+
if (s !== null)
|
|
117
|
+
return s.code
|
|
118
|
+
? `Still waiting: open ${s.code.verificationUri} and enter ${s.code.userCode}.`
|
|
119
|
+
: "The sign-in is starting: the code shows in a moment.";
|
|
120
|
+
if (this.closed)
|
|
121
|
+
return "the home has closed";
|
|
122
|
+
const provider = m.chatProvider();
|
|
123
|
+
const label = providerLabel(provider);
|
|
124
|
+
const port = DEVICE_LOGIN_PROVIDERS.has(provider) ? this.o.deviceLogin() : undefined;
|
|
125
|
+
if (port === undefined) {
|
|
126
|
+
const why = `sign in to ${label} again with pi's own /login (switch auto-review off first, so its refresher does not write over the new login)`;
|
|
127
|
+
m.say(`${why[0].toUpperCase()}${why.slice(1)}.`, "warn");
|
|
128
|
+
return why;
|
|
129
|
+
}
|
|
130
|
+
const signing = { ac: new AbortController() };
|
|
131
|
+
this.signing = signing;
|
|
132
|
+
this.changed();
|
|
133
|
+
// the refresher first, when one runs: it keeps its lock and stops writing
|
|
134
|
+
let hold;
|
|
135
|
+
try {
|
|
136
|
+
hold = this.o.owner
|
|
137
|
+
? await this.o.owner.hold()
|
|
138
|
+
: { ok: true, held: false, release: () => { } };
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
hold = { ok: false, why: message(err) };
|
|
142
|
+
}
|
|
143
|
+
if (!hold.ok) {
|
|
144
|
+
this.signing = null;
|
|
145
|
+
m.say(`Couldn't sign in again: ${hold.why}. Nothing changed.`, "warn");
|
|
146
|
+
this.changed();
|
|
147
|
+
return `the sign-in did not start: ${hold.why}`;
|
|
148
|
+
}
|
|
149
|
+
const release = hold.release;
|
|
150
|
+
const held = hold.held;
|
|
151
|
+
if (signing.ac.signal.aborted) {
|
|
152
|
+
release();
|
|
153
|
+
this.signing = null;
|
|
154
|
+
return "the home has closed";
|
|
155
|
+
}
|
|
156
|
+
m.say(`Signing in to ${label} again with pi's device code.`);
|
|
157
|
+
let answer;
|
|
158
|
+
const answered = new Promise((r) => (answer = r));
|
|
159
|
+
signing.onCode = (c) => {
|
|
160
|
+
m.say(`Open ${c.verificationUri} and enter the code ${c.userCode}.`);
|
|
161
|
+
answer(`Open ${c.verificationUri} and enter the code ${c.userCode}. The home finishes the sign-in once you approve it.`);
|
|
162
|
+
};
|
|
163
|
+
void (async () => {
|
|
164
|
+
let outcome;
|
|
165
|
+
try {
|
|
166
|
+
outcome = await port.login({
|
|
167
|
+
provider,
|
|
168
|
+
signal: signing.ac.signal,
|
|
169
|
+
onCode: (code) => {
|
|
170
|
+
signing.code = code;
|
|
171
|
+
signing.onCode?.(code);
|
|
172
|
+
this.changed();
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
outcome = { ok: false, kind: "failed", why: message(err) };
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
// the pause is lifted whatever happened: the refresher re-reads the file
|
|
181
|
+
release();
|
|
182
|
+
this.signing = null;
|
|
183
|
+
}
|
|
184
|
+
if (outcome.ok) {
|
|
185
|
+
m.signedInAgain();
|
|
186
|
+
await m.refresh();
|
|
187
|
+
m.say(`Signed in to ${label} again.${held ? " Auto-review's refresher has the new login, and auto-review resumes." : ""}`, "ok");
|
|
188
|
+
answer(`signed in to ${label} again`);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
if (outcome.kind !== "cancelled")
|
|
192
|
+
m.say(loginFailureText(outcome, RELOGIN_KEY), "warn");
|
|
193
|
+
answer(`the sign-in did not finish: ${outcome.why}`);
|
|
194
|
+
}
|
|
195
|
+
this.changed();
|
|
196
|
+
})();
|
|
197
|
+
return answered;
|
|
198
|
+
}
|
|
199
|
+
/** The session ends: a re-login in flight stops, and its pause is lifted. */
|
|
200
|
+
close() {
|
|
201
|
+
this.closed = true;
|
|
202
|
+
this.signing?.ac.abort();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=loginowner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loginowner.js","sourceRoot":"","sources":["../../../src/home/loginowner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { OnboardingEngine } from "../onboard/engine.js";
|
|
2
|
+
import { BROUGHT_UP_CHOICE_KEY } from "../onboard/steps/bringup.js";
|
|
3
|
+
import { DAEMON_SERVICE, MEMORY_SERVICE, composeArgs, readEnvText, } from "../onboard/steps/compose.js";
|
|
4
|
+
import { readEnvKey } from "../onboard/steps/ingress.js";
|
|
5
|
+
import { MEMORY_CHOICE_KEY, MEMORY_STEP_ID, waitsOnServer } from "../onboard/steps/memory.js";
|
|
6
|
+
import { MEMORY_KEYS_STEP_ID } from "../onboard/steps/memorykeys.js";
|
|
7
|
+
import { serviceState } from "./autoreview.js";
|
|
8
|
+
import { known, } from "./ports.js";
|
|
9
|
+
import { MACHINE_CHECKS_STEP_ID, memoryPhaseB, runSteps, switchOnInput, switchOnRegistry, } from "./switchon.js";
|
|
10
|
+
/** compose's memory cap when the project `.env` names none
|
|
11
|
+
* (docker-compose.yml `mem_limit: ${QCR_MEMORY_LIMIT:-4g}`). */
|
|
12
|
+
export const DEFAULT_MEMORY_LIMIT = "4g";
|
|
13
|
+
/** "4g" → "up to 4 GB of RAM"; a value compose would not read is said as is. */
|
|
14
|
+
export function ramCostOf(limit) {
|
|
15
|
+
const m = /^\s*(\d+(?:\.\d+)?)\s*([kmgt])?b?\s*$/i.exec(limit);
|
|
16
|
+
if (!m)
|
|
17
|
+
return `up to ${limit.trim()} of RAM`;
|
|
18
|
+
const unit = { k: "KB", m: "MB", g: "GB", t: "TB" }[(m[2] ?? "").toLowerCase()] ?? "bytes";
|
|
19
|
+
return `up to ${m[1]} ${unit} of RAM`;
|
|
20
|
+
}
|
|
21
|
+
/** The memory engine's state from its container's. */
|
|
22
|
+
export function memoryStateOf(c) {
|
|
23
|
+
if (c.kind === "unknown")
|
|
24
|
+
return c;
|
|
25
|
+
return known(c.value === "running" ? "on" : c.value === "restarting" ? "starting" : "off");
|
|
26
|
+
}
|
|
27
|
+
const firstLine = (s) => s.trim().split("\n")[0]?.trim() || "no output";
|
|
28
|
+
/** The memory step's answer when the person turns memory on. */
|
|
29
|
+
const MEMORY_YES = switchOnInput(MEMORY_STEP_ID, {
|
|
30
|
+
answers: { memory: true, confirmed: false },
|
|
31
|
+
repo: null,
|
|
32
|
+
});
|
|
33
|
+
/**
|
|
34
|
+
* Memory on, on a stack brought up before. Set up when it never was (or was
|
|
35
|
+
* declined): phase A places the root key, and when the engine does not run
|
|
36
|
+
* yet that is all it can do, so the engine is started (it reads the key at
|
|
37
|
+
* boot) and phase B runs once it answers (memoryPhaseB). Otherwise the engine
|
|
38
|
+
* is started as it is. Then its user keys, when that step is not done.
|
|
39
|
+
*/
|
|
40
|
+
export async function memoryOnStack(e, o) {
|
|
41
|
+
const configured = e.list().find((s) => s.id === MEMORY_STEP_ID);
|
|
42
|
+
let waits = false;
|
|
43
|
+
if (configured?.status !== "done" || e.choices()[MEMORY_CHOICE_KEY] === "declined") {
|
|
44
|
+
o.progress?.("Setting memory up…");
|
|
45
|
+
const r = await e.runStep(MEMORY_STEP_ID, MEMORY_YES);
|
|
46
|
+
if (!r.ok && !waitsOnServer(r.checks))
|
|
47
|
+
return { ok: false, detail: r.failures.join("; ") };
|
|
48
|
+
waits = !r.ok;
|
|
49
|
+
}
|
|
50
|
+
if (waits) {
|
|
51
|
+
const b = await memoryPhaseB({ ...o, checklist: e }, MEMORY_YES);
|
|
52
|
+
if (!b.ok)
|
|
53
|
+
return { ok: false, detail: b.detail };
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const up = await o.startMemory();
|
|
57
|
+
if (!up.ok)
|
|
58
|
+
return up;
|
|
59
|
+
}
|
|
60
|
+
const keys = e.list().find((s) => s.id === MEMORY_KEYS_STEP_ID);
|
|
61
|
+
if (keys && keys.status !== "done" && keys.status !== "disabled") {
|
|
62
|
+
const r = await e.runStep(MEMORY_KEYS_STEP_ID);
|
|
63
|
+
if (!r.ok)
|
|
64
|
+
return { ok: false, detail: `the engine runs, but ${r.failures.join("; ")}` };
|
|
65
|
+
}
|
|
66
|
+
return { ok: true, detail: "Memory is on." };
|
|
67
|
+
}
|
|
68
|
+
export function composeMemory(o) {
|
|
69
|
+
const compose = async (args, what) => {
|
|
70
|
+
const r = await o.runner.run("docker", composeArgs(o.root, args));
|
|
71
|
+
return r.code === 0
|
|
72
|
+
? { ok: true, detail: what }
|
|
73
|
+
: {
|
|
74
|
+
ok: false,
|
|
75
|
+
detail: `docker compose ${args.join(" ")} exited ${r.code}: ${firstLine(r.stderr || r.stdout)}`,
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
const engine = (log) => new OnboardingEngine(switchOnRegistry(o), o.stepAdapters(log));
|
|
79
|
+
const startMemory = () => compose(["up", "-d", MEMORY_SERVICE], "the memory engine runs");
|
|
80
|
+
return {
|
|
81
|
+
status: async () => memoryStateOf(await serviceState(o.runner, o.root, MEMORY_SERVICE)),
|
|
82
|
+
control: {
|
|
83
|
+
ramCost: () => ramCostOf((readEnvKey(readEnvText(o.root), "QCR_MEMORY_LIMIT") ?? "").trim() ||
|
|
84
|
+
DEFAULT_MEMORY_LIMIT),
|
|
85
|
+
switchOn: async (progress) => {
|
|
86
|
+
const e = engine((l) => progress?.(l));
|
|
87
|
+
if (typeof e.choices()[BROUGHT_UP_CHOICE_KEY] !== "string") {
|
|
88
|
+
// No stack yet: switch-on's steps bring it up with memory, and the
|
|
89
|
+
// daemon is put back as it was (off), so auto-review stays off.
|
|
90
|
+
const daemonWas = await serviceState(o.runner, o.root, DAEMON_SERVICE);
|
|
91
|
+
const checks = await e.runStep(MACHINE_CHECKS_STEP_ID);
|
|
92
|
+
if (!checks.ok)
|
|
93
|
+
return { ok: false, detail: checks.failures.join("; ") };
|
|
94
|
+
const steps = [];
|
|
95
|
+
const walked = await runSteps({
|
|
96
|
+
checklist: e,
|
|
97
|
+
memory: true,
|
|
98
|
+
repo: await o.repo(),
|
|
99
|
+
startMemory,
|
|
100
|
+
...(o.sleep ? { sleep: o.sleep } : {}),
|
|
101
|
+
...(progress ? { progress } : {}),
|
|
102
|
+
}, steps);
|
|
103
|
+
if (!walked.ok)
|
|
104
|
+
return { ok: false, detail: walked.detail };
|
|
105
|
+
if (daemonWas.kind === "known" && daemonWas.value !== "running") {
|
|
106
|
+
const stopped = await compose(["stop", DAEMON_SERVICE], "");
|
|
107
|
+
if (!stopped.ok)
|
|
108
|
+
return { ok: false, detail: `memory is on, but ${stopped.detail}` };
|
|
109
|
+
}
|
|
110
|
+
return { ok: true, detail: "Memory is on." };
|
|
111
|
+
}
|
|
112
|
+
return memoryOnStack(e, {
|
|
113
|
+
startMemory,
|
|
114
|
+
...(o.sleep ? { sleep: o.sleep } : {}),
|
|
115
|
+
...(progress ? { progress } : {}),
|
|
116
|
+
});
|
|
117
|
+
},
|
|
118
|
+
switchOff: () => compose(["stop", MEMORY_SERVICE], "Memory is off. What it learned is kept."),
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/home/memory.ts"],"names":[],"mappings":"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"}
|