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.
- package/config/skills/_common/lib.sh +6 -0
- package/config/skills/agent/core/complete-task/SKILL.md +4 -2
- package/config/skills/agent/core/complete-task/execute.sh +7 -0
- package/config/skills/agent/core/complete-task/explicit-id.test.sh +56 -0
- package/config/skills/agent/core/poll-tasks/execute.sh +13 -1
- package/config/skills/agent/core/poll-tasks/execute.test.sh +37 -0
- package/config/skills/team-leader/delegate-task/execute.sh +13 -2
- package/config/skills/team-leader/verify-output/SKILL.md +9 -0
- package/dist/backend/backend/src/constants.d.ts +12 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +12 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +28 -8
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +28 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +30 -5
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +18 -4
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +36 -8
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts +6 -0
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.js +18 -0
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.js.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts +2 -0
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +81 -8
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts +8 -0
- package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js +22 -0
- package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-command-helper.d.ts +17 -0
- package/dist/backend/backend/src/services/session/session-command-helper.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/session-command-helper.js +32 -0
- package/dist/backend/backend/src/services/session/session-command-helper.js.map +1 -1
- package/dist/backend/backend/src/services/slack/orc-owner-dm-target.d.ts +27 -0
- package/dist/backend/backend/src/services/slack/orc-owner-dm-target.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/orc-owner-dm-target.js +48 -0
- package/dist/backend/backend/src/services/slack/orc-owner-dm-target.js.map +1 -0
- package/dist/backend/backend/src/services/task-pool/pool-archive-migration.d.ts +18 -0
- package/dist/backend/backend/src/services/task-pool/pool-archive-migration.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/pool-archive-migration.js +9 -3
- package/dist/backend/backend/src/services/task-pool/pool-archive-migration.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/pool-prune.d.ts +76 -0
- package/dist/backend/backend/src/services/task-pool/pool-prune.d.ts.map +1 -0
- package/dist/backend/backend/src/services/task-pool/pool-prune.js +129 -0
- package/dist/backend/backend/src/services/task-pool/pool-prune.js.map +1 -0
- package/dist/backend/backend/src/services/task-pool/pool-storage.d.ts +9 -1
- package/dist/backend/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/pool-storage.js +34 -3
- package/dist/backend/backend/src/services/task-pool/pool-storage.js.map +1 -1
- package/dist/backend/backend/src/utils/screen-excerpt.d.ts +34 -0
- package/dist/backend/backend/src/utils/screen-excerpt.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/screen-excerpt.js +56 -0
- package/dist/backend/backend/src/utils/screen-excerpt.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +12 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +12 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +18 -4
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +36 -8
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/cli/backend/src/services/session/session-command-helper.d.ts +17 -0
- package/dist/cli/backend/src/services/session/session-command-helper.d.ts.map +1 -1
- package/dist/cli/backend/src/services/session/session-command-helper.js +32 -0
- package/dist/cli/backend/src/services/session/session-command-helper.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/pool-storage.d.ts +9 -1
- package/dist/cli/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/pool-storage.js +34 -3
- package/dist/cli/backend/src/services/task-pool/pool-storage.js.map +1 -1
- package/dist/cli/backend/src/utils/screen-excerpt.d.ts +34 -0
- package/dist/cli/backend/src/utils/screen-excerpt.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/screen-excerpt.js +56 -0
- package/dist/cli/backend/src/utils/screen-excerpt.js.map +1 -0
- 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
|
|
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;
|
|
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,
|
|
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
|
|
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
|
-
|
|
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":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EACL,SAAS,EACT,YAAY,EACZ,eAAe,GAEhB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAwB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AA0BvF,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,6DAA6D;AAC7D,MAAM,aAAa,GAAG,WAAW,CAAC;AAElC,mCAAmC;AACnC,MAAM,cAAc,GAAG,WAAW,CAAC;AAEnC,kDAAkD;AAClD,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,OAAO,WAAW;IACL,QAAQ,CAAS;IACjB,MAAM,CAAkB;IAEzC,wDAAwD;IAChD,KAAK,GAAoB,IAAI,CAAC;IAEtC,iDAAiD;IACzC,UAAU,GAA0B,IAAI,CAAC;IAEjD,kCAAkC;IAC1B,KAAK,GAAG,KAAK,CAAC;IAEtB,YAAY,OAA4B;QACtC,MAAM,OAAO,GACX,OAAO,EAAE,OAAO;YAChB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,aAAa,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACjF,CAAC;IAED,0EAA0E;IAC1E,aAAa;IACb,0EAA0E;IAE1E;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC;QAElC,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,YAAY,CAC5B,IAAI,CAAC,QAAQ,EACb,mBAAmB,EAAE,EACrB,IAAI,CAAC,MAAM,CACZ,CAAC;QACF,+DAA+D;QAC/D,kEAAkE;QAClE,kEAAkE;QAClE,oCAAoC;QACpC,MAAM,UAAU,GAAa;YAC3B,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;YAC7D,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YACpD,aAAa,EAAE,GAAG,EAAE,aAAa,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;SAC/D,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;QACxB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,UAAkB;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;IAC3D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,yBAAyB,CAAC,UAAkB;QAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACrB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CAC5D,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,sBAAsB,CAAC,OAAe;QAC1C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACrB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CACtD,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,QAAkB;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,cAAc,CAClB,UAAkB,EAClB,OAA+B;QAE/B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,mBAAmB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAAC,UAAkB;QACrC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;QACnE,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,eAAe,CAAC,WAAgC;QACpD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,wDAAwD;QACxD,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpD,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5B,OAAO,IAAI,CAAC,CAAC;YACf,CAAC;QACH,CAAC;QACD,IAAI,OAAO,GAAG,CAAC;YAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,KAAgB;QAC7B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,CACf,OAAe,EACf,OAAmC;QAEnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QAEvC,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;
|
|
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"}
|
|
@@ -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
|