@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,167 @@
|
|
|
1
|
+
// What `qcr review` remembers about a target between runs (repo plus branch
|
|
2
|
+
// today; a PR keys the same way), so a second review covers only what changed
|
|
3
|
+
// and never repeats a finding that is still open.
|
|
4
|
+
//
|
|
5
|
+
// The state is the production reasoning record in miniature: one row per
|
|
6
|
+
// finding a round recorded (`RoundFindingRow`) and one per status a later
|
|
7
|
+
// round reported for a prior finding. The open list handed to the next round
|
|
8
|
+
// is production's `computePriorFindings` over them, so the chain, supersede
|
|
9
|
+
// and resolution rules are the daemon's, not a copy.
|
|
10
|
+
//
|
|
11
|
+
// Kept in the install's state home (packages/pi-plugin/src/reviewstore.ts), never tracked, never
|
|
12
|
+
// shared. Unreadable state is no state: the next review is a full one.
|
|
13
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
14
|
+
import { dirname } from "node:path";
|
|
15
|
+
import { normalizeDisposition, recordString } from "./findingkey.js";
|
|
16
|
+
import { parseFindingsRecord } from "./findingsrecord.js";
|
|
17
|
+
import { computePriorFindings } from "./priorfindings.js";
|
|
18
|
+
export const STATE_VERSION = 1;
|
|
19
|
+
/** The target a review is of: the key its state is kept under. */
|
|
20
|
+
export function branchTargetKey(repo, branch) {
|
|
21
|
+
return `branch:${repo}@${branch}`;
|
|
22
|
+
}
|
|
23
|
+
/** A PR's key: the repo and the PR number, apart from any branch of the repo. */
|
|
24
|
+
export function prTargetKey(repo, number) {
|
|
25
|
+
return `pr:${repo}#${number}`;
|
|
26
|
+
}
|
|
27
|
+
export function emptyState(target) {
|
|
28
|
+
return { version: STATE_VERSION, target, rounds: [], rows: [], checks: [] };
|
|
29
|
+
}
|
|
30
|
+
/** The target's state; null when there is none or it cannot be trusted. */
|
|
31
|
+
export function loadState(path, target) {
|
|
32
|
+
if (path === null || !existsSync(path))
|
|
33
|
+
return null;
|
|
34
|
+
try {
|
|
35
|
+
const s = JSON.parse(readFileSync(path, "utf8"));
|
|
36
|
+
if (s.version !== STATE_VERSION ||
|
|
37
|
+
s.target !== target ||
|
|
38
|
+
!Array.isArray(s.rounds) ||
|
|
39
|
+
!Array.isArray(s.rows) ||
|
|
40
|
+
!Array.isArray(s.checks) ||
|
|
41
|
+
s.rounds.length === 0)
|
|
42
|
+
return null;
|
|
43
|
+
const last = s.rounds[s.rounds.length - 1];
|
|
44
|
+
if (typeof last?.head_sha !== "string" || typeof last.round_no !== "number")
|
|
45
|
+
return null;
|
|
46
|
+
return s;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Atomic: a crash never leaves half a state. Best-effort by contract — a
|
|
53
|
+
* state that could not be written only costs the next review its delta. */
|
|
54
|
+
export function saveState(path, s) {
|
|
55
|
+
if (path === null)
|
|
56
|
+
return false;
|
|
57
|
+
try {
|
|
58
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
59
|
+
const tmp = `${path}.${process.pid}.tmp`;
|
|
60
|
+
writeFileSync(tmp, JSON.stringify(s, null, 2) + "\n");
|
|
61
|
+
renameSync(tmp, path);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export const lastRound = (s) => s.rounds[s.rounds.length - 1];
|
|
69
|
+
/** The findings still open for the round after the last one: production's
|
|
70
|
+
* prior-findings list over the state. */
|
|
71
|
+
export function openFindings(s, nextRound) {
|
|
72
|
+
const roundNo = nextRound ?? (s ? lastRound(s).round_no + 1 : 1);
|
|
73
|
+
if (s === null)
|
|
74
|
+
return { pr: 0, round_no: roundNo, findings: [], dropped: [], incomplete: [] };
|
|
75
|
+
return computePriorFindings({
|
|
76
|
+
pr: 0,
|
|
77
|
+
roundNo,
|
|
78
|
+
rows: s.rows,
|
|
79
|
+
checks: s.checks.map((c) => ({ ...c })),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// ---- recording a round -----------------------------------------------------------
|
|
83
|
+
/** The dispositions a reader sees as findings (the terminal hides the
|
|
84
|
+
* review's own kills): carried as open findings, whatever the record called
|
|
85
|
+
* them. */
|
|
86
|
+
const SHOWN_AS_POSTED = new Set(["posted", "downgraded", "doubted", "unknown"]);
|
|
87
|
+
const norm = (s) => (s ?? "")
|
|
88
|
+
.toLowerCase()
|
|
89
|
+
.replace(/[^a-z0-9 ]+/g, " ")
|
|
90
|
+
.replace(/\s+/g, " ")
|
|
91
|
+
.trim();
|
|
92
|
+
/**
|
|
93
|
+
* Fold a finished round's findings record into the state. A finding that
|
|
94
|
+
* re-raises one already open (the same key on the same file, a named older round, the same
|
|
95
|
+
* title on the same file, or the same lens on the same line) is a repeat: it
|
|
96
|
+
* is kept in the state as `merged` (auditable) and never reaches the reader as
|
|
97
|
+
* new, whatever the session did. The statuses the round reported for the prior
|
|
98
|
+
* findings are recorded, so the next list shrinks.
|
|
99
|
+
*/
|
|
100
|
+
export function recordRound(prev, target, round, rawRecord) {
|
|
101
|
+
const base = prev === null || round.scope === "full" ? emptyState(target) : structuredClone(prev);
|
|
102
|
+
const open = round.scope === "delta" && prev ? openFindings(prev, round.round_no) : null;
|
|
103
|
+
const raw = rawRecord !== null && typeof rawRecord === "object" && !Array.isArray(rawRecord)
|
|
104
|
+
? { ...rawRecord, pr: undefined, round_no: undefined }
|
|
105
|
+
: rawRecord;
|
|
106
|
+
const parsed = parseFindingsRecord(raw, 0, round.round_no);
|
|
107
|
+
const entries = parsed.record?.findings ?? [];
|
|
108
|
+
const fresh = [];
|
|
109
|
+
const repeats = [];
|
|
110
|
+
let id = base.rows.reduce((m, r) => Math.max(m, r.id), 0);
|
|
111
|
+
for (const e of entries) {
|
|
112
|
+
const disposition = normalizeDisposition(e.disposition);
|
|
113
|
+
const shown = SHOWN_AS_POSTED.has(disposition);
|
|
114
|
+
const isRepeat = shown &&
|
|
115
|
+
open !== null &&
|
|
116
|
+
open.findings.some((p) =>
|
|
117
|
+
// A key is a round-local handle: it names the same finding only on
|
|
118
|
+
// the same file.
|
|
119
|
+
(p.finding_key === e.key && p.path === e.path) ||
|
|
120
|
+
(e.raised_in_round !== null && e.raised_in_round < round.round_no) ||
|
|
121
|
+
(p.path !== null &&
|
|
122
|
+
p.path === e.path &&
|
|
123
|
+
((norm(p.title) !== "" && norm(p.title) === norm(e.title)) ||
|
|
124
|
+
(p.line !== null && p.line === e.line && p.lens === e.lens))));
|
|
125
|
+
if (shown)
|
|
126
|
+
(isRepeat ? repeats : fresh).push(e);
|
|
127
|
+
base.rows.push({
|
|
128
|
+
id: ++id,
|
|
129
|
+
pr: 0,
|
|
130
|
+
round_id: null,
|
|
131
|
+
round_no: round.round_no,
|
|
132
|
+
head_sha: round.head_sha,
|
|
133
|
+
finding_key: e.key,
|
|
134
|
+
path: e.path,
|
|
135
|
+
line: e.line,
|
|
136
|
+
lens: e.lens,
|
|
137
|
+
tier: e.tier,
|
|
138
|
+
unplanned: 0,
|
|
139
|
+
severity: e.severity,
|
|
140
|
+
confidence: e.confidence,
|
|
141
|
+
reachability: e.reachability,
|
|
142
|
+
kind: e.kind,
|
|
143
|
+
disposition: isRepeat ? "merged" : shown ? "posted" : disposition,
|
|
144
|
+
axis: e.axis,
|
|
145
|
+
word: isRepeat ? "repeat-of-open" : e.word,
|
|
146
|
+
reason: e.reason,
|
|
147
|
+
evidence: e.evidence,
|
|
148
|
+
posted_as: shown ? (e.posted_as ?? recordString(e.severity) ?? "finding") : e.posted_as,
|
|
149
|
+
raised_in_round: e.raised_in_round,
|
|
150
|
+
thread_id: e.thread_id,
|
|
151
|
+
recorded_at: round.reviewed_at,
|
|
152
|
+
title: e.title,
|
|
153
|
+
lens_ids: null,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
for (const p of parsed.record?.prior ?? [])
|
|
157
|
+
base.checks.push({
|
|
158
|
+
checked_round: round.round_no,
|
|
159
|
+
round_no: p.round_no,
|
|
160
|
+
finding_key: p.finding_key,
|
|
161
|
+
status: p.status,
|
|
162
|
+
evidence: p.evidence,
|
|
163
|
+
});
|
|
164
|
+
base.rounds.push(round);
|
|
165
|
+
return { state: base, fresh, repeats };
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=reviewstate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewstate.js","sourceRoot":"","sources":["../../src/reviewstate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface ReviewStore {
|
|
2
|
+
/** `<state home>/review/<key>`. */
|
|
3
|
+
readonly dir: string;
|
|
4
|
+
/** The state file for a target (`branchTargetKey` / `prTargetKey`). */
|
|
5
|
+
statePath(targetKey: string): string;
|
|
6
|
+
/** The repo's saved destinations. */
|
|
7
|
+
destinationPath(): string;
|
|
8
|
+
}
|
|
9
|
+
/** The repo's directory-safe key; null outside a git repo, or in one with no
|
|
10
|
+
* commit yet (nothing to key it by, and nothing to remember). Several root
|
|
11
|
+
* commits (merged histories): the smallest hash, so the key is stable. */
|
|
12
|
+
export declare function repoKey(cwd: string): string | null;
|
|
13
|
+
/** The repo's store under the review home `home`; null outside a git repo.
|
|
14
|
+
* Opening is cheap and creates nothing but, on the first open, the imported
|
|
15
|
+
* copies. */
|
|
16
|
+
export declare function openReviewStoreIn(home: string, cwd: string): ReviewStore | null;
|
|
17
|
+
//# sourceMappingURL=reviewstore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewstore.d.ts","sourceRoot":"","sources":["../../src/reviewstore.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,WAAW;IAC1B,mCAAmC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IACrC,qCAAqC;IACrC,eAAe,IAAI,MAAM,CAAC;CAC3B;AAoBD;;0EAE0E;AAC1E,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAelD;AA8BD;;aAEa;AACb,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAgB/E"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// Where a local review keeps what it remembers about a repo: the delta history
|
|
2
|
+
// per target (packages/pi-plugin/src/reviewstate.ts) and the saved destination (packages/pi-plugin/src/reviewdest.ts).
|
|
3
|
+
//
|
|
4
|
+
// One directory per repo under the review home the host names (the CLI's is
|
|
5
|
+
// `<state home>/review`, src/reviewhome.ts):
|
|
6
|
+
// <home>/<key>/state/<hash>.json one file per target
|
|
7
|
+
// <home>/<key>/destination.json the saved destinations
|
|
8
|
+
// The key is the origin's owner/name plus the repo's root commit, so every
|
|
9
|
+
// clone and worktree of a repo shares one history and a fork keeps its own.
|
|
10
|
+
// A repo with no origin is keyed by its directory name instead of an owner.
|
|
11
|
+
// The state home is the place a container volume mounts, which is why this is
|
|
12
|
+
// not the git dir any more. The git dir's old files are copied in once.
|
|
13
|
+
import { createHash } from "node:crypto";
|
|
14
|
+
import { execFileSync } from "node:child_process";
|
|
15
|
+
import { copyFileSync, existsSync, mkdirSync, readdirSync, writeFileSync } from "node:fs";
|
|
16
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
17
|
+
import { originRepo } from "./localreview.js";
|
|
18
|
+
const LEGACY_STATE_DIR = "qcr-review-state";
|
|
19
|
+
const LEGACY_DEST_FILE = "qcr-review-destination.json";
|
|
20
|
+
const IMPORTED_MARKER = ".legacy-imported";
|
|
21
|
+
function git(cwd, args) {
|
|
22
|
+
try {
|
|
23
|
+
return execFileSync("git", args, {
|
|
24
|
+
cwd,
|
|
25
|
+
encoding: "utf8",
|
|
26
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
27
|
+
}).trim();
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const slug = (s) => s
|
|
34
|
+
.toLowerCase()
|
|
35
|
+
.replace(/[^a-z0-9._-]+/g, "_")
|
|
36
|
+
.replace(/^\.+/, "_");
|
|
37
|
+
/** The repo's directory-safe key; null outside a git repo, or in one with no
|
|
38
|
+
* commit yet (nothing to key it by, and nothing to remember). Several root
|
|
39
|
+
* commits (merged histories): the smallest hash, so the key is stable. */
|
|
40
|
+
export function repoKey(cwd) {
|
|
41
|
+
const roots = git(cwd, ["rev-list", "--max-parents=0", "HEAD"]);
|
|
42
|
+
const root = roots?.split("\n").filter(Boolean).sort()[0];
|
|
43
|
+
if (!root)
|
|
44
|
+
return null;
|
|
45
|
+
const origin = originRepo(cwd);
|
|
46
|
+
let name = origin;
|
|
47
|
+
if (name === null) {
|
|
48
|
+
const common = git(cwd, ["rev-parse", "--path-format=absolute", "--git-common-dir"]);
|
|
49
|
+
if (common === null)
|
|
50
|
+
return null;
|
|
51
|
+
// A normal repo's common dir is `<repo>/.git`; a bare one is the repo.
|
|
52
|
+
const dir = basename(common) === ".git" ? dirname(common) : common;
|
|
53
|
+
name = `local/${basename(dir)}`;
|
|
54
|
+
}
|
|
55
|
+
const [owner = "local", repo = ""] = name.split("/");
|
|
56
|
+
return `${slug(owner)}--${slug(repo)}--${root.slice(0, 12)}`;
|
|
57
|
+
}
|
|
58
|
+
/** Copy what the repo's git dir held before the state moved here. Once per
|
|
59
|
+
* store (a marker says so), and never over a file the store already has. The
|
|
60
|
+
* originals are left where they are. Best-effort: a copy that fails costs the
|
|
61
|
+
* repo its old history, not the review. */
|
|
62
|
+
function importLegacy(cwd, store) {
|
|
63
|
+
const marker = join(store.dir, IMPORTED_MARKER);
|
|
64
|
+
if (existsSync(marker))
|
|
65
|
+
return;
|
|
66
|
+
try {
|
|
67
|
+
const common = git(cwd, ["rev-parse", "--path-format=absolute", "--git-common-dir"]);
|
|
68
|
+
if (common !== null) {
|
|
69
|
+
const stateDir = join(common, LEGACY_STATE_DIR);
|
|
70
|
+
const copy = (from, to) => {
|
|
71
|
+
if (!existsSync(from) || existsSync(to))
|
|
72
|
+
return;
|
|
73
|
+
mkdirSync(dirname(to), { recursive: true });
|
|
74
|
+
copyFileSync(from, to);
|
|
75
|
+
};
|
|
76
|
+
if (existsSync(stateDir))
|
|
77
|
+
for (const f of readdirSync(stateDir))
|
|
78
|
+
if (f.endsWith(".json"))
|
|
79
|
+
copy(join(stateDir, f), join(store.dir, "state", f));
|
|
80
|
+
copy(join(common, LEGACY_DEST_FILE), store.destinationPath());
|
|
81
|
+
}
|
|
82
|
+
mkdirSync(store.dir, { recursive: true });
|
|
83
|
+
writeFileSync(marker, "");
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Unwritable store: the callers' own saves fail the same way, quietly.
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/** The repo's store under the review home `home`; null outside a git repo.
|
|
90
|
+
* Opening is cheap and creates nothing but, on the first open, the imported
|
|
91
|
+
* copies. */
|
|
92
|
+
export function openReviewStoreIn(home, cwd) {
|
|
93
|
+
const key = repoKey(cwd);
|
|
94
|
+
if (key === null)
|
|
95
|
+
return null;
|
|
96
|
+
const dir = resolve(home, key);
|
|
97
|
+
const store = {
|
|
98
|
+
dir,
|
|
99
|
+
statePath: (targetKey) => join(dir, "state", `${createHash("sha256").update(targetKey).digest("hex").slice(0, 20)}.json`),
|
|
100
|
+
destinationPath: () => join(dir, "destination.json"),
|
|
101
|
+
};
|
|
102
|
+
importLegacy(cwd, store);
|
|
103
|
+
return store;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=reviewstore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewstore.js","sourceRoot":"","sources":["../../src/reviewstore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export declare const LIVE_AGENT_STATUSES: readonly ["running", "completed", "failed"];
|
|
2
|
+
export type LiveAgentStatus = (typeof LIVE_AGENT_STATUSES)[number];
|
|
3
|
+
export declare function isLiveAgentStatus(value: unknown): value is LiveAgentStatus;
|
|
4
|
+
export type PassExecutionPhase = "plan" | "sweep" | "optional";
|
|
5
|
+
export interface LiveAgentProgress {
|
|
6
|
+
/** One subagent tool invocation, not merely an agent name. Repeated lenses
|
|
7
|
+
* remain distinct so an older completion cannot satisfy a newer run. */
|
|
8
|
+
execution_id?: string;
|
|
9
|
+
agent: string;
|
|
10
|
+
/** Task-directory phase. Absent on legacy/free-form calls, which retain
|
|
11
|
+
* their original plan interpretation. Sweep completions never repair a
|
|
12
|
+
* different phase's required failure. */
|
|
13
|
+
phase?: PassExecutionPhase;
|
|
14
|
+
status: LiveAgentStatus;
|
|
15
|
+
duration_ms: number;
|
|
16
|
+
tool_count: number;
|
|
17
|
+
/** Immutable execution milestones. Absent on version-1/display-only
|
|
18
|
+
* snapshots; supervisors must never infer their absence as a failure. */
|
|
19
|
+
started_at?: string;
|
|
20
|
+
finished_at?: string;
|
|
21
|
+
current_tool?: string;
|
|
22
|
+
last_message?: string;
|
|
23
|
+
error?: string;
|
|
24
|
+
}
|
|
25
|
+
export type RoundExecutionStage = "unknown" | "accepted" | "preparing" | "fanout-started" | "passes-complete" | "finalized";
|
|
26
|
+
export interface RoundProgressSnapshot {
|
|
27
|
+
/** v2 adds immutable execution milestones. v1 remains readable for the TUI
|
|
28
|
+
* and for settlement evidence, but cannot drive early pass-stage recovery. */
|
|
29
|
+
version: 1 | 2;
|
|
30
|
+
pr: number;
|
|
31
|
+
session: string;
|
|
32
|
+
run_started_at: string;
|
|
33
|
+
updated_at: string;
|
|
34
|
+
parent_status: "active" | "settled";
|
|
35
|
+
/** Exact durable command identity, learned from its correlated user
|
|
36
|
+
* message. Absent on interactive/legacy runs; absent means telemetry cannot
|
|
37
|
+
* prove settlement for command recovery. */
|
|
38
|
+
command_id?: string;
|
|
39
|
+
command_sha256?: string;
|
|
40
|
+
command_accepted_at?: string;
|
|
41
|
+
/** Prompt-derived immutable review identity. Together with command id/hash,
|
|
42
|
+
* this prevents a neighboring accepted run from impersonating this round. */
|
|
43
|
+
round_no?: number;
|
|
44
|
+
head_sha?: string;
|
|
45
|
+
/** Named parent milestones. `preparing_at` is stamped with exact
|
|
46
|
+
* command acceptance; `fanout_started_at` is the first subagent execution.
|
|
47
|
+
* `first_lens_started_at` remains the backwards-compatible spelling. */
|
|
48
|
+
preparing_at?: string;
|
|
49
|
+
first_lens_started_at?: string;
|
|
50
|
+
fanout_started_at?: string;
|
|
51
|
+
last_activity_at: string;
|
|
52
|
+
last_activity: string;
|
|
53
|
+
active_tool?: string;
|
|
54
|
+
agents: LiveAgentProgress[];
|
|
55
|
+
}
|
|
56
|
+
/** Built pass agents append their model tier to the lens identity. SQLite's
|
|
57
|
+
* authoritative plan stores the lens, while Pi progress reports the invoked
|
|
58
|
+
* agent, so every comparison crosses this one normalization seam. */
|
|
59
|
+
export declare function lensForAgent(agent: string): string;
|
|
60
|
+
/** A pass execution that has ended, either way. */
|
|
61
|
+
export declare function isTerminalAgentStatus(status: LiveAgentStatus): boolean;
|
|
62
|
+
/** A required lens is complete only when it ran and all its executions ended. */
|
|
63
|
+
export declare function executionsComplete(executions: readonly LiveAgentProgress[]): boolean;
|
|
64
|
+
/** The executions that open a round's fanout: a started run of one of the
|
|
65
|
+
* plan's DISCOVERY lenses. Validator-first, an added lens or a foreign
|
|
66
|
+
* subagent never counts. */
|
|
67
|
+
export declare function plannedFanoutAgents(progress: RoundProgressSnapshot, planned: readonly string[]): LiveAgentProgress[];
|
|
68
|
+
/** Classify the current parent stage from immutable milestones plus the
|
|
69
|
+
* authoritative round plan. Activity text and heartbeat age are deliberately
|
|
70
|
+
* absent: they can describe a stage but can never renew it. */
|
|
71
|
+
export declare function roundExecutionStage(progress: RoundProgressSnapshot, planned: readonly string[]): RoundExecutionStage;
|
|
72
|
+
/** Parse an untrusted remote sidecar. A malformed file is simply unavailable. */
|
|
73
|
+
export declare function parseRoundProgress(raw: string): RoundProgressSnapshot | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* The APPEND-ONLY transition log beside the snapshot:
|
|
76
|
+
* `state/round-progress/pr-<n>.jsonl`. The snapshot is rewritten on every
|
|
77
|
+
* event, so it can only say what is true NOW; the log keeps the order in
|
|
78
|
+
* which a run got there — parent start/settle, command acceptance, every
|
|
79
|
+
* pass's start and end with its status — so a round the supervisor ended can
|
|
80
|
+
* be reconstructed afterwards. Diagnostic only: nothing in the daemon reads
|
|
81
|
+
* it for a decision.
|
|
82
|
+
*/
|
|
83
|
+
export type ProgressTransition = {
|
|
84
|
+
event: "parent_start";
|
|
85
|
+
} | {
|
|
86
|
+
event: "command_accepted";
|
|
87
|
+
round_no?: number;
|
|
88
|
+
head_sha?: string;
|
|
89
|
+
} | {
|
|
90
|
+
event: "pass_start";
|
|
91
|
+
execution_id: string;
|
|
92
|
+
agent: string;
|
|
93
|
+
} | {
|
|
94
|
+
event: "pass_end";
|
|
95
|
+
execution_id: string;
|
|
96
|
+
agent: string;
|
|
97
|
+
status: LiveAgentStatus;
|
|
98
|
+
} | {
|
|
99
|
+
event: "parent_settle";
|
|
100
|
+
};
|
|
101
|
+
export type ProgressLogLine = ProgressTransition & {
|
|
102
|
+
at: string;
|
|
103
|
+
pr: number;
|
|
104
|
+
session: string;
|
|
105
|
+
run_started_at: string;
|
|
106
|
+
command_id?: string;
|
|
107
|
+
};
|
|
108
|
+
/** Size cap of the live log. A transition line is ~200–300 bytes and a round
|
|
109
|
+
* writes a few dozen (sweeps a little over a hundred), so 256 KiB holds many
|
|
110
|
+
* rounds of one PR. Past it the file rotates ONCE to `.jsonl.1` (the previous
|
|
111
|
+
* `.1` dropped), so a PR never holds more than ~512 KiB of log. Rotation is
|
|
112
|
+
* per line, not per round: a round may straddle the two files, so a
|
|
113
|
+
* reconstruction reads `.jsonl.1` then `.jsonl`. */
|
|
114
|
+
export declare const PROGRESS_LOG_MAX_BYTES: number;
|
|
115
|
+
/** `pr-<n>.json` → `pr-<n>.jsonl`. */
|
|
116
|
+
export declare function progressLogPath(snapshotPath: string): string;
|
|
117
|
+
/** Append one line, rotating first when it would cross the cap. Throws on an
|
|
118
|
+
* I/O failure — the caller (the extension) logs and carries on. */
|
|
119
|
+
export declare function appendProgressLog(path: string, line: ProgressLogLine, maxBytes?: number): void;
|
|
120
|
+
//# sourceMappingURL=round-progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"round-progress.d.ts","sourceRoot":"","sources":["../../src/round-progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Live, ephemeral progress from one PR's sticky pi session.
|
|
3
|
+
*
|
|
4
|
+
* SQLite remains authoritative for the round plan, timing and verdict. This
|
|
5
|
+
* sidecar answers only the question SQLite cannot: what the parent and its
|
|
6
|
+
* lens subagents are doing right now. Missing/stale data is UNKNOWN, never
|
|
7
|
+
* inferred as pending or done.
|
|
8
|
+
*/
|
|
9
|
+
import { appendFileSync, renameSync, statSync } from "node:fs";
|
|
10
|
+
import { PASS_TIER_ORDER } from "./types.js";
|
|
11
|
+
export const LIVE_AGENT_STATUSES = ["running", "completed", "failed"];
|
|
12
|
+
export function isLiveAgentStatus(value) {
|
|
13
|
+
return typeof value === "string" && LIVE_AGENT_STATUSES.some((status) => status === value);
|
|
14
|
+
}
|
|
15
|
+
/** Built pass agents append their model tier to the lens identity. SQLite's
|
|
16
|
+
* authoritative plan stores the lens, while Pi progress reports the invoked
|
|
17
|
+
* agent, so every comparison crosses this one normalization seam. */
|
|
18
|
+
export function lensForAgent(agent) {
|
|
19
|
+
return agent.replace(TIER_SUFFIX, "");
|
|
20
|
+
}
|
|
21
|
+
/** `--<tier>` for every tier on the ladder (`PASS_TIER_ORDER`). */
|
|
22
|
+
const TIER_SUFFIX = new RegExp(`--(?:${PASS_TIER_ORDER.join("|")})$`);
|
|
23
|
+
/** A pass execution that has ended, either way. */
|
|
24
|
+
export function isTerminalAgentStatus(status) {
|
|
25
|
+
return status === "completed" || status === "failed";
|
|
26
|
+
}
|
|
27
|
+
/** A required lens is complete only when it ran and all its executions ended. */
|
|
28
|
+
export function executionsComplete(executions) {
|
|
29
|
+
return executions.length > 0 && executions.every((agent) => isTerminalAgentStatus(agent.status));
|
|
30
|
+
}
|
|
31
|
+
/** The executions that open a round's fanout: a started run of one of the
|
|
32
|
+
* plan's DISCOVERY lenses. Validator-first, an added lens or a foreign
|
|
33
|
+
* subagent never counts. */
|
|
34
|
+
export function plannedFanoutAgents(progress, planned) {
|
|
35
|
+
const discovery = planned.filter((name) => name !== "pass-validate");
|
|
36
|
+
return progress.agents.filter((agent) => discovery.includes(lensForAgent(agent.agent)) && agent.started_at !== undefined);
|
|
37
|
+
}
|
|
38
|
+
/** Classify the current parent stage from immutable milestones plus the
|
|
39
|
+
* authoritative round plan. Activity text and heartbeat age are deliberately
|
|
40
|
+
* absent: they can describe a stage but can never renew it. */
|
|
41
|
+
export function roundExecutionStage(progress, planned) {
|
|
42
|
+
if (progress.version !== 2 || !progress.command_id || !progress.command_sha256)
|
|
43
|
+
return "unknown";
|
|
44
|
+
if (progress.parent_status === "settled")
|
|
45
|
+
return "finalized";
|
|
46
|
+
if (plannedFanoutAgents(progress, planned).length === 0)
|
|
47
|
+
return progress.preparing_at ? "preparing" : "accepted";
|
|
48
|
+
const terminal = isTerminalAgentStatus;
|
|
49
|
+
const plannedComplete = planned.every((name) => {
|
|
50
|
+
const executions = progress.agents.filter((agent) => lensForAgent(agent.agent) === name);
|
|
51
|
+
return executionsComplete(executions);
|
|
52
|
+
});
|
|
53
|
+
const addedComplete = progress.agents
|
|
54
|
+
.filter((agent) => !planned.includes(lensForAgent(agent.agent)))
|
|
55
|
+
.every((agent) => terminal(agent.status));
|
|
56
|
+
return plannedComplete && addedComplete ? "passes-complete" : "fanout-started";
|
|
57
|
+
}
|
|
58
|
+
function instant(value) {
|
|
59
|
+
if (typeof value !== "string")
|
|
60
|
+
return undefined;
|
|
61
|
+
const parsed = Date.parse(value);
|
|
62
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
63
|
+
}
|
|
64
|
+
/** Parse an untrusted remote sidecar. A malformed file is simply unavailable. */
|
|
65
|
+
export function parseRoundProgress(raw) {
|
|
66
|
+
try {
|
|
67
|
+
const value = JSON.parse(raw);
|
|
68
|
+
if ((value.version !== 1 && value.version !== 2) ||
|
|
69
|
+
!Number.isInteger(value.pr) ||
|
|
70
|
+
typeof value.session !== "string" ||
|
|
71
|
+
instant(value.run_started_at) === undefined ||
|
|
72
|
+
instant(value.updated_at) === undefined ||
|
|
73
|
+
(value.parent_status !== "active" && value.parent_status !== "settled") ||
|
|
74
|
+
(value.command_id === undefined) !== (value.command_sha256 === undefined) ||
|
|
75
|
+
(value.command_id !== undefined && typeof value.command_id !== "string") ||
|
|
76
|
+
(value.command_sha256 !== undefined &&
|
|
77
|
+
(typeof value.command_sha256 !== "string" ||
|
|
78
|
+
!/^[a-f0-9]{64}$/.test(value.command_sha256))) ||
|
|
79
|
+
(value.round_no !== undefined && (!Number.isInteger(value.round_no) || value.round_no < 1)) ||
|
|
80
|
+
(value.head_sha !== undefined &&
|
|
81
|
+
(typeof value.head_sha !== "string" || value.head_sha.length === 0)) ||
|
|
82
|
+
instant(value.last_activity_at) === undefined ||
|
|
83
|
+
typeof value.last_activity !== "string" ||
|
|
84
|
+
!Array.isArray(value.agents))
|
|
85
|
+
return undefined;
|
|
86
|
+
const runStarted = instant(value.run_started_at);
|
|
87
|
+
const accepted = value.command_accepted_at === undefined ? undefined : instant(value.command_accepted_at);
|
|
88
|
+
const preparing = value.preparing_at === undefined ? undefined : instant(value.preparing_at);
|
|
89
|
+
const firstLens = value.first_lens_started_at === undefined ? undefined : instant(value.first_lens_started_at);
|
|
90
|
+
const fanout = value.fanout_started_at === undefined ? undefined : instant(value.fanout_started_at);
|
|
91
|
+
if ((value.command_accepted_at !== undefined && accepted === undefined) ||
|
|
92
|
+
(value.preparing_at !== undefined && preparing === undefined) ||
|
|
93
|
+
(value.first_lens_started_at !== undefined && firstLens === undefined) ||
|
|
94
|
+
(value.fanout_started_at !== undefined && fanout === undefined) ||
|
|
95
|
+
(accepted !== undefined && accepted < runStarted) ||
|
|
96
|
+
(accepted !== undefined && preparing !== undefined && preparing < accepted) ||
|
|
97
|
+
(accepted !== undefined && firstLens !== undefined && firstLens < accepted) ||
|
|
98
|
+
(preparing !== undefined && fanout !== undefined && fanout < preparing) ||
|
|
99
|
+
(firstLens !== undefined && fanout !== undefined && firstLens !== fanout))
|
|
100
|
+
return undefined;
|
|
101
|
+
if (value.version === 2 && value.command_id !== undefined && accepted === undefined)
|
|
102
|
+
return undefined;
|
|
103
|
+
if (value.version === 2 &&
|
|
104
|
+
value.agents.length > 0 &&
|
|
105
|
+
firstLens === undefined &&
|
|
106
|
+
fanout === undefined)
|
|
107
|
+
return undefined;
|
|
108
|
+
for (const rawAgent of value.agents) {
|
|
109
|
+
if (rawAgent === null || typeof rawAgent !== "object" || Array.isArray(rawAgent))
|
|
110
|
+
return undefined;
|
|
111
|
+
const agent = rawAgent;
|
|
112
|
+
if ((value.version === 2 && typeof agent.execution_id !== "string") ||
|
|
113
|
+
typeof agent.agent !== "string" ||
|
|
114
|
+
(agent.phase !== undefined && !["plan", "sweep", "optional"].includes(agent.phase)) ||
|
|
115
|
+
!isLiveAgentStatus(agent.status) ||
|
|
116
|
+
typeof agent.duration_ms !== "number" ||
|
|
117
|
+
!Number.isFinite(agent.duration_ms) ||
|
|
118
|
+
typeof agent.tool_count !== "number" ||
|
|
119
|
+
!Number.isFinite(agent.tool_count))
|
|
120
|
+
return undefined;
|
|
121
|
+
const started = agent.started_at === undefined ? undefined : instant(agent.started_at);
|
|
122
|
+
const finished = agent.finished_at === undefined ? undefined : instant(agent.finished_at);
|
|
123
|
+
if ((agent.started_at !== undefined && started === undefined) ||
|
|
124
|
+
(agent.finished_at !== undefined && finished === undefined) ||
|
|
125
|
+
(started !== undefined && started < runStarted) ||
|
|
126
|
+
(accepted !== undefined && started !== undefined && started < accepted) ||
|
|
127
|
+
(started !== undefined && finished !== undefined && finished < started) ||
|
|
128
|
+
(finished !== undefined && finished > instant(value.updated_at)) ||
|
|
129
|
+
(value.version === 2 && started === undefined) ||
|
|
130
|
+
(value.version === 2 && agent.status === "running" && finished !== undefined) ||
|
|
131
|
+
(value.version === 2 && agent.status !== "running" && finished === undefined))
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
if (value.version === 2) {
|
|
135
|
+
const ids = value.agents.map((agent) => agent.execution_id);
|
|
136
|
+
if (new Set(ids).size !== ids.length)
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
return value;
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** Size cap of the live log. A transition line is ~200–300 bytes and a round
|
|
146
|
+
* writes a few dozen (sweeps a little over a hundred), so 256 KiB holds many
|
|
147
|
+
* rounds of one PR. Past it the file rotates ONCE to `.jsonl.1` (the previous
|
|
148
|
+
* `.1` dropped), so a PR never holds more than ~512 KiB of log. Rotation is
|
|
149
|
+
* per line, not per round: a round may straddle the two files, so a
|
|
150
|
+
* reconstruction reads `.jsonl.1` then `.jsonl`. */
|
|
151
|
+
export const PROGRESS_LOG_MAX_BYTES = 256 * 1024;
|
|
152
|
+
/** `pr-<n>.json` → `pr-<n>.jsonl`. */
|
|
153
|
+
export function progressLogPath(snapshotPath) {
|
|
154
|
+
return snapshotPath.replace(/\.json$/, ".jsonl");
|
|
155
|
+
}
|
|
156
|
+
/** Append one line, rotating first when it would cross the cap. Throws on an
|
|
157
|
+
* I/O failure — the caller (the extension) logs and carries on. */
|
|
158
|
+
export function appendProgressLog(path, line, maxBytes = PROGRESS_LOG_MAX_BYTES) {
|
|
159
|
+
const bytes = `${JSON.stringify(line)}\n`;
|
|
160
|
+
let size = 0;
|
|
161
|
+
try {
|
|
162
|
+
size = statSync(path).size;
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
if (err.code !== "ENOENT")
|
|
166
|
+
throw err;
|
|
167
|
+
}
|
|
168
|
+
if (size > 0 && size + Buffer.byteLength(bytes) > maxBytes)
|
|
169
|
+
renameSync(path, `${path}.1`);
|
|
170
|
+
appendFileSync(path, bytes);
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=round-progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"round-progress.js","sourceRoot":"","sources":["../../src/round-progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Start-derived round deadlines, shared by enforcement and status publication. */
|
|
2
|
+
export declare function roundStageDeadlines(started: number, bounds: {
|
|
3
|
+
first_pass_max_min: number;
|
|
4
|
+
passes_max_min: number;
|
|
5
|
+
running_max_min: number;
|
|
6
|
+
follow_up_sweep_extra_min?: number;
|
|
7
|
+
}, sweepOwed: boolean): {
|
|
8
|
+
first_pass_start: number;
|
|
9
|
+
passes_complete: number;
|
|
10
|
+
running_hard_bound: number;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=round-stage-deadlines.d.ts.map
|