@gjczone/pi-swarm 0.1.2
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/LICENSE +21 -0
- package/README.md +124 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +99 -0
- package/dist/index.js.map +1 -0
- package/dist/shared/controller.d.ts +86 -0
- package/dist/shared/controller.d.ts.map +1 -0
- package/dist/shared/controller.js +662 -0
- package/dist/shared/controller.js.map +1 -0
- package/dist/shared/pi-invoke.d.ts +31 -0
- package/dist/shared/pi-invoke.d.ts.map +1 -0
- package/dist/shared/pi-invoke.js +54 -0
- package/dist/shared/pi-invoke.js.map +1 -0
- package/dist/shared/render.d.ts +44 -0
- package/dist/shared/render.d.ts.map +1 -0
- package/dist/shared/render.js +116 -0
- package/dist/shared/render.js.map +1 -0
- package/dist/shared/spawner.d.ts +26 -0
- package/dist/shared/spawner.d.ts.map +1 -0
- package/dist/shared/spawner.js +226 -0
- package/dist/shared/spawner.js.map +1 -0
- package/dist/shared/types.d.ts +182 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +8 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/state/persistence.d.ts +83 -0
- package/dist/state/persistence.d.ts.map +1 -0
- package/dist/state/persistence.js +215 -0
- package/dist/state/persistence.js.map +1 -0
- package/dist/state/recovery.d.ts +35 -0
- package/dist/state/recovery.d.ts.map +1 -0
- package/dist/state/recovery.js +149 -0
- package/dist/state/recovery.js.map +1 -0
- package/dist/swarm/command.d.ts +36 -0
- package/dist/swarm/command.d.ts.map +1 -0
- package/dist/swarm/command.js +113 -0
- package/dist/swarm/command.js.map +1 -0
- package/dist/swarm/mode.d.ts +58 -0
- package/dist/swarm/mode.d.ts.map +1 -0
- package/dist/swarm/mode.js +87 -0
- package/dist/swarm/mode.js.map +1 -0
- package/dist/swarm/tool.d.ts +11 -0
- package/dist/swarm/tool.d.ts.map +1 -0
- package/dist/swarm/tool.js +190 -0
- package/dist/swarm/tool.js.map +1 -0
- package/dist/team/command.d.ts +11 -0
- package/dist/team/command.d.ts.map +1 -0
- package/dist/team/command.js +32 -0
- package/dist/team/command.js.map +1 -0
- package/dist/team/mailbox.d.ts +61 -0
- package/dist/team/mailbox.d.ts.map +1 -0
- package/dist/team/mailbox.js +160 -0
- package/dist/team/mailbox.js.map +1 -0
- package/dist/team/supervisor.d.ts +77 -0
- package/dist/team/supervisor.d.ts.map +1 -0
- package/dist/team/supervisor.js +195 -0
- package/dist/team/supervisor.js.map +1 -0
- package/dist/team/task-graph.d.ts +61 -0
- package/dist/team/task-graph.d.ts.map +1 -0
- package/dist/team/task-graph.js +193 -0
- package/dist/team/task-graph.js.map +1 -0
- package/dist/team/tool.d.ts +11 -0
- package/dist/team/tool.d.ts.map +1 -0
- package/dist/team/tool.js +210 -0
- package/dist/team/tool.js.map +1 -0
- package/dist/tui/permission-prompt.d.ts +26 -0
- package/dist/tui/permission-prompt.d.ts.map +1 -0
- package/dist/tui/permission-prompt.js +94 -0
- package/dist/tui/permission-prompt.js.map +1 -0
- package/dist/tui/progress.d.ts +64 -0
- package/dist/tui/progress.d.ts.map +1 -0
- package/dist/tui/progress.js +260 -0
- package/dist/tui/progress.js.map +1 -0
- package/dist/tui/swarm-markers.d.ts +20 -0
- package/dist/tui/swarm-markers.d.ts.map +1 -0
- package/dist/tui/swarm-markers.js +61 -0
- package/dist/tui/swarm-markers.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tui/progress — AgentSwarm live progress panel.
|
|
3
|
+
*
|
|
4
|
+
* Renders a real-time progress display above the input area when
|
|
5
|
+
* an AgentSwarm batch is running. Each subagent gets a braille
|
|
6
|
+
* progress bar with status labels.
|
|
7
|
+
*
|
|
8
|
+
* Ported from MoonshotAI/kimi-code's AgentSwarmProgressComponent.
|
|
9
|
+
*/
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Constants (from kimi-code)
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
/** Preferred width for the item text column. */
|
|
14
|
+
const TEXT_CELL_PREFERRED_WIDTH = 30;
|
|
15
|
+
/** Gap between columns. */
|
|
16
|
+
const CELL_GAP = " ";
|
|
17
|
+
/** Braille bar max width in characters. */
|
|
18
|
+
const BRAILLE_BAR_MAX_WIDTH = 8;
|
|
19
|
+
/** Minimum braille bar width. */
|
|
20
|
+
const TEXT_BRAILLE_BAR_MIN_WIDTH = 6;
|
|
21
|
+
/** Animation frame interval in ms. */
|
|
22
|
+
const FRAME_INTERVAL_MS = 80;
|
|
23
|
+
/** How long the completion-fill animation lasts in ms. */
|
|
24
|
+
const COMPLETE_FILL_MS = 360;
|
|
25
|
+
/** Braille characters representing fill levels 0-6 dots. */
|
|
26
|
+
const BRAILLE_LEVELS = [
|
|
27
|
+
"\u28C0", // 0 dots (empty)
|
|
28
|
+
"\u28C4", // 1 dot
|
|
29
|
+
"\u28E4", // 2 dots
|
|
30
|
+
"\u28E6", // 3 dots
|
|
31
|
+
"\u28F6", // 4 dots
|
|
32
|
+
"\u28F7", // 5 dots
|
|
33
|
+
"\u28FF", // 6 dots (full)
|
|
34
|
+
];
|
|
35
|
+
const BRAILLE_EMPTY = BRAILLE_LEVELS[0];
|
|
36
|
+
const BRAILLE_FULL = BRAILLE_LEVELS[6];
|
|
37
|
+
/** Status labels for each phase. */
|
|
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...";
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Component
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
export class AgentSwarmProgressComponent {
|
|
48
|
+
state_ = null;
|
|
49
|
+
animationFrame;
|
|
50
|
+
startTime = Date.now();
|
|
51
|
+
renderedWidth;
|
|
52
|
+
cachedLines;
|
|
53
|
+
constructor() {
|
|
54
|
+
this.startAnimation();
|
|
55
|
+
}
|
|
56
|
+
// -------------------------------------------------------------------
|
|
57
|
+
// Public API
|
|
58
|
+
// -------------------------------------------------------------------
|
|
59
|
+
/** Update the progress state from the tool execution. */
|
|
60
|
+
update(state) {
|
|
61
|
+
this.state_ = state;
|
|
62
|
+
this.invalidate();
|
|
63
|
+
}
|
|
64
|
+
/** Mark the swarm as completed (triggers completion animation). */
|
|
65
|
+
complete() {
|
|
66
|
+
if (this.state_) {
|
|
67
|
+
// Mark all non-terminal members as completed
|
|
68
|
+
for (const m of this.state_.members) {
|
|
69
|
+
if (m.phase !== "completed" && m.phase !== "failed" && m.phase !== "cancelled") {
|
|
70
|
+
m.phase = "completed";
|
|
71
|
+
m.phaseStartedAt = Date.now();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
this.state_.active = 0;
|
|
75
|
+
this.state_.queued = 0;
|
|
76
|
+
this.state_.completed = this.state_.total - this.state_.failed;
|
|
77
|
+
this.state_.status = COMPLETED_LABEL;
|
|
78
|
+
}
|
|
79
|
+
this.invalidate();
|
|
80
|
+
}
|
|
81
|
+
/** Stop the animation loop. */
|
|
82
|
+
dispose() {
|
|
83
|
+
if (this.animationFrame !== undefined) {
|
|
84
|
+
clearInterval(this.animationFrame);
|
|
85
|
+
this.animationFrame = undefined;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// -------------------------------------------------------------------
|
|
89
|
+
// Component interface
|
|
90
|
+
// -------------------------------------------------------------------
|
|
91
|
+
invalidate() {
|
|
92
|
+
this.renderedWidth = undefined;
|
|
93
|
+
this.cachedLines = undefined;
|
|
94
|
+
}
|
|
95
|
+
render(width) {
|
|
96
|
+
const safeWidth = Math.max(10, width);
|
|
97
|
+
if (this.cachedLines && this.renderedWidth === safeWidth) {
|
|
98
|
+
return this.cachedLines;
|
|
99
|
+
}
|
|
100
|
+
if (!this.state_ || this.state_.members.length === 0) {
|
|
101
|
+
this.cachedLines = [];
|
|
102
|
+
return this.cachedLines;
|
|
103
|
+
}
|
|
104
|
+
const state = this.state_;
|
|
105
|
+
const lines = [];
|
|
106
|
+
// Title bar
|
|
107
|
+
const title = state.title ?? "Agent Swarm";
|
|
108
|
+
lines.push(borderTop(title, safeWidth));
|
|
109
|
+
// Overall status
|
|
110
|
+
const statusLabel = state.status ?? resolveOverallStatus(state);
|
|
111
|
+
const statusBar = buildStatusBar(state, safeWidth);
|
|
112
|
+
lines.push(` ${statusLabel}`);
|
|
113
|
+
lines.push(` ${statusBar}`);
|
|
114
|
+
// Member rows
|
|
115
|
+
const maxMembers = Math.min(state.members.length, 20); // Cap for performance
|
|
116
|
+
for (let i = 0; i < maxMembers; i += 1) {
|
|
117
|
+
const member = state.members[i];
|
|
118
|
+
if (!member)
|
|
119
|
+
continue;
|
|
120
|
+
const row = renderMemberRow(member, safeWidth - 4);
|
|
121
|
+
lines.push(` ${row}`);
|
|
122
|
+
}
|
|
123
|
+
// Summary
|
|
124
|
+
const summary = buildSummary(state);
|
|
125
|
+
lines.push(` ${summary}`);
|
|
126
|
+
// Bottom border
|
|
127
|
+
lines.push(borderBottom(safeWidth));
|
|
128
|
+
this.cachedLines = lines;
|
|
129
|
+
this.renderedWidth = safeWidth;
|
|
130
|
+
return this.cachedLines;
|
|
131
|
+
}
|
|
132
|
+
// -------------------------------------------------------------------
|
|
133
|
+
// Animation
|
|
134
|
+
// -------------------------------------------------------------------
|
|
135
|
+
startAnimation() {
|
|
136
|
+
this.animationFrame = setInterval(() => {
|
|
137
|
+
this.invalidate();
|
|
138
|
+
}, FRAME_INTERVAL_MS);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
// Rendering helpers
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
function borderTop(title, width) {
|
|
145
|
+
const inner = ` ${title} `;
|
|
146
|
+
const dashes = Math.max(0, width - inner.length - 2);
|
|
147
|
+
return `\u250C${inner}\u2500${"\u2500".repeat(Math.max(0, dashes))}\u2510`;
|
|
148
|
+
}
|
|
149
|
+
function borderBottom(width) {
|
|
150
|
+
return `\u2514${"\u2500".repeat(Math.max(0, width - 2))}\u2518`;
|
|
151
|
+
}
|
|
152
|
+
function resolveOverallStatus(state) {
|
|
153
|
+
if (state.queued === 0 && state.active === 0) {
|
|
154
|
+
if (state.failed > 0)
|
|
155
|
+
return FAILED_LABEL;
|
|
156
|
+
return COMPLETED_LABEL;
|
|
157
|
+
}
|
|
158
|
+
if (state.active > 0)
|
|
159
|
+
return WORKING_LABEL;
|
|
160
|
+
return ORCHESTRATING_LABEL;
|
|
161
|
+
}
|
|
162
|
+
function buildStatusBar(state, width) {
|
|
163
|
+
const barWidth = Math.max(1, width - 4);
|
|
164
|
+
const total = state.total || 1;
|
|
165
|
+
const doneRatio = (state.completed + state.failed) / total;
|
|
166
|
+
const doneChars = Math.round(doneRatio * barWidth);
|
|
167
|
+
const remainingChars = barWidth - doneChars;
|
|
168
|
+
const done = "\u2501".repeat(doneChars);
|
|
169
|
+
const remaining = "\u2501".repeat(remainingChars);
|
|
170
|
+
return done + remaining;
|
|
171
|
+
}
|
|
172
|
+
function renderMemberRow(member, width) {
|
|
173
|
+
const indexLabel = `#${String(member.index)}`;
|
|
174
|
+
const brailleBar = renderBrailleBar(member, BRAILLE_BAR_MAX_WIDTH);
|
|
175
|
+
const statusLabel = memberPhaseLabel(member.phase);
|
|
176
|
+
const itemLabel = (member.item ?? "").slice(0, TEXT_CELL_PREFERRED_WIDTH);
|
|
177
|
+
// Layout: #N [braille] Status item
|
|
178
|
+
const fixed = `${indexLabel} ${brailleBar} ${statusLabel}`;
|
|
179
|
+
const fixedLen = visibleLen(fixed);
|
|
180
|
+
const itemSpace = Math.max(0, width - fixedLen - 2);
|
|
181
|
+
const truncatedItem = truncateText(itemLabel, itemSpace);
|
|
182
|
+
return `${fixed} ${truncatedItem}`;
|
|
183
|
+
}
|
|
184
|
+
function renderBrailleBar(member, maxWidth) {
|
|
185
|
+
const phase = member.phase;
|
|
186
|
+
const elapsed = member.phaseStartedAt
|
|
187
|
+
? Date.now() - member.phaseStartedAt
|
|
188
|
+
: 0;
|
|
189
|
+
switch (phase) {
|
|
190
|
+
case "completed":
|
|
191
|
+
return BRAILLE_FULL.repeat(maxWidth);
|
|
192
|
+
case "failed":
|
|
193
|
+
case "cancelled":
|
|
194
|
+
case "pending":
|
|
195
|
+
case "queued":
|
|
196
|
+
return BRAILLE_EMPTY.repeat(maxWidth);
|
|
197
|
+
case "prompting":
|
|
198
|
+
case "working":
|
|
199
|
+
case "suspended":
|
|
200
|
+
return animatedBrailleBar(maxWidth, elapsed);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function animatedBrailleBar(maxWidth, elapsedMs) {
|
|
204
|
+
const cycleMs = 800; // One full animation cycle
|
|
205
|
+
const progress = (elapsedMs % cycleMs) / cycleMs; // 0..1
|
|
206
|
+
// Fill from left to right
|
|
207
|
+
const totalDots = maxWidth * 6; // 6 dots per braille char
|
|
208
|
+
const filledDots = Math.floor(progress * totalDots);
|
|
209
|
+
let result = "";
|
|
210
|
+
for (let i = 0; i < maxWidth; i += 1) {
|
|
211
|
+
const cellStart = i * 6;
|
|
212
|
+
const dotsInCell = Math.max(0, Math.min(6, filledDots - cellStart));
|
|
213
|
+
result += dotsInCell === 0 ? BRAILLE_EMPTY : BRAILLE_LEVELS[dotsInCell];
|
|
214
|
+
}
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
function memberPhaseLabel(phase) {
|
|
218
|
+
switch (phase) {
|
|
219
|
+
case "pending":
|
|
220
|
+
case "queued":
|
|
221
|
+
return QUEUED_LABEL;
|
|
222
|
+
case "prompting":
|
|
223
|
+
return "Prompting...";
|
|
224
|
+
case "working":
|
|
225
|
+
return WORKING_LABEL;
|
|
226
|
+
case "completed":
|
|
227
|
+
return COMPLETED_LABEL;
|
|
228
|
+
case "failed":
|
|
229
|
+
return FAILED_LABEL;
|
|
230
|
+
case "cancelled":
|
|
231
|
+
return ABORTED_LABEL;
|
|
232
|
+
case "suspended":
|
|
233
|
+
return "Rate limited...";
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function buildSummary(state) {
|
|
237
|
+
const parts = [];
|
|
238
|
+
if (state.completed > 0)
|
|
239
|
+
parts.push(`completed: ${state.completed}`);
|
|
240
|
+
if (state.failed > 0)
|
|
241
|
+
parts.push(`failed: ${state.failed}`);
|
|
242
|
+
if (state.active > 0)
|
|
243
|
+
parts.push(`active: ${state.active}`);
|
|
244
|
+
if (state.queued > 0)
|
|
245
|
+
parts.push(`queued: ${state.queued}`);
|
|
246
|
+
return parts.join(", ");
|
|
247
|
+
}
|
|
248
|
+
// ---------------------------------------------------------------------------
|
|
249
|
+
// Text utilities (no external dependency — avoids import issues)
|
|
250
|
+
// ---------------------------------------------------------------------------
|
|
251
|
+
function visibleLen(text) {
|
|
252
|
+
// Simple implementation: count characters, stripping ANSI escapes
|
|
253
|
+
return text.replace(/\x1b\[[0-9;]*m/g, "").length;
|
|
254
|
+
}
|
|
255
|
+
function truncateText(text, maxLen) {
|
|
256
|
+
if (text.length <= maxLen)
|
|
257
|
+
return text;
|
|
258
|
+
return text.slice(0, Math.max(0, maxLen - 1)) + "\u2026";
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/tui/progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tui/swarm-markers — swarm mode state markers rendered in the
|
|
3
|
+
* conversation transcript.
|
|
4
|
+
*
|
|
5
|
+
* Displays a coloured marker line when swarm mode is activated,
|
|
6
|
+
* deactivated, or ended.
|
|
7
|
+
*
|
|
8
|
+
* Ported from MoonshotAI/kimi-code's SwarmModeMarkerComponent.
|
|
9
|
+
*/
|
|
10
|
+
import type { Component } from "@earendil-works/pi-tui";
|
|
11
|
+
export type SwarmModeMarkerState = "active" | "inactive" | "ended";
|
|
12
|
+
export declare class SwarmModeMarkerComponent implements Component {
|
|
13
|
+
private readonly state;
|
|
14
|
+
private renderedWidth;
|
|
15
|
+
private cachedLines;
|
|
16
|
+
constructor(state: SwarmModeMarkerState);
|
|
17
|
+
invalidate(): void;
|
|
18
|
+
render(width: number): string[];
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=swarm-markers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm-markers.d.ts","sourceRoot":"","sources":["../../src/tui/swarm-markers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAMxD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;AAMnE,qBAAa,wBAAyB,YAAW,SAAS;IAI5C,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHlC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,WAAW,CAAuB;gBAEb,KAAK,EAAE,oBAAoB;IAExD,UAAU,IAAI,IAAI;IAKlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAehC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tui/swarm-markers — swarm mode state markers rendered in the
|
|
3
|
+
* conversation transcript.
|
|
4
|
+
*
|
|
5
|
+
* Displays a coloured marker line when swarm mode is activated,
|
|
6
|
+
* deactivated, or ended.
|
|
7
|
+
*
|
|
8
|
+
* Ported from MoonshotAI/kimi-code's SwarmModeMarkerComponent.
|
|
9
|
+
*/
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Component
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
export class SwarmModeMarkerComponent {
|
|
14
|
+
state;
|
|
15
|
+
renderedWidth;
|
|
16
|
+
cachedLines;
|
|
17
|
+
constructor(state) {
|
|
18
|
+
this.state = state;
|
|
19
|
+
}
|
|
20
|
+
invalidate() {
|
|
21
|
+
this.renderedWidth = undefined;
|
|
22
|
+
this.cachedLines = undefined;
|
|
23
|
+
}
|
|
24
|
+
render(width) {
|
|
25
|
+
const safeWidth = Math.max(0, width);
|
|
26
|
+
if (safeWidth <= 0)
|
|
27
|
+
return [""];
|
|
28
|
+
if (this.cachedLines && this.renderedWidth === safeWidth) {
|
|
29
|
+
return this.cachedLines;
|
|
30
|
+
}
|
|
31
|
+
const marker = swarmMarkerLabel(this.state);
|
|
32
|
+
const line = truncateToWidth(marker, safeWidth);
|
|
33
|
+
this.cachedLines = ["", line];
|
|
34
|
+
this.renderedWidth = safeWidth;
|
|
35
|
+
return this.cachedLines;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Helpers
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
function swarmMarkerLabel(state) {
|
|
42
|
+
switch (state) {
|
|
43
|
+
case "active":
|
|
44
|
+
return "Swarm activated";
|
|
45
|
+
case "inactive":
|
|
46
|
+
return "Swarm deactivated";
|
|
47
|
+
case "ended":
|
|
48
|
+
return "Swarm ended";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Truncate a string to fit within a given display width.
|
|
53
|
+
* Simple implementation — the real pi-tui provides `truncateToWidth`
|
|
54
|
+
* which handles wide characters and ANSI escapes.
|
|
55
|
+
*/
|
|
56
|
+
function truncateToWidth(text, maxWidth) {
|
|
57
|
+
if (text.length <= maxWidth)
|
|
58
|
+
return text;
|
|
59
|
+
return text.slice(0, maxWidth - 1) + "\u2026"; // ellipsis
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=swarm-markers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm-markers.js","sourceRoot":"","sources":["../../src/tui/swarm-markers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,OAAO,wBAAwB;IAIN;IAHrB,aAAa,CAAqB;IAClC,WAAW,CAAuB;IAE1C,YAA6B,KAA2B;QAA3B,UAAK,GAAL,KAAK,CAAsB;IAAG,CAAC;IAE5D,UAAU;QACR,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,SAAS,IAAI,CAAC;YAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAEhC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACzD,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEhD,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,gBAAgB,CAAC,KAA2B;IACnD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,iBAAiB,CAAC;QAC3B,KAAK,UAAU;YACb,OAAO,mBAAmB,CAAC;QAC7B,KAAK,OAAO;YACV,OAAO,aAAa,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,IAAY,EAAE,QAAgB;IACrD,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,WAAW;AAC5D,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@gjczone/pi-swarm",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "Agent Swarm for pi-coding-agent — launch multiple subagents from a prompt template with live TUI progress. Ported from MoonshotAI/kimi-code swarm with gratitude.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist/**/*"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"prebuild": "rm -rf dist",
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"typecheck": "tsc --noEmit",
|
|
15
|
+
"dev": "tsc --watch",
|
|
16
|
+
"test": "vitest run",
|
|
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"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"pi-package",
|
|
22
|
+
"pi-coding-agent",
|
|
23
|
+
"extension",
|
|
24
|
+
"swarm",
|
|
25
|
+
"agent-swarm",
|
|
26
|
+
"subagent",
|
|
27
|
+
"parallel"
|
|
28
|
+
],
|
|
29
|
+
"pi": {
|
|
30
|
+
"extensions": [
|
|
31
|
+
"./dist"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"author": "gjczone",
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "https://github.com/gjczone/pi-swarm.git"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@earendil-works/pi-tui": "*",
|
|
42
|
+
"typebox": "^1.0.0"
|
|
43
|
+
},
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"@earendil-works/pi-coding-agent": "*"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"typescript": "^5.0.0",
|
|
49
|
+
"vitest": "^1.6.1"
|
|
50
|
+
},
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=18.0.0"
|
|
53
|
+
},
|
|
54
|
+
"os": [
|
|
55
|
+
"linux",
|
|
56
|
+
"darwin"
|
|
57
|
+
]
|
|
58
|
+
}
|