@pi-unipi/subagents 0.1.4 → 0.1.6
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/widget.d.ts +3 -3
- package/dist/widget.d.ts.map +1 -1
- package/dist/widget.js +11 -21
- package/dist/widget.js.map +1 -1
- package/package.json +3 -2
- package/src/index.ts +32 -0
- package/src/widget.ts +12 -19
package/dist/widget.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @pi-unipi/subagents — Live widget
|
|
3
3
|
*
|
|
4
4
|
* Shows running agents above the editor.
|
|
5
|
-
* Uses setWidget
|
|
5
|
+
* Uses setWidget with tui.requestRender() for updates.
|
|
6
6
|
*/
|
|
7
7
|
import type { AgentManager } from "./agent-manager.js";
|
|
8
8
|
import type { AgentActivity } from "./types.js";
|
|
@@ -12,14 +12,14 @@ export declare class AgentWidget {
|
|
|
12
12
|
private spinnerFrame;
|
|
13
13
|
private timer?;
|
|
14
14
|
private uiCtx?;
|
|
15
|
-
private widgetRegistered;
|
|
16
15
|
private tui?;
|
|
16
|
+
private widgetRegistered;
|
|
17
17
|
constructor(manager: AgentManager, activity: Map<string, AgentActivity>);
|
|
18
18
|
setUICtx(ctx: any): void;
|
|
19
19
|
ensureTimer(): void;
|
|
20
20
|
markFinished(_id: string): void;
|
|
21
21
|
update(): void;
|
|
22
|
-
private
|
|
22
|
+
private triggerRender;
|
|
23
23
|
private renderWidget;
|
|
24
24
|
dispose(): void;
|
|
25
25
|
}
|
package/dist/widget.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget.d.ts","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"widget.d.ts","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA8BhD,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,KAAK,CAAC,CAAiC;IAC/C,OAAO,CAAC,KAAK,CAAC,CAAM;IACpB,OAAO,CAAC,GAAG,CAAC,CAAM;IAClB,OAAO,CAAC,gBAAgB,CAAS;gBAErB,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC;IAKvE,QAAQ,CAAC,GAAG,EAAE,GAAG;IAQjB,WAAW;IAQX,YAAY,CAAC,GAAG,EAAE,MAAM;IAWxB,MAAM;IAIN,OAAO,CAAC,aAAa;IAwCrB,OAAO,CAAC,YAAY;IA0DpB,OAAO;CAWR"}
|
package/dist/widget.js
CHANGED
|
@@ -2,18 +2,10 @@
|
|
|
2
2
|
* @pi-unipi/subagents — Live widget
|
|
3
3
|
*
|
|
4
4
|
* Shows running agents above the editor.
|
|
5
|
-
* Uses setWidget
|
|
5
|
+
* Uses setWidget with tui.requestRender() for updates.
|
|
6
6
|
*/
|
|
7
7
|
/** Spinner frames (braille). */
|
|
8
8
|
const SPINNER = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
9
|
-
/** Format token count. */
|
|
10
|
-
function formatTokens(n) {
|
|
11
|
-
if (n >= 1_000_000)
|
|
12
|
-
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
13
|
-
if (n >= 1_000)
|
|
14
|
-
return `${(n / 1_000).toFixed(1)}k`;
|
|
15
|
-
return `${n}`;
|
|
16
|
-
}
|
|
17
9
|
/** Format duration. */
|
|
18
10
|
function formatMs(ms) {
|
|
19
11
|
if (ms >= 60_000)
|
|
@@ -45,8 +37,8 @@ export class AgentWidget {
|
|
|
45
37
|
spinnerFrame = 0;
|
|
46
38
|
timer;
|
|
47
39
|
uiCtx;
|
|
48
|
-
widgetRegistered = false;
|
|
49
40
|
tui;
|
|
41
|
+
widgetRegistered = false;
|
|
50
42
|
constructor(manager, activity) {
|
|
51
43
|
this.manager = manager;
|
|
52
44
|
this.activity = activity;
|
|
@@ -63,7 +55,7 @@ export class AgentWidget {
|
|
|
63
55
|
return;
|
|
64
56
|
this.timer = setInterval(() => {
|
|
65
57
|
this.spinnerFrame = (this.spinnerFrame + 1) % SPINNER.length;
|
|
66
|
-
this.
|
|
58
|
+
this.triggerRender();
|
|
67
59
|
}, 80);
|
|
68
60
|
}
|
|
69
61
|
markFinished(_id) {
|
|
@@ -73,13 +65,13 @@ export class AgentWidget {
|
|
|
73
65
|
this.timer = undefined;
|
|
74
66
|
}
|
|
75
67
|
// Clear widget after agent finishes
|
|
76
|
-
this.
|
|
68
|
+
this.triggerRender();
|
|
77
69
|
}
|
|
78
70
|
}
|
|
79
71
|
update() {
|
|
80
|
-
this.
|
|
72
|
+
this.triggerRender();
|
|
81
73
|
}
|
|
82
|
-
|
|
74
|
+
triggerRender() {
|
|
83
75
|
if (!this.uiCtx)
|
|
84
76
|
return;
|
|
85
77
|
const allAgents = this.manager.listAgents();
|
|
@@ -94,7 +86,7 @@ export class AgentWidget {
|
|
|
94
86
|
}
|
|
95
87
|
return;
|
|
96
88
|
}
|
|
97
|
-
// Register widget callback once
|
|
89
|
+
// Register widget callback once
|
|
98
90
|
if (!this.widgetRegistered) {
|
|
99
91
|
this.uiCtx.setWidget("unipi-agents", (tui, theme) => {
|
|
100
92
|
this.tui = tui;
|
|
@@ -108,10 +100,8 @@ export class AgentWidget {
|
|
|
108
100
|
}, { placement: "aboveEditor" });
|
|
109
101
|
this.widgetRegistered = true;
|
|
110
102
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
this.tui?.requestRender?.();
|
|
114
|
-
}
|
|
103
|
+
// Request re-render via TUI
|
|
104
|
+
this.tui?.requestRender?.();
|
|
115
105
|
}
|
|
116
106
|
renderWidget(tui, theme) {
|
|
117
107
|
const allAgents = this.manager.listAgents();
|
|
@@ -146,10 +136,10 @@ export class AgentWidget {
|
|
|
146
136
|
parts.push(tokens);
|
|
147
137
|
parts.push(duration);
|
|
148
138
|
const connector = i === running.length - 1 && queued.length === 0 ? "└─" : "├─";
|
|
149
|
-
const activityConnector = i === running.length - 1 && queued.length === 0 ? "
|
|
139
|
+
const activityConnector = i === running.length - 1 && queued.length === 0 ? " " : "│ ";
|
|
150
140
|
lines.push(truncate(theme.fg("dim", connector) +
|
|
151
141
|
` ${theme.fg("accent", frame)} ${theme.bold(a.type)} ${theme.fg("dim", a.description)} · ${theme.fg("dim", parts.join(" · "))}`));
|
|
152
|
-
lines.push(truncate(theme.fg("dim", activityConnector) + theme.fg("dim",
|
|
142
|
+
lines.push(truncate(theme.fg("dim", activityConnector) + theme.fg("dim", `⎿ ${activity}`)));
|
|
153
143
|
}
|
|
154
144
|
// Queued
|
|
155
145
|
if (queued.length > 0) {
|
package/dist/widget.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget.js","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,gCAAgC;AAChC,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEnE,
|
|
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.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Subagents for UniPi — parallel execution, file locking, workflow integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"@pi-unipi/core": "*",
|
|
20
|
-
"@pi-unipi/workflow": "*"
|
|
20
|
+
"@pi-unipi/workflow": "*",
|
|
21
|
+
"@pi-unipi/info-screen": "*"
|
|
21
22
|
},
|
|
22
23
|
"devDependencies": {
|
|
23
24
|
"typescript": "^5.8.3"
|
package/src/index.ts
CHANGED
|
@@ -8,6 +8,12 @@
|
|
|
8
8
|
import { defineTool, type ExtensionAPI, type ExtensionContext } from "@mariozechner/pi-coding-agent";
|
|
9
9
|
import { Text } from "@mariozechner/pi-tui";
|
|
10
10
|
import { Type } from "@sinclair/typebox";
|
|
11
|
+
|
|
12
|
+
// Get info registry from global
|
|
13
|
+
function getInfoRegistry() {
|
|
14
|
+
const g = globalThis as any;
|
|
15
|
+
return g.__unipi_info_registry;
|
|
16
|
+
}
|
|
11
17
|
import { AgentManager } from "./agent-manager.js";
|
|
12
18
|
import { initConfig, saveGlobalConfig } from "./config.js";
|
|
13
19
|
import { type AgentActivity, type AgentRecord, BUILTIN_TYPES } from "./types.js";
|
|
@@ -79,6 +85,32 @@ export default function (pi: ExtensionAPI) {
|
|
|
79
85
|
const workspaceConfig = `${ctx.cwd}/.unipi/config/subagents.json`;
|
|
80
86
|
const workspaceAgents = `${ctx.cwd}/.unipi/config/agents/`;
|
|
81
87
|
|
|
88
|
+
// Register info group
|
|
89
|
+
const registry = getInfoRegistry();
|
|
90
|
+
if (registry) {
|
|
91
|
+
registry.registerGroup({
|
|
92
|
+
id: "subagents",
|
|
93
|
+
name: "Subagents",
|
|
94
|
+
icon: "🤖",
|
|
95
|
+
priority: 80,
|
|
96
|
+
config: {
|
|
97
|
+
showByDefault: true,
|
|
98
|
+
stats: [
|
|
99
|
+
{ id: "maxConcurrent", label: "Max Concurrent", show: true },
|
|
100
|
+
{ id: "activeCount", label: "Active Agents", show: true },
|
|
101
|
+
{ id: "enabled", label: "Enabled", show: true },
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
dataProvider: async () => {
|
|
105
|
+
return {
|
|
106
|
+
maxConcurrent: { value: String(manager.getMaxConcurrent()) },
|
|
107
|
+
activeCount: { value: "N/A" },
|
|
108
|
+
enabled: { value: config.enabled ? "yes" : "no" },
|
|
109
|
+
};
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
82
114
|
ctx.ui.notify(
|
|
83
115
|
`UniPi Subagents config:\n` +
|
|
84
116
|
`• Global: ${globalConfig}\n` +
|
package/src/widget.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @pi-unipi/subagents — Live widget
|
|
3
3
|
*
|
|
4
4
|
* Shows running agents above the editor.
|
|
5
|
-
* Uses setWidget
|
|
5
|
+
* Uses setWidget with tui.requestRender() for updates.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import type { AgentManager } from "./agent-manager.js";
|
|
@@ -11,13 +11,6 @@ import type { AgentActivity } from "./types.js";
|
|
|
11
11
|
/** Spinner frames (braille). */
|
|
12
12
|
const SPINNER = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
13
13
|
|
|
14
|
-
/** Format token count. */
|
|
15
|
-
function formatTokens(n: number): string {
|
|
16
|
-
if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;
|
|
17
|
-
if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;
|
|
18
|
-
return `${n}`;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
14
|
/** Format duration. */
|
|
22
15
|
function formatMs(ms: number): string {
|
|
23
16
|
if (ms >= 60_000) return `${(ms / 60_000).toFixed(1)}m`;
|
|
@@ -49,8 +42,8 @@ export class AgentWidget {
|
|
|
49
42
|
private spinnerFrame = 0;
|
|
50
43
|
private timer?: ReturnType<typeof setInterval>;
|
|
51
44
|
private uiCtx?: any;
|
|
52
|
-
private widgetRegistered = false;
|
|
53
45
|
private tui?: any;
|
|
46
|
+
private widgetRegistered = false;
|
|
54
47
|
|
|
55
48
|
constructor(manager: AgentManager, activity: Map<string, AgentActivity>) {
|
|
56
49
|
this.manager = manager;
|
|
@@ -69,7 +62,7 @@ export class AgentWidget {
|
|
|
69
62
|
if (this.timer) return;
|
|
70
63
|
this.timer = setInterval(() => {
|
|
71
64
|
this.spinnerFrame = (this.spinnerFrame + 1) % SPINNER.length;
|
|
72
|
-
this.
|
|
65
|
+
this.triggerRender();
|
|
73
66
|
}, 80);
|
|
74
67
|
}
|
|
75
68
|
|
|
@@ -80,15 +73,15 @@ export class AgentWidget {
|
|
|
80
73
|
this.timer = undefined;
|
|
81
74
|
}
|
|
82
75
|
// Clear widget after agent finishes
|
|
83
|
-
this.
|
|
76
|
+
this.triggerRender();
|
|
84
77
|
}
|
|
85
78
|
}
|
|
86
79
|
|
|
87
80
|
update() {
|
|
88
|
-
this.
|
|
81
|
+
this.triggerRender();
|
|
89
82
|
}
|
|
90
83
|
|
|
91
|
-
private
|
|
84
|
+
private triggerRender() {
|
|
92
85
|
if (!this.uiCtx) return;
|
|
93
86
|
|
|
94
87
|
const allAgents = this.manager.listAgents();
|
|
@@ -105,7 +98,7 @@ export class AgentWidget {
|
|
|
105
98
|
return;
|
|
106
99
|
}
|
|
107
100
|
|
|
108
|
-
// Register widget callback once
|
|
101
|
+
// Register widget callback once
|
|
109
102
|
if (!this.widgetRegistered) {
|
|
110
103
|
this.uiCtx.setWidget(
|
|
111
104
|
"unipi-agents",
|
|
@@ -122,10 +115,10 @@ export class AgentWidget {
|
|
|
122
115
|
{ placement: "aboveEditor" },
|
|
123
116
|
);
|
|
124
117
|
this.widgetRegistered = true;
|
|
125
|
-
} else {
|
|
126
|
-
// Widget already registered — request re-render
|
|
127
|
-
this.tui?.requestRender?.();
|
|
128
118
|
}
|
|
119
|
+
|
|
120
|
+
// Request re-render via TUI
|
|
121
|
+
this.tui?.requestRender?.();
|
|
129
122
|
}
|
|
130
123
|
|
|
131
124
|
private renderWidget(tui: any, theme: any): string[] {
|
|
@@ -163,7 +156,7 @@ export class AgentWidget {
|
|
|
163
156
|
parts.push(duration);
|
|
164
157
|
|
|
165
158
|
const connector = i === running.length - 1 && queued.length === 0 ? "└─" : "├─";
|
|
166
|
-
const activityConnector = i === running.length - 1 && queued.length === 0 ? "
|
|
159
|
+
const activityConnector = i === running.length - 1 && queued.length === 0 ? " " : "│ ";
|
|
167
160
|
|
|
168
161
|
lines.push(
|
|
169
162
|
truncate(
|
|
@@ -172,7 +165,7 @@ export class AgentWidget {
|
|
|
172
165
|
),
|
|
173
166
|
);
|
|
174
167
|
lines.push(
|
|
175
|
-
truncate(theme.fg("dim", activityConnector) + theme.fg("dim",
|
|
168
|
+
truncate(theme.fg("dim", activityConnector) + theme.fg("dim", `⎿ ${activity}`)),
|
|
176
169
|
);
|
|
177
170
|
}
|
|
178
171
|
|