@aragon-agent/tui 0.0.0-stage → 0.0.1

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 (528) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +21 -0
  3. package/README.md +81 -2
  4. package/dist/index.d.ts +11 -0
  5. package/dist/index.js +11 -0
  6. package/dist/input/control-sequences.d.ts +71 -0
  7. package/dist/input/control-sequences.js +222 -0
  8. package/dist/input/csiu-keys.d.ts +66 -0
  9. package/dist/input/csiu-keys.js +181 -0
  10. package/dist/input/cursor-report.d.ts +61 -0
  11. package/dist/input/cursor-report.js +97 -0
  12. package/dist/input/enter-sequences.d.ts +64 -0
  13. package/dist/input/enter-sequences.js +153 -0
  14. package/dist/input/interrupt-gesture.d.ts +18 -0
  15. package/dist/input/interrupt-gesture.js +19 -0
  16. package/dist/input/keyboard-enhancement.d.ts +42 -0
  17. package/dist/input/keyboard-enhancement.js +65 -0
  18. package/dist/input/keymap.d.ts +20 -0
  19. package/dist/input/keymap.js +99 -0
  20. package/dist/input/limits.d.ts +118 -0
  21. package/dist/input/limits.js +109 -0
  22. package/dist/input/mouse-events.d.ts +87 -0
  23. package/dist/input/mouse-events.js +212 -0
  24. package/dist/input/paste-parse.d.ts +83 -0
  25. package/dist/input/paste-parse.js +107 -0
  26. package/dist/input/pointer-router.d.ts +11 -0
  27. package/dist/input/pointer-router.js +14 -0
  28. package/dist/input/stdin-filter.d.ts +112 -0
  29. package/dist/input/stdin-filter.js +657 -0
  30. package/dist/input/win32-input-mode.d.ts +61 -0
  31. package/dist/input/win32-input-mode.js +269 -0
  32. package/dist/model/agent/agent-mode.d.ts +108 -0
  33. package/dist/model/agent/agent-mode.js +121 -0
  34. package/dist/model/agent/entry-limits.d.ts +65 -0
  35. package/dist/model/agent/entry-limits.js +133 -0
  36. package/dist/model/agent/governance-view.d.ts +40 -0
  37. package/dist/model/agent/governance-view.js +40 -0
  38. package/dist/model/agent/invocation-card.d.ts +77 -0
  39. package/dist/model/agent/invocation-card.js +169 -0
  40. package/dist/model/agent/model-probe-limits.d.ts +39 -0
  41. package/dist/model/agent/model-probe-limits.js +25 -0
  42. package/dist/model/agent/model-probe.d.ts +104 -0
  43. package/dist/model/agent/model-probe.js +391 -0
  44. package/dist/model/agent/queued-messages.d.ts +23 -0
  45. package/dist/model/agent/queued-messages.js +49 -0
  46. package/dist/model/agent/reducer.d.ts +857 -0
  47. package/dist/model/agent/reducer.js +1646 -0
  48. package/dist/model/agent/retry-view.d.ts +68 -0
  49. package/dist/model/agent/retry-view.js +95 -0
  50. package/dist/model/agent/usage.d.ts +47 -0
  51. package/dist/model/agent/usage.js +84 -0
  52. package/dist/model/compaction/limits.d.ts +61 -0
  53. package/dist/model/compaction/limits.js +64 -0
  54. package/dist/model/compaction/meter.d.ts +276 -0
  55. package/dist/model/compaction/meter.js +512 -0
  56. package/dist/model/compaction/pressure.d.ts +163 -0
  57. package/dist/model/compaction/pressure.js +199 -0
  58. package/dist/model/compaction/reason-text.d.ts +36 -0
  59. package/dist/model/compaction/reason-text.js +78 -0
  60. package/dist/model/compaction/types.d.ts +360 -0
  61. package/dist/model/compaction/types.js +22 -0
  62. package/dist/model/config/governance-config.d.ts +125 -0
  63. package/dist/model/config/governance-config.js +164 -0
  64. package/dist/model/config/kit-resolution.d.ts +93 -0
  65. package/dist/model/config/kit-resolution.js +226 -0
  66. package/dist/model/config/model-kits.d.ts +225 -0
  67. package/dist/model/config/model-kits.js +302 -0
  68. package/dist/model/config/model-profile-resolution.d.ts +28 -0
  69. package/dist/model/config/model-profile-resolution.js +88 -0
  70. package/dist/model/config/model-profiles.d.ts +103 -0
  71. package/dist/model/config/model-profiles.js +188 -0
  72. package/dist/model/config/model-settings-types.d.ts +71 -0
  73. package/dist/model/config/model-settings-types.js +18 -0
  74. package/dist/model/config/schema.d.ts +1645 -0
  75. package/dist/model/config/schema.js +1383 -0
  76. package/dist/model/fast/limits.d.ts +152 -0
  77. package/dist/model/fast/limits.js +152 -0
  78. package/dist/model/fast/resolve.d.ts +44 -0
  79. package/dist/model/fast/resolve.js +107 -0
  80. package/dist/model/fast/task-summary-types.d.ts +66 -0
  81. package/dist/model/fast/task-summary-types.js +17 -0
  82. package/dist/model/fast/types.d.ts +141 -0
  83. package/dist/model/fast/types.js +14 -0
  84. package/dist/model/governance/governed-dispatch.d.ts +19 -0
  85. package/dist/model/governance/governed-dispatch.js +17 -0
  86. package/dist/model/governance/limits.d.ts +107 -0
  87. package/dist/model/governance/limits.js +131 -0
  88. package/dist/model/governance/posture.d.ts +35 -0
  89. package/dist/model/governance/posture.js +59 -0
  90. package/dist/model/governance/rules/events-table.d.ts +46 -0
  91. package/dist/model/governance/rules/events-table.js +94 -0
  92. package/dist/model/governance/types.d.ts +661 -0
  93. package/dist/model/governance/types.js +27 -0
  94. package/dist/model/logging/levels.d.ts +40 -0
  95. package/dist/model/logging/levels.js +59 -0
  96. package/dist/model/logging/log-port.d.ts +38 -0
  97. package/dist/model/logging/log-port.js +41 -0
  98. package/dist/model/logging/secret-registry.d.ts +32 -0
  99. package/dist/model/logging/secret-registry.js +73 -0
  100. package/dist/model/proc/limits.d.ts +214 -0
  101. package/dist/model/proc/limits.js +221 -0
  102. package/dist/model/proc/progress.d.ts +47 -0
  103. package/dist/model/proc/progress.js +163 -0
  104. package/dist/model/proc/types.d.ts +269 -0
  105. package/dist/model/proc/types.js +15 -0
  106. package/dist/model/proc/wait-view.d.ts +65 -0
  107. package/dist/model/proc/wait-view.js +66 -0
  108. package/dist/model/prompts/copy.d.ts +89 -0
  109. package/dist/model/prompts/copy.js +131 -0
  110. package/dist/model/prompts/fill.d.ts +51 -0
  111. package/dist/model/prompts/fill.js +46 -0
  112. package/dist/model/prompts/limits.d.ts +53 -0
  113. package/dist/model/prompts/limits.js +53 -0
  114. package/dist/model/prompts/search.d.ts +58 -0
  115. package/dist/model/prompts/search.js +146 -0
  116. package/dist/model/prompts/types.d.ts +204 -0
  117. package/dist/model/prompts/types.js +13 -0
  118. package/dist/model/prompts/validate.d.ts +22 -0
  119. package/dist/model/prompts/validate.js +69 -0
  120. package/dist/model/team/activity.d.ts +67 -0
  121. package/dist/model/team/activity.js +130 -0
  122. package/dist/model/team/limits.d.ts +308 -0
  123. package/dist/model/team/limits.js +330 -0
  124. package/dist/model/team/model.d.ts +104 -0
  125. package/dist/model/team/model.js +150 -0
  126. package/dist/model/team/panel-rows.d.ts +48 -0
  127. package/dist/model/team/panel-rows.js +75 -0
  128. package/dist/model/team/timeline.d.ts +74 -0
  129. package/dist/model/team/timeline.js +101 -0
  130. package/dist/model/team/types.d.ts +354 -0
  131. package/dist/model/team/types.js +13 -0
  132. package/dist/model/todo/acceptance.d.ts +120 -0
  133. package/dist/model/todo/acceptance.js +399 -0
  134. package/dist/model/todo/follow-through.d.ts +138 -0
  135. package/dist/model/todo/follow-through.js +248 -0
  136. package/dist/model/todo/limits.d.ts +152 -0
  137. package/dist/model/todo/limits.js +152 -0
  138. package/dist/model/todo/panel-rows.d.ts +45 -0
  139. package/dist/model/todo/panel-rows.js +70 -0
  140. package/dist/model/todo/plan-sections.d.ts +60 -0
  141. package/dist/model/todo/plan-sections.js +108 -0
  142. package/dist/model/todo/row-window.d.ts +51 -0
  143. package/dist/model/todo/row-window.js +107 -0
  144. package/dist/model/todo/types.d.ts +124 -0
  145. package/dist/model/todo/types.js +12 -0
  146. package/dist/model/tools/human-input.d.ts +212 -0
  147. package/dist/model/tools/human-input.js +265 -0
  148. package/dist/model/tools/patch.d.ts +115 -0
  149. package/dist/model/tools/patch.js +453 -0
  150. package/dist/model/tools/terminal-output.d.ts +115 -0
  151. package/dist/model/tools/terminal-output.js +201 -0
  152. package/dist/model/tools/tool-output-store.d.ts +68 -0
  153. package/dist/model/tools/tool-output-store.js +102 -0
  154. package/dist/model/update/limits.d.ts +111 -0
  155. package/dist/model/update/limits.js +111 -0
  156. package/dist/model/update/semver.d.ts +89 -0
  157. package/dist/model/update/semver.js +295 -0
  158. package/dist/model/update/types.d.ts +169 -0
  159. package/dist/model/update/types.js +68 -0
  160. package/dist/testing/governance-fixtures.d.ts +13 -0
  161. package/dist/testing/governance-fixtures.js +98 -0
  162. package/dist/testing/mini-vt.d.ts +28 -0
  163. package/dist/testing/mini-vt.js +158 -0
  164. package/dist/testing/render-at-width.d.ts +16 -0
  165. package/dist/testing/render-at-width.js +57 -0
  166. package/dist/testing/terminal-harness.d.ts +15 -0
  167. package/dist/testing/terminal-harness.js +40 -0
  168. package/dist/testing/vt-screen.d.ts +28 -0
  169. package/dist/testing/vt-screen.js +139 -0
  170. package/dist/ui/ActivityLine.d.ts +26 -0
  171. package/dist/ui/ActivityLine.js +51 -0
  172. package/dist/ui/AutocompletePopup.d.ts +23 -0
  173. package/dist/ui/AutocompletePopup.js +17 -0
  174. package/dist/ui/BottomStatusRow.d.ts +10 -0
  175. package/dist/ui/BottomStatusRow.js +9 -0
  176. package/dist/ui/Composer.d.ts +115 -0
  177. package/dist/ui/Composer.js +64 -0
  178. package/dist/ui/GovernancePanel.d.ts +50 -0
  179. package/dist/ui/GovernancePanel.js +77 -0
  180. package/dist/ui/GovernanceRun.d.ts +18 -0
  181. package/dist/ui/GovernanceRun.js +11 -0
  182. package/dist/ui/Header.d.ts +48 -0
  183. package/dist/ui/Header.js +27 -0
  184. package/dist/ui/Logo.d.ts +32 -0
  185. package/dist/ui/Logo.js +65 -0
  186. package/dist/ui/Markdown.d.ts +29 -0
  187. package/dist/ui/Markdown.js +116 -0
  188. package/dist/ui/PromptCaret.d.ts +11 -0
  189. package/dist/ui/PromptCaret.js +31 -0
  190. package/dist/ui/PromptInput.d.ts +192 -0
  191. package/dist/ui/PromptInput.js +689 -0
  192. package/dist/ui/QueuePanel.d.ts +8 -0
  193. package/dist/ui/QueuePanel.js +9 -0
  194. package/dist/ui/QueueStatusRow.d.ts +24 -0
  195. package/dist/ui/QueueStatusRow.js +51 -0
  196. package/dist/ui/ScrollbackShell.d.ts +132 -0
  197. package/dist/ui/ScrollbackShell.js +26 -0
  198. package/dist/ui/SessionOpener.d.ts +30 -0
  199. package/dist/ui/SessionOpener.js +12 -0
  200. package/dist/ui/StatusBar.d.ts +130 -0
  201. package/dist/ui/StatusBar.js +61 -0
  202. package/dist/ui/TeamPanel.d.ts +76 -0
  203. package/dist/ui/TeamPanel.js +103 -0
  204. package/dist/ui/ToastStack.d.ts +8 -0
  205. package/dist/ui/ToastStack.js +31 -0
  206. package/dist/ui/TodoPanel.d.ts +52 -0
  207. package/dist/ui/TodoPanel.js +214 -0
  208. package/dist/ui/Transcript.d.ts +105 -0
  209. package/dist/ui/Transcript.js +258 -0
  210. package/dist/ui/UpdateLine.d.ts +44 -0
  211. package/dist/ui/UpdateLine.js +129 -0
  212. package/dist/ui/activity-phrases.d.ts +33 -0
  213. package/dist/ui/activity-phrases.js +50 -0
  214. package/dist/ui/capabilities.d.ts +27 -0
  215. package/dist/ui/capabilities.js +65 -0
  216. package/dist/ui/clipboard-task.d.ts +29 -0
  217. package/dist/ui/clipboard-task.js +66 -0
  218. package/dist/ui/clipboard.d.ts +31 -0
  219. package/dist/ui/clipboard.js +157 -0
  220. package/dist/ui/color-runtime.d.ts +5 -0
  221. package/dist/ui/color-runtime.js +29 -0
  222. package/dist/ui/composer-input.d.ts +38 -0
  223. package/dist/ui/composer-input.js +79 -0
  224. package/dist/ui/composer-limits.d.ts +30 -0
  225. package/dist/ui/composer-limits.js +45 -0
  226. package/dist/ui/composer-rows.d.ts +73 -0
  227. package/dist/ui/composer-rows.js +129 -0
  228. package/dist/ui/console-bridge.d.ts +19 -0
  229. package/dist/ui/console-bridge.js +52 -0
  230. package/dist/ui/density.d.ts +26 -0
  231. package/dist/ui/density.js +34 -0
  232. package/dist/ui/display-tab.d.ts +51 -0
  233. package/dist/ui/display-tab.js +82 -0
  234. package/dist/ui/editor-navigation.d.ts +55 -0
  235. package/dist/ui/editor-navigation.js +96 -0
  236. package/dist/ui/editor-reducer.d.ts +108 -0
  237. package/dist/ui/editor-reducer.js +187 -0
  238. package/dist/ui/enter-frames.d.ts +47 -0
  239. package/dist/ui/enter-frames.js +117 -0
  240. package/dist/ui/entries/AssistantEntry.d.ts +37 -0
  241. package/dist/ui/entries/AssistantEntry.js +43 -0
  242. package/dist/ui/entries/CompactionCard.d.ts +88 -0
  243. package/dist/ui/entries/CompactionCard.js +222 -0
  244. package/dist/ui/entries/DiffView.d.ts +61 -0
  245. package/dist/ui/entries/DiffView.js +103 -0
  246. package/dist/ui/entries/EntryFrame.d.ts +23 -0
  247. package/dist/ui/entries/EntryFrame.js +6 -0
  248. package/dist/ui/entries/FastCard.d.ts +53 -0
  249. package/dist/ui/entries/FastCard.js +105 -0
  250. package/dist/ui/entries/GovernanceCard.d.ts +30 -0
  251. package/dist/ui/entries/GovernanceCard.js +32 -0
  252. package/dist/ui/entries/InvocationCard.d.ts +20 -0
  253. package/dist/ui/entries/InvocationCard.js +32 -0
  254. package/dist/ui/entries/QueuedEntry.d.ts +27 -0
  255. package/dist/ui/entries/QueuedEntry.js +33 -0
  256. package/dist/ui/entries/RetryCard.d.ts +56 -0
  257. package/dist/ui/entries/RetryCard.js +60 -0
  258. package/dist/ui/entries/ServiceCard.d.ts +82 -0
  259. package/dist/ui/entries/ServiceCard.js +151 -0
  260. package/dist/ui/entries/TeamCard.d.ts +55 -0
  261. package/dist/ui/entries/TeamCard.js +94 -0
  262. package/dist/ui/entries/TodoCard.d.ts +54 -0
  263. package/dist/ui/entries/TodoCard.js +98 -0
  264. package/dist/ui/entries/ToolCard.d.ts +81 -0
  265. package/dist/ui/entries/ToolCard.js +169 -0
  266. package/dist/ui/entries/ToolPreview.d.ts +59 -0
  267. package/dist/ui/entries/ToolPreview.js +208 -0
  268. package/dist/ui/entries/UserEntry.d.ts +36 -0
  269. package/dist/ui/entries/UserEntry.js +57 -0
  270. package/dist/ui/entries/WaitCard.d.ts +37 -0
  271. package/dist/ui/entries/WaitCard.js +92 -0
  272. package/dist/ui/exit-snapshot.d.ts +43 -0
  273. package/dist/ui/exit-snapshot.js +26 -0
  274. package/dist/ui/frame-differ.d.ts +166 -0
  275. package/dist/ui/frame-differ.js +354 -0
  276. package/dist/ui/frame-observer.d.ts +17 -0
  277. package/dist/ui/frame-observer.js +94 -0
  278. package/dist/ui/frame-parser.d.ts +7 -0
  279. package/dist/ui/frame-parser.js +18 -0
  280. package/dist/ui/gauge.d.ts +39 -0
  281. package/dist/ui/gauge.js +55 -0
  282. package/dist/ui/glyphs.d.ts +178 -0
  283. package/dist/ui/glyphs.js +165 -0
  284. package/dist/ui/governance-copy.d.ts +69 -0
  285. package/dist/ui/governance-copy.js +104 -0
  286. package/dist/ui/governance-status.d.ts +145 -0
  287. package/dist/ui/governance-status.js +326 -0
  288. package/dist/ui/gradient.d.ts +11 -0
  289. package/dist/ui/gradient.js +50 -0
  290. package/dist/ui/ink-runtime.d.ts +4 -0
  291. package/dist/ui/ink-runtime.js +51 -0
  292. package/dist/ui/interaction-copy.d.ts +84 -0
  293. package/dist/ui/interaction-copy.js +41 -0
  294. package/dist/ui/interaction-hints.d.ts +44 -0
  295. package/dist/ui/interaction-hints.js +97 -0
  296. package/dist/ui/layout/AppShell.d.ts +17 -0
  297. package/dist/ui/layout/AppShell.js +6 -0
  298. package/dist/ui/layout/Gutter.d.ts +67 -0
  299. package/dist/ui/layout/Gutter.js +42 -0
  300. package/dist/ui/layout/MeasuredEntry.d.ts +21 -0
  301. package/dist/ui/layout/MeasuredEntry.js +30 -0
  302. package/dist/ui/layout/OverlayFrame.d.ts +73 -0
  303. package/dist/ui/layout/OverlayFrame.js +110 -0
  304. package/dist/ui/layout/ScrollIndicator.d.ts +32 -0
  305. package/dist/ui/layout/ScrollIndicator.js +22 -0
  306. package/dist/ui/layout/ScrollViewport.d.ts +40 -0
  307. package/dist/ui/layout/ScrollViewport.js +222 -0
  308. package/dist/ui/layout/agents-board.d.ts +102 -0
  309. package/dist/ui/layout/agents-board.js +389 -0
  310. package/dist/ui/layout/autocomplete.d.ts +18 -0
  311. package/dist/ui/layout/autocomplete.js +26 -0
  312. package/dist/ui/layout/budget.d.ts +43 -0
  313. package/dist/ui/layout/budget.js +52 -0
  314. package/dist/ui/layout/cells.d.ts +61 -0
  315. package/dist/ui/layout/cells.js +156 -0
  316. package/dist/ui/layout/document-layout.d.ts +13 -0
  317. package/dist/ui/layout/document-layout.js +10 -0
  318. package/dist/ui/layout/follow-state.d.ts +138 -0
  319. package/dist/ui/layout/follow-state.js +148 -0
  320. package/dist/ui/layout/frame.d.ts +36 -0
  321. package/dist/ui/layout/frame.js +39 -0
  322. package/dist/ui/layout/governance-board.d.ts +121 -0
  323. package/dist/ui/layout/governance-board.js +382 -0
  324. package/dist/ui/layout/governance-card.d.ts +53 -0
  325. package/dist/ui/layout/governance-card.js +134 -0
  326. package/dist/ui/layout/governance-chip.d.ts +38 -0
  327. package/dist/ui/layout/governance-chip.js +64 -0
  328. package/dist/ui/layout/governance-panel.d.ts +85 -0
  329. package/dist/ui/layout/governance-panel.js +358 -0
  330. package/dist/ui/layout/governance-roster.d.ts +65 -0
  331. package/dist/ui/layout/governance-roster.js +275 -0
  332. package/dist/ui/layout/header-hints.d.ts +90 -0
  333. package/dist/ui/layout/header-hints.js +110 -0
  334. package/dist/ui/layout/header-left.d.ts +115 -0
  335. package/dist/ui/layout/header-left.js +206 -0
  336. package/dist/ui/layout/invocation-card.d.ts +41 -0
  337. package/dist/ui/layout/invocation-card.js +91 -0
  338. package/dist/ui/layout/kit-chip.d.ts +50 -0
  339. package/dist/ui/layout/kit-chip.js +81 -0
  340. package/dist/ui/layout/overlay-window.d.ts +43 -0
  341. package/dist/ui/layout/overlay-window.js +51 -0
  342. package/dist/ui/layout/queue-layout.d.ts +19 -0
  343. package/dist/ui/layout/queue-layout.js +26 -0
  344. package/dist/ui/layout/rail.d.ts +7 -0
  345. package/dist/ui/layout/rail.js +16 -0
  346. package/dist/ui/layout/scroll-indicator.d.ts +27 -0
  347. package/dist/ui/layout/scroll-indicator.js +36 -0
  348. package/dist/ui/layout/scroll.d.ts +37 -0
  349. package/dist/ui/layout/scroll.js +99 -0
  350. package/dist/ui/layout/scrollbar-geometry.d.ts +17 -0
  351. package/dist/ui/layout/scrollbar-geometry.js +13 -0
  352. package/dist/ui/layout/session-chip.d.ts +52 -0
  353. package/dist/ui/layout/session-chip.js +64 -0
  354. package/dist/ui/layout/shortcut-panel-layout.d.ts +191 -0
  355. package/dist/ui/layout/shortcut-panel-layout.js +321 -0
  356. package/dist/ui/layout/status-detail-layout.d.ts +9 -0
  357. package/dist/ui/layout/status-detail-layout.js +79 -0
  358. package/dist/ui/layout/status-layout.d.ts +140 -0
  359. package/dist/ui/layout/status-layout.js +262 -0
  360. package/dist/ui/layout/task-summary-cell.d.ts +61 -0
  361. package/dist/ui/layout/task-summary-cell.js +65 -0
  362. package/dist/ui/layout/team-panel.d.ts +18 -0
  363. package/dist/ui/layout/team-panel.js +25 -0
  364. package/dist/ui/layout/team-row.d.ts +139 -0
  365. package/dist/ui/layout/team-row.js +246 -0
  366. package/dist/ui/layout/todo-layout.d.ts +62 -0
  367. package/dist/ui/layout/todo-layout.js +102 -0
  368. package/dist/ui/layout/useTerminalSize.d.ts +13 -0
  369. package/dist/ui/layout/useTerminalSize.js +50 -0
  370. package/dist/ui/layout/viewport-geometry.d.ts +29 -0
  371. package/dist/ui/layout/viewport-geometry.js +28 -0
  372. package/dist/ui/layout/virtual-window.d.ts +112 -0
  373. package/dist/ui/layout/virtual-window.js +494 -0
  374. package/dist/ui/layout/wait-bar.d.ts +34 -0
  375. package/dist/ui/layout/wait-bar.js +48 -0
  376. package/dist/ui/layout/wrap-rows.d.ts +26 -0
  377. package/dist/ui/layout/wrap-rows.js +88 -0
  378. package/dist/ui/live-clamp.d.ts +14 -0
  379. package/dist/ui/live-clamp.js +46 -0
  380. package/dist/ui/markdown-blocks.d.ts +107 -0
  381. package/dist/ui/markdown-blocks.js +240 -0
  382. package/dist/ui/overlays/AgentsBoardOverlay.d.ts +57 -0
  383. package/dist/ui/overlays/AgentsBoardOverlay.js +183 -0
  384. package/dist/ui/overlays/ConfirmDialog.d.ts +31 -0
  385. package/dist/ui/overlays/ConfirmDialog.js +44 -0
  386. package/dist/ui/overlays/GovernanceBoardOverlay.d.ts +41 -0
  387. package/dist/ui/overlays/GovernanceBoardOverlay.js +76 -0
  388. package/dist/ui/overlays/GovernanceSettingsPage.d.ts +48 -0
  389. package/dist/ui/overlays/GovernanceSettingsPage.js +93 -0
  390. package/dist/ui/overlays/HelpOverlay.d.ts +29 -0
  391. package/dist/ui/overlays/HelpOverlay.js +232 -0
  392. package/dist/ui/overlays/KitEditor.d.ts +23 -0
  393. package/dist/ui/overlays/KitEditor.js +101 -0
  394. package/dist/ui/overlays/KitManager.d.ts +23 -0
  395. package/dist/ui/overlays/KitManager.js +104 -0
  396. package/dist/ui/overlays/KitPicker.d.ts +49 -0
  397. package/dist/ui/overlays/KitPicker.js +58 -0
  398. package/dist/ui/overlays/ModelDiscoveryList.d.ts +23 -0
  399. package/dist/ui/overlays/ModelDiscoveryList.js +161 -0
  400. package/dist/ui/overlays/ModelPicker.d.ts +26 -0
  401. package/dist/ui/overlays/ModelPicker.js +63 -0
  402. package/dist/ui/overlays/ModelProfileEditor.d.ts +29 -0
  403. package/dist/ui/overlays/ModelProfileEditor.js +168 -0
  404. package/dist/ui/overlays/ModelProfilePicker.d.ts +48 -0
  405. package/dist/ui/overlays/ModelProfilePicker.js +231 -0
  406. package/dist/ui/overlays/PlanReviewOverlay.d.ts +51 -0
  407. package/dist/ui/overlays/PlanReviewOverlay.js +132 -0
  408. package/dist/ui/overlays/PromptEditorPage.d.ts +48 -0
  409. package/dist/ui/overlays/PromptEditorPage.js +227 -0
  410. package/dist/ui/overlays/PromptLibraryOverlay.d.ts +37 -0
  411. package/dist/ui/overlays/PromptLibraryOverlay.js +191 -0
  412. package/dist/ui/overlays/PromptPicker.d.ts +36 -0
  413. package/dist/ui/overlays/PromptPicker.js +129 -0
  414. package/dist/ui/overlays/PromptTextArea.d.ts +86 -0
  415. package/dist/ui/overlays/PromptTextArea.js +141 -0
  416. package/dist/ui/overlays/QuestionOverlay.d.ts +39 -0
  417. package/dist/ui/overlays/QuestionOverlay.js +258 -0
  418. package/dist/ui/overlays/QueueOverlay.d.ts +22 -0
  419. package/dist/ui/overlays/QueueOverlay.js +79 -0
  420. package/dist/ui/overlays/SettingsScreen.d.ts +228 -0
  421. package/dist/ui/overlays/SettingsScreen.js +1037 -0
  422. package/dist/ui/overlays/ShortcutPanel.d.ts +39 -0
  423. package/dist/ui/overlays/ShortcutPanel.js +106 -0
  424. package/dist/ui/overlays/TeamFanoutPage.d.ts +51 -0
  425. package/dist/ui/overlays/TeamFanoutPage.js +90 -0
  426. package/dist/ui/overlays/governance-settings.d.ts +79 -0
  427. package/dist/ui/overlays/governance-settings.js +140 -0
  428. package/dist/ui/overlays/kit-picker-state.d.ts +87 -0
  429. package/dist/ui/overlays/kit-picker-state.js +136 -0
  430. package/dist/ui/overlays/kit-settings-state.d.ts +129 -0
  431. package/dist/ui/overlays/kit-settings-state.js +268 -0
  432. package/dist/ui/overlays/model-probe-view.d.ts +128 -0
  433. package/dist/ui/overlays/model-probe-view.js +225 -0
  434. package/dist/ui/overlays/model-profile-state.d.ts +177 -0
  435. package/dist/ui/overlays/model-profile-state.js +301 -0
  436. package/dist/ui/overlays/prompt-library-state.d.ts +162 -0
  437. package/dist/ui/overlays/prompt-library-state.js +335 -0
  438. package/dist/ui/overlays/prompt-picker-state.d.ts +71 -0
  439. package/dist/ui/overlays/prompt-picker-state.js +98 -0
  440. package/dist/ui/overlays/team-fanout-state.d.ts +106 -0
  441. package/dist/ui/overlays/team-fanout-state.js +155 -0
  442. package/dist/ui/overlays/use-model-probe.d.ts +30 -0
  443. package/dist/ui/overlays/use-model-probe.js +109 -0
  444. package/dist/ui/palettes.d.ts +112 -0
  445. package/dist/ui/palettes.js +130 -0
  446. package/dist/ui/paste-frames.d.ts +91 -0
  447. package/dist/ui/paste-frames.js +117 -0
  448. package/dist/ui/paste-tokens.d.ts +90 -0
  449. package/dist/ui/paste-tokens.js +147 -0
  450. package/dist/ui/render-cache.d.ts +81 -0
  451. package/dist/ui/render-cache.js +196 -0
  452. package/dist/ui/render-governor.d.ts +54 -0
  453. package/dist/ui/render-governor.js +78 -0
  454. package/dist/ui/run-metrics.d.ts +23 -0
  455. package/dist/ui/run-metrics.js +27 -0
  456. package/dist/ui/run-status-row.d.ts +63 -0
  457. package/dist/ui/run-status-row.js +54 -0
  458. package/dist/ui/screen.d.ts +107 -0
  459. package/dist/ui/screen.js +234 -0
  460. package/dist/ui/scrollback/LiveTail.d.ts +115 -0
  461. package/dist/ui/scrollback/LiveTail.js +48 -0
  462. package/dist/ui/scrollback/band.d.ts +114 -0
  463. package/dist/ui/scrollback/band.js +143 -0
  464. package/dist/ui/scrollback/budget.d.ts +90 -0
  465. package/dist/ui/scrollback/budget.js +100 -0
  466. package/dist/ui/scrollback/canvas.d.ts +100 -0
  467. package/dist/ui/scrollback/canvas.js +114 -0
  468. package/dist/ui/scrollback/cursor-probe.d.ts +71 -0
  469. package/dist/ui/scrollback/cursor-probe.js +133 -0
  470. package/dist/ui/scrollback/drain.d.ts +32 -0
  471. package/dist/ui/scrollback/drain.js +64 -0
  472. package/dist/ui/scrollback/exit-summary.d.ts +23 -0
  473. package/dist/ui/scrollback/exit-summary.js +25 -0
  474. package/dist/ui/scrollback/limits.d.ts +98 -0
  475. package/dist/ui/scrollback/limits.js +98 -0
  476. package/dist/ui/scrollback/live-preview.d.ts +34 -0
  477. package/dist/ui/scrollback/live-preview.js +130 -0
  478. package/dist/ui/scrollback/overflow-print.d.ts +108 -0
  479. package/dist/ui/scrollback/overflow-print.js +120 -0
  480. package/dist/ui/scrollback/renderer.d.ts +48 -0
  481. package/dist/ui/scrollback/renderer.js +186 -0
  482. package/dist/ui/scrollback/scrollback-writer.d.ts +174 -0
  483. package/dist/ui/scrollback/scrollback-writer.js +648 -0
  484. package/dist/ui/scrollback/settled-boundary.d.ts +42 -0
  485. package/dist/ui/scrollback/settled-boundary.js +109 -0
  486. package/dist/ui/scrollback/tail-anchor.d.ts +71 -0
  487. package/dist/ui/scrollback/tail-anchor.js +79 -0
  488. package/dist/ui/scrollback/tail-window.d.ts +73 -0
  489. package/dist/ui/scrollback/tail-window.js +89 -0
  490. package/dist/ui/scrollback/use-scrollback-view.d.ts +139 -0
  491. package/dist/ui/scrollback/use-scrollback-view.js +601 -0
  492. package/dist/ui/scrollback/writer-shapes.d.ts +127 -0
  493. package/dist/ui/scrollback/writer-shapes.js +159 -0
  494. package/dist/ui/scrollbar-controller.d.ts +30 -0
  495. package/dist/ui/scrollbar-controller.js +124 -0
  496. package/dist/ui/selection/highlight.d.ts +39 -0
  497. package/dist/ui/selection/highlight.js +64 -0
  498. package/dist/ui/selection/screen-mirror.d.ts +24 -0
  499. package/dist/ui/selection/screen-mirror.js +35 -0
  500. package/dist/ui/selection/selection-controller.d.ts +104 -0
  501. package/dist/ui/selection/selection-controller.js +372 -0
  502. package/dist/ui/selection/selection.d.ts +90 -0
  503. package/dist/ui/selection/selection.js +223 -0
  504. package/dist/ui/shortcuts.d.ts +81 -0
  505. package/dist/ui/shortcuts.js +221 -0
  506. package/dist/ui/status-feedback.d.ts +35 -0
  507. package/dist/ui/status-feedback.js +38 -0
  508. package/dist/ui/stdout-frame-writer.d.ts +74 -0
  509. package/dist/ui/stdout-frame-writer.js +155 -0
  510. package/dist/ui/team-status.d.ts +166 -0
  511. package/dist/ui/team-status.js +252 -0
  512. package/dist/ui/terminal-plan.d.ts +52 -0
  513. package/dist/ui/terminal-plan.js +49 -0
  514. package/dist/ui/theme.d.ts +96 -0
  515. package/dist/ui/theme.js +130 -0
  516. package/dist/ui/transcript-text.d.ts +41 -0
  517. package/dist/ui/transcript-text.js +282 -0
  518. package/dist/ui/use-height-store.d.ts +31 -0
  519. package/dist/ui/use-height-store.js +76 -0
  520. package/dist/ui/use-render-governor.d.ts +39 -0
  521. package/dist/ui/use-render-governor.js +57 -0
  522. package/dist/ui/use-wheel-routing.d.ts +57 -0
  523. package/dist/ui/use-wheel-routing.js +152 -0
  524. package/dist/ui/win-vt-force.d.ts +136 -0
  525. package/dist/ui/win-vt-force.js +237 -0
  526. package/dist/ui/win-vt-input.d.ts +57 -0
  527. package/dist/ui/win-vt-input.js +62 -0
  528. package/package.json +86 -4
@@ -0,0 +1,75 @@
1
+ /**
2
+ * `selectPanelRows` - which children the live roster shows (team-live-activity
3
+ * F-2).
4
+ *
5
+ * ASCII ONLY: `src/team/**` is inside the glyph scanner's scope.
6
+ *
7
+ * THE DEFECT THIS REPLACES. `TeamPanel` took the first `panelMaxRows` runs by
8
+ * ARRAY INDEX, and the slot pool hands out indices from a shared cursor in
9
+ * order - so at `maxSubagents: 8, maxConcurrent: 3` the first five rows are the
10
+ * five that finished first and everything still working sits behind `+3 more`.
11
+ * The one thing the requirement asks the panel for - show that subagents are
12
+ * running - is the one thing it stopped doing at the fan-out widths the
13
+ * requirement explicitly permits.
14
+ *
15
+ * Pure: a function of a roster snapshot and a row cap, with no clock, no
16
+ * terminal and no `Agent` anywhere near it.
17
+ */
18
+ const RUNNING = new Set(['starting', 'thinking', 'tool', 'waiting']);
19
+ const SETTLED = new Set(['done', 'failed', 'aborted']);
20
+ /** 0 running, 1 queued, 2 settled. */
21
+ function group(run) {
22
+ if (RUNNING.has(run.phase))
23
+ return 0;
24
+ if (SETTLED.has(run.phase))
25
+ return 2;
26
+ return 1;
27
+ }
28
+ /**
29
+ * Rank the roster so that what is VISIBLE is what is HAPPENING.
30
+ *
31
+ * Ordering inside each group is chosen for ROW STABILITY, which is the real
32
+ * usability constraint here: the panel re-renders every 200 ms and a row that
33
+ * changes position on each tick is unreadable.
34
+ * - running: by `startedAt` ascending. `startedAt` changes exactly once in a
35
+ * run's life outside of its first assignment - on a cold-start retry (F-4),
36
+ * which re-stamps it (P2-4). A retried child therefore moves to the end of
37
+ * the running group, once, at the moment it visibly restarts. That is the
38
+ * correct reading of the ordering rule rather than an exception to it: the
39
+ * group is ordered by "how long has this been going", and a retry resets
40
+ * exactly that.
41
+ * - queued: original order; that IS the order the pool will start them in.
42
+ * - settled: most recently ended first, so the newest result is the one that
43
+ * stays on screen as others complete.
44
+ * A run changes position at most twice in its life - queued -> running ->
45
+ * settled - and each move carries real information.
46
+ *
47
+ * The final tiebreak is the original index. `Array.prototype.sort` is stable in
48
+ * every Node this package supports, so the tiebreak is not load-bearing; it is
49
+ * here so the ordering is total and the test can assert it without depending on
50
+ * that guarantee.
51
+ */
52
+ export function selectPanelRows(runs, max) {
53
+ const ranked = runs
54
+ .map((run, index) => ({ run, index }))
55
+ .sort((a, b) => {
56
+ const ga = group(a.run);
57
+ const gb = group(b.run);
58
+ if (ga !== gb)
59
+ return ga - gb;
60
+ if (ga === 0)
61
+ return (a.run.startedAt ?? 0) - (b.run.startedAt ?? 0) || a.index - b.index;
62
+ if (ga === 2)
63
+ return (b.run.endedAt ?? 0) - (a.run.endedAt ?? 0) || a.index - b.index;
64
+ return a.index - b.index;
65
+ })
66
+ .map((e) => e.run);
67
+ const limit = Math.max(0, max);
68
+ const visible = ranked.slice(0, limit);
69
+ const hidden = ranked.slice(limit);
70
+ return {
71
+ visible,
72
+ hiddenTotal: hidden.length,
73
+ hiddenRunning: hidden.filter((r) => RUNNING.has(r.phase)).length,
74
+ };
75
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * The per-child event ring behind the Agents board's `timeline` section
3
+ * (tui-subagent-panel §4.5).
4
+ *
5
+ * WHY A RING ON THE RUN rather than a second store: a `SubagentRun` already IS "one
6
+ * child's projection", and every UI surface reads it through `publish()`. A separate
7
+ * store would be a second authority for the same subject and would have to be
8
+ * subscribed to separately - and the four collection points below are all single
9
+ * funnels that already exist (§4.5.2).
10
+ *
11
+ * FIVE KINDS, NOT EVERY TURN (D-12). A turn marker per turn would fill twenty-four
12
+ * slots in a long task and push out the tool calls, which are the part a reader cannot
13
+ * reconstruct from the report. Phase changes are visible in the board's `state` field
14
+ * in real time, so they do not need history.
15
+ *
16
+ * BOUNDED AND PURE. `appendTimeline` returns a NEW array (never mutates the old one),
17
+ * drops the oldest entry past `TEAM_LIMITS.timelineEntries`, and clamps every line to
18
+ * `TEAM_LIMITS.timelineTextChars`. Purity is what lets `publish()`'s shallow copy hold
19
+ * a stable snapshot without knowing this module exists (AC-25).
20
+ *
21
+ * ASCII ONLY: `src/team/**` is inside `glyphs.test.ts`'s static scan.
22
+ *
23
+ * THE TEXT IS ALWAYS BUILT FROM `describeToolActivity` / `sanitizeActivity`, never
24
+ * from raw tool arguments (D-11 / P1-4). That is the boundary that keeps a
25
+ * `write_file` body, a `bash` transcript or a child's prompt out of a surface that is
26
+ * one `JSON.stringify` from a log.
27
+ */
28
+ import type { SubagentPhase, SubagentRun } from './types.js';
29
+ export type TimelineKind = 'tool' | 'retry' | 'compact' | 'overseer' | 'settle';
30
+ export interface TimelineEntry {
31
+ kind: TimelineKind;
32
+ /** Absolute epoch ms, the same units as `startedAt` / `endedAt` / `lastIntervention.at`. */
33
+ at: number;
34
+ /** Already sanitized + clamped: at most `TEAM_LIMITS.timelineTextChars` characters. */
35
+ text: string;
36
+ /** Whether the tool call succeeded (`tool` only). */
37
+ ok?: boolean;
38
+ /** How long the tool call took in ms (`tool` only). */
39
+ ms?: number;
40
+ }
41
+ export declare function isTerminalPhase(phase: SubagentPhase): boolean;
42
+ /**
43
+ * Append one event, returning a NEW array. The oldest entry is dropped once the ring
44
+ * is full, so the array's length is bounded by `max` for every possible input.
45
+ */
46
+ export declare function appendTimeline(prev: readonly TimelineEntry[] | undefined, entry: TimelineEntry, max?: number): TimelineEntry[];
47
+ /**
48
+ * The terminal event for one ATTEMPT, or `null` when there is nothing to record yet.
49
+ *
50
+ * WHY THIS IS CALLED FROM `publish()` AND NOT FROM `settlePhase` (§4.5.2 / RV-P1-3):
51
+ * `settlePhase` covers the retry loop's exit only, and two paths set a terminal phase
52
+ * directly - the worker's "never started" abort and the cold-start backoff abort. Those
53
+ * are exactly the children whose explanation a reader needs most, and hanging the
54
+ * settle entry on `settlePhase` alone would leave them with no last event.
55
+ *
56
+ * IDEMPOTENCE IS KEYED ON THE ATTEMPT, not on "the last entry is a settle" (I-14): a
57
+ * retry re-stamps `startedAt`, so a new attempt legitimately earns a second terminal
58
+ * entry, while a repeated `publish()` of the same attempt adds nothing.
59
+ */
60
+ export declare function settleTimelineEntry(run: SubagentRun, at: number): TimelineEntry | null;
61
+ /**
62
+ * The run as a reader should see it: unchanged, or with its attempt's terminal event
63
+ * appended once. Called from `publish()`, which is every state change's single exit
64
+ * (§4.5.2) and therefore covers the two paths that set a terminal phase directly.
65
+ *
66
+ * ADDED TO THE EMITTED SNAPSHOT, NEVER TO THE LIVE RUN (this is the part `publish()`
67
+ * makes subtle). `subagent.ts` calls `onUpdate` with a COPY of the run, so writing the
68
+ * entry onto the object `publish()` receives would be lost - and because
69
+ * `settleTimelineEntry` uses the live timeline as its idempotence key, a lost write
70
+ * means every later publish of the same settled child appends another `settle` row to
71
+ * the ring. Keeping the live run untouched makes the entry a property of the VIEW:
72
+ * exactly one terminal event per attempt, however many frames are published.
73
+ */
74
+ export declare function withSettleEntry(run: SubagentRun, at: number): SubagentRun;
@@ -0,0 +1,101 @@
1
+ /**
2
+ * The per-child event ring behind the Agents board's `timeline` section
3
+ * (tui-subagent-panel §4.5).
4
+ *
5
+ * WHY A RING ON THE RUN rather than a second store: a `SubagentRun` already IS "one
6
+ * child's projection", and every UI surface reads it through `publish()`. A separate
7
+ * store would be a second authority for the same subject and would have to be
8
+ * subscribed to separately - and the four collection points below are all single
9
+ * funnels that already exist (§4.5.2).
10
+ *
11
+ * FIVE KINDS, NOT EVERY TURN (D-12). A turn marker per turn would fill twenty-four
12
+ * slots in a long task and push out the tool calls, which are the part a reader cannot
13
+ * reconstruct from the report. Phase changes are visible in the board's `state` field
14
+ * in real time, so they do not need history.
15
+ *
16
+ * BOUNDED AND PURE. `appendTimeline` returns a NEW array (never mutates the old one),
17
+ * drops the oldest entry past `TEAM_LIMITS.timelineEntries`, and clamps every line to
18
+ * `TEAM_LIMITS.timelineTextChars`. Purity is what lets `publish()`'s shallow copy hold
19
+ * a stable snapshot without knowing this module exists (AC-25).
20
+ *
21
+ * ASCII ONLY: `src/team/**` is inside `glyphs.test.ts`'s static scan.
22
+ *
23
+ * THE TEXT IS ALWAYS BUILT FROM `describeToolActivity` / `sanitizeActivity`, never
24
+ * from raw tool arguments (D-11 / P1-4). That is the boundary that keeps a
25
+ * `write_file` body, a `bash` transcript or a child's prompt out of a surface that is
26
+ * one `JSON.stringify` from a log.
27
+ */
28
+ import { TEAM_LIMITS } from './limits.js';
29
+ /** The phases that end an attempt. Used by the settle-idempotence rule below. */
30
+ const TERMINAL_PHASES = new Set(['done', 'failed', 'aborted']);
31
+ export function isTerminalPhase(phase) {
32
+ return TERMINAL_PHASES.has(phase);
33
+ }
34
+ /** Clamp one line to the display budget. Collapses whitespace for the same reason. */
35
+ function clampText(text) {
36
+ const flat = text.replace(/\s+/g, ' ').trim();
37
+ if (flat.length <= TEAM_LIMITS.timelineTextChars)
38
+ return flat;
39
+ return `${flat.slice(0, TEAM_LIMITS.timelineTextChars - 3)}...`;
40
+ }
41
+ /**
42
+ * Append one event, returning a NEW array. The oldest entry is dropped once the ring
43
+ * is full, so the array's length is bounded by `max` for every possible input.
44
+ */
45
+ export function appendTimeline(prev, entry, max = TEAM_LIMITS.timelineEntries) {
46
+ const limit = Number.isFinite(max) ? Math.max(1, Math.floor(max)) : TEAM_LIMITS.timelineEntries;
47
+ const next = [...(prev ?? []), { ...entry, text: clampText(entry.text) }];
48
+ return next.length > limit ? next.slice(next.length - limit) : next;
49
+ }
50
+ /** The first line of a multi-line answer, clamped - a timeline entry is one line. */
51
+ function head(text) {
52
+ if (text === undefined || text.length === 0)
53
+ return '';
54
+ return clampText(text);
55
+ }
56
+ /**
57
+ * The terminal event for one ATTEMPT, or `null` when there is nothing to record yet.
58
+ *
59
+ * WHY THIS IS CALLED FROM `publish()` AND NOT FROM `settlePhase` (§4.5.2 / RV-P1-3):
60
+ * `settlePhase` covers the retry loop's exit only, and two paths set a terminal phase
61
+ * directly - the worker's "never started" abort and the cold-start backoff abort. Those
62
+ * are exactly the children whose explanation a reader needs most, and hanging the
63
+ * settle entry on `settlePhase` alone would leave them with no last event.
64
+ *
65
+ * IDEMPOTENCE IS KEYED ON THE ATTEMPT, not on "the last entry is a settle" (I-14): a
66
+ * retry re-stamps `startedAt`, so a new attempt legitimately earns a second terminal
67
+ * entry, while a repeated `publish()` of the same attempt adds nothing.
68
+ */
69
+ export function settleTimelineEntry(run, at) {
70
+ if (!isTerminalPhase(run.phase))
71
+ return null;
72
+ const attemptStart = run.startedAt ?? 0;
73
+ const last = run.timeline?.[run.timeline.length - 1];
74
+ if (last?.kind === 'settle' && last.at >= attemptStart)
75
+ return null;
76
+ const text = run.phase === 'done'
77
+ ? `done: ${head(run.summary)}`.trim()
78
+ : run.phase === 'failed'
79
+ ? `failed: ${head(run.error)}`.trim()
80
+ : 'aborted';
81
+ return { kind: 'settle', at, text };
82
+ }
83
+ /**
84
+ * The run as a reader should see it: unchanged, or with its attempt's terminal event
85
+ * appended once. Called from `publish()`, which is every state change's single exit
86
+ * (§4.5.2) and therefore covers the two paths that set a terminal phase directly.
87
+ *
88
+ * ADDED TO THE EMITTED SNAPSHOT, NEVER TO THE LIVE RUN (this is the part `publish()`
89
+ * makes subtle). `subagent.ts` calls `onUpdate` with a COPY of the run, so writing the
90
+ * entry onto the object `publish()` receives would be lost - and because
91
+ * `settleTimelineEntry` uses the live timeline as its idempotence key, a lost write
92
+ * means every later publish of the same settled child appends another `settle` row to
93
+ * the ring. Keeping the live run untouched makes the entry a property of the VIEW:
94
+ * exactly one terminal event per attempt, however many frames are published.
95
+ */
96
+ export function withSettleEntry(run, at) {
97
+ const settle = settleTimelineEntry(run, at);
98
+ if (settle === null)
99
+ return run;
100
+ return { ...run, timeline: appendTimeline(run.timeline, settle) };
101
+ }
@@ -0,0 +1,354 @@
1
+ /**
2
+ * Runtime shapes for team mode (team-subagents §5.1 / §5.2).
3
+ *
4
+ * ASCII ONLY: `src/team/**` is inside the glyph scanner's scope.
5
+ *
6
+ * `TeamEvent` is a CLI-LOCAL stream and must stay that way (D-10 / I-5).
7
+ * `packages/core` freezes its runtime export list (`public-api.test.ts`) and
8
+ * forbids host coupling (`no-host-coupling.test.ts`); adding a member to core's
9
+ * `AgentEvent` union would break the first and teach core about a host shape
10
+ * (`SubagentRun`) it has no business defining. The whole feature therefore
11
+ * changes ZERO files under `packages/core/` (AC-12).
12
+ */
13
+ import type { TokenUsage } from '@aragon-agent/core';
14
+ import type { ActivityArgs } from './activity.js';
15
+ import type { TimelineEntry } from './timeline.js';
16
+ import type { GovernanceSpecExt } from '../governance/types.js';
17
+ /** One normalized delegation request. Produced only by `normalizeSubagentSpecs`. */
18
+ export interface SubagentSpec {
19
+ /** Slug, unique within the dispatch. Shown in the panel, the report and logs. */
20
+ label: string;
21
+ /** <= TEAM_LIMITS.descriptionChars. What this subagent is for. */
22
+ description: string;
23
+ /** <= TEAM_LIMITS.promptChars. Self-contained: the child sees no history. */
24
+ prompt: string;
25
+ /**
26
+ * Force the plan-mode gate on for this child regardless of session mode.
27
+ * TIGHTENING ONLY (D-13): there is no field anywhere that gives a child more
28
+ * permission than the session it was spawned from.
29
+ */
30
+ readOnly: boolean;
31
+ /**
32
+ * Set only by the governance engine (governance-mode section 8.3). Its presence is what
33
+ * `isGovernedDispatch` reads to keep a governed dispatch out of the transcript.
34
+ */
35
+ governance?: GovernanceSpecExt;
36
+ }
37
+ export type SubagentPhase = 'queued' | 'starting' | 'thinking' | 'tool' | 'waiting' | 'done' | 'failed' | 'aborted';
38
+ /** Live, mutable record of one child. Projected into the UI and the report. */
39
+ export interface SubagentRun {
40
+ label: string;
41
+ description: string;
42
+ phase: SubagentPhase;
43
+ startedAt?: number;
44
+ endedAt?: number;
45
+ turns: number;
46
+ toolCalls: number;
47
+ lastTool?: string;
48
+ usage: TokenUsage;
49
+ /**
50
+ * Paths seen going through `write_file` / `edit_file`, deduped and capped at
51
+ * `TEAM_LIMITS.filesTouchedMax`.
52
+ *
53
+ * BEST-EFFORT BY CONSTRUCTION: a child that writes through `bash` is invisible
54
+ * here. The conflict warning in the report says "review before trusting
55
+ * either" rather than claiming completeness, and that wording is load-bearing
56
+ * (R-2).
57
+ */
58
+ filesTouched: string[];
59
+ messagesSent: number;
60
+ /** The child's final assistant text. The only thing the lead sees of its work. */
61
+ summary?: string;
62
+ error?: string;
63
+ /** Hit `team.maxTurnsPerSubagent` and was stopped mid-work. */
64
+ truncated?: boolean;
65
+ /**
66
+ * Compactions this child performed on its OWN history
67
+ * (context-auto-compaction-hardening §3.4.4 / W3).
68
+ *
69
+ * OPTIONAL, so every existing construction site and fixture compiles
70
+ * unchanged. Absent and `0` mean the same thing to every reader.
71
+ */
72
+ compactions?: number;
73
+ /**
74
+ * Prose the child is writing right now, sanitized and clamped to
75
+ * `TEAM_LIMITS.activityChars`. Set only between tool calls; cleared on
76
+ * `turn_start`, on `tool_execution_start` and on `tool_execution_end` so it
77
+ * can never describe work the child has already finished.
78
+ *
79
+ * THE CLAMP HERE IS A STORAGE CEILING, NOT A COLUMN WIDTH (P0-1). The panel
80
+ * re-clamps to `activityBudget(cols)` at render. Do not "simplify" by clamping
81
+ * to the display budget here: this value has no terminal.
82
+ *
83
+ * NEVER LOGGED and never persisted: it is ephemeral by construction and a
84
+ * resumed session has no live dispatch.
85
+ */
86
+ activity?: string;
87
+ /**
88
+ * The five argument fields any of the nine known tools might want to show,
89
+ * picked at capture time by `pickActivityArgs` and elided to
90
+ * `TEAM_LIMITS.activityArgChars` each.
91
+ *
92
+ * A PICKED SUBSET, NOT `event.args` (P1-4). The run is shallow-copied into the
93
+ * live snapshot and into every `agent_update` event by `publish()`, and again
94
+ * into `DispatchOutcome.runs` by `dispatch()`, which `TeamCard` holds in the
95
+ * transcript for the session. Holding `event.args` would mean holding
96
+ * `write_file`'s `content` - a whole file, unbounded - along all of those
97
+ * paths, and would put a file body one `JSON.stringify` from a log.
98
+ *
99
+ * Stored unformatted because the PANEL owns the wide/narrow decision and it is
100
+ * the only object that knows the terminal width. A formatted string here would
101
+ * bake one terminal's width into a value the report and the headless writer
102
+ * also read.
103
+ *
104
+ * Cleared on `turn_start` and `tool_execution_end` (P1-5).
105
+ */
106
+ activityArgs?: ActivityArgs;
107
+ /** `team_wait` calls refused as unanswerable (F-3). Pulled from the bus on
108
+ * `tool_execution_end`, the same way `messagesSent` is. */
109
+ blockedWaits?: number;
110
+ /** Cold-start retries spent (F-4). 0 or absent for the overwhelming majority
111
+ * of runs; `1` at most under `TEAM_LIMITS.maxColdStartRetries`. */
112
+ retries?: number;
113
+ /**
114
+ * Whether the error that ended this attempt was transport-level and
115
+ * retryable, read structurally off `LLMError.retryable`.
116
+ *
117
+ * NOT RENDERED ANYWHERE. It exists so `TeamRuntime` can decide without
118
+ * re-parsing `run.error`, which is a human-facing sentence produced by
119
+ * `formatStreamError` and must never become a machine-readable contract.
120
+ */
121
+ retryable?: boolean;
122
+ /**
123
+ * The child's LIVE API-retry state (llm-api-retry-backoff §6.10), or absent when
124
+ * it is not in a backoff.
125
+ *
126
+ * THIS EXISTS BECAUSE A CHILD'S RETRY IS OTHERWISE INVISIBLE (R-14). Subagents
127
+ * inherit the lead's retry policy for free — `TeamRuntime` reuses the lead's
128
+ * registry instance — but a child's `retry_scheduled` goes to that CHILD's own
129
+ * `Agent` listeners and never reaches the lead's `ViewState`. Without this field
130
+ * a subagent spending three minutes in backoff shows no card, no chip and no
131
+ * countdown: the dispatch simply appears hung, which is the single worst reading
132
+ * of a mechanism whose whole claim is that waiting is now legible.
133
+ *
134
+ * The fix uses the channel that already exists rather than inventing a second
135
+ * card: `TeamCard` and `transcript-text` already render one row per child, and
136
+ * this rides on it. `ViewState.retry` stays LEAD-ONLY, and the lead's status-bar
137
+ * chip is deliberately NOT driven by children — `agents 3/5` already reports the
138
+ * dispatch, and a second aggregate would put two numbers on the bar that
139
+ * disagree about what "3" means.
140
+ *
141
+ * EPHEMERAL, exactly like `activity` and `activityArgs`: cleared on the child's
142
+ * next `turn_end` or terminal error, never persisted, and a settled team entry
143
+ * keeps only what the run finally did.
144
+ *
145
+ * NO `resumeAt`, DELIBERATELY, and this is the one place §6.10's sketch is not
146
+ * followed. A countdown needs something to re-render it, and nothing does: the
147
+ * team row is drawn from `agent_update`, a child in backoff emits exactly ONE
148
+ * event for the whole wait, and the lead's 1 Hz `retryTick` is gated on the
149
+ * LEAD's own `state.retry`. A `7s` that never changed for thirty seconds is a
150
+ * worse readout than no number at all — it reads as a hung countdown, which is
151
+ * precisely the impression this row exists to remove. The counter alone is
152
+ * honest and is what AC-34 asserts.
153
+ */
154
+ retry?: {
155
+ attempt: number;
156
+ maxRetries: number;
157
+ };
158
+ /**
159
+ * Supervisor inspections this child received (team-overseer). Optional so
160
+ * every existing fixture compiles; absent and `0` read the same.
161
+ */
162
+ interventions?: number;
163
+ /**
164
+ * Supervisor-driven rebuilds this child went through (team-overseer). The
165
+ * run object survives a rebuild with the same label, so this is where the
166
+ * report reads "this row is the Nth body of the same brief".
167
+ */
168
+ replacements?: number;
169
+ /**
170
+ * The most recent supervisor decision applied to this child
171
+ * (subagent-overseer-v2 section 6). TRANSIENT, never persisted - the
172
+ * same rule as `activity` / `activityArgs`; a resumed session has no
173
+ * live dispatch. The strip that enforces it is `PERSIST_STRIP_FIELDS` in
174
+ * `team/settled.ts` (tui-subagent-panel §4.5.4): it stays on the settled run,
175
+ * because the card's badge and the supervision report read it there, and the
176
+ * SAVE boundary is where it is removed.
177
+ *
178
+ * `at` is ABSOLUTE epoch ms, the same units as `startedAt` / `endedAt`
179
+ * (R-P2-3), so the panel renders `nudged 2m` with one subtraction and
180
+ * no second clock convention. `reasonHead` <= 60 chars, for the UI
181
+ * badge line only.
182
+ */
183
+ lastIntervention?: {
184
+ action: OverseerAction;
185
+ at: number;
186
+ reasonHead: string;
187
+ };
188
+ /**
189
+ * The last `TEAM_LIMITS.timelineEntries` (24) events of this child
190
+ * (tui-subagent-panel §4.5 / §7).
191
+ *
192
+ * EPHEMERAL, on exactly the same terms as `activity` / `activityArgs` / `retry`, and
193
+ * guaranteed by TWO independent strips (`team/settled.ts`): `settledRun()` at the
194
+ * dispatch exit and `stripEphemeralRuns()` in `saveSession`'s chain. One gate is not
195
+ * enough - the live entry's runs are written by `teamUpdate` during a dispatch, so a
196
+ * checkpoint or an exit flush would otherwise carry the ring to disk (§4.5.4).
197
+ *
198
+ * NEVER persisted, never in `aragon exec`'s stream either: `exec/runner.ts`'s
199
+ * `emitTeam` builds its events from an explicit field list, so a new run field cannot
200
+ * leak into `stream-json` (AC-22).
201
+ *
202
+ * `at` is ABSOLUTE epoch ms (the units of `startedAt` / `lastIntervention.at`), and
203
+ * each `text` is already sanitized and clamped, so appending is the only write and
204
+ * `appendTimeline` is the only appender.
205
+ */
206
+ timeline?: TimelineEntry[];
207
+ }
208
+ /** What the supervisor may do with one inspected child. */
209
+ export type OverseerAction = 'wait' | 'nudge' | 'replace' | 'abandon';
210
+ /**
211
+ * One supervisor decision, already normalized and clamped.
212
+ *
213
+ * Produced ONLY by `normalizeOverseerDecision` (repair, never reject): an
214
+ * unparseable or out-of-budget model answer becomes `wait` with the default
215
+ * interval, because supervision must not kill a healthy child.
216
+ */
217
+ export interface OverseerDecision {
218
+ action: OverseerAction;
219
+ /** <= TEAM_LIMITS.overseerReasonChars. Why, for the report and the log. */
220
+ reason: string;
221
+ /** `nudge` only: <= TEAM_LIMITS.overseerGuidanceChars. Steered into the child. */
222
+ guidance?: string;
223
+ /** Model-chosen next check, clamped to the structural range. */
224
+ nextCheckMs?: number;
225
+ }
226
+ /** One supervisor intervention, as recorded on the outcome and rendered. */
227
+ export interface OverseerIntervention {
228
+ label: string;
229
+ at: number;
230
+ action: OverseerAction;
231
+ reason: string;
232
+ /**
233
+ * What the trigger was: event stall, wall-clock check, the child's turn
234
+ * cap (F-8 A'2 - an inspection the supervisor then ruled on), post-mortem,
235
+ * or the supervisor going QUIET (subagent-overseer-v2 D-10) - the look
236
+ * budget ran out and supervision stopped waking this child. A VALUE OF
237
+ * THE UNION, never a reason prefix: a human-readable sentence is not a
238
+ * machine contract (the `run.error` rule).
239
+ */
240
+ trigger: 'silence' | 'clock' | 'turncap' | 'postmortem' | 'quiet';
241
+ }
242
+ /**
243
+ * A terminal supervisor decision handed to the WORKER LOOP, which is the only
244
+ * place a child's `prompt()` is awaited and therefore the only place a
245
+ * lifecycle change can be applied without orphaning the replacement (I-OV1).
246
+ *
247
+ * Set by `TeamRuntime` on the handle, then `handle.abort()`; consumed and
248
+ * left in place (never cleared) by `runOne` after the await resolves.
249
+ */
250
+ export interface OverseerVerdict {
251
+ action: 'replace' | 'abandon';
252
+ reason: string;
253
+ guidance?: string;
254
+ }
255
+ /** One message on the team bus. */
256
+ export interface TeamMessage {
257
+ from: string;
258
+ to: string;
259
+ subject: string;
260
+ body: string;
261
+ at: number;
262
+ }
263
+ /** Everything one dispatch produced. The sole input to `buildDispatchReport`. */
264
+ export interface DispatchOutcome {
265
+ dispatchId: string;
266
+ runs: SubagentRun[];
267
+ /** Specs the model asked for, BEFORE the cap — the "n of m requested" line. */
268
+ requested: number;
269
+ startedAt: number;
270
+ endedAt: number;
271
+ aborted: boolean;
272
+ /** Messages addressed to `lead`; surfaced in their own report section. */
273
+ leadMail: TeamMessage[];
274
+ /**
275
+ * Every supervisor decision that was applied (team-overseer), in order.
276
+ * Bounded by the per-child inspection budget; rendered as the report's
277
+ * Overseer section so the lead can see WHO was nudged or replaced and why.
278
+ */
279
+ interventions?: OverseerIntervention[];
280
+ /**
281
+ * Summed across all children. Real spend; it must reach the status bar
282
+ * (§3.9). Every child runs the LEAD's model (main-agent parity), so one
283
+ * total priced at the lead's table is the honest accounting.
284
+ */
285
+ usage: TokenUsage;
286
+ /**
287
+ * The supervisor's own fast-tier spend for this dispatch
288
+ * (subagent-overseer-v2 D-7). Absent when nothing supervised the
289
+ * dispatch; read straight off the provider at dispatch end so there is
290
+ * exactly one accounting of it.
291
+ */
292
+ overseerUsage?: TokenUsage;
293
+ /** Inspection calls made, including ones that failed softly. */
294
+ overseerCalls?: number;
295
+ /**
296
+ * EDGE-LATCHED, once per dispatch (D-10): the fast tier was missing at
297
+ * least one cadence tick and the children waited UNASSISTED - announced,
298
+ * never killed. The per-child wait events of a degraded tick
299
+ * deliberately do NOT enter `interventions`; this flag plus the tick
300
+ * count below are the report's aggregate note.
301
+ */
302
+ overseerDegraded?: boolean;
303
+ /** How many cadence ticks ran unassisted (the aggregate note's number). */
304
+ overseerDegradedTicks?: number;
305
+ }
306
+ /**
307
+ * What the UI renders: a cheap immutable projection, rebuilt per event.
308
+ *
309
+ * Held in `ViewState.team` and NEVER persisted — a resumed session has no live
310
+ * dispatch, and pretending otherwise is what P1-5 is about.
311
+ */
312
+ export interface TeamSnapshot {
313
+ dispatchId: string;
314
+ active: boolean;
315
+ runs: SubagentRun[];
316
+ requested: number;
317
+ startedAt: number;
318
+ messageCount: number;
319
+ lastMessage?: TeamMessage;
320
+ }
321
+ /**
322
+ * The CLI-local event stream. `TeamRuntime` emits; `AgentController.subscribeTeam`
323
+ * forwards; `App`, `runHeadless` and `attachTeamEvents` consume.
324
+ */
325
+ export type TeamEvent = {
326
+ type: 'dispatch_start';
327
+ dispatchId: string;
328
+ requested: number;
329
+ specs: SubagentSpec[];
330
+ } | {
331
+ type: 'agent_update';
332
+ dispatchId: string;
333
+ run: SubagentRun;
334
+ } | {
335
+ type: 'usage';
336
+ dispatchId: string;
337
+ label: string;
338
+ usage: TokenUsage;
339
+ } | {
340
+ type: 'message';
341
+ dispatchId: string;
342
+ message: TeamMessage;
343
+ } | {
344
+ type: 'overseer';
345
+ dispatchId: string;
346
+ label: string;
347
+ decision: OverseerDecision;
348
+ trigger: OverseerIntervention['trigger'];
349
+ } | {
350
+ type: 'dispatch_end';
351
+ dispatchId: string;
352
+ outcome: DispatchOutcome;
353
+ };
354
+ export type TeamEventListener = (event: TeamEvent) => void;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Runtime shapes for team mode (team-subagents §5.1 / §5.2).
3
+ *
4
+ * ASCII ONLY: `src/team/**` is inside the glyph scanner's scope.
5
+ *
6
+ * `TeamEvent` is a CLI-LOCAL stream and must stay that way (D-10 / I-5).
7
+ * `packages/core` freezes its runtime export list (`public-api.test.ts`) and
8
+ * forbids host coupling (`no-host-coupling.test.ts`); adding a member to core's
9
+ * `AgentEvent` union would break the first and teach core about a host shape
10
+ * (`SubagentRun`) it has no business defining. The whole feature therefore
11
+ * changes ZERO files under `packages/core/` (AC-12).
12
+ */
13
+ export {};