@allocator-one/rcl 4.4.19
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 +21 -0
- package/README.md +1415 -0
- package/dist/ci.d.ts +16 -0
- package/dist/ci.js +42 -0
- package/dist/ci.js.map +1 -0
- package/dist/config/data-dir.d.ts +6 -0
- package/dist/config/data-dir.js +12 -0
- package/dist/config/data-dir.js.map +1 -0
- package/dist/config/defaults.d.ts +82 -0
- package/dist/config/defaults.js +89 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/harness.d.ts +40 -0
- package/dist/config/harness.js +151 -0
- package/dist/config/harness.js.map +1 -0
- package/dist/config/loader.d.ts +13 -0
- package/dist/config/loader.js +131 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/provider-concurrency.d.ts +4 -0
- package/dist/config/provider-concurrency.js +6 -0
- package/dist/config/provider-concurrency.js.map +1 -0
- package/dist/config/providers.d.ts +3 -0
- package/dist/config/providers.js +9 -0
- package/dist/config/providers.js.map +1 -0
- package/dist/config/schema.d.ts +179 -0
- package/dist/config/schema.js +115 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/consensus/claim-contract.d.ts +9 -0
- package/dist/consensus/claim-contract.js +307 -0
- package/dist/consensus/claim-contract.js.map +1 -0
- package/dist/consensus/claim-identity.d.ts +5 -0
- package/dist/consensus/claim-identity.js +39 -0
- package/dist/consensus/claim-identity.js.map +1 -0
- package/dist/consensus/deduper.d.ts +43 -0
- package/dist/consensus/deduper.js +1052 -0
- package/dist/consensus/deduper.js.map +1 -0
- package/dist/consensus/finding-identity.d.ts +20 -0
- package/dist/consensus/finding-identity.js +49 -0
- package/dist/consensus/finding-identity.js.map +1 -0
- package/dist/consensus/gating.d.ts +215 -0
- package/dist/consensus/gating.js +699 -0
- package/dist/consensus/gating.js.map +1 -0
- package/dist/consensus/parser.d.ts +22 -0
- package/dist/consensus/parser.js +255 -0
- package/dist/consensus/parser.js.map +1 -0
- package/dist/consensus/semantic-deduper.d.ts +10 -0
- package/dist/consensus/semantic-deduper.js +70 -0
- package/dist/consensus/semantic-deduper.js.map +1 -0
- package/dist/consensus/types.d.ts +196 -0
- package/dist/consensus/types.js +2 -0
- package/dist/consensus/types.js.map +1 -0
- package/dist/consensus/verification-contract.d.ts +8 -0
- package/dist/consensus/verification-contract.js +95 -0
- package/dist/consensus/verification-contract.js.map +1 -0
- package/dist/consensus/voter.d.ts +29 -0
- package/dist/consensus/voter.js +394 -0
- package/dist/consensus/voter.js.map +1 -0
- package/dist/converge/attempt-budget.d.ts +88 -0
- package/dist/converge/attempt-budget.js +717 -0
- package/dist/converge/attempt-budget.js.map +1 -0
- package/dist/converge/bound-fix-recovery-source.d.ts +24 -0
- package/dist/converge/bound-fix-recovery-source.js +25 -0
- package/dist/converge/bound-fix-recovery-source.js.map +1 -0
- package/dist/converge/bound-fix-recovery.d.ts +15 -0
- package/dist/converge/bound-fix-recovery.js +65 -0
- package/dist/converge/bound-fix-recovery.js.map +1 -0
- package/dist/converge/correction-anchors.d.ts +1 -0
- package/dist/converge/correction-anchors.js +2 -0
- package/dist/converge/correction-anchors.js.map +1 -0
- package/dist/converge/cycle-remote.d.ts +6 -0
- package/dist/converge/cycle-remote.js +41 -0
- package/dist/converge/cycle-remote.js.map +1 -0
- package/dist/converge/delivery-reconciliation.d.ts +17 -0
- package/dist/converge/delivery-reconciliation.js +53 -0
- package/dist/converge/delivery-reconciliation.js.map +1 -0
- package/dist/converge/finding-identity.d.ts +6 -0
- package/dist/converge/finding-identity.js +7 -0
- package/dist/converge/finding-identity.js.map +1 -0
- package/dist/converge/fresh-review.d.ts +37 -0
- package/dist/converge/fresh-review.js +351 -0
- package/dist/converge/fresh-review.js.map +1 -0
- package/dist/converge/launch-guard.d.ts +55 -0
- package/dist/converge/launch-guard.js +363 -0
- package/dist/converge/launch-guard.js.map +1 -0
- package/dist/converge/launch-preflight.d.ts +5 -0
- package/dist/converge/launch-preflight.js +41 -0
- package/dist/converge/launch-preflight.js.map +1 -0
- package/dist/converge/launch-record.d.ts +136 -0
- package/dist/converge/launch-record.js +86 -0
- package/dist/converge/launch-record.js.map +1 -0
- package/dist/converge/legacy-launch-health.d.ts +311 -0
- package/dist/converge/legacy-launch-health.js +159 -0
- package/dist/converge/legacy-launch-health.js.map +1 -0
- package/dist/converge/legacy-roster.d.ts +29 -0
- package/dist/converge/legacy-roster.js +268 -0
- package/dist/converge/legacy-roster.js.map +1 -0
- package/dist/converge/native-lock.d.ts +18 -0
- package/dist/converge/native-lock.js +122 -0
- package/dist/converge/native-lock.js.map +1 -0
- package/dist/converge/ordinary-pending-export.d.ts +67 -0
- package/dist/converge/ordinary-pending-export.js +175 -0
- package/dist/converge/ordinary-pending-export.js.map +1 -0
- package/dist/converge/ordinary-pending-package.d.ts +28 -0
- package/dist/converge/ordinary-pending-package.js +36 -0
- package/dist/converge/ordinary-pending-package.js.map +1 -0
- package/dist/converge/pending-legacy-resume.d.ts +119 -0
- package/dist/converge/pending-legacy-resume.js +720 -0
- package/dist/converge/pending-legacy-resume.js.map +1 -0
- package/dist/converge/pending-recovery-source.d.ts +131 -0
- package/dist/converge/pending-recovery-source.js +71 -0
- package/dist/converge/pending-recovery-source.js.map +1 -0
- package/dist/converge/recovery-launch.d.ts +66 -0
- package/dist/converge/recovery-launch.js +518 -0
- package/dist/converge/recovery-launch.js.map +1 -0
- package/dist/converge/retained-report.d.ts +29 -0
- package/dist/converge/retained-report.js +218 -0
- package/dist/converge/retained-report.js.map +1 -0
- package/dist/converge/retry-source.d.ts +25 -0
- package/dist/converge/retry-source.js +13 -0
- package/dist/converge/retry-source.js.map +1 -0
- package/dist/converge/review-cycle.d.ts +49 -0
- package/dist/converge/review-cycle.js +26 -0
- package/dist/converge/review-cycle.js.map +1 -0
- package/dist/converge/round-gap-schema.d.ts +66 -0
- package/dist/converge/round-gap-schema.js +51 -0
- package/dist/converge/round-gap-schema.js.map +1 -0
- package/dist/converge/round-gap.d.ts +38 -0
- package/dist/converge/round-gap.js +334 -0
- package/dist/converge/round-gap.js.map +1 -0
- package/dist/converge/run-state.d.ts +224 -0
- package/dist/converge/run-state.js +564 -0
- package/dist/converge/run-state.js.map +1 -0
- package/dist/converge/stale-report-schema.d.ts +42 -0
- package/dist/converge/stale-report-schema.js +79 -0
- package/dist/converge/stale-report-schema.js.map +1 -0
- package/dist/converge/stale-report-storage.d.ts +47 -0
- package/dist/converge/stale-report-storage.js +172 -0
- package/dist/converge/stale-report-storage.js.map +1 -0
- package/dist/converge/stale-report.d.ts +14 -0
- package/dist/converge/stale-report.js +213 -0
- package/dist/converge/stale-report.js.map +1 -0
- package/dist/converge/target-ownership.d.ts +29 -0
- package/dist/converge/target-ownership.js +95 -0
- package/dist/converge/target-ownership.js.map +1 -0
- package/dist/converge/terminal-rejection-schema.d.ts +42 -0
- package/dist/converge/terminal-rejection-schema.js +39 -0
- package/dist/converge/terminal-rejection-schema.js.map +1 -0
- package/dist/converge/terminal-rejection.d.ts +13 -0
- package/dist/converge/terminal-rejection.js +275 -0
- package/dist/converge/terminal-rejection.js.map +1 -0
- package/dist/coordination/registry-lock.d.ts +82 -0
- package/dist/coordination/registry-lock.js +498 -0
- package/dist/coordination/registry-lock.js.map +1 -0
- package/dist/discuss.d.ts +53 -0
- package/dist/discuss.js +112 -0
- package/dist/discuss.js.map +1 -0
- package/dist/dispatch/adapter.d.ts +32 -0
- package/dist/dispatch/adapter.js +2 -0
- package/dist/dispatch/adapter.js.map +1 -0
- package/dist/dispatch/anthropic.d.ts +10 -0
- package/dist/dispatch/anthropic.js +235 -0
- package/dist/dispatch/anthropic.js.map +1 -0
- package/dist/dispatch/async-lane.d.ts +127 -0
- package/dist/dispatch/async-lane.js +414 -0
- package/dist/dispatch/async-lane.js.map +1 -0
- package/dist/dispatch/capture-council.d.ts +63 -0
- package/dist/dispatch/capture-council.js +137 -0
- package/dist/dispatch/capture-council.js.map +1 -0
- package/dist/dispatch/captured-async.d.ts +67 -0
- package/dist/dispatch/captured-async.js +40 -0
- package/dist/dispatch/captured-async.js.map +1 -0
- package/dist/dispatch/captured-inputs.d.ts +50 -0
- package/dist/dispatch/captured-inputs.js +190 -0
- package/dist/dispatch/captured-inputs.js.map +1 -0
- package/dist/dispatch/checkpoint-async-context.d.ts +27 -0
- package/dist/dispatch/checkpoint-async-context.js +51 -0
- package/dist/dispatch/checkpoint-async-context.js.map +1 -0
- package/dist/dispatch/checkpoint-async-execution.d.ts +22 -0
- package/dist/dispatch/checkpoint-async-execution.js +130 -0
- package/dist/dispatch/checkpoint-async-execution.js.map +1 -0
- package/dist/dispatch/checkpoint-async-store.d.ts +134 -0
- package/dist/dispatch/checkpoint-async-store.js +534 -0
- package/dist/dispatch/checkpoint-async-store.js.map +1 -0
- package/dist/dispatch/checkpoint-async-unknown.d.ts +19 -0
- package/dist/dispatch/checkpoint-async-unknown.js +46 -0
- package/dist/dispatch/checkpoint-async-unknown.js.map +1 -0
- package/dist/dispatch/checkpoint-async.d.ts +252 -0
- package/dist/dispatch/checkpoint-async.js +270 -0
- package/dist/dispatch/checkpoint-async.js.map +1 -0
- package/dist/dispatch/checkpoint-gating-execution.d.ts +26 -0
- package/dist/dispatch/checkpoint-gating-execution.js +84 -0
- package/dist/dispatch/checkpoint-gating-execution.js.map +1 -0
- package/dist/dispatch/checkpoint-phase-limits.d.ts +5 -0
- package/dist/dispatch/checkpoint-phase-limits.js +11 -0
- package/dist/dispatch/checkpoint-phase-limits.js.map +1 -0
- package/dist/dispatch/checkpoint-verification-context.d.ts +15 -0
- package/dist/dispatch/checkpoint-verification-context.js +48 -0
- package/dist/dispatch/checkpoint-verification-context.js.map +1 -0
- package/dist/dispatch/checkpoint-verification.d.ts +213 -0
- package/dist/dispatch/checkpoint-verification.js +381 -0
- package/dist/dispatch/checkpoint-verification.js.map +1 -0
- package/dist/dispatch/checkpoint.d.ts +329 -0
- package/dist/dispatch/checkpoint.js +1418 -0
- package/dist/dispatch/checkpoint.js.map +1 -0
- package/dist/dispatch/google.d.ts +10 -0
- package/dist/dispatch/google.js +158 -0
- package/dist/dispatch/google.js.map +1 -0
- package/dist/dispatch/late-audit.d.ts +23 -0
- package/dist/dispatch/late-audit.js +133 -0
- package/dist/dispatch/late-audit.js.map +1 -0
- package/dist/dispatch/merge.d.ts +29 -0
- package/dist/dispatch/merge.js +112 -0
- package/dist/dispatch/merge.js.map +1 -0
- package/dist/dispatch/openai-compat.d.ts +30 -0
- package/dist/dispatch/openai-compat.js +166 -0
- package/dist/dispatch/openai-compat.js.map +1 -0
- package/dist/dispatch/openai.d.ts +10 -0
- package/dist/dispatch/openai.js +159 -0
- package/dist/dispatch/openai.js.map +1 -0
- package/dist/dispatch/original-execution.d.ts +30 -0
- package/dist/dispatch/original-execution.js +91 -0
- package/dist/dispatch/original-execution.js.map +1 -0
- package/dist/dispatch/original-launch.d.ts +37 -0
- package/dist/dispatch/original-launch.js +117 -0
- package/dist/dispatch/original-launch.js.map +1 -0
- package/dist/dispatch/quorum.d.ts +15 -0
- package/dist/dispatch/quorum.js +33 -0
- package/dist/dispatch/quorum.js.map +1 -0
- package/dist/dispatch/recovery-operation.d.ts +44 -0
- package/dist/dispatch/recovery-operation.js +146 -0
- package/dist/dispatch/recovery-operation.js.map +1 -0
- package/dist/dispatch/recovery-policy.d.ts +54 -0
- package/dist/dispatch/recovery-policy.js +157 -0
- package/dist/dispatch/recovery-policy.js.map +1 -0
- package/dist/dispatch/recovery.d.ts +78 -0
- package/dist/dispatch/recovery.js +299 -0
- package/dist/dispatch/recovery.js.map +1 -0
- package/dist/dispatch/retained-async.d.ts +13 -0
- package/dist/dispatch/retained-async.js +101 -0
- package/dist/dispatch/retained-async.js.map +1 -0
- package/dist/dispatch/reviewer-identity.d.ts +10 -0
- package/dist/dispatch/reviewer-identity.js +19 -0
- package/dist/dispatch/reviewer-identity.js.map +1 -0
- package/dist/dispatch/runner.d.ts +76 -0
- package/dist/dispatch/runner.js +415 -0
- package/dist/dispatch/runner.js.map +1 -0
- package/dist/dispatch/utils.d.ts +159 -0
- package/dist/dispatch/utils.js +381 -0
- package/dist/dispatch/utils.js.map +1 -0
- package/dist/dispatch/verification-execution.d.ts +48 -0
- package/dist/dispatch/verification-execution.js +252 -0
- package/dist/dispatch/verification-execution.js.map +1 -0
- package/dist/dispatch/verification-late-audit.d.ts +17 -0
- package/dist/dispatch/verification-late-audit.js +117 -0
- package/dist/dispatch/verification-late-audit.js.map +1 -0
- package/dist/evidence/claim-recovery/authenticated-carrier-projection.d.ts +30 -0
- package/dist/evidence/claim-recovery/authenticated-carrier-projection.js +100 -0
- package/dist/evidence/claim-recovery/authenticated-carrier-projection.js.map +1 -0
- package/dist/evidence/claim-recovery/authenticated-receipts.d.ts +46 -0
- package/dist/evidence/claim-recovery/authenticated-receipts.js +120 -0
- package/dist/evidence/claim-recovery/authenticated-receipts.js.map +1 -0
- package/dist/evidence/claim-recovery/carrier-inventory.d.ts +49 -0
- package/dist/evidence/claim-recovery/carrier-inventory.js +340 -0
- package/dist/evidence/claim-recovery/carrier-inventory.js.map +1 -0
- package/dist/evidence/claim-recovery/claim-index.d.ts +12 -0
- package/dist/evidence/claim-recovery/claim-index.js +56 -0
- package/dist/evidence/claim-recovery/claim-index.js.map +1 -0
- package/dist/evidence/claim-recovery/confirmation.d.ts +53 -0
- package/dist/evidence/claim-recovery/confirmation.js +151 -0
- package/dist/evidence/claim-recovery/confirmation.js.map +1 -0
- package/dist/evidence/claim-recovery/context.d.ts +15 -0
- package/dist/evidence/claim-recovery/context.js +40 -0
- package/dist/evidence/claim-recovery/context.js.map +1 -0
- package/dist/evidence/claim-recovery/proof-storage.d.ts +6 -0
- package/dist/evidence/claim-recovery/proof-storage.js +97 -0
- package/dist/evidence/claim-recovery/proof-storage.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/anchors.d.ts +20 -0
- package/dist/evidence/claim-recovery/validation/anchors.js +22 -0
- package/dist/evidence/claim-recovery/validation/anchors.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/carrier-projection.d.ts +9 -0
- package/dist/evidence/claim-recovery/validation/carrier-projection.js +364 -0
- package/dist/evidence/claim-recovery/validation/carrier-projection.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/carrier-types.d.ts +83 -0
- package/dist/evidence/claim-recovery/validation/carrier-types.js +2 -0
- package/dist/evidence/claim-recovery/validation/carrier-types.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/claim-split.d.ts +57 -0
- package/dist/evidence/claim-recovery/validation/claim-split.js +209 -0
- package/dist/evidence/claim-recovery/validation/claim-split.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/claims.d.ts +20 -0
- package/dist/evidence/claim-recovery/validation/claims.js +108 -0
- package/dist/evidence/claim-recovery/validation/claims.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/current-projection.d.ts +36 -0
- package/dist/evidence/claim-recovery/validation/current-projection.js +424 -0
- package/dist/evidence/claim-recovery/validation/current-projection.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/lexical.d.ts +18 -0
- package/dist/evidence/claim-recovery/validation/lexical.js +91 -0
- package/dist/evidence/claim-recovery/validation/lexical.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/materials.d.ts +19 -0
- package/dist/evidence/claim-recovery/validation/materials.js +160 -0
- package/dist/evidence/claim-recovery/validation/materials.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/native-material.d.ts +27 -0
- package/dist/evidence/claim-recovery/validation/native-material.js +35 -0
- package/dist/evidence/claim-recovery/validation/native-material.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/native-occurrences.d.ts +79 -0
- package/dist/evidence/claim-recovery/validation/native-occurrences.js +187 -0
- package/dist/evidence/claim-recovery/validation/native-occurrences.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/native-state.d.ts +45 -0
- package/dist/evidence/claim-recovery/validation/native-state.js +385 -0
- package/dist/evidence/claim-recovery/validation/native-state.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/obligations.d.ts +15 -0
- package/dist/evidence/claim-recovery/validation/obligations.js +65 -0
- package/dist/evidence/claim-recovery/validation/obligations.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/occurrence-source.d.ts +45 -0
- package/dist/evidence/claim-recovery/validation/occurrence-source.js +208 -0
- package/dist/evidence/claim-recovery/validation/occurrence-source.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/occurrence-types.d.ts +101 -0
- package/dist/evidence/claim-recovery/validation/occurrence-types.js +2 -0
- package/dist/evidence/claim-recovery/validation/occurrence-types.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/occurrence.d.ts +30 -0
- package/dist/evidence/claim-recovery/validation/occurrence.js +227 -0
- package/dist/evidence/claim-recovery/validation/occurrence.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/primitives.d.ts +11 -0
- package/dist/evidence/claim-recovery/validation/primitives.js +41 -0
- package/dist/evidence/claim-recovery/validation/primitives.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/receipts.d.ts +37 -0
- package/dist/evidence/claim-recovery/validation/receipts.js +83 -0
- package/dist/evidence/claim-recovery/validation/receipts.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/recovery-json.d.ts +8 -0
- package/dist/evidence/claim-recovery/validation/recovery-json.js +42 -0
- package/dist/evidence/claim-recovery/validation/recovery-json.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/semantic-cache.d.ts +3 -0
- package/dist/evidence/claim-recovery/validation/semantic-cache.js +22 -0
- package/dist/evidence/claim-recovery/validation/semantic-cache.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/semantic-validation.d.ts +9 -0
- package/dist/evidence/claim-recovery/validation/semantic-validation.js +347 -0
- package/dist/evidence/claim-recovery/validation/semantic-validation.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/sighting.d.ts +2 -0
- package/dist/evidence/claim-recovery/validation/sighting.js +15 -0
- package/dist/evidence/claim-recovery/validation/sighting.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/sources.d.ts +15 -0
- package/dist/evidence/claim-recovery/validation/sources.js +2 -0
- package/dist/evidence/claim-recovery/validation/sources.js.map +1 -0
- package/dist/evidence/claim-recovery/validation/types.d.ts +126 -0
- package/dist/evidence/claim-recovery/validation/types.js +2 -0
- package/dist/evidence/claim-recovery/validation/types.js.map +1 -0
- package/dist/evidence/claim-split.d.ts +1 -0
- package/dist/evidence/claim-split.js +2 -0
- package/dist/evidence/claim-split.js.map +1 -0
- package/dist/evidence/event-receipts.d.ts +16 -0
- package/dist/evidence/event-receipts.js +41 -0
- package/dist/evidence/event-receipts.js.map +1 -0
- package/dist/evidence/finding-recovery.d.ts +23 -0
- package/dist/evidence/finding-recovery.js +74 -0
- package/dist/evidence/finding-recovery.js.map +1 -0
- package/dist/evidence/finding-retriage.d.ts +14 -0
- package/dist/evidence/finding-retriage.js +57 -0
- package/dist/evidence/finding-retriage.js.map +1 -0
- package/dist/evidence/format.d.ts +18 -0
- package/dist/evidence/format.js +152 -0
- package/dist/evidence/format.js.map +1 -0
- package/dist/evidence/original-run/decode.d.ts +30 -0
- package/dist/evidence/original-run/decode.js +208 -0
- package/dist/evidence/original-run/decode.js.map +1 -0
- package/dist/evidence/original-run/journal.d.ts +31 -0
- package/dist/evidence/original-run/journal.js +157 -0
- package/dist/evidence/original-run/journal.js.map +1 -0
- package/dist/evidence/original-run/lock-path.d.ts +17 -0
- package/dist/evidence/original-run/lock-path.js +116 -0
- package/dist/evidence/original-run/lock-path.js.map +1 -0
- package/dist/evidence/original-run/lock-scope.d.ts +21 -0
- package/dist/evidence/original-run/lock-scope.js +61 -0
- package/dist/evidence/original-run/lock-scope.js.map +1 -0
- package/dist/evidence/original-run/lock.d.ts +33 -0
- package/dist/evidence/original-run/lock.js +259 -0
- package/dist/evidence/original-run/lock.js.map +1 -0
- package/dist/evidence/original-run/remote.d.ts +23 -0
- package/dist/evidence/original-run/remote.js +110 -0
- package/dist/evidence/original-run/remote.js.map +1 -0
- package/dist/evidence/original-run/source.d.ts +61 -0
- package/dist/evidence/original-run/source.js +267 -0
- package/dist/evidence/original-run/source.js.map +1 -0
- package/dist/evidence/reads.d.ts +11 -0
- package/dist/evidence/reads.js +16 -0
- package/dist/evidence/reads.js.map +1 -0
- package/dist/evidence/recover-finding.d.ts +17 -0
- package/dist/evidence/recover-finding.js +65 -0
- package/dist/evidence/recover-finding.js.map +1 -0
- package/dist/evidence/recover-run.d.ts +26 -0
- package/dist/evidence/recover-run.js +180 -0
- package/dist/evidence/recover-run.js.map +1 -0
- package/dist/evidence/retained-time-budget.d.ts +9 -0
- package/dist/evidence/retained-time-budget.js +14 -0
- package/dist/evidence/retained-time-budget.js.map +1 -0
- package/dist/evidence/retriage-finding.d.ts +12 -0
- package/dist/evidence/retriage-finding.js +67 -0
- package/dist/evidence/retriage-finding.js.map +1 -0
- package/dist/evidence/reviewer-lineage.d.ts +35 -0
- package/dist/evidence/reviewer-lineage.js +293 -0
- package/dist/evidence/reviewer-lineage.js.map +1 -0
- package/dist/evidence/reviewer-original.d.ts +67 -0
- package/dist/evidence/reviewer-original.js +148 -0
- package/dist/evidence/reviewer-original.js.map +1 -0
- package/dist/evidence/reviewer-recovery.d.ts +74 -0
- package/dist/evidence/reviewer-recovery.js +179 -0
- package/dist/evidence/reviewer-recovery.js.map +1 -0
- package/dist/evidence/reviewer-status.d.ts +145 -0
- package/dist/evidence/reviewer-status.js +302 -0
- package/dist/evidence/reviewer-status.js.map +1 -0
- package/dist/evidence/show.d.ts +10 -0
- package/dist/evidence/show.js +41 -0
- package/dist/evidence/show.js.map +1 -0
- package/dist/evidence/status.d.ts +38 -0
- package/dist/evidence/status.js +73 -0
- package/dist/evidence/status.js.map +1 -0
- package/dist/evidence/target.d.ts +17 -0
- package/dist/evidence/target.js +74 -0
- package/dist/evidence/target.js.map +1 -0
- package/dist/evidence/types.d.ts +176 -0
- package/dist/evidence/types.js +109 -0
- package/dist/evidence/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2688 -0
- package/dist/index.js.map +1 -0
- package/dist/models/seed.d.ts +44 -0
- package/dist/models/seed.js +175 -0
- package/dist/models/seed.js.map +1 -0
- package/dist/models/server-stats.d.ts +80 -0
- package/dist/models/server-stats.js +109 -0
- package/dist/models/server-stats.js.map +1 -0
- package/dist/models/stats-store.d.ts +84 -0
- package/dist/models/stats-store.js +572 -0
- package/dist/models/stats-store.js.map +1 -0
- package/dist/output/artifacts.d.ts +16 -0
- package/dist/output/artifacts.js +29 -0
- package/dist/output/artifacts.js.map +1 -0
- package/dist/output/assembly-refusal.d.ts +8 -0
- package/dist/output/assembly-refusal.js +14 -0
- package/dist/output/assembly-refusal.js.map +1 -0
- package/dist/output/github.d.ts +12 -0
- package/dist/output/github.js +214 -0
- package/dist/output/github.js.map +1 -0
- package/dist/output/json.d.ts +3 -0
- package/dist/output/json.js +8 -0
- package/dist/output/json.js.map +1 -0
- package/dist/output/markdown.d.ts +3 -0
- package/dist/output/markdown.js +281 -0
- package/dist/output/markdown.js.map +1 -0
- package/dist/output/progress.d.ts +55 -0
- package/dist/output/progress.js +180 -0
- package/dist/output/progress.js.map +1 -0
- package/dist/output/sanitize.d.ts +18 -0
- package/dist/output/sanitize.js +46 -0
- package/dist/output/sanitize.js.map +1 -0
- package/dist/output/terminal.d.ts +2 -0
- package/dist/output/terminal.js +172 -0
- package/dist/output/terminal.js.map +1 -0
- package/dist/prepare/chunker.d.ts +18 -0
- package/dist/prepare/chunker.js +325 -0
- package/dist/prepare/chunker.js.map +1 -0
- package/dist/prepare/language.d.ts +1 -0
- package/dist/prepare/language.js +99 -0
- package/dist/prepare/language.js.map +1 -0
- package/dist/prepare/prompt-builder.d.ts +44 -0
- package/dist/prepare/prompt-builder.js +102 -0
- package/dist/prepare/prompt-builder.js.map +1 -0
- package/dist/prepare/unified-diff.d.ts +40 -0
- package/dist/prepare/unified-diff.js +135 -0
- package/dist/prepare/unified-diff.js.map +1 -0
- package/dist/prompts/base.d.ts +3 -0
- package/dist/prompts/base.js +53 -0
- package/dist/prompts/base.js.map +1 -0
- package/dist/prompts/hardening.d.ts +19 -0
- package/dist/prompts/hardening.js +67 -0
- package/dist/prompts/hardening.js.map +1 -0
- package/dist/prompts/languages/elixir.d.ts +1 -0
- package/dist/prompts/languages/elixir.js +13 -0
- package/dist/prompts/languages/elixir.js.map +1 -0
- package/dist/prompts/languages/generic.d.ts +1 -0
- package/dist/prompts/languages/generic.js +11 -0
- package/dist/prompts/languages/generic.js.map +1 -0
- package/dist/prompts/languages/python.d.ts +1 -0
- package/dist/prompts/languages/python.js +14 -0
- package/dist/prompts/languages/python.js.map +1 -0
- package/dist/prompts/languages/typescript.d.ts +1 -0
- package/dist/prompts/languages/typescript.js +13 -0
- package/dist/prompts/languages/typescript.js.map +1 -0
- package/dist/prompts/plan.d.ts +15 -0
- package/dist/prompts/plan.js +55 -0
- package/dist/prompts/plan.js.map +1 -0
- package/dist/report/aggregation-inputs.d.ts +52 -0
- package/dist/report/aggregation-inputs.js +114 -0
- package/dist/report/aggregation-inputs.js.map +1 -0
- package/dist/report/assembly.d.ts +43 -0
- package/dist/report/assembly.js +133 -0
- package/dist/report/assembly.js.map +1 -0
- package/dist/report/blocking-health.d.ts +64 -0
- package/dist/report/blocking-health.js +156 -0
- package/dist/report/blocking-health.js.map +1 -0
- package/dist/report/checkpoint-assembly.d.ts +10 -0
- package/dist/report/checkpoint-assembly.js +17 -0
- package/dist/report/checkpoint-assembly.js.map +1 -0
- package/dist/report/checkpoint-consensus.d.ts +59 -0
- package/dist/report/checkpoint-consensus.js +197 -0
- package/dist/report/checkpoint-consensus.js.map +1 -0
- package/dist/report/checkpoint-gating.d.ts +36 -0
- package/dist/report/checkpoint-gating.js +110 -0
- package/dist/report/checkpoint-gating.js.map +1 -0
- package/dist/report/checkpoint-projection.d.ts +76 -0
- package/dist/report/checkpoint-projection.js +122 -0
- package/dist/report/checkpoint-projection.js.map +1 -0
- package/dist/report/consensus-assembly.d.ts +37 -0
- package/dist/report/consensus-assembly.js +33 -0
- package/dist/report/consensus-assembly.js.map +1 -0
- package/dist/report/recovery-source.d.ts +7 -0
- package/dist/report/recovery-source.js +7 -0
- package/dist/report/recovery-source.js.map +1 -0
- package/dist/report/reviewer-artifact.d.ts +118 -0
- package/dist/report/reviewer-artifact.js +381 -0
- package/dist/report/reviewer-artifact.js.map +1 -0
- package/dist/report/reviewer-evidence-schema.d.ts +42 -0
- package/dist/report/reviewer-evidence-schema.js +28 -0
- package/dist/report/reviewer-evidence-schema.js.map +1 -0
- package/dist/report/reviewer-evidence.d.ts +54 -0
- package/dist/report/reviewer-evidence.js +229 -0
- package/dist/report/reviewer-evidence.js.map +1 -0
- package/dist/report/reviewer-health.d.ts +62 -0
- package/dist/report/reviewer-health.js +105 -0
- package/dist/report/reviewer-health.js.map +1 -0
- package/dist/report/run-header.d.ts +219 -0
- package/dist/report/run-header.js +307 -0
- package/dist/report/run-header.js.map +1 -0
- package/dist/report/supplemental-async.d.ts +19 -0
- package/dist/report/supplemental-async.js +85 -0
- package/dist/report/supplemental-async.js.map +1 -0
- package/dist/report/uuid.d.ts +16 -0
- package/dist/report/uuid.js +41 -0
- package/dist/report/uuid.js.map +1 -0
- package/dist/resolver/git.d.ts +16 -0
- package/dist/resolver/git.js +77 -0
- package/dist/resolver/git.js.map +1 -0
- package/dist/resolver/github-client.d.ts +82 -0
- package/dist/resolver/github-client.js +27 -0
- package/dist/resolver/github-client.js.map +1 -0
- package/dist/resolver/github.d.ts +29 -0
- package/dist/resolver/github.js +166 -0
- package/dist/resolver/github.js.map +1 -0
- package/dist/resolver/local.d.ts +3 -0
- package/dist/resolver/local.js +75 -0
- package/dist/resolver/local.js.map +1 -0
- package/dist/resolver/plan.d.ts +8 -0
- package/dist/resolver/plan.js +44 -0
- package/dist/resolver/plan.js.map +1 -0
- package/dist/resolver/target.d.ts +35 -0
- package/dist/resolver/target.js +112 -0
- package/dist/resolver/target.js.map +1 -0
- package/dist/resolver/types.d.ts +43 -0
- package/dist/resolver/types.js +2 -0
- package/dist/resolver/types.js.map +1 -0
- package/dist/roles/builtin.d.ts +4 -0
- package/dist/roles/builtin.js +282 -0
- package/dist/roles/builtin.js.map +1 -0
- package/dist/roles/dispatcher.d.ts +26 -0
- package/dist/roles/dispatcher.js +96 -0
- package/dist/roles/dispatcher.js.map +1 -0
- package/dist/roles/legacy-4.1.10.d.ts +2 -0
- package/dist/roles/legacy-4.1.10.js +320 -0
- package/dist/roles/legacy-4.1.10.js.map +1 -0
- package/dist/roles/legacy-4.4.9.d.ts +4 -0
- package/dist/roles/legacy-4.4.9.js +282 -0
- package/dist/roles/legacy-4.4.9.js.map +1 -0
- package/dist/roles/loader.d.ts +10 -0
- package/dist/roles/loader.js +104 -0
- package/dist/roles/loader.js.map +1 -0
- package/dist/roles/types.d.ts +13 -0
- package/dist/roles/types.js +2 -0
- package/dist/roles/types.js.map +1 -0
- package/dist/telemetry/abort-signal.d.ts +13 -0
- package/dist/telemetry/abort-signal.js +40 -0
- package/dist/telemetry/abort-signal.js.map +1 -0
- package/dist/telemetry/attest.d.ts +98 -0
- package/dist/telemetry/attest.js +331 -0
- package/dist/telemetry/attest.js.map +1 -0
- package/dist/telemetry/attested-retry.d.ts +79 -0
- package/dist/telemetry/attested-retry.js +195 -0
- package/dist/telemetry/attested-retry.js.map +1 -0
- package/dist/telemetry/attested-reviewer-delivery.d.ts +58 -0
- package/dist/telemetry/attested-reviewer-delivery.js +238 -0
- package/dist/telemetry/attested-reviewer-delivery.js.map +1 -0
- package/dist/telemetry/backfill.d.ts +95 -0
- package/dist/telemetry/backfill.js +460 -0
- package/dist/telemetry/backfill.js.map +1 -0
- package/dist/telemetry/credentials.d.ts +44 -0
- package/dist/telemetry/credentials.js +87 -0
- package/dist/telemetry/credentials.js.map +1 -0
- package/dist/telemetry/deliver.d.ts +152 -0
- package/dist/telemetry/deliver.js +662 -0
- package/dist/telemetry/deliver.js.map +1 -0
- package/dist/telemetry/envelope-validation.d.ts +13 -0
- package/dist/telemetry/envelope-validation.js +196 -0
- package/dist/telemetry/envelope-validation.js.map +1 -0
- package/dist/telemetry/envelope.d.ts +159 -0
- package/dist/telemetry/envelope.js +288 -0
- package/dist/telemetry/envelope.js.map +1 -0
- package/dist/telemetry/events.d.ts +68 -0
- package/dist/telemetry/events.js +79 -0
- package/dist/telemetry/events.js.map +1 -0
- package/dist/telemetry/notice.d.ts +15 -0
- package/dist/telemetry/notice.js +67 -0
- package/dist/telemetry/notice.js.map +1 -0
- package/dist/telemetry/outbox.d.ts +166 -0
- package/dist/telemetry/outbox.js +741 -0
- package/dist/telemetry/outbox.js.map +1 -0
- package/dist/telemetry/quarantine.d.ts +105 -0
- package/dist/telemetry/quarantine.js +224 -0
- package/dist/telemetry/quarantine.js.map +1 -0
- package/dist/telemetry/read-sink.d.ts +31 -0
- package/dist/telemetry/read-sink.js +25 -0
- package/dist/telemetry/read-sink.js.map +1 -0
- package/dist/telemetry/recovery/command.d.ts +16 -0
- package/dist/telemetry/recovery/command.js +70 -0
- package/dist/telemetry/recovery/command.js.map +1 -0
- package/dist/telemetry/recovery/discovery.d.ts +8 -0
- package/dist/telemetry/recovery/discovery.js +277 -0
- package/dist/telemetry/recovery/discovery.js.map +1 -0
- package/dist/telemetry/recovery/files.d.ts +20 -0
- package/dist/telemetry/recovery/files.js +123 -0
- package/dist/telemetry/recovery/files.js.map +1 -0
- package/dist/telemetry/recovery/plan.d.ts +10 -0
- package/dist/telemetry/recovery/plan.js +325 -0
- package/dist/telemetry/recovery/plan.js.map +1 -0
- package/dist/telemetry/recovery/source.d.ts +328 -0
- package/dist/telemetry/recovery/source.js +253 -0
- package/dist/telemetry/recovery/source.js.map +1 -0
- package/dist/telemetry/recovery/types.d.ts +100 -0
- package/dist/telemetry/recovery/types.js +2 -0
- package/dist/telemetry/recovery/types.js.map +1 -0
- package/dist/telemetry/recovery-request-budget.d.ts +39 -0
- package/dist/telemetry/recovery-request-budget.js +102 -0
- package/dist/telemetry/recovery-request-budget.js.map +1 -0
- package/dist/telemetry/report-consistency.d.ts +11 -0
- package/dist/telemetry/report-consistency.js +111 -0
- package/dist/telemetry/report-consistency.js.map +1 -0
- package/dist/telemetry/reviewer-delivery.d.ts +39 -0
- package/dist/telemetry/reviewer-delivery.js +279 -0
- package/dist/telemetry/reviewer-delivery.js.map +1 -0
- package/dist/telemetry/reviewer-preflight.d.ts +13 -0
- package/dist/telemetry/reviewer-preflight.js +56 -0
- package/dist/telemetry/reviewer-preflight.js.map +1 -0
- package/dist/telemetry/scrub.d.ts +53 -0
- package/dist/telemetry/scrub.js +205 -0
- package/dist/telemetry/scrub.js.map +1 -0
- package/dist/telemetry/sink.d.ts +212 -0
- package/dist/telemetry/sink.js +813 -0
- package/dist/telemetry/sink.js.map +1 -0
- package/dist/telemetry/terminal-reviewer-delivery.d.ts +18 -0
- package/dist/telemetry/terminal-reviewer-delivery.js +27 -0
- package/dist/telemetry/terminal-reviewer-delivery.js.map +1 -0
- package/dist/telemetry/transient-input.d.ts +2 -0
- package/dist/telemetry/transient-input.js +37 -0
- package/dist/telemetry/transient-input.js.map +1 -0
- package/dist/telemetry/verification.d.ts +9 -0
- package/dist/telemetry/verification.js +12 -0
- package/dist/telemetry/verification.js.map +1 -0
- package/package.json +73 -0
package/dist/discuss.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
import { detectProvider } from './roles/dispatcher.js';
|
|
3
|
+
import { defaultAdapterFactory } from './dispatch/runner.js';
|
|
4
|
+
/**
|
|
5
|
+
* Resolve `--finding <id>` against kept findings first, then the
|
|
6
|
+
* below-threshold appendix (appendix findings are prime discussion
|
|
7
|
+
* targets — one model saw something nobody confirmed). Model-generated ids
|
|
8
|
+
* can collide across reviewers, so `<id>:<n>` picks the nth match (1-based).
|
|
9
|
+
*/
|
|
10
|
+
export function resolveFinding(result, findingRef) {
|
|
11
|
+
const all = [...result.findings, ...(result.belowThresholdFindings ?? [])];
|
|
12
|
+
const nthMatch = findingRef.match(/^(.+):(\d+)$/);
|
|
13
|
+
const id = nthMatch ? nthMatch[1] : findingRef;
|
|
14
|
+
const matches = all.filter((f) => f.id === id);
|
|
15
|
+
if (matches.length === 0) {
|
|
16
|
+
const available = all
|
|
17
|
+
.slice(0, 30)
|
|
18
|
+
.map((f) => ` ${f.id} ${f.file}:${f.startLine} ${f.title.slice(0, 70)}`)
|
|
19
|
+
.join('\n');
|
|
20
|
+
throw new Error(`No finding with id "${id}" in the report. Available (first 30):\n${available}`);
|
|
21
|
+
}
|
|
22
|
+
if (matches.length === 1)
|
|
23
|
+
return matches[0];
|
|
24
|
+
if (nthMatch) {
|
|
25
|
+
const n = parseInt(nthMatch[2], 10);
|
|
26
|
+
const picked = matches[n - 1];
|
|
27
|
+
if (!picked) {
|
|
28
|
+
throw new Error(`Finding id "${id}" has ${matches.length} matches; :${n} is out of range.`);
|
|
29
|
+
}
|
|
30
|
+
return picked;
|
|
31
|
+
}
|
|
32
|
+
const candidates = matches
|
|
33
|
+
.map((f, i) => ` ${id}:${i + 1} ${f.file}:${f.startLine} ${f.title.slice(0, 70)}`)
|
|
34
|
+
.join('\n');
|
|
35
|
+
throw new Error(`Finding id "${id}" is ambiguous (${matches.length} matches). Pick one with:\n${candidates}`);
|
|
36
|
+
}
|
|
37
|
+
export function buildDiscussPrompts(input) {
|
|
38
|
+
const { finding, question, contextDocs } = input;
|
|
39
|
+
const c = finding.consensus;
|
|
40
|
+
const systemPrompt = `You are a reviewer on a multi-model code review council, discussing one of the council's findings with the engineer who must decide whether to act on it. Answer the question directly and concretely, grounded in the finding's context. If the question or context shows the finding is wrong, overstated, or unexploitable, say so plainly — changing your mind under new information is good reviewing, not weakness. If you lack the code context to be sure, say exactly what you would need to see. Keep the answer under 300 words.`;
|
|
41
|
+
const lines = [
|
|
42
|
+
'## Finding under discussion',
|
|
43
|
+
'',
|
|
44
|
+
`- File: ${finding.file} (lines ${finding.startLine}–${finding.endLine})`,
|
|
45
|
+
`- Severity: ${finding.severity} · Category: ${finding.category}`,
|
|
46
|
+
`- Council agreement: ${c.disputed ? 'DISPUTED' : c.tier} — flagged by ${c.models.join(', ')} (roles: ${c.roles.join(', ')}) · confidence ${c.confidenceLabel}`,
|
|
47
|
+
`- Title: ${finding.title}`,
|
|
48
|
+
'',
|
|
49
|
+
finding.description,
|
|
50
|
+
];
|
|
51
|
+
if (finding.suggestedFix) {
|
|
52
|
+
lines.push('', '### Suggested fix on record', finding.suggestedFix);
|
|
53
|
+
}
|
|
54
|
+
if (c.disputed && c.disputeDetails) {
|
|
55
|
+
lines.push('', `### Dispute`, c.disputeDetails);
|
|
56
|
+
}
|
|
57
|
+
if (c.positions?.length) {
|
|
58
|
+
lines.push('', '### Positions taken by council members');
|
|
59
|
+
for (const p of c.positions) {
|
|
60
|
+
lines.push(`- ${p.model} (${p.role}) rated ${p.severity}: ${p.title} — ${p.excerpt}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (contextDocs?.length) {
|
|
64
|
+
for (const doc of contextDocs) {
|
|
65
|
+
lines.push('', `### Context: ${doc.label}`, '```', doc.content, '```');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
lines.push('', '## Question', question);
|
|
69
|
+
return { systemPrompt, userPrompt: lines.join('\n') };
|
|
70
|
+
}
|
|
71
|
+
/** Ask every target model the same question in parallel. */
|
|
72
|
+
export async function runDiscussion(models, prompts, options) {
|
|
73
|
+
const factory = options.adapterFactory ??
|
|
74
|
+
((provider) => defaultAdapterFactory(provider, options.reasoningEffort));
|
|
75
|
+
return Promise.all(models.map(async (model) => {
|
|
76
|
+
try {
|
|
77
|
+
const adapter = factory(detectProvider(model));
|
|
78
|
+
return await adapter.ask(model, prompts.systemPrompt, prompts.userPrompt, options);
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
// A missing API key for one provider must not sink the other answers.
|
|
82
|
+
return {
|
|
83
|
+
model,
|
|
84
|
+
provider: detectProvider(model),
|
|
85
|
+
text: '',
|
|
86
|
+
durationMs: 0,
|
|
87
|
+
status: 'error',
|
|
88
|
+
error: err instanceof Error ? err.message : String(err),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
const MAX_CONTEXT_BYTES = 200_000;
|
|
94
|
+
export async function loadContextDocs(paths) {
|
|
95
|
+
const docs = [];
|
|
96
|
+
for (const path of paths) {
|
|
97
|
+
try {
|
|
98
|
+
const content = await readFile(path, 'utf-8');
|
|
99
|
+
docs.push({
|
|
100
|
+
label: path,
|
|
101
|
+
content: Buffer.byteLength(content, 'utf-8') > MAX_CONTEXT_BYTES
|
|
102
|
+
? `${content.slice(0, MAX_CONTEXT_BYTES)}\n[truncated]`
|
|
103
|
+
: content,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
console.warn(`Warning: could not read context file: ${path}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return docs;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=discuss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discuss.js","sourceRoot":"","sources":["../src/discuss.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { VerificationReasoningEffort } from '../config/schema.js';
|
|
2
|
+
import type { ModelReview } from '../consensus/types.js';
|
|
3
|
+
export interface AdapterOptions {
|
|
4
|
+
/** Explicit OpenAI ask effort; omitted calls retain their provider default. */
|
|
5
|
+
reasoningEffort?: VerificationReasoningEffort;
|
|
6
|
+
timeoutMs: number;
|
|
7
|
+
maxRetries: number;
|
|
8
|
+
/**
|
|
9
|
+
* External cancellation (quorum round closure). Adapters must abort the
|
|
10
|
+
* in-flight request when it fires so canceled calls stop consuming
|
|
11
|
+
* provider time and the process can exit.
|
|
12
|
+
*/
|
|
13
|
+
signal?: AbortSignal;
|
|
14
|
+
}
|
|
15
|
+
/** A free-text answer from one model (discuss path — no findings schema). */
|
|
16
|
+
export interface ModelAnswer {
|
|
17
|
+
/** Observed SDK invocations, including ambiguous failures; not wire requests or billing. */
|
|
18
|
+
adapterAttempts?: number;
|
|
19
|
+
model: string;
|
|
20
|
+
provider: string;
|
|
21
|
+
text: string;
|
|
22
|
+
durationMs: number;
|
|
23
|
+
status: 'success' | 'timeout' | 'error';
|
|
24
|
+
error?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface ReviewAdapter {
|
|
27
|
+
name: string;
|
|
28
|
+
provider: string;
|
|
29
|
+
review(model: string, role: string, systemPrompt: string, userPrompt: string, options: AdapterOptions): Promise<ModelReview>;
|
|
30
|
+
/** One-shot free-text question — used by `rcl discuss`. */
|
|
31
|
+
ask(model: string, systemPrompt: string, userPrompt: string, options: AdapterOptions): Promise<ModelAnswer>;
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/dispatch/adapter.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ModelReview } from '../consensus/types.js';
|
|
2
|
+
import type { ReviewAdapter, AdapterOptions, ModelAnswer } from './adapter.js';
|
|
3
|
+
export declare class AnthropicAdapter implements ReviewAdapter {
|
|
4
|
+
name: string;
|
|
5
|
+
provider: string;
|
|
6
|
+
private client;
|
|
7
|
+
constructor(apiKey?: string);
|
|
8
|
+
review(model: string, role: string, systemPrompt: string, userPrompt: string, options: AdapterOptions): Promise<ModelReview>;
|
|
9
|
+
ask(model: string, systemPrompt: string, userPrompt: string, options: AdapterOptions): Promise<ModelAnswer>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
import { parseReviewOutput } from '../consensus/parser.js';
|
|
3
|
+
import { stripKnownProviderPrefix, isRetryableStatus, attemptWithRetries, isRetryableConnectionError, failedReview, isBlankOutput, reviewFromParse, usageFromAnthropic, ASK_MAX_OUTPUT_TOKENS, TruncatedAnswerError, } from './utils.js';
|
|
4
|
+
function isRetryable(err) {
|
|
5
|
+
if (err instanceof Anthropic.APIConnectionError)
|
|
6
|
+
return isRetryableConnectionError(err, true);
|
|
7
|
+
return err instanceof Anthropic.APIError && isRetryableStatus(err.status);
|
|
8
|
+
}
|
|
9
|
+
function isRetryableReview(err, stream) {
|
|
10
|
+
if (err instanceof Anthropic.APIConnectionError || err instanceof Anthropic.APIUserAbortError)
|
|
11
|
+
return isRetryable(err);
|
|
12
|
+
if (isRetryable(err))
|
|
13
|
+
return true;
|
|
14
|
+
if (!stream)
|
|
15
|
+
return false;
|
|
16
|
+
// The SDK can reject finalMessage() without an HTTP status when a stream
|
|
17
|
+
// disconnects, receives a transient SSE error, or ends before message_stop.
|
|
18
|
+
// An abort, invalid request, or malformed response stays terminal.
|
|
19
|
+
if (err instanceof Anthropic.APIError && err.status === undefined &&
|
|
20
|
+
(err.type === 'overloaded_error' || err.type === 'api_error' ||
|
|
21
|
+
err.type === 'rate_limit_error' || err.type === 'timeout_error'))
|
|
22
|
+
return true;
|
|
23
|
+
return err instanceof Anthropic.AnthropicError &&
|
|
24
|
+
(err.message === 'stream ended without producing a Message with role=assistant' ||
|
|
25
|
+
err.message === 'request ended without sending any chunks');
|
|
26
|
+
}
|
|
27
|
+
const DEFAULT_PROFILE = { maxTokens: 16384, stream: false };
|
|
28
|
+
// Always-on thinking counts against max_tokens, so high effort needs headroom
|
|
29
|
+
// for thinking plus findings. Keep streaming and the existing whole-call
|
|
30
|
+
// deadline from RCL-103. Opus 5.5 defaults to medium effort; a review is
|
|
31
|
+
// intelligence-sensitive work, so request high explicitly.
|
|
32
|
+
const THINKING_REVIEW_PROFILE = { maxTokens: 65536, effort: 'high', stream: true };
|
|
33
|
+
// Claude 4.6+ uses dateless pinned API IDs; these profiles apply to the
|
|
34
|
+
// documented IDs only, without guessing future model capabilities.
|
|
35
|
+
// https://platform.claude.com/docs/en/about-claude/models/model-ids-and-versions
|
|
36
|
+
const MODEL_PROFILES = {
|
|
37
|
+
'claude-opus-5-5': THINKING_REVIEW_PROFILE,
|
|
38
|
+
'claude-fable-5-1': THINKING_REVIEW_PROFILE,
|
|
39
|
+
};
|
|
40
|
+
function profileFor(modelId) {
|
|
41
|
+
return MODEL_PROFILES[modelId] ?? DEFAULT_PROFILE;
|
|
42
|
+
}
|
|
43
|
+
export class AnthropicAdapter {
|
|
44
|
+
name = 'anthropic';
|
|
45
|
+
provider = 'anthropic';
|
|
46
|
+
client;
|
|
47
|
+
constructor(apiKey) {
|
|
48
|
+
this.client = new Anthropic({
|
|
49
|
+
apiKey: apiKey ?? process.env['ANTHROPIC_API_KEY'],
|
|
50
|
+
// The adapter's retry loop owns all retries; SDK-internal retries
|
|
51
|
+
// would multiply wire attempts inside one timeout budget.
|
|
52
|
+
maxRetries: 0,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
async review(model, role, systemPrompt, userPrompt, options) {
|
|
56
|
+
const start = Date.now();
|
|
57
|
+
let adapterAttempts = 0;
|
|
58
|
+
const modelId = stripKnownProviderPrefix(model);
|
|
59
|
+
// Opus 5.5 and Fable 5.1 count adaptive thinking against max_tokens. Large
|
|
60
|
+
// review chunks exhausted the old ceiling before any findings arrived.
|
|
61
|
+
const profile = profileFor(modelId);
|
|
62
|
+
const outcome = await attemptWithRetries({
|
|
63
|
+
timeoutMs: options.timeoutMs,
|
|
64
|
+
maxRetries: options.maxRetries ?? 3,
|
|
65
|
+
signal: options.signal,
|
|
66
|
+
isRetryable: (err) => isRetryableReview(err, profile.stream),
|
|
67
|
+
attempt: async (signal) => {
|
|
68
|
+
// Use tool use for reliable JSON extraction
|
|
69
|
+
const request = {
|
|
70
|
+
model: modelId,
|
|
71
|
+
max_tokens: profile.maxTokens,
|
|
72
|
+
...(profile.effort ? { output_config: { effort: profile.effort } } : {}),
|
|
73
|
+
system: systemPrompt,
|
|
74
|
+
messages: [{ role: 'user', content: userPrompt }],
|
|
75
|
+
tools: [
|
|
76
|
+
{
|
|
77
|
+
name: 'report_findings',
|
|
78
|
+
description: 'Report code review findings as structured JSON',
|
|
79
|
+
input_schema: {
|
|
80
|
+
type: 'object',
|
|
81
|
+
properties: {
|
|
82
|
+
findings: {
|
|
83
|
+
type: 'array',
|
|
84
|
+
items: {
|
|
85
|
+
type: 'object',
|
|
86
|
+
properties: {
|
|
87
|
+
id: { type: 'string' },
|
|
88
|
+
file: { type: 'string' },
|
|
89
|
+
startLine: { type: 'number' },
|
|
90
|
+
endLine: { type: 'number' },
|
|
91
|
+
severity: {
|
|
92
|
+
type: 'string',
|
|
93
|
+
enum: ['critical', 'important', 'minor', 'nitpick'],
|
|
94
|
+
},
|
|
95
|
+
category: {
|
|
96
|
+
type: 'string',
|
|
97
|
+
enum: ['security', 'correctness', 'best-practices', 'tests', 'api-design'],
|
|
98
|
+
},
|
|
99
|
+
title: { type: 'string' },
|
|
100
|
+
description: { type: 'string' },
|
|
101
|
+
suggestedFix: { type: 'string' },
|
|
102
|
+
},
|
|
103
|
+
required: ['id', 'file', 'startLine', 'endLine', 'severity', 'category', 'title', 'description'],
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
required: ['findings'],
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
tool_choice: { type: 'auto' },
|
|
112
|
+
};
|
|
113
|
+
// The larger thinking-model output budget requires the SDK's streaming path.
|
|
114
|
+
// finalMessage() keeps the same complete-response parsing and
|
|
115
|
+
// truncation checks used by the nonstreaming path.
|
|
116
|
+
const requestOptions = {
|
|
117
|
+
signal: signal,
|
|
118
|
+
timeout: options.timeoutMs + 30_000,
|
|
119
|
+
};
|
|
120
|
+
adapterAttempts++;
|
|
121
|
+
const response = profile.stream
|
|
122
|
+
? await this.client.messages.stream(request, requestOptions).finalMessage()
|
|
123
|
+
: await this.client.messages.create(request, requestOptions);
|
|
124
|
+
const usage = usageFromAnthropic(response.usage);
|
|
125
|
+
if (response.stop_reason === 'max_tokens') {
|
|
126
|
+
return failedReview({
|
|
127
|
+
model,
|
|
128
|
+
role,
|
|
129
|
+
provider: 'anthropic',
|
|
130
|
+
startedAt: start,
|
|
131
|
+
usage,
|
|
132
|
+
error: 'Response truncated at max_tokens; findings would be incomplete',
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
// Safety classifiers decline in-band: HTTP 200, no content. Left
|
|
136
|
+
// unhandled this reads as a clean review of code nobody looked at.
|
|
137
|
+
if (response.stop_reason === 'refusal') {
|
|
138
|
+
const details = response.stop_details;
|
|
139
|
+
const category = details !== null && details !== undefined && 'category' in details
|
|
140
|
+
? details.category
|
|
141
|
+
: null;
|
|
142
|
+
return failedReview({
|
|
143
|
+
model,
|
|
144
|
+
role,
|
|
145
|
+
provider: 'anthropic',
|
|
146
|
+
startedAt: start,
|
|
147
|
+
usage,
|
|
148
|
+
error: `Model refused this review${category ? ` (${category})` : ''} — the diff was not reviewed`,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Extract from tool use
|
|
152
|
+
let rawOutput = '';
|
|
153
|
+
for (const block of response.content) {
|
|
154
|
+
if (block.type === 'tool_use' && block.name === 'report_findings') {
|
|
155
|
+
rawOutput = JSON.stringify(block.input);
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
if (block.type === 'text') {
|
|
159
|
+
rawOutput += block.text;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (isBlankOutput(rawOutput)) {
|
|
163
|
+
return failedReview({
|
|
164
|
+
model,
|
|
165
|
+
role,
|
|
166
|
+
provider: 'anthropic',
|
|
167
|
+
startedAt: start,
|
|
168
|
+
usage,
|
|
169
|
+
error: 'Model returned an empty response; the diff was not reviewed',
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
// If tool wasn't used, parse text output
|
|
173
|
+
const parsed = parseReviewOutput(rawOutput, model, role);
|
|
174
|
+
for (const w of parsed.warnings)
|
|
175
|
+
console.warn(w);
|
|
176
|
+
return reviewFromParse({
|
|
177
|
+
model,
|
|
178
|
+
role,
|
|
179
|
+
provider: 'anthropic',
|
|
180
|
+
startedAt: start,
|
|
181
|
+
parsed,
|
|
182
|
+
usage,
|
|
183
|
+
});
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
return outcome.ok
|
|
187
|
+
? { ...outcome.value, adapterAttempts }
|
|
188
|
+
: { ...failedReview({ model, role, provider: 'anthropic', startedAt: start,
|
|
189
|
+
status: outcome.timedOut ? 'timeout' : 'error', error: outcome.error }), adapterAttempts };
|
|
190
|
+
}
|
|
191
|
+
async ask(model, systemPrompt, userPrompt, options) {
|
|
192
|
+
const start = Date.now();
|
|
193
|
+
const modelId = stripKnownProviderPrefix(model);
|
|
194
|
+
let adapterAttempts = 0;
|
|
195
|
+
const outcome = await attemptWithRetries({
|
|
196
|
+
timeoutMs: options.timeoutMs,
|
|
197
|
+
maxRetries: options.maxRetries ?? 3,
|
|
198
|
+
signal: options.signal,
|
|
199
|
+
isRetryable,
|
|
200
|
+
attempt: async (signal) => {
|
|
201
|
+
adapterAttempts++;
|
|
202
|
+
const response = await this.client.messages.create({
|
|
203
|
+
model: modelId,
|
|
204
|
+
max_tokens: ASK_MAX_OUTPUT_TOKENS,
|
|
205
|
+
system: systemPrompt,
|
|
206
|
+
messages: [{ role: 'user', content: userPrompt }],
|
|
207
|
+
}, { signal, timeout: options.timeoutMs + 30_000 });
|
|
208
|
+
// An answer cut off at the ceiling is not a short answer: the verifier
|
|
209
|
+
// emits one entry per finding, and a partial list parses to nothing,
|
|
210
|
+
// which gates every candidate it never reached (RCL-60).
|
|
211
|
+
if (response.stop_reason === 'max_tokens') {
|
|
212
|
+
throw new TruncatedAnswerError('anthropic');
|
|
213
|
+
}
|
|
214
|
+
return response.content
|
|
215
|
+
.filter((block) => block.type === 'text')
|
|
216
|
+
.map((block) => block.text)
|
|
217
|
+
.join('\n')
|
|
218
|
+
.trim();
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
const durationMs = Date.now() - start;
|
|
222
|
+
return outcome.ok
|
|
223
|
+
? { model, provider: 'anthropic', text: outcome.value, durationMs, adapterAttempts, status: 'success' }
|
|
224
|
+
: {
|
|
225
|
+
model,
|
|
226
|
+
provider: 'anthropic',
|
|
227
|
+
text: '',
|
|
228
|
+
durationMs,
|
|
229
|
+
adapterAttempts,
|
|
230
|
+
status: outcome.timedOut ? 'timeout' : 'error',
|
|
231
|
+
error: outcome.error,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/dispatch/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { AmbiguousReviewerIdentityError, type ReviewerIdentity } from './reviewer-identity.js';
|
|
2
|
+
import type { ModelReview } from '../consensus/types.js';
|
|
3
|
+
import type { ReviewAdapter } from './adapter.js';
|
|
4
|
+
import type { ReasoningEffort } from '../config/schema.js';
|
|
5
|
+
/**
|
|
6
|
+
* Async review lane (RCL-25). Async models are fired with the round but never
|
|
7
|
+
* awaited: the main process writes a spool file per call and launches a
|
|
8
|
+
* detached worker (`rcl async-worker`) that runs the call and drops the
|
|
9
|
+
* completed ModelReview into the store. The NEXT review of the same target
|
|
10
|
+
* collects whatever has arrived and merges it into its dedup, marked async.
|
|
11
|
+
*
|
|
12
|
+
* The store lives in the repository's git common dir (durable across rounds,
|
|
13
|
+
* repo-scoped, not world-writable), falling back to a per-user tmp dir when
|
|
14
|
+
* reviewing outside a repository.
|
|
15
|
+
*/
|
|
16
|
+
export interface AsyncCallSpec {
|
|
17
|
+
model: string;
|
|
18
|
+
role: string;
|
|
19
|
+
provider: string;
|
|
20
|
+
systemPrompt: string;
|
|
21
|
+
userPrompt: string;
|
|
22
|
+
}
|
|
23
|
+
export interface AsyncLaneOptions {
|
|
24
|
+
storeDir: string;
|
|
25
|
+
targetKey: string;
|
|
26
|
+
timeoutMs: number;
|
|
27
|
+
maxRetries: number;
|
|
28
|
+
reasoningEffort?: ReasoningEffort;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Detached workers are one Node process each; a huge chunked diff must not
|
|
32
|
+
* fan out into an unbounded process swarm. Beyond this, extra async calls
|
|
33
|
+
* are dropped (the lane is a bonus, never load-bearing).
|
|
34
|
+
*/
|
|
35
|
+
export declare const MAX_ASYNC_CALLS_PER_ROUND = 8;
|
|
36
|
+
/** Split assignments so async models never sit on the blocking path. */
|
|
37
|
+
export declare function partitionAsyncAssignments<A extends {
|
|
38
|
+
model: string;
|
|
39
|
+
}>(assignments: A[], asyncModels: readonly string[]): {
|
|
40
|
+
blocking: A[];
|
|
41
|
+
async: A[];
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Stable, filesystem-safe key for a review target, so consecutive rounds of
|
|
45
|
+
* the same converge run find each other's async results and different targets
|
|
46
|
+
* never collide. Same alphabet rule as the converge attempt store.
|
|
47
|
+
* For a converging patch, pass the validated convergence target instead of
|
|
48
|
+
* identifying the loop by its per-round capture path. Prefix the complete
|
|
49
|
+
* key to keep this namespace separate without changing legacy target keys.
|
|
50
|
+
*/
|
|
51
|
+
export declare function asyncTargetKey(target: string, convergeTarget?: string, cycleId?: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* Store directory: `<gitCommonDir>/rcl-async` inside a repository, else a
|
|
54
|
+
* per-user directory under the OS tmpdir (mode 0700 either way).
|
|
55
|
+
*
|
|
56
|
+
* The directory is verified before use — spools contain the diff, and a
|
|
57
|
+
* forged result file would inject findings into the next round. A tmpdir
|
|
58
|
+
* path in particular is predictable, so a pre-created symlink or another
|
|
59
|
+
* user's directory must be rejected, never chmod'd or written into.
|
|
60
|
+
*/
|
|
61
|
+
export declare function resolveAsyncStoreDir(cwd?: string): Promise<string>;
|
|
62
|
+
/** Resolve an existing async store without creating or changing it. */
|
|
63
|
+
export declare function resolveExistingAsyncStoreDir(cwd?: string): Promise<string>;
|
|
64
|
+
/**
|
|
65
|
+
* Current branch name for git-mode target labels, so `--staged` /
|
|
66
|
+
* `--working-tree` reviews on different branches of one repository never
|
|
67
|
+
* exchange async results. Best-effort: '' outside a repo or on detached
|
|
68
|
+
* HEAD (the store is repo-scoped, so the label only needs to split
|
|
69
|
+
* branches).
|
|
70
|
+
*/
|
|
71
|
+
export declare function currentBranchLabel(cwd?: string): Promise<string>;
|
|
72
|
+
/** Write one spool file per async call; returns the spool paths. */
|
|
73
|
+
export declare function spoolAsyncCalls(calls: AsyncCallSpec[], options: AsyncLaneOptions): Promise<string[]>;
|
|
74
|
+
/**
|
|
75
|
+
* Environment for a detached worker: provider credentials/config, proxy and
|
|
76
|
+
* locale basics — nothing else. The worker only ever talks to its model
|
|
77
|
+
* provider, so unrelated secrets in the parent env (GITHUB_TOKEN, cloud
|
|
78
|
+
* credentials, …) have no business outliving the review in a background
|
|
79
|
+
* process.
|
|
80
|
+
*/
|
|
81
|
+
export declare function workerEnv(env?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
82
|
+
/**
|
|
83
|
+
* Launch one detached worker process per spool. Fire-and-forget by design:
|
|
84
|
+
* the parent exits when the blocking council is done, and the workers keep
|
|
85
|
+
* running until their call completes or times out. Launch failures are
|
|
86
|
+
* contained: an unhandled child 'error' event would crash the review
|
|
87
|
+
* process that is doing the real work.
|
|
88
|
+
*/
|
|
89
|
+
export declare function launchAsyncWorkers(spoolPaths: string[], cliScript?: string): void;
|
|
90
|
+
/**
|
|
91
|
+
* Worker body: consume one spool file, run the call, publish the completed
|
|
92
|
+
* review atomically (tmp + rename, so collect never reads a half-written
|
|
93
|
+
* file). A failed call still publishes — an async reviewer that silently
|
|
94
|
+
* vanishes would be invisible in every report.
|
|
95
|
+
*/
|
|
96
|
+
export declare function runAsyncWorker(spoolFile: string, adapterFactory?: (provider: string) => ReviewAdapter): Promise<void>;
|
|
97
|
+
/** Publish a derived opportunistic opinion; this store is never physical-call authority. */
|
|
98
|
+
export declare function publishAsyncReview(storeDir: string, targetKey: string, review: ModelReview): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* Exact bytes observed before a refusal. The original file remains untouched,
|
|
101
|
+
* while the private refusal artifact can still recover it after normal store
|
|
102
|
+
* cleanup removes the source path.
|
|
103
|
+
*/
|
|
104
|
+
export interface AsyncResultReference {
|
|
105
|
+
path: string;
|
|
106
|
+
sha256: string;
|
|
107
|
+
bytesBase64: string;
|
|
108
|
+
}
|
|
109
|
+
/** Immutable read-only snapshot for a target-locked interrupted-launch resume. */
|
|
110
|
+
export declare function snapshotAsyncResults(storeDir: string, targetKey: string, blockingReviews?: readonly ReviewerIdentity[], expectedSha256?: readonly string[]): Promise<{
|
|
111
|
+
reviews: ModelReview[];
|
|
112
|
+
reviewBytes: string[];
|
|
113
|
+
artifacts: AsyncResultReference[];
|
|
114
|
+
}>;
|
|
115
|
+
/** Consume only the exact reviewed async artifacts after terminal recovery. */
|
|
116
|
+
export declare function consumeBoundAsyncResults(storeDir: string, targetKey: string, expectedSha256: readonly string[], options?: {
|
|
117
|
+
allowAlreadyConsumed?: boolean;
|
|
118
|
+
}): Promise<void>;
|
|
119
|
+
/**
|
|
120
|
+
* Collect (and consume) every arrived async result for this target. Corrupt
|
|
121
|
+
* files are skipped and removed; other targets' files are left alone except
|
|
122
|
+
* for a TTL sweep of stale leftovers.
|
|
123
|
+
*/
|
|
124
|
+
export declare function collectAsyncResults(storeDir: string, targetKey: string, options?: {
|
|
125
|
+
blockingReviews?: readonly ReviewerIdentity[];
|
|
126
|
+
onIdentityRefused?: (error: AmbiguousReviewerIdentityError, artifacts: AsyncResultReference[]) => Promise<void>;
|
|
127
|
+
}): Promise<ModelReview[]>;
|