@zhixuan92/multi-model-agent-core 4.2.2 → 4.3.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/README.md +1 -1
- package/dist/config/schema.d.ts +1 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +4 -3
- package/dist/config/schema.js.map +1 -1
- package/dist/error-codes.d.ts +1 -0
- package/dist/error-codes.d.ts.map +1 -1
- package/dist/error-codes.js +2 -0
- package/dist/error-codes.js.map +1 -1
- package/dist/events/telemetry-types.d.ts +24 -20
- package/dist/events/telemetry-types.d.ts.map +1 -1
- package/dist/identity/auth-token-store.d.ts +36 -0
- package/dist/identity/auth-token-store.d.ts.map +1 -1
- package/dist/identity/auth-token-store.js +71 -2
- package/dist/identity/auth-token-store.js.map +1 -1
- package/dist/identity/cwd-validator.d.ts.map +1 -1
- package/dist/identity/cwd-validator.js +15 -3
- package/dist/identity/cwd-validator.js.map +1 -1
- package/dist/identity/main-model-resolver.d.ts +14 -0
- package/dist/identity/main-model-resolver.d.ts.map +1 -0
- package/dist/identity/main-model-resolver.js +83 -0
- package/dist/identity/main-model-resolver.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/intake/brief-compiler-slots/delegate.d.ts +10 -11
- package/dist/intake/brief-compiler-slots/delegate.d.ts.map +1 -1
- package/dist/intake/brief-compiler-slots/delegate.js +12 -14
- package/dist/intake/brief-compiler-slots/delegate.js.map +1 -1
- package/dist/intake/brief-compiler-slots/execute-plan.js +3 -1
- package/dist/intake/brief-compiler-slots/execute-plan.js.map +1 -1
- package/dist/intake/context-overflow-estimator.d.ts +33 -0
- package/dist/intake/context-overflow-estimator.d.ts.map +1 -0
- package/dist/intake/context-overflow-estimator.js +36 -0
- package/dist/intake/context-overflow-estimator.js.map +1 -0
- package/dist/intake/pipeline.d.ts.map +1 -1
- package/dist/intake/pipeline.js +46 -0
- package/dist/intake/pipeline.js.map +1 -1
- package/dist/intake/plan-extractor.d.ts.map +1 -1
- package/dist/intake/plan-extractor.js +10 -1
- package/dist/intake/plan-extractor.js.map +1 -1
- package/dist/intake/types.d.ts +1 -0
- package/dist/intake/types.d.ts.map +1 -1
- package/dist/lifecycle/diff-tracker.d.ts +17 -1
- package/dist/lifecycle/diff-tracker.d.ts.map +1 -1
- package/dist/lifecycle/diff-tracker.js +115 -2
- package/dist/lifecycle/diff-tracker.js.map +1 -1
- package/dist/lifecycle/handlers/annotate-completion-handler.d.ts +9 -0
- package/dist/lifecycle/handlers/annotate-completion-handler.d.ts.map +1 -0
- package/dist/lifecycle/handlers/annotate-completion-handler.js +171 -0
- package/dist/lifecycle/handlers/annotate-completion-handler.js.map +1 -0
- package/dist/lifecycle/handlers/annotate-criteria-handler.d.ts +3 -0
- package/dist/lifecycle/handlers/annotate-criteria-handler.d.ts.map +1 -0
- package/dist/lifecycle/handlers/annotate-criteria-handler.js +67 -0
- package/dist/lifecycle/handlers/annotate-criteria-handler.js.map +1 -0
- package/dist/lifecycle/handlers/baseline-handlers.d.ts.map +1 -1
- package/dist/lifecycle/handlers/baseline-handlers.js +106 -71
- package/dist/lifecycle/handlers/baseline-handlers.js.map +1 -1
- package/dist/lifecycle/handlers/review-handler.d.ts +3 -0
- package/dist/lifecycle/handlers/review-handler.d.ts.map +1 -0
- package/dist/lifecycle/handlers/review-handler.js +141 -0
- package/dist/lifecycle/handlers/review-handler.js.map +1 -0
- package/dist/lifecycle/handlers/rework-handler.d.ts +3 -0
- package/dist/lifecycle/handlers/rework-handler.d.ts.map +1 -0
- package/dist/lifecycle/handlers/rework-handler.js +77 -0
- package/dist/lifecycle/handlers/rework-handler.js.map +1 -0
- package/dist/lifecycle/handlers/terminal-handlers.d.ts.map +1 -1
- package/dist/lifecycle/handlers/terminal-handlers.js +16 -3
- package/dist/lifecycle/handlers/terminal-handlers.js.map +1 -1
- package/dist/lifecycle/lifecycle-context.d.ts +4 -0
- package/dist/lifecycle/lifecycle-context.d.ts.map +1 -1
- package/dist/lifecycle/lifecycle-driver.d.ts.map +1 -1
- package/dist/lifecycle/lifecycle-driver.js +12 -7
- package/dist/lifecycle/lifecycle-driver.js.map +1 -1
- package/dist/lifecycle/parallel-criteria-routes.d.ts +1 -1
- package/dist/lifecycle/parallel-criteria-routes.d.ts.map +1 -1
- package/dist/lifecycle/parallel-criteria-routes.js +21 -1
- package/dist/lifecycle/parallel-criteria-routes.js.map +1 -1
- package/dist/lifecycle/shared-compute.d.ts +9 -0
- package/dist/lifecycle/shared-compute.d.ts.map +1 -1
- package/dist/lifecycle/shared-compute.js +35 -3
- package/dist/lifecycle/shared-compute.js.map +1 -1
- package/dist/lifecycle/stage-plan-builder.d.ts.map +1 -1
- package/dist/lifecycle/stage-plan-builder.js +65 -85
- package/dist/lifecycle/stage-plan-builder.js.map +1 -1
- package/dist/lifecycle/stage-plan-types.d.ts +48 -0
- package/dist/lifecycle/stage-plan-types.d.ts.map +1 -1
- package/dist/lifecycle/stage-progression.d.ts.map +1 -1
- package/dist/lifecycle/stage-progression.js +17 -24
- package/dist/lifecycle/stage-progression.js.map +1 -1
- package/dist/lifecycle/task-runner.d.ts.map +1 -1
- package/dist/lifecycle/task-runner.js +12 -1
- package/dist/lifecycle/task-runner.js.map +1 -1
- package/dist/model-profiles.json +192 -53
- package/dist/providers/anthropic-messages-adapter.d.ts +8 -0
- package/dist/providers/anthropic-messages-adapter.d.ts.map +1 -1
- package/dist/providers/anthropic-messages-adapter.js +16 -1
- package/dist/providers/anthropic-messages-adapter.js.map +1 -1
- package/dist/providers/file-tracker.d.ts +12 -0
- package/dist/providers/file-tracker.d.ts.map +1 -1
- package/dist/providers/file-tracker.js +16 -0
- package/dist/providers/file-tracker.js.map +1 -1
- package/dist/providers/provider-factory.d.ts.map +1 -1
- package/dist/providers/provider-factory.js +27 -2
- package/dist/providers/provider-factory.js.map +1 -1
- package/dist/providers/runner-shell-types.d.ts +14 -0
- package/dist/providers/runner-shell-types.d.ts.map +1 -1
- package/dist/providers/runner-shell.d.ts.map +1 -1
- package/dist/providers/runner-shell.js +38 -6
- package/dist/providers/runner-shell.js.map +1 -1
- package/dist/providers/tool-implementations.d.ts +12 -0
- package/dist/providers/tool-implementations.d.ts.map +1 -1
- package/dist/providers/tool-implementations.js +33 -0
- package/dist/providers/tool-implementations.js.map +1 -1
- package/dist/reporting/annotate-completion-parser.d.ts +39 -0
- package/dist/reporting/annotate-completion-parser.d.ts.map +1 -0
- package/dist/reporting/annotate-completion-parser.js +43 -0
- package/dist/reporting/annotate-completion-parser.js.map +1 -0
- package/dist/reporting/compose-running-headline.d.ts +15 -1
- package/dist/reporting/compose-running-headline.d.ts.map +1 -1
- package/dist/reporting/compose-running-headline.js +76 -1
- package/dist/reporting/compose-running-headline.js.map +1 -1
- package/dist/reporting/report-parser-slots/research-report.d.ts +1 -1
- package/dist/review/default-engines.d.ts.map +1 -1
- package/dist/review/default-engines.js +8 -4
- package/dist/review/default-engines.js.map +1 -1
- package/dist/review/parse-review-report.d.ts +6 -0
- package/dist/review/parse-review-report.d.ts.map +1 -0
- package/dist/review/parse-review-report.js +40 -0
- package/dist/review/parse-review-report.js.map +1 -0
- package/dist/review/reviewer-engine.d.ts +12 -3
- package/dist/review/reviewer-engine.d.ts.map +1 -1
- package/dist/review/reviewer-engine.js +4 -3
- package/dist/review/reviewer-engine.js.map +1 -1
- package/dist/review/templates/annotate-completion.d.ts +12 -0
- package/dist/review/templates/annotate-completion.d.ts.map +1 -0
- package/dist/review/templates/annotate-completion.js +72 -0
- package/dist/review/templates/annotate-completion.js.map +1 -0
- package/dist/review/templates/quality-review.d.ts +3 -0
- package/dist/review/templates/quality-review.d.ts.map +1 -0
- package/dist/review/templates/quality-review.js +40 -0
- package/dist/review/templates/quality-review.js.map +1 -0
- package/dist/review/templates/rework.d.ts +3 -0
- package/dist/review/templates/rework.d.ts.map +1 -0
- package/dist/review/templates/rework.js +42 -0
- package/dist/review/templates/rework.js.map +1 -0
- package/dist/review/templates/shared.d.ts +32 -0
- package/dist/review/templates/shared.d.ts.map +1 -1
- package/dist/review/templates/spec-review.d.ts +1 -16
- package/dist/review/templates/spec-review.d.ts.map +1 -1
- package/dist/review/templates/spec-review.js +23 -31
- package/dist/review/templates/spec-review.js.map +1 -1
- package/dist/stores/context-block-project-cap.d.ts +14 -0
- package/dist/stores/context-block-project-cap.d.ts.map +1 -0
- package/dist/stores/context-block-project-cap.js +68 -0
- package/dist/stores/context-block-project-cap.js.map +1 -0
- package/dist/stores/context-block-tool.d.ts +2 -0
- package/dist/stores/context-block-tool.d.ts.map +1 -1
- package/dist/stores/context-block-tool.js +3 -2
- package/dist/stores/context-block-tool.js.map +1 -1
- package/dist/stores/file-backed-context-block-store.d.ts +8 -1
- package/dist/stores/file-backed-context-block-store.d.ts.map +1 -1
- package/dist/stores/file-backed-context-block-store.js +116 -4
- package/dist/stores/file-backed-context-block-store.js.map +1 -1
- package/dist/tools/audit/plan-audit-criteria.d.ts +35 -0
- package/dist/tools/audit/plan-audit-criteria.d.ts.map +1 -0
- package/dist/tools/audit/plan-audit-criteria.js +136 -0
- package/dist/tools/audit/plan-audit-criteria.js.map +1 -0
- package/dist/tools/audit/plan-audit-verdict.d.ts +15 -0
- package/dist/tools/audit/plan-audit-verdict.d.ts.map +1 -0
- package/dist/tools/audit/plan-audit-verdict.js +44 -0
- package/dist/tools/audit/plan-audit-verdict.js.map +1 -0
- package/dist/tools/audit/schema.d.ts +1 -0
- package/dist/tools/audit/schema.d.ts.map +1 -1
- package/dist/tools/audit/schema.js +6 -3
- package/dist/tools/audit/schema.js.map +1 -1
- package/dist/tools/audit/tool-config.d.ts +3 -0
- package/dist/tools/audit/tool-config.d.ts.map +1 -1
- package/dist/tools/audit/tool-config.js +8 -0
- package/dist/tools/audit/tool-config.js.map +1 -1
- package/dist/tools/delegate/implementer-criteria.d.ts +31 -47
- package/dist/tools/delegate/implementer-criteria.d.ts.map +1 -1
- package/dist/tools/delegate/implementer-criteria.js +60 -88
- package/dist/tools/delegate/implementer-criteria.js.map +1 -1
- package/dist/tools/delegate/tool-config.js +4 -4
- package/dist/tools/delegate/tool-config.js.map +1 -1
- package/dist/tools/execute-plan/implementer-criteria.d.ts +42 -37
- package/dist/tools/execute-plan/implementer-criteria.d.ts.map +1 -1
- package/dist/tools/execute-plan/implementer-criteria.js +79 -79
- package/dist/tools/execute-plan/implementer-criteria.js.map +1 -1
- package/dist/tools/execute-plan/tool-config.d.ts.map +1 -1
- package/dist/tools/execute-plan/tool-config.js +23 -13
- package/dist/tools/execute-plan/tool-config.js.map +1 -1
- package/dist/types/enums.d.ts +2 -2
- package/dist/types/run-result.d.ts +58 -0
- package/dist/types/run-result.d.ts.map +1 -1
- package/dist/types/task-spec.d.ts +14 -0
- package/dist/types/task-spec.d.ts.map +1 -1
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -1
- package/dist/lifecycle/handlers/quality-chain-handlers.d.ts +0 -22
- package/dist/lifecycle/handlers/quality-chain-handlers.d.ts.map +0 -1
- package/dist/lifecycle/handlers/quality-chain-handlers.js +0 -369
- package/dist/lifecycle/handlers/quality-chain-handlers.js.map +0 -1
- package/dist/lifecycle/handlers/review-diff-handler.d.ts +0 -31
- package/dist/lifecycle/handlers/review-diff-handler.d.ts.map +0 -1
- package/dist/lifecycle/handlers/review-diff-handler.js +0 -168
- package/dist/lifecycle/handlers/review-diff-handler.js.map +0 -1
- package/dist/lifecycle/handlers/run-verify-command-handler.d.ts +0 -25
- package/dist/lifecycle/handlers/run-verify-command-handler.d.ts.map +0 -1
- package/dist/lifecycle/handlers/run-verify-command-handler.js +0 -84
- package/dist/lifecycle/handlers/run-verify-command-handler.js.map +0 -1
- package/dist/lifecycle/handlers/spec-chain-handlers.d.ts +0 -21
- package/dist/lifecycle/handlers/spec-chain-handlers.d.ts.map +0 -1
- package/dist/lifecycle/handlers/spec-chain-handlers.js +0 -287
- package/dist/lifecycle/handlers/spec-chain-handlers.js.map +0 -1
- package/dist/review/templates/diff-review.d.ts +0 -11
- package/dist/review/templates/diff-review.d.ts.map +0 -1
- package/dist/review/templates/diff-review.js +0 -39
- package/dist/review/templates/diff-review.js.map +0 -1
- package/dist/review/templates/quality-review-artifact.d.ts +0 -16
- package/dist/review/templates/quality-review-artifact.d.ts.map +0 -1
- package/dist/review/templates/quality-review-artifact.js +0 -46
- package/dist/review/templates/quality-review-artifact.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhixuan92/multi-model-agent-core",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Core library for multi-model-agent: provider runners (Claude, Codex, OpenAI-compatible), routing logic, config schema, and tool/sandbox primitives.",
|
|
@@ -323,6 +323,10 @@
|
|
|
323
323
|
"./tool-surface/openapi-generator": {
|
|
324
324
|
"types": "./dist/tool-surface/openapi-generator.d.ts",
|
|
325
325
|
"import": "./dist/tool-surface/openapi-generator.js"
|
|
326
|
+
},
|
|
327
|
+
"./stores/context-block-project-cap": {
|
|
328
|
+
"types": "./dist/stores/context-block-project-cap.d.ts",
|
|
329
|
+
"import": "./dist/stores/context-block-project-cap.js"
|
|
326
330
|
}
|
|
327
331
|
},
|
|
328
332
|
"scripts": {
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { LifecycleState } from '../stage-plan-types.js';
|
|
2
|
-
export declare const qualityReviewRound1Handler: (state: LifecycleState) => Promise<void>;
|
|
3
|
-
export declare const qualityReviewRound2Handler: (state: LifecycleState) => Promise<void>;
|
|
4
|
-
export declare const qualityReviewRound3Handler: (state: LifecycleState) => Promise<void>;
|
|
5
|
-
export declare const qualityReworkRound1Handler: (state: LifecycleState) => Promise<void>;
|
|
6
|
-
export declare const qualityReworkRound2Handler: (state: LifecycleState) => Promise<void>;
|
|
7
|
-
/**
|
|
8
|
-
* Settle handler. Reads the three round verdicts and writes
|
|
9
|
-
* state.qualityChainPassed.
|
|
10
|
-
*
|
|
11
|
-
* Cascade rule:
|
|
12
|
-
* - 'approved' or 'annotated' in any round ⇒ chain passed (true)
|
|
13
|
-
* - 'skipped' (e.g., no files written) treated as passed (true) — the
|
|
14
|
-
* no-block path when there's nothing to review
|
|
15
|
-
* - 'changes_required' through round 3 ⇒ chain failed (false)
|
|
16
|
-
* - 'error' in any round ⇒ chain failed (false), state.terminal = true
|
|
17
|
-
*
|
|
18
|
-
* Runs runOnTerminal so the chain-pass slot is authoritative even on
|
|
19
|
-
* hard-fail paths. Idempotent on state.qualityChainPassed.
|
|
20
|
-
*/
|
|
21
|
-
export declare function settleQualityChainHandler(state: LifecycleState): void;
|
|
22
|
-
//# sourceMappingURL=quality-chain-handlers.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"quality-chain-handlers.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/handlers/quality-chain-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AA4W7D,eAAO,MAAM,0BAA0B,UApJkB,cAAc,KAAG,OAAO,CAAC,IAAI,CAoJjB,CAAC;AACtE,eAAO,MAAM,0BAA0B,UArJkB,cAAc,KAAG,OAAO,CAAC,IAAI,CAqJjB,CAAC;AACtE,eAAO,MAAM,0BAA0B,UAtJkB,cAAc,KAAG,OAAO,CAAC,IAAI,CAsJjB,CAAC;AACtE,eAAO,MAAM,0BAA0B,UAhDa,cAAc,KAAG,OAAO,CAAC,IAAI,CAgDZ,CAAC;AACtE,eAAO,MAAM,0BAA0B,UAjDa,cAAc,KAAG,OAAO,CAAC,IAAI,CAiDZ,CAAC;AAEtE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAyCrE"}
|
|
@@ -1,369 +0,0 @@
|
|
|
1
|
-
import { pickReviewer, pickEscalation } from '../../escalation/policy.js';
|
|
2
|
-
import { ReviewerParseError } from '../../review/reviewer-engine.js';
|
|
3
|
-
import { delegateWithEscalation } from '../../escalation/delegate-with-escalation.js';
|
|
4
|
-
import { runWithFallback, TRANSPORT_FAILURES, isReviewTransportFailure, makeSyntheticRunResult, } from '../../escalation/fallback.js';
|
|
5
|
-
import { makeSkippedReviewResult } from '../../review/skipped-result.js';
|
|
6
|
-
import { makeRunnerShell } from '../../providers/make-runner-shell.js';
|
|
7
|
-
import { mergeStageStats, replaceLastRunResultPreservingTrackers } from '../merge-stage-stats.js';
|
|
8
|
-
async function runQualityReviewRound(input) {
|
|
9
|
-
const { state, ctx, round } = input;
|
|
10
|
-
const last = state.lastRunResult;
|
|
11
|
-
if (!last)
|
|
12
|
-
return null;
|
|
13
|
-
const implReport = last.implementationReport ?? last.structuredReport;
|
|
14
|
-
if (!implReport)
|
|
15
|
-
return null;
|
|
16
|
-
const baseTier = ctx.assignedTier;
|
|
17
|
-
const reviewerTier = pickReviewer({ loop: 'quality', attemptIndex: round - 1, baseTier });
|
|
18
|
-
const task = state.task;
|
|
19
|
-
if (!task)
|
|
20
|
-
return null;
|
|
21
|
-
const route = (state.route ?? ctx.route);
|
|
22
|
-
const isArtifactProducing = state.toolCategory === 'artifact_producing';
|
|
23
|
-
const fileContents = {};
|
|
24
|
-
const toolCallLog = last.toolCalls ?? [];
|
|
25
|
-
const filesWritten = last.filesWritten ?? [];
|
|
26
|
-
state.qualityUnavailable ??= new Map();
|
|
27
|
-
const qualityUnavailable = state.qualityUnavailable;
|
|
28
|
-
// Tool sweep #6: cumulative diff for quality review (artifact-producing
|
|
29
|
-
// routes). Same plumbing as spec-chain — reviewer needs to see the
|
|
30
|
-
// actual code change to make precise findings. Read-only routes don't
|
|
31
|
-
// have a diffTracker, so this is empty for them (and harmless).
|
|
32
|
-
let cumulativeDiff = '';
|
|
33
|
-
if (state.diffTracker) {
|
|
34
|
-
try {
|
|
35
|
-
cumulativeDiff = await state.diffTracker.cumulativeDiff();
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
// Diff failures shouldn't block review.
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
const priorConcerns = Array.isArray(state.priorQualityConcerns) ? state.priorQualityConcerns : [];
|
|
42
|
-
const reviewerCall = await runWithFallback({
|
|
43
|
-
assigned: reviewerTier,
|
|
44
|
-
providerFor: (tier) => ctx.providers[tier],
|
|
45
|
-
unavailableTiers: qualityUnavailable,
|
|
46
|
-
isTransportFailure: (r) => isReviewTransportFailure(r),
|
|
47
|
-
getStatus: (r) => r.status,
|
|
48
|
-
makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'),
|
|
49
|
-
call: async (provider, usedTier) => {
|
|
50
|
-
const shell = makeRunnerShell(provider);
|
|
51
|
-
if (isArtifactProducing) {
|
|
52
|
-
const engine = ctx.reviewerEngine;
|
|
53
|
-
if (!engine)
|
|
54
|
-
throw new Error('reviewerEngine not configured');
|
|
55
|
-
try {
|
|
56
|
-
return engine.runQualityAP(shell, {
|
|
57
|
-
workerOutput: last.output,
|
|
58
|
-
brief: task.prompt ?? '',
|
|
59
|
-
cwd: ctx.cwd,
|
|
60
|
-
route,
|
|
61
|
-
fileContents,
|
|
62
|
-
toolCallLog,
|
|
63
|
-
filesWritten,
|
|
64
|
-
diff: cumulativeDiff,
|
|
65
|
-
priorConcerns,
|
|
66
|
-
abortSignal: ctx.stall.controller.signal,
|
|
67
|
-
deadlineMs: ctx.timing.deadlineMs,
|
|
68
|
-
...(ctx.bus && { bus: ctx.bus }),
|
|
69
|
-
...(ctx.batchId !== undefined && { batchId: ctx.batchId }),
|
|
70
|
-
...(ctx.taskIndex !== undefined && { taskIndex: ctx.taskIndex }),
|
|
71
|
-
tier: usedTier,
|
|
72
|
-
stageLabel: 'Quality review',
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
catch (err) {
|
|
76
|
-
if (err instanceof ReviewerParseError) {
|
|
77
|
-
return { verdict: 'error', concerns: [] };
|
|
78
|
-
}
|
|
79
|
-
throw err;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
const annotator = ctx.annotatorEngine;
|
|
83
|
-
if (!annotator)
|
|
84
|
-
throw new Error('annotatorEngine not configured');
|
|
85
|
-
// Read-only routes go through dispatchParallelCriteria which writes
|
|
86
|
-
// workerOutputs[] onto lastRunResult. When that field is present,
|
|
87
|
-
// pass through verbatim. When absent (initial migration window or
|
|
88
|
-
// any future caller that hasn't fanned out), wrap last.output as
|
|
89
|
-
// a single-narrative input so the annotator path stays uniform.
|
|
90
|
-
const fanoutOutputs = last.workerOutputs;
|
|
91
|
-
const workerOutputs = Array.isArray(fanoutOutputs) && fanoutOutputs.length > 0
|
|
92
|
-
? fanoutOutputs.map(o => ({ criterion: `criterion ${o.criterionId} — ${o.criterionTitle}`, narrative: o.narrative }))
|
|
93
|
-
: [{ criterion: 'all criteria', narrative: last.output }];
|
|
94
|
-
return annotator.annotate(shell, {
|
|
95
|
-
workerOutputs,
|
|
96
|
-
brief: task.prompt ?? '',
|
|
97
|
-
cwd: ctx.cwd,
|
|
98
|
-
route: route,
|
|
99
|
-
abortSignal: ctx.stall.controller.signal,
|
|
100
|
-
deadlineMs: ctx.timing.deadlineMs,
|
|
101
|
-
...(ctx.bus && { bus: ctx.bus }),
|
|
102
|
-
...(ctx.batchId !== undefined && { batchId: ctx.batchId }),
|
|
103
|
-
...(ctx.taskIndex !== undefined && { taskIndex: ctx.taskIndex }),
|
|
104
|
-
tier: usedTier,
|
|
105
|
-
stageLabel: 'Annotating',
|
|
106
|
-
});
|
|
107
|
-
},
|
|
108
|
-
});
|
|
109
|
-
if (reviewerCall.bothUnavailable)
|
|
110
|
-
return null;
|
|
111
|
-
const out = reviewerCall.result;
|
|
112
|
-
if ('status' in out && out.status === 'skipped')
|
|
113
|
-
return null;
|
|
114
|
-
return out;
|
|
115
|
-
}
|
|
116
|
-
async function runQualityRework(state, ctx, attemptIndex) {
|
|
117
|
-
const task = state.task;
|
|
118
|
-
if (!task)
|
|
119
|
-
return null;
|
|
120
|
-
const baseTier = ctx.assignedTier;
|
|
121
|
-
const decision = pickEscalation({ loop: 'quality', attemptIndex, baseTier });
|
|
122
|
-
state.qualityChainAttemptIndex = attemptIndex;
|
|
123
|
-
state.qualityUnavailable ??= new Map();
|
|
124
|
-
const qualityUnavailable = state.qualityUnavailable;
|
|
125
|
-
const reworkPrompt = (task.prompt ?? '') + '\n\n[quality rework — address the prior reviewer feedback]';
|
|
126
|
-
const reworkCall = await runWithFallback({
|
|
127
|
-
assigned: decision.impl,
|
|
128
|
-
providerFor: (tier) => ctx.providers[tier],
|
|
129
|
-
unavailableTiers: qualityUnavailable,
|
|
130
|
-
isTransportFailure: (r) => TRANSPORT_FAILURES.has(r.status) && r.incompleteReason === undefined,
|
|
131
|
-
getStatus: (r) => r.status,
|
|
132
|
-
makeSyntheticFailure: (assigned) => makeSyntheticRunResult(assigned, 'all_tiers_unavailable'),
|
|
133
|
-
call: (provider, usedTier) => delegateWithEscalation({
|
|
134
|
-
prompt: reworkPrompt,
|
|
135
|
-
cwd: ctx.cwd,
|
|
136
|
-
agentType: usedTier,
|
|
137
|
-
briefQualityPolicy: 'off',
|
|
138
|
-
timeoutMs: ctx.timing.timeoutMs,
|
|
139
|
-
}, [provider], {
|
|
140
|
-
explicitlyPinned: true,
|
|
141
|
-
taskDeadlineMs: ctx.timing.deadlineMs,
|
|
142
|
-
abortSignal: ctx.stall.controller.signal,
|
|
143
|
-
assignedTier: usedTier,
|
|
144
|
-
// Same fix as spec-chain rework — pass bus so runner events fire.
|
|
145
|
-
...(ctx.bus && { bus: ctx.bus }),
|
|
146
|
-
...(ctx.batchId !== undefined && { batchId: ctx.batchId }),
|
|
147
|
-
...(ctx.taskIndex !== undefined && { taskIndex: ctx.taskIndex }),
|
|
148
|
-
stageLabel: `Quality rework round ${attemptIndex}`,
|
|
149
|
-
}),
|
|
150
|
-
});
|
|
151
|
-
if (reworkCall.bothUnavailable)
|
|
152
|
-
return null;
|
|
153
|
-
const result = reworkCall.result;
|
|
154
|
-
if (result.status !== 'ok')
|
|
155
|
-
return null;
|
|
156
|
-
return result;
|
|
157
|
-
}
|
|
158
|
-
function mapQualityVerdict(result) {
|
|
159
|
-
if ('status' in result && result.status === 'skipped')
|
|
160
|
-
return 'skipped';
|
|
161
|
-
return result.verdict;
|
|
162
|
-
}
|
|
163
|
-
function makeQualityReviewHandler(round) {
|
|
164
|
-
const slot = `qualityReviewRound${round}Verdict`;
|
|
165
|
-
return async function qualityReviewRoundHandler(state) {
|
|
166
|
-
if (state[slot])
|
|
167
|
-
return;
|
|
168
|
-
const ctx = state.executionContext;
|
|
169
|
-
if (!ctx)
|
|
170
|
-
return;
|
|
171
|
-
const result = await runQualityReviewRound({ state, ctx, round });
|
|
172
|
-
if (!result)
|
|
173
|
-
return;
|
|
174
|
-
state[slot] = mapQualityVerdict(result);
|
|
175
|
-
// Tool sweep #6: accumulate concerns across rounds for reviewer
|
|
176
|
-
// continuity. Same merge pattern as priorSpecConcerns.
|
|
177
|
-
const concernsList = result.concerns;
|
|
178
|
-
if (Array.isArray(concernsList) && concernsList.length > 0) {
|
|
179
|
-
const prior = Array.isArray(state.priorQualityConcerns) ? state.priorQualityConcerns : [];
|
|
180
|
-
const seen = new Set(prior);
|
|
181
|
-
const merged = [...prior];
|
|
182
|
-
for (const c of concernsList) {
|
|
183
|
-
if (typeof c === 'string' && !seen.has(c)) {
|
|
184
|
-
seen.add(c);
|
|
185
|
-
merged.push(c);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
state.priorQualityConcerns = merged;
|
|
189
|
-
}
|
|
190
|
-
// Persist findings + concerns onto lastRunResult so:
|
|
191
|
-
// - the wire event-builder's findingsBySeverity (reads rr.concerns)
|
|
192
|
-
// populates findings_critical/high/medium/low DB columns instead
|
|
193
|
-
// of zeros even on annotated audit/review/verify/debug/investigate runs;
|
|
194
|
-
// - the terminal envelope's annotatedFindings field carries the
|
|
195
|
-
// parsed findings the user can read (was empty before — the
|
|
196
|
-
// consumer had to fall back to extraSections).
|
|
197
|
-
persistReviewFindings(state, result);
|
|
198
|
-
// Record per-round cost in quality_review stageStats. Annotator path
|
|
199
|
-
// (read-only routes) and reviewer path both share the same stage slot;
|
|
200
|
-
// the verdict differentiates ('annotated' vs 'approved'/'changes_required').
|
|
201
|
-
const baseTier = ctx.assignedTier;
|
|
202
|
-
const reviewerTier = (round - 1 < 2)
|
|
203
|
-
? (baseTier === 'standard' ? 'complex' : 'standard')
|
|
204
|
-
: baseTier;
|
|
205
|
-
const reviewerProvider = ctx.providers[reviewerTier];
|
|
206
|
-
const cost = result.cost;
|
|
207
|
-
mergeStageStats(state, 'quality_review', {
|
|
208
|
-
inputTokens: cost?.inputTokens ?? 0,
|
|
209
|
-
outputTokens: cost?.outputTokens ?? 0,
|
|
210
|
-
turnCount: cost?.turnCount ?? 0,
|
|
211
|
-
toolCallCount: cost?.toolCallCount ?? 0,
|
|
212
|
-
costUSD: cost?.costUSD ?? null,
|
|
213
|
-
durationMs: cost?.durationMs ?? null,
|
|
214
|
-
}, {
|
|
215
|
-
tier: reviewerTier,
|
|
216
|
-
model: reviewerProvider?.config?.model ?? null,
|
|
217
|
-
verdict: result.verdict,
|
|
218
|
-
});
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
/** Push the reviewer/annotator's findings into state.lastRunResult so the
|
|
222
|
-
* wire telemetry's per-stage `findingsBySeverity` + the terminal envelope's
|
|
223
|
-
* `annotatedFindings` see them. Without this:
|
|
224
|
-
* - wire findings_critical/high/medium/low all stay 0 even when the
|
|
225
|
-
* annotator returned a populated array;
|
|
226
|
-
* - envelope.results[N].annotatedFindings is empty and consumers have
|
|
227
|
-
* to mine extraSections to find the data.
|
|
228
|
-
* Idempotent across rounds (each round appends; the wire dedupes by
|
|
229
|
-
* per-stage filter so no double-counting). */
|
|
230
|
-
function persistReviewFindings(state, result) {
|
|
231
|
-
if ('status' in result && result.status === 'skipped')
|
|
232
|
-
return;
|
|
233
|
-
const last = state.lastRunResult;
|
|
234
|
-
if (!last)
|
|
235
|
-
return;
|
|
236
|
-
// Annotator result: structured findings array.
|
|
237
|
-
const annotatorFindings = result.annotatedFindings;
|
|
238
|
-
if (Array.isArray(annotatorFindings) && annotatorFindings.length > 0) {
|
|
239
|
-
const merged = [...(last.annotatedFindings ?? []), ...annotatorFindings];
|
|
240
|
-
last.annotatedFindings = merged;
|
|
241
|
-
const newConcerns = annotatorFindings.map(f => ({
|
|
242
|
-
source: 'quality_review',
|
|
243
|
-
severity: (f.severity ?? 'medium'),
|
|
244
|
-
message: f.claim,
|
|
245
|
-
}));
|
|
246
|
-
last.concerns = [...(last.concerns ?? []), ...newConcerns];
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
// Reviewer result: free-text concerns array (no severity per item).
|
|
250
|
-
// Default to 'medium' so the wire's findingsBySeverity bucketing isn't
|
|
251
|
-
// skewed toward 'critical' by accident.
|
|
252
|
-
const reviewerConcerns = result.concerns;
|
|
253
|
-
if (Array.isArray(reviewerConcerns) && reviewerConcerns.length > 0) {
|
|
254
|
-
const newConcerns = reviewerConcerns.map(text => ({
|
|
255
|
-
source: 'quality_review',
|
|
256
|
-
severity: 'medium',
|
|
257
|
-
message: text,
|
|
258
|
-
}));
|
|
259
|
-
last.concerns = [...(last.concerns ?? []), ...newConcerns];
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
function makeQualityReworkHandler(reworkIndex) {
|
|
263
|
-
// rework_1 → attemptIndex 1 (quality index 0 has impl: null and would throw)
|
|
264
|
-
// rework_2 → attemptIndex 2
|
|
265
|
-
const attemptIndex = reworkIndex === 1 ? 1 : 2;
|
|
266
|
-
return async function qualityReworkHandler(state) {
|
|
267
|
-
const ctx = state.executionContext;
|
|
268
|
-
if (!ctx)
|
|
269
|
-
return;
|
|
270
|
-
const newResult = await runQualityRework(state, ctx, attemptIndex);
|
|
271
|
-
if (!newResult) {
|
|
272
|
-
// The rework's implementer call did not return an ok RunResult.
|
|
273
|
-
// Mark the chain failed so the next round's `!s.terminal` gate stops
|
|
274
|
-
// the cascade and settle_quality_chain records the failure on the
|
|
275
|
-
// wire envelope. See spec-chain-handlers for the same fix shape.
|
|
276
|
-
state.qualityReworkFailed = true;
|
|
277
|
-
state.terminal = true;
|
|
278
|
-
if (ctx.verbose && typeof ctx.verboseStream === 'function') {
|
|
279
|
-
ctx.verboseStream(`[mmagent verbose] event=quality_rework_failed ts=${new Date().toISOString()} batch_id=${ctx.batchId ?? ''} task_index=${ctx.taskIndex ?? 0} rework_index=${reworkIndex}\n`);
|
|
280
|
-
}
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
// Tool sweep #6: same fix as spec-chain — union file-tracker arrays
|
|
284
|
-
// across rework rounds so the envelope reflects ALL writes, not
|
|
285
|
-
// just the most recent attempt's writes.
|
|
286
|
-
replaceLastRunResultPreservingTrackers(state, newResult);
|
|
287
|
-
// Record rework cost. Quality rework_2 (attemptIndex 2) escalates impl
|
|
288
|
-
// from base tier to the other tier; rework_1 stays on base.
|
|
289
|
-
const baseTier = ctx.assignedTier;
|
|
290
|
-
const reworkTier = (attemptIndex === 2 && baseTier === 'standard') ? 'complex' : baseTier;
|
|
291
|
-
const reworkProvider = ctx.providers[reworkTier];
|
|
292
|
-
mergeStageStats(state, 'quality_rework', {
|
|
293
|
-
inputTokens: newResult.usage?.inputTokens ?? 0,
|
|
294
|
-
outputTokens: newResult.usage?.outputTokens ?? 0,
|
|
295
|
-
cachedReadTokens: newResult.usage?.cachedReadTokens ?? 0,
|
|
296
|
-
cachedNonReadTokens: newResult.usage?.cachedNonReadTokens ?? 0,
|
|
297
|
-
turnCount: newResult.turns ?? 0,
|
|
298
|
-
toolCallCount: Array.isArray(newResult.toolCalls) ? newResult.toolCalls.length : 0,
|
|
299
|
-
costUSD: newResult.cost?.costUSD ?? null,
|
|
300
|
-
durationMs: newResult.durationMs ?? null,
|
|
301
|
-
filesReadCount: Array.isArray(newResult.filesRead) ? newResult.filesRead.length : 0,
|
|
302
|
-
filesWrittenCount: Array.isArray(newResult.filesWritten) ? newResult.filesWritten.length : 0,
|
|
303
|
-
}, {
|
|
304
|
-
tier: reworkTier,
|
|
305
|
-
model: reworkProvider?.config?.model ?? null,
|
|
306
|
-
});
|
|
307
|
-
};
|
|
308
|
-
}
|
|
309
|
-
export const qualityReviewRound1Handler = makeQualityReviewHandler(1);
|
|
310
|
-
export const qualityReviewRound2Handler = makeQualityReviewHandler(2);
|
|
311
|
-
export const qualityReviewRound3Handler = makeQualityReviewHandler(3);
|
|
312
|
-
export const qualityReworkRound1Handler = makeQualityReworkHandler(1);
|
|
313
|
-
export const qualityReworkRound2Handler = makeQualityReworkHandler(2);
|
|
314
|
-
/**
|
|
315
|
-
* Settle handler. Reads the three round verdicts and writes
|
|
316
|
-
* state.qualityChainPassed.
|
|
317
|
-
*
|
|
318
|
-
* Cascade rule:
|
|
319
|
-
* - 'approved' or 'annotated' in any round ⇒ chain passed (true)
|
|
320
|
-
* - 'skipped' (e.g., no files written) treated as passed (true) — the
|
|
321
|
-
* no-block path when there's nothing to review
|
|
322
|
-
* - 'changes_required' through round 3 ⇒ chain failed (false)
|
|
323
|
-
* - 'error' in any round ⇒ chain failed (false), state.terminal = true
|
|
324
|
-
*
|
|
325
|
-
* Runs runOnTerminal so the chain-pass slot is authoritative even on
|
|
326
|
-
* hard-fail paths. Idempotent on state.qualityChainPassed.
|
|
327
|
-
*/
|
|
328
|
-
export function settleQualityChainHandler(state) {
|
|
329
|
-
if (typeof state.qualityChainPassed === 'boolean')
|
|
330
|
-
return;
|
|
331
|
-
const v1 = state.qualityReviewRound1Verdict;
|
|
332
|
-
const v2 = state.qualityReviewRound2Verdict;
|
|
333
|
-
const v3 = state.qualityReviewRound3Verdict;
|
|
334
|
-
if (v1 === undefined && v2 === undefined && v3 === undefined)
|
|
335
|
-
return;
|
|
336
|
-
const passy = (v) => v === 'approved' || v === 'annotated' || v === 'skipped';
|
|
337
|
-
if (passy(v1) || passy(v2) || passy(v3)) {
|
|
338
|
-
state.qualityChainPassed = true;
|
|
339
|
-
return;
|
|
340
|
-
}
|
|
341
|
-
if (v1 === 'error' || v2 === 'error' || v3 === 'error') {
|
|
342
|
-
// 4.0.3+ soft-success path for read-only routes (audit / review /
|
|
343
|
-
// verify / debug / investigate). These routes have NO rework loop —
|
|
344
|
-
// the annotator is single-pass. When the annotator returns 'error'
|
|
345
|
-
// (typically a parse failure on its own JSON block) BUT the
|
|
346
|
-
// implementer produced a non-empty narrative output, the findings
|
|
347
|
-
// are still recoverable from `lastRunResult.output` in the canonical
|
|
348
|
-
// `## Finding N:` format. Treat that as chain-passed so the wire
|
|
349
|
-
// envelope reports terminal_status='ok' / worker_status='done'
|
|
350
|
-
// instead of leaking 'review_loop_capped' (artifact-producing-route
|
|
351
|
-
// terminology). Round-1 verdict='error' stays in stage stats as a
|
|
352
|
-
// soft telemetry signal. Headline composers + envelope builders
|
|
353
|
-
// fall back to narrative parsing for the findings count.
|
|
354
|
-
const last = state.lastRunResult;
|
|
355
|
-
const isReadOnly = state.toolCategory === 'read_only';
|
|
356
|
-
const implementerProducedOutput = typeof last?.output === 'string' && last.output.trim().length > 0;
|
|
357
|
-
if (isReadOnly && implementerProducedOutput) {
|
|
358
|
-
state.qualityChainPassed = true;
|
|
359
|
-
return;
|
|
360
|
-
}
|
|
361
|
-
// Artifact-producing route, OR read-only with empty implementer
|
|
362
|
-
// output: hard-fail (no findings to recover).
|
|
363
|
-
state.qualityChainPassed = false;
|
|
364
|
-
state.terminal = true;
|
|
365
|
-
return;
|
|
366
|
-
}
|
|
367
|
-
state.qualityChainPassed = false;
|
|
368
|
-
}
|
|
369
|
-
//# sourceMappingURL=quality-chain-handlers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"quality-chain-handlers.js","sourceRoot":"","sources":["../../../src/lifecycle/handlers/quality-chain-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { LifecycleState } from '../stage-plan-types.js';
|
|
2
|
-
/**
|
|
3
|
-
* StageHandler for row 4.13 (review_diff).
|
|
4
|
-
*
|
|
5
|
-
* Reads from state:
|
|
6
|
-
* - state.task / state.executionContext for cwd, providers, timing
|
|
7
|
-
* - state.verifyResult: VerifyStageResult required by reviewerEngine.runDiff
|
|
8
|
-
* - state.diffReviewVerdict: idempotency guard
|
|
9
|
-
*
|
|
10
|
-
* Writes to state:
|
|
11
|
-
* - state.diffReviewKind: raw verdict from reviewerEngine.runDiff
|
|
12
|
-
* - state.diffReviewVerdict: envelope-mapped status
|
|
13
|
-
* - state.terminal = true on 'changes_required' (reject) or 'error'
|
|
14
|
-
*
|
|
15
|
-
* Verdict mapping:
|
|
16
|
-
* kind: 'approve' → envelope 'approved'
|
|
17
|
-
* kind: 'concerns' → envelope 'approved' (concerns are flagged
|
|
18
|
-
* but non-blocking by design)
|
|
19
|
-
* kind: 'reject' → envelope 'changes_required'
|
|
20
|
-
* kind: 'transport_failure' → envelope 'error'
|
|
21
|
-
*
|
|
22
|
-
* Both slots are written so downstream telemetry can distinguish 'approve'
|
|
23
|
-
* from 'concerns' (both map to envelope 'approved').
|
|
24
|
-
*
|
|
25
|
-
* Defensive no-op when state.executionContext, state.verifyResult, or the
|
|
26
|
-
* reviewer provider for the picked tier is missing. Diff is computed via
|
|
27
|
-
* `git diff HEAD~..HEAD` against the cwd; if git fails, the handler
|
|
28
|
-
* records an envelope 'error' and sets terminal.
|
|
29
|
-
*/
|
|
30
|
-
export declare function reviewDiffHandler(state: LifecycleState): Promise<void>;
|
|
31
|
-
//# sourceMappingURL=review-diff-handler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-diff-handler.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/handlers/review-diff-handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAiB7D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAkI5E"}
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import { execFile } from 'node:child_process';
|
|
2
|
-
import { promisify } from 'node:util';
|
|
3
|
-
import { pickReviewer } from '../../escalation/policy.js';
|
|
4
|
-
import { runWithFallback, isReviewTransportFailure, } from '../../escalation/fallback.js';
|
|
5
|
-
import { makeSkippedReviewResult } from '../../review/skipped-result.js';
|
|
6
|
-
import { makeRunnerShell } from '../../providers/make-runner-shell.js';
|
|
7
|
-
import { mergeStageStats } from '../merge-stage-stats.js';
|
|
8
|
-
const exec = promisify(execFile);
|
|
9
|
-
/**
|
|
10
|
-
* StageHandler for row 4.13 (review_diff).
|
|
11
|
-
*
|
|
12
|
-
* Reads from state:
|
|
13
|
-
* - state.task / state.executionContext for cwd, providers, timing
|
|
14
|
-
* - state.verifyResult: VerifyStageResult required by reviewerEngine.runDiff
|
|
15
|
-
* - state.diffReviewVerdict: idempotency guard
|
|
16
|
-
*
|
|
17
|
-
* Writes to state:
|
|
18
|
-
* - state.diffReviewKind: raw verdict from reviewerEngine.runDiff
|
|
19
|
-
* - state.diffReviewVerdict: envelope-mapped status
|
|
20
|
-
* - state.terminal = true on 'changes_required' (reject) or 'error'
|
|
21
|
-
*
|
|
22
|
-
* Verdict mapping:
|
|
23
|
-
* kind: 'approve' → envelope 'approved'
|
|
24
|
-
* kind: 'concerns' → envelope 'approved' (concerns are flagged
|
|
25
|
-
* but non-blocking by design)
|
|
26
|
-
* kind: 'reject' → envelope 'changes_required'
|
|
27
|
-
* kind: 'transport_failure' → envelope 'error'
|
|
28
|
-
*
|
|
29
|
-
* Both slots are written so downstream telemetry can distinguish 'approve'
|
|
30
|
-
* from 'concerns' (both map to envelope 'approved').
|
|
31
|
-
*
|
|
32
|
-
* Defensive no-op when state.executionContext, state.verifyResult, or the
|
|
33
|
-
* reviewer provider for the picked tier is missing. Diff is computed via
|
|
34
|
-
* `git diff HEAD~..HEAD` against the cwd; if git fails, the handler
|
|
35
|
-
* records an envelope 'error' and sets terminal.
|
|
36
|
-
*/
|
|
37
|
-
export async function reviewDiffHandler(state) {
|
|
38
|
-
if (state.diffReviewVerdict)
|
|
39
|
-
return;
|
|
40
|
-
const ctx = state.executionContext;
|
|
41
|
-
if (!ctx)
|
|
42
|
-
return;
|
|
43
|
-
const verifyResult = state.verifyResult;
|
|
44
|
-
if (!verifyResult)
|
|
45
|
-
return;
|
|
46
|
-
const baseTier = ctx.assignedTier;
|
|
47
|
-
const reviewerTier = pickReviewer({ loop: 'spec', attemptIndex: 0, baseTier });
|
|
48
|
-
// Tool sweep #6: prefer the snapshot-based DiffTracker (works in
|
|
49
|
-
// non-git dirs, captures the cumulative across rework rounds against
|
|
50
|
-
// the pre-task baseline). Fall back to `git diff HEAD~..HEAD` for
|
|
51
|
-
// legacy callers (autoCommit pipelines that ran before the tracker
|
|
52
|
-
// was wired in). If BOTH sources fail, hard-error: reviewing without
|
|
53
|
-
// evidence would be the very bug this sweep is fixing.
|
|
54
|
-
let diff = '';
|
|
55
|
-
let trackerProvided = false;
|
|
56
|
-
if (state.diffTracker) {
|
|
57
|
-
try {
|
|
58
|
-
diff = await state.diffTracker.cumulativeDiff();
|
|
59
|
-
trackerProvided = true;
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
// tracker error — fall through to git
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
if (!trackerProvided) {
|
|
66
|
-
try {
|
|
67
|
-
const { stdout } = await exec('git', ['diff', 'HEAD~..HEAD'], { cwd: ctx.cwd });
|
|
68
|
-
const cap = 64 * 1024;
|
|
69
|
-
const bytes = Buffer.byteLength(stdout, 'utf8');
|
|
70
|
-
diff = bytes > cap
|
|
71
|
-
? Buffer.from(stdout, 'utf8').subarray(0, cap).toString('utf8') + '\n[diff truncated]'
|
|
72
|
-
: stdout;
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
state.diffReviewVerdict = 'error';
|
|
76
|
-
state.terminal = true;
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
state.diffUnavailable ??= new Map();
|
|
81
|
-
const diffUnavailable = state.diffUnavailable;
|
|
82
|
-
const diffCall = await runWithFallback({
|
|
83
|
-
assigned: reviewerTier,
|
|
84
|
-
providerFor: (tier) => ctx.providers[tier],
|
|
85
|
-
unavailableTiers: diffUnavailable,
|
|
86
|
-
isTransportFailure: (r) => isReviewTransportFailure(r),
|
|
87
|
-
getStatus: (r) => r.status,
|
|
88
|
-
makeSyntheticFailure: () => makeSkippedReviewResult('all_tiers_unavailable'),
|
|
89
|
-
call: async (provider, usedTier) => {
|
|
90
|
-
const shell = makeRunnerShell(provider);
|
|
91
|
-
const engine = ctx.reviewerEngine;
|
|
92
|
-
if (!engine)
|
|
93
|
-
throw new Error('reviewerEngine not configured');
|
|
94
|
-
// Tool sweep #6: pass diff via the dedicated `diff` field so the
|
|
95
|
-
// template's "# Cumulative diff" section gets actual diff content
|
|
96
|
-
// instead of conflating it with the worker's text summary.
|
|
97
|
-
// workerOutput stays as the verification summary so the diff
|
|
98
|
-
// reviewer has both signals.
|
|
99
|
-
const lastResult = state.lastRunResult;
|
|
100
|
-
const verifySummary = `Verification: ${verifyResult.status}\n${verifyResult.steps.map(s => `- ${s.command} → ${s.status}`).join('\n')}`;
|
|
101
|
-
return engine.runDiff(shell, {
|
|
102
|
-
workerOutput: lastResult?.output ?? verifySummary,
|
|
103
|
-
brief: `verification: ${verifyResult.status}\n${verifyResult.steps.map(s => `- ${s.command} → ${s.status}`).join('\n')}`,
|
|
104
|
-
diff,
|
|
105
|
-
cwd: ctx.cwd,
|
|
106
|
-
abortSignal: ctx.stall.controller.signal,
|
|
107
|
-
deadlineMs: ctx.timing.deadlineMs,
|
|
108
|
-
...(ctx.bus && { bus: ctx.bus }),
|
|
109
|
-
...(ctx.batchId !== undefined && { batchId: ctx.batchId }),
|
|
110
|
-
...(ctx.taskIndex !== undefined && { taskIndex: ctx.taskIndex }),
|
|
111
|
-
tier: usedTier,
|
|
112
|
-
stageLabel: 'Diff review',
|
|
113
|
-
});
|
|
114
|
-
},
|
|
115
|
-
});
|
|
116
|
-
if (diffCall.bothUnavailable) {
|
|
117
|
-
state.diffReviewVerdict = 'skipped';
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
const verdictOrSkipped = diffCall.result;
|
|
121
|
-
if ('status' in verdictOrSkipped && verdictOrSkipped.status === 'skipped') {
|
|
122
|
-
state.diffReviewVerdict = 'skipped';
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
const result = verdictOrSkipped;
|
|
126
|
-
state.diffReviewKind = result.verdict;
|
|
127
|
-
if (result.verdict === 'approve' || result.verdict === 'concerns') {
|
|
128
|
-
state.diffReviewVerdict = 'approved';
|
|
129
|
-
}
|
|
130
|
-
else if (result.verdict === 'reject') {
|
|
131
|
-
state.diffReviewVerdict = 'changes_required';
|
|
132
|
-
state.terminal = true;
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
state.diffReviewVerdict = 'error';
|
|
136
|
-
state.terminal = true;
|
|
137
|
-
}
|
|
138
|
-
// Persist diff-reviewer concerns into lastRunResult.concerns so the
|
|
139
|
-
// wire's findings_* DB columns reflect them on diff_review verdicts
|
|
140
|
-
// other than 'approve'. Without this, findings counts stay 0 even when
|
|
141
|
-
// the diff reviewer rejected with explicit concerns.
|
|
142
|
-
if (Array.isArray(result.concerns) && result.concerns.length > 0) {
|
|
143
|
-
const last = state.lastRunResult;
|
|
144
|
-
if (last) {
|
|
145
|
-
const newConcerns = result.concerns.map(text => ({
|
|
146
|
-
source: 'diff_review',
|
|
147
|
-
severity: 'medium',
|
|
148
|
-
message: text,
|
|
149
|
-
}));
|
|
150
|
-
last.concerns = [...(last.concerns ?? []), ...newConcerns];
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
// Record diff_review cost so wire telemetry sees it.
|
|
154
|
-
const reviewerProvider = ctx.providers[reviewerTier];
|
|
155
|
-
mergeStageStats(state, 'diff_review', {
|
|
156
|
-
inputTokens: result.cost?.inputTokens ?? 0,
|
|
157
|
-
outputTokens: result.cost?.outputTokens ?? 0,
|
|
158
|
-
turnCount: result.cost?.turnCount ?? 0,
|
|
159
|
-
toolCallCount: result.cost?.toolCallCount ?? 0,
|
|
160
|
-
costUSD: result.cost?.costUSD ?? null,
|
|
161
|
-
durationMs: result.cost?.durationMs ?? null,
|
|
162
|
-
}, {
|
|
163
|
-
tier: reviewerTier,
|
|
164
|
-
model: reviewerProvider?.config?.model ?? null,
|
|
165
|
-
verdict: state.diffReviewVerdict,
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
//# sourceMappingURL=review-diff-handler.js.map
|