@zephyrdeng/pi-review 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -7
- package/README.zh-CN.md +45 -5
- package/dist/args.d.ts +4 -0
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +82 -5
- package/dist/args.js.map +1 -1
- package/dist/args.test.js +72 -1
- package/dist/args.test.js.map +1 -1
- package/dist/child-process.d.ts +6 -0
- package/dist/child-process.d.ts.map +1 -1
- package/dist/child-process.js +48 -0
- package/dist/child-process.js.map +1 -1
- package/dist/child-process.test.js +55 -1
- package/dist/child-process.test.js.map +1 -1
- package/dist/cli-exit.test.js +14 -5
- package/dist/cli-exit.test.js.map +1 -1
- package/dist/cli.js +8 -3
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +13 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -5
- package/dist/index.js.map +1 -1
- package/dist/install-args.test.js +1 -1
- package/dist/install-args.test.js.map +1 -1
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +2 -3
- package/dist/install.js.map +1 -1
- package/dist/json-events.d.ts +34 -2
- package/dist/json-events.d.ts.map +1 -1
- package/dist/json-events.js +156 -49
- package/dist/json-events.js.map +1 -1
- package/dist/json-events.test.js +176 -4
- package/dist/json-events.test.js.map +1 -1
- package/dist/loop.d.ts +28 -2
- package/dist/loop.d.ts.map +1 -1
- package/dist/loop.js +45 -3
- package/dist/loop.js.map +1 -1
- package/dist/loop.test.js +24 -1
- package/dist/loop.test.js.map +1 -1
- package/dist/matcher.test.js +1 -1
- package/dist/matcher.test.js.map +1 -1
- package/dist/meta-footer.d.ts +4 -8
- package/dist/meta-footer.d.ts.map +1 -1
- package/dist/meta-footer.js +19 -5
- package/dist/meta-footer.js.map +1 -1
- package/dist/meta-footer.test.js +11 -4
- package/dist/meta-footer.test.js.map +1 -1
- package/dist/panel-aggregate.test.js +1 -1
- package/dist/panel-aggregate.test.js.map +1 -1
- 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 +55 -0
- package/dist/panel-cancellation.test.js.map +1 -0
- package/dist/panel-cli-ui.test.d.ts +2 -0
- package/dist/panel-cli-ui.test.d.ts.map +1 -0
- package/dist/panel-cli-ui.test.js +91 -0
- package/dist/panel-cli-ui.test.js.map +1 -0
- package/dist/panel-cli.test.js +76 -27
- package/dist/panel-cli.test.js.map +1 -1
- package/dist/panel-config.d.ts +38 -0
- package/dist/panel-config.d.ts.map +1 -1
- package/dist/panel-config.js +137 -4
- package/dist/panel-config.js.map +1 -1
- package/dist/panel-config.test.js +84 -4
- package/dist/panel-config.test.js.map +1 -1
- package/dist/panel-loop.test.js +1 -1
- package/dist/panel-loop.test.js.map +1 -1
- 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-ui.d.ts +20 -0
- package/dist/panel-ui.d.ts.map +1 -0
- package/dist/panel-ui.js +84 -0
- package/dist/panel-ui.js.map +1 -0
- package/dist/panel-ui.test.d.ts +2 -0
- package/dist/panel-ui.test.d.ts.map +1 -0
- package/dist/panel-ui.test.js +122 -0
- package/dist/panel-ui.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 +42 -0
- package/dist/panel-view.d.ts.map +1 -0
- package/dist/panel-view.js +124 -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 +112 -0
- package/dist/panel-view.test.js.map +1 -0
- package/dist/panel.d.ts +22 -2
- package/dist/panel.d.ts.map +1 -1
- package/dist/panel.js +184 -60
- package/dist/panel.js.map +1 -1
- package/dist/prompt.d.ts +2 -0
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +34 -3
- package/dist/prompt.js.map +1 -1
- package/dist/prompt.test.js +21 -2
- package/dist/prompt.test.js.map +1 -1
- 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.test.js +1 -1
- package/dist/review-result.test.js.map +1 -1
- package/dist/review.js +3 -3
- package/dist/review.js.map +1 -1
- package/dist/review.meta.test.js +1 -1
- package/dist/review.meta.test.js.map +1 -1
- package/dist/skill-protocol.test.js +1 -1
- package/dist/skill-protocol.test.js.map +1 -1
- package/dist/skill-update.test.d.ts +2 -0
- package/dist/skill-update.test.d.ts.map +1 -0
- package/dist/skill-update.test.js +23 -0
- package/dist/skill-update.test.js.map +1 -0
- package/dist/skill.d.ts +22 -0
- package/dist/skill.d.ts.map +1 -1
- package/dist/skill.js +109 -22
- package/dist/skill.js.map +1 -1
- package/dist/types.d.ts +28 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -1
- package/dist/ui-client.d.ts +13 -0
- package/dist/ui-client.d.ts.map +1 -0
- package/dist/ui-client.js +161 -0
- package/dist/ui-client.js.map +1 -0
- package/dist/ui-client.test.d.ts +2 -0
- package/dist/ui-client.test.d.ts.map +1 -0
- package/dist/ui-client.test.js +48 -0
- package/dist/ui-client.test.js.map +1 -0
- package/dist/ui-html.d.ts +7 -0
- package/dist/ui-html.d.ts.map +1 -0
- package/dist/ui-html.js +52 -0
- package/dist/ui-html.js.map +1 -0
- package/dist/ui-html.test.d.ts +2 -0
- package/dist/ui-html.test.d.ts.map +1 -0
- package/dist/ui-html.test.js +26 -0
- package/dist/ui-html.test.js.map +1 -0
- package/dist/ui-server-main.d.ts +3 -0
- package/dist/ui-server-main.d.ts.map +1 -0
- package/dist/ui-server-main.js +128 -0
- package/dist/ui-server-main.js.map +1 -0
- package/dist/ui-server-main.test.d.ts +2 -0
- package/dist/ui-server-main.test.d.ts.map +1 -0
- package/dist/ui-server-main.test.js +123 -0
- package/dist/ui-server-main.test.js.map +1 -0
- package/dist/ui-server.d.ts +42 -0
- package/dist/ui-server.d.ts.map +1 -0
- package/dist/ui-server.js +233 -0
- package/dist/ui-server.js.map +1 -0
- package/dist/ui-server.test.d.ts +2 -0
- package/dist/ui-server.test.d.ts.map +1 -0
- package/dist/ui-server.test.js +236 -0
- package/dist/ui-server.test.js.map +1 -0
- package/dist/update.d.ts.map +1 -1
- package/dist/update.js +48 -19
- package/dist/update.js.map +1 -1
- package/extensions/panel-tool.test.ts +388 -0
- package/extensions/panel-tool.ts +390 -0
- package/extensions/review.test.ts +79 -0
- package/extensions/review.ts +191 -45
- package/extensions/rv-completions.test.ts +177 -18
- package/extensions/rv-completions.ts +490 -60
- package/extensions/rv-interactive.test.ts +562 -0
- package/extensions/rv-interactive.ts +616 -0
- package/extensions/rv-locale.test.ts +12 -4
- package/extensions/rv-locale.ts +44 -11
- package/extensions/rv-model-picker.test.ts +172 -0
- package/extensions/rv-model-picker.ts +313 -0
- package/extensions/rv-model-priorities.test.ts +29 -9
- package/extensions/rv-model-priorities.ts +23 -8
- package/extensions/rv-prompts.test.ts +281 -2
- package/extensions/rv-prompts.ts +480 -32
- package/extensions/rv-resolve.test.ts +189 -0
- package/extensions/rv-resolve.ts +313 -0
- package/extensions/rv-semantic.test.ts +1 -1
- package/extensions/rv-semantic.ts +38 -4
- package/package.json +18 -6
- package/resources/review-presets.json +2 -2
- package/resources/rv-model-priorities.json +18 -9
- package/skills/pi-review/SKILL.md +84 -60
- package/skills/pi-review/references/codex-tools.md +18 -11
- package/skills/pi-review/references/model-selection.md +49 -28
- package/dist/extensions/review.d.ts +0 -2
- package/dist/extensions/review.js +0 -22
- package/dist/extensions/rv-prompts.d.ts +0 -19
- package/dist/extensions/rv-prompts.js +0 -132
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// Pure state reducer shared by the Pi renderer and future event consumers.
|
|
2
|
+
import { sumPanelUsage } from "./panel-usage.js";
|
|
3
|
+
const ACTIVITY_LIMIT = 8;
|
|
4
|
+
/** Rolling cap for a coalesced text-delta line so activity stays readable. */
|
|
5
|
+
const TEXT_ACTIVITY_LIMIT = 480;
|
|
6
|
+
export function createPanelViewState() {
|
|
7
|
+
return {
|
|
8
|
+
lastSeq: 0,
|
|
9
|
+
phase: "idle",
|
|
10
|
+
reviewers: {},
|
|
11
|
+
aggregate: { total: 0, queued: 0, running: 0, completed: 0, failed: 0, cancelled: 0 },
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function addActivity(reviewer, activity) {
|
|
15
|
+
return { ...reviewer, recentActivity: [...reviewer.recentActivity, activity].slice(-ACTIVITY_LIMIT) };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Discrete milestone lines we emit ourselves. Everything else is treated as
|
|
19
|
+
* coalescable review prose so consecutive `text.delta` chunks do not each
|
|
20
|
+
* become a one-character activity row (which rendered as one char per line).
|
|
21
|
+
*/
|
|
22
|
+
function isSystemActivity(line) {
|
|
23
|
+
if (line === "review started" || line === "review completed" || line === "review cancelled")
|
|
24
|
+
return true;
|
|
25
|
+
if (/^turn \d+$/.test(line))
|
|
26
|
+
return true;
|
|
27
|
+
if (/^tool /.test(line))
|
|
28
|
+
return true;
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
/** Append a streaming text delta into the last open prose line, or start a new one. */
|
|
32
|
+
function appendTextDelta(reviewer, text) {
|
|
33
|
+
if (!text)
|
|
34
|
+
return reviewer;
|
|
35
|
+
const activities = [...reviewer.recentActivity];
|
|
36
|
+
const last = activities[activities.length - 1];
|
|
37
|
+
if (last !== undefined && !isSystemActivity(last)) {
|
|
38
|
+
const merged = last + text;
|
|
39
|
+
activities[activities.length - 1] =
|
|
40
|
+
merged.length > TEXT_ACTIVITY_LIMIT ? merged.slice(-TEXT_ACTIVITY_LIMIT) : merged;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
activities.push(text.length > TEXT_ACTIVITY_LIMIT ? text.slice(-TEXT_ACTIVITY_LIMIT) : text);
|
|
44
|
+
}
|
|
45
|
+
return { ...reviewer, recentActivity: activities.slice(-ACTIVITY_LIMIT) };
|
|
46
|
+
}
|
|
47
|
+
function fallbackReviewer(reviewerId) {
|
|
48
|
+
return { reviewerId, role: reviewerId, model: null, status: "queued", turns: 0, recentActivity: [] };
|
|
49
|
+
}
|
|
50
|
+
function withAggregate(state) {
|
|
51
|
+
const statuses = Object.values(state.reviewers).map((reviewer) => reviewer.status);
|
|
52
|
+
const usage = sumPanelUsage(Object.values(state.reviewers).map((reviewer) => reviewer.usage));
|
|
53
|
+
return {
|
|
54
|
+
...state,
|
|
55
|
+
aggregate: {
|
|
56
|
+
total: statuses.length,
|
|
57
|
+
queued: statuses.filter((status) => status === "queued").length,
|
|
58
|
+
running: statuses.filter((status) => status === "running").length,
|
|
59
|
+
completed: statuses.filter((status) => status === "completed").length,
|
|
60
|
+
failed: statuses.filter((status) => status === "failed").length,
|
|
61
|
+
cancelled: statuses.filter((status) => status === "cancelled").length,
|
|
62
|
+
...(usage ? { usage } : {}),
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** Unknown, duplicate, out-of-order, and other-run events leave state intact. */
|
|
67
|
+
export function reducePanelEvent(state, event) {
|
|
68
|
+
const knownTypes = new Set([
|
|
69
|
+
"panel.started", "reviewer.queued", "reviewer.started", "reviewer.turn.started", "reviewer.tool.started", "reviewer.tool.finished", "reviewer.text.delta", "reviewer.usage", "reviewer.completed", "reviewer.failed", "reviewer.cancelled", "aggregation.started", "panel.completed",
|
|
70
|
+
]);
|
|
71
|
+
if (!knownTypes.has(event.type) || event.seq <= state.lastSeq || (state.runId && event.runId !== state.runId))
|
|
72
|
+
return state;
|
|
73
|
+
let next = { ...state, runId: event.runId, lastSeq: event.seq };
|
|
74
|
+
if (event.type === "panel.started") {
|
|
75
|
+
const reviewers = Object.fromEntries(event.reviewers.map((identity) => [identity.reviewerId, { ...identity, status: "queued", turns: 0, recentActivity: [] }]));
|
|
76
|
+
return withAggregate({ ...next, target: event.target, mode: event.mode, ...(event.panelPreset ? { panelPreset: event.panelPreset } : {}), startedAt: event.at, phase: "running", reviewers });
|
|
77
|
+
}
|
|
78
|
+
if (event.type === "aggregation.started")
|
|
79
|
+
return withAggregate({ ...next, phase: "aggregating" });
|
|
80
|
+
if (event.type === "panel.completed") {
|
|
81
|
+
const completed = withAggregate({ ...next, phase: "completed", completedAt: event.at, meta: event.meta });
|
|
82
|
+
return { ...completed, aggregate: { ...completed.aggregate, ...(event.meta.usage ? { usage: event.meta.usage } : {}) } };
|
|
83
|
+
}
|
|
84
|
+
const reviewerId = event.reviewerId;
|
|
85
|
+
const previous = state.reviewers[reviewerId] ?? fallbackReviewer(reviewerId);
|
|
86
|
+
let reviewer = previous;
|
|
87
|
+
switch (event.type) {
|
|
88
|
+
case "reviewer.queued":
|
|
89
|
+
reviewer = { ...previous, status: "queued", activityAt: event.at };
|
|
90
|
+
break;
|
|
91
|
+
case "reviewer.started":
|
|
92
|
+
reviewer = addActivity({ ...previous, status: "running", startedAt: event.at, activityAt: event.at }, "review started");
|
|
93
|
+
break;
|
|
94
|
+
case "reviewer.turn.started":
|
|
95
|
+
reviewer = addActivity({ ...previous, status: "running", turns: event.turn, activityAt: event.at }, `turn ${event.turn}`);
|
|
96
|
+
break;
|
|
97
|
+
case "reviewer.tool.started":
|
|
98
|
+
reviewer = addActivity({ ...previous, status: "running", activeTool: event.tool, activeToolSummary: event.summary, activityAt: event.at }, `tool ${event.tool}${event.summary ? `: ${event.summary}` : ""}`);
|
|
99
|
+
break;
|
|
100
|
+
case "reviewer.tool.finished":
|
|
101
|
+
reviewer = addActivity({ ...previous, status: "running", activeTool: undefined, activeToolSummary: undefined, activityAt: event.at }, `tool ${event.tool} finished${event.summary ? `: ${event.summary}` : ""}`);
|
|
102
|
+
break;
|
|
103
|
+
case "reviewer.text.delta":
|
|
104
|
+
// Coalesce stream chunks into one activity line. Without this, each
|
|
105
|
+
// character/token becomes its own row and the TUI renders one char/line.
|
|
106
|
+
reviewer = appendTextDelta({ ...previous, status: "running", activityAt: event.at }, event.text);
|
|
107
|
+
break;
|
|
108
|
+
case "reviewer.usage":
|
|
109
|
+
reviewer = { ...previous, usage: event.usage, activityAt: event.at };
|
|
110
|
+
break;
|
|
111
|
+
case "reviewer.completed":
|
|
112
|
+
reviewer = addActivity({ ...previous, status: "completed", activeTool: undefined, activeToolSummary: undefined, completedAt: event.at, activityAt: event.at, usage: event.submission.usage ?? previous.usage, submission: event.submission }, "review completed");
|
|
113
|
+
break;
|
|
114
|
+
case "reviewer.failed":
|
|
115
|
+
reviewer = addActivity({ ...previous, status: "failed", activeTool: undefined, activeToolSummary: undefined, completedAt: event.at, activityAt: event.at, error: event.message }, event.message);
|
|
116
|
+
break;
|
|
117
|
+
case "reviewer.cancelled":
|
|
118
|
+
reviewer = addActivity({ ...previous, status: "cancelled", activeTool: undefined, activeToolSummary: undefined, completedAt: event.at, activityAt: event.at, ...(event.message ? { error: event.message } : {}) }, event.message ?? "review cancelled");
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
next = { ...next, reviewers: { ...state.reviewers, [reviewerId]: reviewer } };
|
|
122
|
+
return withAggregate(next);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=panel-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel-view.js","sourceRoot":"","sources":["../src/panel-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel-view.test.d.ts","sourceRoot":"","sources":["../src/panel-view.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { test } from "vitest";
|
|
3
|
+
import { createPanelViewState, reducePanelEvent } from "./panel-view.js";
|
|
4
|
+
function event(type, seq, payload) {
|
|
5
|
+
return { v: 1, runId: "run-1", seq, at: 1000 + seq, type, ...payload };
|
|
6
|
+
}
|
|
7
|
+
test("panel reducer produces the same final state during live delivery and replay", () => {
|
|
8
|
+
const events = [
|
|
9
|
+
event("panel.started", 1, { target: "@src", mode: "code", reviewers: [{ reviewerId: "security", role: "Security", model: "openai/gpt", thinking: "high" }] }),
|
|
10
|
+
event("reviewer.queued", 2, { reviewerId: "security" }),
|
|
11
|
+
event("reviewer.started", 3, { reviewerId: "security" }),
|
|
12
|
+
event("reviewer.tool.started", 4, { reviewerId: "security", tool: "read", summary: "src/panel.ts" }),
|
|
13
|
+
event("reviewer.usage", 5, { reviewerId: "security", usage: { input: 10, output: 4, cacheRead: 0, cacheWrite: 0, reasoning: 2, totalTokens: 14 } }),
|
|
14
|
+
event("reviewer.completed", 6, { reviewerId: "security", submission: { reviewerId: "security", role: "Security", model: "openai/gpt", durationMs: 20, result: { status: "clean", verdict: "approve", verdictSource: "parsed", findings: [], actionableCount: 0 } } }),
|
|
15
|
+
event("aggregation.started", 7, {}),
|
|
16
|
+
];
|
|
17
|
+
const live = events.reduce(reducePanelEvent, createPanelViewState());
|
|
18
|
+
const replay = events.reduce(reducePanelEvent, createPanelViewState());
|
|
19
|
+
assert.deepEqual(replay, live);
|
|
20
|
+
assert.equal(live.reviewers.security?.status, "completed");
|
|
21
|
+
assert.equal(live.reviewers.security?.activeTool, undefined);
|
|
22
|
+
assert.equal(live.reviewers.security?.activeToolSummary, undefined);
|
|
23
|
+
assert.equal(live.aggregate.completed, 1);
|
|
24
|
+
assert.equal(live.phase, "aggregating");
|
|
25
|
+
});
|
|
26
|
+
test("panel reducer keeps the active tool summary while a tool is running", () => {
|
|
27
|
+
let state = reducePanelEvent(createPanelViewState(), event("panel.started", 1, {
|
|
28
|
+
target: "@src",
|
|
29
|
+
mode: "code",
|
|
30
|
+
reviewers: [{ reviewerId: "security", role: "Security", model: null }],
|
|
31
|
+
}));
|
|
32
|
+
state = reducePanelEvent(state, event("reviewer.tool.started", 2, { reviewerId: "security", tool: "read", summary: "src/panel.ts" }));
|
|
33
|
+
assert.equal(state.reviewers.security?.activeTool, "read");
|
|
34
|
+
assert.equal(state.reviewers.security?.activeToolSummary, "src/panel.ts");
|
|
35
|
+
state = reducePanelEvent(state, event("reviewer.tool.finished", 3, { reviewerId: "security", tool: "read" }));
|
|
36
|
+
assert.equal(state.reviewers.security?.activeTool, undefined);
|
|
37
|
+
assert.equal(state.reviewers.security?.activeToolSummary, undefined);
|
|
38
|
+
});
|
|
39
|
+
test("terminal panel usage reuses the CLI aggregation semantics", () => {
|
|
40
|
+
const now = Date.now();
|
|
41
|
+
let state = reducePanelEvent(createPanelViewState(), {
|
|
42
|
+
v: 1, runId: "run-usage", seq: 1, at: now, type: "panel.started", target: "@src", mode: "code",
|
|
43
|
+
reviewers: [{ reviewerId: "r1", role: "one", model: null }, { reviewerId: "r2", role: "two", model: null }],
|
|
44
|
+
});
|
|
45
|
+
state = reducePanelEvent(state, { v: 1, runId: "run-usage", seq: 2, at: now, type: "reviewer.usage", reviewerId: "r1", usage: { input: 100, output: 10, cacheRead: 20, cacheWrite: 0, reasoning: 5, totalTokens: 110 } });
|
|
46
|
+
state = reducePanelEvent(state, { v: 1, runId: "run-usage", seq: 3, at: now, type: "reviewer.usage", reviewerId: "r2", usage: { input: 80, output: 30, cacheRead: 10, cacheWrite: 0, reasoning: 7, totalTokens: 110 } });
|
|
47
|
+
assert.deepEqual(state.aggregate.usage, { input: 180, output: 40, cacheRead: 30, cacheWrite: 0, reasoning: 12, totalTokens: 220 });
|
|
48
|
+
});
|
|
49
|
+
test("panel reducer ignores duplicates, unknown events, and out-of-order delivery", () => {
|
|
50
|
+
const started = event("panel.started", 1, { target: "@src", mode: "code", reviewers: [] });
|
|
51
|
+
const state = reducePanelEvent(createPanelViewState(), started);
|
|
52
|
+
const duplicate = reducePanelEvent(state, started);
|
|
53
|
+
const unknown = reducePanelEvent(duplicate, { v: 1, runId: "run-1", seq: 2, at: 1002, type: "future.event" });
|
|
54
|
+
const later = reducePanelEvent(unknown, event("aggregation.started", 3, {}));
|
|
55
|
+
const outOfOrder = reducePanelEvent(later, event("aggregation.started", 2, {}));
|
|
56
|
+
assert.equal(outOfOrder.lastSeq, 3);
|
|
57
|
+
assert.equal(outOfOrder.phase, "aggregating");
|
|
58
|
+
});
|
|
59
|
+
test("text.delta chunks coalesce into one activity line instead of one row per chunk", () => {
|
|
60
|
+
let state = reducePanelEvent(createPanelViewState(), event("panel.started", 1, {
|
|
61
|
+
target: "@src",
|
|
62
|
+
mode: "code",
|
|
63
|
+
reviewers: [{ reviewerId: "r2", role: "r2", model: null }],
|
|
64
|
+
}));
|
|
65
|
+
state = reducePanelEvent(state, event("reviewer.started", 2, { reviewerId: "r2" }));
|
|
66
|
+
// Simulate CJK streaming one character at a time (the bug that rendered one char per line).
|
|
67
|
+
for (const [i, ch] of [..."上的独立发现是否可被聚合?"].entries()) {
|
|
68
|
+
state = reducePanelEvent(state, event("reviewer.text.delta", 3 + i, { reviewerId: "r2", text: ch }));
|
|
69
|
+
}
|
|
70
|
+
const activity = state.reviewers.r2?.recentActivity ?? [];
|
|
71
|
+
// System milestone + one coalesced prose line — not N single-char rows.
|
|
72
|
+
assert.equal(activity.filter((line) => line === "review started").length, 1);
|
|
73
|
+
const prose = activity.filter((line) => line !== "review started");
|
|
74
|
+
assert.equal(prose.length, 1, `expected one prose line, got: ${JSON.stringify(prose)}`);
|
|
75
|
+
assert.equal(prose[0], "上的独立发现是否可被聚合?");
|
|
76
|
+
});
|
|
77
|
+
test("text.delta after a tool milestone starts a new prose line", () => {
|
|
78
|
+
let state = reducePanelEvent(createPanelViewState(), event("panel.started", 1, {
|
|
79
|
+
target: "@src",
|
|
80
|
+
mode: "code",
|
|
81
|
+
reviewers: [{ reviewerId: "r1", role: "r1", model: null }],
|
|
82
|
+
}));
|
|
83
|
+
state = reducePanelEvent(state, event("reviewer.started", 2, { reviewerId: "r1" }));
|
|
84
|
+
state = reducePanelEvent(state, event("reviewer.text.delta", 3, { reviewerId: "r1", text: "## Open" }));
|
|
85
|
+
state = reducePanelEvent(state, event("reviewer.text.delta", 4, { reviewerId: "r1", text: " Questions\nNone." }));
|
|
86
|
+
state = reducePanelEvent(state, event("reviewer.tool.started", 5, { reviewerId: "r1", tool: "read", summary: "src/x.ts" }));
|
|
87
|
+
state = reducePanelEvent(state, event("reviewer.text.delta", 6, { reviewerId: "r1", text: "after tool" }));
|
|
88
|
+
const activity = state.reviewers.r1?.recentActivity ?? [];
|
|
89
|
+
assert.deepEqual(activity, [
|
|
90
|
+
"review started",
|
|
91
|
+
"## Open Questions\nNone.",
|
|
92
|
+
"tool read: src/x.ts",
|
|
93
|
+
"after tool",
|
|
94
|
+
]);
|
|
95
|
+
});
|
|
96
|
+
test("coalesced text.delta is capped to a rolling tail", () => {
|
|
97
|
+
let state = reducePanelEvent(createPanelViewState(), event("panel.started", 1, {
|
|
98
|
+
target: "@src",
|
|
99
|
+
mode: "code",
|
|
100
|
+
reviewers: [{ reviewerId: "r1", role: "r1", model: null }],
|
|
101
|
+
}));
|
|
102
|
+
state = reducePanelEvent(state, event("reviewer.started", 2, { reviewerId: "r1" }));
|
|
103
|
+
// 600 chars of prose in 1-char deltas → capped to 480.
|
|
104
|
+
for (let i = 0; i < 600; i++) {
|
|
105
|
+
state = reducePanelEvent(state, event("reviewer.text.delta", 3 + i, { reviewerId: "r1", text: "x" }));
|
|
106
|
+
}
|
|
107
|
+
const prose = (state.reviewers.r1?.recentActivity ?? []).find((line) => line !== "review started");
|
|
108
|
+
assert.ok(prose);
|
|
109
|
+
assert.equal(prose.length, 480);
|
|
110
|
+
assert.equal(prose, "x".repeat(480));
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=panel-view.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel-view.test.js","sourceRoot":"","sources":["../src/panel-view.test.ts"],"names":[],"mappings":"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"}
|
package/dist/panel.d.ts
CHANGED
|
@@ -1,10 +1,30 @@
|
|
|
1
|
-
import type { ParsedArgs, PanelReviewMeta } from "./types.js";
|
|
1
|
+
import type { ParsedArgs, PanelReviewMeta, ReviewerSubmission } from "./types.js";
|
|
2
|
+
export { PANEL_READ_ONLY_TOOLS } from "./types.js";
|
|
3
|
+
import { type ReviewEventListener } from "./review-events.js";
|
|
4
|
+
/** Emit the aggregate panel footer (ASCII + JSON) like a single review. */
|
|
2
5
|
export declare function emitPanelFooter(meta: PanelReviewMeta): void;
|
|
6
|
+
/** Resolve reviewer tools through the hard allowlist; rejected requests cannot silently widen access. */
|
|
7
|
+
export declare function resolvePanelReviewerTools(tools: string | string[] | undefined): string;
|
|
8
|
+
export interface PanelRunOptions {
|
|
9
|
+
onEvent?: ReviewEventListener;
|
|
10
|
+
signal?: AbortSignal;
|
|
11
|
+
emitFooter?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/** Keep finished reviewer results on abort; only rewrite interrupted/runtime-cancelled work. */
|
|
14
|
+
export declare function shouldPreserveSubmissionOnAbort(submission: ReviewerSubmission): boolean;
|
|
3
15
|
/** Run one complete panel evaluation and return the aggregate result (no exit). */
|
|
4
|
-
export declare function runPanelReviewOnce(parsed: ParsedArgs, stdinText?: string): Promise<{
|
|
16
|
+
export declare function runPanelReviewOnce(parsed: ParsedArgs, stdinText?: string, options?: PanelRunOptions): Promise<{
|
|
5
17
|
meta: PanelReviewMeta;
|
|
6
18
|
exitCode: number;
|
|
7
19
|
}>;
|
|
8
20
|
/** CLI-compatible panel review entrypoint. */
|
|
9
21
|
export declare function runPanelReview(parsed: ParsedArgs): Promise<never>;
|
|
22
|
+
/**
|
|
23
|
+
* CLI-compatible panel review entrypoint with the loopback dashboard (issue
|
|
24
|
+
* #4). The dashboard server is a detached process: this review process still
|
|
25
|
+
* appends normalized events and exits with the existing review exit code
|
|
26
|
+
* immediately once the run completes, regardless of the dashboard's own
|
|
27
|
+
* idle-TTL lifetime.
|
|
28
|
+
*/
|
|
29
|
+
export declare function runPanelReviewWithUi(parsed: ParsedArgs): Promise<never>;
|
|
10
30
|
//# sourceMappingURL=panel.d.ts.map
|
package/dist/panel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../src/panel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../src/panel.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,kBAAkB,EAGnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAgBnD,OAAO,EAAiG,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG7J,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAa3D;AAWD,yGAAyG;AACzG,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CAStF;AAyPD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAmBD,gGAAgG;AAChG,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAEvF;AAED,mFAAmF;AACnF,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,UAAU,EAClB,SAAS,SAAoB,EAC7B,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA4HtD;AAcD,8CAA8C;AAC9C,wBAAsB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAEvE;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAM7E"}
|