@duetso/agent 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -11
- package/dist/package.json +4 -4
- package/dist/src/cli/config.d.ts +10 -0
- package/dist/src/cli/config.d.ts.map +1 -0
- package/dist/src/cli/config.js +24 -0
- package/dist/src/cli/config.js.map +1 -0
- package/dist/src/cli/help.d.ts.map +1 -1
- package/dist/src/cli/help.js +13 -10
- package/dist/src/cli/help.js.map +1 -1
- package/dist/src/cli/inline-slash.d.ts +2 -1
- package/dist/src/cli/inline-slash.d.ts.map +1 -1
- package/dist/src/cli/inline-slash.js +14 -5
- package/dist/src/cli/inline-slash.js.map +1 -1
- package/dist/src/cli/memory-db.d.ts.map +1 -1
- package/dist/src/cli/memory-db.js +9 -5
- package/dist/src/cli/memory-db.js.map +1 -1
- package/dist/src/cli/memory-query.d.ts +1 -1
- package/dist/src/cli/model.d.ts +1 -1
- package/dist/src/cli/model.d.ts.map +1 -1
- package/dist/src/cli/model.js +1 -1
- package/dist/src/cli/model.js.map +1 -1
- package/dist/src/cli/route.d.ts +84 -0
- package/dist/src/cli/route.d.ts.map +1 -0
- package/dist/src/cli/route.js +261 -0
- package/dist/src/cli/route.js.map +1 -0
- package/dist/src/cli/rpc.d.ts +43 -2
- package/dist/src/cli/rpc.d.ts.map +1 -1
- package/dist/src/cli/rpc.js +176 -23
- package/dist/src/cli/rpc.js.map +1 -1
- package/dist/src/cli/run.d.ts +8 -1
- package/dist/src/cli/run.d.ts.map +1 -1
- package/dist/src/cli/run.js +24 -7
- package/dist/src/cli/run.js.map +1 -1
- package/dist/src/cli/shared.d.ts +4 -3
- package/dist/src/cli/shared.d.ts.map +1 -1
- package/dist/src/cli/shared.js +3 -4
- package/dist/src/cli/shared.js.map +1 -1
- package/dist/src/cli/shutdown.d.ts +4 -2
- package/dist/src/cli/shutdown.d.ts.map +1 -1
- package/dist/src/cli/shutdown.js +4 -2
- package/dist/src/cli/shutdown.js.map +1 -1
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +12 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/core/structured-output.d.ts +2 -0
- package/dist/src/core/structured-output.d.ts.map +1 -1
- package/dist/src/core/structured-output.js +1 -0
- package/dist/src/core/structured-output.js.map +1 -1
- package/dist/src/lib/system-reminder.d.ts +14 -0
- package/dist/src/lib/system-reminder.d.ts.map +1 -0
- package/dist/src/lib/system-reminder.js +53 -0
- package/dist/src/lib/system-reminder.js.map +1 -0
- package/dist/src/lib/walk-ancestors.d.ts +9 -0
- package/dist/src/lib/walk-ancestors.d.ts.map +1 -0
- package/dist/src/lib/walk-ancestors.js +28 -0
- package/dist/src/lib/walk-ancestors.js.map +1 -0
- package/dist/src/memory/observational-prompts.d.ts.map +1 -1
- package/dist/src/memory/observational-prompts.js +2 -1
- package/dist/src/memory/observational-prompts.js.map +1 -1
- package/dist/src/memory/observational.d.ts +31 -4
- package/dist/src/memory/observational.d.ts.map +1 -1
- package/dist/src/memory/observational.js +43 -4
- package/dist/src/memory/observational.js.map +1 -1
- package/dist/src/model-resolution/catalog.d.ts +2 -2
- package/dist/src/model-resolution/catalog.d.ts.map +1 -1
- package/dist/src/model-resolution/catalog.js +61 -33
- package/dist/src/model-resolution/catalog.js.map +1 -1
- package/dist/src/model-resolution/duet-gateway.d.ts +3 -3
- package/dist/src/model-resolution/duet-gateway.d.ts.map +1 -1
- package/dist/src/model-resolution/duet-gateway.js +119 -19
- package/dist/src/model-resolution/duet-gateway.js.map +1 -1
- package/dist/src/model-resolution/model-gateway.d.ts.map +1 -0
- package/dist/src/{cli → model-resolution}/model-gateway.js +10 -6
- package/dist/src/model-resolution/model-gateway.js.map +1 -0
- package/dist/src/model-resolution/resolver.d.ts +11 -4
- package/dist/src/model-resolution/resolver.d.ts.map +1 -1
- package/dist/src/model-resolution/resolver.js +39 -8
- package/dist/src/model-resolution/resolver.js.map +1 -1
- package/dist/src/model-routing/advisor-transcript.d.ts +36 -0
- package/dist/src/model-routing/advisor-transcript.d.ts.map +1 -0
- package/dist/src/model-routing/advisor-transcript.js +103 -0
- package/dist/src/model-routing/advisor-transcript.js.map +1 -0
- package/dist/src/model-routing/advisor.d.ts +27 -0
- package/dist/src/model-routing/advisor.d.ts.map +1 -0
- package/dist/src/model-routing/advisor.js +20 -0
- package/dist/src/model-routing/advisor.js.map +1 -0
- package/dist/src/model-routing/classifier.d.ts +57 -0
- package/dist/src/model-routing/classifier.d.ts.map +1 -0
- package/dist/src/model-routing/classifier.js +63 -0
- package/dist/src/model-routing/classifier.js.map +1 -0
- package/dist/src/model-routing/loader.d.ts +48 -0
- package/dist/src/model-routing/loader.d.ts.map +1 -0
- package/dist/src/model-routing/loader.js +79 -0
- package/dist/src/model-routing/loader.js.map +1 -0
- package/dist/src/model-routing/prompts.d.ts +22 -0
- package/dist/src/model-routing/prompts.d.ts.map +1 -0
- package/dist/src/model-routing/prompts.js +87 -0
- package/dist/src/model-routing/prompts.js.map +1 -0
- package/dist/src/model-routing/resolve.d.ts +40 -0
- package/dist/src/model-routing/resolve.d.ts.map +1 -0
- package/dist/src/model-routing/resolve.js +76 -0
- package/dist/src/model-routing/resolve.js.map +1 -0
- package/dist/src/model-routing/router.d.ts +149 -0
- package/dist/src/model-routing/router.d.ts.map +1 -0
- package/dist/src/model-routing/router.js +235 -0
- package/dist/src/model-routing/router.js.map +1 -0
- package/dist/src/model-routing/step-triggers.d.ts +27 -0
- package/dist/src/model-routing/step-triggers.d.ts.map +1 -0
- package/dist/src/model-routing/step-triggers.js +20 -0
- package/dist/src/model-routing/step-triggers.js.map +1 -0
- package/dist/src/model-routing/table.d.ts +126 -0
- package/dist/src/model-routing/table.d.ts.map +1 -0
- package/dist/src/model-routing/table.js +351 -0
- package/dist/src/model-routing/table.js.map +1 -0
- package/dist/src/session/session.d.ts +40 -23
- package/dist/src/session/session.d.ts.map +1 -1
- package/dist/src/session/session.js +173 -97
- package/dist/src/session/session.js.map +1 -1
- package/dist/src/tasks/quiescence.d.ts +13 -0
- package/dist/src/tasks/quiescence.d.ts.map +1 -0
- package/dist/src/tasks/quiescence.js +11 -0
- package/dist/src/tasks/quiescence.js.map +1 -0
- package/dist/src/tasks/task-manager.d.ts +101 -0
- package/dist/src/tasks/task-manager.d.ts.map +1 -0
- package/dist/src/tasks/task-manager.js +311 -0
- package/dist/src/tasks/task-manager.js.map +1 -0
- package/dist/src/tasks/types.d.ts +85 -0
- package/dist/src/tasks/types.d.ts.map +1 -0
- package/dist/src/tasks/types.js +2 -0
- package/dist/src/tasks/types.js.map +1 -0
- package/dist/src/train/archive.d.ts +3 -0
- package/dist/src/train/archive.d.ts.map +1 -1
- package/dist/src/train/archive.js +7 -3
- package/dist/src/train/archive.js.map +1 -1
- package/dist/src/train/types.d.ts +7 -2
- package/dist/src/train/types.d.ts.map +1 -1
- package/dist/src/tui/app.d.ts +1 -1
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +12 -2
- package/dist/src/tui/app.js.map +1 -1
- package/dist/src/tui/initial-prompt.d.ts.map +1 -1
- package/dist/src/tui/initial-prompt.js +0 -3
- package/dist/src/tui/initial-prompt.js.map +1 -1
- package/dist/src/tui/session-subscription.d.ts +3 -0
- package/dist/src/tui/session-subscription.d.ts.map +1 -1
- package/dist/src/tui/session-subscription.js +29 -5
- package/dist/src/tui/session-subscription.js.map +1 -1
- package/dist/src/tui/sidebar.d.ts +3 -0
- package/dist/src/tui/sidebar.d.ts.map +1 -1
- package/dist/src/tui/sidebar.js +19 -3
- package/dist/src/tui/sidebar.js.map +1 -1
- package/dist/src/tui/slash-commands.d.ts +12 -9
- package/dist/src/tui/slash-commands.d.ts.map +1 -1
- package/dist/src/tui/slash-commands.js +48 -10
- package/dist/src/tui/slash-commands.js.map +1 -1
- package/dist/src/tui/status-controller.d.ts +14 -9
- package/dist/src/tui/status-controller.d.ts.map +1 -1
- package/dist/src/tui/status-controller.js +26 -7
- package/dist/src/tui/status-controller.js.map +1 -1
- package/dist/src/tui/task-lane-renderer.d.ts +30 -0
- package/dist/src/tui/task-lane-renderer.d.ts.map +1 -0
- package/dist/src/tui/task-lane-renderer.js +93 -0
- package/dist/src/tui/task-lane-renderer.js.map +1 -0
- package/dist/src/tui/task-tree.d.ts +47 -0
- package/dist/src/tui/task-tree.d.ts.map +1 -0
- package/dist/src/tui/task-tree.js +190 -0
- package/dist/src/tui/task-tree.js.map +1 -0
- package/dist/src/tui/tool-formatters.js +3 -0
- package/dist/src/tui/tool-formatters.js.map +1 -1
- package/dist/src/turn-runner/agent-events.d.ts.map +1 -1
- package/dist/src/turn-runner/agent-events.js +1 -0
- package/dist/src/turn-runner/agent-events.js.map +1 -1
- package/dist/src/turn-runner/duration.d.ts +2 -2
- package/dist/src/turn-runner/duration.js +3 -3
- package/dist/src/turn-runner/duration.js.map +1 -1
- package/dist/src/turn-runner/prompts.d.ts +5 -1
- package/dist/src/turn-runner/prompts.d.ts.map +1 -1
- package/dist/src/turn-runner/prompts.js +30 -6
- package/dist/src/turn-runner/prompts.js.map +1 -1
- package/dist/src/turn-runner/runtime-clock.d.ts +20 -0
- package/dist/src/turn-runner/runtime-clock.d.ts.map +1 -0
- package/dist/src/turn-runner/runtime-clock.js +38 -0
- package/dist/src/turn-runner/runtime-clock.js.map +1 -0
- package/dist/src/turn-runner/shell-state-handle.d.ts +0 -3
- package/dist/src/turn-runner/shell-state-handle.d.ts.map +1 -1
- package/dist/src/turn-runner/shell-state-handle.js +5 -55
- package/dist/src/turn-runner/shell-state-handle.js.map +1 -1
- package/dist/src/turn-runner/skill-context.d.ts +6 -7
- package/dist/src/turn-runner/skill-context.d.ts.map +1 -1
- package/dist/src/turn-runner/skill-context.js +10 -10
- package/dist/src/turn-runner/skill-context.js.map +1 -1
- package/dist/src/turn-runner/skills.d.ts.map +1 -1
- package/dist/src/turn-runner/skills.js +2 -22
- package/dist/src/turn-runner/skills.js.map +1 -1
- package/dist/src/turn-runner/state-compaction.d.ts +7 -5
- package/dist/src/turn-runner/state-compaction.d.ts.map +1 -1
- package/dist/src/turn-runner/state-compaction.js +69 -10
- package/dist/src/turn-runner/state-compaction.js.map +1 -1
- package/dist/src/turn-runner/state-machine-decisions.d.ts +135 -0
- package/dist/src/turn-runner/state-machine-decisions.d.ts.map +1 -0
- package/dist/src/turn-runner/state-machine-decisions.js +443 -0
- package/dist/src/turn-runner/state-machine-decisions.js.map +1 -0
- package/dist/src/turn-runner/state-machine-session.d.ts +13 -28
- package/dist/src/turn-runner/state-machine-session.d.ts.map +1 -1
- package/dist/src/turn-runner/state-machine-session.js +18 -55
- package/dist/src/turn-runner/state-machine-session.js.map +1 -1
- package/dist/src/turn-runner/subagent.d.ts +156 -0
- package/dist/src/turn-runner/subagent.d.ts.map +1 -0
- package/dist/src/turn-runner/subagent.js +164 -0
- package/dist/src/turn-runner/subagent.js.map +1 -0
- package/dist/src/turn-runner/task-tools.d.ts +76 -0
- package/dist/src/turn-runner/task-tools.d.ts.map +1 -0
- package/dist/src/turn-runner/task-tools.js +370 -0
- package/dist/src/turn-runner/task-tools.js.map +1 -0
- package/dist/src/turn-runner/tools.d.ts +65 -17
- package/dist/src/turn-runner/tools.d.ts.map +1 -1
- package/dist/src/turn-runner/tools.js +173 -59
- package/dist/src/turn-runner/tools.js.map +1 -1
- package/dist/src/turn-runner/turn-runner.d.ts +198 -134
- package/dist/src/turn-runner/turn-runner.d.ts.map +1 -1
- package/dist/src/turn-runner/turn-runner.js +1302 -713
- package/dist/src/turn-runner/turn-runner.js.map +1 -1
- package/dist/src/turn-runner/usage-accounting.d.ts +4 -0
- package/dist/src/turn-runner/usage-accounting.d.ts.map +1 -1
- package/dist/src/turn-runner/usage-accounting.js +19 -0
- package/dist/src/turn-runner/usage-accounting.js.map +1 -1
- package/dist/src/types/config.d.ts +9 -1
- package/dist/src/types/config.d.ts.map +1 -1
- package/dist/src/types/config.js +2 -1
- package/dist/src/types/config.js.map +1 -1
- package/dist/src/types/protocol.d.ts +110 -30
- package/dist/src/types/protocol.d.ts.map +1 -1
- package/dist/src/types/state-machine.d.ts +10 -12
- package/dist/src/types/state-machine.d.ts.map +1 -1
- package/dist/src/types/state-machine.js.map +1 -1
- package/package.json +4 -4
- package/dist/src/cli/model-gateway.d.ts.map +0 -1
- package/dist/src/cli/model-gateway.js.map +0 -1
- package/dist/src/turn-runner/state-machine-controller.d.ts +0 -140
- package/dist/src/turn-runner/state-machine-controller.d.ts.map +0 -1
- package/dist/src/turn-runner/state-machine-controller.js +0 -501
- package/dist/src/turn-runner/state-machine-controller.js.map +0 -1
- /package/dist/src/{cli → model-resolution}/model-gateway.d.ts +0 -0
|
@@ -12,12 +12,10 @@ export interface StatusControllerOptions {
|
|
|
12
12
|
* selection segments. */
|
|
13
13
|
hint: TextRenderable;
|
|
14
14
|
/**
|
|
15
|
-
* Re-paints
|
|
16
|
-
* elapsed
|
|
17
|
-
* with the working-status line. Provided externally because the tool
|
|
18
|
-
* block map lives with the step renderer, not the status controller.
|
|
15
|
+
* Re-paints in-flight parent tool blocks and the sibling task tree with
|
|
16
|
+
* fresh elapsed counters. Their maps live outside this controller.
|
|
19
17
|
*/
|
|
20
|
-
|
|
18
|
+
refreshActiveWork: () => void;
|
|
21
19
|
}
|
|
22
20
|
/**
|
|
23
21
|
* Owns the "is a turn running?" surface of the TUI: the working-status line,
|
|
@@ -48,6 +46,7 @@ export declare class StatusController {
|
|
|
48
46
|
private workingTicker;
|
|
49
47
|
private workingMessage;
|
|
50
48
|
private queuedFollowUps;
|
|
49
|
+
private heldAwakeBy;
|
|
51
50
|
private pendingImageCount;
|
|
52
51
|
private lastSelectionText;
|
|
53
52
|
private terminal;
|
|
@@ -71,6 +70,12 @@ export declare class StatusController {
|
|
|
71
70
|
getWorkingStartedAt(): number | undefined;
|
|
72
71
|
setWorkingMessage(message: string): void;
|
|
73
72
|
setQueuedFollowUps(count: number): void;
|
|
73
|
+
/**
|
|
74
|
+
* Project the in-process task set onto the chrome. A non-empty set is a
|
|
75
|
+
* direct guarantee that the turn is still open; an empty set never marks
|
|
76
|
+
* idle because only a real terminal can close the turn.
|
|
77
|
+
*/
|
|
78
|
+
setHeldAwakeTasks(taskIds: readonly string[], startedAt?: number): void;
|
|
74
79
|
/** Mirror of the most recent drag-selection text. Stored here so the hint
|
|
75
80
|
* row can advertise the copy keystroke only while something is selectable;
|
|
76
81
|
* the canonical selection state lives in `runTui`. */
|
|
@@ -79,11 +84,11 @@ export declare class StatusController {
|
|
|
79
84
|
* the attachment count without dragging the whole `PendingImage[]` into
|
|
80
85
|
* the controller. */
|
|
81
86
|
setPendingImageCount(count: number): void;
|
|
82
|
-
markRunning(): void;
|
|
83
|
-
/** Settle the working-status surface and
|
|
84
|
-
*
|
|
87
|
+
markRunning(startedAt?: number): void;
|
|
88
|
+
/** Settle the working-status surface and record the terminal event that
|
|
89
|
+
* ended the turn. The terminal is exposed via `lastTerminal()`
|
|
85
90
|
* so `runTui` can return it to its caller after renderer teardown. */
|
|
86
|
-
markIdle(terminal
|
|
91
|
+
markIdle(terminal: TurnTerminalEvent): void;
|
|
87
92
|
/** Subscribe to running-state transitions. The listener is invoked with
|
|
88
93
|
* the new running value on every flip; idempotent calls (markIdle while
|
|
89
94
|
* already idle) are suppressed. Returns an unsubscribe handle. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-controller.d.ts","sourceRoot":"","sources":["../../../src/tui/status-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAStE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IACtC;;mEAE+D;IAC/D,QAAQ,EAAE,WAAW,CAAC;IACtB;qCACiC;IACjC,MAAM,EAAE,cAAc,CAAC;IACvB;8BAC0B;IAC1B,IAAI,EAAE,cAAc,CAAC;IACrB
|
|
1
|
+
{"version":3,"file":"status-controller.d.ts","sourceRoot":"","sources":["../../../src/tui/status-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAStE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IACtC;;mEAE+D;IAC/D,QAAQ,EAAE,WAAW,CAAC;IACtB;qCACiC;IACjC,MAAM,EAAE,cAAc,CAAC;IACvB;8BAC0B;IAC1B,IAAI,EAAE,cAAc,CAAC;IACrB;;;OAGG;IACH,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,gBAAgB;IAqBf,OAAO,CAAC,QAAQ,CAAC,IAAI;IApBjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB;;;kEAG8D;IAC9D,OAAO,CAAC,iBAAiB,CAAS;IAClC;;4EAEwE;IACxE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyC;IAC1E,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,aAAa,CAA6C;IAClE,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,iBAAiB,CAAM;IAC/B,OAAO,CAAC,QAAQ,CAAgC;gBAEnB,IAAI,EAAE,uBAAuB;IAE1D,SAAS,IAAI,OAAO;IAIpB,2EAA2E;IAC3E,mBAAmB,IAAI,OAAO;IAI9B;;;iEAG6D;IAC7D,eAAe,IAAI,IAAI;IAOvB;;oDAEgD;IAChD,gBAAgB,IAAI,IAAI;IAQxB,YAAY,IAAI,iBAAiB,GAAG,SAAS;IAI7C;;gEAE4D;IAC5D,mBAAmB,IAAI,MAAM,GAAG,SAAS;IAIzC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKxC,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKvC;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IASvE;;2DAEuD;IACvD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKpC;;0BAEsB;IACtB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzC,WAAW,CAAC,SAAS,SAAa,GAAG,IAAI;IAWzC;;2EAEuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAa3C;;uEAEmE;IACnE,eAAe,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAKjE,OAAO,CAAC,mBAAmB;IAW3B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAoB7B;;;uEAGmE;IACnE,WAAW,IAAI,IAAI;IAkBnB,oBAAoB,IAAI,IAAI;IAmB5B;;6EAEyE;IACzE,QAAQ,IAAI,IAAI;IAKhB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,cAAc;CAIvB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMhD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
|
@@ -29,6 +29,7 @@ export class StatusController {
|
|
|
29
29
|
workingTicker;
|
|
30
30
|
workingMessage = "working…";
|
|
31
31
|
queuedFollowUps = 0;
|
|
32
|
+
heldAwakeBy = [];
|
|
32
33
|
pendingImageCount = 0;
|
|
33
34
|
lastSelectionText = "";
|
|
34
35
|
terminal;
|
|
@@ -82,6 +83,20 @@ export class StatusController {
|
|
|
82
83
|
this.queuedFollowUps = count;
|
|
83
84
|
this.refreshWorkingStatus();
|
|
84
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Project the in-process task set onto the chrome. A non-empty set is a
|
|
88
|
+
* direct guarantee that the turn is still open; an empty set never marks
|
|
89
|
+
* idle because only a real terminal can close the turn.
|
|
90
|
+
*/
|
|
91
|
+
setHeldAwakeTasks(taskIds, startedAt) {
|
|
92
|
+
const changed = taskIds.length !== this.heldAwakeBy.length ||
|
|
93
|
+
taskIds.some((taskId, index) => taskId !== this.heldAwakeBy[index]);
|
|
94
|
+
this.heldAwakeBy = [...taskIds];
|
|
95
|
+
if (taskIds.length > 0 && !this.running)
|
|
96
|
+
this.markRunning(startedAt);
|
|
97
|
+
else if (changed)
|
|
98
|
+
this.refreshWorkingStatus();
|
|
99
|
+
}
|
|
85
100
|
/** Mirror of the most recent drag-selection text. Stored here so the hint
|
|
86
101
|
* row can advertise the copy keystroke only while something is selectable;
|
|
87
102
|
* the canonical selection state lives in `runTui`. */
|
|
@@ -96,28 +111,28 @@ export class StatusController {
|
|
|
96
111
|
this.pendingImageCount = count;
|
|
97
112
|
this.refreshHint();
|
|
98
113
|
}
|
|
99
|
-
markRunning() {
|
|
114
|
+
markRunning(startedAt = Date.now()) {
|
|
100
115
|
const wasRunning = this.running;
|
|
101
116
|
this.running = true;
|
|
102
117
|
this.workingMessage = "working…";
|
|
103
|
-
this.workingStartedAt =
|
|
118
|
+
this.workingStartedAt = startedAt;
|
|
104
119
|
this.refreshHint();
|
|
105
120
|
this.refreshWorkingStatus();
|
|
106
121
|
this.startWorkingTicker();
|
|
107
122
|
if (!wasRunning)
|
|
108
123
|
this.notifyRunningChange(true);
|
|
109
124
|
}
|
|
110
|
-
/** Settle the working-status surface and
|
|
111
|
-
*
|
|
125
|
+
/** Settle the working-status surface and record the terminal event that
|
|
126
|
+
* ended the turn. The terminal is exposed via `lastTerminal()`
|
|
112
127
|
* so `runTui` can return it to its caller after renderer teardown. */
|
|
113
128
|
markIdle(terminal) {
|
|
114
|
-
|
|
115
|
-
this.terminal = terminal;
|
|
129
|
+
this.terminal = terminal;
|
|
116
130
|
const wasRunning = this.running;
|
|
117
131
|
this.running = false;
|
|
118
132
|
this.stopWorkingTicker();
|
|
119
133
|
this.workingStartedAt = undefined;
|
|
120
134
|
this.workingMessage = "working…";
|
|
135
|
+
this.heldAwakeBy = [];
|
|
121
136
|
this.refreshHint();
|
|
122
137
|
this.refreshWorkingStatus();
|
|
123
138
|
if (wasRunning)
|
|
@@ -194,13 +209,17 @@ export class StatusController {
|
|
|
194
209
|
// let a ticker tick or a queued-follow-up update paint over it.
|
|
195
210
|
if (this.exitConfirmActive)
|
|
196
211
|
return;
|
|
197
|
-
this.opts.
|
|
212
|
+
this.opts.refreshActiveWork();
|
|
198
213
|
if (this.workingStartedAt === undefined) {
|
|
199
214
|
this.setStatus(this.queuedFollowUps > 0 ? `queued follow-ups: ${this.queuedFollowUps}` : "");
|
|
200
215
|
return;
|
|
201
216
|
}
|
|
202
217
|
const elapsed = formatElapsed(Date.now() - this.workingStartedAt);
|
|
203
218
|
const queued = this.queuedFollowUps > 0 ? ` · queued follow-ups: ${this.queuedFollowUps}` : "";
|
|
219
|
+
if (this.heldAwakeBy.length > 0) {
|
|
220
|
+
this.setStatus(` turn open: held awake by ${this.heldAwakeBy.join(", ")}${queued}`);
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
204
223
|
this.setStatus(`● ${this.workingMessage} (${elapsed})${queued}`);
|
|
205
224
|
}
|
|
206
225
|
/** Flip the destroyed flag and stop the ticker. Invoked from the renderer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-controller.js","sourceRoot":"","sources":["../../../src/tui/status-controller.ts"],"names":[],"mappings":"AACA,OAAO,EACL,MAAM,EACN,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"status-controller.js","sourceRoot":"","sources":["../../../src/tui/status-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type CliRenderer } from "@opentui/core";
|
|
2
|
+
import type { TaskDescriptor } from "../tasks/types.js";
|
|
3
|
+
import type { TurnEvent } from "../types/protocol.js";
|
|
4
|
+
import type { StatusController } from "./status-controller.js";
|
|
5
|
+
import type { TranscriptWriter } from "./transcript-writer.js";
|
|
6
|
+
export interface TaskLaneRendererOptions {
|
|
7
|
+
renderer: CliRenderer;
|
|
8
|
+
transcriptWriter: TranscriptWriter;
|
|
9
|
+
statusController: StatusController;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Live owner of the task tree renderable. It is deliberately a sibling of
|
|
13
|
+
* StepRenderer: task-origin steps never enter the single-lane transcript tool map,
|
|
14
|
+
* while parent steps can still update both the ordinary transcript and tree header.
|
|
15
|
+
*/
|
|
16
|
+
export declare class TaskLaneRenderer {
|
|
17
|
+
private readonly opts;
|
|
18
|
+
private readonly events;
|
|
19
|
+
private tasks;
|
|
20
|
+
private initialTurnTokens;
|
|
21
|
+
private line;
|
|
22
|
+
private projection;
|
|
23
|
+
constructor(opts: TaskLaneRendererOptions);
|
|
24
|
+
/** Seed the lane before subscribing so late attach never waits for a terminal or replay. */
|
|
25
|
+
seed(tasks: readonly TaskDescriptor[], initialTurnTokens?: number): void;
|
|
26
|
+
renderEvent(event: TurnEvent): void;
|
|
27
|
+
/** Advance elapsed counters from the shared status ticker. */
|
|
28
|
+
refresh(): void;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=task-lane-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-lane-renderer.d.ts","sourceRoot":"","sources":["../../../src/tui/task-lane-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAkB,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAU,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAQtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,WAAW,CAAC;IACtB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED;;;;GAIG;AACH,qBAAa,gBAAgB;IAWf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAVjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,UAAU,CAIhB;gBAE2B,IAAI,EAAE,uBAAuB;IAE1D,4FAA4F;IAC5F,IAAI,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI;IAMxE,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAQnC,8DAA8D;IAC9D,OAAO,IAAI,IAAI;CA4BhB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { TextRenderable } from "@opentui/core";
|
|
2
|
+
import { isTaskTreeEvent, projectTaskTree, } from "./task-tree.js";
|
|
3
|
+
import { COLORS } from "./theme.js";
|
|
4
|
+
/**
|
|
5
|
+
* Live owner of the task tree renderable. It is deliberately a sibling of
|
|
6
|
+
* StepRenderer: task-origin steps never enter the single-lane transcript tool map,
|
|
7
|
+
* while parent steps can still update both the ordinary transcript and tree header.
|
|
8
|
+
*/
|
|
9
|
+
export class TaskLaneRenderer {
|
|
10
|
+
opts;
|
|
11
|
+
events = [];
|
|
12
|
+
tasks = [];
|
|
13
|
+
initialTurnTokens;
|
|
14
|
+
line;
|
|
15
|
+
projection = {
|
|
16
|
+
rows: [],
|
|
17
|
+
heldAwakeBy: [],
|
|
18
|
+
parentActivity: "working…",
|
|
19
|
+
};
|
|
20
|
+
constructor(opts) {
|
|
21
|
+
this.opts = opts;
|
|
22
|
+
}
|
|
23
|
+
/** Seed the lane before subscribing so late attach never waits for a terminal or replay. */
|
|
24
|
+
seed(tasks, initialTurnTokens) {
|
|
25
|
+
this.tasks = tasks.map((task) => ({ ...task }));
|
|
26
|
+
this.initialTurnTokens = initialTurnTokens;
|
|
27
|
+
this.refresh();
|
|
28
|
+
}
|
|
29
|
+
renderEvent(event) {
|
|
30
|
+
if (!isTaskTreeEvent(event))
|
|
31
|
+
return;
|
|
32
|
+
const superseded = supersededEventIndex(this.events, event);
|
|
33
|
+
if (superseded !== -1)
|
|
34
|
+
this.events.splice(superseded, 1);
|
|
35
|
+
this.events.push(event);
|
|
36
|
+
this.refresh();
|
|
37
|
+
}
|
|
38
|
+
/** Advance elapsed counters from the shared status ticker. */
|
|
39
|
+
refresh() {
|
|
40
|
+
this.projection = projectTaskTree({
|
|
41
|
+
tasks: this.tasks,
|
|
42
|
+
events: this.events,
|
|
43
|
+
now: Date.now(),
|
|
44
|
+
...(this.initialTurnTokens === undefined
|
|
45
|
+
? {}
|
|
46
|
+
: { initialTurnTokens: this.initialTurnTokens }),
|
|
47
|
+
});
|
|
48
|
+
this.opts.statusController.setHeldAwakeTasks(this.projection.heldAwakeBy, earliestRunningStart(this.tasks, this.events, this.projection.heldAwakeBy));
|
|
49
|
+
if (this.projection.rows.length === 0)
|
|
50
|
+
return;
|
|
51
|
+
// The persistent status row owns the held-awake sentence so it sits
|
|
52
|
+
// immediately below this block exactly once, matching the accepted tree.
|
|
53
|
+
const content = this.projection.rows
|
|
54
|
+
.filter((row) => row.key !== "held-awake")
|
|
55
|
+
.map((row) => row.text)
|
|
56
|
+
.join("\n");
|
|
57
|
+
if (!this.line) {
|
|
58
|
+
this.opts.transcriptWriter.beginBlock();
|
|
59
|
+
this.line = new TextRenderable(this.opts.renderer, { content, fg: COLORS.status });
|
|
60
|
+
this.opts.transcriptWriter.mount(this.line);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
this.line.content = content;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function earliestRunningStart(snapshot, events, runningIds) {
|
|
67
|
+
const starts = new Map(snapshot.map((task) => [task.id, task.startedAt]));
|
|
68
|
+
for (const event of events) {
|
|
69
|
+
if (event.type === "task_started")
|
|
70
|
+
starts.set(event.task.id, event.task.startedAt);
|
|
71
|
+
}
|
|
72
|
+
const values = runningIds.flatMap((id) => {
|
|
73
|
+
const startedAt = starts.get(id);
|
|
74
|
+
return startedAt === undefined ? [] : [startedAt];
|
|
75
|
+
});
|
|
76
|
+
return values.length === 0 ? undefined : Math.min(...values);
|
|
77
|
+
}
|
|
78
|
+
/** Streaming/output activity is latest-value UI state, so replace it instead of retaining every delta. */
|
|
79
|
+
function supersededEventIndex(events, next) {
|
|
80
|
+
if (next.type === "task_output") {
|
|
81
|
+
return events.findIndex((event) => event.type === "task_output" && event.taskId === next.taskId);
|
|
82
|
+
}
|
|
83
|
+
if (next.type !== "step")
|
|
84
|
+
return -1;
|
|
85
|
+
const nextLane = next.origin?.taskId ?? "parent";
|
|
86
|
+
return events.findIndex((event) => {
|
|
87
|
+
if (event.type !== "step")
|
|
88
|
+
return false;
|
|
89
|
+
const lane = event.origin?.taskId ?? "parent";
|
|
90
|
+
return lane === nextLane;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=task-lane-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-lane-renderer.js","sourceRoot":"","sources":["../../../src/tui/task-lane-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { TaskDescriptor, TaskId, TaskStatus } from "../tasks/types.js";
|
|
2
|
+
import type { TurnEvent } from "../types/protocol.js";
|
|
3
|
+
export type TaskTreeEvent = Extract<TurnEvent, {
|
|
4
|
+
type: "task_started" | "task_output" | "task_settled" | "step" | "usage";
|
|
5
|
+
}>;
|
|
6
|
+
export interface TaskTreeProjectionInput {
|
|
7
|
+
/** Durable descriptors available when the TUI attaches, including after hydration. */
|
|
8
|
+
tasks: readonly TaskDescriptor[];
|
|
9
|
+
/** Ordered events observed after the snapshot was captured. */
|
|
10
|
+
events?: readonly TaskTreeEvent[];
|
|
11
|
+
/** Wall clock used for elapsed and wake labels. */
|
|
12
|
+
now: number;
|
|
13
|
+
/** Running aggregate already observed before late attach; prevents the next task tick being over-attributed. */
|
|
14
|
+
initialTurnTokens?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface TaskTreeRow {
|
|
17
|
+
/** Stable key used by live renderers that update the projection in place. */
|
|
18
|
+
key: "parent" | "held-awake" | TaskId;
|
|
19
|
+
/** Complete printable row, including tree connectors and timing metadata. */
|
|
20
|
+
text: string;
|
|
21
|
+
/** Ownership nesting below the parent lane; the parent header is depth zero. */
|
|
22
|
+
depth: number;
|
|
23
|
+
/** Durable lifecycle status for task rows; absent on parent and held-awake rows. */
|
|
24
|
+
status?: TaskStatus;
|
|
25
|
+
/** Descriptor identity for task rows; absent on structural rows. */
|
|
26
|
+
taskId?: TaskId;
|
|
27
|
+
/** Tokens attributed from cumulative usage deltas carrying this task's origin. */
|
|
28
|
+
tokenUsage?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface TaskTreeProjection {
|
|
31
|
+
/** Render-ready rows in stable task-id and ownership order. */
|
|
32
|
+
rows: readonly TaskTreeRow[];
|
|
33
|
+
/** In-process tasks that keep the turn open; scheduled work is deliberately excluded. */
|
|
34
|
+
heldAwakeBy: readonly TaskId[];
|
|
35
|
+
/** Latest parent-lane activity used by the accepted tree header. */
|
|
36
|
+
parentActivity: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Pure late-attach/live projection for the task surface. The durable snapshot is the
|
|
40
|
+
* base truth; subsequent lifecycle events replace descriptors by id, task-origin
|
|
41
|
+
* steps update only their lane, and cumulative usage events are differenced before
|
|
42
|
+
* their delta is credited to the originating task.
|
|
43
|
+
*/
|
|
44
|
+
export declare function projectTaskTree(input: TaskTreeProjectionInput): TaskTreeProjection;
|
|
45
|
+
/** Narrowed event predicate shared by the session router and pure tests. */
|
|
46
|
+
export declare function isTaskTreeEvent(event: TurnEvent): event is TaskTreeEvent;
|
|
47
|
+
//# sourceMappingURL=task-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-tree.d.ts","sourceRoot":"","sources":["../../../src/tui/task-tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,cAAc,EACd,MAAM,EAEN,UAAU,EACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,sBAAsB,CAAC;AAIhE,MAAM,MAAM,aAAa,GAAG,OAAO,CACjC,SAAS,EACT;IAAE,IAAI,EAAE,cAAc,GAAG,aAAa,GAAG,cAAc,GAAG,MAAM,GAAG,OAAO,CAAA;CAAE,CAC7E,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,sFAAsF;IACtF,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IACjC,+DAA+D;IAC/D,MAAM,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAClC,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,gHAAgH;IAChH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,GAAG,EAAE,QAAQ,GAAG,YAAY,GAAG,MAAM,CAAC;IACtC,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,oFAAoF;IACpF,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;IAC7B,yFAAyF;IACzF,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,oEAAoE;IACpE,cAAc,EAAE,MAAM,CAAC;CACxB;AASD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,uBAAuB,GAAG,kBAAkB,CA4ElF;AA4GD,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,aAAa,CAQxE"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
const TASK_SCOPE_PREFIX = "task:";
|
|
2
|
+
/**
|
|
3
|
+
* Pure late-attach/live projection for the task surface. The durable snapshot is the
|
|
4
|
+
* base truth; subsequent lifecycle events replace descriptors by id, task-origin
|
|
5
|
+
* steps update only their lane, and cumulative usage events are differenced before
|
|
6
|
+
* their delta is credited to the originating task.
|
|
7
|
+
*/
|
|
8
|
+
export function projectTaskTree(input) {
|
|
9
|
+
const tasks = new Map();
|
|
10
|
+
for (const descriptor of input.tasks) {
|
|
11
|
+
tasks.set(descriptor.id, { descriptor: { ...descriptor }, tokenUsage: 0 });
|
|
12
|
+
}
|
|
13
|
+
let parentActivity = "working…";
|
|
14
|
+
let previousTurnTokens = input.initialTurnTokens ?? 0;
|
|
15
|
+
for (const event of input.events ?? []) {
|
|
16
|
+
if (event.type === "task_started") {
|
|
17
|
+
const existing = tasks.get(event.task.id);
|
|
18
|
+
tasks.set(event.task.id, {
|
|
19
|
+
descriptor: { ...event.task },
|
|
20
|
+
tokenUsage: existing?.tokenUsage ?? 0,
|
|
21
|
+
...(existing?.activity ? { activity: existing.activity } : {}),
|
|
22
|
+
...(existing?.settledAt === undefined ? {} : { settledAt: existing.settledAt }),
|
|
23
|
+
});
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (event.type === "task_output") {
|
|
27
|
+
const task = tasks.get(event.taskId);
|
|
28
|
+
if (task)
|
|
29
|
+
task.activity = summarizeActivity(event.chunk);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (event.type === "task_settled") {
|
|
33
|
+
settleProjectedTask(tasks, event.settlement);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (event.type === "usage") {
|
|
37
|
+
const current = event.turnUsage.totalTokens;
|
|
38
|
+
const delta = Math.max(0, current - previousTurnTokens);
|
|
39
|
+
previousTurnTokens = Math.max(previousTurnTokens, current);
|
|
40
|
+
if (event.origin) {
|
|
41
|
+
const task = tasks.get(event.origin.taskId);
|
|
42
|
+
if (task)
|
|
43
|
+
task.tokenUsage += delta;
|
|
44
|
+
}
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const activity = activityFromStep(event.step);
|
|
48
|
+
if (!activity)
|
|
49
|
+
continue;
|
|
50
|
+
if (event.origin) {
|
|
51
|
+
const task = tasks.get(event.origin.taskId);
|
|
52
|
+
if (task)
|
|
53
|
+
task.activity = activity;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
parentActivity = activity;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const ordered = [...tasks.values()].sort(compareProjectedTasks);
|
|
60
|
+
if (ordered.length === 0)
|
|
61
|
+
return { rows: [], heldAwakeBy: [], parentActivity };
|
|
62
|
+
const children = new Map();
|
|
63
|
+
for (const task of ordered) {
|
|
64
|
+
const parentId = parentTaskId(task.descriptor.ownerScopeId);
|
|
65
|
+
const actualParent = parentId && tasks.has(parentId) ? parentId : undefined;
|
|
66
|
+
const siblings = children.get(actualParent) ?? [];
|
|
67
|
+
siblings.push(task);
|
|
68
|
+
children.set(actualParent, siblings);
|
|
69
|
+
}
|
|
70
|
+
const rows = [{ key: "parent", text: `● parent — ${parentActivity}`, depth: 0 }];
|
|
71
|
+
appendTaskRows(rows, children, undefined, "", input.now);
|
|
72
|
+
const heldAwakeBy = ordered
|
|
73
|
+
.filter((task) => task.descriptor.status === "running")
|
|
74
|
+
.map((task) => task.descriptor.id);
|
|
75
|
+
if (heldAwakeBy.length > 0) {
|
|
76
|
+
rows.push({
|
|
77
|
+
key: "held-awake",
|
|
78
|
+
text: ` turn open: held awake by ${heldAwakeBy.join(", ")}`,
|
|
79
|
+
depth: 1,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return { rows, heldAwakeBy, parentActivity };
|
|
83
|
+
}
|
|
84
|
+
function settleProjectedTask(tasks, settlement) {
|
|
85
|
+
const task = tasks.get(settlement.id);
|
|
86
|
+
if (!task)
|
|
87
|
+
return;
|
|
88
|
+
task.descriptor = { ...task.descriptor, status: settlement.status };
|
|
89
|
+
task.settledAt = settlement.settledAt;
|
|
90
|
+
}
|
|
91
|
+
function appendTaskRows(rows, children, parentId, prefix, now) {
|
|
92
|
+
const siblings = children.get(parentId) ?? [];
|
|
93
|
+
siblings.forEach((task, index) => {
|
|
94
|
+
const last = index === siblings.length - 1;
|
|
95
|
+
const connector = last ? "└─" : "├─";
|
|
96
|
+
rows.push({
|
|
97
|
+
key: task.descriptor.id,
|
|
98
|
+
taskId: task.descriptor.id,
|
|
99
|
+
status: task.descriptor.status,
|
|
100
|
+
tokenUsage: task.tokenUsage,
|
|
101
|
+
depth: prefix.length / 3 + 1,
|
|
102
|
+
text: `${prefix} ${connector} ${formatTask(task, now)}`,
|
|
103
|
+
});
|
|
104
|
+
appendTaskRows(rows, children, task.descriptor.id, `${prefix}${last ? " " : " │"}`, now);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function formatTask(task, now) {
|
|
108
|
+
const { descriptor } = task;
|
|
109
|
+
const marker = taskMarker(descriptor.status);
|
|
110
|
+
const label = formatTaskLabel(descriptor);
|
|
111
|
+
const activity = task.activity ? ` — ${task.activity}` : "";
|
|
112
|
+
const timing = descriptor.status === "scheduled" && descriptor.wakeAt !== undefined
|
|
113
|
+
? ` — wakes ${formatWakeTime(descriptor.wakeAt)}`
|
|
114
|
+
: descriptor.status === "running"
|
|
115
|
+
? formatTaskElapsed(descriptor.startedAt, now)
|
|
116
|
+
: task.settledAt === undefined
|
|
117
|
+
? ""
|
|
118
|
+
: formatTaskElapsed(descriptor.startedAt, task.settledAt);
|
|
119
|
+
const usage = task.tokenUsage > 0 ? ` [${formatTokenCount(task.tokenUsage)} tok]` : "";
|
|
120
|
+
return `${marker} ${descriptor.id} ${descriptor.name} ${label}${activity}${timing}${usage}`.trimEnd();
|
|
121
|
+
}
|
|
122
|
+
function formatTaskLabel(task) {
|
|
123
|
+
const label = truncate(task.label.trim(), 46);
|
|
124
|
+
return task.name === "bash" ? `\`${label}\`` : label;
|
|
125
|
+
}
|
|
126
|
+
function taskMarker(status) {
|
|
127
|
+
if (status === "running")
|
|
128
|
+
return "⠙";
|
|
129
|
+
if (status === "scheduled")
|
|
130
|
+
return "◷";
|
|
131
|
+
if (status === "completed")
|
|
132
|
+
return "✔";
|
|
133
|
+
if (status === "failed")
|
|
134
|
+
return "✘";
|
|
135
|
+
if (status === "stopped")
|
|
136
|
+
return "■";
|
|
137
|
+
return "?";
|
|
138
|
+
}
|
|
139
|
+
function formatTaskElapsed(startedAt, endedAt) {
|
|
140
|
+
const totalSeconds = Math.max(0, Math.floor((endedAt - startedAt) / 1000));
|
|
141
|
+
if (totalSeconds < 60)
|
|
142
|
+
return ` ${totalSeconds}s`;
|
|
143
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
144
|
+
return ` ${minutes}m${String(totalSeconds % 60).padStart(2, "0")}s`;
|
|
145
|
+
}
|
|
146
|
+
function formatWakeTime(wakeAt) {
|
|
147
|
+
return new Date(wakeAt).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
|
|
148
|
+
}
|
|
149
|
+
function formatTokenCount(tokens) {
|
|
150
|
+
if (tokens < 1000)
|
|
151
|
+
return String(tokens);
|
|
152
|
+
return `${(tokens / 1000).toFixed(1)}k`;
|
|
153
|
+
}
|
|
154
|
+
function activityFromStep(step) {
|
|
155
|
+
if (step.type === "text" || step.type === "reasoning")
|
|
156
|
+
return summarizeActivity(step.text);
|
|
157
|
+
if (step.type === "text_delta" || step.type === "reasoning_delta") {
|
|
158
|
+
return summarizeActivity(step.delta);
|
|
159
|
+
}
|
|
160
|
+
if (step.type === "tool_call_start")
|
|
161
|
+
return `running ${step.toolName}`;
|
|
162
|
+
if (step.type === "tool_call")
|
|
163
|
+
return `${step.toolName} ${step.isError ? "failed" : "finished"}`;
|
|
164
|
+
return summarizeActivity(step.message);
|
|
165
|
+
}
|
|
166
|
+
function summarizeActivity(value) {
|
|
167
|
+
const oneLine = value.replace(/\s+/g, " ").trim();
|
|
168
|
+
return oneLine ? truncate(oneLine, 54) : undefined;
|
|
169
|
+
}
|
|
170
|
+
function truncate(value, width) {
|
|
171
|
+
return value.length <= width ? value : `${value.slice(0, Math.max(0, width - 1)).trimEnd()}…`;
|
|
172
|
+
}
|
|
173
|
+
function parentTaskId(ownerScopeId) {
|
|
174
|
+
if (!ownerScopeId.startsWith(TASK_SCOPE_PREFIX))
|
|
175
|
+
return undefined;
|
|
176
|
+
const candidate = ownerScopeId.slice(TASK_SCOPE_PREFIX.length);
|
|
177
|
+
return /^t\d+$/.test(candidate) ? candidate : undefined;
|
|
178
|
+
}
|
|
179
|
+
function compareProjectedTasks(a, b) {
|
|
180
|
+
return Number(a.descriptor.id.slice(1)) - Number(b.descriptor.id.slice(1));
|
|
181
|
+
}
|
|
182
|
+
/** Narrowed event predicate shared by the session router and pure tests. */
|
|
183
|
+
export function isTaskTreeEvent(event) {
|
|
184
|
+
return (event.type === "task_started" ||
|
|
185
|
+
event.type === "task_output" ||
|
|
186
|
+
event.type === "task_settled" ||
|
|
187
|
+
event.type === "step" ||
|
|
188
|
+
event.type === "usage");
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=task-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-tree.js","sourceRoot":"","sources":["../../../src/tui/task-tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -279,6 +279,7 @@ const STATE_KIND_GLYPHS = {
|
|
|
279
279
|
script: "$",
|
|
280
280
|
poll: "⟳",
|
|
281
281
|
timer: "⏲",
|
|
282
|
+
park: "◫",
|
|
282
283
|
terminal: "■",
|
|
283
284
|
};
|
|
284
285
|
function stateKindGlyph(kind) {
|
|
@@ -314,6 +315,8 @@ function summarizeStateRow(state) {
|
|
|
314
315
|
return `wakes ${formatWakeAt(wakeAt)}`;
|
|
315
316
|
return "";
|
|
316
317
|
}
|
|
318
|
+
if (kind === "park")
|
|
319
|
+
return "Waiting for parent-driven input";
|
|
317
320
|
if (kind === "terminal") {
|
|
318
321
|
const status = stringField(state, "status") ?? "";
|
|
319
322
|
const reason = stringField(state, "reason");
|