@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.
Files changed (47) hide show
  1. package/dist/__tests__/config.test.d.ts +11 -0
  2. package/dist/__tests__/config.test.d.ts.map +1 -0
  3. package/dist/__tests__/config.test.js +196 -0
  4. package/dist/__tests__/config.test.js.map +1 -0
  5. package/dist/__tests__/esc-propagation.test.d.ts +10 -0
  6. package/dist/__tests__/esc-propagation.test.d.ts.map +1 -0
  7. package/dist/__tests__/esc-propagation.test.js +140 -0
  8. package/dist/__tests__/esc-propagation.test.js.map +1 -0
  9. package/dist/__tests__/file-lock.test.d.ts +12 -0
  10. package/dist/__tests__/file-lock.test.d.ts.map +1 -0
  11. package/dist/__tests__/file-lock.test.js +187 -0
  12. package/dist/__tests__/file-lock.test.js.map +1 -0
  13. package/dist/__tests__/workflow-integration.test.d.ts +12 -0
  14. package/dist/__tests__/workflow-integration.test.d.ts.map +1 -0
  15. package/dist/__tests__/workflow-integration.test.js +261 -0
  16. package/dist/__tests__/workflow-integration.test.js.map +1 -0
  17. package/dist/agent-manager.d.ts +4 -1
  18. package/dist/agent-manager.d.ts.map +1 -1
  19. package/dist/agent-manager.js +10 -0
  20. package/dist/agent-manager.js.map +1 -1
  21. package/dist/agent-runner.d.ts +2 -1
  22. package/dist/agent-runner.d.ts.map +1 -1
  23. package/dist/agent-runner.js +23 -7
  24. package/dist/agent-runner.js.map +1 -1
  25. package/dist/conversation-viewer.d.ts +40 -0
  26. package/dist/conversation-viewer.d.ts.map +1 -0
  27. package/dist/conversation-viewer.js +276 -0
  28. package/dist/conversation-viewer.js.map +1 -0
  29. package/dist/index.d.ts +2 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +410 -58
  32. package/dist/index.js.map +1 -1
  33. package/dist/types.d.ts +17 -0
  34. package/dist/types.d.ts.map +1 -1
  35. package/dist/types.js +30 -0
  36. package/dist/types.js.map +1 -1
  37. package/dist/widget.d.ts +32 -3
  38. package/dist/widget.d.ts.map +1 -1
  39. package/dist/widget.js +298 -56
  40. package/dist/widget.js.map +1 -1
  41. package/package.json +1 -1
  42. package/src/agent-manager.ts +12 -1
  43. package/src/agent-runner.ts +23 -8
  44. package/src/conversation-viewer.ts +299 -0
  45. package/src/index.ts +411 -49
  46. package/src/types.ts +49 -0
  47. 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
- * Uses setWidget with tui.requestRender() for updates.
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
- /** Spinner frames (braille). */
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
- /** Describe current activity from active tools. */
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 names = [...new Set(activeTools.values())];
25
- return names.join(", ") + "…";
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").pop()?.trim() ?? "";
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.slice(0, 60) + (lastLine.length > 60 ? "…" : "");
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.triggerRender();
126
+ if (this.lastContentKey)
127
+ this.triggerRender();
59
128
  }, 80);
60
129
  }
61
- markFinished(_id) {
62
- if (!this.manager.hasRunning()) {
63
- if (this.timer) {
64
- clearInterval(this.timer);
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 allAgents = this.manager.listAgents();
78
- const running = allAgents.filter((a) => a.status === "running" || a.status === "queued");
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 (!hasActive) {
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
- renderWidget(tui, theme) {
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
- if (running.length === 0 && queued.length === 0)
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 lines = [];
120
- // Heading
121
- lines.push(truncate(theme.fg("accent", "●") + " " + theme.fg("accent", "Agents")));
122
- // Running agents (2 lines each: header + activity)
123
- for (let i = 0; i < running.length; i++) {
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 duration = formatMs(Date.now() - a.startedAt);
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 uses`);
310
+ parts.push(`${toolCount} tool use${toolCount === 1 ? "" : "s"}`);
135
311
  if (tokens)
136
312
  parts.push(tokens);
137
- parts.push(duration);
138
- const connector = i === running.length - 1 && queued.length === 0 ? "└─" : "├─";
139
- const activityConnector = i === running.length - 1 && queued.length === 0 ? " " : " ";
140
- lines.push(truncate(theme.fg("dim", connector) +
141
- ` ${theme.fg("accent", frame)} ${theme.bold(a.type)} ${theme.fg("dim", a.description)} · ${theme.fg("dim", parts.join(" · "))}`));
142
- lines.push(truncate(theme.fg("dim", activityConnector) + theme.fg("dim", `⎿ ${activity}`)));
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
- // Queued
145
- if (queued.length > 0) {
146
- lines.push(truncate(theme.fg("dim", "└─") + ` ${theme.fg("muted", "◦")} ${theme.fg("dim", `${queued.length} queued`)}`));
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 && this.widgetRegistered) {
156
- this.uiCtx.setWidget("unipi-agents", undefined);
157
- this.widgetRegistered = false;
158
- this.tui = undefined;
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
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/subagents",
3
- "version": "0.1.13",
3
+ "version": "0.2.2",
4
4
  "description": "Subagents for UniPi — parallel execution, file locking, workflow integration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -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,
@@ -17,7 +17,7 @@ import {
17
17
  SessionManager,
18
18
  SettingsManager,
19
19
  } from "@mariozechner/pi-coding-agent";
20
- import type { AgentConfig, AgentType, ThinkingLevel } from "./types.js";
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
- // Build system prompt
146
- const agentConfig = options as any; // Will be properly typed later
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 (options.isolated) {
151
- systemPrompt = `You are a ${type} agent. Follow the task instructions precisely. Do not ask questions.`;
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
- systemPrompt = parentSystemPrompt + `\n\nYou are a ${type} agent. Follow the task instructions precisely.`;
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();