@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.
Files changed (244) hide show
  1. package/README.md +19 -11
  2. package/dist/package.json +4 -4
  3. package/dist/src/cli/config.d.ts +10 -0
  4. package/dist/src/cli/config.d.ts.map +1 -0
  5. package/dist/src/cli/config.js +24 -0
  6. package/dist/src/cli/config.js.map +1 -0
  7. package/dist/src/cli/help.d.ts.map +1 -1
  8. package/dist/src/cli/help.js +13 -10
  9. package/dist/src/cli/help.js.map +1 -1
  10. package/dist/src/cli/inline-slash.d.ts +2 -1
  11. package/dist/src/cli/inline-slash.d.ts.map +1 -1
  12. package/dist/src/cli/inline-slash.js +14 -5
  13. package/dist/src/cli/inline-slash.js.map +1 -1
  14. package/dist/src/cli/memory-db.d.ts.map +1 -1
  15. package/dist/src/cli/memory-db.js +9 -5
  16. package/dist/src/cli/memory-db.js.map +1 -1
  17. package/dist/src/cli/memory-query.d.ts +1 -1
  18. package/dist/src/cli/model.d.ts +1 -1
  19. package/dist/src/cli/model.d.ts.map +1 -1
  20. package/dist/src/cli/model.js +1 -1
  21. package/dist/src/cli/model.js.map +1 -1
  22. package/dist/src/cli/route.d.ts +84 -0
  23. package/dist/src/cli/route.d.ts.map +1 -0
  24. package/dist/src/cli/route.js +261 -0
  25. package/dist/src/cli/route.js.map +1 -0
  26. package/dist/src/cli/rpc.d.ts +43 -2
  27. package/dist/src/cli/rpc.d.ts.map +1 -1
  28. package/dist/src/cli/rpc.js +176 -23
  29. package/dist/src/cli/rpc.js.map +1 -1
  30. package/dist/src/cli/run.d.ts +8 -1
  31. package/dist/src/cli/run.d.ts.map +1 -1
  32. package/dist/src/cli/run.js +24 -7
  33. package/dist/src/cli/run.js.map +1 -1
  34. package/dist/src/cli/shared.d.ts +4 -3
  35. package/dist/src/cli/shared.d.ts.map +1 -1
  36. package/dist/src/cli/shared.js +3 -4
  37. package/dist/src/cli/shared.js.map +1 -1
  38. package/dist/src/cli/shutdown.d.ts +4 -2
  39. package/dist/src/cli/shutdown.d.ts.map +1 -1
  40. package/dist/src/cli/shutdown.js +4 -2
  41. package/dist/src/cli/shutdown.js.map +1 -1
  42. package/dist/src/cli.d.ts +2 -0
  43. package/dist/src/cli.d.ts.map +1 -1
  44. package/dist/src/cli.js +12 -0
  45. package/dist/src/cli.js.map +1 -1
  46. package/dist/src/core/structured-output.d.ts +2 -0
  47. package/dist/src/core/structured-output.d.ts.map +1 -1
  48. package/dist/src/core/structured-output.js +1 -0
  49. package/dist/src/core/structured-output.js.map +1 -1
  50. package/dist/src/lib/system-reminder.d.ts +14 -0
  51. package/dist/src/lib/system-reminder.d.ts.map +1 -0
  52. package/dist/src/lib/system-reminder.js +53 -0
  53. package/dist/src/lib/system-reminder.js.map +1 -0
  54. package/dist/src/lib/walk-ancestors.d.ts +9 -0
  55. package/dist/src/lib/walk-ancestors.d.ts.map +1 -0
  56. package/dist/src/lib/walk-ancestors.js +28 -0
  57. package/dist/src/lib/walk-ancestors.js.map +1 -0
  58. package/dist/src/memory/observational-prompts.d.ts.map +1 -1
  59. package/dist/src/memory/observational-prompts.js +2 -1
  60. package/dist/src/memory/observational-prompts.js.map +1 -1
  61. package/dist/src/memory/observational.d.ts +31 -4
  62. package/dist/src/memory/observational.d.ts.map +1 -1
  63. package/dist/src/memory/observational.js +43 -4
  64. package/dist/src/memory/observational.js.map +1 -1
  65. package/dist/src/model-resolution/catalog.d.ts +2 -2
  66. package/dist/src/model-resolution/catalog.d.ts.map +1 -1
  67. package/dist/src/model-resolution/catalog.js +61 -33
  68. package/dist/src/model-resolution/catalog.js.map +1 -1
  69. package/dist/src/model-resolution/duet-gateway.d.ts +3 -3
  70. package/dist/src/model-resolution/duet-gateway.d.ts.map +1 -1
  71. package/dist/src/model-resolution/duet-gateway.js +119 -19
  72. package/dist/src/model-resolution/duet-gateway.js.map +1 -1
  73. package/dist/src/model-resolution/model-gateway.d.ts.map +1 -0
  74. package/dist/src/{cli → model-resolution}/model-gateway.js +10 -6
  75. package/dist/src/model-resolution/model-gateway.js.map +1 -0
  76. package/dist/src/model-resolution/resolver.d.ts +11 -4
  77. package/dist/src/model-resolution/resolver.d.ts.map +1 -1
  78. package/dist/src/model-resolution/resolver.js +39 -8
  79. package/dist/src/model-resolution/resolver.js.map +1 -1
  80. package/dist/src/model-routing/advisor-transcript.d.ts +36 -0
  81. package/dist/src/model-routing/advisor-transcript.d.ts.map +1 -0
  82. package/dist/src/model-routing/advisor-transcript.js +103 -0
  83. package/dist/src/model-routing/advisor-transcript.js.map +1 -0
  84. package/dist/src/model-routing/advisor.d.ts +27 -0
  85. package/dist/src/model-routing/advisor.d.ts.map +1 -0
  86. package/dist/src/model-routing/advisor.js +20 -0
  87. package/dist/src/model-routing/advisor.js.map +1 -0
  88. package/dist/src/model-routing/classifier.d.ts +57 -0
  89. package/dist/src/model-routing/classifier.d.ts.map +1 -0
  90. package/dist/src/model-routing/classifier.js +63 -0
  91. package/dist/src/model-routing/classifier.js.map +1 -0
  92. package/dist/src/model-routing/loader.d.ts +48 -0
  93. package/dist/src/model-routing/loader.d.ts.map +1 -0
  94. package/dist/src/model-routing/loader.js +79 -0
  95. package/dist/src/model-routing/loader.js.map +1 -0
  96. package/dist/src/model-routing/prompts.d.ts +22 -0
  97. package/dist/src/model-routing/prompts.d.ts.map +1 -0
  98. package/dist/src/model-routing/prompts.js +87 -0
  99. package/dist/src/model-routing/prompts.js.map +1 -0
  100. package/dist/src/model-routing/resolve.d.ts +40 -0
  101. package/dist/src/model-routing/resolve.d.ts.map +1 -0
  102. package/dist/src/model-routing/resolve.js +76 -0
  103. package/dist/src/model-routing/resolve.js.map +1 -0
  104. package/dist/src/model-routing/router.d.ts +149 -0
  105. package/dist/src/model-routing/router.d.ts.map +1 -0
  106. package/dist/src/model-routing/router.js +235 -0
  107. package/dist/src/model-routing/router.js.map +1 -0
  108. package/dist/src/model-routing/step-triggers.d.ts +27 -0
  109. package/dist/src/model-routing/step-triggers.d.ts.map +1 -0
  110. package/dist/src/model-routing/step-triggers.js +20 -0
  111. package/dist/src/model-routing/step-triggers.js.map +1 -0
  112. package/dist/src/model-routing/table.d.ts +126 -0
  113. package/dist/src/model-routing/table.d.ts.map +1 -0
  114. package/dist/src/model-routing/table.js +351 -0
  115. package/dist/src/model-routing/table.js.map +1 -0
  116. package/dist/src/session/session.d.ts +40 -23
  117. package/dist/src/session/session.d.ts.map +1 -1
  118. package/dist/src/session/session.js +173 -97
  119. package/dist/src/session/session.js.map +1 -1
  120. package/dist/src/tasks/quiescence.d.ts +13 -0
  121. package/dist/src/tasks/quiescence.d.ts.map +1 -0
  122. package/dist/src/tasks/quiescence.js +11 -0
  123. package/dist/src/tasks/quiescence.js.map +1 -0
  124. package/dist/src/tasks/task-manager.d.ts +101 -0
  125. package/dist/src/tasks/task-manager.d.ts.map +1 -0
  126. package/dist/src/tasks/task-manager.js +311 -0
  127. package/dist/src/tasks/task-manager.js.map +1 -0
  128. package/dist/src/tasks/types.d.ts +85 -0
  129. package/dist/src/tasks/types.d.ts.map +1 -0
  130. package/dist/src/tasks/types.js +2 -0
  131. package/dist/src/tasks/types.js.map +1 -0
  132. package/dist/src/train/archive.d.ts +3 -0
  133. package/dist/src/train/archive.d.ts.map +1 -1
  134. package/dist/src/train/archive.js +7 -3
  135. package/dist/src/train/archive.js.map +1 -1
  136. package/dist/src/train/types.d.ts +7 -2
  137. package/dist/src/train/types.d.ts.map +1 -1
  138. package/dist/src/tui/app.d.ts +1 -1
  139. package/dist/src/tui/app.d.ts.map +1 -1
  140. package/dist/src/tui/app.js +12 -2
  141. package/dist/src/tui/app.js.map +1 -1
  142. package/dist/src/tui/initial-prompt.d.ts.map +1 -1
  143. package/dist/src/tui/initial-prompt.js +0 -3
  144. package/dist/src/tui/initial-prompt.js.map +1 -1
  145. package/dist/src/tui/session-subscription.d.ts +3 -0
  146. package/dist/src/tui/session-subscription.d.ts.map +1 -1
  147. package/dist/src/tui/session-subscription.js +29 -5
  148. package/dist/src/tui/session-subscription.js.map +1 -1
  149. package/dist/src/tui/sidebar.d.ts +3 -0
  150. package/dist/src/tui/sidebar.d.ts.map +1 -1
  151. package/dist/src/tui/sidebar.js +19 -3
  152. package/dist/src/tui/sidebar.js.map +1 -1
  153. package/dist/src/tui/slash-commands.d.ts +12 -9
  154. package/dist/src/tui/slash-commands.d.ts.map +1 -1
  155. package/dist/src/tui/slash-commands.js +48 -10
  156. package/dist/src/tui/slash-commands.js.map +1 -1
  157. package/dist/src/tui/status-controller.d.ts +14 -9
  158. package/dist/src/tui/status-controller.d.ts.map +1 -1
  159. package/dist/src/tui/status-controller.js +26 -7
  160. package/dist/src/tui/status-controller.js.map +1 -1
  161. package/dist/src/tui/task-lane-renderer.d.ts +30 -0
  162. package/dist/src/tui/task-lane-renderer.d.ts.map +1 -0
  163. package/dist/src/tui/task-lane-renderer.js +93 -0
  164. package/dist/src/tui/task-lane-renderer.js.map +1 -0
  165. package/dist/src/tui/task-tree.d.ts +47 -0
  166. package/dist/src/tui/task-tree.d.ts.map +1 -0
  167. package/dist/src/tui/task-tree.js +190 -0
  168. package/dist/src/tui/task-tree.js.map +1 -0
  169. package/dist/src/tui/tool-formatters.js +3 -0
  170. package/dist/src/tui/tool-formatters.js.map +1 -1
  171. package/dist/src/turn-runner/agent-events.d.ts.map +1 -1
  172. package/dist/src/turn-runner/agent-events.js +1 -0
  173. package/dist/src/turn-runner/agent-events.js.map +1 -1
  174. package/dist/src/turn-runner/duration.d.ts +2 -2
  175. package/dist/src/turn-runner/duration.js +3 -3
  176. package/dist/src/turn-runner/duration.js.map +1 -1
  177. package/dist/src/turn-runner/prompts.d.ts +5 -1
  178. package/dist/src/turn-runner/prompts.d.ts.map +1 -1
  179. package/dist/src/turn-runner/prompts.js +30 -6
  180. package/dist/src/turn-runner/prompts.js.map +1 -1
  181. package/dist/src/turn-runner/runtime-clock.d.ts +20 -0
  182. package/dist/src/turn-runner/runtime-clock.d.ts.map +1 -0
  183. package/dist/src/turn-runner/runtime-clock.js +38 -0
  184. package/dist/src/turn-runner/runtime-clock.js.map +1 -0
  185. package/dist/src/turn-runner/shell-state-handle.d.ts +0 -3
  186. package/dist/src/turn-runner/shell-state-handle.d.ts.map +1 -1
  187. package/dist/src/turn-runner/shell-state-handle.js +5 -55
  188. package/dist/src/turn-runner/shell-state-handle.js.map +1 -1
  189. package/dist/src/turn-runner/skill-context.d.ts +6 -7
  190. package/dist/src/turn-runner/skill-context.d.ts.map +1 -1
  191. package/dist/src/turn-runner/skill-context.js +10 -10
  192. package/dist/src/turn-runner/skill-context.js.map +1 -1
  193. package/dist/src/turn-runner/skills.d.ts.map +1 -1
  194. package/dist/src/turn-runner/skills.js +2 -22
  195. package/dist/src/turn-runner/skills.js.map +1 -1
  196. package/dist/src/turn-runner/state-compaction.d.ts +7 -5
  197. package/dist/src/turn-runner/state-compaction.d.ts.map +1 -1
  198. package/dist/src/turn-runner/state-compaction.js +69 -10
  199. package/dist/src/turn-runner/state-compaction.js.map +1 -1
  200. package/dist/src/turn-runner/state-machine-decisions.d.ts +135 -0
  201. package/dist/src/turn-runner/state-machine-decisions.d.ts.map +1 -0
  202. package/dist/src/turn-runner/state-machine-decisions.js +443 -0
  203. package/dist/src/turn-runner/state-machine-decisions.js.map +1 -0
  204. package/dist/src/turn-runner/state-machine-session.d.ts +13 -28
  205. package/dist/src/turn-runner/state-machine-session.d.ts.map +1 -1
  206. package/dist/src/turn-runner/state-machine-session.js +18 -55
  207. package/dist/src/turn-runner/state-machine-session.js.map +1 -1
  208. package/dist/src/turn-runner/subagent.d.ts +156 -0
  209. package/dist/src/turn-runner/subagent.d.ts.map +1 -0
  210. package/dist/src/turn-runner/subagent.js +164 -0
  211. package/dist/src/turn-runner/subagent.js.map +1 -0
  212. package/dist/src/turn-runner/task-tools.d.ts +76 -0
  213. package/dist/src/turn-runner/task-tools.d.ts.map +1 -0
  214. package/dist/src/turn-runner/task-tools.js +370 -0
  215. package/dist/src/turn-runner/task-tools.js.map +1 -0
  216. package/dist/src/turn-runner/tools.d.ts +65 -17
  217. package/dist/src/turn-runner/tools.d.ts.map +1 -1
  218. package/dist/src/turn-runner/tools.js +173 -59
  219. package/dist/src/turn-runner/tools.js.map +1 -1
  220. package/dist/src/turn-runner/turn-runner.d.ts +198 -134
  221. package/dist/src/turn-runner/turn-runner.d.ts.map +1 -1
  222. package/dist/src/turn-runner/turn-runner.js +1302 -713
  223. package/dist/src/turn-runner/turn-runner.js.map +1 -1
  224. package/dist/src/turn-runner/usage-accounting.d.ts +4 -0
  225. package/dist/src/turn-runner/usage-accounting.d.ts.map +1 -1
  226. package/dist/src/turn-runner/usage-accounting.js +19 -0
  227. package/dist/src/turn-runner/usage-accounting.js.map +1 -1
  228. package/dist/src/types/config.d.ts +9 -1
  229. package/dist/src/types/config.d.ts.map +1 -1
  230. package/dist/src/types/config.js +2 -1
  231. package/dist/src/types/config.js.map +1 -1
  232. package/dist/src/types/protocol.d.ts +110 -30
  233. package/dist/src/types/protocol.d.ts.map +1 -1
  234. package/dist/src/types/state-machine.d.ts +10 -12
  235. package/dist/src/types/state-machine.d.ts.map +1 -1
  236. package/dist/src/types/state-machine.js.map +1 -1
  237. package/package.json +4 -4
  238. package/dist/src/cli/model-gateway.d.ts.map +0 -1
  239. package/dist/src/cli/model-gateway.js.map +0 -1
  240. package/dist/src/turn-runner/state-machine-controller.d.ts +0 -140
  241. package/dist/src/turn-runner/state-machine-controller.d.ts.map +0 -1
  242. package/dist/src/turn-runner/state-machine-controller.js +0 -501
  243. package/dist/src/turn-runner/state-machine-controller.js.map +0 -1
  244. /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 every in-flight tool block header with a fresh spinner +
16
- * elapsed counter. Invoked from the ticker so spinners advance in step
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
- refreshActiveToolBlocks: () => void;
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 optionally record the terminal
84
- * event that ended the turn. The terminal is exposed via `lastTerminal()`
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?: TurnTerminalEvent): void;
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;;;;;OAKG;IACH,uBAAuB,EAAE,MAAM,IAAI,CAAC;CACrC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,gBAAgB;IAoBf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAnBjC,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,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;;2DAEuD;IACvD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKpC;;0BAEsB;IACtB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzC,WAAW,IAAI,IAAI;IAWnB;;2EAEuE;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,GAAG,IAAI;IAY5C;;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;IAe5B;;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"}
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 = Date.now();
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 optionally record the terminal
111
- * event that ended the turn. The terminal is exposed via `lastTerminal()`
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
- if (terminal !== undefined)
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.refreshActiveToolBlocks();
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":"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"}
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");