@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,23 @@
|
|
|
1
|
+
// Where the core's own pi extensions are, as files: beside this module in
|
|
2
|
+
// whatever layout the package has. Built, this module is
|
|
3
|
+
// `dist/src/engine/extfiles.js` and the extensions are `dist/extensions/*.js`;
|
|
4
|
+
// run from source (vitest), it is `src/engine/extfiles.ts` and they are
|
|
5
|
+
// `extensions/*.ts`. Never a path under the caller's checkout: an installed
|
|
6
|
+
// package has none.
|
|
7
|
+
import { extname } from "node:path";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
/** The core's extension modules. */
|
|
10
|
+
export const CORE_EXTENSIONS = [
|
|
11
|
+
"bash-guard",
|
|
12
|
+
"finding-clusters",
|
|
13
|
+
"ledger-pin",
|
|
14
|
+
"lens",
|
|
15
|
+
"pi-tool",
|
|
16
|
+
];
|
|
17
|
+
/** The absolute file of the core extension `name`, resolved from `from` (this
|
|
18
|
+
* module's URL by default). */
|
|
19
|
+
export function coreExtensionFile(name, from = import.meta.url) {
|
|
20
|
+
const ext = extname(fileURLToPath(from)) === ".ts" ? ".ts" : ".js";
|
|
21
|
+
return fileURLToPath(new URL(`../../extensions/${name}${ext}`, from));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=extfiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extfiles.js","sourceRoot":"","sources":["../../../src/engine/extfiles.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yDAAyD;AACzD,+EAA+E;AAC/E,wEAAwE;AACxE,4EAA4E;AAC5E,oBAAoB;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,oCAAoC;AACpC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,YAAY;IACZ,kBAAkB;IAClB,YAAY;IACZ,MAAM;IACN,SAAS;CACD,CAAC;AAGX;+BAC+B;AAC/B,MAAM,UAAU,iBAAiB,CAAC,IAAmB,EAAE,OAAe,MAAM,CAAC,IAAI,CAAC,GAAG;IACnF,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACnE,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,oBAAoB,IAAI,GAAG,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type BenchAuthMode = "login" | "api-key";
|
|
2
|
+
/** The review providers an API-key run can use besides OpenAI/Anthropic, and
|
|
3
|
+
* the key each one's pi needs (src/bench/auth.ts `BENCH_PROVIDERS` adds the
|
|
4
|
+
* models.json a bench sandbox gets). */
|
|
5
|
+
export declare const KEY_ROUTE_PROVIDERS: {
|
|
6
|
+
readonly digitalocean: string;
|
|
7
|
+
readonly google: string;
|
|
8
|
+
};
|
|
9
|
+
export type BenchProviderId = keyof typeof KEY_ROUTE_PROVIDERS;
|
|
10
|
+
export declare function benchProvider(env?: NodeJS.ProcessEnv): BenchProviderId | undefined;
|
|
11
|
+
/** The sandbox's credential route, from `QCR_BENCH_AUTH` (unset = login). */
|
|
12
|
+
export declare function benchAuthMode(env?: NodeJS.ProcessEnv): BenchAuthMode;
|
|
13
|
+
/** A pi model spec as it runs under `mode`: the ChatGPT-login provider
|
|
14
|
+
* `openai-codex/` becomes the public API's `openai/` on the key route;
|
|
15
|
+
* every other spec (and every spec on the login route) is unchanged. */
|
|
16
|
+
export declare function modelForAuth(spec: string, mode?: BenchAuthMode): string;
|
|
17
|
+
/** The API keys a pi process may see on the key route — read from the
|
|
18
|
+
* container's environment (bench.sh's --env-file), passed on by NAME only.
|
|
19
|
+
* Empty on the login route, so nothing changes there. */
|
|
20
|
+
export declare function apiKeyEnv(mode?: BenchAuthMode, env?: NodeJS.ProcessEnv): Record<string, string>;
|
|
21
|
+
//# sourceMappingURL=keyroute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyroute.d.ts","sourceRoot":"","sources":["../../../src/engine/keyroute.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,CAAC;AAEhD;;wCAEwC;AACxC,eAAO,MAAM,mBAAmB;;;CAGtB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,mBAAmB,CAAC;AAE/D,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,eAAe,GAAG,SAAS,CAO/F;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,aAAa,CAKjF;AAED;;wEAEwE;AACxE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,aAA+B,GAAG,MAAM,CAExF;AAED;;yDAEyD;AACzD,wBAAgB,SAAS,CACvB,IAAI,GAAE,aAA+B,EACrC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// The credential route a one-shot round runs on. Shared by the bench and
|
|
2
|
+
// `qcr review`, so it is core; the bench's login handling and its provider
|
|
3
|
+
// catalogs stay in src/bench/auth.ts.
|
|
4
|
+
//
|
|
5
|
+
// The published bench runs used a ChatGPT login; an outsider re-running the
|
|
6
|
+
// benchmark brings an API key instead. `QCR_BENCH_AUTH=api-key`:
|
|
7
|
+
// - every `openai-codex/` model spec (the ChatGPT-login provider) is
|
|
8
|
+
// rewritten to `openai/`, the same model id on the public OpenAI API;
|
|
9
|
+
// - a pi process sees the provider's key, by NAME from the environment
|
|
10
|
+
// (`apiKeyEnv`), never on argv.
|
|
11
|
+
import { RUNTIME_KEY_ENVS } from "./auth.js";
|
|
12
|
+
/** The review providers an API-key run can use besides OpenAI/Anthropic, and
|
|
13
|
+
* the key each one's pi needs (src/bench/auth.ts `BENCH_PROVIDERS` adds the
|
|
14
|
+
* models.json a bench sandbox gets). */
|
|
15
|
+
export const KEY_ROUTE_PROVIDERS = {
|
|
16
|
+
digitalocean: RUNTIME_KEY_ENVS["digitalocean"],
|
|
17
|
+
google: RUNTIME_KEY_ENVS["google"],
|
|
18
|
+
};
|
|
19
|
+
export function benchProvider(env = process.env) {
|
|
20
|
+
const provider = env["QCR_BENCH_PROVIDER"];
|
|
21
|
+
if (!provider)
|
|
22
|
+
return undefined;
|
|
23
|
+
if (Object.hasOwn(KEY_ROUTE_PROVIDERS, provider))
|
|
24
|
+
return provider;
|
|
25
|
+
throw new Error(`QCR_BENCH_PROVIDER must be ${Object.keys(KEY_ROUTE_PROVIDERS).join(" | ")} or unset`);
|
|
26
|
+
}
|
|
27
|
+
/** The sandbox's credential route, from `QCR_BENCH_AUTH` (unset = login). */
|
|
28
|
+
export function benchAuthMode(env = process.env) {
|
|
29
|
+
const v = (env["QCR_BENCH_AUTH"] ?? "").trim();
|
|
30
|
+
if (v === "" || v === "login")
|
|
31
|
+
return "login";
|
|
32
|
+
if (v === "api-key")
|
|
33
|
+
return "api-key";
|
|
34
|
+
throw new Error(`QCR_BENCH_AUTH must be login | api-key (got "${v}")`);
|
|
35
|
+
}
|
|
36
|
+
/** A pi model spec as it runs under `mode`: the ChatGPT-login provider
|
|
37
|
+
* `openai-codex/` becomes the public API's `openai/` on the key route;
|
|
38
|
+
* every other spec (and every spec on the login route) is unchanged. */
|
|
39
|
+
export function modelForAuth(spec, mode = benchAuthMode()) {
|
|
40
|
+
return mode === "api-key" ? spec.replace(/^openai-codex\//, "openai/") : spec;
|
|
41
|
+
}
|
|
42
|
+
/** The API keys a pi process may see on the key route — read from the
|
|
43
|
+
* container's environment (bench.sh's --env-file), passed on by NAME only.
|
|
44
|
+
* Empty on the login route, so nothing changes there. */
|
|
45
|
+
export function apiKeyEnv(mode = benchAuthMode(), env = process.env) {
|
|
46
|
+
if (mode !== "api-key")
|
|
47
|
+
return {};
|
|
48
|
+
const out = {};
|
|
49
|
+
const provider = benchProvider(env);
|
|
50
|
+
const keys = provider ? [KEY_ROUTE_PROVIDERS[provider]] : ["OPENAI_API_KEY", "ANTHROPIC_API_KEY"];
|
|
51
|
+
for (const k of keys) {
|
|
52
|
+
const v = env[k];
|
|
53
|
+
if (v)
|
|
54
|
+
out[k] = v;
|
|
55
|
+
}
|
|
56
|
+
return out;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=keyroute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyroute.js","sourceRoot":"","sources":["../../../src/engine/keyroute.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,2EAA2E;AAC3E,sCAAsC;AACtC,EAAE;AACF,4EAA4E;AAC5E,iEAAiE;AACjE,uEAAuE;AACvE,0EAA0E;AAC1E,yEAAyE;AACzE,oCAAoC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAI7C;;wCAEwC;AACxC,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,YAAY,EAAE,gBAAgB,CAAC,cAAc,CAAE;IAC/C,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAE;CAC3B,CAAC;AAGX,MAAM,UAAU,aAAa,CAAC,MAAyB,OAAO,CAAC,GAAG;IAChE,MAAM,QAAQ,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,IAAI,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,QAAQ,CAAC;QAAE,OAAO,QAA2B,CAAC;IACrF,MAAM,IAAI,KAAK,CACb,8BAA8B,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CACtF,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,aAAa,CAAC,MAAyB,OAAO,CAAC,GAAG;IAChE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IAC9C,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACtC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,IAAI,CAAC,CAAC;AACzE,CAAC;AAED;;wEAEwE;AACxE,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,OAAsB,aAAa,EAAE;IAC9E,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChF,CAAC;AAED;;yDAEyD;AACzD,MAAM,UAAU,SAAS,CACvB,OAAsB,aAAa,EAAE,EACrC,MAAyB,OAAO,CAAC,GAAG;IAEpC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;IAClG,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** A group older than this starts afresh: the provider's cache is short-lived. */
|
|
2
|
+
export declare const CACHE_GROUP_MAX_AGE_MS: number;
|
|
3
|
+
/** One cache group's place: its key, whether the caller is its first child,
|
|
4
|
+
* and how long a pack-less child should wait. */
|
|
5
|
+
export interface CacheSlot {
|
|
6
|
+
key: string;
|
|
7
|
+
first: boolean;
|
|
8
|
+
delayMs: number;
|
|
9
|
+
}
|
|
10
|
+
/** Hands out cache keys: per model, one per group of `size` children, a fresh
|
|
11
|
+
* group when the last is full or stale. */
|
|
12
|
+
export declare class CacheGrouper {
|
|
13
|
+
readonly size: number;
|
|
14
|
+
readonly staggerMs: number;
|
|
15
|
+
private readonly newKey;
|
|
16
|
+
private readonly groups;
|
|
17
|
+
constructor(size: number, staggerMs: number, newKey?: () => string);
|
|
18
|
+
next(now: number, model?: string): CacheSlot;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=cache-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-group.d.ts","sourceRoot":"","sources":["../../../../src/engine/lens/cache-group.ts"],"names":[],"mappings":"AAMA,kFAAkF;AAClF,eAAO,MAAM,sBAAsB,QAAa,CAAC;AAEjD;iDACiD;AACjD,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;2CAC2C;AAC3C,qBAAa,YAAY;IAIrB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyE;gBAGrF,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACT,MAAM,GAAE,MAAM,MAAmB;IAGpD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,SAAS;CAUzC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Cache grouping for lens children: which provider cache key a child shares.
|
|
2
|
+
// Pure (the key source is injectable). Lifted from the retired
|
|
3
|
+
// extensions/subagents.ts; the rationale for the groups is in
|
|
4
|
+
// docs/prompt-caching.md.
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
6
|
+
/** A group older than this starts afresh: the provider's cache is short-lived. */
|
|
7
|
+
export const CACHE_GROUP_MAX_AGE_MS = 4 * 60_000;
|
|
8
|
+
/** Hands out cache keys: per model, one per group of `size` children, a fresh
|
|
9
|
+
* group when the last is full or stale. */
|
|
10
|
+
export class CacheGrouper {
|
|
11
|
+
size;
|
|
12
|
+
staggerMs;
|
|
13
|
+
newKey;
|
|
14
|
+
groups = new Map();
|
|
15
|
+
constructor(size, staggerMs, newKey = randomUUID) {
|
|
16
|
+
this.size = size;
|
|
17
|
+
this.staggerMs = staggerMs;
|
|
18
|
+
this.newKey = newKey;
|
|
19
|
+
}
|
|
20
|
+
next(now, model = "") {
|
|
21
|
+
const g = this.groups.get(model);
|
|
22
|
+
if (g === undefined || g.members >= this.size || now - g.leaderAt > CACHE_GROUP_MAX_AGE_MS) {
|
|
23
|
+
const key = this.newKey();
|
|
24
|
+
this.groups.set(model, { key, leaderAt: now, members: 1 });
|
|
25
|
+
return { key, first: true, delayMs: 0 };
|
|
26
|
+
}
|
|
27
|
+
g.members += 1;
|
|
28
|
+
return { key: g.key, first: false, delayMs: Math.max(0, g.leaderAt + this.staggerMs - now) };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=cache-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-group.js","sourceRoot":"","sources":["../../../../src/engine/lens/cache-group.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,+DAA+D;AAC/D,8DAA8D;AAC9D,0BAA0B;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,kFAAkF;AAClF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAG,MAAM,CAAC;AAUjD;2CAC2C;AAC3C,MAAM,OAAO,YAAY;IAIZ;IACA;IACQ;IALF,MAAM,GAAG,IAAI,GAAG,EAA8D,CAAC;IAEhG,YACW,IAAY,EACZ,SAAiB,EACT,SAAuB,UAAU;QAFzC,SAAI,GAAJ,IAAI,CAAQ;QACZ,cAAS,GAAT,SAAS,CAAQ;QACT,WAAM,GAAN,MAAM,CAA2B;IACjD,CAAC;IAEJ,IAAI,CAAC,GAAW,EAAE,KAAK,GAAG,EAAE;QAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,QAAQ,GAAG,sBAAsB,EAAE,CAAC;YAC3F,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3D,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAC1C,CAAC;QACD,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;QACf,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,EAAE,CAAC;IAC/F,CAAC;CACF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** The longest a packed group's lens waits for its warm-up. */
|
|
2
|
+
export declare const WARMUP_WAIT_MS = 30000;
|
|
3
|
+
/** The warm-up's whole task: it exists to put the pack in the cache. */
|
|
4
|
+
export declare const WARMUP_REPLY_TASK = "Reply with the single word OK.";
|
|
5
|
+
/** What the group disposes: a pi session, as far as the group knows it. */
|
|
6
|
+
export interface Retired {
|
|
7
|
+
dispose(): void;
|
|
8
|
+
}
|
|
9
|
+
/** One group's shared state while any member is alive. */
|
|
10
|
+
declare class Lifetime {
|
|
11
|
+
members: number;
|
|
12
|
+
readonly sessions: Retired[];
|
|
13
|
+
/** The group's warm-up, memoised: set once, by the group's first lens. */
|
|
14
|
+
warmup: Promise<void> | undefined;
|
|
15
|
+
}
|
|
16
|
+
/** A member's hold on its group. Released exactly once. */
|
|
17
|
+
export declare class CacheLease {
|
|
18
|
+
readonly key: string;
|
|
19
|
+
/** Whether this member is the group's first. */
|
|
20
|
+
readonly first: boolean;
|
|
21
|
+
/** How long a pack-less member should wait before starting. */
|
|
22
|
+
readonly delayMs: number;
|
|
23
|
+
private readonly life;
|
|
24
|
+
private readonly leave;
|
|
25
|
+
private released;
|
|
26
|
+
constructor(key: string,
|
|
27
|
+
/** Whether this member is the group's first. */
|
|
28
|
+
first: boolean,
|
|
29
|
+
/** How long a pack-less member should wait before starting. */
|
|
30
|
+
delayMs: number, life: Lifetime, leave: () => void);
|
|
31
|
+
/** A finished session, to be disposed with the group, never before. */
|
|
32
|
+
keep(session: Retired): void;
|
|
33
|
+
/** The group's warm-up if one was started, to await. */
|
|
34
|
+
warmup(): Promise<void> | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Start the group's warm-up unless it already started; return it either way.
|
|
37
|
+
* `run` never rejects; it is handed `keep` for the session it makes. The
|
|
38
|
+
* warm-up is a member of the group until it settles, so a group whose lenses
|
|
39
|
+
* all finished first still waits to dispose it.
|
|
40
|
+
*/
|
|
41
|
+
startWarmup(run: (keep: (s: Retired) => void) => Promise<void>): Promise<void>;
|
|
42
|
+
/** The member is done with the group. The last release disposes its sessions. */
|
|
43
|
+
release(): void;
|
|
44
|
+
}
|
|
45
|
+
/** Per model, cache groups of `size`; each live group's lifetime. */
|
|
46
|
+
export declare class CacheGroups {
|
|
47
|
+
private readonly onDisposed?;
|
|
48
|
+
private readonly grouper;
|
|
49
|
+
private readonly lives;
|
|
50
|
+
/** `onDisposed` is told each time a group's sessions are disposed: the
|
|
51
|
+
* production evidence the cleanupSessionResources pin rests on. */
|
|
52
|
+
constructor(size: number, staggerMs: number, newKey?: () => string, onDisposed?: ((key: string, sessions: number) => void) | undefined);
|
|
53
|
+
/** Join the group for `model`'s next lens. */
|
|
54
|
+
join(model: string, nowMs: number): CacheLease;
|
|
55
|
+
private settle;
|
|
56
|
+
/** Groups with a member alive now (diagnostics and tests). */
|
|
57
|
+
liveGroups(): number;
|
|
58
|
+
}
|
|
59
|
+
/** Resolve after `ms`, or as soon as `signal` aborts (the caller then checks it). */
|
|
60
|
+
export declare function delay(ms: number, signal?: AbortSignal): Promise<void>;
|
|
61
|
+
/** Wait for `p`, but at most `ms` (or until `signal` aborts). True when `p`
|
|
62
|
+
* settled first. The timer never outlives the wait. */
|
|
63
|
+
export declare function settledWithin(p: Promise<unknown>, ms: number, signal?: AbortSignal): Promise<boolean>;
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=cache-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-run.d.ts","sourceRoot":"","sources":["../../../../src/engine/lens/cache-run.ts"],"names":[],"mappings":"AAkBA,+DAA+D;AAC/D,eAAO,MAAM,cAAc,QAAS,CAAC;AACrC,wEAAwE;AACxE,eAAO,MAAM,iBAAiB,mCAAmC,CAAC;AAElE,2EAA2E;AAC3E,MAAM,WAAW,OAAO;IACtB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,0DAA0D;AAC1D,cAAM,QAAQ;IACZ,OAAO,SAAK;IACZ,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAM;IAClC,0EAA0E;IAC1E,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;CACnC;AAED,2DAA2D;AAC3D,qBAAa,UAAU;IAInB,QAAQ,CAAC,GAAG,EAAE,MAAM;IACpB,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,OAAO;IACvB,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IATxB,OAAO,CAAC,QAAQ,CAAS;gBAGd,GAAG,EAAE,MAAM;IACpB,gDAAgD;IACvC,KAAK,EAAE,OAAO;IACvB,+DAA+D;IACtD,OAAO,EAAE,MAAM,EACP,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,MAAM,IAAI;IAGpC,uEAAuE;IACvE,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI5B,wDAAwD;IACxD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS;IAInC;;;;;OAKG;IACH,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9E,iFAAiF;IACjF,OAAO,IAAI,IAAI;CAMhB;AAED,qEAAqE;AACrE,qBAAa,WAAW;IAUpB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAT9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;IAErD;uEACmE;gBAEjE,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,MAAM,EACJ,UAAU,CAAC,GAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,aAAA;IAKvE,8CAA8C;IAC9C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU;IAc9C,OAAO,CAAC,MAAM;IAcd,8DAA8D;IAC9D,UAAU,IAAI,MAAM;CAGrB;AAED,qFAAqF;AACrF,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAWrE;AAED;uDACuD;AACvD,wBAAsB,aAAa,CACjC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,EACnB,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,CAAC,CAalB"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// The runtime side of lens cache groups: who shares a group, when a group
|
|
2
|
+
// is warm, and when its sessions may be disposed. Pure over its injected clock
|
|
3
|
+
// and key source (no pi, no filesystem); the runner supplies the sessions.
|
|
4
|
+
//
|
|
5
|
+
// A group's lens sessions share ONE session id, which is its cache key: pi
|
|
6
|
+
// derives prompt_cache_key and the routing headers from the session id, so
|
|
7
|
+
// that is what puts the group's requests on one backend cache
|
|
8
|
+
// (docs/probes/p4.6-codex-cache-routing.md). The price is in dispose: pi's
|
|
9
|
+
// session.dispose() runs cleanupSessionResources(sessionId), which closes
|
|
10
|
+
// every provider transport held for that id, a sibling's live websocket
|
|
11
|
+
// included. So no session of a group is disposed until the whole group is done:
|
|
12
|
+
// each member leases the group, hands its finished sessions over with keep(),
|
|
13
|
+
// and the last release disposes them together.
|
|
14
|
+
//
|
|
15
|
+
// Seen in production at pi 1.3.0: cleanupSessionResources closes by session id
|
|
16
|
+
// alone (groups disposed their sessions together, and no sibling lens failed after).
|
|
17
|
+
import { CacheGrouper } from "./cache-group.js";
|
|
18
|
+
/** The longest a packed group's lens waits for its warm-up. */
|
|
19
|
+
export const WARMUP_WAIT_MS = 30_000;
|
|
20
|
+
/** The warm-up's whole task: it exists to put the pack in the cache. */
|
|
21
|
+
export const WARMUP_REPLY_TASK = "Reply with the single word OK.";
|
|
22
|
+
/** One group's shared state while any member is alive. */
|
|
23
|
+
class Lifetime {
|
|
24
|
+
members = 0;
|
|
25
|
+
sessions = [];
|
|
26
|
+
/** The group's warm-up, memoised: set once, by the group's first lens. */
|
|
27
|
+
warmup;
|
|
28
|
+
}
|
|
29
|
+
/** A member's hold on its group. Released exactly once. */
|
|
30
|
+
export class CacheLease {
|
|
31
|
+
key;
|
|
32
|
+
first;
|
|
33
|
+
delayMs;
|
|
34
|
+
life;
|
|
35
|
+
leave;
|
|
36
|
+
released = false;
|
|
37
|
+
constructor(key,
|
|
38
|
+
/** Whether this member is the group's first. */
|
|
39
|
+
first,
|
|
40
|
+
/** How long a pack-less member should wait before starting. */
|
|
41
|
+
delayMs, life, leave) {
|
|
42
|
+
this.key = key;
|
|
43
|
+
this.first = first;
|
|
44
|
+
this.delayMs = delayMs;
|
|
45
|
+
this.life = life;
|
|
46
|
+
this.leave = leave;
|
|
47
|
+
}
|
|
48
|
+
/** A finished session, to be disposed with the group, never before. */
|
|
49
|
+
keep(session) {
|
|
50
|
+
this.life.sessions.push(session);
|
|
51
|
+
}
|
|
52
|
+
/** The group's warm-up if one was started, to await. */
|
|
53
|
+
warmup() {
|
|
54
|
+
return this.life.warmup;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Start the group's warm-up unless it already started; return it either way.
|
|
58
|
+
* `run` never rejects; it is handed `keep` for the session it makes. The
|
|
59
|
+
* warm-up is a member of the group until it settles, so a group whose lenses
|
|
60
|
+
* all finished first still waits to dispose it.
|
|
61
|
+
*/
|
|
62
|
+
startWarmup(run) {
|
|
63
|
+
if (this.life.warmup !== undefined)
|
|
64
|
+
return this.life.warmup;
|
|
65
|
+
this.life.members += 1;
|
|
66
|
+
const life = this.life;
|
|
67
|
+
const settle = () => {
|
|
68
|
+
life.members -= 1;
|
|
69
|
+
this.leave();
|
|
70
|
+
};
|
|
71
|
+
life.warmup = run((s) => life.sessions.push(s)).then(settle, settle);
|
|
72
|
+
return life.warmup;
|
|
73
|
+
}
|
|
74
|
+
/** The member is done with the group. The last release disposes its sessions. */
|
|
75
|
+
release() {
|
|
76
|
+
if (this.released)
|
|
77
|
+
return;
|
|
78
|
+
this.released = true;
|
|
79
|
+
this.life.members -= 1;
|
|
80
|
+
this.leave();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** Per model, cache groups of `size`; each live group's lifetime. */
|
|
84
|
+
export class CacheGroups {
|
|
85
|
+
onDisposed;
|
|
86
|
+
grouper;
|
|
87
|
+
lives = new Map();
|
|
88
|
+
/** `onDisposed` is told each time a group's sessions are disposed: the
|
|
89
|
+
* production evidence the cleanupSessionResources pin rests on. */
|
|
90
|
+
constructor(size, staggerMs, newKey, onDisposed) {
|
|
91
|
+
this.onDisposed = onDisposed;
|
|
92
|
+
this.grouper = new CacheGrouper(size, staggerMs, newKey);
|
|
93
|
+
}
|
|
94
|
+
/** Join the group for `model`'s next lens. */
|
|
95
|
+
join(model, nowMs) {
|
|
96
|
+
const slot = this.grouper.next(nowMs, model);
|
|
97
|
+
let life = this.lives.get(slot.key);
|
|
98
|
+
if (life === undefined) {
|
|
99
|
+
life = new Lifetime();
|
|
100
|
+
this.lives.set(slot.key, life);
|
|
101
|
+
}
|
|
102
|
+
life.members += 1;
|
|
103
|
+
const held = life;
|
|
104
|
+
return new CacheLease(slot.key, slot.first, slot.delayMs, held, () => this.settle(slot.key, held));
|
|
105
|
+
}
|
|
106
|
+
settle(key, life) {
|
|
107
|
+
if (life.members > 0)
|
|
108
|
+
return;
|
|
109
|
+
if (this.lives.get(key) === life)
|
|
110
|
+
this.lives.delete(key);
|
|
111
|
+
const retired = life.sessions.splice(0);
|
|
112
|
+
for (const s of retired) {
|
|
113
|
+
try {
|
|
114
|
+
s.dispose();
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// already disposed
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (retired.length > 0)
|
|
121
|
+
this.onDisposed?.(key, retired.length);
|
|
122
|
+
}
|
|
123
|
+
/** Groups with a member alive now (diagnostics and tests). */
|
|
124
|
+
liveGroups() {
|
|
125
|
+
return this.lives.size;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/** Resolve after `ms`, or as soon as `signal` aborts (the caller then checks it). */
|
|
129
|
+
export function delay(ms, signal) {
|
|
130
|
+
if (ms <= 0 || signal?.aborted)
|
|
131
|
+
return Promise.resolve();
|
|
132
|
+
return new Promise((resolve) => {
|
|
133
|
+
const done = () => {
|
|
134
|
+
clearTimeout(timer);
|
|
135
|
+
signal?.removeEventListener("abort", done);
|
|
136
|
+
resolve();
|
|
137
|
+
};
|
|
138
|
+
const timer = setTimeout(done, ms);
|
|
139
|
+
signal?.addEventListener("abort", done, { once: true });
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/** Wait for `p`, but at most `ms` (or until `signal` aborts). True when `p`
|
|
143
|
+
* settled first. The timer never outlives the wait. */
|
|
144
|
+
export async function settledWithin(p, ms, signal) {
|
|
145
|
+
const stop = new AbortController();
|
|
146
|
+
const timeout = signal ? AbortSignal.any([signal, stop.signal]) : stop.signal;
|
|
147
|
+
let won = false;
|
|
148
|
+
const settle = () => {
|
|
149
|
+
won = true;
|
|
150
|
+
};
|
|
151
|
+
try {
|
|
152
|
+
await Promise.race([p.then(settle, settle), delay(ms, timeout)]);
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
stop.abort();
|
|
156
|
+
}
|
|
157
|
+
return won;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=cache-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-run.js","sourceRoot":"","sources":["../../../../src/engine/lens/cache-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/** The shape of a native subagent tool result, as far as the glue reads it. */
|
|
2
|
+
export interface ParallelNativeResult {
|
|
3
|
+
content: Array<{
|
|
4
|
+
type: string;
|
|
5
|
+
text?: string;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
}>;
|
|
8
|
+
details: {
|
|
9
|
+
mode?: string;
|
|
10
|
+
results: unknown[];
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
};
|
|
13
|
+
isError?: boolean;
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
/** Env var carrying the per-pass deadline in minutes (on the VM, config.toml
|
|
17
|
+
* [pi] subagent_pass_deadline_min riding the session command line). Absent,
|
|
18
|
+
* "0" or malformed ⇒ no deadline: the companion and the bench run unchanged
|
|
19
|
+
* unless they set it. */
|
|
20
|
+
export declare const PASS_DEADLINE_ENV = "QCR_SUBAGENT_PASS_DEADLINE_MIN";
|
|
21
|
+
/** The per-pass deadline in ms, or undefined for none. Minutes may be
|
|
22
|
+
* fractional; anything but a plain non-negative number up to 240 is a
|
|
23
|
+
* misconfiguration and means no deadline (never a surprise kill). */
|
|
24
|
+
export declare function resolvePassDeadlineMs(env?: Record<string, string | undefined>): number | undefined;
|
|
25
|
+
/** "8", "0.5" — the deadline as the operator wrote it, for the failure text. */
|
|
26
|
+
export declare function minutesText(ms: number): string;
|
|
27
|
+
/** The failure text a pass that timed out twice returns in its slot. */
|
|
28
|
+
export declare function passTimeoutMessage(agent: string, deadlineMs: number): string;
|
|
29
|
+
/**
|
|
30
|
+
* Run one pass under the per-pass deadline: each attempt gets its own
|
|
31
|
+
* AbortSignal composed of the caller's signal OR a fresh timer, which native
|
|
32
|
+
* honours by killing its child (SIGTERM, then SIGKILL). An attempt the TIMER
|
|
33
|
+
* ended is retried once with a fresh deadline; a second timeout answers
|
|
34
|
+
* "timed_out". The caller's abort always wins and is never retried: it
|
|
35
|
+
* rethrows exactly as before. A result native returns after the timer fired
|
|
36
|
+
* (the child finished as it was being killed) is a result, not a timeout.
|
|
37
|
+
*/
|
|
38
|
+
export declare function runUnderDeadline<T>(attempt: (signal: AbortSignal) => Promise<T>, callerSignal: AbortSignal | undefined, deadlineMs: number, onTimeout?: (attemptNo: number) => void): Promise<T | "timed_out">;
|
|
39
|
+
/** The one task a call runs, when it runs exactly one: a single-mode
|
|
40
|
+
* `{agent, task}` call or a one-element `tasks` array. */
|
|
41
|
+
export declare function soleTask(params: Record<string, unknown>): {
|
|
42
|
+
agent: string;
|
|
43
|
+
task: unknown;
|
|
44
|
+
mode: "single" | "parallel";
|
|
45
|
+
} | undefined;
|
|
46
|
+
/** A pass that timed out twice, in native's own result shape for its mode,
|
|
47
|
+
* so the combined result, round-progress and the session read it as one
|
|
48
|
+
* failed pass with the timeout named. */
|
|
49
|
+
export declare function timedOutResult(sole: {
|
|
50
|
+
agent: string;
|
|
51
|
+
task: unknown;
|
|
52
|
+
mode: "single" | "parallel";
|
|
53
|
+
}, deadlineMs: number): ParallelNativeResult;
|
|
54
|
+
//# sourceMappingURL=deadline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deadline.d.ts","sourceRoot":"","sources":["../../../../src/engine/lens/deadline.ts"],"names":[],"mappings":"AAIA,+EAA+E;AAC/E,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IACxE,OAAO,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IACvE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;yBAGyB;AACzB,eAAO,MAAM,iBAAiB,mCAAmC,CAAC;AAElE;;qEAEqE;AACrE,wBAAgB,qBAAqB,CACnC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,MAAM,GAAG,SAAS,CAMpB;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EAC5C,YAAY,EAAE,WAAW,GAAG,SAAS,EACrC,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GACtC,OAAO,CAAC,CAAC,GAAG,WAAW,CAAC,CAmB1B;AAED;0DAC0D;AAC1D,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAA;CAAE,GAAG,SAAS,CAc3E;AAED;;yCAEyC;AACzC,wBAAgB,cAAc,CAC5B,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAA;CAAE,EACnE,UAAU,EAAE,MAAM,GACjB,oBAAoB,CA+BtB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// The per-pass deadline: its env knob, the retry-once runner and the result a
|
|
2
|
+
// pass that timed out twice answers with. Pure — no pi, no filesystem. Lifted
|
|
3
|
+
// from the retired extensions/subagents.ts.
|
|
4
|
+
/** Env var carrying the per-pass deadline in minutes (on the VM, config.toml
|
|
5
|
+
* [pi] subagent_pass_deadline_min riding the session command line). Absent,
|
|
6
|
+
* "0" or malformed ⇒ no deadline: the companion and the bench run unchanged
|
|
7
|
+
* unless they set it. */
|
|
8
|
+
export const PASS_DEADLINE_ENV = "QCR_SUBAGENT_PASS_DEADLINE_MIN";
|
|
9
|
+
/** The per-pass deadline in ms, or undefined for none. Minutes may be
|
|
10
|
+
* fractional; anything but a plain non-negative number up to 240 is a
|
|
11
|
+
* misconfiguration and means no deadline (never a surprise kill). */
|
|
12
|
+
export function resolvePassDeadlineMs(env = process.env) {
|
|
13
|
+
const raw = (env[PASS_DEADLINE_ENV] ?? "").trim();
|
|
14
|
+
if (!/^\d{1,3}(?:\.\d{1,6})?$/.test(raw))
|
|
15
|
+
return undefined;
|
|
16
|
+
const minutes = Number(raw);
|
|
17
|
+
if (!(minutes > 0) || minutes > 240)
|
|
18
|
+
return undefined;
|
|
19
|
+
return Math.max(1, Math.round(minutes * 60_000));
|
|
20
|
+
}
|
|
21
|
+
/** "8", "0.5" — the deadline as the operator wrote it, for the failure text. */
|
|
22
|
+
export function minutesText(ms) {
|
|
23
|
+
const min = ms / 60_000;
|
|
24
|
+
return Number.isInteger(min) ? String(min) : String(Number(min.toFixed(3)));
|
|
25
|
+
}
|
|
26
|
+
/** The failure text a pass that timed out twice returns in its slot. */
|
|
27
|
+
export function passTimeoutMessage(agent, deadlineMs) {
|
|
28
|
+
return `pass ${agent} timed out after ${minutesText(deadlineMs)} min (retried once)`;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Run one pass under the per-pass deadline: each attempt gets its own
|
|
32
|
+
* AbortSignal composed of the caller's signal OR a fresh timer, which native
|
|
33
|
+
* honours by killing its child (SIGTERM, then SIGKILL). An attempt the TIMER
|
|
34
|
+
* ended is retried once with a fresh deadline; a second timeout answers
|
|
35
|
+
* "timed_out". The caller's abort always wins and is never retried: it
|
|
36
|
+
* rethrows exactly as before. A result native returns after the timer fired
|
|
37
|
+
* (the child finished as it was being killed) is a result, not a timeout.
|
|
38
|
+
*/
|
|
39
|
+
export async function runUnderDeadline(attempt, callerSignal, deadlineMs, onTimeout) {
|
|
40
|
+
for (let attemptNo = 1; attemptNo <= 2; attemptNo++) {
|
|
41
|
+
callerSignal?.throwIfAborted();
|
|
42
|
+
const timer = new AbortController();
|
|
43
|
+
const handle = setTimeout(() => timer.abort(new Error(`per-pass deadline of ${minutesText(deadlineMs)} min reached`)), deadlineMs);
|
|
44
|
+
const signal = callerSignal ? AbortSignal.any([callerSignal, timer.signal]) : timer.signal;
|
|
45
|
+
try {
|
|
46
|
+
return await attempt(signal);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
if (callerSignal?.aborted || !timer.signal.aborted)
|
|
50
|
+
throw err;
|
|
51
|
+
onTimeout?.(attemptNo);
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
clearTimeout(handle);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return "timed_out";
|
|
58
|
+
}
|
|
59
|
+
/** The one task a call runs, when it runs exactly one: a single-mode
|
|
60
|
+
* `{agent, task}` call or a one-element `tasks` array. */
|
|
61
|
+
export function soleTask(params) {
|
|
62
|
+
if (Array.isArray(params.tasks)) {
|
|
63
|
+
if (params.tasks.length !== 1)
|
|
64
|
+
return undefined;
|
|
65
|
+
const t = params.tasks[0];
|
|
66
|
+
const agent = typeof t === "object" && t !== null ? t.agent : undefined;
|
|
67
|
+
return typeof agent === "string"
|
|
68
|
+
? { agent, task: t.task, mode: "parallel" }
|
|
69
|
+
: undefined;
|
|
70
|
+
}
|
|
71
|
+
if (params.chain !== undefined)
|
|
72
|
+
return undefined;
|
|
73
|
+
return typeof params.agent === "string"
|
|
74
|
+
? { agent: params.agent, task: params.task, mode: "single" }
|
|
75
|
+
: undefined;
|
|
76
|
+
}
|
|
77
|
+
/** A pass that timed out twice, in native's own result shape for its mode,
|
|
78
|
+
* so the combined result, round-progress and the session read it as one
|
|
79
|
+
* failed pass with the timeout named. */
|
|
80
|
+
export function timedOutResult(sole, deadlineMs) {
|
|
81
|
+
const message = passTimeoutMessage(sole.agent, deadlineMs);
|
|
82
|
+
const result = {
|
|
83
|
+
agent: sole.agent,
|
|
84
|
+
agentSource: "unknown",
|
|
85
|
+
task: sole.task,
|
|
86
|
+
exitCode: 1,
|
|
87
|
+
messages: [],
|
|
88
|
+
stderr: "",
|
|
89
|
+
usage: {
|
|
90
|
+
input: 0,
|
|
91
|
+
output: 0,
|
|
92
|
+
cacheRead: 0,
|
|
93
|
+
cacheWrite: 0,
|
|
94
|
+
cost: 0,
|
|
95
|
+
contextTokens: 0,
|
|
96
|
+
turns: 0,
|
|
97
|
+
},
|
|
98
|
+
stopReason: "error",
|
|
99
|
+
errorMessage: message,
|
|
100
|
+
timedOut: true,
|
|
101
|
+
};
|
|
102
|
+
const text = sole.mode === "parallel"
|
|
103
|
+
? `Parallel: 0/1 succeeded\n\n### [${sole.agent}] failed (timeout)\n\n${message}`
|
|
104
|
+
: `Agent timeout: ${message}`;
|
|
105
|
+
return {
|
|
106
|
+
content: [{ type: "text", text }],
|
|
107
|
+
details: { mode: sole.mode, agentScope: undefined, projectAgentsDir: null, results: [result] },
|
|
108
|
+
isError: true,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=deadline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deadline.js","sourceRoot":"","sources":["../../../../src/engine/lens/deadline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RoundLensTools } from "../roundsdk.js";
|
|
2
|
+
import { type LensRun, type LensRunConfig, type LensRunner } from "./runlens.js";
|
|
3
|
+
import { LensWave } from "./wave.js";
|
|
4
|
+
export interface EngineLensTools extends RoundLensTools {
|
|
5
|
+
/** Starts a pass; the engine's wave and the session's `lens` run on it. */
|
|
6
|
+
runner: LensRunner;
|
|
7
|
+
/** The round's rows in flight. */
|
|
8
|
+
wave: LensWave;
|
|
9
|
+
}
|
|
10
|
+
/** `tap` hears every finished pass, however it was started (the wave, a `lens`
|
|
11
|
+
* call): a route that totals the passes' spend reads it there. */
|
|
12
|
+
export declare function engineLensTools(config: LensRunConfig, wave?: LensWave, tap?: (run: LensRun) => void): EngineLensTools;
|
|
13
|
+
//# sourceMappingURL=engine-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-tools.d.ts","sourceRoot":"","sources":["../../../../src/engine/lens/engine-tools.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAoB,KAAK,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEnG,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,2EAA2E;IAC3E,MAAM,EAAE,UAAU,CAAC;IACnB,kCAAkC;IAClC,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED;kEACkE;AAClE,wBAAgB,eAAe,CAC7B,MAAM,EAAE,aAAa,EACrB,IAAI,WAAiB,EACrB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAC3B,eAAe,CAuBjB"}
|