@deepseek-harness-tui/dsh-tui 0.11.1 → 0.12.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 (531) hide show
  1. package/README.md +70 -24
  2. package/assets/whale-girl/whale-girl-dark.png +0 -0
  3. package/assets/whale-girl/whale-girl-happy.png +0 -0
  4. package/assets/whale-girl/whale-girl.png +0 -0
  5. package/bin/dsh-tui.js +93 -6
  6. package/cordis.patch.yml +63 -22
  7. package/cordis.yml +3 -2
  8. package/guide/dsh-tui-guide/SKILL.md +37 -0
  9. package/guide/dsh-tui-guide/configuration.en.md +410 -0
  10. package/guide/dsh-tui-guide/configuration.md +349 -0
  11. package/guide/dsh-tui-guide/getting-started.en.md +398 -0
  12. package/guide/dsh-tui-guide/getting-started.md +397 -0
  13. package/guide/dsh-tui-guide/interaction.en.md +674 -0
  14. package/guide/dsh-tui-guide/interaction.md +747 -0
  15. package/guide/dsh-tui-guide/migrate.en.md +166 -0
  16. package/guide/dsh-tui-guide/migrate.md +132 -0
  17. package/guide/dsh-tui-guide/plugins.en.md +68 -0
  18. package/guide/dsh-tui-guide/plugins.md +56 -0
  19. package/guide/dsh-tui-guide/themes.en.md +192 -0
  20. package/guide/dsh-tui-guide/themes.md +185 -0
  21. package/guide/dsh-tui-guide/user-guide.en.md +608 -0
  22. package/guide/dsh-tui-guide/user-guide.md +586 -0
  23. package/guide/dsh-tui-guide/vscode.en.md +301 -0
  24. package/guide/dsh-tui-guide/vscode.md +272 -0
  25. package/lib/settings.json +1272 -0
  26. package/lib/types/adapter/channel/ui-policy.d.ts +10 -2
  27. package/lib/types/adapter/channel/ui-policy.d.ts.map +1 -1
  28. package/lib/types/adapter/channel/ui-policy.js +17 -0
  29. package/lib/types/adapter/kernel/replay.d.ts.map +1 -1
  30. package/lib/types/adapter/kernel/replay.js +2 -0
  31. package/lib/types/adapter/ports/channel-display.d.ts +12 -0
  32. package/lib/types/adapter/ports/channel-display.d.ts.map +1 -1
  33. package/lib/types/adapter/ports/channel-session.d.ts +38 -0
  34. package/lib/types/adapter/ports/channel-session.d.ts.map +1 -1
  35. package/lib/types/adapter/ports/channel-settings.d.ts +14 -1
  36. package/lib/types/adapter/ports/channel-settings.d.ts.map +1 -1
  37. package/lib/types/adapter/ports/channel-ui.d.ts +75 -6
  38. package/lib/types/adapter/ports/channel-ui.d.ts.map +1 -1
  39. package/lib/types/adapter/ports/channel-view.d.ts +86 -9
  40. package/lib/types/adapter/ports/channel-view.d.ts.map +1 -1
  41. package/lib/types/commands.d.ts.map +1 -1
  42. package/lib/types/commands.js +2 -0
  43. package/lib/types/components/BalanceReportRow.d.ts +10 -2
  44. package/lib/types/components/BalanceReportRow.d.ts.map +1 -1
  45. package/lib/types/components/BalanceReportRow.js +18 -4
  46. package/lib/types/components/Chat/JobCard.d.ts +9 -0
  47. package/lib/types/components/Chat/JobCard.d.ts.map +1 -1
  48. package/lib/types/components/Chat/JobCard.js +42 -15
  49. package/lib/types/components/Chat/SubagentMessage.js +6 -6
  50. package/lib/types/components/CompactionStatusRow.d.ts +24 -0
  51. package/lib/types/components/CompactionStatusRow.d.ts.map +1 -0
  52. package/lib/types/components/CompactionStatusRow.js +72 -0
  53. package/lib/types/components/GoalTodoPanel.js +2 -2
  54. package/lib/types/components/HelpMenu.d.ts +2 -2
  55. package/lib/types/components/HelpMenu.d.ts.map +1 -1
  56. package/lib/types/components/HelpMenu.js +5 -4
  57. package/lib/types/components/InlineMathParagraph.d.ts +22 -0
  58. package/lib/types/components/InlineMathParagraph.d.ts.map +1 -0
  59. package/lib/types/components/InlineMathParagraph.js +178 -0
  60. package/lib/types/components/JobsPanel.d.ts.map +1 -1
  61. package/lib/types/components/JobsPanel.js +80 -33
  62. package/lib/types/components/LogoV2.d.ts +41 -3
  63. package/lib/types/components/LogoV2.d.ts.map +1 -1
  64. package/lib/types/components/LogoV2.js +148 -24
  65. package/lib/types/components/Markdown.d.ts +10 -3
  66. package/lib/types/components/Markdown.d.ts.map +1 -1
  67. package/lib/types/components/Markdown.js +47 -14
  68. package/lib/types/components/MathBlock.d.ts +13 -0
  69. package/lib/types/components/MathBlock.d.ts.map +1 -0
  70. package/lib/types/components/MathBlock.js +136 -0
  71. package/lib/types/components/MessageList.d.ts +10 -1
  72. package/lib/types/components/MessageList.d.ts.map +1 -1
  73. package/lib/types/components/MessageList.js +16 -7
  74. package/lib/types/components/MigratePicker.d.ts +30 -0
  75. package/lib/types/components/MigratePicker.d.ts.map +1 -0
  76. package/lib/types/components/MigratePicker.js +38 -0
  77. package/lib/types/components/PresetPicker.d.ts +4 -0
  78. package/lib/types/components/PresetPicker.d.ts.map +1 -1
  79. package/lib/types/components/PresetPicker.js +5 -1
  80. package/lib/types/components/PromptInput.d.ts +17 -0
  81. package/lib/types/components/PromptInput.d.ts.map +1 -1
  82. package/lib/types/components/PromptInput.js +60 -8
  83. package/lib/types/components/SplitDiffView.d.ts.map +1 -1
  84. package/lib/types/components/SplitDiffView.js +2 -1
  85. package/lib/types/components/StarPrompt.d.ts +59 -0
  86. package/lib/types/components/StarPrompt.d.ts.map +1 -0
  87. package/lib/types/components/StarPrompt.js +326 -0
  88. package/lib/types/components/StreamingMarkdown.d.ts.map +1 -1
  89. package/lib/types/components/StreamingMarkdown.js +20 -3
  90. package/lib/types/components/SubagentCard.d.ts.map +1 -1
  91. package/lib/types/components/SubagentCard.js +8 -8
  92. package/lib/types/components/SubagentDetailScene.d.ts.map +1 -1
  93. package/lib/types/components/SubagentDetailScene.js +108 -10
  94. package/lib/types/components/TimelineRail.d.ts.map +1 -1
  95. package/lib/types/components/TimelineRail.js +9 -1
  96. package/lib/types/components/Whale.d.ts +17 -8
  97. package/lib/types/components/Whale.d.ts.map +1 -1
  98. package/lib/types/components/Whale.js +25 -15
  99. package/lib/types/components/WhaleGirl.d.ts +35 -0
  100. package/lib/types/components/WhaleGirl.d.ts.map +1 -0
  101. package/lib/types/components/WhaleGirl.js +50 -0
  102. package/lib/types/components/WorkingSpinner.d.ts +4 -1
  103. package/lib/types/components/WorkingSpinner.d.ts.map +1 -1
  104. package/lib/types/components/WorkingSpinner.js +2 -2
  105. package/lib/types/components/bigfont.d.ts +47 -18
  106. package/lib/types/components/bigfont.d.ts.map +1 -1
  107. package/lib/types/components/bigfont.js +55 -40
  108. package/lib/types/components/design-system/ThemeProvider.d.ts +6 -0
  109. package/lib/types/components/design-system/ThemeProvider.d.ts.map +1 -1
  110. package/lib/types/components/design-system/ThemeProvider.js +40 -1
  111. package/lib/types/components/maidPortrait.d.ts +44 -0
  112. package/lib/types/components/maidPortrait.d.ts.map +1 -0
  113. package/lib/types/components/maidPortrait.js +178 -0
  114. package/lib/types/components/mathPreview.d.ts +25 -0
  115. package/lib/types/components/mathPreview.d.ts.map +1 -0
  116. package/lib/types/components/mathPreview.js +48 -0
  117. package/lib/types/components/messages/AssistantThinkingMessage.d.ts.map +1 -1
  118. package/lib/types/components/messages/AssistantThinkingMessage.js +6 -5
  119. package/lib/types/components/messages/AssistantToolUseMessage.d.ts.map +1 -1
  120. package/lib/types/components/messages/AssistantToolUseMessage.js +3 -2
  121. package/lib/types/components/messages/TranscriptImages.d.ts.map +1 -1
  122. package/lib/types/components/messages/TranscriptImages.js +11 -1
  123. package/lib/types/components/questions/AskUserQuestionPanel.d.ts +14 -2
  124. package/lib/types/components/questions/AskUserQuestionPanel.d.ts.map +1 -1
  125. package/lib/types/components/questions/AskUserQuestionPanel.js +80 -38
  126. package/lib/types/components/questions/PlanReviewPanel.d.ts.map +1 -1
  127. package/lib/types/components/questions/PlanReviewPanel.js +3 -3
  128. package/lib/types/components/sessions/ForeignSessionRow.d.ts +34 -0
  129. package/lib/types/components/sessions/ForeignSessionRow.d.ts.map +1 -0
  130. package/lib/types/components/sessions/ForeignSessionRow.js +43 -0
  131. package/lib/types/components/sessions/SourceTabs.d.ts +52 -0
  132. package/lib/types/components/sessions/SourceTabs.d.ts.map +1 -0
  133. package/lib/types/components/sessions/SourceTabs.js +70 -0
  134. package/lib/types/components/splashEggs.d.ts +56 -0
  135. package/lib/types/components/splashEggs.d.ts.map +1 -0
  136. package/lib/types/components/splashEggs.js +67 -0
  137. package/lib/types/components/splashFonts.d.ts +119 -0
  138. package/lib/types/components/splashFonts.d.ts.map +1 -0
  139. package/lib/types/components/splashFonts.js +267 -0
  140. package/lib/types/components/splashLayout.d.ts +41 -0
  141. package/lib/types/components/splashLayout.d.ts.map +1 -0
  142. package/lib/types/components/splashLayout.js +40 -0
  143. package/lib/types/components/trajectory/MiniWake.d.ts +11 -1
  144. package/lib/types/components/trajectory/MiniWake.d.ts.map +1 -1
  145. package/lib/types/components/trajectory/MiniWake.js +9 -3
  146. package/lib/types/components/whaleGirlSprite.d.ts +17 -0
  147. package/lib/types/components/whaleGirlSprite.d.ts.map +1 -0
  148. package/lib/types/components/whaleGirlSprite.js +47 -0
  149. package/lib/types/deepseekPricing.d.ts +74 -0
  150. package/lib/types/deepseekPricing.d.ts.map +1 -1
  151. package/lib/types/deepseekPricing.js +110 -11
  152. package/lib/types/dsh-adapter/channel/action-readiness.d.ts +1 -1
  153. package/lib/types/dsh-adapter/channel/action-readiness.d.ts.map +1 -1
  154. package/lib/types/dsh-adapter/channel/action-readiness.js +6 -1
  155. package/lib/types/dsh-adapter/channel/background-action.d.ts +1 -0
  156. package/lib/types/dsh-adapter/channel/background-action.d.ts.map +1 -1
  157. package/lib/types/dsh-adapter/channel/background-action.js +1 -0
  158. package/lib/types/dsh-adapter/channel/binding-events.d.ts +8 -9
  159. package/lib/types/dsh-adapter/channel/binding-events.d.ts.map +1 -1
  160. package/lib/types/dsh-adapter/channel/binding-events.js +69 -21
  161. package/lib/types/dsh-adapter/channel/compaction.d.ts +2 -1
  162. package/lib/types/dsh-adapter/channel/compaction.d.ts.map +1 -1
  163. package/lib/types/dsh-adapter/channel/compaction.js +35 -2
  164. package/lib/types/dsh-adapter/channel/external-commands.d.ts.map +1 -1
  165. package/lib/types/dsh-adapter/channel/external-commands.js +8 -2
  166. package/lib/types/dsh-adapter/channel/job-projection.d.ts +1 -0
  167. package/lib/types/dsh-adapter/channel/job-projection.d.ts.map +1 -1
  168. package/lib/types/dsh-adapter/channel/job-projection.js +88 -3
  169. package/lib/types/dsh-adapter/channel/local-actions.d.ts.map +1 -1
  170. package/lib/types/dsh-adapter/channel/local-actions.js +6 -1
  171. package/lib/types/dsh-adapter/channel/mode-actions.d.ts +13 -0
  172. package/lib/types/dsh-adapter/channel/mode-actions.d.ts.map +1 -1
  173. package/lib/types/dsh-adapter/channel/mode-actions.js +48 -7
  174. package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts.map +1 -1
  175. package/lib/types/dsh-adapter/channel/mode-permission-actions.js +25 -9
  176. package/lib/types/dsh-adapter/channel/model-switch.d.ts.map +1 -1
  177. package/lib/types/dsh-adapter/channel/model-switch.js +5 -1
  178. package/lib/types/dsh-adapter/channel/paths.d.ts.map +1 -1
  179. package/lib/types/dsh-adapter/channel/paths.js +7 -1
  180. package/lib/types/dsh-adapter/channel/preferences.d.ts +1 -1
  181. package/lib/types/dsh-adapter/channel/preferences.d.ts.map +1 -1
  182. package/lib/types/dsh-adapter/channel/preferences.js +31 -5
  183. package/lib/types/dsh-adapter/channel/projection.d.ts +1 -2
  184. package/lib/types/dsh-adapter/channel/projection.d.ts.map +1 -1
  185. package/lib/types/dsh-adapter/channel/projection.js +127 -17
  186. package/lib/types/dsh-adapter/channel/question-record.d.ts +76 -0
  187. package/lib/types/dsh-adapter/channel/question-record.d.ts.map +1 -0
  188. package/lib/types/dsh-adapter/channel/question-record.js +107 -0
  189. package/lib/types/dsh-adapter/channel/session-lineage.d.ts +42 -0
  190. package/lib/types/dsh-adapter/channel/session-lineage.d.ts.map +1 -0
  191. package/lib/types/dsh-adapter/channel/session-lineage.js +51 -0
  192. package/lib/types/dsh-adapter/channel/session-live-adoption.d.ts +2 -0
  193. package/lib/types/dsh-adapter/channel/session-live-adoption.d.ts.map +1 -1
  194. package/lib/types/dsh-adapter/channel/session-live-adoption.js +9 -3
  195. package/lib/types/dsh-adapter/channel/session-metadata.d.ts +2 -1
  196. package/lib/types/dsh-adapter/channel/session-metadata.d.ts.map +1 -1
  197. package/lib/types/dsh-adapter/channel/session-metadata.js +39 -7
  198. package/lib/types/dsh-adapter/channel/session-reset.d.ts +1 -1
  199. package/lib/types/dsh-adapter/channel/session-reset.d.ts.map +1 -1
  200. package/lib/types/dsh-adapter/channel/session-reset.js +7 -0
  201. package/lib/types/dsh-adapter/channel/session-resume.d.ts +1 -0
  202. package/lib/types/dsh-adapter/channel/session-resume.d.ts.map +1 -1
  203. package/lib/types/dsh-adapter/channel/session-resume.js +4 -2
  204. package/lib/types/dsh-adapter/channel/settings-host.d.ts.map +1 -1
  205. package/lib/types/dsh-adapter/channel/settings-host.js +8 -0
  206. package/lib/types/dsh-adapter/channel/state.d.ts +17 -2
  207. package/lib/types/dsh-adapter/channel/state.d.ts.map +1 -1
  208. package/lib/types/dsh-adapter/channel/state.js +6 -1
  209. package/lib/types/dsh-adapter/channel/subagent-projection.d.ts +30 -35
  210. package/lib/types/dsh-adapter/channel/subagent-projection.d.ts.map +1 -1
  211. package/lib/types/dsh-adapter/channel/subagent-projection.js +143 -4
  212. package/lib/types/dsh-adapter/channel/types.d.ts +1 -1
  213. package/lib/types/dsh-adapter/channel/types.d.ts.map +1 -1
  214. package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
  215. package/lib/types/dsh-adapter/channel.js +35 -5
  216. package/lib/types/dsh-adapter/compat/messages.d.ts +6 -0
  217. package/lib/types/dsh-adapter/compat/messages.d.ts.map +1 -1
  218. package/lib/types/dsh-adapter/compat/messages.js +9 -0
  219. package/lib/types/dsh-adapter/contract.d.ts +6 -5
  220. package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
  221. package/lib/types/dsh-adapter/contract.js +14 -6
  222. package/lib/types/dsh-adapter/index.d.ts +36 -1
  223. package/lib/types/dsh-adapter/index.d.ts.map +1 -1
  224. package/lib/types/dsh-adapter/index.js +22 -6
  225. package/lib/types/dsh-adapter/jobs.d.ts +82 -16
  226. package/lib/types/dsh-adapter/jobs.d.ts.map +1 -1
  227. package/lib/types/dsh-adapter/jobs.js +104 -9
  228. package/lib/types/dsh-adapter/migrate/adapters/claude-code.d.ts +3 -0
  229. package/lib/types/dsh-adapter/migrate/adapters/claude-code.d.ts.map +1 -0
  230. package/lib/types/dsh-adapter/migrate/adapters/claude-code.js +131 -0
  231. package/lib/types/dsh-adapter/migrate/adapters/claude-code.parse.d.ts +17 -0
  232. package/lib/types/dsh-adapter/migrate/adapters/claude-code.parse.d.ts.map +1 -0
  233. package/lib/types/dsh-adapter/migrate/adapters/claude-code.parse.js +329 -0
  234. package/lib/types/dsh-adapter/migrate/adapters/codex.d.ts +3 -0
  235. package/lib/types/dsh-adapter/migrate/adapters/codex.d.ts.map +1 -0
  236. package/lib/types/dsh-adapter/migrate/adapters/codex.js +102 -0
  237. package/lib/types/dsh-adapter/migrate/adapters/codex.parse.d.ts +16 -0
  238. package/lib/types/dsh-adapter/migrate/adapters/codex.parse.d.ts.map +1 -0
  239. package/lib/types/dsh-adapter/migrate/adapters/codex.parse.js +289 -0
  240. package/lib/types/dsh-adapter/migrate/adapters/grok-build.d.ts +3 -0
  241. package/lib/types/dsh-adapter/migrate/adapters/grok-build.d.ts.map +1 -0
  242. package/lib/types/dsh-adapter/migrate/adapters/grok-build.js +117 -0
  243. package/lib/types/dsh-adapter/migrate/adapters/grok-build.parse.d.ts +13 -0
  244. package/lib/types/dsh-adapter/migrate/adapters/grok-build.parse.d.ts.map +1 -0
  245. package/lib/types/dsh-adapter/migrate/adapters/grok-build.parse.js +178 -0
  246. package/lib/types/dsh-adapter/migrate/adapters/omp.d.ts +3 -0
  247. package/lib/types/dsh-adapter/migrate/adapters/omp.d.ts.map +1 -0
  248. package/lib/types/dsh-adapter/migrate/adapters/omp.js +133 -0
  249. package/lib/types/dsh-adapter/migrate/adapters/scan-fs.d.ts +60 -0
  250. package/lib/types/dsh-adapter/migrate/adapters/scan-fs.d.ts.map +1 -0
  251. package/lib/types/dsh-adapter/migrate/adapters/scan-fs.js +178 -0
  252. package/lib/types/dsh-adapter/migrate/adapters/scan.d.ts +8 -0
  253. package/lib/types/dsh-adapter/migrate/adapters/scan.d.ts.map +1 -0
  254. package/lib/types/dsh-adapter/migrate/adapters/scan.js +40 -0
  255. package/lib/types/dsh-adapter/migrate/adapters/zcode.d.ts +3 -0
  256. package/lib/types/dsh-adapter/migrate/adapters/zcode.d.ts.map +1 -0
  257. package/lib/types/dsh-adapter/migrate/adapters/zcode.js +93 -0
  258. package/lib/types/dsh-adapter/migrate/adapters/zcode.parse.d.ts +9 -0
  259. package/lib/types/dsh-adapter/migrate/adapters/zcode.parse.d.ts.map +1 -0
  260. package/lib/types/dsh-adapter/migrate/adapters/zcode.parse.js +89 -0
  261. package/lib/types/dsh-adapter/migrate/bin-path.d.ts +6 -0
  262. package/lib/types/dsh-adapter/migrate/bin-path.d.ts.map +1 -0
  263. package/lib/types/dsh-adapter/migrate/bin-path.js +30 -0
  264. package/lib/types/dsh-adapter/migrate/browse.d.ts +42 -0
  265. package/lib/types/dsh-adapter/migrate/browse.d.ts.map +1 -0
  266. package/lib/types/dsh-adapter/migrate/browse.js +90 -0
  267. package/lib/types/dsh-adapter/migrate/cli.d.ts +9 -0
  268. package/lib/types/dsh-adapter/migrate/cli.d.ts.map +1 -0
  269. package/lib/types/dsh-adapter/migrate/cli.js +106 -0
  270. package/lib/types/dsh-adapter/migrate/import-one.d.ts +89 -0
  271. package/lib/types/dsh-adapter/migrate/import-one.d.ts.map +1 -0
  272. package/lib/types/dsh-adapter/migrate/import-one.js +133 -0
  273. package/lib/types/dsh-adapter/migrate/index.d.ts +35 -0
  274. package/lib/types/dsh-adapter/migrate/index.d.ts.map +1 -0
  275. package/lib/types/dsh-adapter/migrate/index.js +107 -0
  276. package/lib/types/dsh-adapter/migrate/parse/injection.d.ts +40 -0
  277. package/lib/types/dsh-adapter/migrate/parse/injection.d.ts.map +1 -0
  278. package/lib/types/dsh-adapter/migrate/parse/injection.js +127 -0
  279. package/lib/types/dsh-adapter/migrate/parse/jsonl.d.ts +28 -0
  280. package/lib/types/dsh-adapter/migrate/parse/jsonl.d.ts.map +1 -0
  281. package/lib/types/dsh-adapter/migrate/parse/jsonl.js +40 -0
  282. package/lib/types/dsh-adapter/migrate/parse/role-turns.d.ts +28 -0
  283. package/lib/types/dsh-adapter/migrate/parse/role-turns.d.ts.map +1 -0
  284. package/lib/types/dsh-adapter/migrate/parse/role-turns.js +50 -0
  285. package/lib/types/dsh-adapter/migrate/parse/title.d.ts +18 -0
  286. package/lib/types/dsh-adapter/migrate/parse/title.d.ts.map +1 -0
  287. package/lib/types/dsh-adapter/migrate/parse/title.js +29 -0
  288. package/lib/types/dsh-adapter/migrate/parse/tools.d.ts +62 -0
  289. package/lib/types/dsh-adapter/migrate/parse/tools.d.ts.map +1 -0
  290. package/lib/types/dsh-adapter/migrate/parse/tools.js +110 -0
  291. package/lib/types/dsh-adapter/migrate/picker.d.ts +64 -0
  292. package/lib/types/dsh-adapter/migrate/picker.d.ts.map +1 -0
  293. package/lib/types/dsh-adapter/migrate/picker.js +86 -0
  294. package/lib/types/dsh-adapter/migrate/recent-agents.d.ts +40 -0
  295. package/lib/types/dsh-adapter/migrate/recent-agents.d.ts.map +1 -0
  296. package/lib/types/dsh-adapter/migrate/recent-agents.js +100 -0
  297. package/lib/types/dsh-adapter/migrate/sessionize.d.ts +39 -0
  298. package/lib/types/dsh-adapter/migrate/sessionize.d.ts.map +1 -0
  299. package/lib/types/dsh-adapter/migrate/sessionize.js +271 -0
  300. package/lib/types/dsh-adapter/migrate/types.d.ts +176 -0
  301. package/lib/types/dsh-adapter/migrate/types.d.ts.map +1 -0
  302. package/lib/types/dsh-adapter/migrate/types.js +11 -0
  303. package/lib/types/dsh-adapter/migrate/uuid.d.ts +7 -0
  304. package/lib/types/dsh-adapter/migrate/uuid.d.ts.map +1 -0
  305. package/lib/types/dsh-adapter/migrate/uuid.js +25 -0
  306. package/lib/types/dsh-adapter/oauth/bonus.d.ts +27 -0
  307. package/lib/types/dsh-adapter/oauth/bonus.d.ts.map +1 -0
  308. package/lib/types/dsh-adapter/oauth/bonus.js +69 -0
  309. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/command.d.ts +2 -1
  310. package/lib/types/dsh-adapter/oauth/command.d.ts.map +1 -0
  311. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/command.js +7 -4
  312. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/credentials.d.ts +13 -10
  313. package/lib/types/dsh-adapter/oauth/credentials.d.ts.map +1 -0
  314. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/credentials.js +61 -23
  315. package/lib/types/dsh-adapter/oauth/deepseek.d.ts +39 -0
  316. package/lib/types/dsh-adapter/oauth/deepseek.d.ts.map +1 -0
  317. package/lib/types/dsh-adapter/oauth/deepseek.js +189 -0
  318. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/index.d.ts +24 -16
  319. package/lib/types/dsh-adapter/oauth/index.d.ts.map +1 -0
  320. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/index.js +34 -20
  321. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/interaction.d.ts +14 -12
  322. package/lib/types/dsh-adapter/oauth/interaction.d.ts.map +1 -0
  323. package/lib/types/dsh-adapter/oauth/interaction.js +283 -0
  324. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/opener.d.ts +2 -1
  325. package/lib/types/dsh-adapter/oauth/opener.d.ts.map +1 -0
  326. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/opener.js +1 -1
  327. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/pi-ai.d.ts +10 -3
  328. package/lib/types/dsh-adapter/oauth/pi-ai.d.ts.map +1 -0
  329. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/pi-ai.js +8 -3
  330. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/profiles.d.ts +6 -3
  331. package/lib/types/dsh-adapter/oauth/profiles.d.ts.map +1 -0
  332. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/profiles.js +11 -3
  333. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/service.d.ts +14 -7
  334. package/lib/types/dsh-adapter/oauth/service.d.ts.map +1 -0
  335. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/service.js +82 -17
  336. package/lib/types/dsh-adapter/plugin.d.ts +12 -3
  337. package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
  338. package/lib/types/dsh-adapter/plugin.js +215 -376
  339. package/lib/types/dsh-adapter/presets.d.ts +6 -4
  340. package/lib/types/dsh-adapter/presets.d.ts.map +1 -1
  341. package/lib/types/dsh-adapter/presets.js +6 -4
  342. package/lib/types/dsh-adapter/providerWizard.d.ts +17 -0
  343. package/lib/types/dsh-adapter/providerWizard.d.ts.map +1 -1
  344. package/lib/types/dsh-adapter/providerWizard.js +260 -68
  345. package/lib/types/dsh-adapter/questions.d.ts +22 -15
  346. package/lib/types/dsh-adapter/questions.d.ts.map +1 -1
  347. package/lib/types/dsh-adapter/questions.js +47 -45
  348. package/lib/types/dsh-adapter/sessions/digest.d.ts +11 -6
  349. package/lib/types/dsh-adapter/sessions/digest.d.ts.map +1 -1
  350. package/lib/types/dsh-adapter/sessions/digest.js +20 -13
  351. package/lib/types/dsh-adapter/sessions/frames.d.ts +3 -1
  352. package/lib/types/dsh-adapter/sessions/frames.d.ts.map +1 -1
  353. package/lib/types/dsh-adapter/sessions/frames.js +5 -4
  354. package/lib/types/dsh-adapter/sessions/list.d.ts +6 -1
  355. package/lib/types/dsh-adapter/sessions/list.d.ts.map +1 -1
  356. package/lib/types/dsh-adapter/sessions/list.js +188 -164
  357. package/lib/types/dsh-adapter/sessions/recovery.d.ts +16 -0
  358. package/lib/types/dsh-adapter/sessions/recovery.d.ts.map +1 -0
  359. package/lib/types/dsh-adapter/sessions/recovery.js +108 -0
  360. package/lib/types/dsh-adapter/sessions/snapshot.d.ts +7 -0
  361. package/lib/types/dsh-adapter/sessions/snapshot.d.ts.map +1 -0
  362. package/lib/types/dsh-adapter/sessions/snapshot.js +90 -0
  363. package/lib/types/dsh-adapter/sessions/store.d.ts +10 -4
  364. package/lib/types/dsh-adapter/sessions/store.d.ts.map +1 -1
  365. package/lib/types/dsh-adapter/sessions/store.js +62 -25
  366. package/lib/types/dsh-adapter/sideQuestion.d.ts +41 -2
  367. package/lib/types/dsh-adapter/sideQuestion.d.ts.map +1 -1
  368. package/lib/types/dsh-adapter/sideQuestion.js +98 -2
  369. package/lib/types/dsh-adapter/subagents.d.ts +29 -3
  370. package/lib/types/dsh-adapter/subagents.d.ts.map +1 -1
  371. package/lib/types/dsh-adapter/subagents.js +87 -3
  372. package/lib/types/herdr.d.ts +2 -0
  373. package/lib/types/herdr.d.ts.map +1 -1
  374. package/lib/types/herdr.js +9 -3
  375. package/lib/types/i18n.d.ts +598 -60
  376. package/lib/types/i18n.d.ts.map +1 -1
  377. package/lib/types/i18n.js +198 -31
  378. package/lib/types/ink/components/App.d.ts +2 -2
  379. package/lib/types/ink/components/App.d.ts.map +1 -1
  380. package/lib/types/ink/components/App.js +15 -2
  381. package/lib/types/ink/components/Image.d.ts +14 -1
  382. package/lib/types/ink/components/Image.d.ts.map +1 -1
  383. package/lib/types/ink/components/Image.js +2 -2
  384. package/lib/types/ink/events/input-event.js +3 -3
  385. package/lib/types/ink/hooks/use-terminal-images.d.ts +12 -0
  386. package/lib/types/ink/hooks/use-terminal-images.d.ts.map +1 -1
  387. package/lib/types/ink/hooks/use-terminal-images.js +13 -0
  388. package/lib/types/ink/ink.d.ts +6 -0
  389. package/lib/types/ink/ink.d.ts.map +1 -1
  390. package/lib/types/ink/ink.js +16 -1
  391. package/lib/types/ink/kitty-graphics.d.ts +44 -3
  392. package/lib/types/ink/kitty-graphics.d.ts.map +1 -1
  393. package/lib/types/ink/kitty-graphics.js +184 -23
  394. package/lib/types/ink/output.d.ts +24 -2
  395. package/lib/types/ink/output.d.ts.map +1 -1
  396. package/lib/types/ink/output.js +83 -5
  397. package/lib/types/ink/parse-keypress.d.ts +61 -1
  398. package/lib/types/ink/parse-keypress.d.ts.map +1 -1
  399. package/lib/types/ink/parse-keypress.js +764 -93
  400. package/lib/types/ink/render-node-to-output.d.ts.map +1 -1
  401. package/lib/types/ink/render-node-to-output.js +8 -1
  402. package/lib/types/ink/screen.d.ts +24 -0
  403. package/lib/types/ink/screen.d.ts.map +1 -1
  404. package/lib/types/ink/screen.js +89 -0
  405. package/lib/types/ink/selection.d.ts +40 -18
  406. package/lib/types/ink/selection.d.ts.map +1 -1
  407. package/lib/types/ink/selection.js +142 -30
  408. package/lib/types/ink/sixel-codec.d.ts +12 -1
  409. package/lib/types/ink/sixel-codec.d.ts.map +1 -1
  410. package/lib/types/ink/sixel-codec.js +29 -5
  411. package/lib/types/ink/sixel-graphics.d.ts.map +1 -1
  412. package/lib/types/ink/sixel-graphics.js +5 -3
  413. package/lib/types/ink/styles.d.ts +9 -0
  414. package/lib/types/ink/styles.d.ts.map +1 -1
  415. package/lib/types/ink/terminal-image.d.ts +8 -0
  416. package/lib/types/ink/terminal-image.d.ts.map +1 -1
  417. package/lib/types/ink/terminal-querier.d.ts +32 -1
  418. package/lib/types/ink/terminal-querier.d.ts.map +1 -1
  419. package/lib/types/ink/terminal-querier.js +54 -2
  420. package/lib/types/ink/timeline-rail.d.ts +5 -0
  421. package/lib/types/ink/timeline-rail.d.ts.map +1 -1
  422. package/lib/types/ink/update-overflow-guard.d.ts +24 -0
  423. package/lib/types/ink/update-overflow-guard.d.ts.map +1 -1
  424. package/lib/types/ink/update-overflow-guard.js +25 -3
  425. package/lib/types/math/inline-layout.d.ts +29 -0
  426. package/lib/types/math/inline-layout.d.ts.map +1 -0
  427. package/lib/types/math/inline-layout.js +106 -0
  428. package/lib/types/math/layout.d.ts +58 -0
  429. package/lib/types/math/layout.d.ts.map +1 -0
  430. package/lib/types/math/layout.js +59 -0
  431. package/lib/types/math/renderer.d.ts +64 -0
  432. package/lib/types/math/renderer.d.ts.map +1 -0
  433. package/lib/types/math/renderer.js +256 -0
  434. package/lib/types/minimalUiMode.d.ts +19 -0
  435. package/lib/types/minimalUiMode.d.ts.map +1 -0
  436. package/lib/types/minimalUiMode.js +23 -0
  437. package/lib/types/oauth.d.ts +5 -10
  438. package/lib/types/oauth.d.ts.map +1 -1
  439. package/lib/types/oauth.js +5 -10
  440. package/lib/types/screens/Chat.d.ts +17 -1
  441. package/lib/types/screens/Chat.d.ts.map +1 -1
  442. package/lib/types/screens/Chat.js +627 -54
  443. package/lib/types/screens/SessionSupervisor.d.ts +2 -1
  444. package/lib/types/screens/SessionSupervisor.d.ts.map +1 -1
  445. package/lib/types/screens/SessionSupervisor.js +156 -19
  446. package/lib/types/screens/Settings.d.ts.map +1 -1
  447. package/lib/types/screens/Settings.js +49 -11
  448. package/lib/types/screens/StatusLine.d.ts +4 -0
  449. package/lib/types/screens/StatusLine.d.ts.map +1 -1
  450. package/lib/types/screens/StatusLine.js +57 -27
  451. package/lib/types/screens/chatOverlay.d.ts +5 -0
  452. package/lib/types/screens/chatOverlay.d.ts.map +1 -1
  453. package/lib/types/screens/chatOverlay.js +1 -0
  454. package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.d.ts +47 -0
  455. package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.d.ts.map +1 -0
  456. package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.js +65 -0
  457. package/lib/types/screens/sessionSupervisor/model.d.ts +12 -0
  458. package/lib/types/screens/sessionSupervisor/model.d.ts.map +1 -1
  459. package/lib/types/screens/sessionSupervisor/model.js +26 -0
  460. package/lib/types/screens/sessionSupervisor/useForeignSessions.d.ts +107 -0
  461. package/lib/types/screens/sessionSupervisor/useForeignSessions.d.ts.map +1 -0
  462. package/lib/types/screens/sessionSupervisor/useForeignSessions.js +312 -0
  463. package/lib/types/screens/sessionSupervisor/useSessionSupervisor.d.ts +4 -1
  464. package/lib/types/screens/sessionSupervisor/useSessionSupervisor.d.ts.map +1 -1
  465. package/lib/types/screens/sessionSupervisor/useSessionSupervisor.js +97 -14
  466. package/lib/types/sessionHistory.d.ts +2 -2
  467. package/lib/types/sessionHistory.d.ts.map +1 -1
  468. package/lib/types/sessionHistory.js +31 -5
  469. package/lib/types/settings/definitions.d.ts +681 -0
  470. package/lib/types/settings/definitions.d.ts.map +1 -0
  471. package/lib/types/settings/definitions.js +511 -0
  472. package/lib/types/starAction.d.ts +44 -0
  473. package/lib/types/starAction.d.ts.map +1 -0
  474. package/lib/types/starAction.js +52 -0
  475. package/lib/types/terminal-utils/latex.d.ts +10 -0
  476. package/lib/types/terminal-utils/latex.d.ts.map +1 -0
  477. package/lib/types/terminal-utils/latex.js +1417 -0
  478. package/lib/types/terminal-utils/markdown.d.ts +3 -1
  479. package/lib/types/terminal-utils/markdown.d.ts.map +1 -1
  480. package/lib/types/terminal-utils/markdown.js +26 -1
  481. package/lib/types/terminal-utils/math.d.ts +66 -0
  482. package/lib/types/terminal-utils/math.d.ts.map +1 -0
  483. package/lib/types/terminal-utils/math.js +337 -0
  484. package/lib/types/tips.d.ts.map +1 -1
  485. package/lib/types/tips.js +16 -4
  486. package/lib/types/tuiDisplayPrefs.d.ts +67 -0
  487. package/lib/types/tuiDisplayPrefs.d.ts.map +1 -1
  488. package/lib/types/tuiDisplayPrefs.js +59 -0
  489. package/lib/types/ui.d.ts +1 -1
  490. package/lib/types/ui.d.ts.map +1 -1
  491. package/lib/types/ui.js +1 -1
  492. package/lib/types/update.js +2 -2
  493. package/lib/types/usageStats.d.ts +98 -0
  494. package/lib/types/usageStats.d.ts.map +1 -0
  495. package/lib/types/usageStats.js +169 -0
  496. package/lib/types/utils/bmp.d.ts +17 -0
  497. package/lib/types/utils/bmp.d.ts.map +1 -0
  498. package/lib/types/utils/bmp.js +154 -0
  499. package/lib/types/utils/clipboard.d.ts +14 -2
  500. package/lib/types/utils/clipboard.d.ts.map +1 -1
  501. package/lib/types/utils/clipboard.js +143 -8
  502. package/lib/types/utils/fold-long-lines.d.ts.map +1 -1
  503. package/lib/types/utils/fold-long-lines.js +2 -1
  504. package/lib/types/utils/keymap.d.ts +4 -1
  505. package/lib/types/utils/keymap.d.ts.map +1 -1
  506. package/lib/types/utils/keymap.js +8 -0
  507. package/lib/types/utils/modifiers.d.ts +4 -3
  508. package/lib/types/utils/modifiers.d.ts.map +1 -1
  509. package/lib/types/utils/modifiers.js +4 -3
  510. package/lib/types/utils/pastedImagePath.d.ts +8 -0
  511. package/lib/types/utils/pastedImagePath.d.ts.map +1 -1
  512. package/lib/types/utils/pastedImagePath.js +29 -5
  513. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/LICENSE +202 -0
  514. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/NOTICE +20 -0
  515. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/index.d.ts +16 -0
  516. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/lib/bundled-packages.json +4 -0
  517. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/lib/index.mjs +20 -0
  518. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/lib/index.mjs.LEGAL.txt +35 -0
  519. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/package.json +29 -0
  520. package/package.json +127 -102
  521. package/presets/liangshen/agent.cordis.yml +4 -1
  522. package/presets/liangshen/preset.yml +1 -1
  523. package/lib/types/minimalMode.d.ts +0 -13
  524. package/lib/types/minimalMode.d.ts.map +0 -1
  525. package/lib/types/minimalMode.js +0 -17
  526. package/node_modules/@deepseek-harness-tui/dsh-auth/LICENSE +0 -21
  527. package/node_modules/@deepseek-harness-tui/dsh-auth/README.md +0 -143
  528. package/node_modules/@deepseek-harness-tui/dsh-auth/cordis.patch.yml +0 -11
  529. package/node_modules/@deepseek-harness-tui/dsh-auth/dsh-plugin.json +0 -44
  530. package/node_modules/@deepseek-harness-tui/dsh-auth/lib/interaction.js +0 -193
  531. package/node_modules/@deepseek-harness-tui/dsh-auth/package.json +0 -69
@@ -79,10 +79,12 @@ export declare function runningPresetOf(session: unknown): string | undefined;
79
79
  */
80
80
  export declare function resolvePersistedRoute(ctx: Context, sessionId: SessionId): Promise<ModelRoute | undefined>;
81
81
  /**
82
- * Keep the official Minimal preset's model-facing contract at exactly two
83
- * tools. The TUI mounts ask_user_question at the host layer so every other
84
- * preset (including user presets) can use its questionnaire UI; host-layer
85
- * tools otherwise merge into Minimal's scoped catalog as a third tool.
82
+ * Keep the official Minimal preset's model-facing catalog minimal. The preset
83
+ * itself declares exactly one persistent shell tool (bash on POSIX, pwsh on
84
+ * Windows), while the TUI mounts ask_user_question at the host layer so every
85
+ * other preset (including user presets) can use its questionnaire UI —
86
+ * that host-layer tool otherwise merges into Minimal's scoped catalog as an
87
+ * extra tool.
86
88
  *
87
89
  * This is a per-assembly filter rather than a startup-time decision because
88
90
  * one TUI process can resume, create, or recompose sessions under different
@@ -1 +1 @@
1
- {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/presets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAWtE,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAA;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmBhG;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAW5G;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGpE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAW/G;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,CAM/G;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAKpG"}
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/presets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAWtE,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAA;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmBhG;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAW5G;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGpE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAW/G;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,CAM/G;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAKpG"}
@@ -120,10 +120,12 @@ export async function resolvePersistedRoute(ctx, sessionId) {
120
120
  }
121
121
  }
122
122
  /**
123
- * Keep the official Minimal preset's model-facing contract at exactly two
124
- * tools. The TUI mounts ask_user_question at the host layer so every other
125
- * preset (including user presets) can use its questionnaire UI; host-layer
126
- * tools otherwise merge into Minimal's scoped catalog as a third tool.
123
+ * Keep the official Minimal preset's model-facing catalog minimal. The preset
124
+ * itself declares exactly one persistent shell tool (bash on POSIX, pwsh on
125
+ * Windows), while the TUI mounts ask_user_question at the host layer so every
126
+ * other preset (including user presets) can use its questionnaire UI —
127
+ * that host-layer tool otherwise merges into Minimal's scoped catalog as an
128
+ * extra tool.
127
129
  *
128
130
  * This is a per-assembly filter rather than a startup-time decision because
129
131
  * one TUI process can resume, create, or recompose sessions under different
@@ -1,6 +1,7 @@
1
1
  import type { ProviderSetupHost } from '../adapter/ports/channel-settings.js';
2
2
  export type { ProviderSetupHost, CatalogProviderCandidate, ConfiguredProvider, ProfilePathOp, OAuthSetupHost, OAuthProviderStatus, OAuthLoginResult } from '../adapter/ports/channel-settings.js';
3
3
  import { type AskUserQuestionAnswer, type AskUserQuestionRequest } from '@deepseek-ai/dsh-user-questions';
4
+ import type { LlmDiscoveredModel } from '@deepseek-ai/dsh-llm';
4
5
  /** Route id rule shared with the dsh configuration surface (web Models page). */
5
6
  export declare const PROVIDER_ROUTE_ID: RegExp;
6
7
  /** Wire protocols dsh-llm-pi-ai can serve on a manually declared route. */
@@ -39,4 +40,20 @@ export type ProviderWizardOutcome = 'added' | 'updated' | 'deleted' | 'signed-ou
39
40
  * dismisses any question (Esc) — nothing has been written at that point.
40
41
  */
41
42
  export declare function runProviderWizard(deps: ProviderWizardDeps): Promise<ProviderWizardOutcome>;
43
+ /** How the live endpoint probe of one discovery pass went. */
44
+ export type RouteDiscoveryLive = 'fetched' | 'failed' | 'unavailable';
45
+ export type RouteDiscoveryCatalog = 'fetched' | 'failed' | 'unavailable';
46
+ export type RouteDiscoveryReason = 'no-base-url' | 'unsupported-catalog' | 'custom-headers';
47
+ /** One route-model discovery pass, ready for the selection panel. */
48
+ export interface RouteDiscovery {
49
+ /** Merged rows: installed-catalog rows first (rich metadata), then
50
+ * endpoint-only ids in the order the endpoint advertised them. */
51
+ readonly rows: readonly LlmDiscoveredModel[];
52
+ /** Ids covered by the installed catalog (their rows carry catalog truth). */
53
+ readonly catalogIds: ReadonlySet<string>;
54
+ /** Whether the installed catalog lookup was authoritative. */
55
+ readonly catalog: RouteDiscoveryCatalog;
56
+ readonly live: RouteDiscoveryLive;
57
+ readonly reason?: RouteDiscoveryReason;
58
+ }
42
59
  //# sourceMappingURL=providerWizard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"providerWizard.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/providerWizard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAsH,MAAM,sCAAsC,CAAA;AACjM,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAA;AAsBjM,OAAO,EAEL,KAAK,qBAAqB,EAE1B,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAA;AAGxC,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,QAAoC,CAAA;AAElE,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,2EAIrB,CAAA;AAEV;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAA;IAChC,QAAQ,CAAC,GAAG,EAAE,CACZ,OAAO,EAAE,sBAAsB,EAC/B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KAC3B,OAAO,CAAC,qBAAqB,CAAC,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,CACf,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KACtE,IAAI,CAAA;IACT,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAA;IACrE,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAA;IAC/B,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC5E;AAED,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAA;AA4D3G;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,qBAAqB,CAAC,CA8BhC"}
1
+ {"version":3,"file":"providerWizard.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/providerWizard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAsH,MAAM,sCAAsC,CAAA;AACjM,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAA;AAsBjM,OAAO,EAEL,KAAK,qBAAqB,EAE1B,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAA;AACxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAE9D,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,QAAoC,CAAA;AAElE,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,2EAIrB,CAAA;AAEV;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAA;IAChC,QAAQ,CAAC,GAAG,EAAE,CACZ,OAAO,EAAE,sBAAsB,EAC/B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KAC3B,OAAO,CAAC,qBAAqB,CAAC,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,CACf,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KACtE,IAAI,CAAA;IACT,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAA;IACrE,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAA;IAC/B,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC5E;AAED,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAA;AA4D3G;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,qBAAqB,CAAC,CA8BhC;AAw3BD,8DAA8D;AAC9D,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,aAAa,CAAA;AACrE,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,QAAQ,GAAG,aAAa,CAAA;AACxE,MAAM,MAAM,oBAAoB,GAC5B,aAAa,GACb,qBAAqB,GACrB,gBAAgB,CAAA;AAEpB,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B;uEACmE;IACnE,QAAQ,CAAC,IAAI,EAAE,SAAS,kBAAkB,EAAE,CAAA;IAC5C,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACxC,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAA;IACvC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAA;CACvC"}
@@ -204,12 +204,14 @@ async function runAddFlow(deps) {
204
204
  }
205
205
  // ── 5. model discovery (draft credential, nothing persisted) ───────
206
206
  notify(t('provider-discovery-running'));
207
- const discovered = await host.discoverModels({
207
+ const discovery = await discoverRouteModels(host, {
208
208
  ...(isCatalog ? { provider: route } : {}),
209
209
  ...(baseURL !== undefined && baseURL !== '' ? { baseURL } : {}),
210
210
  ...(api !== undefined ? { api } : {}),
211
- apiKey: apiKey ?? '',
212
- }).catch(() => []);
211
+ ...(apiKey !== undefined && apiKey !== '' ? { apiKey } : {}),
212
+ });
213
+ const discovered = discovery.rows;
214
+ notifyDiscoveryStatus(notify, discovery);
213
215
  // ── 6. model selection ─────────────────────────────────────────────
214
216
  let models = [];
215
217
  let discoveredById = new Map();
@@ -218,13 +220,15 @@ async function runAddFlow(deps) {
218
220
  const modelsAnswer = await ask({
219
221
  questions: [optionQuestion('models', t('provider-q-models'), discovered.map(model => ({
220
222
  label: model.id,
221
- description: [
222
- model.name ?? '',
223
- model.contextWindow !== undefined ? `${model.contextWindow}` : '',
224
- ].filter(part => part !== '').join(' · ') || undefined,
225
- })), { multiSelect: true })],
223
+ description: modelRowDescription(model, isCatalog && discovery.catalog === 'fetched' && !discovery.catalogIds.has(model.id)),
224
+ })), {
225
+ multiSelect: true,
226
+ ...(isCatalog && discovery.reason === 'no-base-url'
227
+ ? { detail: t('provider-catalog-snapshot-note', { n: discovered.length }) }
228
+ : {}),
229
+ })],
226
230
  });
227
- models = mergeModelIds(answerSelected(modelsAnswer, 'models'), answerText(modelsAnswer, 'models'));
231
+ models = mergeModelIds(answerSelected(modelsAnswer, 'models'), modelCustomInput(modelsAnswer, isCatalog, discovery, notify));
228
232
  }
229
233
  else {
230
234
  notify(t('provider-discovery-failed'), { color: 'warning' });
@@ -247,11 +251,14 @@ async function runAddFlow(deps) {
247
251
  }
248
252
  // ── 7. confirm ─────────────────────────────────────────────────────
249
253
  const summaryLines = buildSummaryLines({
250
- route, ref, shadowed, baseURL, api, models, isCatalog, keyLine,
254
+ route, action: 'added', ref, shadowed, baseURL, api, models, isCatalog, keyLine,
255
+ });
256
+ const previewLines = buildSummaryLines({
257
+ route, action: 'preview', ref, shadowed, baseURL, api, models, isCatalog, keyLine,
251
258
  });
252
259
  const detail = host.routeExists(route)
253
- ? `${summaryLines.join('\n')}\n${t('provider-route-exists-warning')}`
254
- : summaryLines.join('\n');
260
+ ? `${previewLines.join('\n')}\n${t('provider-route-exists-warning')}`
261
+ : previewLines.join('\n');
255
262
  const confirmAnswer = await ask({
256
263
  questions: [optionQuestion('confirm', t('provider-q-confirm'), [
257
264
  { label: t('provider-opt-confirm-write') },
@@ -273,7 +280,16 @@ async function runAddFlow(deps) {
273
280
  await host.writeCredential(ref, apiKey);
274
281
  wroteCredential = true;
275
282
  }
276
- const profile = buildProfile({ isCatalog, ref, baseURL, api, models, discoveredById });
283
+ const profile = buildProfile({
284
+ isCatalog,
285
+ ref,
286
+ baseURL,
287
+ api,
288
+ models,
289
+ discoveredById,
290
+ catalogIds: discovery.catalogIds,
291
+ catalogDiscovery: discovery.catalog,
292
+ });
277
293
  try {
278
294
  await host.writeProfile(route, profile);
279
295
  }
@@ -444,6 +460,7 @@ async function editApiKey(deps, provider) {
444
460
  await host.writeCredential(provider.ref, value);
445
461
  pushLocal('/provider', buildSummaryLines({
446
462
  route: provider.route,
463
+ action: 'updated',
447
464
  ref: provider.ref,
448
465
  shadowed: provider.shadowed,
449
466
  baseURL: provider.baseURL,
@@ -466,6 +483,7 @@ change) {
466
483
  await host.mutateProfile(provider.route, [{ op: 'set', path, value }]);
467
484
  pushLocal('/provider', buildSummaryLines({
468
485
  route: provider.route,
486
+ action: 'updated',
469
487
  ref: provider.ref,
470
488
  shadowed: provider.shadowed,
471
489
  baseURL: change.baseURL ?? provider.baseURL,
@@ -527,16 +545,27 @@ async function editModelList(deps, provider) {
527
545
  const { host, ask, notify, pushLocal } = deps;
528
546
  const isCatalog = provider.isCatalog;
529
547
  const previous = provider.models ?? [];
530
- const key = provider.ref !== ''
548
+ // The credential is read only when a live probe will use it: a catalog
549
+ // A route without a usable live probe (no endpoint, unsupported catalog
550
+ // protocol, or custom headers the upstream seam cannot carry) stays on the
551
+ // installed-catalog listing, so no secret is resolved for nothing.
552
+ const endpointKnown = provider.baseURL !== undefined && provider.baseURL !== '';
553
+ const liveProbePossible = endpointKnown
554
+ && !provider.hasCustomHeaders
555
+ && (!isCatalog || provider.api !== undefined || catalogLiveApi(provider.route) !== undefined);
556
+ const key = provider.ref !== '' && liveProbePossible
531
557
  ? (provider.shadowed ? host.envValue(provider.ref) : await host.readCredential(provider.ref))
532
558
  : undefined;
533
559
  notify(t('provider-discovery-running'));
534
- const discovered = await host.discoverModels({
560
+ const discovery = await discoverRouteModels(host, {
535
561
  ...(isCatalog ? { provider: provider.route } : {}),
536
- ...(provider.baseURL !== undefined && provider.baseURL !== '' ? { baseURL: provider.baseURL } : {}),
562
+ ...(provider.baseURL !== undefined ? { baseURL: provider.baseURL } : {}),
537
563
  ...(provider.api !== undefined ? { api: provider.api } : {}),
538
- apiKey: key ?? '',
539
- }).catch(() => []);
564
+ ...(provider.hasCustomHeaders ? { hasCustomHeaders: true } : {}),
565
+ ...(key !== undefined ? { apiKey: key } : {}),
566
+ });
567
+ const discovered = discovery.rows;
568
+ notifyDiscoveryStatus(notify, discovery);
540
569
  let models;
541
570
  let discoveredById = new Map();
542
571
  if (discovered.length === 0) {
@@ -552,18 +581,15 @@ async function editModelList(deps, provider) {
552
581
  }
553
582
  else {
554
583
  discoveredById = new Map(discovered.map(model => [model.id, model]));
555
- // Existing models the endpoint no longer advertises (renamed, beta
556
- // pulled, transient discovery gap) must still appear in the panel,
557
- // pre-checked and marked: options built from `discovered` alone would
558
- // silently drop them on an Enter-through confirm, destroying their
559
- // stored entries and the unmodeled per-model fields. Only an explicit
560
- // un-check removes one.
584
+ // Existing models neither the catalog nor the endpoint advertises
585
+ // (renamed, beta pulled, transient discovery gap) must still appear in
586
+ // the panel, pre-checked and marked: options built from `discovered`
587
+ // alone would silently drop them on an Enter-through confirm,
588
+ // destroying their stored entries and the unmodeled per-model fields.
589
+ // Only an explicit un-check removes one.
561
590
  const optionRows = discovered.map(model => ({
562
591
  label: model.id,
563
- description: [
564
- model.name ?? '',
565
- model.contextWindow !== undefined ? `${model.contextWindow}` : '',
566
- ].filter(part => part !== '').join(' · ') || undefined,
592
+ description: modelRowDescription(model, isCatalog && discovery.catalog === 'fetched' && !discovery.catalogIds.has(model.id)),
567
593
  }));
568
594
  const missingRows = previous
569
595
  .filter(id => !discoveredById.has(id))
@@ -572,9 +598,15 @@ async function editModelList(deps, provider) {
572
598
  description: t('provider-row-model-missing'),
573
599
  }));
574
600
  const modelsAnswer = await ask({
575
- questions: [optionQuestion('models', t('provider-q-models'), [...optionRows, ...missingRows], { multiSelect: true, defaultSelected: previous })],
601
+ questions: [optionQuestion('models', t('provider-q-models'), [...optionRows, ...missingRows], {
602
+ multiSelect: true,
603
+ defaultSelected: previous,
604
+ ...(isCatalog && discovery.reason === 'no-base-url'
605
+ ? { detail: t('provider-catalog-snapshot-note', { n: discovered.length }) }
606
+ : {}),
607
+ })],
576
608
  });
577
- models = mergeModelIds(answerSelected(modelsAnswer, 'models'), answerText(modelsAnswer, 'models'));
609
+ models = mergeModelIds(answerSelected(modelsAnswer, 'models'), modelCustomInput(modelsAnswer, isCatalog, discovery, notify));
578
610
  }
579
611
  if (!isCatalog && models.length === 0) {
580
612
  // A manual route without models fails the adapter validation.
@@ -586,8 +618,11 @@ async function editModelList(deps, provider) {
586
618
  return 'cancelled';
587
619
  }
588
620
  // The new `models` value: a kept id re-enters its stored entry verbatim;
589
- // a newly enabled one is built from the discovery row (plain `{id}` on a
590
- // catalog route, where the catalog itself carries the capabilities).
621
+ // a newly enabled one is built from the discovery row. An id the installed
622
+ // catalog covers stays plain `{id}` (the catalog carries the capabilities
623
+ // and would be overridden by entry fields); an endpoint-only id takes the
624
+ // capacities the live listing disclosed, falling back to the route
625
+ // defaults upstream when the endpoint said nothing.
591
626
  const storedById = new Map((provider.modelEntries ?? [])
592
627
  .flatMap(entry => typeof entry['id'] === 'string' ? [[entry['id'], entry]] : []));
593
628
  const modelsValue = models.map(id => {
@@ -597,7 +632,7 @@ async function editModelList(deps, provider) {
597
632
  const discovered = discoveredById.get(id);
598
633
  return {
599
634
  id,
600
- ...(isCatalog || discovered === undefined ? {} : {
635
+ ...((isCatalog && (discovery.catalog !== 'fetched' || discovery.catalogIds.has(id))) || discovered === undefined ? {} : {
601
636
  ...(discovered.contextWindow !== undefined
602
637
  ? { contextWindow: discovered.contextWindow }
603
638
  : {}),
@@ -612,6 +647,7 @@ async function editModelList(deps, provider) {
612
647
  ]);
613
648
  pushLocal('/provider', buildSummaryLines({
614
649
  route: provider.route,
650
+ action: 'updated-models',
615
651
  ref: provider.ref,
616
652
  shadowed: provider.shadowed,
617
653
  baseURL: provider.baseURL,
@@ -621,6 +657,10 @@ async function editModelList(deps, provider) {
621
657
  keyLine: provider.ref !== ''
622
658
  ? t('provider-line-key-kept', { ref: provider.ref })
623
659
  : t('provider-line-key-none'),
660
+ delta: {
661
+ added: models.filter(id => !previous.includes(id)),
662
+ removed: previous.filter(id => !models.includes(id)),
663
+ },
624
664
  }));
625
665
  notify(t('provider-edit-success', { route: provider.route }), { color: 'success' });
626
666
  return 'updated';
@@ -654,7 +694,7 @@ async function deleteConfiguredProvider(deps, provider) {
654
694
  const sharers = provider.ref === ''
655
695
  ? []
656
696
  : host.listRefUsers(provider.ref, provider.route);
657
- const lines = buildDeleteSummary(provider);
697
+ const previewLines = buildDeleteSummary(provider);
658
698
  let confirmAnswer;
659
699
  try {
660
700
  confirmAnswer = await ask({
@@ -663,8 +703,8 @@ async function deleteConfiguredProvider(deps, provider) {
663
703
  { label: t('provider-opt-confirm-cancel') },
664
704
  ], {
665
705
  detail: sharers.length > 0
666
- ? `${lines.join('\n')}\n${t('provider-delete-shared-warning', { ref: provider.ref, routes: sharers.join(', ') })}`
667
- : lines.join('\n'),
706
+ ? `${previewLines.join('\n')}\n${t('provider-delete-shared-warning', { ref: provider.ref, routes: sharers.join(', ') })}`
707
+ : previewLines.join('\n'),
668
708
  hideCustomInput: true,
669
709
  })],
670
710
  });
@@ -690,7 +730,10 @@ async function deleteConfiguredProvider(deps, provider) {
690
730
  }
691
731
  // The catalog changed from here on: report 'deleted' whatever the
692
732
  // credential cleanup below does, so the caller invalidates completions.
693
- const pushedLines = [...lines];
733
+ const pushedLines = [
734
+ t('provider-line-action-deleted', { route: provider.route }),
735
+ ...previewLines.slice(1),
736
+ ];
694
737
  let keyCleanupFailed = false;
695
738
  if (provider.ref !== '') {
696
739
  if (provider.shadowed) {
@@ -757,13 +800,13 @@ function providerRowDescription(provider) {
757
800
  * and models lines; no credential values are ever rendered). */
758
801
  function buildDeleteSummary(provider) {
759
802
  const lines = [t('provider-line-route', { route: provider.route })];
760
- if (provider.baseURL !== undefined)
761
- lines.push(t('provider-line-baseurl', { url: provider.baseURL }));
762
- if (provider.api !== undefined)
763
- lines.push(t('provider-line-protocol', { api: provider.api }));
764
- lines.push(provider.models !== undefined && provider.models.length > 0
765
- ? t('provider-line-models', { models: provider.models.join(', ') })
766
- : t('provider-line-models-catalog'));
803
+ if (provider.baseURL !== undefined && provider.baseURL !== '') {
804
+ const endpoint = t('provider-line-endpoint', { url: provider.baseURL });
805
+ lines.push(provider.api !== undefined && provider.api !== ''
806
+ ? `${endpoint} · ${provider.api}`
807
+ : endpoint);
808
+ }
809
+ lines.push(modelsSummaryLine(provider.models ?? [], undefined));
767
810
  if (provider.ref !== '') {
768
811
  lines.push(provider.shadowed
769
812
  ? t('provider-line-keyref-env', { ref: provider.ref })
@@ -774,7 +817,9 @@ function buildDeleteSummary(provider) {
774
817
  /** Masked state line for one provider row in the OAuth pick question. */
775
818
  function oauthStateDescription(status) {
776
819
  if (status.signedIn) {
777
- return t('provider-oauth-state-in', { time: new Date(status.expiresAt ?? 0).toISOString() });
820
+ return status.expiresAt === undefined
821
+ ? t('provider-oauth-state-in-no-expiry')
822
+ : t('provider-oauth-state-in', { time: new Date(status.expiresAt).toISOString() });
778
823
  }
779
824
  return status.expired
780
825
  ? t('provider-oauth-state-expired')
@@ -829,7 +874,9 @@ async function runOAuthWizard(deps, oauth) {
829
874
  pushLocal('/provider', [
830
875
  t('provider-line-oauth-provider', { provider: result.provider }),
831
876
  t('provider-line-oauth-flow', { flow: result.oauthLabel }),
832
- t('provider-line-oauth-expires', { time: new Date(result.expiresAt).toISOString() }),
877
+ ...(result.expiresAt === undefined
878
+ ? []
879
+ : [t('provider-line-oauth-expires', { time: new Date(result.expiresAt).toISOString() })]),
833
880
  t('provider-switch-hint'),
834
881
  ]);
835
882
  notify(t('provider-oauth-login-ok', { provider: result.provider }), { color: 'success' });
@@ -868,21 +915,167 @@ function mergeModelIds(selected, custom) {
868
915
  }
869
916
  return ids;
870
917
  }
918
+ function modelCustomInput(answer, isCatalog, discovery, notify) {
919
+ const custom = answerText(answer, 'models');
920
+ if (custom !== '' && isCatalog && discovery.reason === 'unsupported-catalog') {
921
+ notify(t('provider-catalog-models-only'), { color: 'warning' });
922
+ return '';
923
+ }
924
+ return custom;
925
+ }
926
+ /**
927
+ * Discover the models of one route or draft in two passes.
928
+ *
929
+ * The upstream discovery seam answers a request that names a catalog
930
+ * `provider` from the installed static catalog without touching the network.
931
+ * A live probe therefore omits `provider`, but only when this adapter can
932
+ * supply a stable protocol and the route has no custom headers (the upstream
933
+ * seam cannot carry the named route's headers into an anonymous request).
934
+ * The listings merge: an id present in both resolves to its catalog row,
935
+ * endpoint-only ids append — those are the new models the wizard can surface.
936
+ *
937
+ * The `apiKey` field is omitted rather than sent empty when no key is
938
+ * knowable: an empty string is a hard invalid-credential upstream, while an
939
+ * absent field probes anonymously (a local gateway that needs no auth still
940
+ * lists its models).
941
+ */
942
+ async function discoverRouteModels(host, draft) {
943
+ const catalogResult = draft.provider !== undefined
944
+ ? await host.discoverModels({ provider: draft.provider }).then(rows => ({ rows, catalog: 'fetched' }), () => ({ rows: [], catalog: 'failed' }))
945
+ : { rows: [], catalog: 'unavailable' };
946
+ const catalogRows = catalogResult.rows;
947
+ const catalogIds = new Set(catalogRows.map(row => row.id));
948
+ if (draft.baseURL === undefined || draft.baseURL === '') {
949
+ return {
950
+ rows: catalogRows,
951
+ catalogIds,
952
+ catalog: catalogResult.catalog,
953
+ live: 'unavailable',
954
+ reason: 'no-base-url',
955
+ };
956
+ }
957
+ if (draft.hasCustomHeaders) {
958
+ return {
959
+ rows: catalogRows,
960
+ catalogIds,
961
+ catalog: catalogResult.catalog,
962
+ live: 'unavailable',
963
+ reason: 'custom-headers',
964
+ };
965
+ }
966
+ const api = draft.api ?? (draft.provider !== undefined
967
+ ? catalogLiveApi(draft.provider)
968
+ : undefined);
969
+ if (draft.provider !== undefined && api === undefined) {
970
+ return {
971
+ rows: catalogRows,
972
+ catalogIds,
973
+ catalog: catalogResult.catalog,
974
+ live: 'unavailable',
975
+ reason: 'unsupported-catalog',
976
+ };
977
+ }
978
+ const live = await host.discoverModels({
979
+ baseURL: draft.baseURL,
980
+ ...(api !== undefined && api !== '' ? { api } : {}),
981
+ ...(draft.apiKey !== undefined && draft.apiKey !== '' ? { apiKey: draft.apiKey } : {}),
982
+ }).then(rows => ({ rows, live: 'fetched' }), () => ({ rows: [], live: 'failed' }));
983
+ return {
984
+ rows: [...catalogRows, ...live.rows.filter(row => !catalogIds.has(row.id))],
985
+ catalogIds,
986
+ catalog: catalogResult.catalog,
987
+ live: live.live,
988
+ };
989
+ }
990
+ /** Catalog routes whose protocol is stable enough for an un-named live probe. */
991
+ const CATALOG_LIVE_APIS = {
992
+ deepseek: 'openai-completions',
993
+ openai: 'openai-responses',
994
+ anthropic: 'anthropic-messages',
995
+ };
996
+ function catalogLiveApi(provider) {
997
+ return CATALOG_LIVE_APIS[provider];
998
+ }
999
+ function notifyDiscoveryStatus(notify, discovery) {
1000
+ if (discovery.catalog === 'failed') {
1001
+ notify(t('provider-catalog-fetch-failed'), { color: 'warning' });
1002
+ }
1003
+ if (discovery.live === 'failed') {
1004
+ notify(t('provider-live-fetch-failed'), { color: 'warning' });
1005
+ }
1006
+ else if (discovery.reason === 'unsupported-catalog' || discovery.reason === 'custom-headers') {
1007
+ notify(t('provider-live-fetch-unavailable'), { color: 'warning' });
1008
+ }
1009
+ }
1010
+ /** Compact capacity rendering for picker rows: 1000000 → 1M, 384000 → 384k. */
1011
+ function formatCapacity(n) {
1012
+ if (n >= 1_000_000 && n % 1_000_000 === 0)
1013
+ return `${n / 1_000_000}M`;
1014
+ if (n >= 1_000 && n % 1_000 === 0)
1015
+ return `${n / 1_000}k`;
1016
+ return `${n}`;
1017
+ }
1018
+ /**
1019
+ * Picker-row description for one discovered model. `isNew` tags an id the
1020
+ * installed catalog does not ship — it came from the live endpoint probe and
1021
+ * is the thing the user is most likely looking for.
1022
+ */
1023
+ function modelRowDescription(model, isNew) {
1024
+ const parts = [
1025
+ ...(isNew ? [t('provider-row-model-new')] : []),
1026
+ ...(model.name !== undefined && model.name !== '' ? [model.name] : []),
1027
+ ...(model.contextWindow !== undefined ? [formatCapacity(model.contextWindow)] : []),
1028
+ ];
1029
+ return parts.length > 0 ? parts.join(' · ') : undefined;
1030
+ }
871
1031
  function buildSummaryLines(input) {
872
- const lines = [t('provider-line-route', { route: input.route })];
873
- lines.push(input.keyLine ?? (input.shadowed
1032
+ const lines = [input.action === 'preview'
1033
+ ? t('provider-line-route', { route: input.route })
1034
+ : input.action === 'added'
1035
+ ? t('provider-line-action-added', { route: input.route })
1036
+ : input.action === 'updated-models'
1037
+ ? t('provider-line-action-updated-models', { route: input.route })
1038
+ : t('provider-line-action-updated', { route: input.route })];
1039
+ lines.push((input.action === 'preview' && !input.shadowed && input.ref !== ''
1040
+ ? t('provider-line-keyref-preview', { ref: input.ref })
1041
+ : undefined) ?? input.keyLine ?? (input.shadowed
874
1042
  ? t('provider-line-keyref-env', { ref: input.ref })
875
1043
  : t('provider-line-keyref', { ref: input.ref })));
876
1044
  if (input.baseURL !== undefined && input.baseURL !== '') {
877
- lines.push(t('provider-line-baseurl', { url: input.baseURL }));
1045
+ // The wire protocol rides the endpoint line: it only ever varies per
1046
+ // endpoint, and a lone protocol row reads as filler.
1047
+ const endpoint = t('provider-line-endpoint', { url: input.baseURL });
1048
+ lines.push(input.api !== undefined && input.api !== ''
1049
+ ? `${endpoint} · ${input.api}`
1050
+ : endpoint);
878
1051
  }
879
- if (input.api !== undefined)
880
- lines.push(t('provider-line-protocol', { api: input.api }));
881
- lines.push(input.models.length > 0
882
- ? t('provider-line-models', { models: input.models.join(', ') })
883
- : t('provider-line-models-catalog'));
1052
+ lines.push(modelsSummaryLine(input.models, input.delta));
884
1053
  return lines;
885
1054
  }
1055
+ /** `Models: …` line with an optional (added · removed) delta suffix. */
1056
+ function modelsSummaryLine(models, delta) {
1057
+ const base = models.length > 0
1058
+ ? t('provider-line-models', { models: models.join(', ') })
1059
+ : t('provider-line-models-catalog');
1060
+ if (delta === undefined)
1061
+ return base;
1062
+ const parts = [];
1063
+ if (delta.added.length > 0)
1064
+ parts.push(t('provider-models-delta-added', { n: delta.added.length }));
1065
+ if (delta.removed.length > 0)
1066
+ parts.push(t('provider-models-delta-removed', { n: delta.removed.length }));
1067
+ return parts.length === 0 ? base
1068
+ : `${base}${t('provider-models-delta-wrap', { parts: parts.join(' · ') })}`;
1069
+ }
1070
+ /** Capacity fields for one discovered row, when the listing disclosed them. */
1071
+ function capsOf(model) {
1072
+ if (model === undefined)
1073
+ return {};
1074
+ return {
1075
+ ...(model.contextWindow !== undefined ? { contextWindow: model.contextWindow } : {}),
1076
+ ...(model.maxTokens !== undefined ? { maxTokens: model.maxTokens } : {}),
1077
+ };
1078
+ }
886
1079
  function buildProfile(input) {
887
1080
  const profile = {};
888
1081
  // Preserve the profile's credential shape: an empty ref (no apiKeyEnv)
@@ -893,24 +1086,23 @@ function buildProfile(input) {
893
1086
  profile['baseURL'] = input.baseURL;
894
1087
  if (input.isCatalog) {
895
1088
  // `models` replaces the catalog when present; omit it to keep the whole
896
- // catalog served.
1089
+ // catalog served. An id the installed catalog covers stays plain `{id}`
1090
+ // (the catalog carries versioned capabilities); an endpoint-only id
1091
+ // carries what the live listing disclosed.
897
1092
  if (input.models.length > 0) {
898
- profile['models'] = input.models.map(id => ({ id }));
1093
+ profile['models'] = input.models.map(id => ({
1094
+ id,
1095
+ ...((input.catalogDiscovery !== 'fetched' || input.catalogIds.has(id))
1096
+ ? {}
1097
+ : capsOf(input.discoveredById.get(id))),
1098
+ }));
899
1099
  }
900
1100
  return profile;
901
1101
  }
902
1102
  profile['api'] = input.api;
903
- profile['models'] = input.models.map(id => {
904
- const discovered = input.discoveredById.get(id);
905
- return {
906
- id,
907
- ...(discovered?.contextWindow !== undefined
908
- ? { contextWindow: discovered.contextWindow }
909
- : {}),
910
- ...(discovered?.maxTokens !== undefined
911
- ? { maxTokens: discovered.maxTokens }
912
- : {}),
913
- };
914
- });
1103
+ profile['models'] = input.models.map(id => ({
1104
+ id,
1105
+ ...capsOf(input.discoveredById.get(id)),
1106
+ }));
915
1107
  return profile;
916
1108
  }