@quickchatai/quickreview 1.1.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 +137 -57
- package/bin/qcr.js +1 -1
- package/config.example.toml +60 -14
- 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/login-route.js +5 -0
- package/dist/extensions/cli/login-route.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 +180 -0
- package/dist/extensions/login-route.js.map +1 -0
- package/dist/extensions/onboarding.js +35 -11
- 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/ciretry.js +2 -1
- package/dist/src/ciretry.js.map +1 -1
- package/dist/src/cli.js +54 -61
- package/dist/src/cli.js.map +1 -1
- package/dist/src/cliops.js +3 -2
- package/dist/src/cliops.js.map +1 -1
- package/dist/src/commands.js +25 -2
- package/dist/src/commands.js.map +1 -1
- package/dist/src/config.js +32 -2
- package/dist/src/config.js.map +1 -1
- package/dist/src/daemon.js +50 -8
- 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 +6 -1
- package/dist/src/debugroundpi.js.map +1 -1
- package/dist/src/dispatch.js +5 -4
- package/dist/src/dispatch.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/engine/debugpi.js +17 -5
- package/dist/src/engine/debugpi.js.map +1 -1
- package/dist/src/execboundary.js +10 -3
- package/dist/src/execboundary.js.map +1 -1
- package/dist/src/github.js +51 -16
- package/dist/src/github.js.map +1 -1
- package/dist/src/githubtoken.js +346 -0
- package/dist/src/githubtoken.js.map +1 -0
- 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/loginhint.js +8 -3
- package/dist/src/loginhint.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/pirefresh.js +3 -0
- package/dist/src/loginrefresh/pirefresh.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 +46 -14
- package/dist/src/npmverbs.js.map +1 -1
- package/dist/src/onboard/choices.js +35 -4
- package/dist/src/onboard/choices.js.map +1 -1
- package/dist/src/onboard/engine.js +32 -306
- package/dist/src/onboard/engine.js.map +1 -1
- package/dist/src/onboard/pipin.js +22 -0
- package/dist/src/onboard/pipin.js.map +1 -0
- package/dist/src/onboard/stepforward.js +41 -0
- package/dist/src/onboard/stepforward.js.map +1 -0
- package/dist/src/onboard/steps/appslug.js +4 -1
- package/dist/src/onboard/steps/appslug.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/compose.js +29 -0
- package/dist/src/onboard/steps/compose.js.map +1 -1
- package/dist/src/onboard/steps/configfill.js +120 -39
- package/dist/src/onboard/steps/configfill.js.map +1 -1
- package/dist/src/onboard/steps/githubaccount.js +595 -0
- package/dist/src/onboard/steps/githubaccount.js.map +1 -0
- package/dist/src/onboard/steps/githubapp.js +65 -7
- package/dist/src/onboard/steps/githubapp.js.map +1 -1
- package/dist/src/onboard/steps/golive.js +2 -0
- package/dist/src/onboard/steps/golive.js.map +1 -1
- package/dist/src/onboard/steps/index.js +11 -0
- package/dist/src/onboard/steps/index.js.map +1 -1
- package/dist/src/onboard/steps/ingress.js +80 -25
- package/dist/src/onboard/steps/ingress.js.map +1 -1
- package/dist/src/onboard/steps/llmauth.js +103 -30
- package/dist/src/onboard/steps/llmauth.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 +67 -3
- package/dist/src/onboard/steps/memory.js.map +1 -1
- package/dist/src/onboard/steps/proof.js +366 -56
- package/dist/src/onboard/steps/proof.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/steps/topology.js +6 -6
- package/dist/src/onboard/steps/topology.js.map +1 -1
- package/dist/src/onboard/steps/transport.js +9 -1
- package/dist/src/onboard/steps/transport.js.map +1 -1
- package/dist/src/onboard/steps/tuiroute.js +102 -0
- package/dist/src/onboard/steps/tuiroute.js.map +1 -0
- package/dist/src/onboard/steps/verifyup.js +17 -1
- package/dist/src/onboard/steps/verifyup.js.map +1 -1
- package/dist/src/onboard/toolnames.js +30 -0
- package/dist/src/onboard/toolnames.js.map +1 -0
- package/dist/src/operatorwrite.js +23 -0
- package/dist/src/operatorwrite.js.map +1 -0
- package/dist/src/outcomes.js +4 -1
- package/dist/src/outcomes.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/posting-journal.js +2 -1
- package/dist/src/posting-journal.js.map +1 -1
- package/dist/src/posting-outbox.js +6 -2
- package/dist/src/posting-outbox.js.map +1 -1
- package/dist/src/posting-receipt.js +14 -1
- package/dist/src/posting-receipt.js.map +1 -1
- package/dist/src/qcrbin.js +16 -11
- package/dist/src/qcrbin.js.map +1 -1
- package/dist/src/recheck.js +2 -1
- package/dist/src/recheck.js.map +1 -1
- package/dist/src/reconcile.js +22 -2
- package/dist/src/reconcile.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/reviewhistory.js +32 -6
- package/dist/src/reviewhistory.js.map +1 -1
- package/dist/src/reviewnow.js +45 -0
- package/dist/src/reviewnow.js.map +1 -0
- 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/statemachine.js +4 -1
- package/dist/src/statemachine.js.map +1 -1
- package/dist/src/takeover.js +1 -0
- package/dist/src/takeover.js.map +1 -1
- package/dist/src/takeoverpi.js +15 -1
- package/dist/src/takeoverpi.js.map +1 -1
- package/dist/src/tui/app.js +49 -0
- package/dist/src/tui/app.js.map +1 -1
- package/dist/src/tui/board.js +88 -12
- package/dist/src/tui/board.js.map +1 -1
- package/dist/src/tui/cmdbar.js +4 -1
- package/dist/src/tui/cmdbar.js.map +1 -1
- package/dist/src/tui/companion.js +76 -11
- package/dist/src/tui/companion.js.map +1 -1
- package/dist/src/tui/connect.js +7 -1
- package/dist/src/tui/connect.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/filters.js +5 -2
- package/dist/src/tui/filters.js.map +1 -1
- package/dist/src/tui/ghread.js +61 -5
- package/dist/src/tui/ghread.js.map +1 -1
- package/dist/src/tui/index.js +109 -20
- package/dist/src/tui/index.js.map +1 -1
- package/dist/src/tui/memforward.js +39 -2
- package/dist/src/tui/memforward.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/model.js +25 -0
- package/dist/src/tui/model.js.map +1 -1
- package/dist/src/tui/prpause.js +7 -0
- package/dist/src/tui/prpause.js.map +1 -1
- package/dist/src/tui/remote.js +7 -1
- package/dist/src/tui/remote.js.map +1 -1
- package/dist/src/tui/route.js +143 -0
- package/dist/src/tui/route.js.map +1 -0
- package/dist/src/tui/setupstate.js +32 -0
- package/dist/src/tui/setupstate.js.map +1 -0
- package/dist/src/tui/sshtriage.js +102 -5
- package/dist/src/tui/sshtriage.js.map +1 -1
- package/dist/src/tui/theme.js +2 -1
- package/dist/src/tui/theme.js.map +1 -1
- package/dist/src/tui/unwedge.js +2 -12
- package/dist/src/tui/unwedge.js.map +1 -1
- package/dist/src/verdicts.js +17 -5
- package/dist/src/verdicts.js.map +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/src/webhook.js +12 -1
- package/dist/src/webhook.js.map +1 -1
- package/dist/src/wire.js +34 -8
- package/dist/src/wire.js.map +1 -1
- package/dist/src/workerworld.js +11 -1
- package/dist/src/workerworld.js.map +1 -1
- package/docker/README.md +1 -1
- package/docker/companion/entrypoint.sh +20 -1
- package/docker/entrypoint.sh +57 -6
- package/docker-compose.yml +16 -1
- package/extensions/cli/home.ts +14 -0
- package/extensions/cli/login-route.ts +10 -0
- package/extensions/cli/selfimprove.ts +18 -0
- package/extensions/home.ts +484 -0
- package/extensions/login-route.ts +220 -0
- package/extensions/onboarding.ts +41 -11
- 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 +58 -18
- package/schemas/review-result.v1.json +60 -0
- package/scripts/deploy.sh +8 -6
- package/scripts/mint-token.sh +25 -4
- 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/ciretry.ts +2 -1
- package/src/cli.ts +59 -67
- package/src/cliops.ts +3 -2
- package/src/commands.ts +28 -2
- package/src/config.ts +62 -4
- package/src/daemon.ts +58 -7
- package/src/debuground.ts +3 -0
- package/src/debugroundpi.ts +12 -1
- package/src/dispatch.ts +5 -4
- package/src/engine/caserunner-sdk.ts +29 -314
- package/src/engine/debugpi.ts +17 -5
- package/src/execboundary.ts +16 -4
- package/src/github.ts +57 -15
- package/src/githubtoken.ts +435 -0
- 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/loginhint.ts +8 -3
- package/src/loginrefresh/handover.ts +138 -0
- package/src/loginrefresh/lock.ts +72 -3
- package/src/loginrefresh/pirefresh.ts +3 -0
- package/src/loginrefresh/refresher.ts +34 -5
- package/src/loginrefresh/supervisor.ts +25 -2
- package/src/npmverbs.ts +55 -13
- package/src/onboard/choices.ts +40 -4
- package/src/onboard/engine.ts +70 -421
- package/src/onboard/pipin.ts +31 -0
- package/src/onboard/stepforward.ts +61 -0
- package/src/onboard/steps/appslug.ts +4 -1
- package/src/onboard/steps/bringup.ts +3 -2
- package/src/onboard/steps/compose.ts +31 -0
- package/src/onboard/steps/configfill.ts +144 -40
- package/src/onboard/steps/githubaccount.ts +716 -0
- package/src/onboard/steps/githubapp.ts +92 -8
- package/src/onboard/steps/golive.ts +2 -0
- package/src/onboard/steps/index.ts +11 -0
- package/src/onboard/steps/ingress.ts +98 -31
- package/src/onboard/steps/llmauth.ts +114 -29
- package/src/onboard/steps/loginshare.ts +258 -0
- package/src/onboard/steps/memory.ts +76 -3
- package/src/onboard/steps/proof.ts +473 -55
- package/src/onboard/steps/repoconfig.ts +85 -0
- package/src/onboard/steps/topology.ts +7 -6
- package/src/onboard/steps/transport.ts +15 -0
- package/src/onboard/steps/tuiroute.ts +119 -0
- package/src/onboard/steps/verifyup.ts +20 -1
- package/src/onboard/toolnames.ts +34 -0
- package/src/operatorwrite.ts +25 -0
- package/src/outcomes.ts +8 -1
- package/src/piagentdir.ts +12 -0
- package/src/pilogin.ts +32 -16
- package/src/posting-journal.ts +6 -1
- package/src/posting-outbox.ts +10 -2
- package/src/posting-receipt.ts +17 -0
- package/src/qcrbin.ts +16 -11
- package/src/recheck.ts +2 -1
- package/src/reconcile.ts +29 -3
- package/src/reviewargs.ts +119 -0
- package/src/reviewcli.ts +6 -167
- package/src/reviewdetach.ts +107 -13
- package/src/reviewhistory.ts +20 -6
- package/src/reviewnow.ts +76 -0
- 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 +43 -0
- package/src/statemachine.ts +4 -1
- package/src/takeover.ts +5 -0
- package/src/takeoverpi.ts +16 -2
- package/src/tui/app.ts +47 -0
- package/src/tui/board.ts +111 -14
- package/src/tui/cmdbar.ts +4 -1
- package/src/tui/companion.ts +80 -11
- package/src/tui/connect.ts +7 -1
- package/src/tui/deploytab.ts +2 -2
- package/src/tui/filters.ts +7 -3
- package/src/tui/ghread.ts +74 -7
- package/src/tui/index.ts +117 -23
- package/src/tui/memforward.ts +52 -3
- package/src/tui/memory.ts +3 -15
- package/src/tui/memoryurl.ts +22 -0
- package/src/tui/model.ts +36 -2
- package/src/tui/prpause.ts +11 -2
- package/src/tui/remote.ts +9 -1
- package/src/tui/route.ts +173 -0
- package/src/tui/setupstate.ts +56 -0
- package/src/tui/sshtriage.ts +127 -6
- package/src/tui/theme.ts +2 -1
- package/src/tui/unwedge.ts +2 -14
- package/src/verdicts.ts +23 -5
- package/src/version.ts +1 -1
- package/src/webhook.ts +10 -1
- package/src/wire.ts +42 -9
- package/src/workerworld.ts +16 -2
- 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 -83
- 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 -115
- package/src/setup/ledger.ts +0 -324
- package/src/setup/stage2.ts +0 -926
- package/src/setup/textsniff.ts +0 -95
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import { registerQcrTool, textResult, } from "@quickchatai/pi-quickreview/extensions/pi-tool.js";
|
|
2
|
+
import { REVIEW_MESSAGE } from "@quickchatai/pi-quickreview/src/plugin/messages.js";
|
|
3
|
+
import { readQuickReviewSettings } from "@quickchatai/pi-quickreview/src/plugin/settings.js";
|
|
4
|
+
import { piDeviceLogin } from "../src/home/devicelogin.js";
|
|
5
|
+
import { Relogin, RELOGIN_KEY, isLoginError } from "../src/home/loginowner.js";
|
|
6
|
+
import { HomeAdvanced } from "../src/home/advanced.js";
|
|
7
|
+
import { advancedTools } from "../src/home/advancedtools.js";
|
|
8
|
+
import { HomeModel } from "../src/home/model.js";
|
|
9
|
+
import { HOME_OVERLAY, HomePanel } from "../src/home/panel.js";
|
|
10
|
+
import { HomeSetup } from "../src/home/setup.js";
|
|
11
|
+
import { SETUP_OVERLAY, SetupCard } from "../src/home/setupcard.js";
|
|
12
|
+
import { setupTools } from "../src/home/setuptools.js";
|
|
13
|
+
import { HOME_TOOL_NAMES } from "../src/home/toolnames.js";
|
|
14
|
+
import { HomeTune } from "../src/home/tune.js";
|
|
15
|
+
/** How often the home reads its sources again by itself. */
|
|
16
|
+
export const REFRESH_MS = 60_000;
|
|
17
|
+
const SPIN_MS = 100;
|
|
18
|
+
const realEvery = (ms, fn) => {
|
|
19
|
+
const t = setInterval(fn, ms);
|
|
20
|
+
t.unref?.();
|
|
21
|
+
return () => clearInterval(t);
|
|
22
|
+
};
|
|
23
|
+
const realAfter = (ms, fn) => {
|
|
24
|
+
const t = setTimeout(fn, ms);
|
|
25
|
+
t.unref?.();
|
|
26
|
+
return () => clearTimeout(t);
|
|
27
|
+
};
|
|
28
|
+
const NO_PARAMS = { type: "object", properties: {}, additionalProperties: false };
|
|
29
|
+
const PR_PARAM = {
|
|
30
|
+
type: "integer",
|
|
31
|
+
minimum: 1,
|
|
32
|
+
description: "The pull request's number.",
|
|
33
|
+
};
|
|
34
|
+
export function createHome(o) {
|
|
35
|
+
return (pi) => {
|
|
36
|
+
const every = o.every ?? realEvery;
|
|
37
|
+
let tui;
|
|
38
|
+
let handle;
|
|
39
|
+
let close;
|
|
40
|
+
let mounted;
|
|
41
|
+
let session;
|
|
42
|
+
let frame = 0;
|
|
43
|
+
/** The session's UI, for the switches' questions. */
|
|
44
|
+
let sessionUi;
|
|
45
|
+
const askOf = (ctx) => ctx?.hasUI ? ctx.ui : sessionUi;
|
|
46
|
+
const stops = [];
|
|
47
|
+
const redraw = () => tui?.requestRender();
|
|
48
|
+
// the session's UI, for the post question; none outside the TUI
|
|
49
|
+
let ui;
|
|
50
|
+
const message = (err) => (err instanceof Error ? err.message : String(err));
|
|
51
|
+
// a read nobody awaits: what went wrong is said, while the session lasts
|
|
52
|
+
const refresh = () => {
|
|
53
|
+
model.refresh().catch((err) => {
|
|
54
|
+
if (session)
|
|
55
|
+
model.say(`Couldn't read everything again: ${message(err)}`, "warn");
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
const model = new HomeModel({
|
|
59
|
+
adapters: o.adapters,
|
|
60
|
+
model: o.model,
|
|
61
|
+
tools: o.tools,
|
|
62
|
+
onChange: redraw,
|
|
63
|
+
after: o.after ?? realAfter,
|
|
64
|
+
ask: async (question, options) => ui?.select(question, options),
|
|
65
|
+
// shown, never a turn of its own: while the agent streams, the message
|
|
66
|
+
// waits for the turn to end instead of steering it
|
|
67
|
+
send: (m) => pi.sendMessage({ customType: REVIEW_MESSAGE, content: m.content, display: true, details: m.details }, { triggerTurn: false }),
|
|
68
|
+
postingRule: () => {
|
|
69
|
+
let all;
|
|
70
|
+
try {
|
|
71
|
+
all = pi.getSettings();
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
all = undefined;
|
|
75
|
+
}
|
|
76
|
+
const read = readQuickReviewSettings(all);
|
|
77
|
+
for (const w of read.warnings)
|
|
78
|
+
warn(w);
|
|
79
|
+
return read.settings.posting;
|
|
80
|
+
},
|
|
81
|
+
gaps: () => setup.gaps(),
|
|
82
|
+
onRead: () => setup.sync(),
|
|
83
|
+
});
|
|
84
|
+
// a word to the person: pi's notice, else the panel's line
|
|
85
|
+
const warn = (text) => {
|
|
86
|
+
if (session?.hasUI)
|
|
87
|
+
session.ui.notify(text, "warning");
|
|
88
|
+
else
|
|
89
|
+
model.say(text, "warn");
|
|
90
|
+
};
|
|
91
|
+
const setup = new HomeSetup({
|
|
92
|
+
model,
|
|
93
|
+
github: o.adapters.github,
|
|
94
|
+
ports: o.setup ?? {},
|
|
95
|
+
deviceLogin: () => deviceLogin(),
|
|
96
|
+
onChange: redraw,
|
|
97
|
+
onPhase: () => {
|
|
98
|
+
if (session?.mode === "tui")
|
|
99
|
+
mount(session);
|
|
100
|
+
},
|
|
101
|
+
interactive: () => session?.mode === "tui",
|
|
102
|
+
});
|
|
103
|
+
const deviceLogin = () => o.setup?.deviceLogin ?? (session ? piDeviceLogin(session.modelRegistry) : undefined);
|
|
104
|
+
const relogin = new Relogin({
|
|
105
|
+
model,
|
|
106
|
+
owner: o.adapters.loginOwner,
|
|
107
|
+
deviceLogin,
|
|
108
|
+
onChange: redraw,
|
|
109
|
+
});
|
|
110
|
+
const tune = new HomeTune({
|
|
111
|
+
...(o.tune ? { port: o.tune } : {}),
|
|
112
|
+
repo: () => model.repo(),
|
|
113
|
+
say: (text, kind) => model.say(text, kind),
|
|
114
|
+
after: o.after ?? realAfter,
|
|
115
|
+
onChange: redraw,
|
|
116
|
+
});
|
|
117
|
+
const advanced = new HomeAdvanced({
|
|
118
|
+
...(o.advanced ? { port: o.advanced } : {}),
|
|
119
|
+
...(o.adapters.autoReview.control ? { autoReview: o.adapters.autoReview.control } : {}),
|
|
120
|
+
say: (text, kind) => model.say(text, kind),
|
|
121
|
+
refresh: () => model.refresh(),
|
|
122
|
+
selected: () => model.selected,
|
|
123
|
+
});
|
|
124
|
+
// Setup's brief goes to the chat as the person's message, after the
|
|
125
|
+
// agent's turn when one is running
|
|
126
|
+
const tellAgent = (text) => pi.sendUserMessage(text, { deliverAs: "followUp" });
|
|
127
|
+
const advancedAsk = (ctx) => ctx?.hasUI ? ctx.ui : session?.hasUI ? session.ui : undefined;
|
|
128
|
+
const dialogs = (ctx) => ctx?.hasUI
|
|
129
|
+
? {
|
|
130
|
+
select: (title, options) => ctx.ui.select(title, options),
|
|
131
|
+
input: (title, placeholder) => ctx.ui.input(title, placeholder),
|
|
132
|
+
}
|
|
133
|
+
: undefined;
|
|
134
|
+
const nextStep = (ctx) => setup.next(dialogs(ctx));
|
|
135
|
+
// The card while setup has a gap, the panel otherwise; a change of phase
|
|
136
|
+
// closes the one and opens the other.
|
|
137
|
+
const mount = (ctx) => {
|
|
138
|
+
const want = setup.phase();
|
|
139
|
+
if (close && mounted === want)
|
|
140
|
+
return;
|
|
141
|
+
close?.();
|
|
142
|
+
close = undefined;
|
|
143
|
+
handle = undefined;
|
|
144
|
+
mounted = want;
|
|
145
|
+
const focused = () => handle?.isFocused() ?? false;
|
|
146
|
+
void ctx.ui.custom((t, theme, _keys, done) => {
|
|
147
|
+
tui = t;
|
|
148
|
+
close = () => done();
|
|
149
|
+
return want === "setup"
|
|
150
|
+
? new SetupCard(theme, {
|
|
151
|
+
setup,
|
|
152
|
+
model,
|
|
153
|
+
focused,
|
|
154
|
+
rows: () => t.terminal.rows,
|
|
155
|
+
unfocus: () => handle?.unfocus(),
|
|
156
|
+
frame: () => frame,
|
|
157
|
+
next: () => void nextStep(session),
|
|
158
|
+
})
|
|
159
|
+
: new HomePanel(theme, {
|
|
160
|
+
model,
|
|
161
|
+
focused,
|
|
162
|
+
rows: () => t.terminal.rows,
|
|
163
|
+
unfocus: () => handle?.unfocus(),
|
|
164
|
+
frame: () => frame,
|
|
165
|
+
ask: () => sessionUi,
|
|
166
|
+
relogin: () => void relogin.start(),
|
|
167
|
+
signingAgain: () => relogin.running() !== null,
|
|
168
|
+
tune: () => void tune.tune(tellAgent),
|
|
169
|
+
advanced: () => void advanced.open(advancedAsk(session)),
|
|
170
|
+
});
|
|
171
|
+
}, {
|
|
172
|
+
overlay: true,
|
|
173
|
+
overlayOptions: want === "setup"
|
|
174
|
+
? { ...SETUP_OVERLAY }
|
|
175
|
+
: { ...HOME_OVERLAY, margin: { ...HOME_OVERLAY.margin } },
|
|
176
|
+
onHandle: (h) => (handle = h),
|
|
177
|
+
});
|
|
178
|
+
};
|
|
179
|
+
pi.on("session_start", (_e, ctx) => {
|
|
180
|
+
session = ctx;
|
|
181
|
+
model.setChatModel(ctx.model?.provider);
|
|
182
|
+
ui = ctx.mode === "tui" ? ctx.ui : undefined;
|
|
183
|
+
sessionUi = ctx.hasUI ? ctx.ui : undefined;
|
|
184
|
+
if (ctx.mode === "tui") {
|
|
185
|
+
mount(ctx);
|
|
186
|
+
// the spinner turns only while a read or a setup step is in flight
|
|
187
|
+
stops.push(every(SPIN_MS, () => {
|
|
188
|
+
if (!model.busy() && !setup.busy() && relogin.running() === null)
|
|
189
|
+
return;
|
|
190
|
+
frame++;
|
|
191
|
+
redraw();
|
|
192
|
+
}));
|
|
193
|
+
}
|
|
194
|
+
stops.push(every(REFRESH_MS, refresh));
|
|
195
|
+
refresh();
|
|
196
|
+
});
|
|
197
|
+
pi.on("model_select", (e) => model.setChatModel(e.model.provider));
|
|
198
|
+
// pi's own word on the login: a reply refused for it, or one that came back
|
|
199
|
+
pi.on("message_end", (e) => {
|
|
200
|
+
const m = e.message;
|
|
201
|
+
if (m.role !== "assistant")
|
|
202
|
+
return;
|
|
203
|
+
if (m.stopReason === "error") {
|
|
204
|
+
if (typeof m.errorMessage === "string" && isLoginError(m.errorMessage))
|
|
205
|
+
model.loginFailed(m.errorMessage);
|
|
206
|
+
}
|
|
207
|
+
else if (m.stopReason !== "aborted")
|
|
208
|
+
model.chatAnswered();
|
|
209
|
+
});
|
|
210
|
+
pi.on("session_shutdown", () => {
|
|
211
|
+
// the session's timers and its pricing stop; a running review goes on
|
|
212
|
+
model.dispose();
|
|
213
|
+
relogin.close();
|
|
214
|
+
tune.dispose();
|
|
215
|
+
ui = undefined;
|
|
216
|
+
for (const stop of stops.splice(0))
|
|
217
|
+
stop();
|
|
218
|
+
setup.close();
|
|
219
|
+
close?.();
|
|
220
|
+
close = undefined;
|
|
221
|
+
mounted = undefined;
|
|
222
|
+
// pi's context for this session is stale now: nothing may reach it
|
|
223
|
+
session = undefined;
|
|
224
|
+
sessionUi = undefined;
|
|
225
|
+
tui = undefined;
|
|
226
|
+
});
|
|
227
|
+
const key = (id, description, run) => pi.registerShortcut(id, {
|
|
228
|
+
description,
|
|
229
|
+
handler: (ctx) => {
|
|
230
|
+
void new Promise((resolve) => resolve(run(ctx))).catch((err) => {
|
|
231
|
+
if (session)
|
|
232
|
+
model.say(message(err), "warn");
|
|
233
|
+
});
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
key("alt+j", "quickreview home: next pull request", () => model.move(1));
|
|
237
|
+
key("alt+k", "quickreview home: previous pull request", () => model.move(-1));
|
|
238
|
+
key("alt+o", "quickreview home: open the pull request on GitHub", () => model.openPr());
|
|
239
|
+
key("alt+u", "quickreview home: read everything again", () => refresh());
|
|
240
|
+
key("alt+r", "quickreview home: review the pull request, or show its review", () => model.enter());
|
|
241
|
+
key("alt+s", "quickreview home: stop the pull request's review", () => model.stopReview());
|
|
242
|
+
key("f2", "quickreview home: focus the panel", () => handle?.focus());
|
|
243
|
+
key("alt+a", "quickreview home: switch auto-review on or off", (ctx) => model.switchAutoReview(askOf(ctx)));
|
|
244
|
+
key("alt+m", "quickreview home: switch memory on or off", (ctx) => model.switchMemory(askOf(ctx)));
|
|
245
|
+
key(RELOGIN_KEY, "quickreview home: sign in again (an expired login)", () => relogin.start());
|
|
246
|
+
key("alt+t", "quickreview home: tune the review to this repo (Setup)", () => tune.tune(tellAgent));
|
|
247
|
+
key("alt+x", "quickreview home: advanced (a GitHub App, webhooks, a server, Slack, live)", (ctx) => advanced.open(advancedAsk(ctx)));
|
|
248
|
+
pi.registerShortcut("alt+n", {
|
|
249
|
+
description: "quickreview home: run the next setup step",
|
|
250
|
+
handler: (ctx) => {
|
|
251
|
+
void nextStep(ctx);
|
|
252
|
+
},
|
|
253
|
+
});
|
|
254
|
+
// one definition per HOME_TOOL_NAMES entry: a name without one does not compile
|
|
255
|
+
const tools = {
|
|
256
|
+
home_status: {
|
|
257
|
+
name: "home_status",
|
|
258
|
+
label: "Home status",
|
|
259
|
+
description: "Read what the quickreview home shows: the repository, the logins, auto-review, memory, spend and the open pull requests (To review, Reviewed). A value that could not be read is null.",
|
|
260
|
+
parameters: NO_PARAMS,
|
|
261
|
+
execute: () => textResult(JSON.stringify(model.status(), null, 1)),
|
|
262
|
+
},
|
|
263
|
+
home_refresh: {
|
|
264
|
+
name: "home_refresh",
|
|
265
|
+
label: "Home refresh",
|
|
266
|
+
description: "Read the home's sources again: the logins, the repository and its open pull requests.",
|
|
267
|
+
parameters: NO_PARAMS,
|
|
268
|
+
execute: async () => textResult(await model.refresh()),
|
|
269
|
+
},
|
|
270
|
+
home_move: {
|
|
271
|
+
name: "home_move",
|
|
272
|
+
label: "Home move",
|
|
273
|
+
description: "Move the home's selection through its pull request lists: 1 is the next row, -1 the previous.",
|
|
274
|
+
parameters: {
|
|
275
|
+
type: "object",
|
|
276
|
+
properties: { by: { type: "integer", description: "Rows to move; negative moves up." } },
|
|
277
|
+
required: ["by"],
|
|
278
|
+
additionalProperties: false,
|
|
279
|
+
},
|
|
280
|
+
execute: (_id, p) => textResult(model.move(Number(p["by"]))),
|
|
281
|
+
},
|
|
282
|
+
home_select: {
|
|
283
|
+
name: "home_select",
|
|
284
|
+
label: "Home select",
|
|
285
|
+
description: "Select one open pull request in the home's lists, by number.",
|
|
286
|
+
parameters: {
|
|
287
|
+
type: "object",
|
|
288
|
+
properties: { pr: PR_PARAM },
|
|
289
|
+
required: ["pr"],
|
|
290
|
+
additionalProperties: false,
|
|
291
|
+
},
|
|
292
|
+
execute: (_id, p) => textResult(model.select(Number(p["pr"]))),
|
|
293
|
+
},
|
|
294
|
+
home_open_pr: {
|
|
295
|
+
name: "home_open_pr",
|
|
296
|
+
label: "Home open PR",
|
|
297
|
+
description: "Open a pull request on GitHub in the person's browser: the one given, or the home's selected one.",
|
|
298
|
+
parameters: { type: "object", properties: { pr: PR_PARAM }, additionalProperties: false },
|
|
299
|
+
execute: async (_id, p) => textResult(await model.openPr(typeof p["pr"] === "number" ? p["pr"] : undefined)),
|
|
300
|
+
},
|
|
301
|
+
home_review_pr: {
|
|
302
|
+
name: "home_review_pr",
|
|
303
|
+
label: "Home review PR",
|
|
304
|
+
description: "Review a pull request with QuickReview in the background: the one given, or the home's selected one. It previews the price, starts the review and returns at once; the home shows its progress and findings, and nothing is posted to GitHub unless the person's posting rule says so.",
|
|
305
|
+
parameters: { type: "object", properties: { pr: PR_PARAM }, additionalProperties: false },
|
|
306
|
+
execute: async (_id, p) => textResult(await model.review(typeof p["pr"] === "number" ? p["pr"] : undefined)),
|
|
307
|
+
},
|
|
308
|
+
home_show_review: {
|
|
309
|
+
name: "home_show_review",
|
|
310
|
+
label: "Home show review",
|
|
311
|
+
description: "Put a reviewed pull request's findings in the chat: the one given, or the home's selected one.",
|
|
312
|
+
parameters: { type: "object", properties: { pr: PR_PARAM }, additionalProperties: false },
|
|
313
|
+
execute: (_id, p) => textResult(model.showReview(typeof p["pr"] === "number" ? p["pr"] : undefined)),
|
|
314
|
+
},
|
|
315
|
+
home_stop_review: {
|
|
316
|
+
name: "home_stop_review",
|
|
317
|
+
label: "Home stop review",
|
|
318
|
+
description: "Stop the running QuickReview review of a pull request: the one given, or the home's selected one.",
|
|
319
|
+
parameters: { type: "object", properties: { pr: PR_PARAM }, additionalProperties: false },
|
|
320
|
+
execute: async (_id, p) => textResult(await model.stopReview(typeof p["pr"] === "number" ? p["pr"] : undefined)),
|
|
321
|
+
},
|
|
322
|
+
home_auto_review: {
|
|
323
|
+
name: "home_auto_review",
|
|
324
|
+
label: "Home auto-review",
|
|
325
|
+
description: "Switch auto-review on or off. Switching on checks this machine, then asks the person where it runs, whether to turn memory on too, and for their one confirm, and it comes up in dry-run; switching off warns them which review is running, and from dry-run offers going live (a proof round on the selected pull request, then one more confirm). Every question is the person's to answer in the home: this tool cannot answer or confirm for them.",
|
|
326
|
+
parameters: NO_PARAMS,
|
|
327
|
+
execute: async (_id, _p, _signal, _onUpdate, ctx) => textResult(await model.switchAutoReview(askOf(ctx))),
|
|
328
|
+
},
|
|
329
|
+
home_memory: {
|
|
330
|
+
name: "home_memory",
|
|
331
|
+
label: "Home memory",
|
|
332
|
+
description: "Switch reviewer memory on or off, on its own: auto-review is not touched. The person confirms in the home, after seeing its RAM cost.",
|
|
333
|
+
parameters: NO_PARAMS,
|
|
334
|
+
execute: async (_id, _p, _signal, _onUpdate, ctx) => textResult(await model.switchMemory(askOf(ctx))),
|
|
335
|
+
},
|
|
336
|
+
home_relogin: {
|
|
337
|
+
name: "home_relogin",
|
|
338
|
+
label: "Home sign in again",
|
|
339
|
+
description: "Sign in again with pi's own device-code login, for the provider the chat runs on, when the login has expired or was revoked (the home's login line says \"login expired\"). When auto-review runs on this machine its login refresher is paused during the sign-in and resumes on the new login. Answers with the URL and the code to enter once pi has them; the sign-in finishes in the background when the person approves it.",
|
|
340
|
+
parameters: NO_PARAMS,
|
|
341
|
+
execute: async () => textResult(await relogin.start()),
|
|
342
|
+
},
|
|
343
|
+
...setupTools(setup),
|
|
344
|
+
...advancedTools({ tune, advanced, tellAgent, ask: (ctx) => advancedAsk(ctx) }),
|
|
345
|
+
};
|
|
346
|
+
for (const name of HOME_TOOL_NAMES)
|
|
347
|
+
registerQcrTool(pi, tools[name]);
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=home.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"home.js","sourceRoot":"","sources":["../../extensions/home.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
// login-route — a pi that has no usable model login says so, and opens pi's
|
|
2
|
+
// own /login; a pi whose model names one OpenAI provider while the person
|
|
3
|
+
// logged in with the other runs the same model on the login that exists.
|
|
4
|
+
//
|
|
5
|
+
// Loaded by every CLI pi Quickreview starts for a person: the onboarding
|
|
6
|
+
// wizard (registered by extensions/onboarding.ts, which opens the login for
|
|
7
|
+
// the person), the companion, a takeover and a debug round (the env shim
|
|
8
|
+
// extensions/cli/login-route.ts, which prefills it). An SDK session needs none
|
|
9
|
+
// of this: PiHost routes its model the same way (packages/pi-plugin/src/engine/pisdk.ts).
|
|
10
|
+
//
|
|
11
|
+
// Three behaviours, each on pi's own API:
|
|
12
|
+
// - Model route. On session_start and before every prompt (the `input`
|
|
13
|
+
// event, which pi runs before it checks the model's credential), a model
|
|
14
|
+
// whose provider has no credential is switched to its OpenAI twin when the
|
|
15
|
+
// twin has one and serves the same id (packages/pi-plugin/src/modelroute.ts).
|
|
16
|
+
// The provider the spec names always wins when its login exists, so an
|
|
17
|
+
// install that works today is untouched. pi.setModel does not persist the
|
|
18
|
+
// switch to settings.
|
|
19
|
+
// - Login hint. When no usable model is left, a widget says exactly what to
|
|
20
|
+
// do, and pi's input line holds `/login`, so one Enter opens pi's login.
|
|
21
|
+
// The widget clears once a model is selected (`model_select`).
|
|
22
|
+
// - Open (the wizard only). pi runs `/login` only from its editor's submit
|
|
23
|
+
// (an extension cannot call the command), and the one public way to reach
|
|
24
|
+
// that submit is an editor component: pi wires its own submit handler
|
|
25
|
+
// onto every editor an extension installs. So the login is opened by
|
|
26
|
+
// installing a stock CustomEditor for an instant, submitting `/login`
|
|
27
|
+
// through the handler pi gave it, and restoring the editor that was there.
|
|
28
|
+
// When that wiring is not found, the prefilled `/login` is the fallback.
|
|
29
|
+
import { CustomEditor, } from "@earendil-works/pi-coding-agent";
|
|
30
|
+
import { routeProvider, twinProvider } from "@quickchatai/pi-quickreview/src/modelroute.js";
|
|
31
|
+
/** The widget key the hint is shown under. */
|
|
32
|
+
export const LOGIN_WIDGET = "qcr-login";
|
|
33
|
+
/** The command the hint prefills and the wizard submits: pi's own login,
|
|
34
|
+
* with every provider it offers. */
|
|
35
|
+
export const LOGIN_COMMAND = "/login";
|
|
36
|
+
/** What the person reads above the input line while no model is usable:
|
|
37
|
+
* which logins work and how to reach them in pi's menu (pi 1.4.0's labels),
|
|
38
|
+
* then how to (re)open the menu. `opened` says whether the menu is on screen. */
|
|
39
|
+
export function loginHintLines(opened) {
|
|
40
|
+
return [
|
|
41
|
+
"Quickreview needs a model login before it can do anything. Any OpenAI login works:",
|
|
42
|
+
' - "Sign in with an account", then "OpenAI" (Sign in with ChatGPT) or "OpenAI Codex (legacy)";',
|
|
43
|
+
' - "Sign in with an API key", then type openai, pick "OpenAI" and paste your key (sk-...).',
|
|
44
|
+
opened
|
|
45
|
+
? `pi's login menu is open below. Closed it? Type ${LOGIN_COMMAND} and press Enter.`
|
|
46
|
+
: `Press Enter to open pi's login menu (${LOGIN_COMMAND} is on the input line).`,
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
/** The config the env describes: QCR_LOGIN_OPEN=submit, else prefill. */
|
|
50
|
+
export function loginRouteConfigFromEnv(env) {
|
|
51
|
+
return { open: env.QCR_LOGIN_OPEN === "submit" ? "submit" : "prefill" };
|
|
52
|
+
}
|
|
53
|
+
function hasCredential(registry, provider) {
|
|
54
|
+
try {
|
|
55
|
+
return registry.getProviderAuthStatus(provider).configured;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Keep the session's model on a login that exists: the model as it is when its
|
|
63
|
+
* provider has a credential, else its OpenAI twin when that has one.
|
|
64
|
+
*
|
|
65
|
+
* VERIFY-ON-PIN (pi 1.4.0): ModelRegistry.getProviderAuthStatus(p).configured
|
|
66
|
+
* covers a stored login, a stored or runtime key and an environment key, and
|
|
67
|
+
* the extension pi.setModel returns false (switching nothing) for a provider
|
|
68
|
+
* without a credential.
|
|
69
|
+
*/
|
|
70
|
+
export async function routeSessionModel(pi, ctx) {
|
|
71
|
+
const model = ctx.model;
|
|
72
|
+
if (!model)
|
|
73
|
+
return "none";
|
|
74
|
+
const registry = ctx.modelRegistry;
|
|
75
|
+
if (hasCredential(registry, model.provider))
|
|
76
|
+
return "usable";
|
|
77
|
+
if (twinProvider(model.provider) === undefined)
|
|
78
|
+
return "unusable";
|
|
79
|
+
const provider = routeProvider(model.provider, model.id, {
|
|
80
|
+
hasCredential: (p) => hasCredential(registry, p),
|
|
81
|
+
hasModel: (p, id) => registry.find(p, id) !== undefined,
|
|
82
|
+
});
|
|
83
|
+
if (provider === model.provider)
|
|
84
|
+
return "unusable";
|
|
85
|
+
const twin = registry.find(provider, model.id);
|
|
86
|
+
if (twin && (await pi.setModel(twin)))
|
|
87
|
+
return "switched";
|
|
88
|
+
return "unusable";
|
|
89
|
+
}
|
|
90
|
+
/** Does this pi need a login: no usable model, and none pi could pick? */
|
|
91
|
+
export function needsLogin(outcome, registry) {
|
|
92
|
+
if (outcome === "usable" || outcome === "switched")
|
|
93
|
+
return false;
|
|
94
|
+
if (outcome === "unusable")
|
|
95
|
+
return true;
|
|
96
|
+
try {
|
|
97
|
+
return registry.getAvailable().length === 0;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Submit `text` through pi's own editor submit, as if typed and Entered. pi
|
|
105
|
+
* runs its built-in commands (`/login` among them) only from that handler, and
|
|
106
|
+
* hands it to every editor component an extension installs: so a stock editor
|
|
107
|
+
* is installed, its handler taken, and the previous editor (pi's default, or
|
|
108
|
+
* another extension's) restored before anything renders. Returns false, having
|
|
109
|
+
* submitted nothing, when pi did not wire a handler.
|
|
110
|
+
*
|
|
111
|
+
* VERIFY-ON-PIN (pi 1.4.0, interactive-mode.js setCustomEditorComponent):
|
|
112
|
+
* `newEditor.onSubmit = this.defaultEditor.onSubmit` runs synchronously inside
|
|
113
|
+
* setEditorComponent, and setEditorComponent(undefined) restores the default
|
|
114
|
+
* editor with its text.
|
|
115
|
+
*/
|
|
116
|
+
export function submitThroughEditor(ui, text, makeEditor = (tui, theme, keybindings) => new CustomEditor(tui, theme, keybindings)) {
|
|
117
|
+
let made;
|
|
118
|
+
const previous = ui.getEditorComponent();
|
|
119
|
+
try {
|
|
120
|
+
ui.setEditorComponent((tui, theme, keybindings) => {
|
|
121
|
+
const editor = makeEditor(tui, theme, keybindings);
|
|
122
|
+
made = editor;
|
|
123
|
+
return editor;
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
made = undefined;
|
|
128
|
+
}
|
|
129
|
+
const submit = made?.onSubmit;
|
|
130
|
+
ui.setEditorComponent(previous);
|
|
131
|
+
if (typeof submit !== "function")
|
|
132
|
+
return false;
|
|
133
|
+
void Promise.resolve()
|
|
134
|
+
.then(() => submit(text))
|
|
135
|
+
.catch(() => undefined);
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
/** Show the hint and open (or prefill) pi's login. Returns how it was opened. */
|
|
139
|
+
export function openLogin(ui, open) {
|
|
140
|
+
if (open === "submit" && submitThroughEditor(ui, LOGIN_COMMAND)) {
|
|
141
|
+
ui.setWidget(LOGIN_WIDGET, loginHintLines(true), { placement: "aboveEditor" });
|
|
142
|
+
return "submitted";
|
|
143
|
+
}
|
|
144
|
+
ui.setWidget(LOGIN_WIDGET, loginHintLines(false), { placement: "aboveEditor" });
|
|
145
|
+
ui.setEditorText(LOGIN_COMMAND);
|
|
146
|
+
return "prefilled";
|
|
147
|
+
}
|
|
148
|
+
/** Register the model route and the login hint on `pi`. Exported so a host that
|
|
149
|
+
* builds its own onboarding extension (over `toolDefinitions`) gets the same
|
|
150
|
+
* first-run login as the onboarding wizard. */
|
|
151
|
+
export function registerLoginRoute(pi, config) {
|
|
152
|
+
if (typeof pi.on !== "function")
|
|
153
|
+
return;
|
|
154
|
+
let shown = false;
|
|
155
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
156
|
+
const outcome = await routeSessionModel(pi, ctx);
|
|
157
|
+
if (!ctx.hasUI || !needsLogin(outcome, ctx.modelRegistry))
|
|
158
|
+
return;
|
|
159
|
+
shown = true;
|
|
160
|
+
openLogin(ctx.ui, config.open);
|
|
161
|
+
});
|
|
162
|
+
// pi checks the model's credential after this event, so a login made inside
|
|
163
|
+
// the session (its default model stays the spec's provider) is routed here.
|
|
164
|
+
pi.on("input", async (_event, ctx) => {
|
|
165
|
+
await routeSessionModel(pi, ctx);
|
|
166
|
+
return { action: "continue" };
|
|
167
|
+
});
|
|
168
|
+
pi.on("model_select", (_event, ctx) => {
|
|
169
|
+
if (!shown || !ctx.hasUI)
|
|
170
|
+
return;
|
|
171
|
+
shown = false;
|
|
172
|
+
ctx.ui.setWidget(LOGIN_WIDGET, undefined);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
/** The factory, for a pi that loads the route by path (its shim) or a host
|
|
176
|
+
* that composes factories. */
|
|
177
|
+
export function createLoginRoute(config) {
|
|
178
|
+
return (pi) => registerLoginRoute(pi, config);
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=login-route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-route.js","sourceRoot":"","sources":["../../extensions/login-route.ts"],"names":[],"mappings":"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"}
|