@astralyn/pi 0.85.1 → 0.85.2

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 (248) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/cli.js +94 -91
  3. package/dist/core/agent-session.js +2 -2
  4. package/dist/core/agent-session.js.map +1 -1
  5. package/dist/core/background/history.d.ts.map +1 -1
  6. package/dist/core/background/history.js +6 -0
  7. package/dist/core/background/history.js.map +1 -1
  8. package/dist/core/background/presentation.d.ts.map +1 -1
  9. package/dist/core/background/presentation.js +41 -4
  10. package/dist/core/background/presentation.js.map +1 -1
  11. package/dist/core/background/service.d.ts +2 -2
  12. package/dist/core/background/service.d.ts.map +1 -1
  13. package/dist/core/background/service.js +38 -15
  14. package/dist/core/background/service.js.map +1 -1
  15. package/dist/core/background/types.d.ts +9 -0
  16. package/dist/core/background/types.d.ts.map +1 -1
  17. package/dist/core/background/types.js +4 -0
  18. package/dist/core/background/types.js.map +1 -1
  19. package/dist/core/compaction/compaction.d.ts +5 -12
  20. package/dist/core/compaction/compaction.d.ts.map +1 -1
  21. package/dist/core/compaction/compaction.js +11 -19
  22. package/dist/core/compaction/compaction.js.map +1 -1
  23. package/dist/core/compaction/settings.d.ts +27 -0
  24. package/dist/core/compaction/settings.d.ts.map +1 -0
  25. package/dist/core/compaction/settings.js +40 -0
  26. package/dist/core/compaction/settings.js.map +1 -0
  27. package/dist/core/keybindings.d.ts +15 -0
  28. package/dist/core/keybindings.d.ts.map +1 -1
  29. package/dist/core/keybindings.js +12 -0
  30. package/dist/core/keybindings.js.map +1 -1
  31. package/dist/core/model-config.d.ts +32 -10
  32. package/dist/core/model-config.d.ts.map +1 -1
  33. package/dist/core/model-config.js +38 -1
  34. package/dist/core/model-config.js.map +1 -1
  35. package/dist/core/model-runtime.d.ts +2 -0
  36. package/dist/core/model-runtime.d.ts.map +1 -1
  37. package/dist/core/model-runtime.js +4 -0
  38. package/dist/core/model-runtime.js.map +1 -1
  39. package/dist/core/settings-manager.d.ts +4 -7
  40. package/dist/core/settings-manager.d.ts.map +1 -1
  41. package/dist/core/settings-manager.js +7 -6
  42. package/dist/core/settings-manager.js.map +1 -1
  43. package/dist/core/tools/bash.js +1 -1
  44. package/dist/core/tools/bash.js.map +1 -1
  45. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  46. package/dist/core/tools/shell-execution.js +3 -1
  47. package/dist/core/tools/shell-execution.js.map +1 -1
  48. package/dist/extensions/background/manager.d.ts +8 -5
  49. package/dist/extensions/background/manager.d.ts.map +1 -1
  50. package/dist/extensions/background/manager.js +115 -39
  51. package/dist/extensions/background/manager.js.map +1 -1
  52. package/dist/extensions/background/task-view.d.ts +5 -0
  53. package/dist/extensions/background/task-view.d.ts.map +1 -1
  54. package/dist/extensions/background/task-view.js +4 -0
  55. package/dist/extensions/background/task-view.js.map +1 -1
  56. package/dist/extensions/btw/controller.d.ts +1 -1
  57. package/dist/extensions/btw/controller.d.ts.map +1 -1
  58. package/dist/extensions/btw/controller.js +4 -4
  59. package/dist/extensions/btw/controller.js.map +1 -1
  60. package/dist/extensions/btw/index.js +3 -3
  61. package/dist/extensions/btw/index.js.map +1 -1
  62. package/dist/extensions/index.js +2 -2
  63. package/dist/extensions/index.js.map +1 -1
  64. package/dist/extensions/provider/catalog.d.ts +57 -0
  65. package/dist/extensions/provider/catalog.d.ts.map +1 -0
  66. package/dist/extensions/provider/catalog.js +181 -0
  67. package/dist/extensions/provider/catalog.js.map +1 -0
  68. package/dist/extensions/provider/compat-fields.d.ts +25 -0
  69. package/dist/extensions/provider/compat-fields.d.ts.map +1 -0
  70. package/dist/extensions/provider/compat-fields.js +148 -0
  71. package/dist/extensions/provider/compat-fields.js.map +1 -0
  72. package/dist/extensions/provider/configuration.d.ts +8 -0
  73. package/dist/extensions/provider/configuration.d.ts.map +1 -0
  74. package/dist/extensions/provider/configuration.js +21 -0
  75. package/dist/extensions/provider/configuration.js.map +1 -0
  76. package/dist/extensions/provider/connection.d.ts +14 -0
  77. package/dist/extensions/provider/connection.d.ts.map +1 -0
  78. package/dist/extensions/provider/connection.js +86 -0
  79. package/dist/extensions/provider/connection.js.map +1 -0
  80. package/dist/extensions/provider/constants.d.ts +38 -0
  81. package/dist/extensions/provider/constants.d.ts.map +1 -0
  82. package/dist/extensions/provider/constants.js +75 -0
  83. package/dist/extensions/provider/constants.js.map +1 -0
  84. package/dist/extensions/provider/index.d.ts +4 -0
  85. package/dist/extensions/provider/index.d.ts.map +1 -0
  86. package/dist/extensions/provider/index.js +65 -0
  87. package/dist/extensions/provider/index.js.map +1 -0
  88. package/dist/extensions/provider/probe.d.ts +34 -0
  89. package/dist/extensions/provider/probe.d.ts.map +1 -0
  90. package/dist/extensions/provider/probe.js +178 -0
  91. package/dist/extensions/provider/probe.js.map +1 -0
  92. package/dist/extensions/provider/refresh.d.ts +30 -0
  93. package/dist/extensions/provider/refresh.d.ts.map +1 -0
  94. package/dist/extensions/provider/refresh.js +66 -0
  95. package/dist/extensions/provider/refresh.js.map +1 -0
  96. package/dist/extensions/provider/store.d.ts +131 -0
  97. package/dist/extensions/provider/store.d.ts.map +1 -0
  98. package/dist/extensions/provider/store.js +503 -0
  99. package/dist/extensions/provider/store.js.map +1 -0
  100. package/dist/extensions/provider/ui/app.d.ts +25 -0
  101. package/dist/extensions/provider/ui/app.d.ts.map +1 -0
  102. package/dist/extensions/provider/ui/app.js +153 -0
  103. package/dist/extensions/provider/ui/app.js.map +1 -0
  104. package/dist/extensions/provider/ui/builtin-data.d.ts +53 -0
  105. package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -0
  106. package/dist/extensions/provider/ui/builtin-data.js +315 -0
  107. package/dist/extensions/provider/ui/builtin-data.js.map +1 -0
  108. package/dist/extensions/provider/ui/compat.d.ts +57 -0
  109. package/dist/extensions/provider/ui/compat.d.ts.map +1 -0
  110. package/dist/extensions/provider/ui/compat.js +427 -0
  111. package/dist/extensions/provider/ui/compat.js.map +1 -0
  112. package/dist/extensions/provider/ui/dialogs.d.ts +30 -0
  113. package/dist/extensions/provider/ui/dialogs.d.ts.map +1 -0
  114. package/dist/extensions/provider/ui/dialogs.js +89 -0
  115. package/dist/extensions/provider/ui/dialogs.js.map +1 -0
  116. package/dist/extensions/provider/ui/dictionary.d.ts +29 -0
  117. package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -0
  118. package/dist/extensions/provider/ui/dictionary.js +385 -0
  119. package/dist/extensions/provider/ui/dictionary.js.map +1 -0
  120. package/dist/extensions/provider/ui/editor.d.ts +91 -0
  121. package/dist/extensions/provider/ui/editor.d.ts.map +1 -0
  122. package/dist/extensions/provider/ui/editor.js +667 -0
  123. package/dist/extensions/provider/ui/editor.js.map +1 -0
  124. package/dist/extensions/provider/ui/fetch-models.d.ts +39 -0
  125. package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -0
  126. package/dist/extensions/provider/ui/fetch-models.js +320 -0
  127. package/dist/extensions/provider/ui/fetch-models.js.map +1 -0
  128. package/dist/extensions/provider/ui/model-fields.d.ts +43 -0
  129. package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -0
  130. package/dist/extensions/provider/ui/model-fields.js +441 -0
  131. package/dist/extensions/provider/ui/model-fields.js.map +1 -0
  132. package/dist/extensions/provider/ui/model-options.d.ts +93 -0
  133. package/dist/extensions/provider/ui/model-options.d.ts.map +1 -0
  134. package/dist/extensions/provider/ui/model-options.js +529 -0
  135. package/dist/extensions/provider/ui/model-options.js.map +1 -0
  136. package/dist/extensions/provider/ui/pane.d.ts +81 -0
  137. package/dist/extensions/provider/ui/pane.d.ts.map +1 -0
  138. package/dist/extensions/provider/ui/pane.js +3 -0
  139. package/dist/extensions/provider/ui/pane.js.map +1 -0
  140. package/dist/extensions/provider/ui/provider-fields.d.ts +60 -0
  141. package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -0
  142. package/dist/extensions/provider/ui/provider-fields.js +326 -0
  143. package/dist/extensions/provider/ui/provider-fields.js.map +1 -0
  144. package/dist/extensions/provider/ui/provider-list.d.ts +34 -0
  145. package/dist/extensions/provider/ui/provider-list.d.ts.map +1 -0
  146. package/dist/extensions/provider/ui/provider-list.js +162 -0
  147. package/dist/extensions/provider/ui/provider-list.js.map +1 -0
  148. package/dist/extensions/provider/ui/session.d.ts +20 -0
  149. package/dist/extensions/provider/ui/session.d.ts.map +1 -0
  150. package/dist/extensions/provider/ui/session.js +52 -0
  151. package/dist/extensions/provider/ui/session.js.map +1 -0
  152. package/dist/extensions/provider/ui/thinking-map.d.ts +20 -0
  153. package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -0
  154. package/dist/extensions/provider/ui/thinking-map.js +166 -0
  155. package/dist/extensions/provider/ui/thinking-map.js.map +1 -0
  156. package/dist/extensions/provider/ui/value-row.d.ts +88 -0
  157. package/dist/extensions/provider/ui/value-row.d.ts.map +1 -0
  158. package/dist/extensions/provider/ui/value-row.js +158 -0
  159. package/dist/extensions/provider/ui/value-row.js.map +1 -0
  160. package/dist/extensions/statusline/index.js +2 -2
  161. package/dist/extensions/statusline/index.js.map +1 -1
  162. package/dist/extensions/subagent/index.d.ts.map +1 -1
  163. package/dist/extensions/subagent/index.js +4 -2
  164. package/dist/extensions/subagent/index.js.map +1 -1
  165. package/dist/extensions/subagent/resolve.d.ts +5 -0
  166. package/dist/extensions/subagent/resolve.d.ts.map +1 -1
  167. package/dist/extensions/subagent/resolve.js +15 -7
  168. package/dist/extensions/subagent/resolve.js.map +1 -1
  169. package/dist/extensions/subagent/schema.d.ts +2 -0
  170. package/dist/extensions/subagent/schema.d.ts.map +1 -1
  171. package/dist/extensions/subagent/schema.js +1 -0
  172. package/dist/extensions/subagent/schema.js.map +1 -1
  173. package/dist/modes/interactive/components/tool-execution.d.ts +10 -0
  174. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  175. package/dist/modes/interactive/components/tool-execution.js +20 -2
  176. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  177. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  178. package/dist/modes/interactive/interactive-mode.js +6 -1
  179. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  180. package/dist/rpc-entry.js +94 -91
  181. package/docs/bundled/README.md +1 -1
  182. package/docs/bundled/extensions/background.md +5 -5
  183. package/docs/bundled/extensions/provider.md +117 -0
  184. package/docs/bundled/extensions/statusline.md +1 -1
  185. package/docs/bundled/extensions/subagent.md +7 -3
  186. package/docs/compaction.md +16 -6
  187. package/docs/docs.json +2 -2
  188. package/docs/keybindings.md +3 -0
  189. package/docs/settings.md +11 -7
  190. package/npm-shrinkwrap.json +2 -2
  191. package/package.json +1 -1
  192. package/dist/extensions/router/constants.d.ts +0 -23
  193. package/dist/extensions/router/constants.d.ts.map +0 -1
  194. package/dist/extensions/router/constants.js +0 -30
  195. package/dist/extensions/router/constants.js.map +0 -1
  196. package/dist/extensions/router/dialog-host.d.ts +0 -60
  197. package/dist/extensions/router/dialog-host.d.ts.map +0 -1
  198. package/dist/extensions/router/dialog-host.js +0 -196
  199. package/dist/extensions/router/dialog-host.js.map +0 -1
  200. package/dist/extensions/router/dialog.d.ts +0 -45
  201. package/dist/extensions/router/dialog.d.ts.map +0 -1
  202. package/dist/extensions/router/dialog.js +0 -378
  203. package/dist/extensions/router/dialog.js.map +0 -1
  204. package/dist/extensions/router/identity.d.ts +0 -15
  205. package/dist/extensions/router/identity.d.ts.map +0 -1
  206. package/dist/extensions/router/identity.js +0 -173
  207. package/dist/extensions/router/identity.js.map +0 -1
  208. package/dist/extensions/router/index.d.ts +0 -15
  209. package/dist/extensions/router/index.d.ts.map +0 -1
  210. package/dist/extensions/router/index.js +0 -70
  211. package/dist/extensions/router/index.js.map +0 -1
  212. package/dist/extensions/router/presets.d.ts +0 -51
  213. package/dist/extensions/router/presets.d.ts.map +0 -1
  214. package/dist/extensions/router/presets.js +0 -108
  215. package/dist/extensions/router/presets.js.map +0 -1
  216. package/dist/extensions/router/probe.d.ts +0 -26
  217. package/dist/extensions/router/probe.d.ts.map +0 -1
  218. package/dist/extensions/router/probe.js +0 -216
  219. package/dist/extensions/router/probe.js.map +0 -1
  220. package/dist/extensions/router/register.d.ts +0 -12
  221. package/dist/extensions/router/register.d.ts.map +0 -1
  222. package/dist/extensions/router/register.js +0 -90
  223. package/dist/extensions/router/register.js.map +0 -1
  224. package/dist/extensions/router/state.d.ts +0 -20
  225. package/dist/extensions/router/state.d.ts.map +0 -1
  226. package/dist/extensions/router/state.js +0 -169
  227. package/dist/extensions/router/state.js.map +0 -1
  228. package/dist/extensions/router/store.d.ts +0 -12
  229. package/dist/extensions/router/store.d.ts.map +0 -1
  230. package/dist/extensions/router/store.js +0 -266
  231. package/dist/extensions/router/store.js.map +0 -1
  232. package/dist/extensions/router/stream.d.ts +0 -12
  233. package/dist/extensions/router/stream.d.ts.map +0 -1
  234. package/dist/extensions/router/stream.js +0 -233
  235. package/dist/extensions/router/stream.js.map +0 -1
  236. package/dist/extensions/router/transport.d.ts +0 -9
  237. package/dist/extensions/router/transport.d.ts.map +0 -1
  238. package/dist/extensions/router/transport.js +0 -81
  239. package/dist/extensions/router/transport.js.map +0 -1
  240. package/dist/extensions/router/types.d.ts +0 -39
  241. package/dist/extensions/router/types.d.ts.map +0 -1
  242. package/dist/extensions/router/types.js +0 -2
  243. package/dist/extensions/router/types.js.map +0 -1
  244. package/dist/extensions/router/ui.d.ts +0 -26
  245. package/dist/extensions/router/ui.d.ts.map +0 -1
  246. package/dist/extensions/router/ui.js +0 -897
  247. package/dist/extensions/router/ui.js.map +0 -1
  248. package/docs/bundled/extensions/router.md +0 -197
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/extensions/background/manager.ts"],"names":[],"mappings":"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","sourcesContent":["/** Inline observer: selecting or closing a view never changes execution ownership. */\nimport { homedir } from \"node:os\";\nimport {\n\ttype Component,\n\ttype Focusable,\n\tMarkdown,\n\tstripTerminalSequences,\n\ttruncateToWidth,\n\tvisibleWidth,\n\twrapTextWithAnsi,\n} from \"@earendil-works/pi-tui\";\nimport {\n\ttype BackgroundContext,\n\ttype BackgroundTask,\n\ttype BackgroundWorker,\n\tisBackgroundTerminal,\n} from \"../../core/background/types.ts\";\nimport type { KeybindingsManager } from \"../../core/keybindings.ts\";\nimport { DynamicBorder } from \"../../modes/interactive/components/dynamic-border.ts\";\nimport { keyLabel } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { statusMarker } from \"../../modes/interactive/components/status-marker.ts\";\nimport { getMarkdownTheme, highlightCode, type Theme, type ThemeColor } from \"../../modes/interactive/theme/theme.ts\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.ts\";\nimport { runtimeLabel, taskLabel } from \"./task-view.ts\";\nimport { firstCommandLine, formatAge } from \"./text.ts\";\n\nexport type BackgroundManagerHost = Pick<BackgroundContext, \"list\" | \"read\" | \"kill\" | \"subscribe\" | \"pin\">;\nexport interface BackgroundTasksMenuOptions {\n\ttui: { requestRender(): void; terminal: { rows: number; columns: number } };\n\ttheme: Theme;\n\tkeybindings: Pick<KeybindingsManager, \"matches\" | \"getKeys\">;\n\thost: BackgroundManagerHost;\n\tonClose(): void;\n\tpollIntervalMs?: number;\n}\ninterface Row {\n\tkey: string;\n\ttask: BackgroundTask;\n\tworker?: BackgroundWorker;\n}\ntype ListItem = { header: string } | { row: Row };\ninterface PreviewPosition {\n\tscroll: number;\n\tfollow: boolean;\n\tanchor?: { line: number; column: number };\n}\ninterface WrappedEntry {\n\ttext: string;\n\tline: number;\n\tcolumn: number;\n}\ninterface Layout {\n\twide: boolean;\n\tlistWidth: number;\n\tpreviewWidth: number;\n\tbodyHeight: number;\n\tvisibleItems: ListItem[];\n\tlistVisible: number;\n\tdetail: string[];\n\tcontent: string[];\n\tcontentHeight: number;\n\tstart: number;\n\tmax: number;\n\ttotal: number;\n\tentries: WrappedEntry[];\n}\nconst WIDE_MIN_WIDTH = 100;\nconst LIST_MIN_WIDTH = 28;\nconst LIST_MAX_WIDTH = 44;\nconst NARROW_LIST_MAX_ROWS = 7;\nconst DETAIL_LABEL_WIDTH = 10;\nconst DETAIL_MAX_ROWS = 9;\nconst COMMAND_MAX_ROWS = 3;\nconst ERROR_MAX_ROWS = 2;\n/** Long field values (worker model/usage) wrap up to this many rows instead of truncating. */\nconst DETAIL_VALUE_MAX_ROWS = 2;\nconst RENDER_CACHE_MAX = 8;\nconst clean = (text: string) => sanitizeBinaryOutput(stripTerminalSequences(text));\nconst pad = (text: string, width: number) => truncateToWidth(text, width, \"…\", true);\nconst padEnd = (text: string, width: number) => text + \" \".repeat(Math.max(0, width - visibleWidth(text)));\nconst oneLine = (text: string) => clean(text).replace(/\\s+/g, \" \");\n\nfunction headChars(text: string, width: number): string {\n\tlet out = \"\";\n\tlet used = 0;\n\tfor (const char of text) {\n\t\tconst charWidth = visibleWidth(char);\n\t\tif (used + charWidth > width) break;\n\t\tout += char;\n\t\tused += charWidth;\n\t}\n\treturn out;\n}\nfunction tailChars(text: string, width: number): string {\n\tlet out = \"\";\n\tlet used = 0;\n\tconst chars = [...text];\n\tfor (let i = chars.length - 1; i >= 0; i--) {\n\t\tconst charWidth = visibleWidth(chars[i]!);\n\t\tif (used + charWidth > width) break;\n\t\tout = chars[i] + out;\n\t\tused += charWidth;\n\t}\n\treturn out;\n}\nfunction ellipsizeMiddle(text: string, width: number): string {\n\tif (visibleWidth(text) <= width) return text;\n\tif (width <= 1) return truncateToWidth(text, Math.max(1, width), \"…\");\n\tconst head = Math.ceil((width - 1) / 2);\n\tconst tail = width - 1 - head;\n\treturn `${headChars(text, head)}…${tailChars(text, tail)}`;\n}\nfunction displayPath(path: string, width: number): string {\n\tconst home = homedir();\n\tconst shortened = home && path.startsWith(home) ? `~${path.slice(home.length)}` : path;\n\treturn ellipsizeMiddle(shortened, width);\n}\n\nexport class BackgroundTasksMenu implements Component, Focusable {\n\tfocused = false;\n\tprivate readonly options: BackgroundTasksMenuOptions;\n\tprivate rows: Row[] = [];\n\tprivate runningCount = 0;\n\tprivate finishedCount = 0;\n\tprivate hiddenFinished = 0;\n\tprivate selected?: string;\n\tprivate pinned?: string;\n\tprivate releasePin?: () => void;\n\tprivate unsubscribe: () => void;\n\tprivate timer: ReturnType<typeof setInterval>;\n\tprivate disposed = false;\n\tprivate focus: \"list\" | \"preview\" = \"list\";\n\tprivate pendingKill?: string;\n\tprivate readonly positions = new Map<string, PreviewPosition>();\n\tprivate readonly renderCache = new Map<string, string[]>();\n\tprivate width: number;\n\tprivate text = \"\";\n\tprivate readKey?: string;\n\tprivate readError?: string;\n\tprivate finalRead = false;\n\tprivate busy = false;\n\tprivate feedback?: string;\n\tprivate lastFrame = \"\";\n\n\tconstructor(options: BackgroundTasksMenuOptions) {\n\t\tthis.options = options;\n\t\tthis.width = options.tui.terminal.columns;\n\t\tthis.sync();\n\t\tthis.unsubscribe = options.host.subscribe(() => {\n\t\t\tthis.sync();\n\t\t\t// Coalesce high-frequency progress; the timer reads only visible output.\n\t\t});\n\t\tthis.timer = setInterval(() => this.queueTick(), options.pollIntervalMs ?? 1000);\n\t\tthis.timer.unref?.();\n\t\tthis.queueTick();\n\t}\n\tprivate queueTick(): void {\n\t\tvoid this.tick().catch(() => {\n\t\t\t/* A failed repaint must not become an unhandled rejection. */\n\t\t});\n\t}\n\tinvalidate(): void {\n\t\tthis.lastFrame = \"\";\n\t\tthis.renderCache.clear();\n\t}\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tclearInterval(this.timer);\n\t\tthis.unsubscribe();\n\t\tthis.releasePin?.();\n\t}\n\tprivate current(): Row | undefined {\n\t\treturn this.rows.find((row) => row.key === this.selected);\n\t}\n\tprivate wide(): boolean {\n\t\treturn this.width >= WIDE_MIN_WIDTH;\n\t}\n\t/** Fullscreen overlay: body fills the terminal minus the frame (rule, title, rule, hints, rule). */\n\tprivate bodyHeight(): number {\n\t\treturn Math.max(6, this.options.tui.terminal.rows - 5);\n\t}\n\tprivate sync(): void {\n\t\tif (this.disposed) return;\n\t\tconst tasks = this.options.host.list();\n\t\tconst running = tasks\n\t\t\t.filter((task) => !isBackgroundTerminal(task.status))\n\t\t\t.sort((a, b) => b.startedAt - a.startedAt);\n\t\t// Finished history holds backgrounded work: a settled foreground execution\n\t\t// already delivered its result in the transcript. Exception: the selected\n\t\t// row never disappears mid-watch when its execution settles.\n\t\tconst selectedTask = this.selected?.split(\"/\")[0];\n\t\tconst settled = tasks\n\t\t\t.filter((task) => isBackgroundTerminal(task.status))\n\t\t\t.sort((a, b) => (b.endedAt ?? b.startedAt) - (a.endedAt ?? a.startedAt));\n\t\tconst finished = settled.filter((task) => task.mode === \"background\" || task.id === selectedTask);\n\t\tthis.runningCount = running.length;\n\t\tthis.finishedCount = finished.length;\n\t\tthis.hiddenFinished = settled.length - finished.length;\n\t\tthis.rows = [...running, ...finished].flatMap((task): Row[] => [\n\t\t\t{ key: task.id, task },\n\t\t\t...(task.projection?.workers ?? []).map((worker) => ({ key: `${task.id}/${worker.id}`, task, worker })),\n\t\t]);\n\t\tif (!this.current()) {\n\t\t\tthis.selected = this.rows[0]?.key;\n\t\t}\n\t\tconst keys = new Set(this.rows.map((row) => row.key));\n\t\tfor (const key of this.positions.keys()) if (!keys.has(key)) this.positions.delete(key);\n\t\tconst id = this.current()?.task.id;\n\t\tif (id !== this.pinned) {\n\t\t\t// Acquire before releasing so history eviction cannot steal the selection.\n\t\t\tconst release = id ? this.options.host.pin(id) : undefined;\n\t\t\tconst previous = this.releasePin;\n\t\t\tthis.pinned = id;\n\t\t\tthis.releasePin = release;\n\t\t\tprevious?.();\n\t\t}\n\t}\n\tprivate async tick(): Promise<void> {\n\t\tif (this.disposed) return;\n\t\tthis.sync();\n\t\tif (this.wide() || this.focus === \"preview\") await this.refresh();\n\t\tif (this.disposed) return;\n\t\tconst frame = this.render(this.width).join(\"\\n\");\n\t\tif (frame !== this.lastFrame) {\n\t\t\tthis.lastFrame = frame;\n\t\t\tthis.options.tui.requestRender();\n\t\t}\n\t}\n\tprivate async refresh(): Promise<void> {\n\t\tconst row = this.current();\n\t\tif (!row || row.worker || row.task.kind !== \"bash\" || this.busy || (this.readKey === row.key && this.finalRead))\n\t\t\treturn;\n\t\tthis.busy = true;\n\t\ttry {\n\t\t\tconst slice = await this.options.host.read(row.task.id, { mode: \"tail\", bytes: 128 * 1024 });\n\t\t\tif (this.disposed || this.selected !== row.key) return;\n\t\t\tthis.text = clean(slice.text).split(\"\\n\").slice(-2000).join(\"\\n\");\n\t\t\tthis.readKey = row.key;\n\t\t\tthis.readError = slice.readError ? clean(slice.readError).slice(0, 4096) : undefined;\n\t\t\tthis.finalRead = isBackgroundTerminal(slice.task.status);\n\t\t} catch (error) {\n\t\t\tif (!this.disposed && this.selected === row.key) {\n\t\t\t\tthis.text = \"\";\n\t\t\t\tthis.readError = `Cannot read output: ${clean(String(error)).slice(0, 1000)}`;\n\t\t\t\tthis.readKey = row.key;\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.busy = false;\n\t\t}\n\t}\n\thandleInput(data: string): void {\n\t\tif (this.disposed) return;\n\t\tconst kb = this.options.keybindings;\n\t\tthis.feedback = undefined;\n\t\tif (this.pendingKill) {\n\t\t\t// The one raw-key exception: a pending y/N confirmation captures the next input.\n\t\t\tconst id = this.pendingKill;\n\t\t\tthis.pendingKill = undefined;\n\t\t\tif (data === \"y\" || data === \"Y\") {\n\t\t\t\ttry {\n\t\t\t\t\tthis.feedback = this.options.host.kill(id)\n\t\t\t\t\t\t? `stopping ${id}… (whole group)`\n\t\t\t\t\t\t: `${id}: no new cancellation requested`;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.feedback = oneLine(String(error));\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.options.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tif (this.focus === \"preview\") this.focus = \"list\";\n\t\t\telse {\n\t\t\t\tthis.dispose();\n\t\t\t\tthis.options.onClose();\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else if (kb.matches(data, \"app.backgroundTasks.kill\")) {\n\t\t\tconst row = this.current();\n\t\t\tif (row) this.pendingKill = row.task.id;\n\t\t} else if (kb.matches(data, \"app.backgroundTasks.focusList\")) {\n\t\t\tthis.focus = \"list\";\n\t\t} else if (kb.matches(data, \"app.backgroundTasks.focusPreview\") || kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.focus = \"preview\";\n\t\t\tthis.queueTick();\n\t\t} else {\n\t\t\tconst pageUp = kb.matches(data, this.focus === \"list\" ? \"tui.select.pageUp\" : \"tui.editor.pageUp\");\n\t\t\tconst pageDown = kb.matches(data, this.focus === \"list\" ? \"tui.select.pageDown\" : \"tui.editor.pageDown\");\n\t\t\tconst direction =\n\t\t\t\tpageUp || kb.matches(data, \"tui.select.up\") ? -1 : pageDown || kb.matches(data, \"tui.select.down\") ? 1 : 0;\n\t\t\tconst layout = this.layout();\n\t\t\tconst delta =\n\t\t\t\tdirection *\n\t\t\t\t(pageUp || pageDown ? (this.focus === \"preview\" ? layout.contentHeight : layout.listVisible) : 1);\n\t\t\tif (delta && this.focus === \"preview\") this.scrollPreview(delta);\n\t\t\telse if (delta && this.rows.length) {\n\t\t\t\tconst index = this.rows.findIndex((row) => row.key === this.selected);\n\t\t\t\tconst next =\n\t\t\t\t\tpageUp || pageDown\n\t\t\t\t\t\t? Math.max(0, Math.min(this.rows.length - 1, index + delta))\n\t\t\t\t\t\t: (index + delta + this.rows.length) % this.rows.length;\n\t\t\t\tthis.selected = this.rows[next]?.key;\n\t\t\t\tthis.text = \"\";\n\t\t\t\tthis.readKey = undefined;\n\t\t\t\tthis.readError = undefined;\n\t\t\t\tthis.finalRead = false;\n\t\t\t\tthis.sync();\n\t\t\t\tthis.queueTick();\n\t\t\t}\n\t\t}\n\t\tthis.options.tui.requestRender();\n\t}\n\tprivate position(): PreviewPosition {\n\t\tconst key = this.selected ?? \"\";\n\t\tlet position = this.positions.get(key);\n\t\tif (!position) {\n\t\t\tposition = { scroll: 0, follow: this.current()?.task.kind === \"bash\" && !this.current()?.worker };\n\t\t\tif (this.selected) this.positions.set(key, position);\n\t\t}\n\t\treturn position;\n\t}\n\t/** Selectable rows interleaved with their section headers; headers are display-only and never selected. */\n\tprivate listItems(): ListItem[] {\n\t\tconst items: ListItem[] = [];\n\t\tlet section = \"\";\n\t\tfor (const row of this.rows) {\n\t\t\tconst next = isBackgroundTerminal(row.task.status) ? \"Finished\" : \"Running\";\n\t\t\tif (next !== section) {\n\t\t\t\tsection = next;\n\t\t\t\titems.push({ header: next });\n\t\t\t}\n\t\t\titems.push({ row });\n\t\t}\n\t\treturn items;\n\t}\n\tprivate cacheSet(key: string, lines: string[]): void {\n\t\tif (this.renderCache.size >= RENDER_CACHE_MAX) {\n\t\t\tconst oldest = this.renderCache.keys().next().value;\n\t\t\tif (oldest !== undefined) this.renderCache.delete(oldest);\n\t\t}\n\t\tthis.renderCache.set(key, lines);\n\t}\n\tprivate commandLines(task: BackgroundTask, width: number, maxRows: number): string[] {\n\t\tconst first = firstCommandLine(task.command ?? \"\");\n\t\tconst key = `command|${task.id}|${width}|${first.length}`;\n\t\tlet lines = this.renderCache.get(key);\n\t\tif (!lines) {\n\t\t\tlines = wrapTextWithAnsi(highlightCode(first, \"bash\")[0] ?? \"\", Math.max(1, width));\n\t\t\tthis.cacheSet(key, lines);\n\t\t}\n\t\treturn lines.slice(0, maxRows);\n\t}\n\tprivate markdownLines(rowKey: string, section: string, text: string, width: number): string[] {\n\t\tconst key = `${section}|${rowKey}|${width}|${text.length}`;\n\t\tconst cached = this.renderCache.get(key);\n\t\tif (cached) return cached;\n\t\tconst lines = new Markdown(text, 0, 0, getMarkdownTheme(), {\n\t\t\tcolor: (value: string) => this.options.theme.fg(\"toolOutput\", value),\n\t\t}).render(Math.max(1, width));\n\t\tthis.cacheSet(key, lines);\n\t\treturn lines;\n\t}\n\tprivate detailLines(row: Row | undefined, valueWidth: number, compact: boolean): string[] {\n\t\tif (!row) return [];\n\t\tconst { theme } = this.options;\n\t\tconst { task, worker } = row;\n\t\tconst now = Date.now();\n\t\tconst marker = statusMarker(worker?.status ?? task.status, { now });\n\t\tconst glyph = theme.fg(marker.color, marker.glyph);\n\t\tconst time =\n\t\t\tisBackgroundTerminal(task.status) && task.endedAt ? formatAge(task.endedAt, now) : runtimeLabel(task, now);\n\t\tconst field = (label: string, values: string[]): string[] =>\n\t\t\tvalues.map(\n\t\t\t\t(value, index) => `${theme.fg(\"dim\", padEnd(index === 0 ? label : \"\", DETAIL_LABEL_WIDTH))}${value}`,\n\t\t\t);\n\t\tconst status = worker ? `${glyph} ${worker.status}` : `${glyph} ${task.status} · ${task.mode} · ${time}`;\n\t\tif (compact) {\n\t\t\tconst second = worker\n\t\t\t\t? field(\"Worker\", [truncateToWidth(clean(worker.label), valueWidth, \"…\")])\n\t\t\t\t: task.command\n\t\t\t\t\t? field(\"Command\", this.commandLines(task, valueWidth, 1))\n\t\t\t\t\t: field(\"Task\", [truncateToWidth(task.id, valueWidth, \"…\")]);\n\t\t\treturn [...field(\"Status\", [status]), ...second];\n\t\t}\n\t\tif (worker) {\n\t\t\t// Model and usage get their own rows and wrap rather than truncate:\n\t\t\t// one combined line always overflows at realistic widths.\n\t\t\tconst wrap = (value: string) =>\n\t\t\t\twrapTextWithAnsi(value, Math.max(1, valueWidth)).slice(0, DETAIL_VALUE_MAX_ROWS);\n\t\t\treturn [\n\t\t\t\t...field(\"Status\", [status]),\n\t\t\t\t...field(\"Worker\", [truncateToWidth(clean(worker.label), valueWidth, \"…\")]),\n\t\t\t\t...field(\"Group\", [truncateToWidth(task.id, valueWidth, \"…\")]),\n\t\t\t\t...field(\"Model\", wrap(worker.model ?? \"—\")),\n\t\t\t\t...field(\"Usage\", wrap(worker.usage ?? \"—\")),\n\t\t\t];\n\t\t}\n\t\tconst lines = [\n\t\t\t...field(\"Status\", [status]),\n\t\t\t...field(\"Task\", [truncateToWidth(task.id, valueWidth, \"…\")]),\n\t\t\t...field(\n\t\t\t\t\"Error\",\n\t\t\t\t[\n\t\t\t\t\ttask.error ? `Task error: ${oneLine(task.error)}` : \"\",\n\t\t\t\t\tthis.readKey === row.key && this.readError ? `Output read error: ${oneLine(this.readError)}` : \"\",\n\t\t\t\t]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.flatMap((error) => wrapTextWithAnsi(theme.fg(\"error\", error), Math.max(1, valueWidth)))\n\t\t\t\t\t.slice(0, ERROR_MAX_ROWS),\n\t\t\t),\n\t\t];\n\t\tif (task.kind === \"bash\") {\n\t\t\tif (task.command) lines.push(...field(\"Command\", this.commandLines(task, valueWidth, COMMAND_MAX_ROWS)));\n\t\t\tif (task.cwd)\n\t\t\t\tlines.push(...field(\"Directory\", [truncateToWidth(displayPath(task.cwd, valueWidth), valueWidth, \"…\")]));\n\t\t\tif (task.outputPath) lines.push(...field(\"Output\", [displayPath(task.outputPath, valueWidth)]));\n\t\t}\n\t\treturn lines.slice(0, DETAIL_MAX_ROWS);\n\t}\n\tprivate workerLines(row: Row, width: number): string[] {\n\t\tconst worker = row.worker;\n\t\tif (!worker) return [];\n\t\tconst { theme } = this.options;\n\t\tconst heading = (text: string) => theme.fg(\"dim\", theme.bold(text));\n\t\tconst lines = [\n\t\t\theading(\"Prompt\"),\n\t\t\t...this.markdownLines(row.key, \"prompt\", worker.prompt, width),\n\t\t\t\"\",\n\t\t\theading(\"Activity\"),\n\t\t];\n\t\tfor (const line of worker.activity ? clean(worker.activity).split(\"\\n\") : [\"—\"])\n\t\t\tlines.push(theme.fg(\"toolOutput\", line));\n\t\tlines.push(\"\");\n\t\tif (worker.error)\n\t\t\tlines.push(\n\t\t\t\t...wrapTextWithAnsi(theme.fg(\"error\", oneLine(worker.error)), Math.max(1, width)).slice(0, ERROR_MAX_ROWS),\n\t\t\t);\n\t\tlines.push(heading(\"Outcome\"));\n\t\tif (worker.report.text) lines.push(...this.markdownLines(row.key, \"outcome\", worker.report.text, width));\n\t\telse if (worker.status === \"queued\" || worker.status === \"running\")\n\t\t\tlines.push(theme.fg(\"muted\", \"Still running…\"));\n\t\telse lines.push(theme.fg(\"muted\", \"No report returned.\"));\n\t\tif (worker.report.truncated) lines.push(theme.fg(\"warning\", \"[Saved report truncated.]\"));\n\t\treturn lines;\n\t}\n\tprivate contentLines(row: Row | undefined, width: number): string[] {\n\t\tif (!row) return [];\n\t\tconst { theme } = this.options;\n\t\tconst { task, worker } = row;\n\t\tif (worker) return this.workerLines(row, width);\n\t\tif (task.kind !== \"bash\") {\n\t\t\tconst workers = task.projection?.workers ?? [];\n\t\t\tconst now = Date.now();\n\t\t\tif (workers.length)\n\t\t\t\treturn workers.map((w) => {\n\t\t\t\t\tconst marker = statusMarker(w.status, { now });\n\t\t\t\t\t// One truncated line per worker — an index of who did what. Model\n\t\t\t\t\t// and usage live in the worker's own detail view.\n\t\t\t\t\tconst summary = oneLine(`${w.label} · ${w.status}${w.description ? ` — ${w.description}` : \"\"}`);\n\t\t\t\t\treturn `${theme.fg(marker.color, marker.glyph)} ${theme.fg(\"toolOutput\", truncateToWidth(summary, Math.max(1, width), \"…\"))}`;\n\t\t\t\t});\n\t\t\tconst fallback = task.projection?.text;\n\t\t\treturn fallback\n\t\t\t\t? clean(fallback)\n\t\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t\t.map((line) => theme.fg(\"toolOutput\", line))\n\t\t\t\t: [theme.fg(\"muted\", \"No workers.\")];\n\t\t}\n\t\tconst text = this.readKey === row.key ? this.text : (task.projection?.text ?? \"Loading…\");\n\t\treturn clean(text)\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => theme.fg(\"toolOutput\", line));\n\t}\n\t/** One geometry calculation shared by rendering and page/line navigation. */\n\tprivate layout(): Layout {\n\t\tconst wide = this.wide();\n\t\tconst listWidth = wide\n\t\t\t? Math.min(LIST_MAX_WIDTH, Math.max(LIST_MIN_WIDTH, Math.floor((this.width - 1) * 0.36)))\n\t\t\t: this.width;\n\t\tconst previewWidth = wide ? this.width - listWidth - 1 : this.width;\n\t\tconst bodyHeight = this.bodyHeight();\n\t\tconst items = this.listItems();\n\t\tconst selectedIndex = items.findIndex((item) => \"row\" in item && item.row.key === this.selected);\n\t\tconst listVisible = wide ? bodyHeight : Math.min(NARROW_LIST_MAX_ROWS, Math.max(1, bodyHeight - 4));\n\t\tconst listFirst = Math.max(0, selectedIndex - listVisible + 1);\n\t\tconst visibleItems = items.slice(listFirst, listFirst + listVisible);\n\t\tconst row = this.current();\n\t\tconst detail = this.detailLines(row, Math.max(1, previewWidth - DETAIL_LABEL_WIDTH), !wide).slice(\n\t\t\t0,\n\t\t\twide ? Math.max(1, Math.min(DETAIL_MAX_ROWS, bodyHeight - 2)) : 2,\n\t\t);\n\t\tconst contentHeight = wide\n\t\t\t? Math.max(1, bodyHeight - detail.length - 1)\n\t\t\t: Math.max(1, bodyHeight - visibleItems.length - detail.length - 1);\n\t\tconst wrapped = this.contentLines(row, previewWidth).flatMap((line, lineIndex) => {\n\t\t\tlet column = 0;\n\t\t\treturn wrapTextWithAnsi(line, Math.max(1, previewWidth)).map((text) => {\n\t\t\t\tconst entry = { text, line: lineIndex, column };\n\t\t\t\tcolumn += visibleWidth(text);\n\t\t\t\treturn entry;\n\t\t\t});\n\t\t});\n\t\tconst entries = row?.task.kind === \"bash\" && !row.worker ? wrapped.slice(-2000) : wrapped.slice(0, 2000);\n\t\tconst content = entries.map((entry) => entry.text);\n\t\tconst max = Math.max(0, content.length - contentHeight);\n\t\tconst position = this.position();\n\t\tlet offset = position.scroll;\n\t\tif (position.anchor) {\n\t\t\tconst anchor = position.anchor;\n\t\t\tconst first = entries.findIndex((entry) => entry.line === anchor.line);\n\t\t\tif (first >= 0) {\n\t\t\t\toffset = first;\n\t\t\t\twhile (\n\t\t\t\t\toffset + 1 < entries.length &&\n\t\t\t\t\tentries[offset + 1]!.line === anchor.line &&\n\t\t\t\t\tentries[offset + 1]!.column <= anchor.column\n\t\t\t\t)\n\t\t\t\t\toffset++;\n\t\t\t}\n\t\t}\n\t\tconst start = position.follow ? max : Math.min(offset, max);\n\t\treturn {\n\t\t\twide,\n\t\t\tlistWidth,\n\t\t\tpreviewWidth,\n\t\t\tbodyHeight,\n\t\t\tvisibleItems,\n\t\t\tlistVisible,\n\t\t\tdetail,\n\t\t\tcontent,\n\t\t\tcontentHeight,\n\t\t\tstart,\n\t\t\tmax,\n\t\t\ttotal: content.length,\n\t\t\tentries,\n\t\t};\n\t}\n\tprivate scrollPreview(delta: number): void {\n\t\tconst { start, max, entries } = this.layout();\n\t\tconst position = this.position();\n\t\tposition.scroll = Math.min(max, Math.max(0, start + delta));\n\t\tconst entry = entries[position.scroll];\n\t\tposition.anchor = entry ? { line: entry.line, column: entry.column } : undefined;\n\t\t// Only an explicit downward movement resumes shell following, never resize/update.\n\t\tposition.follow =\n\t\t\tdelta > 0 && position.scroll === max && this.current()?.task.kind === \"bash\" && !this.current()?.worker;\n\t}\n\tprivate listRowLine(row: Row, width: number): string {\n\t\tconst { theme } = this.options;\n\t\tconst selected = row.key === this.selected;\n\t\tconst now = Date.now();\n\t\tconst marker = statusMarker(row.worker?.status ?? row.task.status, { now });\n\t\tconst glyph = theme.fg(marker.color, marker.glyph);\n\t\tconst cursor = selected ? theme.fg(this.focus === \"list\" ? \"accent\" : \"muted\", \"→ \") : \" \";\n\t\tconst indent = row.worker ? \" \" : \"\";\n\t\tconst terminal = isBackgroundTerminal(row.task.status);\n\t\t// Live foreground executions carry an `fg` tag so their presence in a\n\t\t// background panel is self-explanatory; settled ones leave the list.\n\t\tlet time = \"\";\n\t\tif (!row.worker) {\n\t\t\ttime = terminal ? formatAge(row.task.endedAt ?? row.task.startedAt, now) : runtimeLabel(row.task, now);\n\t\t\tif (!terminal && row.task.mode === \"foreground\") time = `fg · ${time}`;\n\t\t}\n\t\tconst timeWidth = time ? visibleWidth(time) + 1 : 0;\n\t\tconst labelWidth = Math.max(1, width - 2 - indent.length - visibleWidth(glyph) - 1 - timeWidth);\n\t\tconst labelColor: ThemeColor = selected && this.focus === \"list\" ? \"accent\" : \"text\";\n\t\tconst label = theme.fg(\n\t\t\tlabelColor,\n\t\t\ttruncateToWidth(\n\t\t\t\tclean(row.worker ? row.worker.label : taskLabel({ command: row.task.command ?? row.task.title })),\n\t\t\t\tlabelWidth,\n\t\t\t\t\"…\",\n\t\t\t),\n\t\t);\n\t\tlet line = `${cursor}${indent}${glyph} ${label}`;\n\t\tif (time)\n\t\t\tline += \" \".repeat(Math.max(1, width - visibleWidth(line) - visibleWidth(time))) + theme.fg(\"dim\", time);\n\t\treturn pad(line, width);\n\t}\n\tprivate emptyLine(width: number): string {\n\t\treturn this.centered(width, \"No background tasks.\");\n\t}\n\tprivate centered(width: number, message: string): string {\n\t\tconst leftPad = Math.max(0, Math.floor((width - visibleWidth(message)) / 2));\n\t\treturn pad(this.options.theme.fg(\"muted\", `${\" \".repeat(leftPad)}${message}`), width);\n\t}\n\tprivate dividerLine(layout: Layout): string {\n\t\tconst { theme } = this.options;\n\t\tconst row = this.current();\n\t\tconst label = row ? (row.worker ? \"Worker\" : row.task.kind === \"bash\" ? \"Output\" : \"Workers\") : \"Output\";\n\t\tconst styledLabel = theme.fg(this.focus === \"preview\" ? \"accent\" : \"muted\", label);\n\t\tconst shell = row !== undefined && row.task.kind === \"bash\" && !row.worker;\n\t\tconst suffix = shell ? theme.fg(\"muted\", ` · tail · ${this.position().follow ? \"following\" : \"browsing\"}`) : \"\";\n\t\tconst range = theme.fg(\n\t\t\t\"muted\",\n\t\t\t`${layout.total ? layout.start + 1 : 0}–${Math.min(layout.start + layout.contentHeight, layout.total)}/${layout.total}`,\n\t\t);\n\t\tconst rule = (count: number) => theme.fg(\"borderMuted\", \"─\".repeat(Math.max(0, count)));\n\t\tconst left = `${rule(1)} ${styledLabel}${suffix} `;\n\t\tconst right = ` ${range} ${rule(1)}`;\n\t\tconst fill = layout.previewWidth - visibleWidth(left) - visibleWidth(right);\n\t\treturn pad(`${left}${rule(fill)}${right}`, layout.previewWidth);\n\t}\n\trender(width: number): string[] {\n\t\tif (width < 1) return [];\n\t\tconst wasWide = this.wide();\n\t\tthis.width = width;\n\t\tif (!wasWide && this.wide()) this.queueTick();\n\t\tconst { theme, keybindings } = this.options;\n\t\tconst layout = this.layout();\n\t\tconst rule = () => new DynamicBorder((text) => theme.fg(\"border\", text)).render(width)[0] ?? \"\";\n\t\tconst title = theme.fg(\"accent\", theme.bold(\"Background tasks\"));\n\t\tconst counts = `${this.runningCount} running · ${this.finishedCount} finished`;\n\t\tconst hiddenNote = this.hiddenFinished > 0 ? `${this.hiddenFinished} foreground hidden` : \"\";\n\t\tconst statsText =\n\t\t\tthis.runningCount + this.finishedCount > 0 ? (hiddenNote ? `${counts} · ${hiddenNote}` : counts) : hiddenNote;\n\t\tconst stats = statsText ? theme.fg(\"muted\", statsText) : \"\";\n\t\tconst gap = width - visibleWidth(title) - visibleWidth(stats);\n\t\tconst titleLine = pad(stats && gap >= 1 ? `${title}${\" \".repeat(gap)}${stats}` : title, width);\n\t\tconst hint = (id: Parameters<typeof keybindings.getKeys>[0]) => keyLabel(id, { keybindings });\n\t\tconst pageUp = this.focus === \"list\" ? \"tui.select.pageUp\" : \"tui.editor.pageUp\";\n\t\tconst pageDown = this.focus === \"list\" ? \"tui.select.pageDown\" : \"tui.editor.pageDown\";\n\t\tconst hints = [\n\t\t\t`${hint(\"tui.select.up\")}/${hint(\"tui.select.down\")} select`,\n\t\t\t`${hint(\"app.backgroundTasks.focusList\")} list`,\n\t\t\t`${hint(\"app.backgroundTasks.focusPreview\")}/${hint(\"tui.select.confirm\")} output`,\n\t\t\t`${hint(pageUp)}/${hint(pageDown)} page`,\n\t\t\t`${hint(\"app.backgroundTasks.kill\")} stop`,\n\t\t\t`${hint(\"tui.select.cancel\")} close`,\n\t\t].join(\" · \");\n\t\tconst hintLine = pad(\n\t\t\tthis.pendingKill\n\t\t\t\t? theme.fg(\"warning\", `Stop ${this.pendingKill} (whole group)? y/N`)\n\t\t\t\t: theme.fg(this.feedback ? \"muted\" : \"dim\", this.feedback ?? hints),\n\t\t\twidth,\n\t\t);\n\t\tconst leftLines = layout.visibleItems.length\n\t\t\t? layout.visibleItems.map((item) =>\n\t\t\t\t\t\"header\" in item\n\t\t\t\t\t\t? pad(theme.fg(\"dim\", item.header), layout.listWidth)\n\t\t\t\t\t\t: this.listRowLine(item.row, layout.listWidth),\n\t\t\t\t)\n\t\t\t: [this.emptyLine(layout.listWidth)];\n\t\tconst contentWindow = layout.content.slice(layout.start, layout.start + layout.contentHeight);\n\t\tconst divider = this.dividerLine(layout);\n\t\tconst body: string[] = [];\n\t\tif (layout.wide) {\n\t\t\tconst right = [...layout.detail, divider, ...contentWindow];\n\t\t\tfor (let i = 0; i < layout.bodyHeight; i++)\n\t\t\t\tbody.push(\n\t\t\t\t\tpad(\n\t\t\t\t\t\t`${pad(leftLines[i] ?? \"\", layout.listWidth)}${theme.fg(\"borderMuted\", \"│\")}${pad(right[i] ?? \"\", layout.previewWidth)}`,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t} else {\n\t\t\tbody.push(...[...leftLines, ...layout.detail, divider, ...contentWindow].map((line) => pad(line, width)));\n\t\t\twhile (body.length < layout.bodyHeight) body.push(pad(\"\", width));\n\t\t}\n\t\treturn [rule(), titleLine, ...body.slice(0, layout.bodyHeight), rule(), hintLine, rule()].map((line) =>\n\t\t\tpad(line, width),\n\t\t);\n\t}\n}\n"]}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/extensions/background/manager.ts"],"names":[],"mappings":"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","sourcesContent":["/** Inline observer: selecting or closing a view never changes execution ownership. */\nimport { homedir } from \"node:os\";\nimport {\n\ttype Component,\n\ttype Focusable,\n\tMarkdown,\n\tstripTerminalSequences,\n\ttruncateToWidth,\n\tvisibleWidth,\n\twrapTextWithAnsi,\n} from \"@earendil-works/pi-tui\";\nimport {\n\ttype BackgroundContext,\n\ttype BackgroundTask,\n\ttype BackgroundWorker,\n\tisBackgroundTerminal,\n\tisForegroundShellTask,\n} from \"../../core/background/types.ts\";\nimport type { KeybindingsManager } from \"../../core/keybindings.ts\";\nimport { DynamicBorder } from \"../../modes/interactive/components/dynamic-border.ts\";\nimport { keyLabel } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { STATUS_SPINNER_INTERVAL_MS, statusMarker } from \"../../modes/interactive/components/status-marker.ts\";\nimport { getMarkdownTheme, highlightCode, type Theme, type ThemeColor } from \"../../modes/interactive/theme/theme.ts\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.ts\";\nimport { exitSuffix, runtimeLabel, taskLabel, workerLabel } from \"./task-view.ts\";\nimport { firstCommandLine, formatAge } from \"./text.ts\";\n\nexport type BackgroundManagerHost = Pick<BackgroundContext, \"list\" | \"read\" | \"kill\" | \"subscribe\" | \"pin\">;\nexport interface BackgroundTasksMenuOptions {\n\ttui: { requestRender(): void; terminal: { rows: number; columns: number } };\n\ttheme: Theme;\n\tkeybindings: Pick<KeybindingsManager, \"matches\" | \"getKeys\">;\n\thost: BackgroundManagerHost;\n\tonClose(): void;\n\tpollIntervalMs?: number;\n}\ninterface Row {\n\tkey: string;\n\ttask: BackgroundTask;\n\tworker?: BackgroundWorker;\n}\ntype ListItem = { header: string } | { row: Row };\ninterface PreviewPosition {\n\tscroll: number;\n\tfollow: boolean;\n\tanchor?: { line: number; column: number };\n\toutput?: { text: string; readError?: string; settled: boolean };\n}\ninterface WrappedEntry {\n\ttext: string;\n\tline: number;\n\tcolumn: number;\n}\ninterface Layout {\n\twide: boolean;\n\tlistWidth: number;\n\tpreviewWidth: number;\n\tbodyHeight: number;\n\tvisibleItems: ListItem[];\n\tlistVisible: number;\n\tdetail: string[];\n\tcontent: string[];\n\tcontentHeight: number;\n\tstart: number;\n\tmax: number;\n\ttotal: number;\n\tentries: WrappedEntry[];\n}\nconst WIDE_MIN_WIDTH = 100;\nconst LIST_MIN_WIDTH = 28;\nconst LIST_MAX_WIDTH = 44;\nconst NARROW_LIST_MAX_ROWS = 7;\n/** Below this the two-pane layout is unreadable; show a resize notice instead. */\nconst MIN_RENDER_WIDTH = 60;\nconst MIN_RENDER_HEIGHT = 12;\n/** A pending kill confirmation auto-cancels instead of capturing input forever. */\nconst KILL_CONFIRM_TIMEOUT_MS = 5000;\nconst DETAIL_LABEL_WIDTH = 10;\nconst DETAIL_MAX_ROWS = 9;\nconst COMMAND_MAX_ROWS = 3;\nconst ERROR_MAX_ROWS = 2;\n/** Long field values (worker model/usage) wrap up to this many rows instead of truncating. */\nconst DETAIL_VALUE_MAX_ROWS = 2;\nconst RENDER_CACHE_MAX = 8;\nconst clean = (text: string) => sanitizeBinaryOutput(stripTerminalSequences(text));\nconst pad = (text: string, width: number) => truncateToWidth(text, width, \"…\", true);\nconst padEnd = (text: string, width: number) => text + \" \".repeat(Math.max(0, width - visibleWidth(text)));\nconst oneLine = (text: string) => clean(text).replace(/\\s+/g, \" \");\n\nfunction headChars(text: string, width: number): string {\n\tlet out = \"\";\n\tlet used = 0;\n\tfor (const char of text) {\n\t\tconst charWidth = visibleWidth(char);\n\t\tif (used + charWidth > width) break;\n\t\tout += char;\n\t\tused += charWidth;\n\t}\n\treturn out;\n}\nfunction tailChars(text: string, width: number): string {\n\tlet out = \"\";\n\tlet used = 0;\n\tconst chars = [...text];\n\tfor (let i = chars.length - 1; i >= 0; i--) {\n\t\tconst charWidth = visibleWidth(chars[i]!);\n\t\tif (used + charWidth > width) break;\n\t\tout = chars[i] + out;\n\t\tused += charWidth;\n\t}\n\treturn out;\n}\nfunction ellipsizeMiddle(text: string, width: number): string {\n\tif (visibleWidth(text) <= width) return text;\n\tif (width <= 1) return truncateToWidth(text, Math.max(1, width), \"…\");\n\tconst head = Math.ceil((width - 1) / 2);\n\tconst tail = width - 1 - head;\n\treturn `${headChars(text, head)}…${tailChars(text, tail)}`;\n}\nfunction displayPath(path: string, width: number): string {\n\tconst home = homedir();\n\tconst shortened = home && path.startsWith(home) ? `~${path.slice(home.length)}` : path;\n\treturn ellipsizeMiddle(shortened, width);\n}\n\nexport class BackgroundTasksMenu implements Component, Focusable {\n\tfocused = false;\n\tprivate readonly options: BackgroundTasksMenuOptions;\n\tprivate rows: Row[] = [];\n\tprivate runningCount = 0;\n\tprivate finishedCount = 0;\n\tprivate completedCount = 0;\n\tprivate failedCount = 0;\n\tprivate hiddenFinished = 0;\n\tprivate selected?: string;\n\tprivate pinned?: string;\n\tprivate releasePin?: () => void;\n\tprivate unsubscribe: () => void;\n\tprivate pollTimer: ReturnType<typeof setInterval>;\n\tprivate animationTimer: ReturnType<typeof setInterval> | undefined;\n\tprivate disposed = false;\n\tprivate focus: \"list\" | \"preview\" = \"list\";\n\tprivate pendingKill?: string;\n\tprivate pendingKillTimer?: ReturnType<typeof setTimeout>;\n\tprivate readonly positions = new Map<string, PreviewPosition>();\n\tprivate readonly renderCache = new Map<string, string[]>();\n\tprivate width: number;\n\tprivate busy = false;\n\tprivate feedback?: string;\n\tprivate lastFrame = \"\";\n\n\tconstructor(options: BackgroundTasksMenuOptions) {\n\t\tthis.options = options;\n\t\tthis.width = options.tui.terminal.columns;\n\t\tthis.sync();\n\t\tthis.unsubscribe = options.host.subscribe(() => {\n\t\t\tthis.sync();\n\t\t\t// Coalesce high-frequency progress; polling reads only visible output.\n\t\t});\n\t\tthis.pollTimer = setInterval(() => this.queueTick(), options.pollIntervalMs ?? 1000);\n\t\tthis.pollTimer.unref?.();\n\t\tthis.queueTick();\n\t}\n\tprivate queueTick(): void {\n\t\tvoid this.tick().catch(() => {\n\t\t\t/* A failed repaint must not become an unhandled rejection. */\n\t\t});\n\t}\n\tinvalidate(): void {\n\t\tthis.lastFrame = \"\";\n\t\tthis.renderCache.clear();\n\t}\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tclearInterval(this.pollTimer);\n\t\tclearInterval(this.animationTimer);\n\t\tthis.animationTimer = undefined;\n\t\tthis.clearPendingKill();\n\t\tthis.unsubscribe();\n\t\tthis.releasePin?.();\n\t\tthis.positions.clear();\n\t}\n\tprivate clearPendingKill(): void {\n\t\tthis.pendingKill = undefined;\n\t\tif (this.pendingKillTimer) {\n\t\t\tclearTimeout(this.pendingKillTimer);\n\t\t\tthis.pendingKillTimer = undefined;\n\t\t}\n\t}\n\tprivate current(): Row | undefined {\n\t\treturn this.rows.find((row) => row.key === this.selected);\n\t}\n\tprivate wide(): boolean {\n\t\treturn this.width >= WIDE_MIN_WIDTH;\n\t}\n\t/** Fullscreen overlay: body fills the terminal minus the frame (rule, title, rule, hints, rule). */\n\tprivate bodyHeight(): number {\n\t\treturn Math.max(6, this.options.tui.terminal.rows - 5);\n\t}\n\tprivate sync(): void {\n\t\tif (this.disposed) return;\n\t\tconst tasks = this.options.host.list();\n\t\tconst running = tasks\n\t\t\t.filter((task) => !isBackgroundTerminal(task.status))\n\t\t\t.sort((a, b) => b.startedAt - a.startedAt);\n\t\t// Finished includes every subagent group and background shell. Foreground\n\t\t// shells deliver inline, except the selected row stays until selection moves.\n\t\tconst selectedTask = this.selected?.split(\"/\")[0];\n\t\tconst settled = tasks\n\t\t\t.filter((task) => isBackgroundTerminal(task.status))\n\t\t\t.sort((a, b) => (b.endedAt ?? b.startedAt) - (a.endedAt ?? a.startedAt));\n\t\tconst finished = settled.filter((task) => !isForegroundShellTask(task) || task.id === selectedTask);\n\t\tthis.runningCount = running.length;\n\t\tthis.finishedCount = finished.length;\n\t\tthis.completedCount = finished.filter((task) => task.status === \"completed\").length;\n\t\tthis.failedCount = this.finishedCount - this.completedCount;\n\t\tthis.hiddenFinished = settled.length - finished.length;\n\t\tthis.rows = [...running, ...finished].flatMap((task): Row[] => [\n\t\t\t{ key: task.id, task },\n\t\t\t...(task.projection?.workers ?? []).map((worker) => ({ key: `${task.id}/${worker.id}`, task, worker })),\n\t\t]);\n\t\tif (!this.current()) {\n\t\t\tthis.selected = this.rows[0]?.key;\n\t\t}\n\t\tconst keys = new Set(this.rows.map((row) => row.key));\n\t\tfor (const key of this.positions.keys()) if (!keys.has(key)) this.positions.delete(key);\n\t\tconst id = this.current()?.task.id;\n\t\tif (id !== this.pinned) {\n\t\t\t// Acquire before releasing so history eviction cannot steal the selection.\n\t\t\tconst release = id ? this.options.host.pin(id) : undefined;\n\t\t\tconst previous = this.releasePin;\n\t\t\tthis.pinned = id;\n\t\t\tthis.releasePin = release;\n\t\t\tprevious?.();\n\t\t}\n\t\t// Spinner frames must advance independently of output polling and pending reads.\n\t\tif (this.rows.some((row) => (row.worker?.status ?? row.task.status) === \"running\")) {\n\t\t\tif (!this.animationTimer) {\n\t\t\t\tthis.animationTimer = setInterval(() => this.options.tui.requestRender(), STATUS_SPINNER_INTERVAL_MS);\n\t\t\t\tthis.animationTimer.unref?.();\n\t\t\t}\n\t\t} else {\n\t\t\tclearInterval(this.animationTimer);\n\t\t\tthis.animationTimer = undefined;\n\t\t}\n\t}\n\tprivate async tick(): Promise<void> {\n\t\tif (this.disposed) return;\n\t\tthis.sync();\n\t\tif (this.wide() || this.focus === \"preview\") await this.refresh();\n\t\tif (this.disposed) return;\n\t\tconst frame = this.render(this.width).join(\"\\n\");\n\t\tif (frame !== this.lastFrame) {\n\t\t\tthis.lastFrame = frame;\n\t\t\tthis.options.tui.requestRender();\n\t\t}\n\t}\n\tprivate async refresh(): Promise<void> {\n\t\tconst row = this.current();\n\t\tif (!row || row.worker || row.task.kind !== \"bash\" || this.busy) return;\n\t\tconst position = this.position();\n\t\t// Keep the bounded output with its row's scroll anchor while browsing.\n\t\t// A new tail can otherwise move even lines that are still inside the read window.\n\t\tif (position.output && (!position.follow || position.output.settled)) return;\n\t\tthis.busy = true;\n\t\ttry {\n\t\t\tconst slice = await this.options.host.read(row.task.id, { mode: \"tail\", bytes: 128 * 1024 });\n\t\t\tif (this.disposed || this.selected !== row.key) return;\n\t\t\t// A read started while following may settle after the user scrolls up.\n\t\t\tif (!position.follow && position.output) return;\n\t\t\tposition.output = {\n\t\t\t\ttext: clean(slice.text).split(\"\\n\").slice(-2000).join(\"\\n\"),\n\t\t\t\treadError: slice.readError ? clean(slice.readError).slice(0, 4096) : undefined,\n\t\t\t\tsettled: isBackgroundTerminal(slice.task.status),\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (!this.disposed && this.selected === row.key && (position.follow || !position.output)) {\n\t\t\t\tposition.output = {\n\t\t\t\t\ttext: \"\",\n\t\t\t\t\treadError: `Cannot read output: ${clean(String(error)).slice(0, 1000)}`,\n\t\t\t\t\tsettled: false,\n\t\t\t\t};\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.busy = false;\n\t\t}\n\t}\n\thandleInput(data: string): void {\n\t\tif (this.disposed) return;\n\t\tconst kb = this.options.keybindings;\n\t\tthis.feedback = undefined;\n\t\tif (this.pendingKill) {\n\t\t\t// The one raw-key exception: a pending y/N confirmation captures the next input.\n\t\t\tconst id = this.pendingKill;\n\t\t\tthis.clearPendingKill();\n\t\t\tif (data === \"y\" || data === \"Y\") {\n\t\t\t\ttry {\n\t\t\t\t\tthis.feedback = this.options.host.kill(id)\n\t\t\t\t\t\t? `stopping ${id}… (whole group)`\n\t\t\t\t\t\t: `${id}: no new cancellation requested`;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.feedback = oneLine(String(error));\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.options.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tif (this.focus === \"preview\") this.focus = \"list\";\n\t\t\telse {\n\t\t\t\tthis.dispose();\n\t\t\t\tthis.options.onClose();\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else if (kb.matches(data, \"app.backgroundTasks.kill\")) {\n\t\t\tconst row = this.current();\n\t\t\tif (row) {\n\t\t\t\tthis.clearPendingKill();\n\t\t\t\tthis.pendingKill = row.task.id;\n\t\t\t\tthis.pendingKillTimer = setTimeout(() => {\n\t\t\t\t\tthis.pendingKill = undefined;\n\t\t\t\t\tthis.pendingKillTimer = undefined;\n\t\t\t\t\tif (!this.disposed) this.options.tui.requestRender();\n\t\t\t\t}, KILL_CONFIRM_TIMEOUT_MS);\n\t\t\t\tthis.pendingKillTimer.unref?.();\n\t\t\t}\n\t\t} else if (kb.matches(data, \"app.backgroundTasks.focusList\")) {\n\t\t\tthis.focus = \"list\";\n\t\t} else if (kb.matches(data, \"app.backgroundTasks.focusPreview\") || kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.focus = \"preview\";\n\t\t\tthis.queueTick();\n\t\t} else {\n\t\t\tconst pageUp = kb.matches(data, this.focus === \"list\" ? \"tui.select.pageUp\" : \"tui.editor.pageUp\");\n\t\t\tconst pageDown = kb.matches(data, this.focus === \"list\" ? \"tui.select.pageDown\" : \"tui.editor.pageDown\");\n\t\t\tconst direction =\n\t\t\t\tpageUp || kb.matches(data, \"tui.select.up\") ? -1 : pageDown || kb.matches(data, \"tui.select.down\") ? 1 : 0;\n\t\t\tconst layout = this.layout();\n\t\t\tconst delta =\n\t\t\t\tdirection *\n\t\t\t\t(pageUp || pageDown ? (this.focus === \"preview\" ? layout.contentHeight : layout.listVisible) : 1);\n\t\t\tif (delta && this.focus === \"preview\") this.scrollPreview(delta);\n\t\t\telse if (delta && this.rows.length) {\n\t\t\t\tconst index = this.rows.findIndex((row) => row.key === this.selected);\n\t\t\t\tconst next =\n\t\t\t\t\tpageUp || pageDown\n\t\t\t\t\t\t? Math.max(0, Math.min(this.rows.length - 1, index + delta))\n\t\t\t\t\t\t: (index + delta + this.rows.length) % this.rows.length;\n\t\t\t\tthis.selected = this.rows[next]?.key;\n\t\t\t\tthis.sync();\n\t\t\t\tthis.queueTick();\n\t\t\t}\n\t\t}\n\t\tthis.options.tui.requestRender();\n\t}\n\tprivate position(): PreviewPosition {\n\t\tconst key = this.selected ?? \"\";\n\t\tlet position = this.positions.get(key);\n\t\tif (!position) {\n\t\t\tposition = { scroll: 0, follow: this.current()?.task.kind === \"bash\" && !this.current()?.worker };\n\t\t\tif (this.selected) this.positions.set(key, position);\n\t\t}\n\t\treturn position;\n\t}\n\t/** Selectable rows interleaved with their section headers; headers are display-only and never selected. */\n\tprivate listItems(): ListItem[] {\n\t\tconst items: ListItem[] = [];\n\t\tlet section = \"\";\n\t\tfor (const row of this.rows) {\n\t\t\tconst next = isBackgroundTerminal(row.task.status) ? \"Finished\" : \"Running\";\n\t\t\tif (next !== section) {\n\t\t\t\tsection = next;\n\t\t\t\titems.push({ header: next });\n\t\t\t}\n\t\t\titems.push({ row });\n\t\t}\n\t\treturn items;\n\t}\n\tprivate cacheSet(key: string, lines: string[]): void {\n\t\tif (this.renderCache.size >= RENDER_CACHE_MAX) {\n\t\t\tconst oldest = this.renderCache.keys().next().value;\n\t\t\tif (oldest !== undefined) this.renderCache.delete(oldest);\n\t\t}\n\t\tthis.renderCache.set(key, lines);\n\t}\n\tprivate commandLines(task: BackgroundTask, width: number, maxRows: number): string[] {\n\t\tconst first = firstCommandLine(task.command ?? \"\");\n\t\tconst key = `command|${task.id}|${width}|${first.length}`;\n\t\tlet lines = this.renderCache.get(key);\n\t\tif (!lines) {\n\t\t\tlines = wrapTextWithAnsi(highlightCode(first, \"bash\")[0] ?? \"\", Math.max(1, width));\n\t\t\tthis.cacheSet(key, lines);\n\t\t}\n\t\treturn lines.slice(0, maxRows);\n\t}\n\tprivate markdownLines(rowKey: string, section: string, text: string, width: number): string[] {\n\t\tconst key = `${section}|${rowKey}|${width}|${text.length}`;\n\t\tconst cached = this.renderCache.get(key);\n\t\tif (cached) return cached;\n\t\tconst lines = new Markdown(text, 0, 0, getMarkdownTheme(), {\n\t\t\tcolor: (value: string) => this.options.theme.fg(\"toolOutput\", value),\n\t\t}).render(Math.max(1, width));\n\t\tthis.cacheSet(key, lines);\n\t\treturn lines;\n\t}\n\tprivate detailLines(row: Row | undefined, valueWidth: number, compact: boolean): string[] {\n\t\tif (!row) return [];\n\t\tconst { theme } = this.options;\n\t\tconst { task, worker } = row;\n\t\tconst now = Date.now();\n\t\tconst marker = statusMarker(worker?.status ?? task.status, { now });\n\t\tconst glyph = theme.fg(marker.color, marker.glyph);\n\t\tconst time =\n\t\t\tisBackgroundTerminal(task.status) && task.endedAt ? formatAge(task.endedAt, now) : runtimeLabel(task, now);\n\t\tconst field = (label: string, values: string[]): string[] =>\n\t\t\tvalues.map(\n\t\t\t\t(value, index) => `${theme.fg(\"dim\", padEnd(index === 0 ? label : \"\", DETAIL_LABEL_WIDTH))}${value}`,\n\t\t\t);\n\t\tconst status = worker\n\t\t\t? `${glyph} ${worker.status}`\n\t\t\t: `${glyph} ${task.status} · ${task.mode} · ${time}${exitSuffix(task.exitCode, \" · \")}`;\n\t\tif (compact) {\n\t\t\tconst second = worker\n\t\t\t\t? field(\"Worker\", [truncateToWidth(clean(worker.label), valueWidth, \"…\")])\n\t\t\t\t: task.command\n\t\t\t\t\t? field(\"Command\", this.commandLines(task, valueWidth, 1))\n\t\t\t\t\t: field(\"Task\", [truncateToWidth(task.id, valueWidth, \"…\")]);\n\t\t\treturn [...field(\"Status\", [status]), ...second];\n\t\t}\n\t\tif (worker) {\n\t\t\t// Model and usage get their own rows and wrap rather than truncate:\n\t\t\t// one combined line always overflows at realistic widths.\n\t\t\tconst wrap = (value: string) =>\n\t\t\t\twrapTextWithAnsi(value, Math.max(1, valueWidth)).slice(0, DETAIL_VALUE_MAX_ROWS);\n\t\t\treturn [\n\t\t\t\t...field(\"Status\", [status]),\n\t\t\t\t...field(\"Worker\", [truncateToWidth(clean(worker.label), valueWidth, \"…\")]),\n\t\t\t\t...field(\"Group\", [truncateToWidth(task.id, valueWidth, \"…\")]),\n\t\t\t\t...field(\"Model\", wrap(worker.model ?? \"—\")),\n\t\t\t\t...field(\"Usage\", wrap(worker.usage ?? \"—\")),\n\t\t\t];\n\t\t}\n\t\tconst readError = this.positions.get(row.key)?.output?.readError;\n\t\tconst lines = [\n\t\t\t...field(\"Status\", [status]),\n\t\t\t...field(\"Task\", [truncateToWidth(task.id, valueWidth, \"…\")]),\n\t\t\t...field(\n\t\t\t\t\"Error\",\n\t\t\t\t[\n\t\t\t\t\ttask.error ? `Task error: ${oneLine(task.error)}` : \"\",\n\t\t\t\t\treadError ? `Output read error: ${oneLine(readError)}` : \"\",\n\t\t\t\t]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.flatMap((error) => wrapTextWithAnsi(theme.fg(\"error\", error), Math.max(1, valueWidth)))\n\t\t\t\t\t.slice(0, ERROR_MAX_ROWS),\n\t\t\t),\n\t\t];\n\t\tif (task.kind === \"bash\") {\n\t\t\tif (task.command) lines.push(...field(\"Command\", this.commandLines(task, valueWidth, COMMAND_MAX_ROWS)));\n\t\t\tif (task.cwd)\n\t\t\t\tlines.push(...field(\"Directory\", [truncateToWidth(displayPath(task.cwd, valueWidth), valueWidth, \"…\")]));\n\t\t\tif (task.outputPath) lines.push(...field(\"Output\", [displayPath(task.outputPath, valueWidth)]));\n\t\t}\n\t\treturn lines.slice(0, DETAIL_MAX_ROWS);\n\t}\n\tprivate workerLines(row: Row, width: number): string[] {\n\t\tconst worker = row.worker;\n\t\tif (!worker) return [];\n\t\tconst { theme } = this.options;\n\t\tconst heading = (text: string) => theme.fg(\"dim\", theme.bold(text));\n\t\tconst lines = [\n\t\t\theading(\"Prompt\"),\n\t\t\t...this.markdownLines(row.key, \"prompt\", worker.prompt, width),\n\t\t\t\"\",\n\t\t\theading(\"Activity\"),\n\t\t];\n\t\tfor (const line of worker.activity ? clean(worker.activity).split(\"\\n\") : [\"—\"])\n\t\t\tlines.push(theme.fg(\"toolOutput\", line));\n\t\tlines.push(\"\");\n\t\tif (worker.error)\n\t\t\tlines.push(\n\t\t\t\t...wrapTextWithAnsi(theme.fg(\"error\", oneLine(worker.error)), Math.max(1, width)).slice(0, ERROR_MAX_ROWS),\n\t\t\t);\n\t\tlines.push(heading(\"Outcome\"));\n\t\tif (worker.report.text) lines.push(...this.markdownLines(row.key, \"outcome\", worker.report.text, width));\n\t\telse if (worker.status === \"queued\" || worker.status === \"running\")\n\t\t\tlines.push(theme.fg(\"muted\", \"Still running…\"));\n\t\telse lines.push(theme.fg(\"muted\", \"No report returned.\"));\n\t\tif (worker.report.truncated) lines.push(theme.fg(\"warning\", \"[Saved report truncated.]\"));\n\t\treturn lines;\n\t}\n\tprivate contentLines(row: Row | undefined, width: number): string[] {\n\t\tif (!row) return [];\n\t\tconst { theme } = this.options;\n\t\tconst { task, worker } = row;\n\t\tif (worker) return this.workerLines(row, width);\n\t\tif (task.kind !== \"bash\") {\n\t\t\tconst workers = task.projection?.workers ?? [];\n\t\t\tconst now = Date.now();\n\t\t\tif (workers.length)\n\t\t\t\treturn workers.map((w) => {\n\t\t\t\t\tconst marker = statusMarker(w.status, { now });\n\t\t\t\t\t// One truncated line per worker — an index of who did what. Model\n\t\t\t\t\t// and usage live in the worker's own detail view.\n\t\t\t\t\tconst summary = oneLine(`${w.label} · ${w.status}${w.description ? ` — ${w.description}` : \"\"}`);\n\t\t\t\t\treturn `${theme.fg(marker.color, marker.glyph)} ${theme.fg(\"toolOutput\", truncateToWidth(summary, Math.max(1, width), \"…\"))}`;\n\t\t\t\t});\n\t\t\tconst fallback = task.projection?.text;\n\t\t\treturn fallback\n\t\t\t\t? clean(fallback)\n\t\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t\t.map((line) => theme.fg(\"toolOutput\", line))\n\t\t\t\t: [theme.fg(\"muted\", \"No workers.\")];\n\t\t}\n\t\tconst text = this.positions.get(row.key)?.output?.text ?? task.projection?.text ?? \"Loading…\";\n\t\treturn clean(text)\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => theme.fg(\"toolOutput\", line));\n\t}\n\t/** One geometry calculation shared by rendering and page/line navigation. */\n\tprivate layout(): Layout {\n\t\tconst wide = this.wide();\n\t\tconst listWidth = wide\n\t\t\t? Math.min(LIST_MAX_WIDTH, Math.max(LIST_MIN_WIDTH, Math.floor((this.width - 1) * 0.36)))\n\t\t\t: this.width;\n\t\tconst previewWidth = wide ? this.width - listWidth - 1 : this.width;\n\t\tconst bodyHeight = this.bodyHeight();\n\t\tconst items = this.listItems();\n\t\tconst selectedIndex = items.findIndex((item) => \"row\" in item && item.row.key === this.selected);\n\t\tconst listVisible = wide ? bodyHeight : Math.min(NARROW_LIST_MAX_ROWS, Math.max(1, bodyHeight - 4));\n\t\tconst listFirst = Math.max(0, selectedIndex - listVisible + 1);\n\t\tconst visibleItems = items.slice(listFirst, listFirst + listVisible);\n\t\tconst row = this.current();\n\t\tconst detail = this.detailLines(row, Math.max(1, previewWidth - DETAIL_LABEL_WIDTH), !wide).slice(\n\t\t\t0,\n\t\t\twide ? Math.max(1, Math.min(DETAIL_MAX_ROWS, bodyHeight - 2)) : 2,\n\t\t);\n\t\tconst contentHeight = wide\n\t\t\t? Math.max(1, bodyHeight - detail.length - 1)\n\t\t\t: Math.max(1, bodyHeight - visibleItems.length - detail.length - 1);\n\t\tconst wrapped = this.contentLines(row, previewWidth).flatMap((line, lineIndex) => {\n\t\t\tlet column = 0;\n\t\t\treturn wrapTextWithAnsi(line, Math.max(1, previewWidth)).map((text) => {\n\t\t\t\tconst entry = { text, line: lineIndex, column };\n\t\t\t\tcolumn += visibleWidth(text);\n\t\t\t\treturn entry;\n\t\t\t});\n\t\t});\n\t\tconst entries = row?.task.kind === \"bash\" && !row.worker ? wrapped.slice(-2000) : wrapped.slice(0, 2000);\n\t\tconst content = entries.map((entry) => entry.text);\n\t\tconst max = Math.max(0, content.length - contentHeight);\n\t\tconst position = this.position();\n\t\tlet offset = position.scroll;\n\t\tif (position.anchor) {\n\t\t\tconst anchor = position.anchor;\n\t\t\tconst first = entries.findIndex((entry) => entry.line === anchor.line);\n\t\t\tif (first >= 0) {\n\t\t\t\toffset = first;\n\t\t\t\twhile (\n\t\t\t\t\toffset + 1 < entries.length &&\n\t\t\t\t\tentries[offset + 1]!.line === anchor.line &&\n\t\t\t\t\tentries[offset + 1]!.column <= anchor.column\n\t\t\t\t)\n\t\t\t\t\toffset++;\n\t\t\t}\n\t\t}\n\t\tconst start = position.follow ? max : Math.min(offset, max);\n\t\treturn {\n\t\t\twide,\n\t\t\tlistWidth,\n\t\t\tpreviewWidth,\n\t\t\tbodyHeight,\n\t\t\tvisibleItems,\n\t\t\tlistVisible,\n\t\t\tdetail,\n\t\t\tcontent,\n\t\t\tcontentHeight,\n\t\t\tstart,\n\t\t\tmax,\n\t\t\ttotal: content.length,\n\t\t\tentries,\n\t\t};\n\t}\n\tprivate scrollPreview(delta: number): void {\n\t\tconst { start, max, entries } = this.layout();\n\t\tconst position = this.position();\n\t\tconst wasFollowing = position.follow;\n\t\tposition.scroll = Math.min(max, Math.max(0, start + delta));\n\t\tconst entry = entries[position.scroll];\n\t\tposition.anchor = entry ? { line: entry.line, column: entry.column } : undefined;\n\t\t// Only an explicit downward movement resumes shell following, never resize/update.\n\t\tposition.follow =\n\t\t\tdelta > 0 && position.scroll === max && this.current()?.task.kind === \"bash\" && !this.current()?.worker;\n\t\tif (position.follow && !wasFollowing) this.queueTick();\n\t}\n\tprivate listRowLine(row: Row, width: number): string {\n\t\tconst { theme } = this.options;\n\t\tconst selected = row.key === this.selected;\n\t\tconst now = Date.now();\n\t\tconst marker = statusMarker(row.worker?.status ?? row.task.status, { now });\n\t\tconst glyph = theme.fg(marker.color, marker.glyph);\n\t\tconst cursor = selected ? theme.fg(this.focus === \"list\" ? \"accent\" : \"muted\", \"→ \") : \" \";\n\t\tconst indent = row.worker ? \" \" : \"\";\n\t\tconst terminal = isBackgroundTerminal(row.task.status);\n\t\t// Foreground mode stays explicit, including completed subagent groups.\n\t\tlet time = \"\";\n\t\tif (!row.worker) {\n\t\t\ttime = terminal ? formatAge(row.task.endedAt ?? row.task.startedAt, now) : runtimeLabel(row.task, now);\n\t\t\tconst workers = row.task.projection?.workers;\n\t\t\tif (workers && workers.length > 0) {\n\t\t\t\tconst settledCount = workers.filter((w) => w.status !== \"queued\" && w.status !== \"running\").length;\n\t\t\t\ttime = `${settledCount}/${workers.length} · ${time}`;\n\t\t\t}\n\t\t\tif (row.task.mode === \"foreground\") time = `fg · ${time}`;\n\t\t}\n\t\tconst timeWidth = time ? visibleWidth(time) + 1 : 0;\n\t\tconst labelWidth = Math.max(1, width - 2 - indent.length - visibleWidth(glyph) - 1 - timeWidth);\n\t\tconst labelColor: ThemeColor = selected && this.focus === \"list\" ? \"accent\" : \"text\";\n\t\tconst label = theme.fg(\n\t\t\tlabelColor,\n\t\t\ttruncateToWidth(\n\t\t\t\tclean(row.worker ? workerLabel(row.worker) : taskLabel({ command: row.task.command ?? row.task.title })),\n\t\t\t\tlabelWidth,\n\t\t\t\t\"…\",\n\t\t\t),\n\t\t);\n\t\tlet line = `${cursor}${indent}${glyph} ${label}`;\n\t\tif (time)\n\t\t\tline += \" \".repeat(Math.max(1, width - visibleWidth(line) - visibleWidth(time))) + theme.fg(\"dim\", time);\n\t\treturn pad(line, width);\n\t}\n\tprivate emptyLine(width: number): string {\n\t\treturn this.centered(width, \"No background tasks.\");\n\t}\n\t/** Tiny-terminal fallback: the frame stays, the layout steps aside. */\n\tprivate renderTooSmall(width: number, rows: number): string[] {\n\t\tconst { theme, keybindings } = this.options;\n\t\tconst rule = () => new DynamicBorder((text) => theme.fg(\"border\", text)).render(width)[0] ?? \"\";\n\t\tconst message = `Terminal too small for /bg — resize to at least ${MIN_RENDER_WIDTH}×${MIN_RENDER_HEIGHT}.`;\n\t\tconst bodyHeight = Math.max(1, rows - 4);\n\t\tconst body = Array.from({ length: bodyHeight }, () => pad(\"\", width));\n\t\tbody[Math.floor(bodyHeight / 2)] = this.centered(width, message);\n\t\tconst closeHint = pad(theme.fg(\"dim\", `${keyLabel(\"tui.select.cancel\", { keybindings })} close`), width);\n\t\treturn [rule(), ...body, rule(), closeHint, rule()];\n\t}\n\tprivate centered(width: number, message: string): string {\n\t\tconst leftPad = Math.max(0, Math.floor((width - visibleWidth(message)) / 2));\n\t\treturn pad(this.options.theme.fg(\"muted\", `${\" \".repeat(leftPad)}${message}`), width);\n\t}\n\tprivate dividerLine(layout: Layout): string {\n\t\tconst { theme } = this.options;\n\t\tconst row = this.current();\n\t\tconst label = row ? (row.worker ? \"Worker\" : row.task.kind === \"bash\" ? \"Output\" : \"Workers\") : \"Output\";\n\t\tconst styledLabel = theme.fg(this.focus === \"preview\" ? \"accent\" : \"muted\", label);\n\t\tconst shell = row !== undefined && row.task.kind === \"bash\" && !row.worker;\n\t\tconst suffix = shell ? theme.fg(\"muted\", ` · tail · ${this.position().follow ? \"following\" : \"browsing\"}`) : \"\";\n\t\tconst range = theme.fg(\n\t\t\t\"muted\",\n\t\t\t`${layout.total ? layout.start + 1 : 0}–${Math.min(layout.start + layout.contentHeight, layout.total)}/${layout.total}`,\n\t\t);\n\t\tconst rule = (count: number) => theme.fg(\"borderMuted\", \"─\".repeat(Math.max(0, count)));\n\t\tconst left = `${rule(1)} ${styledLabel}${suffix} `;\n\t\tconst right = ` ${range} ${rule(1)}`;\n\t\tconst fill = layout.previewWidth - visibleWidth(left) - visibleWidth(right);\n\t\treturn pad(`${left}${rule(fill)}${right}`, layout.previewWidth);\n\t}\n\trender(width: number): string[] {\n\t\tif (width < 1) return [];\n\t\tconst terminalRows = this.options.tui.terminal.rows;\n\t\tif (width < MIN_RENDER_WIDTH || terminalRows < MIN_RENDER_HEIGHT) {\n\t\t\treturn this.renderTooSmall(width, terminalRows);\n\t\t}\n\t\tconst wasWide = this.wide();\n\t\tthis.width = width;\n\t\tif (!wasWide && this.wide()) this.queueTick();\n\t\tconst { theme, keybindings } = this.options;\n\t\tconst layout = this.layout();\n\t\tconst rule = () => new DynamicBorder((text) => theme.fg(\"border\", text)).render(width)[0] ?? \"\";\n\t\tconst title = theme.fg(\"accent\", theme.bold(\"Background tasks\"));\n\t\t// Only non-zero segments show: a quiet header means nothing needs attention.\n\t\tconst segments: string[] = [];\n\t\tif (this.runningCount > 0) segments.push(theme.fg(\"accent\", `${this.runningCount} running`));\n\t\tif (this.completedCount > 0) segments.push(theme.fg(\"muted\", `${this.completedCount} completed`));\n\t\tif (this.failedCount > 0) segments.push(theme.fg(\"error\", `${this.failedCount} failed`));\n\t\tif (this.hiddenFinished > 0)\n\t\t\tsegments.push(\n\t\t\t\ttheme.fg(\"muted\", `${this.hiddenFinished} foreground shell${this.hiddenFinished === 1 ? \"\" : \"s\"} hidden`),\n\t\t\t);\n\t\tconst stats = segments.join(theme.fg(\"muted\", \" · \"));\n\t\tconst gap = width - visibleWidth(title) - visibleWidth(stats);\n\t\tconst titleLine = pad(stats && gap >= 1 ? `${title}${\" \".repeat(gap)}${stats}` : title, width);\n\t\tconst hint = (id: Parameters<typeof keybindings.getKeys>[0]) => keyLabel(id, { keybindings });\n\t\tconst pageUp = this.focus === \"list\" ? \"tui.select.pageUp\" : \"tui.editor.pageUp\";\n\t\tconst pageDown = this.focus === \"list\" ? \"tui.select.pageDown\" : \"tui.editor.pageDown\";\n\t\tconst hints = [\n\t\t\t`${hint(\"tui.select.up\")}/${hint(\"tui.select.down\")} select`,\n\t\t\t`${hint(\"app.backgroundTasks.focusList\")} list`,\n\t\t\t`${hint(\"app.backgroundTasks.focusPreview\")}/${hint(\"tui.select.confirm\")} output`,\n\t\t\t`${hint(pageUp)}/${hint(pageDown)} page`,\n\t\t\t`${hint(\"app.backgroundTasks.kill\")} stop`,\n\t\t\t`${hint(\"tui.select.cancel\")} close`,\n\t\t].join(\" · \");\n\t\tconst hintLine = pad(\n\t\t\tthis.pendingKill\n\t\t\t\t? theme.fg(\"warning\", `Stop ${this.pendingKill} (whole group)? y/N`)\n\t\t\t\t: theme.fg(this.feedback ? \"muted\" : \"dim\", this.feedback ?? hints),\n\t\t\twidth,\n\t\t);\n\t\tconst leftLines = layout.visibleItems.length\n\t\t\t? layout.visibleItems.map((item) =>\n\t\t\t\t\t\"header\" in item\n\t\t\t\t\t\t? pad(theme.fg(\"dim\", item.header), layout.listWidth)\n\t\t\t\t\t\t: this.listRowLine(item.row, layout.listWidth),\n\t\t\t\t)\n\t\t\t: [this.emptyLine(layout.listWidth)];\n\t\tconst contentWindow = layout.content.slice(layout.start, layout.start + layout.contentHeight);\n\t\tconst divider = this.dividerLine(layout);\n\t\tconst body: string[] = [];\n\t\tif (layout.wide) {\n\t\t\tconst right = [...layout.detail, divider, ...contentWindow];\n\t\t\tfor (let i = 0; i < layout.bodyHeight; i++)\n\t\t\t\tbody.push(\n\t\t\t\t\tpad(\n\t\t\t\t\t\t`${pad(leftLines[i] ?? \"\", layout.listWidth)}${theme.fg(\"borderMuted\", \"│\")}${pad(right[i] ?? \"\", layout.previewWidth)}`,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t} else {\n\t\t\tbody.push(...[...leftLines, ...layout.detail, divider, ...contentWindow].map((line) => pad(line, width)));\n\t\t\twhile (body.length < layout.bodyHeight) body.push(pad(\"\", width));\n\t\t}\n\t\treturn [rule(), titleLine, ...body.slice(0, layout.bodyHeight), rule(), hintLine, rule()].map((line) =>\n\t\t\tpad(line, width),\n\t\t);\n\t}\n}\n"]}
@@ -31,6 +31,11 @@ export declare function taskLabel(task: {
31
31
  description?: string;
32
32
  command: string;
33
33
  }): string;
34
+ /** Worker row label for listings: the "#1 explorer" ordinal label plus its description. */
35
+ export declare function workerLabel(worker: {
36
+ label: string;
37
+ description?: string;
38
+ }): string;
34
39
  /** A listing row's label, fitted to a visible-column budget. */
35
40
  export declare function taskLabelWithin(task: {
36
41
  description?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"task-view.d.ts","sourceRoot":"","sources":["../../../src/extensions/background/task-view.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,KAAK,iBAAiB,EAAgB,MAAM,qDAAqD,CAAC;AAE3G,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,iGAAiG;AACjG,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,SAAa,GAAG,MAAM,CAEjG;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,SAAa,GAAG,MAAM,CAEpG;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,IAAI,MAAM,CAEnF;AAED,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED,sFAAsF;AACtF,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAGjF;AAED,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtG;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAE3E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,iBAAiB,CAEtF"}
1
+ {"version":3,"file":"task-view.d.ts","sourceRoot":"","sources":["../../../src/extensions/background/task-view.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,KAAK,iBAAiB,EAAgB,MAAM,qDAAqD,CAAC;AAE3G,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,iGAAiG;AACjG,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,SAAa,GAAG,MAAM,CAEjG;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,SAAa,GAAG,MAAM,CAEpG;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,IAAI,MAAM,CAEnF;AAED,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED,sFAAsF;AACtF,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAGjF;AAED,2FAA2F;AAC3F,wBAAgB,WAAW,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEnF;AAED,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtG;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAE3E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,iBAAiB,CAEtF"}
@@ -34,6 +34,10 @@ export function taskLabel(task) {
34
34
  const command = firstCommandLine(task.command);
35
35
  return task.description ? `${task.description} — ${command}` : command;
36
36
  }
37
+ /** Worker row label for listings: the "#1 explorer" ordinal label plus its description. */
38
+ export function workerLabel(worker) {
39
+ return worker.description ? `${worker.label} — ${worker.description}` : worker.label;
40
+ }
37
41
  /** A listing row's label, fitted to a visible-column budget. */
38
42
  export function taskLabelWithin(task, width) {
39
43
  return truncateToWidth(taskLabel(task), width, "…");
@@ -1 +1 @@
1
- {"version":3,"file":"task-view.js","sourceRoot":"","sources":["../../../src/extensions/background/task-view.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAA0B,YAAY,EAAE,MAAM,qDAAqD,CAAC;AAC3G,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE7D,iGAAiG;AACjG,MAAM,UAAU,SAAS,CAAC,IAA6C,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACxF,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAA6C,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAC3F,OAAO,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,QAAmC;IAC9D,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,CAAC;AACpD,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,UAAU,CAAC,QAAmC,EAAE,SAAiB;IAChF,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,QAAQ,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,SAAS,CAAC,IAA+C;IACxE,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACxE,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,eAAe,CAAC,IAA+C,EAAE,KAAa;IAC7F,OAAO,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,KAAa;IAC1D,OAAO,eAAe,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAAoB,EAAE,OAAiB;IAClE,OAAO,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAoB,EAAE,OAAiB;IAClE,OAAO,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC;AAChD,CAAC","sourcesContent":["/**\n * background — how a task is described, everywhere.\n *\n * Every output this extension produces (four tool actions, two notification\n * renderers, the /bg list and detail header) is the same thing: a BgTask\n * projected into a medium. The values those projections derive — runtime, exit\n * suffix, label, glyph — live here once, so the media can differ without the\n * vocabulary drifting. Pure functions; no TUI components, no theme.\n */\n\nimport { truncateToWidth } from \"@earendil-works/pi-tui\";\nimport { type StatusMarkerColor, statusMarker } from \"../../modes/interactive/components/status-marker.ts\";\nimport { firstCommandLine, formatDuration } from \"./text.ts\";\nimport type { BgTaskStatus } from \"./types.ts\";\n/** How long a task has run, or ran. A running task has no `endedAt`, so it measures to `now`. */\nexport function runtimeMs(task: { startedAt: number; endedAt?: number }, now = Date.now()): number {\n\treturn (task.endedAt ?? now) - task.startedAt;\n}\n\nexport function runtimeLabel(task: { startedAt: number; endedAt?: number }, now = Date.now()): string {\n\treturn formatDuration(runtimeMs(task, now));\n}\n\n/**\n * Whether a task produced an exit code. Three-state by necessity: `undefined`\n * while running or when the run produced none, `null` when reaped by a signal —\n * and historical session entries still hold `null`, so this must keep accepting it.\n */\nexport function hasExitCode(exitCode: number | null | undefined): exitCode is number {\n\treturn exitCode !== undefined && exitCode !== null;\n}\n\n/** `<separator>exit <code>`, or nothing. Callers pick the separator: \" \", \", \", \" · \". */\nexport function exitSuffix(exitCode: number | null | undefined, separator: string): string {\n\treturn hasExitCode(exitCode) ? `${separator}exit ${exitCode}` : \"\";\n}\n\n/** Label for listings: the model-provided description over the first command line. */\nexport function taskLabel(task: { description?: string; command: string }): string {\n\tconst command = firstCommandLine(task.command);\n\treturn task.description ? `${task.description} — ${command}` : command;\n}\n\n/** A listing row's label, fitted to a visible-column budget. */\nexport function taskLabelWithin(task: { description?: string; command: string }, width: number): string {\n\treturn truncateToWidth(taskLabel(task), width, \"…\");\n}\n\n/** First command line fitted to a visible-column budget — wide characters count as two. */\nexport function commandLabel(command: string, width: number): string {\n\treturn truncateToWidth(firstCommandLine(command), width, \"…\");\n}\n\n/**\n * Static marker for transcripts and snapshots; the /bg panel animates running\n * rows via statusMarker(status, { now }) directly. Both delegate to the shared\n * status-marker vocabulary.\n */\nexport function statusGlyph(status: BgTaskStatus, stalled?: boolean): string {\n\treturn statusMarker(status, { stalled }).glyph;\n}\n\nexport function statusColor(status: BgTaskStatus, stalled?: boolean): StatusMarkerColor {\n\treturn statusMarker(status, { stalled }).color;\n}\n"]}
1
+ {"version":3,"file":"task-view.js","sourceRoot":"","sources":["../../../src/extensions/background/task-view.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAA0B,YAAY,EAAE,MAAM,qDAAqD,CAAC;AAC3G,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE7D,iGAAiG;AACjG,MAAM,UAAU,SAAS,CAAC,IAA6C,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACxF,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAA6C,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAC3F,OAAO,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,QAAmC;IAC9D,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,CAAC;AACpD,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,UAAU,CAAC,QAAmC,EAAE,SAAiB;IAChF,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,QAAQ,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,SAAS,CAAC,IAA+C;IACxE,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACxE,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,WAAW,CAAC,MAA+C;IAC1E,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AACtF,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,eAAe,CAAC,IAA+C,EAAE,KAAa;IAC7F,OAAO,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,KAAa;IAC1D,OAAO,eAAe,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAAoB,EAAE,OAAiB;IAClE,OAAO,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAoB,EAAE,OAAiB;IAClE,OAAO,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC;AAChD,CAAC","sourcesContent":["/**\n * background — how a task is described, everywhere.\n *\n * Every output this extension produces (four tool actions, two notification\n * renderers, the /bg list and detail header) is the same thing: a BgTask\n * projected into a medium. The values those projections derive — runtime, exit\n * suffix, label, glyph — live here once, so the media can differ without the\n * vocabulary drifting. Pure functions; no TUI components, no theme.\n */\n\nimport { truncateToWidth } from \"@earendil-works/pi-tui\";\nimport { type StatusMarkerColor, statusMarker } from \"../../modes/interactive/components/status-marker.ts\";\nimport { firstCommandLine, formatDuration } from \"./text.ts\";\nimport type { BgTaskStatus } from \"./types.ts\";\n/** How long a task has run, or ran. A running task has no `endedAt`, so it measures to `now`. */\nexport function runtimeMs(task: { startedAt: number; endedAt?: number }, now = Date.now()): number {\n\treturn (task.endedAt ?? now) - task.startedAt;\n}\n\nexport function runtimeLabel(task: { startedAt: number; endedAt?: number }, now = Date.now()): string {\n\treturn formatDuration(runtimeMs(task, now));\n}\n\n/**\n * Whether a task produced an exit code. Three-state by necessity: `undefined`\n * while running or when the run produced none, `null` when reaped by a signal —\n * and historical session entries still hold `null`, so this must keep accepting it.\n */\nexport function hasExitCode(exitCode: number | null | undefined): exitCode is number {\n\treturn exitCode !== undefined && exitCode !== null;\n}\n\n/** `<separator>exit <code>`, or nothing. Callers pick the separator: \" \", \", \", \" · \". */\nexport function exitSuffix(exitCode: number | null | undefined, separator: string): string {\n\treturn hasExitCode(exitCode) ? `${separator}exit ${exitCode}` : \"\";\n}\n\n/** Label for listings: the model-provided description over the first command line. */\nexport function taskLabel(task: { description?: string; command: string }): string {\n\tconst command = firstCommandLine(task.command);\n\treturn task.description ? `${task.description} — ${command}` : command;\n}\n\n/** Worker row label for listings: the \"#1 explorer\" ordinal label plus its description. */\nexport function workerLabel(worker: { label: string; description?: string }): string {\n\treturn worker.description ? `${worker.label} — ${worker.description}` : worker.label;\n}\n\n/** A listing row's label, fitted to a visible-column budget. */\nexport function taskLabelWithin(task: { description?: string; command: string }, width: number): string {\n\treturn truncateToWidth(taskLabel(task), width, \"…\");\n}\n\n/** First command line fitted to a visible-column budget — wide characters count as two. */\nexport function commandLabel(command: string, width: number): string {\n\treturn truncateToWidth(firstCommandLine(command), width, \"…\");\n}\n\n/**\n * Static marker for transcripts and snapshots; the /bg panel animates running\n * rows via statusMarker(status, { now }) directly. Both delegate to the shared\n * status-marker vocabulary.\n */\nexport function statusGlyph(status: BgTaskStatus, stalled?: boolean): string {\n\treturn statusMarker(status, { stalled }).glyph;\n}\n\nexport function statusColor(status: BgTaskStatus, stalled?: boolean): StatusMarkerColor {\n\treturn statusMarker(status, { stalled }).color;\n}\n"]}
@@ -7,7 +7,7 @@ export declare class BtwController {
7
7
  handled: true;
8
8
  editorText?: string;
9
9
  } | undefined;
10
- close(clearEditor?: boolean): void;
10
+ close(): void;
11
11
  private submit;
12
12
  private refresh;
13
13
  private handleKey;
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/extensions/btw/controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAa1F,4FAA4F;AAC5F,qBAAa,aAAa;IACzB,OAAO,CAAC,OAAO,CAAC,CAAe;IAEzB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0DlE,SAAS,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,gBAAgB,GAAG;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAU9G,KAAK,CAAC,WAAW,UAAO,GAAG,IAAI;IAW/B,OAAO,CAAC,MAAM;IAmBd,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,SAAS;CA+BjB"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/extensions/btw/controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAa1F,4FAA4F;AAC5F,qBAAa,aAAa;IACzB,OAAO,CAAC,OAAO,CAAC,CAAe;IAEzB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0DlE,SAAS,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,gBAAgB,GAAG;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAU9G,KAAK,IAAI,IAAI;IAYb,OAAO,CAAC,MAAM;IAmBd,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,SAAS;CA+BjB"}
@@ -9,7 +9,7 @@ export class BtwController {
9
9
  ctx.ui.notify("/btw is available in interactive mode.", "warning");
10
10
  return;
11
11
  }
12
- this.close(false);
12
+ this.close();
13
13
  ctx.ui.setEditorText("");
14
14
  const conversation = {
15
15
  ctx,
@@ -68,7 +68,7 @@ export class BtwController {
68
68
  return undefined;
69
69
  return this.submit(event.text);
70
70
  }
71
- close(clearEditor = true) {
71
+ close() {
72
72
  const conversation = this.current;
73
73
  if (!conversation)
74
74
  return;
@@ -77,8 +77,8 @@ export class BtwController {
77
77
  conversation.panel?.dispose();
78
78
  conversation.agent?.dispose();
79
79
  conversation.ctx.ui.setWidget(BTW_WIDGET, undefined);
80
- if (clearEditor)
81
- conversation.ctx.ui.setEditorText("");
80
+ // The open panel owns the editor draft; never hand it back to the main conversation.
81
+ conversation.ctx.ui.setEditorText("");
82
82
  }
83
83
  submit(text) {
84
84
  const conversation = this.current;
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../src/extensions/btw/controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAsB,MAAM,YAAY,CAAC;AAU1D,4FAA4F;AAC5F,MAAM,OAAO,aAAa;IAGzB,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,GAAqB;QACjD,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACxB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,wCAAwC,EAAE,SAAS,CAAC,CAAC;YACnE,OAAO;QACR,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClB,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACzB,MAAM,YAAY,GAAiB;YAClC,GAAG;YACH,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE;SACpE,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC;QAC5B,IAAI,CAAC;YACJ,8EAA8E;YAC9E,MAAM,eAAe,GAAG,GAAG,CAAC,kBAAkB,EAAE,CAAC;YACjD,GAAG,CAAC,EAAE,CAAC,SAAS,CACf,UAAU,EACV,CAAC,GAAG,EAAE,EAAE;gBACP,MAAM,KAAK,GAAG,IAAI,QAAQ,CACzB,GAAG,EACH,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAClB,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CACxB,CAAC;gBACF,YAAY,CAAC,KAAK,GAAG,KAAK,CAAC;gBAC3B,OAAO,KAAK,CAAC;YACd,CAAC,EACD,EAAE,SAAS,EAAE,aAAa,EAAE,CAC5B,CAAC;YACF,YAAY,CAAC,eAAe,GAAG,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE;gBACnG,KAAK,EAAE,QAAQ;aACf,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC;YACvC,IAAI,IAAI,CAAC,OAAO,KAAK,YAAY;gBAAE,OAAO;YAC1C,YAAY,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;YAChG,YAAY,CAAC,KAAK,GAAG;gBACpB,KAAK,EAAE,OAAO;gBACd,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,KAAK,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE;gBACxD,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK;gBAC/B,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK;gBAC/B,gBAAgB,EAAE,GAAG,CAAC,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAChE,YAAY,EAAE,CAAC;aACf,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC3B,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC5C,IAAI,MAAM,EAAE,UAAU,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE;oBAAE,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC5F,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,IAAI,CAAC,OAAO,KAAK,YAAY;gBAAE,OAAO;YAC1C,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC;YACnC,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClF,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;YAC9B,IAAI,QAAQ,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE;gBAAE,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACzE,CAAC;IACF,CAAC;IAED,SAAS,CAAC,KAAwB,EAAE,GAAqB;QACxD,MAAM,OAAO,GAAG,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,OAAO,EAAE,CAAC;YACb,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;YACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC/D,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,WAAW,GAAG,IAAI;QACvB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC;QAClC,IAAI,CAAC,YAAY;YAAE,OAAO;QAC1B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,YAAY,CAAC,eAAe,EAAE,EAAE,CAAC;QACjC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;QAC9B,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;QAC9B,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,WAAW;YAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAEO,MAAM,CAAC,IAAY;QAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC;QAClC,IAAI,CAAC,YAAY;YAAE,OAAO,SAAS,CAAC;QACpC,MAAM,KAAK,GACV,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC;YAClC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,8DAA8D,CAAC,CAAC;QACnG,IAAI,KAAK,EAAE,CAAC;YACX,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC7C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC5C,CAAC;QACD,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC;QACjC,KAAK,YAAY,CAAC,KAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC3D,IAAI,IAAI,CAAC,OAAO,KAAK,YAAY;gBAAE,OAAO;YAC1C,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5F,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE;gBAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;IAEO,OAAO,CAAC,YAA0B;QACzC,IAAI,IAAI,CAAC,OAAO,KAAK,YAAY;YAAE,OAAO;QAC1C,YAAY,CAAC,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC;QAC5D,YAAY,CAAC,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,CAAC;QACxE,YAAY,CAAC,KAAK,CAAC,qBAAqB,GAAG,YAAY,CAAC,KAAK,EAAE,qBAAqB,CAAC;QACrF,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;IAEO,SAAS,CAAC,YAA0B,EAAE,IAAY;QACzD,IAAI,IAAI,CAAC,OAAO,KAAK,YAAY;YAAE,OAAO,SAAS,CAAC;QACpD,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,CAAC;YAC1C,IAAI,YAAY,CAAC,KAAK,EAAE,IAAI;gBAAE,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;;gBACrD,IAAI,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QACD,4EAA4E;QAC5E,6EAA6E;QAC7E,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,4BAA4B,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,wBAAwB,CAAC,EAAE,CAAC;YACtG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;QAC/D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC;YAC1C,IAAI,SAAS;gBAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YACrD,IAAI,SAAS,IAAI,QAAQ,IAAI,UAAU;gBAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACnE,CAAC;aAAM,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC;YACrD,qEAAqE;YACrE,mEAAmE;YACnE,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC;gBAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9F,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;CACD","sourcesContent":["import { getKeybindings } from \"@earendil-works/pi-tui\";\nimport type { EditorSubmitEvent, ExtensionContext } from \"../../core/extensions/index.ts\";\nimport { BtwAgent } from \"./agent.ts\";\nimport { BTW_WIDGET } from \"./constants.ts\";\nimport { BtwPanel, type BtwPanelState } from \"./panel.ts\";\n\ninterface Conversation {\n\tctx: ExtensionContext;\n\tstate: BtwPanelState;\n\tpanel?: BtwPanel;\n\tagent?: BtwAgent;\n\tunsubscribeKeys?: () => void;\n}\n\n/** A conversation object's identity guards all callbacks across close/reopen and reload. */\nexport class BtwController {\n\tprivate current?: Conversation;\n\n\tasync open(question: string, ctx: ExtensionContext): Promise<void> {\n\t\tif (ctx.mode !== \"tui\") {\n\t\t\tctx.ui.notify(\"/btw is available in interactive mode.\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\tthis.close(false);\n\t\tctx.ui.setEditorText(\"\");\n\t\tconst conversation: Conversation = {\n\t\t\tctx,\n\t\t\tstate: { phase: \"opening\", busy: false, turns: [], blockedTools: 0 },\n\t\t};\n\t\tthis.current = conversation;\n\t\ttry {\n\t\t\t// Calling now fixes source state before UI setup or asynchronous preparation.\n\t\t\tconst pendingSnapshot = ctx.getContextSnapshot();\n\t\t\tctx.ui.setWidget(\n\t\t\t\tBTW_WIDGET,\n\t\t\t\t(tui) => {\n\t\t\t\t\tconst panel = new BtwPanel(\n\t\t\t\t\t\ttui,\n\t\t\t\t\t\t() => ctx.ui.theme,\n\t\t\t\t\t\t() => conversation.state,\n\t\t\t\t\t);\n\t\t\t\t\tconversation.panel = panel;\n\t\t\t\t\treturn panel;\n\t\t\t\t},\n\t\t\t\t{ placement: \"aboveEditor\" },\n\t\t\t);\n\t\t\tconversation.unsubscribeKeys = ctx.ui.onTerminalInput((data) => this.handleKey(conversation, data), {\n\t\t\t\tscope: \"editor\",\n\t\t\t});\n\t\t\tconst snapshot = await pendingSnapshot;\n\t\t\tif (this.current !== conversation) return;\n\t\t\tconversation.agent = new BtwAgent(snapshot, ctx.modelRuntime, () => this.refresh(conversation));\n\t\t\tconversation.state = {\n\t\t\t\tphase: \"ready\",\n\t\t\t\tcapturedAt: snapshot.capturedAt,\n\t\t\t\tmodel: `${snapshot.model.provider}/${snapshot.model.id}`,\n\t\t\t\tbusy: false,\n\t\t\t\tturns: conversation.agent.turns,\n\t\t\t\tusage: conversation.agent.usage,\n\t\t\t\tusesSubscription: ctx.modelRegistry.isUsingOAuth(snapshot.model),\n\t\t\t\tblockedTools: 0,\n\t\t\t};\n\t\t\tthis.refresh(conversation);\n\t\t\tif (question.trim()) {\n\t\t\t\tconst result = this.submit(question.trim());\n\t\t\t\tif (result?.editorText && !ctx.ui.getEditorText()) ctx.ui.setEditorText(result.editorText);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (this.current !== conversation) return;\n\t\t\tconversation.state.phase = \"error\";\n\t\t\tconversation.state.error = error instanceof Error ? error.message : String(error);\n\t\t\tconversation.panel?.changed();\n\t\t\tif (question && !ctx.ui.getEditorText()) ctx.ui.setEditorText(question);\n\t\t}\n\t}\n\n\tintercept(event: EditorSubmitEvent, ctx: ExtensionContext): { handled: true; editorText?: string } | undefined {\n\t\tconst command = /^\\/btw(?:\\s+([\\s\\S]*))?$/.exec(event.text);\n\t\tif (command) {\n\t\t\tvoid this.open(command[1] ?? \"\", ctx);\n\t\t\treturn { handled: true };\n\t\t}\n\t\tif (!this.current || event.kind !== \"prompt\") return undefined;\n\t\treturn this.submit(event.text);\n\t}\n\n\tclose(clearEditor = true): void {\n\t\tconst conversation = this.current;\n\t\tif (!conversation) return;\n\t\tthis.current = undefined;\n\t\tconversation.unsubscribeKeys?.();\n\t\tconversation.panel?.dispose();\n\t\tconversation.agent?.dispose();\n\t\tconversation.ctx.ui.setWidget(BTW_WIDGET, undefined);\n\t\tif (clearEditor) conversation.ctx.ui.setEditorText(\"\");\n\t}\n\n\tprivate submit(text: string): { handled: true; editorText?: string } | undefined {\n\t\tconst conversation = this.current;\n\t\tif (!conversation) return undefined;\n\t\tconst error =\n\t\t\tconversation.agent?.validate(text) ??\n\t\t\t(conversation.agent ? undefined : \"BTW is not ready. Reopen /btw if context preparation failed.\");\n\t\tif (error) {\n\t\t\tconversation.ctx.ui.notify(error, \"warning\");\n\t\t\treturn { handled: true, editorText: text };\n\t\t}\n\t\tconversation.panel?.followTail();\n\t\tvoid conversation.agent!.ask(text).catch((error: unknown) => {\n\t\t\tif (this.current !== conversation) return;\n\t\t\tconversation.ctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\tif (!conversation.ctx.ui.getEditorText()) conversation.ctx.ui.setEditorText(text);\n\t\t});\n\t\treturn { handled: true };\n\t}\n\n\tprivate refresh(conversation: Conversation): void {\n\t\tif (this.current !== conversation) return;\n\t\tconversation.state.busy = conversation.agent?.busy ?? false;\n\t\tconversation.state.blockedTools = conversation.agent?.blockedTools ?? 0;\n\t\tconversation.state.latestCacheHitPercent = conversation.agent?.latestCacheHitPercent;\n\t\tconversation.panel?.changed();\n\t}\n\n\tprivate handleKey(conversation: Conversation, data: string): { consume: true } | undefined {\n\t\tif (this.current !== conversation) return undefined;\n\t\tconst keys = getKeybindings();\n\t\tif (keys.matches(data, \"app.btw.close\")) {\n\t\t\tthis.close();\n\t\t\treturn { consume: true };\n\t\t}\n\t\tif (keys.matches(data, \"app.btw.cancel\")) {\n\t\t\tif (conversation.agent?.busy) conversation.agent.cancel();\n\t\t\telse this.close();\n\t\t\treturn { consume: true };\n\t\t}\n\t\t// Main prompt history never belongs in this editor mode, including explicit\n\t\t// history bindings. Autocomplete/dialog input is excluded by the host scope.\n\t\tif (keys.matches(data, \"tui.editor.historyPrevious\") || keys.matches(data, \"tui.editor.historyNext\")) {\n\t\t\treturn { consume: true };\n\t\t}\n\t\tconst direction = keys.matches(data, \"app.btw.scrollUp\") ? -1 : keys.matches(data, \"app.btw.scrollDown\") ? 1 : 0;\n\t\tconst cursorUp = keys.matches(data, \"tui.editor.cursorUp\");\n\t\tconst cursorDown = keys.matches(data, \"tui.editor.cursorDown\");\n\t\tif (!conversation.ctx.ui.getEditorText()) {\n\t\t\tif (direction) conversation.panel?.scroll(direction);\n\t\t\tif (direction || cursorUp || cursorDown) return { consume: true };\n\t\t} else if (cursorUp || cursorDown) {\n\t\t\tconst cursor = conversation.ctx.ui.getEditorCursor();\n\t\t\t// The native editor browses history on Up at the start of the draft.\n\t\t\t// Let it keep normal movement within multiline and wrapped drafts.\n\t\t\tif (!cursor || (cursorUp && cursor.line === 0 && cursor.col === 0)) return { consume: true };\n\t\t}\n\t\treturn undefined;\n\t}\n}\n"]}
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../src/extensions/btw/controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { getKeybindings } from \"@earendil-works/pi-tui\";\nimport type { EditorSubmitEvent, ExtensionContext } from \"../../core/extensions/index.ts\";\nimport { BtwAgent } from \"./agent.ts\";\nimport { BTW_WIDGET } from \"./constants.ts\";\nimport { BtwPanel, type BtwPanelState } from \"./panel.ts\";\n\ninterface Conversation {\n\tctx: ExtensionContext;\n\tstate: BtwPanelState;\n\tpanel?: BtwPanel;\n\tagent?: BtwAgent;\n\tunsubscribeKeys?: () => void;\n}\n\n/** A conversation object's identity guards all callbacks across close/reopen and reload. */\nexport class BtwController {\n\tprivate current?: Conversation;\n\n\tasync open(question: string, ctx: ExtensionContext): Promise<void> {\n\t\tif (ctx.mode !== \"tui\") {\n\t\t\tctx.ui.notify(\"/btw is available in interactive mode.\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\tthis.close();\n\t\tctx.ui.setEditorText(\"\");\n\t\tconst conversation: Conversation = {\n\t\t\tctx,\n\t\t\tstate: { phase: \"opening\", busy: false, turns: [], blockedTools: 0 },\n\t\t};\n\t\tthis.current = conversation;\n\t\ttry {\n\t\t\t// Calling now fixes source state before UI setup or asynchronous preparation.\n\t\t\tconst pendingSnapshot = ctx.getContextSnapshot();\n\t\t\tctx.ui.setWidget(\n\t\t\t\tBTW_WIDGET,\n\t\t\t\t(tui) => {\n\t\t\t\t\tconst panel = new BtwPanel(\n\t\t\t\t\t\ttui,\n\t\t\t\t\t\t() => ctx.ui.theme,\n\t\t\t\t\t\t() => conversation.state,\n\t\t\t\t\t);\n\t\t\t\t\tconversation.panel = panel;\n\t\t\t\t\treturn panel;\n\t\t\t\t},\n\t\t\t\t{ placement: \"aboveEditor\" },\n\t\t\t);\n\t\t\tconversation.unsubscribeKeys = ctx.ui.onTerminalInput((data) => this.handleKey(conversation, data), {\n\t\t\t\tscope: \"editor\",\n\t\t\t});\n\t\t\tconst snapshot = await pendingSnapshot;\n\t\t\tif (this.current !== conversation) return;\n\t\t\tconversation.agent = new BtwAgent(snapshot, ctx.modelRuntime, () => this.refresh(conversation));\n\t\t\tconversation.state = {\n\t\t\t\tphase: \"ready\",\n\t\t\t\tcapturedAt: snapshot.capturedAt,\n\t\t\t\tmodel: `${snapshot.model.provider}/${snapshot.model.id}`,\n\t\t\t\tbusy: false,\n\t\t\t\tturns: conversation.agent.turns,\n\t\t\t\tusage: conversation.agent.usage,\n\t\t\t\tusesSubscription: ctx.modelRegistry.isUsingOAuth(snapshot.model),\n\t\t\t\tblockedTools: 0,\n\t\t\t};\n\t\t\tthis.refresh(conversation);\n\t\t\tif (question.trim()) {\n\t\t\t\tconst result = this.submit(question.trim());\n\t\t\t\tif (result?.editorText && !ctx.ui.getEditorText()) ctx.ui.setEditorText(result.editorText);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (this.current !== conversation) return;\n\t\t\tconversation.state.phase = \"error\";\n\t\t\tconversation.state.error = error instanceof Error ? error.message : String(error);\n\t\t\tconversation.panel?.changed();\n\t\t\tif (question && !ctx.ui.getEditorText()) ctx.ui.setEditorText(question);\n\t\t}\n\t}\n\n\tintercept(event: EditorSubmitEvent, ctx: ExtensionContext): { handled: true; editorText?: string } | undefined {\n\t\tconst command = /^\\/btw(?:\\s+([\\s\\S]*))?$/.exec(event.text);\n\t\tif (command) {\n\t\t\tvoid this.open(command[1] ?? \"\", ctx);\n\t\t\treturn { handled: true };\n\t\t}\n\t\tif (!this.current || event.kind !== \"prompt\") return undefined;\n\t\treturn this.submit(event.text);\n\t}\n\n\tclose(): void {\n\t\tconst conversation = this.current;\n\t\tif (!conversation) return;\n\t\tthis.current = undefined;\n\t\tconversation.unsubscribeKeys?.();\n\t\tconversation.panel?.dispose();\n\t\tconversation.agent?.dispose();\n\t\tconversation.ctx.ui.setWidget(BTW_WIDGET, undefined);\n\t\t// The open panel owns the editor draft; never hand it back to the main conversation.\n\t\tconversation.ctx.ui.setEditorText(\"\");\n\t}\n\n\tprivate submit(text: string): { handled: true; editorText?: string } | undefined {\n\t\tconst conversation = this.current;\n\t\tif (!conversation) return undefined;\n\t\tconst error =\n\t\t\tconversation.agent?.validate(text) ??\n\t\t\t(conversation.agent ? undefined : \"BTW is not ready. Reopen /btw if context preparation failed.\");\n\t\tif (error) {\n\t\t\tconversation.ctx.ui.notify(error, \"warning\");\n\t\t\treturn { handled: true, editorText: text };\n\t\t}\n\t\tconversation.panel?.followTail();\n\t\tvoid conversation.agent!.ask(text).catch((error: unknown) => {\n\t\t\tif (this.current !== conversation) return;\n\t\t\tconversation.ctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\tif (!conversation.ctx.ui.getEditorText()) conversation.ctx.ui.setEditorText(text);\n\t\t});\n\t\treturn { handled: true };\n\t}\n\n\tprivate refresh(conversation: Conversation): void {\n\t\tif (this.current !== conversation) return;\n\t\tconversation.state.busy = conversation.agent?.busy ?? false;\n\t\tconversation.state.blockedTools = conversation.agent?.blockedTools ?? 0;\n\t\tconversation.state.latestCacheHitPercent = conversation.agent?.latestCacheHitPercent;\n\t\tconversation.panel?.changed();\n\t}\n\n\tprivate handleKey(conversation: Conversation, data: string): { consume: true } | undefined {\n\t\tif (this.current !== conversation) return undefined;\n\t\tconst keys = getKeybindings();\n\t\tif (keys.matches(data, \"app.btw.close\")) {\n\t\t\tthis.close();\n\t\t\treturn { consume: true };\n\t\t}\n\t\tif (keys.matches(data, \"app.btw.cancel\")) {\n\t\t\tif (conversation.agent?.busy) conversation.agent.cancel();\n\t\t\telse this.close();\n\t\t\treturn { consume: true };\n\t\t}\n\t\t// Main prompt history never belongs in this editor mode, including explicit\n\t\t// history bindings. Autocomplete/dialog input is excluded by the host scope.\n\t\tif (keys.matches(data, \"tui.editor.historyPrevious\") || keys.matches(data, \"tui.editor.historyNext\")) {\n\t\t\treturn { consume: true };\n\t\t}\n\t\tconst direction = keys.matches(data, \"app.btw.scrollUp\") ? -1 : keys.matches(data, \"app.btw.scrollDown\") ? 1 : 0;\n\t\tconst cursorUp = keys.matches(data, \"tui.editor.cursorUp\");\n\t\tconst cursorDown = keys.matches(data, \"tui.editor.cursorDown\");\n\t\tif (!conversation.ctx.ui.getEditorText()) {\n\t\t\tif (direction) conversation.panel?.scroll(direction);\n\t\t\tif (direction || cursorUp || cursorDown) return { consume: true };\n\t\t} else if (cursorUp || cursorDown) {\n\t\t\tconst cursor = conversation.ctx.ui.getEditorCursor();\n\t\t\t// The native editor browses history on Up at the start of the draft.\n\t\t\t// Let it keep normal movement within multiline and wrapped drafts.\n\t\t\tif (!cursor || (cursorUp && cursor.line === 0 && cursor.col === 0)) return { consume: true };\n\t\t}\n\t\treturn undefined;\n\t}\n}\n"]}
@@ -10,15 +10,15 @@ export default function btwExtension(pi) {
10
10
  });
11
11
  pi.on("session_start", (_event, ctx) => {
12
12
  unsubscribeSubmit?.();
13
- controller.close(false);
13
+ controller.close();
14
14
  if (ctx.mode === "tui")
15
15
  unsubscribeSubmit = ctx.ui.onEditorSubmit((event) => controller.intercept(event, ctx));
16
16
  });
17
- pi.on("session_tree", () => controller.close(false));
17
+ pi.on("session_tree", () => controller.close());
18
18
  pi.on("session_shutdown", () => {
19
19
  unsubscribeSubmit?.();
20
20
  unsubscribeSubmit = undefined;
21
- controller.close(false);
21
+ controller.close();
22
22
  });
23
23
  }
24
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/btw/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAgB;IACpD,MAAM,UAAU,GAAG,IAAI,aAAa,EAAE,CAAC;IACvC,IAAI,iBAA2C,CAAC;IAChD,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE;QACzB,WAAW,EAAE,yDAAyD;QACtE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YAC5B,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;KACD,CAAC,CAAC;IACH,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACtC,iBAAiB,EAAE,EAAE,CAAC;QACtB,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK;YAAE,iBAAiB,GAAG,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAChH,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC9B,iBAAiB,EAAE,EAAE,CAAC;QACtB,iBAAiB,GAAG,SAAS,CAAC;QAC9B,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { ExtensionAPI } from \"../../core/extensions/index.ts\";\nimport { BtwController } from \"./controller.ts\";\n\nexport default function btwExtension(pi: ExtensionAPI): void {\n\tconst controller = new BtwController();\n\tlet unsubscribeSubmit: (() => void) | undefined;\n\tpi.registerCommand(\"btw\", {\n\t\tdescription: \"Ask a temporary side question using the current context\",\n\t\thandler: async (args, ctx) => {\n\t\t\tawait controller.open(args, ctx);\n\t\t},\n\t});\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tunsubscribeSubmit?.();\n\t\tcontroller.close(false);\n\t\tif (ctx.mode === \"tui\") unsubscribeSubmit = ctx.ui.onEditorSubmit((event) => controller.intercept(event, ctx));\n\t});\n\tpi.on(\"session_tree\", () => controller.close(false));\n\tpi.on(\"session_shutdown\", () => {\n\t\tunsubscribeSubmit?.();\n\t\tunsubscribeSubmit = undefined;\n\t\tcontroller.close(false);\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/btw/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAgB;IACpD,MAAM,UAAU,GAAG,IAAI,aAAa,EAAE,CAAC;IACvC,IAAI,iBAA2C,CAAC;IAChD,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE;QACzB,WAAW,EAAE,yDAAyD;QACtE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YAC5B,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;KACD,CAAC,CAAC;IACH,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACtC,iBAAiB,EAAE,EAAE,CAAC;QACtB,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK;YAAE,iBAAiB,GAAG,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAChH,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAChD,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC9B,iBAAiB,EAAE,EAAE,CAAC;QACtB,iBAAiB,GAAG,SAAS,CAAC;QAC9B,UAAU,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { ExtensionAPI } from \"../../core/extensions/index.ts\";\nimport { BtwController } from \"./controller.ts\";\n\nexport default function btwExtension(pi: ExtensionAPI): void {\n\tconst controller = new BtwController();\n\tlet unsubscribeSubmit: (() => void) | undefined;\n\tpi.registerCommand(\"btw\", {\n\t\tdescription: \"Ask a temporary side question using the current context\",\n\t\thandler: async (args, ctx) => {\n\t\t\tawait controller.open(args, ctx);\n\t\t},\n\t});\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tunsubscribeSubmit?.();\n\t\tcontroller.close();\n\t\tif (ctx.mode === \"tui\") unsubscribeSubmit = ctx.ui.onEditorSubmit((event) => controller.intercept(event, ctx));\n\t});\n\tpi.on(\"session_tree\", () => controller.close());\n\tpi.on(\"session_shutdown\", () => {\n\t\tunsubscribeSubmit?.();\n\t\tunsubscribeSubmit = undefined;\n\t\tcontroller.close();\n\t});\n}\n"]}
@@ -2,8 +2,8 @@ import backgroundExtension from "./background/index.js";
2
2
  import btwExtension from "./btw/index.js";
3
3
  import deepwikiExtension from "./deepwiki/index.js";
4
4
  import llamaExtension from "./llama/index.js";
5
+ import providerExtension from "./provider/index.js";
5
6
  import questionExtension from "./question/index.js";
6
- import routerExtension from "./router/index.js";
7
7
  import statuslineExtension from "./statusline/index.js";
8
8
  import subagentExtension from "./subagent/index.js";
9
9
  import todoExtension from "./todo/index.js";
@@ -13,8 +13,8 @@ export const builtInExtensions = [
13
13
  { name: "background", factory: backgroundExtension, hidden: true },
14
14
  { name: "btw", factory: btwExtension, hidden: true },
15
15
  { name: "deepwiki", factory: deepwikiExtension, hidden: true },
16
+ { name: "provider", factory: providerExtension, hidden: true },
16
17
  { name: "question", factory: questionExtension, hidden: true },
17
- { name: "router", factory: routerExtension, hidden: true },
18
18
  { name: "statusline", factory: statuslineExtension, hidden: true },
19
19
  { name: "subagent", factory: subagentExtension, hidden: true },
20
20
  { name: "todo", factory: todoExtension, hidden: true },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AACA,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AACxD,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AACxD,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,kBAAkB,MAAM,uBAAuB,CAAC;AAEvD,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IACnD,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE;IAC5D,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE;IAClE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE;IACpD,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE;IAC9D,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE;IAC9D,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE;IAC1D,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE;IAClE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE;IAC9D,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE;IACtD,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,IAAI,EAAE;CACjE,CAAC","sourcesContent":["import type { InlineExtension } from \"../core/extensions/types.ts\";\nimport backgroundExtension from \"./background/index.ts\";\nimport btwExtension from \"./btw/index.ts\";\nimport deepwikiExtension from \"./deepwiki/index.ts\";\nimport llamaExtension from \"./llama/index.ts\";\nimport questionExtension from \"./question/index.ts\";\nimport routerExtension from \"./router/index.ts\";\nimport statuslineExtension from \"./statusline/index.ts\";\nimport subagentExtension from \"./subagent/index.ts\";\nimport todoExtension from \"./todo/index.ts\";\nimport webSearchExtension from \"./web-search/index.ts\";\n\nexport const builtInExtensions: InlineExtension[] = [\n\t{ name: \"llama.cpp\", factory: llamaExtension, hidden: true },\n\t{ name: \"background\", factory: backgroundExtension, hidden: true },\n\t{ name: \"btw\", factory: btwExtension, hidden: true },\n\t{ name: \"deepwiki\", factory: deepwikiExtension, hidden: true },\n\t{ name: \"question\", factory: questionExtension, hidden: true },\n\t{ name: \"router\", factory: routerExtension, hidden: true },\n\t{ name: \"statusline\", factory: statuslineExtension, hidden: true },\n\t{ name: \"subagent\", factory: subagentExtension, hidden: true },\n\t{ name: \"todo\", factory: todoExtension, hidden: true },\n\t{ name: \"web_search\", factory: webSearchExtension, hidden: true },\n];\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AACA,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AACxD,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AACxD,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,kBAAkB,MAAM,uBAAuB,CAAC;AAEvD,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IACnD,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE;IAC5D,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE;IAClE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE;IACpD,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE;IAC9D,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE;IAC9D,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE;IAC9D,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE;IAClE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE;IAC9D,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE;IACtD,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,IAAI,EAAE;CACjE,CAAC","sourcesContent":["import type { InlineExtension } from \"../core/extensions/types.ts\";\nimport backgroundExtension from \"./background/index.ts\";\nimport btwExtension from \"./btw/index.ts\";\nimport deepwikiExtension from \"./deepwiki/index.ts\";\nimport llamaExtension from \"./llama/index.ts\";\nimport providerExtension from \"./provider/index.ts\";\nimport questionExtension from \"./question/index.ts\";\nimport statuslineExtension from \"./statusline/index.ts\";\nimport subagentExtension from \"./subagent/index.ts\";\nimport todoExtension from \"./todo/index.ts\";\nimport webSearchExtension from \"./web-search/index.ts\";\n\nexport const builtInExtensions: InlineExtension[] = [\n\t{ name: \"llama.cpp\", factory: llamaExtension, hidden: true },\n\t{ name: \"background\", factory: backgroundExtension, hidden: true },\n\t{ name: \"btw\", factory: btwExtension, hidden: true },\n\t{ name: \"deepwiki\", factory: deepwikiExtension, hidden: true },\n\t{ name: \"provider\", factory: providerExtension, hidden: true },\n\t{ name: \"question\", factory: questionExtension, hidden: true },\n\t{ name: \"statusline\", factory: statuslineExtension, hidden: true },\n\t{ name: \"subagent\", factory: subagentExtension, hidden: true },\n\t{ name: \"todo\", factory: todoExtension, hidden: true },\n\t{ name: \"web_search\", factory: webSearchExtension, hidden: true },\n];\n"]}