@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,314 @@
1
+ /**
2
+ * Agent-model + history cluster of the TUI driver factory.
3
+ *
4
+ * createDriver used to hold these locals inline: resolveEfforts / stalePair /
5
+ * seedDefaultModel, the resume marker + prompt/bash histories, the tool
6
+ * presenters, history folding, and the model-command catalog. They only read
7
+ * `ctx`/`current`/`selection`/`liveMode` off `rt` (DriverAgentCtx), so they
8
+ * migrate here as a free-function collaborator to keep the factory under the
9
+ * 500-line budget — the same pattern as the other harness/driver-*.ts leaves.
10
+ *
11
+ * Mutable state the other sections rebind (`markedContent`, `history`,
12
+ * `bashHistory`) is owned HERE and exposed through get/set/append handles so
13
+ * no other module captures a stale copy.
14
+ * @module @dsh-cc/tui/harness/driver-agent
15
+ */
16
+ import { ReasoningEffortId } from '@deepseek-ai/dsh-llm';
17
+ import { bootBannerText } from "./boot-banner.js";
18
+ import { loadHistory, HISTORY_CAP } from "../history.js";
19
+ import { loadBashHistory, saveBashHistory } from "../bash-history.js";
20
+ import { writeResumeTarget } from "../resume-target.js";
21
+ import { clearTurn, resetTurnStep, setBusy, setPermissionMode, setTurnActive, upsertRow, } from "../store.js";
22
+ import { applySessionEvent, } from "../transcript.js";
23
+ /**
24
+ * The slice of createDriver's model/history cluster that the session/event
25
+ * listener needs: it folds events onto fresh state and presents tool cards for
26
+ * the live agent.
27
+ */
28
+ export function attachSessionEvents(rt) {
29
+ // Whether a compact this driver anchored owns the working line: a manual
30
+ // `/compact` on an IDLE agent starts its own pseudo-turn (busy + anchor),
31
+ // and its `compaction/end` clears that anchor and flushes the outbox. An
32
+ // auto-compact riding a live turn never touches the anchor.
33
+ let compactOwnedTurn = false;
34
+ // Sessions that already showed the classifier-breaker fallback notice (R4):
35
+ // ONE per session per process, on live-appended events only — the initial
36
+ // fold/replay never routes through this listener, so a resume never re-shows
37
+ // a notice for a long-fixed lane.
38
+ const breakerNoticed = new Set();
39
+ const CLASSIFIER_BREAKER_NOTICE = 'classifier lane failed repeatedly; auto mode continues without LLM vetting until settings change';
40
+ rt.ctx.on('session/event', (session, event) => {
41
+ // Late events from a disposed session are dropped by id mismatch.
42
+ if (session.id !== rt.current.agent.session.id)
43
+ return;
44
+ const eventType = event.type;
45
+ rt.emit(applySessionEvent(rt.state(), event, rt.presenters));
46
+ if (eventType === 'permission/mode' || eventType === 'plan/mode') {
47
+ rt.emit(setPermissionMode(rt.state(), rt.liveMode(rt.current.agent)));
48
+ }
49
+ // R4: a live classifier breaker open is surfaced once, visibly — replayed
50
+ // logs are handled by the transcript fold, never re-shown here.
51
+ if (eventType === 'permission/classifier') {
52
+ const data = event.data;
53
+ if (data?.failure === 'breaker' && !breakerNoticed.has(session.id)) {
54
+ breakerNoticed.add(session.id);
55
+ rt.showNotice(CLASSIFIER_BREAKER_NOTICE);
56
+ }
57
+ }
58
+ // Manual-compaction working line: an idle agent's `/compact` runs outside
59
+ // any turn, so anchor the working line for its duration. A live turn's
60
+ // anchor (auto-compact mid-request) is left untouched.
61
+ if (eventType === 'compaction/start') {
62
+ if (rt.state().turn === undefined) {
63
+ compactOwnedTurn = true;
64
+ rt.emit(setBusy(rt.state(), true));
65
+ rt.emit(setTurnActive(rt.state(), { startedAt: Date.now(), outputBase: rt.state().hud?.tokens?.output }));
66
+ }
67
+ }
68
+ else if (eventType === 'compaction/end' && compactOwnedTurn) {
69
+ compactOwnedTurn = false;
70
+ rt.emit(clearTurn(rt.state()));
71
+ rt.emit(setBusy(rt.state(), false));
72
+ // Same contract as turn/end: entries submitted during the compaction
73
+ // flush into the next durable turn.
74
+ rt.flushQueue();
75
+ }
76
+ // Working-line anchor backstop: a live `turn/start` (or `agent/status`
77
+ // running) can be the first evidence of a turn this UI never saw
78
+ // submitted. Anchor only when none exists — re-anchoring a live turn
79
+ // would reset elapsed time and the token delta to zero.
80
+ const liveState = rt.state();
81
+ if (eventType === 'turn/start' && liveState.turn === undefined) {
82
+ rt.emit(setTurnActive(rt.state(), { startedAt: Date.now(), outputBase: liveState.hud?.tokens?.output }));
83
+ }
84
+ else if (eventType === 'agent/status' && liveState.turn === undefined) {
85
+ const status = event.data;
86
+ if (status?.status === 'running') {
87
+ rt.emit(setTurnActive(rt.state(), { startedAt: Date.now(), outputBase: liveState.hud?.tokens?.output }));
88
+ }
89
+ }
90
+ // Working-line step clock: each tool call (and each tool result) resets
91
+ // the elapsed timer, so the line shows the current step's duration.
92
+ const stepState = rt.state();
93
+ if ((eventType === 'tool/call' || eventType === 'tool/result') && stepState.turn !== undefined) {
94
+ rt.emit(resetTurnStep(rt.state(), Date.now()));
95
+ }
96
+ // Outbox flush anchor: the durable `turn/end` fires exactly once per turn.
97
+ if (eventType === 'turn/end') {
98
+ rt.emit(clearTurn(rt.state()));
99
+ rt.flushQueue();
100
+ }
101
+ });
102
+ }
103
+ /**
104
+ * Build the agent-model/history cluster. Returns handles createDriver threads
105
+ * into the picker/session/run-local/queue sections and the Driver API, and
106
+ * exposes the owned `markedContent`/`history`/`bashHistory` state through
107
+ * get/set seams so no other module captures a stale copy.
108
+ */
109
+ export function createAgentSection(rt) {
110
+ const { ctx, current, selection, agentOptions } = rt;
111
+ // Deployment default-model service (settings.yaml's agent-default-model).
112
+ const agentDefaultModel = ctx.get('agentDefaultModel');
113
+ /**
114
+ * Advertised reasoning-effort levels of `provider`/`model`, or undefined
115
+ * when they cannot be resolved: the llm service is absent, does not expose
116
+ * `resolveModelInfo` (legacy stubs), the lookup rejects, or the model
117
+ * carries no reasoning metadata.
118
+ */
119
+ const resolveEfforts = async (provider, model) => {
120
+ const llm = ctx.get('llm');
121
+ if (llm?.resolveModelInfo === undefined)
122
+ return undefined;
123
+ try {
124
+ const info = await llm.resolveModelInfo(provider, model);
125
+ return info.reasoning === undefined ? undefined : info.reasoning.efforts;
126
+ }
127
+ catch {
128
+ return undefined;
129
+ }
130
+ };
131
+ /**
132
+ * Stale-pair guard for detached (submit-then-continue) writes: the captured
133
+ * `{provider, model}` must still be the live selection when the continuation
134
+ * resumes.
135
+ */
136
+ const stalePair = (captured) => {
137
+ const live = selection.current;
138
+ if (live !== undefined && live.provider === captured.provider && live.model === captured.model) {
139
+ return false;
140
+ }
141
+ rt.emit(upsertRow(rt.state(), { kind: 'status', text: 'Model changed; effort not applied.' }));
142
+ return true;
143
+ };
144
+ /**
145
+ * Seed `selection.current` from the deployment default when no explicit
146
+ * provider/model is configured. `currentSelection()` is awaited so a
147
+ * (duck-typed) async service can defer settlement — the boot seed's
148
+ * await-late wait seam keys off this promise.
149
+ */
150
+ const seedDefaultModel = async (reset = false) => {
151
+ if (reset)
152
+ selection.current = undefined;
153
+ if (selection.current !== undefined)
154
+ return;
155
+ if (current.agent.options.provider !== undefined && current.agent.options.model !== undefined) {
156
+ selection.current = { provider: current.agent.options.provider, model: current.agent.options.model };
157
+ return;
158
+ }
159
+ if (agentOptions === undefined) {
160
+ const dep = await agentDefaultModel?.currentSelection();
161
+ if (dep !== undefined) {
162
+ let effort;
163
+ if (dep.reasoningEffort !== undefined) {
164
+ const efforts = await resolveEfforts(dep.provider, dep.model);
165
+ if (efforts?.some(level => level.id === dep.reasoningEffort) === true) {
166
+ effort = dep.reasoningEffort;
167
+ }
168
+ }
169
+ selection.current = effort === undefined
170
+ ? { provider: dep.provider, model: dep.model }
171
+ : { provider: dep.provider, model: dep.model, reasoningEffort: ReasoningEffortId(effort) };
172
+ }
173
+ }
174
+ };
175
+ /**
176
+ * Fire-early / await-late boot seed (W4): the seed promise is kicked once
177
+ * and shared (idempotent), so createDriver builds the root without waiting,
178
+ * while every model-turn path (queue submit, /effort) awaits
179
+ * {@link waitForModel} before dispatch. A failed seed is caught and warned —
180
+ * the wait must resolve so submit never deadlocks; the turn then runs on
181
+ * the agent's own default route. On settle (success or failure) the boot
182
+ * banner row is upserted to the resolved label and the no-model notice is
183
+ * emitted ONLY here — a slow-but-fine boot never flashes it.
184
+ */
185
+ let seedPromise;
186
+ const runSeed = async () => {
187
+ try {
188
+ await seedDefaultModel();
189
+ }
190
+ catch (error) {
191
+ console.warn('[dsh-cc-tui] default-model seed failed:', error);
192
+ }
193
+ finally {
194
+ const settled = rt.state();
195
+ const modelLabel = selection.current?.model ?? 'default model';
196
+ const rows = settled.rows.slice();
197
+ const bannerIndex = rows.findIndex(existing => existing.kind === 'status' && existing.text?.startsWith('dsh cc-mode — '));
198
+ if (bannerIndex >= 0) {
199
+ rows[bannerIndex] = { kind: 'status', text: bootBannerText(modelLabel, rt.cwd) };
200
+ rt.emit({ ...settled, rows });
201
+ }
202
+ if (selection.current === undefined) {
203
+ rt.emit(upsertRow(rt.state(), { kind: 'status', text: 'No model configured. Pick one with /model.' }));
204
+ }
205
+ }
206
+ };
207
+ const waitForModel = () => {
208
+ if (seedPromise === undefined)
209
+ seedPromise = runSeed();
210
+ return seedPromise;
211
+ };
212
+ /**
213
+ * Bounded boot-frame wait (W4): let a seed that settles within the current
214
+ * microtask cascade (a sync deployment-default service — the common boot)
215
+ * land its banner upsert + gated notice before the first frame; a genuinely
216
+ * slow seed resolves via the one-macrotask timer and never blocks it.
217
+ */
218
+ const awaitBootFrame = () => Promise.race([waitForModel(), new Promise(resolve => { setTimeout(resolve, 0); })]);
219
+ /**
220
+ * Marker semantics: write on resume (self-heal) and after the first real
221
+ * user prompt — never on an empty fresh boot.
222
+ */
223
+ let markedContent = false;
224
+ const persistResumeTarget = () => {
225
+ const id = String(current.agent.session.id);
226
+ // The NEW marker keys off the LIVE session's project (a resumed session
227
+ // created elsewhere writes its own bucket); legacy dual-write stays in
228
+ // the boot-cwd bucket. Dedupe is internal to writeResumeTarget (F4) —
229
+ // no read-compare here.
230
+ writeResumeTarget(id, {
231
+ cwd: current.agent.session.header.cwd ?? rt.cwd,
232
+ legacyCwd: rt.cwd,
233
+ });
234
+ };
235
+ // Composer + bash histories: owned here, rebound through get/set seams.
236
+ // `historyDir` is mutable so /resume can point it at the switched session's
237
+ // project directory (bindHistoryDir); every reader uses the live value via
238
+ // `get historyDir()` rather than a captured snapshot.
239
+ let historyDir = rt.historyDir;
240
+ let history = loadHistory(historyDir);
241
+ let bashHistory = loadBashHistory(historyDir).reverse();
242
+ const appendBashHistory = (command) => {
243
+ if (bashHistory[0] === command)
244
+ return;
245
+ bashHistory = [command, ...bashHistory].slice(0, HISTORY_CAP);
246
+ saveBashHistory([...bashHistory].reverse(), historyDir);
247
+ };
248
+ const bindHistoryDir = (dir) => {
249
+ historyDir = dir;
250
+ history = loadHistory(dir);
251
+ bashHistory = loadBashHistory(dir).reverse();
252
+ };
253
+ const tools = ctx.get('tools');
254
+ const shell = ctx.get('shell');
255
+ const presenters = tools === undefined
256
+ ? undefined
257
+ : {
258
+ presentCall(name, args) {
259
+ return tools.get(name, current.agent)?.presentCall?.(args);
260
+ },
261
+ presentResult(name, args, result) {
262
+ return tools.get(name, current.agent)?.presentResult?.(args, result);
263
+ },
264
+ };
265
+ /**
266
+ * Replay the durable event log so a resumed session shows its prior
267
+ * conversation. Folding is a reduce, not a per-event broadcast.
268
+ */
269
+ const foldHistory = () => {
270
+ let folded = rt.state();
271
+ for (const event of current.agent.session.events) {
272
+ folded = applySessionEvent(folded, event, presenters);
273
+ }
274
+ return folded;
275
+ };
276
+ /**
277
+ * Model-command catalog (`/model` picker). Reads the llm service providers
278
+ * it advertises.
279
+ */
280
+ const loadCatalog = async () => {
281
+ const llm = ctx.get('llm');
282
+ if (llm === undefined)
283
+ return [];
284
+ const entries = [];
285
+ for (const provider of llm.listProviders()) {
286
+ const models = await llm.listModels(provider.id);
287
+ for (const model of models) {
288
+ entries.push({ provider: model.provider, id: model.id, name: model.name });
289
+ }
290
+ }
291
+ return entries;
292
+ };
293
+ return {
294
+ resolveEfforts,
295
+ stalePair,
296
+ seedDefaultModel,
297
+ waitForModel,
298
+ awaitBootFrame,
299
+ persistResumeTarget,
300
+ getMarkedContent: () => markedContent,
301
+ setMarkedContent: (value) => { markedContent = value; },
302
+ get historyDir() { return historyDir; },
303
+ bindHistoryDir,
304
+ getHistory: () => history,
305
+ setHistory: (next) => { history = next; },
306
+ getBashHistory: () => bashHistory,
307
+ appendBashHistory,
308
+ presenters,
309
+ shell,
310
+ foldHistory,
311
+ loadCatalog,
312
+ };
313
+ }
314
+ //# sourceMappingURL=driver-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-agent.js","sourceRoot":"","sources":["../../src/harness/driver-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * /agents local-slash pipeline of the in-process protocol driver: the TUI
3
+ * surface for continuable background agents. Consumes the SAME thin snapshot
4
+ * as the preset /agents command — the read-only `ccAgents` service published
5
+ * on the root realm by command-agents inside cc-services (plan §3.2 / F8
6
+ * bridge). When the service is absent the fold degrades to a thin snapshot
7
+ * over the process-wide event fold. Fold-derived decorations (provider, last
8
+ * epoch stopReason, prompt excerpt — newline-normalized, ANSI-stripped,
9
+ * unicode-truncated) are additive on the detail view: never different ids or
10
+ * ordering.
11
+ *
12
+ * @module @dsh-cc/tui/harness/driver-agents
13
+ */
14
+ import type { DriverRunLocalCtx } from './driver-ctx.ts';
15
+ /** The /agents slice of runLocal: one rendered status text per invocation. */
16
+ export interface AgentsSection {
17
+ agentsSlash(rawInput: string): Promise<string>;
18
+ }
19
+ export declare function createAgentsSection(rt: DriverRunLocalCtx): AgentsSection;
20
+ //# sourceMappingURL=driver-agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-agents.d.ts","sourceRoot":"","sources":["../../src/harness/driver-agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAYH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAExD,8EAA8E;AAC9E,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CAC/C;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,iBAAiB,GAAG,aAAa,CAwGxE"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * /agents local-slash pipeline of the in-process protocol driver: the TUI
3
+ * surface for continuable background agents. Consumes the SAME thin snapshot
4
+ * as the preset /agents command — the read-only `ccAgents` service published
5
+ * on the root realm by command-agents inside cc-services (plan §3.2 / F8
6
+ * bridge). When the service is absent the fold degrades to a thin snapshot
7
+ * over the process-wide event fold. Fold-derived decorations (provider, last
8
+ * epoch stopReason, prompt excerpt — newline-normalized, ANSI-stripped,
9
+ * unicode-truncated) are additive on the detail view: never different ids or
10
+ * ordering.
11
+ *
12
+ * @module @dsh-cc/tui/harness/driver-agents
13
+ */
14
+ import { buildAgentsSnapshot, parseAgentsInput, renderAgentDetail, renderAgentsList, stopNotRunningCopy, stopRunningCopy, unknownAgentCopy, } from '@dsh-cc/command-agents/snapshot';
15
+ export function createAgentsSection(rt) {
16
+ // --- /agents: continuable background agents --------------------------------
17
+ // Replaces the pre-existing flat subagent-activity renderer: the TUI
18
+ // consumes the SAME thin snapshot as the preset /agents command — published
19
+ // on the root realm as `ccAgents` by command-agents inside cc-services
20
+ // (plan §3.2 / F8 bridge). When the service is absent (composition without
21
+ // the command-agents row) the fold degrades to a thin snapshot over the
22
+ // process-wide event fold only. Fold-derived decorations (provider, last
23
+ // stopReason, prompt excerpt) are additive on the detail view — never
24
+ // different ids or ordering.
25
+ const agentsRows = async () => {
26
+ const parentSessionId = String(rt.current.agent.session.id);
27
+ const snapshot = rt.ctx.get('ccAgents');
28
+ if (snapshot !== undefined && typeof snapshot.list === 'function') {
29
+ return snapshot.list(parentSessionId);
30
+ }
31
+ // Fold-only fallback: SubagentRunView rows mapped to thin snapshot rows.
32
+ // Parked AND done runs stay visible (Ready group) — the fold is the only
33
+ // history this composition has; a done one-shot still renders with its
34
+ // last-epoch decoration.
35
+ return buildAgentsSnapshot({
36
+ listChildren: async () => rt.state().subagents.map(run => ({
37
+ id: run.sessionId,
38
+ activity: run.status === 'running' ? 'running' : 'inactive',
39
+ hasChildren: false,
40
+ mode: 'continuable',
41
+ })),
42
+ getAgent: id => rt.state().subagents.find(run => run.sessionId === id && run.status === 'running'),
43
+ readPin: () => undefined,
44
+ pinPath: () => '',
45
+ }, parentSessionId);
46
+ };
47
+ /**
48
+ * ANSI/control-stripped, newline-normalized, unicode-aware-truncated prompt
49
+ * excerpt from the child's first user message event, when the child agent's
50
+ * session is reachable via `ctx.agents.get` (F7: the fold itself carries no
51
+ * prompt).
52
+ */
53
+ const promptExcerptOf = (childId) => {
54
+ const child = rt.ctx.agents
55
+ ?.get?.(childId);
56
+ const events = child?.session?.events;
57
+ if (events === undefined)
58
+ return undefined;
59
+ for (const event of events) {
60
+ const record = event;
61
+ if (record.type !== 'message' || record.data?.role !== 'user')
62
+ continue;
63
+ const data = record.data;
64
+ const text = typeof data.text === 'string'
65
+ ? data.text
66
+ : Array.isArray(data.content)
67
+ ? data.content
68
+ .filter((block) => block !== null && typeof block === 'object' && block.type === 'text')
69
+ .map(block => block.text)
70
+ .join('')
71
+ : '';
72
+ if (text.length === 0)
73
+ continue;
74
+ const normalized = text
75
+ .replace(/\r\n?/g, ' ')
76
+ .replace(/\x1B\[[0-9;?]*[A-Za-z]/g, '')
77
+ // eslint-disable-next-line no-control-regex
78
+ .replace(/[\u0000-\u0008\u000B-\u001F\u007F]/g, '');
79
+ const chars = Array.from(normalized);
80
+ return (chars.length > 80 ? chars.slice(0, 80).join('') + '…' : normalized);
81
+ }
82
+ return undefined;
83
+ };
84
+ /** Fold-derived additive detail lines (provider, last epoch, prompt excerpt). */
85
+ const decoratedDetailOf = (row) => {
86
+ const run = rt.state().subagents.find(candidate => candidate.sessionId === row.id);
87
+ if (run === undefined)
88
+ return [];
89
+ const lines = [` provider: ${run.provider}`];
90
+ if (run.stopReason !== undefined)
91
+ lines.push(` last epoch: ${run.stopReason}`);
92
+ const excerpt = promptExcerptOf(row.id);
93
+ if (excerpt !== undefined)
94
+ lines.push(` prompt: "${excerpt}"`);
95
+ return lines;
96
+ };
97
+ const agentsSlash = async (rawInput) => {
98
+ const parsed = parseAgentsInput(rawInput);
99
+ if (parsed.kind === 'error')
100
+ return parsed.text;
101
+ const rows = await agentsRows();
102
+ if (parsed.kind === 'list')
103
+ return renderAgentsList(rows);
104
+ const row = rows.find(candidate => candidate.id === parsed.id);
105
+ if (row === undefined)
106
+ return unknownAgentCopy(parsed.id);
107
+ if (parsed.kind === 'stop') {
108
+ if (row.residency !== 'running')
109
+ return stopNotRunningCopy(row.id, row.residency);
110
+ const subagents = rt.ctx.get('subagents');
111
+ if (typeof subagents?.interrupt !== 'function') {
112
+ return `No interrupt path available for agent ${row.id} in this composition.`;
113
+ }
114
+ subagents.interrupt(row.id, { kind: 'ancestor', agent: rt.current.agent });
115
+ return stopRunningCopy(row.id);
116
+ }
117
+ const detail = renderAgentDetail(row, undefined, undefined, String(rt.current.agent.session.id));
118
+ const decorated = decoratedDetailOf(row);
119
+ return decorated.length === 0 ? detail : `${detail}\n${decorated.join('\n')}`;
120
+ };
121
+ return { agentsSlash };
122
+ }
123
+ //# sourceMappingURL=driver-agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-agents.js","sourceRoot":"","sources":["../../src/harness/driver-agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Approval + user-question pipeline extracted from harness/driver.ts.
3
+ *
4
+ * Free-function collaborator: `createApprovalsSection` owns the modal FIFO
5
+ * (approvals and questions share one queue via createModalQueue) and takes a
6
+ * {@link DriverApprovalsCtx} instead of closing over createDriver's locals.
7
+ * Emits re-read the current view-model via `rt.state()` after every emit
8
+ * (createDriver rebinds `state` on emit). The section routes approvals from the
9
+ * host's `approval/request` hook, persists "always allow" rules through the
10
+ * settings provider, and answers questions through the host's userQuestions
11
+ * provider.
12
+ * @module @dsh-cc/tui/harness/driver-approvals
13
+ */
14
+ import type { ApprovalAnswerKind } from '../state/driver-types.ts';
15
+ import { type ModalEntry } from './driver-modal.ts';
16
+ import type { DriverApprovalsCtx } from './driver-ctx.ts';
17
+ /** The approvals-driven slice of the Driver surface, plus queue/dispose teardown. */
18
+ export type ApprovalsSection = {
19
+ answerApproval(kind: ApprovalAnswerKind): void;
20
+ questionMove(delta: -1 | 1): void;
21
+ questionToggle(): void;
22
+ questionPick(index: number): void;
23
+ questionType(text: string): void;
24
+ questionBackspace(): void;
25
+ questionSubmit(): void;
26
+ questionCancel(): void;
27
+ /** Drain every parked modal entry (switchSession aborts approvals/questions). */
28
+ spliceAll(): ModalEntry[];
29
+ dispose(): void;
30
+ };
31
+ /**
32
+ * Build the approval/question pipeline. `answerApproval` threads the allow-rule
33
+ * write through {@link ModalAnswerDeps}; the modal FIFO lives here so approvals
34
+ * and user questions share a single queue. `current`/`state` are read live via
35
+ * the ctx — never captured snapshots.
36
+ */
37
+ export declare function createApprovalsSection(rt: DriverApprovalsCtx): ApprovalsSection;
38
+ //# sourceMappingURL=driver-approvals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-approvals.d.ts","sourceRoot":"","sources":["../../src/harness/driver-approvals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,OAAO,KAAK,EAAE,kBAAkB,EAAwB,MAAM,0BAA0B,CAAA;AASxF,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAGzD,qFAAqF;AACrF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAA;IAC9C,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACjC,cAAc,IAAI,IAAI,CAAA;IACtB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,iBAAiB,IAAI,IAAI,CAAA;IACzB,cAAc,IAAI,IAAI,CAAA;IACtB,cAAc,IAAI,IAAI,CAAA;IACtB,iFAAiF;IACjF,SAAS,IAAI,UAAU,EAAE,CAAA;IACzB,OAAO,IAAI,IAAI,CAAA;CAChB,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,kBAAkB,GAAG,gBAAgB,CAyP/E"}