@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,37 @@
|
|
|
1
|
+
// The lens tools of an engine route's main session: `lens` and `lens_wave` over
|
|
2
|
+
// one LensRunner and one LensWave, handed to the session as `customTools`
|
|
3
|
+
// (roundsdk.ts RoundLensTools). A route builds this once per round's main
|
|
4
|
+
// session. The planned wave is started by the engine through `launchWave` on the
|
|
5
|
+
// same `wave` and `runner`; the session's `lens_wave` joins it.
|
|
6
|
+
import { lensTools } from "../../../extensions/lens.js";
|
|
7
|
+
import { createLensRunner } from "./runlens.js";
|
|
8
|
+
import { LENS_TOOL, LENS_WAVE_TOOL } from "./tool.js";
|
|
9
|
+
import { LensWave } from "./wave.js";
|
|
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 function engineLensTools(config, wave = new LensWave(), tap) {
|
|
13
|
+
const inner = createLensRunner(config);
|
|
14
|
+
const runner = tap
|
|
15
|
+
? {
|
|
16
|
+
run: async (request) => {
|
|
17
|
+
const run = await inner.run(request);
|
|
18
|
+
try {
|
|
19
|
+
tap(run);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// a listener's failure is not the pass's
|
|
23
|
+
}
|
|
24
|
+
return run;
|
|
25
|
+
},
|
|
26
|
+
liveSessions: () => inner.liveSessions(),
|
|
27
|
+
}
|
|
28
|
+
: inner;
|
|
29
|
+
return {
|
|
30
|
+
factories: [],
|
|
31
|
+
customTools: lensTools({ runner, wave, env: config.env }),
|
|
32
|
+
toolNames: [LENS_TOOL, LENS_WAVE_TOOL],
|
|
33
|
+
runner,
|
|
34
|
+
wave,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=engine-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-tools.js","sourceRoot":"","sources":["../../../../src/engine/lens/engine-tools.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,0EAA0E;AAC1E,0EAA0E;AAC1E,iFAAiF;AACjF,gEAAgE;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAqD,MAAM,cAAc,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AASrC;kEACkE;AAClE,MAAM,UAAU,eAAe,CAC7B,MAAqB,EACrB,IAAI,GAAG,IAAI,QAAQ,EAAE,EACrB,GAA4B;IAE5B,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAe,GAAG;QAC5B,CAAC,CAAC;YACE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBACrB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACrC,IAAI,CAAC;oBACH,GAAG,CAAC,GAAG,CAAC,CAAC;gBACX,CAAC;gBAAC,MAAM,CAAC;oBACP,yCAAyC;gBAC3C,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC;YACD,YAAY,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE;SACzC;QACH,CAAC,CAAC,KAAK,CAAC;IACV,OAAO;QACL,SAAS,EAAE,EAAE;QACb,WAAW,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;QACzD,SAAS,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC;QACtC,MAAM;QACN,IAAI;KACL,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Env var pinning the agent discovery scope (`user` | `project`); read by
|
|
2
|
+
* `lensAgentsDir` (round-lens.ts). */
|
|
3
|
+
export declare const SCOPE_ENV = "QCR_SUBAGENT_SCOPE";
|
|
4
|
+
/** Env var carrying the process-wide cap on running lens sessions. */
|
|
5
|
+
export declare const CONCURRENCY_ENV = "QCR_SUBAGENT_MAX_CONCURRENCY";
|
|
6
|
+
/** Env var: sessions per shared cache key; 0 or unset ⇒ a random id each. */
|
|
7
|
+
export declare const CACHE_GROUP_ENV = "QCR_SUBAGENT_CACHE_GROUP";
|
|
8
|
+
/** Env var: how long a group's later sessions start after its first. */
|
|
9
|
+
export declare const CACHE_STAGGER_ENV = "QCR_SUBAGENT_CACHE_STAGGER_MS";
|
|
10
|
+
/** Default process-wide cap, the companion's desktop number. Equal to
|
|
11
|
+
* `DEFAULT_LENS_MAX_CONCURRENCY` (config.ts; this file imports nothing from the
|
|
12
|
+
* daemon), pinned by a test. */
|
|
13
|
+
export declare const DEFAULT_MAX_CONCURRENCY = 4;
|
|
14
|
+
/** Equal to `DEFAULT_LENS_CACHE_STAGGER_MS` (config.ts), pinned by a test. */
|
|
15
|
+
export declare const DEFAULT_CACHE_STAGGER_MS = 2500;
|
|
16
|
+
/** Resolve the process-wide cap from the environment (invalid/absent → 4).
|
|
17
|
+
* Strict digits only — "1e3" or "6x" is a misconfiguration, and a
|
|
18
|
+
* misconfiguration falls back to the safe default rather than whatever
|
|
19
|
+
* parseInt salvages from the prefix. */
|
|
20
|
+
export declare function resolveMaxConcurrency(env?: Record<string, string | undefined>): number;
|
|
21
|
+
export declare function resolveCacheGroup(env?: Record<string, string | undefined>): number;
|
|
22
|
+
export declare function resolveCacheStagger(env?: Record<string, string | undefined>): number;
|
|
23
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../../src/engine/lens/env.ts"],"names":[],"mappings":"AAMA;sCACsC;AACtC,eAAO,MAAM,SAAS,uBAAuB,CAAC;AAE9C,sEAAsE;AACtE,eAAO,MAAM,eAAe,iCAAiC,CAAC;AAE9D,6EAA6E;AAC7E,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAE1D,wEAAwE;AACxE,eAAO,MAAM,iBAAiB,kCAAkC,CAAC;AAEjE;;gCAEgC;AAChC,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C;;;wCAGwC;AACxC,wBAAgB,qBAAqB,CACnC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,MAAM,CAKR;AAOD,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,MAAM,CAE/F;AAED,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,MAAM,CAEjG"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// The lens tool's env: the names its config rides on (round.ts and the bench
|
|
2
|
+
// set them from `[engine] lens_*`; the companion's launch line sets the cap)
|
|
3
|
+
// and the readers that turn them back into numbers. Pure. The names keep their
|
|
4
|
+
// `QCR_SUBAGENT_` spelling: they predate the lens tool, and the env inventory
|
|
5
|
+
// (packages/pi-plugin/src/engine/envmap.ts) and every launch line already carry them.
|
|
6
|
+
/** Env var pinning the agent discovery scope (`user` | `project`); read by
|
|
7
|
+
* `lensAgentsDir` (round-lens.ts). */
|
|
8
|
+
export const SCOPE_ENV = "QCR_SUBAGENT_SCOPE";
|
|
9
|
+
/** Env var carrying the process-wide cap on running lens sessions. */
|
|
10
|
+
export const CONCURRENCY_ENV = "QCR_SUBAGENT_MAX_CONCURRENCY";
|
|
11
|
+
/** Env var: sessions per shared cache key; 0 or unset ⇒ a random id each. */
|
|
12
|
+
export const CACHE_GROUP_ENV = "QCR_SUBAGENT_CACHE_GROUP";
|
|
13
|
+
/** Env var: how long a group's later sessions start after its first. */
|
|
14
|
+
export const CACHE_STAGGER_ENV = "QCR_SUBAGENT_CACHE_STAGGER_MS";
|
|
15
|
+
/** Default process-wide cap, the companion's desktop number. Equal to
|
|
16
|
+
* `DEFAULT_LENS_MAX_CONCURRENCY` (config.ts; this file imports nothing from the
|
|
17
|
+
* daemon), pinned by a test. */
|
|
18
|
+
export const DEFAULT_MAX_CONCURRENCY = 4;
|
|
19
|
+
/** Equal to `DEFAULT_LENS_CACHE_STAGGER_MS` (config.ts), pinned by a test. */
|
|
20
|
+
export const DEFAULT_CACHE_STAGGER_MS = 2500;
|
|
21
|
+
/** Resolve the process-wide cap from the environment (invalid/absent → 4).
|
|
22
|
+
* Strict digits only — "1e3" or "6x" is a misconfiguration, and a
|
|
23
|
+
* misconfiguration falls back to the safe default rather than whatever
|
|
24
|
+
* parseInt salvages from the prefix. */
|
|
25
|
+
export function resolveMaxConcurrency(env = process.env) {
|
|
26
|
+
const raw = (env[CONCURRENCY_ENV] ?? "").trim();
|
|
27
|
+
if (!/^\d{1,2}$/.test(raw))
|
|
28
|
+
return DEFAULT_MAX_CONCURRENCY;
|
|
29
|
+
const n = Number.parseInt(raw, 10);
|
|
30
|
+
return n >= 1 && n <= 64 ? n : DEFAULT_MAX_CONCURRENCY;
|
|
31
|
+
}
|
|
32
|
+
function nonNegativeInt(raw, fallback) {
|
|
33
|
+
const n = Number.parseInt((raw ?? "").trim(), 10);
|
|
34
|
+
return Number.isFinite(n) && n >= 0 ? n : fallback;
|
|
35
|
+
}
|
|
36
|
+
export function resolveCacheGroup(env = process.env) {
|
|
37
|
+
return nonNegativeInt(env[CACHE_GROUP_ENV], 0);
|
|
38
|
+
}
|
|
39
|
+
export function resolveCacheStagger(env = process.env) {
|
|
40
|
+
return nonNegativeInt(env[CACHE_STAGGER_ENV], DEFAULT_CACHE_STAGGER_MS);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../../src/engine/lens/env.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,+EAA+E;AAC/E,8EAA8E;AAC9E,sFAAsF;AAEtF;sCACsC;AACtC,MAAM,CAAC,MAAM,SAAS,GAAG,oBAAoB,CAAC;AAE9C,sEAAsE;AACtE,MAAM,CAAC,MAAM,eAAe,GAAG,8BAA8B,CAAC;AAE9D,6EAA6E;AAC7E,MAAM,CAAC,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAE1D,wEAAwE;AACxE,MAAM,CAAC,MAAM,iBAAiB,GAAG,+BAA+B,CAAC;AAEjE;;gCAEgC;AAChC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAEzC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAE7C;;;wCAGwC;AACxC,MAAM,UAAU,qBAAqB,CACnC,MAA0C,OAAO,CAAC,GAAG;IAErD,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,uBAAuB,CAAC;IAC3D,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC;AACzD,CAAC;AAED,SAAS,cAAc,CAAC,GAAuB,EAAE,QAAgB;IAC/D,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAA0C,OAAO,CAAC,GAAG;IACrF,OAAO,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAA0C,OAAO,CAAC,GAAG;IACvF,OAAO,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,wBAAwB,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/** Env var naming EXTRA sanctioned task dirs, exactly, separated by the
|
|
2
|
+
* platform path delimiter — the bench's `<case>/tasks` and `<case>/tasks-sweep`
|
|
3
|
+
* (src/bench/runner.ts). Production never sets it. */
|
|
4
|
+
export declare const LAUNCH_PLAN_DIRS_ENV = "QCR_LAUNCH_PLAN_DIRS";
|
|
5
|
+
/** The pointer a task-file launch carries — the exact words the round
|
|
6
|
+
* templates prescribe (packages/pi-plugin/src/passtasks.ts renderPassTaskNote). */
|
|
7
|
+
export declare function taskPointer(path: string): string;
|
|
8
|
+
/** One unit of a planned launch. */
|
|
9
|
+
export interface LaunchUnit {
|
|
10
|
+
/** "plan" for the round's tasks dir, "optional" for a follow-up round's
|
|
11
|
+
* optional rows, "sweep" for the sweep's. */
|
|
12
|
+
phase: "plan" | "sweep" | "optional";
|
|
13
|
+
/** 1-based row, as the plan tables print it. */
|
|
14
|
+
row: number;
|
|
15
|
+
agent: string;
|
|
16
|
+
file: string;
|
|
17
|
+
path: string;
|
|
18
|
+
task: string;
|
|
19
|
+
}
|
|
20
|
+
export type LaunchPlan = {
|
|
21
|
+
ok: true;
|
|
22
|
+
units: LaunchUnit[];
|
|
23
|
+
skipped: LaunchUnit[];
|
|
24
|
+
} | {
|
|
25
|
+
ok: false;
|
|
26
|
+
error: string;
|
|
27
|
+
};
|
|
28
|
+
export declare function realDir(path: string): string | undefined;
|
|
29
|
+
/** The extra sanctioned dirs from the environment, each resolved; one that
|
|
30
|
+
* does not exist sanctions nothing. */
|
|
31
|
+
export declare function sanctionedExtras(env: Record<string, string | undefined>): Set<string>;
|
|
32
|
+
/** Resolve one `dirs` entry to a sanctioned task dir, or say why not. */
|
|
33
|
+
export declare function resolveTaskDir(input: string, realRoot: string, extras: ReadonlySet<string>, pr: string | undefined): {
|
|
34
|
+
dir: string;
|
|
35
|
+
phase: "plan" | "sweep" | "optional";
|
|
36
|
+
passes: string | undefined;
|
|
37
|
+
} | {
|
|
38
|
+
error: string;
|
|
39
|
+
};
|
|
40
|
+
/** The discovery task files of one dir, in row order (= the daemon's launch
|
|
41
|
+
* order). Regular files only: a symlink is never followed. */
|
|
42
|
+
export declare function listTaskFiles(dir: string): Array<{
|
|
43
|
+
row: number;
|
|
44
|
+
agent: string;
|
|
45
|
+
file: string;
|
|
46
|
+
}>;
|
|
47
|
+
/** The keys a unit answers to in `extra` and `skip`: its file name (with or
|
|
48
|
+
* without `.md`), its row (`3`, or `sweep:3` / `optional:3` outside the
|
|
49
|
+
* plan), its agent, its phase's wildcard (`plan:*` / `optional:*` /
|
|
50
|
+
* `sweep:*`) and `*`. */
|
|
51
|
+
export declare function unitKeys(u: Pick<LaunchUnit, "phase" | "row" | "file" | "agent">): string[];
|
|
52
|
+
export declare function stringList(value: unknown): string[] | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Plan a launch: resolve and confine the dirs, list their discovery task
|
|
55
|
+
* files, apply `skip` and `extra`. Pure over the filesystem it reads; never
|
|
56
|
+
* throws — every refusal is an `{ ok: false }` with the reason.
|
|
57
|
+
*/
|
|
58
|
+
export declare function planLaunch(params: Record<string, unknown>, env?: Record<string, string | undefined>,
|
|
59
|
+
/** The sandbox root when the env names none (QCR_SANDBOX_ROOT): the
|
|
60
|
+
* launching process's cwd, as its host resolves it. Every round's env names
|
|
61
|
+
* the root; an interactive pi's may not. */
|
|
62
|
+
cwd?: string): LaunchPlan;
|
|
63
|
+
//# sourceMappingURL=launch-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-plan.d.ts","sourceRoot":"","sources":["../../../../src/engine/lens/launch-plan.ts"],"names":[],"mappings":"AAQA;;sDAEsD;AACtD,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAS3D;mFACmF;AACnF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACzB;iDAC6C;IAC7C,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IACrC,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,UAAU,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1F,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMxD;AAED;uCACuC;AACvC,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CASrF;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,EAC3B,EAAE,EAAE,MAAM,GAAG,SAAS,GAEpB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACjF;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CA+BpB;AAED;8DAC8D;AAC9D,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAU9F;AAED;;;yBAGyB;AACzB,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,MAAM,EAAE,CAG1F;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAK/D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe;AACrD;;4CAE4C;AAC5C,GAAG,CAAC,EAAE,MAAM,GACX,UAAU,CAoFZ"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
// Planning a launch from a round's task files: which directories a lens
|
|
2
|
+
// launch may read (confined to the round's own pass dirs), which files are
|
|
3
|
+
// discovery rows, and how `skip` / `extra` apply. Pure over the filesystem it
|
|
4
|
+
// reads. Lifted from the retired extensions/subagents.ts, whose `launch_plan`
|
|
5
|
+
// tool it planned for; `lens_wave` (tool.ts) is its successor.
|
|
6
|
+
import { readdirSync, realpathSync } from "node:fs";
|
|
7
|
+
import { basename, delimiter, dirname, isAbsolute, join, resolve } from "node:path";
|
|
8
|
+
/** Env var naming EXTRA sanctioned task dirs, exactly, separated by the
|
|
9
|
+
* platform path delimiter — the bench's `<case>/tasks` and `<case>/tasks-sweep`
|
|
10
|
+
* (src/bench/runner.ts). Production never sets it. */
|
|
11
|
+
export const LAUNCH_PLAN_DIRS_ENV = "QCR_LAUNCH_PLAN_DIRS";
|
|
12
|
+
/** A round's pass directory, as dispatch.ts names it. */
|
|
13
|
+
const PASSES_DIR_RE = /^pr-\d+-round-\d+-passes$/;
|
|
14
|
+
/** A task file, as passtasks.ts names it: the 1-based row, then the agent. */
|
|
15
|
+
const TASK_FILE_RE = /^(\d{2,})-([a-z0-9][a-z0-9-]*)\.md$/;
|
|
16
|
+
/** The validator's agent ids — `pass-validate` and its tier variants. */
|
|
17
|
+
const VALIDATOR_AGENT_RE = /^pass-validate(--|$)/;
|
|
18
|
+
/** The pointer a task-file launch carries — the exact words the round
|
|
19
|
+
* templates prescribe (packages/pi-plugin/src/passtasks.ts renderPassTaskNote). */
|
|
20
|
+
export function taskPointer(path) {
|
|
21
|
+
return `Task file: ${path}. Read it first; it is your complete task.`;
|
|
22
|
+
}
|
|
23
|
+
export function realDir(path) {
|
|
24
|
+
try {
|
|
25
|
+
return realpathSync(path);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** The extra sanctioned dirs from the environment, each resolved; one that
|
|
32
|
+
* does not exist sanctions nothing. */
|
|
33
|
+
export function sanctionedExtras(env) {
|
|
34
|
+
const out = new Set();
|
|
35
|
+
for (const raw of (env[LAUNCH_PLAN_DIRS_ENV] ?? "").split(delimiter)) {
|
|
36
|
+
const p = raw.trim();
|
|
37
|
+
if (!p || !isAbsolute(p))
|
|
38
|
+
continue;
|
|
39
|
+
const real = realDir(p);
|
|
40
|
+
if (real)
|
|
41
|
+
out.add(real);
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
/** Resolve one `dirs` entry to a sanctioned task dir, or say why not. */
|
|
46
|
+
export function resolveTaskDir(input, realRoot, extras, pr) {
|
|
47
|
+
const real = realDir(resolve(realRoot, input));
|
|
48
|
+
if (!real)
|
|
49
|
+
return { error: `${input}: no such directory` };
|
|
50
|
+
// Resolved too: on the legacy VM `<sandbox>/state` was a SYMLINK to the state volume
|
|
51
|
+
// (its entrypoint), and the plain Docker path still links it, so a resolved task dir lives under its target.
|
|
52
|
+
const state = realDir(join(realRoot, "state")) ?? join(realRoot, "state");
|
|
53
|
+
// A PR session (QCR_PR, set by the daemon — the session cannot set its own
|
|
54
|
+
// environment) launches only its own PR's rounds.
|
|
55
|
+
const ownPasses = (name) => PASSES_DIR_RE.test(name) && (pr === undefined || name.startsWith(`pr-${pr}-round-`));
|
|
56
|
+
if (dirname(real) === state && ownPasses(basename(real))) {
|
|
57
|
+
// The round's pass dir: its plan tasks. The sweep's dir is named itself.
|
|
58
|
+
const tasks = realDir(join(real, "tasks"));
|
|
59
|
+
if (!tasks || tasks !== join(real, "tasks"))
|
|
60
|
+
return { error: `${input}: the round has no task files (no tasks/ directory)` };
|
|
61
|
+
return { dir: tasks, phase: "plan", passes: real };
|
|
62
|
+
}
|
|
63
|
+
const name = basename(real);
|
|
64
|
+
// `tasks-optional` — a follow-up round's optional rows.
|
|
65
|
+
const phaseOf = (n) => n === "tasks-sweep" ? "sweep" : n === "tasks-optional" ? "optional" : "plan";
|
|
66
|
+
if ((name === "tasks" || name === "tasks-sweep" || name === "tasks-optional") &&
|
|
67
|
+
dirname(dirname(real)) === state &&
|
|
68
|
+
ownPasses(basename(dirname(real))))
|
|
69
|
+
return { dir: real, phase: phaseOf(name), passes: dirname(real) };
|
|
70
|
+
if (extras.has(real))
|
|
71
|
+
return { dir: real, phase: phaseOf(name), passes: undefined };
|
|
72
|
+
return {
|
|
73
|
+
error: `${input}: not a round's task directory (only state/pr-<n>-round-<k>-passes/tasks, …/tasks-sweep or …/tasks-optional)`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** The discovery task files of one dir, in row order (= the daemon's launch
|
|
77
|
+
* order). Regular files only: a symlink is never followed. */
|
|
78
|
+
export function listTaskFiles(dir) {
|
|
79
|
+
const out = [];
|
|
80
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
81
|
+
if (!entry.isFile())
|
|
82
|
+
continue;
|
|
83
|
+
const m = TASK_FILE_RE.exec(entry.name);
|
|
84
|
+
if (!m || m[1] === undefined || m[2] === undefined)
|
|
85
|
+
continue;
|
|
86
|
+
if (VALIDATOR_AGENT_RE.test(m[2]))
|
|
87
|
+
continue;
|
|
88
|
+
out.push({ row: Number.parseInt(m[1], 10), agent: m[2], file: entry.name });
|
|
89
|
+
}
|
|
90
|
+
return out.sort((a, b) => a.row - b.row || a.file.localeCompare(b.file));
|
|
91
|
+
}
|
|
92
|
+
/** The keys a unit answers to in `extra` and `skip`: its file name (with or
|
|
93
|
+
* without `.md`), its row (`3`, or `sweep:3` / `optional:3` outside the
|
|
94
|
+
* plan), its agent, its phase's wildcard (`plan:*` / `optional:*` /
|
|
95
|
+
* `sweep:*`) and `*`. */
|
|
96
|
+
export function unitKeys(u) {
|
|
97
|
+
const row = u.phase === "plan" ? String(u.row) : `${u.phase}:${u.row}`;
|
|
98
|
+
return [u.file, u.file.replace(/\.md$/, ""), row, u.agent, `${u.phase}:*`, "*"];
|
|
99
|
+
}
|
|
100
|
+
export function stringList(value) {
|
|
101
|
+
if (value === undefined)
|
|
102
|
+
return [];
|
|
103
|
+
if (typeof value === "string")
|
|
104
|
+
return [value];
|
|
105
|
+
if (!Array.isArray(value) || value.some((v) => typeof v !== "string"))
|
|
106
|
+
return undefined;
|
|
107
|
+
return value;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Plan a launch: resolve and confine the dirs, list their discovery task
|
|
111
|
+
* files, apply `skip` and `extra`. Pure over the filesystem it reads; never
|
|
112
|
+
* throws — every refusal is an `{ ok: false }` with the reason.
|
|
113
|
+
*/
|
|
114
|
+
export function planLaunch(params, env = process.env,
|
|
115
|
+
/** The sandbox root when the env names none (QCR_SANDBOX_ROOT): the
|
|
116
|
+
* launching process's cwd, as its host resolves it. Every round's env names
|
|
117
|
+
* the root; an interactive pi's may not. */
|
|
118
|
+
cwd) {
|
|
119
|
+
try {
|
|
120
|
+
const dirs = stringList(params.dirs ?? params.dir);
|
|
121
|
+
if (!dirs || dirs.length === 0)
|
|
122
|
+
return {
|
|
123
|
+
ok: false,
|
|
124
|
+
error: "`dirs` must name the round's task directory (one to three paths)",
|
|
125
|
+
};
|
|
126
|
+
if (dirs.length > 3)
|
|
127
|
+
return {
|
|
128
|
+
ok: false,
|
|
129
|
+
error: "at most three dirs: the round's tasks, its tasks-optional and its tasks-sweep",
|
|
130
|
+
};
|
|
131
|
+
const skip = stringList(params.skip);
|
|
132
|
+
if (!skip)
|
|
133
|
+
return { ok: false, error: "`skip` must be a list of row keys" };
|
|
134
|
+
const extraRaw = params.extra ?? {};
|
|
135
|
+
if (typeof extraRaw !== "object" || extraRaw === null || Array.isArray(extraRaw))
|
|
136
|
+
return { ok: false, error: "`extra` must map a row key to text" };
|
|
137
|
+
const extra = Object.entries(extraRaw);
|
|
138
|
+
if (extra.some(([, v]) => typeof v !== "string"))
|
|
139
|
+
return { ok: false, error: "`extra` values must be text" };
|
|
140
|
+
const root = env.QCR_SANDBOX_ROOT?.trim() || cwd;
|
|
141
|
+
if (!root)
|
|
142
|
+
return { ok: false, error: "no sandbox root: QCR_SANDBOX_ROOT is not set" };
|
|
143
|
+
const realRoot = realDir(root);
|
|
144
|
+
if (!realRoot)
|
|
145
|
+
return { ok: false, error: `sandbox root ${root} is not readable` };
|
|
146
|
+
const extras = sanctionedExtras(env);
|
|
147
|
+
const resolved = [];
|
|
148
|
+
for (const d of dirs) {
|
|
149
|
+
const r = resolveTaskDir(d, realRoot, extras, env.QCR_PR?.trim() || undefined);
|
|
150
|
+
if ("error" in r)
|
|
151
|
+
return { ok: false, error: r.error };
|
|
152
|
+
if (resolved.some((x) => x.dir === r.dir))
|
|
153
|
+
continue;
|
|
154
|
+
if (resolved.some((x) => x.phase === r.phase))
|
|
155
|
+
return { ok: false, error: `two ${r.phase} task directories in one launch` };
|
|
156
|
+
if (resolved.some((x) => x.passes !== r.passes))
|
|
157
|
+
return { ok: false, error: "the task directories belong to different rounds" };
|
|
158
|
+
resolved.push(r);
|
|
159
|
+
}
|
|
160
|
+
// Plan rows first, then the optional rows, then the sweep's — the daemon's
|
|
161
|
+
// launch order within each.
|
|
162
|
+
const rank = { plan: 0, optional: 1, sweep: 2 };
|
|
163
|
+
resolved.sort((a, b) => rank[a.phase] - rank[b.phase]);
|
|
164
|
+
const all = [];
|
|
165
|
+
for (const r of resolved) {
|
|
166
|
+
for (const f of listTaskFiles(r.dir)) {
|
|
167
|
+
const path = join(r.dir, f.file);
|
|
168
|
+
all.push({ phase: r.phase, ...f, path, task: taskPointer(path) });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (all.length === 0)
|
|
172
|
+
return {
|
|
173
|
+
ok: false,
|
|
174
|
+
error: `no discovery task files in ${resolved.map((r) => r.dir).join(", ")}`,
|
|
175
|
+
};
|
|
176
|
+
// Every key must hit a row: a typo must never silently drop the prior
|
|
177
|
+
// findings the session meant to assign, nor launch a row it meant to raise.
|
|
178
|
+
const hits = (key) => all.filter((u) => unitKeys(u).includes(key));
|
|
179
|
+
for (const key of skip)
|
|
180
|
+
if (hits(key).length === 0)
|
|
181
|
+
return { ok: false, error: `skip: no row answers to "${key}"` };
|
|
182
|
+
for (const [key] of extra)
|
|
183
|
+
if (hits(key).length === 0)
|
|
184
|
+
return { ok: false, error: `extra: no row answers to "${key}"` };
|
|
185
|
+
const skipped = all.filter((u) => skip.some((k) => unitKeys(u).includes(k)));
|
|
186
|
+
const units = all
|
|
187
|
+
.filter((u) => !skipped.includes(u))
|
|
188
|
+
.map((u) => {
|
|
189
|
+
const added = extra
|
|
190
|
+
.filter(([k]) => unitKeys(u).includes(k))
|
|
191
|
+
.map(([, v]) => v.trim())
|
|
192
|
+
.filter((v) => v);
|
|
193
|
+
return added.length ? { ...u, task: [u.task, ...added].join("\n\n") } : u;
|
|
194
|
+
});
|
|
195
|
+
if (units.length === 0)
|
|
196
|
+
return { ok: false, error: "every row was skipped: nothing to launch" };
|
|
197
|
+
return { ok: true, units, skipped };
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=launch-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-plan.js","sourceRoot":"","sources":["../../../../src/engine/lens/launch-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ExtensionFactory } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
/** Short hashes of the parts that make up a request's cacheable prefix, in
|
|
3
|
+
* request order (never their content). */
|
|
4
|
+
export declare function prefixDigest(payload: unknown): string;
|
|
5
|
+
/**
|
|
6
|
+
* The pack-first payload, or undefined to send the original. Pure.
|
|
7
|
+
* `appended` is the lens body as pi appended it; `pack` the pack's text.
|
|
8
|
+
*/
|
|
9
|
+
export declare function packFirstPayload(payload: unknown, appended: string, pack: string): Record<string, unknown> | undefined;
|
|
10
|
+
export interface LeafCacheOptions {
|
|
11
|
+
/** The round's context pack text. Blank: the extension does nothing. */
|
|
12
|
+
pack: string;
|
|
13
|
+
/** The cache group's key (= its shared session id). */
|
|
14
|
+
cacheKey: string;
|
|
15
|
+
/** The lens body as appended to the system prompt; "" for a group's warm-up. */
|
|
16
|
+
body?: string;
|
|
17
|
+
/** Told once when a request is not the shape the rewrite expects. */
|
|
18
|
+
onUnexpected?: () => void;
|
|
19
|
+
}
|
|
20
|
+
/** The extension that puts the pack first and pins the cache key. */
|
|
21
|
+
export declare function leafCache(options: LeafCacheOptions): ExtensionFactory;
|
|
22
|
+
//# sourceMappingURL=leaf-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaf-cache.d.ts","sourceRoot":"","sources":["../../../../src/engine/lens/leaf-cache.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAKxE;0CAC0C;AAC1C,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAkBrD;AAWD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAmCrC;AAaD,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,gBAAgB,CAarE"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// leaf-cache, the pack-first payload rewrite and the SDK lens's extension that
|
|
2
|
+
// applies it.
|
|
3
|
+
//
|
|
4
|
+
// The request layout: the lens body comes out of pi's `<addendum>` block in
|
|
5
|
+
// `instructions`; the input becomes the pack (user role, fenced data), then the
|
|
6
|
+
// lens body as a developer message, then the task. The pack is then the prefix
|
|
7
|
+
// every lens request of a cache group extends (docs/prompt-caching.md).
|
|
8
|
+
//
|
|
9
|
+
// leafCache({ pack, cacheKey }) rewrites each request pack-first, and on a payload that carries
|
|
10
|
+
// a `prompt_cache_key` sets it to the group's key. Under the shared session id
|
|
11
|
+
// of a cache group (docs/probes/p4.6-codex-cache-routing.md) the key already
|
|
12
|
+
// equals that id, so the second edit is a belt for a pi that derives the key
|
|
13
|
+
// another way, not what routes the cache. Fail-open, always: a payload that is
|
|
14
|
+
// not the expected shape goes out unchanged, and a throw inside the handler is
|
|
15
|
+
// pi's to contain (it reports it as an extension error), never the request's.
|
|
16
|
+
//
|
|
17
|
+
// VERIFY-ON-PIN (pi 1.3.0, re-read at 1.4.0): `before_provider_request` may return a replacement
|
|
18
|
+
// payload; the codex payload carries `instructions` (string), `input` (an array
|
|
19
|
+
// of `{ role, content: [{ type: "input_text", text }] }`) and `prompt_cache_key`.
|
|
20
|
+
import { createHash } from "node:crypto";
|
|
21
|
+
const ADDENDUM_OPEN = "<addendum>";
|
|
22
|
+
const ADDENDUM_CLOSE = "</addendum>";
|
|
23
|
+
/** Short hashes of the parts that make up a request's cacheable prefix, in
|
|
24
|
+
* request order (never their content). */
|
|
25
|
+
export function prefixDigest(payload) {
|
|
26
|
+
const h = (v) => createHash("sha256")
|
|
27
|
+
.update(JSON.stringify(v ?? null))
|
|
28
|
+
.digest("hex")
|
|
29
|
+
.slice(0, 10);
|
|
30
|
+
if (typeof payload !== "object" || payload === null)
|
|
31
|
+
return "no payload";
|
|
32
|
+
const p = payload;
|
|
33
|
+
const input = Array.isArray(p.input) ? p.input : [];
|
|
34
|
+
const rest = Object.fromEntries(Object.entries(p).filter(([k]) => !["instructions", "input", "tools"].includes(k)));
|
|
35
|
+
return [
|
|
36
|
+
`other=${h(rest)}`,
|
|
37
|
+
`instructions=${h(p.instructions)}`,
|
|
38
|
+
`tools=${h(p.tools)}`,
|
|
39
|
+
...input.slice(0, 3).map((m, i) => `input${i}=${h(m)}`),
|
|
40
|
+
].join(" ");
|
|
41
|
+
}
|
|
42
|
+
function textMessage(role, text) {
|
|
43
|
+
return { role, content: [{ type: "input_text", text }] };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The pack-first payload, or undefined to send the original. Pure.
|
|
47
|
+
* `appended` is the lens body as pi appended it; `pack` the pack's text.
|
|
48
|
+
*/
|
|
49
|
+
export function packFirstPayload(payload, appended, pack) {
|
|
50
|
+
if (typeof payload !== "object" || payload === null || Array.isArray(payload))
|
|
51
|
+
return undefined;
|
|
52
|
+
const p = payload;
|
|
53
|
+
const instructions = p.instructions;
|
|
54
|
+
const input = p.input;
|
|
55
|
+
const body = appended.trim();
|
|
56
|
+
if (typeof instructions !== "string" || !Array.isArray(input) || !pack.trim())
|
|
57
|
+
return undefined;
|
|
58
|
+
// A group's WARM-UP (no lens text): only the pack goes first, so its request
|
|
59
|
+
// is exactly the prefix every lens request of the group extends.
|
|
60
|
+
if (!body)
|
|
61
|
+
return { ...p, input: [textMessage("user", pack), ...input] };
|
|
62
|
+
const at = instructions.indexOf(body);
|
|
63
|
+
if (at < 0 || instructions.indexOf(body, at + 1) >= 0)
|
|
64
|
+
return undefined;
|
|
65
|
+
let start = at;
|
|
66
|
+
let end = at + body.length;
|
|
67
|
+
// The whole `<addendum>…</addendum>` block when the body is all it holds.
|
|
68
|
+
const open = instructions.lastIndexOf(ADDENDUM_OPEN, at);
|
|
69
|
+
const close = instructions.indexOf(ADDENDUM_CLOSE, end);
|
|
70
|
+
if (open >= 0 &&
|
|
71
|
+
close >= 0 &&
|
|
72
|
+
instructions.slice(open + ADDENDUM_OPEN.length, at).trim() === "" &&
|
|
73
|
+
instructions.slice(end, close).trim() === "") {
|
|
74
|
+
start = open;
|
|
75
|
+
end = close + ADDENDUM_CLOSE.length;
|
|
76
|
+
}
|
|
77
|
+
const before = instructions.slice(0, start).trimEnd();
|
|
78
|
+
const after = instructions.slice(end).trim();
|
|
79
|
+
if (!before)
|
|
80
|
+
return undefined;
|
|
81
|
+
const base = after ? `${before}\n\n${after}` : before;
|
|
82
|
+
return {
|
|
83
|
+
...p,
|
|
84
|
+
instructions: base,
|
|
85
|
+
input: [textMessage("user", pack), textMessage("developer", body), ...input],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/** The payload with `prompt_cache_key` set to `cacheKey`, or undefined when it
|
|
89
|
+
* carries no string key or already has this one. */
|
|
90
|
+
function withCacheKey(payload, cacheKey) {
|
|
91
|
+
if (typeof payload !== "object" || payload === null || Array.isArray(payload))
|
|
92
|
+
return undefined;
|
|
93
|
+
const p = payload;
|
|
94
|
+
const held = p["prompt_cache_key"];
|
|
95
|
+
return typeof held === "string" && held !== cacheKey
|
|
96
|
+
? { ...p, prompt_cache_key: cacheKey }
|
|
97
|
+
: undefined;
|
|
98
|
+
}
|
|
99
|
+
/** The extension that puts the pack first and pins the cache key. */
|
|
100
|
+
export function leafCache(options) {
|
|
101
|
+
return (pi) => {
|
|
102
|
+
if (!options.pack.trim())
|
|
103
|
+
return;
|
|
104
|
+
let warned = false;
|
|
105
|
+
pi.on("before_provider_request", (event) => {
|
|
106
|
+
const packed = packFirstPayload(event.payload, options.body ?? "", options.pack);
|
|
107
|
+
if (packed === undefined && !warned) {
|
|
108
|
+
warned = true;
|
|
109
|
+
options.onUnexpected?.();
|
|
110
|
+
}
|
|
111
|
+
return withCacheKey(packed ?? event.payload, options.cacheKey) ?? packed;
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=leaf-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaf-cache.js","sourceRoot":"","sources":["../../../../src/engine/lens/leaf-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { WeightedSemaphore } from "./semaphore.js";
|
|
2
|
+
export interface Permit {
|
|
3
|
+
/** Give the permit back. Idempotent. */
|
|
4
|
+
release(): void;
|
|
5
|
+
}
|
|
6
|
+
export interface Permits {
|
|
7
|
+
/** Resolves with the permit once `weight` of them are free. `lensId` names the
|
|
8
|
+
* pass (a broker keys on it). A `signal` that aborts while waiting ends the
|
|
9
|
+
* wait and rejects; the local semaphore ignores it, as it always has. */
|
|
10
|
+
acquire(lensId: string, weight: number, signal?: AbortSignal): Promise<Permit>;
|
|
11
|
+
}
|
|
12
|
+
/** The local semaphore as a port. */
|
|
13
|
+
export declare function localPermits(semaphore: WeightedSemaphore): Permits;
|
|
14
|
+
//# sourceMappingURL=permits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permits.d.ts","sourceRoot":"","sources":["../../../../src/engine/lens/permits.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,WAAW,MAAM;IACrB,wCAAwC;IACxC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB;;6EAEyE;IACzE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAChF;AAED,qCAAqC;AACrC,wBAAgB,YAAY,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAclE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** The local semaphore as a port. */
|
|
2
|
+
export function localPermits(semaphore) {
|
|
3
|
+
return {
|
|
4
|
+
async acquire(_lensId, weight) {
|
|
5
|
+
await semaphore.acquire(weight);
|
|
6
|
+
let given = false;
|
|
7
|
+
return {
|
|
8
|
+
release: () => {
|
|
9
|
+
if (given)
|
|
10
|
+
return;
|
|
11
|
+
given = true;
|
|
12
|
+
semaphore.release(weight);
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=permits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permits.js","sourceRoot":"","sources":["../../../../src/engine/lens/permits.ts"],"names":[],"mappings":"AAsBA,qCAAqC;AACrC,MAAM,UAAU,YAAY,CAAC,SAA4B;IACvD,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM;YAC3B,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,OAAO;gBACL,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,KAAK;wBAAE,OAAO;oBAClB,KAAK,GAAG,IAAI,CAAC;oBACb,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC5B,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|