@dsh-cc/tui 0.5.0

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 (363) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +144 -0
  3. package/lib/bash-history.d.ts +31 -0
  4. package/lib/bash-history.d.ts.map +1 -0
  5. package/lib/bash-history.js +94 -0
  6. package/lib/bash-history.js.map +1 -0
  7. package/lib/compact-fold.d.ts +35 -0
  8. package/lib/compact-fold.d.ts.map +1 -0
  9. package/lib/compact-fold.js +60 -0
  10. package/lib/compact-fold.js.map +1 -0
  11. package/lib/components/arg-completers.d.ts +22 -0
  12. package/lib/components/arg-completers.d.ts.map +1 -0
  13. package/lib/components/arg-completers.js +75 -0
  14. package/lib/components/arg-completers.js.map +1 -0
  15. package/lib/components/code-theme.d.ts +25 -0
  16. package/lib/components/code-theme.d.ts.map +1 -0
  17. package/lib/components/code-theme.js +137 -0
  18. package/lib/components/code-theme.js.map +1 -0
  19. package/lib/components/completion.d.ts +50 -0
  20. package/lib/components/completion.d.ts.map +1 -0
  21. package/lib/components/completion.js +279 -0
  22. package/lib/components/completion.js.map +1 -0
  23. package/lib/components/diff-card.d.ts +29 -0
  24. package/lib/components/diff-card.d.ts.map +1 -0
  25. package/lib/components/diff-card.js +175 -0
  26. package/lib/components/diff-card.js.map +1 -0
  27. package/lib/components/diff-hunks.d.ts +44 -0
  28. package/lib/components/diff-hunks.d.ts.map +1 -0
  29. package/lib/components/diff-hunks.js +188 -0
  30. package/lib/components/diff-hunks.js.map +1 -0
  31. package/lib/components/editor-history.d.ts +23 -0
  32. package/lib/components/editor-history.d.ts.map +1 -0
  33. package/lib/components/editor-history.js +29 -0
  34. package/lib/components/editor-history.js.map +1 -0
  35. package/lib/components/markdown-theme.d.ts +11 -0
  36. package/lib/components/markdown-theme.d.ts.map +1 -0
  37. package/lib/components/markdown-theme.js +29 -0
  38. package/lib/components/markdown-theme.js.map +1 -0
  39. package/lib/components/masked-input.d.ts +24 -0
  40. package/lib/components/masked-input.d.ts.map +1 -0
  41. package/lib/components/masked-input.js +168 -0
  42. package/lib/components/masked-input.js.map +1 -0
  43. package/lib/components/overlay-host.d.ts +31 -0
  44. package/lib/components/overlay-host.d.ts.map +1 -0
  45. package/lib/components/overlay-host.js +128 -0
  46. package/lib/components/overlay-host.js.map +1 -0
  47. package/lib/components/overlays.d.ts +94 -0
  48. package/lib/components/overlays.d.ts.map +1 -0
  49. package/lib/components/overlays.js +450 -0
  50. package/lib/components/overlays.js.map +1 -0
  51. package/lib/components/provider-box.d.ts +23 -0
  52. package/lib/components/provider-box.d.ts.map +1 -0
  53. package/lib/components/provider-box.js +164 -0
  54. package/lib/components/provider-box.js.map +1 -0
  55. package/lib/components/read-group.d.ts +51 -0
  56. package/lib/components/read-group.d.ts.map +1 -0
  57. package/lib/components/read-group.js +105 -0
  58. package/lib/components/read-group.js.map +1 -0
  59. package/lib/components/root-bash.d.ts +36 -0
  60. package/lib/components/root-bash.d.ts.map +1 -0
  61. package/lib/components/root-bash.js +112 -0
  62. package/lib/components/root-bash.js.map +1 -0
  63. package/lib/components/root-types.d.ts +42 -0
  64. package/lib/components/root-types.d.ts.map +1 -0
  65. package/lib/components/root-types.js +8 -0
  66. package/lib/components/root-types.js.map +1 -0
  67. package/lib/components/root-utils.d.ts +22 -0
  68. package/lib/components/root-utils.d.ts.map +1 -0
  69. package/lib/components/root-utils.js +45 -0
  70. package/lib/components/root-utils.js.map +1 -0
  71. package/lib/components/root.d.ts +25 -0
  72. package/lib/components/root.d.ts.map +1 -0
  73. package/lib/components/root.js +357 -0
  74. package/lib/components/root.js.map +1 -0
  75. package/lib/components/theme.d.ts +61 -0
  76. package/lib/components/theme.d.ts.map +1 -0
  77. package/lib/components/theme.js +99 -0
  78. package/lib/components/theme.js.map +1 -0
  79. package/lib/components/transcript.d.ts +43 -0
  80. package/lib/components/transcript.d.ts.map +1 -0
  81. package/lib/components/transcript.js +203 -0
  82. package/lib/components/transcript.js.map +1 -0
  83. package/lib/components/working-line.d.ts +35 -0
  84. package/lib/components/working-line.d.ts.map +1 -0
  85. package/lib/components/working-line.js +66 -0
  86. package/lib/components/working-line.js.map +1 -0
  87. package/lib/effort-catalog.d.ts +27 -0
  88. package/lib/effort-catalog.d.ts.map +1 -0
  89. package/lib/effort-catalog.js +36 -0
  90. package/lib/effort-catalog.js.map +1 -0
  91. package/lib/export-markdown.d.ts +18 -0
  92. package/lib/export-markdown.d.ts.map +1 -0
  93. package/lib/export-markdown.js +124 -0
  94. package/lib/export-markdown.js.map +1 -0
  95. package/lib/harness/approval-preview.d.ts +33 -0
  96. package/lib/harness/approval-preview.d.ts.map +1 -0
  97. package/lib/harness/approval-preview.js +179 -0
  98. package/lib/harness/approval-preview.js.map +1 -0
  99. package/lib/harness/boot-banner.d.ts +14 -0
  100. package/lib/harness/boot-banner.d.ts.map +1 -0
  101. package/lib/harness/boot-banner.js +89 -0
  102. package/lib/harness/boot-banner.js.map +1 -0
  103. package/lib/harness/driver-agent.d.ts +78 -0
  104. package/lib/harness/driver-agent.d.ts.map +1 -0
  105. package/lib/harness/driver-agent.js +314 -0
  106. package/lib/harness/driver-agent.js.map +1 -0
  107. package/lib/harness/driver-agents.d.ts +20 -0
  108. package/lib/harness/driver-agents.d.ts.map +1 -0
  109. package/lib/harness/driver-agents.js +123 -0
  110. package/lib/harness/driver-agents.js.map +1 -0
  111. package/lib/harness/driver-approvals.d.ts +38 -0
  112. package/lib/harness/driver-approvals.d.ts.map +1 -0
  113. package/lib/harness/driver-approvals.js +277 -0
  114. package/lib/harness/driver-approvals.js.map +1 -0
  115. package/lib/harness/driver-bash.d.ts +15 -0
  116. package/lib/harness/driver-bash.d.ts.map +1 -0
  117. package/lib/harness/driver-bash.js +73 -0
  118. package/lib/harness/driver-bash.js.map +1 -0
  119. package/lib/harness/driver-catalog.d.ts +84 -0
  120. package/lib/harness/driver-catalog.d.ts.map +1 -0
  121. package/lib/harness/driver-catalog.js +256 -0
  122. package/lib/harness/driver-catalog.js.map +1 -0
  123. package/lib/harness/driver-ctx.d.ts +462 -0
  124. package/lib/harness/driver-ctx.d.ts.map +1 -0
  125. package/lib/harness/driver-ctx.js +11 -0
  126. package/lib/harness/driver-ctx.js.map +1 -0
  127. package/lib/harness/driver-hud.d.ts +31 -0
  128. package/lib/harness/driver-hud.d.ts.map +1 -0
  129. package/lib/harness/driver-hud.js +204 -0
  130. package/lib/harness/driver-hud.js.map +1 -0
  131. package/lib/harness/driver-live.d.ts +36 -0
  132. package/lib/harness/driver-live.d.ts.map +1 -0
  133. package/lib/harness/driver-live.js +44 -0
  134. package/lib/harness/driver-live.js.map +1 -0
  135. package/lib/harness/driver-modal.d.ts +52 -0
  136. package/lib/harness/driver-modal.d.ts.map +1 -0
  137. package/lib/harness/driver-modal.js +78 -0
  138. package/lib/harness/driver-modal.js.map +1 -0
  139. package/lib/harness/driver-mode.d.ts +35 -0
  140. package/lib/harness/driver-mode.d.ts.map +1 -0
  141. package/lib/harness/driver-mode.js +84 -0
  142. package/lib/harness/driver-mode.js.map +1 -0
  143. package/lib/harness/driver-pickers.d.ts +48 -0
  144. package/lib/harness/driver-pickers.d.ts.map +1 -0
  145. package/lib/harness/driver-pickers.js +249 -0
  146. package/lib/harness/driver-pickers.js.map +1 -0
  147. package/lib/harness/driver-promote.d.ts +29 -0
  148. package/lib/harness/driver-promote.d.ts.map +1 -0
  149. package/lib/harness/driver-promote.js +36 -0
  150. package/lib/harness/driver-promote.js.map +1 -0
  151. package/lib/harness/driver-queue.d.ts +19 -0
  152. package/lib/harness/driver-queue.d.ts.map +1 -0
  153. package/lib/harness/driver-queue.js +281 -0
  154. package/lib/harness/driver-queue.js.map +1 -0
  155. package/lib/harness/driver-run-local.d.ts +32 -0
  156. package/lib/harness/driver-run-local.d.ts.map +1 -0
  157. package/lib/harness/driver-run-local.js +366 -0
  158. package/lib/harness/driver-run-local.js.map +1 -0
  159. package/lib/harness/driver-sessions.d.ts +28 -0
  160. package/lib/harness/driver-sessions.d.ts.map +1 -0
  161. package/lib/harness/driver-sessions.js +386 -0
  162. package/lib/harness/driver-sessions.js.map +1 -0
  163. package/lib/harness/driver.d.ts +22 -0
  164. package/lib/harness/driver.d.ts.map +1 -0
  165. package/lib/harness/driver.js +459 -0
  166. package/lib/harness/driver.js.map +1 -0
  167. package/lib/harness/preset.d.ts +32 -0
  168. package/lib/harness/preset.d.ts.map +1 -0
  169. package/lib/harness/preset.js +34 -0
  170. package/lib/harness/preset.js.map +1 -0
  171. package/lib/harness/session-list.d.ts +65 -0
  172. package/lib/harness/session-list.d.ts.map +1 -0
  173. package/lib/harness/session-list.js +91 -0
  174. package/lib/harness/session-list.js.map +1 -0
  175. package/lib/harness/shell-output.d.ts +44 -0
  176. package/lib/harness/shell-output.d.ts.map +1 -0
  177. package/lib/harness/shell-output.js +90 -0
  178. package/lib/harness/shell-output.js.map +1 -0
  179. package/lib/harness/statusline-cc-transcript.d.ts +51 -0
  180. package/lib/harness/statusline-cc-transcript.d.ts.map +1 -0
  181. package/lib/harness/statusline-cc-transcript.js +191 -0
  182. package/lib/harness/statusline-cc-transcript.js.map +1 -0
  183. package/lib/harness/statusline-command.d.ts +54 -0
  184. package/lib/harness/statusline-command.d.ts.map +1 -0
  185. package/lib/harness/statusline-command.js +161 -0
  186. package/lib/harness/statusline-command.js.map +1 -0
  187. package/lib/harness/statusline-payload.d.ts +79 -0
  188. package/lib/harness/statusline-payload.d.ts.map +1 -0
  189. package/lib/harness/statusline-payload.js +93 -0
  190. package/lib/harness/statusline-payload.js.map +1 -0
  191. package/lib/harness/statusline-settings.d.ts +47 -0
  192. package/lib/harness/statusline-settings.d.ts.map +1 -0
  193. package/lib/harness/statusline-settings.js +57 -0
  194. package/lib/harness/statusline-settings.js.map +1 -0
  195. package/lib/harness/statusline-wiring.d.ts +45 -0
  196. package/lib/harness/statusline-wiring.d.ts.map +1 -0
  197. package/lib/harness/statusline-wiring.js +247 -0
  198. package/lib/harness/statusline-wiring.js.map +1 -0
  199. package/lib/harness/usage-view.d.ts +84 -0
  200. package/lib/harness/usage-view.d.ts.map +1 -0
  201. package/lib/harness/usage-view.js +199 -0
  202. package/lib/harness/usage-view.js.map +1 -0
  203. package/lib/harness/worktree-exit.d.ts +105 -0
  204. package/lib/harness/worktree-exit.d.ts.map +1 -0
  205. package/lib/harness/worktree-exit.js +168 -0
  206. package/lib/harness/worktree-exit.js.map +1 -0
  207. package/lib/history.d.ts +50 -0
  208. package/lib/history.d.ts.map +1 -0
  209. package/lib/history.js +139 -0
  210. package/lib/history.js.map +1 -0
  211. package/lib/index.d.ts +63 -0
  212. package/lib/index.d.ts.map +1 -0
  213. package/lib/index.js +54 -0
  214. package/lib/index.js.map +1 -0
  215. package/lib/input.d.ts +158 -0
  216. package/lib/input.d.ts.map +1 -0
  217. package/lib/input.js +400 -0
  218. package/lib/input.js.map +1 -0
  219. package/lib/invariant.d.ts +14 -0
  220. package/lib/invariant.d.ts.map +1 -0
  221. package/lib/invariant.js +20 -0
  222. package/lib/invariant.js.map +1 -0
  223. package/lib/mode-cycle.d.ts +22 -0
  224. package/lib/mode-cycle.d.ts.map +1 -0
  225. package/lib/mode-cycle.js +32 -0
  226. package/lib/mode-cycle.js.map +1 -0
  227. package/lib/model-catalog.d.ts +22 -0
  228. package/lib/model-catalog.d.ts.map +1 -0
  229. package/lib/model-catalog.js +45 -0
  230. package/lib/model-catalog.js.map +1 -0
  231. package/lib/packaged-preset.d.ts +32 -0
  232. package/lib/packaged-preset.d.ts.map +1 -0
  233. package/lib/packaged-preset.js +94 -0
  234. package/lib/packaged-preset.js.map +1 -0
  235. package/lib/plugin.d.ts +11 -0
  236. package/lib/plugin.d.ts.map +1 -0
  237. package/lib/plugin.js +88 -0
  238. package/lib/plugin.js.map +1 -0
  239. package/lib/profile.d.ts +4 -0
  240. package/lib/profile.d.ts.map +1 -0
  241. package/lib/profile.js +7 -0
  242. package/lib/profile.js.map +1 -0
  243. package/lib/project-sessions.d.ts +29 -0
  244. package/lib/project-sessions.d.ts.map +1 -0
  245. package/lib/project-sessions.js +60 -0
  246. package/lib/project-sessions.js.map +1 -0
  247. package/lib/project.d.ts +75 -0
  248. package/lib/project.d.ts.map +1 -0
  249. package/lib/project.js +196 -0
  250. package/lib/project.js.map +1 -0
  251. package/lib/provider-actions.d.ts +37 -0
  252. package/lib/provider-actions.d.ts.map +1 -0
  253. package/lib/provider-actions.js +417 -0
  254. package/lib/provider-actions.js.map +1 -0
  255. package/lib/provider-command.d.ts +109 -0
  256. package/lib/provider-command.d.ts.map +1 -0
  257. package/lib/provider-command.js +220 -0
  258. package/lib/provider-command.js.map +1 -0
  259. package/lib/provider-detail.d.ts +15 -0
  260. package/lib/provider-detail.d.ts.map +1 -0
  261. package/lib/provider-detail.js +201 -0
  262. package/lib/provider-detail.js.map +1 -0
  263. package/lib/provider-flow.d.ts +191 -0
  264. package/lib/provider-flow.d.ts.map +1 -0
  265. package/lib/provider-flow.js +192 -0
  266. package/lib/provider-flow.js.map +1 -0
  267. package/lib/provider-presets.d.ts +32 -0
  268. package/lib/provider-presets.d.ts.map +1 -0
  269. package/lib/provider-presets.js +105 -0
  270. package/lib/provider-presets.js.map +1 -0
  271. package/lib/provider-read.d.ts +63 -0
  272. package/lib/provider-read.d.ts.map +1 -0
  273. package/lib/provider-read.js +115 -0
  274. package/lib/provider-read.js.map +1 -0
  275. package/lib/provider-settings.d.ts +30 -0
  276. package/lib/provider-settings.d.ts.map +1 -0
  277. package/lib/provider-settings.js +65 -0
  278. package/lib/provider-settings.js.map +1 -0
  279. package/lib/resume-target.d.ts +59 -0
  280. package/lib/resume-target.d.ts.map +1 -0
  281. package/lib/resume-target.js +143 -0
  282. package/lib/resume-target.js.map +1 -0
  283. package/lib/slash.d.ts +44 -0
  284. package/lib/slash.d.ts.map +1 -0
  285. package/lib/slash.js +81 -0
  286. package/lib/slash.js.map +1 -0
  287. package/lib/state/driver-types.d.ts +505 -0
  288. package/lib/state/driver-types.d.ts.map +1 -0
  289. package/lib/state/driver-types.js +8 -0
  290. package/lib/state/driver-types.js.map +1 -0
  291. package/lib/state/driver-usage-types.d.ts +59 -0
  292. package/lib/state/driver-usage-types.d.ts.map +1 -0
  293. package/lib/state/driver-usage-types.js +8 -0
  294. package/lib/state/driver-usage-types.js.map +1 -0
  295. package/lib/statusline.d.ts +63 -0
  296. package/lib/statusline.d.ts.map +1 -0
  297. package/lib/statusline.js +97 -0
  298. package/lib/statusline.js.map +1 -0
  299. package/lib/store/pickers.d.ts +34 -0
  300. package/lib/store/pickers.d.ts.map +1 -0
  301. package/lib/store/pickers.js +111 -0
  302. package/lib/store/pickers.js.map +1 -0
  303. package/lib/store/provider-panel.d.ts +107 -0
  304. package/lib/store/provider-panel.d.ts.map +1 -0
  305. package/lib/store/provider-panel.js +151 -0
  306. package/lib/store/provider-panel.js.map +1 -0
  307. package/lib/store/question.d.ts +21 -0
  308. package/lib/store/question.d.ts.map +1 -0
  309. package/lib/store/question.js +59 -0
  310. package/lib/store/question.js.map +1 -0
  311. package/lib/store/queue.d.ts +27 -0
  312. package/lib/store/queue.d.ts.map +1 -0
  313. package/lib/store/queue.js +34 -0
  314. package/lib/store/queue.js.map +1 -0
  315. package/lib/store/session.d.ts +73 -0
  316. package/lib/store/session.d.ts.map +1 -0
  317. package/lib/store/session.js +172 -0
  318. package/lib/store/session.js.map +1 -0
  319. package/lib/store/subagents.d.ts +16 -0
  320. package/lib/store/subagents.d.ts.map +1 -0
  321. package/lib/store/subagents.js +44 -0
  322. package/lib/store/subagents.js.map +1 -0
  323. package/lib/store/todos.d.ts +35 -0
  324. package/lib/store/todos.d.ts.map +1 -0
  325. package/lib/store/todos.js +68 -0
  326. package/lib/store/todos.js.map +1 -0
  327. package/lib/store/usage.d.ts +15 -0
  328. package/lib/store/usage.d.ts.map +1 -0
  329. package/lib/store/usage.js +27 -0
  330. package/lib/store/usage.js.map +1 -0
  331. package/lib/store/views.d.ts +419 -0
  332. package/lib/store/views.d.ts.map +1 -0
  333. package/lib/store/views.js +3 -0
  334. package/lib/store/views.js.map +1 -0
  335. package/lib/store.d.ts +19 -0
  336. package/lib/store.d.ts.map +1 -0
  337. package/lib/store.js +10 -0
  338. package/lib/store.js.map +1 -0
  339. package/lib/terminal/lease.d.ts +33 -0
  340. package/lib/terminal/lease.d.ts.map +1 -0
  341. package/lib/terminal/lease.js +99 -0
  342. package/lib/terminal/lease.js.map +1 -0
  343. package/lib/tool-card.d.ts +75 -0
  344. package/lib/tool-card.d.ts.map +1 -0
  345. package/lib/tool-card.js +109 -0
  346. package/lib/tool-card.js.map +1 -0
  347. package/lib/tool-verbs.d.ts +12 -0
  348. package/lib/tool-verbs.d.ts.map +1 -0
  349. package/lib/tool-verbs.js +29 -0
  350. package/lib/tool-verbs.js.map +1 -0
  351. package/lib/transcript.d.ts +40 -0
  352. package/lib/transcript.d.ts.map +1 -0
  353. package/lib/transcript.js +413 -0
  354. package/lib/transcript.js.map +1 -0
  355. package/lib/working-line.d.ts +44 -0
  356. package/lib/working-line.d.ts.map +1 -0
  357. package/lib/working-line.js +56 -0
  358. package/lib/working-line.js.map +1 -0
  359. package/package.json +72 -0
  360. package/presets/cc/.dsh-cc-managed.json +5 -0
  361. package/presets/cc/agent.cordis.yml +524 -0
  362. package/presets/cc/preset.yml +3 -0
  363. package/scripts/stage-preset.mjs +26 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-utils.js","sourceRoot":"","sources":["../../src/components/root-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,4EAA4E;AAC5E,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAA;AAE1C,gFAAgF;AAChF,MAAM,eAAe,GAAG,EAAE,CAAA;AAE1B,MAAM,UAAU,cAAc,CAAC,OAAe;IAC7C,OAAO,OAAO,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAA;AAChG,CAAC;AAED,4DAA4D;AAC5D,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAE5B,2EAA2E;AAC3E,2EAA2E;AAC3E,2EAA2E;AAC3E,4CAA4C;AAC5C,MAAM,0BAA0B,GAAG,2BAA2B,CAAA;AAE9D;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACpE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAA;IACzC,OAAO,OAAO,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;AACxF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QACzC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACjF,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACzG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAC3B,KAAK,CAAC,KAAK,EAAE,CAAA;AACd,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Root pi-tui mount: regular mode inlines on the main screen; fullscreen mode
3
+ * takes over the alternate screen with a docked layout.
4
+ * @module @dsh-cc/tui/components/root
5
+ */
6
+ import type { Driver } from '../state/driver-types.ts';
7
+ import type { BuildRootOptions, RootHandle } from './root-types.ts';
8
+ export type { BuildRootOptions, RootHandle };
9
+ /**
10
+ * Build the pi-tui render tree.
11
+ *
12
+ * Children order: title · transcript · queue chips · todo strip · notice ·
13
+ * [approval] · [question] · working line · editor · statusline. The transcript and overlays
14
+ * rebuild on every driver emit; the editor is persistent so it retains focus
15
+ * and cursor state across renders.
16
+ *
17
+ * In regular mode the children render inline into the main screen. In
18
+ * fullscreen mode the TUI enters the alternate screen: the title and transcript
19
+ * scroll inside a primary ScrollView while the remaining chrome docks at the
20
+ * bottom (the dock keeps its intrinsic height and yields rows first under
21
+ * pressure, with the editor never squeezed below 1 row and the statusline
22
+ * never below 1).
23
+ */
24
+ export declare function buildRoot(driver: Driver, opts?: BuildRootOptions): RootHandle;
25
+ //# sourceMappingURL=root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/components/root.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAatD,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEnE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAA;AAE5C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,UAAU,CA8VjF"}
@@ -0,0 +1,357 @@
1
+ /**
2
+ * Root pi-tui mount: regular mode inlines on the main screen; fullscreen mode
3
+ * takes over the alternate screen with a docked layout.
4
+ * @module @dsh-cc/tui/components/root
5
+ */
6
+ import { Container, Editor, Key, matchesKey, ProcessTerminal, ScrollView, Text, TuiAltScreen, TuiMainScreen, VStack, getKeybindings, isKeyRelease, } from '@dsh-cc/pi-tui';
7
+ import { overlayOpen, renderOverlayChildren, routeOverlayInput } from "./overlay-host.js";
8
+ import { todoSummary } from "../store.js";
9
+ import { formatWorkingLine } from "../working-line.js";
10
+ import { buildArgCompleters } from "./arg-completers.js";
11
+ import { attachBashMode } from "./root-bash.js";
12
+ import { resetEditorHistory } from "./editor-history.js";
13
+ import { TuiAutocompleteProvider } from "./completion.js";
14
+ import { DOUBLE_PRESS_WINDOW_MS, openSystemUrl, sanitizeWindowTitle, truncateActive } from "./root-utils.js";
15
+ import { createEditorTheme, createTheme } from "./theme.js";
16
+ import { TranscriptView } from "./transcript.js";
17
+ import { WorkingLine } from "./working-line.js";
18
+ /**
19
+ * Build the pi-tui render tree.
20
+ *
21
+ * Children order: title · transcript · queue chips · todo strip · notice ·
22
+ * [approval] · [question] · working line · editor · statusline. The transcript and overlays
23
+ * rebuild on every driver emit; the editor is persistent so it retains focus
24
+ * and cursor state across renders.
25
+ *
26
+ * In regular mode the children render inline into the main screen. In
27
+ * fullscreen mode the TUI enters the alternate screen: the title and transcript
28
+ * scroll inside a primary ScrollView while the remaining chrome docks at the
29
+ * bottom (the dock keeps its intrinsic height and yields rows first under
30
+ * pressure, with the editor never squeezed below 1 row and the statusline
31
+ * never below 1).
32
+ */
33
+ export function buildRoot(driver, opts = {}) {
34
+ const terminal = opts.terminal ?? new ProcessTerminal();
35
+ const mode = opts.uiMode ?? 'regular';
36
+ const theme = createTheme(opts.theme);
37
+ const tui = mode === 'fullscreen'
38
+ ? new TuiAltScreen(terminal, undefined, undefined, {
39
+ mouse: opts.mouse ?? true,
40
+ openUrl: openSystemUrl,
41
+ })
42
+ : new TuiMainScreen(terminal);
43
+ const title = new Text(theme.bold('dsh cc-mode'), 0, 0);
44
+ const transcript = new TranscriptView(theme);
45
+ // Pending-steer chip line. Collapses to zero lines when the queue is empty
46
+ // (Text.render returns [] for blank content), so it takes no vertical space.
47
+ const queueLine = new Text('', 0, 0);
48
+ // Session todo strip (`☐ done/total · active task`), same persistent-Text
49
+ // pattern: blank content collapses it to zero lines when no todos exist.
50
+ const todoLine = new Text('', 0, 0);
51
+ // Transient notice line (e.g. the "Press Ctrl+C again to exit" hint), same
52
+ // persistent-Text pattern: blank content collapses it to zero lines when no
53
+ // notice is parked.
54
+ const noticeLine = new Text('', 0, 0);
55
+ // Live working line (claude-code style spinner row). Visibility is driven
56
+ // purely by the `state.turn` anchor (the subscribe below starts/stops it
57
+ // on undefined→set jumps); the message re-evaluates on every spinner tick,
58
+ // so elapsed time and token deltas keep moving with no driver events.
59
+ // stop() blanks it, and an empty Text collapses to zero lines.
60
+ const workingLine = new WorkingLine(theme.accent, theme.muted, () => {
61
+ const s = driver.state;
62
+ return s.turn === undefined ? '' : formatWorkingLine(s.turn, s.hud?.tokens?.output ?? 0, Date.now());
63
+ }, () => tui.requestRender());
64
+ // Dynamic overlay slot (approval/question boxes). Cleared and rebuilt on
65
+ // every state change so they appear and disappear with the driver state.
66
+ const overlays = new Container();
67
+ const editor = new Editor(tui, createEditorTheme(theme));
68
+ // Seed the editor's ↑/↓ recall from persisted history (oldest first —
69
+ // addToHistory unshifts, so the last-seeded/newest becomes index 0 and is
70
+ // recalled on the first ↑ press). The reference is tracked so a /resume
71
+ // history rebind (new array identity) reseeds the stack in the subscribe
72
+ // callback below.
73
+ let seededHistory = driver.promptHistory;
74
+ resetEditorHistory(editor, seededHistory);
75
+ const bashMode = attachBashMode({ editor, driver, tui, theme });
76
+ const { bashRunning, inShellMode, browseBashHistory, resetBashHistoryBrowsing } = bashMode;
77
+ // Slash-command + @-file autocomplete. The provider is rebuilt only when the
78
+ // driver's command catalog changes identity (driver.listCommands() returns a
79
+ // stable reference until commands/change fires) — cheap reference compare on
80
+ // every state emit, rebuild only when the catalog actually moved.
81
+ // Argument completers (`/model`, `/effort`, `/permissions`, `/resume`) are driver-backed and fetch per
82
+ // request, so a single map built once at mount never goes stale.
83
+ const argCompleters = buildArgCompleters(driver);
84
+ let lastCatalog = driver.listCommands();
85
+ let autocompleteProvider = new TuiAutocompleteProvider(lastCatalog, driver.cwd, undefined, argCompleters);
86
+ editor.setAutocompleteProvider(autocompleteProvider);
87
+ // D5: the statusline string is width-dependent — rebuild it from
88
+ // driver.statusLineIn on every render, so a resize applies immediately.
89
+ const statusline = new class extends Text {
90
+ render(width) {
91
+ this.setText(driver.statusLineIn(terminal.columns));
92
+ return super.render(width);
93
+ }
94
+ }(driver.statusLineIn(terminal.columns), 0, 0);
95
+ // Ordered chrome shared by the inline mount and the fullscreen exit replay.
96
+ const chrome = [title, transcript, queueLine, todoLine, noticeLine, overlays, workingLine, editor, statusline];
97
+ if (tui instanceof TuiAltScreen) {
98
+ // Fullscreen (alternate screen): transcript scrolls inside the primary
99
+ // ScrollView; the rest of the chrome docks at the bottom.
100
+ const body = new VStack();
101
+ body.addChild(title);
102
+ body.addChild(transcript);
103
+ const scrollView = new ScrollView(body, {
104
+ follow: 'end',
105
+ primary: true,
106
+ overscroll: 'chain',
107
+ scrollbar: 'auto',
108
+ });
109
+ const dock = new VStack();
110
+ dock.addChild(queueLine, { shrink: 1, minSize: 0 });
111
+ dock.addChild(todoLine, { shrink: 1, minSize: 0 });
112
+ dock.addChild(noticeLine, { shrink: 1, minSize: 0 });
113
+ dock.addChild(overlays, { shrink: 1, minSize: 0 });
114
+ dock.addChild(workingLine, { shrink: 1, minSize: 0 });
115
+ dock.addChild(editor, { shrink: 1, minSize: 1 });
116
+ dock.addChild(statusline, { shrink: 1, minSize: 1 });
117
+ const layoutRoot = new VStack();
118
+ layoutRoot.addChild(scrollView, { basis: 0, grow: 1, shrink: 1, minSize: 1 });
119
+ layoutRoot.addChild(dock, { basis: 'auto', grow: 0, shrink: 1, minSize: 1 });
120
+ tui.setLayoutRoot(layoutRoot);
121
+ }
122
+ else {
123
+ for (const child of chrome)
124
+ tui.addChild(child);
125
+ }
126
+ // Free ctrl+c from the editor's copy keybinding so the global listener
127
+ // owns the quit path.
128
+ getKeybindings().setUserBindings({ 'tui.input.copy': [] });
129
+ // Global key handler — runs BEFORE editor dispatch. Printable text belongs to
130
+ // the editor; this listener owns only overlays and global chords. Anything it
131
+ // does not consume falls through to the focused editor.
132
+ const removeInputListener = tui.addInputListener((data) => {
133
+ // Kitty protocol flag 2 (report event types) delivers a release event
134
+ // after every physical press. pi-tui filters releases only on the
135
+ // focused-component path — this listener chain gets them raw, so drop
136
+ // them here before any routing. Otherwise one keypress double-fires
137
+ // overlay navigation (the /model picker moved two rows per press).
138
+ // Repeats are kept: holding a key must still autoscroll.
139
+ if (isKeyRelease(data))
140
+ return { consume: true };
141
+ const live = driver.state;
142
+ // Ctrl+C arrives as a raw \x03 byte in raw mode (never a SIGINT). Treat it
143
+ // as an escape hatch: interrupt when busy; quit when idle — but only on a
144
+ // double press, so a stray Ctrl+C never kills the session. When an overlay
145
+ // is open and the agent is idle, fall through so the overlay's own key
146
+ // handling (esc to dismiss, etc.) owns it.
147
+ if (data === '\x03') {
148
+ if (live.busy) {
149
+ driver.interrupt();
150
+ return { consume: true };
151
+ }
152
+ if (overlayOpen(live)) {
153
+ return undefined;
154
+ }
155
+ const now = Date.now();
156
+ const lastAttempt = live.lastExitAttemptAt;
157
+ if (lastAttempt !== undefined && now - lastAttempt <= DOUBLE_PRESS_WINDOW_MS) {
158
+ opts.onQuit?.();
159
+ return { consume: true };
160
+ }
161
+ // First press: anchor the window and hint. The window expires
162
+ // naturally — no per-keystroke timer resets.
163
+ driver.markExitAttempt(now);
164
+ driver.showNotice('Press Ctrl+C again to exit');
165
+ return { consume: true };
166
+ }
167
+ // Any parked overlay (approval, question, pickers, panels) owns the key:
168
+ // routed through the shared overlay host and consumed so the editor
169
+ // never sees typing, arrows, or enter while a modal is open.
170
+ if (routeOverlayInput(driver, live, data))
171
+ return { consume: true };
172
+ if (matchesKey(data, 'shift+tab')) {
173
+ driver.cyclePermissionMode();
174
+ return { consume: true };
175
+ }
176
+ if (matchesKey(data, Key.ctrl('o'))) {
177
+ driver.toggleGlobalCollapse();
178
+ return { consume: true };
179
+ }
180
+ if (matchesKey(data, Key.ctrl('t'))) {
181
+ driver.toggleTodoPanel();
182
+ return { consume: true };
183
+ }
184
+ if (matchesKey(data, Key.ctrl('s'))) {
185
+ // Queue-jump: inject the outbox into the running turn now.
186
+ driver.steerQueued();
187
+ return { consume: true };
188
+ }
189
+ if (bashRunning()) {
190
+ // A local `!` command is in flight: the composer is disabled and
191
+ // every key is swallowed until it settles. Ctrl+C above still owns
192
+ // interrupt/quit; the stall is bounded by the command's timeout.
193
+ return { consume: true };
194
+ }
195
+ if (inShellMode() && (matchesKey(data, Key.up) || matchesKey(data, Key.down))) {
196
+ // Bash history browsing: the root-owned stack from driver.bashHistory,
197
+ // consumed here so the editor's built-in prompt navigation never
198
+ // interleaves with it (the editor never sees these arrows).
199
+ browseBashHistory(matchesKey(data, Key.up));
200
+ return { consume: true };
201
+ }
202
+ if (matchesKey(data, Key.up) && editor.getText().length === 0 && live.queued.length > 0) {
203
+ // Empty composer + ↑ recalls the most recent queued entry for editing.
204
+ // A non-empty composer (or empty queue) falls through so the editor's
205
+ // own history navigation keeps working.
206
+ const recalled = driver.recallQueued();
207
+ if (recalled !== undefined) {
208
+ editor.setText(recalled);
209
+ return { consume: true };
210
+ }
211
+ }
212
+ if (matchesKey(data, Key.ctrl('b'))) {
213
+ // Ctrl+B promotion of a foreground subagent wait (plan §3.4). While
214
+ // busy, promote EVERY armed foreground collect of this session
215
+ // (via the driver → root-realm `ccCollectorRegistry`) and echo one
216
+ // status line; busy with nothing promotable (no armed collect,
217
+ // env kill switch, or driver without the seam) is a consumed
218
+ // no-op — Ctrl+B here is NEVER treated as Esc. Idle falls through
219
+ // to the editor's `tui.editor.cursorLeft` binding, unchanged.
220
+ // tmux: Ctrl+B is the default prefix — double-press passes a
221
+ // literal Ctrl+B through (`send-prefix`); the Ctrl+X Ctrl+B chord
222
+ // is P1 (not implemented).
223
+ if (!live.busy)
224
+ return undefined;
225
+ const promoted = driver.promoteForegroundCollects?.() ?? 0;
226
+ if (promoted > 0) {
227
+ driver.showNotice(`Moved ${promoted} subagent(s) to background — /agents to inspect`);
228
+ }
229
+ return { consume: true };
230
+ }
231
+ if (matchesKey(data, Key.escape)) {
232
+ if (inShellMode()) {
233
+ // Bash mode owns Esc FIRST — this branch must stay above the
234
+ // busy-interrupt path: in shell mode Esc leaves the mode (the
235
+ // buffer clears via onChange, which also restores the border)
236
+ // and never interrupts the agent, even while busy.
237
+ editor.setText('');
238
+ resetBashHistoryBrowsing();
239
+ return { consume: true };
240
+ }
241
+ if (live.busy) {
242
+ driver.interrupt();
243
+ return { consume: true };
244
+ }
245
+ return undefined;
246
+ }
247
+ return undefined;
248
+ });
249
+ // Rebuild transcript + overlays + statusline on every driver emit.
250
+ // `undefined` until the subscribe's immediate first callback seeds the
251
+ // turn-anchor tracker — that first call acts, so a boot into an
252
+ // already-running session (turn set before mount) starts the line.
253
+ let workingLineLive;
254
+ // Window-title tracker for the session/title effect below: the subscribe
255
+ // fires on every state emit, so only real transitions reach the terminal.
256
+ let lastWindowTitle;
257
+ const unsubscribe = driver.subscribe((state) => {
258
+ // Terminal window title mirrors the framework's session/title fold
259
+ // (fallback 'dsh-cc' before the first title lands or after switching
260
+ // to an untitled session). One expression covers boot, resume-boot
261
+ // (history folds before this subscription exists, so the first call
262
+ // already carries the resumed title), live updates, and switches.
263
+ // Gated on a real TTY: piped/headless runs must not leak OSC bytes.
264
+ const windowTitle = sanitizeWindowTitle(state.title ?? 'dsh-cc');
265
+ if (process.stdout.isTTY && windowTitle !== lastWindowTitle) {
266
+ lastWindowTitle = windowTitle;
267
+ terminal.setTitle(windowTitle);
268
+ }
269
+ // /resume rebinds prompt history onto the switched session's project
270
+ // (a new array identity); reseed the editor's recall stack when it
271
+ // moves. Submits also replace the array — the reseed is then
272
+ // content-equivalent and only resets the (already exited) browsing
273
+ // state.
274
+ const liveHistory = driver.promptHistory;
275
+ if (liveHistory !== seededHistory) {
276
+ seededHistory = liveHistory;
277
+ resetEditorHistory(editor, liveHistory);
278
+ }
279
+ transcript.setRows(state.rows, {
280
+ thinkingExpanded: state.thinkingExpanded,
281
+ toolOutputExpanded: state.toolOutputExpanded,
282
+ compactExpanded: state.compactExpanded,
283
+ });
284
+ queueLine.setText(state.queued.length === 0
285
+ ? ''
286
+ : state.queued.map(text => theme.muted(`⏵ queued: ${text}`)).join('\n'));
287
+ queueLine.invalidate();
288
+ const summary = todoSummary(state);
289
+ todoLine.setText(summary === undefined
290
+ ? ''
291
+ : theme.muted(`☐ ${summary.done}/${summary.total}${summary.active === undefined ? '' : ` · ${truncateActive(summary.active)}`}`));
292
+ todoLine.invalidate();
293
+ noticeLine.setText(state.notice === undefined ? '' : theme.muted(state.notice));
294
+ noticeLine.invalidate();
295
+ // Working line lifecycle tracks the turn anchor: start on the
296
+ // undefined→set jump, stop on the reverse. Seeded by the first
297
+ // (immediate) subscribe call — see workingLineLive above.
298
+ const turnLive = state.turn !== undefined;
299
+ if (workingLineLive !== turnLive) {
300
+ workingLineLive = turnLive;
301
+ if (turnLive)
302
+ workingLine.start();
303
+ else
304
+ workingLine.stop();
305
+ }
306
+ // Overlay boxes (approval/question/pickers/panels) rebuild from the
307
+ // state on every emit via the shared overlay host.
308
+ renderOverlayChildren(overlays, state, theme);
309
+ // Refresh the autocomplete provider when the command catalog moves
310
+ // (reference equality with the last-seen array). The driver keeps the
311
+ // cached array stable across state emits until commands/change fires, so
312
+ // this is a cheap guard that rebuilds only on an actual catalog change.
313
+ const latestCatalog = driver.listCommands();
314
+ if (latestCatalog !== lastCatalog) {
315
+ lastCatalog = latestCatalog;
316
+ autocompleteProvider = new TuiAutocompleteProvider(latestCatalog, driver.cwd, undefined, argCompleters);
317
+ editor.setAutocompleteProvider(autocompleteProvider);
318
+ }
319
+ tui.requestRender();
320
+ });
321
+ tui.setFocus(editor);
322
+ return {
323
+ get tui() {
324
+ return tui;
325
+ },
326
+ get mode() {
327
+ return mode;
328
+ },
329
+ editor,
330
+ destroy() {
331
+ // Stop the working line first: it must not tick after teardown —
332
+ // this covers the quit-mid-turn path (the stopForExit chrome replay
333
+ // would otherwise bake a live spinner frame into scrollback) and the
334
+ // no-polling suite's no-dangling-interval invariant.
335
+ workingLine.stop();
336
+ removeInputListener();
337
+ unsubscribe();
338
+ },
339
+ stopForExit() {
340
+ if (!(tui instanceof TuiAltScreen)) {
341
+ tui.stop();
342
+ return;
343
+ }
344
+ // Fullscreen exit (transcript form): leave the alternate
345
+ // screen without repainting, then replay the chrome through a one-shot
346
+ // main-screen renderer so native scrollback ends up with the same
347
+ // inline layout a regular session would have produced.
348
+ tui.stop({ preserveScreen: true });
349
+ const replay = new TuiMainScreen(terminal);
350
+ for (const child of chrome)
351
+ replay.addChild(child);
352
+ replay.renderNow();
353
+ replay.stop();
354
+ },
355
+ };
356
+ }
357
+ //# sourceMappingURL=root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.js","sourceRoot":"","sources":["../../src/components/root.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Tiny SGR (Select Graphic Rendition) helpers and the configurable theme
3
+ * palette. No chalk — just raw ANSI codes embedded in Text content, which
4
+ * pi-tui's Text component preserves through word-wrap.
5
+ *
6
+ * {@link createTheme} derives the full theme from optional per-role overrides
7
+ * ({@link ThemeOverrides}). An override value is either a basic ANSI color
8
+ * name (`'red'`, `'brightCyan'`) or a raw SGR parameter string (`'31'`,
9
+ * `'1;31'`, `'38;5;208'`); unknown names and malformed codes silently fall
10
+ * back to the built-in default. The default palette is byte-identical to the
11
+ * historical fixed palette, so an absent config changes nothing on screen.
12
+ * @module @dsh-cc/tui/components/theme
13
+ */
14
+ import type { EditorTheme } from '@dsh-cc/pi-tui';
15
+ /** Wrap text in an SGR sequence. */
16
+ export declare const sgr: (code: string) => (text: string) => string;
17
+ /** A function that wraps text in an SGR style. */
18
+ export type Styler = (text: string) => string;
19
+ /** Fixed attribute stylers — part of the theme but not user-configurable. */
20
+ export declare const bold: (text: string) => string;
21
+ export declare const italic: (text: string) => string;
22
+ export declare const underline: (text: string) => string;
23
+ export declare const strikethrough: (text: string) => string;
24
+ /**
25
+ * Per-role palette overrides. Every role is optional; `undefined` and invalid
26
+ * values keep the built-in default for that role.
27
+ */
28
+ export interface ThemeOverrides {
29
+ /** Primary interactive accent (default: cyan). */
30
+ accent?: string;
31
+ /** Success and addition color (default: green). */
32
+ success?: string;
33
+ /** Error and removal color (default: red). */
34
+ error?: string;
35
+ /** Warning and attention color (default: yellow). */
36
+ warning?: string;
37
+ /** De-emphasized text (default: the faint SGR attribute). */
38
+ muted?: string;
39
+ /** Secondary accent for special highlights (default: magenta). */
40
+ highlight?: string;
41
+ }
42
+ /** The resolved palette handed down the component tree. */
43
+ export interface Theme {
44
+ accent: Styler;
45
+ success: Styler;
46
+ error: Styler;
47
+ warning: Styler;
48
+ muted: Styler;
49
+ highlight: Styler;
50
+ bold: Styler;
51
+ italic: Styler;
52
+ underline: Styler;
53
+ strikethrough: Styler;
54
+ }
55
+ /** Build a theme from optional overrides; invalid values keep the default. */
56
+ export declare function createTheme(overrides?: ThemeOverrides): Theme;
57
+ /** The built-in default theme — byte-identical to the historical fixed palette. */
58
+ export declare const defaultTheme: Theme;
59
+ /** Derive the pi-tui editor theme from a palette: accent focus, muted rest. */
60
+ export declare function createEditorTheme(theme: Theme): EditorTheme;
61
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/components/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEjD,oCAAoC;AACpC,eAAO,MAAM,GAAG,GACb,MAAM,MAAM,MACZ,MAAM,MAAM,KAAG,MACe,CAAA;AAEjC,kDAAkD;AAClD,MAAM,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;AAE7C,6EAA6E;AAC7E,eAAO,MAAM,IAAI,SAPR,MAAM,KAAG,MAOU,CAAA;AAC5B,eAAO,MAAM,MAAM,SARV,MAAM,KAAG,MAQY,CAAA;AAC9B,eAAO,MAAM,SAAS,SATb,MAAM,KAAG,MASe,CAAA;AACjC,eAAO,MAAM,aAAa,SAVjB,MAAM,KAAG,MAUmB,CAAA;AAErC;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,2DAA2D;AAC3D,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;CACtB;AAkDD,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE,cAAc,GAAG,KAAK,CAe7D;AAED,mFAAmF;AACnF,eAAO,MAAM,YAAY,EAAE,KAAqB,CAAA;AAEhD,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,CAW3D"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Tiny SGR (Select Graphic Rendition) helpers and the configurable theme
3
+ * palette. No chalk — just raw ANSI codes embedded in Text content, which
4
+ * pi-tui's Text component preserves through word-wrap.
5
+ *
6
+ * {@link createTheme} derives the full theme from optional per-role overrides
7
+ * ({@link ThemeOverrides}). An override value is either a basic ANSI color
8
+ * name (`'red'`, `'brightCyan'`) or a raw SGR parameter string (`'31'`,
9
+ * `'1;31'`, `'38;5;208'`); unknown names and malformed codes silently fall
10
+ * back to the built-in default. The default palette is byte-identical to the
11
+ * historical fixed palette, so an absent config changes nothing on screen.
12
+ * @module @dsh-cc/tui/components/theme
13
+ */
14
+ /** Wrap text in an SGR sequence. */
15
+ export const sgr = (code) => (text) => `\x1b[${code}m${text}\x1b[0m`;
16
+ /** Fixed attribute stylers — part of the theme but not user-configurable. */
17
+ export const bold = sgr('1');
18
+ export const italic = sgr('3');
19
+ export const underline = sgr('4');
20
+ export const strikethrough = sgr('9');
21
+ /**
22
+ * Basic ANSI color names accepted by {@link ThemeOverrides} — the eight base
23
+ * colors plus their bright variants (with `gray`/`grey` aliases). Anything
24
+ * outside this table is treated as a raw SGR code string.
25
+ */
26
+ const SGR_BY_COLOR_NAME = {
27
+ black: '30',
28
+ red: '31',
29
+ green: '32',
30
+ yellow: '33',
31
+ blue: '34',
32
+ magenta: '35',
33
+ cyan: '36',
34
+ white: '37',
35
+ brightBlack: '90',
36
+ gray: '90',
37
+ grey: '90',
38
+ brightRed: '91',
39
+ brightGreen: '92',
40
+ brightYellow: '93',
41
+ brightBlue: '94',
42
+ brightMagenta: '95',
43
+ brightCyan: '96',
44
+ brightWhite: '97',
45
+ };
46
+ /** Raw SGR parameter string: `;`-separated non-negative integers. */
47
+ const SGR_CODE_PATTERN = /^\d+(;\d+)*$/;
48
+ /** Resolve one override value to an SGR parameter string, or the fallback. */
49
+ function resolveSgr(value, fallback) {
50
+ if (typeof value !== 'string')
51
+ return fallback;
52
+ const named = SGR_BY_COLOR_NAME[value];
53
+ if (named !== undefined)
54
+ return named;
55
+ if (SGR_CODE_PATTERN.test(value))
56
+ return value;
57
+ return fallback;
58
+ }
59
+ /** Built-in default SGR code per configurable role (the historical palette). */
60
+ const DEFAULT_SGR_BY_ROLE = {
61
+ accent: '36',
62
+ success: '32',
63
+ error: '31',
64
+ warning: '33',
65
+ muted: '2',
66
+ highlight: '35',
67
+ };
68
+ /** Build a theme from optional overrides; invalid values keep the default. */
69
+ export function createTheme(overrides) {
70
+ const role = (name) => sgr(resolveSgr(overrides?.[name], DEFAULT_SGR_BY_ROLE[name]));
71
+ return {
72
+ accent: role('accent'),
73
+ success: role('success'),
74
+ error: role('error'),
75
+ warning: role('warning'),
76
+ muted: role('muted'),
77
+ highlight: role('highlight'),
78
+ bold,
79
+ italic,
80
+ underline,
81
+ strikethrough,
82
+ };
83
+ }
84
+ /** The built-in default theme — byte-identical to the historical fixed palette. */
85
+ export const defaultTheme = createTheme();
86
+ /** Derive the pi-tui editor theme from a palette: accent focus, muted rest. */
87
+ export function createEditorTheme(theme) {
88
+ return {
89
+ borderColor: theme.accent,
90
+ selectList: {
91
+ selectedPrefix: () => '> ',
92
+ selectedText: theme.accent,
93
+ description: theme.muted,
94
+ scrollInfo: theme.muted,
95
+ noMatch: theme.muted,
96
+ },
97
+ };
98
+ }
99
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/components/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Transcript view: a Container that mirrors the TuiState rows. Assistant rows
3
+ * render through the vendored Markdown component; other row kinds use Text.
4
+ * Per-row identity caching avoids re-parsing unchanged historical markdown on
5
+ * every streaming chunk, and a source-line budget clips the oldest rows when
6
+ * the transcript grows very long.
7
+ * @module @dsh-cc/tui/components/transcript
8
+ */
9
+ import { Container } from '@dsh-cc/pi-tui';
10
+ import type { TranscriptRow } from '../store.ts';
11
+ import { type Theme } from './theme.ts';
12
+ /** Drop oldest rows once the total source-line count exceeds this. */
13
+ export declare const TRANSCRIPT_LINE_BUDGET = 2000;
14
+ /** Cheap source-line count for a row (NOT rendered lines). */
15
+ export declare function rowSourceLines(row: TranscriptRow, theme: Theme, options?: RowRenderOptions): number;
16
+ /** Options that affect how a row renders (independent of row identity). */
17
+ export interface RowRenderOptions {
18
+ /** Expand thinking rows; default false (collapsed to a one-line hint). */
19
+ thinkingExpanded?: boolean;
20
+ /**
21
+ * Expand tool rows' output (body/result/diffs); default true. When false a
22
+ * collapsed tool row renders only its head plus a dim summary line.
23
+ */
24
+ toolOutputExpanded?: boolean;
25
+ /** Expand compact rows' summary body; default false (one-line boundary). */
26
+ compactExpanded?: boolean;
27
+ }
28
+ export declare function renderRowText(row: TranscriptRow, options?: RowRenderOptions, theme?: Theme): string;
29
+ /**
30
+ * Container that renders transcript rows as stacked Text/Markdown components.
31
+ * Call `setRows` whenever the driver emits a new state. Styling comes from the
32
+ * injected `theme` (default: the built-in palette).
33
+ */
34
+ export declare class TranscriptView extends Container {
35
+ private readonly theme;
36
+ private prevCache;
37
+ private prevThinkingExpanded;
38
+ private prevToolOutputExpanded;
39
+ private prevCompactExpanded;
40
+ constructor(theme?: Theme);
41
+ setRows(rows: readonly TranscriptRow[], options?: RowRenderOptions): void;
42
+ }
43
+ //# sourceMappingURL=transcript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../src/components/transcript.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,SAAS,EAIV,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAKhD,OAAO,EAAgB,KAAK,KAAK,EAAE,MAAM,YAAY,CAAA;AAErD,sEAAsE;AACtE,eAAO,MAAM,sBAAsB,OAAO,CAAA;AAE1C,8DAA8D;AAC9D,wBAAgB,cAAc,CAC5B,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,gBAAgB,GACzB,MAAM,CAUR;AAiBD,2EAA2E;AAC3E,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,4EAA4E;IAC5E,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAkBD,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE,KAAK,GAAE,KAAoB,GAAG,MAAM,CAuDjH;AAkCD;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,SAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;IAC7B,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,oBAAoB,CAAQ;IACpC,OAAO,CAAC,sBAAsB,CAAO;IACrC,OAAO,CAAC,mBAAmB,CAAQ;gBAEvB,KAAK,GAAE,KAAoB;IAKvC,OAAO,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI;CA4D1E"}