@zephyrdeng/pi-review 0.6.2 → 0.7.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 +126 -14
- package/README.zh-CN.md +79 -4
- package/dist/args.d.ts +8 -0
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +167 -28
- package/dist/args.js.map +1 -1
- package/dist/args.test.d.ts +2 -0
- package/dist/args.test.d.ts.map +1 -0
- package/dist/args.test.js +125 -0
- package/dist/args.test.js.map +1 -0
- package/dist/child-process.d.ts +3 -0
- package/dist/child-process.d.ts.map +1 -1
- package/dist/child-process.js +26 -0
- package/dist/child-process.js.map +1 -1
- package/dist/child-process.test.js +13 -0
- package/dist/child-process.test.js.map +1 -1
- package/dist/cli-exit.test.d.ts +2 -0
- package/dist/cli-exit.test.d.ts.map +1 -0
- package/dist/cli-exit.test.js +84 -0
- package/dist/cli-exit.test.js.map +1 -0
- package/dist/cli.js +16 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/extensions/review.d.ts +2 -0
- package/dist/extensions/review.js +22 -0
- package/dist/extensions/rv-prompts.d.ts +19 -0
- package/dist/extensions/rv-prompts.js +132 -0
- package/dist/index.d.ts +22 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -6
- package/dist/index.js.map +1 -1
- package/dist/json-events.d.ts +71 -0
- package/dist/json-events.d.ts.map +1 -1
- package/dist/json-events.js +250 -0
- package/dist/json-events.js.map +1 -1
- package/dist/json-events.test.js +217 -1
- package/dist/json-events.test.js.map +1 -1
- package/dist/loop.d.ts +36 -0
- package/dist/loop.d.ts.map +1 -0
- package/dist/loop.js +73 -0
- package/dist/loop.js.map +1 -0
- package/dist/loop.test.d.ts +2 -0
- package/dist/loop.test.d.ts.map +1 -0
- package/dist/loop.test.js +83 -0
- package/dist/loop.test.js.map +1 -0
- package/dist/matcher.d.ts +74 -0
- package/dist/matcher.d.ts.map +1 -0
- package/dist/matcher.js +202 -0
- package/dist/matcher.js.map +1 -0
- package/dist/matcher.test.d.ts +2 -0
- package/dist/matcher.test.d.ts.map +1 -0
- package/dist/matcher.test.js +161 -0
- package/dist/matcher.test.js.map +1 -0
- package/dist/meta-footer.d.ts +15 -1
- package/dist/meta-footer.d.ts.map +1 -1
- package/dist/meta-footer.js +108 -0
- package/dist/meta-footer.js.map +1 -1
- package/dist/meta-footer.test.js +43 -1
- package/dist/meta-footer.test.js.map +1 -1
- package/dist/panel-aggregate.d.ts +18 -0
- package/dist/panel-aggregate.d.ts.map +1 -0
- package/dist/panel-aggregate.js +247 -0
- package/dist/panel-aggregate.js.map +1 -0
- package/dist/panel-aggregate.test.d.ts +2 -0
- package/dist/panel-aggregate.test.d.ts.map +1 -0
- package/dist/panel-aggregate.test.js +461 -0
- package/dist/panel-aggregate.test.js.map +1 -0
- package/dist/panel-cancellation.test.d.ts +2 -0
- package/dist/panel-cancellation.test.d.ts.map +1 -0
- package/dist/panel-cancellation.test.js +24 -0
- package/dist/panel-cancellation.test.js.map +1 -0
- package/dist/panel-cli.test.d.ts +2 -0
- package/dist/panel-cli.test.d.ts.map +1 -0
- package/dist/panel-cli.test.js +239 -0
- package/dist/panel-cli.test.js.map +1 -0
- package/dist/panel-config.d.ts +19 -0
- package/dist/panel-config.d.ts.map +1 -0
- package/dist/panel-config.js +115 -0
- package/dist/panel-config.js.map +1 -0
- package/dist/panel-config.test.d.ts +2 -0
- package/dist/panel-config.test.d.ts.map +1 -0
- package/dist/panel-config.test.js +94 -0
- package/dist/panel-config.test.js.map +1 -0
- package/dist/panel-loop.test.d.ts +2 -0
- package/dist/panel-loop.test.d.ts.map +1 -0
- package/dist/panel-loop.test.js +118 -0
- package/dist/panel-loop.test.js.map +1 -0
- package/dist/panel-tools.test.d.ts +2 -0
- package/dist/panel-tools.test.d.ts.map +1 -0
- package/dist/panel-tools.test.js +12 -0
- package/dist/panel-tools.test.js.map +1 -0
- package/dist/panel-usage.d.ts +6 -0
- package/dist/panel-usage.d.ts.map +1 -0
- package/dist/panel-usage.js +21 -0
- package/dist/panel-usage.js.map +1 -0
- package/dist/panel-view.d.ts +41 -0
- package/dist/panel-view.d.ts.map +1 -0
- package/dist/panel-view.js +90 -0
- package/dist/panel-view.js.map +1 -0
- package/dist/panel-view.test.d.ts +2 -0
- package/dist/panel-view.test.d.ts.map +1 -0
- package/dist/panel-view.test.js +45 -0
- package/dist/panel-view.test.js.map +1 -0
- package/dist/panel.d.ts +20 -0
- package/dist/panel.d.ts.map +1 -0
- package/dist/panel.js +393 -0
- package/dist/panel.js.map +1 -0
- package/dist/presets.d.ts +2 -1
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +10 -0
- package/dist/presets.js.map +1 -1
- package/dist/prompt.d.ts +14 -1
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +61 -15
- package/dist/prompt.js.map +1 -1
- package/dist/prompt.test.d.ts +2 -0
- package/dist/prompt.test.d.ts.map +1 -0
- package/dist/prompt.test.js +37 -0
- package/dist/prompt.test.js.map +1 -0
- package/dist/review-events.d.ts +70 -0
- package/dist/review-events.d.ts.map +1 -0
- package/dist/review-events.js +52 -0
- package/dist/review-events.js.map +1 -0
- package/dist/review-events.test.d.ts +2 -0
- package/dist/review-events.test.d.ts.map +1 -0
- package/dist/review-events.test.js +47 -0
- package/dist/review-events.test.js.map +1 -0
- package/dist/review-result.d.ts +5 -0
- package/dist/review-result.d.ts.map +1 -0
- package/dist/review-result.js +98 -0
- package/dist/review-result.js.map +1 -0
- package/dist/review-result.test.d.ts +2 -0
- package/dist/review-result.test.d.ts.map +1 -0
- package/dist/review-result.test.js +196 -0
- package/dist/review-result.test.js.map +1 -0
- package/dist/review.d.ts +10 -4
- package/dist/review.d.ts.map +1 -1
- package/dist/review.js +82 -20
- package/dist/review.js.map +1 -1
- package/dist/review.meta.test.js +2 -2
- package/dist/review.meta.test.js.map +1 -1
- package/dist/skill-protocol.test.d.ts +2 -0
- package/dist/skill-protocol.test.d.ts.map +1 -0
- package/dist/skill-protocol.test.js +35 -0
- package/dist/skill-protocol.test.js.map +1 -0
- package/dist/types.d.ts +151 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -1
- package/extensions/panel-tool.test.ts +30 -0
- package/extensions/panel-tool.ts +169 -0
- package/extensions/review.ts +3 -1
- package/extensions/rv-prompts.test.ts +8 -1
- package/extensions/rv-prompts.ts +6 -4
- package/package.json +14 -5
- package/resources/panel-presets.json +21 -0
- package/resources/review-presets.json +2 -2
- package/resources/system-prompt.md +11 -1
- package/skills/pi-review/SKILL.md +93 -15
- package/skills/pi-review/references/codex-tools.md +19 -6
package/dist/panel.js
ADDED
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
// Panel review orchestration: run N independent reviewer child sessions with
|
|
2
|
+
// bounded concurrency, aggregate their structured findings into one panel
|
|
3
|
+
// result, and emit a single aggregate footer + metadata record. Reviewers and
|
|
4
|
+
// the consensus adjudicator remain review-only (no write tools, --no-session).
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { randomUUID } from "node:crypto";
|
|
8
|
+
import { Writable } from "node:stream";
|
|
9
|
+
import { PANEL_READ_ONLY_TOOLS } from "./types.js";
|
|
10
|
+
export { PANEL_READ_ONLY_TOOLS } from "./types.js";
|
|
11
|
+
import { spawnStreamingChild } from "./child-process.js";
|
|
12
|
+
import { childEnv, childRuntimeError, readReviewStdin } from "./review.js";
|
|
13
|
+
import { loadPanelPresets, loadPresets, loadSystemPrompt } from "./presets.js";
|
|
14
|
+
import { splitPayload, buildReviewerPrompt, buildAdjudicatorPrompt } from "./prompt.js";
|
|
15
|
+
import { parseVerdict } from "./verdict.js";
|
|
16
|
+
import { parseReviewResult, reviewExitCode } from "./review-result.js";
|
|
17
|
+
import { extractFinalText, JsonEventStream } from "./json-events.js";
|
|
18
|
+
import { fail, expandMaybeHome } from "./utils.js";
|
|
19
|
+
import { resolveConfig } from "./config.js";
|
|
20
|
+
import { resolvePanelConfig } from "./panel-config.js";
|
|
21
|
+
import { aggregatePanel } from "./panel-aggregate.js";
|
|
22
|
+
import { sumPanelUsage } from "./panel-usage.js";
|
|
23
|
+
import { SemanticMatcher } from "./matcher.js";
|
|
24
|
+
import { formatPanelMetaAscii, formatPanelFindingsMarkdown, formatReviewMetaJsonLine } from "./meta-footer.js";
|
|
25
|
+
import { createReviewEventEmitter, redactReviewEventPayload, redactReviewMetaPayload } from "./review-events.js";
|
|
26
|
+
/** Emit the aggregate panel footer (ASCII + JSON) like a single review. */
|
|
27
|
+
export function emitPanelFooter(meta) {
|
|
28
|
+
// Issue #2 Decision 39: confirmed findings are the primary Findings section;
|
|
29
|
+
// advisories are clearly separated and labelled non-blocking.
|
|
30
|
+
const body = formatPanelFindingsMarkdown(meta);
|
|
31
|
+
if (body)
|
|
32
|
+
process.stdout.write(`${body}\n\n`);
|
|
33
|
+
process.stdout.write(`${formatPanelMetaAscii(meta)}\n`);
|
|
34
|
+
const metaJsonDest = process.env.PI_REVIEW_META_STDOUT?.toLowerCase();
|
|
35
|
+
const jsonLine = formatReviewMetaJsonLine(meta);
|
|
36
|
+
if (metaJsonDest === "1" || metaJsonDest === "true" || metaJsonDest === "stdout") {
|
|
37
|
+
process.stdout.write(jsonLine);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
process.stderr.write(jsonLine);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function reviewerProgressLog(baseProgressLog, reviewerId) {
|
|
44
|
+
if (!baseProgressLog)
|
|
45
|
+
return undefined;
|
|
46
|
+
const base = baseProgressLog.replace(/\.jsonl$/i, "");
|
|
47
|
+
return `${base}.r${reviewerId}.jsonl`;
|
|
48
|
+
}
|
|
49
|
+
/** The hard panel boundary. Shell access gets a separate verified profile in a future change. */
|
|
50
|
+
const PANEL_READ_ONLY_TOOL_SET = new Set(PANEL_READ_ONLY_TOOLS);
|
|
51
|
+
/** Resolve reviewer tools through the hard allowlist; rejected requests cannot silently widen access. */
|
|
52
|
+
export function resolvePanelReviewerTools(tools) {
|
|
53
|
+
const requested = (Array.isArray(tools) ? tools : tools?.split(",") ?? PANEL_READ_ONLY_TOOLS)
|
|
54
|
+
.map((tool) => tool.trim())
|
|
55
|
+
.filter(Boolean);
|
|
56
|
+
const disallowed = requested.filter((tool) => !PANEL_READ_ONLY_TOOL_SET.has(tool));
|
|
57
|
+
if (disallowed.length > 0) {
|
|
58
|
+
throw new Error(`panel reviewers only allow ${PANEL_READ_ONLY_TOOLS.join(",")}; rejected: ${disallowed.join(",")}`);
|
|
59
|
+
}
|
|
60
|
+
return [...new Set(requested.length > 0 ? requested : PANEL_READ_ONLY_TOOLS)].join(",");
|
|
61
|
+
}
|
|
62
|
+
function buildReviewerArgs(config, parsed, preset, prompt, fileRefs, reviewer, progressLog, systemPrompt) {
|
|
63
|
+
const args = ["-p", "--mode", "json"];
|
|
64
|
+
if (systemPrompt)
|
|
65
|
+
args.push("--append-system-prompt", systemPrompt);
|
|
66
|
+
const provider = reviewer.provider || parsed.provider || preset.provider;
|
|
67
|
+
const model = reviewer.model || parsed.model || preset.model;
|
|
68
|
+
const thinking = reviewer.thinking || parsed.thinking || preset.thinking;
|
|
69
|
+
if (provider)
|
|
70
|
+
args.push("--provider", provider);
|
|
71
|
+
if (model)
|
|
72
|
+
args.push("--model", model);
|
|
73
|
+
if (thinking)
|
|
74
|
+
args.push("--thinking", thinking);
|
|
75
|
+
args.push("--tools", resolvePanelReviewerTools(parsed.tools || preset.tools));
|
|
76
|
+
const presetSkills = Array.isArray(preset.skillPaths) ? preset.skillPaths : [];
|
|
77
|
+
for (const skill of [...presetSkills, ...parsed.skills]) {
|
|
78
|
+
args.push("--skill", expandMaybeHome(skill));
|
|
79
|
+
}
|
|
80
|
+
args.push("--no-session");
|
|
81
|
+
args.push(...fileRefs, prompt);
|
|
82
|
+
return args;
|
|
83
|
+
}
|
|
84
|
+
async function runReviewerChild(input) {
|
|
85
|
+
const { config, parsed, preset, prompt, fileRefs, reviewer, progressLog, systemPrompt, signal, emit, quietProgress } = input;
|
|
86
|
+
const args = buildReviewerArgs(config, parsed, preset, prompt, fileRefs, reviewer, progressLog, systemPrompt);
|
|
87
|
+
let progressStream;
|
|
88
|
+
if (progressLog) {
|
|
89
|
+
fs.mkdirSync(path.dirname(progressLog), { recursive: true });
|
|
90
|
+
progressStream = fs.createWriteStream(progressLog, { flags: "a" });
|
|
91
|
+
}
|
|
92
|
+
// Reviewers always run in --mode json. A JsonEventStream accumulates token
|
|
93
|
+
// usage and emits reviewer-prefixed milestones to stderr; reviewer prose is
|
|
94
|
+
// NOT forwarded to stdout so concurrent reviewers never interleave (issue #2
|
|
95
|
+
// progress isolation). The raw json lines tee into the progress-log file.
|
|
96
|
+
const streamParser = new JsonEventStream({
|
|
97
|
+
onText: () => { },
|
|
98
|
+
onMilestone: (line) => { if (!quietProgress)
|
|
99
|
+
process.stderr.write(` [${reviewer.id}] ${line}`); },
|
|
100
|
+
onActivity: (event) => {
|
|
101
|
+
if (!emit)
|
|
102
|
+
return;
|
|
103
|
+
switch (event.type) {
|
|
104
|
+
case "turn.started":
|
|
105
|
+
emit("reviewer.turn.started", { reviewerId: reviewer.id, turn: event.turn });
|
|
106
|
+
break;
|
|
107
|
+
case "tool.started":
|
|
108
|
+
emit("reviewer.tool.started", { reviewerId: reviewer.id, tool: event.tool });
|
|
109
|
+
break;
|
|
110
|
+
case "tool.finished":
|
|
111
|
+
emit("reviewer.tool.finished", { reviewerId: reviewer.id, tool: event.tool });
|
|
112
|
+
break;
|
|
113
|
+
case "text.delta":
|
|
114
|
+
emit("reviewer.text.delta", { reviewerId: reviewer.id, text: event.text });
|
|
115
|
+
break;
|
|
116
|
+
case "usage":
|
|
117
|
+
emit("reviewer.usage", { reviewerId: reviewer.id, usage: event.usage });
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
const stdoutSink = new Writable({
|
|
123
|
+
write(chunk, _enc, cb) {
|
|
124
|
+
const text = String(chunk);
|
|
125
|
+
if (progressStream)
|
|
126
|
+
progressStream.write(text);
|
|
127
|
+
streamParser.feed(text);
|
|
128
|
+
cb();
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
const stderrChunks = [];
|
|
132
|
+
const stderrSink = new Writable({ write(chunk, _enc, cb) { stderrChunks.push(String(chunk)); cb(); } });
|
|
133
|
+
const child = await spawnStreamingChild(config.piBin, args, {
|
|
134
|
+
cwd: process.cwd(),
|
|
135
|
+
env: childEnv(config.piBin),
|
|
136
|
+
stdoutSink,
|
|
137
|
+
stderrSink,
|
|
138
|
+
signal,
|
|
139
|
+
processGroup: true,
|
|
140
|
+
});
|
|
141
|
+
streamParser.flush();
|
|
142
|
+
if (progressStream) {
|
|
143
|
+
await new Promise((resolve) => progressStream.end(() => resolve()));
|
|
144
|
+
}
|
|
145
|
+
let stdout = child.stdout || "";
|
|
146
|
+
const runtimeError = childRuntimeError(child);
|
|
147
|
+
// Surface a captured reviewer stderr tail only when the child failed, so
|
|
148
|
+
// concurrent reviewer diagnostics never interleave on the shared terminal.
|
|
149
|
+
const reviewerStderr = stderrChunks.join("");
|
|
150
|
+
let extractedError;
|
|
151
|
+
let extractedFatal = false;
|
|
152
|
+
const reviewerUsage = streamParser.usage().usage;
|
|
153
|
+
{
|
|
154
|
+
const extracted = extractFinalText(stdout);
|
|
155
|
+
stdout = extracted.text;
|
|
156
|
+
extractedError = extracted.error;
|
|
157
|
+
extractedFatal = Boolean(extracted.fatal);
|
|
158
|
+
}
|
|
159
|
+
let verdictInfo = parseVerdict(stdout);
|
|
160
|
+
if (runtimeError) {
|
|
161
|
+
const detail = [runtimeError, reviewerStderr.slice(-2000)].filter(Boolean).join("; ");
|
|
162
|
+
verdictInfo = { verdict: "blocked", verdictSource: "runtime_error", parseError: detail };
|
|
163
|
+
}
|
|
164
|
+
else if (extractedFatal) {
|
|
165
|
+
const detail = [extractedError, reviewerStderr.slice(-2000)].filter(Boolean).join("; ");
|
|
166
|
+
verdictInfo = { verdict: "blocked", verdictSource: "runtime_error", parseError: detail };
|
|
167
|
+
}
|
|
168
|
+
else if (extractedError) {
|
|
169
|
+
verdictInfo = { ...verdictInfo, parseError: [verdictInfo.parseError, extractedError].filter(Boolean).join("; ") };
|
|
170
|
+
}
|
|
171
|
+
const structured = parseReviewResult(stdout, verdictInfo);
|
|
172
|
+
const model = reviewer.model || parsed.model || preset.model || null;
|
|
173
|
+
const thinking = reviewer.thinking || parsed.thinking || preset.thinking;
|
|
174
|
+
return {
|
|
175
|
+
reviewerId: reviewer.id,
|
|
176
|
+
role: reviewer.role,
|
|
177
|
+
model,
|
|
178
|
+
...(thinking ? { thinking } : {}),
|
|
179
|
+
...(reviewerUsage ? { usage: reviewerUsage } : {}),
|
|
180
|
+
durationMs: 0, // set by caller wrapper
|
|
181
|
+
result: structured,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
async function mapWithConcurrency(items, concurrency, fn) {
|
|
185
|
+
const results = new Array(items.length);
|
|
186
|
+
let cursor = 0;
|
|
187
|
+
async function worker() {
|
|
188
|
+
while (cursor < items.length) {
|
|
189
|
+
const index = cursor;
|
|
190
|
+
cursor += 1;
|
|
191
|
+
results[index] = await fn(items[index], index);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, () => worker()));
|
|
195
|
+
return results;
|
|
196
|
+
}
|
|
197
|
+
/** Real semantic adjudicator: spawns a review-only Pi session with the consensus model. */
|
|
198
|
+
function createAdjudicator(config, consensusModel, signal) {
|
|
199
|
+
// Dedicated JSON-only system prompt. The adjudicator must NOT inherit the
|
|
200
|
+
// review Markdown output contract (system-prompt.md), which would conflict
|
|
201
|
+
// with the strict JSON clustering response and break parsing.
|
|
202
|
+
const adjudicatorSystemPrompt = [
|
|
203
|
+
"You are the consensus adjudicator for a panel code review.",
|
|
204
|
+
"Your only output is one JSON object matching the requested clustering schema.",
|
|
205
|
+
"Do not output Markdown, prose, or any other format. Do not review code quality.",
|
|
206
|
+
"You may not invent findings, drop findings, or act as a reviewer.",
|
|
207
|
+
].join("\n");
|
|
208
|
+
return {
|
|
209
|
+
async adjudicate(request) {
|
|
210
|
+
if (signal?.aborted)
|
|
211
|
+
throw new Error("panel review cancelled before adjudication");
|
|
212
|
+
const prompt = buildAdjudicatorPrompt(request.candidates);
|
|
213
|
+
// The adjudicator is aggregation-only: it must not inspect the repository
|
|
214
|
+
// as an additional reviewer and has no write capability. Disable all tools
|
|
215
|
+
// and run with no session — it returns JSON purely from the structured
|
|
216
|
+
// findings embedded in the prompt.
|
|
217
|
+
const args = ["-p", "--no-session", "--no-tools", "--append-system-prompt", adjudicatorSystemPrompt];
|
|
218
|
+
if (consensusModel)
|
|
219
|
+
args.push("--model", consensusModel);
|
|
220
|
+
args.push(prompt);
|
|
221
|
+
const sink = new Writable({ write(_chunk, _encoding, callback) { callback(); } });
|
|
222
|
+
const child = await spawnStreamingChild(config.piBin, args, {
|
|
223
|
+
cwd: process.cwd(),
|
|
224
|
+
env: childEnv(config.piBin),
|
|
225
|
+
stdoutSink: sink,
|
|
226
|
+
stderrSink: sink,
|
|
227
|
+
signal,
|
|
228
|
+
processGroup: true,
|
|
229
|
+
});
|
|
230
|
+
const runtimeError = childRuntimeError(child);
|
|
231
|
+
if (runtimeError) {
|
|
232
|
+
throw new Error(runtimeError);
|
|
233
|
+
}
|
|
234
|
+
const stdout = (child.stdout || "").trim();
|
|
235
|
+
const jsonStart = stdout.indexOf("{");
|
|
236
|
+
const jsonEnd = stdout.lastIndexOf("}");
|
|
237
|
+
if (jsonStart === -1 || jsonEnd === -1 || jsonEnd < jsonStart) {
|
|
238
|
+
return { merges: [], errors: ["adjudicator returned no parseable JSON object"] };
|
|
239
|
+
}
|
|
240
|
+
try {
|
|
241
|
+
const parsed = JSON.parse(stdout.slice(jsonStart, jsonEnd + 1));
|
|
242
|
+
if (!parsed || !Array.isArray(parsed.merges)) {
|
|
243
|
+
return { merges: [], errors: ["adjudicator response missing a merges array"] };
|
|
244
|
+
}
|
|
245
|
+
return {
|
|
246
|
+
merges: parsed.merges,
|
|
247
|
+
...(Array.isArray(parsed.errors) ? { errors: parsed.errors.map(String) } : {}),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
return { merges: [], errors: [`failed to parse adjudicator response: ${error.message}`] };
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
/** Resolve the panel config or fail with a usage error. */
|
|
257
|
+
function resolvePanel(parsed, config) {
|
|
258
|
+
const panelPresets = loadPanelPresets(config.panelPresetsFile);
|
|
259
|
+
try {
|
|
260
|
+
return resolvePanelConfig(parsed, panelPresets);
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
if (error instanceof Error)
|
|
264
|
+
fail(error.message);
|
|
265
|
+
throw error;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
function cancelledSubmission(reviewer, message, durationMs = 0, usage) {
|
|
269
|
+
return {
|
|
270
|
+
reviewerId: reviewer.id,
|
|
271
|
+
role: reviewer.role,
|
|
272
|
+
model: reviewer.model ?? null,
|
|
273
|
+
...(reviewer.thinking ? { thinking: reviewer.thinking } : {}),
|
|
274
|
+
...(usage ? { usage } : {}),
|
|
275
|
+
durationMs,
|
|
276
|
+
result: { status: "blocked", verdict: "blocked", verdictSource: "runtime_error", parseError: message, findings: [], actionableCount: 0 },
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
/** Run one complete panel evaluation and return the aggregate result (no exit). */
|
|
280
|
+
export async function runPanelReviewOnce(parsed, stdinText = readReviewStdin(), options = {}) {
|
|
281
|
+
const config = resolveConfig();
|
|
282
|
+
const resolved = resolvePanel(parsed, config);
|
|
283
|
+
const presets = loadPresets(config.presetsFile);
|
|
284
|
+
const preset = presets[parsed.mode];
|
|
285
|
+
if (!preset) {
|
|
286
|
+
fail(`unknown review mode: ${parsed.mode}\nAvailable modes: ${Object.keys(presets).join(", ")}`);
|
|
287
|
+
}
|
|
288
|
+
const systemPrompt = loadSystemPrompt(config.systemPromptFile);
|
|
289
|
+
// Validate tool capability before lifecycle emission so a malformed preset
|
|
290
|
+
// cannot leave events-jsonl consumers with a partial stream.
|
|
291
|
+
try {
|
|
292
|
+
resolvePanelReviewerTools(parsed.tools || preset.tools);
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
if (error instanceof Error)
|
|
296
|
+
fail(error.message);
|
|
297
|
+
throw error;
|
|
298
|
+
}
|
|
299
|
+
const payload = splitPayload(parsed.payload);
|
|
300
|
+
const emit = createReviewEventEmitter(randomUUID(), (event) => {
|
|
301
|
+
if (parsed.outputFormat === "events-jsonl")
|
|
302
|
+
process.stdout.write(`${JSON.stringify(event)}\n`);
|
|
303
|
+
options.onEvent?.(event);
|
|
304
|
+
});
|
|
305
|
+
const reviewerIdentities = resolved.reviewers.map((reviewer) => ({
|
|
306
|
+
reviewerId: reviewer.id,
|
|
307
|
+
role: reviewer.role,
|
|
308
|
+
model: reviewer.model || parsed.model || preset.model || null,
|
|
309
|
+
...(reviewer.thinking || parsed.thinking || preset.thinking ? { thinking: reviewer.thinking || parsed.thinking || preset.thinking } : {}),
|
|
310
|
+
}));
|
|
311
|
+
emit("panel.started", { target: parsed.payload.join(" "), mode: parsed.mode, ...(resolved.presetName ? { panelPreset: resolved.presetName } : {}), reviewers: reviewerIdentities });
|
|
312
|
+
for (const reviewer of resolved.reviewers)
|
|
313
|
+
emit("reviewer.queued", { reviewerId: reviewer.id });
|
|
314
|
+
const startedAt = Date.now();
|
|
315
|
+
const submissions = await mapWithConcurrency(resolved.reviewers, resolved.concurrency, async (reviewer) => {
|
|
316
|
+
if (options.signal?.aborted) {
|
|
317
|
+
const message = "panel review cancelled";
|
|
318
|
+
emit("reviewer.cancelled", { reviewerId: reviewer.id, message });
|
|
319
|
+
return cancelledSubmission(reviewer, message);
|
|
320
|
+
}
|
|
321
|
+
const reviewerStart = Date.now();
|
|
322
|
+
emit("reviewer.started", { reviewerId: reviewer.id });
|
|
323
|
+
const prompt = buildReviewerPrompt(parsed.mode, preset, payload, stdinText, reviewer);
|
|
324
|
+
const progressLog = reviewerProgressLog(parsed.progressLog, reviewer.id);
|
|
325
|
+
const submission = await runReviewerChild({
|
|
326
|
+
config,
|
|
327
|
+
parsed,
|
|
328
|
+
preset,
|
|
329
|
+
prompt,
|
|
330
|
+
fileRefs: payload.fileRefs,
|
|
331
|
+
reviewer,
|
|
332
|
+
progressLog,
|
|
333
|
+
systemPrompt,
|
|
334
|
+
signal: options.signal,
|
|
335
|
+
emit,
|
|
336
|
+
quietProgress: parsed.outputFormat === "events-jsonl",
|
|
337
|
+
});
|
|
338
|
+
const completed = { ...submission, durationMs: Date.now() - reviewerStart };
|
|
339
|
+
if (options.signal?.aborted) {
|
|
340
|
+
emit("reviewer.cancelled", { reviewerId: reviewer.id, message: "panel review cancelled" });
|
|
341
|
+
return cancelledSubmission(reviewer, "panel review cancelled", completed.durationMs, completed.usage);
|
|
342
|
+
}
|
|
343
|
+
else if (completed.result.verdictSource === "runtime_error") {
|
|
344
|
+
emit("reviewer.failed", { reviewerId: reviewer.id, message: completed.result.parseError ?? "reviewer failed" });
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
emit("reviewer.completed", { reviewerId: reviewer.id, submission: completed });
|
|
348
|
+
}
|
|
349
|
+
return completed;
|
|
350
|
+
});
|
|
351
|
+
// Semantic adjudication is on by default (issue #2 Decision 27): when
|
|
352
|
+
// ambiguous same-path candidates exist, a constrained adjudicator clusters
|
|
353
|
+
// them. --consensus-model overrides the adjudicator model; otherwise fall
|
|
354
|
+
// back to the shared review model / Pi default. Exact matches never invoke
|
|
355
|
+
// the adjudicator, so this stays cheap when there is nothing ambiguous.
|
|
356
|
+
const adjudicatorModel = resolved.consensusModel ?? parsed.model ?? preset.model ?? undefined;
|
|
357
|
+
emit("aggregation.started", {});
|
|
358
|
+
const matcher = new SemanticMatcher(createAdjudicator(config, adjudicatorModel, options.signal));
|
|
359
|
+
const aggregate = await aggregatePanel({
|
|
360
|
+
reviewers: submissions,
|
|
361
|
+
policy: resolved.consensus,
|
|
362
|
+
...(resolved.minAgree !== undefined ? { minAgree: resolved.minAgree } : {}),
|
|
363
|
+
configuredReviewers: resolved.reviewerCount,
|
|
364
|
+
matcher,
|
|
365
|
+
});
|
|
366
|
+
const panelMeta = {
|
|
367
|
+
...aggregate,
|
|
368
|
+
reviewMode: parsed.mode,
|
|
369
|
+
durationMs: Date.now() - startedAt,
|
|
370
|
+
model: parsed.model || preset.model || null,
|
|
371
|
+
thinking: parsed.thinking || preset.thinking,
|
|
372
|
+
usage: sumPanelUsage(submissions.map((s) => s.usage)),
|
|
373
|
+
...(resolved.presetName ? { panelPreset: resolved.presetName } : {}),
|
|
374
|
+
};
|
|
375
|
+
const eventPanelMeta = redactReviewEventPayload(panelMeta);
|
|
376
|
+
const footerPanelMeta = redactReviewMetaPayload(panelMeta);
|
|
377
|
+
emit("panel.completed", { meta: eventPanelMeta });
|
|
378
|
+
if (options.emitFooter !== false && parsed.outputFormat !== "events-jsonl")
|
|
379
|
+
emitPanelFooter(footerPanelMeta);
|
|
380
|
+
return { meta: panelMeta, exitCode: reviewExitCode(panelMeta.status) };
|
|
381
|
+
}
|
|
382
|
+
/** CLI-compatible panel review entrypoint. */
|
|
383
|
+
export async function runPanelReview(parsed) {
|
|
384
|
+
const controller = new AbortController();
|
|
385
|
+
const abort = () => controller.abort();
|
|
386
|
+
process.once("SIGINT", abort);
|
|
387
|
+
process.once("SIGTERM", abort);
|
|
388
|
+
const result = await runPanelReviewOnce(parsed, readReviewStdin(), { signal: controller.signal });
|
|
389
|
+
process.removeListener("SIGINT", abort);
|
|
390
|
+
process.removeListener("SIGTERM", abort);
|
|
391
|
+
process.exit(result.exitCode);
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel.js","sourceRoot":"","sources":["../src/panel.ts"],"names":[],"mappings":"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"}
|
package/dist/presets.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { ReviewPreset } from "./types.js";
|
|
1
|
+
import type { PanelPreset, ReviewPreset } from "./types.js";
|
|
2
2
|
export declare function loadPresets(presetsFile: string): Record<string, ReviewPreset>;
|
|
3
|
+
export declare function loadPanelPresets(panelPresetsFile: string): Record<string, PanelPreset>;
|
|
3
4
|
export declare function loadSystemPrompt(systemPromptFile: string): string;
|
|
4
5
|
//# sourceMappingURL=presets.d.ts.map
|
package/dist/presets.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG5D,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAS7E;AAED,wBAAgB,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAOtF;AAED,wBAAgB,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAOjE"}
|
package/dist/presets.js
CHANGED
|
@@ -11,6 +11,16 @@ export function loadPresets(presetsFile) {
|
|
|
11
11
|
fail(`failed to read preset file ${presetsFile}: ${error.message}`);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
+
export function loadPanelPresets(panelPresetsFile) {
|
|
15
|
+
if (!fs.existsSync(panelPresetsFile))
|
|
16
|
+
return {};
|
|
17
|
+
try {
|
|
18
|
+
return JSON.parse(fs.readFileSync(panelPresetsFile, "utf8"));
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
fail(`failed to read panel preset file ${panelPresetsFile}: ${error.message}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
14
24
|
export function loadSystemPrompt(systemPromptFile) {
|
|
15
25
|
if (!fs.existsSync(systemPromptFile))
|
|
16
26
|
return "";
|
package/dist/presets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,MAAM,UAAU,WAAW,CAAC,WAAmB;IAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC,0BAA0B,WAAW,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,8BAA8B,WAAW,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,gBAAwB;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,EAAE,CAAC;IAChD,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,gCAAgC,gBAAgB,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IACxF,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,MAAM,UAAU,WAAW,CAAC,WAAmB;IAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC,0BAA0B,WAAW,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,8BAA8B,WAAW,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,gBAAwB;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,EAAE,CAAC;IAChD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,oCAAoC,gBAAgB,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,gBAAwB;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,EAAE,CAAC;IAChD,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,gCAAgC,gBAAgB,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IACxF,CAAC;AACH,CAAC"}
|
package/dist/prompt.d.ts
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
|
-
import type { ReviewPreset, SplitPayload } from "./types.js";
|
|
1
|
+
import type { PanelReviewerSpec, ReviewPreset, SplitPayload } from "./types.js";
|
|
2
|
+
import type { AdjudicationCandidate } from "./matcher.js";
|
|
2
3
|
export declare function splitPayload(payload: string[]): SplitPayload;
|
|
3
4
|
export declare function buildPrompt(mode: string, preset: ReviewPreset, payload: SplitPayload, stdinText: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Reviewer prompt for panel review: the shared review contract plus a stable
|
|
7
|
+
* reviewer identity/role. Reviewers never receive another reviewer's output.
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildReviewerPrompt(mode: string, preset: ReviewPreset, payload: SplitPayload, stdinText: string, reviewer?: PanelReviewerSpec): string;
|
|
10
|
+
/**
|
|
11
|
+
* Strict clustering contract for the consensus adjudicator. It receives
|
|
12
|
+
* structured findings only, returns cluster assignments with confidence, and
|
|
13
|
+
* may not invent findings, drop findings, claim new evidence, or act as a
|
|
14
|
+
* reviewer. It has no write tools.
|
|
15
|
+
*/
|
|
16
|
+
export declare function buildAdjudicatorPrompt(candidates: AdjudicationCandidate[]): string;
|
|
4
17
|
//# sourceMappingURL=prompt.d.ts.map
|
package/dist/prompt.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AA4B1D,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,YAAY,CAQ5D;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhH;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,iBAAiB,GAC3B,MAAM,CAYR;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,qBAAqB,EAAE,GAAG,MAAM,CAoBlF"}
|
package/dist/prompt.js
CHANGED
|
@@ -1,22 +1,14 @@
|
|
|
1
1
|
import { VERDICTS } from "./types.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const textParts = [];
|
|
5
|
-
for (const item of payload) {
|
|
6
|
-
if (item.startsWith("@"))
|
|
7
|
-
fileRefs.push(item);
|
|
8
|
-
else
|
|
9
|
-
textParts.push(item);
|
|
10
|
-
}
|
|
11
|
-
return { fileRefs, userText: textParts.join(" ").trim() };
|
|
12
|
-
}
|
|
13
|
-
export function buildPrompt(mode, preset, payload, stdinText) {
|
|
14
|
-
const sections = [
|
|
2
|
+
function contractSections(mode, preset) {
|
|
3
|
+
return [
|
|
15
4
|
`You are running pi-review mode \`${mode}\`.`,
|
|
16
5
|
"Your job is to produce a review conclusion only. Do not edit files, do not write files, do not produce patches, and do not claim implementation work was done.",
|
|
17
6
|
preset.instructions || "Review the supplied material and return a concise conclusion.",
|
|
18
|
-
`Output Markdown with exactly these top-level sections:\n\n## Verdict\nOne of: ${VERDICTS.join(" | ")}\n\n## Summary\nShort conclusion in 2-5 bullets.\n\n## Findings\nPrioritized findings.
|
|
7
|
+
`Output Markdown with exactly these top-level sections:\n\n## Verdict\nOne of: ${VERDICTS.join(" | ")}\n\n## Summary\nShort conclusion in 2-5 bullets.\n\n## Findings\nPrioritized findings. For every material finding, use this exact shape (increment IDs as F1, F2, ...):\n\n### F1: <summary>\n- Severity: critical | high | medium | low\n- Path: <path or none>\n- Actionable: yes | no\n- Evidence: <concrete evidence>\n- Impact: <why it matters>\n- Recommendation: <specific next step>\n\nSet Actionable to yes when the host must fix or consciously reject the finding before clean closeout. Use no for informational or explicitly out-of-scope follow-up findings. If there are no material findings, write "No material findings."\n\n## Risks and Blind Spots\nWhat could still be wrong, missing, or unverified.\n\n## Open Questions\nQuestions the parent agent or user should answer before acting. If none, write "None."`,
|
|
19
8
|
];
|
|
9
|
+
}
|
|
10
|
+
function targetSections(payload, stdinText) {
|
|
11
|
+
const sections = [];
|
|
20
12
|
if (payload.userText) {
|
|
21
13
|
sections.push(`<user-request>\n${payload.userText}\n</user-request>`);
|
|
22
14
|
}
|
|
@@ -29,6 +21,60 @@ export function buildPrompt(mode, preset, payload, stdinText) {
|
|
|
29
21
|
if (!payload.userText && !stdinText && payload.fileRefs.length === 0) {
|
|
30
22
|
sections.push("No explicit target was provided. Return blocked and explain what input is required.");
|
|
31
23
|
}
|
|
32
|
-
return sections
|
|
24
|
+
return sections;
|
|
25
|
+
}
|
|
26
|
+
export function splitPayload(payload) {
|
|
27
|
+
const fileRefs = [];
|
|
28
|
+
const textParts = [];
|
|
29
|
+
for (const item of payload) {
|
|
30
|
+
if (item.startsWith("@"))
|
|
31
|
+
fileRefs.push(item);
|
|
32
|
+
else
|
|
33
|
+
textParts.push(item);
|
|
34
|
+
}
|
|
35
|
+
return { fileRefs, userText: textParts.join(" ").trim() };
|
|
36
|
+
}
|
|
37
|
+
export function buildPrompt(mode, preset, payload, stdinText) {
|
|
38
|
+
return [...contractSections(mode, preset), ...targetSections(payload, stdinText)].join("\n\n");
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Reviewer prompt for panel review: the shared review contract plus a stable
|
|
42
|
+
* reviewer identity/role. Reviewers never receive another reviewer's output.
|
|
43
|
+
*/
|
|
44
|
+
export function buildReviewerPrompt(mode, preset, payload, stdinText, reviewer) {
|
|
45
|
+
const preamble = reviewer
|
|
46
|
+
? [
|
|
47
|
+
"You are an independent panel reviewer.",
|
|
48
|
+
`- Reviewer ID: ${reviewer.id}`,
|
|
49
|
+
`- Role: ${reviewer.role}`,
|
|
50
|
+
"You cannot see other reviewers' findings. Submit your own independent conclusion only.",
|
|
51
|
+
].join("\n")
|
|
52
|
+
: "";
|
|
53
|
+
return [preamble, ...contractSections(mode, preset), ...targetSections(payload, stdinText)]
|
|
54
|
+
.filter(Boolean)
|
|
55
|
+
.join("\n\n");
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Strict clustering contract for the consensus adjudicator. It receives
|
|
59
|
+
* structured findings only, returns cluster assignments with confidence, and
|
|
60
|
+
* may not invent findings, drop findings, claim new evidence, or act as a
|
|
61
|
+
* reviewer. It has no write tools.
|
|
62
|
+
*/
|
|
63
|
+
export function buildAdjudicatorPrompt(candidates) {
|
|
64
|
+
const candidateBlocks = candidates.map((candidate, index) => {
|
|
65
|
+
const items = candidate.findings.map((sf) => `- id: ${sf.id}\n reviewer: ${sf.reviewerId}\n path: ${sf.finding.path ?? "(none)"}\n summary: ${sf.finding.summary}\n actionable: ${sf.finding.actionable ? "yes" : "no"}`);
|
|
66
|
+
return `Candidate group ${index + 1} (shared path anchor: ${candidate.anchorPath || "(none)"}):\n${items.join("\n")}`;
|
|
67
|
+
});
|
|
68
|
+
return [
|
|
69
|
+
"You are the consensus adjudicator for a panel code review. Your only job is to decide which findings describe the same underlying issue.",
|
|
70
|
+
"You are aggregation-only. You may not invent new findings, drop findings, add evidence, or act as an additional reviewer. You have no write tools.",
|
|
71
|
+
"Below are candidate groups of findings that share a file path but differ in wording. For each set of findings that you determine describe the same underlying issue, propose a merge.",
|
|
72
|
+
"Only merge findings that genuinely describe the same underlying issue. When unsure, do not merge.",
|
|
73
|
+
"Respond with one JSON object only, no prose, in this exact shape:",
|
|
74
|
+
'{"merges":[{"sourceFindingIds":["r1#F1","r2#F1"],"confidence":0.9}]}',
|
|
75
|
+
"`confidence` is a number between 0 and 1 expressing how sure you are that the listed findings are the same issue. Use 0 when unrelated. Every source id you reference must come from the candidates below.",
|
|
76
|
+
"Candidate findings:",
|
|
77
|
+
candidateBlocks.join("\n\n"),
|
|
78
|
+
].join("\n\n");
|
|
33
79
|
}
|
|
34
80
|
//# sourceMappingURL=prompt.js.map
|
package/dist/prompt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.test.d.ts","sourceRoot":"","sources":["../src/prompt.test.ts"],"names":[],"mappings":""}
|