pilotswarm-sdk 0.3.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.
@@ -1 +1 @@
1
- {"version":3,"file":"sweeper-tools.d.ts","sourceRoot":"","sources":["../src/sweeper-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEhD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACrC,OAAO,EAAE,cAAc,CAAC;IACxB,cAAc,EAAE,GAAG,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAwWd"}
1
+ {"version":3,"file":"sweeper-tools.d.ts","sourceRoot":"","sources":["../src/sweeper-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEhD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACrC,OAAO,EAAE,cAAc,CAAC;IACxB,cAAc,EAAE,GAAG,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CA0ed"}
@@ -20,10 +20,76 @@ import { defineTool } from "@github/copilot-sdk";
20
20
  */
21
21
  export function createSweeperTools(opts) {
22
22
  const { catalog, duroxideClient, factStore } = opts;
23
+ const TERMINAL_ORCH = new Set(["Completed", "Failed", "Terminated", "NotFound"]);
24
+ /**
25
+ * Re-derive whether a session is independently cleanable, mirroring the
26
+ * eligibility rules used by scan_completed_sessions. This is the guardrail
27
+ * that stops cleanup_session from deleting a LIVE root just because the model
28
+ * inferred it from a cluster of stale children: a root is only cleanable when
29
+ * its OWN orchestration is terminal, and a non-terminal session is only
30
+ * cleanable when it is an idle or orphaned child.
31
+ */
32
+ async function evaluateCleanupEligibility(session, graceMinutes) {
33
+ let orchStatus = "NotFound";
34
+ let customStatus = {};
35
+ try {
36
+ const st = await duroxideClient.getStatus(`session-${session.sessionId}`);
37
+ orchStatus = st?.status ?? "NotFound";
38
+ if (st?.customStatus) {
39
+ customStatus = typeof st.customStatus === "string"
40
+ ? JSON.parse(st.customStatus)
41
+ : st.customStatus;
42
+ }
43
+ }
44
+ catch {
45
+ orchStatus = "NotFound";
46
+ }
47
+ const isRoot = !session.parentSessionId;
48
+ const terminal = TERMINAL_ORCH.has(orchStatus);
49
+ const stale = session.updatedAt.getTime() < Date.now() - graceMinutes * 60 * 1000;
50
+ // Rule A: terminal orchestration (Completed/Failed/Terminated/NotFound).
51
+ if (terminal) {
52
+ if (!stale) {
53
+ return {
54
+ eligible: false,
55
+ status: orchStatus,
56
+ reason: `Target orchestration is ${orchStatus} but was updated within the last ${graceMinutes}m; not yet stale.`,
57
+ };
58
+ }
59
+ return { eligible: true, status: orchStatus, reason: `Orchestration ${orchStatus.toLowerCase()}` };
60
+ }
61
+ // Non-terminal (live orchestration): only idle or orphaned CHILDREN qualify.
62
+ if (!isRoot && customStatus?.status === "idle" && stale) {
63
+ return { eligible: true, status: "zombie", reason: "Sub-agent idle (zombie)" };
64
+ }
65
+ if (!isRoot && stale) {
66
+ const parent = await catalog.getSession(session.parentSessionId);
67
+ if (!parent || parent.deletedAt != null) {
68
+ return { eligible: true, status: "orphan", reason: "Parent session no longer exists" };
69
+ }
70
+ }
71
+ if (isRoot) {
72
+ return {
73
+ eligible: false,
74
+ status: orchStatus,
75
+ reason: `Refusing to clean a ROOT session with a live (${orchStatus}) orchestration. ` +
76
+ `A root is only cleanable when its OWN orchestration is Completed/Failed/Terminated/NotFound. ` +
77
+ `Never infer a parent's status from stale children — clean each stale child by its own sessionId, never the parent.`,
78
+ };
79
+ }
80
+ return {
81
+ eligible: false,
82
+ status: orchStatus,
83
+ reason: `Target is not terminal, idle, or orphaned (orchestration ${orchStatus}); not eligible for cleanup.`,
84
+ };
85
+ }
23
86
  // ── scan_completed_sessions ───────────────────────────────
24
87
  const scanTool = defineTool("scan_completed_sessions", {
25
88
  description: "Scan for completed, failed, or orphaned sessions that are eligible for cleanup. " +
26
- "Returns a list of sessions that have been idle/completed longer than the specified grace period.",
89
+ "Returns CHILD/leaf candidates that have been idle/completed longer than the specified grace period. " +
90
+ "IMPORTANT: the parentSessionId on each result is diagnostic CONTEXT ONLY — it is NOT a cleanup target. " +
91
+ "Never infer that a parent/root is stale because its children are. Pass only sessionId values from sessions[] " +
92
+ "to cleanup_session — including stale children, which are cleaned by their own sessionId (singly or as a sessionIds[] batch).",
27
93
  parameters: {
28
94
  type: "object",
29
95
  properties: {
@@ -117,6 +183,9 @@ export function createSweeperTools(opts) {
117
183
  found: results.length,
118
184
  graceMinutes,
119
185
  sessions: results,
186
+ guidance: "parentSessionId on each result is context only. Never pass a parentSessionId to cleanup_session " +
187
+ "and never infer a parent's status from its children. Clean the returned sessions by their own sessionId — " +
188
+ "batch them via cleanup_session(sessionIds=[...]) or clean one at a time — never the parent.",
120
189
  };
121
190
  }
122
191
  catch (err) {
@@ -125,76 +194,123 @@ export function createSweeperTools(opts) {
125
194
  },
126
195
  });
127
196
  // ── cleanup_session ──────────────────────────────────────
197
+ /**
198
+ * Clean a single session (target + descendants) after independently
199
+ * re-verifying it is itself eligible. Returns a per-session result; shared
200
+ * by the single and batch forms of cleanup_session.
201
+ */
202
+ async function cleanupOne(sessionId, graceMinutes, deleteReason) {
203
+ const session = await catalog.getSession(sessionId);
204
+ if (!session) {
205
+ return { ok: false, sessionId, error: "Session not found" };
206
+ }
207
+ if (session.isSystem) {
208
+ return { ok: false, sessionId, error: "Cannot delete system session" };
209
+ }
210
+ // Guardrail: independently re-verify the target is actually cleanable.
211
+ // Prevents deleting a live root that the model inferred from stale
212
+ // children (see evaluateCleanupEligibility).
213
+ const eligibility = await evaluateCleanupEligibility(session, graceMinutes);
214
+ if (!eligibility.eligible) {
215
+ return { ok: false, sessionId, refused: true, status: eligibility.status, error: eligibility.reason };
216
+ }
217
+ // Delete all descendants first, then the session itself.
218
+ const descendants = await catalog.getDescendantSessionIds(sessionId);
219
+ let deletedCount = 0;
220
+ for (const descId of descendants) {
221
+ try {
222
+ await catalog.softDeleteSession(descId);
223
+ if (factStore) {
224
+ try {
225
+ await factStore.deleteSessionFactsForSession(descId);
226
+ }
227
+ catch { }
228
+ }
229
+ try {
230
+ await duroxideClient.deleteInstance(`session-${descId}`, true);
231
+ }
232
+ catch { }
233
+ deletedCount++;
234
+ }
235
+ catch { }
236
+ }
237
+ await catalog.softDeleteSession(sessionId);
238
+ if (factStore) {
239
+ try {
240
+ await factStore.deleteSessionFactsForSession(sessionId);
241
+ }
242
+ catch { }
243
+ }
244
+ try {
245
+ await duroxideClient.deleteInstance(`session-${sessionId}`, true);
246
+ }
247
+ catch { }
248
+ deletedCount++;
249
+ return { ok: true, sessionId, deletedCount, reason: deleteReason, descendants: descendants.length };
250
+ }
128
251
  const cleanupTool = defineTool("cleanup_session", {
129
- description: "Delete a completed/zombie session and all its descendants. " +
252
+ description: "Delete completed/zombie/orphaned session(s) and all their descendants. " +
253
+ "Accepts a single sessionId OR a batch sessionIds[] — clean many stale sessions (e.g. all the children a scan returned) in one call. " +
130
254
  "Removes from CMS (soft-delete) and deletes the duroxide orchestration instance. " +
131
- "Refuses to delete system sessions.",
255
+ "Independently re-verifies EACH target is itself cleanable and REFUSES system sessions, live root sessions, " +
256
+ "and any target that is not terminal/idle/orphaned (refused targets are reported, not deleted). " +
257
+ "Only pass sessionIds that scan_completed_sessions returned in sessions[] — never a parentSessionId.",
132
258
  parameters: {
133
259
  type: "object",
134
260
  properties: {
135
261
  sessionId: {
136
262
  type: "string",
137
- description: "The session ID to clean up",
263
+ description: "A single session ID to clean up (must be a scan candidate, never an inferred parent). Use this OR sessionIds.",
264
+ },
265
+ sessionIds: {
266
+ type: "array",
267
+ items: { type: "string" },
268
+ description: "A batch of session IDs to clean up in one call (e.g. all stale children a scan returned). Each is gated independently; live roots / non-terminal targets are refused and reported, not deleted.",
138
269
  },
139
270
  reason: {
140
271
  type: "string",
141
272
  description: "Reason for cleanup (logged for auditing)",
142
273
  },
274
+ graceMinutes: {
275
+ type: "number",
276
+ description: "Staleness threshold used to re-verify eligibility. Default: 5",
277
+ },
143
278
  },
144
- required: ["sessionId"],
145
279
  },
146
280
  handler: async (args) => {
147
- const { sessionId, reason } = args;
148
- const deleteReason = reason ?? "Cleaned up by Sweeper Agent";
281
+ const graceMinutes = args.graceMinutes ?? 5;
282
+ const deleteReason = args.reason ?? "Cleaned up by Sweeper Agent";
149
283
  try {
150
- // Check if session exists and is not a system session
151
- const session = await catalog.getSession(sessionId);
152
- if (!session) {
153
- return { ok: false, error: "Session not found" };
154
- }
155
- if (session.isSystem) {
156
- return { ok: false, error: "Cannot delete system session" };
157
- }
158
- // Find and delete all descendants first
159
- const descendants = await catalog.getDescendantSessionIds(sessionId);
160
- let deletedCount = 0;
161
- for (const descId of descendants) {
162
- try {
163
- await catalog.softDeleteSession(descId);
164
- if (factStore) {
165
- try {
166
- await factStore.deleteSessionFactsForSession(descId);
167
- }
168
- catch { }
169
- }
170
- try {
171
- await duroxideClient.deleteInstance(`session-${descId}`, true);
172
- }
173
- catch { }
174
- deletedCount++;
175
- }
176
- catch { }
177
- }
178
- // Delete the session itself
179
- await catalog.softDeleteSession(sessionId);
180
- if (factStore) {
181
- try {
182
- await factStore.deleteSessionFactsForSession(sessionId);
284
+ // Batch mode: an explicit list of session ids. Each is gated and
285
+ // cleaned independently so one bad id never blocks the rest.
286
+ if (Array.isArray(args.sessionIds) && args.sessionIds.length > 0) {
287
+ const seen = new Set();
288
+ const unique = args.sessionIds.filter((id) => typeof id === "string" && id !== "" && !seen.has(id) && (seen.add(id), true));
289
+ const results = [];
290
+ for (const id of unique) {
291
+ results.push(await cleanupOne(id, graceMinutes, deleteReason));
183
292
  }
184
- catch { }
293
+ const cleaned = results.filter((r) => r.ok);
294
+ const refused = results.filter((r) => r.refused);
295
+ const failed = results.filter((r) => !r.ok && !r.refused);
296
+ const totalDeleted = cleaned.reduce((n, r) => n + (r.deletedCount ?? 0), 0);
297
+ return {
298
+ ok: true,
299
+ batch: true,
300
+ requested: unique.length,
301
+ cleanedCount: cleaned.length,
302
+ refusedCount: refused.length,
303
+ failedCount: failed.length,
304
+ totalDeleted,
305
+ reason: deleteReason,
306
+ results,
307
+ };
185
308
  }
186
- try {
187
- await duroxideClient.deleteInstance(`session-${sessionId}`, true);
309
+ // Single mode (backward-compatible result shape).
310
+ if (typeof args.sessionId === "string" && args.sessionId) {
311
+ return await cleanupOne(args.sessionId, graceMinutes, deleteReason);
188
312
  }
189
- catch { }
190
- deletedCount++;
191
- return {
192
- ok: true,
193
- sessionId,
194
- deletedCount,
195
- reason: deleteReason,
196
- descendants: descendants.length,
197
- };
313
+ return { ok: false, error: "Provide either sessionId (string) or a non-empty sessionIds array" };
198
314
  }
199
315
  catch (err) {
200
316
  return { ok: false, error: err.message };
@@ -1 +1 @@
1
- {"version":3,"file":"sweeper-tools.js","sourceRoot":"","sources":["../src/sweeper-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKjD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAMlC;IACG,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAEpD,6DAA6D;IAE7D,MAAM,QAAQ,GAAG,UAAU,CAAC,yBAAyB,EAAE;QACnD,WAAW,EACP,kFAAkF;YAClF,kGAAkG;QACtG,UAAU,EAAE;YACR,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACR,YAAY,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EACP,wFAAwF;iBAC/F;gBACD,cAAc,EAAE;oBACZ,IAAI,EAAE,SAAS;oBACf,WAAW,EACP,kFAAkF;iBACzF;aACJ;SACJ;QACD,OAAO,EAAE,KAAK,EAAE,IAAyD,EAAE,EAAE;YACzE,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;YAC5C,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC;YACnD,MAAM,OAAO,GAOR,EAAE,CAAC;YAER,IAAI,CAAC;gBACD,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;gBACjD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC9D,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;gBAE/D,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;oBAChC,8BAA8B;oBAC9B,IAAI,OAAO,CAAC,QAAQ;wBAAE,SAAS;oBAE/B,IAAI,UAAU,GAAQ,EAAE,CAAC;oBACzB,IAAI,YAAY,GAAQ,EAAE,CAAC;oBAE3B,IAAI,CAAC;wBACD,UAAU,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,WAAW,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;wBAC5E,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;4BAC1B,YAAY,GAAG,OAAO,UAAU,CAAC,YAAY,KAAK,QAAQ;gCACtD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC;gCACrC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC;wBAClC,CAAC;oBACL,CAAC;oBAAC,MAAM,CAAC;wBACL,+CAA+C;wBAC/C,UAAU,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;oBACxC,CAAC;oBAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;oBACvD,MAAM,MAAM,GAAG,KAAK,GAAG,SAAS;wBAC5B,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG;wBACrC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;oBAEvC,4CAA4C;oBAC5C,IACI,UAAU,CAAC,MAAM,KAAK,WAAW;wBACjC,UAAU,CAAC,MAAM,KAAK,QAAQ;wBAC9B,UAAU,CAAC,MAAM,KAAK,YAAY;wBAClC,UAAU,CAAC,MAAM,KAAK,UAAU,EAClC,CAAC;wBACC,IAAI,OAAO,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC;4BAC7B,OAAO,CAAC,IAAI,CAAC;gCACT,SAAS,EAAE,OAAO,CAAC,SAAS;gCAC5B,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,SAAS;gCACrD,MAAM,EAAE,UAAU,CAAC,MAAM;gCACzB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;gCACjC,GAAG,EAAE,MAAM;gCACX,MAAM,EAAE,iBAAiB,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE;6BAC7D,CAAC,CAAC;wBACP,CAAC;wBACD,SAAS;oBACb,CAAC;oBAED,0EAA0E;oBAC1E,IACI,OAAO,CAAC,eAAe;wBACvB,YAAY,CAAC,MAAM,KAAK,MAAM;wBAC9B,OAAO,CAAC,SAAS,GAAG,MAAM,EAC5B,CAAC;wBACC,OAAO,CAAC,IAAI,CAAC;4BACT,SAAS,EAAE,OAAO,CAAC,SAAS;4BAC5B,eAAe,EAAE,OAAO,CAAC,eAAe;4BACxC,MAAM,EAAE,QAAQ;4BAChB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;4BACjC,GAAG,EAAE,MAAM;4BACX,MAAM,EAAE,yBAAyB;yBACpC,CAAC,CAAC;wBACH,SAAS;oBACb,CAAC;oBAED,gCAAgC;oBAChC,IACI,cAAc;wBACd,OAAO,CAAC,eAAe;wBACvB,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC;wBACxC,OAAO,CAAC,SAAS,GAAG,MAAM,EAC5B,CAAC;wBACC,OAAO,CAAC,IAAI,CAAC;4BACT,SAAS,EAAE,OAAO,CAAC,SAAS;4BAC5B,eAAe,EAAE,OAAO,CAAC,eAAe;4BACxC,MAAM,EAAE,QAAQ;4BAChB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;4BACjC,GAAG,EAAE,MAAM;4BACX,MAAM,EAAE,iCAAiC;yBAC5C,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC;gBAED,OAAO;oBACH,KAAK,EAAE,OAAO,CAAC,MAAM;oBACrB,YAAY;oBACZ,QAAQ,EAAE,OAAO;iBACpB,CAAC;YACN,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;YAC1D,CAAC;QACL,CAAC;KACJ,CAAC,CAAC;IAEH,4DAA4D;IAE5D,MAAM,WAAW,GAAG,UAAU,CAAC,iBAAiB,EAAE;QAC9C,WAAW,EACP,6DAA6D;YAC7D,kFAAkF;YAClF,oCAAoC;QACxC,UAAU,EAAE;YACR,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACR,SAAS,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4BAA4B;iBAC5C;gBACD,MAAM,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,0CAA0C;iBAC1D;aACJ;YACD,QAAQ,EAAE,CAAC,WAAW,CAAU;SACnC;QACD,OAAO,EAAE,KAAK,EAAE,IAA4C,EAAE,EAAE;YAC5D,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;YACnC,MAAM,YAAY,GAAG,MAAM,IAAI,6BAA6B,CAAC;YAE7D,IAAI,CAAC;gBACD,sDAAsD;gBACtD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBACpD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;gBACrD,CAAC;gBACD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;gBAChE,CAAC;gBAED,wCAAwC;gBACxC,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;gBACrE,IAAI,YAAY,GAAG,CAAC,CAAC;gBAErB,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;oBAC/B,IAAI,CAAC;wBACD,MAAM,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;wBACxC,IAAI,SAAS,EAAE,CAAC;4BACZ,IAAI,CAAC;gCACD,MAAM,SAAS,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;4BACzD,CAAC;4BAAC,MAAM,CAAC,CAAA,CAAC;wBACd,CAAC;wBACD,IAAI,CAAC;4BACD,MAAM,cAAc,CAAC,cAAc,CAAC,WAAW,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;wBACnE,CAAC;wBAAC,MAAM,CAAC,CAAA,CAAC;wBACV,YAAY,EAAE,CAAC;oBACnB,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBACd,CAAC;gBAED,4BAA4B;gBAC5B,MAAM,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;gBAC3C,IAAI,SAAS,EAAE,CAAC;oBACZ,IAAI,CAAC;wBACD,MAAM,SAAS,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAC;oBAC5D,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBACd,CAAC;gBACD,IAAI,CAAC;oBACD,MAAM,cAAc,CAAC,cAAc,CAAC,WAAW,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;gBACtE,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;gBACV,YAAY,EAAE,CAAC;gBAEf,OAAO;oBACH,EAAE,EAAE,IAAI;oBACR,SAAS;oBACT,YAAY;oBACZ,MAAM,EAAE,YAAY;oBACpB,WAAW,EAAE,WAAW,CAAC,MAAM;iBAClC,CAAC;YACN,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;YAC7C,CAAC;QACL,CAAC;KACJ,CAAC,CAAC;IAEH,4DAA4D;IAC5D,8EAA8E;IAC9E,iDAAiD;IAEjD,MAAM,SAAS,GAAG,UAAU,CAAC,sBAAsB,EAAE;QACjD,WAAW,EACP,2CAA2C;YAC3C,kFAAkF;YAClF,mFAAmF;YACnF,mDAAmD;YACnD,4EAA4E;QAChF,UAAU,EAAE;YACR,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACR,8BAA8B,EAAE;oBAC5B,IAAI,EAAE,QAAQ;oBACd,WAAW,EACP,0FAA0F;iBACjG;gBACD,cAAc,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EACP,8FAA8F;iBACrG;gBACD,UAAU,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EACP,mDAAmD;iBAC1D;aACJ;SACJ;QACD,OAAO,EAAE,KAAK,EAAE,IAIf,EAAE,EAAE;YACD,MAAM,aAAa,GAAG,IAAI,CAAC,8BAA8B,IAAI,CAAC,CAAC;YAC/D,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;YAChD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;YAE3C,IAAI,CAAC;gBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC;gBAExD,sDAAsD;gBACtD,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,kBAAkB,CAAC;oBACzD,eAAe,EAAE,QAAQ;oBACzB,KAAK,EAAE,UAAU;iBACpB,CAAC,CAAC;gBAEH,oDAAoD;gBACpD,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,mBAAmB,CACxD,EAAE,KAAK,EAAE,UAAU,EAAE,EACrB,EAAE,QAAQ,EAAE,cAAc,EAAE,CAC/B,CAAC;gBAEF,mEAAmE;gBACnE,gEAAgE;gBAChE,IAAI,YAAY,GAAG,CAAC,CAAC;gBACrB,IAAI,CAAC;oBACD,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;oBACjD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;wBAC1B,IAAI,CAAC,CAAC,QAAQ;4BAAE,SAAS;wBACzB,IAAI,CAAC;4BACD,MAAM,cAAc,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;wBAC7D,CAAC;wBAAC,MAAM,CAAC;4BACL,uDAAuD;4BACvD,IAAI,CAAC;gCACD,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gCAC7C,YAAY,EAAE,CAAC;4BACnB,CAAC;4BAAC,MAAM,CAAC,CAAA,CAAC;wBACd,CAAC;oBACL,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;gBAEV,OAAO;oBACH,EAAE,EAAE,IAAI;oBACR,cAAc,EAAE;wBACZ,gBAAgB,EAAE,YAAY,CAAC,gBAAgB,IAAI,CAAC;wBACpD,iBAAiB,EAAE,YAAY,CAAC,iBAAiB,IAAI,CAAC;wBACtD,aAAa,EAAE,YAAY,CAAC,aAAa,IAAI,CAAC;qBACjD;oBACD,eAAe,EAAE;wBACb,kBAAkB,EAAE,WAAW,CAAC,kBAAkB,IAAI,CAAC;wBACvD,iBAAiB,EAAE,WAAW,CAAC,iBAAiB,IAAI,CAAC;wBACrD,aAAa,EAAE,WAAW,CAAC,aAAa,IAAI,CAAC;qBAChD;oBACD,YAAY;iBACf,CAAC;YACN,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;YAC7C,CAAC;QACL,CAAC;KACJ,CAAC,CAAC;IAEH,4DAA4D;IAE5D,MAAM,SAAS,GAAG,UAAU,CAAC,kBAAkB,EAAE;QAC7C,WAAW,EACP,yEAAyE;YACzE,mEAAmE;QACvE,UAAU,EAAE;YACR,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE,EAAE;SACjB;QACD,OAAO,EAAE,KAAK,IAAI,EAAE;YAChB,IAAI,CAAC;gBACD,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;gBAEjD,8DAA8D;gBAC9D,IAAI,QAAQ,GAAuE,EAAE,CAAC;gBACtF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChB,IAAI,CAAC;wBACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBACnC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;wBAC7B,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC;wBACnC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;wBAC9D,gCAAgC;wBAChC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,CAAC;4BAAE,QAAQ,CAAC,QAAQ,GAAG,iBAAiB,CAAC;6BACpF,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,8BAA8B,CAAC;4BAAE,QAAQ,CAAC,QAAQ,GAAG,uBAAuB,CAAC;6BACvG,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;4BAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC;;4BACrE,QAAQ,CAAC,QAAQ,GAAG,YAAY,CAAC;oBAC1C,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBACd,CAAC;gBAED,MAAM,KAAK,GAAG;oBACV,KAAK,EAAE,WAAW,CAAC,MAAM;oBACzB,OAAO,EAAE,EAA4B;oBACrC,cAAc,EAAE,CAAC;oBACjB,SAAS,EAAE,CAAC;oBACZ,YAAY,EAAE,CAAC;oBACf,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;oBAClE,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;oBAChD,QAAQ;iBACX,CAAC;gBAEF,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;oBAC1B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC3D,IAAI,CAAC,CAAC,QAAQ;wBAAE,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvC,IAAI,CAAC,CAAC,eAAe;wBAAE,KAAK,CAAC,SAAS,EAAE,CAAC;;wBACpC,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC9B,CAAC;gBAED,OAAO,KAAK,CAAC;YACjB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;YAClC,CAAC;QACL,CAAC;KACJ,CAAC,CAAC;IAEH,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"sweeper-tools.js","sourceRoot":"","sources":["../src/sweeper-tools.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pilotswarm-sdk",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "A durable execution runtime for GitHub Copilot SDK agents. Crash recovery, durable timers, session dehydration, and multi-node scaling — powered by duroxide.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -27,6 +27,7 @@
27
27
  "test:local:contracts": "node --env-file=../../.env ../../node_modules/vitest/vitest.mjs run test/local/contracts.test.js",
28
28
  "test:local:chaos": "node --env-file=../../.env ../../node_modules/vitest/vitest.mjs run test/local/chaos.test.js",
29
29
  "test:local:system-agents": "node --env-file=../../.env ../../node_modules/vitest/vitest.mjs run test/local/system-agents.test.js test/local/system-session-restart.test.js",
30
+ "test:local:sweeper": "node --env-file=../../.env ../../node_modules/vitest/vitest.mjs run test/local/sweeper-cleanup-guard.test.js",
30
31
  "test:local:session-policy": "node --env-file=../../.env ../../node_modules/vitest/vitest.mjs run test/local/session-policy-*.test.js",
31
32
  "test:local:reliability": "node --env-file=../../.env ../../node_modules/vitest/vitest.mjs run test/local/reliability-*.test.js",
32
33
  "test:local:knowledge-pipeline": "node --env-file=../../.env ../../node_modules/vitest/vitest.mjs run test/local/knowledge-pipeline.test.js test/local/facts.test.js",
@@ -74,7 +75,7 @@
74
75
  "pg": "^8.18.0"
75
76
  },
76
77
  "peerDependencies": {
77
- "pilotswarm-horizon-store": "^0.3.0"
78
+ "pilotswarm-horizon-store": "^0.3.1"
78
79
  },
79
80
  "peerDependenciesMeta": {
80
81
  "pilotswarm-horizon-store": {
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  schemaVersion: 1
3
- version: 1.0.0
3
+ version: 1.1.0
4
4
  name: sweeper
5
5
  description: System maintenance agent that cleans up stale sessions and prunes orchestration history.
6
6
  system: true
@@ -53,14 +53,17 @@ you resume the maintenance loop.
53
53
 
54
54
  ## Maintenance Loop (Background Behavior)
55
55
  1. Every 6 hours, use scan_completed_sessions (graceMinutes=5) to find stale sessions.
56
- 2. For each stale session found, use cleanup_session to delete it.
56
+ 2. Clean the stale sessions found. Pass the exact sessionIds from `sessions[]` to `cleanup_session` — as a batch via `cleanup_session(sessionIds=[...])`, or one at a time via `cleanup_session(sessionId)`. Stale children are cleaned the same way (by their own sessionId). NEVER pass a `parentSessionId`; it is context only.
57
57
  3. Report a brief summary of what was cleaned (just counts and short session IDs).
58
58
  4. Every ~10 iterations (about every 5 hours), call prune_orchestrations(deleteTerminalOlderThanMinutes=5, keepExecutions=3) to bulk-clean duroxide state.
59
59
  5. Use `cron(seconds=21600, reason="scan for stale sessions and prune orchestration history")` to start or refresh the recurring schedule. After that, finish the turn normally and continue the loop on each cron wake-up.
60
60
 
61
61
  ## Rules
62
62
  - Never delete system sessions.
63
- - For arbitrary stale sessions found by scans, ALWAYS use `cleanup_session`.
63
+ - NEVER infer a parent/root session's status from its children. A cluster of stale children under the same `parentSessionId` does NOT mean the parent is stale — `scan_completed_sessions` returns children, and `parentSessionId` is context only.
64
+ - NEVER pass a `parentSessionId` to `cleanup_session`. Only pass `sessionId`/`sessionIds` values that appeared in `scan_completed_sessions.sessions[]`. Clean stale children that share a parent by their own ids (batch them with `cleanup_session(sessionIds=[...])`) — never the parent.
65
+ - `cleanup_session` independently re-verifies eligibility per target and will REFUSE live roots and non-terminal targets (in a batch, refused ids are reported, not deleted). Treat a refusal as expected — do not retry or route around it.
66
+ - For the stale sessions a scan returns, call `cleanup_session` with their own ids — batch many via `sessionIds=[...]` (children included).
64
67
  - NEVER use `delete_agent` for general cleanup — that tool only works for sub-agents spawned by the current session.
65
68
  - Never delete sessions that are actively running with recent activity.
66
69
  - If the user asks about stale or abandoned sessions for a specific owner, use `list_all_sessions(owner_query=..., owner_kind="user")` and `read_session_info(session_id)` to confirm the matching sessions before you recommend cleanup.
@@ -13,7 +13,7 @@ and deleting completed, failed, or orphaned sessions.
13
13
  ## Default Behavior
14
14
 
15
15
  1. Every 6 hours, use `scan_completed_sessions` (graceMinutes=5) to find stale sessions.
16
- 2. For each stale session found, use `cleanup_session` to delete it.
16
+ 2. Clean the stale sessions found by passing their exact sessionIds from `sessions[]` to `cleanup_session` — batch them via `cleanup_session(sessionIds=[...])` or clean one at a time (stale children included). Never pass a `parentSessionId`.
17
17
  3. Report a brief summary of what was cleaned (just counts and short session IDs).
18
18
  4. Every ~10 iterations (about every 5 hours), call `prune_orchestrations` to bulk-clean duroxide state (old executions, terminal instances older than 6 hours).
19
19
  5. Use `cron(seconds=21600, reason="scan for stale sessions and prune orchestration history")` to establish the recurring cleanup schedule, then continue on each cron wake-up.
@@ -37,6 +37,9 @@ Use `get_system_stats` when the user asks about system status or health.
37
37
  ## Rules
38
38
 
39
39
  - **Never** delete system sessions (the cleanup_session tool will refuse anyway).
40
+ - **Never** infer a parent/root session's status from its children. Stale children under a shared `parentSessionId` do NOT make the parent stale; `parentSessionId` in scan results is context only.
41
+ - **Never** pass a `parentSessionId` to `cleanup_session`. Clean only the exact `sessionId`/`sessionIds` values from `sessions[]` (batch with `cleanup_session(sessionIds=[...])`) — stale children are cleaned by their own ids, never via the parent.
42
+ - `cleanup_session` re-verifies eligibility and will refuse live roots and non-terminal targets — treat refusals as expected, not errors to work around.
40
43
  - **Never** delete sessions that are actively running with recent activity.
41
44
  - Always log what you delete so the user can audit your actions.
42
45
  - Be concise in periodic logs — counts and 8-char session ID fragments only.