@gjczone/pi-swarm 0.1.6 → 0.3.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.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +60 -5
- package/dist/index.js.map +1 -1
- package/dist/shared/controller.d.ts +5 -2
- package/dist/shared/controller.d.ts.map +1 -1
- package/dist/shared/controller.js +109 -43
- package/dist/shared/controller.js.map +1 -1
- package/dist/shared/render.d.ts +4 -4
- package/dist/shared/render.d.ts.map +1 -1
- package/dist/shared/render.js +7 -9
- package/dist/shared/render.js.map +1 -1
- package/dist/shared/spawner.d.ts +1 -1
- package/dist/shared/spawner.d.ts.map +1 -1
- package/dist/shared/spawner.js +232 -132
- package/dist/shared/spawner.js.map +1 -1
- package/dist/shared/types.d.ts +44 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/state/persistence.d.ts +21 -14
- package/dist/state/persistence.d.ts.map +1 -1
- package/dist/state/persistence.js +79 -28
- package/dist/state/persistence.js.map +1 -1
- package/dist/state/recovery.d.ts +2 -2
- package/dist/state/recovery.d.ts.map +1 -1
- package/dist/state/recovery.js +37 -22
- package/dist/state/recovery.js.map +1 -1
- package/dist/swarm/command.d.ts.map +1 -1
- package/dist/swarm/command.js.map +1 -1
- package/dist/swarm/mode.d.ts.map +1 -1
- package/dist/swarm/mode.js +9 -4
- package/dist/swarm/mode.js.map +1 -1
- package/dist/swarm/tool.d.ts.map +1 -1
- package/dist/swarm/tool.js +77 -5
- package/dist/swarm/tool.js.map +1 -1
- package/dist/team/command.d.ts +3 -2
- package/dist/team/command.d.ts.map +1 -1
- package/dist/team/command.js +24 -7
- package/dist/team/command.js.map +1 -1
- package/dist/team/mailbox.d.ts +3 -3
- package/dist/team/mailbox.d.ts.map +1 -1
- package/dist/team/mailbox.js +38 -17
- package/dist/team/mailbox.js.map +1 -1
- package/dist/team/supervisor.d.ts +31 -5
- package/dist/team/supervisor.d.ts.map +1 -1
- package/dist/team/supervisor.js +187 -16
- package/dist/team/supervisor.js.map +1 -1
- package/dist/team/task-graph.d.ts.map +1 -1
- package/dist/team/task-graph.js +4 -7
- package/dist/team/task-graph.js.map +1 -1
- package/dist/team/tool.d.ts +3 -3
- package/dist/team/tool.d.ts.map +1 -1
- package/dist/team/tool.js +81 -24
- package/dist/team/tool.js.map +1 -1
- package/dist/tui/permission-prompt.d.ts.map +1 -1
- package/dist/tui/permission-prompt.js.map +1 -1
- package/dist/tui/progress.d.ts +10 -0
- package/dist/tui/progress.d.ts.map +1 -1
- package/dist/tui/progress.js +50 -1
- package/dist/tui/progress.js.map +1 -1
- package/dist/tui/team-dashboard.d.ts +54 -0
- package/dist/tui/team-dashboard.d.ts.map +1 -0
- package/dist/tui/team-dashboard.js +240 -0
- package/dist/tui/team-dashboard.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/state/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/state/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAWH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAWzD;AAiBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUpD;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAM3E;AAED,yCAAyC;AACzC,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,MAAM,CAOR;AAMD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IAChC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI,CAO7E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,WAAW,GAAG,IAAI,CAWpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI,CAO7E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAMtE;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,IAAI,CAIN;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWhC;AAMD;;GAEG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,IAAI,CAMN;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAsB3B;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWhC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAgB1D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAKrE"}
|
|
@@ -17,6 +17,26 @@
|
|
|
17
17
|
import * as fs from "node:fs";
|
|
18
18
|
import * as path from "node:path";
|
|
19
19
|
// ---------------------------------------------------------------------------
|
|
20
|
+
// Security: ID validation and path containment
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
const SAFE_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;
|
|
23
|
+
export function validateId(id, kind) {
|
|
24
|
+
if (typeof id !== "string" || id.length === 0 || id.length > 128) {
|
|
25
|
+
throw new Error(`Invalid ${kind}: must be a non-empty string up to 128 characters`);
|
|
26
|
+
}
|
|
27
|
+
if (!SAFE_ID_PATTERN.test(id)) {
|
|
28
|
+
throw new Error(`Invalid ${kind}: "${id}" contains unsafe characters (only a-z, A-Z, 0-9, _, - allowed)`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function ensureWithinRoot(resolvedPath, root) {
|
|
32
|
+
const normalizedRoot = path.resolve(root) + path.sep;
|
|
33
|
+
const normalizedPath = path.resolve(resolvedPath);
|
|
34
|
+
if (!normalizedPath.startsWith(normalizedRoot) &&
|
|
35
|
+
normalizedPath !== path.resolve(root)) {
|
|
36
|
+
throw new Error(`Path traversal detected: ${resolvedPath} escapes ${root}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
20
40
|
// Path resolution
|
|
21
41
|
// ---------------------------------------------------------------------------
|
|
22
42
|
/**
|
|
@@ -25,7 +45,7 @@ import * as path from "node:path";
|
|
|
25
45
|
* Always uses `.pi/swarm/` under the project root. Creates `.pi/`
|
|
26
46
|
* if it does not already exist.
|
|
27
47
|
*/
|
|
28
|
-
export function
|
|
48
|
+
export function resolveSwarmRoot(cwd) {
|
|
29
49
|
const piDir = path.join(cwd, ".pi");
|
|
30
50
|
if (!fs.existsSync(piDir)) {
|
|
31
51
|
fs.mkdirSync(piDir, { recursive: true });
|
|
@@ -37,18 +57,27 @@ export function resolveCrewRoot(cwd) {
|
|
|
37
57
|
return swarmDir;
|
|
38
58
|
}
|
|
39
59
|
/** Resolve the state directory for a specific run. */
|
|
40
|
-
export function resolveRunStateDir(
|
|
41
|
-
|
|
60
|
+
export function resolveRunStateDir(swarmRoot, runId) {
|
|
61
|
+
validateId(runId, "runId");
|
|
62
|
+
const runsDir = path.join(swarmRoot, "state", "runs");
|
|
63
|
+
const dir = path.join(runsDir, runId);
|
|
64
|
+
ensureWithinRoot(dir, runsDir);
|
|
65
|
+
return dir;
|
|
42
66
|
}
|
|
43
67
|
/** Resolve per-agent state directory. */
|
|
44
|
-
export function resolveAgentStateDir(
|
|
45
|
-
|
|
68
|
+
export function resolveAgentStateDir(swarmRoot, runId, agentId) {
|
|
69
|
+
validateId(agentId, "agentId");
|
|
70
|
+
const runDir = resolveRunStateDir(swarmRoot, runId);
|
|
71
|
+
const agentsDir = path.join(runDir, "agents");
|
|
72
|
+
const dir = path.join(agentsDir, agentId);
|
|
73
|
+
ensureWithinRoot(dir, agentsDir);
|
|
74
|
+
return dir;
|
|
46
75
|
}
|
|
47
76
|
/**
|
|
48
77
|
* Create a new run manifest and write it to disk.
|
|
49
78
|
*/
|
|
50
|
-
export function createManifest(
|
|
51
|
-
const dir = resolveRunStateDir(
|
|
79
|
+
export function createManifest(swarmRoot, manifest) {
|
|
80
|
+
const dir = resolveRunStateDir(swarmRoot, manifest.runId);
|
|
52
81
|
fs.mkdirSync(dir, { recursive: true });
|
|
53
82
|
writeAtomic(path.join(dir, "manifest.json"), JSON.stringify(manifest, null, 2));
|
|
54
83
|
}
|
|
@@ -56,8 +85,8 @@ export function createManifest(crewRoot, manifest) {
|
|
|
56
85
|
* Read a run manifest from disk.
|
|
57
86
|
* Returns null if the manifest does not exist.
|
|
58
87
|
*/
|
|
59
|
-
export function readManifest(
|
|
60
|
-
const filePath = path.join(resolveRunStateDir(
|
|
88
|
+
export function readManifest(swarmRoot, runId) {
|
|
89
|
+
const filePath = path.join(resolveRunStateDir(swarmRoot, runId), "manifest.json");
|
|
61
90
|
try {
|
|
62
91
|
const raw = fs.readFileSync(filePath, "utf-8");
|
|
63
92
|
return JSON.parse(raw);
|
|
@@ -69,19 +98,31 @@ export function readManifest(crewRoot, runId) {
|
|
|
69
98
|
/**
|
|
70
99
|
* Update a run manifest (overwrites the file atomically).
|
|
71
100
|
*/
|
|
72
|
-
export function updateManifest(
|
|
73
|
-
const dir = resolveRunStateDir(
|
|
101
|
+
export function updateManifest(swarmRoot, manifest) {
|
|
102
|
+
const dir = resolveRunStateDir(swarmRoot, manifest.runId);
|
|
74
103
|
fs.mkdirSync(dir, { recursive: true });
|
|
75
104
|
writeAtomic(path.join(dir, "manifest.json"), JSON.stringify(manifest, null, 2));
|
|
76
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Update the heartbeat timestamp for a running manifest.
|
|
108
|
+
*/
|
|
109
|
+
export function updateHeartbeat(swarmRoot, runId) {
|
|
110
|
+
const manifest = readManifest(swarmRoot, runId);
|
|
111
|
+
if (!manifest)
|
|
112
|
+
return;
|
|
113
|
+
if (manifest.status !== "running")
|
|
114
|
+
return;
|
|
115
|
+
manifest.lastHeartbeatAt = Date.now();
|
|
116
|
+
updateManifest(swarmRoot, manifest);
|
|
117
|
+
}
|
|
77
118
|
// ---------------------------------------------------------------------------
|
|
78
119
|
// Task state
|
|
79
120
|
// ---------------------------------------------------------------------------
|
|
80
121
|
/**
|
|
81
122
|
* Persist task state (task graph) to disk.
|
|
82
123
|
*/
|
|
83
|
-
export function saveTaskState(
|
|
84
|
-
const dir = resolveRunStateDir(
|
|
124
|
+
export function saveTaskState(swarmRoot, runId, data) {
|
|
125
|
+
const dir = resolveRunStateDir(swarmRoot, runId);
|
|
85
126
|
fs.mkdirSync(dir, { recursive: true });
|
|
86
127
|
writeAtomic(path.join(dir, "tasks.json"), JSON.stringify(data, null, 2));
|
|
87
128
|
}
|
|
@@ -89,8 +130,8 @@ export function saveTaskState(crewRoot, runId, data) {
|
|
|
89
130
|
* Load task state from disk.
|
|
90
131
|
* Returns null if the file does not exist.
|
|
91
132
|
*/
|
|
92
|
-
export function loadTaskState(
|
|
93
|
-
const filePath = path.join(resolveRunStateDir(
|
|
133
|
+
export function loadTaskState(swarmRoot, runId) {
|
|
134
|
+
const filePath = path.join(resolveRunStateDir(swarmRoot, runId), "tasks.json");
|
|
94
135
|
try {
|
|
95
136
|
const raw = fs.readFileSync(filePath, "utf-8");
|
|
96
137
|
return JSON.parse(raw);
|
|
@@ -105,8 +146,8 @@ export function loadTaskState(crewRoot, runId) {
|
|
|
105
146
|
/**
|
|
106
147
|
* Append an event to the run's event log.
|
|
107
148
|
*/
|
|
108
|
-
export function appendEvent(
|
|
109
|
-
const dir = resolveRunStateDir(
|
|
149
|
+
export function appendEvent(swarmRoot, runId, event) {
|
|
150
|
+
const dir = resolveRunStateDir(swarmRoot, runId);
|
|
110
151
|
fs.mkdirSync(dir, { recursive: true });
|
|
111
152
|
const filePath = path.join(dir, "events.jsonl");
|
|
112
153
|
const line = JSON.stringify(event) + "\n";
|
|
@@ -115,8 +156,8 @@ export function appendEvent(crewRoot, runId, event) {
|
|
|
115
156
|
/**
|
|
116
157
|
* Read all events from the run's event log.
|
|
117
158
|
*/
|
|
118
|
-
export function readEvents(
|
|
119
|
-
const filePath = path.join(resolveRunStateDir(
|
|
159
|
+
export function readEvents(swarmRoot, runId) {
|
|
160
|
+
const filePath = path.join(resolveRunStateDir(swarmRoot, runId), "events.jsonl");
|
|
120
161
|
try {
|
|
121
162
|
const raw = fs.readFileSync(filePath, "utf-8");
|
|
122
163
|
if (!raw.trim())
|
|
@@ -144,16 +185,16 @@ export function readEvents(crewRoot, runId) {
|
|
|
144
185
|
/**
|
|
145
186
|
* Save per-agent status.
|
|
146
187
|
*/
|
|
147
|
-
export function saveAgentStatus(
|
|
148
|
-
const dir = resolveAgentStateDir(
|
|
188
|
+
export function saveAgentStatus(swarmRoot, runId, agentId, status) {
|
|
189
|
+
const dir = resolveAgentStateDir(swarmRoot, runId, agentId);
|
|
149
190
|
fs.mkdirSync(dir, { recursive: true });
|
|
150
191
|
writeAtomic(path.join(dir, "status.json"), JSON.stringify(status, null, 2));
|
|
151
192
|
}
|
|
152
193
|
/**
|
|
153
194
|
* Load per-agent status.
|
|
154
195
|
*/
|
|
155
|
-
export function loadAgentStatus(
|
|
156
|
-
const filePath = path.join(resolveAgentStateDir(
|
|
196
|
+
export function loadAgentStatus(swarmRoot, runId, agentId) {
|
|
197
|
+
const filePath = path.join(resolveAgentStateDir(swarmRoot, runId, agentId), "status.json");
|
|
157
198
|
try {
|
|
158
199
|
const raw = fs.readFileSync(filePath, "utf-8");
|
|
159
200
|
return JSON.parse(raw);
|
|
@@ -164,21 +205,31 @@ export function loadAgentStatus(crewRoot, runId, agentId) {
|
|
|
164
205
|
}
|
|
165
206
|
/**
|
|
166
207
|
* List all active run IDs in the state directory.
|
|
208
|
+
* Only returns IDs that match the safe ID pattern.
|
|
167
209
|
*/
|
|
168
|
-
export function listActiveRuns(
|
|
169
|
-
const runsDir = path.join(
|
|
210
|
+
export function listActiveRuns(swarmRoot) {
|
|
211
|
+
const runsDir = path.join(swarmRoot, "state", "runs");
|
|
170
212
|
if (!fs.existsSync(runsDir))
|
|
171
213
|
return [];
|
|
172
214
|
return fs
|
|
173
215
|
.readdirSync(runsDir, { withFileTypes: true })
|
|
174
216
|
.filter((d) => d.isDirectory())
|
|
175
|
-
.map((d) => d.name)
|
|
217
|
+
.map((d) => d.name)
|
|
218
|
+
.filter((name) => {
|
|
219
|
+
try {
|
|
220
|
+
validateId(name, "runId");
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
});
|
|
176
227
|
}
|
|
177
228
|
/**
|
|
178
229
|
* Delete the entire run state directory.
|
|
179
230
|
*/
|
|
180
|
-
export function deleteRunState(
|
|
181
|
-
const dir = resolveRunStateDir(
|
|
231
|
+
export function deleteRunState(swarmRoot, runId) {
|
|
232
|
+
const dir = resolveRunStateDir(swarmRoot, runId);
|
|
182
233
|
if (fs.existsSync(dir)) {
|
|
183
234
|
fs.rmSync(dir, { recursive: true, force: true });
|
|
184
235
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/state/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/state/persistence.ts"],"names":[],"mappings":"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"}
|
package/dist/state/recovery.d.ts
CHANGED
|
@@ -26,10 +26,10 @@ export declare function recoverRuns(cwd: string): RecoveryResult;
|
|
|
26
26
|
* Check whether a run has unfinished tasks.
|
|
27
27
|
* Used to decide whether to offer resume or start fresh.
|
|
28
28
|
*/
|
|
29
|
-
export declare function hasUnfinishedTasks(
|
|
29
|
+
export declare function hasUnfinishedTasks(swarmRoot: string, runId: string): boolean;
|
|
30
30
|
/**
|
|
31
31
|
* Get resumable agent IDs from a run.
|
|
32
32
|
* Returns a map of agentId → last known status.
|
|
33
33
|
*/
|
|
34
|
-
export declare function getResumableAgents(
|
|
34
|
+
export declare function getResumableAgents(swarmRoot: string, runId: string): Map<string, string>;
|
|
35
35
|
//# sourceMappingURL=recovery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/state/recovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/state/recovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAOL,KAAK,WAAW,EAEjB,MAAM,kBAAkB,CAAC;AAgB1B,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;IAClC,sDAAsD;IACtD,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;IAClC,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAqFvD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CA0B5E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAyBrB"}
|
package/dist/state/recovery.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import * as fs from "node:fs";
|
|
9
9
|
import * as path from "node:path";
|
|
10
|
-
import {
|
|
10
|
+
import { resolveSwarmRoot, listActiveRuns, readManifest, updateManifest, deleteRunState, loadAgentStatus, appendEvent, } from "./persistence.js";
|
|
11
11
|
// ---------------------------------------------------------------------------
|
|
12
12
|
// Constants
|
|
13
13
|
// ---------------------------------------------------------------------------
|
|
@@ -23,22 +23,22 @@ const STALE_RUN_THRESHOLD_MS = 30 * 60 * 1000; // 30 minutes
|
|
|
23
23
|
* - Returns lists of resumable and abandoned runs.
|
|
24
24
|
*/
|
|
25
25
|
export function recoverRuns(cwd) {
|
|
26
|
-
const
|
|
27
|
-
const runsDir = path.join(
|
|
26
|
+
const swarmRoot = resolveSwarmRoot(cwd);
|
|
27
|
+
const runsDir = path.join(swarmRoot, "state", "runs");
|
|
28
28
|
if (!fs.existsSync(runsDir)) {
|
|
29
29
|
return { resumable: [], abandoned: [], cleanedUp: [] };
|
|
30
30
|
}
|
|
31
|
-
const runIds = listActiveRuns(
|
|
31
|
+
const runIds = listActiveRuns(swarmRoot);
|
|
32
32
|
const now = Date.now();
|
|
33
33
|
const resumable = [];
|
|
34
34
|
const abandoned = [];
|
|
35
35
|
const cleanedUp = [];
|
|
36
36
|
for (const runId of runIds) {
|
|
37
|
-
const manifest = readManifest(
|
|
37
|
+
const manifest = readManifest(swarmRoot, runId);
|
|
38
38
|
if (!manifest) {
|
|
39
39
|
// Orphaned directory — clean up
|
|
40
40
|
try {
|
|
41
|
-
deleteRunState(
|
|
41
|
+
deleteRunState(swarmRoot, runId);
|
|
42
42
|
cleanedUp.push(runId);
|
|
43
43
|
}
|
|
44
44
|
catch {
|
|
@@ -48,8 +48,9 @@ export function recoverRuns(cwd) {
|
|
|
48
48
|
}
|
|
49
49
|
switch (manifest.status) {
|
|
50
50
|
case "running": {
|
|
51
|
-
// Check for staleness
|
|
52
|
-
const
|
|
51
|
+
// Check for staleness using last heartbeat if available
|
|
52
|
+
const lastActivity = manifest.lastHeartbeatAt ?? manifest.startedAt;
|
|
53
|
+
const age = now - lastActivity;
|
|
53
54
|
if (age > STALE_RUN_THRESHOLD_MS) {
|
|
54
55
|
// Mark as abandoned
|
|
55
56
|
const updated = {
|
|
@@ -57,8 +58,8 @@ export function recoverRuns(cwd) {
|
|
|
57
58
|
status: "abandoned",
|
|
58
59
|
completedAt: now,
|
|
59
60
|
};
|
|
60
|
-
updateManifest(
|
|
61
|
-
appendEvent(
|
|
61
|
+
updateManifest(swarmRoot, updated);
|
|
62
|
+
appendEvent(swarmRoot, runId, {
|
|
62
63
|
type: "run.abandoned",
|
|
63
64
|
reason: "stale",
|
|
64
65
|
timestamp: new Date().toISOString(),
|
|
@@ -78,7 +79,7 @@ export function recoverRuns(cwd) {
|
|
|
78
79
|
const age = now - completedAt;
|
|
79
80
|
if (age > COMPLETED_RUN_RETENTION_MS) {
|
|
80
81
|
try {
|
|
81
|
-
deleteRunState(
|
|
82
|
+
deleteRunState(swarmRoot, runId);
|
|
82
83
|
cleanedUp.push(runId);
|
|
83
84
|
}
|
|
84
85
|
catch {
|
|
@@ -93,7 +94,7 @@ export function recoverRuns(cwd) {
|
|
|
93
94
|
const abandonedAt = manifest.completedAt ?? manifest.startedAt;
|
|
94
95
|
if (now - abandonedAt > COMPLETED_RUN_RETENTION_MS) {
|
|
95
96
|
try {
|
|
96
|
-
deleteRunState(
|
|
97
|
+
deleteRunState(swarmRoot, runId);
|
|
97
98
|
cleanedUp.push(runId);
|
|
98
99
|
}
|
|
99
100
|
catch {
|
|
@@ -110,31 +111,45 @@ export function recoverRuns(cwd) {
|
|
|
110
111
|
* Check whether a run has unfinished tasks.
|
|
111
112
|
* Used to decide whether to offer resume or start fresh.
|
|
112
113
|
*/
|
|
113
|
-
export function hasUnfinishedTasks(
|
|
114
|
-
const manifest = readManifest(
|
|
114
|
+
export function hasUnfinishedTasks(swarmRoot, runId) {
|
|
115
|
+
const manifest = readManifest(swarmRoot, runId);
|
|
115
116
|
if (!manifest)
|
|
116
117
|
return false;
|
|
117
118
|
if (manifest.status === "completed")
|
|
118
119
|
return false;
|
|
120
|
+
if (manifest.status !== "running")
|
|
121
|
+
return false;
|
|
119
122
|
// Check if any agent status files indicate unfinished work
|
|
120
|
-
const agentsDir = path.join(
|
|
123
|
+
const agentsDir = path.join(swarmRoot, "state", "runs", runId, "agents");
|
|
121
124
|
if (!fs.existsSync(agentsDir))
|
|
122
|
-
return
|
|
123
|
-
//
|
|
124
|
-
|
|
125
|
-
|
|
125
|
+
return true;
|
|
126
|
+
// Check each agent directory for non-terminal status
|
|
127
|
+
const agentDirs = fs
|
|
128
|
+
.readdirSync(agentsDir, { withFileTypes: true })
|
|
129
|
+
.filter((d) => d.isDirectory())
|
|
130
|
+
.map((d) => d.name);
|
|
131
|
+
for (const agentId of agentDirs) {
|
|
132
|
+
const status = loadAgentStatus(swarmRoot, runId, agentId);
|
|
133
|
+
if (!status)
|
|
134
|
+
return true;
|
|
135
|
+
const state = String(status.status ?? status.state ?? "");
|
|
136
|
+
if (state === "running" || state === "started" || state === "") {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return false;
|
|
126
141
|
}
|
|
127
142
|
/**
|
|
128
143
|
* Get resumable agent IDs from a run.
|
|
129
144
|
* Returns a map of agentId → last known status.
|
|
130
145
|
*/
|
|
131
|
-
export function getResumableAgents(
|
|
132
|
-
const manifest = readManifest(
|
|
146
|
+
export function getResumableAgents(swarmRoot, runId) {
|
|
147
|
+
const manifest = readManifest(swarmRoot, runId);
|
|
133
148
|
const result = new Map();
|
|
134
149
|
if (!manifest)
|
|
135
150
|
return result;
|
|
136
151
|
for (const agentId of manifest.agentIds) {
|
|
137
|
-
const statusDir = path.join(
|
|
152
|
+
const statusDir = path.join(swarmRoot, "state", "runs", runId, "agents", agentId);
|
|
138
153
|
if (fs.existsSync(statusDir)) {
|
|
139
154
|
// Agent has state on disk — it can be resumed
|
|
140
155
|
result.set(agentId, "resumable");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/state/recovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/state/recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/swarm/command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/swarm/command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAMlD,MAAM,WAAW,gBAAgB;IAC/B,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAC1B,gCAAgC;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,4BAA4B;IAC5B,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjE,4BAA4B;IAC5B,uCAAuC;IACvC,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,yCAAyC;IACzC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,yCAAyC;IACzC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,sCAAsC;IACtC,QAAQ,IAAI,OAAO,CAAC;IACpB,uCAAuC;IACvC,iBAAiB,IAAI,MAAM,CAAC;IAC5B,+BAA+B;IAC/B,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,gBAAgB,GACrB,IAAI,CA8BN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/swarm/command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/swarm/command.ts"],"names":[],"mappings":"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"}
|
package/dist/swarm/mode.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mode.d.ts","sourceRoot":"","sources":["../../src/swarm/mode.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oCAAoC;AACpC,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE;QAChB;;;WAGG;QACH,oBAAoB,CAClB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,GACxC,IAAI,CAAC;QACR;;;WAGG;QACH,iBAAiB,
|
|
1
|
+
{"version":3,"file":"mode.d.ts","sourceRoot":"","sources":["../../src/swarm/mode.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oCAAoC;AACpC,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE;QAChB;;;WAGG;QACH,oBAAoB,CAClB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,GACxC,IAAI,CAAC;QACR;;;WAGG;QACH,iBAAiB,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC;KACrE,CAAC;IACF,kCAAkC;IAClC,iBAAiB,IAAI,IAAI,CAAC;IAC1B,6CAA6C;IAC7C,OAAO,EAAE;QACP,SAAS,CAAC,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;KAC5D,CAAC;CACH;AA0BD,qBAAa,SAAS;IAGR,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,MAAM,CAAiC;gBAElB,KAAK,EAAE,cAAc;IAElD,wEAAwE;IACxE,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAmBtC,+EAA+E;IAC/E,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAI7C,4CAA4C;IAC5C,IAAI,IAAI,IAAI;IA2BZ,8CAA8C;IAC9C,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,uEAAuE;IACvE,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,kDAAkD;IAClD,IAAI,cAAc,IAAI,gBAAgB,GAAG,IAAI,CAE5C;CACF"}
|
package/dist/swarm/mode.js
CHANGED
|
@@ -42,7 +42,10 @@ export class SwarmMode {
|
|
|
42
42
|
});
|
|
43
43
|
this.active = trigger;
|
|
44
44
|
if (trigger !== "tool") {
|
|
45
|
-
this.agent.context.appendSystemReminder(SWARM_MODE_ENTER_REMINDER, {
|
|
45
|
+
this.agent.context.appendSystemReminder(SWARM_MODE_ENTER_REMINDER, {
|
|
46
|
+
kind: "injection",
|
|
47
|
+
variant: "swarm_mode",
|
|
48
|
+
});
|
|
46
49
|
}
|
|
47
50
|
this.agent.emitStatusUpdated();
|
|
48
51
|
}
|
|
@@ -63,13 +66,15 @@ export class SwarmMode {
|
|
|
63
66
|
// Try to pop the enter reminder first
|
|
64
67
|
if (this.agent.context.popMatchedMessage((origin) => {
|
|
65
68
|
const o = origin;
|
|
66
|
-
return
|
|
67
|
-
o?.variant === "swarm_mode");
|
|
69
|
+
return o?.kind === "injection" && o?.variant === "swarm_mode";
|
|
68
70
|
})) {
|
|
69
71
|
return;
|
|
70
72
|
}
|
|
71
73
|
// If we couldn't pop it, inject an exit reminder
|
|
72
|
-
this.agent.context.appendSystemReminder(SWARM_MODE_EXIT_REMINDER, {
|
|
74
|
+
this.agent.context.appendSystemReminder(SWARM_MODE_EXIT_REMINDER, {
|
|
75
|
+
kind: "injection",
|
|
76
|
+
variant: "swarm_mode_exit",
|
|
77
|
+
});
|
|
73
78
|
}
|
|
74
79
|
/** Whether swarm mode is currently active. */
|
|
75
80
|
get isActive() {
|
package/dist/swarm/mode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mode.js","sourceRoot":"","sources":["../../src/swarm/mode.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"mode.js","sourceRoot":"","sources":["../../src/swarm/mode.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiCH,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAE9E,MAAM,yBAAyB,GAAG;;;;;;;;CAQjC,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,wBAAwB,GAAG;;;;CAIhC,CAAC,IAAI,EAAE,CAAC;AAET,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,OAAO,SAAS;IAGS;IAFrB,MAAM,GAA4B,IAAI,CAAC;IAE/C,YAA6B,KAAqB;QAArB,UAAK,GAAL,KAAK,CAAgB;IAAG,CAAC;IAEtD,wEAAwE;IACxE,KAAK,CAAC,OAAyB;QAC7B,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO;QAEjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;YAC3B,IAAI,EAAE,kBAAkB;YACxB,OAAO;SACR,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QAEtB,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,yBAAyB,EAAE;gBACjE,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACjC,CAAC;IAED,+EAA+E;IAC/E,YAAY,CAAC,OAAyB;QACpC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,4CAA4C;IAC5C,IAAI;QACF,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO;QAEjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE/B,IAAI,OAAO,KAAK,MAAM;YAAE,OAAO;QAE/B,sCAAsC;QACtC,IACE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,MAAe,EAAE,EAAE;YACvD,MAAM,CAAC,GAAG,MAAoD,CAAC;YAC/D,OAAO,CAAC,EAAE,IAAI,KAAK,WAAW,IAAI,CAAC,EAAE,OAAO,KAAK,YAAY,CAAC;QAChE,CAAC,CAAC,EACF,CAAC;YACD,OAAO;QACT,CAAC;QAED,iDAAiD;QACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,wBAAwB,EAAE;YAChE,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,iBAAiB;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,8CAA8C;IAC9C,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC;IAC9B,CAAC;IAED,uEAAuE;IACvE,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC;IAC1D,CAAC;IAED,kDAAkD;IAClD,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
|
package/dist/swarm/tool.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/swarm/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/swarm/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,iCAAiC,CAAC;AAiDzC,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAwJ7D"}
|
package/dist/swarm/tool.js
CHANGED
|
@@ -10,6 +10,9 @@ import { Type } from "typebox";
|
|
|
10
10
|
import { SubagentBatchController, resolveSwarmMaxConcurrency, } from "../shared/controller.js";
|
|
11
11
|
import { renderSwarmResults, toSwarmRunResults } from "../shared/render.js";
|
|
12
12
|
import { spawnSubagent, resumeSubagent, retrySubagent, } from "../shared/spawner.js";
|
|
13
|
+
import { AgentSwarmProgressComponent, snapshotToProgressState, } from "../tui/progress.js";
|
|
14
|
+
/** Widget key used to render the live swarm progress panel. */
|
|
15
|
+
const PROGRESS_WIDGET_KEY = "pi-swarm-progress";
|
|
13
16
|
// ---------------------------------------------------------------------------
|
|
14
17
|
// Constants
|
|
15
18
|
// ---------------------------------------------------------------------------
|
|
@@ -52,11 +55,12 @@ export function registerAgentSwarmTool(pi) {
|
|
|
52
55
|
description: "Map of existing subagent agent_id to the prompt used to resume that subagent. Resumed subagents launch before new item-based subagents.",
|
|
53
56
|
})),
|
|
54
57
|
}, { additionalProperties: false }),
|
|
55
|
-
execute: async (toolCallId, params, signal, _onUpdate,
|
|
56
|
-
const { description, subagent_type, prompt_template, items, resume_agent_ids } = params;
|
|
58
|
+
execute: async (toolCallId, params, signal, _onUpdate, ctxRaw) => {
|
|
59
|
+
const { description, subagent_type, prompt_template, items, resume_agent_ids, } = params;
|
|
60
|
+
const ctx = ctxRaw;
|
|
61
|
+
const progress = createProgressWidget(ctx);
|
|
57
62
|
try {
|
|
58
|
-
const profileName = normalizeOptionalString(subagent_type) ??
|
|
59
|
-
DEFAULT_SUBAGENT_TYPE;
|
|
63
|
+
const profileName = normalizeOptionalString(subagent_type) ?? DEFAULT_SUBAGENT_TYPE;
|
|
60
64
|
// Build specs
|
|
61
65
|
const specs = createAgentSwarmSpecs({
|
|
62
66
|
items,
|
|
@@ -92,8 +96,19 @@ export function registerAgentSwarmTool(pi) {
|
|
|
92
96
|
});
|
|
93
97
|
// Run with controller
|
|
94
98
|
const maxConcurrency = resolveSwarmMaxConcurrency(process.cwd());
|
|
95
|
-
const controller = new SubagentBatchController({
|
|
99
|
+
const controller = new SubagentBatchController({
|
|
100
|
+
spawn: spawnSubagent,
|
|
101
|
+
resume: resumeSubagent,
|
|
102
|
+
retry: retrySubagent,
|
|
103
|
+
}, tasks, {
|
|
104
|
+
maxConcurrency,
|
|
105
|
+
onProgress: (snapshot) => {
|
|
106
|
+
progress?.component.update(snapshotToProgressState(snapshot, description));
|
|
107
|
+
},
|
|
108
|
+
});
|
|
96
109
|
const results = await controller.run();
|
|
110
|
+
// Trigger completion animation before tearing down
|
|
111
|
+
progress?.component.complete();
|
|
97
112
|
// Render output
|
|
98
113
|
const swarmResults = toSwarmRunResults(results);
|
|
99
114
|
const output = renderSwarmResults(swarmResults);
|
|
@@ -110,6 +125,11 @@ export function registerAgentSwarmTool(pi) {
|
|
|
110
125
|
details: undefined,
|
|
111
126
|
};
|
|
112
127
|
}
|
|
128
|
+
finally {
|
|
129
|
+
// Always tear down the progress widget so it does not linger
|
|
130
|
+
progress?.dispose();
|
|
131
|
+
clearProgressWidget(ctx);
|
|
132
|
+
}
|
|
113
133
|
},
|
|
114
134
|
});
|
|
115
135
|
}
|
|
@@ -187,4 +207,56 @@ function normalizeOptionalString(value) {
|
|
|
187
207
|
const trimmed = value.trim();
|
|
188
208
|
return trimmed.length > 0 ? trimmed : undefined;
|
|
189
209
|
}
|
|
210
|
+
/**
|
|
211
|
+
* Install a live progress widget above the editor when running in TUI mode.
|
|
212
|
+
*
|
|
213
|
+
* Returns undefined in non-TUI modes (print/rpc/json) where setWidget is a
|
|
214
|
+
* no-op, so the controller's onProgress callback stays a cheap no-op too.
|
|
215
|
+
*
|
|
216
|
+
* 业务说明:在 TUI 模式下注册一个实时进度面板,展示每个子 Agent 的
|
|
217
|
+
* 运行状态(队列/运行中/完成/失败/限流挂起)。非 TUI 模式下返回
|
|
218
|
+
* undefined,避免无意义的 UI 调用。
|
|
219
|
+
*/
|
|
220
|
+
function createProgressWidget(ctx) {
|
|
221
|
+
// 仅在 TUI 模式下展示进度面板;其他模式(print/rpc/json)无可用 UI
|
|
222
|
+
if (ctx.mode !== "tui")
|
|
223
|
+
return undefined;
|
|
224
|
+
const setWidget = ctx.ui?.setWidget;
|
|
225
|
+
if (typeof setWidget !== "function")
|
|
226
|
+
return undefined;
|
|
227
|
+
const component = new AgentSwarmProgressComponent();
|
|
228
|
+
try {
|
|
229
|
+
// 工厂函数返回预先创建的组件实例;TUI 框架会在刷新周期调用 render
|
|
230
|
+
setWidget(PROGRESS_WIDGET_KEY, () => component, {
|
|
231
|
+
placement: "aboveEditor",
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
// setWidget 失败不应阻断 swarm 执行
|
|
236
|
+
component.dispose();
|
|
237
|
+
return undefined;
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
component,
|
|
241
|
+
dispose() {
|
|
242
|
+
component.dispose();
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Remove the progress widget after the swarm run completes or fails.
|
|
248
|
+
*/
|
|
249
|
+
function clearProgressWidget(ctx) {
|
|
250
|
+
if (ctx.mode !== "tui")
|
|
251
|
+
return;
|
|
252
|
+
const setWidget = ctx.ui?.setWidget;
|
|
253
|
+
if (typeof setWidget !== "function")
|
|
254
|
+
return;
|
|
255
|
+
try {
|
|
256
|
+
setWidget(PROGRESS_WIDGET_KEY, undefined, { placement: "aboveEditor" });
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
// Best effort — widget teardown failure is non-fatal
|
|
260
|
+
}
|
|
261
|
+
}
|
|
190
262
|
//# sourceMappingURL=tool.js.map
|