@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,459 @@
1
+ /**
2
+ * In-process protocol driver: session/event → UI store, followup/steer/cancel
3
+ * back into the agent. Only this directory imports `@deepseek-ai/*`.
4
+ * @module @dsh-cc/tui/harness/driver
5
+ */
6
+ import { randomUUID } from 'node:crypto';
7
+ import { join } from 'node:path';
8
+ import { installModelSelection } from '@deepseek-ai/dsh-agent';
9
+ import { SessionId } from '@deepseek-ai/dsh-session';
10
+ import { composePreset } from "./preset.js";
11
+ import { bootBannerRows } from "./boot-banner.js";
12
+ import { createSessionsSection } from "./driver-sessions.js";
13
+ import { gitBranchOf } from "./shell-output.js";
14
+ import { runShellCommand as runShellCommandModule } from "./driver-bash.js";
15
+ import { createApprovalsSection } from "./driver-approvals.js";
16
+ import { createCatalogSection } from "./driver-catalog.js";
17
+ import { createModeSection } from "./driver-mode.js";
18
+ import { liveModeWithDefault, liveSessionCwd } from "./driver-live.js";
19
+ import { createHudSection } from "./driver-hud.js";
20
+ import { createStatusLineWiring } from "./statusline-wiring.js";
21
+ import { createPickersSection } from "./driver-pickers.js";
22
+ import { createQueueSection } from "./driver-queue.js";
23
+ import { createRunLocalSection } from "./driver-run-local.js";
24
+ import { createAgentSection, attachSessionEvents } from "./driver-agent.js";
25
+ import { createPromoteSection } from "./driver-promote.js";
26
+ import { clearResumeTarget, readResumeTarget, writeResumeTarget } from "../resume-target.js";
27
+ import { coldCutGlobalHistory, defaultTuiDir } from "../history.js";
28
+ import { resolveProject } from "../project.js";
29
+ import { recordProjectSessionId } from "../project-sessions.js";
30
+ import { closeTodoPanel, closeUsagePanel, createInitialState, markExitAttempt, moveTodoPanelFocus, openTodoPanel, setBusy, setDraft, setNotice, setPermissionMode, toggleGlobalCollapse, toggleThinking, upsertRow, } from "../store.js";
31
+ export { BASH_OUTPUT_LINE_CAP, BASH_STDOUT_MAX_BYTES, BASH_TIMEOUT_MS, gitBranchOf, } from "./shell-output.js";
32
+ export { formatCostReport } from "./usage-view.js";
33
+ export { allowRuleOf, payloadOf } from "./approval-preview.js";
34
+ /** Default lifetime of a transient `showNotice` hint. */
35
+ const NOTICE_TTL_MS = 3000;
36
+ /**
37
+ * Create the TUI driver: one agent under the CC preset, interaction providers,
38
+ * and a folded view model.
39
+ */
40
+ export async function createDriver(ctx, config = {}) {
41
+ const listeners = new Set();
42
+ let state = createInitialState();
43
+ const emit = (next) => {
44
+ state = next;
45
+ for (const listener of listeners)
46
+ listener(state);
47
+ };
48
+ // Transient notice: parked in state.notice with a self-clearing timer. The
49
+ // timer handle lives here so dispose() can cancel it (reversible effect),
50
+ // and a newer notice replaces the pending timer of the previous one.
51
+ let noticeTimer;
52
+ const showNotice = (text, ttlMs = NOTICE_TTL_MS) => {
53
+ if (noticeTimer !== undefined)
54
+ clearTimeout(noticeTimer);
55
+ emit(setNotice(state, text));
56
+ noticeTimer = setTimeout(() => {
57
+ noticeTimer = undefined;
58
+ // Same-reference guard: no churn when the notice was already cleared.
59
+ if (state.notice !== undefined)
60
+ emit(setNotice(state, undefined));
61
+ }, ttlMs);
62
+ };
63
+ const composition = await composePreset(ctx, config.agentPreset ?? 'cc');
64
+ const cwd = config.cwd ?? process.cwd();
65
+ const selection = { assembled: undefined, current: undefined };
66
+ const presetSetup = composition.setup;
67
+ const withSelection = async (agentCtx) => {
68
+ if (presetSetup !== undefined)
69
+ await presetSetup(agentCtx);
70
+ installModelSelection(agentCtx, selection);
71
+ };
72
+ const agentOptions = config.provider !== undefined && config.model !== undefined
73
+ ? { provider: config.provider, model: config.model }
74
+ : undefined;
75
+ const createHandle = (id, extras) => ctx.agents.create({
76
+ sessionId: id,
77
+ meta: { cwd: extras.cwd, ...composition.agentPreset === undefined ? {} : { agentPreset: composition.agentPreset } },
78
+ setup: withSelection,
79
+ ...(extras.agentOptions === undefined ? {} : { agentOptions: extras.agentOptions }),
80
+ });
81
+ const createArgs = (id) => ({
82
+ sessionId: id,
83
+ meta: { cwd, ...composition.agentPreset === undefined ? {} : { agentPreset: composition.agentPreset } },
84
+ setup: withSelection,
85
+ ...agentOptions === undefined ? {} : { agentOptions },
86
+ });
87
+ // Boot session resolution (§2.3): non-empty sessionId → resume that id;
88
+ // '' → explicit fresh (never read the marker); undefined + autoResume →
89
+ // read the project marker; else fresh. `SessionId` is never built from ''.
90
+ let resumeSession;
91
+ let attemptedAutoResume = false;
92
+ let markerFound = false;
93
+ if (config.sessionId !== undefined && config.sessionId.length > 0) {
94
+ resumeSession = SessionId(config.sessionId);
95
+ }
96
+ else if (config.sessionId === '') {
97
+ resumeSession = undefined;
98
+ }
99
+ else if (config.autoResume === true) {
100
+ attemptedAutoResume = true;
101
+ const markerId = readResumeTarget({ cwd });
102
+ markerFound = markerId !== undefined && markerId.length > 0;
103
+ resumeSession = markerFound ? SessionId(markerId) : undefined;
104
+ }
105
+ let resumed = false;
106
+ let handle;
107
+ if (resumeSession !== undefined) {
108
+ try {
109
+ handle = await ctx.agents.resume({
110
+ resumeSessionId: resumeSession,
111
+ setup: withSelection,
112
+ ...agentOptions === undefined ? {} : { agentOptions },
113
+ });
114
+ resumed = true;
115
+ }
116
+ catch {
117
+ // Stale marker: the recorded session is gone. Clear it so the next boot
118
+ // does not loop on the same failure, then degrade to a fresh session
119
+ // (which must not steal the marker — persist only fires on real content).
120
+ // The dual clear (legacyCwd defaults to cwd) covers both buckets.
121
+ clearResumeTarget({ cwd });
122
+ showNotice('上次会话已失效,已开启新会话,可 /resume 手动选择');
123
+ handle = await ctx.agents.create(createArgs(SessionId(`tui-${randomUUID()}`)));
124
+ }
125
+ }
126
+ else {
127
+ handle = await ctx.agents.create(createArgs(SessionId(`tui-${randomUUID()}`)));
128
+ }
129
+ // `-c`/`--continue` is the only reason bare boots show a hint: the marker
130
+ // was checked, nothing to continue, so point the user at /resume. Shown
131
+ // only when autoResume actually looked at the marker and came up empty
132
+ // (a stale-marker degrade already surfaced its own notice above).
133
+ if (attemptedAutoResume && !markerFound && config.continueRequested === true) {
134
+ showNotice('没有可继续的上一会话,可 /resume 手动选择');
135
+ }
136
+ // Rebindable holder: switchSession replaces handle/agent in-place so every
137
+ // event handler and closure reads the LIVE agent at fire time. The session
138
+ // filter compares against current.agent.session.id; late events from a
139
+ // disposed session are dropped by the id mismatch.
140
+ const current = { handle, agent: handle.agent };
141
+ if (current.agent.options.provider !== undefined && current.agent.options.model !== undefined) {
142
+ selection.current = { provider: current.agent.options.provider, model: current.agent.options.model };
143
+ }
144
+ // Deployment default-model service, effort resolution, history binding,
145
+ // and the resume marker now live in the agent section (harness/driver-agent.ts).
146
+ //
147
+ // Per-project input history: prompts and bash commands are bucketed by the
148
+ // session's project (the main git root — worktrees collapse onto it), so
149
+ // ↑/↓ recall never leaks across working directories. An explicit
150
+ // config.historyDir stays an override (tests, embedding).
151
+ let historyDir = config.historyDir;
152
+ let historyProjectKey;
153
+ if (historyDir === undefined) {
154
+ const bootProject = resolveProject(cwd);
155
+ const tuiDir = defaultTuiDir();
156
+ coldCutGlobalHistory(tuiDir);
157
+ historyProjectKey = bootProject.projectKey;
158
+ historyDir = join(tuiDir, 'projects', bootProject.projectKey);
159
+ }
160
+ const agent = createAgentSection({
161
+ emit,
162
+ state: () => state,
163
+ ctx,
164
+ current,
165
+ selection,
166
+ agentOptions,
167
+ liveMode: liveModeWithDefault(ctx),
168
+ historyDir,
169
+ cwd,
170
+ });
171
+ // W4 fire-early: kick the default-model seed — submits and /effort await the
172
+ // settled seed before dispatch; banner upsert + gated notice in continuation.
173
+ void agent.waitForModel();
174
+ // /resume rebinds history onto the switched session's project; the tracked
175
+ // key makes same-project switches no-ops.
176
+ const rebindHistory = (sessionCwd) => {
177
+ if (config.historyDir !== undefined)
178
+ return;
179
+ const key = resolveProject(sessionCwd ?? cwd).projectKey;
180
+ if (key === historyProjectKey)
181
+ return;
182
+ historyProjectKey = key;
183
+ agent.bindHistoryDir(join(defaultTuiDir(), 'projects', key));
184
+ };
185
+ // Pin a session in its project's sidecar index (exact picker membership,
186
+ // complementing the cwd-prefix heuristic for legacy sessions).
187
+ const recordProjectSession = (sessionId, sessionCwd) => {
188
+ const key = resolveProject(sessionCwd ?? cwd).projectKey;
189
+ recordProjectSessionId(join(defaultTuiDir(), 'projects', key), sessionId);
190
+ };
191
+ // Every "real content arrived" path (submit, run-local, dispose) writes
192
+ // the resume marker AND pins the live session in its project's index.
193
+ const persistResumeTargetAndIndex = () => {
194
+ agent.persistResumeTarget();
195
+ recordProjectSession(String(current.agent.session.id), liveSessionCwd(current.agent, cwd));
196
+ };
197
+ // Marker semantics: write on resume (self-heal) and after the first real
198
+ // user prompt — never on an empty fresh boot; seed true + persist only on resume.
199
+ if (resumed) {
200
+ agent.setMarkedContent(true);
201
+ agent.persistResumeTarget();
202
+ // The marker can attach a session whose recorded cwd differs from the
203
+ // process cwd (e.g. launched from another directory of the same repo):
204
+ // scope history to the LIVE session's project and pin it in that
205
+ // project's sidecar index.
206
+ rebindHistory(liveSessionCwd(current.agent, cwd));
207
+ recordProjectSession(String(current.agent.session.id), liveSessionCwd(current.agent, cwd));
208
+ }
209
+ emit(setPermissionMode(state, liveModeWithDefault(ctx)(current.agent)));
210
+ // Boot banner: art + status rows before the resume fold (row 0); the
211
+ // settled seed upserts the label + gated notice (driver-agent continuation).
212
+ const modelLabel = selection.current?.model ?? 'default model';
213
+ for (const row of bootBannerRows(modelLabel, cwd))
214
+ emit(upsertRow(state, row));
215
+ // Replay the durable event log so a resumed session shows its prior
216
+ // conversation via the agent section's presenter-bound fold. One emit for
217
+ // the whole fold — folding is a reduce, not a per-event broadcast.
218
+ emit(agent.foldHistory());
219
+ // A historical log may end mid-turn if the process crashed; sync busy from
220
+ // the ground-truth agent status before live events continue.
221
+ emit(setBusy(state, current.agent.status === 'running'));
222
+ // W4 await-late bound: a microtask-fast seed lands before the frame; a slow
223
+ // seed never blocks it.
224
+ await agent.awaitBootFrame();
225
+ // --- Statusline: custom command wiring + HUD (branch + projections feed) ---
226
+ const statusline = createStatusLineWiring({ emit, state: () => state, ctx, cwd, current, selection, listeners });
227
+ const hud = createHudSection({
228
+ emit, state: () => state, ctx, cwd, current, selection,
229
+ branchProbe: config.branchProbe ?? gitBranchOf,
230
+ statusline,
231
+ });
232
+ const { refreshBranch, seedHud, seedTodos, applyUsage, projections, statusLineOf } = hud;
233
+ // Late-bound cross-section handles: runHarness (mode/pickers) and flushQueue
234
+ // (session/event listener) are wired after their sections are constructed.
235
+ const actions = {
236
+ runHarness: async () => { throw new Error('runHarness used before init'); },
237
+ flushQueue: () => { },
238
+ };
239
+ // session/event listener (fold + working-line anchor/step + outbox flush).
240
+ // Presenters come from the agent section; flush is late-bound through the
241
+ // actions holder because the queue section is constructed later.
242
+ attachSessionEvents({
243
+ emit,
244
+ state: () => state,
245
+ ctx,
246
+ current,
247
+ liveMode: liveModeWithDefault(ctx),
248
+ presenters: agent.presenters,
249
+ flushQueue: () => actions.flushQueue(),
250
+ showNotice,
251
+ });
252
+ // --- Modal pipeline: approvals + questions share one FIFO ------------------
253
+ const approvals = createApprovalsSection({ emit, state: () => state, ctx, current, showNotice });
254
+ const modeSection = createModeSection({
255
+ emit,
256
+ state: () => state,
257
+ current,
258
+ projections,
259
+ showNotice,
260
+ runHarness: (line) => actions.runHarness(line),
261
+ getRules: () => ctx.get('permissionRules'),
262
+ liveMode: liveModeWithDefault(ctx),
263
+ });
264
+ // Slash-command catalog + subagent lifecycle listeners.
265
+ const catalog = createCatalogSection({ emit, state: () => state, current, ctx });
266
+ // Model/effort/permission pickers; resolveEfforts/stalePair/loadCatalog come
267
+ // from the agent section (they read `llm` off the host ctx).
268
+ const pickers = createPickersSection({
269
+ emit,
270
+ state: () => state,
271
+ selection,
272
+ current,
273
+ liveMode: liveModeWithDefault(ctx),
274
+ resolveEfforts: agent.resolveEfforts,
275
+ stalePair: agent.stalePair,
276
+ loadCatalog: agent.loadCatalog,
277
+ runHarness: (line) => actions.runHarness(line),
278
+ });
279
+ const { openModelPicker, applyModelSwitch, openEffortPicker, openPermissionPicker } = pickers;
280
+ // --- Session switching: /resume overlay + driver.switchSession ----------
281
+ const sessions = createSessionsSection({
282
+ emit,
283
+ state: () => state,
284
+ ctx,
285
+ cwd,
286
+ current,
287
+ selection,
288
+ liveMode: liveModeWithDefault(ctx),
289
+ seedDefaultModel: agent.seedDefaultModel,
290
+ foldHistory: agent.foldHistory,
291
+ seedHud,
292
+ seedTodos,
293
+ refreshBranch,
294
+ writeResumeTarget: (id) => writeResumeTarget(id, {
295
+ // NEW marker keys off the LIVE session's project (a switch into a
296
+ // session created elsewhere writes its own bucket); the legacy one
297
+ // stays in the boot-cwd bucket (symmetric with the old launcher read).
298
+ cwd: current.agent.session.header.cwd ?? cwd,
299
+ legacyCwd: cwd,
300
+ }),
301
+ setMarkedContent: agent.setMarkedContent,
302
+ rebindHistory,
303
+ recordProjectSession,
304
+ spliceAll: () => approvals.spliceAll(),
305
+ refreshCatalog: () => catalog.refreshCatalog(),
306
+ createHandle,
307
+ reapplyMode: (mode) => { modeSection.applyMode(mode); return modeSection.modeWrites; },
308
+ withSelection,
309
+ agentOptions,
310
+ });
311
+ const switchSession = sessions.switchSession;
312
+ const openSessionSwitcher = sessions.openSessionSwitcher;
313
+ // Local slash commands (/export-md, /copy, runLocal) + host-command dispatch.
314
+ const runLocalSection = createRunLocalSection({
315
+ emit,
316
+ state: () => state,
317
+ ctx,
318
+ cwd,
319
+ config,
320
+ current,
321
+ selection,
322
+ projections,
323
+ applyUsage,
324
+ showNotice,
325
+ switchSession,
326
+ startFreshSession: sessions.startFreshSession,
327
+ openSessionSwitcher,
328
+ openModelPicker,
329
+ applyModelSwitch,
330
+ openEffortPicker,
331
+ loadCatalog: agent.loadCatalog,
332
+ resolveEfforts: agent.resolveEfforts,
333
+ waitForModel: agent.waitForModel,
334
+ persistResumeTarget: persistResumeTargetAndIndex,
335
+ getMarkedContent: agent.getMarkedContent,
336
+ setMarkedContent: agent.setMarkedContent,
337
+ });
338
+ const { runLocal, runHarness } = runLocalSection;
339
+ actions.runHarness = runHarness;
340
+ // --- `!` bash mode: local shell commands -----------------------------------
341
+ const bashCtx = {
342
+ state: () => state,
343
+ emit,
344
+ cwd,
345
+ shell: agent.shell,
346
+ appendBashHistory: agent.appendBashHistory,
347
+ };
348
+ const runShellCommand = (raw) => runShellCommandModule(bashCtx, raw);
349
+ // Outbox queue + submit/interrupt pipeline; history rebinds through the agent
350
+ // section's get/set seams.
351
+ const queue = createQueueSection({
352
+ emit,
353
+ state: () => state,
354
+ current,
355
+ ctx,
356
+ runLocal,
357
+ runHarness,
358
+ openPermissionPicker,
359
+ showNotice,
360
+ runShellCommand,
361
+ getHistory: agent.getHistory,
362
+ setHistory: agent.setHistory,
363
+ // Live getter, not a snapshot: /resume may rebind the history directory
364
+ // onto the switched session's project between submits.
365
+ get historyDir() { return agent.historyDir; },
366
+ persistResumeTarget: persistResumeTargetAndIndex,
367
+ setMarkedContent: agent.setMarkedContent,
368
+ waitForModel: agent.waitForModel,
369
+ });
370
+ actions.flushQueue = () => queue.flushQueue();
371
+ // --- Ctrl+B promotion (UX plan §3.4): see harness/driver-promote.ts --------
372
+ // The collect path (Task tool) registers each in-flight foreground collect
373
+ // of this session in the root-realm `ccCollectorRegistry`; promote() on a
374
+ // handle releases the wait and leaves the child untouched.
375
+ const promoteForegroundCollects = createPromoteSection(ctx, current);
376
+ return {
377
+ get state() { return state; },
378
+ get statusLine() { return statusLineOf(); },
379
+ statusLineIn: (width) => statusLineOf(width),
380
+ get cwd() { return cwd; },
381
+ get promptHistory() { return agent.getHistory(); },
382
+ get bashHistory() { return agent.getBashHistory(); },
383
+ subscribe(listener) {
384
+ listeners.add(listener);
385
+ listener(state);
386
+ return () => { listeners.delete(listener); };
387
+ },
388
+ setDraft: (draft) => { emit(setDraft(state, draft)); },
389
+ submit: queue.submit,
390
+ interrupt: queue.interrupt,
391
+ steerQueued: queue.steerQueued,
392
+ recallQueued: queue.recallQueued,
393
+ promoteForegroundCollects,
394
+ cyclePermissionMode: () => modeSection.cyclePermissionMode(),
395
+ toggleGlobalCollapse() { emit(toggleGlobalCollapse(state)); },
396
+ toggleThinking() { emit(toggleThinking(state)); },
397
+ answerApproval: (kind) => approvals.answerApproval(kind),
398
+ questionMove: (delta) => approvals.questionMove(delta),
399
+ questionToggle: () => approvals.questionToggle(),
400
+ questionPick: (index) => approvals.questionPick(index),
401
+ questionType: (text) => approvals.questionType(text),
402
+ questionBackspace: () => approvals.questionBackspace(),
403
+ questionSubmit: () => approvals.questionSubmit(),
404
+ questionCancel: () => approvals.questionCancel(),
405
+ openModelPicker: () => pickers.openModelPicker(),
406
+ modelPickerMove: (delta) => pickers.modelPickerMove(delta),
407
+ modelPickerSubmit: () => pickers.modelPickerSubmit(),
408
+ modelPickerCancel: () => pickers.modelPickerCancel(),
409
+ openEffortPicker: () => pickers.openEffortPicker(),
410
+ effortPickerMove: (delta) => pickers.effortPickerMove(delta),
411
+ effortPickerSubmit: () => pickers.effortPickerSubmit(),
412
+ effortPickerCancel: () => pickers.effortPickerCancel(),
413
+ openPermissionPicker: async () => { pickers.openPermissionPicker(); },
414
+ permissionPickerMove: (delta) => pickers.permissionPickerMove(delta),
415
+ permissionPickerSubmit: () => pickers.permissionPickerSubmit(),
416
+ permissionPickerCancel: () => pickers.permissionPickerCancel(),
417
+ openSessionSwitcher: () => sessions.openSessionSwitcher(),
418
+ sessionSwitcherMove: (delta) => sessions.sessionSwitcherMove(delta),
419
+ sessionSwitcherType: (text) => sessions.sessionSwitcherType(text),
420
+ sessionSwitcherBackspace: () => sessions.sessionSwitcherBackspace(),
421
+ sessionSwitcherToggleScope: () => sessions.sessionSwitcherToggleScope(),
422
+ sessionSwitcherSubmit: () => sessions.sessionSwitcherSubmit(),
423
+ sessionSwitcherCancel: () => sessions.sessionSwitcherCancel(),
424
+ toggleTodoPanel() {
425
+ if (state.todoPanel !== undefined) {
426
+ emit(closeTodoPanel(state));
427
+ return;
428
+ }
429
+ emit(openTodoPanel(state));
430
+ },
431
+ todoPanelMove: (delta) => emit(moveTodoPanelFocus(state, delta)),
432
+ todoPanelClose: () => emit(closeTodoPanel(state)),
433
+ usagePanelClose: () => emit(closeUsagePanel(state)),
434
+ worktreeExitMove: (delta) => runLocalSection.worktreeExitMove(delta),
435
+ worktreeExitSubmit: () => runLocalSection.worktreeExitSubmit(),
436
+ worktreeExitCancel: () => runLocalSection.worktreeExitCancel(),
437
+ showNotice,
438
+ // `/provider` read path + action flows; the section is created in driver-run-local
439
+ providerRuntime: runLocalSection.providerRuntime,
440
+ markExitAttempt: (now) => emit(markExitAttempt(state, now ?? Date.now())),
441
+ switchSession: (id) => sessions.switchSession(id),
442
+ listSessions: () => sessions.listSessions(),
443
+ loadModelCatalog: () => pickers.loadModelCatalog(),
444
+ loadModelEfforts: () => pickers.loadModelEfforts(),
445
+ listCommands: () => catalog.listCommands(),
446
+ async dispose() {
447
+ statusline.dispose();
448
+ if (noticeTimer !== undefined) {
449
+ clearTimeout(noticeTimer);
450
+ noticeTimer = undefined;
451
+ }
452
+ approvals.dispose();
453
+ if (agent.getMarkedContent())
454
+ persistResumeTargetAndIndex();
455
+ await current.handle.dispose();
456
+ },
457
+ };
458
+ }
459
+ //# sourceMappingURL=driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/harness/driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Compose an unpublished agent from the CC preset. Call from `agents.create`
3
+ * / `resume` `setup` so a failed mount rolls the whole creation back.
4
+ * @module @dsh-cc/tui/harness/preset
5
+ */
6
+ import type { Context } from '@deepseek-ai/cordis';
7
+ import type { AgentSetup } from '@deepseek-ai/dsh-agent';
8
+ /** Structural face of `ctx.agentPresets` used by the TUI. */
9
+ export interface AgentPresetsLike {
10
+ readonly defaultId: string;
11
+ resolve(id?: string): Promise<{
12
+ id: string;
13
+ broken?: string;
14
+ }>;
15
+ mount(agentCtx: Context, id?: string): Promise<{
16
+ id: string;
17
+ }>;
18
+ }
19
+ /** Creation inputs for `agents.create` / `resume`. */
20
+ export interface PresetComposition {
21
+ readonly agentPreset?: string;
22
+ readonly setup?: AgentSetup;
23
+ }
24
+ /** Optional-service access — a rosterless boot composes nothing. */
25
+ export declare function rosterOf(ctx: Context): AgentPresetsLike | undefined;
26
+ /**
27
+ * Resolve the preset a new/resumed session will run under. Missing roster
28
+ * or unknown id throws — the TUI must not silently fall back to the host
29
+ * plane (that would leak tools and skip CC commands).
30
+ */
31
+ export declare function composePreset(ctx: Context, requested?: string): Promise<PresetComposition>;
32
+ //# sourceMappingURL=preset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset.d.ts","sourceRoot":"","sources":["../../src/harness/preset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAIxD,6DAA6D;AAC7D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC9D,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/D;AAED,sDAAsD;AACtD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAA;CAC5B;AAED,oEAAoE;AACpE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,GAAG,SAAS,CAEnE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,OAAO,EACZ,SAAS,GAAE,MAAuB,GACjC,OAAO,CAAC,iBAAiB,CAAC,CAqB5B"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Compose an unpublished agent from the CC preset. Call from `agents.create`
3
+ * / `resume` `setup` so a failed mount rolls the whole creation back.
4
+ * @module @dsh-cc/tui/harness/preset
5
+ */
6
+ const DEFAULT_PRESET = 'cc';
7
+ /** Optional-service access — a rosterless boot composes nothing. */
8
+ export function rosterOf(ctx) {
9
+ return ctx.get('agentPresets');
10
+ }
11
+ /**
12
+ * Resolve the preset a new/resumed session will run under. Missing roster
13
+ * or unknown id throws — the TUI must not silently fall back to the host
14
+ * plane (that would leak tools and skip CC commands).
15
+ */
16
+ export async function composePreset(ctx, requested = DEFAULT_PRESET) {
17
+ const presets = rosterOf(ctx);
18
+ if (presets === undefined) {
19
+ throw new Error(`dsh-cc-tui: agent preset roster is not mounted; cannot start CC mode. `
20
+ + `Boot with dsh --profile tui (or run dsh-cc) so @dsh-cc/bundle-tui is composed.`);
21
+ }
22
+ const resolved = await presets.resolve(requested);
23
+ if (resolved.broken !== undefined) {
24
+ throw new Error(`dsh-cc-tui: agent preset "${resolved.id}" cannot compose a session (${resolved.broken}). `
25
+ + `Re-install the CC preset (dsh-cc, or bash scripts/sync-cc-preset.sh).`);
26
+ }
27
+ return {
28
+ agentPreset: resolved.id,
29
+ setup: async (agentCtx) => {
30
+ await presets.mount(agentCtx, resolved.id);
31
+ },
32
+ };
33
+ }
34
+ //# sourceMappingURL=preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset.js","sourceRoot":"","sources":["../../src/harness/preset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,cAAc,GAAG,IAAI,CAAA;AAe3B,oEAAoE;AACpE,MAAM,UAAU,QAAQ,CAAC,GAAY;IACnC,OAAO,GAAG,CAAC,GAAG,CAAC,cAAc,CAAiC,CAAA;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAY,EACZ,YAAoB,cAAc;IAElC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;IAC7B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,wEAAwE;cACpE,gFAAgF,CACrF,CAAA;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACjD,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,6BAA6B,QAAQ,CAAC,EAAE,+BAA+B,QAAQ,CAAC,MAAM,KAAK;cACvF,uEAAuE,CAC5E,CAAA;IACH,CAAC;IACD,OAAO;QACL,WAAW,EAAE,QAAQ,CAAC,EAAE;QACxB,KAAK,EAAE,KAAK,EAAE,QAAiB,EAAE,EAAE;YACjC,MAAM,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;QAC5C,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Pure session-list helpers for the /resume picker: last-activity sort,
3
+ * scope/query filtering, and row formatting. No imports — shared by the
4
+ * driver, the overlay renderer, and the specs.
5
+ * @module @dsh-cc/tui/harness/session-list
6
+ */
7
+ /** One persisted session as the picker sees it (persistence header + extras). */
8
+ export type SessionListEntry = {
9
+ id: string;
10
+ cwd?: string;
11
+ createdAt: number;
12
+ /** Durable-log mtime from the backend when observable; falls back to createdAt. */
13
+ updatedAtMs?: number;
14
+ /** Async-decorated session title; absent until the title read lands. */
15
+ title?: string;
16
+ /** Parent session id when this entry is a fork/child; omitted for top-level sessions. */
17
+ parentSession?: string;
18
+ };
19
+ /** Picker visibility scope: this project's cwd, or every project. */
20
+ export type SessionScope = 'cwd' | 'all';
21
+ /**
22
+ * Order sessions by last activity: `(updatedAtMs ?? createdAt)` descending,
23
+ * ties broken by createdAt then id (so the order is stable across reloads).
24
+ * Returns a new list; the input is untouched.
25
+ */
26
+ export declare function sortByActivity(entries: readonly SessionListEntry[]): SessionListEntry[];
27
+ /**
28
+ * Filter sessions for the picker: child/fork sessions (those with
29
+ * `parentSession`) are hidden unless they are the live session; cwd scope
30
+ * keeps only entries the `isMember` predicate accepts (the driver builds it
31
+ * from the session's *project* — sidecar index ∪ cwd-prefix heuristic — so
32
+ * worktree and subdirectory sessions of the same repo stay visible; a
33
+ * missing predicate disables the scope); then a non-empty query keeps
34
+ * entries whose title, id, or cwd contains it case-insensitively. Never
35
+ * re-sorts — the caller controls order.
36
+ */
37
+ export declare function filterSessions(entries: readonly SessionListEntry[], opts: {
38
+ scope: SessionScope;
39
+ query: string;
40
+ currentId?: string;
41
+ /** Project-membership predicate for cwd scope; absence disables the scope. */
42
+ isMember?: (entry: SessionListEntry) => boolean;
43
+ }): SessionListEntry[];
44
+ /** Short relative-time label for a session timestamp: "2m ago", "1h ago", "3d ago", or `M/D`. */
45
+ export declare function relativeDate(ts: number, now?: number): string;
46
+ /** First 8 chars of a session id — enough to distinguish in a short list. */
47
+ export declare function shortId(id: string): string;
48
+ /**
49
+ * Compute one picker row: relative time from last activity, the title (or
50
+ * short id when untitled), the 8-char short id, the cwd basename when the
51
+ * row should surface it (all-projects scope), and whether the entry is the
52
+ * session the user is currently in.
53
+ */
54
+ export declare function formatSessionRow(entry: SessionListEntry, opts: {
55
+ now: number;
56
+ currentId: string;
57
+ showCwd: boolean;
58
+ }): {
59
+ time: string;
60
+ label: string;
61
+ shortId: string;
62
+ cwdPart?: string;
63
+ current: boolean;
64
+ };
65
+ //# sourceMappingURL=session-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-list.d.ts","sourceRoot":"","sources":["../../src/harness/session-list.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iFAAiF;AACjF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yFAAyF;IACzF,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,qEAAqE;AACrE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,CAAA;AAExC;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAQvF;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,IAAI,EAAE;IACJ,KAAK,EAAE,YAAY,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,OAAO,CAAA;CAChD,GACA,gBAAgB,EAAE,CAiBpB;AAED,iGAAiG;AACjG,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAWzE;AAED,6EAA6E;AAC7E,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE1C;AAQD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAWtF"}