@quickchatai/pi-quickreview 0.0.0-stage → 1.1.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 +1067 -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 +74 -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 +372 -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 +226 -0
- package/dist/src/engine/pisdk.d.ts.map +1 -0
- package/dist/src/engine/pisdk.js +552 -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 +32 -0
- package/dist/src/githubAuth.d.ts.map +1 -0
- package/dist/src/githubAuth.js +116 -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 +93 -0
- package/dist/src/guards.d.ts.map +1 -0
- package/dist/src/guards.js +306 -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/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/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 +39 -0
- package/dist/src/plugin/login.d.ts.map +1 -0
- package/dist/src/plugin/login.js +73 -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 +298 -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 +741 -0
- package/dist/src/reviewconfig.d.ts.map +1 -0
- package/dist/src/reviewconfig.js +797 -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,139 @@
|
|
|
1
|
+
// The GitHub credential chain of the LOCAL review route (`qcr review`).
|
|
2
|
+
//
|
|
3
|
+
// The App-only credential rule, and its carve-out: the daemon holds only the
|
|
4
|
+
// App credential. The local and Action review routes run as the person at their
|
|
5
|
+
// own terminal, so they may also use the credentials that person already has.
|
|
6
|
+
// This module is that route's alone: the daemon's code never imports it
|
|
7
|
+
// (tests/review-pr-target.test.ts fences who may).
|
|
8
|
+
//
|
|
9
|
+
// Order: the App if configured, then the token handed to a container as a
|
|
10
|
+
// file (below), then GITHUB_TOKEN / GH_TOKEN, then `gh auth token`.
|
|
11
|
+
//
|
|
12
|
+
// The handoff: a token a container runs with is never env
|
|
13
|
+
// and never argv. The caller (the host wrapper, or the Action) writes it to a
|
|
14
|
+
// 0600 file in a fresh 0700 dir, bind-mounted at /run/qcr-in, and names the
|
|
15
|
+
// file in QCR_GH_TOKEN_FILE. `takeHandoffToken` reads it ONCE at startup,
|
|
16
|
+
// unlinks it, deletes the variable and keeps the token in this module's
|
|
17
|
+
// memory only, all before any pi or bash child exists.
|
|
18
|
+
import { execFileSync } from "node:child_process";
|
|
19
|
+
import { closeSync, existsSync, mkdirSync, mkdtempSync, openSync, readFileSync, rmSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
20
|
+
import { tmpdir } from "node:os";
|
|
21
|
+
import { join } from "node:path";
|
|
22
|
+
export const CREDENTIAL_SOURCES = [
|
|
23
|
+
"app",
|
|
24
|
+
"handoff",
|
|
25
|
+
"gh",
|
|
26
|
+
"env:GITHUB_TOKEN",
|
|
27
|
+
"env:GH_TOKEN",
|
|
28
|
+
];
|
|
29
|
+
/** The variable that names the handed-over token file. */
|
|
30
|
+
export const HANDOFF_FILE_ENV = "QCR_GH_TOKEN_FILE";
|
|
31
|
+
/** Where the container sees the handoff dir. */
|
|
32
|
+
export const HANDOFF_MOUNT = "/run/qcr-in";
|
|
33
|
+
let handed = null;
|
|
34
|
+
/**
|
|
35
|
+
* Read the handed-over token file once and unlink it. Returns the token (also
|
|
36
|
+
* kept for `handedToken()`), or null when no file was named. Throws, leaving
|
|
37
|
+
* nothing in memory, when the file is named but unreadable, empty, or cannot
|
|
38
|
+
* be removed: a token that stays on disk beside a model's tools is refused,
|
|
39
|
+
* never used. The variable is deleted from `env` either way, so no child
|
|
40
|
+
* inherits the path.
|
|
41
|
+
*/
|
|
42
|
+
export function takeHandoffToken(env = process.env) {
|
|
43
|
+
const file = env[HANDOFF_FILE_ENV];
|
|
44
|
+
delete env[HANDOFF_FILE_ENV];
|
|
45
|
+
if (file === undefined || file === "")
|
|
46
|
+
return handed;
|
|
47
|
+
const fd = openSync(file, "r");
|
|
48
|
+
try {
|
|
49
|
+
// Unlink first, read from the open descriptor: the file is gone before
|
|
50
|
+
// its content is in memory, and a failed unlink reads nothing.
|
|
51
|
+
unlinkSync(file);
|
|
52
|
+
const token = readFileSync(fd, "utf8").trim();
|
|
53
|
+
if (!token)
|
|
54
|
+
throw new Error("the GitHub token file is empty");
|
|
55
|
+
handed = token;
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
closeSync(fd);
|
|
59
|
+
}
|
|
60
|
+
return handed;
|
|
61
|
+
}
|
|
62
|
+
/** The token `takeHandoffToken` read, or null. */
|
|
63
|
+
export const handedToken = () => handed;
|
|
64
|
+
/** Forget the handed-over token (tests; a long-lived host after its last use). */
|
|
65
|
+
export function dropHandedToken() {
|
|
66
|
+
handed = null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The caller's half: write `token` to a 0600 file in a fresh 0700 dir. On
|
|
70
|
+
* Linux the dir is under an absolute $XDG_RUNTIME_DIR (normally a tmpfs);
|
|
71
|
+
* without one, and elsewhere (macOS), it comes from mkdtemp under the OS
|
|
72
|
+
* temp dir ($TMPDIR), which may be disk-backed. The token is never put in env or argv.
|
|
73
|
+
*/
|
|
74
|
+
export function stageHandoffToken(token, env = process.env, platform = process.platform) {
|
|
75
|
+
const runtime = env["XDG_RUNTIME_DIR"];
|
|
76
|
+
const base = platform === "linux" && runtime && runtime.startsWith("/") ? runtime : tmpdir();
|
|
77
|
+
mkdirSync(base, { recursive: true });
|
|
78
|
+
const dir = mkdtempSync(join(base, "qcr-in-")); // 0700
|
|
79
|
+
try {
|
|
80
|
+
writeFileSync(join(dir, "gh-token"), token, { mode: 0o600, flag: "wx" });
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
rmSync(dir, { recursive: true, force: true });
|
|
84
|
+
throw err;
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
dir,
|
|
88
|
+
containerFile: `${HANDOFF_MOUNT}/gh-token`,
|
|
89
|
+
remove: () => rmSync(dir, { recursive: true, force: true }),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export const MISSING_CREDENTIAL_HELP = "no GitHub credential found. Run `gh auth login`, or set GITHUB_TOKEN (or GH_TOKEN) " +
|
|
93
|
+
"to a token that can read the repository, or configure the GitHub App.";
|
|
94
|
+
/** The real `gh auth token`. */
|
|
95
|
+
export function ghAuthTokenFromCli() {
|
|
96
|
+
try {
|
|
97
|
+
const out = execFileSync("gh", ["auth", "token"], {
|
|
98
|
+
encoding: "utf8",
|
|
99
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
100
|
+
timeout: 10_000,
|
|
101
|
+
}).trim();
|
|
102
|
+
return out || null;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export async function resolveGithubCredential(d) {
|
|
109
|
+
let appNote = "";
|
|
110
|
+
const appConfigured = d.secretsDir !== "" &&
|
|
111
|
+
existsSync(join(d.secretsDir, "app_id")) &&
|
|
112
|
+
existsSync(join(d.secretsDir, "app.pem"));
|
|
113
|
+
if (appConfigured) {
|
|
114
|
+
try {
|
|
115
|
+
const token = (await d.mintApp(d.secretsDir)).trim();
|
|
116
|
+
if (token)
|
|
117
|
+
return { ok: true, source: "app", token };
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
appNote = `the configured GitHub App could not mint a token (${String(err instanceof Error ? err.message : err).slice(0, 200)}). `;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const given = d.handoff?.trim();
|
|
124
|
+
if (given)
|
|
125
|
+
return { ok: true, source: "handoff", token: given };
|
|
126
|
+
for (const name of ["GITHUB_TOKEN", "GH_TOKEN"]) {
|
|
127
|
+
const v = d.env[name]?.trim();
|
|
128
|
+
if (v)
|
|
129
|
+
return { ok: true, source: `env:${name}`, token: v };
|
|
130
|
+
}
|
|
131
|
+
const gh = d.ghAuthToken();
|
|
132
|
+
if (gh)
|
|
133
|
+
return { ok: true, source: "gh", token: gh };
|
|
134
|
+
return {
|
|
135
|
+
ok: false,
|
|
136
|
+
error: appNote ? appNote + MISSING_CREDENTIAL_HELP : MISSING_CREDENTIAL_HELP,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=ghcred.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghcred.js","sourceRoot":"","sources":["../../src/ghcred.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type FetchFn = typeof fetch;
|
|
2
|
+
/** GraphQL's bare App actor, only for a matching configured bot login. */
|
|
3
|
+
export declare function appActorAlias(botLogin: string, appSlug: string): string | undefined;
|
|
4
|
+
export declare function mintAppJwt(appId: string, privateKeyPem: string, now?: () => number): string;
|
|
5
|
+
export interface InstallationToken {
|
|
6
|
+
token: string;
|
|
7
|
+
expires_at: string;
|
|
8
|
+
}
|
|
9
|
+
/** The deadline on each request — the same as the adapter's REST calls, so a
|
|
10
|
+
* stalled mint cannot hold every caller waiting on its shared promise. */
|
|
11
|
+
export declare const GITHUB_REQUEST_TIMEOUT_MS = 60000;
|
|
12
|
+
export declare class TokenMinter {
|
|
13
|
+
private readonly secretsDir;
|
|
14
|
+
private readonly fetchFn;
|
|
15
|
+
private readonly apiBase;
|
|
16
|
+
private readonly now;
|
|
17
|
+
private cache;
|
|
18
|
+
private inflight;
|
|
19
|
+
private installationId;
|
|
20
|
+
constructor(secretsDir: string, fetchFn?: FetchFn, apiBase?: string, now?: () => number);
|
|
21
|
+
private readSecret;
|
|
22
|
+
appJwt(): string;
|
|
23
|
+
/** Resolve (and cache) the single installation this app serves. */
|
|
24
|
+
resolveInstallationId(): Promise<number>;
|
|
25
|
+
private fresh;
|
|
26
|
+
/** Installation token, minting/refreshing as needed (single-flight). */
|
|
27
|
+
installationToken(installationId?: number): Promise<string>;
|
|
28
|
+
private mint;
|
|
29
|
+
/** Drop the cache after a 401 so the next call re-mints. */
|
|
30
|
+
invalidate(installationId?: number): void;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=githubAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"githubAuth.d.ts","sourceRoot":"","sources":["../../src/githubAuth.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC;AAEnC,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEnF;AAMD,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,GAAG,GAAE,MAAM,MAAiB,GAC3B,MAAM,CAOR;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAID;0EAC0E;AAC1E,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAchD,qBAAa,WAAW;IAMpB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG;IARtB,OAAO,CAAC,KAAK,CAAwC;IACrD,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,cAAc,CAAuB;gBAG1B,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,OAAe,EACxB,OAAO,SAA2B,EAClC,GAAG,GAAE,MAAM,MAAiB;IAG/C,OAAO,CAAC,UAAU;IAIlB,MAAM,IAAI,MAAM;IAQhB,mEAAmE;IAC7D,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAe9C,OAAO,CAAC,KAAK;IAIb,wEAAwE;IAClE,iBAAiB,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAWnD,IAAI;IAelB,4DAA4D;IAC5D,UAAU,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI;CAI1C"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// GitHub App authentication: RS256 app JWTs and cached installation tokens.
|
|
2
|
+
// The JWT is backdated 60 s against clock skew and lives 600 s from that iat
|
|
3
|
+
// (9 min from now); scripts/mint-token.sh signs its own with a 540 s life
|
|
4
|
+
// (8 min from now). Both stay under GitHub's 10-minute ceiling. Tokens are
|
|
5
|
+
// cached per installation off `expires_at` with a ~5 min proactive refresh
|
|
6
|
+
// window, refreshed single-flight, re-minted once on a 401 (by the caller's
|
|
7
|
+
// `invalidate`). Every request carries the adapter's 60 s deadline.
|
|
8
|
+
// The app PEM is the only credential anywhere — no personal token code path.
|
|
9
|
+
import { createSign } from "node:crypto";
|
|
10
|
+
import { readFileSync } from "node:fs";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
/** GraphQL's bare App actor, only for a matching configured bot login. */
|
|
13
|
+
export function appActorAlias(botLogin, appSlug) {
|
|
14
|
+
return botLogin === `${appSlug}[bot]` ? appSlug : undefined;
|
|
15
|
+
}
|
|
16
|
+
function b64url(input) {
|
|
17
|
+
return Buffer.from(input).toString("base64url");
|
|
18
|
+
}
|
|
19
|
+
export function mintAppJwt(appId, privateKeyPem, now = Date.now) {
|
|
20
|
+
const iat = Math.floor(now() / 1000) - 60;
|
|
21
|
+
const header = b64url(JSON.stringify({ alg: "RS256", typ: "JWT" }));
|
|
22
|
+
const payload = b64url(JSON.stringify({ iat, exp: iat + 600, iss: appId }));
|
|
23
|
+
const signer = createSign("RSA-SHA256");
|
|
24
|
+
signer.update(`${header}.${payload}`);
|
|
25
|
+
return `${header}.${payload}.${signer.sign(privateKeyPem, "base64url")}`;
|
|
26
|
+
}
|
|
27
|
+
const REFRESH_MARGIN_MS = 5 * 60 * 1000;
|
|
28
|
+
/** The deadline on each request — the same as the adapter's REST calls, so a
|
|
29
|
+
* stalled mint cannot hold every caller waiting on its shared promise. */
|
|
30
|
+
export const GITHUB_REQUEST_TIMEOUT_MS = 60_000;
|
|
31
|
+
/** GitHub's own words for a failed call (its `message`), capped, as ": <text>";
|
|
32
|
+
* empty when the body cannot be read. A 403's permission or rate-limit
|
|
33
|
+
* explanation is what tells operators two failures of one status apart. */
|
|
34
|
+
async function explanation(res) {
|
|
35
|
+
try {
|
|
36
|
+
const text = (await res.text()).replace(/\s+/g, " ").trim().slice(0, 300);
|
|
37
|
+
return text ? `: ${text}` : "";
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return "";
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class TokenMinter {
|
|
44
|
+
secretsDir;
|
|
45
|
+
fetchFn;
|
|
46
|
+
apiBase;
|
|
47
|
+
now;
|
|
48
|
+
cache = new Map();
|
|
49
|
+
inflight = new Map();
|
|
50
|
+
installationId = null;
|
|
51
|
+
constructor(secretsDir, fetchFn = fetch, apiBase = "https://api.github.com", now = Date.now) {
|
|
52
|
+
this.secretsDir = secretsDir;
|
|
53
|
+
this.fetchFn = fetchFn;
|
|
54
|
+
this.apiBase = apiBase;
|
|
55
|
+
this.now = now;
|
|
56
|
+
}
|
|
57
|
+
readSecret(name) {
|
|
58
|
+
return readFileSync(join(this.secretsDir, name), "utf8").trim();
|
|
59
|
+
}
|
|
60
|
+
appJwt() {
|
|
61
|
+
return mintAppJwt(this.readSecret("app_id"), readFileSync(join(this.secretsDir, "app.pem"), "utf8"), this.now);
|
|
62
|
+
}
|
|
63
|
+
/** Resolve (and cache) the single installation this app serves. */
|
|
64
|
+
async resolveInstallationId() {
|
|
65
|
+
if (this.installationId !== null)
|
|
66
|
+
return this.installationId;
|
|
67
|
+
const res = await this.fetchFn(`${this.apiBase}/app/installations`, {
|
|
68
|
+
signal: AbortSignal.timeout(GITHUB_REQUEST_TIMEOUT_MS),
|
|
69
|
+
headers: { authorization: `Bearer ${this.appJwt()}`, accept: "application/vnd.github+json" },
|
|
70
|
+
});
|
|
71
|
+
if (!res.ok)
|
|
72
|
+
throw new Error(`GET /app/installations failed: ${res.status}${await explanation(res)}`);
|
|
73
|
+
const installs = (await res.json());
|
|
74
|
+
const first = installs[0];
|
|
75
|
+
if (!first)
|
|
76
|
+
throw new Error("app has no installations");
|
|
77
|
+
this.installationId = first.id;
|
|
78
|
+
return first.id;
|
|
79
|
+
}
|
|
80
|
+
fresh(tok) {
|
|
81
|
+
return !!tok && Date.parse(tok.expires_at) - this.now() > REFRESH_MARGIN_MS;
|
|
82
|
+
}
|
|
83
|
+
/** Installation token, minting/refreshing as needed (single-flight). */
|
|
84
|
+
async installationToken(installationId) {
|
|
85
|
+
const id = installationId ?? (await this.resolveInstallationId());
|
|
86
|
+
const cached = this.cache.get(id);
|
|
87
|
+
if (this.fresh(cached))
|
|
88
|
+
return cached.token;
|
|
89
|
+
const inflight = this.inflight.get(id);
|
|
90
|
+
if (inflight)
|
|
91
|
+
return inflight;
|
|
92
|
+
const p = this.mint(id).finally(() => this.inflight.delete(id));
|
|
93
|
+
this.inflight.set(id, p);
|
|
94
|
+
return p;
|
|
95
|
+
}
|
|
96
|
+
async mint(id) {
|
|
97
|
+
const res = await this.fetchFn(`${this.apiBase}/app/installations/${id}/access_tokens`, {
|
|
98
|
+
method: "POST",
|
|
99
|
+
signal: AbortSignal.timeout(GITHUB_REQUEST_TIMEOUT_MS),
|
|
100
|
+
headers: { authorization: `Bearer ${this.appJwt()}`, accept: "application/vnd.github+json" },
|
|
101
|
+
});
|
|
102
|
+
if (!res.ok)
|
|
103
|
+
throw new Error(`token mint failed for installation ${id}: ${res.status}${await explanation(res)}`);
|
|
104
|
+
const tok = (await res.json());
|
|
105
|
+
this.cache.set(id, tok);
|
|
106
|
+
return tok.token;
|
|
107
|
+
}
|
|
108
|
+
/** Drop the cache after a 401 so the next call re-mints. */
|
|
109
|
+
invalidate(installationId) {
|
|
110
|
+
if (installationId === undefined)
|
|
111
|
+
this.cache.clear();
|
|
112
|
+
else
|
|
113
|
+
this.cache.delete(installationId);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=githubAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"githubAuth.js","sourceRoot":"","sources":["../../src/githubAuth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** A GitHub request that came back refused: the method, path and status, and
|
|
2
|
+
* how long GitHub asked us to wait, when it said. */
|
|
3
|
+
export declare class GitHubRequestError extends Error {
|
|
4
|
+
readonly method: string;
|
|
5
|
+
readonly path: string;
|
|
6
|
+
readonly status: number;
|
|
7
|
+
readonly retryAfterMs?: number | undefined;
|
|
8
|
+
constructor(method: string, path: string, status: number, detail: string, retryAfterMs?: number | undefined);
|
|
9
|
+
}
|
|
10
|
+
export interface PrFileEntry {
|
|
11
|
+
filename: string;
|
|
12
|
+
additions: number;
|
|
13
|
+
deletions: number;
|
|
14
|
+
status: string;
|
|
15
|
+
/** Unified diff for the file when GitHub returns one (absent for binaries). */
|
|
16
|
+
patch?: string;
|
|
17
|
+
/** The path before a rename, when GitHub detected one (renumber detection). */
|
|
18
|
+
previous_filename?: string;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=githubcore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"githubcore.d.ts","sourceRoot":"","sources":["../../src/githubcore.ts"],"names":[],"mappings":"AAIA;qDACqD;AACrD,qBAAa,kBAAmB,SAAQ,KAAK;IAEzC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAEvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM;gBAJrB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,EACL,YAAY,CAAC,EAAE,MAAM,YAAA;CAKjC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// The core's half of the GitHub client: what a review route needs to read a
|
|
2
|
+
// PR and post through the one gate without the daemon's adapter
|
|
3
|
+
// (src/github.ts, which re-exports these).
|
|
4
|
+
/** A GitHub request that came back refused: the method, path and status, and
|
|
5
|
+
* how long GitHub asked us to wait, when it said. */
|
|
6
|
+
export class GitHubRequestError extends Error {
|
|
7
|
+
method;
|
|
8
|
+
path;
|
|
9
|
+
status;
|
|
10
|
+
retryAfterMs;
|
|
11
|
+
constructor(method, path, status, detail, retryAfterMs) {
|
|
12
|
+
super(`${method} ${path} → ${status}: ${detail}`);
|
|
13
|
+
this.method = method;
|
|
14
|
+
this.path = path;
|
|
15
|
+
this.status = status;
|
|
16
|
+
this.retryAfterMs = retryAfterMs;
|
|
17
|
+
this.name = "GitHubRequestError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=githubcore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"githubcore.js","sourceRoot":"","sources":["../../src/githubcore.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,gEAAgE;AAChE,2CAA2C;AAE3C;qDACqD;AACrD,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEhC;IACA;IACA;IAEA;IALX,YACW,MAAc,EACd,IAAY,EACZ,MAAc,EACvB,MAAc,EACL,YAAqB;QAE9B,KAAK,CAAC,GAAG,MAAM,IAAI,IAAI,MAAM,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC;QANzC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAAQ;QAEd,iBAAY,GAAZ,YAAY,CAAS;QAG9B,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Why `glob` is not a usable pattern, or null when it is. */
|
|
2
|
+
export declare function globProblem(glob: unknown): string | null;
|
|
3
|
+
export declare function globBody(pattern: string): string;
|
|
4
|
+
/** The RegExp a glob compiles to (see the header). */
|
|
5
|
+
export declare function globToRegExp(glob: string): RegExp;
|
|
6
|
+
/** A predicate over repo-relative paths: true when any glob matches. */
|
|
7
|
+
export declare function globMatcher(globs: readonly string[]): (path: string) => boolean;
|
|
8
|
+
/** `globMatcher`, failing CLOSED: a list the compiler refuses matches
|
|
9
|
+
* nothing (never everything). */
|
|
10
|
+
export declare function globMatcherOrNothing(globs: readonly string[]): (path: string) => boolean;
|
|
11
|
+
//# sourceMappingURL=glob.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/glob.ts"],"names":[],"mappings":"AAeA,8DAA8D;AAC9D,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMxD;AAMD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWhD;AAED,sDAAsD;AACtD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAG/E;AAED;iCACiC;AACjC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAMxF"}
|
package/dist/src/glob.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Path globs for exclusion lists (`[scan] exclude`). Deliberately
|
|
2
|
+
// small and gitignore-shaped, so an operator's pattern means what it looks
|
|
3
|
+
// like:
|
|
4
|
+
//
|
|
5
|
+
// * any run of characters inside one path segment
|
|
6
|
+
// ** any run of characters, `/` included (`a/**/b`, `**/x.py`)
|
|
7
|
+
// ? one character inside a segment
|
|
8
|
+
// name a pattern with no `/` (a trailing one aside) matches that name
|
|
9
|
+
// at ANY depth (`*.pb.go`, `generated/`); one with an inner `/`
|
|
10
|
+
// is anchored at the repo root (`src/legacy/**`, `docs/api`)
|
|
11
|
+
//
|
|
12
|
+
// A pattern also matches everything under a directory it matches, so
|
|
13
|
+
// `generated` excludes `a/generated/x.py`. Nothing else is special: every
|
|
14
|
+
// other character is literal.
|
|
15
|
+
/** Why `glob` is not a usable pattern, or null when it is. */
|
|
16
|
+
export function globProblem(glob) {
|
|
17
|
+
if (typeof glob !== "string" || glob.trim() === "")
|
|
18
|
+
return "must be a non-empty string";
|
|
19
|
+
if (glob.startsWith("/"))
|
|
20
|
+
return "must be repo-relative (no leading /)";
|
|
21
|
+
if (glob.split("/").includes(".."))
|
|
22
|
+
return "must not contain `..`";
|
|
23
|
+
if (glob.includes("\0"))
|
|
24
|
+
return "must not contain NUL";
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
// A pattern's wildcards as an unanchored RegExp source: `**/` any run of
|
|
28
|
+
// whole leading segments, `**` any run, `*` a run inside one segment, `?` one
|
|
29
|
+
// character inside one; everything else literal. The ONE wildcard grammar —
|
|
30
|
+
// each caller adds its own anchoring around it.
|
|
31
|
+
export function globBody(pattern) {
|
|
32
|
+
return pattern
|
|
33
|
+
.split(/(\*\*\/|\*\*|\*|\?)/)
|
|
34
|
+
.map((part) => {
|
|
35
|
+
if (part === "**/")
|
|
36
|
+
return "(?:[\\s\\S]*/)?";
|
|
37
|
+
if (part === "**")
|
|
38
|
+
return "[\\s\\S]*";
|
|
39
|
+
if (part === "*")
|
|
40
|
+
return "[^/]*";
|
|
41
|
+
if (part === "?")
|
|
42
|
+
return "[^/]";
|
|
43
|
+
return part.replace(/[.+^${}()|[\]\\]/g, "\\$&");
|
|
44
|
+
})
|
|
45
|
+
.join("");
|
|
46
|
+
}
|
|
47
|
+
/** The RegExp a glob compiles to (see the header). */
|
|
48
|
+
export function globToRegExp(glob) {
|
|
49
|
+
// A trailing slash adds nothing the `(?:/.*)?` tail does not already say.
|
|
50
|
+
const g = glob.trim().replace(/\/+$/, "");
|
|
51
|
+
const lead = g.includes("/") ? "^" : "(?:^|/)";
|
|
52
|
+
return new RegExp(`${lead}${globBody(g)}(?:/[\\s\\S]*)?$`);
|
|
53
|
+
}
|
|
54
|
+
/** A predicate over repo-relative paths: true when any glob matches. */
|
|
55
|
+
export function globMatcher(globs) {
|
|
56
|
+
const res = globs.map(globToRegExp);
|
|
57
|
+
return (path) => res.some((re) => re.test(path));
|
|
58
|
+
}
|
|
59
|
+
/** `globMatcher`, failing CLOSED: a list the compiler refuses matches
|
|
60
|
+
* nothing (never everything). */
|
|
61
|
+
export function globMatcherOrNothing(globs) {
|
|
62
|
+
try {
|
|
63
|
+
return globMatcher(globs);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return () => false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=glob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/glob.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,2EAA2E;AAC3E,QAAQ;AACR,EAAE;AACF,2DAA2D;AAC3D,uEAAuE;AACvE,4CAA4C;AAC5C,4EAA4E;AAC5E,2EAA2E;AAC3E,wEAAwE;AACxE,EAAE;AACF,qEAAqE;AACrE,0EAA0E;AAC1E,8BAA8B;AAE9B,8DAA8D;AAC9D,MAAM,UAAU,WAAW,CAAC,IAAa;IACvC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,4BAA4B,CAAC;IACxF,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,sCAAsC,CAAC;IACxE,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,uBAAuB,CAAC;IACnE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,sBAAsB,CAAC;IACvD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yEAAyE;AACzE,8EAA8E;AAC9E,4EAA4E;AAC5E,gDAAgD;AAChD,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,OAAO;SACX,KAAK,CAAC,qBAAqB,CAAC;SAC5B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,iBAAiB,CAAC;QAC7C,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,WAAW,CAAC;QACtC,IAAI,IAAI,KAAK,GAAG;YAAE,OAAO,OAAO,CAAC;QACjC,IAAI,IAAI,KAAK,GAAG;YAAE,OAAO,MAAM,CAAC;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,0EAA0E;IAC1E,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,OAAO,IAAI,MAAM,CAAC,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAC7D,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,WAAW,CAAC,KAAwB;IAClD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACpC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;iCACiC;AACjC,MAAM,UAAU,oBAAoB,CAAC,KAAwB;IAC3D,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { type CheckSummary, type CiReviewBody } from "./cigate.js";
|
|
2
|
+
import type { GuardsConfig } from "./reviewconfig.js";
|
|
3
|
+
import type { MutationGuard } from "./gate.js";
|
|
4
|
+
import type { ReviewedHeadRow } from "./storerows.js";
|
|
5
|
+
/** A bot's login: the App's own, or any `[bot]` account. Bot-authored PRs
|
|
6
|
+
* never enter the state machine (spec §3, src/statemachine.ts re-exports
|
|
7
|
+
* this), and a bot's approval is no human's. */
|
|
8
|
+
export declare function isBotAuthor(author: string, botLogin: string): boolean;
|
|
9
|
+
/** Mutation kinds that put words on a PR — the ones the guards inspect. */
|
|
10
|
+
export declare const POSTING_KINDS: ReadonlySet<string>;
|
|
11
|
+
/** The read-only slice of the adapter the guards need. Both calls are reads,
|
|
12
|
+
* and a read is never gated. */
|
|
13
|
+
export interface GuardAdapter {
|
|
14
|
+
getPr(n: number): Promise<{
|
|
15
|
+
state: "open" | "closed";
|
|
16
|
+
merged: boolean;
|
|
17
|
+
head_sha: string;
|
|
18
|
+
author: string;
|
|
19
|
+
}>;
|
|
20
|
+
listReviews(n: number): Promise<Array<{
|
|
21
|
+
id: number;
|
|
22
|
+
user: string;
|
|
23
|
+
state: string;
|
|
24
|
+
commit_id: string;
|
|
25
|
+
}>>;
|
|
26
|
+
/** Checks at a head (guard 4). Optional: an adapter without it
|
|
27
|
+
* cannot see CI, and a guard never blocks on what it cannot see. */
|
|
28
|
+
listChecks?(ref: string): Promise<CheckSummary[]>;
|
|
29
|
+
}
|
|
30
|
+
/** The store slice: the reviewed-head mark, the withheld-approval mark, and
|
|
31
|
+
* the event log. */
|
|
32
|
+
export interface GuardStore {
|
|
33
|
+
reviewedHead(pr: number): ReviewedHeadRow | undefined;
|
|
34
|
+
recordReviewedHead(pr: number, mark: {
|
|
35
|
+
head_sha: string;
|
|
36
|
+
verdict?: string | null;
|
|
37
|
+
posted_event?: string | null;
|
|
38
|
+
round_no?: number | null;
|
|
39
|
+
}): void;
|
|
40
|
+
logEvent(kind: string, pr: number | null, payload?: unknown): void;
|
|
41
|
+
recordApprovalWithheld(pr: number, mark: {
|
|
42
|
+
head_sha: string;
|
|
43
|
+
ci_state?: string | null;
|
|
44
|
+
reason?: string | null;
|
|
45
|
+
}): void;
|
|
46
|
+
clearApprovalWithheld(pr: number): void;
|
|
47
|
+
}
|
|
48
|
+
export interface GuardDeps {
|
|
49
|
+
store: GuardStore;
|
|
50
|
+
adapter: GuardAdapter;
|
|
51
|
+
botLogin: string;
|
|
52
|
+
guards: GuardsConfig;
|
|
53
|
+
log?: (msg: string, extra?: unknown) => void;
|
|
54
|
+
}
|
|
55
|
+
/** The review payload as it appears inside a `create_review` intent — the
|
|
56
|
+
* one shape both softenings (guard 1 here, guard 4 in cigate.ts) rewrite. */
|
|
57
|
+
type ReviewBody = CiReviewBody;
|
|
58
|
+
/**
|
|
59
|
+
* The login of a non-author human whose APPROVED review stands at `head_sha`,
|
|
60
|
+
* or null. "Stands" means it is that person's LATEST verdict-bearing review:
|
|
61
|
+
* a later CHANGES_REQUESTED or DISMISSED by the same person retires it.
|
|
62
|
+
* COMMENTED/PENDING reviews carry no verdict and are ignored.
|
|
63
|
+
*
|
|
64
|
+
* Reviews are read in submission order, which is the order the REST endpoint
|
|
65
|
+
* returns them in.
|
|
66
|
+
*/
|
|
67
|
+
export declare function humanApprovalAtHead(reviews: Array<{
|
|
68
|
+
user: string;
|
|
69
|
+
state: string;
|
|
70
|
+
commit_id: string;
|
|
71
|
+
}>, opts: {
|
|
72
|
+
head_sha: string;
|
|
73
|
+
author: string;
|
|
74
|
+
botLogin: string;
|
|
75
|
+
}): string | null;
|
|
76
|
+
/** The note the downgraded review carries, so the softer event is never a
|
|
77
|
+
* silent change of mind. */
|
|
78
|
+
export declare function downgradeNote(approver: string, headSha: string): string;
|
|
79
|
+
/** REQUEST_CHANGES → COMMENT, findings untouched, with the note appended. */
|
|
80
|
+
export declare function downgradeForHumanApproval(body: ReviewBody, approver: string, headSha: string): ReviewBody;
|
|
81
|
+
/**
|
|
82
|
+
* Is there anything new to review at `head_sha`? True unless the mark sits on
|
|
83
|
+
* exactly this head and no author reply has landed since it was stamped.
|
|
84
|
+
* An unknown head (empty string) is always "new": guessing would suppress a
|
|
85
|
+
* real review.
|
|
86
|
+
*/
|
|
87
|
+
export declare function hasNewEvidence(mark: ReviewedHeadRow | undefined, headSha: string): boolean;
|
|
88
|
+
/** Why a posting mutation was refused. Short tags — they land in the event log
|
|
89
|
+
* and in `GateResult.blocked`. */
|
|
90
|
+
export type BlockReason = "pr-merged" | "pr-closed" | "pr-unreadable" | "no-new-evidence" | "head-drift";
|
|
91
|
+
export declare function makePostingGuard(deps: GuardDeps): MutationGuard;
|
|
92
|
+
export {};
|
|
93
|
+
//# sourceMappingURL=guards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../src/guards.ts"],"names":[],"mappings":"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"}
|