@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,256 @@
1
+ /**
2
+ * Slash-command catalog + subagent lifecycle listeners extracted from
3
+ * harness/driver.ts. Free-function collaborator: takes a
4
+ * {@link DriverCatalogCtx} instead of closing over createDriver's locals, so
5
+ * the harness factory stays out of this leaf.
6
+ *
7
+ * The catalog merges four sources with command-name precedence:
8
+ * TUI-local commands, the harness command registry (`ctx.commands`), the
9
+ * optional cc-shell plugin-command service (`ctx.ccPlugins`, colon-form
10
+ * `plugin:command` names), and user-invocable skills (`ctx.skills.snapshot()`). Skill names are duck-typed
11
+ * against upstream `SkillRegistry.snapshot` — the TUI never imports
12
+ * `@deepseek-ai/dsh-skill`; skills are optional and a missing service only
13
+ * leaves the skill half empty. Publishing a new catalog array emits the
14
+ * current state so root.ts's reference-equality guard rebuilds the
15
+ * autocomplete provider.
16
+ *
17
+ * @module @dsh-cc/tui/harness/driver-catalog
18
+ */
19
+ import { upsertSubagent } from "../store.js";
20
+ import { LOCAL_COMMANDS, setPluginSlashNames } from "../slash.js";
21
+ /**
22
+ * Build the slash-command catalog section: merges LOCAL_COMMANDS with the
23
+ * harness registry and user-invocable skills, subscribes to
24
+ * `commands/change` / `skills/change` and subagent lifecycle events. The
25
+ * cached array identity stays stable between refreshes so root.ts can detect
26
+ * a change by reference equality and rebuild the autocomplete provider only
27
+ * when needed.
28
+ */
29
+ export function createCatalogSection(rt) {
30
+ const commandsService = rt.ctx.get('commands');
31
+ const skillsService = rt.ctx.get('skills');
32
+ // NOTE: unlike `commands`/`skills` (provided by the host composition before
33
+ // the TUI driver mounts), `ccPlugins` is published by the cc-shell bundle's
34
+ // own fiber (`root.provide('ccPlugins', this)` in CcPluginsService), and
35
+ // bundle assembly order is not guaranteed relative to the driver — so the
36
+ // service MUST be resolved live at every refresh, never captured here.
37
+ let commandCatalog = [];
38
+ // Last-good user-invocable skill entries (already filtered/prefixed at
39
+ // snapshot time). Retained across incomplete or thrown snapshots.
40
+ let skillEntries = [];
41
+ // Generation token for in-flight skill snapshots: only the latest
42
+ // generation may publish, so overlapping snapshots are latest-wins.
43
+ let generation = 0;
44
+ const buildMerged = () => {
45
+ const localNames = new Set(LOCAL_COMMANDS.map(c => c.name));
46
+ // Live lookup each refresh: the cc-shell bundle may publish the service
47
+ // after the driver mounted (see the note at the top of this function).
48
+ const pluginService = rt.ctx.get('ccPlugins');
49
+ const merged = LOCAL_COMMANDS.map(c => ({
50
+ name: c.name,
51
+ description: c.description,
52
+ ...c.argumentHint === undefined ? {} : { argumentHint: c.argumentHint },
53
+ }));
54
+ if (commandsService !== undefined) {
55
+ try {
56
+ const harnessList = commandsService.list(rt.current.agent);
57
+ for (const cmd of harnessList) {
58
+ if (localNames.has(cmd.name))
59
+ continue; // local wins, dedupe
60
+ merged.push({
61
+ name: cmd.name,
62
+ ...cmd.description === undefined ? {} : { description: cmd.description },
63
+ ...cmd.input?.hint === undefined ? {} : { argumentHint: cmd.input.hint },
64
+ });
65
+ }
66
+ }
67
+ catch {
68
+ // A failing list() degrades to local-only; don't poison the catalog.
69
+ }
70
+ }
71
+ // Plugin commands (colon form `plugin:command`) merge after the harness
72
+ // registry with the same precedence discipline: a name already claimed by
73
+ // a local or harness command resolves to the earlier source. The names
74
+ // are also published to slash.ts so parseSlash can classify a typed
75
+ // `plugin:command` line as local (and unknown colon names keep the
76
+ // harness fall-through).
77
+ if (pluginService !== undefined) {
78
+ try {
79
+ const used = new Set(merged.map(c => c.name));
80
+ const pluginNames = [];
81
+ for (const cmd of pluginService.listPluginCommands()) {
82
+ pluginNames.push(cmd.name);
83
+ if (used.has(cmd.name))
84
+ continue;
85
+ used.add(cmd.name);
86
+ merged.push({
87
+ name: cmd.name,
88
+ description: cmd.description,
89
+ ...cmd.argumentHint === undefined ? {} : { argumentHint: cmd.argumentHint },
90
+ });
91
+ }
92
+ setPluginSlashNames(pluginNames);
93
+ }
94
+ catch {
95
+ // A failing listPluginCommands() keeps the last-good table.
96
+ }
97
+ }
98
+ else {
99
+ setPluginSlashNames([]);
100
+ }
101
+ // Skills come last; a name already claimed by a local or harness command
102
+ // resolves to the command (web adjudication precedence).
103
+ const used = new Set(merged.map(c => c.name));
104
+ for (const skill of skillEntries) {
105
+ if (used.has(skill.name))
106
+ continue;
107
+ used.add(skill.name);
108
+ merged.push(skill);
109
+ }
110
+ return merged;
111
+ };
112
+ const publish = () => {
113
+ commandCatalog = buildMerged();
114
+ // Notify subscribers so root.ts compares the new catalog identity and
115
+ // rebuilds the autocomplete provider (skills arrive asynchronously, so
116
+ // the refresh must ride an emit, not just the next state change).
117
+ rt.emit(rt.state());
118
+ };
119
+ const refreshSkillsSnapshot = () => {
120
+ if (skillsService === undefined)
121
+ return;
122
+ const gen = ++generation;
123
+ const agent = rt.current.agent;
124
+ // cwd and scope are read from the LIVE agent at refresh time — never a
125
+ // captured boot cwd (switchSession rebinds `current` in place).
126
+ // exactOptionalPropertyTypes: omit cwd when the header has none; do not
127
+ // pass `undefined` into `{ cwd?: string }`.
128
+ const cwd = agent.session.header.cwd;
129
+ void skillsService.snapshot({
130
+ ...cwd === undefined ? {} : { cwd },
131
+ scope: agent,
132
+ })
133
+ .then(obs => {
134
+ if (gen !== generation)
135
+ return; // superseded by a newer refresh
136
+ if (!obs.complete)
137
+ return; // incomplete: retain last-good entries
138
+ skillEntries = obs.skills
139
+ .filter(skill => skill.invocation.userInvocable === true)
140
+ .map(skill => ({
141
+ name: skill.name,
142
+ description: skill.invocation.modelInvocable === false
143
+ ? `user-only · ${skill.description}`
144
+ : skill.description,
145
+ }));
146
+ publish();
147
+ })
148
+ .catch(() => {
149
+ // A rejected snapshot keeps the last-good skill entries; nothing to
150
+ // publish and nothing to surface — the next skills/change retries.
151
+ });
152
+ };
153
+ /**
154
+ * Rebuild the full catalog for the current agent: commands synchronously
155
+ * (including current skillEntries), skills via a fresh snapshot. Called at
156
+ * boot, on commands/change and skills/change, and after a session switch.
157
+ */
158
+ const refreshCatalog = () => {
159
+ publish();
160
+ refreshSkillsSnapshot();
161
+ };
162
+ refreshCatalog();
163
+ if (commandsService !== undefined) {
164
+ // `commands/change` is declared via module augmentation in
165
+ // @deepseek-ai/dsh-commands, but the tui package doesn't import that
166
+ // package directly, so the augmentation isn't in tsc's view here. The
167
+ // event exists at runtime (the commands service dispatches it on
168
+ // register/unregister); cast through the Events map to subscribe without
169
+ // pulling a new dep into the type graph.
170
+ const changeEvent = 'commands/change';
171
+ rt.ctx.on(changeEvent, () => {
172
+ refreshCatalog();
173
+ });
174
+ }
175
+ if (skillsService !== undefined) {
176
+ // `skills/change` — same cast pattern; declared in @deepseek-ai/dsh-skill.
177
+ const skillChangeEvent = 'skills/change';
178
+ rt.ctx.on(skillChangeEvent, () => {
179
+ refreshCatalog();
180
+ });
181
+ }
182
+ // `ccPlugins/change` — unconditional (the cordis event bus is shared, so
183
+ // subscribing does not require the service to exist yet): this is what lets
184
+ // the catalog pick up a ccPlugins service that the cc-shell bundle publishes
185
+ // AFTER the driver mounted. Same cast pattern; the event is declared in
186
+ // cc-shell.
187
+ const pluginChangeEvent = 'ccPlugins/change';
188
+ rt.ctx.on(pluginChangeEvent, () => {
189
+ refreshCatalog();
190
+ });
191
+ // Subagent lifecycle: `subagent/start`|`subagent/end` are global,
192
+ // process-scoped observe-only snapshots paired by `runId` (declared via
193
+ // module augmentation in @deepseek-ai/subagent, which tui doesn't import).
194
+ // Same cast pattern as `commands/change` above. Tracking is event-only —
195
+ // no `SubagentRuntime.listChildren` call — so the driver stays
196
+ // composition-agnostic (tool-cordis may be absent). Events are NOT
197
+ // session-filtered: per-session parentage isn't on the payload, so the
198
+ // list tracks all runs observed this process; `/agents` labels it
199
+ // accordingly and does not overclaim parentage.
200
+ const subagentStart = 'subagent/start';
201
+ const subagentEnd = 'subagent/end';
202
+ /**
203
+ * Probe whether a child session is continuable: duck-typed peek at
204
+ * `rt.ctx.agents.get(id)` — the child session's events carry a
205
+ * `subagent/descriptor` event with `data.mode === 'continuable'`. Missing
206
+ * agent, missing `get`, or no such event → not resumable (fail closed).
207
+ * Kept local and tiny; no new module.
208
+ */
209
+ const probeResumable = (id) => {
210
+ const child = rt.ctx.agents
211
+ ?.get?.(String(id));
212
+ if (child === undefined)
213
+ return false;
214
+ return child.session?.events?.some(event => event.type === 'subagent/descriptor'
215
+ && event.data?.mode === 'continuable') === true;
216
+ };
217
+ rt.ctx.on(subagentStart, (info) => {
218
+ const sessionId = String(info.id);
219
+ const resumable = probeResumable(sessionId);
220
+ rt.emit(upsertSubagent(rt.state(), {
221
+ runId: String(info.runId),
222
+ provider: String(info.provider),
223
+ sessionId,
224
+ status: 'running',
225
+ ...(resumable ? { resumable: true } : {}),
226
+ }));
227
+ });
228
+ rt.ctx.on(subagentEnd, (info) => {
229
+ const runId = String(info.runId);
230
+ const sessionId = String(info.id);
231
+ // A parked run keeps `resumable: true` so a later cold-resume start for
232
+ // the same sessionId still matches by sessionId. `stopReason` is only
233
+ // meaningful on done — the `[completed]` render would read as a crash.
234
+ const existing = rt.state().subagents.find(run => run.runId === runId || run.sessionId === sessionId);
235
+ const resumable = existing?.resumable === true || probeResumable(sessionId);
236
+ const parked = resumable;
237
+ const view = {
238
+ runId,
239
+ provider: String(info.provider),
240
+ sessionId,
241
+ status: parked ? 'parked' : 'done',
242
+ ...(parked ? { resumable: true } : {}),
243
+ ...(parked || info.stopReason === undefined ? {} : { stopReason: String(info.stopReason) }),
244
+ };
245
+ rt.emit(upsertSubagent(rt.state(), view));
246
+ });
247
+ return {
248
+ listCommands() {
249
+ return commandCatalog;
250
+ },
251
+ refreshCatalog() {
252
+ refreshCatalog();
253
+ },
254
+ };
255
+ }
256
+ //# sourceMappingURL=driver-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-catalog.js","sourceRoot":"","sources":["../../src/harness/driver-catalog.ts"],"names":[],"mappings":"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"}