@pi-unipi/subagents 0.1.13 → 0.2.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/dist/__tests__/config.test.d.ts +11 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +196 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/esc-propagation.test.d.ts +10 -0
- package/dist/__tests__/esc-propagation.test.d.ts.map +1 -0
- package/dist/__tests__/esc-propagation.test.js +140 -0
- package/dist/__tests__/esc-propagation.test.js.map +1 -0
- package/dist/__tests__/file-lock.test.d.ts +12 -0
- package/dist/__tests__/file-lock.test.d.ts.map +1 -0
- package/dist/__tests__/file-lock.test.js +187 -0
- package/dist/__tests__/file-lock.test.js.map +1 -0
- package/dist/__tests__/workflow-integration.test.d.ts +12 -0
- package/dist/__tests__/workflow-integration.test.d.ts.map +1 -0
- package/dist/__tests__/workflow-integration.test.js +261 -0
- package/dist/__tests__/workflow-integration.test.js.map +1 -0
- package/dist/agent-manager.d.ts +4 -1
- package/dist/agent-manager.d.ts.map +1 -1
- package/dist/agent-manager.js +10 -0
- package/dist/agent-manager.js.map +1 -1
- package/dist/agent-runner.d.ts +2 -1
- package/dist/agent-runner.d.ts.map +1 -1
- package/dist/agent-runner.js +23 -7
- package/dist/agent-runner.js.map +1 -1
- package/dist/conversation-viewer.d.ts +40 -0
- package/dist/conversation-viewer.d.ts.map +1 -0
- package/dist/conversation-viewer.js +276 -0
- package/dist/conversation-viewer.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +410 -58
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +30 -0
- package/dist/types.js.map +1 -1
- package/dist/widget.d.ts +32 -3
- package/dist/widget.d.ts.map +1 -1
- package/dist/widget.js +298 -56
- package/dist/widget.js.map +1 -1
- package/package.json +1 -1
- package/src/agent-manager.ts +12 -1
- package/src/agent-runner.ts +23 -8
- package/src/conversation-viewer.ts +299 -0
- package/src/index.ts +411 -49
- package/src/types.ts +49 -0
- package/src/widget.ts +332 -72
package/dist/widget.js
CHANGED
|
@@ -1,11 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @pi-unipi/subagents — Live widget
|
|
3
3
|
*
|
|
4
|
-
* Shows running agents above the editor
|
|
5
|
-
*
|
|
4
|
+
* Shows running/completed agents above the editor with:
|
|
5
|
+
* - Animated braille spinners
|
|
6
|
+
* - Finished agent lingering (1 turn success, 2 turns error)
|
|
7
|
+
* - Priority-based overflow (running > queued > finished)
|
|
8
|
+
* - Status bar integration
|
|
9
|
+
* - Activity description grouping
|
|
10
|
+
* - ANSI-aware truncation via pi-tui
|
|
6
11
|
*/
|
|
7
|
-
|
|
12
|
+
import { truncateToWidth } from "@mariozechner/pi-tui";
|
|
13
|
+
// ---- Constants ----
|
|
14
|
+
/** Maximum lines the widget may render. */
|
|
15
|
+
const MAX_WIDGET_LINES = 12;
|
|
16
|
+
/** Braille spinner frames. */
|
|
8
17
|
const SPINNER = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
18
|
+
/** Statuses that indicate error/non-success (for linger behavior). */
|
|
19
|
+
const ERROR_STATUSES = new Set(["error", "aborted", "stopped"]);
|
|
20
|
+
/** Tool name → human-readable action for activity descriptions. */
|
|
21
|
+
const TOOL_DISPLAY = {
|
|
22
|
+
read: "reading",
|
|
23
|
+
bash: "running command",
|
|
24
|
+
edit: "editing",
|
|
25
|
+
write: "writing",
|
|
26
|
+
grep: "searching",
|
|
27
|
+
find: "finding files",
|
|
28
|
+
ls: "listing",
|
|
29
|
+
};
|
|
30
|
+
// ---- Formatting helpers ----
|
|
9
31
|
/** Format duration. */
|
|
10
32
|
function formatMs(ms) {
|
|
11
33
|
if (ms >= 60_000)
|
|
@@ -14,23 +36,50 @@ function formatMs(ms) {
|
|
|
14
36
|
return `${(ms / 1_000).toFixed(1)}s`;
|
|
15
37
|
return `${ms}ms`;
|
|
16
38
|
}
|
|
17
|
-
/** Format turns. */
|
|
39
|
+
/** Format turns with optional max limit: "⟳5≤30" or "⟳5". */
|
|
18
40
|
function formatTurns(turn, max) {
|
|
19
|
-
return max ? `⟳${turn}≤${max}` : `⟳${turn}`;
|
|
41
|
+
return max != null ? `⟳${turn}≤${max}` : `⟳${turn}`;
|
|
20
42
|
}
|
|
21
|
-
/**
|
|
43
|
+
/** Format token count compactly: "33.8k token", "1.2M token". */
|
|
44
|
+
function formatTokens(count) {
|
|
45
|
+
if (count >= 1_000_000)
|
|
46
|
+
return `${(count / 1_000_000).toFixed(1)}M token`;
|
|
47
|
+
if (count >= 1_000)
|
|
48
|
+
return `${(count / 1_000).toFixed(1)}k token`;
|
|
49
|
+
return `${count} token`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Build a human-readable activity string from currently-running tools.
|
|
53
|
+
* Groups by tool type with counts: "reading 3 files, searching 2 patterns".
|
|
54
|
+
*/
|
|
22
55
|
function describeActivity(activeTools, responseText) {
|
|
23
56
|
if (activeTools.size > 0) {
|
|
24
|
-
const
|
|
25
|
-
|
|
57
|
+
const groups = new Map();
|
|
58
|
+
for (const toolName of activeTools.values()) {
|
|
59
|
+
const action = TOOL_DISPLAY[toolName] ?? toolName;
|
|
60
|
+
groups.set(action, (groups.get(action) ?? 0) + 1);
|
|
61
|
+
}
|
|
62
|
+
const parts = [];
|
|
63
|
+
for (const [action, count] of groups) {
|
|
64
|
+
if (count > 1) {
|
|
65
|
+
parts.push(`${action} ${count} ${action === "searching" ? "patterns" : "files"}`);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
parts.push(action);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return parts.join(", ") + "…";
|
|
26
72
|
}
|
|
27
|
-
if (responseText) {
|
|
28
|
-
const lastLine = responseText.split("\n").
|
|
73
|
+
if (responseText && responseText.trim().length > 0) {
|
|
74
|
+
const lastLine = responseText.split("\n").find((l) => l.trim())?.trim() ?? "";
|
|
75
|
+
if (lastLine.length > 60)
|
|
76
|
+
return lastLine.slice(0, 60) + "…";
|
|
29
77
|
if (lastLine.length > 0)
|
|
30
|
-
return lastLine
|
|
78
|
+
return lastLine;
|
|
31
79
|
}
|
|
32
80
|
return "thinking…";
|
|
33
81
|
}
|
|
82
|
+
// ---- Widget ----
|
|
34
83
|
export class AgentWidget {
|
|
35
84
|
manager;
|
|
36
85
|
activity;
|
|
@@ -39,6 +88,14 @@ export class AgentWidget {
|
|
|
39
88
|
uiCtx;
|
|
40
89
|
tui;
|
|
41
90
|
widgetRegistered = false;
|
|
91
|
+
/** Last content key — skips requestRender when only spinner changed. */
|
|
92
|
+
lastContentKey = "";
|
|
93
|
+
/** Tracks how many turns each finished agent has survived. */
|
|
94
|
+
finishedTurnAge = new Map();
|
|
95
|
+
/** How many extra turns error/aborted agents linger. */
|
|
96
|
+
static ERROR_LINGER_TURNS = 2;
|
|
97
|
+
/** Last status bar text for dedup. */
|
|
98
|
+
lastStatusText;
|
|
42
99
|
constructor(manager, activity) {
|
|
43
100
|
this.manager = manager;
|
|
44
101
|
this.activity = activity;
|
|
@@ -48,50 +105,94 @@ export class AgentWidget {
|
|
|
48
105
|
this.uiCtx = ctx;
|
|
49
106
|
this.widgetRegistered = false;
|
|
50
107
|
this.tui = undefined;
|
|
108
|
+
this.lastStatusText = undefined;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Called on each new turn (tool_execution_start).
|
|
113
|
+
* Ages finished agents and clears those that have lingered long enough.
|
|
114
|
+
*/
|
|
115
|
+
onTurnStart() {
|
|
116
|
+
for (const [id, age] of this.finishedTurnAge) {
|
|
117
|
+
this.finishedTurnAge.set(id, age + 1);
|
|
51
118
|
}
|
|
119
|
+
this.update();
|
|
52
120
|
}
|
|
53
121
|
ensureTimer() {
|
|
54
122
|
if (this.timer)
|
|
55
123
|
return;
|
|
56
124
|
this.timer = setInterval(() => {
|
|
57
125
|
this.spinnerFrame = (this.spinnerFrame + 1) % SPINNER.length;
|
|
58
|
-
this.
|
|
126
|
+
if (this.lastContentKey)
|
|
127
|
+
this.triggerRender();
|
|
59
128
|
}, 80);
|
|
60
129
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
this.timer = undefined;
|
|
66
|
-
}
|
|
67
|
-
// Clear widget after agent finishes
|
|
68
|
-
this.triggerRender();
|
|
130
|
+
/** Record an agent as finished (call when agent completes). */
|
|
131
|
+
markFinished(agentId) {
|
|
132
|
+
if (!this.finishedTurnAge.has(agentId)) {
|
|
133
|
+
this.finishedTurnAge.set(agentId, 0);
|
|
69
134
|
}
|
|
70
135
|
}
|
|
71
136
|
update() {
|
|
72
137
|
this.triggerRender();
|
|
73
138
|
}
|
|
139
|
+
/** Check if a finished agent should still be shown. */
|
|
140
|
+
shouldShowFinished(agentId, status) {
|
|
141
|
+
const age = this.finishedTurnAge.get(agentId) ?? 0;
|
|
142
|
+
const maxAge = ERROR_STATUSES.has(status) ? AgentWidget.ERROR_LINGER_TURNS : 1;
|
|
143
|
+
return age < maxAge;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Build a content key capturing what's actually visible.
|
|
147
|
+
* Excludes spinner — spinner-only changes skip requestRender.
|
|
148
|
+
*/
|
|
149
|
+
buildContentKey() {
|
|
150
|
+
const allAgents = this.manager.listAgents();
|
|
151
|
+
const parts = [];
|
|
152
|
+
for (const a of allAgents) {
|
|
153
|
+
if (a.status === "running" || a.status === "queued") {
|
|
154
|
+
const act = this.activity.get(a.id);
|
|
155
|
+
parts.push(`${a.id}:${a.status}:${a.toolUses}:${act?.turnCount ?? 0}:${act?.tokens ?? ""}:${describeActivity(act?.activeTools ?? new Map(), act?.responseText ?? "")}`);
|
|
156
|
+
}
|
|
157
|
+
else if (a.completedAt && this.shouldShowFinished(a.id, a.status)) {
|
|
158
|
+
parts.push(`${a.id}:${a.status}:${a.toolUses}:finished`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return parts.join("|");
|
|
162
|
+
}
|
|
74
163
|
triggerRender() {
|
|
75
164
|
if (!this.uiCtx)
|
|
76
165
|
return;
|
|
77
|
-
const
|
|
78
|
-
const
|
|
79
|
-
const hasActive = running.length > 0;
|
|
166
|
+
const contentKey = this.buildContentKey();
|
|
167
|
+
const hasContent = contentKey.length > 0;
|
|
80
168
|
// Nothing to show — clear widget
|
|
81
|
-
if (!
|
|
169
|
+
if (!hasContent) {
|
|
82
170
|
if (this.widgetRegistered) {
|
|
83
171
|
this.uiCtx.setWidget("unipi-agents", undefined);
|
|
84
172
|
this.widgetRegistered = false;
|
|
85
173
|
this.tui = undefined;
|
|
174
|
+
this.lastContentKey = "";
|
|
175
|
+
}
|
|
176
|
+
if (this.lastStatusText !== undefined) {
|
|
177
|
+
this.uiCtx.setStatus?.("subagents", undefined);
|
|
178
|
+
this.lastStatusText = undefined;
|
|
179
|
+
}
|
|
180
|
+
// Clean up stale finished entries
|
|
181
|
+
const allAgents = this.manager.listAgents();
|
|
182
|
+
for (const [id] of this.finishedTurnAge) {
|
|
183
|
+
if (!allAgents.some((a) => a.id === id))
|
|
184
|
+
this.finishedTurnAge.delete(id);
|
|
86
185
|
}
|
|
87
186
|
return;
|
|
88
187
|
}
|
|
188
|
+
// Status bar
|
|
189
|
+
this.updateStatusBar();
|
|
89
190
|
// Register widget callback once
|
|
90
191
|
if (!this.widgetRegistered) {
|
|
91
192
|
this.uiCtx.setWidget("unipi-agents", (tui, theme) => {
|
|
92
193
|
this.tui = tui;
|
|
93
194
|
return {
|
|
94
|
-
render: () => this.renderWidget(tui, theme),
|
|
195
|
+
render: (width) => this.renderWidget(tui, theme, width),
|
|
95
196
|
invalidate: () => {
|
|
96
197
|
this.widgetRegistered = false;
|
|
97
198
|
this.tui = undefined;
|
|
@@ -99,51 +200,186 @@ export class AgentWidget {
|
|
|
99
200
|
};
|
|
100
201
|
}, { placement: "aboveEditor" });
|
|
101
202
|
this.widgetRegistered = true;
|
|
203
|
+
this.lastContentKey = "";
|
|
204
|
+
}
|
|
205
|
+
// Only request render when content actually changed
|
|
206
|
+
if (contentKey !== this.lastContentKey) {
|
|
207
|
+
this.lastContentKey = contentKey;
|
|
208
|
+
this.tui?.requestRender?.();
|
|
102
209
|
}
|
|
103
|
-
// Request re-render via TUI
|
|
104
|
-
this.tui?.requestRender?.();
|
|
105
210
|
}
|
|
106
|
-
|
|
211
|
+
updateStatusBar() {
|
|
212
|
+
if (!this.uiCtx?.setStatus)
|
|
213
|
+
return;
|
|
214
|
+
const allAgents = this.manager.listAgents();
|
|
215
|
+
let runningCount = 0;
|
|
216
|
+
let queuedCount = 0;
|
|
217
|
+
for (const a of allAgents) {
|
|
218
|
+
if (a.status === "running")
|
|
219
|
+
runningCount++;
|
|
220
|
+
else if (a.status === "queued")
|
|
221
|
+
queuedCount++;
|
|
222
|
+
}
|
|
223
|
+
let newStatusText;
|
|
224
|
+
if (runningCount > 0 || queuedCount > 0) {
|
|
225
|
+
const parts = [];
|
|
226
|
+
if (runningCount > 0)
|
|
227
|
+
parts.push(`${runningCount} running`);
|
|
228
|
+
if (queuedCount > 0)
|
|
229
|
+
parts.push(`${queuedCount} queued`);
|
|
230
|
+
const total = runningCount + queuedCount;
|
|
231
|
+
newStatusText = `${parts.join(", ")} agent${total === 1 ? "" : "s"}`;
|
|
232
|
+
}
|
|
233
|
+
if (newStatusText !== this.lastStatusText) {
|
|
234
|
+
this.uiCtx.setStatus("subagents", newStatusText);
|
|
235
|
+
this.lastStatusText = newStatusText;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/** Render a finished agent line. */
|
|
239
|
+
renderFinishedLine(a, theme, w) {
|
|
240
|
+
const duration = formatMs((a.completedAt ?? Date.now()) - a.startedAt);
|
|
241
|
+
let icon;
|
|
242
|
+
let statusText;
|
|
243
|
+
if (a.status === "completed") {
|
|
244
|
+
icon = theme.fg("success", "✓");
|
|
245
|
+
statusText = "";
|
|
246
|
+
}
|
|
247
|
+
else if (a.status === "stopped") {
|
|
248
|
+
icon = theme.fg("dim", "■");
|
|
249
|
+
statusText = theme.fg("dim", " stopped");
|
|
250
|
+
}
|
|
251
|
+
else if (a.status === "error") {
|
|
252
|
+
icon = theme.fg("error", "✗");
|
|
253
|
+
const errMsg = a.error ? `: ${a.error.slice(0, 40)}` : "";
|
|
254
|
+
statusText = theme.fg("error", ` error${errMsg}`);
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
// aborted
|
|
258
|
+
icon = theme.fg("error", "✗");
|
|
259
|
+
statusText = theme.fg("warning", " aborted");
|
|
260
|
+
}
|
|
261
|
+
const parts = [];
|
|
262
|
+
const act = this.activity.get(a.id);
|
|
263
|
+
if (act)
|
|
264
|
+
parts.push(formatTurns(act.turnCount, act.maxTurns));
|
|
265
|
+
if (a.toolUses > 0)
|
|
266
|
+
parts.push(`${a.toolUses} tool use${a.toolUses === 1 ? "" : "s"}`);
|
|
267
|
+
parts.push(duration);
|
|
268
|
+
const line = theme.fg("dim", "├─") +
|
|
269
|
+
" " +
|
|
270
|
+
icon +
|
|
271
|
+
" " +
|
|
272
|
+
theme.fg("dim", a.type) +
|
|
273
|
+
" " +
|
|
274
|
+
theme.fg("dim", a.description) +
|
|
275
|
+
" " +
|
|
276
|
+
theme.fg("dim", "·") +
|
|
277
|
+
" " +
|
|
278
|
+
theme.fg("dim", parts.join(" · ")) +
|
|
279
|
+
statusText;
|
|
280
|
+
return truncateToWidth(line, w);
|
|
281
|
+
}
|
|
282
|
+
renderWidget(tui, theme, width) {
|
|
107
283
|
const allAgents = this.manager.listAgents();
|
|
108
284
|
const running = allAgents.filter((a) => a.status === "running");
|
|
109
285
|
const queued = allAgents.filter((a) => a.status === "queued");
|
|
110
|
-
|
|
286
|
+
const finished = allAgents.filter((a) => a.status !== "running" &&
|
|
287
|
+
a.status !== "queued" &&
|
|
288
|
+
a.completedAt &&
|
|
289
|
+
this.shouldShowFinished(a.id, a.status));
|
|
290
|
+
const hasActive = running.length > 0 || queued.length > 0;
|
|
291
|
+
const hasFinished = finished.length > 0;
|
|
292
|
+
if (!hasActive && !hasFinished)
|
|
111
293
|
return [];
|
|
112
|
-
const w = tui.terminal?.columns ?? 80;
|
|
113
|
-
const truncate = (line) => {
|
|
114
|
-
if (line.length <= w)
|
|
115
|
-
return line;
|
|
116
|
-
return line.slice(0, w - 1) + "…";
|
|
117
|
-
};
|
|
294
|
+
const w = width ?? tui.terminal?.columns ?? 80;
|
|
118
295
|
const frame = SPINNER[this.spinnerFrame % SPINNER.length];
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const a = running[i];
|
|
296
|
+
const headingColor = hasActive ? "accent" : "dim";
|
|
297
|
+
const headingIcon = hasActive ? "●" : "○";
|
|
298
|
+
// Build sections: finished (1 line each), running (2 lines each), queued (1 line)
|
|
299
|
+
const finishedLines = finished.map((a) => this.renderFinishedLine(a, theme, w));
|
|
300
|
+
const runningLines = running.map((a) => {
|
|
125
301
|
const act = this.activity.get(a.id);
|
|
126
302
|
const toolCount = a.toolUses;
|
|
127
303
|
const tokens = act?.tokens ?? "";
|
|
128
|
-
const
|
|
304
|
+
const elapsed = formatMs(Date.now() - a.startedAt);
|
|
129
305
|
const activity = act ? describeActivity(act.activeTools, act.responseText) : "starting…";
|
|
130
306
|
const parts = [];
|
|
131
307
|
if (act?.turnCount)
|
|
132
308
|
parts.push(formatTurns(act.turnCount, act.maxTurns));
|
|
133
309
|
if (toolCount > 0)
|
|
134
|
-
parts.push(`${toolCount} tool
|
|
310
|
+
parts.push(`${toolCount} tool use${toolCount === 1 ? "" : "s"}`);
|
|
135
311
|
if (tokens)
|
|
136
312
|
parts.push(tokens);
|
|
137
|
-
parts.push(
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
313
|
+
parts.push(elapsed);
|
|
314
|
+
return [
|
|
315
|
+
truncateToWidth(theme.fg("dim", "├─") +
|
|
316
|
+
` ${theme.fg("accent", frame)} ${theme.bold(a.type)} ${theme.fg("dim", a.description)} ${theme.fg("dim", "·")} ${theme.fg("dim", parts.join(" · "))}`, w),
|
|
317
|
+
truncateToWidth(theme.fg("dim", "│ ") + theme.fg("dim", ` ⎿ ${activity}`), w),
|
|
318
|
+
];
|
|
319
|
+
});
|
|
320
|
+
const queuedLine = queued.length > 0
|
|
321
|
+
? truncateToWidth(theme.fg("dim", "├─") + ` ${theme.fg("muted", "◦")} ${theme.fg("dim", `${queued.length} queued`)}`, w)
|
|
322
|
+
: undefined;
|
|
323
|
+
// Assemble with overflow cap
|
|
324
|
+
const maxBody = MAX_WIDGET_LINES - 1; // heading takes 1 line
|
|
325
|
+
const totalBody = finishedLines.length + runningLines.length * 2 + (queuedLine ? 1 : 0);
|
|
326
|
+
const lines = [truncateToWidth(theme.fg(headingColor, headingIcon) + " " + theme.fg(headingColor, "Agents"), w)];
|
|
327
|
+
if (totalBody <= maxBody) {
|
|
328
|
+
// Everything fits
|
|
329
|
+
lines.push(...finishedLines);
|
|
330
|
+
for (const pair of runningLines)
|
|
331
|
+
lines.push(...pair);
|
|
332
|
+
if (queuedLine)
|
|
333
|
+
lines.push(queuedLine);
|
|
334
|
+
// Fix last connector: ├─ → └─
|
|
335
|
+
if (lines.length > 1) {
|
|
336
|
+
const last = lines.length - 1;
|
|
337
|
+
lines[last] = lines[last].replace("├─", "└─");
|
|
338
|
+
if (runningLines.length > 0 && !queuedLine && last >= 2) {
|
|
339
|
+
lines[last - 1] = lines[last - 1].replace("├─", "└─");
|
|
340
|
+
lines[last] = lines[last].replace("│ ", " ");
|
|
341
|
+
}
|
|
342
|
+
}
|
|
143
343
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
344
|
+
else {
|
|
345
|
+
// Overflow — prioritize: running > queued > finished
|
|
346
|
+
let budget = maxBody - 1; // reserve 1 for overflow indicator
|
|
347
|
+
let hiddenRunning = 0;
|
|
348
|
+
let hiddenFinished = 0;
|
|
349
|
+
// 1. Running agents (2 lines each)
|
|
350
|
+
for (const pair of runningLines) {
|
|
351
|
+
if (budget >= 2) {
|
|
352
|
+
lines.push(...pair);
|
|
353
|
+
budget -= 2;
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
hiddenRunning++;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// 2. Queued
|
|
360
|
+
if (queuedLine && budget >= 1) {
|
|
361
|
+
lines.push(queuedLine);
|
|
362
|
+
budget--;
|
|
363
|
+
}
|
|
364
|
+
// 3. Finished
|
|
365
|
+
for (const fl of finishedLines) {
|
|
366
|
+
if (budget >= 1) {
|
|
367
|
+
lines.push(fl);
|
|
368
|
+
budget--;
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
hiddenFinished++;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// Overflow summary
|
|
375
|
+
const overflowParts = [];
|
|
376
|
+
if (hiddenRunning > 0)
|
|
377
|
+
overflowParts.push(`${hiddenRunning} running`);
|
|
378
|
+
if (hiddenFinished > 0)
|
|
379
|
+
overflowParts.push(`${hiddenFinished} finished`);
|
|
380
|
+
if (overflowParts.length > 0) {
|
|
381
|
+
lines.push(truncateToWidth(theme.fg("dim", "└─") + ` ${theme.fg("dim", `+${hiddenRunning + hiddenFinished} more (${overflowParts.join(", ")})`)}`, w));
|
|
382
|
+
}
|
|
147
383
|
}
|
|
148
384
|
return lines;
|
|
149
385
|
}
|
|
@@ -152,11 +388,17 @@ export class AgentWidget {
|
|
|
152
388
|
clearInterval(this.timer);
|
|
153
389
|
this.timer = undefined;
|
|
154
390
|
}
|
|
155
|
-
if (this.uiCtx
|
|
156
|
-
this.
|
|
157
|
-
|
|
158
|
-
|
|
391
|
+
if (this.uiCtx) {
|
|
392
|
+
if (this.widgetRegistered) {
|
|
393
|
+
this.uiCtx.setWidget("unipi-agents", undefined);
|
|
394
|
+
}
|
|
395
|
+
if (this.lastStatusText !== undefined) {
|
|
396
|
+
this.uiCtx.setStatus?.("subagents", undefined);
|
|
397
|
+
}
|
|
159
398
|
}
|
|
399
|
+
this.widgetRegistered = false;
|
|
400
|
+
this.tui = undefined;
|
|
401
|
+
this.lastStatusText = undefined;
|
|
160
402
|
}
|
|
161
403
|
}
|
|
162
404
|
//# sourceMappingURL=widget.js.map
|
package/dist/widget.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget.js","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"widget.js","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/agent-manager.ts
CHANGED
|
@@ -10,7 +10,9 @@ import type { Model } from "@mariozechner/pi-ai";
|
|
|
10
10
|
import type { AgentSession, ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
|
|
11
11
|
import { runAgent, type ToolActivity } from "./agent-runner.js";
|
|
12
12
|
import { resolveModel, type ModelRegistry } from "./model-resolver.js";
|
|
13
|
-
import type { AgentRecord, AgentType, ThinkingLevel } from "./types.js";
|
|
13
|
+
import type { AgentRecord, AgentConfig, AgentType, ThinkingLevel } from "./types.js";
|
|
14
|
+
import { BUILTIN_CONFIGS } from "./types.js";
|
|
15
|
+
import { loadCustomAgents } from "./custom-agents.js";
|
|
14
16
|
import { FileLock } from "./file-lock.js";
|
|
15
17
|
|
|
16
18
|
export type OnAgentComplete = (record: AgentRecord) => void;
|
|
@@ -49,6 +51,7 @@ export class AgentManager {
|
|
|
49
51
|
private onComplete?: OnAgentComplete;
|
|
50
52
|
private onStart?: OnAgentStart;
|
|
51
53
|
private maxConcurrent: number;
|
|
54
|
+
private customAgents: Map<string, AgentConfig>;
|
|
52
55
|
|
|
53
56
|
/** Per-file transparent locking for write agents. */
|
|
54
57
|
readonly fileLock = new FileLock();
|
|
@@ -62,9 +65,15 @@ export class AgentManager {
|
|
|
62
65
|
this.onComplete = onComplete;
|
|
63
66
|
this.onStart = onStart;
|
|
64
67
|
this.maxConcurrent = maxConcurrent;
|
|
68
|
+
this.customAgents = loadCustomAgents(process.cwd());
|
|
65
69
|
this.cleanupInterval = setInterval(() => this.cleanup(), 60_000);
|
|
66
70
|
}
|
|
67
71
|
|
|
72
|
+
/** Get resolved agent config for a type. */
|
|
73
|
+
getAgentConfig(type: AgentType): AgentConfig | undefined {
|
|
74
|
+
return this.customAgents.get(type) ?? BUILTIN_CONFIGS[type];
|
|
75
|
+
}
|
|
76
|
+
|
|
68
77
|
setMaxConcurrent(n: number) {
|
|
69
78
|
this.maxConcurrent = Math.max(1, n);
|
|
70
79
|
this.drainQueue();
|
|
@@ -134,9 +143,11 @@ export class AgentManager {
|
|
|
134
143
|
model = resolved;
|
|
135
144
|
}
|
|
136
145
|
|
|
146
|
+
const agentConfig = this.getAgentConfig(type);
|
|
137
147
|
const promise = runAgent(ctx, type, prompt, {
|
|
138
148
|
pi,
|
|
139
149
|
model,
|
|
150
|
+
agentConfig,
|
|
140
151
|
maxTurns: options.maxTurns,
|
|
141
152
|
isolated: options.isolated,
|
|
142
153
|
inheritContext: options.inheritContext,
|
package/src/agent-runner.ts
CHANGED
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
SessionManager,
|
|
18
18
|
SettingsManager,
|
|
19
19
|
} from "@mariozechner/pi-coding-agent";
|
|
20
|
-
import type
|
|
20
|
+
import { BUILTIN_CONFIGS, type AgentConfig, type AgentType, type ThinkingLevel } from "./types.js";
|
|
21
21
|
|
|
22
22
|
/** Tools excluded from subagents to prevent nesting. */
|
|
23
23
|
const EXCLUDED_TOOL_NAMES = ["Agent", "get_result"];
|
|
@@ -57,6 +57,7 @@ export interface ToolActivity {
|
|
|
57
57
|
export interface RunOptions {
|
|
58
58
|
pi: ExtensionAPI;
|
|
59
59
|
model?: Model<any>;
|
|
60
|
+
agentConfig?: AgentConfig;
|
|
60
61
|
maxTurns?: number;
|
|
61
62
|
signal?: AbortSignal;
|
|
62
63
|
isolated?: boolean;
|
|
@@ -122,6 +123,15 @@ function getToolNamesForType(type: AgentType, config?: AgentConfig): string[] {
|
|
|
122
123
|
return [...BUILTIN_TOOL_NAMES];
|
|
123
124
|
}
|
|
124
125
|
|
|
126
|
+
/**
|
|
127
|
+
* Resolve agent config for a type.
|
|
128
|
+
* Priority: explicit config > builtin config > default
|
|
129
|
+
*/
|
|
130
|
+
function resolveAgentConfig(type: AgentType, explicitConfig?: AgentConfig): AgentConfig | undefined {
|
|
131
|
+
if (explicitConfig) return explicitConfig;
|
|
132
|
+
return BUILTIN_CONFIGS[type];
|
|
133
|
+
}
|
|
134
|
+
|
|
125
135
|
/** Resolve model from config. */
|
|
126
136
|
function resolveDefaultModel(
|
|
127
137
|
parentModel: Model<any> | undefined,
|
|
@@ -142,19 +152,24 @@ export async function runAgent(
|
|
|
142
152
|
): Promise<RunResult> {
|
|
143
153
|
const effectiveCwd = options.cwd ?? ctx.cwd;
|
|
144
154
|
|
|
145
|
-
//
|
|
146
|
-
const agentConfig = options
|
|
155
|
+
// Resolve agent config
|
|
156
|
+
const agentConfig = resolveAgentConfig(type, options.agentConfig);
|
|
147
157
|
const parentSystemPrompt = ctx.getSystemPrompt();
|
|
148
158
|
|
|
159
|
+
// Build system prompt using config or defaults
|
|
149
160
|
let systemPrompt: string;
|
|
150
|
-
if (
|
|
151
|
-
systemPrompt =
|
|
161
|
+
if (agentConfig?.systemPrompt && agentConfig.promptMode === "replace") {
|
|
162
|
+
systemPrompt = agentConfig.systemPrompt;
|
|
163
|
+
} else if (options.isolated) {
|
|
164
|
+
const base = agentConfig?.systemPrompt ?? `You are a ${type} agent.`;
|
|
165
|
+
systemPrompt = `${base} Follow the task instructions precisely. Do not ask questions.`;
|
|
152
166
|
} else {
|
|
153
|
-
|
|
167
|
+
const agentPrompt = agentConfig?.systemPrompt ?? `You are a ${type} agent.`;
|
|
168
|
+
systemPrompt = parentSystemPrompt + `\n\n${agentPrompt}`;
|
|
154
169
|
}
|
|
155
170
|
|
|
156
|
-
// Get tool names
|
|
157
|
-
let toolNames = getToolNamesForType(type);
|
|
171
|
+
// Get tool names from config
|
|
172
|
+
let toolNames = getToolNamesForType(type, agentConfig);
|
|
158
173
|
|
|
159
174
|
// Create resource loader
|
|
160
175
|
const agentDir = getAgentDir();
|