@deepseek-harness-tui/dsh-tui 0.8.8 → 0.9.1

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 (467) hide show
  1. package/README.md +60 -238
  2. package/bin/dsh-tui.js +172 -5
  3. package/cordis.patch.yml +16 -4
  4. package/dsh-ecosystem-spec/protocols/profile-definitions.d.ts +13 -13
  5. package/dsh-ecosystem-spec/protocols/profile-definitions.js +59 -59
  6. package/dsh-ecosystem-spec/protocols/tui-channel-http.d.ts +15 -15
  7. package/dsh-ecosystem-spec/protocols/tui-channel-http.js +32 -32
  8. package/dsh-ecosystem-spec/protocols/tui-channel.d.ts +59 -59
  9. package/dsh-ecosystem-spec/protocols/tui-channel.js +166 -166
  10. package/dsh-ecosystem-spec/protocols/tui-contributions.d.ts +42 -42
  11. package/dsh-ecosystem-spec/protocols/tui-contributions.js +143 -143
  12. package/dsh-ecosystem-spec/registry/README.md +14 -14
  13. package/dsh-ecosystem-spec/registry/host-descriptor.tui.example.json +56 -56
  14. package/dsh-ecosystem-spec/registry/permissions-0.1.json +13 -13
  15. package/dsh-ecosystem-spec/registry/registry-0.15.json +149 -149
  16. package/lib/types/cc/hyperlink.d.ts +7 -1
  17. package/lib/types/cc/hyperlink.d.ts.map +1 -1
  18. package/lib/types/cc/hyperlink.js +3 -2
  19. package/lib/types/cc/markdown.d.ts.map +1 -1
  20. package/lib/types/cc/markdown.js +33 -3
  21. package/lib/types/cc/sessionColors.d.ts +27 -0
  22. package/lib/types/cc/sessionColors.d.ts.map +1 -0
  23. package/lib/types/cc/sessionColors.js +39 -0
  24. package/lib/types/commands.d.ts.map +1 -1
  25. package/lib/types/commands.js +10 -2
  26. package/lib/types/components/ActivityPicker.d.ts +4 -1
  27. package/lib/types/components/ActivityPicker.d.ts.map +1 -1
  28. package/lib/types/components/ActivityPicker.js +2 -2
  29. package/lib/types/components/AutoRecapRow.d.ts +23 -0
  30. package/lib/types/components/AutoRecapRow.d.ts.map +1 -0
  31. package/lib/types/components/AutoRecapRow.js +23 -0
  32. package/lib/types/components/BtwPanel.d.ts.map +1 -1
  33. package/lib/types/components/BtwPanel.js +1 -1
  34. package/lib/types/components/Chat/SubagentMessage.d.ts +2 -1
  35. package/lib/types/components/Chat/SubagentMessage.d.ts.map +1 -1
  36. package/lib/types/components/Chat/SubagentMessage.js +11 -3
  37. package/lib/types/components/ColorPicker.d.ts +17 -0
  38. package/lib/types/components/ColorPicker.d.ts.map +1 -0
  39. package/lib/types/components/ColorPicker.js +20 -0
  40. package/lib/types/components/CommandSuggestions.d.ts +23 -4
  41. package/lib/types/components/CommandSuggestions.d.ts.map +1 -1
  42. package/lib/types/components/CommandSuggestions.js +41 -14
  43. package/lib/types/components/ContextBarView.d.ts +33 -0
  44. package/lib/types/components/ContextBarView.d.ts.map +1 -0
  45. package/lib/types/components/ContextBarView.js +46 -0
  46. package/lib/types/components/EffortInputBorder.d.ts +12 -1
  47. package/lib/types/components/EffortInputBorder.d.ts.map +1 -1
  48. package/lib/types/components/EffortInputBorder.js +22 -5
  49. package/lib/types/components/EffortSlider.d.ts +4 -1
  50. package/lib/types/components/EffortSlider.d.ts.map +1 -1
  51. package/lib/types/components/EffortSlider.js +4 -2
  52. package/lib/types/components/ExtensionDialog.js +6 -2
  53. package/lib/types/components/FileActionsPanel.d.ts +22 -0
  54. package/lib/types/components/FileActionsPanel.d.ts.map +1 -0
  55. package/lib/types/components/FileActionsPanel.js +28 -0
  56. package/lib/types/components/FileSuggestions.d.ts +26 -7
  57. package/lib/types/components/FileSuggestions.d.ts.map +1 -1
  58. package/lib/types/components/FileSuggestions.js +39 -12
  59. package/lib/types/components/GoalTodoPanel.d.ts +26 -2
  60. package/lib/types/components/GoalTodoPanel.d.ts.map +1 -1
  61. package/lib/types/components/GoalTodoPanel.js +86 -17
  62. package/lib/types/components/HelpMenu.d.ts +7 -1
  63. package/lib/types/components/HelpMenu.d.ts.map +1 -1
  64. package/lib/types/components/HelpMenu.js +12 -4
  65. package/lib/types/components/HistorySearchDialog.d.ts +4 -1
  66. package/lib/types/components/HistorySearchDialog.d.ts.map +1 -1
  67. package/lib/types/components/HistorySearchDialog.js +2 -2
  68. package/lib/types/components/LangPicker.d.ts +14 -0
  69. package/lib/types/components/LangPicker.d.ts.map +1 -0
  70. package/lib/types/components/LangPicker.js +17 -0
  71. package/lib/types/components/LoadedContextPanel.d.ts.map +1 -1
  72. package/lib/types/components/LoadedContextPanel.js +3 -1
  73. package/lib/types/components/Markdown.d.ts.map +1 -1
  74. package/lib/types/components/Markdown.js +12 -3
  75. package/lib/types/components/MessageList.d.ts +45 -2
  76. package/lib/types/components/MessageList.d.ts.map +1 -1
  77. package/lib/types/components/MessageList.js +560 -41
  78. package/lib/types/components/ModelPicker.d.ts +27 -2
  79. package/lib/types/components/ModelPicker.d.ts.map +1 -1
  80. package/lib/types/components/ModelPicker.js +26 -6
  81. package/lib/types/components/PermissionsPicker.d.ts +21 -0
  82. package/lib/types/components/PermissionsPicker.d.ts.map +1 -0
  83. package/lib/types/components/PermissionsPicker.js +27 -0
  84. package/lib/types/components/PlanPicker.d.ts +15 -0
  85. package/lib/types/components/PlanPicker.d.ts.map +1 -0
  86. package/lib/types/components/PlanPicker.js +18 -0
  87. package/lib/types/components/PresetPicker.d.ts +4 -1
  88. package/lib/types/components/PresetPicker.d.ts.map +1 -1
  89. package/lib/types/components/PresetPicker.js +2 -2
  90. package/lib/types/components/PromptInput.d.ts +4 -3
  91. package/lib/types/components/PromptInput.d.ts.map +1 -1
  92. package/lib/types/components/PromptInput.js +602 -75
  93. package/lib/types/components/RecapPanel.d.ts +25 -0
  94. package/lib/types/components/RecapPanel.d.ts.map +1 -0
  95. package/lib/types/components/RecapPanel.js +55 -0
  96. package/lib/types/components/RewindPicker.d.ts +12 -1
  97. package/lib/types/components/RewindPicker.d.ts.map +1 -1
  98. package/lib/types/components/RewindPicker.js +6 -4
  99. package/lib/types/components/ScrollbarGutter.d.ts +28 -0
  100. package/lib/types/components/ScrollbarGutter.d.ts.map +1 -0
  101. package/lib/types/components/ScrollbarGutter.js +119 -0
  102. package/lib/types/components/Select.d.ts +8 -1
  103. package/lib/types/components/Select.d.ts.map +1 -1
  104. package/lib/types/components/Select.js +4 -2
  105. package/lib/types/components/SkillsPicker.d.ts +4 -1
  106. package/lib/types/components/SkillsPicker.d.ts.map +1 -1
  107. package/lib/types/components/SkillsPicker.js +2 -2
  108. package/lib/types/components/SubagentCard.d.ts +2 -1
  109. package/lib/types/components/SubagentCard.d.ts.map +1 -1
  110. package/lib/types/components/SubagentCard.js +9 -2
  111. package/lib/types/components/SubagentDashboard.d.ts +4 -0
  112. package/lib/types/components/SubagentDashboard.d.ts.map +1 -1
  113. package/lib/types/components/SubagentDashboard.js +9 -1
  114. package/lib/types/components/SubagentDetailScene.d.ts.map +1 -1
  115. package/lib/types/components/SubagentDetailScene.js +5 -4
  116. package/lib/types/components/SuggestionCard.d.ts +65 -0
  117. package/lib/types/components/SuggestionCard.d.ts.map +1 -0
  118. package/lib/types/components/SuggestionCard.js +77 -0
  119. package/lib/types/components/ThemePicker.d.ts +4 -1
  120. package/lib/types/components/ThemePicker.d.ts.map +1 -1
  121. package/lib/types/components/ThemePicker.js +2 -2
  122. package/lib/types/components/ThinkingToggle.d.ts +4 -1
  123. package/lib/types/components/ThinkingToggle.d.ts.map +1 -1
  124. package/lib/types/components/ThinkingToggle.js +2 -2
  125. package/lib/types/components/TimelineRail.d.ts +53 -0
  126. package/lib/types/components/TimelineRail.d.ts.map +1 -0
  127. package/lib/types/components/TimelineRail.js +197 -0
  128. package/lib/types/components/WorkspaceFlowPicker.d.ts +6 -1
  129. package/lib/types/components/WorkspaceFlowPicker.d.ts.map +1 -1
  130. package/lib/types/components/WorkspaceFlowPicker.js +4 -2
  131. package/lib/types/components/WorkspaceMenuPicker.d.ts +19 -0
  132. package/lib/types/components/WorkspaceMenuPicker.d.ts.map +1 -0
  133. package/lib/types/components/WorkspaceMenuPicker.js +19 -0
  134. package/lib/types/components/WorkspacePicker.d.ts +4 -1
  135. package/lib/types/components/WorkspacePicker.d.ts.map +1 -1
  136. package/lib/types/components/WorkspacePicker.js +2 -2
  137. package/lib/types/components/approvals/ApprovalPanel.d.ts.map +1 -1
  138. package/lib/types/components/approvals/ApprovalPanel.js +5 -1
  139. package/lib/types/components/design-system/ListItem.d.ts +8 -1
  140. package/lib/types/components/design-system/ListItem.d.ts.map +1 -1
  141. package/lib/types/components/design-system/ListItem.js +8 -3
  142. package/lib/types/components/design-system/ThemeProvider.d.ts +7 -0
  143. package/lib/types/components/design-system/ThemeProvider.d.ts.map +1 -1
  144. package/lib/types/components/design-system/ThemeProvider.js +2 -1
  145. package/lib/types/components/messages/AssistantTextMessage.d.ts +5 -2
  146. package/lib/types/components/messages/AssistantTextMessage.d.ts.map +1 -1
  147. package/lib/types/components/messages/AssistantTextMessage.js +6 -2
  148. package/lib/types/components/messages/AssistantThinkingMessage.d.ts +2 -1
  149. package/lib/types/components/messages/AssistantThinkingMessage.d.ts.map +1 -1
  150. package/lib/types/components/messages/AssistantThinkingMessage.js +10 -4
  151. package/lib/types/components/messages/AssistantToolUseMessage.d.ts +15 -1
  152. package/lib/types/components/messages/AssistantToolUseMessage.d.ts.map +1 -1
  153. package/lib/types/components/messages/AssistantToolUseMessage.js +37 -7
  154. package/lib/types/components/messages/UserPromptMessage.d.ts +2 -1
  155. package/lib/types/components/messages/UserPromptMessage.d.ts.map +1 -1
  156. package/lib/types/components/questions/AskUserQuestionPanel.d.ts +7 -3
  157. package/lib/types/components/questions/AskUserQuestionPanel.d.ts.map +1 -1
  158. package/lib/types/components/questions/AskUserQuestionPanel.js +75 -11
  159. package/lib/types/components/questions/PlanReviewPanel.d.ts.map +1 -1
  160. package/lib/types/components/questions/PlanReviewPanel.js +13 -2
  161. package/lib/types/components/sessions/SessionListRow.d.ts +4 -1
  162. package/lib/types/components/sessions/SessionListRow.d.ts.map +1 -1
  163. package/lib/types/components/sessions/SessionListRow.js +4 -2
  164. package/lib/types/components/trajectory/HotspotView.d.ts +7 -1
  165. package/lib/types/components/trajectory/HotspotView.d.ts.map +1 -1
  166. package/lib/types/components/trajectory/HotspotView.js +8 -2
  167. package/lib/types/components/trajectory/Ledger.d.ts +9 -1
  168. package/lib/types/components/trajectory/Ledger.d.ts.map +1 -1
  169. package/lib/types/components/trajectory/Ledger.js +23 -5
  170. package/lib/types/components/trajectory/WaveBand.d.ts +10 -1
  171. package/lib/types/components/trajectory/WaveBand.d.ts.map +1 -1
  172. package/lib/types/components/trajectory/WaveBand.js +7 -2
  173. package/lib/types/dsh-adapter/channel.d.ts +117 -7
  174. package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
  175. package/lib/types/dsh-adapter/channel.js +1301 -122
  176. package/lib/types/dsh-adapter/compat/index.d.ts +8 -6
  177. package/lib/types/dsh-adapter/compat/index.d.ts.map +1 -1
  178. package/lib/types/dsh-adapter/compat/index.js +8 -6
  179. package/lib/types/dsh-adapter/compat/sessionLog.d.ts +150 -0
  180. package/lib/types/dsh-adapter/compat/sessionLog.d.ts.map +1 -1
  181. package/lib/types/dsh-adapter/compat/sessionLog.js +518 -41
  182. package/lib/types/dsh-adapter/contract.d.ts +1 -1
  183. package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
  184. package/lib/types/dsh-adapter/contract.js +1 -0
  185. package/lib/types/dsh-adapter/extension-events.d.ts +1 -1
  186. package/lib/types/dsh-adapter/extension-events.d.ts.map +1 -1
  187. package/lib/types/dsh-adapter/index.d.ts +20 -2
  188. package/lib/types/dsh-adapter/index.d.ts.map +1 -1
  189. package/lib/types/dsh-adapter/index.js +9 -1
  190. package/lib/types/dsh-adapter/plugin.d.ts +0 -9
  191. package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
  192. package/lib/types/dsh-adapter/plugin.js +453 -14
  193. package/lib/types/dsh-adapter/presets.d.ts +18 -0
  194. package/lib/types/dsh-adapter/presets.d.ts.map +1 -1
  195. package/lib/types/dsh-adapter/presets.js +31 -0
  196. package/lib/types/dsh-adapter/providerWizard.d.ts +29 -1
  197. package/lib/types/dsh-adapter/providerWizard.d.ts.map +1 -1
  198. package/lib/types/dsh-adapter/providerWizard.js +89 -5
  199. package/lib/types/dsh-adapter/questions.d.ts +19 -2
  200. package/lib/types/dsh-adapter/questions.d.ts.map +1 -1
  201. package/lib/types/dsh-adapter/questions.js +53 -10
  202. package/lib/types/dsh-adapter/recap.d.ts +49 -0
  203. package/lib/types/dsh-adapter/recap.d.ts.map +1 -0
  204. package/lib/types/dsh-adapter/recap.js +121 -0
  205. package/lib/types/dsh-adapter/sessionTree.d.ts +314 -0
  206. package/lib/types/dsh-adapter/sessionTree.d.ts.map +1 -0
  207. package/lib/types/dsh-adapter/sessionTree.js +954 -0
  208. package/lib/types/dsh-adapter/shortcuts.d.ts +15 -44
  209. package/lib/types/dsh-adapter/shortcuts.d.ts.map +1 -1
  210. package/lib/types/dsh-adapter/shortcuts.js +28 -165
  211. package/lib/types/dsh-adapter/types.d.ts +1 -1
  212. package/lib/types/dsh-adapter/types.d.ts.map +1 -1
  213. package/lib/types/herdr.js +1 -1
  214. package/lib/types/i18n.d.ts +770 -181
  215. package/lib/types/i18n.d.ts.map +1 -1
  216. package/lib/types/i18n.js +257 -80
  217. package/lib/types/ink/components/AlternateScreen.d.ts.map +1 -1
  218. package/lib/types/ink/components/AlternateScreen.js +13 -1
  219. package/lib/types/ink/components/App.d.ts +12 -1
  220. package/lib/types/ink/components/App.d.ts.map +1 -1
  221. package/lib/types/ink/components/App.js +101 -4
  222. package/lib/types/ink/components/ClockContext.d.ts.map +1 -1
  223. package/lib/types/ink/components/ClockContext.js +2 -0
  224. package/lib/types/ink/components/ScrollBox.d.ts.map +1 -1
  225. package/lib/types/ink/components/ScrollBox.js +170 -91
  226. package/lib/types/ink/constants.d.ts +9 -0
  227. package/lib/types/ink/constants.d.ts.map +1 -1
  228. package/lib/types/ink/constants.js +9 -0
  229. package/lib/types/ink/events/click-event.d.ts +7 -16
  230. package/lib/types/ink/events/click-event.d.ts.map +1 -1
  231. package/lib/types/ink/events/click-event.js +16 -19
  232. package/lib/types/ink/events/event-handlers.d.ts +11 -1
  233. package/lib/types/ink/events/event-handlers.d.ts.map +1 -1
  234. package/lib/types/ink/events/event-handlers.js +2 -0
  235. package/lib/types/ink/events/input-event.d.ts +9 -0
  236. package/lib/types/ink/events/input-event.d.ts.map +1 -1
  237. package/lib/types/ink/events/input-event.js +4 -0
  238. package/lib/types/ink/events/pointer-event.d.ts +61 -0
  239. package/lib/types/ink/events/pointer-event.d.ts.map +1 -0
  240. package/lib/types/ink/events/pointer-event.js +61 -0
  241. package/lib/types/ink/events/wheel-event.d.ts +17 -0
  242. package/lib/types/ink/events/wheel-event.d.ts.map +1 -0
  243. package/lib/types/ink/events/wheel-event.js +20 -0
  244. package/lib/types/ink/geometry-trace.d.ts +51 -0
  245. package/lib/types/ink/geometry-trace.d.ts.map +1 -0
  246. package/lib/types/ink/geometry-trace.js +83 -0
  247. package/lib/types/ink/hit-test.d.ts +56 -1
  248. package/lib/types/ink/hit-test.d.ts.map +1 -1
  249. package/lib/types/ink/hit-test.js +146 -8
  250. package/lib/types/ink/ink.d.ts +58 -1
  251. package/lib/types/ink/ink.d.ts.map +1 -1
  252. package/lib/types/ink/ink.js +230 -29
  253. package/lib/types/ink/log-update.d.ts.map +1 -1
  254. package/lib/types/ink/log-update.js +21 -0
  255. package/lib/types/ink/node-cache.d.ts +5 -0
  256. package/lib/types/ink/node-cache.d.ts.map +1 -1
  257. package/lib/types/ink/parse-keypress.d.ts +8 -0
  258. package/lib/types/ink/parse-keypress.d.ts.map +1 -1
  259. package/lib/types/ink/parse-keypress.js +101 -12
  260. package/lib/types/ink/render-node-to-output.d.ts +10 -0
  261. package/lib/types/ink/render-node-to-output.d.ts.map +1 -1
  262. package/lib/types/ink/render-node-to-output.js +111 -18
  263. package/lib/types/ink/timeline-rail.d.ts +138 -0
  264. package/lib/types/ink/timeline-rail.d.ts.map +1 -0
  265. package/lib/types/ink/timeline-rail.js +179 -0
  266. package/lib/types/ink/wrap-text.d.ts.map +1 -1
  267. package/lib/types/ink/wrap-text.js +47 -5
  268. package/lib/types/migrationPrefs.d.ts +60 -0
  269. package/lib/types/migrationPrefs.d.ts.map +1 -0
  270. package/lib/types/migrationPrefs.js +97 -0
  271. package/lib/types/modelGroups.d.ts +72 -0
  272. package/lib/types/modelGroups.d.ts.map +1 -0
  273. package/lib/types/modelGroups.js +97 -0
  274. package/lib/types/modelRecents.d.ts +39 -0
  275. package/lib/types/modelRecents.d.ts.map +1 -0
  276. package/lib/types/modelRecents.js +97 -0
  277. package/lib/types/native-ts/yoga-layout/index.d.ts +11 -0
  278. package/lib/types/native-ts/yoga-layout/index.d.ts.map +1 -1
  279. package/lib/types/native-ts/yoga-layout/index.js +31 -1
  280. package/lib/types/oauth.d.ts +15 -0
  281. package/lib/types/oauth.d.ts.map +1 -0
  282. package/lib/types/oauth.js +14 -0
  283. package/lib/types/reload.d.ts +109 -0
  284. package/lib/types/reload.d.ts.map +1 -0
  285. package/lib/types/reload.js +118 -0
  286. package/lib/types/screens/Chat.d.ts +3 -1
  287. package/lib/types/screens/Chat.d.ts.map +1 -1
  288. package/lib/types/screens/Chat.js +1377 -371
  289. package/lib/types/screens/SessionBrowser.d.ts.map +1 -1
  290. package/lib/types/screens/SessionBrowser.js +56 -29
  291. package/lib/types/screens/SessionTree.d.ts +27 -0
  292. package/lib/types/screens/SessionTree.d.ts.map +1 -0
  293. package/lib/types/screens/SessionTree.js +555 -0
  294. package/lib/types/screens/Settings.d.ts.map +1 -1
  295. package/lib/types/screens/Settings.js +64 -22
  296. package/lib/types/screens/StatusLine.d.ts +0 -8
  297. package/lib/types/screens/StatusLine.d.ts.map +1 -1
  298. package/lib/types/screens/StatusLine.js +224 -45
  299. package/lib/types/screens/StatusMetrics.d.ts +35 -3
  300. package/lib/types/screens/StatusMetrics.d.ts.map +1 -1
  301. package/lib/types/screens/StatusMetrics.js +63 -8
  302. package/lib/types/screens/TrajectoryScene.d.ts.map +1 -1
  303. package/lib/types/screens/TrajectoryScene.js +81 -14
  304. package/lib/types/screens/chatOverlay.d.ts +237 -0
  305. package/lib/types/screens/chatOverlay.d.ts.map +1 -0
  306. package/lib/types/screens/chatOverlay.js +116 -0
  307. package/lib/types/tips.d.ts.map +1 -1
  308. package/lib/types/tips.js +64 -10
  309. package/lib/types/tuiDisplayPrefs.d.ts +15 -0
  310. package/lib/types/tuiDisplayPrefs.d.ts.map +1 -1
  311. package/lib/types/tuiDisplayPrefs.js +9 -0
  312. package/lib/types/update.d.ts +139 -0
  313. package/lib/types/update.d.ts.map +1 -1
  314. package/lib/types/update.js +382 -30
  315. package/lib/types/utils/debug.d.ts +10 -0
  316. package/lib/types/utils/debug.d.ts.map +1 -1
  317. package/lib/types/utils/debug.js +24 -0
  318. package/lib/types/utils/fileTarget.d.ts +46 -0
  319. package/lib/types/utils/fileTarget.d.ts.map +1 -0
  320. package/lib/types/utils/fileTarget.js +178 -0
  321. package/lib/types/utils/keymap.d.ts +134 -0
  322. package/lib/types/utils/keymap.d.ts.map +1 -0
  323. package/lib/types/utils/keymap.js +311 -0
  324. package/lib/types/utils/mentions.d.ts +25 -2
  325. package/lib/types/utils/mentions.d.ts.map +1 -1
  326. package/lib/types/utils/mentions.js +69 -10
  327. package/lib/types/utils/openExternal.d.ts +50 -0
  328. package/lib/types/utils/openExternal.d.ts.map +1 -0
  329. package/lib/types/utils/openExternal.js +170 -0
  330. package/lib/types/utils/paths.d.ts.map +1 -1
  331. package/lib/types/utils/paths.js +1 -0
  332. package/node_modules/@deepseek-harness-tui/dsh-auth/LICENSE +21 -0
  333. package/node_modules/@deepseek-harness-tui/dsh-auth/README.md +140 -0
  334. package/node_modules/@deepseek-harness-tui/dsh-auth/cordis.patch.yml +11 -0
  335. package/node_modules/@deepseek-harness-tui/dsh-auth/dsh-plugin.json +44 -0
  336. package/node_modules/@deepseek-harness-tui/dsh-auth/lib/command.d.ts +14 -0
  337. package/node_modules/@deepseek-harness-tui/dsh-auth/lib/command.js +67 -0
  338. package/node_modules/@deepseek-harness-tui/dsh-auth/lib/credentials.d.ts +64 -0
  339. package/node_modules/@deepseek-harness-tui/dsh-auth/lib/credentials.js +170 -0
  340. package/node_modules/@deepseek-harness-tui/dsh-auth/lib/index.d.ts +79 -0
  341. package/node_modules/@deepseek-harness-tui/dsh-auth/lib/index.js +196 -0
  342. package/node_modules/@deepseek-harness-tui/dsh-auth/lib/interaction.d.ts +68 -0
  343. package/node_modules/@deepseek-harness-tui/dsh-auth/lib/interaction.js +193 -0
  344. package/node_modules/@deepseek-harness-tui/dsh-auth/lib/opener.d.ts +32 -0
  345. package/node_modules/@deepseek-harness-tui/dsh-auth/lib/opener.js +101 -0
  346. package/node_modules/@deepseek-harness-tui/dsh-auth/lib/profiles.d.ts +31 -0
  347. package/node_modules/@deepseek-harness-tui/dsh-auth/lib/profiles.js +68 -0
  348. package/node_modules/@deepseek-harness-tui/dsh-auth/lib/service.d.ts +69 -0
  349. package/node_modules/@deepseek-harness-tui/dsh-auth/lib/service.js +129 -0
  350. package/node_modules/@deepseek-harness-tui/dsh-auth/package.json +70 -0
  351. package/node_modules/@dsh-std/command/CHANGELOG.md +8 -8
  352. package/node_modules/@dsh-std/command/LICENSE +21 -21
  353. package/node_modules/@dsh-std/command/README.md +26 -26
  354. package/node_modules/@dsh-std/command/README.zh.md +28 -28
  355. package/node_modules/@dsh-std/command/lib/index.js.map +1 -1
  356. package/node_modules/@dsh-std/command/package.json +22 -22
  357. package/node_modules/@dsh-std/connection/CHANGELOG.md +8 -8
  358. package/node_modules/@dsh-std/connection/LICENSE +21 -21
  359. package/node_modules/@dsh-std/connection/README.md +42 -42
  360. package/node_modules/@dsh-std/connection/README.zh.md +42 -42
  361. package/node_modules/@dsh-std/connection/lib/index.js.map +1 -1
  362. package/node_modules/@dsh-std/connection/lib/memory.js.map +1 -1
  363. package/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js.map +1 -1
  364. package/node_modules/@dsh-std/connection/package.json +20 -20
  365. package/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
  366. package/node_modules/@dsh-std/core/LICENSE +21 -21
  367. package/node_modules/@dsh-std/core/README.md +13 -13
  368. package/node_modules/@dsh-std/core/README.zh.md +13 -13
  369. package/node_modules/@dsh-std/core/lib/index.js.map +1 -1
  370. package/node_modules/@dsh-std/core/package.json +21 -21
  371. package/node_modules/@dsh-std/manifest/CHANGELOG.md +9 -9
  372. package/node_modules/@dsh-std/manifest/LICENSE +21 -21
  373. package/node_modules/@dsh-std/manifest/README.md +5 -5
  374. package/node_modules/@dsh-std/manifest/README.zh.md +5 -5
  375. package/node_modules/@dsh-std/manifest/lib/index.js.map +1 -1
  376. package/node_modules/@dsh-std/manifest/package.json +20 -20
  377. package/node_modules/@dsh-std/manifest/schema/dsh-plugin-0.15.schema.json +144 -144
  378. package/node_modules/@dsh-std/messages/CHANGELOG.md +8 -8
  379. package/node_modules/@dsh-std/messages/LICENSE +21 -21
  380. package/node_modules/@dsh-std/messages/README.md +5 -5
  381. package/node_modules/@dsh-std/messages/README.zh.md +7 -7
  382. package/node_modules/@dsh-std/messages/lib/index.js.map +1 -1
  383. package/node_modules/@dsh-std/messages/package.json +20 -20
  384. package/node_modules/@dsh-std/messages/schema/message-observer-envelope-0.15.schema.json +54 -54
  385. package/node_modules/@dsh-std/presentation/CHANGELOG.md +9 -9
  386. package/node_modules/@dsh-std/presentation/LICENSE +21 -21
  387. package/node_modules/@dsh-std/presentation/README.md +27 -27
  388. package/node_modules/@dsh-std/presentation/README.zh.md +29 -29
  389. package/node_modules/@dsh-std/presentation/lib/callback.js.map +1 -1
  390. package/node_modules/@dsh-std/presentation/lib/index.js.map +1 -1
  391. package/node_modules/@dsh-std/presentation/package.json +25 -25
  392. package/node_modules/@dsh-std/storage/CHANGELOG.md +8 -8
  393. package/node_modules/@dsh-std/storage/LICENSE +21 -21
  394. package/node_modules/@dsh-std/storage/README.md +5 -5
  395. package/node_modules/@dsh-std/storage/README.zh.md +7 -7
  396. package/node_modules/@dsh-std/storage/lib/index.js.map +1 -1
  397. package/node_modules/@dsh-std/storage/package.json +20 -20
  398. package/node_modules/@dsh-std/storage/schema/local-storage-0.15.schema.json +56 -56
  399. package/package.json +19 -5
  400. package/presets/liangshen/.dsh-tui-managed.json +1 -1
  401. package/presets/liangshen/instruction-hint.mjs +8 -0
  402. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/CHANGELOG.md +8 -8
  403. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/LICENSE +21 -21
  404. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/README.md +42 -42
  405. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/README.zh.md +42 -42
  406. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/index.js.map +1 -1
  407. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/memory.js.map +1 -1
  408. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js.map +1 -1
  409. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/package.json +20 -20
  410. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
  411. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/LICENSE +21 -21
  412. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/README.md +13 -13
  413. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/README.zh.md +13 -13
  414. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/lib/index.js.map +1 -1
  415. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/package.json +21 -21
  416. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/CHANGELOG.md +9 -9
  417. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/LICENSE +21 -21
  418. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/README.md +5 -5
  419. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/README.zh.md +5 -5
  420. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/lib/index.js.map +1 -1
  421. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/package.json +20 -20
  422. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/schema/dsh-plugin-0.15.schema.json +144 -144
  423. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/CHANGELOG.md +9 -9
  424. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/LICENSE +21 -21
  425. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/README.md +27 -27
  426. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/README.zh.md +29 -29
  427. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/callback.js.map +1 -1
  428. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/index.js.map +1 -1
  429. package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/package.json +25 -25
  430. package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
  431. package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/LICENSE +21 -21
  432. package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/README.md +13 -13
  433. package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/README.zh.md +13 -13
  434. package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/lib/index.js.map +1 -1
  435. package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/package.json +21 -21
  436. package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
  437. package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/LICENSE +21 -21
  438. package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/README.md +13 -13
  439. package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/README.zh.md +13 -13
  440. package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/lib/index.js.map +1 -1
  441. package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/package.json +21 -21
  442. package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
  443. package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/LICENSE +21 -21
  444. package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/README.md +13 -13
  445. package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/README.zh.md +13 -13
  446. package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/lib/index.js.map +1 -1
  447. package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/package.json +21 -21
  448. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/CHANGELOG.md +8 -8
  449. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/LICENSE +21 -21
  450. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/README.md +42 -42
  451. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/README.zh.md +42 -42
  452. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/index.js.map +1 -1
  453. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/memory.js.map +1 -1
  454. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js.map +1 -1
  455. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/package.json +20 -20
  456. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
  457. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/LICENSE +21 -21
  458. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/README.md +13 -13
  459. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/README.zh.md +13 -13
  460. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/lib/index.js.map +1 -1
  461. package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/package.json +21 -21
  462. package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/CHANGELOG.md +8 -8
  463. package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/LICENSE +21 -21
  464. package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/README.md +13 -13
  465. package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/README.zh.md +13 -13
  466. package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/lib/index.js.map +1 -1
  467. package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/package.json +21 -21
package/README.md CHANGED
@@ -13,12 +13,6 @@
13
13
  <a href="LICENSE"><img alt="MIT License" src="https://img.shields.io/badge/license-MIT-263146?style=flat-square"></a>
14
14
  <img alt="Public beta" src="https://img.shields.io/badge/status-public%20beta-7da1de?style=flat-square">
15
15
  <img alt="官方收录" src="https://img.shields.io/badge/DeepSeek%20Harness%20官方公众号-收录-brightgreen">
16
- <a href="https://github.com/ccch1mneyyy/dsh-TUI/stargazers"><img alt="GitHub stars" src="https://img.shields.io/github/stars/ccch1mneyyy/dsh-TUI?style=flat-square&color=4b6fff"></a>
17
- <a href="https://www.npmjs.com/package/@deepseek-harness-tui/dsh-tui"><img alt="npm downloads" src="https://img.shields.io/npm/dm/@deepseek-harness-tui/dsh-tui?style=flat-square&color=4b6fff"></a>
18
- </p>
19
-
20
- <p align="center">
21
- <a href="https://trendshift.io/repositories/146168" title="GitHub Trending 日榜 #7 · TypeScript 口径"><img alt="Trendshift" src="https://trendshift.io/api/badge/trendshift/repositories/146168/daily?language=TypeScript"></a>
22
16
  </p>
23
17
 
24
18
  # dsh-TUI
@@ -33,52 +27,77 @@
33
27
 
34
28
  ## 🎉 官方收录
35
29
 
36
- 本插件被 **DeepSeek Harness 官方公众号** 推文收录,作为"内测用户精选插件"展示:
37
-
38
- <p align="center">
39
- <img src="screenshots/wechat-official.png" alt="DeepSeek Harness 官方公众号推文收录 dsh-TUI" width="560">
40
- </p>
41
-
42
- 同时也被 [dshfind](https://dshfind.com/zh/plugins/ccch1mneyyy/dsh-TUI) 插件目录收录:
43
-
44
- <p align="center">
45
- <a href="https://dshfind.com/zh/plugins/ccch1mneyyy/dsh-TUI"><img src="https://dshfind.com/api/card/ccch1mneyyy/dsh-TUI?lang=zh" alt="dsh-TUI on dshfind"></a>
46
- </p>
47
-
30
+ 本插件被 **DeepSeek Harness 官方公众号** 推文收录,也被 [dshfind](https://dshfind.com/ccch1mneyyy/dsh-TUI) 插件目录与 [GitHub Trending](https://trendshift.io/repositories/146168) 收录,同时登上了Github Treding日榜第七
31
+
32
+ <div align="center">
33
+ <table>
34
+ <tr>
35
+ <td align="center" valign="middle" width="50%">
36
+ <img src="screenshots/wechat-official.png" alt="DeepSeek Harness 官方公众号推文收录 dsh-TUI" width="480">
37
+ <br>
38
+ <strong>DeepSeek Harness 官方公众号推文收录</strong>
39
+ </td>
40
+ <td align="center" valign="middle" width="50%">
41
+ <a href="https://dshfind.com/ccch1mneyyy/dsh-TUI"><img src="https://dshfind.com/api/card/ccch1mneyyy/dsh-TUI?lang=zh" alt="dsh-TUI on dshfind" width="420"></a>
42
+ <br>
43
+ <strong>dshfind 插件目录收录</strong>
44
+ <br><br>
45
+ <a href="https://trendshift.io/repositories/146168" title="GitHub Trending 日榜 #7 · TypeScript 口径"><img alt="Trendshift" src="https://trendshift.io/api/badge/trendshift/repositories/146168/daily?language=TypeScript"></a>
46
+ <br>
47
+ <strong>dshfind Github Treding榜第七 </strong>
48
+ </td>
49
+ </tr>
50
+ </table>
51
+ </div>
48
52
  ## 核心能力
49
53
 
50
- - **终端原生交互**:流式 Markdown、结构化工具卡、命令与文件补全、`@` 文件引用
51
- (消息任意位置补全,文本附加内容,PNG/JPEG/WebP/GIF 作为持久图片块发送)、历史搜索、消息选择、
52
- inline/alternate-screen 两种渲染模式,以及 `/lang` 中英界面语言切换。
53
- - **可观察的 Agent 状态**:实时工作状态、上下文分段进度、TPS、缓存命中率、
54
+ - **终端交互**:低资源占用,长会话稳定可靠;多种主题切换,样式美观,实时显示工作状态、TPS、缓存命中率等
54
55
  推理等级、输入/输出 token 与 Git/会话信息。
55
- - **完整会话工作流**:`/resume`、`/new`、`/compact`、`/export`、`/btw` 侧问、
56
- 模型切换,以及双击 `Esc` 发起的会话 rewind/fork。
57
- - **DSH 官方能力接入**:Agent preset、Skills、MCP、Goals、Todos、子代理、
58
- `ask_user_question` 问卷都通过现有服务或注册表连接。
59
- - **为长会话设计**:事件驱动投影、差分终端输出、消息虚拟化、回放合并与有界缓存,
60
- 避免渲染成本和内存随会话无限增长。
56
+ - **功能全面**:`/resume`、`/new`、`/compact`、`/export`、`/btw`,模型热切换,原生subagent,会话fork,自动更新;可在vs code中[以vscode插件形式启动](docs/vscode.md),已上架 VS Code Marketplace。
57
+ - **扩展丰富**:原生浏览器交互,compter use等大量附属功能性扩展
58
+
59
+
61
60
 
62
61
  ## 界面预览
63
62
 
64
- ![首屏:像素鲸鱼顶栏](screenshots/splash.png)
63
+ <div align="center">
64
+ <table>
65
+ <tr>
66
+ <td align="center" valign="middle" width="50%">
67
+ <img src="screenshots/splash.png" alt="首屏:像素鲸鱼顶栏" width="480">
68
+ <br>
69
+ <strong>首屏:像素鲸鱼顶栏</strong>
70
+ </td>
71
+ <td align="center" valign="middle" width="50%">
72
+ <img src="screenshots/working-line.png" alt="工作状态行 + 上下文进度条" width="480">
73
+ <br>
74
+ <strong>工作状态行 + 上下文进度条</strong>
75
+ </td>
76
+ </tr>
77
+ </table>
78
+ </div>
65
79
 
66
- ![工作状态行 + 上下文进度条](screenshots/working-line.png)
67
80
 
68
81
  ## 快速开始
69
82
 
70
- 前置条件:可用的终端 TTY、官方 `dsh` CLI,以及 `pnpm` 10+。运行模型还需要
71
- `DEEPSEEK_API_KEY`。
83
+ 前置条件:安装[Nodejs](https://nodejs.org/zh-cn)与[deepseek-harness](https://github.com/deepseek-ai/deepseek-harness),注册`DEEPSEEK_API_KEY`。
84
+
85
+ 安装命令:
72
86
 
73
87
  ```sh
74
- # 1. 全局安装 CLI + 本插件(本插件自带 dsh-tui 直达命令)
75
88
  npm install -g @deepseek-ai/dsh @deepseek-harness-tui/dsh-tui
89
+ ```
90
+
91
+ 启动命令:
76
92
 
77
- # 2. 启动(首次运行会自动初始化 dsh-tui profile,需 pnpm)
93
+ ```bash
94
+ # 完整命令
78
95
  dsh-tui
96
+ # 如果你不想按键盘七次
97
+ dst
79
98
  ```
80
99
 
81
- 备选——手工安装 profile(仓库根目录 `install.sh` 已封装,含 pnpm 预检):
100
+ 如果你想手动安装,可以使用仓库根目录的 `install.sh`:
82
101
 
83
102
  ```sh
84
103
  sh install.sh
@@ -86,106 +105,11 @@ sh install.sh
86
105
  # 之后 dsh-tui 与 dsh --profile dsh-tui 等价
87
106
  ```
88
107
 
89
- `dsh-tui --resume` 恢复上次会话;Windows 也可用仓库里的 `dsh-tui.cmd`(等价)。
108
+ 更面向零基础的安装流程、profile 叠加机制、源码构建与常见问题见[安装与快速开始](docs/getting-started.md)。
90
109
 
91
- ### Herdr
92
110
 
93
- 在 [Herdr](https://herdr.dev) pane 中直接运行 `dsh-tui` 即可,无需额外配置。
94
- dsh-TUI 会通过 Herdr 提供的本地接口上报 `idle`、`working`、`blocked` 状态;
95
- 问卷或工具审批出现时标记为 `blocked`。离开 Herdr 运行时该集成完全不启用。
96
- Herdr 的 `agent start --kind dsh-tui`、session 身份与服务重启后自动恢复仍需 Herdr
97
- 上游加入原生 agent kind;当前可正常保活、重连和观察手工启动的 pane。
98
111
 
99
- 在 VS Code 中运行的完整指南(内置终端直接使用 + companion 扩展
100
- `dsh-tui-vscode`——**真实集成终端承载、体验与 Claude Code 官方扩展几乎一致、
101
- 已上架 VS Code Marketplace**)见
102
- [在 VS Code 中运行 dsh-TUI](docs/vscode.md)。
103
-
104
- TUI 启动后会在后台检查 npm 是否有新版本;发现更新时可输入 `/update`。
105
- `/update` 更新当前 `dsh-tui` profile 中的 runtime 并重启会话,它不会静默修改
106
- npm/pnpm 的全局安装。若通过全局 `dsh-tui` 命令启动且 Launcher 版本落后,
107
- 0.8.3 起会给出精确的全局对齐命令,例如:
108
-
109
- ```sh
110
- npm install -g @deepseek-harness-tui/dsh-tui@<profile-version>
111
- ```
112
-
113
- 旧版 `dsh-cc-tui` / `cc-tui` profile 的迁移命令与兼容数据说明见
114
- [安装与快速开始](docs/getting-started.md#从旧包迁移)。
115
-
116
- 安装流程、profile 叠加机制、源码构建与常见问题见
117
- [安装与快速开始](docs/getting-started.md)。
118
-
119
- ## 快捷键
120
-
121
- | 键 | 功能 |
122
- |---|---|
123
- | `Enter` | 空闲=发送(`Shift+Enter` 换行,无法上报修饰键时可用 `Ctrl+J`,mac Terminal.app 可用 `Option+Enter` 兜底,issue #110);**模型工作时=steer**(注入下一步边界,不中断);命令菜单打开时执行选中项 |
124
- | `Ctrl+Enter`(⌘Enter) | **打断当前回合并立即发送**(interrupt) |
125
- | `Alt+Up` | 把最后一条未处理消息取回输入框编辑(不中断回合) |
126
- | `Tab` | 补全 `/` 命令或 `@` 文件(目录可继续深入);**模型工作时=follow-up**(排入当前回合之后) |
127
- | `Ctrl+C` | 中断当前回合;空闲时连按两次退出 |
128
- | `Esc` | 关闭命令/文件菜单;空闲双击清空输入;**空输入双击 = 时间回溯** |
129
- | `Ctrl+O` | 展开/收起详情(思考全文、工具参数与输出) |
130
- | `Ctrl+R` | 历史消息搜索 |
131
- | `/` | 会话内全文搜索(`n`/`N` 跳转) |
132
- | `Ctrl+V` | 粘贴文本或文件管理器中的文件;图片显示为 `[Image #N]` 并作为持久附件发送 |
133
- | `Ctrl+G` | 用 `$VISUAL`/`$EDITOR`(如 nvim)打开当前输入编辑,保存退出后回填 |
134
- | `?` | 快捷键菜单(仅输入框为空时响应) |
135
- | `Shift+↑` | 消息选择模式(Enter 展开单条) |
136
- | `Ctrl+P` | 切换启动时 loaded-context 面板(面板在屏时有效) |
137
- | `Home` / `End`、`Ctrl+A` / `Ctrl+E` | 逻辑行首 / 行尾;`Ctrl+E` 双义:输入框=行尾,转录中=展开/折叠隐藏的旧消息 |
138
- | `Ctrl+←` / `Ctrl+→`(⌘←/→) | 按词跳转 |
139
- | `Ctrl+U` / `Ctrl+K` | 删除光标前(至行首)/ 光标后(至行尾) |
140
- | `Ctrl+W` | 删除前一个单词 |
141
-
142
- **模型工作中的三态投递**:`Enter`=steer(注入下一步边界,不中断)· `Tab`=follow-up(排入当前回合之后)· `Ctrl+Enter`=interrupt(打断并立即发送)。
143
-
144
- **macOS 修饰键**:上表中 Windows/Linux 的 `Ctrl+<键>` 在 macOS 上同时可用 `⌘<键>`
145
- (如 `⌘V` 粘贴、`⌘O` 展开详情、`⌘Enter` 立即发送);仅 `Ctrl+C` / `Ctrl+D`
146
- (中断/退出)保持 Ctrl 不变,避免与 macOS 系统级 `⌘C` 复制等肌肉记忆冲突。
147
- `⌘` 需终端支持扩展键盘协议(iTerm2 / kitty / WezTerm / ghostty / tmux);
148
- macOS 自带 Terminal.app 会自行消费 `⌘` 快捷键,请继续使用 `Ctrl`。
149
-
150
- **鼠标(`fullscreen: true` 全屏模式;默认关,profile 补丁层覆盖开启)**
151
-
152
- | 操作 | 功能 |
153
- |---|---|
154
- | 拖拽选择 | 应用内文本选区,**松开即复制**(OSC 52 + `wl-copy`/`xclip`/`xsel` 原生兜底;tmux 内走 `load-buffer -w`),复制后自动取消选区并弹出「已复制 N 个字符」提示 |
155
- | 双击 / 三击 | 选词 / 选行,同样即选即复制 |
156
- | 滚轮 | 仅在 fullscreen 且鼠标跟踪启用时:Help 打开时滚动帮助,否则滚动消息列表(±3 行/格);默认 inline 模式不会把滚轮事件交给 TUI |
157
- | `Esc` | 拖拽进行中取消选区(不复制) |
158
- | 单击消息行 | 展开/收起该行 |
159
- | 单击「加载更早消息」/「ctrl+e 显示前 N 条」 | 加载更早消息 / 展开全部 |
160
- | 单击 StickyHeader / 「↓ N new messages」 | 跳回固定消息处 / 滚动到底部 |
161
- | 单击超链接 | 打开浏览器 |
162
- | 键盘扩展选区 | 有选区时 `Shift+←/→/↑/↓/Home/End` 扩展/收缩(跨行环绕) |
163
-
164
- **问卷(模型发起 `ask_user_question` 时)**
165
-
166
- | 键 | 功能 |
167
- |---|---|
168
- | `↑/↓` | 选择选项 |
169
- | `Space` | 多选题勾选/取消 |
170
- | `Tab` | 切到自定义回答(不选选项直接打字) |
171
- | `Enter` | 提交当前选择 |
172
- | `Esc` / `Ctrl+C` | 取消整批提问(模型收到 ASK_CANCELLED,可继续对话) |
173
-
174
- **本地命令(CC 指令全集复刻,均走 DSH 官方链路)**
175
-
176
- | 分组 | 命令 |
177
- |---|---|
178
- | 会话 | `/new` 新会话 · `/resume` 会话浏览器(搜索、预览、跨项目、折叠子 agent 运行) · `/rename` 重命名会话 · `/workspace resume|rename|open` 管理工作区 · `/clear` 清屏 · `/compact` 压缩 · `/export` 导出 Markdown · `/trace` 轨迹场景(亦可 `Ctrl+T`) · `/rewind` 回退选择器(同空输入双击 Esc 的时间回溯) · `/btw <问题>` 侧问(不打断主回合、不写历史) |
179
- | 状态 | `/context` 已加载上下文明细 · `/status` 会话信息 · `/cost` token 用量 · `/doctor` 环境自检 · `/config` 配置来源 · `/init` 创建 AGENTS.md · `/settings` 设置面板(命名空间读取/编辑) |
180
- | 模型 | `/model` 选择器(**切换 = fork 会话续聊,历史保留**) · `/effort` 推理强度(滑杆 / `status` / `<id>`) · `/preset` Agent 预设(**已开始会话不可切换**,blank-only) · `/thinking` 思考显示 · `/tokens` token 明细 · `/activity` 工作状态行动画(`frames <名>` / `status`) · `/theme` 主题选择器 · `/lang` 中英界面切换(`/settings` 中亦可选择) |
181
- | 账号/策略 | `/provider` 添加模型提供方 · `/login` 凭证状态 · `/logout` 登出说明 · `/permissions` 权限说明 · `/add-dir` 文件策略范围 · `/hooks` · `/mcp` |
182
- | 技能 | `/audit` 代码审计 · `/bug` bug 报告 · `/review` 代码评审 · `/practice` 编程练习 · `/pr_comments` PR 评论 · `/release-notes` 发布说明 · `/vuln-check` 漏洞检查 |
183
- | 其它 | `/agents` 子代理列表 · `/skills` 技能目录 · `/plugins check <路径>` 插件诊断 · `/update` 自动更新并重启 · `/vim` · `/terminal-setup` · `/connect` · `/help` · `/exit`(别名 `/quit` `/q`) |
184
- | 注册表 | `/plan` `/goal` `/feedback` `/permission`(DSH 命令注册表插件,随插件自动并入 `/` 菜单) |
185
-
186
- > 未知命令会作为普通消息发给模型(如 `/permission` 未挂载的组合里)。
187
-
188
- ## 插件生态
112
+ ## 插件扩展与开发指南
189
113
 
190
114
  想为 dsh-TUI 做插件/扩展?欢迎加入生态!
191
115
 
@@ -195,11 +119,9 @@ macOS 自带 Terminal.app 会自行消费 `⌘` 快捷键,请继续使用 `Ctr
195
119
  - **模板仓库**:[plugin-template](https://github.com/dsh-tui-ecosystem/plugin-template)(从模板起步,5 分钟出一个插件)
196
120
  - **参考实现**:`dsh-working-activity`(实时工作状态行:TUI 槽位 + `activity/status` 会话事件双出口)
197
121
 
198
- 核心仓库不迁移、社区插件独立成仓。组织只维护收录列表与准入规范,不对社区插件
199
- 的功能、质量或安全作背书或担保;插件作者对自己的仓库保持完全所有权,并自行承担
200
- 维护与安全责任。
201
122
 
202
- ## 文档
123
+
124
+ ## 文档索引
203
125
 
204
126
  | 主题 | 内容 |
205
127
  | --- | --- |
@@ -214,103 +136,6 @@ macOS 自带 Terminal.app 会自行消费 `⌘` 快捷键,请继续使用 `Ctr
214
136
 
215
137
  完整的中英文索引见 [`docs/README.md`](docs/README.md)。
216
138
 
217
- ## 配置与扩展
218
-
219
- - **Agent preset**:四种官方 Agent 模式(`standard` / `code` / `minimal` / `cordis`)和
220
- TUI 随包提供的“梁神模式”(`liangshen`),
221
- `/preset` 切换;已产生对话的会话不可切换,空白会话立即生效。默认 preset 持久化
222
- 在 `~/.dsh-tui/agent-preset.json`;`/model` 的选择持久化在 `~/.dsh-tui/model.json`。
223
- 详见[配置参考](docs/configuration.md#agent-preset)。
224
- - **自定义主题**:`/theme` 选择器(`auto` 跟随系统/终端背景,内置 `light` / `dark` /
225
- `dark-ansi`),也支持 `~/.dsh-tui/themes/<名字>.json` 自定义主题,选中即热切换
226
- 并持久化;`DSH_TUI_THEME` 环境变量 > 持久化选择 > OSC 11 终端背景自动检测。
227
- 详见[主题系统](docs/themes.md)。
228
- - **MCP**:通过 `@deepseek-ai/dsh-mcp-client` 挂载服务器,工具以
229
- `mcp__<服务器>__<工具>` 注册;`/mcp` 查看连接状态。
230
- 详见[配置参考](docs/configuration.md#mcp)。
231
-
232
- ## 工作方式
233
-
234
- ```text
235
- dsh profile
236
- -> dsh-base
237
- -> dsh-TUI Cordis patch
238
- -> Agent preset + DSH services
239
- -> session/event
240
- -> Channel projection
241
- -> React components
242
- -> ported Ink/Yoga renderer
243
- -> terminal
244
- ```
245
-
246
- TUI 只负责交互与呈现。会话日志是对话真源,模型调用、工具执行、fork/resume、
247
- compaction 和持久化继续由 DSH 服务拥有。更详细的模块边界与性能设计见
248
- [架构文档](docs/architecture.md)。
249
-
250
- ```text
251
- 聊天 / 工具基础事件 ──> 持久 Session 日志 ──> TUI / Web
252
- └──────────────> ActivityTracker(内存)──> 仅 TUI 状态栏
253
- ```
254
-
255
- ## 技术要点
256
-
257
- - **Gentle Mist Blue 配色**:雾蓝只承担品牌、焦点、交互与高亮,正文保持中性灰;
258
- 启动时查询终端背景色(OSC 11)自动选浅色/深色调色板,终端不响应时回退深色。
259
- - **事件驱动渲染**:`session/event` 事件流 → 增量差分渲染,滚动状态独立维护。
260
- - **布局级虚拟化**:长会话的每帧成本从 O(全会话) 降到 O(可视窗口)——屏幕外的
261
- 消息行渲染为"量高占位符",其子树完全不参与布局。
262
- - **上下文进度条**:参考 pi-nano-context 算法(最大余数法分段着色 + 多级缩略读数)。
263
- - **TPS 仪表**:参考 pi-tps-meter——流式 1/8 格 gauge、历史 min-max sparkline、
264
- 速度语义色(≥50 绿 / ≥20 黄 / <20 红)。
265
- - **working-activity 生态**:工作状态行复用
266
- [dsh-working-activity](https://github.com/ccch1mneyyy/working-activity)
267
- 的纯状态机,在进程内从基础会话事件派生,不向共享日志写入 UI 状态。
268
- - **终端粘贴**:raw 模式下 Ctrl+V 由应用接管,按平台读取系统剪贴板——Windows
269
- 走 PowerShell `Get-Clipboard`,macOS 走 `osascript`/`pbpaste`,Linux 自动探测
270
- `wl-paste`/`xclip`/`xsel`;普通文件插入路径,图片文件生成 `@` 引用,剪贴板位图
271
- 写入附件库并在输入框显示 `[Image #N]`,纯文本原样插入光标处。
272
-
273
- ## 已知限制
274
-
275
- - 注入上下文(plugin source 内容)未做独立展示,随系统提示词并入进度条统计。
276
- - `/model` 实时切换走"会话 fork 续聊"(DSH 无原位换模型 API):历史原样保留,
277
- 新会话路由到新模型,旧会话仍留在 `/resume` 列表里;选择写入
278
- `~/.dsh-tui/model.json`,重启与 `/new` 均沿用。
279
- - `Ctrl+V` 读剪贴板按平台依赖外部工具:Windows 用 PowerShell `Get-Clipboard`
280
- (剪贴板被其他进程短暂锁定时自动重试,持续锁定时静默放弃);macOS 用
281
- `osascript`/`pbpaste`(Finder 多文件复制没有稳定的 AppleScript 读法,按
282
- 文本/图片回退);Linux 需要 `wl-paste`/`xclip`/`xsel` 之一且会话可连接
283
- (工具缺失或会话不可连接时提示无可用剪贴板工具)。不受支持的图片格式或附件
284
- 服务不可用时会保留临时文件引用作为降级路径。
285
- - 退出时以进程退出收尾,不等待 agent 异步落盘(持久化由 persistence 插件兜底)。
286
- - 工具级审批已实现:approval 服务 + TUI answerer(CC 式审批面板)消费审批流,
287
- 权限提升命令会弹出审批条。`/permission` 预设切换由 dsh-base 的
288
- `permission-presets` 插件提供,profile 组合默认可用;裸组合 `cordis.yml`
289
- 未挂载该插件(无 `/permission` 命令)。
290
- - `/vim` `/connect` `/hooks` 为 CC 同名占位:对应能力在 DSH 侧无等价
291
- 机制,命令会给出明确说明而非静默。
292
- - `/thinking` 思考显示开关**不持久化**,重启或新会话回到默认。
293
- - minimal preset 下 `/compact` 不可用(minimal 不组合 compaction)。
294
- - `/update` 仅 `dsh --profile` 启动方式可用,回合运行中会拒绝。
295
-
296
- 完整已知限制与安全边界见[架构与限制](docs/architecture.md)。
297
-
298
- ## 开发
299
-
300
- CI 使用 Node 24 与 pnpm 11;包声明支持 Node `^22.19 || >=24`。
301
-
302
- ```sh
303
- pnpm install --frozen-lockfile
304
- pnpm build
305
- pnpm smoke
306
- ```
307
-
308
- `lib/types/` 是忽略入库的生成目录;`pnpm build` 会从干净输出目录重新编译并运行
309
- 构建门禁。**Git URL 安装不受支持**(源 manifest 的 `@dsh-std/*` 为 workspace 依赖、
310
- `vendor/dsh-std` 为子模块、且 pnpm ≥11 默认拒绝 git 依赖的 `prepare` 脚本);请安装
311
- registry 包:`dsh plugin --profile dsh-tui add @deepseek-harness-tui/dsh-tui`。渲染、问卷和工具卡
312
- 改动还需运行对应回归脚本。
313
-
314
139
 
315
140
 
316
141
  ## 社区
@@ -326,10 +151,7 @@ registry 包:`dsh plugin --profile dsh-tui add @deepseek-harness-tui/dsh-tui`
326
151
 
327
152
  ## 权限与安全边界
328
153
 
329
- `dsh-TUI` 不实现独立沙箱,而是使用当前 DSH profile 的文件、Shell、sandbox 与
330
- approval 策略。仓库提供的 profile 在非 Windows 平台默认采用工作区约束与审批;
331
- Windows 当前没有对应的沙箱后端,组合会退回到 `danger-full-access` 且不弹审批。
332
- 在包含敏感凭证或不可信仓库的环境中启动前,请先检查 profile 配置。
154
+ `dsh-TUI` 不实现独立沙箱,而是使用当前 DSH profile 的文件、Shell、sandbox 与 approval 策略。仓库提供的 profile 在非 Windows 平台默认采用工作区约束与审批;Windows 当前没有对应的沙箱后端,组合会退回到 `danger-full-access` 且不弹审批。在包含敏感凭证或不可信仓库的环境中启动前,请先检查 profile 配置。
333
155
 
334
156
  详见[权限边界与已知限制](docs/architecture.md#权限与安全边界)。
335
157
 
@@ -337,7 +159,7 @@ Windows 当前没有对应的沙箱后端,组合会退回到 `danger-full-acce
337
159
 
338
160
  朋友们开发的[社区、相关项目与周边工具](docs/links.md)
339
161
 
340
- ## 趋势
162
+ ## Stars
341
163
 
342
164
  <!-- star-history:start -->
343
165
  [![Star History](https://raw.githubusercontent.com/ccch1mneyyy/dsh-TUI/bot-star-history/assets/star-history/star-history.png)](https://star-history.com/#ccch1mneyyy/dsh-TUI&Date)
package/bin/dsh-tui.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * dsh-tui — 双态启动器(delegating launcher,0.8.8)。
3
+ * dsh-tui — 双态启动器(delegating launcher,0.9.1)。
4
4
  *
5
5
  * 同一个文件按“自己住在哪”决定扮演的角色:
6
6
  *
@@ -31,7 +31,7 @@ import { spawn, spawnSync } from 'node:child_process'
31
31
  import { existsSync, readFileSync, realpathSync } from 'node:fs'
32
32
  import { homedir } from 'node:os'
33
33
  import { dirname, isAbsolute, join, resolve } from 'node:path'
34
- import { fileURLToPath } from 'node:url'
34
+ import { fileURLToPath, pathToFileURL } from 'node:url'
35
35
 
36
36
  const here = dirname(fileURLToPath(import.meta.url))
37
37
  const ownDir = dirname(here)
@@ -140,9 +140,9 @@ const MSG = {
140
140
  },
141
141
  delegateFailed: {
142
142
  en: path =>
143
- `[dsh-tui] cannot launch the profile copy:\n ${path}\nReinstall the global launcher:\n npm install -g ${PACKAGE}@latest`,
143
+ `[dsh-tui] cannot launch the profile copy:\n ${path}\nReinstall the global launcher:\n npm install -g --legacy-peer-deps ${PACKAGE}@latest\n(--legacy-peer-deps avoids an npm 12 peer-resolution crash; the launcher is a thin shim, so skipping global peer resolution is safe.)`,
144
144
  zh: path =>
145
- `[dsh-tui] 无法启动 profile 内副本:\n ${path}\n请重装全局启动器:\n npm install -g ${PACKAGE}@latest`,
145
+ `[dsh-tui] 无法启动 profile 内副本:\n ${path}\n请重装全局启动器:\n npm install -g --legacy-peer-deps ${PACKAGE}@latest\n(--legacy-peer-deps 可绕过 npm 12 的 peer 解析崩溃;启动器是瘦壳,跳过全局 peer 解析是安全的。)`,
146
146
  },
147
147
  profileExited: {
148
148
  en: code => `[dsh-tui] dsh profile exited with code ${code}. Run it directly for diagnostics:\n dsh --profile ${PROFILE}`,
@@ -152,6 +152,68 @@ const MSG = {
152
152
  en: (oldName, newName) => `[dsh-tui] note: env ${oldName} was renamed to ${newName}; the old name no longer takes effect.`,
153
153
  zh: (oldName, newName) => `[dsh-tui] 提示:环境变量 ${oldName} 已更名为 ${newName},旧名不再生效。`,
154
154
  },
155
+ notInstalled: {
156
+ en: '(not installed)',
157
+ zh: '(未安装)',
158
+ },
159
+ doctorLabels: {
160
+ en: {
161
+ dshMissing: 'not found — install it first: npm install -g @deepseek-ai/dsh',
162
+ pnpmMissing: 'not found — needed for install/update: npm install -g pnpm',
163
+ profileMissing: 'not installed — run `dsh-tui` once to bootstrap it',
164
+ aligned: 'aligned',
165
+ profileNewer: v => `profile is newer — align the launcher: npm install -g ${PACKAGE}@${v}`,
166
+ profileOlder: v => `profile is older — align it: dsh plugin --profile ${PROFILE} add ${PACKAGE}@${v}`,
167
+ keySet: 'set',
168
+ keyMissing: 'not set — interactive launch reads DEEPSEEK_API_KEY',
169
+ missing: 'missing',
170
+ },
171
+ zh: {
172
+ dshMissing: '未找到——请先安装: npm install -g @deepseek-ai/dsh',
173
+ pnpmMissing: '未找到——安装/升级需要它: npm install -g pnpm',
174
+ profileMissing: '未安装——运行一次 `dsh-tui` 即可自举',
175
+ aligned: '已对齐',
176
+ profileNewer: v => `profile 较新——对齐启动器: npm install -g ${PACKAGE}@${v}`,
177
+ profileOlder: v => `profile 较旧——对齐它: dsh plugin --profile ${PROFILE} add ${PACKAGE}@${v}`,
178
+ keySet: '已设置',
179
+ keyMissing: '未设置——交互启动读取 DEEPSEEK_API_KEY',
180
+ missing: '缺失',
181
+ },
182
+ },
183
+ updateUnavailable: {
184
+ en:
185
+ `[dsh-tui] \`update\` needs the profile's compiled copy, but it is missing or too old to carry the CLI entry.\n` +
186
+ `Update manually instead:\n dsh plugin --profile ${PROFILE} add ${PACKAGE}@latest`,
187
+ zh:
188
+ `[dsh-tui] \`update\` 需要 profile 的编译产物,但它缺失或版本过旧、不含 CLI 入口。\n` +
189
+ `请改用手工升级:\n dsh plugin --profile ${PROFILE} add ${PACKAGE}@latest`,
190
+ },
191
+ helpText: {
192
+ en:
193
+ `Usage: dsh-tui [command] [options] [path|url]\n\n` +
194
+ `Commands:\n` +
195
+ ` update Update the ${PROFILE} profile to the latest release\n` +
196
+ ` doctor Pre-flight environment checks (dsh/pnpm/profile/key)\n` +
197
+ ` version Show launcher and profile versions\n` +
198
+ ` help Show this help\n\n` +
199
+ `Options:\n` +
200
+ ` --resume [id] Resume the last (or the given) session\n` +
201
+ ` -c, --continue Same as --resume\n` +
202
+ ` <path|url> Open with the given workspace target\n\n` +
203
+ `Any other argument is forwarded to \`dsh --profile ${PROFILE}\`.`,
204
+ zh:
205
+ `用法:dsh-tui [命令] [选项] [路径|URL]\n\n` +
206
+ `命令:\n` +
207
+ ` update 将 ${PROFILE} profile 升级到最新版本\n` +
208
+ ` doctor 启动前环境诊断(dsh/pnpm/profile/密钥)\n` +
209
+ ` version 显示启动器与 profile 版本\n` +
210
+ ` help 显示本帮助\n\n` +
211
+ `选项:\n` +
212
+ ` --resume [id] 恢复上次(或指定 id 的)会话\n` +
213
+ ` -c, --continue 同 --resume\n` +
214
+ ` <路径|URL> 以指定工作区目标启动\n\n` +
215
+ `其余参数原样转发给 \`dsh --profile ${PROFILE}\`。`,
216
+ },
155
217
  }
156
218
  const msg = key => MSG[key][lang]
157
219
 
@@ -174,6 +236,78 @@ const profileBin = join(profilePkgDir, 'bin', 'dsh-tui.js')
174
236
  const installedPkgPath = join(profilePkgDir, 'package.json')
175
237
  const runningInsideProfile = sameDir(ownDir, profilePkgDir)
176
238
 
239
+ // ─── 子命令:version / help ──────────────────────────────────────────────────
240
+ // 只认第一个参数,且在角色分支之前应答:两种角色都不经过委托与自举——
241
+ // `dsh-tui --help` 在没装 dsh、profile 残缺时也必须能出(否则求助命令
242
+ // 本身先触发一轮安装)。后续位置的同名字符串不截获,保持既有透传与
243
+ // 工作区目标嗅探行为不变。
244
+ const subcommand = process.argv[2]
245
+ if (subcommand === 'version' || subcommand === '--version' || subcommand === '-v') {
246
+ const role = runningInsideProfile ? 'profile' : 'launcher'
247
+ console.log(`${PACKAGE} ${ownVersion ?? 'unknown'} (${role})`)
248
+ const profileVersion = readJson(installedPkgPath)?.version
249
+ console.log(`profile: ${profileVersion ?? msg('notInstalled')} ${profilePkgDir}`)
250
+ process.exit(0)
251
+ }
252
+ if (subcommand === 'help' || subcommand === '--help' || subcommand === '-h') {
253
+ console.log(msg('helpText'))
254
+ process.exit(0)
255
+ }
256
+ // ─── 子命令:doctor ──────────────────────────────────────────────────────────
257
+ // 启动前环境诊断——针对「TUI 起不来」的故障域(装不上、update 后版本不
258
+ // 同步、密钥没配),与 TUI 内 /doctor 的会话内诊断互补。零 lib 依赖、
259
+ // 不委托、不自举:profile 残缺时它必须还能跑。密钥红线:只报告是否已
260
+ // 设置,绝不输出值。仅 dsh 缺失记为硬失败(其余检查全部照常打印后再
261
+ // 以退出码 1 收束)。
262
+ if (subcommand === 'doctor') {
263
+ const L = msg('doctorLabels')
264
+ let hardFailure = false
265
+ const report = (ok, label, detail) => console.log(`${ok ? '✓' : '✗'} ${label}: ${detail}`)
266
+ console.log(`dsh-tui doctor · ${PACKAGE} ${ownVersion ?? 'unknown'}`)
267
+ report(true, 'node', `${process.version} · ${process.platform} ${process.arch}`)
268
+ const probeVersion = command => {
269
+ const probe = spawnSync(...cmd(command, ['--version']), { stdio: 'pipe', encoding: 'utf8', ...shellOpt })
270
+ if (probe.error || probe.status !== 0) return undefined
271
+ // 白名单校验:只回显版本号形状的首行。诊断输出的红线是绝不泄露密钥,
272
+ // 而 PATH 上的 wrapper 理论上可以把任意环境变量 echo 进 --version——
273
+ // 不匹配版本形状的输出一律不转印。
274
+ const line = String(probe.stdout ?? '').trim().split('\n')[0] ?? ''
275
+ return /^v?\d[\w.+-]*$/.test(line) ? line : '(version unreadable)'
276
+ }
277
+ const dshVersion = probeVersion('dsh')
278
+ if (dshVersion === undefined) {
279
+ hardFailure = true
280
+ report(false, 'dsh', L.dshMissing)
281
+ } else {
282
+ report(true, 'dsh', dshVersion)
283
+ }
284
+ const pnpmVersion = probeVersion('pnpm')
285
+ report(pnpmVersion !== undefined, 'pnpm', pnpmVersion ?? L.pnpmMissing)
286
+ const profileVersion = readJson(installedPkgPath)?.version
287
+ if (profileVersion === undefined) {
288
+ report(false, 'profile', `${L.profileMissing} (${profileDir})`)
289
+ } else {
290
+ report(true, 'profile', `${profileVersion} (${profileDir})`)
291
+ if (ownVersion !== undefined && !runningInsideProfile) {
292
+ if (profileVersion === ownVersion) {
293
+ report(true, 'launcher ↔ profile', L.aligned)
294
+ } else if (isVersionNewer(profileVersion, ownVersion)) {
295
+ report(false, 'launcher ↔ profile', L.profileNewer(profileVersion))
296
+ } else {
297
+ report(false, 'launcher ↔ profile', L.profileOlder(ownVersion))
298
+ }
299
+ }
300
+ }
301
+ // truthiness 而非 !== undefined:空字符串的 key 同样发不了请求,且 TUI 内
302
+ // /doctor(channel.doctorInfo)按 truthiness 报告——两个 doctor 不许分叉。
303
+ const keySet = Boolean(process.env.DEEPSEEK_API_KEY)
304
+ report(keySet, 'DEEPSEEK_API_KEY', keySet ? L.keySet : L.keyMissing)
305
+ for (const candidate of [join(homedir(), '.dsh-tui', 'cordis.yml'), join(profileDir, 'cordis.patch.yml')]) {
306
+ report(existsSync(candidate), 'config', `${candidate}${existsSync(candidate) ? '' : ` ${L.missing}`}`)
307
+ }
308
+ process.exit(hardFailure ? 1 : 0)
309
+ }
310
+
177
311
  const forwardExit = child => {
178
312
  child.on('error', err => {
179
313
  console.error(msg('launchFailed')(err))
@@ -237,6 +371,37 @@ const bootstrapProfile = () => {
237
371
  }
238
372
  }
239
373
 
374
+ // ─── 子命令:update ──────────────────────────────────────────────────────────
375
+ // 顶层处理、两种角色同一条路径——不放进委托链。委托会把 update 交给
376
+ // profile 内的旧 bin:旧副本不认识这个词,只会当参数透传,恰好是「profile
377
+ // 落后、最需要升级」的用户永远到不了新入口。这里统一动态 import **profile
378
+ // 的**编译产物(不是本副本的——DSH_TUI_NO_DELEGATE 下两者不同包,读本副本
379
+ // 会拿全局包版本误判 already-latest/half-updated);瘦壳零 lib 静态依赖的
380
+ // 迁移契约不变。profile 未初始化时先走既有自举(dsh/pnpm 预检在其中);
381
+ // 编译产物缺失或没有 cliUpdate 导出(半更新的旧版)给手工升级指引退出 1。
382
+ // 判定先于工作区目标嗅探:cwd 里名为 update 的文件不再被当成路径。
383
+ if (subcommand === 'update') {
384
+ if (!profileReady()) bootstrapProfile()
385
+ {
386
+ const probe = spawnSync(...cmd('dsh', ['--version']), { stdio: 'pipe', ...shellOpt })
387
+ if (probe.error || probe.status !== 0) {
388
+ console.error(msg('noDsh'))
389
+ process.exit(1)
390
+ }
391
+ }
392
+ let cliUpdate
393
+ try {
394
+ ;({ cliUpdate } = await import(pathToFileURL(join(profilePkgDir, 'lib', 'types', 'update.js')).href))
395
+ } catch {
396
+ cliUpdate = undefined
397
+ }
398
+ if (typeof cliUpdate !== 'function') {
399
+ console.error(msg('updateUnavailable'))
400
+ process.exit(1)
401
+ }
402
+ process.exit(await cliUpdate(PROFILE))
403
+ }
404
+
240
405
  // ─── 全局副本:瘦壳角色 ───────────────────────────────────────────────────────
241
406
  // DSH_TUI_NO_DELEGATE=1 是测试/调试逃生口:强制走完整逻辑(verify-launcher
242
407
  // 的沙箱用它直接驱动全量路径;现场排查委托链时同样可用)。
@@ -266,6 +431,7 @@ if (!runningInsideProfile && ownVersion !== undefined && process.env.DSH_TUI_NO_
266
431
  process.exit(1)
267
432
  }
268
433
  }
434
+
269
435
  let installedVersion
270
436
  try {
271
437
  installedVersion = JSON.parse(readFileSync(installedPkgPath, 'utf8')).version
@@ -297,7 +463,8 @@ if (!runningInsideProfile && ownVersion !== undefined && process.env.DSH_TUI_NO_
297
463
  if (installedNewer) {
298
464
  console.error(
299
465
  `[dsh-tui] note: the profile is already v${installedVersion}; this launcher copy is v${ownVersion}.\n` +
300
- ` npm install -g ${PACKAGE}@${installedVersion}`,
466
+ ` npm install -g --legacy-peer-deps ${PACKAGE}@${installedVersion}\n` +
467
+ `(--legacy-peer-deps avoids an npm 12 peer-resolution crash, see issue #459)`,
301
468
  )
302
469
  } else {
303
470
  // profile 更旧但同 minor(patch 级错位):允许启动,指引用 add 把
package/cordis.patch.yml CHANGED
@@ -261,6 +261,16 @@
261
261
  name: '@deepseek-ai/dsh-cordis-host-runner'
262
262
  disabled: !!js "[...ctx.loader.entries()].some(entry => entry.options.id === 'cordis-host-runner' && entry.options.name === '@deepseek-ai/dsh-cordis-host-runner' && !entry.disabled)"
263
263
 
264
+ # Subscription OAuth sign-in (bundled dsh-auth dependency): mounts the
265
+ # ChatGPT/Codex, Claude Pro/Max and SuperGrok provider routes plus the
266
+ # /auth command; the TUI's /provider wizard gains its OAuth branch from
267
+ # the ctx.dshAuth service this row provides. Entry-level inject only —
268
+ # the plugin module's own inject is empty so a stale patch cannot
269
+ # deadlock a composition lacking these services (#183 pattern).
270
+ - id: dsh-tui-auth
271
+ name: '@deepseek-harness-tui/dsh-tui/oauth'
272
+ inject: [llm, commands]
273
+
264
274
  # The interactive front door. The plugin creates/resumes its agent at
265
275
  # runtime, seeds the startup status line, and disposes the whole app tree
266
276
  # (exiting the process) when the TUI unmounts. `dsh-tui --resume`
@@ -286,10 +296,12 @@
286
296
  config:
287
297
  provider: deepseek-official
288
298
  # Alt-screen fullscreen(CC 同款):应用内鼠标选区(选择即复制, OSC 52 +
289
- # wl-copy/xclip/xsel 兜底)、滚轮滚动、双击选词/三击选行。默认关闭——
290
- # inline 模式下由终端原生选择/复制/scrollback 接管;想用 fullscreen 在
291
- # profile 用户层 cordis.patch.yml 同 id 覆盖整行 config(fullscreen: true)。
292
- fullscreen: false
299
+ # wl-copy/xclip/xsel 兜底)、滚轮滚动、双击选词/三击选行。出厂默认开启,
300
+ # 与 schema 默认(index.ts fullscreen default true)保持一致——两处必须
301
+ # 同步翻转,否则本覆盖层会盖住 schema 默认,更新后用户仍落在 inline。
302
+ # 想退回 inline 主屏(终端原生滚动/选择):/settings 全屏开关或 cordis.yml
303
+ # `fullscreen: false`——显式选择始终优先于默认。
304
+ fullscreen: true
293
305
  # Edit/Write diff 呈现:auto(≥110 列双栏对照,窄屏统一式)/
294
306
  # split(强制双栏)/ unified(强制统一式)。/settings 屏可实时改。
295
307
  # diffLayout: auto