@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,340 @@
|
|
|
1
|
+
// sdkRuntime: the runtime port (port.ts) hosted in-process on the pi SDK, through
|
|
2
|
+
// PiHost (pisdk.ts, the only module that builds an SDK session).
|
|
3
|
+
//
|
|
4
|
+
// One session is one live AgentSession. Turns run one at a time, in order: the
|
|
5
|
+
// first is `prompt`, each later one a `followUp` that waits behind the turn in
|
|
6
|
+
// flight, and a `steer` goes into the turn in flight through pi's own steering
|
|
7
|
+
// queue (the one thing a process runtime cannot do).
|
|
8
|
+
//
|
|
9
|
+
// The main session is file-backed: with `sessionFile` in the spec the JSONL is
|
|
10
|
+
// written at exactly that path (or under `sessionDir`, where pi names the file),
|
|
11
|
+
// so a finished session opens in pi and resumes by id. Without either it is in
|
|
12
|
+
// memory and `sessionFile` is null.
|
|
13
|
+
//
|
|
14
|
+
// `subscribe` and the events file carry the stream a `pi --mode json` child
|
|
15
|
+
// prints, line for line: the session header first, then every session event as
|
|
16
|
+
// JSON, with the `message_update` and `tool_execution_update` re-emissions left
|
|
17
|
+
// out (they restate a whole transcript on each update). The spend and the dollar cap read the same events, so
|
|
18
|
+
// bench/aacr.ts parses a file from either runtime unchanged. What pi itself
|
|
19
|
+
// prints to stdout in that mode is only this stream; nothing else is faked.
|
|
20
|
+
import { appendFileSync, closeSync, createWriteStream, existsSync, openSync, readFileSync, } from "node:fs";
|
|
21
|
+
import { splitModelSpec } from "../reviewconfig.js";
|
|
22
|
+
import { TurnBudget } from "./budget.js";
|
|
23
|
+
import { trackSession } from "./livesessions.js";
|
|
24
|
+
import { RuntimeUnsupportedError, } from "./port.js";
|
|
25
|
+
/** Grace between a hit limit's abort and the dispose that follows it. */
|
|
26
|
+
const GRACE_MS = { cap: 5_000, timeout: 15_000 };
|
|
27
|
+
/** The lines `pi --mode json` writes that carry no information a reader wants and
|
|
28
|
+
* grow with the transcript. */
|
|
29
|
+
function isUpdate(event) {
|
|
30
|
+
return event.type === "message_update" || event.type === "tool_execution_update";
|
|
31
|
+
}
|
|
32
|
+
const stripBom = (s) => (s.charCodeAt(0) === 0xfeff ? s.slice(1) : s);
|
|
33
|
+
class SdkSession {
|
|
34
|
+
spec;
|
|
35
|
+
session;
|
|
36
|
+
resumed;
|
|
37
|
+
backstop;
|
|
38
|
+
listeners = new Set();
|
|
39
|
+
/** The listeners that also hear the update events. */
|
|
40
|
+
updateListeners = new Set();
|
|
41
|
+
events;
|
|
42
|
+
unsubscribe;
|
|
43
|
+
/** The turn in flight and everything queued behind it. */
|
|
44
|
+
tail = Promise.resolve();
|
|
45
|
+
pending = 0;
|
|
46
|
+
prompted = false;
|
|
47
|
+
disposed = false;
|
|
48
|
+
turns = 0;
|
|
49
|
+
spentUsd = 0;
|
|
50
|
+
last = null;
|
|
51
|
+
budget = null;
|
|
52
|
+
stopped = false;
|
|
53
|
+
streamError = null;
|
|
54
|
+
/** The error text of the turn's last assistant message when the provider
|
|
55
|
+
* ended it as an error (pi resolves the prompt for that, it does not throw). */
|
|
56
|
+
providerError = null;
|
|
57
|
+
headerWritten = false;
|
|
58
|
+
/** Forgets this session in the live registry (a signal handler stops what is there). */
|
|
59
|
+
untrack;
|
|
60
|
+
constructor(spec, session,
|
|
61
|
+
/** A reopened session: its history is the first turn, so a message may
|
|
62
|
+
* follow it with no prompt. */
|
|
63
|
+
resumed = false, backstop = () => { }) {
|
|
64
|
+
this.spec = spec;
|
|
65
|
+
this.session = session;
|
|
66
|
+
this.resumed = resumed;
|
|
67
|
+
this.backstop = backstop;
|
|
68
|
+
this.events = createWriteStream(spec.eventsFile, { flags: "a" });
|
|
69
|
+
// A full disk must end THIS turn as a recorded failure, not throw out of the
|
|
70
|
+
// process: the same contract runPi has.
|
|
71
|
+
this.events.on("error", (e) => {
|
|
72
|
+
this.streamError = String(e);
|
|
73
|
+
void this.abort();
|
|
74
|
+
});
|
|
75
|
+
this.unsubscribe = session.subscribe((event) => this.onEvent(event));
|
|
76
|
+
this.untrack = trackSession(this);
|
|
77
|
+
}
|
|
78
|
+
get id() {
|
|
79
|
+
return this.session.sessionId;
|
|
80
|
+
}
|
|
81
|
+
get sessionFile() {
|
|
82
|
+
const file = this.session.sessionFile;
|
|
83
|
+
// pi writes the file from the first user message on.
|
|
84
|
+
return file !== undefined && existsSync(file) ? file : null;
|
|
85
|
+
}
|
|
86
|
+
async prompt(text, options) {
|
|
87
|
+
if (this.prompted)
|
|
88
|
+
throw new RuntimeUnsupportedError("a second prompt (a session continues by followUp)");
|
|
89
|
+
this.prompted = true;
|
|
90
|
+
// The process runtime hands the first message to pi on stdin, and pi trims
|
|
91
|
+
// piped stdin (main.js readPipedStdin): the provider sees the trimmed text.
|
|
92
|
+
// A follow-up rides `-p`, which pi does not trim, so only this one is.
|
|
93
|
+
return this.turn(text.trim(), options);
|
|
94
|
+
}
|
|
95
|
+
async followUp(text, options) {
|
|
96
|
+
if (!this.prompted && !this.resumed)
|
|
97
|
+
throw new Error("followUp before the first prompt");
|
|
98
|
+
this.prompted = true;
|
|
99
|
+
const run = this.turn(text, options);
|
|
100
|
+
if (this.pending > 1) {
|
|
101
|
+
// A turn is in flight: this one runs behind it. Its result lands in stats().
|
|
102
|
+
run.catch(() => { });
|
|
103
|
+
return { status: "queued" };
|
|
104
|
+
}
|
|
105
|
+
return { status: "handled", result: await run };
|
|
106
|
+
}
|
|
107
|
+
async steer(text, options) {
|
|
108
|
+
// Nothing running: there is no turn to steer, so the message starts one.
|
|
109
|
+
if (this.pending === 0 || this.disposed)
|
|
110
|
+
return this.followUp(text, options);
|
|
111
|
+
await this.session.steer(text);
|
|
112
|
+
return { status: "queued" };
|
|
113
|
+
}
|
|
114
|
+
async compact() {
|
|
115
|
+
if (this.disposed)
|
|
116
|
+
return { status: "failed", reason: "session disposed" };
|
|
117
|
+
// Behind the turn in flight and everything queued after it: pi refuses a
|
|
118
|
+
// prompt while it compacts, and a compaction under a running turn is not
|
|
119
|
+
// what a caller means.
|
|
120
|
+
await this.tail.catch(() => { });
|
|
121
|
+
if (this.disposed)
|
|
122
|
+
return { status: "failed", reason: "session disposed" };
|
|
123
|
+
try {
|
|
124
|
+
const result = await this.session.compact();
|
|
125
|
+
return { status: "compacted", tokensBefore: result.tokensBefore };
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
return { status: "failed", reason: e instanceof Error ? e.message : String(e) };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async abort() {
|
|
132
|
+
if (this.pending === 0)
|
|
133
|
+
return;
|
|
134
|
+
this.stopped = true;
|
|
135
|
+
await this.session.abort().catch(() => { });
|
|
136
|
+
}
|
|
137
|
+
subscribe(listener, options) {
|
|
138
|
+
this.listeners.add(listener);
|
|
139
|
+
if (options?.updates)
|
|
140
|
+
this.updateListeners.add(listener);
|
|
141
|
+
return () => {
|
|
142
|
+
this.listeners.delete(listener);
|
|
143
|
+
this.updateListeners.delete(listener);
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
stats() {
|
|
147
|
+
return { turns: this.turns, busy: this.pending > 0, spentUsd: this.spentUsd, last: this.last };
|
|
148
|
+
}
|
|
149
|
+
async dispose() {
|
|
150
|
+
if (this.disposed)
|
|
151
|
+
return;
|
|
152
|
+
this.disposed = true;
|
|
153
|
+
this.untrack();
|
|
154
|
+
// Queued follow-ups fail fast (disposed); the running turn is aborted.
|
|
155
|
+
if (this.pending > 0) {
|
|
156
|
+
this.stopped = true;
|
|
157
|
+
await this.session.abort().catch(() => { });
|
|
158
|
+
}
|
|
159
|
+
await this.tail.catch(() => { });
|
|
160
|
+
this.unsubscribe();
|
|
161
|
+
try {
|
|
162
|
+
this.session.dispose();
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// already disposed (the host's own sweep, a budget's dispose step)
|
|
166
|
+
}
|
|
167
|
+
await new Promise((resolve) => this.events.end(resolve));
|
|
168
|
+
}
|
|
169
|
+
/** Queue one turn behind whatever is in flight. */
|
|
170
|
+
turn(text, options) {
|
|
171
|
+
if (this.disposed)
|
|
172
|
+
return Promise.reject(new Error("session disposed"));
|
|
173
|
+
const spec = this.spec;
|
|
174
|
+
this.pending++;
|
|
175
|
+
const run = this.tail.then(async () => {
|
|
176
|
+
if (this.disposed)
|
|
177
|
+
return { code: null, timedOut: false, streamError: "disposed" };
|
|
178
|
+
const r = await this.runTurn(text, options?.timeoutMs ?? spec.limits.timeoutMs, options?.capUsd ?? spec.limits.capUsd);
|
|
179
|
+
this.turns++;
|
|
180
|
+
this.spentUsd += r.spentUsd ?? 0;
|
|
181
|
+
this.last = r;
|
|
182
|
+
return r;
|
|
183
|
+
});
|
|
184
|
+
const settled = () => {
|
|
185
|
+
this.pending--;
|
|
186
|
+
};
|
|
187
|
+
this.tail = run.then(settled, settled);
|
|
188
|
+
return run;
|
|
189
|
+
}
|
|
190
|
+
async runTurn(text, timeoutMs, capUsd) {
|
|
191
|
+
this.stopped = false;
|
|
192
|
+
this.providerError = null;
|
|
193
|
+
const budget = new TurnBudget({
|
|
194
|
+
abort: () => this.session.abort(),
|
|
195
|
+
dispose: async () => this.session.dispose(),
|
|
196
|
+
}, { timeoutMs, capUsd, graceMs: GRACE_MS, backstop: this.backstop });
|
|
197
|
+
this.budget = budget;
|
|
198
|
+
this.writeHeader();
|
|
199
|
+
let failure = null;
|
|
200
|
+
try {
|
|
201
|
+
await this.session.prompt(text);
|
|
202
|
+
}
|
|
203
|
+
catch (e) {
|
|
204
|
+
failure = e instanceof Error ? e.message : String(e);
|
|
205
|
+
appendFileSync(this.spec.stderrFile, `${failure}\n`);
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
budget.end();
|
|
209
|
+
this.budget = null;
|
|
210
|
+
}
|
|
211
|
+
// Callers read the events file the moment the turn resolves: every line
|
|
212
|
+
// written so far must be on disk by then.
|
|
213
|
+
await new Promise((resolve) => this.events.write("", () => resolve()));
|
|
214
|
+
const tripped = budget.tripped;
|
|
215
|
+
if (failure === null && this.providerError !== null) {
|
|
216
|
+
failure = this.providerError;
|
|
217
|
+
appendFileSync(this.spec.stderrFile, `${String(failure)}\n`);
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
// No exit status in process: 0 when the turn ran to its end, null when it
|
|
221
|
+
// was stopped (by us, or a limit), 1 when pi refused or failed it.
|
|
222
|
+
code: tripped !== null || this.stopped ? null : failure !== null ? 1 : 0,
|
|
223
|
+
timedOut: tripped === "timeout",
|
|
224
|
+
streamError: this.streamError,
|
|
225
|
+
spentUsd: budget.spentUsd,
|
|
226
|
+
capped: tripped === "cap",
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/** The session header leads the stream, as it leads `pi --mode json`'s stdout. */
|
|
230
|
+
writeHeader() {
|
|
231
|
+
if (this.headerWritten)
|
|
232
|
+
return;
|
|
233
|
+
this.headerWritten = true;
|
|
234
|
+
const header = this.session.sessionManager.getHeader();
|
|
235
|
+
if (header)
|
|
236
|
+
this.write(JSON.stringify(header));
|
|
237
|
+
}
|
|
238
|
+
onEvent(event) {
|
|
239
|
+
// The cap reads the lens children's spend off the updates, so it sees them;
|
|
240
|
+
// the file and the listeners do not.
|
|
241
|
+
this.budget?.observe(event);
|
|
242
|
+
if (event.type === "message_end") {
|
|
243
|
+
const m = event.message;
|
|
244
|
+
if (m.role === "assistant")
|
|
245
|
+
this.providerError =
|
|
246
|
+
m.stopReason === "error"
|
|
247
|
+
? typeof m.errorMessage === "string" && m.errorMessage !== ""
|
|
248
|
+
? m.errorMessage
|
|
249
|
+
: "the provider returned an error"
|
|
250
|
+
: null;
|
|
251
|
+
}
|
|
252
|
+
if (isUpdate(event)) {
|
|
253
|
+
// Not written, and not parsed: an update listener reads the event itself.
|
|
254
|
+
for (const l of this.updateListeners) {
|
|
255
|
+
try {
|
|
256
|
+
l(event);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
// a listener's failure is not the session's
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
this.write(JSON.stringify(event));
|
|
265
|
+
}
|
|
266
|
+
write(line) {
|
|
267
|
+
this.events.write(line + "\n");
|
|
268
|
+
if (this.listeners.size === 0)
|
|
269
|
+
return;
|
|
270
|
+
let parsed;
|
|
271
|
+
try {
|
|
272
|
+
parsed = JSON.parse(line);
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
for (const l of this.listeners) {
|
|
278
|
+
try {
|
|
279
|
+
l(parsed);
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
// a listener's failure is not the session's
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/** The runtime that hosts a session in this process, on `host`'s pi SDK. */
|
|
288
|
+
export function sdkRuntime(host, options = {}) {
|
|
289
|
+
/** One session from a spec, new or reopened. `persist` is the one place the
|
|
290
|
+
* two differ. */
|
|
291
|
+
async function open(spec, persist, resumed) {
|
|
292
|
+
if (!options.extras && spec.extensions && spec.extensions.length > 0)
|
|
293
|
+
// An SDK session loads extension factories, which a route hands it; a
|
|
294
|
+
// path would mean an unrelated loader. Refused, never dropped.
|
|
295
|
+
throw new RuntimeUnsupportedError("extension paths on an SDK session (pass factories)");
|
|
296
|
+
// The two files exist from the start, as they do for a spawned pi.
|
|
297
|
+
for (const f of [spec.eventsFile, spec.stderrFile])
|
|
298
|
+
closeSync(openSync(f, "a"));
|
|
299
|
+
// `provider/id:level` is pi's spelling of a model and its thinking level
|
|
300
|
+
// (--model takes it whole); the host takes them apart.
|
|
301
|
+
const { model, thinking } = splitModelSpec(spec.model);
|
|
302
|
+
const hostSpec = {
|
|
303
|
+
cwd: spec.cwd,
|
|
304
|
+
env: spec.env,
|
|
305
|
+
model,
|
|
306
|
+
...(thinking ? { thinkingLevel: thinking } : {}),
|
|
307
|
+
...(spec.systemPromptFile !== undefined
|
|
308
|
+
? { systemPrompt: stripBom(readFileSync(spec.systemPromptFile, "utf8")) }
|
|
309
|
+
: {}),
|
|
310
|
+
...(spec.agentsFiles ? { agentsFiles: spec.agentsFiles } : {}),
|
|
311
|
+
...(spec.tools ? { tools: spec.tools } : {}),
|
|
312
|
+
...(persist ? { persist } : {}),
|
|
313
|
+
onExtensionError: (e) => appendFileSync(spec.stderrFile, `Extension error (${e.extensionPath}): ${e.error}\n`),
|
|
314
|
+
...options.extras?.(spec),
|
|
315
|
+
};
|
|
316
|
+
return new SdkSession(spec, await host.makeSession(hostSpec), resumed, options.backstop);
|
|
317
|
+
}
|
|
318
|
+
return {
|
|
319
|
+
create(spec) {
|
|
320
|
+
if (spec.sessionFile !== undefined && spec.sessionDir !== undefined)
|
|
321
|
+
return Promise.reject(new Error("a spec names a sessionFile or a sessionDir, not both"));
|
|
322
|
+
return open(spec, spec.sessionFile !== undefined
|
|
323
|
+
? { sessionFile: spec.sessionFile }
|
|
324
|
+
: spec.sessionDir !== undefined
|
|
325
|
+
? { sessionDir: spec.sessionDir }
|
|
326
|
+
: undefined, false);
|
|
327
|
+
},
|
|
328
|
+
resume(sessionFile, spec) {
|
|
329
|
+
// SessionManager.open on the existing JSONL: the same id (the provider's
|
|
330
|
+
// cache key), later turns appended to the same file. The file is named by
|
|
331
|
+
// the argument; a spec that names another one, or a directory, is a bug.
|
|
332
|
+
if (spec.sessionDir !== undefined)
|
|
333
|
+
return Promise.reject(new Error("a resume names its file, not a sessionDir"));
|
|
334
|
+
if (spec.sessionFile !== undefined && spec.sessionFile !== sessionFile)
|
|
335
|
+
return Promise.reject(new Error(`a resume of ${sessionFile} cannot name another sessionFile`));
|
|
336
|
+
return open(spec, { resumeFile: sessionFile }, true);
|
|
337
|
+
},
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=sdkruntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdkruntime.js","sourceRoot":"","sources":["../../../src/engine/sdkruntime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { EngineRuntimeKind, LensRuntimeKind } from "../reviewconfig.js";
|
|
2
|
+
import type { Runtime } from "./port.js";
|
|
3
|
+
/** Read a runtime kind. Throws on anything but `sdk`. */
|
|
4
|
+
export declare function parseRuntimeKind(v: string): EngineRuntimeKind;
|
|
5
|
+
/** `[pi] lens_runtime = engine` (the only kind) needs the engine's lens tool and
|
|
6
|
+
* discovery wave, which a route passes in as `engine` once it has them; a route
|
|
7
|
+
* without them refuses the key, not ignores it. */
|
|
8
|
+
export declare function checkLensRuntime(kind: LensRuntimeKind, route: string, engine?: boolean): void;
|
|
9
|
+
/**
|
|
10
|
+
* The runtime to inject into a route.
|
|
11
|
+
*
|
|
12
|
+
* @param route names the route in the refusal ("review", "bench", "scan")
|
|
13
|
+
* @param sdk builds the route's SDK runtime; absent while the route has none
|
|
14
|
+
*/
|
|
15
|
+
export declare function selectRuntime(kind: EngineRuntimeKind, route: string, sdk?: () => Runtime): Runtime;
|
|
16
|
+
//# sourceMappingURL=select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/engine/select.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE7E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAM7D;AAED;;mDAEmD;AACnD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,IAAI,CAG3F;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,MAAM,EACb,GAAG,CAAC,EAAE,MAAM,OAAO,GAClB,OAAO,CAKT"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Which runtime a route hosts its pi sessions on: `[engine] runtime` (or a
|
|
2
|
+
// route's own override). `sdk` is the only kind: the process runtime is
|
|
3
|
+
// retired. It needs a host the route builds itself (PiHost, auth, extension
|
|
4
|
+
// factories), so a route passes `sdk` only once it has one; a route that does
|
|
5
|
+
// not refuses the key rather than quietly running something else.
|
|
6
|
+
import { ENGINE_RUNTIME_KINDS } from "../reviewconfig.js";
|
|
7
|
+
/** Read a runtime kind. Throws on anything but `sdk`. */
|
|
8
|
+
export function parseRuntimeKind(v) {
|
|
9
|
+
if (!ENGINE_RUNTIME_KINDS.includes(v))
|
|
10
|
+
throw new Error(`runtime must be ${ENGINE_RUNTIME_KINDS.join(" | ")} (got ${JSON.stringify(v)})`);
|
|
11
|
+
return v;
|
|
12
|
+
}
|
|
13
|
+
/** `[pi] lens_runtime = engine` (the only kind) needs the engine's lens tool and
|
|
14
|
+
* discovery wave, which a route passes in as `engine` once it has them; a route
|
|
15
|
+
* without them refuses the key, not ignores it. */
|
|
16
|
+
export function checkLensRuntime(kind, route, engine = false) {
|
|
17
|
+
if (kind === "engine" && !engine)
|
|
18
|
+
throw new Error(`[pi] lens_runtime = engine is not available on the ${route} route yet`);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The runtime to inject into a route.
|
|
22
|
+
*
|
|
23
|
+
* @param route names the route in the refusal ("review", "bench", "scan")
|
|
24
|
+
* @param sdk builds the route's SDK runtime; absent while the route has none
|
|
25
|
+
*/
|
|
26
|
+
export function selectRuntime(kind, route, sdk) {
|
|
27
|
+
void kind;
|
|
28
|
+
if (sdk === undefined)
|
|
29
|
+
throw new Error(`[engine] runtime = sdk is not available on the ${route} route yet`);
|
|
30
|
+
return sdk();
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../../src/engine/select.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,wEAAwE;AACxE,4EAA4E;AAC5E,8EAA8E;AAC9E,kEAAkE;AAGlE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG1D,yDAAyD;AACzD,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,IAAI,CAAE,oBAA0C,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1D,MAAM,IAAI,KAAK,CACb,mBAAmB,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CACjF,CAAC;IACJ,OAAO,CAAsB,CAAC;AAChC,CAAC;AAED;;mDAEmD;AACnD,MAAM,UAAU,gBAAgB,CAAC,IAAqB,EAAE,KAAa,EAAE,MAAM,GAAG,KAAK;IACnF,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM;QAC9B,MAAM,IAAI,KAAK,CAAC,sDAAsD,KAAK,YAAY,CAAC,CAAC;AAC7F,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAuB,EACvB,KAAa,EACb,GAAmB;IAEnB,KAAK,IAAI,CAAC;IACV,IAAI,GAAG,KAAK,SAAS;QACnB,MAAM,IAAI,KAAK,CAAC,kDAAkD,KAAK,YAAY,CAAC,CAAC;IACvF,OAAO,GAAG,EAAE,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionwrap.d.ts","sourceRoot":"","sources":["../../../src/engine/sessionwrap.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,IAAI,GAAG,cAAc,CA2BpF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** A session that runs `after` once, when it is disposed. */
|
|
2
|
+
export function releasing(session, after) {
|
|
3
|
+
let released = false;
|
|
4
|
+
return {
|
|
5
|
+
get id() {
|
|
6
|
+
return session.id;
|
|
7
|
+
},
|
|
8
|
+
get sessionFile() {
|
|
9
|
+
return session.sessionFile;
|
|
10
|
+
},
|
|
11
|
+
prompt: (text, options) => session.prompt(text, options),
|
|
12
|
+
followUp: (text, options) => session.followUp(text, options),
|
|
13
|
+
steer: (text, options) => session.steer(text, options),
|
|
14
|
+
abort: () => session.abort(),
|
|
15
|
+
subscribe: (listener, options) => session.subscribe(listener, options),
|
|
16
|
+
...(session.compact ? { compact: () => session.compact() } : {}),
|
|
17
|
+
stats: () => session.stats(),
|
|
18
|
+
dispose: async () => {
|
|
19
|
+
try {
|
|
20
|
+
await session.dispose();
|
|
21
|
+
}
|
|
22
|
+
finally {
|
|
23
|
+
if (!released) {
|
|
24
|
+
released = true;
|
|
25
|
+
after();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=sessionwrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionwrap.js","sourceRoot":"","sources":["../../../src/engine/sessionwrap.ts"],"names":[],"mappings":"AAKA,6DAA6D;AAC7D,MAAM,UAAU,SAAS,CAAC,OAAuB,EAAE,KAAiB;IAClE,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO;QACL,IAAI,EAAE;YACJ,OAAO,OAAO,CAAC,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,WAAW;YACb,OAAO,OAAO,CAAC,WAAW,CAAC;QAC7B,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;QACxD,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;QAC5D,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;QACtD,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;QAC5B,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC;QACtE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;QAC5B,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1B,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,QAAQ,GAAG,IAAI,CAAC;oBAChB,KAAK,EAAE,CAAC;gBACV,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { EditOperations, GrepOperations, LsOperations, ReadOperations, ToolDefinition, WriteOperations } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
/** What no file tool may reach, besides the run's agent dirs. `/qcr-login` is
|
|
3
|
+
* where the wrapper and the Action mount the owner's login volume: its
|
|
4
|
+
* auth.json holds the long-lived refresh token and is group-readable by the
|
|
5
|
+
* run uid, whose group the in-process file tools (unlike the tool uid's bash)
|
|
6
|
+
* keep. */
|
|
7
|
+
export declare const FENCED_PATHS: readonly string[];
|
|
8
|
+
/** The directories `env` names as the login's source: the process's own pi
|
|
9
|
+
* agent dir (`PI_CODING_AGENT_DIR`, which a review copies into its private
|
|
10
|
+
* agent dir) and the scan's `QCR_SCAN_AUTH_SRC`. The round's copy is the
|
|
11
|
+
* host's agent dir, fenced separately. */
|
|
12
|
+
export declare function loginSourceDirs(env: NodeJS.ProcessEnv): string[];
|
|
13
|
+
/**
|
|
14
|
+
* The credentials an `env` points at, which no file tool may reach:
|
|
15
|
+
*
|
|
16
|
+
* - every secrets dir this install could be using: the App's private key, the
|
|
17
|
+
* webhook secret and the OpenViking keys live there. The list is the bash
|
|
18
|
+
* guard's own (`defaultSecretPathContext`, which mirrors the install
|
|
19
|
+
* locator: `$QCR_SECRETS_MOUNT`, the container mount, `$QC_SECRETS_DIR`,
|
|
20
|
+
* `<config home>/secrets`, a `[github] secrets_dir` read from
|
|
21
|
+
* `$QCR_CONFIG`, and the legacy dir), so the shell belt and this fence
|
|
22
|
+
* name the same places;
|
|
23
|
+
* - the daemon's IPC run dirs (the socket and the capability launch files);
|
|
24
|
+
* - the memory CLI config the env names (`OPENVIKING_CLI_CONFIG_FILE`, the
|
|
25
|
+
* sessions' ovcli.conf): it holds the reviewer key, which the in-process
|
|
26
|
+
* memory extension reads itself and the model has no use for.
|
|
27
|
+
*
|
|
28
|
+
* Our own code reads these with plain fs calls, never through the tools, so
|
|
29
|
+
* fencing them takes nothing away from it. Every absolute path, deduplicated;
|
|
30
|
+
* a path that does not exist is fenced lexically and by its resolved prefix.
|
|
31
|
+
*/
|
|
32
|
+
export declare function credentialPaths(...envs: NodeJS.ProcessEnv[]): string[];
|
|
33
|
+
/** The names of the file tools behind the fence. */
|
|
34
|
+
export declare const FENCED_TOOLS: readonly ["read", "grep", "find", "ls", "edit", "write"];
|
|
35
|
+
export type FencedTool = (typeof FENCED_TOOLS)[number];
|
|
36
|
+
/** A path the fence refuses; `message` is what the model reads. */
|
|
37
|
+
export declare class ToolFenceError extends Error {
|
|
38
|
+
constructor(path: string);
|
|
39
|
+
}
|
|
40
|
+
export interface ToolFence {
|
|
41
|
+
/** Throws a ToolFenceError for a path that is, or leads to, a fenced one. */
|
|
42
|
+
check(path: string): void;
|
|
43
|
+
/** `check`, and for a search root that ripgrep or fd walk: also refuses a
|
|
44
|
+
* root with a fenced path below it, which the walk would reach. */
|
|
45
|
+
checkTree(path: string): void;
|
|
46
|
+
/** For a file already opened: refuses when the descriptor is a fenced file,
|
|
47
|
+
* whatever path it was opened by. A no-op where /proc/self/fd does not exist. */
|
|
48
|
+
checkOpened(fd: number, path: string): void;
|
|
49
|
+
/** `check`, and for a write: refuses a path that LEADS, through a symlink,
|
|
50
|
+
* onto a protected write target (`protectedWrite`). A path that is itself the
|
|
51
|
+
* target is the write veto's to judge as spelled (bash-guard), so only a real
|
|
52
|
+
* path that differs from the one given is held to the predicate here. */
|
|
53
|
+
checkWrite(path: string): void;
|
|
54
|
+
/** `checkOpened`, and the same symlink rule for the descriptor a write opened. */
|
|
55
|
+
checkWriteOpened(fd: number, path: string): void;
|
|
56
|
+
}
|
|
57
|
+
/** A fence over the fixed paths and the given directories. */
|
|
58
|
+
export declare function createToolFence(o?: {
|
|
59
|
+
dirs?: readonly string[];
|
|
60
|
+
/** The write veto's predicate (bash-guard `isProtectedWriteTarget`): git's
|
|
61
|
+
* config and hook surface, the policy surface, the memory scope, the wake
|
|
62
|
+
* delivery files. Applied to where a write really lands when a symlink
|
|
63
|
+
* moved it: the in-process write tools run in the uid that runs the
|
|
64
|
+
* daemon's git and reads its policy, so a link committed in a PR, or one
|
|
65
|
+
* the tool uid planted in a directory it shares, must not carry a write
|
|
66
|
+
* there. */
|
|
67
|
+
protectedWrite?: (realPath: string) => boolean;
|
|
68
|
+
}): ToolFence;
|
|
69
|
+
/** A tool's `path` argument as pi resolves it (utils/paths.js resolvePath with
|
|
70
|
+
* unicode spaces and the `@` prefix normalised, `~` and file: URLs expanded).
|
|
71
|
+
* `home` is the home pi expands `~` against, as the host resolved it; without
|
|
72
|
+
* one a `~` path cannot be shown clear of the fence and is refused. */
|
|
73
|
+
export declare function toolPath(input: string, cwd: string, home?: string): string;
|
|
74
|
+
/** Tells an image from its first bytes: its mime type, or null. */
|
|
75
|
+
export type ImageSniffer = (head: Buffer) => string | null | undefined;
|
|
76
|
+
/** The `operations` of each file tool that takes them, every file opened through
|
|
77
|
+
* the fence. `sniff` tells images from their first bytes; without it a file is
|
|
78
|
+
* always read as text. find has none: it starts fd on its search root. */
|
|
79
|
+
export declare function fencedOperations(fence: ToolFence, sniff: ImageSniffer | null): {
|
|
80
|
+
read: ReadOperations;
|
|
81
|
+
grep: GrepOperations;
|
|
82
|
+
ls: LsOperations;
|
|
83
|
+
edit: EditOperations;
|
|
84
|
+
write: WriteOperations;
|
|
85
|
+
};
|
|
86
|
+
/** `def` with a check of its `path` argument ahead of its execution: the
|
|
87
|
+
* refusal says what it is, and the tools that start ripgrep and fd (which
|
|
88
|
+
* `operations` does not reach) are covered. */
|
|
89
|
+
export declare function guardedTool(def: ToolDefinition, fence: ToolFence, cwd: string, home?: string): ToolDefinition;
|
|
90
|
+
//# sourceMappingURL=toolfence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolfence.d.ts","sourceRoot":"","sources":["../../../src/engine/toolfence.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,YAAY,EACZ,cAAc,EACd,cAAc,EACd,eAAe,EAChB,MAAM,iCAAiC,CAAC;AAGzC;;;;WAIW;AACX,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAAsD,CAAC;AAEjG;;;0CAG0C;AAC1C,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,EAAE,CAIhE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,MAAM,EAAE,CAStE;AAED,oDAAoD;AACpD,eAAO,MAAM,YAAY,0DAA2D,CAAC;AACrF,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,mEAAmE;AACnE,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,IAAI,EAAE,MAAM;CAIzB;AA8BD,MAAM,WAAW,SAAS;IACxB,6EAA6E;IAC7E,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;uEACmE;IACnE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B;qFACiF;IACjF,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C;;;6EAGyE;IACzE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAClD;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAC7B,CAAC,GAAE;IACD,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB;;;;;;gBAMY;IACZ,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3C,GACL,SAAS,CAoEX;AAiBD;;;uEAGuE;AACvE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ1E;AAMD,mEAAmE;AACnE,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAsHvE;;0EAE0E;AAC1E,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,YAAY,GAAG,IAAI,GACzB;IACD,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,cAAc,CAAC;IACrB,EAAE,EAAE,YAAY,CAAC;IACjB,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,eAAe,CAAC;CACxB,CAQA;AAED;;+CAE+C;AAC/C,wBAAgB,WAAW,CACzB,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,MAAM,GACZ,cAAc,CAiBhB"}
|