@gjczone/pi-swarm 0.4.1 → 0.7.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 (75) hide show
  1. package/README.md +35 -89
  2. package/dist/index.d.ts +3 -10
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +4 -16
  5. package/dist/index.js.map +1 -1
  6. package/dist/shared/controller.d.ts +19 -5
  7. package/dist/shared/controller.d.ts.map +1 -1
  8. package/dist/shared/controller.js +139 -17
  9. package/dist/shared/controller.js.map +1 -1
  10. package/dist/shared/render.d.ts +1 -12
  11. package/dist/shared/render.d.ts.map +1 -1
  12. package/dist/shared/render.js +4 -37
  13. package/dist/shared/render.js.map +1 -1
  14. package/dist/shared/spawner.js +49 -5
  15. package/dist/shared/spawner.js.map +1 -1
  16. package/dist/shared/types.d.ts +38 -0
  17. package/dist/shared/types.d.ts.map +1 -1
  18. package/dist/shared/types.js.map +1 -1
  19. package/dist/shared/worktree.d.ts +2 -0
  20. package/dist/shared/worktree.d.ts.map +1 -1
  21. package/dist/shared/worktree.js +10 -3
  22. package/dist/shared/worktree.js.map +1 -1
  23. package/dist/shared/xml.d.ts +18 -0
  24. package/dist/shared/xml.d.ts.map +1 -0
  25. package/dist/shared/xml.js +31 -0
  26. package/dist/shared/xml.js.map +1 -0
  27. package/dist/state/recovery.d.ts.map +1 -1
  28. package/dist/state/recovery.js +25 -4
  29. package/dist/state/recovery.js.map +1 -1
  30. package/dist/swarm/command.d.ts +4 -5
  31. package/dist/swarm/command.d.ts.map +1 -1
  32. package/dist/swarm/command.js +26 -74
  33. package/dist/swarm/command.js.map +1 -1
  34. package/dist/swarm/mode.d.ts +1 -1
  35. package/dist/swarm/mode.js +2 -2
  36. package/dist/swarm/mode.js.map +1 -1
  37. package/dist/swarm/tool.d.ts +4 -4
  38. package/dist/swarm/tool.d.ts.map +1 -1
  39. package/dist/swarm/tool.js +115 -160
  40. package/dist/swarm/tool.js.map +1 -1
  41. package/dist/team/command.d.ts +2 -4
  42. package/dist/team/command.d.ts.map +1 -1
  43. package/dist/team/command.js +5 -13
  44. package/dist/team/command.js.map +1 -1
  45. package/dist/team/mailbox.d.ts +7 -0
  46. package/dist/team/mailbox.d.ts.map +1 -1
  47. package/dist/team/mailbox.js +99 -13
  48. package/dist/team/mailbox.js.map +1 -1
  49. package/dist/tui/progress.d.ts +26 -9
  50. package/dist/tui/progress.d.ts.map +1 -1
  51. package/dist/tui/progress.js +262 -163
  52. package/dist/tui/progress.js.map +1 -1
  53. package/dist/tui/swarm-markers.d.ts +1 -1
  54. package/dist/tui/swarm-markers.js +1 -1
  55. package/package.json +13 -2
  56. package/dist/team/supervisor.d.ts +0 -171
  57. package/dist/team/supervisor.d.ts.map +0 -1
  58. package/dist/team/supervisor.js +0 -700
  59. package/dist/team/supervisor.js.map +0 -1
  60. package/dist/team/task-graph.d.ts +0 -64
  61. package/dist/team/task-graph.d.ts.map +0 -1
  62. package/dist/team/task-graph.js +0 -216
  63. package/dist/team/task-graph.js.map +0 -1
  64. package/dist/team/tool.d.ts +0 -11
  65. package/dist/team/tool.d.ts.map +0 -1
  66. package/dist/team/tool.js +0 -455
  67. package/dist/team/tool.js.map +0 -1
  68. package/dist/tui/permission-prompt.d.ts +0 -26
  69. package/dist/tui/permission-prompt.d.ts.map +0 -1
  70. package/dist/tui/permission-prompt.js +0 -98
  71. package/dist/tui/permission-prompt.js.map +0 -1
  72. package/dist/tui/team-dashboard.d.ts +0 -48
  73. package/dist/tui/team-dashboard.d.ts.map +0 -1
  74. package/dist/tui/team-dashboard.js +0 -249
  75. package/dist/tui/team-dashboard.js.map +0 -1
@@ -1,18 +1,26 @@
1
1
  /**
2
- * tui/progress — AgentSwarm live progress panel.
2
+ * tui/progress — AgentSwarm live progress panel (minimal).
3
3
  *
4
- * Renders a real-time progress display above the input area when
5
- * an AgentSwarm batch is running. Each subagent gets a compact braille
6
- * spinner with status and item description.
4
+ * Grid layout with braille progress bars and scrolling model output.
5
+ * - Multiple agents: grid cells with ID + braille bar + model text
6
+ * - Single agent: compact status line with spinner + text
7
+ * - No token/in/out display — replaced by scrolling model output
7
8
  *
8
- * Ported from MoonshotAI/kimi-code's AgentSwarmProgressComponent.
9
+ * Architecture reference: AgentSwarm pattern.
9
10
  */
10
11
  // ---------------------------------------------------------------------------
11
12
  // Constants
12
13
  // ---------------------------------------------------------------------------
13
- /** Max item description length to display. */
14
- const MAX_ITEM_LABEL_LEN = 40;
15
- /** Compact braille spinner frames for running agents. */
14
+ const BRAILLE_LEVELS = [
15
+ "\u28C0",
16
+ "\u28C4",
17
+ "\u28E4",
18
+ "\u28E6",
19
+ "\u28F6",
20
+ "\u28F7",
21
+ "\u28FF",
22
+ ];
23
+ const BRAILLE_EMPTY = "\u2800"; // truly empty braille cell (no dots)
16
24
  const BRAILLE_SPINNER = [
17
25
  "\u28BF",
18
26
  "\u28FB",
@@ -23,33 +31,18 @@ const BRAILLE_SPINNER = [
23
31
  "\u28DF",
24
32
  "\u287F",
25
33
  ];
26
- /** Animation frame interval in ms. */
27
34
  const FRAME_INTERVAL_MS = 80;
28
- /** Braille characters representing fill levels 0-6 dots for completed bar. */
29
- const BRAILLE_LEVELS = [
30
- "\u28C0",
31
- "\u28C4",
32
- "\u28E4",
33
- "\u28E6",
34
- "\u28F6",
35
- "\u28F7",
36
- "\u28FF",
37
- ];
38
- const BRAILLE_EMPTY = BRAILLE_LEVELS[0];
39
- const BRAILLE_FULL = BRAILLE_LEVELS[6];
40
- const COMPLETED_BAR_WIDTH = 4;
35
+ const DEBOUNCE_MS = 75;
36
+ const POLL_MS = 800;
37
+ const MAX_VISIBLE_MEMBERS = 20;
38
+ const CELL_GAP = " ";
39
+ const BRAILLE_BAR_MIN_WIDTH = 2;
40
+ const BRAILLE_BAR_MAX_WIDTH = 5;
41
+ const ID_WIDTH = 3;
41
42
  // ---------------------------------------------------------------------------
42
43
  // Snapshot conversion
43
44
  // ---------------------------------------------------------------------------
44
45
  export function snapshotToProgressState(snapshot, title) {
45
- const now = Date.now();
46
- const members = snapshot.members.map((m) => ({
47
- index: m.index,
48
- phase: mapMemberPhase(m.phase),
49
- item: m.item,
50
- error: m.error,
51
- phaseStartedAt: isAnimatedPhase(m.phase) ? now : undefined,
52
- }));
53
46
  return {
54
47
  title,
55
48
  total: snapshot.total,
@@ -57,9 +50,18 @@ export function snapshotToProgressState(snapshot, title) {
57
50
  failed: snapshot.failed,
58
51
  active: snapshot.active,
59
52
  queued: snapshot.queued,
60
- members,
53
+ members: snapshot.members.map((m) => ({
54
+ index: m.index,
55
+ phase: mapMemberPhase(m.phase),
56
+ item: m.item,
57
+ error: m.error,
58
+ currentTool: m.currentTool,
59
+ activity: m.activity,
60
+ usage: m.usage,
61
+ progressTick: m.progressTick,
62
+ })),
61
63
  totalUsage: snapshot.totalUsage,
62
- startedAt: snapshot.startedAt ?? now,
64
+ startedAt: snapshot.startedAt ?? Date.now(),
63
65
  };
64
66
  }
65
67
  function mapMemberPhase(phase) {
@@ -76,26 +78,27 @@ function mapMemberPhase(phase) {
76
78
  return "suspended";
77
79
  }
78
80
  }
79
- function isAnimatedPhase(phase) {
80
- return phase === "working" || phase === "suspended";
81
- }
82
81
  // ---------------------------------------------------------------------------
83
82
  // Component
84
83
  // ---------------------------------------------------------------------------
85
84
  export class AgentSwarmProgressComponent {
86
85
  state_ = null;
87
- animationFrame;
88
- renderedWidth;
89
- cachedLines;
90
86
  onRequestRender;
87
+ animationFrame;
91
88
  frameIndex = 0;
89
+ pollTimer;
90
+ debounceTimer;
92
91
  constructor(onRequestRender) {
93
92
  this.onRequestRender = onRequestRender;
93
+ this.startPolling();
94
94
  this.startAnimation();
95
95
  }
96
+ // -------------------------------------------------------------------
97
+ // Public API
98
+ // -------------------------------------------------------------------
96
99
  update(state) {
97
100
  this.state_ = state;
98
- this.invalidate();
101
+ this.requestRender();
99
102
  }
100
103
  complete() {
101
104
  if (this.state_) {
@@ -104,152 +107,246 @@ export class AgentSwarmProgressComponent {
104
107
  m.phase !== "failed" &&
105
108
  m.phase !== "cancelled") {
106
109
  m.phase = "completed";
107
- m.phaseStartedAt = Date.now();
108
110
  }
109
111
  }
110
112
  this.state_.active = 0;
111
113
  this.state_.queued = 0;
112
114
  this.state_.completed = this.state_.total - this.state_.failed;
113
115
  }
114
- this.invalidate();
116
+ this.requestRender();
115
117
  }
116
118
  dispose() {
117
- if (this.animationFrame !== undefined) {
118
- clearInterval(this.animationFrame);
119
- this.animationFrame = undefined;
120
- }
119
+ this.stopTimers();
121
120
  this.onRequestRender = undefined;
122
121
  }
123
122
  invalidate() {
124
- this.renderedWidth = undefined;
125
- this.cachedLines = undefined;
123
+ /* no-op */
126
124
  }
125
+ handleInput(_data) {
126
+ /* minimal: no keyboard */
127
+ }
128
+ // -------------------------------------------------------------------
129
+ // Rendering
130
+ // -------------------------------------------------------------------
127
131
  render(width) {
128
132
  const safeWidth = Math.max(20, width);
129
- if (this.cachedLines && this.renderedWidth === safeWidth) {
130
- return this.cachedLines;
133
+ if (!this.state_ || this.state_.members.length === 0)
134
+ return [];
135
+ const state = this.state_;
136
+ const lines = [];
137
+ // Layout: header → grid → status line
138
+ lines.push(this.renderHeader(safeWidth, state));
139
+ lines.push("");
140
+ if (state.members.length === 1) {
141
+ // Single agent: compact line, no grid
142
+ const row = this.renderSingleAgent(state.members[0], safeWidth - 2);
143
+ lines.push(row);
131
144
  }
132
- if (!this.state_ || this.state_.members.length === 0) {
133
- this.cachedLines = [];
134
- return this.cachedLines;
145
+ else {
146
+ // Multiple agents: grid layout
147
+ const gridLines = this.renderGrid(safeWidth - 2, state);
148
+ lines.push(...gridLines);
135
149
  }
136
- const state = this.state_;
137
- const contentWidth = safeWidth - 4;
150
+ lines.push("");
151
+ // Bottom separator
152
+ const sepWidth = safeWidth - 2;
153
+ lines.push(truncateText(repeatStr("─", sepWidth), sepWidth));
154
+ lines.push(this.renderStatusLine(safeWidth, state));
155
+ return lines;
156
+ }
157
+ // -------------------------------------------------------------------
158
+ // Kimi-code style header: ─ Agent Swarm ─ description ──────
159
+ // -------------------------------------------------------------------
160
+ renderHeader(width, state) {
161
+ const mode = state.mailbox ? "Swarm Team" : "Agent Swarm";
162
+ const desc = state.title ?? "";
163
+ const mailboxInfo = state.mailboxCount && state.mailboxCount > 0
164
+ ? ` │ Mailbox: ${state.mailboxCount}`
165
+ : "";
166
+ // ─ Agent Swarm ─ <desc> ────── or ─ Swarm Team ─ <desc> ─ Mailbox: 3
167
+ const prefix = `─ ${mode}`;
168
+ const content = desc ? ` ─ ${desc}` : "";
169
+ const label = `${prefix}${content}${mailboxInfo}`;
170
+ const suffixLen = Math.max(0, width - visibleLen(label) - 2);
171
+ const suffix = suffixLen > 0 ? ` ─${repeatStr("─", suffixLen)}` : "";
172
+ return truncateText(`${label}${suffix}`, width);
173
+ }
174
+ // -------------------------------------------------------------------
175
+ // Status line
176
+ // -------------------------------------------------------------------
177
+ renderStatusLine(width, state) {
178
+ const done = state.completed + state.failed;
179
+ const total = state.total;
180
+ const pct = total > 0 ? Math.round((done / total) * 100) : 0;
181
+ const elapsed = formatElapsed(Date.now() - state.startedAt);
182
+ const label = state.active > 0 ? "Working..." : "Completed";
183
+ return truncateText(`${label} ${done}/${total} (${pct}%) ${elapsed}`, width);
184
+ }
185
+ // -------------------------------------------------------------------
186
+ // Single agent mode
187
+ // -------------------------------------------------------------------
188
+ renderSingleAgent(member, width) {
189
+ const spinner = member.phase === "working" || member.phase === "prompting"
190
+ ? BRAILLE_SPINNER[this.frameIndex % BRAILLE_SPINNER.length]
191
+ : member.phase === "completed"
192
+ ? "\u2713"
193
+ : member.phase === "failed"
194
+ ? "\u2717"
195
+ : "\u25CB";
196
+ const item = member.item ?? `#${String(member.index).padStart(2, "0")}`;
197
+ const itemTrunc = truncateText(item, Math.max(4, Math.floor(width * 0.4)));
198
+ let suffix = "";
199
+ const remaining = Math.max(0, width - visibleLen(`${spinner} ${itemTrunc}`) - 2);
200
+ if (member.phase === "working" && member.activity && remaining > 4) {
201
+ suffix = ` ${truncateText(member.activity, Math.min(remaining - 1, width - 10))}`;
202
+ }
203
+ else if (member.phase === "completed") {
204
+ suffix = " ok";
205
+ }
206
+ else if (member.phase === "failed" && member.error && remaining > 4) {
207
+ suffix = ` ${truncateText(member.error, Math.min(remaining - 1, 30))}`;
208
+ }
209
+ // No braille bar for single agent — just spinner + item + scrolling text
210
+ return truncateText(`${spinner} ${itemTrunc}${suffix}`, width);
211
+ }
212
+ // -------------------------------------------------------------------
213
+ // Grid layout (multiple agents)
214
+ // -------------------------------------------------------------------
215
+ renderGrid(width, state) {
216
+ const count = Math.min(state.members.length, MAX_VISIBLE_MEMBERS);
217
+ if (count <= 0)
218
+ return [];
219
+ // Calculate grid dimensions
220
+ const gapWidth = visibleLen(CELL_GAP);
221
+ const minLabelWidth = 8;
222
+ const estCellWidth = ID_WIDTH + BRAILLE_BAR_MIN_WIDTH + minLabelWidth;
223
+ const columns = Math.max(1, Math.min(count, Math.floor((width + gapWidth) / (estCellWidth + gapWidth))));
224
+ const rows = Math.ceil(count / columns);
225
+ const actualCellWidth = Math.floor((width - gapWidth * (columns - 1)) / columns);
226
+ // Bar gets what's left after ID + minimum label; cap to keep label readable
227
+ const barCells = Math.max(BRAILLE_BAR_MIN_WIDTH, Math.min(BRAILLE_BAR_MAX_WIDTH, actualCellWidth - ID_WIDTH - minLabelWidth));
228
+ const leftPad = Math.floor((width - (actualCellWidth * columns + gapWidth * (columns - 1))) / 2);
138
229
  const lines = [];
139
- // Header: title
140
- const title = state.title ?? "Agent Swarm";
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}`);
150
- // Member rows
151
- const maxMembers = Math.min(state.members.length, 20);
152
- for (let i = 0; i < maxMembers; i += 1) {
153
- const member = state.members[i];
154
- if (!member)
155
- continue;
156
- const row = renderMemberRow(member, contentWidth, this.frameIndex);
157
- lines.push(` ${row}`);
230
+ for (let row = 0; row < rows; row++) {
231
+ let line = " ".repeat(Math.max(0, leftPad));
232
+ for (let col = 0; col < columns; col++) {
233
+ const idx = row * columns + col;
234
+ const member = state.members[idx];
235
+ if (!member)
236
+ continue;
237
+ const cell = this.renderCell(member, actualCellWidth, barCells);
238
+ line += cell;
239
+ if (col < columns - 1)
240
+ line += CELL_GAP;
241
+ }
242
+ lines.push(truncateText(line, width));
243
+ }
244
+ // Extra info line for truncated members
245
+ if (state.members.length > MAX_VISIBLE_MEMBERS) {
246
+ lines.push(` ... ${state.members.length - MAX_VISIBLE_MEMBERS} more`);
247
+ }
248
+ return lines;
249
+ }
250
+ renderCell(member, cellWidth, barCells) {
251
+ const id = String(member.index).padStart(ID_WIDTH, "0");
252
+ const bar = this.renderBrailleBar(member, barCells);
253
+ const label = this.renderCellLabel(member, Math.max(1, cellWidth - ID_WIDTH - barCells - 3));
254
+ return `${id} ${bar}${label ? " " + label : ""}`;
255
+ }
256
+ renderBrailleBar(member, width) {
257
+ if (width <= 0)
258
+ return "";
259
+ const capacity = width * BRAILLE_LEVELS.length;
260
+ const ticks = member.phase === "completed"
261
+ ? capacity
262
+ : member.phase === "working"
263
+ ? Math.min(capacity, (member.progressTick ?? 0) + (this.frameIndex % 3))
264
+ : 0;
265
+ const fullBars = Math.floor(ticks / BRAILLE_LEVELS.length);
266
+ const partial = ticks % BRAILLE_LEVELS.length;
267
+ const partialChar = partial > 0 ? BRAILLE_LEVELS[partial - 1] : "";
268
+ let bar = "";
269
+ for (let i = 0; i < width; i++) {
270
+ if (i < fullBars) {
271
+ bar += BRAILLE_LEVELS[BRAILLE_LEVELS.length - 1]; // Full █
272
+ }
273
+ else if (i === fullBars && partialChar) {
274
+ bar += partialChar;
275
+ }
276
+ else {
277
+ bar += BRAILLE_EMPTY;
278
+ }
279
+ }
280
+ return bar;
281
+ }
282
+ renderCellLabel(member, width) {
283
+ if (width <= 0)
284
+ return "";
285
+ // Show latest activity (model output or tool call) for running agents
286
+ if (member.phase === "working" || member.phase === "prompting") {
287
+ const text = member.activity ?? member.item ?? "";
288
+ return truncateText(text, width);
289
+ }
290
+ if (member.phase === "completed")
291
+ return truncateText("ok", width);
292
+ if (member.phase === "failed" && member.error)
293
+ return truncateText(member.error, Math.min(width, 20));
294
+ if (member.phase === "queued")
295
+ return truncateText(member.item ?? "...", width);
296
+ return "";
297
+ }
298
+ // -------------------------------------------------------------------
299
+ // Render scheduling
300
+ // -------------------------------------------------------------------
301
+ requestRender() {
302
+ if (this.debounceTimer !== undefined) {
303
+ return;
158
304
  }
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}`);
165
- // Bottom border
166
- const bottom = `\u2514${"\u2500".repeat(contentWidth)}\u2518`;
167
- lines.push(bottom);
168
- this.cachedLines = lines;
169
- this.renderedWidth = safeWidth;
170
- return this.cachedLines;
305
+ this.debounceTimer = setTimeout(() => {
306
+ this.debounceTimer = undefined;
307
+ this.onRequestRender?.();
308
+ }, DEBOUNCE_MS);
309
+ this.onRequestRender?.();
310
+ }
311
+ startPolling() {
312
+ this.pollTimer = setTimeout(() => {
313
+ this.pollTimer = undefined;
314
+ if (this.state_)
315
+ this.onRequestRender?.();
316
+ this.startPolling();
317
+ }, POLL_MS);
171
318
  }
172
319
  startAnimation() {
173
320
  this.animationFrame = setInterval(() => {
174
321
  this.frameIndex = (this.frameIndex + 1) % BRAILLE_SPINNER.length;
175
- this.invalidate();
176
- this.onRequestRender?.();
322
+ const hasActive = this.state_?.active ?? 0 > 0;
323
+ if (hasActive)
324
+ this.onRequestRender?.();
177
325
  }, FRAME_INTERVAL_MS);
178
326
  }
327
+ stopTimers() {
328
+ if (this.animationFrame !== undefined) {
329
+ clearInterval(this.animationFrame);
330
+ this.animationFrame = undefined;
331
+ }
332
+ if (this.debounceTimer !== undefined) {
333
+ clearTimeout(this.debounceTimer);
334
+ this.debounceTimer = undefined;
335
+ }
336
+ if (this.pollTimer !== undefined) {
337
+ clearTimeout(this.pollTimer);
338
+ this.pollTimer = undefined;
339
+ }
340
+ }
179
341
  }
180
342
  // ---------------------------------------------------------------------------
181
- // Rendering helpers
343
+ // Text utilities
182
344
  // ---------------------------------------------------------------------------
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}`;
190
- const fixedLen = visibleLen(fixed);
191
- if (fixedLen >= width) {
192
- return truncateText(fixed, width);
193
- }
194
- const itemSpace = Math.max(0, width - fixedLen - 2);
195
- const truncatedItem = truncateText(itemLabel, itemSpace);
196
- return `${fixed} ${truncatedItem}`;
197
- }
198
- function memberIcon(member, frameIndex) {
199
- switch (member.phase) {
200
- case "completed":
201
- return BRAILLE_FULL.repeat(2);
202
- case "failed":
203
- case "cancelled":
204
- return "\u2717 ";
205
- case "pending":
206
- case "queued":
207
- return "\u25CB ";
208
- case "prompting":
209
- case "working":
210
- case "suspended":
211
- return BRAILLE_SPINNER[frameIndex % BRAILLE_SPINNER.length] + " ";
212
- }
213
- }
214
- function shortPhaseLabel(phase) {
215
- switch (phase) {
216
- case "pending":
217
- case "queued":
218
- return "wait";
219
- case "prompting":
220
- return "init";
221
- case "working":
222
- return "work";
223
- case "completed":
224
- return "done";
225
- case "failed":
226
- return "fail";
227
- case "cancelled":
228
- return "abort";
229
- case "suspended":
230
- return "retry";
231
- }
232
- }
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];
245
- if (state.failed > 0)
246
- parts.splice(1, 0, `${state.failed}fail`);
247
- if (state.active > 0)
248
- parts.splice(1, 0, `${state.active}act`);
249
- const full = parts.join(" | ");
250
- if (full.length <= width)
251
- return full;
252
- return truncateText(full, width);
345
+ function repeatStr(ch, count) {
346
+ let out = "";
347
+ for (let i = 0; i < count; i++)
348
+ out += ch;
349
+ return out;
253
350
  }
254
351
  function formatElapsed(ms) {
255
352
  const totalSec = Math.floor(ms / 1000);
@@ -257,19 +354,21 @@ function formatElapsed(ms) {
257
354
  return `${totalSec}s`;
258
355
  const m = Math.floor(totalSec / 60);
259
356
  const s = totalSec % 60;
260
- return `${m}m${s}s`;
357
+ if (m < 60)
358
+ return `${m}m ${s}s`;
359
+ const h = Math.floor(m / 60);
360
+ return `${h}h ${m % 60}m ${s}s`;
261
361
  }
262
- // ---------------------------------------------------------------------------
263
- // Text utilities
264
- // ---------------------------------------------------------------------------
265
362
  function visibleLen(text) {
266
363
  return text.replace(/\x1b\[[0-9;]*m/g, "").length;
267
364
  }
268
365
  function truncateText(text, maxLen) {
366
+ if (maxLen <= 0)
367
+ return "";
269
368
  if (text.length <= maxLen)
270
369
  return text;
271
370
  if (maxLen <= 1)
272
371
  return text.slice(0, 1);
273
- return text.slice(0, Math.max(0, maxLen - 1)) + "\u2026";
372
+ return text.slice(0, maxLen - 1) + "\u2026";
274
373
  }
275
374
  //# sourceMappingURL=progress.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/tui/progress.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/tui/progress.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@
5
5
  * Displays a coloured marker line when swarm mode is activated,
6
6
  * deactivated, or ended.
7
7
  *
8
- * Ported from MoonshotAI/kimi-code's SwarmModeMarkerComponent.
8
+ * Architecture reference: AgentSwarm pattern.
9
9
  */
10
10
  import type { Component } from "@earendil-works/pi-tui";
11
11
  export type SwarmModeMarkerState = "active" | "inactive" | "ended";
@@ -5,7 +5,7 @@
5
5
  * Displays a coloured marker line when swarm mode is activated,
6
6
  * deactivated, or ended.
7
7
  *
8
- * Ported from MoonshotAI/kimi-code's SwarmModeMarkerComponent.
8
+ * Architecture reference: AgentSwarm pattern.
9
9
  */
10
10
  // ---------------------------------------------------------------------------
11
11
  // Component
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gjczone/pi-swarm",
3
- "version": "0.4.1",
3
+ "version": "0.7.0",
4
4
  "description": "Agent Swarm & Team for pi-coding-agent. Single to 128 subagents: parallel swarm or collaborative team with mailbox. Live TUI, rate-limit retries, crash recovery. Ported from kimi-code, inspired by pi-crew.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -15,7 +15,11 @@
15
15
  "dev": "tsc --watch",
16
16
  "test": "vitest run",
17
17
  "test:watch": "vitest",
18
- "ci": "npm run typecheck && npm test && npm run build && test -f dist/index.js && test -f dist/index.d.ts"
18
+ "coverage": "vitest run --coverage",
19
+ "lint": "npx eslint src tests --quiet 2>/dev/null; true",
20
+ "knip": "npx knip --no-exit-code 2>/dev/null; true",
21
+ "circular": "npx dpdm --circular src/index.ts 2>/dev/null; true",
22
+ "ci": "npx prettier --check src tests && npm run typecheck && npm run lint && npm run knip && npm run circular && npm run coverage && npm run build && test -f dist/index.js && test -f dist/index.d.ts"
19
23
  },
20
24
  "keywords": [
21
25
  "pi-package",
@@ -49,7 +53,14 @@
49
53
  "@earendil-works/pi-coding-agent": "*"
50
54
  },
51
55
  "devDependencies": {
56
+ "@eslint/js": "^10.0.1",
57
+ "@types/node": "^26.0.1",
58
+ "@vitest/coverage-v8": "^4.1.9",
59
+ "dpdm": "^4.2.0",
60
+ "eslint": "^10.6.0",
61
+ "knip": "^6.23.0",
52
62
  "typescript": "^6.0.0",
63
+ "typescript-eslint": "^8.62.0",
53
64
  "vitest": "^4.0.0"
54
65
  },
55
66
  "engines": {