@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/json-events.test.js
CHANGED
|
@@ -1,9 +1,119 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import { test } from "node:test";
|
|
3
|
-
import { extractFinalText } from "./json-events.js";
|
|
3
|
+
import { extractFinalText, extractUsage, JsonEventStream } from "./json-events.js";
|
|
4
4
|
function lines(...events) {
|
|
5
5
|
return events.map((e) => JSON.stringify(e)).join("\n");
|
|
6
6
|
}
|
|
7
|
+
const firstUsageSnapshot = {
|
|
8
|
+
input: 100,
|
|
9
|
+
output: 20,
|
|
10
|
+
cacheRead: 50,
|
|
11
|
+
cacheWrite: 2,
|
|
12
|
+
reasoning: 5,
|
|
13
|
+
totalTokens: 172,
|
|
14
|
+
cost: { total: 0.1 },
|
|
15
|
+
};
|
|
16
|
+
const secondUsageSnapshot = {
|
|
17
|
+
input: 30,
|
|
18
|
+
output: 10,
|
|
19
|
+
cacheRead: 170,
|
|
20
|
+
cacheWrite: 0,
|
|
21
|
+
reasoning: 2,
|
|
22
|
+
totalTokens: 210,
|
|
23
|
+
cost: { total: 0.12 },
|
|
24
|
+
};
|
|
25
|
+
function repeatedUsageEvents() {
|
|
26
|
+
return [
|
|
27
|
+
{ type: "message_start", message: { role: "assistant", usage: firstUsageSnapshot } },
|
|
28
|
+
{
|
|
29
|
+
type: "message_update",
|
|
30
|
+
message: { role: "assistant", usage: firstUsageSnapshot },
|
|
31
|
+
assistantMessageEvent: { type: "text_delta", delta: "first", partial: { role: "assistant", usage: firstUsageSnapshot } },
|
|
32
|
+
},
|
|
33
|
+
{ type: "message_end", message: { role: "assistant", usage: firstUsageSnapshot, model: "provider/model" } },
|
|
34
|
+
{ type: "turn_end", message: { role: "assistant", usage: firstUsageSnapshot } },
|
|
35
|
+
{
|
|
36
|
+
type: "message_update",
|
|
37
|
+
message: { role: "assistant", usage: secondUsageSnapshot },
|
|
38
|
+
assistantMessageEvent: { type: "text_delta", delta: "second", partial: { role: "assistant", usage: secondUsageSnapshot } },
|
|
39
|
+
},
|
|
40
|
+
{ type: "message_end", message: { role: "assistant", usage: secondUsageSnapshot, responseModel: "provider/model" } },
|
|
41
|
+
{ type: "turn_end", message: { role: "assistant", usage: secondUsageSnapshot } },
|
|
42
|
+
{
|
|
43
|
+
type: "agent_end",
|
|
44
|
+
messages: [
|
|
45
|
+
{ role: "assistant", usage: firstUsageSnapshot },
|
|
46
|
+
{ role: "assistant", usage: secondUsageSnapshot, responseModel: "provider/model" },
|
|
47
|
+
],
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
const repeatedUsageExpected = {
|
|
52
|
+
usage: {
|
|
53
|
+
input: 130,
|
|
54
|
+
output: 30,
|
|
55
|
+
cacheRead: 220,
|
|
56
|
+
cacheWrite: 2,
|
|
57
|
+
reasoning: 7,
|
|
58
|
+
totalTokens: 382,
|
|
59
|
+
costTotal: 0.22,
|
|
60
|
+
},
|
|
61
|
+
responseModel: "provider/model",
|
|
62
|
+
};
|
|
63
|
+
const firstFallbackUsage = { input: 10, output: 2, totalTokens: 12 };
|
|
64
|
+
const secondFallbackUsage = { input: 20, output: 3, totalTokens: 23 };
|
|
65
|
+
const fallbackUsageExpected = {
|
|
66
|
+
input: 30,
|
|
67
|
+
output: 5,
|
|
68
|
+
cacheRead: 0,
|
|
69
|
+
cacheWrite: 0,
|
|
70
|
+
reasoning: 0,
|
|
71
|
+
totalTokens: 35,
|
|
72
|
+
};
|
|
73
|
+
function fullAgentEndFallbackEvents() {
|
|
74
|
+
return [{
|
|
75
|
+
type: "agent_end",
|
|
76
|
+
messages: [
|
|
77
|
+
{ role: "assistant", usage: { ...firstFallbackUsage, cost: { total: 0.01 } } },
|
|
78
|
+
{
|
|
79
|
+
role: "assistant",
|
|
80
|
+
usage: { ...secondFallbackUsage, cost: { total: 0.02 } },
|
|
81
|
+
responseModel: "fallback/model",
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
}];
|
|
85
|
+
}
|
|
86
|
+
function missingMessageEndUsageEvents() {
|
|
87
|
+
return [
|
|
88
|
+
{
|
|
89
|
+
type: "message_end",
|
|
90
|
+
message: { role: "assistant", responseId: "response-1", usage: firstFallbackUsage },
|
|
91
|
+
},
|
|
92
|
+
{ type: "message_end", message: { role: "assistant", responseId: "response-2" } },
|
|
93
|
+
{
|
|
94
|
+
type: "agent_end",
|
|
95
|
+
messages: [
|
|
96
|
+
{ role: "assistant", responseId: "response-1", usage: firstFallbackUsage },
|
|
97
|
+
{ role: "assistant", responseId: "response-2", usage: secondFallbackUsage },
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
];
|
|
101
|
+
}
|
|
102
|
+
function multipleAgentFallbackEvents() {
|
|
103
|
+
return [
|
|
104
|
+
{ type: "agent_start" },
|
|
105
|
+
{ type: "message_end", message: { role: "assistant", usage: firstFallbackUsage } },
|
|
106
|
+
{ type: "agent_end", messages: [{ role: "assistant", usage: firstFallbackUsage }] },
|
|
107
|
+
{ type: "agent_start" },
|
|
108
|
+
{ type: "agent_end", messages: [{ role: "assistant", usage: secondFallbackUsage }] },
|
|
109
|
+
];
|
|
110
|
+
}
|
|
111
|
+
function parseStreamUsage(events) {
|
|
112
|
+
const stream = new JsonEventStream({ onText: () => { }, onMilestone: () => { } });
|
|
113
|
+
stream.feed(lines(...events));
|
|
114
|
+
stream.flush();
|
|
115
|
+
return stream.usage();
|
|
116
|
+
}
|
|
7
117
|
test("extractFinalText reads the final assistant text from agent_end", () => {
|
|
8
118
|
const input = lines({ type: "session", id: "s1" }, { type: "agent_start" }, { type: "message_end", message: { role: "assistant", content: [{ type: "text", text: "partial" }] } }, {
|
|
9
119
|
type: "agent_end",
|
|
@@ -85,4 +195,110 @@ test("extractFinalText uses the last agent_end when the child retries", () => {
|
|
|
85
195
|
assert.equal(result.text, "final attempt");
|
|
86
196
|
assert.equal(result.fatal, undefined);
|
|
87
197
|
});
|
|
198
|
+
test("extractUsage uses message_end usage and agent_end response model", () => {
|
|
199
|
+
const input = lines({ type: "session", id: "s1" }, { type: "message_end", message: { role: "assistant", usage: { input: 44, output: 3, cacheRead: 17984, cacheWrite: 0, reasoning: 0, totalTokens: 18031, cost: { total: 0.025 } }, model: "hf:zai-org/GLM-5.2" } }, { type: "agent_end", messages: [{ role: "assistant", responseModel: "zai-org/GLM-5.2" }] });
|
|
200
|
+
const result = extractUsage(input);
|
|
201
|
+
assert.ok(result.usage);
|
|
202
|
+
assert.equal(result.usage.input, 44);
|
|
203
|
+
assert.equal(result.usage.output, 3);
|
|
204
|
+
assert.equal(result.usage.cacheRead, 17984);
|
|
205
|
+
assert.equal(result.usage.totalTokens, 18031);
|
|
206
|
+
assert.equal(result.usage.costTotal, 0.025);
|
|
207
|
+
assert.equal(result.responseModel, "zai-org/GLM-5.2");
|
|
208
|
+
});
|
|
209
|
+
test("extractUsage falls back to agent_end usage when message_end usage is absent", () => {
|
|
210
|
+
assert.deepEqual(extractUsage(lines(...fullAgentEndFallbackEvents())), {
|
|
211
|
+
usage: { ...fallbackUsageExpected, costTotal: 0.03 },
|
|
212
|
+
responseModel: "fallback/model",
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
test("extractUsage fills missing message_end usage from unseen agent_end response ids", () => {
|
|
216
|
+
assert.deepEqual(extractUsage(lines(...missingMessageEndUsageEvents())).usage, fallbackUsageExpected);
|
|
217
|
+
});
|
|
218
|
+
test("extractUsage applies no-id agent_end fallback independently per agent run", () => {
|
|
219
|
+
assert.deepEqual(extractUsage(lines(...multipleAgentFallbackEvents())).usage, fallbackUsageExpected);
|
|
220
|
+
});
|
|
221
|
+
test("extractUsage returns undefined when no usage events exist", () => {
|
|
222
|
+
const input = lines({ type: "session", id: "s1" }, { type: "agent_end", messages: [{ role: "assistant" }] });
|
|
223
|
+
const result = extractUsage(input);
|
|
224
|
+
assert.equal(result.usage, undefined);
|
|
225
|
+
assert.equal(result.responseModel, undefined);
|
|
226
|
+
});
|
|
227
|
+
test("extractUsage sums separately billed usage across multiple assistant turns", () => {
|
|
228
|
+
const input = lines({ type: "message_end", message: { role: "assistant", usage: { input: 100, output: 50, totalTokens: 150 } } }, { type: "message_end", message: { role: "assistant", usage: { input: 100, output: 30, totalTokens: 130 } } });
|
|
229
|
+
const result = extractUsage(input);
|
|
230
|
+
assert.equal(result.usage.output, 80);
|
|
231
|
+
assert.equal(result.usage.input, 200);
|
|
232
|
+
assert.equal(result.usage.totalTokens, 280);
|
|
233
|
+
});
|
|
234
|
+
test("extractUsage counts repeated usage snapshots once per completed assistant message", () => {
|
|
235
|
+
assert.deepEqual(extractUsage(lines(...repeatedUsageEvents())), repeatedUsageExpected);
|
|
236
|
+
});
|
|
237
|
+
test("JsonEventStream forwards text deltas and emits milestones", () => {
|
|
238
|
+
const texts = [];
|
|
239
|
+
const milestones = [];
|
|
240
|
+
const stream = new JsonEventStream({ onText: (c) => texts.push(c), onMilestone: (l) => milestones.push(l) });
|
|
241
|
+
const input = lines({ type: "agent_start" }, { type: "turn_start" }, { type: "message_update", assistantMessageEvent: { type: "text_delta", delta: "Hello ", partial: { role: "assistant" } } }, { type: "message_update", assistantMessageEvent: { type: "text_delta", delta: "world", partial: { role: "assistant" } } }, { type: "agent_end", messages: [{ role: "assistant", content: [{ type: "text", text: "Hello world" }], responseModel: "fake/model" }] });
|
|
242
|
+
stream.feed(input);
|
|
243
|
+
stream.flush();
|
|
244
|
+
assert.equal(texts.join(""), "Hello world");
|
|
245
|
+
assert.ok(milestones.some((m) => /review started/.test(m)));
|
|
246
|
+
assert.ok(milestones.some((m) => /review finished/.test(m)));
|
|
247
|
+
const usage = stream.usage();
|
|
248
|
+
assert.ok(usage.responseModel === "fake/model" || usage.responseModel === undefined);
|
|
249
|
+
});
|
|
250
|
+
test("JsonEventStream accumulates token usage from streamed events", () => {
|
|
251
|
+
const stream = new JsonEventStream({ onText: () => { }, onMilestone: () => { } });
|
|
252
|
+
stream.feed(lines({ type: "message_end", message: { role: "assistant", usage: { input: 200, output: 50, cacheRead: 100, cacheWrite: 0, reasoning: 10, totalTokens: 260 } } }));
|
|
253
|
+
stream.flush();
|
|
254
|
+
const usage = stream.usage().usage;
|
|
255
|
+
assert.ok(usage);
|
|
256
|
+
assert.equal(usage.input, 200);
|
|
257
|
+
assert.equal(usage.output, 50);
|
|
258
|
+
assert.equal(usage.cacheRead, 100);
|
|
259
|
+
assert.equal(usage.reasoning, 10);
|
|
260
|
+
});
|
|
261
|
+
test("JsonEventStream counts repeated usage snapshots once per completed assistant message", () => {
|
|
262
|
+
const usageCosts = [];
|
|
263
|
+
const stream = new JsonEventStream({
|
|
264
|
+
onText: () => { },
|
|
265
|
+
onMilestone: () => { },
|
|
266
|
+
onActivity: (event) => {
|
|
267
|
+
if (event.type === "usage")
|
|
268
|
+
usageCosts.push(event.usage.costTotal);
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
stream.feed(lines(...repeatedUsageEvents()));
|
|
272
|
+
stream.flush();
|
|
273
|
+
assert.deepEqual(stream.usage(), repeatedUsageExpected);
|
|
274
|
+
assert.equal(usageCosts.at(-1), 0.22);
|
|
275
|
+
});
|
|
276
|
+
test("JsonEventStream falls back to agent_end usage when message_end usage is absent", () => {
|
|
277
|
+
assert.deepEqual(parseStreamUsage(fullAgentEndFallbackEvents()), {
|
|
278
|
+
usage: { ...fallbackUsageExpected, costTotal: 0.03 },
|
|
279
|
+
responseModel: "fallback/model",
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
test("JsonEventStream fills missing message_end usage from unseen agent_end response ids", () => {
|
|
283
|
+
assert.deepEqual(parseStreamUsage(missingMessageEndUsageEvents()).usage, fallbackUsageExpected);
|
|
284
|
+
});
|
|
285
|
+
test("JsonEventStream applies no-id agent_end fallback independently per agent run", () => {
|
|
286
|
+
assert.deepEqual(parseStreamUsage(multipleAgentFallbackEvents()).usage, fallbackUsageExpected);
|
|
287
|
+
});
|
|
288
|
+
test("JsonEventStream handles partial lines across chunks", () => {
|
|
289
|
+
const texts = [];
|
|
290
|
+
const stream = new JsonEventStream({ onText: (c) => texts.push(c), onMilestone: () => { } });
|
|
291
|
+
// Feed a partial line, then complete it.
|
|
292
|
+
stream.feed('{"type":"message_update","assistantMessageEvent":{"type":"text_delta","delta":"par');
|
|
293
|
+
stream.feed('tial","partial":{"role":"assistant"}}}\n');
|
|
294
|
+
stream.flush();
|
|
295
|
+
assert.equal(texts.join(""), "partial");
|
|
296
|
+
});
|
|
297
|
+
test("JsonEventStream skips unparseable lines without throwing", () => {
|
|
298
|
+
const stream = new JsonEventStream({ onText: () => { }, onMilestone: () => { } });
|
|
299
|
+
stream.feed("not json\n");
|
|
300
|
+
stream.feed('{"type":"message_update","assistantMessageEvent":{"type":"text_delta","delta":"ok","partial":{"role":"assistant"}}}\n');
|
|
301
|
+
stream.flush();
|
|
302
|
+
assert.equal(stream.usage().usage, undefined);
|
|
303
|
+
});
|
|
88
304
|
//# sourceMappingURL=json-events.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-events.test.js","sourceRoot":"","sources":["../src/json-events.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"json-events.test.js","sourceRoot":"","sources":["../src/json-events.test.ts"],"names":[],"mappings":"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"}
|
package/dist/loop.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ReviewRunResult, ReviewStatus, Verdict } from "./types.js";
|
|
2
|
+
export type LoopStopReason = "clean" | "budget_exhausted" | "needs_human" | "blocked";
|
|
3
|
+
export interface LoopRoundPanelSummary {
|
|
4
|
+
configuredReviewers: number;
|
|
5
|
+
successfulReviewers: number;
|
|
6
|
+
confirmedCount: number;
|
|
7
|
+
advisoryCount: number;
|
|
8
|
+
consensusPolicy: string;
|
|
9
|
+
consensusThreshold: number;
|
|
10
|
+
panelHealth: string;
|
|
11
|
+
}
|
|
12
|
+
export interface LoopRoundSummary {
|
|
13
|
+
index: number;
|
|
14
|
+
status: ReviewStatus;
|
|
15
|
+
verdict: Verdict;
|
|
16
|
+
durationMs: number;
|
|
17
|
+
findingCount: number;
|
|
18
|
+
actionableCount: number;
|
|
19
|
+
/** Thinking level requested for this round, if any. */
|
|
20
|
+
thinking?: string;
|
|
21
|
+
/** Token usage for this round, when available. */
|
|
22
|
+
usage?: import("./types.js").TokenUsage;
|
|
23
|
+
/** Present when the round evaluated a panel. */
|
|
24
|
+
panel?: LoopRoundPanelSummary;
|
|
25
|
+
}
|
|
26
|
+
export interface LoopReviewResult {
|
|
27
|
+
rounds: LoopRoundSummary[];
|
|
28
|
+
finalStatus: ReviewStatus;
|
|
29
|
+
stopReason: LoopStopReason;
|
|
30
|
+
exitCode: number;
|
|
31
|
+
}
|
|
32
|
+
export type RunOneReview = (roundIndex: number) => Promise<ReviewRunResult>;
|
|
33
|
+
export declare function formatLoopSummary(result: LoopReviewResult): string;
|
|
34
|
+
/** Runs isolated review rounds through an injected single-run adapter. */
|
|
35
|
+
export declare function runReviewLoop(maxRounds: number, runOneReview: RunOneReview): Promise<LoopReviewResult>;
|
|
36
|
+
//# sourceMappingURL=loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../src/loop.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAA+B,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEtG,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,kBAAkB,GAAG,aAAa,GAAG,SAAS,CAAC;AAEtF,MAAM,WAAW,qBAAqB;IACpC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,KAAK,CAAC,EAAE,OAAO,YAAY,EAAE,UAAU,CAAC;IACxC,gDAAgD;IAChD,KAAK,CAAC,EAAE,qBAAqB,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,WAAW,EAAE,YAAY,CAAC;IAC1B,UAAU,EAAE,cAAc,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAM5E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAmBlE;AAED,0EAA0E;AAC1E,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAgD3B"}
|
package/dist/loop.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { formatDurationMs, formatUsage } from "./meta-footer.js";
|
|
2
|
+
import { reviewExitCode } from "./review-result.js";
|
|
3
|
+
function displayEnum(value) {
|
|
4
|
+
return value.replaceAll("_", " ").toUpperCase();
|
|
5
|
+
}
|
|
6
|
+
export function formatLoopSummary(result) {
|
|
7
|
+
const lines = ["── pi-review loop " + "─".repeat(23)];
|
|
8
|
+
for (const round of result.rounds) {
|
|
9
|
+
const tokenBit = round.usage ? ` | ${formatUsage(round.usage)}` : "";
|
|
10
|
+
const thinkBit = round.thinking ? ` | think:${round.thinking}` : "";
|
|
11
|
+
if (round.panel) {
|
|
12
|
+
lines.push(` Round ${round.index} ${displayEnum(round.status)} | panel ${round.panel.successfulReviewers}/${round.panel.configuredReviewers} | ${round.panel.confirmedCount} confirmed / ${round.panel.advisoryCount} advisory | ${round.panel.consensusPolicy}≥${round.panel.consensusThreshold} | ${displayEnum(round.panel.panelHealth)}${thinkBit}${tokenBit} | ${formatDurationMs(round.durationMs)}`);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
lines.push(` Round ${round.index} ${displayEnum(round.status)} | ${displayEnum(round.verdict)} | ${round.actionableCount} actionable / ${round.findingCount} total${thinkBit}${tokenBit} | ${formatDurationMs(round.durationMs)}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
lines.push(` Stop ${result.stopReason}`);
|
|
19
|
+
lines.push(` Exit ${result.exitCode}`);
|
|
20
|
+
lines.push("─".repeat(42));
|
|
21
|
+
return lines.join("\n");
|
|
22
|
+
}
|
|
23
|
+
/** Runs isolated review rounds through an injected single-run adapter. */
|
|
24
|
+
export async function runReviewLoop(maxRounds, runOneReview) {
|
|
25
|
+
if (!Number.isSafeInteger(maxRounds) || maxRounds < 1) {
|
|
26
|
+
throw new RangeError("maxRounds must be a positive integer");
|
|
27
|
+
}
|
|
28
|
+
const rounds = [];
|
|
29
|
+
for (let index = 1; index <= maxRounds; index += 1) {
|
|
30
|
+
const run = await runOneReview(index);
|
|
31
|
+
const { meta } = run;
|
|
32
|
+
const panel = isPanelMeta(meta)
|
|
33
|
+
? {
|
|
34
|
+
configuredReviewers: meta.configuredReviewers,
|
|
35
|
+
successfulReviewers: meta.successfulReviewers,
|
|
36
|
+
confirmedCount: meta.confirmedClusters.length,
|
|
37
|
+
advisoryCount: meta.advisories.length,
|
|
38
|
+
consensusPolicy: meta.consensusPolicy,
|
|
39
|
+
consensusThreshold: meta.consensusThreshold,
|
|
40
|
+
panelHealth: meta.panelHealth,
|
|
41
|
+
}
|
|
42
|
+
: undefined;
|
|
43
|
+
rounds.push({
|
|
44
|
+
index,
|
|
45
|
+
status: meta.status,
|
|
46
|
+
verdict: meta.verdict,
|
|
47
|
+
durationMs: meta.durationMs,
|
|
48
|
+
findingCount: meta.findings.length,
|
|
49
|
+
actionableCount: meta.actionableCount,
|
|
50
|
+
...(meta.thinking ? { thinking: meta.thinking } : {}),
|
|
51
|
+
...(meta.usage ? { usage: meta.usage } : {}),
|
|
52
|
+
...(panel ? { panel } : {}),
|
|
53
|
+
});
|
|
54
|
+
if (meta.status === "clean" || meta.status === "needs_human" || meta.status === "blocked") {
|
|
55
|
+
return {
|
|
56
|
+
rounds,
|
|
57
|
+
finalStatus: meta.status,
|
|
58
|
+
stopReason: meta.status,
|
|
59
|
+
exitCode: reviewExitCode(meta.status),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
rounds,
|
|
65
|
+
finalStatus: "has_findings",
|
|
66
|
+
stopReason: "budget_exhausted",
|
|
67
|
+
exitCode: reviewExitCode("has_findings"),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function isPanelMeta(meta) {
|
|
71
|
+
return meta.strategy === "panel";
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=loop.js.map
|
package/dist/loop.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../src/loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.test.d.ts","sourceRoot":"","sources":["../src/loop.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { test } from "node:test";
|
|
3
|
+
import { formatLoopSummary, runReviewLoop } from "./loop.js";
|
|
4
|
+
function meta(status, verdict, durationMs = 100) {
|
|
5
|
+
return {
|
|
6
|
+
reviewMode: "code",
|
|
7
|
+
verdict,
|
|
8
|
+
verdictSource: "parsed",
|
|
9
|
+
status,
|
|
10
|
+
findings: status === "has_findings"
|
|
11
|
+
? [{ id: "F1", summary: "Fix the gate", actionable: true }]
|
|
12
|
+
: [],
|
|
13
|
+
actionableCount: status === "has_findings" ? 1 : 0,
|
|
14
|
+
durationMs,
|
|
15
|
+
model: "provider/model",
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
test("loop stops after a clean first round", async () => {
|
|
19
|
+
let calls = 0;
|
|
20
|
+
const result = await runReviewLoop(3, async () => {
|
|
21
|
+
calls += 1;
|
|
22
|
+
return { meta: meta("clean", "approve"), exitCode: 0 };
|
|
23
|
+
});
|
|
24
|
+
assert.equal(calls, 1);
|
|
25
|
+
assert.equal(result.stopReason, "clean");
|
|
26
|
+
assert.equal(result.exitCode, 0);
|
|
27
|
+
assert.deepEqual(result.rounds.map((round) => round.index), [1]);
|
|
28
|
+
});
|
|
29
|
+
test("loop stops when a later round becomes clean", async () => {
|
|
30
|
+
const sequence = [
|
|
31
|
+
{ meta: meta("has_findings", "request_changes", 120), exitCode: 1 },
|
|
32
|
+
{ meta: meta("clean", "approve", 80), exitCode: 0 },
|
|
33
|
+
];
|
|
34
|
+
const result = await runReviewLoop(3, async (roundIndex) => sequence[roundIndex - 1]);
|
|
35
|
+
assert.equal(result.stopReason, "clean");
|
|
36
|
+
assert.equal(result.exitCode, 0);
|
|
37
|
+
assert.deepEqual(result.rounds.map((round) => round.status), ["has_findings", "clean"]);
|
|
38
|
+
assert.deepEqual(result.rounds.map((round) => round.durationMs), [120, 80]);
|
|
39
|
+
});
|
|
40
|
+
test("loop exhausts the budget while actionable findings remain", async () => {
|
|
41
|
+
let calls = 0;
|
|
42
|
+
const result = await runReviewLoop(2, async () => {
|
|
43
|
+
calls += 1;
|
|
44
|
+
return { meta: meta("has_findings", "request_changes"), exitCode: 1 };
|
|
45
|
+
});
|
|
46
|
+
assert.equal(calls, 2);
|
|
47
|
+
assert.equal(result.stopReason, "budget_exhausted");
|
|
48
|
+
assert.equal(result.finalStatus, "has_findings");
|
|
49
|
+
assert.equal(result.exitCode, 1);
|
|
50
|
+
assert.equal(result.rounds.length, 2);
|
|
51
|
+
});
|
|
52
|
+
test("loop escalates blocked and needs-human outcomes immediately", async () => {
|
|
53
|
+
const scenarios = [
|
|
54
|
+
{ status: "blocked", verdict: "blocked", exitCode: 4 },
|
|
55
|
+
{ status: "needs_human", verdict: "needs_clarification", exitCode: 3 },
|
|
56
|
+
];
|
|
57
|
+
for (const scenario of scenarios) {
|
|
58
|
+
let calls = 0;
|
|
59
|
+
const result = await runReviewLoop(3, async () => {
|
|
60
|
+
calls += 1;
|
|
61
|
+
return {
|
|
62
|
+
meta: meta(scenario.status, scenario.verdict),
|
|
63
|
+
exitCode: scenario.exitCode,
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
assert.equal(calls, 1);
|
|
67
|
+
assert.equal(result.stopReason, scenario.status);
|
|
68
|
+
assert.equal(result.exitCode, scenario.exitCode);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
test("loop summary reports each round and final outcome", async () => {
|
|
72
|
+
const sequence = [
|
|
73
|
+
{ meta: meta("has_findings", "request_changes", 1_200), exitCode: 1 },
|
|
74
|
+
{ meta: meta("clean", "approve", 800), exitCode: 0 },
|
|
75
|
+
];
|
|
76
|
+
const result = await runReviewLoop(3, async (roundIndex) => sequence[roundIndex - 1]);
|
|
77
|
+
const summary = formatLoopSummary(result);
|
|
78
|
+
assert.match(summary, /pi-review loop/);
|
|
79
|
+
assert.match(summary, /Round 1.*HAS FINDINGS.*REQUEST CHANGES.*1\.2s/);
|
|
80
|
+
assert.match(summary, /Round 2.*CLEAN.*APPROVE.*800ms/);
|
|
81
|
+
assert.match(summary, /Stop.*clean/);
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=loop.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.test.js","sourceRoot":"","sources":["../src/loop.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { type SourceFinding } from "./types.js";
|
|
2
|
+
/** Result of matching a set of source findings into clusters. */
|
|
3
|
+
export interface MatchResult {
|
|
4
|
+
/**
|
|
5
|
+
* Each group is a list of source finding IDs that represent the same
|
|
6
|
+
* underlying issue. Every input source ID must appear in exactly one group.
|
|
7
|
+
*/
|
|
8
|
+
groups: string[][];
|
|
9
|
+
/** Matcher-detected problems (invented IDs, missing IDs, malformed output). */
|
|
10
|
+
errors: string[];
|
|
11
|
+
/** True when a semantic adjudicator was actually consulted. */
|
|
12
|
+
adjudicationUsed: boolean;
|
|
13
|
+
}
|
|
14
|
+
/** A finding matcher clusters source findings into groups. */
|
|
15
|
+
export interface FindingMatcher {
|
|
16
|
+
match(findings: SourceFinding[]): MatchResult | Promise<MatchResult>;
|
|
17
|
+
}
|
|
18
|
+
/** Normalize a path anchor so reviewers that phrase paths slightly differently still match. */
|
|
19
|
+
export declare function normalizePath(value: string | undefined): string;
|
|
20
|
+
/** Normalize a finding summary for deterministic comparison. */
|
|
21
|
+
export declare function normalizeSummary(value: string | undefined): string;
|
|
22
|
+
/** Deterministic cluster key: shared path anchor plus normalized summary. */
|
|
23
|
+
export declare function deterministicKey(finding: {
|
|
24
|
+
path?: string;
|
|
25
|
+
summary: string;
|
|
26
|
+
}): string;
|
|
27
|
+
/**
|
|
28
|
+
* Phase-one matcher: clusters findings that share a path anchor AND a
|
|
29
|
+
* normalized summary. Findings with different paths never merge here; findings
|
|
30
|
+
* with the same path but different wording form separate clusters and become
|
|
31
|
+
* candidates for semantic adjudication.
|
|
32
|
+
*/
|
|
33
|
+
export declare class DeterministicMatcher implements FindingMatcher {
|
|
34
|
+
match(findings: SourceFinding[]): MatchResult;
|
|
35
|
+
}
|
|
36
|
+
/** A candidate group sharing a path anchor but differing in wording. */
|
|
37
|
+
export interface AdjudicationCandidate {
|
|
38
|
+
anchorPath: string;
|
|
39
|
+
findings: SourceFinding[];
|
|
40
|
+
}
|
|
41
|
+
/** Request sent to a semantic adjudicator. */
|
|
42
|
+
export interface AdjudicationRequest {
|
|
43
|
+
candidates: AdjudicationCandidate[];
|
|
44
|
+
}
|
|
45
|
+
/** A proposed merge of source finding IDs into one cluster. */
|
|
46
|
+
export interface AdjudicationMerge {
|
|
47
|
+
sourceFindingIds: string[];
|
|
48
|
+
confidence: number;
|
|
49
|
+
}
|
|
50
|
+
/** Response from a semantic adjudicator. */
|
|
51
|
+
export interface AdjudicationResponse {
|
|
52
|
+
merges: AdjudicationMerge[];
|
|
53
|
+
errors?: string[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A constrained semantic adjudicator. It receives structured findings only and
|
|
57
|
+
* returns proposed merges with confidence. It may not invent source IDs, drop
|
|
58
|
+
* source IDs, claim new evidence, or act as another reviewer.
|
|
59
|
+
*/
|
|
60
|
+
export interface SemanticAdjudicator {
|
|
61
|
+
adjudicate(request: AdjudicationRequest): AdjudicationResponse | Promise<AdjudicationResponse>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Phase-two matcher: deterministic first, then an injected adjudicator may
|
|
65
|
+
* merge ambiguous same-path candidates. Low-confidence matches are not merged.
|
|
66
|
+
* Invented or missing source IDs are reported as errors and never merged.
|
|
67
|
+
*/
|
|
68
|
+
export declare class SemanticMatcher implements FindingMatcher {
|
|
69
|
+
private readonly adjudicator;
|
|
70
|
+
private readonly deterministic;
|
|
71
|
+
constructor(adjudicator: SemanticAdjudicator);
|
|
72
|
+
match(findings: SourceFinding[]): Promise<MatchResult>;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../src/matcher.ts"],"names":[],"mappings":"AAQA,OAAO,EAAuC,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAErF,iEAAiE;AACjE,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnB,+EAA+E;IAC/E,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,+DAA+D;IAC/D,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,8DAA8D;AAC9D,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACtE;AAED,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAO/D;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAQlE;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEpF;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IACzD,KAAK,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,WAAW;CAoB9C;AAED,wEAAwE;AACxE,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,8CAA8C;AAC9C,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,qBAAqB,EAAE,CAAC;CACrC;AAED,+DAA+D;AAC/D,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,4CAA4C;AAC5C,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,OAAO,EAAE,mBAAmB,GAAG,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAChG;AAED;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,cAAc;IAExC,OAAO,CAAC,QAAQ,CAAC,WAAW;IADxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8B;gBAC/B,WAAW,EAAE,mBAAmB;IAEvD,KAAK,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;CAgI7D"}
|