@zhixuan92/multi-model-agent-core 4.5.4 → 4.6.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 +8 -3
- package/dist/escalation/delegate-with-escalation.d.ts +2 -2
- package/dist/escalation/delegate-with-escalation.d.ts.map +1 -1
- package/dist/escalation/delegate-with-escalation.js +11 -17
- package/dist/escalation/delegate-with-escalation.js.map +1 -1
- package/dist/escalation/fallback-helpers.d.ts +5 -5
- package/dist/escalation/fallback-helpers.d.ts.map +1 -1
- package/dist/escalation/fallback-helpers.js +5 -3
- package/dist/escalation/fallback-helpers.js.map +1 -1
- package/dist/events/event-builder.d.ts +36 -5
- package/dist/events/event-builder.d.ts.map +1 -1
- package/dist/events/event-builder.js +173 -31
- package/dist/events/event-builder.js.map +1 -1
- package/dist/events/observability-events.d.ts +6 -0
- package/dist/events/observability-events.d.ts.map +1 -1
- package/dist/events/observability-events.js +5 -0
- package/dist/events/observability-events.js.map +1 -1
- package/dist/events/telemetry-types.d.ts +10 -0
- package/dist/events/telemetry-types.d.ts.map +1 -1
- package/dist/events/verbose-log-channel.d.ts +7 -7
- package/dist/events/verbose-log-channel.js +10 -10
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/lifecycle/annotate-parser.d.ts +9 -0
- package/dist/lifecycle/annotate-parser.d.ts.map +1 -0
- package/dist/lifecycle/annotate-parser.js +83 -0
- package/dist/lifecycle/annotate-parser.js.map +1 -0
- package/dist/lifecycle/annotate-prompts.d.ts +9 -0
- package/dist/lifecycle/annotate-prompts.d.ts.map +1 -0
- package/dist/lifecycle/annotate-prompts.js +86 -0
- package/dist/lifecycle/annotate-prompts.js.map +1 -0
- package/dist/lifecycle/auto-register-context-block.d.ts +2 -2
- package/dist/lifecycle/auto-register-context-block.d.ts.map +1 -1
- package/dist/lifecycle/auto-register-context-block.js.map +1 -1
- package/dist/lifecycle/build-cancelled-result.d.ts +11 -0
- package/dist/lifecycle/build-cancelled-result.d.ts.map +1 -0
- package/dist/lifecycle/build-cancelled-result.js +27 -0
- package/dist/lifecycle/build-cancelled-result.js.map +1 -0
- package/dist/lifecycle/executor-output-types.d.ts +2 -2
- package/dist/lifecycle/executor-output-types.d.ts.map +1 -1
- package/dist/lifecycle/fallback-report.d.ts +2 -2
- package/dist/lifecycle/fallback-report.d.ts.map +1 -1
- package/dist/lifecycle/fallback-report.js.map +1 -1
- package/dist/lifecycle/findings-parser.d.ts +2 -0
- package/dist/lifecycle/findings-parser.d.ts.map +1 -1
- package/dist/lifecycle/findings-parser.js +9 -4
- package/dist/lifecycle/findings-parser.js.map +1 -1
- package/dist/lifecycle/git-toplevel.d.ts +12 -0
- package/dist/lifecycle/git-toplevel.d.ts.map +1 -0
- package/dist/lifecycle/git-toplevel.js +49 -0
- package/dist/lifecycle/git-toplevel.js.map +1 -0
- package/dist/lifecycle/handlers/annotator.d.ts +2 -1
- package/dist/lifecycle/handlers/annotator.d.ts.map +1 -1
- package/dist/lifecycle/handlers/annotator.js +225 -7
- package/dist/lifecycle/handlers/annotator.js.map +1 -1
- package/dist/lifecycle/handlers/baseline-handlers.d.ts +10 -5
- package/dist/lifecycle/handlers/baseline-handlers.d.ts.map +1 -1
- package/dist/lifecycle/handlers/baseline-handlers.js +206 -316
- package/dist/lifecycle/handlers/baseline-handlers.js.map +1 -1
- package/dist/lifecycle/handlers/enrich-runtime-result.d.ts +3 -0
- package/dist/lifecycle/handlers/enrich-runtime-result.d.ts.map +1 -0
- package/dist/lifecycle/handlers/enrich-runtime-result.js +191 -0
- package/dist/lifecycle/handlers/enrich-runtime-result.js.map +1 -0
- package/dist/lifecycle/handlers/git-commit-handler.d.ts +3 -2
- package/dist/lifecycle/handlers/git-commit-handler.d.ts.map +1 -1
- package/dist/lifecycle/handlers/git-commit-handler.js +139 -110
- package/dist/lifecycle/handlers/git-commit-handler.js.map +1 -1
- package/dist/lifecycle/handlers/prepare-execution-context-handler.d.ts +7 -13
- package/dist/lifecycle/handlers/prepare-execution-context-handler.d.ts.map +1 -1
- package/dist/lifecycle/handlers/prepare-execution-context-handler.js +72 -49
- package/dist/lifecycle/handlers/prepare-execution-context-handler.js.map +1 -1
- package/dist/lifecycle/handlers/register-context-block-handlers.d.ts +2 -1
- package/dist/lifecycle/handlers/register-context-block-handlers.d.ts.map +1 -1
- package/dist/lifecycle/handlers/register-context-block-handlers.js +35 -14
- package/dist/lifecycle/handlers/register-context-block-handlers.js.map +1 -1
- package/dist/lifecycle/handlers/review-handler.d.ts +2 -1
- package/dist/lifecycle/handlers/review-handler.d.ts.map +1 -1
- package/dist/lifecycle/handlers/review-handler.js +152 -154
- package/dist/lifecycle/handlers/review-handler.js.map +1 -1
- package/dist/lifecycle/handlers/rework-handler.d.ts +2 -1
- package/dist/lifecycle/handlers/rework-handler.d.ts.map +1 -1
- package/dist/lifecycle/handlers/rework-handler.js +62 -14
- package/dist/lifecycle/handlers/rework-handler.js.map +1 -1
- package/dist/lifecycle/handlers/task-executor.d.ts +5 -4
- package/dist/lifecycle/handlers/task-executor.d.ts.map +1 -1
- package/dist/lifecycle/handlers/task-executor.js +153 -74
- package/dist/lifecycle/handlers/task-executor.js.map +1 -1
- package/dist/lifecycle/handlers/terminal-handlers.d.ts +22 -0
- package/dist/lifecycle/handlers/terminal-handlers.d.ts.map +1 -1
- package/dist/lifecycle/handlers/terminal-handlers.js +86 -5
- package/dist/lifecycle/handlers/terminal-handlers.js.map +1 -1
- package/dist/lifecycle/lifecycle-context.d.ts +31 -3
- package/dist/lifecycle/lifecycle-context.d.ts.map +1 -1
- package/dist/lifecycle/lifecycle-dispatcher.d.ts +18 -19
- package/dist/lifecycle/lifecycle-dispatcher.d.ts.map +1 -1
- package/dist/lifecycle/lifecycle-dispatcher.js +38 -22
- package/dist/lifecycle/lifecycle-dispatcher.js.map +1 -1
- package/dist/lifecycle/lifecycle-driver.d.ts +15 -8
- package/dist/lifecycle/lifecycle-driver.d.ts.map +1 -1
- package/dist/lifecycle/lifecycle-driver.js +110 -29
- package/dist/lifecycle/lifecycle-driver.js.map +1 -1
- package/dist/lifecycle/merge-stage-stats.d.ts +3 -3
- package/dist/lifecycle/merge-stage-stats.d.ts.map +1 -1
- package/dist/lifecycle/merge-stage-stats.js +2 -2
- package/dist/lifecycle/merge-stage-stats.js.map +1 -1
- package/dist/lifecycle/perform-implementation.d.ts +3 -0
- package/dist/lifecycle/perform-implementation.d.ts.map +1 -0
- package/dist/lifecycle/perform-implementation.js +264 -0
- package/dist/lifecycle/perform-implementation.js.map +1 -0
- package/dist/lifecycle/repo-hygiene.d.ts +14 -0
- package/dist/lifecycle/repo-hygiene.d.ts.map +1 -0
- package/dist/lifecycle/repo-hygiene.js +71 -0
- package/dist/lifecycle/repo-hygiene.js.map +1 -0
- package/dist/lifecycle/shared-compute.d.ts +4 -4
- package/dist/lifecycle/shared-compute.d.ts.map +1 -1
- package/dist/lifecycle/shared-compute.js +1 -1
- package/dist/lifecycle/shared-compute.js.map +1 -1
- package/dist/lifecycle/stage-io.d.ts +139 -0
- package/dist/lifecycle/stage-io.d.ts.map +1 -0
- package/dist/lifecycle/stage-io.js +20 -0
- package/dist/lifecycle/stage-io.js.map +1 -0
- package/dist/lifecycle/stage-plan-builder.d.ts +3 -3
- package/dist/lifecycle/stage-plan-builder.d.ts.map +1 -1
- package/dist/lifecycle/stage-plan-builder.js +157 -128
- package/dist/lifecycle/stage-plan-builder.js.map +1 -1
- package/dist/lifecycle/stage-plan-types.d.ts +5 -21
- package/dist/lifecycle/stage-plan-types.d.ts.map +1 -1
- package/dist/lifecycle/stage-progression.d.ts +3 -15
- package/dist/lifecycle/stage-progression.d.ts.map +1 -1
- package/dist/lifecycle/stage-progression.js +48 -91
- package/dist/lifecycle/stage-progression.js.map +1 -1
- package/dist/lifecycle/task-completion-summary.d.ts +2 -2
- package/dist/lifecycle/task-completion-summary.d.ts.map +1 -1
- package/dist/lifecycle/task-completion-summary.js +0 -6
- package/dist/lifecycle/task-completion-summary.js.map +1 -1
- package/dist/lifecycle/task-executor.d.ts +23 -0
- package/dist/lifecycle/task-executor.d.ts.map +1 -1
- package/dist/lifecycle/task-executor.js +77 -5
- package/dist/lifecycle/task-executor.js.map +1 -1
- package/dist/lifecycle/task-grouping.d.ts +19 -0
- package/dist/lifecycle/task-grouping.d.ts.map +1 -0
- package/dist/lifecycle/task-grouping.js +48 -0
- package/dist/lifecycle/task-grouping.js.map +1 -0
- package/dist/lifecycle/task-runner.d.ts +20 -7
- package/dist/lifecycle/task-runner.d.ts.map +1 -1
- package/dist/lifecycle/task-runner.js +42 -278
- package/dist/lifecycle/task-runner.js.map +1 -1
- package/dist/lifecycle/tool-config-types.d.ts +9 -0
- package/dist/lifecycle/tool-config-types.d.ts.map +1 -1
- package/dist/lifecycle/worker-output-contract.d.ts +9 -15
- package/dist/lifecycle/worker-output-contract.d.ts.map +1 -1
- package/dist/lifecycle/worker-output-contract.js +45 -30
- package/dist/lifecycle/worker-output-contract.js.map +1 -1
- package/dist/providers/assemble-run-result.d.ts +3 -3
- package/dist/providers/assemble-run-result.d.ts.map +1 -1
- package/dist/providers/assemble-run-result.js +20 -9
- package/dist/providers/assemble-run-result.js.map +1 -1
- package/dist/providers/claude-session.d.ts.map +1 -1
- package/dist/providers/claude-session.js +1 -0
- package/dist/providers/claude-session.js.map +1 -1
- package/dist/providers/claude.js.map +1 -1
- package/dist/providers/codex-cli-launch.js +1 -1
- package/dist/providers/codex-cli-launch.js.map +1 -1
- package/dist/providers/codex-cli-session.d.ts +4 -1
- package/dist/providers/codex-cli-session.d.ts.map +1 -1
- package/dist/providers/codex-cli-session.js +73 -46
- package/dist/providers/codex-cli-session.js.map +1 -1
- package/dist/providers/codex.js.map +1 -1
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +1 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/normalize-claude.d.ts +2 -0
- package/dist/providers/normalize-claude.d.ts.map +1 -1
- package/dist/providers/normalize-claude.js +1 -0
- package/dist/providers/normalize-claude.js.map +1 -1
- package/dist/providers/run-annotator-turn.d.ts +24 -0
- package/dist/providers/run-annotator-turn.d.ts.map +1 -0
- package/dist/providers/run-annotator-turn.js +43 -0
- package/dist/providers/run-annotator-turn.js.map +1 -0
- package/dist/providers/run-worker-turn.d.ts +26 -0
- package/dist/providers/run-worker-turn.d.ts.map +1 -0
- package/dist/providers/run-worker-turn.js +58 -0
- package/dist/providers/run-worker-turn.js.map +1 -0
- package/dist/providers/runner-types.d.ts +1 -1
- package/dist/providers/runner-types.d.ts.map +1 -1
- package/dist/reporting/headline-composer.d.ts +3 -3
- package/dist/reporting/headline-composer.d.ts.map +1 -1
- package/dist/review/index.d.ts +4 -3
- package/dist/review/index.d.ts.map +1 -1
- package/dist/review/index.js +7 -4
- package/dist/review/index.js.map +1 -1
- package/dist/review/parse-review-report.d.ts +7 -1
- package/dist/review/parse-review-report.d.ts.map +1 -1
- package/dist/review/parse-review-report.js +13 -21
- package/dist/review/parse-review-report.js.map +1 -1
- package/dist/review/review-verdict-mapping.d.ts +3 -3
- package/dist/review/review-verdict-mapping.d.ts.map +1 -1
- package/dist/review/review-verdict-mapping.js +1 -1
- package/dist/review/review-verdict-mapping.js.map +1 -1
- package/dist/review/run-reviewer.d.ts +40 -0
- package/dist/review/run-reviewer.d.ts.map +1 -0
- package/dist/review/run-reviewer.js +54 -0
- package/dist/review/run-reviewer.js.map +1 -0
- package/dist/review/templates/quality-review.d.ts +5 -0
- package/dist/review/templates/quality-review.d.ts.map +1 -1
- package/dist/review/templates/quality-review.js +35 -25
- package/dist/review/templates/quality-review.js.map +1 -1
- package/dist/review/templates/spec-review.d.ts +6 -0
- package/dist/review/templates/spec-review.d.ts.map +1 -1
- package/dist/review/templates/spec-review.js +36 -8
- package/dist/review/templates/spec-review.js.map +1 -1
- package/dist/stores/batch-cache.d.ts +3 -3
- package/dist/stores/batch-cache.d.ts.map +1 -1
- package/dist/stores/batch-cache.js.map +1 -1
- package/dist/stores/batch-registry.d.ts +31 -0
- package/dist/stores/batch-registry.d.ts.map +1 -1
- package/dist/stores/batch-registry.js +12 -0
- package/dist/stores/batch-registry.js.map +1 -1
- package/dist/tools/debug/tool-config.js +1 -1
- package/dist/tools/debug/tool-config.js.map +1 -1
- package/dist/tools/delegate/tool-config.d.ts.map +1 -1
- package/dist/tools/delegate/tool-config.js +3 -1
- package/dist/tools/delegate/tool-config.js.map +1 -1
- package/dist/tools/execute-plan/tool-config.d.ts.map +1 -1
- package/dist/tools/execute-plan/tool-config.js +3 -1
- package/dist/tools/execute-plan/tool-config.js.map +1 -1
- package/dist/tools/investigate/tool-config.js +1 -1
- package/dist/tools/investigate/tool-config.js.map +1 -1
- package/dist/tools/retry/tool-config.js.map +1 -1
- package/dist/types/run-result.d.ts +164 -213
- package/dist/types/run-result.d.ts.map +1 -1
- package/dist/types/run-result.js +17 -0
- package/dist/types/run-result.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/lifecycle/handlers/derive-terminal-status.d.ts +0 -10
- package/dist/lifecycle/handlers/derive-terminal-status.d.ts.map +0 -1
- package/dist/lifecycle/handlers/derive-terminal-status.js +0 -35
- package/dist/lifecycle/handlers/derive-terminal-status.js.map +0 -1
- package/dist/lifecycle/handlers/files-written-cross-check.d.ts +0 -27
- package/dist/lifecycle/handlers/files-written-cross-check.d.ts.map +0 -1
- package/dist/lifecycle/handlers/files-written-cross-check.js +0 -91
- package/dist/lifecycle/handlers/files-written-cross-check.js.map +0 -1
- package/dist/lifecycle/handlers/verify-stage.d.ts +0 -37
- package/dist/lifecycle/handlers/verify-stage.d.ts.map +0 -1
- package/dist/lifecycle/handlers/verify-stage.js +0 -208
- package/dist/lifecycle/handlers/verify-stage.js.map +0 -1
- package/dist/review/default-engines.d.ts +0 -3
- package/dist/review/default-engines.d.ts.map +0 -1
- package/dist/review/default-engines.js +0 -22
- package/dist/review/default-engines.js.map +0 -1
- package/dist/review/reviewer-engine.d.ts +0 -53
- package/dist/review/reviewer-engine.d.ts.map +0 -1
- package/dist/review/reviewer-engine.js +0 -47
- package/dist/review/reviewer-engine.js.map +0 -1
- package/dist/review/reviewer-output-parser.d.ts +0 -12
- package/dist/review/reviewer-output-parser.d.ts.map +0 -1
- package/dist/review/reviewer-output-parser.js +0 -213
- package/dist/review/reviewer-output-parser.js.map +0 -1
- package/dist/review/reviewer-prompt-builder.d.ts +0 -21
- package/dist/review/reviewer-prompt-builder.d.ts.map +0 -1
- package/dist/review/reviewer-prompt-builder.js +0 -22
- package/dist/review/reviewer-prompt-builder.js.map +0 -1
- package/dist/review/templates/annotate-completion.d.ts +0 -12
- package/dist/review/templates/annotate-completion.d.ts.map +0 -1
- package/dist/review/templates/annotate-completion.js +0 -72
- package/dist/review/templates/annotate-completion.js.map +0 -1
|
@@ -1,60 +1,83 @@
|
|
|
1
1
|
import { DiffTracker } from '../diff-tracker.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Stage handler: row 2.5 — prepare_execution_context.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* this handler is a structural acknowledgment.
|
|
9
|
-
* - state.request: the rawRequest passed to dispatch. Used as a fallback
|
|
10
|
-
* to surface the tasks list when callers haven't supplied state.task.
|
|
5
|
+
* Seeding: populates state.task, state.reviewPolicy, state.diffTracker.
|
|
6
|
+
* This handler is the canonical "state was set up correctly" acknowledgment
|
|
7
|
+
* for downstream handlers that read from these slots.
|
|
11
8
|
*
|
|
12
|
-
*
|
|
13
|
-
* - state.task: the first TaskSpec from a delegate-style request payload.
|
|
14
|
-
* runTasks (in task-runner.ts) dispatches one StagePlan per TaskSpec,
|
|
15
|
-
* so state.task is the per-dispatch task. This handler surfaces task[0]
|
|
16
|
-
* as a fallback for downstream handlers that need a TaskSpec.
|
|
9
|
+
* §5.1 payload: null. Gate exists only for the per-stage telemetry slot.
|
|
17
10
|
*/
|
|
18
11
|
export async function prepareExecutionContextHandler(state) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
12
|
+
const t0 = Date.now();
|
|
13
|
+
try {
|
|
14
|
+
// Fallback: if rawRequest carries a TaskSpec[] and state.task is empty,
|
|
15
|
+
// surface the first task so per-task handlers have something to read.
|
|
16
|
+
if (!state.task) {
|
|
17
|
+
const req = state.request;
|
|
18
|
+
const first = req?.tasks?.[0];
|
|
19
|
+
if (first)
|
|
20
|
+
state.task = first;
|
|
21
|
+
}
|
|
22
|
+
// #45 Step 7e: per-task reviewPolicy lives on TaskSpec, not on rawRequest's
|
|
23
|
+
// top-level. Override state.reviewPolicy from state.task when present so
|
|
24
|
+
// the per-row runConditions (gating spec/quality/diff chains) see the
|
|
25
|
+
// right value.
|
|
26
|
+
const task = state.task;
|
|
27
|
+
if (task?.reviewPolicy) {
|
|
28
|
+
state.reviewPolicy = task.reviewPolicy;
|
|
29
|
+
}
|
|
30
|
+
// Tool sweep #6: snapshot the worker's declared filePaths BEFORE the
|
|
31
|
+
// implementer runs so reviewer stages can produce a cumulative diff
|
|
32
|
+
// against the pre-task baseline. Skip read-only routes (audit / review
|
|
33
|
+
// / verify / debug / investigate / explore) — they don't write files
|
|
34
|
+
// by sandbox policy, so a tracker would just be empty noise.
|
|
35
|
+
if (!state.diffTracker && task && state.toolCategory !== 'read_only') {
|
|
36
|
+
const cwd = task.cwd;
|
|
37
|
+
const filePaths = Array.isArray(task.filePaths) ? task.filePaths : [];
|
|
38
|
+
if (cwd && filePaths.length > 0) {
|
|
39
|
+
const tracker = new DiffTracker(cwd);
|
|
40
|
+
try {
|
|
41
|
+
await tracker.snapshot(filePaths);
|
|
42
|
+
state.diffTracker = tracker;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Snapshot failures (permission, unreadable) shouldn't block the
|
|
46
|
+
// task. Reviewer just sees an empty diff and falls back to the
|
|
47
|
+
// worker-output-only path — degraded but not broken.
|
|
48
|
+
}
|
|
56
49
|
}
|
|
57
50
|
}
|
|
51
|
+
return {
|
|
52
|
+
outcome: 'advance',
|
|
53
|
+
payload: null,
|
|
54
|
+
telemetry: {
|
|
55
|
+
stageLabel: 'prepare',
|
|
56
|
+
durationMs: Date.now() - t0,
|
|
57
|
+
costUSD: 0,
|
|
58
|
+
turnsUsed: 0,
|
|
59
|
+
stopReason: 'normal',
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
65
|
+
const comment = /brief schema|invalid brief/i.test(msg) ? `brief_invalid: ${msg}` :
|
|
66
|
+
/workspace|traversal|sandbox/i.test(msg) ? `workspace_violation: ${msg}` :
|
|
67
|
+
/context_block|missing/i.test(msg) ? `context_block_missing: ${msg}` :
|
|
68
|
+
`prepare_failed: ${msg}`;
|
|
69
|
+
return {
|
|
70
|
+
outcome: 'halt',
|
|
71
|
+
comment,
|
|
72
|
+
payload: null,
|
|
73
|
+
telemetry: {
|
|
74
|
+
stageLabel: 'prepare',
|
|
75
|
+
durationMs: Date.now() - t0,
|
|
76
|
+
costUSD: 0,
|
|
77
|
+
turnsUsed: 0,
|
|
78
|
+
stopReason: 'transport_error',
|
|
79
|
+
},
|
|
80
|
+
};
|
|
58
81
|
}
|
|
59
82
|
}
|
|
60
83
|
//# sourceMappingURL=prepare-execution-context-handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare-execution-context-handler.js","sourceRoot":"","sources":["../../../src/lifecycle/handlers/prepare-execution-context-handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prepare-execution-context-handler.js","sourceRoot":"","sources":["../../../src/lifecycle/handlers/prepare-execution-context-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import type { LifecycleState } from '../stage-plan-types.js';
|
|
2
|
-
|
|
2
|
+
import type { StageGate, RegisterBlockPayload } from '../stage-io.js';
|
|
3
|
+
export declare function registerToBlockStoreHandler(state: LifecycleState): Promise<StageGate<RegisterBlockPayload>>;
|
|
3
4
|
//# sourceMappingURL=register-context-block-handlers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-context-block-handlers.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/handlers/register-context-block-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"register-context-block-handlers.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/handlers/register-context-block-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAItE,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,CAqCjH"}
|
|
@@ -1,18 +1,39 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const pc = state.projectContext;
|
|
1
|
+
const MAX_BYTES = 50 * 1024 * 1024;
|
|
2
|
+
export async function registerToBlockStoreHandler(state) {
|
|
3
|
+
const t0 = Date.now();
|
|
5
4
|
const req = state.request;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
const bytes = Buffer.byteLength(req?.content ?? '', 'utf-8');
|
|
6
|
+
if (bytes > MAX_BYTES) {
|
|
7
|
+
return {
|
|
8
|
+
outcome: 'halt',
|
|
9
|
+
comment: `payload_too_large: ${bytes} bytes`,
|
|
10
|
+
payload: { blockId: '', bytes },
|
|
11
|
+
telemetry: { stageLabel: 'register-block', durationMs: Date.now() - t0, costUSD: 0, turnsUsed: 0, stopReason: 'normal' },
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
// Existing API: pc.contextBlocks.register(content) → RegisteredBlock { id, ... }
|
|
16
|
+
// See packages/core/src/lifecycle/handlers/register-context-block-handlers.ts:13
|
|
17
|
+
// and packages/core/src/stores/context-block-tool.ts:23 for the interface.
|
|
18
|
+
const pc = state.projectContext;
|
|
19
|
+
const registered = pc.contextBlocks.register(req?.content ?? '');
|
|
20
|
+
// v4 back-compat: compose_response reads state.blockRegistration to detect
|
|
21
|
+
// the register-context-block route. v5 emits the same data via the gate's
|
|
22
|
+
// payload; we keep this state slot populated for the existing compose path.
|
|
23
|
+
state.blockRegistration = { id: registered.id, size: bytes, ttlMs: pc.contextBlocks.ttlMs };
|
|
24
|
+
return {
|
|
25
|
+
outcome: 'advance',
|
|
26
|
+
payload: { blockId: registered.id, bytes },
|
|
27
|
+
telemetry: { stageLabel: 'register-block', durationMs: Date.now() - t0, costUSD: 0, turnsUsed: 0, stopReason: 'normal' },
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
return {
|
|
32
|
+
outcome: 'halt',
|
|
33
|
+
comment: `store_write_failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
34
|
+
payload: { blockId: '', bytes },
|
|
35
|
+
telemetry: { stageLabel: 'register-block', durationMs: Date.now() - t0, costUSD: 0, turnsUsed: 0, stopReason: 'transport_error' },
|
|
36
|
+
};
|
|
10
37
|
}
|
|
11
|
-
const registered = pc.contextBlocks.register(req.content);
|
|
12
|
-
state.blockRegistration = {
|
|
13
|
-
id: registered.id,
|
|
14
|
-
size: Buffer.byteLength(req.content, 'utf8'),
|
|
15
|
-
ttlMs: pc.contextBlocks.ttlMs,
|
|
16
|
-
};
|
|
17
38
|
}
|
|
18
39
|
//# sourceMappingURL=register-context-block-handlers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-context-block-handlers.js","sourceRoot":"","sources":["../../../src/lifecycle/handlers/register-context-block-handlers.ts"],"names":[],"mappings":"AAGA,MAAM,
|
|
1
|
+
{"version":3,"file":"register-context-block-handlers.js","sourceRoot":"","sources":["../../../src/lifecycle/handlers/register-context-block-handlers.ts"],"names":[],"mappings":"AAGA,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnC,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,KAAqB;IACrE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,GAAG,GAAG,KAAK,CAAC,OAA0C,CAAC;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;IAE7D,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,sBAAsB,KAAK,QAAQ;YAC5C,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE;YAC/B,SAAS,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;SACzH,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,iFAAiF;QACjF,iFAAiF;QACjF,2EAA2E;QAC3E,MAAM,EAAE,GAAG,KAAK,CAAC,cAAqB,CAAC;QACvC,MAAM,UAAU,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;QACjE,2EAA2E;QAC3E,0EAA0E;QAC1E,4EAA4E;QAC3E,KAAa,CAAC,iBAAiB,GAAG,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QACrG,OAAO;YACL,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE;YAC1C,SAAS,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;SACzH,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YAClF,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE;YAC/B,SAAS,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,iBAAiB,EAAE;SAClI,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import type { LifecycleState } from '../stage-plan-types.js';
|
|
2
|
-
|
|
2
|
+
import type { StageGate, ReviewPayload } from '../stage-io.js';
|
|
3
|
+
export declare function reviewHandler(state: LifecycleState): Promise<StageGate<ReviewPayload>>;
|
|
3
4
|
//# sourceMappingURL=review-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-handler.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/handlers/review-handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"review-handler.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/handlers/review-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAW,MAAM,gBAAgB,CAAC;AAQxE,wBAAsB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAiJ5F"}
|
|
@@ -1,169 +1,167 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
// One complex session, two sequential turns: spec review, then quality
|
|
4
|
-
// review. Same session = same cached prefix on the 2nd turn. Combined
|
|
5
|
-
// verdict is `approved` only if BOTH reviewers approve; otherwise
|
|
6
|
-
// `changes_required`. Combined `reviewConcerns` is the concat of both
|
|
7
|
-
// reviewers' concerns.
|
|
8
|
-
import { specLintTemplate } from '../../review/templates/spec-review.js';
|
|
9
|
-
import { qualityLintTemplate } from '../../review/templates/quality-review.js';
|
|
1
|
+
import { specReviewPrompt } from '../../review/templates/spec-review.js';
|
|
2
|
+
import { qualityReviewPrompt } from '../../review/templates/quality-review.js';
|
|
10
3
|
import { parseReviewReport } from '../../review/parse-review-report.js';
|
|
4
|
+
import { runReviewerTurn, invertedReviewerTier } from '../../review/run-reviewer.js';
|
|
11
5
|
import { mergeStageStats } from '../merge-stage-stats.js';
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
6
|
+
export async function reviewHandler(state) {
|
|
7
|
+
const t0 = Date.now();
|
|
8
|
+
const policy = state.reviewPolicy; // 'full' | 'quality_only' | 'diff_only' | 'none'
|
|
9
|
+
// v5 review-policy mapping (per spec §14 assumption 2 — adapted to v4 enum):
|
|
10
|
+
// 'full' → run BOTH spec + quality
|
|
11
|
+
// 'quality_only' → run ONLY quality
|
|
12
|
+
// 'diff_only' → run ONLY spec (spec reviewer is the closest analog)
|
|
13
|
+
// 'none' → skip (handled upstream)
|
|
14
|
+
const runSpec = policy === 'full' || policy === 'diff_only';
|
|
15
|
+
const runQuality = policy === 'full' || policy === 'quality_only';
|
|
16
|
+
const impl = (state.gates?.['implement']?.payload ?? {});
|
|
17
|
+
const briefObj = (state.task ?? {});
|
|
18
|
+
const briefStr = briefObj.brief ?? '';
|
|
19
|
+
const context = {
|
|
20
|
+
brief: briefStr,
|
|
21
|
+
workerSummary: (impl?.summary ?? ""),
|
|
22
|
+
filesChanged: impl.filesChanged ?? [],
|
|
21
23
|
};
|
|
22
|
-
|
|
23
|
-
//
|
|
24
|
-
// the
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
24
|
+
const subResults = [];
|
|
25
|
+
// Cross-tier inversion (per design): reviewer runs on the opposite tier of
|
|
26
|
+
// the implementer. Read implementer tier from the executionContext; fall
|
|
27
|
+
// back to inferring from the implementing stage's gate payload, then
|
|
28
|
+
// 'standard' if neither is known (defensive — matches legacy default).
|
|
29
|
+
const implementerTier = state.executionContext?.assignedTier
|
|
30
|
+
?? (state.gates?.['implement']?.payload?.agentTier)
|
|
31
|
+
?? 'standard';
|
|
32
|
+
const resolvedReviewerTier = invertedReviewerTier(implementerTier);
|
|
33
|
+
if (runSpec) {
|
|
34
|
+
const r = await runReviewerWithRetries(state, specReviewPrompt(context), 'spec', implementerTier);
|
|
35
|
+
subResults.push({
|
|
36
|
+
name: 'spec', result: r.parsed, cost: r.costUSD, ms: r.ms,
|
|
37
|
+
model: r.model,
|
|
38
|
+
inputTokens: r.inputTokens, outputTokens: r.outputTokens,
|
|
39
|
+
cachedReadTokens: r.cachedReadTokens, cachedNonReadTokens: r.cachedNonReadTokens,
|
|
40
|
+
turnsUsed: r.turnsUsed,
|
|
41
|
+
});
|
|
36
42
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (!ctx || !task || !last)
|
|
47
|
-
return;
|
|
48
|
-
if (state.reviewPolicy === 'none') {
|
|
49
|
-
state.reviewVerdict = 'approved';
|
|
50
|
-
state.reviewFindings = [];
|
|
51
|
-
return;
|
|
43
|
+
if (runQuality) {
|
|
44
|
+
const r = await runReviewerWithRetries(state, qualityReviewPrompt(context), 'quality', implementerTier);
|
|
45
|
+
subResults.push({
|
|
46
|
+
name: 'quality', result: r.parsed, cost: r.costUSD, ms: r.ms,
|
|
47
|
+
model: r.model,
|
|
48
|
+
inputTokens: r.inputTokens, outputTokens: r.outputTokens,
|
|
49
|
+
cachedReadTokens: r.cachedReadTokens, cachedNonReadTokens: r.cachedNonReadTokens,
|
|
50
|
+
turnsUsed: r.turnsUsed,
|
|
51
|
+
});
|
|
52
52
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
const succeeded = subResults.filter(s => s.result.verdict).map(s => s.name);
|
|
54
|
+
const errored = subResults.filter(s => !s.result.verdict).map(s => ({
|
|
55
|
+
reviewer: s.name, error: s.result.parseError ?? 'unknown',
|
|
56
|
+
}));
|
|
57
|
+
const findings = [];
|
|
58
|
+
let nextId = 1;
|
|
59
|
+
for (const s of subResults) {
|
|
60
|
+
for (const f of s.result.findings ?? []) {
|
|
61
|
+
findings.push({ ...f, id: `F${nextId++}`, source: 'reviewer' });
|
|
57
62
|
}
|
|
58
|
-
catch { /* tolerated */ }
|
|
59
|
-
}
|
|
60
|
-
const workerOutput = last.output ?? '';
|
|
61
|
-
// v4.4.x: spec and quality run sequentially on the SAME complex
|
|
62
|
-
// session so the second call benefits from the cached prefix.
|
|
63
|
-
const reviewerTier = ctx.assignedTier === 'standard' ? 'complex' : 'standard';
|
|
64
|
-
if (!ctx.providers[reviewerTier]) {
|
|
65
|
-
state.reviewVerdict = 'changes_required';
|
|
66
|
-
state.reviewError = `no provider available for tier ${reviewerTier}`;
|
|
67
|
-
state.reviewFindings = [];
|
|
68
|
-
return;
|
|
69
63
|
}
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
if (sources.length === 0) {
|
|
81
|
-
state.reviewVerdict = 'approved';
|
|
82
|
-
state.reviewFindings = [];
|
|
83
|
-
return;
|
|
64
|
+
// Combined verdict: approved iff EVERY configured reviewer returned approved.
|
|
65
|
+
let verdict;
|
|
66
|
+
if (succeeded.length === 0) {
|
|
67
|
+
verdict = 'changes_required';
|
|
68
|
+
findings.push({
|
|
69
|
+
id: `F${nextId++}`, severity: 'high', category: 'reviewer-availability',
|
|
70
|
+
claim: 'All configured reviewers failed to parse their output; defaulting to changes_required.',
|
|
71
|
+
evidence: errored.map(e => `${e.reviewer}: ${e.error}`).join(' | '),
|
|
72
|
+
source: 'reviewer',
|
|
73
|
+
});
|
|
84
74
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
let anyChangesRequired = false;
|
|
88
|
-
let anySuccess = false;
|
|
89
|
-
// Sequential — second turn hits the cached prefix on the same session.
|
|
90
|
-
// The warm-follow-up form is valid ONLY when iteration > 0 AND the
|
|
91
|
-
// session reference is the same as iteration 0. Today ctx.getSession
|
|
92
|
-
// is idempotent on tier so both iterations see the same session; the
|
|
93
|
-
// identity guard exists so a future change that rotates the reviewer
|
|
94
|
-
// session mid-stage (escalation rotation, retry-after-failure) falls
|
|
95
|
-
// back to cold-open automatically rather than sending a warm follow-up
|
|
96
|
-
// into a fresh thread that lacks the prior history.
|
|
97
|
-
const settled = [];
|
|
98
|
-
let firstSession = null;
|
|
99
|
-
for (let iteration = 0; iteration < sources.length; iteration++) {
|
|
100
|
-
const source = sources[iteration];
|
|
101
|
-
const currentSession = ctx.getSession(reviewerTier);
|
|
102
|
-
if (iteration === 0)
|
|
103
|
-
firstSession = currentSession;
|
|
104
|
-
const isWarmFollowup = iteration > 0 && currentSession === firstSession;
|
|
105
|
-
const outcome = await runOneReviewer(currentSession, task, source, cumulativeDiff, workerOutput, isWarmFollowup);
|
|
106
|
-
settled.push({ source, outcome });
|
|
75
|
+
else if (subResults.some(s => s.result.verdict === 'changes_required')) {
|
|
76
|
+
verdict = 'changes_required';
|
|
107
77
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
errors.push(`${source}: ${outcome.transportError}`);
|
|
119
|
-
process.stderr.write(`[review-handler] ${source} transportError: ${outcome.transportError}\n`);
|
|
120
|
-
continue;
|
|
78
|
+
else if (errored.length > 0) {
|
|
79
|
+
// Mixed: some approved, some errored.
|
|
80
|
+
verdict = 'changes_required';
|
|
81
|
+
for (const e of errored) {
|
|
82
|
+
findings.push({
|
|
83
|
+
id: `F${nextId++}`, severity: 'high', category: 'reviewer-availability',
|
|
84
|
+
claim: `Reviewer ${e.reviewer} failed to parse; treating as changes_required.`,
|
|
85
|
+
evidence: e.error.length >= 20 ? e.error : `parse error: ${e.error}`,
|
|
86
|
+
source: 'reviewer',
|
|
87
|
+
});
|
|
121
88
|
}
|
|
122
|
-
anySuccess = true;
|
|
123
|
-
const parsed = parseReviewReport(outcome.turn.output ?? '');
|
|
124
|
-
if (source === 'spec') {
|
|
125
|
-
state.specReviewerNotes = outcome.turn.output;
|
|
126
|
-
state.specReviewVerdict = parsed.verdict;
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
state.qualityReviewerNotes = outcome.turn.output;
|
|
130
|
-
state.qualityReviewVerdict = parsed.verdict;
|
|
131
|
-
}
|
|
132
|
-
if (parsed.verdict === 'changes_required')
|
|
133
|
-
anyChangesRequired = true;
|
|
134
|
-
for (const dev of parsed.deviations)
|
|
135
|
-
findings.push({ source, text: dev });
|
|
136
|
-
combinedInput += outcome.turn.usage?.inputTokens ?? 0;
|
|
137
|
-
combinedOutput += outcome.turn.usage?.outputTokens ?? 0;
|
|
138
|
-
combinedCached += outcome.turn.usage?.cachedReadTokens ?? 0;
|
|
139
|
-
combinedNonRead += outcome.turn.usage?.cachedNonReadTokens ?? 0;
|
|
140
|
-
combinedTurns += outcome.turn.turns ?? 1;
|
|
141
|
-
combinedDuration += outcome.turn.durationMs ?? 0;
|
|
142
|
-
const c = outcome.turn.costUSD;
|
|
143
|
-
if (c !== null && c !== undefined)
|
|
144
|
-
combinedCost = (combinedCost ?? 0) + c;
|
|
145
89
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
if (!anySuccess) {
|
|
149
|
-
state.reviewVerdict = 'changes_required';
|
|
150
|
-
state.reviewError = errors.join(' | ');
|
|
151
|
-
return;
|
|
90
|
+
else {
|
|
91
|
+
verdict = 'approved';
|
|
152
92
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
93
|
+
const totalCost = subResults.reduce((s, x) => s + (x.cost ?? 0), 0);
|
|
94
|
+
const totalMs = subResults.reduce((s, x) => s + x.ms, 0);
|
|
95
|
+
const totalInput = subResults.reduce((s, x) => s + x.inputTokens, 0);
|
|
96
|
+
const totalOutput = subResults.reduce((s, x) => s + x.outputTokens, 0);
|
|
97
|
+
const totalCachedRead = subResults.reduce((s, x) => s + x.cachedReadTokens, 0);
|
|
98
|
+
const totalCachedNonRead = subResults.reduce((s, x) => s + x.cachedNonReadTokens, 0);
|
|
99
|
+
const totalTurns = subResults.reduce((s, x) => s + x.turnsUsed, 0);
|
|
100
|
+
// Both reviewers run on the standard tier through the same Session — same
|
|
101
|
+
// canonical model in practice. Pick the first non-null.
|
|
102
|
+
const reviewerModel = subResults.find(s => s.model !== null)?.model ?? null;
|
|
103
|
+
// Write reviewer stage stats so event-builder.buildReviewStage(rr.stageStats?.review)
|
|
104
|
+
// produces a real stage entry instead of returning null. Without this, the
|
|
105
|
+
// review stage was silently invisible in telemetry for reviewPolicy=full runs.
|
|
106
|
+
if (subResults.length > 0) {
|
|
107
|
+
mergeStageStats(state, 'review', {
|
|
108
|
+
inputTokens: totalInput,
|
|
109
|
+
outputTokens: totalOutput,
|
|
110
|
+
cachedReadTokens: totalCachedRead,
|
|
111
|
+
cachedNonReadTokens: totalCachedNonRead,
|
|
112
|
+
turnCount: totalTurns,
|
|
113
|
+
toolCallCount: 0,
|
|
114
|
+
costUSD: totalCost,
|
|
115
|
+
durationMs: Math.max(totalMs, Date.now() - t0),
|
|
116
|
+
filesReadCount: 0,
|
|
117
|
+
filesWrittenCount: 0,
|
|
118
|
+
}, { tier: resolvedReviewerTier, model: reviewerModel });
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
outcome: 'advance',
|
|
122
|
+
payload: { verdict, findings, reviewersSucceeded: succeeded, reviewersErrored: errored },
|
|
123
|
+
telemetry: {
|
|
124
|
+
stageLabel: 'review',
|
|
125
|
+
durationMs: Math.max(totalMs, Date.now() - t0),
|
|
126
|
+
costUSD: totalCost > 0 ? totalCost : null,
|
|
127
|
+
turnsUsed: subResults.length,
|
|
128
|
+
stopReason: 'normal',
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
async function runReviewerWithRetries(state, prompt, name, implementerTier) {
|
|
133
|
+
const turn = await runReviewerTurn({
|
|
134
|
+
prompt,
|
|
135
|
+
ctx: state.executionContext,
|
|
136
|
+
reviewer: name,
|
|
137
|
+
implementerTier,
|
|
167
138
|
});
|
|
139
|
+
if (turn.kind === 'transport_error') {
|
|
140
|
+
// Final failure surfaces as a parse-failure shape so the aggregator treats
|
|
141
|
+
// this reviewer as errored — same downstream effect as an unparseable response.
|
|
142
|
+
return {
|
|
143
|
+
parsed: { verdict: undefined, findings: [], parseError: turn.message },
|
|
144
|
+
costUSD: null,
|
|
145
|
+
ms: turn.ms,
|
|
146
|
+
model: null,
|
|
147
|
+
inputTokens: 0,
|
|
148
|
+
outputTokens: 0,
|
|
149
|
+
cachedReadTokens: 0,
|
|
150
|
+
cachedNonReadTokens: 0,
|
|
151
|
+
turnsUsed: 0,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const parsed = parseReviewReport(turn.text);
|
|
155
|
+
return {
|
|
156
|
+
parsed,
|
|
157
|
+
costUSD: turn.costUSD,
|
|
158
|
+
ms: turn.ms,
|
|
159
|
+
model: turn.model,
|
|
160
|
+
inputTokens: turn.inputTokens,
|
|
161
|
+
outputTokens: turn.outputTokens,
|
|
162
|
+
cachedReadTokens: turn.cachedReadTokens,
|
|
163
|
+
cachedNonReadTokens: turn.cachedNonReadTokens,
|
|
164
|
+
turnsUsed: turn.turnsUsed,
|
|
165
|
+
};
|
|
168
166
|
}
|
|
169
167
|
//# sourceMappingURL=review-handler.js.map
|