@gjczone/pi-swarm 0.2.0 → 0.3.1
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/README.md +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/shared/controller.d.ts.map +1 -1
- package/dist/shared/controller.js +11 -16
- package/dist/shared/controller.js.map +1 -1
- package/dist/shared/render.d.ts +2 -2
- package/dist/shared/render.d.ts.map +1 -1
- package/dist/shared/render.js +4 -6
- package/dist/shared/render.js.map +1 -1
- package/dist/shared/spawner.js +3 -8
- package/dist/shared/spawner.js.map +1 -1
- package/dist/shared/types.d.ts +23 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/state/persistence.d.ts +15 -15
- package/dist/state/persistence.d.ts.map +1 -1
- package/dist/state/persistence.js +32 -31
- 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 +19 -18
- 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 +81 -7
- package/dist/swarm/tool.js.map +1 -1
- package/dist/team/command.d.ts.map +1 -1
- package/dist/team/command.js.map +1 -1
- package/dist/team/mailbox.d.ts +2 -2
- package/dist/team/mailbox.d.ts.map +1 -1
- package/dist/team/mailbox.js +8 -8
- package/dist/team/mailbox.js.map +1 -1
- package/dist/team/supervisor.d.ts +14 -3
- package/dist/team/supervisor.d.ts.map +1 -1
- package/dist/team/supervisor.js +64 -3
- 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 +1 -1
- package/dist/team/tool.d.ts.map +1 -1
- package/dist/team/tool.js +141 -13
- 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 +12 -1
- package/dist/tui/progress.d.ts.map +1 -1
- package/dist/tui/progress.js +20 -2
- package/dist/tui/progress.js.map +1 -1
- package/dist/tui/team-dashboard.d.ts +65 -0
- package/dist/tui/team-dashboard.d.ts.map +1 -0
- package/dist/tui/team-dashboard.js +256 -0
- package/dist/tui/team-dashboard.js.map +1 -0
- package/package.json +1 -1
|
@@ -31,7 +31,8 @@ export function validateId(id, kind) {
|
|
|
31
31
|
function ensureWithinRoot(resolvedPath, root) {
|
|
32
32
|
const normalizedRoot = path.resolve(root) + path.sep;
|
|
33
33
|
const normalizedPath = path.resolve(resolvedPath);
|
|
34
|
-
if (!normalizedPath.startsWith(normalizedRoot) &&
|
|
34
|
+
if (!normalizedPath.startsWith(normalizedRoot) &&
|
|
35
|
+
normalizedPath !== path.resolve(root)) {
|
|
35
36
|
throw new Error(`Path traversal detected: ${resolvedPath} escapes ${root}`);
|
|
36
37
|
}
|
|
37
38
|
}
|
|
@@ -44,7 +45,7 @@ function ensureWithinRoot(resolvedPath, root) {
|
|
|
44
45
|
* Always uses `.pi/swarm/` under the project root. Creates `.pi/`
|
|
45
46
|
* if it does not already exist.
|
|
46
47
|
*/
|
|
47
|
-
export function
|
|
48
|
+
export function resolveSwarmRoot(cwd) {
|
|
48
49
|
const piDir = path.join(cwd, ".pi");
|
|
49
50
|
if (!fs.existsSync(piDir)) {
|
|
50
51
|
fs.mkdirSync(piDir, { recursive: true });
|
|
@@ -56,17 +57,17 @@ export function resolveCrewRoot(cwd) {
|
|
|
56
57
|
return swarmDir;
|
|
57
58
|
}
|
|
58
59
|
/** Resolve the state directory for a specific run. */
|
|
59
|
-
export function resolveRunStateDir(
|
|
60
|
+
export function resolveRunStateDir(swarmRoot, runId) {
|
|
60
61
|
validateId(runId, "runId");
|
|
61
|
-
const runsDir = path.join(
|
|
62
|
+
const runsDir = path.join(swarmRoot, "state", "runs");
|
|
62
63
|
const dir = path.join(runsDir, runId);
|
|
63
64
|
ensureWithinRoot(dir, runsDir);
|
|
64
65
|
return dir;
|
|
65
66
|
}
|
|
66
67
|
/** Resolve per-agent state directory. */
|
|
67
|
-
export function resolveAgentStateDir(
|
|
68
|
+
export function resolveAgentStateDir(swarmRoot, runId, agentId) {
|
|
68
69
|
validateId(agentId, "agentId");
|
|
69
|
-
const runDir = resolveRunStateDir(
|
|
70
|
+
const runDir = resolveRunStateDir(swarmRoot, runId);
|
|
70
71
|
const agentsDir = path.join(runDir, "agents");
|
|
71
72
|
const dir = path.join(agentsDir, agentId);
|
|
72
73
|
ensureWithinRoot(dir, agentsDir);
|
|
@@ -75,8 +76,8 @@ export function resolveAgentStateDir(crewRoot, runId, agentId) {
|
|
|
75
76
|
/**
|
|
76
77
|
* Create a new run manifest and write it to disk.
|
|
77
78
|
*/
|
|
78
|
-
export function createManifest(
|
|
79
|
-
const dir = resolveRunStateDir(
|
|
79
|
+
export function createManifest(swarmRoot, manifest) {
|
|
80
|
+
const dir = resolveRunStateDir(swarmRoot, manifest.runId);
|
|
80
81
|
fs.mkdirSync(dir, { recursive: true });
|
|
81
82
|
writeAtomic(path.join(dir, "manifest.json"), JSON.stringify(manifest, null, 2));
|
|
82
83
|
}
|
|
@@ -84,8 +85,8 @@ export function createManifest(crewRoot, manifest) {
|
|
|
84
85
|
* Read a run manifest from disk.
|
|
85
86
|
* Returns null if the manifest does not exist.
|
|
86
87
|
*/
|
|
87
|
-
export function readManifest(
|
|
88
|
-
const filePath = path.join(resolveRunStateDir(
|
|
88
|
+
export function readManifest(swarmRoot, runId) {
|
|
89
|
+
const filePath = path.join(resolveRunStateDir(swarmRoot, runId), "manifest.json");
|
|
89
90
|
try {
|
|
90
91
|
const raw = fs.readFileSync(filePath, "utf-8");
|
|
91
92
|
return JSON.parse(raw);
|
|
@@ -97,22 +98,22 @@ export function readManifest(crewRoot, runId) {
|
|
|
97
98
|
/**
|
|
98
99
|
* Update a run manifest (overwrites the file atomically).
|
|
99
100
|
*/
|
|
100
|
-
export function updateManifest(
|
|
101
|
-
const dir = resolveRunStateDir(
|
|
101
|
+
export function updateManifest(swarmRoot, manifest) {
|
|
102
|
+
const dir = resolveRunStateDir(swarmRoot, manifest.runId);
|
|
102
103
|
fs.mkdirSync(dir, { recursive: true });
|
|
103
104
|
writeAtomic(path.join(dir, "manifest.json"), JSON.stringify(manifest, null, 2));
|
|
104
105
|
}
|
|
105
106
|
/**
|
|
106
107
|
* Update the heartbeat timestamp for a running manifest.
|
|
107
108
|
*/
|
|
108
|
-
export function updateHeartbeat(
|
|
109
|
-
const manifest = readManifest(
|
|
109
|
+
export function updateHeartbeat(swarmRoot, runId) {
|
|
110
|
+
const manifest = readManifest(swarmRoot, runId);
|
|
110
111
|
if (!manifest)
|
|
111
112
|
return;
|
|
112
113
|
if (manifest.status !== "running")
|
|
113
114
|
return;
|
|
114
115
|
manifest.lastHeartbeatAt = Date.now();
|
|
115
|
-
updateManifest(
|
|
116
|
+
updateManifest(swarmRoot, manifest);
|
|
116
117
|
}
|
|
117
118
|
// ---------------------------------------------------------------------------
|
|
118
119
|
// Task state
|
|
@@ -120,8 +121,8 @@ export function updateHeartbeat(crewRoot, runId) {
|
|
|
120
121
|
/**
|
|
121
122
|
* Persist task state (task graph) to disk.
|
|
122
123
|
*/
|
|
123
|
-
export function saveTaskState(
|
|
124
|
-
const dir = resolveRunStateDir(
|
|
124
|
+
export function saveTaskState(swarmRoot, runId, data) {
|
|
125
|
+
const dir = resolveRunStateDir(swarmRoot, runId);
|
|
125
126
|
fs.mkdirSync(dir, { recursive: true });
|
|
126
127
|
writeAtomic(path.join(dir, "tasks.json"), JSON.stringify(data, null, 2));
|
|
127
128
|
}
|
|
@@ -129,8 +130,8 @@ export function saveTaskState(crewRoot, runId, data) {
|
|
|
129
130
|
* Load task state from disk.
|
|
130
131
|
* Returns null if the file does not exist.
|
|
131
132
|
*/
|
|
132
|
-
export function loadTaskState(
|
|
133
|
-
const filePath = path.join(resolveRunStateDir(
|
|
133
|
+
export function loadTaskState(swarmRoot, runId) {
|
|
134
|
+
const filePath = path.join(resolveRunStateDir(swarmRoot, runId), "tasks.json");
|
|
134
135
|
try {
|
|
135
136
|
const raw = fs.readFileSync(filePath, "utf-8");
|
|
136
137
|
return JSON.parse(raw);
|
|
@@ -145,8 +146,8 @@ export function loadTaskState(crewRoot, runId) {
|
|
|
145
146
|
/**
|
|
146
147
|
* Append an event to the run's event log.
|
|
147
148
|
*/
|
|
148
|
-
export function appendEvent(
|
|
149
|
-
const dir = resolveRunStateDir(
|
|
149
|
+
export function appendEvent(swarmRoot, runId, event) {
|
|
150
|
+
const dir = resolveRunStateDir(swarmRoot, runId);
|
|
150
151
|
fs.mkdirSync(dir, { recursive: true });
|
|
151
152
|
const filePath = path.join(dir, "events.jsonl");
|
|
152
153
|
const line = JSON.stringify(event) + "\n";
|
|
@@ -155,8 +156,8 @@ export function appendEvent(crewRoot, runId, event) {
|
|
|
155
156
|
/**
|
|
156
157
|
* Read all events from the run's event log.
|
|
157
158
|
*/
|
|
158
|
-
export function readEvents(
|
|
159
|
-
const filePath = path.join(resolveRunStateDir(
|
|
159
|
+
export function readEvents(swarmRoot, runId) {
|
|
160
|
+
const filePath = path.join(resolveRunStateDir(swarmRoot, runId), "events.jsonl");
|
|
160
161
|
try {
|
|
161
162
|
const raw = fs.readFileSync(filePath, "utf-8");
|
|
162
163
|
if (!raw.trim())
|
|
@@ -184,16 +185,16 @@ export function readEvents(crewRoot, runId) {
|
|
|
184
185
|
/**
|
|
185
186
|
* Save per-agent status.
|
|
186
187
|
*/
|
|
187
|
-
export function saveAgentStatus(
|
|
188
|
-
const dir = resolveAgentStateDir(
|
|
188
|
+
export function saveAgentStatus(swarmRoot, runId, agentId, status) {
|
|
189
|
+
const dir = resolveAgentStateDir(swarmRoot, runId, agentId);
|
|
189
190
|
fs.mkdirSync(dir, { recursive: true });
|
|
190
191
|
writeAtomic(path.join(dir, "status.json"), JSON.stringify(status, null, 2));
|
|
191
192
|
}
|
|
192
193
|
/**
|
|
193
194
|
* Load per-agent status.
|
|
194
195
|
*/
|
|
195
|
-
export function loadAgentStatus(
|
|
196
|
-
const filePath = path.join(resolveAgentStateDir(
|
|
196
|
+
export function loadAgentStatus(swarmRoot, runId, agentId) {
|
|
197
|
+
const filePath = path.join(resolveAgentStateDir(swarmRoot, runId, agentId), "status.json");
|
|
197
198
|
try {
|
|
198
199
|
const raw = fs.readFileSync(filePath, "utf-8");
|
|
199
200
|
return JSON.parse(raw);
|
|
@@ -206,8 +207,8 @@ export function loadAgentStatus(crewRoot, runId, agentId) {
|
|
|
206
207
|
* List all active run IDs in the state directory.
|
|
207
208
|
* Only returns IDs that match the safe ID pattern.
|
|
208
209
|
*/
|
|
209
|
-
export function listActiveRuns(
|
|
210
|
-
const runsDir = path.join(
|
|
210
|
+
export function listActiveRuns(swarmRoot) {
|
|
211
|
+
const runsDir = path.join(swarmRoot, "state", "runs");
|
|
211
212
|
if (!fs.existsSync(runsDir))
|
|
212
213
|
return [];
|
|
213
214
|
return fs
|
|
@@ -227,8 +228,8 @@ export function listActiveRuns(crewRoot) {
|
|
|
227
228
|
/**
|
|
228
229
|
* Delete the entire run state directory.
|
|
229
230
|
*/
|
|
230
|
-
export function deleteRunState(
|
|
231
|
-
const dir = resolveRunStateDir(
|
|
231
|
+
export function deleteRunState(swarmRoot, runId) {
|
|
232
|
+
const dir = resolveRunStateDir(swarmRoot, runId);
|
|
232
233
|
if (fs.existsSync(dir)) {
|
|
233
234
|
fs.rmSync(dir, { recursive: true, force: true });
|
|
234
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,+CAA+C;AAC/C,8EAA8E;AAE9E,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAE3C,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,IAAY;IACjD,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,
|
|
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,+CAA+C;AAC/C,8EAA8E;AAE9E,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAE3C,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,IAAY;IACjD,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CACb,WAAW,IAAI,mDAAmD,CACnE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,WAAW,IAAI,MAAM,EAAE,iEAAiE,CACzF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,YAAoB,EAAE,IAAY;IAC1D,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;IACrD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAClD,IACE,CAAC,cAAc,CAAC,UAAU,CAAC,cAAc,CAAC;QAC1C,cAAc,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EACrC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,YAAY,YAAY,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,KAAa;IACjE,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACtC,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,KAAa,EACb,OAAe;IAEf,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1C,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACjC,OAAO,GAAG,CAAC;AACb,CAAC;AAiBD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,QAAqB;IACrE,MAAM,GAAG,GAAG,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1D,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,WAAW,CACT,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAC/B,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAClC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,SAAiB,EACjB,KAAa;IAEb,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,EACpC,eAAe,CAChB,CAAC;IACF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,QAAqB;IACrE,MAAM,GAAG,GAAG,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1D,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,WAAW,CACT,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAC/B,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAClC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,KAAa;IAC9D,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAChD,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO;IAC1C,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,SAAiB,EACjB,KAAa,EACb,IAA6B;IAE7B,MAAM,GAAG,GAAG,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACjD,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,SAAiB,EACjB,KAAa;IAEb,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,EACpC,YAAY,CACb,CAAC;IACF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,SAAiB,EACjB,KAAa,EACb,KAA8B;IAE9B,MAAM,GAAG,GAAG,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACjD,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC1C,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,SAAiB,EACjB,KAAa;IAEb,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,EACpC,cAAc,CACf,CAAC;IACF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC;QAC3B,OAAO,GAAG;aACP,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAgC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,KAAa,EACb,OAAe,EACf,MAA+B;IAE/B,MAAM,GAAG,GAAG,oBAAoB,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5D,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,KAAa,EACb,OAAe;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,oBAAoB,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,EAC/C,aAAa,CACd,CAAC;IACF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,OAAO,EAAE;SACN,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,KAAa;IAC7D,MAAM,GAAG,GAAG,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACjD,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,WAAW,CAAC,QAAgB,EAAE,OAAe;IACpD,MAAM,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,EAAE,CAAC;IAChD,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,gCAAgC;QAChC,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACjD,CAAC"}
|
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,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,
|
|
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 {
|
|
@@ -58,8 +58,8 @@ export function recoverRuns(cwd) {
|
|
|
58
58
|
status: "abandoned",
|
|
59
59
|
completedAt: now,
|
|
60
60
|
};
|
|
61
|
-
updateManifest(
|
|
62
|
-
appendEvent(
|
|
61
|
+
updateManifest(swarmRoot, updated);
|
|
62
|
+
appendEvent(swarmRoot, runId, {
|
|
63
63
|
type: "run.abandoned",
|
|
64
64
|
reason: "stale",
|
|
65
65
|
timestamp: new Date().toISOString(),
|
|
@@ -79,7 +79,7 @@ export function recoverRuns(cwd) {
|
|
|
79
79
|
const age = now - completedAt;
|
|
80
80
|
if (age > COMPLETED_RUN_RETENTION_MS) {
|
|
81
81
|
try {
|
|
82
|
-
deleteRunState(
|
|
82
|
+
deleteRunState(swarmRoot, runId);
|
|
83
83
|
cleanedUp.push(runId);
|
|
84
84
|
}
|
|
85
85
|
catch {
|
|
@@ -94,7 +94,7 @@ export function recoverRuns(cwd) {
|
|
|
94
94
|
const abandonedAt = manifest.completedAt ?? manifest.startedAt;
|
|
95
95
|
if (now - abandonedAt > COMPLETED_RUN_RETENTION_MS) {
|
|
96
96
|
try {
|
|
97
|
-
deleteRunState(
|
|
97
|
+
deleteRunState(swarmRoot, runId);
|
|
98
98
|
cleanedUp.push(runId);
|
|
99
99
|
}
|
|
100
100
|
catch {
|
|
@@ -111,8 +111,8 @@ export function recoverRuns(cwd) {
|
|
|
111
111
|
* Check whether a run has unfinished tasks.
|
|
112
112
|
* Used to decide whether to offer resume or start fresh.
|
|
113
113
|
*/
|
|
114
|
-
export function hasUnfinishedTasks(
|
|
115
|
-
const manifest = readManifest(
|
|
114
|
+
export function hasUnfinishedTasks(swarmRoot, runId) {
|
|
115
|
+
const manifest = readManifest(swarmRoot, runId);
|
|
116
116
|
if (!manifest)
|
|
117
117
|
return false;
|
|
118
118
|
if (manifest.status === "completed")
|
|
@@ -120,15 +120,16 @@ export function hasUnfinishedTasks(crewRoot, runId) {
|
|
|
120
120
|
if (manifest.status !== "running")
|
|
121
121
|
return false;
|
|
122
122
|
// Check if any agent status files indicate unfinished work
|
|
123
|
-
const agentsDir = path.join(
|
|
123
|
+
const agentsDir = path.join(swarmRoot, "state", "runs", runId, "agents");
|
|
124
124
|
if (!fs.existsSync(agentsDir))
|
|
125
125
|
return true;
|
|
126
126
|
// Check each agent directory for non-terminal status
|
|
127
|
-
const agentDirs = fs
|
|
127
|
+
const agentDirs = fs
|
|
128
|
+
.readdirSync(agentsDir, { withFileTypes: true })
|
|
128
129
|
.filter((d) => d.isDirectory())
|
|
129
130
|
.map((d) => d.name);
|
|
130
131
|
for (const agentId of agentDirs) {
|
|
131
|
-
const status = loadAgentStatus(
|
|
132
|
+
const status = loadAgentStatus(swarmRoot, runId, agentId);
|
|
132
133
|
if (!status)
|
|
133
134
|
return true;
|
|
134
135
|
const state = String(status.status ?? status.state ?? "");
|
|
@@ -142,13 +143,13 @@ export function hasUnfinishedTasks(crewRoot, runId) {
|
|
|
142
143
|
* Get resumable agent IDs from a run.
|
|
143
144
|
* Returns a map of agentId → last known status.
|
|
144
145
|
*/
|
|
145
|
-
export function getResumableAgents(
|
|
146
|
-
const manifest = readManifest(
|
|
146
|
+
export function getResumableAgents(swarmRoot, runId) {
|
|
147
|
+
const manifest = readManifest(swarmRoot, runId);
|
|
147
148
|
const result = new Map();
|
|
148
149
|
if (!manifest)
|
|
149
150
|
return result;
|
|
150
151
|
for (const agentId of manifest.agentIds) {
|
|
151
|
-
const statusDir = path.join(
|
|
152
|
+
const statusDir = path.join(swarmRoot, "state", "runs", runId, "agents", agentId);
|
|
152
153
|
if (fs.existsSync(statusDir)) {
|
|
153
154
|
// Agent has state on disk — it can be resumed
|
|
154
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;AAkDzC,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAwO7D"}
|
package/dist/swarm/tool.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* Ported from MoonshotAI/kimi-code's AgentSwarmTool.
|
|
8
8
|
*/
|
|
9
9
|
import { Type } from "typebox";
|
|
10
|
+
import { Container, Spacer, Text } from "@earendil-works/pi-tui";
|
|
10
11
|
import { SubagentBatchController, resolveSwarmMaxConcurrency, } from "../shared/controller.js";
|
|
11
12
|
import { renderSwarmResults, toSwarmRunResults } from "../shared/render.js";
|
|
12
13
|
import { spawnSubagent, resumeSubagent, retrySubagent, } from "../shared/spawner.js";
|
|
@@ -56,12 +57,11 @@ export function registerAgentSwarmTool(pi) {
|
|
|
56
57
|
})),
|
|
57
58
|
}, { additionalProperties: false }),
|
|
58
59
|
execute: async (toolCallId, params, signal, _onUpdate, ctxRaw) => {
|
|
59
|
-
const { description, subagent_type, prompt_template, items, resume_agent_ids } = params;
|
|
60
|
+
const { description, subagent_type, prompt_template, items, resume_agent_ids, } = params;
|
|
60
61
|
const ctx = ctxRaw;
|
|
61
62
|
const progress = createProgressWidget(ctx);
|
|
62
63
|
try {
|
|
63
|
-
const profileName = normalizeOptionalString(subagent_type) ??
|
|
64
|
-
DEFAULT_SUBAGENT_TYPE;
|
|
64
|
+
const profileName = normalizeOptionalString(subagent_type) ?? DEFAULT_SUBAGENT_TYPE;
|
|
65
65
|
// Build specs
|
|
66
66
|
const specs = createAgentSwarmSpecs({
|
|
67
67
|
items,
|
|
@@ -97,7 +97,11 @@ export function registerAgentSwarmTool(pi) {
|
|
|
97
97
|
});
|
|
98
98
|
// Run with controller
|
|
99
99
|
const maxConcurrency = resolveSwarmMaxConcurrency(process.cwd());
|
|
100
|
-
const controller = new SubagentBatchController({
|
|
100
|
+
const controller = new SubagentBatchController({
|
|
101
|
+
spawn: spawnSubagent,
|
|
102
|
+
resume: resumeSubagent,
|
|
103
|
+
retry: retrySubagent,
|
|
104
|
+
}, tasks, {
|
|
101
105
|
maxConcurrency,
|
|
102
106
|
onProgress: (snapshot) => {
|
|
103
107
|
progress?.component.update(snapshotToProgressState(snapshot, description));
|
|
@@ -128,6 +132,63 @@ export function registerAgentSwarmTool(pi) {
|
|
|
128
132
|
clearProgressWidget(ctx);
|
|
129
133
|
}
|
|
130
134
|
},
|
|
135
|
+
// -------------------------------------------------------------------
|
|
136
|
+
// Custom TUI rendering
|
|
137
|
+
// -------------------------------------------------------------------
|
|
138
|
+
/**
|
|
139
|
+
* Render the tool call in the conversation transcript with arg summary.
|
|
140
|
+
* 业务说明:在对话记录中展示 swarm 调用信息 —— 包含类型、数量、
|
|
141
|
+
* prompt 模板预览。
|
|
142
|
+
*/
|
|
143
|
+
renderCall(args, theme, _context) {
|
|
144
|
+
const subagentType = args.subagent_type || "coder";
|
|
145
|
+
const itemCount = args.items?.length ?? 0;
|
|
146
|
+
const resumeCount = Object.keys(args.resume_agent_ids ?? {}).length;
|
|
147
|
+
const totalCount = itemCount + resumeCount;
|
|
148
|
+
const hasResume = resumeCount > 0;
|
|
149
|
+
const container = new Container();
|
|
150
|
+
const title = `${theme.fg("toolTitle", theme.bold("swarm "))}${theme.fg("accent", `${totalCount} agent${totalCount !== 1 ? "s" : ""}`)}${hasResume ? theme.fg("warning", ` (${resumeCount} resume)`) : ""}${theme.fg("muted", ` [${subagentType}]`)}`;
|
|
151
|
+
container.addChild(new Text(title, 0, 0));
|
|
152
|
+
const desc = args.description;
|
|
153
|
+
if (desc) {
|
|
154
|
+
container.addChild(new Spacer(1));
|
|
155
|
+
container.addChild(new Text(theme.fg("dim", desc.length > 80 ? `${desc.slice(0, 80)}...` : desc), 0, 0));
|
|
156
|
+
}
|
|
157
|
+
const templatePreview = args.prompt_template;
|
|
158
|
+
if (templatePreview) {
|
|
159
|
+
container.addChild(new Spacer(1));
|
|
160
|
+
const preview = templatePreview.length > 60
|
|
161
|
+
? `${templatePreview.slice(0, 60)}...`
|
|
162
|
+
: templatePreview;
|
|
163
|
+
container.addChild(new Text(theme.fg("muted", `${preview}`), 0, 0));
|
|
164
|
+
}
|
|
165
|
+
return container;
|
|
166
|
+
},
|
|
167
|
+
/**
|
|
168
|
+
* Render the tool result in the conversation transcript.
|
|
169
|
+
* 业务说明:根据执行结果展示成功/失败图标和概要统计。
|
|
170
|
+
*/
|
|
171
|
+
renderResult(result, _options, theme, context) {
|
|
172
|
+
const text = result.content[0]?.type === "text"
|
|
173
|
+
? result.content[0].text
|
|
174
|
+
: "";
|
|
175
|
+
const icon = context.isError
|
|
176
|
+
? theme.fg("error", "x")
|
|
177
|
+
: theme.fg("success", "V");
|
|
178
|
+
// Extract summary stats from the XML output
|
|
179
|
+
const completedMatch = /completed="(\d+)"/.exec(text);
|
|
180
|
+
const failedMatch = /failed="(\d+)"/.exec(text);
|
|
181
|
+
const completed = completedMatch ? completedMatch[1] : "?";
|
|
182
|
+
const failed = failedMatch ? failedMatch[1] : "?";
|
|
183
|
+
const container = new Container();
|
|
184
|
+
container.addChild(new Text(`${icon} ${theme.fg("toolTitle", "swarm ")}${theme.fg("accent", `done: ${completed}`)}${failed !== "0" ? theme.fg("error", ` failed: ${failed}`) : ""}`, 0, 0));
|
|
185
|
+
if (context.isError && text) {
|
|
186
|
+
container.addChild(new Spacer(1));
|
|
187
|
+
const errorPreview = text.length > 100 ? `${text.slice(0, 100)}...` : text;
|
|
188
|
+
container.addChild(new Text(theme.fg("error", errorPreview), 0, 0));
|
|
189
|
+
}
|
|
190
|
+
return container;
|
|
191
|
+
},
|
|
131
192
|
});
|
|
132
193
|
}
|
|
133
194
|
// ---------------------------------------------------------------------------
|
|
@@ -213,6 +274,10 @@ function normalizeOptionalString(value) {
|
|
|
213
274
|
* 业务说明:在 TUI 模式下注册一个实时进度面板,展示每个子 Agent 的
|
|
214
275
|
* 运行状态(队列/运行中/完成/失败/限流挂起)。非 TUI 模式下返回
|
|
215
276
|
* undefined,避免无意义的 UI 调用。
|
|
277
|
+
*
|
|
278
|
+
* 关键修复:setWidget 的工厂函数接收 (tui, theme) 参数,我们捕获 tui
|
|
279
|
+
* 引用并传给组件,使组件在动画定时器触发时能调用 tui.requestRender()
|
|
280
|
+
* 通知 TUI 框架重绘,否则 braille 进度条不会动。
|
|
216
281
|
*/
|
|
217
282
|
function createProgressWidget(ctx) {
|
|
218
283
|
// 仅在 TUI 模式下展示进度面板;其他模式(print/rpc/json)无可用 UI
|
|
@@ -221,10 +286,19 @@ function createProgressWidget(ctx) {
|
|
|
221
286
|
const setWidget = ctx.ui?.setWidget;
|
|
222
287
|
if (typeof setWidget !== "function")
|
|
223
288
|
return undefined;
|
|
224
|
-
|
|
289
|
+
// 捕获 tui 引用,供组件动画 tick 时调用 requestRender()
|
|
290
|
+
let capturedTui;
|
|
291
|
+
const component = new AgentSwarmProgressComponent(() => {
|
|
292
|
+
capturedTui?.requestRender();
|
|
293
|
+
});
|
|
225
294
|
try {
|
|
226
|
-
//
|
|
227
|
-
setWidget(PROGRESS_WIDGET_KEY, () =>
|
|
295
|
+
// 工厂函数接收 tui 和 theme,捕获 tui 供动画驱动使用
|
|
296
|
+
setWidget(PROGRESS_WIDGET_KEY, (tui, _theme) => {
|
|
297
|
+
capturedTui = tui;
|
|
298
|
+
return component;
|
|
299
|
+
}, {
|
|
300
|
+
placement: "aboveEditor",
|
|
301
|
+
});
|
|
228
302
|
}
|
|
229
303
|
catch {
|
|
230
304
|
// setWidget 失败不应阻断 swarm 执行
|