@quickchatai/pi-quickreview 0.0.0-stage → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +23 -0
- package/README.md +75 -2
- package/assets/agents/pass-abstraction.md +64 -0
- package/assets/agents/pass-ask-human.md +134 -0
- package/assets/agents/pass-backcompat.md +67 -0
- package/assets/agents/pass-baseline.md +61 -0
- package/assets/agents/pass-behaviour-delta.md +64 -0
- package/assets/agents/pass-bounds.md +36 -0
- package/assets/agents/pass-claims.md +31 -0
- package/assets/agents/pass-concurrency.md +168 -0
- package/assets/agents/pass-consistency.md +57 -0
- package/assets/agents/pass-contracts.md +30 -0
- package/assets/agents/pass-data-safety.md +54 -0
- package/assets/agents/pass-deferred.md +35 -0
- package/assets/agents/pass-delivery.md +37 -0
- package/assets/agents/pass-duplication.md +60 -0
- package/assets/agents/pass-intent.md +63 -0
- package/assets/agents/pass-lint-conformance.md +46 -0
- package/assets/agents/pass-maintainability.md +67 -0
- package/assets/agents/pass-placement.md +68 -0
- package/assets/agents/pass-prod-risk.md +24 -0
- package/assets/agents/pass-rollout.md +32 -0
- package/assets/agents/pass-roundtrip.md +46 -0
- package/assets/agents/pass-security.md +31 -0
- package/assets/agents/pass-simplicity.md +68 -0
- package/assets/agents/pass-statelessness.md +27 -0
- package/assets/agents/pass-style.md +37 -0
- package/assets/agents/pass-sweep.md +57 -0
- package/assets/agents/pass-tests.md +58 -0
- package/assets/agents/pass-ui.md +23 -0
- package/assets/agents/pass-validate.md +50 -0
- package/assets/agents/pass-widened.md +46 -0
- package/assets/agents/scan/pass-scan.md +86 -0
- package/assets/config.example.toml +1099 -0
- package/assets/deploy/reviewer/AGENTS.override.md +12 -0
- package/assets/profiles/default/README.md +21 -0
- package/assets/profiles/default/addenda/.gitkeep +0 -0
- package/assets/profiles/default/profile.toml +17 -0
- package/assets/profiles/example-django/README.md +21 -0
- package/assets/profiles/example-django/addenda/10-migration-discipline.md +13 -0
- package/assets/profiles/example-django/addenda/20-new-column-nullability.md +12 -0
- package/assets/profiles/example-django/addenda/30-test-doctrine.md +12 -0
- package/assets/profiles/example-django/addenda/40-orm-usage.md +19 -0
- package/assets/profiles/example-django/addenda/50-declared-shape.md +10 -0
- package/assets/profiles/example-django/addenda/60-config-placement.md +14 -0
- package/assets/profiles/example-django/heuristics.toml +24 -0
- package/assets/profiles/example-django/profile.toml +9 -0
- package/assets/profiles/fast/README.md +24 -0
- package/assets/profiles/fast/profile.toml +59 -0
- package/assets/profiles/minimal/README.md +17 -0
- package/assets/profiles/minimal/addenda/.gitkeep +0 -0
- package/assets/profiles/minimal/profile.toml +8 -0
- package/assets/profiles/snappy/README.md +24 -0
- package/assets/profiles/snappy/addenda/10-race-as-question.md +6 -0
- package/assets/profiles/snappy/profile.toml +46 -0
- package/assets/prompts/companion-day-open.md +46 -0
- package/assets/prompts/companion-first-run.md +104 -0
- package/assets/prompts/companion.md +821 -0
- package/assets/prompts/conversation-system.md +117 -0
- package/assets/prompts/eod-sweep.md +120 -0
- package/assets/prompts/onboarding.md +113 -0
- package/assets/prompts/pass-common.md +52 -0
- package/assets/prompts/pass-quality-common.md +22 -0
- package/assets/prompts/round-first.md +874 -0
- package/assets/prompts/round-follow-up.md +991 -0
- package/assets/prompts/round-re-review.md +889 -0
- package/assets/prompts/round-recheck.md +196 -0
- package/assets/prompts/round-staleness.md +856 -0
- package/assets/schemas/review-result.v1.json +391 -0
- package/assets/schemas/scan-result.v1.json +421 -0
- package/assets/schemas/version.v1.json +57 -0
- package/assets/seed-manifest.json +19 -0
- package/assets/seeds/agents/pass-baseline.md +61 -0
- package/assets/seeds/agents/pass-contracts.md +30 -0
- package/assets/seeds/agents/pass-data-safety.md +54 -0
- package/assets/seeds/agents/pass-delivery.md +37 -0
- package/assets/seeds/agents/pass-prod-risk.md +24 -0
- package/assets/seeds/agents/pass-security.md +31 -0
- package/assets/seeds/agents/pass-statelessness.md +27 -0
- package/assets/seeds/agents/pass-ui.md +23 -0
- package/assets/seeds/agents/pass-validate.md +50 -0
- package/assets/seeds/prompts/conversation-system.md +117 -0
- package/assets/seeds/prompts/eod-sweep.md +120 -0
- package/assets/seeds/prompts/pass-common.md +52 -0
- package/dist/extensions/bash-guard.d.ts +467 -0
- package/dist/extensions/bash-guard.d.ts.map +1 -0
- package/dist/extensions/bash-guard.js +3058 -0
- package/dist/extensions/bash-guard.js.map +1 -0
- package/dist/extensions/finding-clusters.d.ts +33 -0
- package/dist/extensions/finding-clusters.d.ts.map +1 -0
- package/dist/extensions/finding-clusters.js +218 -0
- package/dist/extensions/finding-clusters.js.map +1 -0
- package/dist/extensions/ledger-pin.d.ts +76 -0
- package/dist/extensions/ledger-pin.d.ts.map +1 -0
- package/dist/extensions/ledger-pin.js +331 -0
- package/dist/extensions/ledger-pin.js.map +1 -0
- package/dist/extensions/lens.d.ts +43 -0
- package/dist/extensions/lens.d.ts.map +1 -0
- package/dist/extensions/lens.js +150 -0
- package/dist/extensions/lens.js.map +1 -0
- package/dist/extensions/pi-tool.d.ts +22 -0
- package/dist/extensions/pi-tool.d.ts.map +1 -0
- package/dist/extensions/pi-tool.js +20 -0
- package/dist/extensions/pi-tool.js.map +1 -0
- package/dist/extensions/quickreview.d.ts +21 -0
- package/dist/extensions/quickreview.d.ts.map +1 -0
- package/dist/extensions/quickreview.js +132 -0
- package/dist/extensions/quickreview.js.map +1 -0
- package/dist/src/anchors.d.ts +54 -0
- package/dist/src/anchors.d.ts.map +1 -0
- package/dist/src/anchors.js +127 -0
- package/dist/src/anchors.js.map +1 -0
- package/dist/src/assetroot.d.ts +16 -0
- package/dist/src/assetroot.d.ts.map +1 -0
- package/dist/src/assetroot.js +77 -0
- package/dist/src/assetroot.js.map +1 -0
- package/dist/src/authwatch.d.ts +61 -0
- package/dist/src/authwatch.d.ts.map +1 -0
- package/dist/src/authwatch.js +210 -0
- package/dist/src/authwatch.js.map +1 -0
- package/dist/src/budget.d.ts +15 -0
- package/dist/src/budget.d.ts.map +1 -0
- package/dist/src/budget.js +32 -0
- package/dist/src/budget.js.map +1 -0
- package/dist/src/casebudget.d.ts +3 -0
- package/dist/src/casebudget.d.ts.map +1 -0
- package/dist/src/casebudget.js +3 -0
- package/dist/src/casebudget.js.map +1 -0
- package/dist/src/cigate.d.ts +116 -0
- package/dist/src/cigate.d.ts.map +1 -0
- package/dist/src/cigate.js +176 -0
- package/dist/src/cigate.js.map +1 -0
- package/dist/src/codespan.d.ts +46 -0
- package/dist/src/codespan.d.ts.map +1 -0
- package/dist/src/codespan.js +75 -0
- package/dist/src/codespan.js.map +1 -0
- package/dist/src/contextpack.d.ts +56 -0
- package/dist/src/contextpack.d.ts.map +1 -0
- package/dist/src/contextpack.js +195 -0
- package/dist/src/contextpack.js.map +1 -0
- package/dist/src/contract.d.ts +8 -0
- package/dist/src/contract.d.ts.map +1 -0
- package/dist/src/contract.js +21 -0
- package/dist/src/contract.js.map +1 -0
- package/dist/src/coverage.d.ts +32 -0
- package/dist/src/coverage.d.ts.map +1 -0
- package/dist/src/coverage.js +85 -0
- package/dist/src/coverage.js.map +1 -0
- package/dist/src/datafence.d.ts +19 -0
- package/dist/src/datafence.d.ts.map +1 -0
- package/dist/src/datafence.js +60 -0
- package/dist/src/datafence.js.map +1 -0
- package/dist/src/dedup.d.ts +65 -0
- package/dist/src/dedup.d.ts.map +1 -0
- package/dist/src/dedup.js +459 -0
- package/dist/src/dedup.js.map +1 -0
- package/dist/src/depsources.d.ts +304 -0
- package/dist/src/depsources.d.ts.map +1 -0
- package/dist/src/depsources.js +3367 -0
- package/dist/src/depsources.js.map +1 -0
- package/dist/src/diffinput.d.ts +10 -0
- package/dist/src/diffinput.d.ts.map +1 -0
- package/dist/src/diffinput.js +172 -0
- package/dist/src/diffinput.js.map +1 -0
- package/dist/src/doubtwords.d.ts +10 -0
- package/dist/src/doubtwords.d.ts.map +1 -0
- package/dist/src/doubtwords.js +13 -0
- package/dist/src/doubtwords.js.map +1 -0
- package/dist/src/ecosystem.d.ts +148 -0
- package/dist/src/ecosystem.d.ts.map +1 -0
- package/dist/src/ecosystem.js +338 -0
- package/dist/src/ecosystem.js.map +1 -0
- package/dist/src/engine/agentdir.d.ts +5 -0
- package/dist/src/engine/agentdir.d.ts.map +1 -0
- package/dist/src/engine/agentdir.js +21 -0
- package/dist/src/engine/agentdir.js.map +1 -0
- package/dist/src/engine/auth.d.ts +214 -0
- package/dist/src/engine/auth.d.ts.map +1 -0
- package/dist/src/engine/auth.js +374 -0
- package/dist/src/engine/auth.js.map +1 -0
- package/dist/src/engine/budget.d.ts +60 -0
- package/dist/src/engine/budget.d.ts.map +1 -0
- package/dist/src/engine/budget.js +113 -0
- package/dist/src/engine/budget.js.map +1 -0
- package/dist/src/engine/capfd.d.ts +6 -0
- package/dist/src/engine/capfd.d.ts.map +1 -0
- package/dist/src/engine/capfd.js +21 -0
- package/dist/src/engine/capfd.js.map +1 -0
- package/dist/src/engine/caseout.d.ts +66 -0
- package/dist/src/engine/caseout.d.ts.map +1 -0
- package/dist/src/engine/caseout.js +107 -0
- package/dist/src/engine/caseout.js.map +1 -0
- package/dist/src/engine/context.d.ts +57 -0
- package/dist/src/engine/context.d.ts.map +1 -0
- package/dist/src/engine/context.js +212 -0
- package/dist/src/engine/context.js.map +1 -0
- package/dist/src/engine/envmap.d.ts +13 -0
- package/dist/src/engine/envmap.d.ts.map +1 -0
- package/dist/src/engine/envmap.js +377 -0
- package/dist/src/engine/envmap.js.map +1 -0
- package/dist/src/engine/extfiles.d.ts +7 -0
- package/dist/src/engine/extfiles.d.ts.map +1 -0
- package/dist/src/engine/extfiles.js +23 -0
- package/dist/src/engine/extfiles.js.map +1 -0
- package/dist/src/engine/keyroute.d.ts +21 -0
- package/dist/src/engine/keyroute.d.ts.map +1 -0
- package/dist/src/engine/keyroute.js +58 -0
- package/dist/src/engine/keyroute.js.map +1 -0
- package/dist/src/engine/lens/cache-group.d.ts +20 -0
- package/dist/src/engine/lens/cache-group.d.ts.map +1 -0
- package/dist/src/engine/lens/cache-group.js +31 -0
- package/dist/src/engine/lens/cache-group.js.map +1 -0
- package/dist/src/engine/lens/cache-run.d.ts +65 -0
- package/dist/src/engine/lens/cache-run.d.ts.map +1 -0
- package/dist/src/engine/lens/cache-run.js +159 -0
- package/dist/src/engine/lens/cache-run.js.map +1 -0
- package/dist/src/engine/lens/deadline.d.ts +54 -0
- package/dist/src/engine/lens/deadline.d.ts.map +1 -0
- package/dist/src/engine/lens/deadline.js +111 -0
- package/dist/src/engine/lens/deadline.js.map +1 -0
- package/dist/src/engine/lens/engine-tools.d.ts +13 -0
- package/dist/src/engine/lens/engine-tools.d.ts.map +1 -0
- package/dist/src/engine/lens/engine-tools.js +37 -0
- package/dist/src/engine/lens/engine-tools.js.map +1 -0
- package/dist/src/engine/lens/env.d.ts +23 -0
- package/dist/src/engine/lens/env.d.ts.map +1 -0
- package/dist/src/engine/lens/env.js +42 -0
- package/dist/src/engine/lens/env.js.map +1 -0
- package/dist/src/engine/lens/launch-plan.d.ts +63 -0
- package/dist/src/engine/lens/launch-plan.d.ts.map +1 -0
- package/dist/src/engine/lens/launch-plan.js +203 -0
- package/dist/src/engine/lens/launch-plan.js.map +1 -0
- package/dist/src/engine/lens/leaf-cache.d.ts +22 -0
- package/dist/src/engine/lens/leaf-cache.d.ts.map +1 -0
- package/dist/src/engine/lens/leaf-cache.js +115 -0
- package/dist/src/engine/lens/leaf-cache.js.map +1 -0
- package/dist/src/engine/lens/permits.d.ts +14 -0
- package/dist/src/engine/lens/permits.d.ts.map +1 -0
- package/dist/src/engine/lens/permits.js +18 -0
- package/dist/src/engine/lens/permits.js.map +1 -0
- package/dist/src/engine/lens/registry.d.ts +55 -0
- package/dist/src/engine/lens/registry.d.ts.map +1 -0
- package/dist/src/engine/lens/registry.js +140 -0
- package/dist/src/engine/lens/registry.js.map +1 -0
- package/dist/src/engine/lens/round-lens.d.ts +16 -0
- package/dist/src/engine/lens/round-lens.d.ts.map +1 -0
- package/dist/src/engine/lens/round-lens.js +46 -0
- package/dist/src/engine/lens/round-lens.js.map +1 -0
- package/dist/src/engine/lens/runlens.d.ts +103 -0
- package/dist/src/engine/lens/runlens.d.ts.map +1 -0
- package/dist/src/engine/lens/runlens.js +538 -0
- package/dist/src/engine/lens/runlens.js.map +1 -0
- package/dist/src/engine/lens/section.d.ts +19 -0
- package/dist/src/engine/lens/section.d.ts.map +1 -0
- package/dist/src/engine/lens/section.js +40 -0
- package/dist/src/engine/lens/section.js.map +1 -0
- package/dist/src/engine/lens/semaphore.d.ts +13 -0
- package/dist/src/engine/lens/semaphore.d.ts.map +1 -0
- package/dist/src/engine/lens/semaphore.js +44 -0
- package/dist/src/engine/lens/semaphore.js.map +1 -0
- package/dist/src/engine/lens/tool.d.ts +34 -0
- package/dist/src/engine/lens/tool.d.ts.map +1 -0
- package/dist/src/engine/lens/tool.js +345 -0
- package/dist/src/engine/lens/tool.js.map +1 -0
- package/dist/src/engine/lens/wave.d.ts +63 -0
- package/dist/src/engine/lens/wave.d.ts.map +1 -0
- package/dist/src/engine/lens/wave.js +95 -0
- package/dist/src/engine/lens/wave.js.map +1 -0
- package/dist/src/engine/livesessions.d.ts +21 -0
- package/dist/src/engine/livesessions.d.ts.map +1 -0
- package/dist/src/engine/livesessions.js +57 -0
- package/dist/src/engine/livesessions.js.map +1 -0
- package/dist/src/engine/livewire.d.ts +18 -0
- package/dist/src/engine/livewire.d.ts.map +1 -0
- package/dist/src/engine/livewire.js +31 -0
- package/dist/src/engine/livewire.js.map +1 -0
- package/dist/src/engine/openable.d.ts +37 -0
- package/dist/src/engine/openable.d.ts.map +1 -0
- package/dist/src/engine/openable.js +120 -0
- package/dist/src/engine/openable.js.map +1 -0
- package/dist/src/engine/pisdk.d.ts +235 -0
- package/dist/src/engine/pisdk.d.ts.map +1 -0
- package/dist/src/engine/pisdk.js +577 -0
- package/dist/src/engine/pisdk.js.map +1 -0
- package/dist/src/engine/port.d.ts +144 -0
- package/dist/src/engine/port.d.ts.map +1 -0
- package/dist/src/engine/port.js +16 -0
- package/dist/src/engine/port.js.map +1 -0
- package/dist/src/engine/prompts.d.ts +159 -0
- package/dist/src/engine/prompts.d.ts.map +1 -0
- package/dist/src/engine/prompts.js +339 -0
- package/dist/src/engine/prompts.js.map +1 -0
- package/dist/src/engine/render.d.ts +10 -0
- package/dist/src/engine/render.d.ts.map +1 -0
- package/dist/src/engine/render.js +23 -0
- package/dist/src/engine/render.js.map +1 -0
- package/dist/src/engine/reviewruntime.d.ts +13 -0
- package/dist/src/engine/reviewruntime.d.ts.map +1 -0
- package/dist/src/engine/reviewruntime.js +35 -0
- package/dist/src/engine/reviewruntime.js.map +1 -0
- package/dist/src/engine/reviewsdk.d.ts +75 -0
- package/dist/src/engine/reviewsdk.d.ts.map +1 -0
- package/dist/src/engine/reviewsdk.js +180 -0
- package/dist/src/engine/reviewsdk.js.map +1 -0
- package/dist/src/engine/round.d.ts +166 -0
- package/dist/src/engine/round.d.ts.map +1 -0
- package/dist/src/engine/round.js +543 -0
- package/dist/src/engine/round.js.map +1 -0
- package/dist/src/engine/roundagents.d.ts +17 -0
- package/dist/src/engine/roundagents.d.ts.map +1 -0
- package/dist/src/engine/roundagents.js +49 -0
- package/dist/src/engine/roundagents.js.map +1 -0
- package/dist/src/engine/roundevents.d.ts +110 -0
- package/dist/src/engine/roundevents.d.ts.map +1 -0
- package/dist/src/engine/roundevents.js +276 -0
- package/dist/src/engine/roundevents.js.map +1 -0
- package/dist/src/engine/roundsdk.d.ts +33 -0
- package/dist/src/engine/roundsdk.d.ts.map +1 -0
- package/dist/src/engine/roundsdk.js +76 -0
- package/dist/src/engine/roundsdk.js.map +1 -0
- package/dist/src/engine/sdkruntime.d.ts +23 -0
- package/dist/src/engine/sdkruntime.d.ts.map +1 -0
- package/dist/src/engine/sdkruntime.js +340 -0
- package/dist/src/engine/sdkruntime.js.map +1 -0
- package/dist/src/engine/select.d.ts +16 -0
- package/dist/src/engine/select.d.ts.map +1 -0
- package/dist/src/engine/select.js +32 -0
- package/dist/src/engine/select.js.map +1 -0
- package/dist/src/engine/sessionwrap.d.ts +4 -0
- package/dist/src/engine/sessionwrap.d.ts.map +1 -0
- package/dist/src/engine/sessionwrap.js +31 -0
- package/dist/src/engine/sessionwrap.js.map +1 -0
- package/dist/src/engine/toolfence.d.ts +90 -0
- package/dist/src/engine/toolfence.d.ts.map +1 -0
- package/dist/src/engine/toolfence.js +378 -0
- package/dist/src/engine/toolfence.js.map +1 -0
- package/dist/src/engine/tooluid.d.ts +128 -0
- package/dist/src/engine/tooluid.d.ts.map +1 -0
- package/dist/src/engine/tooluid.js +401 -0
- package/dist/src/engine/tooluid.js.map +1 -0
- package/dist/src/envstrip.d.ts +10 -0
- package/dist/src/envstrip.d.ts.map +1 -0
- package/dist/src/envstrip.js +15 -0
- package/dist/src/envstrip.js.map +1 -0
- package/dist/src/escalationprompt.d.ts +22 -0
- package/dist/src/escalationprompt.d.ts.map +1 -0
- package/dist/src/escalationprompt.js +54 -0
- package/dist/src/escalationprompt.js.map +1 -0
- package/dist/src/execfn.d.ts +29 -0
- package/dist/src/execfn.d.ts.map +1 -0
- package/dist/src/execfn.js +55 -0
- package/dist/src/execfn.js.map +1 -0
- package/dist/src/finding-chain.d.ts +40 -0
- package/dist/src/finding-chain.d.ts.map +1 -0
- package/dist/src/finding-chain.js +76 -0
- package/dist/src/finding-chain.js.map +1 -0
- package/dist/src/finding-row.d.ts +24 -0
- package/dist/src/finding-row.d.ts.map +1 -0
- package/dist/src/finding-row.js +26 -0
- package/dist/src/finding-row.js.map +1 -0
- package/dist/src/findingkey.d.ts +99 -0
- package/dist/src/findingkey.d.ts.map +1 -0
- package/dist/src/findingkey.js +210 -0
- package/dist/src/findingkey.js.map +1 -0
- package/dist/src/findingsrecord.d.ts +175 -0
- package/dist/src/findingsrecord.d.ts.map +1 -0
- package/dist/src/findingsrecord.js +410 -0
- package/dist/src/findingsrecord.js.map +1 -0
- package/dist/src/followup-mode.d.ts +4 -0
- package/dist/src/followup-mode.d.ts.map +1 -0
- package/dist/src/followup-mode.js +6 -0
- package/dist/src/followup-mode.js.map +1 -0
- package/dist/src/gate.d.ts +199 -0
- package/dist/src/gate.d.ts.map +1 -0
- package/dist/src/gate.js +315 -0
- package/dist/src/gate.js.map +1 -0
- package/dist/src/ghcred.d.ts +58 -0
- package/dist/src/ghcred.d.ts.map +1 -0
- package/dist/src/ghcred.js +139 -0
- package/dist/src/ghcred.js.map +1 -0
- package/dist/src/githubAuth.d.ts +70 -0
- package/dist/src/githubAuth.d.ts.map +1 -0
- package/dist/src/githubAuth.js +183 -0
- package/dist/src/githubAuth.js.map +1 -0
- package/dist/src/githubcore.d.ts +20 -0
- package/dist/src/githubcore.d.ts.map +1 -0
- package/dist/src/githubcore.js +20 -0
- package/dist/src/githubcore.js.map +1 -0
- package/dist/src/glob.d.ts +11 -0
- package/dist/src/glob.d.ts.map +1 -0
- package/dist/src/glob.js +69 -0
- package/dist/src/glob.js.map +1 -0
- package/dist/src/guards.d.ts +106 -0
- package/dist/src/guards.d.ts.map +1 -0
- package/dist/src/guards.js +365 -0
- package/dist/src/guards.js.map +1 -0
- package/dist/src/heartbeat.d.ts +29 -0
- package/dist/src/heartbeat.d.ts.map +1 -0
- package/dist/src/heartbeat.js +87 -0
- package/dist/src/heartbeat.js.map +1 -0
- package/dist/src/heuristics.d.ts +247 -0
- package/dist/src/heuristics.d.ts.map +1 -0
- package/dist/src/heuristics.js +927 -0
- package/dist/src/heuristics.js.map +1 -0
- package/dist/src/homes.d.ts +181 -0
- package/dist/src/homes.d.ts.map +1 -0
- package/dist/src/homes.js +242 -0
- package/dist/src/homes.js.map +1 -0
- package/dist/src/hunkheader.d.ts +11 -0
- package/dist/src/hunkheader.d.ts.map +1 -0
- package/dist/src/hunkheader.js +18 -0
- package/dist/src/hunkheader.js.map +1 -0
- package/dist/src/identity.d.ts +34 -0
- package/dist/src/identity.d.ts.map +1 -0
- package/dist/src/identity.js +67 -0
- package/dist/src/identity.js.map +1 -0
- package/dist/src/include.d.ts +435 -0
- package/dist/src/include.d.ts.map +1 -0
- package/dist/src/include.js +1692 -0
- package/dist/src/include.js.map +1 -0
- package/dist/src/launchvocab.d.ts +36 -0
- package/dist/src/launchvocab.d.ts.map +1 -0
- package/dist/src/launchvocab.js +59 -0
- package/dist/src/launchvocab.js.map +1 -0
- package/dist/src/ledgercarry.d.ts +24 -0
- package/dist/src/ledgercarry.d.ts.map +1 -0
- package/dist/src/ledgercarry.js +109 -0
- package/dist/src/ledgercarry.js.map +1 -0
- package/dist/src/lensids.d.ts +7 -0
- package/dist/src/lensids.d.ts.map +1 -0
- package/dist/src/lensids.js +53 -0
- package/dist/src/lensids.js.map +1 -0
- package/dist/src/lensplanning.d.ts +8 -0
- package/dist/src/lensplanning.d.ts.map +1 -0
- package/dist/src/lensplanning.js +126 -0
- package/dist/src/lensplanning.js.map +1 -0
- package/dist/src/lensresult.d.ts +94 -0
- package/dist/src/lensresult.d.ts.map +1 -0
- package/dist/src/lensresult.js +162 -0
- package/dist/src/lensresult.js.map +1 -0
- package/dist/src/lenstuning.d.ts +97 -0
- package/dist/src/lenstuning.d.ts.map +1 -0
- package/dist/src/lenstuning.js +326 -0
- package/dist/src/lenstuning.js.map +1 -0
- package/dist/src/lintconfig.d.ts +31 -0
- package/dist/src/lintconfig.d.ts.map +1 -0
- package/dist/src/lintconfig.js +543 -0
- package/dist/src/lintconfig.js.map +1 -0
- package/dist/src/live/events.d.ts +188 -0
- package/dist/src/live/events.d.ts.map +1 -0
- package/dist/src/live/events.js +136 -0
- package/dist/src/live/events.js.map +1 -0
- package/dist/src/live/writer.d.ts +54 -0
- package/dist/src/live/writer.d.ts.map +1 -0
- package/dist/src/live/writer.js +516 -0
- package/dist/src/live/writer.js.map +1 -0
- package/dist/src/localreview.d.ts +128 -0
- package/dist/src/localreview.d.ts.map +1 -0
- package/dist/src/localreview.js +426 -0
- package/dist/src/localreview.js.map +1 -0
- package/dist/src/loosenedtests.d.ts +13 -0
- package/dist/src/loosenedtests.d.ts.map +1 -0
- package/dist/src/loosenedtests.js +188 -0
- package/dist/src/loosenedtests.js.map +1 -0
- package/dist/src/memoryport.d.ts +264 -0
- package/dist/src/memoryport.d.ts.map +1 -0
- package/dist/src/memoryport.js +445 -0
- package/dist/src/memoryport.js.map +1 -0
- package/dist/src/migrations.d.ts +106 -0
- package/dist/src/migrations.d.ts.map +1 -0
- package/dist/src/migrations.js +373 -0
- package/dist/src/migrations.js.map +1 -0
- package/dist/src/modelroute.d.ts +38 -0
- package/dist/src/modelroute.d.ts.map +1 -0
- package/dist/src/modelroute.js +105 -0
- package/dist/src/modelroute.js.map +1 -0
- package/dist/src/oneshot.d.ts +12 -0
- package/dist/src/oneshot.d.ts.map +1 -0
- package/dist/src/oneshot.js +8 -0
- package/dist/src/oneshot.js.map +1 -0
- package/dist/src/packing.d.ts +11 -0
- package/dist/src/packing.d.ts.map +1 -0
- package/dist/src/packing.js +31 -0
- package/dist/src/packing.js.map +1 -0
- package/dist/src/passes.d.ts +16 -0
- package/dist/src/passes.d.ts.map +1 -0
- package/dist/src/passes.js +104 -0
- package/dist/src/passes.js.map +1 -0
- package/dist/src/passtasks.d.ts +68 -0
- package/dist/src/passtasks.d.ts.map +1 -0
- package/dist/src/passtasks.js +360 -0
- package/dist/src/passtasks.js.map +1 -0
- package/dist/src/pathinside.d.ts +5 -0
- package/dist/src/pathinside.d.ts.map +1 -0
- package/dist/src/pathinside.js +9 -0
- package/dist/src/pathinside.js.map +1 -0
- package/dist/src/pibuiltins.d.ts +36 -0
- package/dist/src/pibuiltins.d.ts.map +1 -0
- package/dist/src/pibuiltins.js +83 -0
- package/dist/src/pibuiltins.js.map +1 -0
- package/dist/src/plankey.d.ts +4 -0
- package/dist/src/plankey.d.ts.map +1 -0
- package/dist/src/plankey.js +10 -0
- package/dist/src/plankey.js.map +1 -0
- package/dist/src/planner.d.ts +375 -0
- package/dist/src/planner.d.ts.map +1 -0
- package/dist/src/planner.js +722 -0
- package/dist/src/planner.js.map +1 -0
- package/dist/src/plugin/args.d.ts +19 -0
- package/dist/src/plugin/args.d.ts.map +1 -0
- package/dist/src/plugin/args.js +107 -0
- package/dist/src/plugin/args.js.map +1 -0
- package/dist/src/plugin/index.d.ts +3 -0
- package/dist/src/plugin/index.d.ts.map +1 -0
- package/dist/src/plugin/index.js +14 -0
- package/dist/src/plugin/index.js.map +1 -0
- package/dist/src/plugin/login.d.ts +42 -0
- package/dist/src/plugin/login.d.ts.map +1 -0
- package/dist/src/plugin/login.js +82 -0
- package/dist/src/plugin/login.js.map +1 -0
- package/dist/src/plugin/review.d.ts +27 -0
- package/dist/src/plugin/review.d.ts.map +1 -0
- package/dist/src/plugin/review.js +302 -0
- package/dist/src/plugin/review.js.map +1 -0
- package/dist/src/plugin/runner.d.ts +6 -0
- package/dist/src/plugin/runner.d.ts.map +1 -0
- package/dist/src/plugin/runner.js +65 -0
- package/dist/src/plugin/runner.js.map +1 -0
- package/dist/src/plugin/scan.d.ts +79 -0
- package/dist/src/plugin/scan.d.ts.map +1 -0
- package/dist/src/plugin/scan.js +348 -0
- package/dist/src/plugin/scan.js.map +1 -0
- package/dist/src/plugin/session.d.ts +56 -0
- package/dist/src/plugin/session.d.ts.map +1 -0
- package/dist/src/plugin/session.js +2 -0
- package/dist/src/plugin/session.js.map +1 -0
- package/dist/src/plugin/setup.d.ts +19 -0
- package/dist/src/plugin/setup.d.ts.map +1 -0
- package/dist/src/plugin/setup.js +142 -0
- package/dist/src/plugin/setup.js.map +1 -0
- package/dist/src/plugin/versiongate.d.ts +26 -0
- package/dist/src/plugin/versiongate.d.ts.map +1 -0
- package/dist/src/plugin/versiongate.js +83 -0
- package/dist/src/plugin/versiongate.js.map +1 -0
- package/dist/src/postingkey.d.ts +8 -0
- package/dist/src/postingkey.d.ts.map +1 -0
- package/dist/src/postingkey.js +25 -0
- package/dist/src/postingkey.js.map +1 -0
- package/dist/src/postingpolicy.d.ts +108 -0
- package/dist/src/postingpolicy.d.ts.map +1 -0
- package/dist/src/postingpolicy.js +341 -0
- package/dist/src/postingpolicy.js.map +1 -0
- package/dist/src/pr-identity.d.ts +3 -0
- package/dist/src/pr-identity.d.ts.map +1 -0
- package/dist/src/pr-identity.js +9 -0
- package/dist/src/pr-identity.js.map +1 -0
- package/dist/src/prdelta.d.ts +181 -0
- package/dist/src/prdelta.d.ts.map +1 -0
- package/dist/src/prdelta.js +501 -0
- package/dist/src/prdelta.js.map +1 -0
- package/dist/src/pricing.d.ts +94 -0
- package/dist/src/pricing.d.ts.map +1 -0
- package/dist/src/pricing.js +209 -0
- package/dist/src/pricing.js.map +1 -0
- package/dist/src/priorfindings.d.ts +167 -0
- package/dist/src/priorfindings.d.ts.map +1 -0
- package/dist/src/priorfindings.js +445 -0
- package/dist/src/priorfindings.js.map +1 -0
- package/dist/src/priortasks.d.ts +31 -0
- package/dist/src/priortasks.d.ts.map +1 -0
- package/dist/src/priortasks.js +119 -0
- package/dist/src/priortasks.js.map +1 -0
- package/dist/src/profilelookup.d.ts +59 -0
- package/dist/src/profilelookup.d.ts.map +1 -0
- package/dist/src/profilelookup.js +98 -0
- package/dist/src/profilelookup.js.map +1 -0
- package/dist/src/profileoverrides.d.ts +91 -0
- package/dist/src/profileoverrides.d.ts.map +1 -0
- package/dist/src/profileoverrides.js +313 -0
- package/dist/src/profileoverrides.js.map +1 -0
- package/dist/src/profiles.d.ts +144 -0
- package/dist/src/profiles.d.ts.map +1 -0
- package/dist/src/profiles.js +604 -0
- package/dist/src/profiles.js.map +1 -0
- package/dist/src/promptdoc.d.ts +3 -0
- package/dist/src/promptdoc.d.ts.map +1 -0
- package/dist/src/promptdoc.js +18 -0
- package/dist/src/promptdoc.js.map +1 -0
- package/dist/src/prtarget.d.ts +70 -0
- package/dist/src/prtarget.d.ts.map +1 -0
- package/dist/src/prtarget.js +181 -0
- package/dist/src/prtarget.js.map +1 -0
- package/dist/src/recheckorder.d.ts +32 -0
- package/dist/src/recheckorder.d.ts.map +1 -0
- package/dist/src/recheckorder.js +5 -0
- package/dist/src/recheckorder.js.map +1 -0
- package/dist/src/reviewapi.d.ts +207 -0
- package/dist/src/reviewapi.d.ts.map +1 -0
- package/dist/src/reviewapi.js +939 -0
- package/dist/src/reviewapi.js.map +1 -0
- package/dist/src/reviewbotfindings.d.ts +33 -0
- package/dist/src/reviewbotfindings.d.ts.map +1 -0
- package/dist/src/reviewbotfindings.js +80 -0
- package/dist/src/reviewbotfindings.js.map +1 -0
- package/dist/src/reviewconfig.d.ts +753 -0
- package/dist/src/reviewconfig.d.ts.map +1 -0
- package/dist/src/reviewconfig.js +805 -0
- package/dist/src/reviewconfig.js.map +1 -0
- package/dist/src/reviewdelta.d.ts +51 -0
- package/dist/src/reviewdelta.d.ts.map +1 -0
- package/dist/src/reviewdelta.js +119 -0
- package/dist/src/reviewdelta.js.map +1 -0
- package/dist/src/reviewdest.d.ts +86 -0
- package/dist/src/reviewdest.d.ts.map +1 -0
- package/dist/src/reviewdest.js +142 -0
- package/dist/src/reviewdest.js.map +1 -0
- package/dist/src/reviewerstub.d.ts +12 -0
- package/dist/src/reviewerstub.d.ts.map +1 -0
- package/dist/src/reviewerstub.js +28 -0
- package/dist/src/reviewerstub.js.map +1 -0
- package/dist/src/reviewhost.d.ts +58 -0
- package/dist/src/reviewhost.d.ts.map +1 -0
- package/dist/src/reviewhost.js +135 -0
- package/dist/src/reviewhost.js.map +1 -0
- package/dist/src/reviewpost.d.ts +79 -0
- package/dist/src/reviewpost.d.ts.map +1 -0
- package/dist/src/reviewpost.js +233 -0
- package/dist/src/reviewpost.js.map +1 -0
- package/dist/src/reviewrender.d.ts +154 -0
- package/dist/src/reviewrender.d.ts.map +1 -0
- package/dist/src/reviewrender.js +480 -0
- package/dist/src/reviewrender.js.map +1 -0
- package/dist/src/reviewstate.d.ts +62 -0
- package/dist/src/reviewstate.d.ts.map +1 -0
- package/dist/src/reviewstate.js +167 -0
- package/dist/src/reviewstate.js.map +1 -0
- package/dist/src/reviewstore.d.ts +17 -0
- package/dist/src/reviewstore.d.ts.map +1 -0
- package/dist/src/reviewstore.js +105 -0
- package/dist/src/reviewstore.js.map +1 -0
- package/dist/src/round-progress.d.ts +120 -0
- package/dist/src/round-progress.d.ts.map +1 -0
- package/dist/src/round-progress.js +172 -0
- package/dist/src/round-progress.js.map +1 -0
- package/dist/src/round-stage-deadlines.d.ts +12 -0
- package/dist/src/round-stage-deadlines.d.ts.map +1 -0
- package/dist/src/round-stage-deadlines.js +10 -0
- package/dist/src/round-stage-deadlines.js.map +1 -0
- package/dist/src/session-command.d.ts +19 -0
- package/dist/src/session-command.d.ts.map +1 -0
- package/dist/src/session-command.js +20 -0
- package/dist/src/session-command.js.map +1 -0
- package/dist/src/settledread.d.ts +61 -0
- package/dist/src/settledread.d.ts.map +1 -0
- package/dist/src/settledread.js +135 -0
- package/dist/src/settledread.js.map +1 -0
- package/dist/src/severity.d.ts +167 -0
- package/dist/src/severity.d.ts.map +1 -0
- package/dist/src/severity.js +364 -0
- package/dist/src/severity.js.map +1 -0
- package/dist/src/severityrank.d.ts +8 -0
- package/dist/src/severityrank.d.ts.map +1 -0
- package/dist/src/severityrank.js +16 -0
- package/dist/src/severityrank.js.map +1 -0
- package/dist/src/standing-review.d.ts +45 -0
- package/dist/src/standing-review.d.ts.map +1 -0
- package/dist/src/standing-review.js +43 -0
- package/dist/src/standing-review.js.map +1 -0
- package/dist/src/storerows.d.ts +225 -0
- package/dist/src/storerows.d.ts.map +1 -0
- package/dist/src/storerows.js +7 -0
- package/dist/src/storerows.js.map +1 -0
- package/dist/src/styleguide.d.ts +25 -0
- package/dist/src/styleguide.d.ts.map +1 -0
- package/dist/src/styleguide.js +272 -0
- package/dist/src/styleguide.js.map +1 -0
- package/dist/src/sweepstatus.d.ts +42 -0
- package/dist/src/sweepstatus.d.ts.map +1 -0
- package/dist/src/sweepstatus.js +97 -0
- package/dist/src/sweepstatus.js.map +1 -0
- package/dist/src/templates.d.ts +243 -0
- package/dist/src/templates.d.ts.map +1 -0
- package/dist/src/templates.js +847 -0
- package/dist/src/templates.js.map +1 -0
- package/dist/src/types.d.ts +639 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +90 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/unifieddiff.d.ts +22 -0
- package/dist/src/unifieddiff.d.ts.map +1 -0
- package/dist/src/unifieddiff.js +176 -0
- package/dist/src/unifieddiff.js.map +1 -0
- package/dist/src/yieldloop.d.ts +2 -0
- package/dist/src/yieldloop.d.ts.map +1 -0
- package/dist/src/yieldloop.js +14 -0
- package/dist/src/yieldloop.js.map +1 -0
- package/package.json +60 -4
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import type { CredentialStore } from "@earendil-works/pi-ai";
|
|
2
|
+
/** What a copied OAuth credential carries instead of the real refresh token. */
|
|
3
|
+
export declare const DISABLED_REFRESH = "bench-refresh-disabled";
|
|
4
|
+
/** pi refreshes an OAuth token with less than this left (pi-ai auth/resolve.js
|
|
5
|
+
* DEFAULT_OAUTH_MINIMUM_VALIDITY_MS), so a run that ends inside it would ask a
|
|
6
|
+
* refresher it does not have. The engine's preflight keeps clear of it. */
|
|
7
|
+
export declare const PI_REFRESH_MARGIN_MS: number;
|
|
8
|
+
export type AuthErrorCode = "missing" | "expiring" | "refresh-refused" | "rejected";
|
|
9
|
+
/** Base of every auth failure the engine raises: `code` is what a caller
|
|
10
|
+
* branches on (authwatch's raise, a route's exit status), the message is for a
|
|
11
|
+
* person. */
|
|
12
|
+
export declare class AuthError extends Error {
|
|
13
|
+
readonly code: AuthErrorCode;
|
|
14
|
+
constructor(code: AuthErrorCode, message: string);
|
|
15
|
+
}
|
|
16
|
+
/** The login was refused before work started: no login (`code` "missing"), or a
|
|
17
|
+
* token that would expire inside the work window ("expiring"). */
|
|
18
|
+
export declare class AuthExpiring extends AuthError {
|
|
19
|
+
readonly provider: string | null;
|
|
20
|
+
readonly expiresAt: number | null;
|
|
21
|
+
constructor(message: string, detail?: {
|
|
22
|
+
code?: "missing" | "expiring";
|
|
23
|
+
provider?: string | null;
|
|
24
|
+
expiresAt?: number | null;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/** Something asked the borrowed login to change. It never may: only the
|
|
28
|
+
* owner's pi `/login` refreshes. */
|
|
29
|
+
export declare class AuthRefreshRefused extends AuthError {
|
|
30
|
+
constructor(operation: string, providerId: string);
|
|
31
|
+
}
|
|
32
|
+
/** A provider rejected the token mid-run (the signature authwatch watches for).
|
|
33
|
+
* `message` is the provider's own text. */
|
|
34
|
+
export declare class AuthRejected extends AuthError {
|
|
35
|
+
constructor(message: string);
|
|
36
|
+
}
|
|
37
|
+
/** The typed error for a provider's failure text, or undefined when the text is
|
|
38
|
+
* not an auth failure. One signature, shared with authwatch (PI_AUTH_ERROR_RE). */
|
|
39
|
+
export declare function classifyAuthFailure(message: string): AuthRejected | undefined;
|
|
40
|
+
/** How a borrower waits out a file it cannot parse. */
|
|
41
|
+
export interface ReadRetry {
|
|
42
|
+
tries?: number;
|
|
43
|
+
delayMs?: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The owner's `auth.json` as text that parses, taking no lock. Every write by
|
|
47
|
+
* the refresher is an atomic rename (src/loginrefresh/atomic.ts), so a borrower
|
|
48
|
+
* reads the old file or the new one, whole. The one file that may not parse is
|
|
49
|
+
* one a login is rewriting in place (the pi `/login` under the entrypoint's
|
|
50
|
+
* login mode, which the refresher pauses for): that read is retried, a few
|
|
51
|
+
* times, and then fails with the parse error.
|
|
52
|
+
*/
|
|
53
|
+
export declare function readOwnerAuth(src: string, retry?: ReadRetry): string;
|
|
54
|
+
/**
|
|
55
|
+
* The sandbox copy of a pi `auth.json`, as text: every OAuth entry's refresh
|
|
56
|
+
* token replaced, everything else kept. Returns the earliest OAuth expiry, and
|
|
57
|
+
* the provider it belongs to, so the caller can refuse work that would outlive it.
|
|
58
|
+
*/
|
|
59
|
+
export declare function authCopyFrom(raw: string,
|
|
60
|
+
/** Keep only these providers' entries: the copy, and its expiry check,
|
|
61
|
+
* then cover exactly what the run uses. Omitted: every entry. */
|
|
62
|
+
providers?: readonly string[]): {
|
|
63
|
+
json: string;
|
|
64
|
+
expiresAt: number | null;
|
|
65
|
+
provider: string | null;
|
|
66
|
+
};
|
|
67
|
+
/** A login's providers, each with its credential type and (OAuth) expiry —
|
|
68
|
+
* never a token. */
|
|
69
|
+
export type LoginSummary = Record<string, {
|
|
70
|
+
type: string;
|
|
71
|
+
expires: number | null;
|
|
72
|
+
}>;
|
|
73
|
+
export declare function loginSummary(raw: string): LoginSummary;
|
|
74
|
+
/** The words a refusal is made of — each borrower names its own fix. */
|
|
75
|
+
export interface AuthCopyWords {
|
|
76
|
+
/** No `auth.json` at `src`. */
|
|
77
|
+
missing: (src: string) => string;
|
|
78
|
+
/** The earliest OAuth token (`provider`'s) expires at `expiresAt`, inside `needMs`. */
|
|
79
|
+
expiring: (o: {
|
|
80
|
+
provider: string | null;
|
|
81
|
+
expiresAt: number;
|
|
82
|
+
needMs: number;
|
|
83
|
+
}) => string;
|
|
84
|
+
}
|
|
85
|
+
/** The engine host's own refusals. */
|
|
86
|
+
export declare const ENGINE_AUTH_WORDS: AuthCopyWords;
|
|
87
|
+
/** The benchmark's refusals: its fixes are the login volume and the key route. */
|
|
88
|
+
export declare const BENCH_AUTH_WORDS: AuthCopyWords;
|
|
89
|
+
/**
|
|
90
|
+
* The preflight: throw `AuthExpiring` when the earliest OAuth token expires
|
|
91
|
+
* inside `needMs` (plus `marginMs`, the stretch at the end of its life in which
|
|
92
|
+
* pi would try to refresh it). A login with no OAuth entry never expires.
|
|
93
|
+
*/
|
|
94
|
+
export declare function checkAuth(copy: {
|
|
95
|
+
expiresAt: number | null;
|
|
96
|
+
provider: string | null;
|
|
97
|
+
}, o: {
|
|
98
|
+
needMs: number;
|
|
99
|
+
now?: () => number;
|
|
100
|
+
marginMs?: number;
|
|
101
|
+
words?: AuthCopyWords;
|
|
102
|
+
}): void;
|
|
103
|
+
/** The store for the headless key route: no login at all, nothing to refresh,
|
|
104
|
+
* nothing written (pi would otherwise create an empty `auth.json` in the agent
|
|
105
|
+
* dir). Keys arrive through `setRuntimeApiKey`, into the runtime's memory. */
|
|
106
|
+
export declare function keyOnlyCredentials(): CredentialStore;
|
|
107
|
+
/** The owner's login, read once from `srcDir/auth.json`, blanked and checked. */
|
|
108
|
+
export interface EngineAuth {
|
|
109
|
+
/** The credential store for `PiHostOptions.credentials`. */
|
|
110
|
+
credentials: CredentialStore;
|
|
111
|
+
/** The earliest OAuth expiry, or null when the login has no OAuth entry. */
|
|
112
|
+
expiresAt: number | null;
|
|
113
|
+
provider: string | null;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Build the engine's credentials from the owner's agent dir `srcDir` (read
|
|
117
|
+
* only: nothing is written there or anywhere). Throws `AuthExpiring` — before
|
|
118
|
+
* any session exists — when there is no login, or when its earliest OAuth token
|
|
119
|
+
* would expire inside the run window `needMs`.
|
|
120
|
+
*/
|
|
121
|
+
export declare function engineCredentials(o: {
|
|
122
|
+
srcDir: string;
|
|
123
|
+
needMs: number;
|
|
124
|
+
now?: () => number;
|
|
125
|
+
words?: AuthCopyWords;
|
|
126
|
+
/** The refusal margin on top of `needMs`; default pi's refresh margin. */
|
|
127
|
+
marginMs?: number;
|
|
128
|
+
}): EngineAuth;
|
|
129
|
+
/**
|
|
130
|
+
* Write the refresh-disabled copy of `srcDir/auth.json` to `dstDir/auth.json`
|
|
131
|
+
* (0600, written aside and renamed into place). Throws `AuthExpiring` — and
|
|
132
|
+
* writes nothing — when there is no login, or when its earliest OAuth token
|
|
133
|
+
* expires inside `needMs`.
|
|
134
|
+
*
|
|
135
|
+
* This is the sandbox copy a pi CHILD reads; it keeps the sandboxes' original
|
|
136
|
+
* admission rule (no refresh margin). The in-process route's `engineCredentials`
|
|
137
|
+
* adds pi's five-minute refresh margin.
|
|
138
|
+
*/
|
|
139
|
+
export declare function copyPiAuth(o: {
|
|
140
|
+
srcDir: string;
|
|
141
|
+
dstDir: string;
|
|
142
|
+
needMs: number;
|
|
143
|
+
now?: () => number;
|
|
144
|
+
words: AuthCopyWords;
|
|
145
|
+
/** Copy (and check) only these providers' logins; omitted: all of them. */
|
|
146
|
+
providers?: readonly string[];
|
|
147
|
+
}): {
|
|
148
|
+
expiresAt: number | null;
|
|
149
|
+
};
|
|
150
|
+
/** What `setRuntimeApiKey` needs of pi's ModelRuntime, by shape: this module
|
|
151
|
+
* stays outside the SDK (tests/fences-engine S2). */
|
|
152
|
+
export interface RuntimeKeyTarget {
|
|
153
|
+
setRuntimeApiKey(providerId: string, apiKey: string): Promise<void>;
|
|
154
|
+
}
|
|
155
|
+
/** The key variable each provider's headless route reads (bench, the Action). */
|
|
156
|
+
export declare const RUNTIME_KEY_ENVS: Readonly<Record<string, string>>;
|
|
157
|
+
/** Give the runtime an API key for `providerId`, in memory only: pi's runtime
|
|
158
|
+
* overlay never persists it, and no login is read or written. */
|
|
159
|
+
export declare function setRuntimeApiKey(runtime: RuntimeKeyTarget, providerId: string, apiKey: string): Promise<void>;
|
|
160
|
+
/** `setRuntimeApiKey` for every provider whose key variable is set in `env`
|
|
161
|
+
* (default: `providers`' table). Returns the providers it keyed. */
|
|
162
|
+
export declare function applyEnvApiKeys(runtime: RuntimeKeyTarget, env: NodeJS.ProcessEnv, providers?: readonly string[]): Promise<string[]>;
|
|
163
|
+
/** The scan engine's case runner (src/setup/engine.ts `CaseRunner`), by
|
|
164
|
+
* shape: this module stays outside src/setup/. */
|
|
165
|
+
export interface CaseRunnerOf<S, O> {
|
|
166
|
+
run(spec: S, signal: AbortSignal, onCost?: (spentSoFar: number) => void): Promise<O>;
|
|
167
|
+
}
|
|
168
|
+
/** A case the copy refused: it never started, so it spent nothing. */
|
|
169
|
+
export type CaseRefused = {
|
|
170
|
+
ok: false;
|
|
171
|
+
reason: string;
|
|
172
|
+
cost_usd: number;
|
|
173
|
+
};
|
|
174
|
+
/** Set in the scan container: where the companion's agent dir is mounted
|
|
175
|
+
* read-only. Its presence is what makes the driver copy before each case. */
|
|
176
|
+
export declare const SCAN_AUTH_SRC_ENV = "QCR_SCAN_AUTH_SRC";
|
|
177
|
+
/** The time a scan case may take, which the access token must outlive. */
|
|
178
|
+
export declare const SCAN_CASE_AUTH_BUDGET_MS: number;
|
|
179
|
+
/** The way out of a refused copy: the companion refreshes its own login. */
|
|
180
|
+
export declare const SCAN_AUTH_FIX = "open the companion so its pi refreshes the login (or run `qcr scan login`), then start the scan again";
|
|
181
|
+
export declare function scanAuthMissing(src: string): string;
|
|
182
|
+
export declare function scanAuthExpiring(o: {
|
|
183
|
+
provider: string | null;
|
|
184
|
+
expiresAt: number;
|
|
185
|
+
needMs: number;
|
|
186
|
+
}): string;
|
|
187
|
+
/** Copy the companion's login from `srcDir` into the scan's agent dir
|
|
188
|
+
* `dstDir`, refresh-disabled. Throws `AuthExpiring` when there is none, or
|
|
189
|
+
* when its token would expire inside `needMs`. */
|
|
190
|
+
export declare function syncScanAuth(o: {
|
|
191
|
+
srcDir: string;
|
|
192
|
+
dstDir: string;
|
|
193
|
+
needMs: number;
|
|
194
|
+
now?: () => number;
|
|
195
|
+
}): {
|
|
196
|
+
expiresAt: number | null;
|
|
197
|
+
};
|
|
198
|
+
/** A case runner over the borrowed login: before each case, the copy is
|
|
199
|
+
* re-taken from the live source. A refused copy never starts the case — it
|
|
200
|
+
* fails with the refusal and `onExpired` hears it, so the run can stop. */
|
|
201
|
+
export declare function scanAuthCases<S, O>(inner: CaseRunnerOf<S, O>, o: {
|
|
202
|
+
srcDir: string;
|
|
203
|
+
dstDir: string;
|
|
204
|
+
needMs: number;
|
|
205
|
+
now?: () => number;
|
|
206
|
+
onExpired: (reason: string) => void;
|
|
207
|
+
}): CaseRunnerOf<S, O | CaseRefused>;
|
|
208
|
+
/** The driver's case runner: over the borrowed login in the scan container
|
|
209
|
+
* (its env names the read-only source), the plain runner anywhere else —
|
|
210
|
+
* `sandbox = "host"` runs on the host pi's own login. `homeDir` is the user's
|
|
211
|
+
* home as the host resolved it, for an env that names neither the agent dir
|
|
212
|
+
* nor HOME. */
|
|
213
|
+
export declare function scanCasesForEnv<S, O>(inner: CaseRunnerOf<S, O>, env: NodeJS.ProcessEnv, onExpired: (reason: string) => void, homeDir?: string): CaseRunnerOf<S, O | CaseRefused>;
|
|
214
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/engine/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
// The engine's model credentials: one module for every way a headless host gets
|
|
2
|
+
// a pi login it must never refresh.
|
|
3
|
+
//
|
|
4
|
+
// A pi login (its `auth.json`) has one owner: the pi home that ran `/login` and
|
|
5
|
+
// keeps refreshing it. Everything else borrows. An engine host, the benchmark
|
|
6
|
+
// sandbox and the scan sandbox read the owner's login READ-ONLY and run on a
|
|
7
|
+
// copy in which every OAuth entry's refresh token is replaced by a value no
|
|
8
|
+
// OAuth server accepts. A borrower therefore never refreshes, so it can never
|
|
9
|
+
// rotate (and invalidate) the owner's grant, and never writes a file the owner
|
|
10
|
+
// reads. Its price: it cannot outlive the access token, so the login is refused
|
|
11
|
+
// before work starts when the token would expire inside the work window.
|
|
12
|
+
//
|
|
13
|
+
// One exception, the VM's: after the cutover no pi session lives long enough to
|
|
14
|
+
// refresh the bot's login, so ONE locked refresher in the bot container
|
|
15
|
+
// (src/loginrefresh/, spawned and supervised by the daemon by path) is its
|
|
16
|
+
// owner. It holds an exclusive flock on pihome/agent/auth.json.lock for its whole
|
|
17
|
+
// life, refreshes through pi-ai's own OAuth refresh and writes auth.json
|
|
18
|
+
// atomically. Workers, takeover and debug pi are borrowers like any other: they
|
|
19
|
+
// copy the file at spawn, blank, and take no lock. Everywhere else the login-refresh rule is as
|
|
20
|
+
// above.
|
|
21
|
+
//
|
|
22
|
+
// Three ways in, one module:
|
|
23
|
+
// - `engineCredentials` / `loadAuth`: the in-process route. The copy lives in
|
|
24
|
+
// memory as a CredentialStore for PiHost (packages/pi-plugin/src/engine/pisdk.ts); no file is
|
|
25
|
+
// written, and its `modify` is never reached (a refresh is the only caller
|
|
26
|
+
// on this route, and the copy cannot make one succeed).
|
|
27
|
+
// - `copyPiAuth`: the process route. The same copy, written 0600 into a
|
|
28
|
+
// sandbox's own agent dir for a pi child (bench, scan).
|
|
29
|
+
// - `setRuntimeApiKey` / `applyEnvApiKeys`: the headless key route (bench,
|
|
30
|
+
// the Action). No login is read at all; the key lives in the runtime only.
|
|
31
|
+
//
|
|
32
|
+
// The scan sandbox's wiring (it mounts the companion's agent dir read-only and
|
|
33
|
+
// re-takes the copy before every case) is here too: it is this module's copy
|
|
34
|
+
// with the scan's words and budget.
|
|
35
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
36
|
+
import { join } from "node:path";
|
|
37
|
+
import { PI_AUTH_ERROR_RE } from "../authwatch.js";
|
|
38
|
+
import { CASE_STOP_GRACE_MS } from "../casebudget.js";
|
|
39
|
+
/** What a copied OAuth credential carries instead of the real refresh token. */
|
|
40
|
+
export const DISABLED_REFRESH = "bench-refresh-disabled";
|
|
41
|
+
/** pi refreshes an OAuth token with less than this left (pi-ai auth/resolve.js
|
|
42
|
+
* DEFAULT_OAUTH_MINIMUM_VALIDITY_MS), so a run that ends inside it would ask a
|
|
43
|
+
* refresher it does not have. The engine's preflight keeps clear of it. */
|
|
44
|
+
export const PI_REFRESH_MARGIN_MS = 5 * 60_000;
|
|
45
|
+
/** Base of every auth failure the engine raises: `code` is what a caller
|
|
46
|
+
* branches on (authwatch's raise, a route's exit status), the message is for a
|
|
47
|
+
* person. */
|
|
48
|
+
export class AuthError extends Error {
|
|
49
|
+
code;
|
|
50
|
+
constructor(code, message) {
|
|
51
|
+
super(message);
|
|
52
|
+
this.name = new.target.name;
|
|
53
|
+
this.code = code;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** The login was refused before work started: no login (`code` "missing"), or a
|
|
57
|
+
* token that would expire inside the work window ("expiring"). */
|
|
58
|
+
export class AuthExpiring extends AuthError {
|
|
59
|
+
provider;
|
|
60
|
+
expiresAt;
|
|
61
|
+
constructor(message, detail = {}) {
|
|
62
|
+
super(detail.code ?? "expiring", message);
|
|
63
|
+
this.provider = detail.provider ?? null;
|
|
64
|
+
this.expiresAt = detail.expiresAt ?? null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Something asked the borrowed login to change. It never may: only the
|
|
68
|
+
* owner's pi `/login` refreshes. */
|
|
69
|
+
export class AuthRefreshRefused extends AuthError {
|
|
70
|
+
constructor(operation, providerId) {
|
|
71
|
+
super("refresh-refused", `refusing to ${operation} the ${providerId} login: this host holds a read-only copy, and only the owner's pi /login refreshes`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** A provider rejected the token mid-run (the signature authwatch watches for).
|
|
75
|
+
* `message` is the provider's own text. */
|
|
76
|
+
export class AuthRejected extends AuthError {
|
|
77
|
+
constructor(message) {
|
|
78
|
+
super("rejected", message);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** The typed error for a provider's failure text, or undefined when the text is
|
|
82
|
+
* not an auth failure. One signature, shared with authwatch (PI_AUTH_ERROR_RE). */
|
|
83
|
+
export function classifyAuthFailure(message) {
|
|
84
|
+
return PI_AUTH_ERROR_RE.test(message) ? new AuthRejected(message) : undefined;
|
|
85
|
+
}
|
|
86
|
+
/** Block this thread for `ms` (a borrower's copy is synchronous). */
|
|
87
|
+
function sleepSync(ms) {
|
|
88
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The owner's `auth.json` as text that parses, taking no lock. Every write by
|
|
92
|
+
* the refresher is an atomic rename (src/loginrefresh/atomic.ts), so a borrower
|
|
93
|
+
* reads the old file or the new one, whole. The one file that may not parse is
|
|
94
|
+
* one a login is rewriting in place (the pi `/login` under the entrypoint's
|
|
95
|
+
* login mode, which the refresher pauses for): that read is retried, a few
|
|
96
|
+
* times, and then fails with the parse error.
|
|
97
|
+
*/
|
|
98
|
+
export function readOwnerAuth(src, retry = {}) {
|
|
99
|
+
const tries = retry.tries ?? 5;
|
|
100
|
+
const delayMs = retry.delayMs ?? 200;
|
|
101
|
+
for (let attempt = 1;; attempt++) {
|
|
102
|
+
const raw = readFileSync(src, "utf8");
|
|
103
|
+
try {
|
|
104
|
+
JSON.parse(raw);
|
|
105
|
+
return raw;
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
if (attempt >= tries)
|
|
109
|
+
throw err;
|
|
110
|
+
sleepSync(delayMs);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** `parsed` with every OAuth entry's refresh token replaced (not deleted — pi's
|
|
115
|
+
* credential guard expects the field to be a string), everything else kept, and
|
|
116
|
+
* the earliest OAuth expiry with the provider it belongs to. Mutates `parsed`. */
|
|
117
|
+
function blankRefresh(parsed) {
|
|
118
|
+
let expiresAt = null;
|
|
119
|
+
let provider = null;
|
|
120
|
+
for (const [name, v] of Object.entries(parsed)) {
|
|
121
|
+
if (typeof v !== "object" || v === null)
|
|
122
|
+
continue;
|
|
123
|
+
const cred = v;
|
|
124
|
+
if (cred["type"] !== "oauth")
|
|
125
|
+
continue;
|
|
126
|
+
cred["refresh"] = DISABLED_REFRESH;
|
|
127
|
+
const exp = cred["expires"];
|
|
128
|
+
if (typeof exp === "number" && (expiresAt === null || exp < expiresAt)) {
|
|
129
|
+
expiresAt = exp;
|
|
130
|
+
provider = name;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return { expiresAt, provider };
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* The sandbox copy of a pi `auth.json`, as text: every OAuth entry's refresh
|
|
137
|
+
* token replaced, everything else kept. Returns the earliest OAuth expiry, and
|
|
138
|
+
* the provider it belongs to, so the caller can refuse work that would outlive it.
|
|
139
|
+
*/
|
|
140
|
+
export function authCopyFrom(raw,
|
|
141
|
+
/** Keep only these providers' entries: the copy, and its expiry check,
|
|
142
|
+
* then cover exactly what the run uses. Omitted: every entry. */
|
|
143
|
+
providers) {
|
|
144
|
+
const all = JSON.parse(raw);
|
|
145
|
+
const parsed = providers === undefined
|
|
146
|
+
? all
|
|
147
|
+
: Object.fromEntries(Object.entries(all).filter(([name]) => providers.includes(name)));
|
|
148
|
+
const { expiresAt, provider } = blankRefresh(parsed);
|
|
149
|
+
return { json: JSON.stringify(parsed, null, 2) + "\n", expiresAt, provider };
|
|
150
|
+
}
|
|
151
|
+
export function loginSummary(raw) {
|
|
152
|
+
const parsed = JSON.parse(raw);
|
|
153
|
+
const out = {};
|
|
154
|
+
for (const [name, v] of Object.entries(parsed)) {
|
|
155
|
+
if (typeof v !== "object" || v === null)
|
|
156
|
+
continue;
|
|
157
|
+
const cred = v;
|
|
158
|
+
out[name] = {
|
|
159
|
+
type: typeof cred["type"] === "string" ? cred["type"] : "unknown",
|
|
160
|
+
expires: typeof cred["expires"] === "number" ? cred["expires"] : null,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
/** The engine host's own refusals. */
|
|
166
|
+
export const ENGINE_AUTH_WORDS = {
|
|
167
|
+
missing: (src) => `no pi login at ${src} — run pi's /login as the owner, then start again`,
|
|
168
|
+
expiring: ({ provider, expiresAt, needMs }) => `the ${provider ?? "pi"} access token expires at ${new Date(expiresAt).toISOString()}, inside this run's ${Math.round(needMs / 60_000)}-minute window. ` +
|
|
169
|
+
"An engine host never refreshes it (a second refresher would invalidate the owner's grant) — run pi's /login as the owner, then start again.",
|
|
170
|
+
};
|
|
171
|
+
/** The benchmark's refusals: its fixes are the login volume and the key route. */
|
|
172
|
+
export const BENCH_AUTH_WORDS = {
|
|
173
|
+
missing: (src) => `no pi login at ${src} — log pi in on the auth volume first (/login), or use your own API key: QCR_BENCH_AUTH=api-key (bench/aacr/README.md "Reproduce")`,
|
|
174
|
+
expiring: ({ expiresAt, needMs }) => `the shared Codex access token expires at ${new Date(expiresAt).toISOString()}, inside this case's ${Math.round(needMs / 60_000)}-minute budget. ` +
|
|
175
|
+
"The benchmark never refreshes it (that would invalidate the login's own grant). Use pi on that login volume once so it refreshes its own login, then re-run with --resume — or run on your own API key (QCR_BENCH_AUTH=api-key).",
|
|
176
|
+
};
|
|
177
|
+
/**
|
|
178
|
+
* The preflight: throw `AuthExpiring` when the earliest OAuth token expires
|
|
179
|
+
* inside `needMs` (plus `marginMs`, the stretch at the end of its life in which
|
|
180
|
+
* pi would try to refresh it). A login with no OAuth entry never expires.
|
|
181
|
+
*/
|
|
182
|
+
export function checkAuth(copy, o) {
|
|
183
|
+
if (copy.expiresAt === null)
|
|
184
|
+
return;
|
|
185
|
+
const now = (o.now ?? Date.now)();
|
|
186
|
+
if (copy.expiresAt >= now + o.needMs + (o.marginMs ?? PI_REFRESH_MARGIN_MS))
|
|
187
|
+
return;
|
|
188
|
+
const words = (o.words ?? ENGINE_AUTH_WORDS).expiring({
|
|
189
|
+
provider: copy.provider,
|
|
190
|
+
expiresAt: copy.expiresAt,
|
|
191
|
+
needMs: o.needMs,
|
|
192
|
+
});
|
|
193
|
+
throw new AuthExpiring(words, {
|
|
194
|
+
code: "expiring",
|
|
195
|
+
provider: copy.provider,
|
|
196
|
+
expiresAt: copy.expiresAt,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
// ---- the in-process route -------------------------------------------------------
|
|
200
|
+
/** A CredentialStore that serves a frozen copy and refuses every change. pi
|
|
201
|
+
* writes to a store only to refresh, log in or log out (pi-ai auth/resolve.js,
|
|
202
|
+
* models.js), and none of those is this host's to do: a call is a bug, so it
|
|
203
|
+
* throws, loudly and typed, instead of persisting anything. */
|
|
204
|
+
class ReadOnlyCredentials {
|
|
205
|
+
data;
|
|
206
|
+
constructor(data) {
|
|
207
|
+
this.data = new Map(Object.entries(data)
|
|
208
|
+
.filter(([, v]) => typeof v === "object" && v !== null)
|
|
209
|
+
.map(([name, v]) => [name, v]));
|
|
210
|
+
}
|
|
211
|
+
async read(providerId, options) {
|
|
212
|
+
options?.signal?.throwIfAborted();
|
|
213
|
+
const cred = this.data.get(providerId);
|
|
214
|
+
return cred ? structuredClone(cred) : undefined;
|
|
215
|
+
}
|
|
216
|
+
async list(options) {
|
|
217
|
+
options?.signal?.throwIfAborted();
|
|
218
|
+
return [...this.data].map(([providerId, c]) => ({ providerId, type: c.type }));
|
|
219
|
+
}
|
|
220
|
+
async modify(providerId) {
|
|
221
|
+
throw new AuthRefreshRefused("modify", providerId);
|
|
222
|
+
}
|
|
223
|
+
async delete(providerId) {
|
|
224
|
+
throw new AuthRefreshRefused("delete", providerId);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/** The store for the headless key route: no login at all, nothing to refresh,
|
|
228
|
+
* nothing written (pi would otherwise create an empty `auth.json` in the agent
|
|
229
|
+
* dir). Keys arrive through `setRuntimeApiKey`, into the runtime's memory. */
|
|
230
|
+
export function keyOnlyCredentials() {
|
|
231
|
+
return new ReadOnlyCredentials({});
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Build the engine's credentials from the owner's agent dir `srcDir` (read
|
|
235
|
+
* only: nothing is written there or anywhere). Throws `AuthExpiring` — before
|
|
236
|
+
* any session exists — when there is no login, or when its earliest OAuth token
|
|
237
|
+
* would expire inside the run window `needMs`.
|
|
238
|
+
*/
|
|
239
|
+
export function engineCredentials(o) {
|
|
240
|
+
const src = join(o.srcDir, "auth.json");
|
|
241
|
+
const words = o.words ?? ENGINE_AUTH_WORDS;
|
|
242
|
+
if (!existsSync(src))
|
|
243
|
+
throw new AuthExpiring(words.missing(src), { code: "missing" });
|
|
244
|
+
const parsed = JSON.parse(readOwnerAuth(src));
|
|
245
|
+
const { expiresAt, provider } = blankRefresh(parsed);
|
|
246
|
+
checkAuth({ expiresAt, provider }, { ...o, words });
|
|
247
|
+
return { credentials: new ReadOnlyCredentials(parsed), expiresAt, provider };
|
|
248
|
+
}
|
|
249
|
+
// ---- the process route ----------------------------------------------------------
|
|
250
|
+
/**
|
|
251
|
+
* Write the refresh-disabled copy of `srcDir/auth.json` to `dstDir/auth.json`
|
|
252
|
+
* (0600, written aside and renamed into place). Throws `AuthExpiring` — and
|
|
253
|
+
* writes nothing — when there is no login, or when its earliest OAuth token
|
|
254
|
+
* expires inside `needMs`.
|
|
255
|
+
*
|
|
256
|
+
* This is the sandbox copy a pi CHILD reads; it keeps the sandboxes' original
|
|
257
|
+
* admission rule (no refresh margin). The in-process route's `engineCredentials`
|
|
258
|
+
* adds pi's five-minute refresh margin.
|
|
259
|
+
*/
|
|
260
|
+
export function copyPiAuth(o) {
|
|
261
|
+
const src = join(o.srcDir, "auth.json");
|
|
262
|
+
if (!existsSync(src))
|
|
263
|
+
throw new AuthExpiring(o.words.missing(src), { code: "missing" });
|
|
264
|
+
const { json, expiresAt, provider } = authCopyFrom(readOwnerAuth(src), o.providers);
|
|
265
|
+
checkAuth({ expiresAt, provider }, { needMs: o.needMs, marginMs: 0, words: o.words, ...(o.now ? { now: o.now } : {}) });
|
|
266
|
+
mkdirSync(o.dstDir, { recursive: true, mode: 0o700 });
|
|
267
|
+
const tmp = join(o.dstDir, "auth.json.tmp");
|
|
268
|
+
writeFileSync(tmp, json, { mode: 0o600 });
|
|
269
|
+
renameSync(tmp, join(o.dstDir, "auth.json"));
|
|
270
|
+
chmodSync(join(o.dstDir, "auth.json"), 0o600);
|
|
271
|
+
return { expiresAt };
|
|
272
|
+
}
|
|
273
|
+
/** The key variable each provider's headless route reads (bench, the Action). */
|
|
274
|
+
export const RUNTIME_KEY_ENVS = {
|
|
275
|
+
openai: "OPENAI_API_KEY",
|
|
276
|
+
anthropic: "ANTHROPIC_API_KEY",
|
|
277
|
+
google: "GEMINI_API_KEY",
|
|
278
|
+
digitalocean: "DIGITALOCEAN_API_KEY",
|
|
279
|
+
};
|
|
280
|
+
/** Give the runtime an API key for `providerId`, in memory only: pi's runtime
|
|
281
|
+
* overlay never persists it, and no login is read or written. */
|
|
282
|
+
export async function setRuntimeApiKey(runtime, providerId, apiKey) {
|
|
283
|
+
if (apiKey.trim() === "")
|
|
284
|
+
throw new Error(`an empty API key for ${providerId}`);
|
|
285
|
+
await runtime.setRuntimeApiKey(providerId, apiKey);
|
|
286
|
+
}
|
|
287
|
+
/** `setRuntimeApiKey` for every provider whose key variable is set in `env`
|
|
288
|
+
* (default: `providers`' table). Returns the providers it keyed. */
|
|
289
|
+
export async function applyEnvApiKeys(runtime, env, providers = Object.keys(RUNTIME_KEY_ENVS)) {
|
|
290
|
+
const keyed = [];
|
|
291
|
+
for (const providerId of providers) {
|
|
292
|
+
const name = RUNTIME_KEY_ENVS[providerId];
|
|
293
|
+
const value = name ? env[name] : undefined;
|
|
294
|
+
if (!value || value.trim() === "")
|
|
295
|
+
continue;
|
|
296
|
+
await setRuntimeApiKey(runtime, providerId, value);
|
|
297
|
+
keyed.push(providerId);
|
|
298
|
+
}
|
|
299
|
+
return keyed;
|
|
300
|
+
}
|
|
301
|
+
/** Set in the scan container: where the companion's agent dir is mounted
|
|
302
|
+
* read-only. Its presence is what makes the driver copy before each case. */
|
|
303
|
+
export const SCAN_AUTH_SRC_ENV = "QCR_SCAN_AUTH_SRC";
|
|
304
|
+
/** The time a scan case may take, which the access token must outlive. */
|
|
305
|
+
export const SCAN_CASE_AUTH_BUDGET_MS = 30 * 60_000;
|
|
306
|
+
/** The way out of a refused copy: the companion refreshes its own login. */
|
|
307
|
+
export const SCAN_AUTH_FIX = "open the companion so its pi refreshes the login (or run `qcr scan login`), then start the scan again";
|
|
308
|
+
export function scanAuthMissing(src) {
|
|
309
|
+
return `no pi login in the companion's pi home (${src}) — run \`qcr scan login\` to log the companion's pi in`;
|
|
310
|
+
}
|
|
311
|
+
export function scanAuthExpiring(o) {
|
|
312
|
+
return (`the companion's ${o.provider ?? "pi"} access token expires at ${new Date(o.expiresAt).toISOString()}, inside a scan case's ${Math.round(o.needMs / 60_000)}-minute budget. ` +
|
|
313
|
+
"A scan never refreshes it (a second refresher would invalidate the companion's own grant) — " +
|
|
314
|
+
`${SCAN_AUTH_FIX}.`);
|
|
315
|
+
}
|
|
316
|
+
const SCAN_AUTH_WORDS = { missing: scanAuthMissing, expiring: scanAuthExpiring };
|
|
317
|
+
/** Copy the companion's login from `srcDir` into the scan's agent dir
|
|
318
|
+
* `dstDir`, refresh-disabled. Throws `AuthExpiring` when there is none, or
|
|
319
|
+
* when its token would expire inside `needMs`. */
|
|
320
|
+
export function syncScanAuth(o) {
|
|
321
|
+
return copyPiAuth({ ...o, words: SCAN_AUTH_WORDS });
|
|
322
|
+
}
|
|
323
|
+
/** A case runner over the borrowed login: before each case, the copy is
|
|
324
|
+
* re-taken from the live source. A refused copy never starts the case — it
|
|
325
|
+
* fails with the refusal and `onExpired` hears it, so the run can stop. */
|
|
326
|
+
export function scanAuthCases(inner, o) {
|
|
327
|
+
return {
|
|
328
|
+
run: async (spec, signal, onCost) => {
|
|
329
|
+
try {
|
|
330
|
+
syncScanAuth(o);
|
|
331
|
+
}
|
|
332
|
+
catch (err) {
|
|
333
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
334
|
+
if (!(err instanceof AuthExpiring)) {
|
|
335
|
+
return { ok: false, reason: `the login copy failed: ${reason}`, cost_usd: 0 };
|
|
336
|
+
}
|
|
337
|
+
o.onExpired(reason);
|
|
338
|
+
return { ok: false, reason, cost_usd: 0 };
|
|
339
|
+
}
|
|
340
|
+
const bounded = new AbortController();
|
|
341
|
+
const stop = () => bounded.abort();
|
|
342
|
+
signal.addEventListener("abort", stop, { once: true });
|
|
343
|
+
if (signal.aborted)
|
|
344
|
+
stop();
|
|
345
|
+
// Reserve the runner's forced-stop grace inside the login admission budget.
|
|
346
|
+
const timer = setTimeout(stop, Math.max(0, o.needMs - CASE_STOP_GRACE_MS));
|
|
347
|
+
timer.unref();
|
|
348
|
+
try {
|
|
349
|
+
// Wait for process cleanup and its final cost rather than racing a refusal.
|
|
350
|
+
return await inner.run(spec, bounded.signal, onCost);
|
|
351
|
+
}
|
|
352
|
+
finally {
|
|
353
|
+
clearTimeout(timer);
|
|
354
|
+
signal.removeEventListener("abort", stop);
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
/** The driver's case runner: over the borrowed login in the scan container
|
|
360
|
+
* (its env names the read-only source), the plain runner anywhere else —
|
|
361
|
+
* `sandbox = "host"` runs on the host pi's own login. `homeDir` is the user's
|
|
362
|
+
* home as the host resolved it, for an env that names neither the agent dir
|
|
363
|
+
* nor HOME. */
|
|
364
|
+
export function scanCasesForEnv(inner, env, onExpired, homeDir) {
|
|
365
|
+
const srcDir = env[SCAN_AUTH_SRC_ENV]?.trim();
|
|
366
|
+
if (!srcDir)
|
|
367
|
+
return inner;
|
|
368
|
+
const home = env["HOME"]?.trim() || homeDir;
|
|
369
|
+
const dstDir = env["PI_CODING_AGENT_DIR"]?.trim() || (home ? join(home, ".pi", "agent") : undefined);
|
|
370
|
+
if (!dstDir)
|
|
371
|
+
throw new Error("scan auth: PI_CODING_AGENT_DIR is not set and there is no home to default it");
|
|
372
|
+
return scanAuthCases(inner, { srcDir, dstDir, needMs: SCAN_CASE_AUTH_BUDGET_MS, onExpired });
|
|
373
|
+
}
|
|
374
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/engine/auth.ts"],"names":[],"mappings":"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"}
|