crewly 1.20.360 → 1.20.362
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/roles/team-leader/prompt.md +1 -1
- package/config/roles/team-leader/tl-addon.md +1 -1
- package/config/skills/team-leader/delegate-task/SKILL.md +21 -6
- package/config/skills/team-leader/delegate-task/execute.sh +12 -1
- package/dist/backend/backend/src/constants.d.ts +155 -6
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +155 -6
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +7 -4
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +58 -3
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/agent/boot-pressure.d.ts +19 -3
- package/dist/backend/backend/src/services/agent/boot-pressure.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/boot-pressure.js +30 -7
- package/dist/backend/backend/src/services/agent/boot-pressure.js.map +1 -1
- package/dist/backend/backend/src/services/agent/follow-through.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/follow-through.wiring.js +2 -0
- package/dist/backend/backend/src/services/agent/follow-through.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/agent/handover-interrupted.d.ts +76 -0
- package/dist/backend/backend/src/services/agent/handover-interrupted.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/handover-interrupted.js +139 -0
- package/dist/backend/backend/src/services/agent/handover-interrupted.js.map +1 -0
- package/dist/backend/backend/src/services/agent/handover-pointers.d.ts +4 -0
- package/dist/backend/backend/src/services/agent/handover-pointers.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/handover-pointers.js +11 -4
- package/dist/backend/backend/src/services/agent/handover-pointers.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-work-guard.d.ts +3 -1
- package/dist/backend/backend/src/services/agent/idle-work-guard.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-work-guard.js +2 -0
- package/dist/backend/backend/src/services/agent/idle-work-guard.js.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode-protection.d.ts +5 -1
- package/dist/backend/backend/src/services/agent/resource-mode-protection.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode-protection.js +6 -1
- package/dist/backend/backend/src/services/agent/resource-mode-protection.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +7 -0
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +18 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.d.ts +8 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.js +10 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.js.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts +43 -2
- package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-item-extractor.js +124 -13
- package/dist/backend/backend/src/services/open-items/open-item-extractor.js.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +40 -1
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.service.js +76 -3
- package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.wiring.d.ts +8 -0
- package/dist/backend/backend/src/services/open-items/open-items.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.wiring.js +19 -1
- package/dist/backend/backend/src/services/open-items/open-items.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts +35 -19
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.js +60 -63
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.d.ts +86 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.js +170 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.js.map +1 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.d.ts +24 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.js +38 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.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 +8 -3
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts +76 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.js +83 -3
- package/dist/backend/backend/src/services/orc/work-item-destination.js.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts +31 -2
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js +38 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/stall/background-run-detector.d.ts +56 -0
- package/dist/backend/backend/src/services/stall/background-run-detector.d.ts.map +1 -0
- package/dist/backend/backend/src/services/stall/background-run-detector.js +93 -0
- package/dist/backend/backend/src/services/stall/background-run-detector.js.map +1 -0
- package/dist/backend/backend/src/services/stall/claim-check.d.ts +60 -0
- package/dist/backend/backend/src/services/stall/claim-check.d.ts.map +1 -0
- package/dist/backend/backend/src/services/stall/claim-check.js +98 -0
- package/dist/backend/backend/src/services/stall/claim-check.js.map +1 -0
- package/dist/backend/backend/src/services/stall/in-flight-runs.store.d.ts +110 -0
- package/dist/backend/backend/src/services/stall/in-flight-runs.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/stall/in-flight-runs.store.js +109 -0
- package/dist/backend/backend/src/services/stall/in-flight-runs.store.js.map +1 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.service.d.ts +456 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.service.js +854 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.service.js.map +1 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.wiring.d.ts +98 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.wiring.js +217 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +53 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +162 -15
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/tl-delegation/tl-delegation.service.js +1 -1
- package/dist/backend/backend/src/services/tl-delegation/tl-delegation.service.js.map +1 -1
- package/dist/backend/backend/src/types/v2/open-item.types.d.ts +2 -0
- package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +155 -6
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +155 -6
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/boot-pressure.d.ts +19 -3
- package/dist/cli/backend/src/services/agent/boot-pressure.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/boot-pressure.js +30 -7
- package/dist/cli/backend/src/services/agent/boot-pressure.js.map +1 -1
- package/dist/cli/backend/src/services/agent/handover-interrupted.d.ts +76 -0
- package/dist/cli/backend/src/services/agent/handover-interrupted.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/handover-interrupted.js +139 -0
- package/dist/cli/backend/src/services/agent/handover-interrupted.js.map +1 -0
- package/dist/cli/backend/src/services/agent/handover-pointers.d.ts +4 -0
- package/dist/cli/backend/src/services/agent/handover-pointers.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/handover-pointers.js +11 -4
- package/dist/cli/backend/src/services/agent/handover-pointers.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +7 -0
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +18 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.d.ts +8 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.js +10 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.js.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts +43 -2
- package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-item-extractor.js +124 -13
- package/dist/cli/backend/src/services/open-items/open-item-extractor.js.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-items.service.d.ts +40 -1
- package/dist/cli/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-items.service.js +76 -3
- package/dist/cli/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/cli/backend/src/services/orc/work-item-destination.d.ts +76 -0
- package/dist/cli/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orc/work-item-destination.js +83 -3
- package/dist/cli/backend/src/services/orc/work-item-destination.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +53 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +162 -15
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts +2 -0
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
export interface BootPressureSnapshot {
|
|
16
16
|
usedPercent: number;
|
|
17
17
|
freeMB: number;
|
|
18
|
+
/** Physical memory; scales the free floor on small machines (0 or absent: not scaled) */
|
|
19
|
+
totalMB?: number;
|
|
18
20
|
swapUsedPercent: number;
|
|
19
21
|
osPressure: boolean;
|
|
20
22
|
/** ResourceModeService is in pressure mode */
|
|
@@ -33,11 +35,25 @@ export interface BootPressureThresholds {
|
|
|
33
35
|
* @returns Effective thresholds
|
|
34
36
|
*/
|
|
35
37
|
export declare function bootPressureThresholds(env?: NodeJS.ProcessEnv): BootPressureThresholds;
|
|
38
|
+
/**
|
|
39
|
+
* The free-memory floor for this machine: the configured floor, capped at
|
|
40
|
+
* MIN_FREE_FRACTION of physical memory. A fixed 3 GB floor reads an 8 GB
|
|
41
|
+
* laptop as tight on every boot (2026-10-17: the Air held Fern back while
|
|
42
|
+
* its own health check said memory was fine).
|
|
43
|
+
*
|
|
44
|
+
* @param snapshot - Reading (its totalMB scales the floor)
|
|
45
|
+
* @param thresholds - Effective thresholds
|
|
46
|
+
* @returns Floor in MB
|
|
47
|
+
*/
|
|
48
|
+
export declare function effectiveMinFreeMB(snapshot: BootPressureSnapshot, thresholds: BootPressureThresholds): number;
|
|
36
49
|
/**
|
|
37
50
|
* Why the snapshot is tight for the boot, or null when it is calm. Tight:
|
|
38
|
-
* pressure mode,
|
|
39
|
-
*
|
|
40
|
-
*
|
|
51
|
+
* pressure mode, the OS pressure flag, free memory under the floor, or swap
|
|
52
|
+
* at or above the threshold while free memory is also under twice the
|
|
53
|
+
* floor. Swap fill alone does not count: macOS grows its swap file on
|
|
54
|
+
* demand, so a small swap file sits near full on a healthy machine. An
|
|
55
|
+
* unreadable snapshot (null) is calm: a boot must not stall on a reading
|
|
56
|
+
* that failed.
|
|
41
57
|
*
|
|
42
58
|
* @param snapshot - Reading, or null when unavailable
|
|
43
59
|
* @param thresholds - Effective thresholds
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boot-pressure.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/boot-pressure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,oEAAoE;AACpE,MAAM,WAAW,oBAAoB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,8CAA8C;IAC9C,YAAY,EAAE,OAAO,CAAC;CACtB;AAED,2DAA2D;AAC3D,MAAM,WAAW,sBAAsB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACxB;AAcD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,sBAAsB,CAMnG;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,EACrC,UAAU,GAAE,sBAAiD,GAC3D,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"boot-pressure.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/boot-pressure.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,11 +38,29 @@ export function bootPressureThresholds(env = process.env) {
|
|
|
38
38
|
launchSpacingMs: envInt(env[BOOT_PRESSURE_CONSTANTS.ENV_LAUNCH_SPACING_MS], BOOT_PRESSURE_CONSTANTS.MIN_LAUNCH_SPACING_MS),
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* The free-memory floor for this machine: the configured floor, capped at
|
|
43
|
+
* MIN_FREE_FRACTION of physical memory. A fixed 3 GB floor reads an 8 GB
|
|
44
|
+
* laptop as tight on every boot (2026-10-17: the Air held Fern back while
|
|
45
|
+
* its own health check said memory was fine).
|
|
46
|
+
*
|
|
47
|
+
* @param snapshot - Reading (its totalMB scales the floor)
|
|
48
|
+
* @param thresholds - Effective thresholds
|
|
49
|
+
* @returns Floor in MB
|
|
50
|
+
*/
|
|
51
|
+
export function effectiveMinFreeMB(snapshot, thresholds) {
|
|
52
|
+
if (!snapshot.totalMB || snapshot.totalMB <= 0)
|
|
53
|
+
return thresholds.minFreeMB;
|
|
54
|
+
return Math.min(thresholds.minFreeMB, Math.round(snapshot.totalMB * BOOT_PRESSURE_CONSTANTS.MIN_FREE_FRACTION));
|
|
55
|
+
}
|
|
41
56
|
/**
|
|
42
57
|
* Why the snapshot is tight for the boot, or null when it is calm. Tight:
|
|
43
|
-
* pressure mode,
|
|
44
|
-
*
|
|
45
|
-
*
|
|
58
|
+
* pressure mode, the OS pressure flag, free memory under the floor, or swap
|
|
59
|
+
* at or above the threshold while free memory is also under twice the
|
|
60
|
+
* floor. Swap fill alone does not count: macOS grows its swap file on
|
|
61
|
+
* demand, so a small swap file sits near full on a healthy machine. An
|
|
62
|
+
* unreadable snapshot (null) is calm: a boot must not stall on a reading
|
|
63
|
+
* that failed.
|
|
46
64
|
*
|
|
47
65
|
* @param snapshot - Reading, or null when unavailable
|
|
48
66
|
* @param thresholds - Effective thresholds
|
|
@@ -51,13 +69,17 @@ export function bootPressureThresholds(env = process.env) {
|
|
|
51
69
|
export function bootPressureReason(snapshot, thresholds = bootPressureThresholds()) {
|
|
52
70
|
if (!snapshot)
|
|
53
71
|
return null;
|
|
72
|
+
const floor = effectiveMinFreeMB(snapshot, thresholds);
|
|
54
73
|
const why = [];
|
|
55
74
|
if (snapshot.pressureMode)
|
|
56
75
|
why.push('pressure mode');
|
|
57
|
-
if (snapshot.
|
|
58
|
-
why.push(
|
|
59
|
-
if (snapshot.freeMB <
|
|
60
|
-
why.push(`free ${snapshot.freeMB}MB < ${
|
|
76
|
+
if (snapshot.osPressure)
|
|
77
|
+
why.push('OS memory pressure');
|
|
78
|
+
if (snapshot.freeMB < floor)
|
|
79
|
+
why.push(`free ${snapshot.freeMB}MB < ${floor}MB`);
|
|
80
|
+
else if (snapshot.swapUsedPercent >= thresholds.swapUsedPercent && snapshot.freeMB < floor * 2) {
|
|
81
|
+
why.push(`swap ${snapshot.swapUsedPercent}% >= ${thresholds.swapUsedPercent}% with free ${snapshot.freeMB}MB < ${floor * 2}MB`);
|
|
82
|
+
}
|
|
61
83
|
if (why.length === 0)
|
|
62
84
|
return null;
|
|
63
85
|
return `${why.join(', ')} (used=${snapshot.usedPercent}% free=${snapshot.freeMB}MB swap=${snapshot.swapUsedPercent}% osPressure=${snapshot.osPressure})`;
|
|
@@ -77,6 +99,7 @@ export function readBootPressureSnapshot() {
|
|
|
77
99
|
return {
|
|
78
100
|
usedPercent: mem.usedPercent,
|
|
79
101
|
freeMB: mem.freeMB,
|
|
102
|
+
totalMB: mem.totalMB,
|
|
80
103
|
swapUsedPercent: mem.swapUsedPercent ?? 0,
|
|
81
104
|
osPressure: mem.pressureElevated === true,
|
|
82
105
|
pressureMode: rm.getMode() === 'pressure',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boot-pressure.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/boot-pressure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"boot-pressure.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/boot-pressure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Work a restart cut off inside an agent's Claude Code conversation
|
|
3
|
+
* (crewly#1361). A `tool_use` block whose `tool_use_id` never received a
|
|
4
|
+
* `tool_result` before the transcript ends was still running when the process
|
|
5
|
+
* died: a sub-agent (Task / Agent tool) or a background / long-running shell
|
|
6
|
+
* command. Neither survives the restart, but the agent's last words in the
|
|
7
|
+
* transcript say the work is "still in progress", so a resumed agent waited on
|
|
8
|
+
* it for 16 hours. The handover lists these calls as interrupted, near its
|
|
9
|
+
* top and again under "Open work", so the new conversation restarts them or
|
|
10
|
+
* reports them lost instead of waiting.
|
|
11
|
+
*
|
|
12
|
+
* @module services/agent/handover-interrupted
|
|
13
|
+
*/
|
|
14
|
+
/** A `tool_use` block of the transcript that has not received its result (yet). */
|
|
15
|
+
export interface PendingToolCall {
|
|
16
|
+
/** `tool_use.id` */
|
|
17
|
+
id: string;
|
|
18
|
+
/** Tool name ("Task", "Agent", "Bash", …) */
|
|
19
|
+
name: string;
|
|
20
|
+
/** `tool_use.input` as recorded */
|
|
21
|
+
input: unknown;
|
|
22
|
+
}
|
|
23
|
+
/** One interrupted call, as the handover describes it. */
|
|
24
|
+
export interface InterruptedWork {
|
|
25
|
+
kind: 'sub-agent' | 'background-command';
|
|
26
|
+
/** What it was doing: the sub-agent's description and prompt head, or the command head (clipped) */
|
|
27
|
+
text: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Whether a pending call is long-running work that dies with the process: a
|
|
31
|
+
* sub-agent, or a shell command run in the background or that looks like a
|
|
32
|
+
* render / encode / build ({@link HANDOVER_CONSTANTS.LONG_COMMAND_PATTERN}).
|
|
33
|
+
* A short command that merely had no result yet (the last `cat` before the
|
|
34
|
+
* cut) is not listed: nothing was lost but its output.
|
|
35
|
+
*
|
|
36
|
+
* @param call - Pending tool call
|
|
37
|
+
* @returns The interrupted work it stands for, or null
|
|
38
|
+
*/
|
|
39
|
+
export declare function interruptedFromCall(call: PendingToolCall): InterruptedWork | null;
|
|
40
|
+
/**
|
|
41
|
+
* The interrupted work among the calls still pending at the end of a
|
|
42
|
+
* transcript, oldest first, at most {@link HANDOVER_CONSTANTS.INTERRUPTED_MAX_ITEMS}.
|
|
43
|
+
*
|
|
44
|
+
* @param pending - Tool calls without a result, in transcript order
|
|
45
|
+
* @returns Interrupted sub-agents and background commands
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* interruptedWork([{ id: 't1', name: 'Task', input: { description: 'Make v4', prompt: '…' } }])
|
|
49
|
+
* // → [{ kind: 'sub-agent', text: 'Make v4: …' }]
|
|
50
|
+
*/
|
|
51
|
+
export declare function interruptedWork(pending: readonly PendingToolCall[]): InterruptedWork[];
|
|
52
|
+
/**
|
|
53
|
+
* One bullet of the section.
|
|
54
|
+
*
|
|
55
|
+
* @param item - Interrupted work
|
|
56
|
+
* @returns The line
|
|
57
|
+
*/
|
|
58
|
+
export declare function interruptedLine(item: InterruptedWork): string;
|
|
59
|
+
/**
|
|
60
|
+
* The "Interrupted by the restart" section of a handover: factual, one bullet
|
|
61
|
+
* per call, nothing about mechanics.
|
|
62
|
+
*
|
|
63
|
+
* @param items - Interrupted work
|
|
64
|
+
* @returns Markdown, or '' when nothing was interrupted
|
|
65
|
+
*/
|
|
66
|
+
export declare function formatInterruptedSection(items: readonly InterruptedWork[]): string;
|
|
67
|
+
/**
|
|
68
|
+
* Read the interrupted work back out of a handover body that carries the
|
|
69
|
+
* section (the pointers header is written by a different module and lists
|
|
70
|
+
* the same items under "Open work").
|
|
71
|
+
*
|
|
72
|
+
* @param body - Handover body
|
|
73
|
+
* @returns The items, in order; [] when the section is absent
|
|
74
|
+
*/
|
|
75
|
+
export declare function interruptedFromHandoverBody(body: string): InterruptedWork[];
|
|
76
|
+
//# sourceMappingURL=handover-interrupted.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handover-interrupted.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/handover-interrupted.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,mFAAmF;AACnF,MAAM,WAAW,eAAe;IAC/B,oBAAoB;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,KAAK,EAAE,OAAO,CAAC;CACf;AAED,0DAA0D;AAC1D,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,WAAW,GAAG,oBAAoB,CAAC;IACzC,oGAAoG;IACpG,IAAI,EAAE,MAAM,CAAC;CACb;AA2BD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,eAAe,GAAG,eAAe,GAAG,IAAI,CAcjF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,GAAG,eAAe,EAAE,CAQtF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAI7D;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,CAGlF;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAe3E"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Work a restart cut off inside an agent's Claude Code conversation
|
|
3
|
+
* (crewly#1361). A `tool_use` block whose `tool_use_id` never received a
|
|
4
|
+
* `tool_result` before the transcript ends was still running when the process
|
|
5
|
+
* died: a sub-agent (Task / Agent tool) or a background / long-running shell
|
|
6
|
+
* command. Neither survives the restart, but the agent's last words in the
|
|
7
|
+
* transcript say the work is "still in progress", so a resumed agent waited on
|
|
8
|
+
* it for 16 hours. The handover lists these calls as interrupted, near its
|
|
9
|
+
* top and again under "Open work", so the new conversation restarts them or
|
|
10
|
+
* reports them lost instead of waiting.
|
|
11
|
+
*
|
|
12
|
+
* @module services/agent/handover-interrupted
|
|
13
|
+
*/
|
|
14
|
+
import { HANDOVER_CONSTANTS } from '../../constants.js';
|
|
15
|
+
const C = HANDOVER_CONSTANTS;
|
|
16
|
+
/**
|
|
17
|
+
* Clip to one line of at most {@link HANDOVER_CONSTANTS.INTERRUPTED_TEXT_MAX_CHARS}
|
|
18
|
+
* characters, without a trailing full stop (the bullet adds its own sentence).
|
|
19
|
+
*
|
|
20
|
+
* @param text - Text
|
|
21
|
+
* @returns One line
|
|
22
|
+
*/
|
|
23
|
+
function clip(text) {
|
|
24
|
+
const flat = text.replace(/\s+/g, ' ').trim().replace(/[.。]+$/u, '');
|
|
25
|
+
return flat.length > C.INTERRUPTED_TEXT_MAX_CHARS ? `${flat.slice(0, C.INTERRUPTED_TEXT_MAX_CHARS)}…` : flat;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A string field of a tool input object, or ''.
|
|
29
|
+
*
|
|
30
|
+
* @param input - `tool_use.input`
|
|
31
|
+
* @param key - Field name
|
|
32
|
+
* @returns The field when it is a string
|
|
33
|
+
*/
|
|
34
|
+
function field(input, key) {
|
|
35
|
+
if (!input || typeof input !== 'object')
|
|
36
|
+
return '';
|
|
37
|
+
const v = input[key];
|
|
38
|
+
return typeof v === 'string' ? v : '';
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Whether a pending call is long-running work that dies with the process: a
|
|
42
|
+
* sub-agent, or a shell command run in the background or that looks like a
|
|
43
|
+
* render / encode / build ({@link HANDOVER_CONSTANTS.LONG_COMMAND_PATTERN}).
|
|
44
|
+
* A short command that merely had no result yet (the last `cat` before the
|
|
45
|
+
* cut) is not listed: nothing was lost but its output.
|
|
46
|
+
*
|
|
47
|
+
* @param call - Pending tool call
|
|
48
|
+
* @returns The interrupted work it stands for, or null
|
|
49
|
+
*/
|
|
50
|
+
export function interruptedFromCall(call) {
|
|
51
|
+
if (C.SUBAGENT_TOOLS.includes(call.name)) {
|
|
52
|
+
const description = field(call.input, 'description');
|
|
53
|
+
const prompt = field(call.input, 'prompt');
|
|
54
|
+
const text = clip([description, prompt].filter(Boolean).join(': ') || call.name);
|
|
55
|
+
return { kind: 'sub-agent', text };
|
|
56
|
+
}
|
|
57
|
+
if (C.SHELL_TOOLS.includes(call.name)) {
|
|
58
|
+
const command = field(call.input, 'command');
|
|
59
|
+
const background = !!call.input && typeof call.input === 'object' && call.input.run_in_background === true;
|
|
60
|
+
if (!background && !C.LONG_COMMAND_PATTERN.test(command))
|
|
61
|
+
return null;
|
|
62
|
+
return { kind: 'background-command', text: clip(command || call.name) };
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The interrupted work among the calls still pending at the end of a
|
|
68
|
+
* transcript, oldest first, at most {@link HANDOVER_CONSTANTS.INTERRUPTED_MAX_ITEMS}.
|
|
69
|
+
*
|
|
70
|
+
* @param pending - Tool calls without a result, in transcript order
|
|
71
|
+
* @returns Interrupted sub-agents and background commands
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* interruptedWork([{ id: 't1', name: 'Task', input: { description: 'Make v4', prompt: '…' } }])
|
|
75
|
+
* // → [{ kind: 'sub-agent', text: 'Make v4: …' }]
|
|
76
|
+
*/
|
|
77
|
+
export function interruptedWork(pending) {
|
|
78
|
+
const out = [];
|
|
79
|
+
for (const call of pending) {
|
|
80
|
+
const item = interruptedFromCall(call);
|
|
81
|
+
if (item)
|
|
82
|
+
out.push(item);
|
|
83
|
+
if (out.length >= C.INTERRUPTED_MAX_ITEMS)
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* One bullet of the section.
|
|
90
|
+
*
|
|
91
|
+
* @param item - Interrupted work
|
|
92
|
+
* @returns The line
|
|
93
|
+
*/
|
|
94
|
+
export function interruptedLine(item) {
|
|
95
|
+
return item.kind === 'sub-agent'
|
|
96
|
+
? `${C.SUBAGENT_LINE_PREFIX}${item.text}${C.SUBAGENT_LINE_SUFFIX}`
|
|
97
|
+
: `${C.COMMAND_LINE_PREFIX}${item.text}${C.COMMAND_LINE_SUFFIX}`;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* The "Interrupted by the restart" section of a handover: factual, one bullet
|
|
101
|
+
* per call, nothing about mechanics.
|
|
102
|
+
*
|
|
103
|
+
* @param items - Interrupted work
|
|
104
|
+
* @returns Markdown, or '' when nothing was interrupted
|
|
105
|
+
*/
|
|
106
|
+
export function formatInterruptedSection(items) {
|
|
107
|
+
if (items.length === 0)
|
|
108
|
+
return '';
|
|
109
|
+
return [C.INTERRUPTED_HEADING, '', ...items.map(interruptedLine)].join('\n');
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Read the interrupted work back out of a handover body that carries the
|
|
113
|
+
* section (the pointers header is written by a different module and lists
|
|
114
|
+
* the same items under "Open work").
|
|
115
|
+
*
|
|
116
|
+
* @param body - Handover body
|
|
117
|
+
* @returns The items, in order; [] when the section is absent
|
|
118
|
+
*/
|
|
119
|
+
export function interruptedFromHandoverBody(body) {
|
|
120
|
+
const start = body.indexOf(C.INTERRUPTED_HEADING);
|
|
121
|
+
if (start === -1)
|
|
122
|
+
return [];
|
|
123
|
+
const out = [];
|
|
124
|
+
for (const raw of body.slice(start + C.INTERRUPTED_HEADING.length).split('\n')) {
|
|
125
|
+
const line = raw.trim();
|
|
126
|
+
if (!line)
|
|
127
|
+
continue;
|
|
128
|
+
if (!line.startsWith('- '))
|
|
129
|
+
break;
|
|
130
|
+
if (line.startsWith(C.SUBAGENT_LINE_PREFIX) && line.endsWith(C.SUBAGENT_LINE_SUFFIX)) {
|
|
131
|
+
out.push({ kind: 'sub-agent', text: line.slice(C.SUBAGENT_LINE_PREFIX.length, line.length - C.SUBAGENT_LINE_SUFFIX.length) });
|
|
132
|
+
}
|
|
133
|
+
else if (line.startsWith(C.COMMAND_LINE_PREFIX) && line.endsWith(C.COMMAND_LINE_SUFFIX)) {
|
|
134
|
+
out.push({ kind: 'background-command', text: line.slice(C.COMMAND_LINE_PREFIX.length, line.length - C.COMMAND_LINE_SUFFIX.length) });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return out;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=handover-interrupted.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handover-interrupted.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/handover-interrupted.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,6 +49,10 @@ export declare function suggestedSkillsFor(role?: string): string[];
|
|
|
49
49
|
* Prepend the pointer header to a handover body. Does nothing when the body
|
|
50
50
|
* already starts with one (chained handovers carry no second copy).
|
|
51
51
|
*
|
|
52
|
+
* Work the restart interrupted (a sub-agent or background command the body's
|
|
53
|
+
* "Interrupted by the restart" section lists, crewly#1361) is repeated under
|
|
54
|
+
* "Open work": it is the agent's to restart or report, not background.
|
|
55
|
+
*
|
|
52
56
|
* @param body - Handover body (the transcript tail)
|
|
53
57
|
* @param opts - Session, optional role, optional CREWLY_HOME and open work override (tests)
|
|
54
58
|
* @returns Header plus body, redacted
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handover-pointers.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/handover-pointers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"handover-pointers.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/handover-pointers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAID;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,GAAE,MAA4B,GAAG,gBAAgB,EAAE,CAkBlH;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKxD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAM1D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAA;CAAE,GAC9F,MAAM,CAYR;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK1D"}
|
|
@@ -12,6 +12,7 @@ import * as path from 'path';
|
|
|
12
12
|
import { redactSecrets } from '../../utils/secret-redactor.js';
|
|
13
13
|
import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
|
|
14
14
|
import { HANDOVER_POINTERS_CONSTANTS } from '../../constants.js';
|
|
15
|
+
import { interruptedFromHandoverBody } from './handover-interrupted.js';
|
|
15
16
|
const C = HANDOVER_POINTERS_CONSTANTS;
|
|
16
17
|
/**
|
|
17
18
|
* Mask secrets (keys, tokens, bearer headers, `NAME=value` secrets) in text
|
|
@@ -85,6 +86,10 @@ export function suggestedSkillsFor(role) {
|
|
|
85
86
|
* Prepend the pointer header to a handover body. Does nothing when the body
|
|
86
87
|
* already starts with one (chained handovers carry no second copy).
|
|
87
88
|
*
|
|
89
|
+
* Work the restart interrupted (a sub-agent or background command the body's
|
|
90
|
+
* "Interrupted by the restart" section lists, crewly#1361) is repeated under
|
|
91
|
+
* "Open work": it is the agent's to restart or report, not background.
|
|
92
|
+
*
|
|
88
93
|
* @param body - Handover body (the transcript tail)
|
|
89
94
|
* @param opts - Session, optional role, optional CREWLY_HOME and open work override (tests)
|
|
90
95
|
* @returns Header plus body, redacted
|
|
@@ -93,13 +98,15 @@ export function withHandoverPointers(body, opts) {
|
|
|
93
98
|
if (body.includes(C.START_MARK))
|
|
94
99
|
return body;
|
|
95
100
|
const open = opts.openWork ?? readOpenWorkSync(opts.sessionName, opts.crewlyHome);
|
|
101
|
+
const interrupted = interruptedFromHandoverBody(body);
|
|
96
102
|
const links = findArtifactLinks(body);
|
|
97
103
|
const lines = [C.START_MARK, '## Open work', ''];
|
|
98
|
-
if (open.length === 0)
|
|
104
|
+
if (open.length === 0 && interrupted.length === 0)
|
|
99
105
|
lines.push('None open for you (no WorkItems in flight).');
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
106
|
+
for (const w of open)
|
|
107
|
+
lines.push(`- ${w.id} — ${w.title} (${w.status})`);
|
|
108
|
+
for (const i of interrupted)
|
|
109
|
+
lines.push(`- Interrupted by the restart (${i.kind === 'sub-agent' ? 'sub-agent' : 'background command'}, not running now): ${i.text}`);
|
|
103
110
|
if (links.length)
|
|
104
111
|
lines.push('', 'Mentioned in the conversation: ' + links.join(', '));
|
|
105
112
|
lines.push('', `## Suggested skills`, '', `Call the Skill tool for: ${suggestedSkillsFor(opts.role).join(', ')}.`, C.END_MARK, '');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handover-pointers.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/handover-pointers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"handover-pointers.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/handover-pointers.ts"],"names":[],"mappings":"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"}
|
|
@@ -251,6 +251,13 @@ export declare function lastTurnContextTokens(filePath: string): number | null;
|
|
|
251
251
|
* (crewly#1344). Images are a described placeholder, never copied. System
|
|
252
252
|
* reminders and command wrappers are left out.
|
|
253
253
|
*
|
|
254
|
+
* A sub-agent or background command whose tool call never got its result
|
|
255
|
+
* before the end of the transcript died with the restart: it is listed first,
|
|
256
|
+
* under {@link HANDOVER_CONSTANTS.INTERRUPTED_HEADING}, so the new
|
|
257
|
+
* conversation does not take the agent's last "still in progress" words for
|
|
258
|
+
* work that is running (crewly#1361). That section is capped on its own
|
|
259
|
+
* (items × characters) and does not count against the body's limit.
|
|
260
|
+
*
|
|
254
261
|
* @param filePath - Transcript path
|
|
255
262
|
* @returns Markdown, newest last; empty when nothing readable was found
|
|
256
263
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-session-recovery.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/runtime-session-recovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;
|
|
1
|
+
{"version":3,"file":"runtime-session-recovery.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/runtime-session-recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,7 @@ import * as path from 'path';
|
|
|
33
33
|
import { randomUUID } from 'crypto';
|
|
34
34
|
import { ANTIGRAVITY_CONSTANTS, RUNTIME_TYPES, ORC_CONVERSATION_CONSTANTS, FRESH_TASK_CONVERSATION_CONSTANTS } from '../../constants.js';
|
|
35
35
|
import { redactHandoverText, stripHandoverPointers, withHandoverPointers } from './handover-pointers.js';
|
|
36
|
+
import { formatInterruptedSection, interruptedWork } from './handover-interrupted.js';
|
|
36
37
|
import { getAntigravityConfigDir } from '../../utils/antigravity-settings.utils.js';
|
|
37
38
|
import { resolveProjectSlugCandidatesSync } from '../monitoring/claude-session-tokens.service.js';
|
|
38
39
|
/**
|
|
@@ -624,6 +625,13 @@ function toolResultText(content) {
|
|
|
624
625
|
* (crewly#1344). Images are a described placeholder, never copied. System
|
|
625
626
|
* reminders and command wrappers are left out.
|
|
626
627
|
*
|
|
628
|
+
* A sub-agent or background command whose tool call never got its result
|
|
629
|
+
* before the end of the transcript died with the restart: it is listed first,
|
|
630
|
+
* under {@link HANDOVER_CONSTANTS.INTERRUPTED_HEADING}, so the new
|
|
631
|
+
* conversation does not take the agent's last "still in progress" words for
|
|
632
|
+
* work that is running (crewly#1361). That section is capped on its own
|
|
633
|
+
* (items × characters) and does not count against the body's limit.
|
|
634
|
+
*
|
|
627
635
|
* @param filePath - Transcript path
|
|
628
636
|
* @returns Markdown, newest last; empty when nothing readable was found
|
|
629
637
|
*/
|
|
@@ -648,6 +656,8 @@ export function buildHandoverSummary(filePath) {
|
|
|
648
656
|
const clip = ORC_CONVERSATION_CONSTANTS.HANDOVER_MESSAGE_CHARS;
|
|
649
657
|
const toolClip = ORC_CONVERSATION_CONSTANTS.HANDOVER_TOOL_RESULT_CHARS;
|
|
650
658
|
const toolNames = new Map();
|
|
659
|
+
// Calls still waiting for their result when the transcript ends (insertion order = transcript order).
|
|
660
|
+
const pending = new Map();
|
|
651
661
|
const said = [];
|
|
652
662
|
for (const line of text.split('\n')) {
|
|
653
663
|
if (!line.trim())
|
|
@@ -676,8 +686,10 @@ export function buildHandoverSummary(filePath) {
|
|
|
676
686
|
tools.push('↳ [image attached]');
|
|
677
687
|
else if (block.type === 'tool_use') {
|
|
678
688
|
const name = typeof block.name === 'string' ? block.name : 'tool';
|
|
679
|
-
if (typeof block.id === 'string')
|
|
689
|
+
if (typeof block.id === 'string') {
|
|
680
690
|
toolNames.set(block.id, name);
|
|
691
|
+
pending.set(block.id, { id: block.id, name, input: block.input });
|
|
692
|
+
}
|
|
681
693
|
let input = '';
|
|
682
694
|
try {
|
|
683
695
|
input = typeof block.input === 'string' ? block.input : JSON.stringify(block.input ?? '');
|
|
@@ -688,6 +700,8 @@ export function buildHandoverSummary(filePath) {
|
|
|
688
700
|
tools.push(`↳ ${name}: ${oneLine(input, toolClip)}`);
|
|
689
701
|
}
|
|
690
702
|
else if (block.type === 'tool_result') {
|
|
703
|
+
if (typeof block.tool_use_id === 'string')
|
|
704
|
+
pending.delete(block.tool_use_id);
|
|
691
705
|
const name = (typeof block.tool_use_id === 'string' && toolNames.get(block.tool_use_id)) || 'tool';
|
|
692
706
|
const result = toolResultText(block.content);
|
|
693
707
|
const parts = [result.text ? oneLine(result.text, toolClip) : '', result.images > 0 ? `[${result.images} image${result.images === 1 ? '' : 's'} returned]` : '']
|
|
@@ -720,6 +734,9 @@ export function buildHandoverSummary(filePath) {
|
|
|
720
734
|
blocks.unshift(b);
|
|
721
735
|
total += b.length;
|
|
722
736
|
}
|
|
737
|
+
const interrupted = formatInterruptedSection(interruptedWork([...pending.values()]));
|
|
738
|
+
if (interrupted)
|
|
739
|
+
blocks.unshift(interrupted);
|
|
723
740
|
// A token pasted into the conversation must not be copied into a plain file
|
|
724
741
|
// (and from there into every later handover).
|
|
725
742
|
return redactHandoverText(blocks.join('\n\n'));
|