@zhixuan92/multi-model-agent-core 3.8.0 → 3.8.1
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/executors/_shared/findings-schema.d.ts +61 -21
- package/dist/executors/_shared/findings-schema.d.ts.map +1 -1
- package/dist/executors/_shared/findings-schema.js +27 -15
- package/dist/executors/_shared/findings-schema.js.map +1 -1
- package/dist/executors/investigate.d.ts.map +1 -1
- package/dist/executors/investigate.js +2 -1
- package/dist/executors/investigate.js.map +1 -1
- package/dist/intake/resolve.d.ts.map +1 -1
- package/dist/intake/resolve.js +19 -5
- package/dist/intake/resolve.js.map +1 -1
- package/dist/observability/events.d.ts +10 -17
- package/dist/observability/events.d.ts.map +1 -1
- package/dist/observability/events.js +3 -8
- package/dist/observability/events.js.map +1 -1
- package/dist/review/aggregate-result.d.ts +1 -1
- package/dist/review/aggregate-result.d.ts.map +1 -1
- package/dist/review/aggregate-result.js.map +1 -1
- package/dist/review/quality-only-prompts.d.ts +11 -5
- package/dist/review/quality-only-prompts.d.ts.map +1 -1
- package/dist/review/quality-only-prompts.js +98 -51
- package/dist/review/quality-only-prompts.js.map +1 -1
- package/dist/review/quality-reviewer.d.ts +51 -10
- package/dist/review/quality-reviewer.d.ts.map +1 -1
- package/dist/review/quality-reviewer.js +157 -18
- package/dist/review/quality-reviewer.js.map +1 -1
- package/dist/run-tasks/index.d.ts +1 -0
- package/dist/run-tasks/index.d.ts.map +1 -1
- package/dist/run-tasks/reviewed-lifecycle.d.ts +1 -0
- package/dist/run-tasks/reviewed-lifecycle.d.ts.map +1 -1
- package/dist/run-tasks/reviewed-lifecycle.js +81 -91
- package/dist/run-tasks/reviewed-lifecycle.js.map +1 -1
- package/dist/tool-schemas/audit.d.ts +2 -0
- package/dist/tool-schemas/audit.d.ts.map +1 -1
- package/dist/tool-schemas/debug.d.ts +2 -0
- package/dist/tool-schemas/debug.d.ts.map +1 -1
- package/dist/tool-schemas/delegate.d.ts +2 -0
- package/dist/tool-schemas/delegate.d.ts.map +1 -1
- package/dist/tool-schemas/execute-plan.d.ts +2 -0
- package/dist/tool-schemas/execute-plan.d.ts.map +1 -1
- package/dist/tool-schemas/investigate.d.ts +2 -0
- package/dist/tool-schemas/investigate.d.ts.map +1 -1
- package/dist/tool-schemas/retry.d.ts +2 -0
- package/dist/tool-schemas/retry.d.ts.map +1 -1
- package/dist/tool-schemas/review.d.ts +2 -0
- package/dist/tool-schemas/review.d.ts.map +1 -1
- package/dist/tool-schemas/shared-output.d.ts +2 -0
- package/dist/tool-schemas/shared-output.d.ts.map +1 -1
- package/dist/tool-schemas/shared-output.js +1 -1
- package/dist/tool-schemas/shared-output.js.map +1 -1
- package/dist/tool-schemas/verify.d.ts +2 -0
- package/dist/tool-schemas/verify.d.ts.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,108 +1,155 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Quality-only review prompts for the 5 read-only mma-* routes.
|
|
2
|
+
* Quality-only review prompts for the 5 read-only mma-* routes (3.8.1+).
|
|
3
3
|
*
|
|
4
|
-
* Each prompt asks the reviewer:
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Each prompt asks the reviewer to ANNOTATE every worker finding with:
|
|
5
|
+
* - reviewerConfidence: integer 0–100, how confident YOU (reviewer) are that
|
|
6
|
+
* this finding is correct, on-brief, and well-grounded in the evidence.
|
|
7
|
+
* - reviewerSeverity (optional): only set when you disagree with the worker's
|
|
8
|
+
* severity. Workers tend to inflate; use this to dial down.
|
|
7
9
|
*
|
|
8
|
-
*
|
|
10
|
+
* The reviewer returns a single ```json fenced block containing a JSON array
|
|
11
|
+
* of {id, reviewerConfidence, reviewerSeverity?} objects, one per worker
|
|
12
|
+
* finding (matched by id). NO verdict, NO gate, NO rework signal.
|
|
9
13
|
*/
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
const RUBRIC = `
|
|
15
|
+
## How to score \`reviewerConfidence\` (integer 0-100)
|
|
16
|
+
|
|
17
|
+
You are scoring whether YOU would defend this finding if pushed. Not severity.
|
|
18
|
+
Not the worker's self-confidence.
|
|
19
|
+
|
|
20
|
+
80-100: evidence directly supports the claim, on-brief, defend without hesitation
|
|
21
|
+
60-79: evidence supports claim with minor gaps, on-brief, plausible
|
|
22
|
+
40-59: claim plausible but evidence thin, partial, or requires inference
|
|
23
|
+
20-39: claim weak, evidence does not back it up, OR off-brief
|
|
24
|
+
0-19: unsupported, contradicted, fabricated, OR completely off-brief
|
|
25
|
+
|
|
26
|
+
## How to use \`reviewerSeverity\` (optional)
|
|
27
|
+
|
|
28
|
+
Only set when you DISAGREE with the worker's \`severity\`. Workers tend to
|
|
29
|
+
inflate ("everything is high"); use \`reviewerSeverity\` to dial down. Omit
|
|
30
|
+
when you agree.
|
|
31
|
+
|
|
32
|
+
## Output format (REQUIRED)
|
|
33
|
+
|
|
34
|
+
Respond with exactly one fenced JSON code block. The block must contain a
|
|
35
|
+
JSON array of objects, one entry per worker finding (matched by \`id\`). Example:
|
|
15
36
|
|
|
16
|
-
|
|
37
|
+
\`\`\`json
|
|
38
|
+
[
|
|
39
|
+
{ "id": "F1", "reviewerConfidence": 85 },
|
|
40
|
+
{ "id": "F2", "reviewerConfidence": 35, "reviewerSeverity": "low" },
|
|
41
|
+
{ "id": "F3", "reviewerConfidence": 70 }
|
|
42
|
+
]
|
|
43
|
+
\`\`\`
|
|
44
|
+
|
|
45
|
+
Every worker finding id must appear exactly once. No extra ids. No missing
|
|
46
|
+
ids. Surrounding prose is allowed but ignored by the parser.
|
|
17
47
|
`.trim();
|
|
48
|
+
function renderFindings(findings) {
|
|
49
|
+
return JSON.stringify(findings, null, 2);
|
|
50
|
+
}
|
|
18
51
|
export function buildAuditQualityPrompt(ctx) {
|
|
19
|
-
return
|
|
52
|
+
return `You are reviewing an audit produced by a worker.
|
|
20
53
|
|
|
21
54
|
The user requested an audit. The brief was:
|
|
22
55
|
|
|
23
56
|
${ctx.brief}
|
|
24
57
|
|
|
25
|
-
|
|
26
|
-
(a) Is it of the requested audit type? (e.g., security audit -> security finding, not style nit)
|
|
27
|
-
(b) Re-read the cited file at \`findings[].file\` (the audit target document) at the given \`findings[].line\`. Is the worker's claim true about that text?
|
|
58
|
+
## On-brief check (per finding)
|
|
28
59
|
|
|
29
|
-
|
|
60
|
+
For each worker finding, ask: is this the kind of issue the audit asked for?
|
|
61
|
+
A security audit should produce security findings, not style nits.
|
|
30
62
|
|
|
31
|
-
|
|
63
|
+
## Worker findings to annotate
|
|
32
64
|
|
|
33
|
-
|
|
34
|
-
${ctx.
|
|
65
|
+
\`\`\`json
|
|
66
|
+
${renderFindings(ctx.workerFindings)}
|
|
67
|
+
\`\`\`
|
|
68
|
+
|
|
69
|
+
${RUBRIC}`;
|
|
35
70
|
}
|
|
36
71
|
export function buildReviewQualityPrompt(ctx) {
|
|
37
|
-
return
|
|
72
|
+
return `You are reviewing a code review produced by a worker.
|
|
38
73
|
|
|
39
74
|
The user requested a code review. The brief was:
|
|
40
75
|
|
|
41
76
|
${ctx.brief}
|
|
42
77
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
78
|
+
## On-brief check (per finding)
|
|
79
|
+
|
|
80
|
+
For each worker finding, ask: is this within the requested focus area?
|
|
81
|
+
A security review should produce security findings, not formatting nits.
|
|
46
82
|
|
|
47
|
-
|
|
83
|
+
## Worker findings to annotate
|
|
48
84
|
|
|
49
|
-
|
|
85
|
+
\`\`\`json
|
|
86
|
+
${renderFindings(ctx.workerFindings)}
|
|
87
|
+
\`\`\`
|
|
50
88
|
|
|
51
|
-
|
|
52
|
-
${ctx.workerOutput}`;
|
|
89
|
+
${RUBRIC}`;
|
|
53
90
|
}
|
|
54
91
|
export function buildVerifyQualityPrompt(ctx) {
|
|
55
|
-
return
|
|
92
|
+
return `You are reviewing a verification report produced by a worker.
|
|
56
93
|
|
|
57
94
|
The user provided a checklist of acceptance criteria. The brief was:
|
|
58
95
|
|
|
59
96
|
${ctx.brief}
|
|
60
97
|
|
|
61
|
-
|
|
62
|
-
(a) Does the finding correspond to a real checklist item from the brief?
|
|
63
|
-
(b) Re-read the cited evidence in \`findings[].file\` and \`findings[].sourceQuote\` (when present). Does the cited evidence actually demonstrate the worker's claim about that checklist item?
|
|
98
|
+
## On-brief check (per finding)
|
|
64
99
|
|
|
65
|
-
|
|
100
|
+
Each finding should map to one checklist item with evidence the criterion was
|
|
101
|
+
met or unmet. Flag findings that don't correspond to any checklist item, or
|
|
102
|
+
whose evidence doesn't actually demonstrate the claimed pass/fail status.
|
|
66
103
|
|
|
67
|
-
|
|
104
|
+
## Worker findings to annotate
|
|
68
105
|
|
|
69
|
-
|
|
70
|
-
${ctx.
|
|
106
|
+
\`\`\`json
|
|
107
|
+
${renderFindings(ctx.workerFindings)}
|
|
108
|
+
\`\`\`
|
|
109
|
+
|
|
110
|
+
${RUBRIC}`;
|
|
71
111
|
}
|
|
72
112
|
export function buildInvestigateQualityPrompt(ctx) {
|
|
73
|
-
return
|
|
113
|
+
return `You are reviewing a codebase investigation produced by a worker.
|
|
74
114
|
|
|
75
115
|
The user asked a question. The brief was:
|
|
76
116
|
|
|
77
117
|
${ctx.brief}
|
|
78
118
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
119
|
+
## On-brief check (per finding)
|
|
120
|
+
|
|
121
|
+
Each finding should be relevant to the question. Findings may be code-level
|
|
122
|
+
(file:line cited in evidence) or project-level synthesis (what was searched,
|
|
123
|
+
what was not found). Flag findings whose evidence does not support the claim
|
|
124
|
+
or whose claim drifts from the question.
|
|
82
125
|
|
|
83
|
-
|
|
126
|
+
## Worker findings to annotate
|
|
84
127
|
|
|
85
|
-
|
|
128
|
+
\`\`\`json
|
|
129
|
+
${renderFindings(ctx.workerFindings)}
|
|
130
|
+
\`\`\`
|
|
86
131
|
|
|
87
|
-
|
|
88
|
-
${ctx.workerOutput}`;
|
|
132
|
+
${RUBRIC}`;
|
|
89
133
|
}
|
|
90
134
|
export function buildDebugQualityPrompt(ctx) {
|
|
91
|
-
return
|
|
135
|
+
return `You are reviewing a debugging hypothesis produced by a worker.
|
|
92
136
|
|
|
93
137
|
The user reported a failure. The brief was:
|
|
94
138
|
|
|
95
139
|
${ctx.brief}
|
|
96
140
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
141
|
+
## On-brief check (per finding)
|
|
142
|
+
|
|
143
|
+
Each finding should be a hypothesis, root-cause claim, or evidence
|
|
144
|
+
(reproducer, error pattern, code path). Flag findings that don't logically
|
|
145
|
+
follow from cited evidence or that exceed what the trace actually shows.
|
|
100
146
|
|
|
101
|
-
|
|
147
|
+
## Worker findings to annotate
|
|
102
148
|
|
|
103
|
-
|
|
149
|
+
\`\`\`json
|
|
150
|
+
${renderFindings(ctx.workerFindings)}
|
|
151
|
+
\`\`\`
|
|
104
152
|
|
|
105
|
-
|
|
106
|
-
${ctx.workerOutput}`;
|
|
153
|
+
${RUBRIC}`;
|
|
107
154
|
}
|
|
108
155
|
//# sourceMappingURL=quality-only-prompts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-only-prompts.js","sourceRoot":"","sources":["../../src/review/quality-only-prompts.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"quality-only-prompts.js","sourceRoot":"","sources":["../../src/review/quality-only-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAUH,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCd,CAAC,IAAI,EAAE,CAAC;AAET,SAAS,cAAc,CAAC,QAAyB;IAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAkB;IACxD,OAAO;;;;EAIP,GAAG,CAAC,KAAK;;;;;;;;;;EAUT,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC;;;EAGlC,MAAM,EAAE,CAAC;AACX,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,GAAkB;IACzD,OAAO;;;;EAIP,GAAG,CAAC,KAAK;;;;;;;;;;EAUT,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC;;;EAGlC,MAAM,EAAE,CAAC;AACX,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,GAAkB;IACzD,OAAO;;;;EAIP,GAAG,CAAC,KAAK;;;;;;;;;;;EAWT,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC;;;EAGlC,MAAM,EAAE,CAAC;AACX,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,GAAkB;IAC9D,OAAO;;;;EAIP,GAAG,CAAC,KAAK;;;;;;;;;;;;EAYT,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC;;;EAGlC,MAAM,EAAE,CAAC;AACX,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAkB;IACxD,OAAO;;;;EAIP,GAAG,CAAC,KAAK;;;;;;;;;;;EAWT,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC;;;EAGlC,MAAM,EAAE,CAAC;AACX,CAAC"}
|
|
@@ -1,20 +1,59 @@
|
|
|
1
1
|
import type { Provider } from '../types.js';
|
|
2
2
|
import type { ParsedStructuredReport } from '../reporting/structured-report.js';
|
|
3
|
-
import type
|
|
3
|
+
import { type WorkerFinding, type AnnotatedFinding } from '../executors/_shared/findings-schema.js';
|
|
4
|
+
/**
|
|
5
|
+
* Result of the read-only annotation review pass.
|
|
6
|
+
* - 'annotated' — reviewer ran, every worker finding has reviewerConfidence (and optionally reviewerSeverity).
|
|
7
|
+
* - 'error' — reviewer crashed, output unparseable, or id-set mismatch with worker.
|
|
8
|
+
* - 'skipped' — kill switch, no provider, or worker emitted no findings (nothing to annotate).
|
|
9
|
+
*
|
|
10
|
+
* The legacy gating-style fields (`findings: string[]`, `report: ParsedStructuredReport`) are kept
|
|
11
|
+
* on the result for the artifact-route path which still uses the gating model.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Unified quality-review result. The status discriminates which fields are
|
|
15
|
+
* meaningful; consumers read either `annotatedFindings` (annotation path) or
|
|
16
|
+
* `findings` + `report` (gating path).
|
|
17
|
+
*
|
|
18
|
+
* - 'annotated' — read-only annotation path; populated `annotatedFindings`.
|
|
19
|
+
* - 'approved' / 'changes_required' — artifact-route gating path; `findings` +
|
|
20
|
+
* `report` carry the gating signal.
|
|
21
|
+
* - 'error' / 'api_error' / 'network_error' / 'timeout' — review failed.
|
|
22
|
+
* - 'skipped' — kill switch, no provider, or worker emitted no findings.
|
|
23
|
+
*/
|
|
4
24
|
export interface QualityReviewResult {
|
|
5
|
-
status: 'approved' | 'changes_required' | 'error' | 'api_error' | 'network_error' | 'timeout';
|
|
25
|
+
status: 'approved' | 'changes_required' | 'annotated' | 'error' | 'api_error' | 'network_error' | 'timeout' | 'skipped';
|
|
26
|
+
annotatedFindings?: AnnotatedFinding[];
|
|
6
27
|
report?: ParsedStructuredReport;
|
|
7
28
|
findings: string[];
|
|
8
29
|
errorReason?: string;
|
|
9
30
|
reason?: string;
|
|
10
31
|
}
|
|
11
|
-
|
|
12
|
-
export type LegacyQualityReviewResult =
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
32
|
+
/** Backward-compat alias kept until reviewed-lifecycle is migrated to the new shape (Task 6). */
|
|
33
|
+
export type LegacyQualityReviewResult = QualityReviewResult;
|
|
34
|
+
/**
|
|
35
|
+
* Parse worker findings from the worker's raw output. Looks for a ```json block whose
|
|
36
|
+
* content is an array passing workerFindingsSchema. Returns null if absent or invalid.
|
|
37
|
+
*/
|
|
38
|
+
export declare function extractWorkerFindings(workerOutput: string): WorkerFinding[] | null;
|
|
39
|
+
interface AnnotationParseOk {
|
|
40
|
+
ok: true;
|
|
41
|
+
annotated: AnnotatedFinding[];
|
|
42
|
+
}
|
|
43
|
+
interface AnnotationParseErr {
|
|
44
|
+
ok: false;
|
|
45
|
+
reason: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Parse the reviewer's response, validate against the worker's findings,
|
|
49
|
+
* and merge to produce AnnotatedFinding[].
|
|
50
|
+
*
|
|
51
|
+
* Validation:
|
|
52
|
+
* - Reviewer output must contain exactly one ```json fenced block (we take the first).
|
|
53
|
+
* - Block content must be a JSON array passing annotationsArraySchema.
|
|
54
|
+
* - Annotation ids must be a permutation of worker ids: no missing, no duplicate, no extra.
|
|
55
|
+
*/
|
|
56
|
+
export declare function parseAndMergeAnnotations(reviewerOutput: string, workerFindings: WorkerFinding[]): AnnotationParseOk | AnnotationParseErr;
|
|
18
57
|
export declare function runQualityReview(reviewerProvider: Provider, packet: {
|
|
19
58
|
prompt: string;
|
|
20
59
|
scope: string[];
|
|
@@ -22,5 +61,7 @@ export declare function runQualityReview(reviewerProvider: Provider, packet: {
|
|
|
22
61
|
}, implReport: ParsedStructuredReport, fileContents: Record<string, string>, toolCallLog: string[], filesWritten: string[], evidenceBlock?: string, qualityReviewPromptBuilder?: (ctx: {
|
|
23
62
|
workerOutput: string;
|
|
24
63
|
brief: string;
|
|
25
|
-
|
|
64
|
+
workerFindings: WorkerFinding[];
|
|
65
|
+
}) => string, workerOutput?: string): Promise<QualityReviewResult>;
|
|
66
|
+
export {};
|
|
26
67
|
//# sourceMappingURL=quality-reviewer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-reviewer.d.ts","sourceRoot":"","sources":["../../src/review/quality-reviewer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"quality-reviewer.d.ts","sourceRoot":"","sources":["../../src/review/quality-reviewer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAEhF,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,yCAAyC,CAAC;AAEjD;;;;;;;;GAQG;AACH;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,eAAe,GAAG,SAAS,GAAG,SAAS,CAAC;IACxH,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,iGAAiG;AACjG,MAAM,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;AAkB5D;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,EAAE,GAAG,IAAI,CAalF;AAED,UAAU,iBAAiB;IACzB,EAAE,EAAE,IAAI,CAAC;IACT,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AACD,UAAU,kBAAkB;IAC1B,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,aAAa,EAAE,GAC9B,iBAAiB,GAAG,kBAAkB,CAiDxC;AAED,wBAAsB,gBAAgB,CACpC,gBAAgB,EAAE,QAAQ,EAC1B,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,EAClE,UAAU,EAAE,sBAAsB,EAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,MAAM,EAAE,EACtB,aAAa,CAAC,EAAE,MAAM,EACtB,0BAA0B,CAAC,EAAE,CAAC,GAAG,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,aAAa,EAAE,CAAA;CAAE,KAAK,MAAM,EACtH,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,mBAAmB,CAAC,CA8D9B"}
|
|
@@ -1,23 +1,116 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
1
2
|
import { delegateWithEscalation } from '../delegate-with-escalation.js';
|
|
2
3
|
import { buildQualityReviewPrompt } from './reviewer-prompt.js';
|
|
3
4
|
import { parseStructuredReport } from '../reporting/structured-report.js';
|
|
5
|
+
import { workerFindingsSchema, } from '../executors/_shared/findings-schema.js';
|
|
6
|
+
const annotationItemSchema = z.object({
|
|
7
|
+
id: z.string().min(1),
|
|
8
|
+
reviewerConfidence: z.number().int().min(0).max(100),
|
|
9
|
+
reviewerSeverity: z.enum(['high', 'medium', 'low']).optional(),
|
|
10
|
+
}).strict();
|
|
11
|
+
const annotationsArraySchema = z.array(annotationItemSchema);
|
|
12
|
+
/**
|
|
13
|
+
* Extract the first ```json fenced code block from a string, or `null` if none found.
|
|
14
|
+
*/
|
|
15
|
+
function extractJsonBlock(output) {
|
|
16
|
+
const match = output.match(/```json\s*\n([\s\S]*?)\n```/);
|
|
17
|
+
return match ? match[1] : null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parse worker findings from the worker's raw output. Looks for a ```json block whose
|
|
21
|
+
* content is an array passing workerFindingsSchema. Returns null if absent or invalid.
|
|
22
|
+
*/
|
|
23
|
+
export function extractWorkerFindings(workerOutput) {
|
|
24
|
+
// Try the first json block; if absent, also try matching multiple blocks for
|
|
25
|
+
// resilience against workers that emit example JSON before the real findings.
|
|
26
|
+
const blocks = [...workerOutput.matchAll(/```json\s*\n([\s\S]*?)\n```/g)].map(m => m[1]);
|
|
27
|
+
for (const raw of blocks) {
|
|
28
|
+
try {
|
|
29
|
+
const parsed = JSON.parse(raw);
|
|
30
|
+
if (!Array.isArray(parsed))
|
|
31
|
+
continue;
|
|
32
|
+
const validated = workerFindingsSchema.safeParse(parsed);
|
|
33
|
+
if (validated.success)
|
|
34
|
+
return validated.data;
|
|
35
|
+
}
|
|
36
|
+
catch { /* try next block */ }
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Parse the reviewer's response, validate against the worker's findings,
|
|
42
|
+
* and merge to produce AnnotatedFinding[].
|
|
43
|
+
*
|
|
44
|
+
* Validation:
|
|
45
|
+
* - Reviewer output must contain exactly one ```json fenced block (we take the first).
|
|
46
|
+
* - Block content must be a JSON array passing annotationsArraySchema.
|
|
47
|
+
* - Annotation ids must be a permutation of worker ids: no missing, no duplicate, no extra.
|
|
48
|
+
*/
|
|
49
|
+
export function parseAndMergeAnnotations(reviewerOutput, workerFindings) {
|
|
50
|
+
const block = extractJsonBlock(reviewerOutput);
|
|
51
|
+
if (block === null) {
|
|
52
|
+
return { ok: false, reason: 'reviewer output missing ```json fenced block' };
|
|
53
|
+
}
|
|
54
|
+
let parsed;
|
|
55
|
+
try {
|
|
56
|
+
parsed = JSON.parse(block);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
return { ok: false, reason: `reviewer JSON parse failed: ${err instanceof Error ? err.message : String(err)}` };
|
|
60
|
+
}
|
|
61
|
+
const validated = annotationsArraySchema.safeParse(parsed);
|
|
62
|
+
if (!validated.success) {
|
|
63
|
+
return { ok: false, reason: `annotation array validation failed: ${validated.error.message}` };
|
|
64
|
+
}
|
|
65
|
+
const annotations = validated.data;
|
|
66
|
+
const workerIds = new Set(workerFindings.map(f => f.id));
|
|
67
|
+
const reviewerIds = annotations.map(a => a.id);
|
|
68
|
+
const reviewerIdSet = new Set(reviewerIds);
|
|
69
|
+
if (reviewerIds.length !== reviewerIdSet.size) {
|
|
70
|
+
return { ok: false, reason: 'duplicate id in reviewer annotations' };
|
|
71
|
+
}
|
|
72
|
+
if (reviewerIdSet.size !== workerIds.size) {
|
|
73
|
+
return { ok: false, reason: `annotation count ${reviewerIdSet.size} does not match worker findings count ${workerIds.size}` };
|
|
74
|
+
}
|
|
75
|
+
for (const id of reviewerIdSet) {
|
|
76
|
+
if (!workerIds.has(id)) {
|
|
77
|
+
return { ok: false, reason: `reviewer annotated unknown id: ${id}` };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
for (const id of workerIds) {
|
|
81
|
+
if (!reviewerIdSet.has(id)) {
|
|
82
|
+
return { ok: false, reason: `reviewer missing annotation for worker id: ${id}` };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const byId = new Map(annotations.map(a => [a.id, a]));
|
|
86
|
+
const merged = workerFindings.map(wf => {
|
|
87
|
+
const ann = byId.get(wf.id);
|
|
88
|
+
const out = {
|
|
89
|
+
...wf,
|
|
90
|
+
reviewerConfidence: ann.reviewerConfidence,
|
|
91
|
+
};
|
|
92
|
+
if (ann.reviewerSeverity !== undefined)
|
|
93
|
+
out.reviewerSeverity = ann.reviewerSeverity;
|
|
94
|
+
return out;
|
|
95
|
+
});
|
|
96
|
+
return { ok: true, annotated: merged };
|
|
97
|
+
}
|
|
4
98
|
export async function runQualityReview(reviewerProvider, packet, implReport, fileContents, toolCallLog, filesWritten, evidenceBlock, qualityReviewPromptBuilder, workerOutput) {
|
|
5
|
-
|
|
99
|
+
// Read-only annotation path: triggered when caller passed a prompt builder
|
|
100
|
+
// (these are the per-route quality_only prompts in quality-only-prompts.ts).
|
|
101
|
+
if (qualityReviewPromptBuilder && workerOutput !== undefined) {
|
|
102
|
+
return runAnnotationReview(reviewerProvider, packet, workerOutput, qualityReviewPromptBuilder);
|
|
103
|
+
}
|
|
104
|
+
// Artifact-route gating path: unchanged from prior behavior.
|
|
105
|
+
if (filesWritten.length === 0) {
|
|
6
106
|
return { status: 'skipped', findings: [], errorReason: 'no files written by implementer' };
|
|
7
107
|
}
|
|
8
|
-
const corePrompt =
|
|
9
|
-
? qualityReviewPromptBuilder({ workerOutput, brief: packet.prompt })
|
|
10
|
-
: buildQualityReviewPrompt(packet, implReport, fileContents, toolCallLog);
|
|
108
|
+
const corePrompt = buildQualityReviewPrompt(packet, implReport, fileContents, toolCallLog);
|
|
11
109
|
const prompt = (evidenceBlock ? `${evidenceBlock}\n\n` : '') + corePrompt;
|
|
12
110
|
const reviewerSlot = reviewerProvider.name === 'standard' ? 'standard' : 'complex';
|
|
13
111
|
let result;
|
|
14
112
|
try {
|
|
15
|
-
result = await delegateWithEscalation({
|
|
16
|
-
prompt,
|
|
17
|
-
agentType: reviewerSlot,
|
|
18
|
-
briefQualityPolicy: 'off',
|
|
19
|
-
timeoutMs: 120_000,
|
|
20
|
-
}, [reviewerProvider], { explicitlyPinned: true });
|
|
113
|
+
result = await delegateWithEscalation({ prompt, agentType: reviewerSlot, briefQualityPolicy: 'off', timeoutMs: 120_000 }, [reviewerProvider], { explicitlyPinned: true });
|
|
21
114
|
}
|
|
22
115
|
catch (err) {
|
|
23
116
|
return { status: 'error', findings: [], errorReason: `review agent threw: ${err instanceof Error ? err.message : String(err)}` };
|
|
@@ -32,17 +125,13 @@ export async function runQualityReview(reviewerProvider, packet, implReport, fil
|
|
|
32
125
|
if (!report.summary) {
|
|
33
126
|
try {
|
|
34
127
|
const retryResult = await delegateWithEscalation({
|
|
35
|
-
prompt: prompt +
|
|
36
|
-
|
|
37
|
-
agentType: reviewerSlot,
|
|
38
|
-
briefQualityPolicy: 'off',
|
|
39
|
-
timeoutMs: 120_000,
|
|
128
|
+
prompt: prompt + '\n\nIMPORTANT: Your response MUST begin with a "## Summary" section containing either "approved" or "changes_required". Follow this exact format.',
|
|
129
|
+
agentType: reviewerSlot, briefQualityPolicy: 'off', timeoutMs: 120_000,
|
|
40
130
|
}, [reviewerProvider], { explicitlyPinned: true });
|
|
41
|
-
if (retryResult.status === 'ok')
|
|
131
|
+
if (retryResult.status === 'ok')
|
|
42
132
|
report = parseStructuredReport(retryResult.output);
|
|
43
|
-
}
|
|
44
133
|
}
|
|
45
|
-
catch { /* fall through
|
|
134
|
+
catch { /* fall through */ }
|
|
46
135
|
if (!report.summary) {
|
|
47
136
|
return { status: 'error', findings: [], errorReason: 'reviewer output missing ## Summary section (after retry)' };
|
|
48
137
|
}
|
|
@@ -57,4 +146,54 @@ export async function runQualityReview(reviewerProvider, packet, implReport, fil
|
|
|
57
146
|
}
|
|
58
147
|
return { status: 'approved', report, findings: [] };
|
|
59
148
|
}
|
|
149
|
+
async function runAnnotationReview(reviewerProvider, packet, workerOutput, qualityReviewPromptBuilder) {
|
|
150
|
+
// Step 1: extract worker findings from worker output.
|
|
151
|
+
const workerFindings = extractWorkerFindings(workerOutput);
|
|
152
|
+
if (workerFindings === null) {
|
|
153
|
+
return {
|
|
154
|
+
status: 'error',
|
|
155
|
+
findings: [],
|
|
156
|
+
errorReason: 'worker output missing or invalid findings[] JSON block',
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
// Step 2: short-circuit when worker found nothing — nothing to annotate.
|
|
160
|
+
if (workerFindings.length === 0) {
|
|
161
|
+
return {
|
|
162
|
+
status: 'annotated',
|
|
163
|
+
annotatedFindings: [],
|
|
164
|
+
findings: [],
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
// Step 3: build the route-specific prompt and call the reviewer.
|
|
168
|
+
const prompt = qualityReviewPromptBuilder({ workerOutput, brief: packet.prompt, workerFindings });
|
|
169
|
+
const reviewerSlot = reviewerProvider.name === 'standard' ? 'standard' : 'complex';
|
|
170
|
+
let result;
|
|
171
|
+
try {
|
|
172
|
+
result = await delegateWithEscalation({ prompt, agentType: reviewerSlot, briefQualityPolicy: 'off', timeoutMs: 120_000 }, [reviewerProvider], { explicitlyPinned: true });
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
return {
|
|
176
|
+
status: 'error',
|
|
177
|
+
findings: [],
|
|
178
|
+
errorReason: `review agent threw: ${err instanceof Error ? err.message : String(err)}`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
if (result.status !== 'ok') {
|
|
182
|
+
return {
|
|
183
|
+
status: 'error',
|
|
184
|
+
findings: [],
|
|
185
|
+
errorReason: `review agent returned status: ${result.status}`,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
// Step 4: parse + validate + merge annotations.
|
|
189
|
+
const merged = parseAndMergeAnnotations(result.output, workerFindings);
|
|
190
|
+
if (!merged.ok) {
|
|
191
|
+
return { status: 'error', findings: [], errorReason: merged.reason };
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
status: 'annotated',
|
|
195
|
+
annotatedFindings: merged.annotated,
|
|
196
|
+
findings: [],
|
|
197
|
+
};
|
|
198
|
+
}
|
|
60
199
|
//# sourceMappingURL=quality-reviewer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-reviewer.js","sourceRoot":"","sources":["../../src/review/quality-reviewer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"quality-reviewer.js","sourceRoot":"","sources":["../../src/review/quality-reviewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,6 +50,7 @@ export interface RunTasksOptions {
|
|
|
50
50
|
qualityReviewPromptBuilder?: (ctx: {
|
|
51
51
|
workerOutput: string;
|
|
52
52
|
brief: string;
|
|
53
|
+
workerFindings: import('../executors/_shared/findings-schema.js').WorkerFinding[];
|
|
53
54
|
}) => string;
|
|
54
55
|
}
|
|
55
56
|
export declare function runTasks(tasks: TaskSpec[], config: MultiModelConfig, options?: RunTasksOptions): Promise<RunResult[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/run-tasks/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,QAAQ,EACR,gBAAgB,EAGjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAUxD,MAAM,MAAM,wBAAwB,GAAG,CACrC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,aAAa,KACjB,IAAI,CAAC;AAEV,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACpD;;;;;OAKG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE;QACT,mBAAmB,EAAE,CAAC,GAAG,EAAE;YACzB,KAAK,EAAE,MAAM,CAAC;YACd,QAAQ,EAAE,QAAQ,CAAC;YACnB,SAAS,EAAE,SAAS,CAAC;YACrB,MAAM,EAAE,MAAM,CAAC;YACf,eAAe,EAAE,MAAM,CAAC;YACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;SAC5B,KAAK,IAAI,CAAC;KACZ,CAAC;IACF,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,+EAA+E;IAC/E,0BAA0B,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/run-tasks/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,QAAQ,EACR,gBAAgB,EAGjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAUxD,MAAM,MAAM,wBAAwB,GAAG,CACrC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,aAAa,KACjB,IAAI,CAAC;AAEV,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACpD;;;;;OAKG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE;QACT,mBAAmB,EAAE,CAAC,GAAG,EAAE;YACzB,KAAK,EAAE,MAAM,CAAC;YACd,QAAQ,EAAE,QAAQ,CAAC;YACnB,SAAS,EAAE,SAAS,CAAC;YACrB,MAAM,EAAE,MAAM,CAAC;YACf,eAAe,EAAE,MAAM,CAAC;YACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;SAC5B,KAAK,IAAI,CAAC;KACZ,CAAC;IACF,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,+EAA+E;IAC/E,0BAA0B,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,yCAAyC,EAAE,aAAa,EAAE,CAAA;KAAE,KAAK,MAAM,CAAC;CAC1K;AAED,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,QAAQ,EAAE,EACjB,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,SAAS,EAAE,CAAC,CAsHtB;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -36,5 +36,6 @@ export declare function executeReviewedLifecycle(task: TaskSpec, resolved: {
|
|
|
36
36
|
}, _route?: string, _client?: string, _triggeringSkill?: string, bus?: import('../observability/bus.js').EventBus, qualityReviewPromptBuilder?: (ctx: {
|
|
37
37
|
workerOutput: string;
|
|
38
38
|
brief: string;
|
|
39
|
+
workerFindings: import('../executors/_shared/findings-schema.js').WorkerFinding[];
|
|
39
40
|
}) => string): Promise<RunResult>;
|
|
40
41
|
//# sourceMappingURL=reviewed-lifecycle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reviewed-lifecycle.d.ts","sourceRoot":"","sources":["../../src/run-tasks/reviewed-lifecycle.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"reviewed-lifecycle.d.ts","sourceRoot":"","sources":["../../src/run-tasks/reviewed-lifecycle.ts"],"names":[],"mappings":"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"}
|