@deepseek-harness-tui/dsh-tui 0.15.0 → 0.16.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 (301) hide show
  1. package/README.md +92 -5
  2. package/guide/dsh-tui-guide/codex-backend.en.md +13 -3
  3. package/guide/dsh-tui-guide/codex-backend.md +9 -2
  4. package/guide/dsh-tui-guide/configuration.en.md +39 -2
  5. package/guide/dsh-tui-guide/configuration.md +34 -2
  6. package/guide/dsh-tui-guide/getting-started.en.md +15 -0
  7. package/guide/dsh-tui-guide/getting-started.md +15 -0
  8. package/guide/dsh-tui-guide/interaction.en.md +8 -1
  9. package/guide/dsh-tui-guide/interaction.md +8 -1
  10. package/guide/dsh-tui-guide/plugins.en.md +66 -5
  11. package/guide/dsh-tui-guide/plugins.md +37 -3
  12. package/guide/dsh-tui-guide/user-guide.en.md +3 -2
  13. package/guide/dsh-tui-guide/user-guide.md +3 -2
  14. package/lib/settings.json +1 -1
  15. package/lib/types/adapter/channel/projection.d.ts.map +1 -1
  16. package/lib/types/adapter/channel/projection.js +1 -0
  17. package/lib/types/adapter/channel/ui-policy.d.ts +1 -1
  18. package/lib/types/adapter/channel/ui-policy.d.ts.map +1 -1
  19. package/lib/types/adapter/channel/ui-policy.js +1 -0
  20. package/lib/types/adapter/ports/channel-catalog.d.ts +5 -1
  21. package/lib/types/adapter/ports/channel-catalog.d.ts.map +1 -1
  22. package/lib/types/adapter/ports/channel-settings.d.ts +5 -3
  23. package/lib/types/adapter/ports/channel-settings.d.ts.map +1 -1
  24. package/lib/types/adapter/ports/channel-ui.d.ts +7 -1
  25. package/lib/types/adapter/ports/channel-ui.d.ts.map +1 -1
  26. package/lib/types/adapter/ports/channel-view.d.ts +47 -0
  27. package/lib/types/adapter/ports/channel-view.d.ts.map +1 -1
  28. package/lib/types/adapter/ports/channel.d.ts +2 -0
  29. package/lib/types/adapter/ports/channel.d.ts.map +1 -1
  30. package/lib/types/agent/events.d.ts +3 -2
  31. package/lib/types/agent/events.d.ts.map +1 -1
  32. package/lib/types/backends/codex/contract.d.ts +3 -0
  33. package/lib/types/backends/codex/contract.d.ts.map +1 -1
  34. package/lib/types/backends/codex/contract.js +3 -0
  35. package/lib/types/backends/codex/session/async-questions.d.ts +17 -0
  36. package/lib/types/backends/codex/session/async-questions.d.ts.map +1 -0
  37. package/lib/types/backends/codex/session/async-questions.js +89 -0
  38. package/lib/types/backends/codex/session/session.d.ts.map +1 -1
  39. package/lib/types/backends/codex/session/session.js +35 -9
  40. package/lib/types/backends/codex/text.d.ts +3 -3
  41. package/lib/types/backends/codex/text.js +1 -1
  42. package/lib/types/backends/codex/translate/items.d.ts.map +1 -1
  43. package/lib/types/backends/codex/translate/items.js +3 -1
  44. package/lib/types/backends/codex/translate/question-reply.d.ts +11 -0
  45. package/lib/types/backends/codex/translate/question-reply.d.ts.map +1 -0
  46. package/lib/types/backends/codex/translate/question-reply.js +53 -0
  47. package/lib/types/channel/projection.d.ts.map +1 -1
  48. package/lib/types/channel/projection.js +10 -0
  49. package/lib/types/commands.d.ts +10 -0
  50. package/lib/types/commands.d.ts.map +1 -1
  51. package/lib/types/commands.js +11 -2
  52. package/lib/types/components/CommandSuggestions.d.ts.map +1 -1
  53. package/lib/types/components/CommandSuggestions.js +4 -1
  54. package/lib/types/components/LogoV2.d.ts +4 -1
  55. package/lib/types/components/LogoV2.d.ts.map +1 -1
  56. package/lib/types/components/LogoV2.js +5 -3
  57. package/lib/types/components/MessageList.d.ts.map +1 -1
  58. package/lib/types/components/MessageList.js +95 -14
  59. package/lib/types/components/PermissionsPicker.d.ts +10 -1
  60. package/lib/types/components/PermissionsPicker.d.ts.map +1 -1
  61. package/lib/types/components/PermissionsPicker.js +24 -16
  62. package/lib/types/components/PluginInstallPane.d.ts +21 -0
  63. package/lib/types/components/PluginInstallPane.d.ts.map +1 -0
  64. package/lib/types/components/PluginInstallPane.js +84 -0
  65. package/lib/types/components/PluginManagePane.d.ts +21 -0
  66. package/lib/types/components/PluginManagePane.d.ts.map +1 -0
  67. package/lib/types/components/PluginManagePane.js +69 -0
  68. package/lib/types/components/PromptInput.d.ts.map +1 -1
  69. package/lib/types/components/PromptInput.js +7 -3
  70. package/lib/types/components/SubagentCard.d.ts +13 -1
  71. package/lib/types/components/SubagentCard.d.ts.map +1 -1
  72. package/lib/types/components/SubagentCard.js +27 -12
  73. package/lib/types/components/SubagentDashboard.d.ts +8 -1
  74. package/lib/types/components/SubagentDashboard.d.ts.map +1 -1
  75. package/lib/types/components/SubagentDashboard.js +58 -16
  76. package/lib/types/components/launchpadLayout.d.ts +14 -1
  77. package/lib/types/components/launchpadLayout.d.ts.map +1 -1
  78. package/lib/types/components/launchpadLayout.js +36 -17
  79. package/lib/types/components/messages/TeamMessageBubble.d.ts +20 -0
  80. package/lib/types/components/messages/TeamMessageBubble.d.ts.map +1 -0
  81. package/lib/types/components/messages/TeamMessageBubble.js +15 -0
  82. package/lib/types/components/sidePanel/PanelHost.d.ts.map +1 -1
  83. package/lib/types/components/sidePanel/PanelHost.js +5 -1
  84. package/lib/types/components/sidePanel/PanelStore.d.ts +8 -0
  85. package/lib/types/components/sidePanel/PanelStore.d.ts.map +1 -1
  86. package/lib/types/components/sidePanel/PanelStore.js +11 -0
  87. package/lib/types/components/sidePanel/SidePanelColumn.d.ts.map +1 -1
  88. package/lib/types/components/sidePanel/SidePanelColumn.js +13 -1
  89. package/lib/types/components/sidePanel/SidePanelRuntimeContext.d.ts +7 -0
  90. package/lib/types/components/sidePanel/SidePanelRuntimeContext.d.ts.map +1 -1
  91. package/lib/types/components/sidePanel/SidePanelRuntimeContext.js +4 -0
  92. package/lib/types/components/sidePanel/btw/BtwComposer.d.ts +3 -0
  93. package/lib/types/components/sidePanel/btw/BtwComposer.d.ts.map +1 -1
  94. package/lib/types/components/sidePanel/btw/BtwComposer.js +20 -8
  95. package/lib/types/components/sidePanel/btw/BtwPanelAdapter.d.ts +2 -1
  96. package/lib/types/components/sidePanel/btw/BtwPanelAdapter.d.ts.map +1 -1
  97. package/lib/types/components/sidePanel/btw/BtwPanelAdapter.js +104 -13
  98. package/lib/types/components/sidePanel/btw/BtwThreadScene.d.ts +6 -2
  99. package/lib/types/components/sidePanel/btw/BtwThreadScene.d.ts.map +1 -1
  100. package/lib/types/components/sidePanel/btw/BtwThreadScene.js +61 -15
  101. package/lib/types/components/sidePanel/btw/BtwThreadView.d.ts +14 -4
  102. package/lib/types/components/sidePanel/btw/BtwThreadView.d.ts.map +1 -1
  103. package/lib/types/components/sidePanel/btw/BtwThreadView.js +90 -5
  104. package/lib/types/components/sidePanel/btw/threads.d.ts +18 -0
  105. package/lib/types/components/sidePanel/btw/threads.d.ts.map +1 -1
  106. package/lib/types/components/sidePanel/btw/threads.js +51 -0
  107. package/lib/types/components/sidePanel/builtinPanels.d.ts.map +1 -1
  108. package/lib/types/components/sidePanel/builtinPanels.js +5 -1
  109. package/lib/types/components/sidePanel/companion/SplashMascot.d.ts +5 -1
  110. package/lib/types/components/sidePanel/companion/SplashMascot.d.ts.map +1 -1
  111. package/lib/types/components/sidePanel/companion/SplashMascot.js +19 -4
  112. package/lib/types/components/sidePanel/companion/skins.d.ts +8 -0
  113. package/lib/types/components/sidePanel/companion/skins.d.ts.map +1 -1
  114. package/lib/types/components/sidePanel/companion/skins.js +57 -12
  115. package/lib/types/components/sidePanel/types.d.ts +6 -0
  116. package/lib/types/components/sidePanel/types.d.ts.map +1 -1
  117. package/lib/types/components/splashArtRows.d.ts +29 -0
  118. package/lib/types/components/splashArtRows.d.ts.map +1 -0
  119. package/lib/types/components/splashArtRows.js +31 -0
  120. package/lib/types/components/teamRoster.d.ts +70 -0
  121. package/lib/types/components/teamRoster.d.ts.map +1 -0
  122. package/lib/types/components/teamRoster.js +78 -0
  123. package/lib/types/dsh-adapter/admission-loader.d.ts +82 -0
  124. package/lib/types/dsh-adapter/admission-loader.d.ts.map +1 -1
  125. package/lib/types/dsh-adapter/admission-loader.js +73 -28
  126. package/lib/types/dsh-adapter/agent-view.d.ts.map +1 -1
  127. package/lib/types/dsh-adapter/agent-view.js +3 -1
  128. package/lib/types/dsh-adapter/approvals.d.ts +7 -0
  129. package/lib/types/dsh-adapter/approvals.d.ts.map +1 -1
  130. package/lib/types/dsh-adapter/approvals.js +45 -1
  131. package/lib/types/dsh-adapter/backend/translate.d.ts.map +1 -1
  132. package/lib/types/dsh-adapter/backend/translate.js +68 -8
  133. package/lib/types/dsh-adapter/backend-assembly.d.ts +31 -0
  134. package/lib/types/dsh-adapter/backend-assembly.d.ts.map +1 -0
  135. package/lib/types/dsh-adapter/backend-assembly.js +225 -0
  136. package/lib/types/dsh-adapter/backend-contribution.d.ts +36 -0
  137. package/lib/types/dsh-adapter/backend-contribution.d.ts.map +1 -1
  138. package/lib/types/dsh-adapter/backend-contribution.js +41 -0
  139. package/lib/types/dsh-adapter/backend-registry.d.ts.map +1 -1
  140. package/lib/types/dsh-adapter/backend-registry.js +22 -3
  141. package/lib/types/dsh-adapter/backends.d.ts.map +1 -1
  142. package/lib/types/dsh-adapter/backends.js +4 -5
  143. package/lib/types/dsh-adapter/bundled-presets.d.ts.map +1 -1
  144. package/lib/types/dsh-adapter/bundled-presets.js +60 -3
  145. package/lib/types/dsh-adapter/channel/binding-events.d.ts +1 -0
  146. package/lib/types/dsh-adapter/channel/binding-events.d.ts.map +1 -1
  147. package/lib/types/dsh-adapter/channel/binding-events.js +1 -0
  148. package/lib/types/dsh-adapter/channel/command-completions.d.ts.map +1 -1
  149. package/lib/types/dsh-adapter/channel/command-completions.js +64 -7
  150. package/lib/types/dsh-adapter/channel/compaction.d.ts +7 -2
  151. package/lib/types/dsh-adapter/channel/compaction.d.ts.map +1 -1
  152. package/lib/types/dsh-adapter/channel/compaction.js +100 -26
  153. package/lib/types/dsh-adapter/channel/core/binding-feed.d.ts +3 -0
  154. package/lib/types/dsh-adapter/channel/core/binding-feed.d.ts.map +1 -1
  155. package/lib/types/dsh-adapter/channel/core/binding-feed.js +2 -1
  156. package/lib/types/dsh-adapter/channel/core/compose.d.ts.map +1 -1
  157. package/lib/types/dsh-adapter/channel/core/compose.js +12 -0
  158. package/lib/types/dsh-adapter/channel/extensions.d.ts.map +1 -1
  159. package/lib/types/dsh-adapter/channel/extensions.js +68 -8
  160. package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts +6 -0
  161. package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts.map +1 -1
  162. package/lib/types/dsh-adapter/channel/mode-permission-actions.js +104 -12
  163. package/lib/types/dsh-adapter/channel/model-actions.d.ts.map +1 -1
  164. package/lib/types/dsh-adapter/channel/model-actions.js +8 -1
  165. package/lib/types/dsh-adapter/channel/permissions.d.ts.map +1 -1
  166. package/lib/types/dsh-adapter/channel/permissions.js +4 -1
  167. package/lib/types/dsh-adapter/channel/projection-helpers.d.ts.map +1 -1
  168. package/lib/types/dsh-adapter/channel/projection-helpers.js +2 -0
  169. package/lib/types/dsh-adapter/channel/session-metadata.d.ts.map +1 -1
  170. package/lib/types/dsh-adapter/channel/session-metadata.js +4 -3
  171. package/lib/types/dsh-adapter/channel/session-reset.js +2 -2
  172. package/lib/types/dsh-adapter/channel/session-resume.d.ts.map +1 -1
  173. package/lib/types/dsh-adapter/channel/session-resume.js +7 -0
  174. package/lib/types/dsh-adapter/channel/settings-host.d.ts +3 -0
  175. package/lib/types/dsh-adapter/channel/settings-host.d.ts.map +1 -1
  176. package/lib/types/dsh-adapter/channel/settings-host.js +135 -5
  177. package/lib/types/dsh-adapter/channel/state.d.ts +6 -0
  178. package/lib/types/dsh-adapter/channel/state.d.ts.map +1 -1
  179. package/lib/types/dsh-adapter/channel/subagent-projection.d.ts.map +1 -1
  180. package/lib/types/dsh-adapter/channel/subagent-projection.js +18 -6
  181. package/lib/types/dsh-adapter/channel/transcript.d.ts +7 -0
  182. package/lib/types/dsh-adapter/channel/transcript.d.ts.map +1 -1
  183. package/lib/types/dsh-adapter/channel/transcript.js +19 -2
  184. package/lib/types/dsh-adapter/compat/agent-team-0.2.0.d.ts +55 -0
  185. package/lib/types/dsh-adapter/compat/agent-team-0.2.0.d.ts.map +1 -0
  186. package/lib/types/dsh-adapter/compat/agent-team-0.2.0.js +96 -0
  187. package/lib/types/dsh-adapter/contract.d.ts +4 -4
  188. package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
  189. package/lib/types/dsh-adapter/contract.js +5 -5
  190. package/lib/types/dsh-adapter/effect-ledger.d.ts +7 -0
  191. package/lib/types/dsh-adapter/effect-ledger.d.ts.map +1 -1
  192. package/lib/types/dsh-adapter/effect-ledger.js +8 -1
  193. package/lib/types/dsh-adapter/entry-slot.d.ts +3 -1
  194. package/lib/types/dsh-adapter/entry-slot.d.ts.map +1 -1
  195. package/lib/types/dsh-adapter/entry-slot.js +2 -2
  196. package/lib/types/dsh-adapter/fresh-agent.d.ts.map +1 -1
  197. package/lib/types/dsh-adapter/fresh-agent.js +6 -1
  198. package/lib/types/dsh-adapter/host-access.d.ts.map +1 -1
  199. package/lib/types/dsh-adapter/host-access.js +95 -0
  200. package/lib/types/dsh-adapter/host-contract.d.ts +1 -1
  201. package/lib/types/dsh-adapter/host-contract.d.ts.map +1 -1
  202. package/lib/types/dsh-adapter/host-contract.js +3 -2
  203. package/lib/types/dsh-adapter/host-dsh.d.ts +8 -2
  204. package/lib/types/dsh-adapter/host-dsh.d.ts.map +1 -1
  205. package/lib/types/dsh-adapter/host-dsh.js +45 -30
  206. package/lib/types/dsh-adapter/host-entry.js +35 -10
  207. package/lib/types/dsh-adapter/index.d.ts +9 -10
  208. package/lib/types/dsh-adapter/index.d.ts.map +1 -1
  209. package/lib/types/dsh-adapter/index.js +8 -6
  210. package/lib/types/dsh-adapter/invariant.d.ts +7 -2
  211. package/lib/types/dsh-adapter/invariant.d.ts.map +1 -1
  212. package/lib/types/dsh-adapter/invariant.js +6 -3
  213. package/lib/types/dsh-adapter/migrate/index.js +2 -2
  214. package/lib/types/dsh-adapter/panels.d.ts.map +1 -1
  215. package/lib/types/dsh-adapter/panels.js +6 -0
  216. package/lib/types/dsh-adapter/plugin-declaration.d.ts +99 -1
  217. package/lib/types/dsh-adapter/plugin-declaration.d.ts.map +1 -1
  218. package/lib/types/dsh-adapter/plugin-declaration.js +132 -2
  219. package/lib/types/dsh-adapter/plugin-feed.d.ts +94 -0
  220. package/lib/types/dsh-adapter/plugin-feed.d.ts.map +1 -0
  221. package/lib/types/dsh-adapter/plugin-feed.js +135 -0
  222. package/lib/types/dsh-adapter/plugin-guard.d.ts +115 -0
  223. package/lib/types/dsh-adapter/plugin-guard.d.ts.map +1 -0
  224. package/lib/types/dsh-adapter/plugin-guard.js +108 -0
  225. package/lib/types/dsh-adapter/plugin-install.d.ts +160 -0
  226. package/lib/types/dsh-adapter/plugin-install.d.ts.map +1 -0
  227. package/lib/types/dsh-adapter/plugin-install.js +545 -0
  228. package/lib/types/dsh-adapter/plugin-manage.d.ts +178 -0
  229. package/lib/types/dsh-adapter/plugin-manage.d.ts.map +1 -0
  230. package/lib/types/dsh-adapter/plugin-manage.js +468 -0
  231. package/lib/types/dsh-adapter/plugin-manager.d.ts +78 -2
  232. package/lib/types/dsh-adapter/plugin-manager.d.ts.map +1 -1
  233. package/lib/types/dsh-adapter/plugin-manager.js +32 -0
  234. package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
  235. package/lib/types/dsh-adapter/plugin.js +49 -2
  236. package/lib/types/dsh-adapter/plugins-info.d.ts +87 -1
  237. package/lib/types/dsh-adapter/plugins-info.d.ts.map +1 -1
  238. package/lib/types/dsh-adapter/plugins-info.js +131 -26
  239. package/lib/types/dsh-adapter/process-exit.d.ts +1 -1
  240. package/lib/types/dsh-adapter/process-exit.d.ts.map +1 -1
  241. package/lib/types/dsh-adapter/process-exit.js +1 -1
  242. package/lib/types/dsh-adapter/session-projection-store.d.ts +66 -0
  243. package/lib/types/dsh-adapter/session-projection-store.d.ts.map +1 -0
  244. package/lib/types/dsh-adapter/session-projection-store.js +149 -0
  245. package/lib/types/dsh-adapter/settingsEditor.js +2 -2
  246. package/lib/types/dsh-adapter/sideQuestion.d.ts +21 -0
  247. package/lib/types/dsh-adapter/sideQuestion.d.ts.map +1 -1
  248. package/lib/types/dsh-adapter/sideQuestion.js +53 -0
  249. package/lib/types/dsh-adapter/subagents.d.ts.map +1 -1
  250. package/lib/types/dsh-adapter/subagents.js +2 -1
  251. package/lib/types/dsh-adapter/team-mode.d.ts +74 -0
  252. package/lib/types/dsh-adapter/team-mode.d.ts.map +1 -0
  253. package/lib/types/dsh-adapter/team-mode.js +188 -0
  254. package/lib/types/dsh-adapter/team-roster.d.ts +67 -0
  255. package/lib/types/dsh-adapter/team-roster.d.ts.map +1 -0
  256. package/lib/types/dsh-adapter/team-roster.js +136 -0
  257. package/lib/types/dsh-adapter/team-tools.d.ts +58 -0
  258. package/lib/types/dsh-adapter/team-tools.d.ts.map +1 -0
  259. package/lib/types/dsh-adapter/team-tools.js +208 -0
  260. package/lib/types/dsh-adapter/types.d.ts +1 -1
  261. package/lib/types/dsh-adapter/types.d.ts.map +1 -1
  262. package/lib/types/i18n.d.ts +607 -16
  263. package/lib/types/i18n.d.ts.map +1 -1
  264. package/lib/types/i18n.js +295 -9
  265. package/lib/types/ink/components/ScrollBox.d.ts +9 -0
  266. package/lib/types/ink/components/ScrollBox.d.ts.map +1 -1
  267. package/lib/types/ink/components/ScrollBox.js +23 -0
  268. package/lib/types/ink/dom.d.ts.map +1 -1
  269. package/lib/types/kernelPrefs.d.ts +1 -1
  270. package/lib/types/kernelPrefs.d.ts.map +1 -1
  271. package/lib/types/native-ts/yoga-layout/index.d.ts.map +1 -1
  272. package/lib/types/native-ts/yoga-layout/index.js +8 -1
  273. package/lib/types/permissionPresetLabels.d.ts +25 -0
  274. package/lib/types/permissionPresetLabels.d.ts.map +1 -0
  275. package/lib/types/permissionPresetLabels.js +33 -0
  276. package/lib/types/preset-patch.d.ts +22 -0
  277. package/lib/types/preset-patch.d.ts.map +1 -0
  278. package/lib/types/preset-patch.js +14 -0
  279. package/lib/types/screens/Chat.d.ts +33 -1
  280. package/lib/types/screens/Chat.d.ts.map +1 -1
  281. package/lib/types/screens/Chat.js +301 -9
  282. package/lib/types/screens/Launchpad.d.ts +7 -1
  283. package/lib/types/screens/Launchpad.d.ts.map +1 -1
  284. package/lib/types/screens/Launchpad.js +19 -4
  285. package/lib/types/screens/Settings.d.ts.map +1 -1
  286. package/lib/types/screens/Settings.js +1 -0
  287. package/lib/types/screens/chat/usePluginWriteFlow.d.ts +68 -0
  288. package/lib/types/screens/chat/usePluginWriteFlow.d.ts.map +1 -0
  289. package/lib/types/screens/chat/usePluginWriteFlow.js +92 -0
  290. package/lib/types/screens/chatOverlay.d.ts +19 -1
  291. package/lib/types/screens/chatOverlay.d.ts.map +1 -1
  292. package/lib/types/sessionModes.d.ts +5 -3
  293. package/lib/types/sessionModes.d.ts.map +1 -1
  294. package/lib/types/sessionModes.js +9 -3
  295. package/lib/types/tips.js +2 -2
  296. package/lib/types/utils/paths.d.ts +11 -0
  297. package/lib/types/utils/paths.d.ts.map +1 -1
  298. package/lib/types/utils/paths.js +13 -0
  299. package/package.json +126 -120
  300. package/tui-profile/feed/README.md +63 -0
  301. package/tui-profile/feed/first-party.json +10 -0
@@ -35,3 +35,44 @@ export function backendContributionOf(manifest) {
35
35
  ...(manifest.unloadExport === undefined ? {} : { unloadExport: manifest.unloadExport }),
36
36
  };
37
37
  }
38
+ /**
39
+ * The registry entry a **third-party** declaration becomes (D-1): the inverse of
40
+ * {@link backendContributionOf} on the fields both shapes carry.
41
+ *
42
+ * A contribution declares less than an in-tree manifest, and everything it cannot
43
+ * declare is fixed here rather than defaulted by the caller:
44
+ *
45
+ * - `inTree: false` — the one fact that flips the registry's rules (reserved ids,
46
+ * host label keys, `alwaysAvailable`, `nativeKey`, label sanitization). A
47
+ * contribution is exactly the non-in-tree case, so the projection says so
48
+ * instead of leaving a boolean for a caller to get wrong.
49
+ * - `label` is already the literal the spec requires; `label.kind === 'key'` is
50
+ * unreachable here (the spec has no such field, and `validateBackendSpec()`
51
+ * refuses it as an unknown field), so a declaration can never borrow this
52
+ * host's own vocabulary.
53
+ * - `alwaysAvailable` / `nativeKey` / `vendorPackages` / `backendExport` are
54
+ * **not** writable from a declaration and are therefore absent from the
55
+ * result: `registerBackend()` rejects an explicit `alwaysAvailable` /
56
+ * `nativeKey`, and the `backendExport` default (`'backend'`) is the registry's
57
+ * documented read of the module namespace, not a field to invent here.
58
+ * - `confirmation` stays behind: it is a request to the *install / enable* chain
59
+ * (`BACKEND_CONFIRMATION_POLICIES`), which reads the declaration, not the
60
+ * manifest. Dropping it here is what keeps one reading of it.
61
+ *
62
+ * Pure, like its counterpart: the same declaration projects to a deep-equal
63
+ * manifest every time, and the result is the value `registerBackend()` validates,
64
+ * admits and registers.
65
+ */
66
+ export function backendManifestOf(spec) {
67
+ return {
68
+ id: spec.id,
69
+ label: { kind: 'literal', text: spec.label.text },
70
+ shortLabel: spec.shortLabel,
71
+ ...(spec.product === undefined ? {} : { product: spec.product }),
72
+ capabilities: [...spec.capabilities],
73
+ grants: [...spec.grants],
74
+ ...(spec.install === undefined ? {} : { install: { ...spec.install } }),
75
+ ...(spec.unloadExport === undefined ? {} : { unloadExport: spec.unloadExport }),
76
+ inTree: false,
77
+ };
78
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"backend-registry.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/backend-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAKzG,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAE7E,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAKhF,OAAO,EAAE,iBAAiB,EAAE,CAAA;AA6C5B;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAA;IAC5B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAA;IAClC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAA;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CACvD;AA0CD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAgEzD;AAOD,uEAAuE;AACvE,wBAAgB,YAAY,IAAI,SAAS,iBAAiB,EAAE,CAE3D;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,IAAI,SAAS,iBAAiB,EAAE,CAElE;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB;;6CAEyC;IACzC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,IAAI,qBAAqB,CAkB7D;AAED,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAEpE;AAED;;sEAEsE;AACtE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE5E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,SAAS,CAI9E;AAED;;kBAEkB;AAClB,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAkB5E;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CASpD"}
1
+ {"version":3,"file":"backend-registry.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/backend-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAKzG,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAE7E,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAKhF,OAAO,EAAE,iBAAiB,EAAE,CAAA;AA6C5B;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAA;IAC5B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAA;IAClC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAA;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CACvD;AA0CD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAsEzD;AAOD,uEAAuE;AACvE,wBAAgB,YAAY,IAAI,SAAS,iBAAiB,EAAE,CAE3D;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,IAAI,SAAS,iBAAiB,EAAE,CAElE;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB;;6CAEyC;IACzC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,IAAI,qBAAqB,CAkB7D;AAED,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAEpE;AAED;;sEAEsE;AACtE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE5E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,SAAS,CAI9E;AAED;;kBAEkB;AAClB,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CA6B5E;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CASpD"}
@@ -1,7 +1,7 @@
1
1
  import { isBackendIdSyntax } from '../agent/backend-manifest.js';
2
2
  import { BACKEND_CAPABILITY_NAMES } from '../adapter/spec/backend-capabilities.js';
3
3
  import { EXPECTED_PERMISSIONS } from '../adapter/spec/protocol-constants.js';
4
- import { validateBackendSpec } from '../adapter/spec/tui-contributions.js';
4
+ import { assertBackendHandler, validateBackendSpec } from '../adapter/spec/tui-contributions.js';
5
5
  import { cleanRenderText } from '../channel/sanitize.js';
6
6
  import { BUILTIN_BACKEND_IDS } from '../kernelPrefs.js';
7
7
  import { logForDebugging } from '../utils/debug.js';
@@ -95,13 +95,19 @@ export function registerBackend(entry) {
95
95
  if (!isBackendIdSyntax(manifest.id)) {
96
96
  throw new Error(`${where} has an invalid id (lowercase letters, digits and dashes, at most 32 characters)`);
97
97
  }
98
- if (entries.has(manifest.id))
99
- throw new Error(`${where} is already registered`);
98
+ // The reserved check comes first on purpose (D-1). Every built-in id is seeded
99
+ // before any other caller can run, so an "is it taken?" test would answer for a
100
+ // plugin wearing `claude` too — and it would name the wrong reason: the id is
101
+ // not taken by a rival, it is one this host owns and no declaration may wear
102
+ // (`BACKEND_ID_RESERVED` in the family's contract). Registration is the last
103
+ // place that can still tell the two apart.
100
104
  if (!manifest.inTree && BUILTIN_BACKEND_IDS.includes(manifest.id)) {
101
105
  // `dsh` refs serialize without a prefix (`formatSessionRef`), so a plugin
102
106
  // wearing that id would collide with first-party references.
103
107
  throw new Error(`${where} is a reserved built-in id`);
104
108
  }
109
+ if (entries.has(manifest.id))
110
+ throw new Error(`${where} is already registered`);
105
111
  if (!manifest.inTree && manifest.label.kind === 'key') {
106
112
  // Otherwise a plugin could claim a first-party name: `t()` returns the text
107
113
  // of an existing key (`src/i18n.ts`), so the row would read "DeepSeek Harness".
@@ -244,6 +250,9 @@ export async function loadBackend(id) {
244
250
  const entry = entries.get(id);
245
251
  if (entry === undefined)
246
252
  throw new Error(`dsh-tui: backend "${id}" is not registered`);
253
+ if (entry.admission.decision === 'waiting_authorization') {
254
+ throw new Error(`dsh-tui: backend "${id}" cannot load: ${entry.admission.reasonCode} (${entry.admission.deniedPermissions.join(', ')})`);
255
+ }
247
256
  if (entry.load === undefined)
248
257
  throw new Error(`dsh-tui: backend "${id}" has no loader (only the DSH kernel is not an AgentBackend)`);
249
258
  const module = await entry.load();
@@ -260,6 +269,16 @@ export async function loadBackend(id) {
260
269
  const backend = module[exportName];
261
270
  if (backend === undefined)
262
271
  throw new Error(`dsh-tui: backend "${id}" does not export "${exportName}"`);
272
+ // Book the imported module's pool above even when its handler is invalid.
273
+ // No caller may prepare a session or data directory under another backend id.
274
+ try {
275
+ assertBackendHandler(backend);
276
+ }
277
+ catch (error) {
278
+ throw new Error(`dsh-tui: backend "${id}" has an invalid handler (${error instanceof Error ? error.message : String(error)})`, { cause: error });
279
+ }
280
+ if (backend.id !== id)
281
+ throw new Error(`dsh-tui: backend "${id}" exports a handler for ${JSON.stringify(backend.id)}`);
263
282
  return backend;
264
283
  }
265
284
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"backends.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/backends.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAyB,UAAU,EAAE,iBAAiB,EAAkC,MAAM,qBAAqB,CAAA;AAC1J,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAWlE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAW3E;AAID;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAqB1I;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE;IACtF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CACjC;;;;;;iBASyB,OAAO,CAAC;QAAE,OAAO,EAAE,YAAY,CAAC;QAAC,cAAc,EAAE,SAAS,UAAU,EAAE,CAAA;KAAE,CAAC;4BA2CvE,MAAM,QAAQ,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE;+BAC/C,MAAM;mBAClB,OAAO,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAA;KAAE,CAAC;GAG7E;AAED,oFAAoF;AACpF,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC;aAnDnF,YAAY;oBAAkB,SAAS,UAAU,EAAE;;;;;;iBAAtE,OAAO,CAAC;QAAE,OAAO,EAAE,YAAY,CAAC;QAAC,cAAc,EAAE,SAAS,UAAU,EAAE,CAAA;KAAE,CAAC;4BA2CvE,MAAM,QAAQ,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE;+BAC/C,MAAM;mBAClB,OAAO,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAA;KAAE,CAAC;GAS7E;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAenG"}
1
+ {"version":3,"file":"backends.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/backends.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAyB,UAAU,EAAE,iBAAiB,EAAkC,MAAM,qBAAqB,CAAA;AAC1J,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAWlE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAW3E;AAID;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAqB1I;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE;IACtF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CACjC;;;;;;iBASyB,OAAO,CAAC;QAAE,OAAO,EAAE,YAAY,CAAC;QAAC,cAAc,EAAE,SAAS,UAAU,EAAE,CAAA;KAAE,CAAC;4BA2CvE,MAAM,QAAQ,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE;+BAC/C,MAAM;mBAClB,OAAO,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAA;KAAE,CAAC;GAG7E;AAED,oFAAoF;AACpF,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC;aAnDnF,YAAY;oBAAkB,SAAS,UAAU,EAAE;;;;;;iBAAtE,OAAO,CAAC;QAAE,OAAO,EAAE,YAAY,CAAC;QAAC,cAAc,EAAE,SAAS,UAAU,EAAE,CAAA;KAAE,CAAC;4BA2CvE,MAAM,QAAQ,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE;+BAC/C,MAAM;mBAClB,OAAO,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAA;KAAE,CAAC;GAS7E;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAenG"}
@@ -1,13 +1,12 @@
1
- import { join } from 'node:path';
2
1
  import { formatSessionRef } from '../agent/refs.js';
3
- import { getBackend, listBackends, loadBackend } from './backend-registry.js';
2
+ import { getBackend, listOfferedBackends, loadBackend } from './backend-registry.js';
4
3
  import { reserveMount, reserveNewSession } from '../sessionMounts.js';
5
4
  import { resumeTargetFromArgv } from '../sessionHistory.js';
6
5
  import { mountFailureText } from '../sessions/resumeFailure.js';
7
6
  import { getLang } from '../i18n.js';
8
7
  import { installedTuiVersion } from '../update.js';
9
8
  import { logForDebugging } from '../utils/debug.js';
10
- import { DATA_DIR } from '../utils/paths.js';
9
+ import { backendDataDir } from '../utils/paths.js';
11
10
  import { installExecutor } from './install/executors.js';
12
11
  import { fileChannelTokens } from '../backends/shared/channel-tokens.js';
13
12
  /**
@@ -55,7 +54,7 @@ export async function createBackendHost(ctx, backendId, cwd, stderr) {
55
54
  const appVersion = installedTuiVersion();
56
55
  return {
57
56
  cwd,
58
- dataDir: join(DATA_DIR, 'backends', backendId),
57
+ dataDir: backendDataDir(backendId),
59
58
  locale: () => getLang(),
60
59
  ...(appVersion === undefined ? {} : { appVersion }),
61
60
  debug: message => logForDebugging(message),
@@ -152,7 +151,7 @@ export async function openBackendStartup(ctx, backend, input) {
152
151
  */
153
152
  export async function probeKernels(ctx, cwd) {
154
153
  const statuses = {};
155
- for (const entry of listBackends()) {
154
+ for (const entry of listOfferedBackends()) {
156
155
  if (entry.load === undefined)
157
156
  continue;
158
157
  // One host per entry: `dataDir` is backend-scoped, and a probe must not
@@ -1 +1 @@
1
- {"version":3,"file":"bundled-presets.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/bundled-presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAwClD;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CA0C3E"}
1
+ {"version":3,"file":"bundled-presets.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/bundled-presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAuFlD;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAoD3E"}
@@ -4,6 +4,9 @@ import { join } from 'node:path';
4
4
  import { pathToFileURL } from 'node:url';
5
5
  import { parse } from 'yaml';
6
6
  import { packagedPresetRoot } from './packaged-presets.js';
7
+ import { PRESET_PATCH_MODULE } from '../preset-patch.js';
8
+ /** Upstream presets copied into the roster by id; liangshen ships in this package. */
9
+ const UPSTREAM_PRESET_IDS = ['standard', 'ptc', 'minimal', 'cordis'];
7
10
  function declarativePresets(ctx) {
8
11
  const service = ctx.get('agentPresets');
9
12
  return service !== null && typeof service === 'object'
@@ -25,6 +28,49 @@ function readPresetPatch(path) {
25
28
  }
26
29
  throw new Error(`dsh-tui: invalid upstream preset declaration: ${path}`);
27
30
  }
31
+ /** Preset id → row id → replacement config, from preset-patch rows (src/preset-patch.ts). */
32
+ function presetPatches(ctx, loader) {
33
+ const patches = new Map();
34
+ for (const entry of loader?.entries() ?? []) {
35
+ if (entry.disabled || entry.options.name !== PRESET_PATCH_MODULE)
36
+ continue;
37
+ const config = entry.options.config;
38
+ const rows = config?.config;
39
+ if (typeof config?.preset !== 'string' || rows === null || typeof rows !== 'object' || Array.isArray(rows)) {
40
+ ctx.logger.warn('dsh-tui: ignoring a preset-patch row without `preset` and a `config` map');
41
+ continue;
42
+ }
43
+ const target = patches.get(config.preset) ?? new Map();
44
+ for (const [id, value] of Object.entries(rows))
45
+ target.set(id, value);
46
+ patches.set(config.preset, target);
47
+ }
48
+ return patches;
49
+ }
50
+ /** Copy an entry list with the named rows' `config` replaced, nested groups included. */
51
+ function withRowConfigs(rows, configs, matched) {
52
+ return rows.map((row) => {
53
+ const entry = row;
54
+ if (typeof entry.id === 'string' && configs.has(entry.id)) {
55
+ matched.add(entry.id);
56
+ return { ...row, config: configs.get(entry.id) };
57
+ }
58
+ if (entry.group === true && Array.isArray(entry.config))
59
+ return { ...row, config: withRowConfigs(entry.config, configs, matched) };
60
+ return row;
61
+ });
62
+ }
63
+ function patchDefinition(ctx, definition, configs) {
64
+ if (configs === undefined)
65
+ return definition;
66
+ const matched = new Set();
67
+ const plugins = withRowConfigs(definition.plugins, configs, matched);
68
+ for (const id of configs.keys()) {
69
+ if (!matched.has(id))
70
+ ctx.logger.warn(`dsh-tui: preset-patch row "${id}" not found in preset "${definition.id}"`);
71
+ }
72
+ return { ...definition, plugins };
73
+ }
28
74
  /**
29
75
  * 0.1.7 removed directory discovery. Consume the official bundle definitions
30
76
  * through its registry, without copying or reimplementing their tool sets.
@@ -51,13 +97,14 @@ export async function registerBundledPresets(ctx) {
51
97
  declared.add(config.id);
52
98
  }
53
99
  }
100
+ const patches = presetPatches(ctx, loader);
54
101
  const require = createRequire(ctx.baseUrl ?? import.meta.url);
55
- for (const id of ['standard', 'ptc', 'minimal', 'cordis']) {
102
+ for (const id of UPSTREAM_PRESET_IDS) {
56
103
  if (declared.has(id))
57
104
  continue;
58
105
  const path = require.resolve(`@deepseek-ai/dsh-web-app/presets/${id}.patch.yml`);
59
106
  const owner = ctx.extend({ baseUrl: pathToFileURL(path).href });
60
- const dispose = await declarativePresets(owner).register(readPresetPatch(path));
107
+ const dispose = await declarativePresets(owner).register(patchDefinition(ctx, readPresetPatch(path), patches.get(id)));
61
108
  ctx.effect(() => dispose);
62
109
  }
63
110
  if (!declared.has('liangshen')) {
@@ -71,10 +118,20 @@ export async function registerBundledPresets(ctx) {
71
118
  plugins: [{
72
119
  id: 'liangshen-plugins',
73
120
  name: '@deepseek-ai/cordis-plugin-include',
74
- config: { path: pathToFileURL(join(root, 'agent.cordis.yml')).href },
121
+ config: {
122
+ path: pathToFileURL(join(root, 'agent.cordis.yml')).href,
123
+ patches: [...patches.get('liangshen') ?? []].map(([id, config]) => ({ id, config })),
124
+ },
75
125
  }],
76
126
  });
77
127
  ctx.effect(() => dispose);
78
128
  }
129
+ // A typo in `preset` would otherwise be a silent no-op (row ids warn inside
130
+ // patchDefinition). Profile-declared presets are the profile's own seats.
131
+ for (const preset of patches.keys()) {
132
+ if (preset === 'liangshen' || UPSTREAM_PRESET_IDS.includes(preset) || declared.has(preset))
133
+ continue;
134
+ ctx.logger.warn(`dsh-tui: preset-patch row names a preset dsh-tui does not register: "${preset}"`);
135
+ }
79
136
  return true;
80
137
  }
@@ -32,6 +32,7 @@ export declare function createBindingEvents(ctx: Context, deps: {
32
32
  * session needs one baseline read to show its occupancy before the next
33
33
  * request reports usage. */
34
34
  seedContextOccupancy?(session: unknown): void;
35
+ seedTeam?(session: unknown): void;
35
36
  inputConvergence: InputConvergence;
36
37
  modelSelection: ReturnType<typeof createModelSelection>;
37
38
  modelActions: {
@@ -1 +1 @@
1
- {"version":3,"file":"binding-events.d.ts","sourceRoot":"","sources":["../../../../src/dsh-adapter/channel/binding-events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"binding-events.d.ts","sourceRoot":"","sources":["../../../../src/dsh-adapter/channel/binding-events.ts"],"names":[],"mappings":"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"}
@@ -99,6 +99,7 @@ export function createBindingEvents(ctx, deps) {
99
99
  onBind({ capture, current, register }) {
100
100
  deps.seedActivity?.(deps.binding.agent.session);
101
101
  deps.seedContextOccupancy?.(deps.binding.agent.session);
102
+ deps.seedTeam?.(deps.binding.agent.session);
102
103
  deps.modelSelection.bind(deps.binding.agent, { provider: deps.state.provider, model: deps.state.model });
103
104
  const selected = deps.modelSelection.selection.current;
104
105
  // A parked turn may not have logged its first selected request yet.
@@ -1 +1 @@
1
- {"version":3,"file":"command-completions.d.ts","sourceRoot":"","sources":["../../../../src/dsh-adapter/channel/command-completions.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8C,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAK1G,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,wFAAwF;AACxF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,KAAK,EAAE,MAAM,YAAY,CAAA;IACzB,SAAS,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;IACjD,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,qBAAqB,EAAE,CAAA;KAAE,CAAA;IACtF,iBAAiB,IAAI,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACnG;4EACwE;IACxE,UAAU,CAAC,IAAI,SAAS,MAAM,EAAE,GAAG,SAAS,CAAA;IAC5C,yEAAyE;IACzE,MAAM,CAAC,EAAE;QACP,eAAe,IAAI,IAAI,CAAA;QACvB,WAAW,IAAI,SAAS,qBAAqB,EAAE,CAAA;KAChD,CAAA;IACD,KAAK,EAAE;QACL,cAAc,IAAI,IAAI,CAAA;QACtB,UAAU,IAAI,SAAS,qBAAqB,EAAE,CAAA;QAC9C,iBAAiB,IAAI,IAAI,CAAA;QACzB,aAAa,IAAI,SAAS;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,OAAO,CAAA;SAAE,EAAE,CAAA;QACpG,gBAAgB,IAAI,IAAI,CAAA;KACzB,CAAA;CACF,IAES,OAAO,MAAM,qDAsHtB"}
1
+ {"version":3,"file":"command-completions.d.ts","sourceRoot":"","sources":["../../../../src/dsh-adapter/channel/command-completions.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8C,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAM1G,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAmC9C,wFAAwF;AACxF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,KAAK,EAAE,MAAM,YAAY,CAAA;IACzB,SAAS,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;IACjD,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,qBAAqB,EAAE,CAAA;KAAE,CAAA;IACtF,iBAAiB,IAAI,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACnG;4EACwE;IACxE,UAAU,CAAC,IAAI,SAAS,MAAM,EAAE,GAAG,SAAS,CAAA;IAC5C,yEAAyE;IACzE,MAAM,CAAC,EAAE;QACP,eAAe,IAAI,IAAI,CAAA;QACvB,WAAW,IAAI,SAAS,qBAAqB,EAAE,CAAA;KAChD,CAAA;IACD,KAAK,EAAE;QACL,cAAc,IAAI,IAAI,CAAA;QACtB,UAAU,IAAI,SAAS,qBAAqB,EAAE,CAAA;QAC9C,iBAAiB,IAAI,IAAI,CAAA;QACzB,aAAa,IAAI,SAAS;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,OAAO,CAAA;SAAE,EAAE,CAAA;QACpG,gBAAgB,IAAI,IAAI,CAAA;KACzB,CAAA;CACF,IAES,OAAO,MAAM,qDAiJtB"}
@@ -1,10 +1,38 @@
1
1
  import { completeCommands, isCommandCompletionToken } from '../../commands.js';
2
2
  import { getSidePanelPanels, parseSidePanelIds } from '../../tuiDisplayPrefs.js';
3
3
  import { SESSION_COLOR_NAMES } from '../../terminal-utils/sessionColors.js';
4
- import { getLang, LANGS } from '../../i18n.js';
4
+ import { getLang, LANGS, t } from '../../i18n.js';
5
+ import { PERMISSION_PRESET_AUTO, permissionPresetKeys } from '../../permissionPresetLabels.js';
5
6
  import { AUTO_THEME_NAME } from '../../theme.js';
6
7
  import { listThemeCatalog } from '../../themeCatalog.js';
7
8
  import { PRESET_NAMES } from '../../components/activityFrames.js';
9
+ /**
10
+ * What a `/plugin install | info` spec may name — the same three shapes the
11
+ * README lists, in the same order. A path and a git URL cannot be enumerated,
12
+ * and `info` also takes a spec for a bundle that is not installed yet, so these
13
+ * are shown as example rows rather than discovered candidates.
14
+ */
15
+ const PLUGIN_SPEC_EXAMPLES = [
16
+ { spec: '/path/to/repo', description: 'Example: a local directory', descriptionKey: 'sugg-plugin-spec-path-desc' },
17
+ { spec: 'https://github.com/exam/ple.git', description: 'Example: a git URL', descriptionKey: 'sugg-plugin-spec-git-desc' },
18
+ { spec: '@scope/package@1.2.3', description: 'Example: a registry package, @version pins it', descriptionKey: 'sugg-plugin-spec-package-desc' },
19
+ ];
20
+ /**
21
+ * The spec shapes as completion rows for one `/plugin` form. They carry
22
+ * `example` (`CommandCompletionNode`): Tab hands the draft back untouched and
23
+ * Enter submits the draft as typed — the bare subcommand at the empty argument
24
+ * position (its usage line), and the typed spec once there is one. A placeholder
25
+ * spec can therefore neither be written into the draft nor installed by picking
26
+ * its row, and a real spec that only starts like one is not swallowed.
27
+ */
28
+ function pluginSpecExamples() {
29
+ return PLUGIN_SPEC_EXAMPLES.map(shape => ({
30
+ name: shape.spec,
31
+ description: shape.description,
32
+ descriptionKey: shape.descriptionKey,
33
+ example: true,
34
+ }));
35
+ }
8
36
  /** Owns slash completion composition and cache warming; it has no lifecycle effects. */
9
37
  export function createCommandCompletions(deps) {
10
38
  const { themeHost, commandTrees, workspaceCommands, model } = deps;
@@ -58,6 +86,12 @@ export function createCommandCompletions(deps) {
58
86
  model.warmPresetOptions();
59
87
  return [{ name: 'status', description: 'Show the current agent preset', descriptionKey: 'sugg-status-desc' }, ...model.presetOptions().map(preset => ({ name: preset.id, description: preset.description ?? preset.name ?? preset.id, ...(preset.id === state.agentPreset ? { tag: 'current' } : preset.isDefault ? { tag: 'default' } : {}) }))];
60
88
  }
89
+ if (path.length === 1 && path[0] === 'team')
90
+ return [
91
+ { name: 'status', description: 'Show the team mode state', descriptionKey: 'sugg-status-desc' },
92
+ { name: 'on', description: 'Switch Agent Teams on', descriptionKey: 'sugg-team-on-desc' },
93
+ { name: 'off', description: 'Switch Agent Teams off', descriptionKey: 'sugg-team-off-desc' },
94
+ ];
61
95
  if (path.length === 1 && path[0] === 'activity')
62
96
  return [
63
97
  { name: 'status', description: 'Show the current activity preset', descriptionKey: 'sugg-status-desc' },
@@ -81,11 +115,16 @@ export function createCommandCompletions(deps) {
81
115
  if (path.length === 1 && path[0] === 'permission') {
82
116
  const snapshot = state.permissionPresets();
83
117
  if (snapshot.options.length > 0) {
84
- return snapshot.options.filter(option => isCommandCompletionToken(option.value)).map(option => ({
85
- name: option.value, description: option.description ?? option.name,
86
- ...(option.value === 'read-only' ? { descriptionKey: 'permission-preset-readonly-desc' } : option.value === 'workspace-write' ? { descriptionKey: 'permission-preset-workspace-write-desc' } : option.value === 'danger-full-access' ? { descriptionKey: 'permission-preset-full-access-desc' } : {}),
87
- ...(snapshot.current?.kind === 'preset' && snapshot.current.value === option.value ? { tag: 'current' } : {}),
88
- }));
118
+ return snapshot.options.filter(option => isCommandCompletionToken(option.value)).map((option) => {
119
+ const keys = permissionPresetKeys(option);
120
+ return {
121
+ name: option.value, description: option.description ?? option.name,
122
+ ...(keys === undefined ? {} : { descriptionKey: keys.description }),
123
+ ...(snapshot.current?.kind === 'preset' && snapshot.current.value === option.value
124
+ ? { tag: 'current' }
125
+ : option.value === PERMISSION_PRESET_AUTO ? { tag: t('permission-preset-exp-tag') } : {}),
126
+ };
127
+ });
89
128
  }
90
129
  // No preset roster (a non-DSH backend): the typed `modes` capability
91
130
  // is the roster. DSH sessions declare no such capability, so this
@@ -134,13 +173,31 @@ export function createCommandCompletions(deps) {
134
173
  return [
135
174
  { name: 'list', description: 'List the plugins this profile added', descriptionKey: 'sugg-plugin-list-desc' },
136
175
  { name: 'info', description: 'Describe an installed plugin or an install spec', descriptionKey: 'sugg-plugin-info-desc' },
176
+ { name: 'install', description: 'Install a plugin bundle into this profile', descriptionKey: 'sugg-plugin-install-desc' },
177
+ { name: 'remove', description: 'Uninstall a plugin bundle from this profile', descriptionKey: 'sugg-plugin-remove-desc' },
178
+ { name: 'disable', description: 'Switch a plugin bundle or row off', descriptionKey: 'sugg-plugin-disable-desc' },
179
+ { name: 'enable', description: 'Switch a plugin bundle or row back on', descriptionKey: 'sugg-plugin-enable-desc' },
137
180
  { name: 'registries', description: 'Show where installations ask', descriptionKey: 'sugg-plugin-registries-desc' },
138
181
  { name: 'check', description: 'Validate a plugin manifest without installing it', descriptionKey: 'sugg-plugin-check-desc' },
139
182
  ];
140
- if (path.length === 2 && path[0] === 'plugin' && path[1] === 'info') {
183
+ // `/plugin install <spec>` takes a spec nothing local can enumerate, so
184
+ // its argument position shows the shapes it accepts (`pluginSpecExamples`).
185
+ if (path.length === 2 && path[0] === 'plugin' && path[1] === 'install')
186
+ return pluginSpecExamples();
187
+ // The three lifecycle forms take the same installed list as `info`: what
188
+ // they act on is what the profile holds, and an absent service answers an
189
+ // empty list rather than a throw.
190
+ if (path.length === 2 && path[0] === 'plugin'
191
+ && (path[1] === 'remove' || path[1] === 'enable' || path[1] === 'disable')) {
141
192
  deps.plugin?.warmPluginNames();
142
193
  return deps.plugin?.pluginNames() ?? [];
143
194
  }
195
+ // `info` reads an installed bundle OR a spec about to be installed, so it
196
+ // offers both: what the profile holds first, then the spec shapes.
197
+ if (path.length === 2 && path[0] === 'plugin' && path[1] === 'info') {
198
+ deps.plugin?.warmPluginNames();
199
+ return [...(deps.plugin?.pluginNames() ?? []), ...pluginSpecExamples()];
200
+ }
144
201
  return commandTrees?.children(path) ?? [];
145
202
  });
146
203
  };
@@ -2,9 +2,12 @@ import type { Agent } from '@deepseek-ai/dsh-agent';
2
2
  import type { Context } from '@deepseek-ai/cordis';
3
3
  import type { ChannelOwner } from './owner.js';
4
4
  import type { ChannelState } from './types.js';
5
- type CompactionState = Pick<ChannelState, 'agentId' | 'cwd' | 'working' | 'compaction' | 'emit'>;
5
+ type CompactionState = Pick<ChannelState, 'agentId' | 'cwd' | 'working' | 'compaction' | 'emit' | 'emitStream'>;
6
6
  type Notify = ChannelState['notify'];
7
- /** Owns the one manual compaction transaction that must settle before a switch. */
7
+ /** One manual compaction transaction per live agent, including agents parked
8
+ * by `/bg`. `settle` aborts the transaction of the FOREGROUND binding — the
9
+ * session a switch is leaving — so returning to a compacting background session
10
+ * keeps it running while navigating to a different one still settles it. */
8
11
  export declare function createManualCompaction(ctx: Context, state: CompactionState, deps: {
9
12
  owner: Pick<ChannelOwner, 'current' | 'signal' | 'own'>;
10
13
  agent(): Agent;
@@ -14,6 +17,8 @@ export declare function createManualCompaction(ctx: Context, state: CompactionSt
14
17
  compact: () => void;
15
18
  settle: () => Promise<void>;
16
19
  cancel: () => void;
20
+ restore: () => void;
21
+ ownsProgress: () => boolean;
17
22
  };
18
23
  export {};
19
24
  //# sourceMappingURL=compaction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../../src/dsh-adapter/channel/compaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAO9C,KAAK,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,KAAK,GAAG,SAAS,GAAG,YAAY,GAAG,MAAM,CAAC,CAAA;AAChG,KAAK,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;AAEpC,mFAAmF;AACnF,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE;IACJ,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC,CAAA;IACvD,KAAK,IAAI,KAAK,CAAA;IACd,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IACrE,MAAM,EAAE,MAAM,CAAA;CACf;mBA0BmB,IAAI;kBAlBC,OAAO,CAAC,IAAI,CAAC;kBA4HnB,IAAI;EAQxB"}
1
+ {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../../src/dsh-adapter/channel/compaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAS9C,KAAK,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,KAAK,GAAG,SAAS,GAAG,YAAY,GAAG,MAAM,GAAG,YAAY,CAAC,CAAA;AAC/G,KAAK,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;AAEpC;;;4EAG4E;AAC5E,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE;IACJ,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC,CAAA;IACvD,KAAK,IAAI,KAAK,CAAA;IACd,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IACrE,MAAM,EAAE,MAAM,CAAA;CACf;mBAkCmB,IAAI;kBAnBC,OAAO,CAAC,IAAI,CAAC;kBAuKnB,IAAI;mBAQH,IAAI;;EAQzB"}