crewly 1.20.295 → 1.20.296

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/config/skills/_common/lib.sh +6 -0
  2. package/config/skills/agent/core/complete-task/SKILL.md +4 -2
  3. package/config/skills/agent/core/complete-task/execute.sh +7 -0
  4. package/config/skills/agent/core/complete-task/explicit-id.test.sh +56 -0
  5. package/config/skills/agent/core/poll-tasks/execute.sh +13 -1
  6. package/config/skills/agent/core/poll-tasks/execute.test.sh +37 -0
  7. package/config/skills/team-leader/delegate-task/execute.sh +13 -2
  8. package/config/skills/team-leader/verify-output/SKILL.md +9 -0
  9. package/dist/backend/backend/src/constants.d.ts +12 -0
  10. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  11. package/dist/backend/backend/src/constants.js +12 -0
  12. package/dist/backend/backend/src/constants.js.map +1 -1
  13. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  14. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +28 -8
  15. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  16. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  17. package/dist/backend/backend/src/controllers/slack/slack.controller.js +28 -1
  18. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  19. package/dist/backend/backend/src/index.d.ts.map +1 -1
  20. package/dist/backend/backend/src/index.js +30 -5
  21. package/dist/backend/backend/src/index.js.map +1 -1
  22. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +18 -4
  23. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  24. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +36 -8
  25. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  26. package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts +6 -0
  27. package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts.map +1 -1
  28. package/dist/backend/backend/src/services/orc/reply-destination-resolver.js +18 -0
  29. package/dist/backend/backend/src/services/orc/reply-destination-resolver.js.map +1 -1
  30. package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts +2 -0
  31. package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -1
  32. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +81 -8
  33. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
  34. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts +8 -0
  35. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -1
  36. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js +22 -0
  37. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js.map +1 -1
  38. package/dist/backend/backend/src/services/session/session-command-helper.d.ts +17 -0
  39. package/dist/backend/backend/src/services/session/session-command-helper.d.ts.map +1 -1
  40. package/dist/backend/backend/src/services/session/session-command-helper.js +32 -0
  41. package/dist/backend/backend/src/services/session/session-command-helper.js.map +1 -1
  42. package/dist/backend/backend/src/services/slack/orc-owner-dm-target.d.ts +27 -0
  43. package/dist/backend/backend/src/services/slack/orc-owner-dm-target.d.ts.map +1 -0
  44. package/dist/backend/backend/src/services/slack/orc-owner-dm-target.js +48 -0
  45. package/dist/backend/backend/src/services/slack/orc-owner-dm-target.js.map +1 -0
  46. package/dist/backend/backend/src/services/task-pool/pool-archive-migration.d.ts +18 -0
  47. package/dist/backend/backend/src/services/task-pool/pool-archive-migration.d.ts.map +1 -1
  48. package/dist/backend/backend/src/services/task-pool/pool-archive-migration.js +9 -3
  49. package/dist/backend/backend/src/services/task-pool/pool-archive-migration.js.map +1 -1
  50. package/dist/backend/backend/src/services/task-pool/pool-prune.d.ts +76 -0
  51. package/dist/backend/backend/src/services/task-pool/pool-prune.d.ts.map +1 -0
  52. package/dist/backend/backend/src/services/task-pool/pool-prune.js +129 -0
  53. package/dist/backend/backend/src/services/task-pool/pool-prune.js.map +1 -0
  54. package/dist/backend/backend/src/services/task-pool/pool-storage.d.ts +9 -1
  55. package/dist/backend/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
  56. package/dist/backend/backend/src/services/task-pool/pool-storage.js +34 -3
  57. package/dist/backend/backend/src/services/task-pool/pool-storage.js.map +1 -1
  58. package/dist/backend/backend/src/utils/screen-excerpt.d.ts +34 -0
  59. package/dist/backend/backend/src/utils/screen-excerpt.d.ts.map +1 -0
  60. package/dist/backend/backend/src/utils/screen-excerpt.js +56 -0
  61. package/dist/backend/backend/src/utils/screen-excerpt.js.map +1 -0
  62. package/dist/backend/build-info.json +2 -2
  63. package/dist/cli/backend/src/constants.d.ts +12 -0
  64. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  65. package/dist/cli/backend/src/constants.js +12 -0
  66. package/dist/cli/backend/src/constants.js.map +1 -1
  67. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +18 -4
  68. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  69. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +36 -8
  70. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  71. package/dist/cli/backend/src/services/session/session-command-helper.d.ts +17 -0
  72. package/dist/cli/backend/src/services/session/session-command-helper.d.ts.map +1 -1
  73. package/dist/cli/backend/src/services/session/session-command-helper.js +32 -0
  74. package/dist/cli/backend/src/services/session/session-command-helper.js.map +1 -1
  75. package/dist/cli/backend/src/services/task-pool/pool-storage.d.ts +9 -1
  76. package/dist/cli/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
  77. package/dist/cli/backend/src/services/task-pool/pool-storage.js +34 -3
  78. package/dist/cli/backend/src/services/task-pool/pool-storage.js.map +1 -1
  79. package/dist/cli/backend/src/utils/screen-excerpt.d.ts +34 -0
  80. package/dist/cli/backend/src/utils/screen-excerpt.d.ts.map +1 -0
  81. package/dist/cli/backend/src/utils/screen-excerpt.js +56 -0
  82. package/dist/cli/backend/src/utils/screen-excerpt.js.map +1 -0
  83. package/package.json +1 -1
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Ongoing task-pool pruning (crewly#1108).
3
+ *
4
+ * `pool.json` is rewritten whole on every write, so its size is the cost of
5
+ * every claim, heartbeat and completion. Finished WorkItems and ended claims
6
+ * were never removed (13 MB, 5,600 claims, 1,100 verified items). This moves
7
+ * them out of the live pool into the dated archive file
8
+ * (`task-pool/archive/pool-archive-YYYY-MM-DD.json`, the same file the
9
+ * one-time ticket-loop archive writes):
10
+ *
11
+ * - a WorkItem in a terminal status (`verified`, `done`, `failed`,
12
+ * `cancelled`) finished more than the retention ago;
13
+ * - an ended claim (`released` / `revoked`) whose WorkItem is terminal and
14
+ * finished more than the retention ago, or whose WorkItem is no longer in
15
+ * the pool at all (an orphan).
16
+ *
17
+ * Never moved: active or expiring claims, claims on a live WorkItem (the
18
+ * attempt history of an unfinished item is still read), non-terminal items.
19
+ * Nothing is deleted: the archive is written (append-only, merged by id)
20
+ * BEFORE the live pool shrinks, so a crash in between only means the next
21
+ * run moves the same entries again without duplicating them.
22
+ *
23
+ * @module services/task-pool/pool-prune
24
+ */
25
+ import * as path from 'path';
26
+ import { atomicWriteJson, ensureDir } from '../../utils/file-io.utils.js';
27
+ import { POOL_ARCHIVE_CONSTANTS, POOL_PRUNE_CONSTANTS } from '../../constants.js';
28
+ import { archiveFileName, exists, readArchive } from './pool-archive-migration.js';
29
+ const TERMINAL = new Set(POOL_ARCHIVE_CONSTANTS.TERMINAL_STATUSES);
30
+ /**
31
+ * When a finished WorkItem finished: the latest of its completion and last
32
+ * status change, else its creation.
33
+ *
34
+ * @param wi - WorkItem
35
+ * @returns Epoch ms, NaN when no usable date
36
+ */
37
+ function finishedAt(wi) {
38
+ const times = [wi.completedAt, wi.statusChangedAt]
39
+ .map((iso) => (iso ? Date.parse(iso) : NaN))
40
+ .filter((t) => Number.isFinite(t));
41
+ if (times.length > 0)
42
+ return Math.max(...times);
43
+ return Date.parse(wi.createdAt);
44
+ }
45
+ /**
46
+ * Select what leaves the live pool (pure).
47
+ *
48
+ * @param items - Every WorkItem in the pool
49
+ * @param claims - Every claim in the pool
50
+ * @param now - Current time (ms)
51
+ * @param retentionMs - How long finished entries stay
52
+ * @returns The WorkItems and claims to archive
53
+ */
54
+ export function selectPrunable(items, claims, now, retentionMs = POOL_PRUNE_CONSTANTS.RETENTION_MS) {
55
+ const oldTerminal = new Set();
56
+ const live = new Set();
57
+ const workItems = [];
58
+ for (const wi of items) {
59
+ live.add(wi.id);
60
+ const t = finishedAt(wi);
61
+ // Unparseable dates: kept. Only what can be proven old moves.
62
+ if (TERMINAL.has(wi.status) && Number.isFinite(t) && now - t >= retentionMs) {
63
+ oldTerminal.add(wi.id);
64
+ workItems.push(wi);
65
+ }
66
+ }
67
+ const prunedClaims = claims.filter((c) => (c.status === 'released' || c.status === 'revoked') && (oldTerminal.has(c.workItemId) || !live.has(c.workItemId)));
68
+ return { workItems, claims: prunedClaims };
69
+ }
70
+ /**
71
+ * Archive-then-remove what {@link selectPrunable} selects.
72
+ *
73
+ * @param pool - The live pool (PoolStorage)
74
+ * @param options - Clock, retention and logger
75
+ * @returns Counts
76
+ * @throws When the archive cannot be written — the live pool is untouched then
77
+ */
78
+ export async function runPoolPrune(pool, options = {}) {
79
+ const now = options.now ?? new Date();
80
+ const items = [...(await pool.getWorkItems())];
81
+ const claims = [...(await pool.getClaims())];
82
+ const selected = selectPrunable(items, claims, now.getTime(), options.retentionMs);
83
+ if (selected.workItems.length === 0 && selected.claims.length === 0) {
84
+ return { items: 0, claims: 0, itemsKept: items.length, claimsKept: claims.length };
85
+ }
86
+ const archiveDir = path.join(pool.getDataDir(), POOL_ARCHIVE_CONSTANTS.ARCHIVE_DIRNAME);
87
+ await ensureDir(archiveDir);
88
+ let archiveFile = path.join(archiveDir, archiveFileName(now));
89
+ let existing = { version: 1, runs: [], workItems: [] };
90
+ if (await exists(archiveFile)) {
91
+ const read = await readArchive(archiveFile);
92
+ if (read) {
93
+ existing = read;
94
+ }
95
+ else {
96
+ // Unreadable archive: never overwrite it, write beside it instead.
97
+ archiveFile = archiveFile.replace(/\.json$/, `-${now.getTime()}.json`);
98
+ options.logger?.warn('Existing pool archive is unreadable — writing a new file beside it', { archiveFile });
99
+ }
100
+ }
101
+ const knownItems = new Set(existing.workItems.map((w) => w.id));
102
+ const knownClaims = new Set((existing.claims ?? []).map((c) => c.id));
103
+ const newItems = selected.workItems.filter((w) => !knownItems.has(w.id));
104
+ const newClaims = selected.claims.filter((c) => !knownClaims.has(c.id));
105
+ const next = {
106
+ version: 1,
107
+ runs: [
108
+ ...existing.runs,
109
+ { archivedAt: now.toISOString(), migration: 'pool-prune', added: newItems.length, addedClaims: newClaims.length },
110
+ ],
111
+ workItems: [...existing.workItems, ...newItems.map((w) => ({ ...w, archiveReason: 'terminal' }))],
112
+ claims: [...(existing.claims ?? []), ...newClaims],
113
+ };
114
+ // Archive first: only once it is on disk do the entries leave the pool.
115
+ await atomicWriteJson(archiveFile, next);
116
+ const removedItems = await pool.removeWorkItems(new Set(selected.workItems.map((w) => w.id)));
117
+ const removedClaims = await pool.removeClaims(new Set(selected.claims.map((c) => c.id)));
118
+ await pool.flush();
119
+ const result = {
120
+ items: removedItems,
121
+ claims: removedClaims,
122
+ itemsKept: items.length - removedItems,
123
+ claimsKept: claims.length - removedClaims,
124
+ archiveFile,
125
+ };
126
+ options.logger?.info('Task pool pruned: finished items and ended claims moved to the archive', { ...result });
127
+ return result;
128
+ }
129
+ //# sourceMappingURL=pool-prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-prune.js","sourceRoot":"","sources":["../../../../../../backend/src/services/task-pool/pool-prune.ts"],"names":[],"mappings":"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"}
@@ -31,7 +31,7 @@ export interface PoolStorageOptions {
31
31
  * Persists task pool state to a JSON file with atomic writes.
32
32
  *
33
33
  * Uses the same patterns as the rest of the Crewly backend:
34
- * - {@link atomicWriteJson} for crash-safe writes
34
+ * - {@link atomicWriteFile} for crash-safe writes
35
35
  * - {@link modifyJsonFile} for locked read-modify-write cycles
36
36
  * - Debounced flushing to reduce disk I/O under burst writes
37
37
  */
@@ -128,6 +128,14 @@ export declare class PoolStorage {
128
128
  * @returns How many were removed
129
129
  */
130
130
  removeWorkItems(workItemIds: ReadonlySet<string>): Promise<number>;
131
+ /**
132
+ * Removes several claims at once (in place, one flush scheduled). Used by
133
+ * the pool prune, which writes them to the archive first.
134
+ *
135
+ * @param claimIds - IDs to remove
136
+ * @returns How many were removed
137
+ */
138
+ removeClaims(claimIds: ReadonlySet<string>): Promise<number>;
131
139
  /**
132
140
  * Directory the pool file lives in (`~/.crewly/task-pool` by default).
133
141
  *
@@ -1 +1 @@
1
- {"version":3,"file":"pool-storage.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/task-pool/pool-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAS/D;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,2CAA2C;IAC3C,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,uCAAuC;IACvC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAmBD;;;;;;;GAOG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC,wDAAwD;IACxD,OAAO,CAAC,KAAK,CAAyB;IAEtC,iDAAiD;IACjD,OAAO,CAAC,UAAU,CAA+B;IAEjD,kCAAkC;IAClC,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,CAAC,EAAE,kBAAkB;IAYxC;;;;;;;;;;;;OAYG;IACG,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC;IAsB/B;;;;;;;OAOG;IACG,YAAY,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAKzC;;;;;;;OAOG;IACG,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAKvC;;;;;OAKG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAKrE;;;;;OAKG;IACG,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAOnF;;;;;OAKG;IACG,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAO7E;;;;OAIG;IACG,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpD;;;;;;OAMG;IACG,cAAc,CAClB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,GAC9B,OAAO,CAAC,OAAO,CAAC;IAWnB;;;;;OAKG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1D;;;;;;;OAOG;IACG,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAcxE;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAIpB;;;;OAIG;IACG,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C;;;;;;OAMG;IACG,WAAW,CACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAClC,OAAO,CAAC,OAAO,CAAC;IASnB;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B;;OAEG;IACH,OAAO,CAAC,SAAS;CAUlB;AAMD;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,QAAQ,CAM9C"}
1
+ {"version":3,"file":"pool-storage.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/task-pool/pool-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAS/D;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,2CAA2C;IAC3C,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,uCAAuC;IACvC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAmBD;;;;;;;GAOG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC,wDAAwD;IACxD,OAAO,CAAC,KAAK,CAAyB;IAEtC,iDAAiD;IACjD,OAAO,CAAC,UAAU,CAA+B;IAEjD,kCAAkC;IAClC,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,CAAC,EAAE,kBAAkB;IAYxC;;;;;;;;;;;;OAYG;IACG,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC;IAsB/B;;;;;;;OAOG;IACG,YAAY,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAKzC;;;;;;;OAOG;IACG,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAKvC;;;;;OAKG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAKrE;;;;;OAKG;IACG,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAOnF;;;;;OAKG;IACG,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAO7E;;;;OAIG;IACG,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpD;;;;;;OAMG;IACG,cAAc,CAClB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,GAC9B,OAAO,CAAC,OAAO,CAAC;IAWnB;;;;;OAKG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1D;;;;;;;OAOG;IACG,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAcxE;;;;;;OAMG;IACG,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAalE;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAIpB;;;;OAIG;IACG,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C;;;;;;OAMG;IACG,WAAW,CACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAClC,OAAO,CAAC,OAAO,CAAC;IASnB;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B;;OAEG;IACH,OAAO,CAAC,SAAS;CAUlB;AAMD;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,QAAQ,CAM9C"}
@@ -8,7 +8,7 @@
8
8
  * @module services/task-pool/pool-storage
9
9
  */
10
10
  import * as path from 'path';
11
- import { ensureDir, safeReadJson, atomicWriteJson, } from '../../utils/file-io.utils.js';
11
+ import { ensureDir, safeReadJson, atomicWriteFile, } from '../../utils/file-io.utils.js';
12
12
  import { LoggerService } from '../core/logger.service.js';
13
13
  import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
14
14
  import { traceWorkItemCreated, traceWorkItemStatus } from '../trace/trace-recorder.js';
@@ -28,7 +28,7 @@ const WRITE_DEBOUNCE_MS = 500;
28
28
  * Persists task pool state to a JSON file with atomic writes.
29
29
  *
30
30
  * Uses the same patterns as the rest of the Crewly backend:
31
- * - {@link atomicWriteJson} for crash-safe writes
31
+ * - {@link atomicWriteFile} for crash-safe writes
32
32
  * - {@link modifyJsonFile} for locked read-modify-write cycles
33
33
  * - Debounced flushing to reduce disk I/O under burst writes
34
34
  */
@@ -200,6 +200,26 @@ export class PoolStorage {
200
200
  this.markDirty();
201
201
  return removed;
202
202
  }
203
+ /**
204
+ * Removes several claims at once (in place, one flush scheduled). Used by
205
+ * the pool prune, which writes them to the archive first.
206
+ *
207
+ * @param claimIds - IDs to remove
208
+ * @returns How many were removed
209
+ */
210
+ async removeClaims(claimIds) {
211
+ const data = await this.load();
212
+ let removed = 0;
213
+ for (let i = data.claims.length - 1; i >= 0; i--) {
214
+ if (claimIds.has(data.claims[i].id)) {
215
+ data.claims.splice(i, 1);
216
+ removed += 1;
217
+ }
218
+ }
219
+ if (removed > 0)
220
+ this.markDirty();
221
+ return removed;
222
+ }
203
223
  /**
204
224
  * Directory the pool file lives in (`~/.crewly/task-pool` by default).
205
225
  *
@@ -246,8 +266,19 @@ export class PoolStorage {
246
266
  if (!this.dirty || !this.cache)
247
267
  return;
248
268
  this.cache.lastUpdatedAt = new Date().toISOString();
249
- await atomicWriteJson(this.filePath, this.cache);
269
+ // Cleared BEFORE the write: a change made while it runs sets the flag
270
+ // again and gets its own flush. Clearing it after would swallow that
271
+ // change until the next unrelated write.
250
272
  this.dirty = false;
273
+ try {
274
+ // Compact JSON: the pretty-printed file was twice the size and the
275
+ // whole-file rewrite is the cost of every pool write (crewly#1108).
276
+ await atomicWriteFile(this.filePath, JSON.stringify(this.cache));
277
+ }
278
+ catch (err) {
279
+ this.dirty = true;
280
+ throw err;
281
+ }
251
282
  this.logger.debug?.('Pool data flushed to disk', { path: this.filePath });
252
283
  }
253
284
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"pool-storage.js","sourceRoot":"","sources":["../../../../../../backend/src/services/task-pool/pool-storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pool-storage.js","sourceRoot":"","sources":["../../../../../../backend/src/services/task-pool/pool-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Short, redacted excerpt of a terminal screen for owner-facing alerts.
3
+ *
4
+ * When an agent's input box cannot be read, the owner is asked to look at
5
+ * it. A few readable rows (a permission dialog, a bare shell prompt) usually
6
+ * answer "what is it stuck on" without opening the terminal. The rows can
7
+ * hold secrets, so every row goes through the secret redactor, long opaque
8
+ * tokens are masked, and the excerpt is capped in rows and characters.
9
+ *
10
+ * @module screen-excerpt
11
+ */
12
+ /** Rows kept (bottom-most non-empty ones) */
13
+ export declare const SCREEN_EXCERPT_MAX_ROWS = 6;
14
+ /** Characters kept per row */
15
+ export declare const SCREEN_EXCERPT_MAX_ROW_CHARS = 100;
16
+ /** Characters kept in total */
17
+ export declare const SCREEN_EXCERPT_MAX_CHARS = 420;
18
+ /**
19
+ * Build the excerpt from a screen's rows.
20
+ *
21
+ * @param lines - Screen rows, top to bottom
22
+ * @returns The bottom rows, redacted and trimmed, joined by newlines ('' when blank)
23
+ */
24
+ export declare function redactedScreenExcerpt(lines: readonly string[]): string;
25
+ /**
26
+ * Whether the last row looks like a bare shell prompt (`user@host dir %`,
27
+ * `$ `, `# `): the agent's runtime has exited to the shell, so there is no
28
+ * input box to read.
29
+ *
30
+ * @param excerpt - An excerpt from {@link redactedScreenExcerpt}
31
+ * @returns True for a shell prompt
32
+ */
33
+ export declare function looksLikeShellPrompt(excerpt: string): boolean;
34
+ //# sourceMappingURL=screen-excerpt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-excerpt.d.ts","sourceRoot":"","sources":["../../../../../backend/src/utils/screen-excerpt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,6CAA6C;AAC7C,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,8BAA8B;AAC9B,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAChD,+BAA+B;AAC/B,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAO5C;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAatE;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG7D"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Short, redacted excerpt of a terminal screen for owner-facing alerts.
3
+ *
4
+ * When an agent's input box cannot be read, the owner is asked to look at
5
+ * it. A few readable rows (a permission dialog, a bare shell prompt) usually
6
+ * answer "what is it stuck on" without opening the terminal. The rows can
7
+ * hold secrets, so every row goes through the secret redactor, long opaque
8
+ * tokens are masked, and the excerpt is capped in rows and characters.
9
+ *
10
+ * @module screen-excerpt
11
+ */
12
+ import { redactSecrets } from './secret-redactor.js';
13
+ /** Rows kept (bottom-most non-empty ones) */
14
+ export const SCREEN_EXCERPT_MAX_ROWS = 6;
15
+ /** Characters kept per row */
16
+ export const SCREEN_EXCERPT_MAX_ROW_CHARS = 100;
17
+ /** Characters kept in total */
18
+ export const SCREEN_EXCERPT_MAX_CHARS = 420;
19
+ /** Long opaque runs (keys, hashes, base64) the pattern-based redactor may not know */
20
+ const OPAQUE_RUN_RE = /[A-Za-z0-9_\-+/=]{24,}/g;
21
+ /** Credentials inside URLs: scheme://user:pass@host */
22
+ const URL_CREDENTIALS_RE = /(\b[a-z][a-z0-9+.-]*:\/\/)[^\s/@]+:[^\s/@]+@/gi;
23
+ /**
24
+ * Build the excerpt from a screen's rows.
25
+ *
26
+ * @param lines - Screen rows, top to bottom
27
+ * @returns The bottom rows, redacted and trimmed, joined by newlines ('' when blank)
28
+ */
29
+ export function redactedScreenExcerpt(lines) {
30
+ const rows = lines
31
+ .map((l) => l.replace(/\s+$/u, ''))
32
+ .filter((l) => l.trim() !== '')
33
+ .slice(-SCREEN_EXCERPT_MAX_ROWS)
34
+ .map((l) => {
35
+ const masked = redactSecrets(l).replace(URL_CREDENTIALS_RE, '$1[redacted]@').replace(OPAQUE_RUN_RE, '[redacted]');
36
+ const trimmed = masked.trim();
37
+ return trimmed.length > SCREEN_EXCERPT_MAX_ROW_CHARS ? `${trimmed.slice(0, SCREEN_EXCERPT_MAX_ROW_CHARS - 1)}…` : trimmed;
38
+ });
39
+ let out = rows.join('\n');
40
+ if (out.length > SCREEN_EXCERPT_MAX_CHARS)
41
+ out = `…${out.slice(out.length - SCREEN_EXCERPT_MAX_CHARS + 1)}`;
42
+ return out;
43
+ }
44
+ /**
45
+ * Whether the last row looks like a bare shell prompt (`user@host dir %`,
46
+ * `$ `, `# `): the agent's runtime has exited to the shell, so there is no
47
+ * input box to read.
48
+ *
49
+ * @param excerpt - An excerpt from {@link redactedScreenExcerpt}
50
+ * @returns True for a shell prompt
51
+ */
52
+ export function looksLikeShellPrompt(excerpt) {
53
+ const last = excerpt.split('\n').pop() ?? '';
54
+ return /^(?:\S+@\S+\s.*)?[%$#]$/u.test(last.trim()) || /^\S+@\S+\s+\S+\s+[%$#]$/u.test(last.trim());
55
+ }
56
+ //# sourceMappingURL=screen-excerpt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-excerpt.js","sourceRoot":"","sources":["../../../../../backend/src/utils/screen-excerpt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,6CAA6C;AAC7C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,8BAA8B;AAC9B,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAChD,+BAA+B;AAC/B,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAE5C,sFAAsF;AACtF,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAChD,uDAAuD;AACvD,MAAM,kBAAkB,GAAG,gDAAgD,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAwB;IAC7D,MAAM,IAAI,GAAG,KAAK;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;SAC9B,KAAK,CAAC,CAAC,uBAAuB,CAAC;SAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACV,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QAClH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,MAAM,GAAG,4BAA4B,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,4BAA4B,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3H,CAAC,CAAC,CAAC;IACJ,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,GAAG,CAAC,MAAM,GAAG,wBAAwB;QAAE,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,wBAAwB,GAAG,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC7C,OAAO,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACrG,CAAC"}
@@ -1,4 +1,4 @@
1
1
  {
2
- "commit": "c914cb7ddfe4cc9d7eaedb5b44a9fad5c34373d4",
3
- "builtAt": "2026-10-11T03:10:58.019Z"
2
+ "commit": "0dbe7570ee3faa20ecda700f12b74dc479f2653c",
3
+ "builtAt": "2026-10-11T03:42:42.410Z"
4
4
  }
@@ -5833,6 +5833,18 @@ export declare const POOL_ARCHIVE_CONSTANTS: {
5833
5833
  /** Terminal statuses that are archived once old enough */
5834
5834
  readonly TERMINAL_STATUSES: readonly ["verified", "done", "failed", "cancelled"];
5835
5835
  };
5836
+ /**
5837
+ * Ongoing pruning of the task pool (crewly#1108). The pool file is rewritten
5838
+ * whole on every write, and finished items and ended claims were never
5839
+ * removed (13 MB, 5,600 claims): writes queued behind each other. Old
5840
+ * finished items and ended claims move to the dated archive file.
5841
+ */
5842
+ export declare const POOL_PRUNE_CONSTANTS: {
5843
+ /** A finished item (and the ended claims on it) is kept in the live pool this long (ms) */
5844
+ readonly RETENTION_MS: number;
5845
+ /** How often the prune runs after boot (ms) */
5846
+ readonly INTERVAL_MS: number;
5847
+ };
5836
5848
  /**
5837
5849
  * Harness onboarding (specs/onboarding-harness-login.md): detect, install and
5838
5850
  * log in to the agent CLIs ("harnesses") Crewly drives — Claude Code, Codex