@gjczone/pi-swarm 0.3.4 → 0.4.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 +11 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -6
- package/dist/index.js.map +1 -1
- package/dist/shared/controller.d.ts +1 -0
- package/dist/shared/controller.d.ts.map +1 -1
- package/dist/shared/controller.js +60 -2
- package/dist/shared/controller.js.map +1 -1
- package/dist/shared/spawner.d.ts.map +1 -1
- package/dist/shared/spawner.js +320 -78
- package/dist/shared/spawner.js.map +1 -1
- package/dist/shared/types.d.ts +28 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js +4 -1
- package/dist/shared/types.js.map +1 -1
- package/dist/shared/worktree.d.ts +81 -0
- package/dist/shared/worktree.d.ts.map +1 -0
- package/dist/shared/worktree.js +417 -0
- package/dist/shared/worktree.js.map +1 -0
- package/dist/state/persistence.d.ts +5 -0
- package/dist/state/persistence.d.ts.map +1 -1
- package/dist/state/persistence.js +1 -1
- package/dist/state/persistence.js.map +1 -1
- package/dist/state/recovery.d.ts.map +1 -1
- package/dist/state/recovery.js +13 -6
- package/dist/state/recovery.js.map +1 -1
- package/dist/swarm/command.d.ts +0 -4
- package/dist/swarm/command.d.ts.map +1 -1
- package/dist/swarm/command.js +1 -19
- package/dist/swarm/command.js.map +1 -1
- package/dist/swarm/tool.d.ts.map +1 -1
- package/dist/swarm/tool.js +59 -14
- package/dist/swarm/tool.js.map +1 -1
- package/dist/team/command.d.ts.map +1 -1
- package/dist/team/command.js +0 -8
- package/dist/team/command.js.map +1 -1
- package/dist/team/mailbox.d.ts +5 -0
- package/dist/team/mailbox.d.ts.map +1 -1
- package/dist/team/mailbox.js +46 -5
- package/dist/team/mailbox.js.map +1 -1
- package/dist/team/supervisor.d.ts +27 -2
- package/dist/team/supervisor.d.ts.map +1 -1
- package/dist/team/supervisor.js +84 -23
- package/dist/team/supervisor.js.map +1 -1
- package/dist/team/task-graph.d.ts +5 -2
- package/dist/team/task-graph.d.ts.map +1 -1
- package/dist/team/task-graph.js +27 -1
- package/dist/team/task-graph.js.map +1 -1
- package/dist/team/tool.d.ts.map +1 -1
- package/dist/team/tool.js +56 -8
- package/dist/team/tool.js.map +1 -1
- package/dist/tui/progress.d.ts +6 -43
- package/dist/tui/progress.d.ts.map +1 -1
- package/dist/tui/progress.js +101 -165
- package/dist/tui/progress.js.map +1 -1
- package/dist/tui/team-dashboard.d.ts +5 -22
- package/dist/tui/team-dashboard.d.ts.map +1 -1
- package/dist/tui/team-dashboard.js +87 -132
- package/dist/tui/team-dashboard.js.map +1 -1
- package/package.json +1 -1
package/dist/tui/progress.js
CHANGED
|
@@ -2,56 +2,45 @@
|
|
|
2
2
|
* tui/progress — AgentSwarm live progress panel.
|
|
3
3
|
*
|
|
4
4
|
* Renders a real-time progress display above the input area when
|
|
5
|
-
* an AgentSwarm batch is running.
|
|
6
|
-
*
|
|
5
|
+
* an AgentSwarm batch is running. Each subagent gets a compact braille
|
|
6
|
+
* spinner with status and item description.
|
|
7
7
|
*
|
|
8
8
|
* Ported from MoonshotAI/kimi-code's AgentSwarmProgressComponent.
|
|
9
9
|
*/
|
|
10
10
|
// ---------------------------------------------------------------------------
|
|
11
|
-
// Constants
|
|
11
|
+
// Constants
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
13
|
-
/**
|
|
14
|
-
const
|
|
15
|
-
/**
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
/** Max item description length to display. */
|
|
14
|
+
const MAX_ITEM_LABEL_LEN = 40;
|
|
15
|
+
/** Compact braille spinner frames for running agents. */
|
|
16
|
+
const BRAILLE_SPINNER = [
|
|
17
|
+
"\u28BF",
|
|
18
|
+
"\u28FB",
|
|
19
|
+
"\u28FD",
|
|
20
|
+
"\u28FE",
|
|
21
|
+
"\u28F7",
|
|
22
|
+
"\u28EF",
|
|
23
|
+
"\u28DF",
|
|
24
|
+
"\u287F",
|
|
25
|
+
];
|
|
21
26
|
/** Animation frame interval in ms. */
|
|
22
27
|
const FRAME_INTERVAL_MS = 80;
|
|
23
|
-
/**
|
|
24
|
-
const COMPLETE_FILL_MS = 360;
|
|
25
|
-
/** Braille characters representing fill levels 0-6 dots. */
|
|
28
|
+
/** Braille characters representing fill levels 0-6 dots for completed bar. */
|
|
26
29
|
const BRAILLE_LEVELS = [
|
|
27
|
-
"\u28C0",
|
|
28
|
-
"\u28C4",
|
|
29
|
-
"\u28E4",
|
|
30
|
-
"\u28E6",
|
|
31
|
-
"\u28F6",
|
|
32
|
-
"\u28F7",
|
|
33
|
-
"\u28FF",
|
|
30
|
+
"\u28C0",
|
|
31
|
+
"\u28C4",
|
|
32
|
+
"\u28E4",
|
|
33
|
+
"\u28E6",
|
|
34
|
+
"\u28F6",
|
|
35
|
+
"\u28F7",
|
|
36
|
+
"\u28FF",
|
|
34
37
|
];
|
|
35
38
|
const BRAILLE_EMPTY = BRAILLE_LEVELS[0];
|
|
36
39
|
const BRAILLE_FULL = BRAILLE_LEVELS[6];
|
|
37
|
-
|
|
38
|
-
const ORCHESTRATING_LABEL = "Orchestrating...";
|
|
39
|
-
const WORKING_LABEL = "Working...";
|
|
40
|
-
const COMPLETED_LABEL = "Completed.";
|
|
41
|
-
const FAILED_LABEL = "Failed.";
|
|
42
|
-
const ABORTED_LABEL = "Aborted.";
|
|
43
|
-
const QUEUED_LABEL = "Queued...";
|
|
40
|
+
const COMPLETED_BAR_WIDTH = 4;
|
|
44
41
|
// ---------------------------------------------------------------------------
|
|
45
|
-
// Snapshot conversion
|
|
42
|
+
// Snapshot conversion
|
|
46
43
|
// ---------------------------------------------------------------------------
|
|
47
|
-
/**
|
|
48
|
-
* Convert a BatchProgressSnapshot from the concurrency controller into
|
|
49
|
-
* the SwarmProgressState expected by AgentSwarmProgressComponent.
|
|
50
|
-
*
|
|
51
|
-
* Maps the controller's coarse member phases onto the component's
|
|
52
|
-
* richer MemberPhase set, attaching a phaseStartedAt timestamp so the
|
|
53
|
-
* braille animation can run for working/suspended members.
|
|
54
|
-
*/
|
|
55
44
|
export function snapshotToProgressState(snapshot, title) {
|
|
56
45
|
const now = Date.now();
|
|
57
46
|
const members = snapshot.members.map((m) => ({
|
|
@@ -69,6 +58,8 @@ export function snapshotToProgressState(snapshot, title) {
|
|
|
69
58
|
active: snapshot.active,
|
|
70
59
|
queued: snapshot.queued,
|
|
71
60
|
members,
|
|
61
|
+
totalUsage: snapshot.totalUsage,
|
|
62
|
+
startedAt: snapshot.startedAt ?? now,
|
|
72
63
|
};
|
|
73
64
|
}
|
|
74
65
|
function mapMemberPhase(phase) {
|
|
@@ -94,36 +85,20 @@ function isAnimatedPhase(phase) {
|
|
|
94
85
|
export class AgentSwarmProgressComponent {
|
|
95
86
|
state_ = null;
|
|
96
87
|
animationFrame;
|
|
97
|
-
startTime = Date.now();
|
|
98
88
|
renderedWidth;
|
|
99
89
|
cachedLines;
|
|
100
90
|
onRequestRender;
|
|
101
|
-
|
|
102
|
-
* @param onRequestRender Optional callback to request a TUI re-render.
|
|
103
|
-
* When provided, called on every animation tick so the braille bars
|
|
104
|
-
* animate. Without it the component still renders correctly but the
|
|
105
|
-
* animation won't be visible to the user.
|
|
106
|
-
*
|
|
107
|
-
* 业务说明:TUI 框架不会自动轮询组件;需要通过 requestRender() 主动
|
|
108
|
-
* 触发重绘才能使 braille 进度条动起来。此回调由 setWidget 工厂函数
|
|
109
|
-
* 在捕获 tui 引用后传入。
|
|
110
|
-
*/
|
|
91
|
+
frameIndex = 0;
|
|
111
92
|
constructor(onRequestRender) {
|
|
112
93
|
this.onRequestRender = onRequestRender;
|
|
113
94
|
this.startAnimation();
|
|
114
95
|
}
|
|
115
|
-
// -------------------------------------------------------------------
|
|
116
|
-
// Public API
|
|
117
|
-
// -------------------------------------------------------------------
|
|
118
|
-
/** Update the progress state from the tool execution. */
|
|
119
96
|
update(state) {
|
|
120
97
|
this.state_ = state;
|
|
121
98
|
this.invalidate();
|
|
122
99
|
}
|
|
123
|
-
/** Mark the swarm as completed (triggers completion animation). */
|
|
124
100
|
complete() {
|
|
125
101
|
if (this.state_) {
|
|
126
|
-
// Mark all non-terminal members as completed
|
|
127
102
|
for (const m of this.state_.members) {
|
|
128
103
|
if (m.phase !== "completed" &&
|
|
129
104
|
m.phase !== "failed" &&
|
|
@@ -135,28 +110,22 @@ export class AgentSwarmProgressComponent {
|
|
|
135
110
|
this.state_.active = 0;
|
|
136
111
|
this.state_.queued = 0;
|
|
137
112
|
this.state_.completed = this.state_.total - this.state_.failed;
|
|
138
|
-
this.state_.status = COMPLETED_LABEL;
|
|
139
113
|
}
|
|
140
114
|
this.invalidate();
|
|
141
115
|
}
|
|
142
|
-
/** Stop the animation loop. */
|
|
143
116
|
dispose() {
|
|
144
117
|
if (this.animationFrame !== undefined) {
|
|
145
118
|
clearInterval(this.animationFrame);
|
|
146
119
|
this.animationFrame = undefined;
|
|
147
120
|
}
|
|
148
|
-
// 断开与 TUI 框架的连接,防止内存泄漏
|
|
149
121
|
this.onRequestRender = undefined;
|
|
150
122
|
}
|
|
151
|
-
// -------------------------------------------------------------------
|
|
152
|
-
// Component interface
|
|
153
|
-
// -------------------------------------------------------------------
|
|
154
123
|
invalidate() {
|
|
155
124
|
this.renderedWidth = undefined;
|
|
156
125
|
this.cachedLines = undefined;
|
|
157
126
|
}
|
|
158
127
|
render(width) {
|
|
159
|
-
const safeWidth = Math.max(
|
|
128
|
+
const safeWidth = Math.max(20, width);
|
|
160
129
|
if (this.cachedLines && this.renderedWidth === safeWidth) {
|
|
161
130
|
return this.cachedLines;
|
|
162
131
|
}
|
|
@@ -165,40 +134,45 @@ export class AgentSwarmProgressComponent {
|
|
|
165
134
|
return this.cachedLines;
|
|
166
135
|
}
|
|
167
136
|
const state = this.state_;
|
|
137
|
+
const contentWidth = safeWidth - 4;
|
|
168
138
|
const lines = [];
|
|
169
|
-
//
|
|
139
|
+
// Header: title
|
|
170
140
|
const title = state.title ?? "Agent Swarm";
|
|
171
|
-
lines.push(
|
|
172
|
-
// Overall
|
|
173
|
-
const
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
|
|
141
|
+
lines.push(` ${truncateText(title, contentWidth)}`);
|
|
142
|
+
// Overall progress bar
|
|
143
|
+
const barWidth = Math.max(1, contentWidth);
|
|
144
|
+
const total = state.total || 1;
|
|
145
|
+
const doneRatio = (state.completed + state.failed) / total;
|
|
146
|
+
const doneChars = Math.round(doneRatio * barWidth);
|
|
147
|
+
const done = "\u2501".repeat(doneChars);
|
|
148
|
+
const remaining = "\u2501".repeat(barWidth - doneChars);
|
|
149
|
+
lines.push(` ${done}${remaining}`);
|
|
177
150
|
// Member rows
|
|
178
|
-
const maxMembers = Math.min(state.members.length, 20);
|
|
151
|
+
const maxMembers = Math.min(state.members.length, 20);
|
|
179
152
|
for (let i = 0; i < maxMembers; i += 1) {
|
|
180
153
|
const member = state.members[i];
|
|
181
154
|
if (!member)
|
|
182
155
|
continue;
|
|
183
|
-
const row = renderMemberRow(member,
|
|
156
|
+
const row = renderMemberRow(member, contentWidth, this.frameIndex);
|
|
184
157
|
lines.push(` ${row}`);
|
|
185
158
|
}
|
|
186
|
-
//
|
|
187
|
-
const
|
|
188
|
-
lines.push(` ${
|
|
159
|
+
// Separator
|
|
160
|
+
const sep = "\u2500".repeat(contentWidth);
|
|
161
|
+
lines.push(` ${sep}`);
|
|
162
|
+
// Footer: counts + tokens + elapsed
|
|
163
|
+
const footer = buildFooter(state, contentWidth);
|
|
164
|
+
lines.push(` ${footer}`);
|
|
189
165
|
// Bottom border
|
|
190
|
-
|
|
166
|
+
const bottom = `\u2514${"\u2500".repeat(contentWidth)}\u2518`;
|
|
167
|
+
lines.push(bottom);
|
|
191
168
|
this.cachedLines = lines;
|
|
192
169
|
this.renderedWidth = safeWidth;
|
|
193
170
|
return this.cachedLines;
|
|
194
171
|
}
|
|
195
|
-
// -------------------------------------------------------------------
|
|
196
|
-
// Animation
|
|
197
|
-
// -------------------------------------------------------------------
|
|
198
172
|
startAnimation() {
|
|
199
173
|
this.animationFrame = setInterval(() => {
|
|
174
|
+
this.frameIndex = (this.frameIndex + 1) % BRAILLE_SPINNER.length;
|
|
200
175
|
this.invalidate();
|
|
201
|
-
// 通知 TUI 框架重绘,使 braille 动画可见
|
|
202
176
|
this.onRequestRender?.();
|
|
203
177
|
}, FRAME_INTERVAL_MS);
|
|
204
178
|
}
|
|
@@ -206,134 +180,96 @@ export class AgentSwarmProgressComponent {
|
|
|
206
180
|
// ---------------------------------------------------------------------------
|
|
207
181
|
// Rendering helpers
|
|
208
182
|
// ---------------------------------------------------------------------------
|
|
209
|
-
function
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
const
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
return `\u250C${truncated}\u2510`;
|
|
217
|
-
}
|
|
218
|
-
const dashes = width - inner.length - 3;
|
|
219
|
-
return `\u250C${inner}\u2500${"\u2500".repeat(Math.max(0, dashes))}\u2510`;
|
|
220
|
-
}
|
|
221
|
-
function borderBottom(width) {
|
|
222
|
-
return `\u2514${"\u2500".repeat(Math.max(0, width - 2))}\u2518`;
|
|
223
|
-
}
|
|
224
|
-
function resolveOverallStatus(state) {
|
|
225
|
-
if (state.queued === 0 && state.active === 0) {
|
|
226
|
-
if (state.failed > 0)
|
|
227
|
-
return FAILED_LABEL;
|
|
228
|
-
return COMPLETED_LABEL;
|
|
229
|
-
}
|
|
230
|
-
if (state.active > 0)
|
|
231
|
-
return WORKING_LABEL;
|
|
232
|
-
return ORCHESTRATING_LABEL;
|
|
233
|
-
}
|
|
234
|
-
function buildStatusBar(state, width) {
|
|
235
|
-
const barWidth = Math.max(1, width - 4);
|
|
236
|
-
const total = state.total || 1;
|
|
237
|
-
const doneRatio = (state.completed + state.failed) / total;
|
|
238
|
-
const doneChars = Math.round(doneRatio * barWidth);
|
|
239
|
-
const remainingChars = barWidth - doneChars;
|
|
240
|
-
const done = "\u2501".repeat(doneChars);
|
|
241
|
-
const remaining = "\u2501".repeat(remainingChars);
|
|
242
|
-
return done + remaining;
|
|
243
|
-
}
|
|
244
|
-
function renderMemberRow(member, width) {
|
|
245
|
-
const indexLabel = `#${String(member.index)}`;
|
|
246
|
-
const brailleBar = renderBrailleBar(member, BRAILLE_BAR_MAX_WIDTH);
|
|
247
|
-
const statusLabel = memberPhaseLabel(member.phase);
|
|
248
|
-
const itemLabel = (member.item ?? "").slice(0, TEXT_CELL_PREFERRED_WIDTH);
|
|
249
|
-
// Layout: #N [braille] Status item
|
|
250
|
-
const fixed = `${indexLabel} ${brailleBar} ${statusLabel}`;
|
|
183
|
+
function renderMemberRow(member, width, frameIndex) {
|
|
184
|
+
const indexLabel = `#${String(member.index).padStart(2, "0")}`;
|
|
185
|
+
const icon = memberIcon(member, frameIndex);
|
|
186
|
+
const statusLabel = shortPhaseLabel(member.phase);
|
|
187
|
+
const itemLabel = member.item ?? "";
|
|
188
|
+
// Layout: #NN [icon] status item
|
|
189
|
+
const fixed = `${indexLabel} ${icon} ${statusLabel}`;
|
|
251
190
|
const fixedLen = visibleLen(fixed);
|
|
252
|
-
// If the fixed part alone exceeds width, truncate it
|
|
253
191
|
if (fixedLen >= width) {
|
|
254
|
-
return fixed
|
|
192
|
+
return truncateText(fixed, width);
|
|
255
193
|
}
|
|
256
194
|
const itemSpace = Math.max(0, width - fixedLen - 2);
|
|
257
195
|
const truncatedItem = truncateText(itemLabel, itemSpace);
|
|
258
196
|
return `${fixed} ${truncatedItem}`;
|
|
259
197
|
}
|
|
260
|
-
function
|
|
261
|
-
|
|
262
|
-
const elapsed = member.phaseStartedAt
|
|
263
|
-
? Date.now() - member.phaseStartedAt
|
|
264
|
-
: 0;
|
|
265
|
-
switch (phase) {
|
|
198
|
+
function memberIcon(member, frameIndex) {
|
|
199
|
+
switch (member.phase) {
|
|
266
200
|
case "completed":
|
|
267
|
-
return BRAILLE_FULL.repeat(
|
|
201
|
+
return BRAILLE_FULL.repeat(2);
|
|
268
202
|
case "failed":
|
|
269
203
|
case "cancelled":
|
|
204
|
+
return "\u2717 ";
|
|
270
205
|
case "pending":
|
|
271
206
|
case "queued":
|
|
272
|
-
return
|
|
207
|
+
return "\u25CB ";
|
|
273
208
|
case "prompting":
|
|
274
209
|
case "working":
|
|
275
210
|
case "suspended":
|
|
276
|
-
return
|
|
211
|
+
return BRAILLE_SPINNER[frameIndex % BRAILLE_SPINNER.length] + " ";
|
|
277
212
|
}
|
|
278
213
|
}
|
|
279
|
-
function
|
|
280
|
-
const cycleMs = 800; // One full animation cycle
|
|
281
|
-
const progress = (elapsedMs % cycleMs) / cycleMs; // 0..1
|
|
282
|
-
// Fill from left to right
|
|
283
|
-
const totalDots = maxWidth * 6; // 6 dots per braille char
|
|
284
|
-
const filledDots = Math.floor(progress * totalDots);
|
|
285
|
-
let result = "";
|
|
286
|
-
for (let i = 0; i < maxWidth; i += 1) {
|
|
287
|
-
const cellStart = i * 6;
|
|
288
|
-
const dotsInCell = Math.max(0, Math.min(6, filledDots - cellStart));
|
|
289
|
-
result += dotsInCell === 0 ? BRAILLE_EMPTY : BRAILLE_LEVELS[dotsInCell];
|
|
290
|
-
}
|
|
291
|
-
return result;
|
|
292
|
-
}
|
|
293
|
-
function memberPhaseLabel(phase) {
|
|
214
|
+
function shortPhaseLabel(phase) {
|
|
294
215
|
switch (phase) {
|
|
295
216
|
case "pending":
|
|
296
217
|
case "queued":
|
|
297
|
-
return
|
|
218
|
+
return "wait";
|
|
298
219
|
case "prompting":
|
|
299
|
-
return "
|
|
220
|
+
return "init";
|
|
300
221
|
case "working":
|
|
301
|
-
return
|
|
222
|
+
return "work";
|
|
302
223
|
case "completed":
|
|
303
|
-
return
|
|
224
|
+
return "done";
|
|
304
225
|
case "failed":
|
|
305
|
-
return
|
|
226
|
+
return "fail";
|
|
306
227
|
case "cancelled":
|
|
307
|
-
return
|
|
228
|
+
return "abort";
|
|
308
229
|
case "suspended":
|
|
309
|
-
return "
|
|
230
|
+
return "retry";
|
|
310
231
|
}
|
|
311
232
|
}
|
|
312
|
-
function
|
|
313
|
-
const
|
|
314
|
-
|
|
315
|
-
|
|
233
|
+
function buildFooter(state, width) {
|
|
234
|
+
const usage = state.totalUsage ?? {
|
|
235
|
+
input: 0,
|
|
236
|
+
output: 0,
|
|
237
|
+
cacheRead: 0,
|
|
238
|
+
cacheWrite: 0,
|
|
239
|
+
totalTokens: 0,
|
|
240
|
+
};
|
|
241
|
+
const counts = `${state.completed + state.failed}/${state.total} ag`;
|
|
242
|
+
const tokens = `${Math.round(usage.input)}in/${Math.round(usage.output)}out`;
|
|
243
|
+
const elapsed = formatElapsed(Date.now() - state.startedAt);
|
|
244
|
+
const parts = [counts, tokens, elapsed];
|
|
316
245
|
if (state.failed > 0)
|
|
317
|
-
parts.
|
|
246
|
+
parts.splice(1, 0, `${state.failed}fail`);
|
|
318
247
|
if (state.active > 0)
|
|
319
|
-
parts.
|
|
320
|
-
|
|
321
|
-
parts.push(`queued: ${state.queued}`);
|
|
322
|
-
const full = parts.join(", ");
|
|
248
|
+
parts.splice(1, 0, `${state.active}act`);
|
|
249
|
+
const full = parts.join(" | ");
|
|
323
250
|
if (full.length <= width)
|
|
324
251
|
return full;
|
|
325
|
-
return full
|
|
252
|
+
return truncateText(full, width);
|
|
253
|
+
}
|
|
254
|
+
function formatElapsed(ms) {
|
|
255
|
+
const totalSec = Math.floor(ms / 1000);
|
|
256
|
+
if (totalSec < 60)
|
|
257
|
+
return `${totalSec}s`;
|
|
258
|
+
const m = Math.floor(totalSec / 60);
|
|
259
|
+
const s = totalSec % 60;
|
|
260
|
+
return `${m}m${s}s`;
|
|
326
261
|
}
|
|
327
262
|
// ---------------------------------------------------------------------------
|
|
328
|
-
// Text utilities
|
|
263
|
+
// Text utilities
|
|
329
264
|
// ---------------------------------------------------------------------------
|
|
330
265
|
function visibleLen(text) {
|
|
331
|
-
// Simple implementation: count characters, stripping ANSI escapes
|
|
332
266
|
return text.replace(/\x1b\[[0-9;]*m/g, "").length;
|
|
333
267
|
}
|
|
334
268
|
function truncateText(text, maxLen) {
|
|
335
269
|
if (text.length <= maxLen)
|
|
336
270
|
return text;
|
|
271
|
+
if (maxLen <= 1)
|
|
272
|
+
return text.slice(0, 1);
|
|
337
273
|
return text.slice(0, Math.max(0, maxLen - 1)) + "\u2026";
|
|
338
274
|
}
|
|
339
275
|
//# sourceMappingURL=progress.js.map
|
package/dist/tui/progress.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/tui/progress.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/tui/progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,15 +2,11 @@
|
|
|
2
2
|
* tui/team-dashboard — SwarmTeam live phase progress dashboard.
|
|
3
3
|
*
|
|
4
4
|
* Renders a real-time dashboard above the input area when a SwarmTeam
|
|
5
|
-
* run is in progress. Shows phase statuses with braille
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* Follows the same wiring pattern as AgentSwarmProgressComponent:
|
|
9
|
-
* supervisor emits snapshots -> tool converts -> pushes to widget.
|
|
5
|
+
* run is in progress. Shows phase statuses with compact braille spinner
|
|
6
|
+
* for active phases, mailbox message count, token usage, and elapsed time.
|
|
10
7
|
*/
|
|
11
8
|
import type { Component } from "@earendil-works/pi-tui";
|
|
12
|
-
import type { TeamProgressSnapshot } from "../shared/types.js";
|
|
13
|
-
/** Dashboard state for the team progress widget. */
|
|
9
|
+
import type { TeamProgressSnapshot, SubagentUsage } from "../shared/types.js";
|
|
14
10
|
export interface TeamDashboardState {
|
|
15
11
|
title: string;
|
|
16
12
|
goal: string;
|
|
@@ -22,6 +18,7 @@ export interface TeamDashboardState {
|
|
|
22
18
|
currentRoles?: string[];
|
|
23
19
|
phases: TeamPhaseStatusWithMeta[];
|
|
24
20
|
mailboxCount: number;
|
|
21
|
+
totalUsage: SubagentUsage;
|
|
25
22
|
startedAt: number;
|
|
26
23
|
}
|
|
27
24
|
interface TeamPhaseStatusWithMeta {
|
|
@@ -29,13 +26,8 @@ interface TeamPhaseStatusWithMeta {
|
|
|
29
26
|
role: string;
|
|
30
27
|
status: "queued" | "running" | "completed" | "failed" | "skipped";
|
|
31
28
|
error?: string;
|
|
32
|
-
/** Timestamp when this phase entered its current status. */
|
|
33
29
|
phaseStartedAt: number;
|
|
34
30
|
}
|
|
35
|
-
/**
|
|
36
|
-
* Convert a TeamProgressSnapshot from the supervisor into the
|
|
37
|
-
* TeamDashboardState expected by TeamDashboardComponent.
|
|
38
|
-
*/
|
|
39
31
|
export declare function snapshotToDashboardState(snapshot: TeamProgressSnapshot): TeamDashboardState;
|
|
40
32
|
export declare class TeamDashboardComponent implements Component {
|
|
41
33
|
private state_;
|
|
@@ -43,16 +35,7 @@ export declare class TeamDashboardComponent implements Component {
|
|
|
43
35
|
private renderedWidth;
|
|
44
36
|
private cachedLines;
|
|
45
37
|
private onRequestRender;
|
|
46
|
-
|
|
47
|
-
* @param onRequestRender Optional callback to request a TUI re-render.
|
|
48
|
-
* When provided, called on every animation tick so the braille bars
|
|
49
|
-
* animate. Without it the component still renders correctly but the
|
|
50
|
-
* animation won't be visible to the user.
|
|
51
|
-
*
|
|
52
|
-
* 业务说明:TUI 框架不会自动轮询组件;需要通过 requestRender() 主动
|
|
53
|
-
* 触发重绘才能使 braille 进度条动起来。此回调由 setWidget 工厂函数
|
|
54
|
-
* 在捕获 tui 引用后传入。
|
|
55
|
-
*/
|
|
38
|
+
private frameIndex;
|
|
56
39
|
constructor(onRequestRender?: () => void);
|
|
57
40
|
update(state: TeamDashboardState): void;
|
|
58
41
|
complete(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-dashboard.d.ts","sourceRoot":"","sources":["../../src/tui/team-dashboard.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"team-dashboard.d.ts","sourceRoot":"","sources":["../../src/tui/team-dashboard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EACV,oBAAoB,EAEpB,aAAa,EACd,MAAM,oBAAoB,CAAC;AAyB5B,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,uBAAuB,EAAE,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,aAAa,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,uBAAuB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,oBAAoB,GAC7B,kBAAkB,CAoCpB;AAMD,qBAAa,sBAAuB,YAAW,SAAS;IACtD,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,cAAc,CAA6C;IACnE,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,UAAU,CAAK;gBAEX,eAAe,CAAC,EAAE,MAAM,IAAI;IAKxC,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAKvC,QAAQ,IAAI,IAAI;IAgBhB,OAAO,IAAI,IAAI;IAQf,UAAU,IAAI,IAAI;IAKlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAsD/B,OAAO,CAAC,cAAc;CAOvB"}
|