@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.
Files changed (194) hide show
  1. package/README.md +51 -7
  2. package/README.zh-CN.md +45 -5
  3. package/dist/args.d.ts +4 -0
  4. package/dist/args.d.ts.map +1 -1
  5. package/dist/args.js +82 -5
  6. package/dist/args.js.map +1 -1
  7. package/dist/args.test.js +72 -1
  8. package/dist/args.test.js.map +1 -1
  9. package/dist/child-process.d.ts +6 -0
  10. package/dist/child-process.d.ts.map +1 -1
  11. package/dist/child-process.js +48 -0
  12. package/dist/child-process.js.map +1 -1
  13. package/dist/child-process.test.js +55 -1
  14. package/dist/child-process.test.js.map +1 -1
  15. package/dist/cli-exit.test.js +14 -5
  16. package/dist/cli-exit.test.js.map +1 -1
  17. package/dist/cli.js +8 -3
  18. package/dist/cli.js.map +1 -1
  19. package/dist/index.d.ts +13 -6
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +9 -5
  22. package/dist/index.js.map +1 -1
  23. package/dist/install-args.test.js +1 -1
  24. package/dist/install-args.test.js.map +1 -1
  25. package/dist/install.d.ts.map +1 -1
  26. package/dist/install.js +2 -3
  27. package/dist/install.js.map +1 -1
  28. package/dist/json-events.d.ts +34 -2
  29. package/dist/json-events.d.ts.map +1 -1
  30. package/dist/json-events.js +156 -49
  31. package/dist/json-events.js.map +1 -1
  32. package/dist/json-events.test.js +176 -4
  33. package/dist/json-events.test.js.map +1 -1
  34. package/dist/loop.d.ts +28 -2
  35. package/dist/loop.d.ts.map +1 -1
  36. package/dist/loop.js +45 -3
  37. package/dist/loop.js.map +1 -1
  38. package/dist/loop.test.js +24 -1
  39. package/dist/loop.test.js.map +1 -1
  40. package/dist/matcher.test.js +1 -1
  41. package/dist/matcher.test.js.map +1 -1
  42. package/dist/meta-footer.d.ts +4 -8
  43. package/dist/meta-footer.d.ts.map +1 -1
  44. package/dist/meta-footer.js +19 -5
  45. package/dist/meta-footer.js.map +1 -1
  46. package/dist/meta-footer.test.js +11 -4
  47. package/dist/meta-footer.test.js.map +1 -1
  48. package/dist/panel-aggregate.test.js +1 -1
  49. package/dist/panel-aggregate.test.js.map +1 -1
  50. package/dist/panel-cancellation.test.d.ts +2 -0
  51. package/dist/panel-cancellation.test.d.ts.map +1 -0
  52. package/dist/panel-cancellation.test.js +55 -0
  53. package/dist/panel-cancellation.test.js.map +1 -0
  54. package/dist/panel-cli-ui.test.d.ts +2 -0
  55. package/dist/panel-cli-ui.test.d.ts.map +1 -0
  56. package/dist/panel-cli-ui.test.js +91 -0
  57. package/dist/panel-cli-ui.test.js.map +1 -0
  58. package/dist/panel-cli.test.js +76 -27
  59. package/dist/panel-cli.test.js.map +1 -1
  60. package/dist/panel-config.d.ts +38 -0
  61. package/dist/panel-config.d.ts.map +1 -1
  62. package/dist/panel-config.js +137 -4
  63. package/dist/panel-config.js.map +1 -1
  64. package/dist/panel-config.test.js +84 -4
  65. package/dist/panel-config.test.js.map +1 -1
  66. package/dist/panel-loop.test.js +1 -1
  67. package/dist/panel-loop.test.js.map +1 -1
  68. package/dist/panel-tools.test.d.ts +2 -0
  69. package/dist/panel-tools.test.d.ts.map +1 -0
  70. package/dist/panel-tools.test.js +12 -0
  71. package/dist/panel-tools.test.js.map +1 -0
  72. package/dist/panel-ui.d.ts +20 -0
  73. package/dist/panel-ui.d.ts.map +1 -0
  74. package/dist/panel-ui.js +84 -0
  75. package/dist/panel-ui.js.map +1 -0
  76. package/dist/panel-ui.test.d.ts +2 -0
  77. package/dist/panel-ui.test.d.ts.map +1 -0
  78. package/dist/panel-ui.test.js +122 -0
  79. package/dist/panel-ui.test.js.map +1 -0
  80. package/dist/panel-usage.d.ts +6 -0
  81. package/dist/panel-usage.d.ts.map +1 -0
  82. package/dist/panel-usage.js +21 -0
  83. package/dist/panel-usage.js.map +1 -0
  84. package/dist/panel-view.d.ts +42 -0
  85. package/dist/panel-view.d.ts.map +1 -0
  86. package/dist/panel-view.js +124 -0
  87. package/dist/panel-view.js.map +1 -0
  88. package/dist/panel-view.test.d.ts +2 -0
  89. package/dist/panel-view.test.d.ts.map +1 -0
  90. package/dist/panel-view.test.js +112 -0
  91. package/dist/panel-view.test.js.map +1 -0
  92. package/dist/panel.d.ts +22 -2
  93. package/dist/panel.d.ts.map +1 -1
  94. package/dist/panel.js +184 -60
  95. package/dist/panel.js.map +1 -1
  96. package/dist/prompt.d.ts +2 -0
  97. package/dist/prompt.d.ts.map +1 -1
  98. package/dist/prompt.js +34 -3
  99. package/dist/prompt.js.map +1 -1
  100. package/dist/prompt.test.js +21 -2
  101. package/dist/prompt.test.js.map +1 -1
  102. package/dist/review-events.d.ts +70 -0
  103. package/dist/review-events.d.ts.map +1 -0
  104. package/dist/review-events.js +52 -0
  105. package/dist/review-events.js.map +1 -0
  106. package/dist/review-events.test.d.ts +2 -0
  107. package/dist/review-events.test.d.ts.map +1 -0
  108. package/dist/review-events.test.js +47 -0
  109. package/dist/review-events.test.js.map +1 -0
  110. package/dist/review-result.test.js +1 -1
  111. package/dist/review-result.test.js.map +1 -1
  112. package/dist/review.js +3 -3
  113. package/dist/review.js.map +1 -1
  114. package/dist/review.meta.test.js +1 -1
  115. package/dist/review.meta.test.js.map +1 -1
  116. package/dist/skill-protocol.test.js +1 -1
  117. package/dist/skill-protocol.test.js.map +1 -1
  118. package/dist/skill-update.test.d.ts +2 -0
  119. package/dist/skill-update.test.d.ts.map +1 -0
  120. package/dist/skill-update.test.js +23 -0
  121. package/dist/skill-update.test.js.map +1 -0
  122. package/dist/skill.d.ts +22 -0
  123. package/dist/skill.d.ts.map +1 -1
  124. package/dist/skill.js +109 -22
  125. package/dist/skill.js.map +1 -1
  126. package/dist/types.d.ts +28 -2
  127. package/dist/types.d.ts.map +1 -1
  128. package/dist/types.js +2 -0
  129. package/dist/types.js.map +1 -1
  130. package/dist/ui-client.d.ts +13 -0
  131. package/dist/ui-client.d.ts.map +1 -0
  132. package/dist/ui-client.js +161 -0
  133. package/dist/ui-client.js.map +1 -0
  134. package/dist/ui-client.test.d.ts +2 -0
  135. package/dist/ui-client.test.d.ts.map +1 -0
  136. package/dist/ui-client.test.js +48 -0
  137. package/dist/ui-client.test.js.map +1 -0
  138. package/dist/ui-html.d.ts +7 -0
  139. package/dist/ui-html.d.ts.map +1 -0
  140. package/dist/ui-html.js +52 -0
  141. package/dist/ui-html.js.map +1 -0
  142. package/dist/ui-html.test.d.ts +2 -0
  143. package/dist/ui-html.test.d.ts.map +1 -0
  144. package/dist/ui-html.test.js +26 -0
  145. package/dist/ui-html.test.js.map +1 -0
  146. package/dist/ui-server-main.d.ts +3 -0
  147. package/dist/ui-server-main.d.ts.map +1 -0
  148. package/dist/ui-server-main.js +128 -0
  149. package/dist/ui-server-main.js.map +1 -0
  150. package/dist/ui-server-main.test.d.ts +2 -0
  151. package/dist/ui-server-main.test.d.ts.map +1 -0
  152. package/dist/ui-server-main.test.js +123 -0
  153. package/dist/ui-server-main.test.js.map +1 -0
  154. package/dist/ui-server.d.ts +42 -0
  155. package/dist/ui-server.d.ts.map +1 -0
  156. package/dist/ui-server.js +233 -0
  157. package/dist/ui-server.js.map +1 -0
  158. package/dist/ui-server.test.d.ts +2 -0
  159. package/dist/ui-server.test.d.ts.map +1 -0
  160. package/dist/ui-server.test.js +236 -0
  161. package/dist/ui-server.test.js.map +1 -0
  162. package/dist/update.d.ts.map +1 -1
  163. package/dist/update.js +48 -19
  164. package/dist/update.js.map +1 -1
  165. package/extensions/panel-tool.test.ts +388 -0
  166. package/extensions/panel-tool.ts +390 -0
  167. package/extensions/review.test.ts +79 -0
  168. package/extensions/review.ts +191 -45
  169. package/extensions/rv-completions.test.ts +177 -18
  170. package/extensions/rv-completions.ts +490 -60
  171. package/extensions/rv-interactive.test.ts +562 -0
  172. package/extensions/rv-interactive.ts +616 -0
  173. package/extensions/rv-locale.test.ts +12 -4
  174. package/extensions/rv-locale.ts +44 -11
  175. package/extensions/rv-model-picker.test.ts +172 -0
  176. package/extensions/rv-model-picker.ts +313 -0
  177. package/extensions/rv-model-priorities.test.ts +29 -9
  178. package/extensions/rv-model-priorities.ts +23 -8
  179. package/extensions/rv-prompts.test.ts +281 -2
  180. package/extensions/rv-prompts.ts +480 -32
  181. package/extensions/rv-resolve.test.ts +189 -0
  182. package/extensions/rv-resolve.ts +313 -0
  183. package/extensions/rv-semantic.test.ts +1 -1
  184. package/extensions/rv-semantic.ts +38 -4
  185. package/package.json +18 -6
  186. package/resources/review-presets.json +2 -2
  187. package/resources/rv-model-priorities.json +18 -9
  188. package/skills/pi-review/SKILL.md +84 -60
  189. package/skills/pi-review/references/codex-tools.md +18 -11
  190. package/skills/pi-review/references/model-selection.md +49 -28
  191. package/dist/extensions/review.d.ts +0 -2
  192. package/dist/extensions/review.js +0 -22
  193. package/dist/extensions/rv-prompts.d.ts +0 -19
  194. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=panel-view.test.d.ts.map
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../src/panel.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EAIhB,MAAM,YAAY,CAAC;AAkCpB,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAa3D;AA6OD,mFAAmF;AACnF,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,SAAoB,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA6DhJ;AAED,8CAA8C;AAC9C,wBAAsB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAGvE"}
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"}