@deepseek-harness-tui/dsh-tui 0.14.1 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (886) hide show
  1. package/README.md +163 -17
  2. package/bin/dsh-tui.js +200 -34
  3. package/cordis.patch.yml +16 -52
  4. package/cordis.yml +6 -2
  5. package/guide/dsh-tui-guide/claude-backend.en.md +44 -7
  6. package/guide/dsh-tui-guide/claude-backend.md +28 -6
  7. package/guide/dsh-tui-guide/codex-backend.en.md +47 -10
  8. package/guide/dsh-tui-guide/codex-backend.md +26 -4
  9. package/guide/dsh-tui-guide/configuration.en.md +168 -18
  10. package/guide/dsh-tui-guide/configuration.md +144 -16
  11. package/guide/dsh-tui-guide/getting-started.en.md +15 -0
  12. package/guide/dsh-tui-guide/getting-started.md +15 -0
  13. package/guide/dsh-tui-guide/interaction.en.md +64 -24
  14. package/guide/dsh-tui-guide/interaction.md +49 -19
  15. package/guide/dsh-tui-guide/plugins.en.md +97 -3
  16. package/guide/dsh-tui-guide/plugins.md +55 -2
  17. package/guide/dsh-tui-guide/themes.en.md +23 -14
  18. package/guide/dsh-tui-guide/themes.md +19 -12
  19. package/guide/dsh-tui-guide/user-guide.en.md +53 -21
  20. package/guide/dsh-tui-guide/user-guide.md +43 -22
  21. package/lib/settings.json +103 -9
  22. package/lib/types/adapter/channel/projection.d.ts.map +1 -1
  23. package/lib/types/adapter/channel/projection.js +1 -0
  24. package/lib/types/adapter/channel/ui-policy.d.ts +1 -1
  25. package/lib/types/adapter/channel/ui-policy.d.ts.map +1 -1
  26. package/lib/types/adapter/channel/ui-policy.js +4 -0
  27. package/lib/types/adapter/channel/ui.d.ts +2 -0
  28. package/lib/types/adapter/channel/ui.d.ts.map +1 -1
  29. package/lib/types/adapter/channel/ui.js +6 -2
  30. package/lib/types/adapter/kernel/runtime.d.ts.map +1 -1
  31. package/lib/types/adapter/kernel/runtime.js +2 -0
  32. package/lib/types/adapter/ports/channel-catalog.d.ts +5 -1
  33. package/lib/types/adapter/ports/channel-catalog.d.ts.map +1 -1
  34. package/lib/types/adapter/ports/channel-settings.d.ts +14 -3
  35. package/lib/types/adapter/ports/channel-settings.d.ts.map +1 -1
  36. package/lib/types/adapter/ports/channel-ui.d.ts +56 -12
  37. package/lib/types/adapter/ports/channel-ui.d.ts.map +1 -1
  38. package/lib/types/adapter/ports/channel-view.d.ts +68 -0
  39. package/lib/types/adapter/ports/channel-view.d.ts.map +1 -1
  40. package/lib/types/adapter/ports/channel.d.ts +2 -0
  41. package/lib/types/adapter/ports/channel.d.ts.map +1 -1
  42. package/lib/types/adapter/spec/backend-capabilities.d.ts +22 -0
  43. package/lib/types/adapter/spec/backend-capabilities.d.ts.map +1 -0
  44. package/lib/types/adapter/spec/backend-capabilities.js +49 -0
  45. package/lib/types/adapter/spec/protocol-constants.d.ts.map +1 -1
  46. package/lib/types/adapter/spec/protocol-constants.js +10 -3
  47. package/lib/types/adapter/spec/tui-contributions.d.ts +3 -0
  48. package/lib/types/adapter/spec/tui-contributions.d.ts.map +1 -1
  49. package/lib/types/adapter/spec/tui-contributions.js +7 -0
  50. package/lib/types/adapter/standard/registry.d.ts +6 -0
  51. package/lib/types/adapter/standard/registry.d.ts.map +1 -1
  52. package/lib/types/adapter/standard/registry.js +65 -15
  53. package/lib/types/adapter/standard/tui-extension.d.ts.map +1 -1
  54. package/lib/types/adapter/standard/tui-extension.js +7 -1
  55. package/lib/types/adapter/standard/types.d.ts +10 -1
  56. package/lib/types/adapter/standard/types.d.ts.map +1 -1
  57. package/lib/types/adapter/upstream/host-descriptor-driver.d.ts.map +1 -1
  58. package/lib/types/adapter/upstream/host-descriptor-driver.js +52 -0
  59. package/lib/types/agent/backend-manifest.d.ts +152 -0
  60. package/lib/types/agent/backend-manifest.d.ts.map +1 -0
  61. package/lib/types/agent/backend-manifest.js +14 -0
  62. package/lib/types/agent/backend.d.ts +71 -5
  63. package/lib/types/agent/backend.d.ts.map +1 -1
  64. package/lib/types/agent/capabilities.d.ts +6 -0
  65. package/lib/types/agent/capabilities.d.ts.map +1 -1
  66. package/lib/types/agent/events.d.ts +3 -2
  67. package/lib/types/agent/events.d.ts.map +1 -1
  68. package/lib/types/agent/index.d.ts +2 -0
  69. package/lib/types/agent/index.d.ts.map +1 -1
  70. package/lib/types/agent/refs.d.ts +11 -1
  71. package/lib/types/agent/refs.d.ts.map +1 -1
  72. package/lib/types/agent/starting-session.d.ts +4 -0
  73. package/lib/types/agent/starting-session.d.ts.map +1 -0
  74. package/lib/types/agent/starting-session.js +19 -0
  75. package/lib/types/backends/claude/activity.d.ts +1 -1
  76. package/lib/types/backends/claude/activity.d.ts.map +1 -1
  77. package/lib/types/backends/claude/activity.js +5 -5
  78. package/lib/types/backends/claude/auth.d.ts.map +1 -1
  79. package/lib/types/backends/claude/auth.js +10 -3
  80. package/lib/types/backends/claude/backend.d.ts.map +1 -1
  81. package/lib/types/backends/claude/backend.js +103 -29
  82. package/lib/types/backends/claude/catalog.d.ts +2 -1
  83. package/lib/types/backends/claude/catalog.d.ts.map +1 -1
  84. package/lib/types/backends/claude/catalog.js +15 -5
  85. package/lib/types/backends/claude/channels.d.ts +5 -3
  86. package/lib/types/backends/claude/channels.d.ts.map +1 -1
  87. package/lib/types/backends/claude/channels.js +5 -4
  88. package/lib/types/backends/claude/contract.d.ts +4 -0
  89. package/lib/types/backends/claude/contract.d.ts.map +1 -1
  90. package/lib/types/backends/claude/contract.js +4 -0
  91. package/lib/types/backends/claude/controls.d.ts +4 -0
  92. package/lib/types/backends/claude/controls.d.ts.map +1 -1
  93. package/lib/types/backends/claude/controls.js +34 -42
  94. package/lib/types/backends/claude/dialogs.d.ts +8 -2
  95. package/lib/types/backends/claude/dialogs.d.ts.map +1 -1
  96. package/lib/types/backends/claude/dialogs.js +24 -16
  97. package/lib/types/backends/claude/images.d.ts +1 -1
  98. package/lib/types/backends/claude/images.d.ts.map +1 -1
  99. package/lib/types/backends/claude/images.js +7 -7
  100. package/lib/types/backends/claude/manifest.d.ts +21 -0
  101. package/lib/types/backends/claude/manifest.d.ts.map +1 -0
  102. package/lib/types/backends/claude/manifest.js +29 -0
  103. package/lib/types/backends/claude/older-history.js +2 -2
  104. package/lib/types/backends/claude/permissions.js +11 -11
  105. package/lib/types/backends/claude/prefs.d.ts +4 -2
  106. package/lib/types/backends/claude/prefs.d.ts.map +1 -1
  107. package/lib/types/backends/claude/prefs.js +4 -3
  108. package/lib/types/backends/claude/process.d.ts +16 -4
  109. package/lib/types/backends/claude/process.d.ts.map +1 -1
  110. package/lib/types/backends/claude/process.js +100 -37
  111. package/lib/types/backends/claude/send-message.d.ts +1 -1
  112. package/lib/types/backends/claude/send-message.d.ts.map +1 -1
  113. package/lib/types/backends/claude/session/auth.js +22 -22
  114. package/lib/types/backends/claude/session/channels.d.ts +4 -0
  115. package/lib/types/backends/claude/session/channels.d.ts.map +1 -1
  116. package/lib/types/backends/claude/session/channels.js +5 -3
  117. package/lib/types/backends/claude/session/lifecycle.d.ts.map +1 -1
  118. package/lib/types/backends/claude/session/lifecycle.js +31 -23
  119. package/lib/types/backends/claude/session/store.js +8 -8
  120. package/lib/types/backends/claude/session/subagents.js +2 -2
  121. package/lib/types/backends/claude/session/types.d.ts +7 -0
  122. package/lib/types/backends/claude/session/types.d.ts.map +1 -1
  123. package/lib/types/backends/claude/side-query.js +3 -3
  124. package/lib/types/backends/claude/task-output.js +5 -5
  125. package/lib/types/backends/claude/text.d.ts +778 -0
  126. package/lib/types/backends/claude/text.d.ts.map +1 -0
  127. package/lib/types/backends/claude/text.js +298 -0
  128. package/lib/types/backends/claude/transcript-file.d.ts +1 -1
  129. package/lib/types/backends/claude/transcript-file.d.ts.map +1 -1
  130. package/lib/types/backends/claude/transcript-file.js +4 -4
  131. package/lib/types/backends/claude/translate/attempts.js +2 -2
  132. package/lib/types/backends/claude/translate/core.js +3 -3
  133. package/lib/types/backends/claude/translate/messages.js +4 -4
  134. package/lib/types/backends/claude/translate/system.js +14 -14
  135. package/lib/types/backends/claude/translate/tasks.js +2 -2
  136. package/lib/types/backends/claude/translate/types.d.ts +1 -1
  137. package/lib/types/backends/claude/translate/types.d.ts.map +1 -1
  138. package/lib/types/backends/codex/auth/external-tokens.js +16 -16
  139. package/lib/types/backends/codex/auth/status.js +14 -14
  140. package/lib/types/backends/codex/backend.d.ts +4 -19
  141. package/lib/types/backends/codex/backend.d.ts.map +1 -1
  142. package/lib/types/backends/codex/backend.js +118 -25
  143. package/lib/types/backends/codex/catalog.d.ts +2 -1
  144. package/lib/types/backends/codex/catalog.d.ts.map +1 -1
  145. package/lib/types/backends/codex/catalog.js +63 -18
  146. package/lib/types/backends/codex/channels.d.ts +6 -3
  147. package/lib/types/backends/codex/channels.d.ts.map +1 -1
  148. package/lib/types/backends/codex/channels.js +15 -13
  149. package/lib/types/backends/codex/contract.d.ts +3 -0
  150. package/lib/types/backends/codex/contract.d.ts.map +1 -1
  151. package/lib/types/backends/codex/contract.js +3 -0
  152. package/lib/types/backends/codex/detect.d.ts.map +1 -1
  153. package/lib/types/backends/codex/detect.js +9 -6
  154. package/lib/types/backends/codex/manifest.d.ts +30 -0
  155. package/lib/types/backends/codex/manifest.d.ts.map +1 -0
  156. package/lib/types/backends/codex/manifest.js +23 -0
  157. package/lib/types/backends/codex/prefs.d.ts +4 -2
  158. package/lib/types/backends/codex/prefs.d.ts.map +1 -1
  159. package/lib/types/backends/codex/prefs.js +4 -3
  160. package/lib/types/backends/codex/rpc/hub.js +2 -2
  161. package/lib/types/backends/codex/session/activity.d.ts +1 -1
  162. package/lib/types/backends/codex/session/activity.d.ts.map +1 -1
  163. package/lib/types/backends/codex/session/activity.js +13 -13
  164. package/lib/types/backends/codex/session/approvals.js +30 -30
  165. package/lib/types/backends/codex/session/async-questions.d.ts +17 -0
  166. package/lib/types/backends/codex/session/async-questions.d.ts.map +1 -0
  167. package/lib/types/backends/codex/session/async-questions.js +89 -0
  168. package/lib/types/backends/codex/session/commands.d.ts +8 -2
  169. package/lib/types/backends/codex/session/commands.d.ts.map +1 -1
  170. package/lib/types/backends/codex/session/commands.js +71 -23
  171. package/lib/types/backends/codex/session/controls.d.ts +1 -1
  172. package/lib/types/backends/codex/session/controls.d.ts.map +1 -1
  173. package/lib/types/backends/codex/session/controls.js +21 -16
  174. package/lib/types/backends/codex/session/goals.d.ts.map +1 -1
  175. package/lib/types/backends/codex/session/goals.js +3 -3
  176. package/lib/types/backends/codex/session/history.js +2 -2
  177. package/lib/types/backends/codex/session/images.js +8 -8
  178. package/lib/types/backends/codex/session/input.d.ts +6 -2
  179. package/lib/types/backends/codex/session/input.d.ts.map +1 -1
  180. package/lib/types/backends/codex/session/input.js +55 -13
  181. package/lib/types/backends/codex/session/plan-review.js +6 -6
  182. package/lib/types/backends/codex/session/session.d.ts.map +1 -1
  183. package/lib/types/backends/codex/session/session.js +100 -42
  184. package/lib/types/backends/codex/session/side-query.d.ts.map +1 -1
  185. package/lib/types/backends/codex/session/side-query.js +27 -9
  186. package/lib/types/backends/codex/session/state.d.ts +6 -1
  187. package/lib/types/backends/codex/session/state.d.ts.map +1 -1
  188. package/lib/types/backends/codex/session/subagents.js +5 -5
  189. package/lib/types/backends/codex/session/tasks.js +4 -4
  190. package/lib/types/backends/codex/text.d.ts +933 -0
  191. package/lib/types/backends/codex/text.d.ts.map +1 -0
  192. package/lib/types/backends/codex/text.js +313 -0
  193. package/lib/types/backends/codex/translate/items.d.ts.map +1 -1
  194. package/lib/types/backends/codex/translate/items.js +7 -5
  195. package/lib/types/backends/codex/translate/live.d.ts.map +1 -1
  196. package/lib/types/backends/codex/translate/live.js +11 -8
  197. package/lib/types/backends/codex/translate/notices.js +10 -10
  198. package/lib/types/backends/codex/translate/question-reply.d.ts +11 -0
  199. package/lib/types/backends/codex/translate/question-reply.d.ts.map +1 -0
  200. package/lib/types/backends/codex/translate/question-reply.js +53 -0
  201. package/lib/types/backends/shared/channel-slug.d.ts +4 -0
  202. package/lib/types/backends/shared/channel-slug.d.ts.map +1 -0
  203. package/lib/types/backends/shared/channel-slug.js +25 -0
  204. package/lib/types/backends/shared/channel-tokens.d.ts.map +1 -1
  205. package/lib/types/backends/shared/channel-tokens.js +30 -23
  206. package/lib/types/{channel → backends/shared}/elicitation.d.ts +78 -21
  207. package/lib/types/backends/shared/elicitation.d.ts.map +1 -0
  208. package/lib/types/{channel → backends/shared}/elicitation.js +64 -66
  209. package/lib/types/backends/shared/image-size.d.ts +33 -0
  210. package/lib/types/backends/shared/image-size.d.ts.map +1 -0
  211. package/lib/types/backends/shared/image-size.js +134 -0
  212. package/lib/types/{utils → backends/shared}/jsonl.d.ts +5 -1
  213. package/lib/types/backends/shared/jsonl.d.ts.map +1 -0
  214. package/lib/types/{utils → backends/shared}/jsonl.js +5 -1
  215. package/lib/types/backends/shared/localized-text.d.ts +30 -0
  216. package/lib/types/backends/shared/localized-text.d.ts.map +1 -0
  217. package/lib/types/backends/shared/localized-text.js +24 -0
  218. package/lib/types/backends/shared/platform-text.d.ts +88 -0
  219. package/lib/types/backends/shared/platform-text.d.ts.map +1 -0
  220. package/lib/types/backends/shared/platform-text.js +33 -0
  221. package/lib/types/branding.d.ts +13 -0
  222. package/lib/types/branding.d.ts.map +1 -1
  223. package/lib/types/branding.js +18 -0
  224. package/lib/types/channel/channel-slug.d.ts +3 -1
  225. package/lib/types/channel/channel-slug.d.ts.map +1 -1
  226. package/lib/types/channel/channel-slug.js +3 -1
  227. package/lib/types/channel/projection.d.ts.map +1 -1
  228. package/lib/types/channel/projection.js +10 -0
  229. package/lib/types/channel/sanitize.d.ts +7 -0
  230. package/lib/types/channel/sanitize.d.ts.map +1 -1
  231. package/lib/types/channel/sanitize.js +9 -0
  232. package/lib/types/channel/usage.d.ts.map +1 -1
  233. package/lib/types/channel/usage.js +5 -0
  234. package/lib/types/commands.d.ts +15 -0
  235. package/lib/types/commands.d.ts.map +1 -1
  236. package/lib/types/commands.js +58 -10
  237. package/lib/types/components/AgentMessageComposer.d.ts.map +1 -1
  238. package/lib/types/components/AgentMessageComposer.js +3 -2
  239. package/lib/types/components/BtwPanel.d.ts.map +1 -1
  240. package/lib/types/components/BtwPanel.js +4 -2
  241. package/lib/types/components/Chat/JobCard.js +3 -3
  242. package/lib/types/components/CommandSuggestions.d.ts.map +1 -1
  243. package/lib/types/components/CommandSuggestions.js +24 -7
  244. package/lib/types/components/ContextBarView.d.ts +5 -1
  245. package/lib/types/components/ContextBarView.d.ts.map +1 -1
  246. package/lib/types/components/ContextBarView.js +6 -3
  247. package/lib/types/components/ExtensionDialog.d.ts.map +1 -1
  248. package/lib/types/components/ExtensionDialog.js +2 -3
  249. package/lib/types/components/GoalTodoPanel.d.ts.map +1 -1
  250. package/lib/types/components/GoalTodoPanel.js +14 -3
  251. package/lib/types/components/InlineMathParagraph.js +1 -1
  252. package/lib/types/components/KernelPicker.d.ts.map +1 -1
  253. package/lib/types/components/KernelPicker.js +1 -1
  254. package/lib/types/components/LogoV2.d.ts +4 -1
  255. package/lib/types/components/LogoV2.d.ts.map +1 -1
  256. package/lib/types/components/LogoV2.js +14 -9
  257. package/lib/types/components/MarkdownTable.d.ts.map +1 -1
  258. package/lib/types/components/MarkdownTable.js +4 -3
  259. package/lib/types/components/MessageList.d.ts.map +1 -1
  260. package/lib/types/components/MessageList.js +109 -15
  261. package/lib/types/components/ModelPicker.d.ts +24 -31
  262. package/lib/types/components/ModelPicker.d.ts.map +1 -1
  263. package/lib/types/components/ModelPicker.js +115 -40
  264. package/lib/types/components/PermissionsPicker.d.ts +10 -1
  265. package/lib/types/components/PermissionsPicker.d.ts.map +1 -1
  266. package/lib/types/components/PermissionsPicker.js +24 -16
  267. package/lib/types/components/PluginInstallPane.d.ts +21 -0
  268. package/lib/types/components/PluginInstallPane.d.ts.map +1 -0
  269. package/lib/types/components/PluginInstallPane.js +84 -0
  270. package/lib/types/components/PluginManagePane.d.ts +21 -0
  271. package/lib/types/components/PluginManagePane.d.ts.map +1 -0
  272. package/lib/types/components/PluginManagePane.js +69 -0
  273. package/lib/types/components/PromptEditor.d.ts +3 -3
  274. package/lib/types/components/PromptInput.d.ts +21 -3
  275. package/lib/types/components/PromptInput.d.ts.map +1 -1
  276. package/lib/types/components/PromptInput.js +65 -121
  277. package/lib/types/components/SdkInstallWizard.d.ts +3 -1
  278. package/lib/types/components/SdkInstallWizard.d.ts.map +1 -1
  279. package/lib/types/components/SdkInstallWizard.js +8 -1
  280. package/lib/types/components/SearchBox.d.ts +13 -15
  281. package/lib/types/components/SearchBox.d.ts.map +1 -1
  282. package/lib/types/components/SearchBox.js +58 -27
  283. package/lib/types/components/SubagentCard.d.ts +13 -1
  284. package/lib/types/components/SubagentCard.d.ts.map +1 -1
  285. package/lib/types/components/SubagentCard.js +27 -12
  286. package/lib/types/components/SubagentDashboard.d.ts +8 -1
  287. package/lib/types/components/SubagentDashboard.d.ts.map +1 -1
  288. package/lib/types/components/SubagentDashboard.js +58 -16
  289. package/lib/types/components/ThemePicker.d.ts +1 -1
  290. package/lib/types/components/ThemePicker.d.ts.map +1 -1
  291. package/lib/types/components/ThemePicker.js +14 -11
  292. package/lib/types/components/Tooltip.js +1 -1
  293. package/lib/types/components/WorkingSpinner.js +1 -1
  294. package/lib/types/components/WorkspaceFlowPicker.d.ts.map +1 -1
  295. package/lib/types/components/WorkspaceFlowPicker.js +4 -3
  296. package/lib/types/components/composerImageTokens.d.ts +24 -0
  297. package/lib/types/components/composerImageTokens.d.ts.map +1 -0
  298. package/lib/types/components/composerImageTokens.js +37 -0
  299. package/lib/types/components/design-system/InputCaret.d.ts +7 -0
  300. package/lib/types/components/design-system/InputCaret.d.ts.map +1 -0
  301. package/lib/types/components/design-system/InputCaret.js +9 -0
  302. package/lib/types/components/design-system/ListItem.d.ts +13 -2
  303. package/lib/types/components/design-system/ListItem.d.ts.map +1 -1
  304. package/lib/types/components/design-system/ListItem.js +11 -5
  305. package/lib/types/components/design-system/ThemeProvider.d.ts.map +1 -1
  306. package/lib/types/components/design-system/ThemeProvider.js +6 -8
  307. package/lib/types/components/kernelCatalog.d.ts +55 -11
  308. package/lib/types/components/kernelCatalog.d.ts.map +1 -1
  309. package/lib/types/components/kernelCatalog.js +42 -23
  310. package/lib/types/components/launchpadActions.d.ts +4 -0
  311. package/lib/types/components/launchpadActions.d.ts.map +1 -1
  312. package/lib/types/components/launchpadActions.js +5 -4
  313. package/lib/types/components/launchpadLayout.d.ts +14 -1
  314. package/lib/types/components/launchpadLayout.d.ts.map +1 -1
  315. package/lib/types/components/launchpadLayout.js +38 -19
  316. package/lib/types/components/messages/TeamMessageBubble.d.ts +20 -0
  317. package/lib/types/components/messages/TeamMessageBubble.d.ts.map +1 -0
  318. package/lib/types/components/messages/TeamMessageBubble.js +15 -0
  319. package/lib/types/components/messages/UserPromptMessage.d.ts +4 -3
  320. package/lib/types/components/messages/UserPromptMessage.d.ts.map +1 -1
  321. package/lib/types/components/messages/UserPromptMessage.js +4 -3
  322. package/lib/types/components/questions/AskUserQuestionPanel.d.ts.map +1 -1
  323. package/lib/types/components/questions/AskUserQuestionPanel.js +8 -3
  324. package/lib/types/components/questions/PlanReviewPanel.d.ts.map +1 -1
  325. package/lib/types/components/questions/PlanReviewPanel.js +4 -3
  326. package/lib/types/components/questions/ProviderModelEditor.d.ts.map +1 -1
  327. package/lib/types/components/questions/ProviderModelEditor.js +3 -13
  328. package/lib/types/components/sessions/ForeignSessionRow.d.ts +3 -1
  329. package/lib/types/components/sessions/ForeignSessionRow.d.ts.map +1 -1
  330. package/lib/types/components/sessions/ForeignSessionRow.js +5 -2
  331. package/lib/types/components/sessions/SessionListRow.d.ts +3 -1
  332. package/lib/types/components/sessions/SessionListRow.d.ts.map +1 -1
  333. package/lib/types/components/sessions/SessionListRow.js +5 -2
  334. package/lib/types/components/sidePanel/PanelBar.d.ts +1 -0
  335. package/lib/types/components/sidePanel/PanelBar.d.ts.map +1 -1
  336. package/lib/types/components/sidePanel/PanelBar.js +21 -17
  337. package/lib/types/components/sidePanel/PanelHost.d.ts.map +1 -1
  338. package/lib/types/components/sidePanel/PanelHost.js +5 -1
  339. package/lib/types/components/sidePanel/PanelStore.d.ts +8 -0
  340. package/lib/types/components/sidePanel/PanelStore.d.ts.map +1 -1
  341. package/lib/types/components/sidePanel/PanelStore.js +11 -0
  342. package/lib/types/components/sidePanel/SidePanelColumn.d.ts +1 -1
  343. package/lib/types/components/sidePanel/SidePanelColumn.d.ts.map +1 -1
  344. package/lib/types/components/sidePanel/SidePanelColumn.js +15 -2
  345. package/lib/types/components/sidePanel/SidePanelLayout.d.ts +6 -4
  346. package/lib/types/components/sidePanel/SidePanelLayout.d.ts.map +1 -1
  347. package/lib/types/components/sidePanel/SidePanelLayout.js +33 -7
  348. package/lib/types/components/sidePanel/SidePanelRuntimeContext.d.ts +7 -0
  349. package/lib/types/components/sidePanel/SidePanelRuntimeContext.d.ts.map +1 -1
  350. package/lib/types/components/sidePanel/SidePanelRuntimeContext.js +4 -0
  351. package/lib/types/components/sidePanel/btw/BtwComposer.d.ts +7 -2
  352. package/lib/types/components/sidePanel/btw/BtwComposer.d.ts.map +1 -1
  353. package/lib/types/components/sidePanel/btw/BtwComposer.js +28 -8
  354. package/lib/types/components/sidePanel/btw/BtwPanelAdapter.d.ts +2 -1
  355. package/lib/types/components/sidePanel/btw/BtwPanelAdapter.d.ts.map +1 -1
  356. package/lib/types/components/sidePanel/btw/BtwPanelAdapter.js +156 -21
  357. package/lib/types/components/sidePanel/btw/BtwThreadScene.d.ts +6 -2
  358. package/lib/types/components/sidePanel/btw/BtwThreadScene.d.ts.map +1 -1
  359. package/lib/types/components/sidePanel/btw/BtwThreadScene.js +64 -16
  360. package/lib/types/components/sidePanel/btw/BtwThreadView.d.ts +15 -5
  361. package/lib/types/components/sidePanel/btw/BtwThreadView.d.ts.map +1 -1
  362. package/lib/types/components/sidePanel/btw/BtwThreadView.js +101 -10
  363. package/lib/types/components/sidePanel/btw/threads.d.ts +18 -0
  364. package/lib/types/components/sidePanel/btw/threads.d.ts.map +1 -1
  365. package/lib/types/components/sidePanel/btw/threads.js +51 -0
  366. package/lib/types/components/sidePanel/builtinPanels.d.ts.map +1 -1
  367. package/lib/types/components/sidePanel/builtinPanels.js +5 -1
  368. package/lib/types/components/sidePanel/companion/CompanionPanel.js +2 -2
  369. package/lib/types/components/sidePanel/companion/SplashMascot.d.ts +5 -1
  370. package/lib/types/components/sidePanel/companion/SplashMascot.d.ts.map +1 -1
  371. package/lib/types/components/sidePanel/companion/SplashMascot.js +19 -4
  372. package/lib/types/components/sidePanel/companion/skins.d.ts +8 -0
  373. package/lib/types/components/sidePanel/companion/skins.d.ts.map +1 -1
  374. package/lib/types/components/sidePanel/companion/skins.js +57 -12
  375. package/lib/types/components/sidePanel/types.d.ts +7 -1
  376. package/lib/types/components/sidePanel/types.d.ts.map +1 -1
  377. package/lib/types/components/sidePanel/useSidePanel.d.ts +2 -0
  378. package/lib/types/components/sidePanel/useSidePanel.d.ts.map +1 -1
  379. package/lib/types/components/sidePanel/useSidePanel.js +11 -1
  380. package/lib/types/components/splashArtRows.d.ts +29 -0
  381. package/lib/types/components/splashArtRows.d.ts.map +1 -0
  382. package/lib/types/components/splashArtRows.js +31 -0
  383. package/lib/types/components/splashFonts.d.ts +24 -1
  384. package/lib/types/components/splashFonts.d.ts.map +1 -1
  385. package/lib/types/components/splashFonts.js +40 -5
  386. package/lib/types/components/teamRoster.d.ts +70 -0
  387. package/lib/types/components/teamRoster.d.ts.map +1 -0
  388. package/lib/types/components/teamRoster.js +78 -0
  389. package/lib/types/components/workspaces/HomeWorkspaceRow.d.ts +3 -1
  390. package/lib/types/components/workspaces/HomeWorkspaceRow.d.ts.map +1 -1
  391. package/lib/types/components/workspaces/HomeWorkspaceRow.js +5 -2
  392. package/lib/types/dsh-adapter/admission-loader.d.ts +102 -0
  393. package/lib/types/dsh-adapter/admission-loader.d.ts.map +1 -0
  394. package/lib/types/dsh-adapter/admission-loader.js +301 -0
  395. package/lib/types/dsh-adapter/agent-view.d.ts.map +1 -1
  396. package/lib/types/dsh-adapter/agent-view.js +3 -1
  397. package/lib/types/dsh-adapter/approvals.d.ts +7 -0
  398. package/lib/types/dsh-adapter/approvals.d.ts.map +1 -1
  399. package/lib/types/dsh-adapter/approvals.js +45 -1
  400. package/lib/types/dsh-adapter/backend/translate.d.ts.map +1 -1
  401. package/lib/types/dsh-adapter/backend/translate.js +71 -8
  402. package/lib/types/dsh-adapter/backend-admission.d.ts +64 -0
  403. package/lib/types/dsh-adapter/backend-admission.d.ts.map +1 -0
  404. package/lib/types/dsh-adapter/backend-admission.js +34 -0
  405. package/lib/types/dsh-adapter/backend-assembly.d.ts +31 -0
  406. package/lib/types/dsh-adapter/backend-assembly.d.ts.map +1 -0
  407. package/lib/types/dsh-adapter/backend-assembly.js +225 -0
  408. package/lib/types/dsh-adapter/backend-contribution.d.ts +62 -0
  409. package/lib/types/dsh-adapter/backend-contribution.d.ts.map +1 -0
  410. package/lib/types/dsh-adapter/backend-contribution.js +78 -0
  411. package/lib/types/dsh-adapter/backend-registry.d.ts +136 -0
  412. package/lib/types/dsh-adapter/backend-registry.d.ts.map +1 -0
  413. package/lib/types/dsh-adapter/backend-registry.js +304 -0
  414. package/lib/types/dsh-adapter/backends.d.ts +67 -24
  415. package/lib/types/dsh-adapter/backends.d.ts.map +1 -1
  416. package/lib/types/dsh-adapter/backends.generated.d.ts +12 -0
  417. package/lib/types/dsh-adapter/backends.generated.d.ts.map +1 -0
  418. package/lib/types/dsh-adapter/backends.generated.js +6 -0
  419. package/lib/types/dsh-adapter/backends.js +91 -46
  420. package/lib/types/dsh-adapter/bundled-presets.d.ts.map +1 -1
  421. package/lib/types/dsh-adapter/bundled-presets.js +60 -3
  422. package/lib/types/dsh-adapter/channel/action-readiness.d.ts +2 -0
  423. package/lib/types/dsh-adapter/channel/action-readiness.d.ts.map +1 -1
  424. package/lib/types/dsh-adapter/channel/action-readiness.js +9 -3
  425. package/lib/types/dsh-adapter/channel/agent-view-projection.js +2 -2
  426. package/lib/types/dsh-adapter/channel/background-action.d.ts.map +1 -1
  427. package/lib/types/dsh-adapter/channel/background-action.js +8 -3
  428. package/lib/types/dsh-adapter/channel/binding-events.d.ts +17 -3
  429. package/lib/types/dsh-adapter/channel/binding-events.d.ts.map +1 -1
  430. package/lib/types/dsh-adapter/channel/binding-events.js +19 -46
  431. package/lib/types/dsh-adapter/channel/channel-host.d.ts +45 -0
  432. package/lib/types/dsh-adapter/channel/channel-host.d.ts.map +1 -0
  433. package/lib/types/dsh-adapter/channel/channel-host.js +1 -0
  434. package/lib/types/dsh-adapter/channel/command-completions.d.ts +5 -0
  435. package/lib/types/dsh-adapter/channel/command-completions.d.ts.map +1 -1
  436. package/lib/types/dsh-adapter/channel/command-completions.js +79 -6
  437. package/lib/types/dsh-adapter/channel/compaction.d.ts +7 -2
  438. package/lib/types/dsh-adapter/channel/compaction.d.ts.map +1 -1
  439. package/lib/types/dsh-adapter/channel/compaction.js +100 -26
  440. package/lib/types/dsh-adapter/channel/composer-images.d.ts +4 -2
  441. package/lib/types/dsh-adapter/channel/composer-images.d.ts.map +1 -1
  442. package/lib/types/dsh-adapter/channel/composer-images.js +36 -5
  443. package/lib/types/dsh-adapter/channel/cordis-host.d.ts +14 -0
  444. package/lib/types/dsh-adapter/channel/cordis-host.d.ts.map +1 -0
  445. package/lib/types/dsh-adapter/channel/cordis-host.js +35 -0
  446. package/lib/types/dsh-adapter/channel/core/actions.d.ts +3 -3
  447. package/lib/types/dsh-adapter/channel/core/actions.d.ts.map +1 -1
  448. package/lib/types/dsh-adapter/channel/core/actions.js +15 -6
  449. package/lib/types/dsh-adapter/channel/core/binding-feed.d.ts +10 -3
  450. package/lib/types/dsh-adapter/channel/core/binding-feed.d.ts.map +1 -1
  451. package/lib/types/dsh-adapter/channel/core/binding-feed.js +5 -1
  452. package/lib/types/dsh-adapter/channel/core/compose.d.ts +12 -28
  453. package/lib/types/dsh-adapter/channel/core/compose.d.ts.map +1 -1
  454. package/lib/types/dsh-adapter/channel/core/compose.js +330 -117
  455. package/lib/types/dsh-adapter/channel/core/files.d.ts +7 -2
  456. package/lib/types/dsh-adapter/channel/core/files.d.ts.map +1 -1
  457. package/lib/types/dsh-adapter/channel/core/files.js +1 -0
  458. package/lib/types/dsh-adapter/channel/core/host.d.ts +12 -6
  459. package/lib/types/dsh-adapter/channel/core/host.d.ts.map +1 -1
  460. package/lib/types/dsh-adapter/channel/core/host.js +69 -35
  461. package/lib/types/dsh-adapter/channel/core/local-actions.d.ts +5 -3
  462. package/lib/types/dsh-adapter/channel/core/local-actions.d.ts.map +1 -1
  463. package/lib/types/dsh-adapter/channel/core/local-actions.js +5 -2
  464. package/lib/types/dsh-adapter/channel/core/session-controls.js +2 -2
  465. package/lib/types/dsh-adapter/channel/core/session-switch.d.ts +7 -4
  466. package/lib/types/dsh-adapter/channel/core/session-switch.d.ts.map +1 -1
  467. package/lib/types/dsh-adapter/channel/core/session-switch.js +8 -4
  468. package/lib/types/dsh-adapter/channel/core/sessions.d.ts +1 -1
  469. package/lib/types/dsh-adapter/channel/core/sessions.d.ts.map +1 -1
  470. package/lib/types/dsh-adapter/channel/core/sessions.js +75 -16
  471. package/lib/types/dsh-adapter/channel/extensions.d.ts +4 -3
  472. package/lib/types/dsh-adapter/channel/extensions.d.ts.map +1 -1
  473. package/lib/types/dsh-adapter/channel/extensions.js +109 -30
  474. package/lib/types/dsh-adapter/channel/input-delivery.d.ts +2 -2
  475. package/lib/types/dsh-adapter/channel/input-delivery.d.ts.map +1 -1
  476. package/lib/types/dsh-adapter/channel/input-delivery.js +14 -5
  477. package/lib/types/dsh-adapter/channel/job-projection.d.ts +4 -0
  478. package/lib/types/dsh-adapter/channel/job-projection.d.ts.map +1 -1
  479. package/lib/types/dsh-adapter/channel/job-projection.js +205 -24
  480. package/lib/types/dsh-adapter/channel/mentions.d.ts +3 -3
  481. package/lib/types/dsh-adapter/channel/mentions.d.ts.map +1 -1
  482. package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts +7 -0
  483. package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts.map +1 -1
  484. package/lib/types/dsh-adapter/channel/mode-permission-actions.js +235 -13
  485. package/lib/types/dsh-adapter/channel/model-actions.d.ts +5 -1
  486. package/lib/types/dsh-adapter/channel/model-actions.d.ts.map +1 -1
  487. package/lib/types/dsh-adapter/channel/model-actions.js +48 -29
  488. package/lib/types/dsh-adapter/channel/model-selection.d.ts +17 -0
  489. package/lib/types/dsh-adapter/channel/model-selection.d.ts.map +1 -0
  490. package/lib/types/dsh-adapter/channel/model-selection.js +109 -0
  491. package/lib/types/dsh-adapter/channel/model-switch.d.ts +12 -21
  492. package/lib/types/dsh-adapter/channel/model-switch.d.ts.map +1 -1
  493. package/lib/types/dsh-adapter/channel/model-switch.js +39 -102
  494. package/lib/types/dsh-adapter/channel/permissions.d.ts.map +1 -1
  495. package/lib/types/dsh-adapter/channel/permissions.js +4 -1
  496. package/lib/types/dsh-adapter/channel/projection-helpers.d.ts.map +1 -1
  497. package/lib/types/dsh-adapter/channel/projection-helpers.js +2 -0
  498. package/lib/types/dsh-adapter/channel/projection.js +1 -1
  499. package/lib/types/dsh-adapter/channel/reports.d.ts +1 -1
  500. package/lib/types/dsh-adapter/channel/reports.d.ts.map +1 -1
  501. package/lib/types/dsh-adapter/channel/reports.js +11 -3
  502. package/lib/types/dsh-adapter/channel/session-fork.d.ts.map +1 -1
  503. package/lib/types/dsh-adapter/channel/session-fork.js +33 -20
  504. package/lib/types/dsh-adapter/channel/session-listing.d.ts +20 -0
  505. package/lib/types/dsh-adapter/channel/session-listing.d.ts.map +1 -0
  506. package/lib/types/dsh-adapter/channel/session-listing.js +51 -0
  507. package/lib/types/dsh-adapter/channel/session-metadata.d.ts +3 -1
  508. package/lib/types/dsh-adapter/channel/session-metadata.d.ts.map +1 -1
  509. package/lib/types/dsh-adapter/channel/session-metadata.js +60 -30
  510. package/lib/types/dsh-adapter/channel/session-reset.js +2 -2
  511. package/lib/types/dsh-adapter/channel/session-resume.d.ts.map +1 -1
  512. package/lib/types/dsh-adapter/channel/session-resume.js +22 -8
  513. package/lib/types/dsh-adapter/channel/session-rewind.d.ts.map +1 -1
  514. package/lib/types/dsh-adapter/channel/session-rewind.js +38 -24
  515. package/lib/types/dsh-adapter/channel/session-tree-actions.d.ts.map +1 -1
  516. package/lib/types/dsh-adapter/channel/session-tree-actions.js +38 -24
  517. package/lib/types/dsh-adapter/channel/settings-host.d.ts +5 -2
  518. package/lib/types/dsh-adapter/channel/settings-host.d.ts.map +1 -1
  519. package/lib/types/dsh-adapter/channel/settings-host.js +136 -5
  520. package/lib/types/dsh-adapter/channel/state.d.ts +43 -1
  521. package/lib/types/dsh-adapter/channel/state.d.ts.map +1 -1
  522. package/lib/types/dsh-adapter/channel/state.js +14 -1
  523. package/lib/types/dsh-adapter/channel/subagent-projection.d.ts.map +1 -1
  524. package/lib/types/dsh-adapter/channel/subagent-projection.js +84 -12
  525. package/lib/types/dsh-adapter/channel/task-completion.d.ts +6 -0
  526. package/lib/types/dsh-adapter/channel/task-completion.d.ts.map +1 -0
  527. package/lib/types/dsh-adapter/channel/task-completion.js +114 -0
  528. package/lib/types/dsh-adapter/channel/transcript.d.ts +8 -1
  529. package/lib/types/dsh-adapter/channel/transcript.d.ts.map +1 -1
  530. package/lib/types/dsh-adapter/channel/transcript.js +20 -3
  531. package/lib/types/dsh-adapter/channel/upstream-retry.d.ts +81 -0
  532. package/lib/types/dsh-adapter/channel/upstream-retry.d.ts.map +1 -0
  533. package/lib/types/dsh-adapter/channel/upstream-retry.js +138 -0
  534. package/lib/types/dsh-adapter/channel/workspace-actions.d.ts.map +1 -1
  535. package/lib/types/dsh-adapter/channel/workspace-actions.js +9 -8
  536. package/lib/types/dsh-adapter/channel-ui.d.ts +3 -1
  537. package/lib/types/dsh-adapter/channel-ui.d.ts.map +1 -1
  538. package/lib/types/dsh-adapter/channel-ui.js +4 -2
  539. package/lib/types/dsh-adapter/channel.d.ts +2 -2
  540. package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
  541. package/lib/types/dsh-adapter/channel.js +19 -5
  542. package/lib/types/dsh-adapter/compat/agent-team-0.2.0.d.ts +55 -0
  543. package/lib/types/dsh-adapter/compat/agent-team-0.2.0.d.ts.map +1 -0
  544. package/lib/types/dsh-adapter/compat/agent-team-0.2.0.js +96 -0
  545. package/lib/types/dsh-adapter/context-occupancy.d.ts +81 -4
  546. package/lib/types/dsh-adapter/context-occupancy.d.ts.map +1 -1
  547. package/lib/types/dsh-adapter/context-occupancy.js +108 -17
  548. package/lib/types/dsh-adapter/contract.d.ts +4 -4
  549. package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
  550. package/lib/types/dsh-adapter/contract.js +20 -5
  551. package/lib/types/dsh-adapter/effect-ledger.d.ts +7 -0
  552. package/lib/types/dsh-adapter/effect-ledger.d.ts.map +1 -1
  553. package/lib/types/dsh-adapter/effect-ledger.js +8 -1
  554. package/lib/types/dsh-adapter/entry-slot.d.ts +38 -0
  555. package/lib/types/dsh-adapter/entry-slot.d.ts.map +1 -0
  556. package/lib/types/dsh-adapter/entry-slot.js +28 -0
  557. package/lib/types/dsh-adapter/fresh-agent.d.ts +22 -0
  558. package/lib/types/dsh-adapter/fresh-agent.d.ts.map +1 -0
  559. package/lib/types/dsh-adapter/fresh-agent.js +226 -0
  560. package/lib/types/dsh-adapter/host-access.d.ts +16 -1
  561. package/lib/types/dsh-adapter/host-access.d.ts.map +1 -1
  562. package/lib/types/dsh-adapter/host-access.js +148 -2
  563. package/lib/types/dsh-adapter/host-contract.d.ts +103 -0
  564. package/lib/types/dsh-adapter/host-contract.d.ts.map +1 -0
  565. package/lib/types/dsh-adapter/host-contract.js +77 -0
  566. package/lib/types/dsh-adapter/host-dsh.d.ts +112 -0
  567. package/lib/types/dsh-adapter/host-dsh.d.ts.map +1 -0
  568. package/lib/types/dsh-adapter/host-dsh.js +481 -0
  569. package/lib/types/dsh-adapter/host-entry.d.ts +9 -0
  570. package/lib/types/dsh-adapter/host-entry.d.ts.map +1 -0
  571. package/lib/types/dsh-adapter/host-entry.js +253 -0
  572. package/lib/types/dsh-adapter/index.d.ts +53 -17
  573. package/lib/types/dsh-adapter/index.d.ts.map +1 -1
  574. package/lib/types/dsh-adapter/index.js +63 -9
  575. package/lib/types/dsh-adapter/install/executors.d.ts +44 -0
  576. package/lib/types/dsh-adapter/install/executors.d.ts.map +1 -0
  577. package/lib/types/dsh-adapter/install/executors.js +15 -0
  578. package/lib/types/dsh-adapter/install/pnpm-profile-add.d.ts +3 -0
  579. package/lib/types/dsh-adapter/install/pnpm-profile-add.d.ts.map +1 -0
  580. package/lib/types/dsh-adapter/install/pnpm-profile-add.js +150 -0
  581. package/lib/types/dsh-adapter/invariant.d.ts +7 -2
  582. package/lib/types/dsh-adapter/invariant.d.ts.map +1 -1
  583. package/lib/types/dsh-adapter/invariant.js +6 -3
  584. package/lib/types/dsh-adapter/jobs.d.ts +7 -0
  585. package/lib/types/dsh-adapter/jobs.d.ts.map +1 -1
  586. package/lib/types/dsh-adapter/jobs.js +13 -0
  587. package/lib/types/dsh-adapter/lite-profile.d.ts +50 -0
  588. package/lib/types/dsh-adapter/lite-profile.d.ts.map +1 -0
  589. package/lib/types/dsh-adapter/lite-profile.js +49 -0
  590. package/lib/types/dsh-adapter/migrate/index.js +2 -2
  591. package/lib/types/dsh-adapter/migrate/parse/jsonl.d.ts +1 -1
  592. package/lib/types/dsh-adapter/migrate/parse/jsonl.d.ts.map +1 -1
  593. package/lib/types/dsh-adapter/migrate/parse/jsonl.js +4 -3
  594. package/lib/types/dsh-adapter/oauth/profiles.d.ts.map +1 -1
  595. package/lib/types/dsh-adapter/oauth/profiles.js +5 -1
  596. package/lib/types/dsh-adapter/panels.d.ts +7 -0
  597. package/lib/types/dsh-adapter/panels.d.ts.map +1 -1
  598. package/lib/types/dsh-adapter/panels.js +41 -2
  599. package/lib/types/dsh-adapter/plugin-completions.d.ts +32 -0
  600. package/lib/types/dsh-adapter/plugin-completions.d.ts.map +1 -0
  601. package/lib/types/dsh-adapter/plugin-completions.js +80 -0
  602. package/lib/types/dsh-adapter/plugin-declaration.d.ts +119 -0
  603. package/lib/types/dsh-adapter/plugin-declaration.d.ts.map +1 -0
  604. package/lib/types/dsh-adapter/plugin-declaration.js +183 -0
  605. package/lib/types/dsh-adapter/plugin-feed.d.ts +94 -0
  606. package/lib/types/dsh-adapter/plugin-feed.d.ts.map +1 -0
  607. package/lib/types/dsh-adapter/plugin-feed.js +135 -0
  608. package/lib/types/dsh-adapter/plugin-guard.d.ts +115 -0
  609. package/lib/types/dsh-adapter/plugin-guard.d.ts.map +1 -0
  610. package/lib/types/dsh-adapter/plugin-guard.js +108 -0
  611. package/lib/types/dsh-adapter/plugin-host.d.ts +13 -2
  612. package/lib/types/dsh-adapter/plugin-host.d.ts.map +1 -1
  613. package/lib/types/dsh-adapter/plugin-host.js +34 -8
  614. package/lib/types/dsh-adapter/plugin-install.d.ts +160 -0
  615. package/lib/types/dsh-adapter/plugin-install.d.ts.map +1 -0
  616. package/lib/types/dsh-adapter/plugin-install.js +545 -0
  617. package/lib/types/dsh-adapter/plugin-manage.d.ts +178 -0
  618. package/lib/types/dsh-adapter/plugin-manage.d.ts.map +1 -0
  619. package/lib/types/dsh-adapter/plugin-manage.js +468 -0
  620. package/lib/types/dsh-adapter/plugin-manager.d.ts +144 -0
  621. package/lib/types/dsh-adapter/plugin-manager.d.ts.map +1 -0
  622. package/lib/types/dsh-adapter/plugin-manager.js +83 -0
  623. package/lib/types/dsh-adapter/plugin.d.ts +50 -1
  624. package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
  625. package/lib/types/dsh-adapter/plugin.js +918 -234
  626. package/lib/types/dsh-adapter/plugins-info.d.ts +130 -8
  627. package/lib/types/dsh-adapter/plugins-info.d.ts.map +1 -1
  628. package/lib/types/dsh-adapter/plugins-info.js +469 -44
  629. package/lib/types/dsh-adapter/process-exit.d.ts +43 -0
  630. package/lib/types/dsh-adapter/process-exit.d.ts.map +1 -0
  631. package/lib/types/dsh-adapter/process-exit.js +60 -0
  632. package/lib/types/dsh-adapter/root-dispose.d.ts +18 -0
  633. package/lib/types/dsh-adapter/root-dispose.d.ts.map +1 -0
  634. package/lib/types/dsh-adapter/root-dispose.js +28 -0
  635. package/lib/types/dsh-adapter/session-list-metadata.d.ts +20 -0
  636. package/lib/types/dsh-adapter/session-list-metadata.d.ts.map +1 -0
  637. package/lib/types/dsh-adapter/session-list-metadata.js +56 -0
  638. package/lib/types/dsh-adapter/session-projection-store.d.ts +66 -0
  639. package/lib/types/dsh-adapter/session-projection-store.d.ts.map +1 -0
  640. package/lib/types/dsh-adapter/session-projection-store.js +149 -0
  641. package/lib/types/dsh-adapter/session-seed.d.ts +11 -0
  642. package/lib/types/dsh-adapter/session-seed.d.ts.map +1 -0
  643. package/lib/types/dsh-adapter/session-seed.js +47 -0
  644. package/lib/types/dsh-adapter/sessions/list.d.ts +3 -1
  645. package/lib/types/dsh-adapter/sessions/list.d.ts.map +1 -1
  646. package/lib/types/dsh-adapter/sessions/list.js +11 -5
  647. package/lib/types/dsh-adapter/sessions/snapshot.d.ts +0 -2
  648. package/lib/types/dsh-adapter/sessions/snapshot.d.ts.map +1 -1
  649. package/lib/types/dsh-adapter/sessions/snapshot.js +7 -70
  650. package/lib/types/dsh-adapter/settingsEditor.js +2 -2
  651. package/lib/types/dsh-adapter/sideQuestion.d.ts +21 -0
  652. package/lib/types/dsh-adapter/sideQuestion.d.ts.map +1 -1
  653. package/lib/types/dsh-adapter/sideQuestion.js +53 -0
  654. package/lib/types/dsh-adapter/startup-args.d.ts +2 -0
  655. package/lib/types/dsh-adapter/startup-args.d.ts.map +1 -1
  656. package/lib/types/dsh-adapter/startup-args.js +5 -0
  657. package/lib/types/dsh-adapter/subagents.d.ts +33 -1
  658. package/lib/types/dsh-adapter/subagents.d.ts.map +1 -1
  659. package/lib/types/dsh-adapter/subagents.js +112 -9
  660. package/lib/types/dsh-adapter/team-mode.d.ts +74 -0
  661. package/lib/types/dsh-adapter/team-mode.d.ts.map +1 -0
  662. package/lib/types/dsh-adapter/team-mode.js +188 -0
  663. package/lib/types/dsh-adapter/team-roster.d.ts +67 -0
  664. package/lib/types/dsh-adapter/team-roster.d.ts.map +1 -0
  665. package/lib/types/dsh-adapter/team-roster.js +136 -0
  666. package/lib/types/dsh-adapter/team-tools.d.ts +58 -0
  667. package/lib/types/dsh-adapter/team-tools.d.ts.map +1 -0
  668. package/lib/types/dsh-adapter/team-tools.js +208 -0
  669. package/lib/types/dsh-adapter/tui-settings.d.ts +57 -0
  670. package/lib/types/dsh-adapter/tui-settings.d.ts.map +1 -0
  671. package/lib/types/dsh-adapter/tui-settings.js +199 -0
  672. package/lib/types/dsh-adapter/types.d.ts +1 -1
  673. package/lib/types/dsh-adapter/types.d.ts.map +1 -1
  674. package/lib/types/effortPrefs.d.ts +6 -3
  675. package/lib/types/effortPrefs.d.ts.map +1 -1
  676. package/lib/types/effortPrefs.js +7 -4
  677. package/lib/types/hostEntryRoute.d.ts +18 -0
  678. package/lib/types/hostEntryRoute.d.ts.map +1 -0
  679. package/lib/types/hostEntryRoute.js +57 -0
  680. package/lib/types/i18n.d.ts +961 -1439
  681. package/lib/types/i18n.d.ts.map +1 -1
  682. package/lib/types/i18n.js +443 -387
  683. package/lib/types/ink/components/AlternateScreen.js +2 -2
  684. package/lib/types/ink/components/App.d.ts +1 -0
  685. package/lib/types/ink/components/App.d.ts.map +1 -1
  686. package/lib/types/ink/components/App.js +16 -4
  687. package/lib/types/ink/components/CursorDeclarationContext.d.ts +9 -0
  688. package/lib/types/ink/components/CursorDeclarationContext.d.ts.map +1 -1
  689. package/lib/types/ink/components/CursorDeclarationContext.js +2 -0
  690. package/lib/types/ink/components/ScrollBox.d.ts +9 -0
  691. package/lib/types/ink/components/ScrollBox.d.ts.map +1 -1
  692. package/lib/types/ink/components/ScrollBox.js +23 -0
  693. package/lib/types/ink/dom.d.ts.map +1 -1
  694. package/lib/types/ink/hooks/use-copy-on-select.d.ts +2 -2
  695. package/lib/types/ink/hooks/use-copy-on-select.d.ts.map +1 -1
  696. package/lib/types/ink/hooks/use-copy-on-select.js +13 -7
  697. package/lib/types/ink/hooks/use-declared-cursor.d.ts +11 -3
  698. package/lib/types/ink/hooks/use-declared-cursor.d.ts.map +1 -1
  699. package/lib/types/ink/hooks/use-declared-cursor.js +30 -10
  700. package/lib/types/ink/ink.d.ts +22 -17
  701. package/lib/types/ink/ink.d.ts.map +1 -1
  702. package/lib/types/ink/ink.js +151 -40
  703. package/lib/types/ink/kitty-graphics.d.ts +2 -0
  704. package/lib/types/ink/kitty-graphics.d.ts.map +1 -1
  705. package/lib/types/ink/kitty-graphics.js +6 -1
  706. package/lib/types/ink/node-cache.d.ts +2 -1
  707. package/lib/types/ink/node-cache.d.ts.map +1 -1
  708. package/lib/types/ink/output.d.ts +10 -4
  709. package/lib/types/ink/output.d.ts.map +1 -1
  710. package/lib/types/ink/output.js +14 -10
  711. package/lib/types/ink/render-node-to-output.d.ts +5 -2
  712. package/lib/types/ink/render-node-to-output.d.ts.map +1 -1
  713. package/lib/types/ink/render-node-to-output.js +27 -9
  714. package/lib/types/ink/renderer.d.ts +1 -0
  715. package/lib/types/ink/renderer.d.ts.map +1 -1
  716. package/lib/types/ink/renderer.js +4 -3
  717. package/lib/types/ink/root.d.ts +4 -1
  718. package/lib/types/ink/root.d.ts.map +1 -1
  719. package/lib/types/ink/screen.d.ts +4 -2
  720. package/lib/types/ink/screen.d.ts.map +1 -1
  721. package/lib/types/ink/selection.d.ts +10 -1
  722. package/lib/types/ink/selection.d.ts.map +1 -1
  723. package/lib/types/ink/selection.js +94 -25
  724. package/lib/types/ink/stdin-handoff.d.ts +11 -0
  725. package/lib/types/ink/stdin-handoff.d.ts.map +1 -0
  726. package/lib/types/ink/stdin-handoff.js +20 -0
  727. package/lib/types/ink/styles.d.ts +2 -1
  728. package/lib/types/ink/styles.d.ts.map +1 -1
  729. package/lib/types/ink/terminal-image.d.ts +6 -4
  730. package/lib/types/ink/terminal-image.d.ts.map +1 -1
  731. package/lib/types/ink/terminal-image.js +16 -39
  732. package/lib/types/ink/terminal-notification.d.ts +8 -0
  733. package/lib/types/ink/terminal-notification.d.ts.map +1 -0
  734. package/lib/types/ink/terminal-notification.js +83 -0
  735. package/lib/types/ink/terminal.d.ts +9 -0
  736. package/lib/types/ink/terminal.d.ts.map +1 -1
  737. package/lib/types/ink/terminal.js +34 -1
  738. package/lib/types/ink/termio/csi.d.ts +11 -0
  739. package/lib/types/ink/termio/csi.d.ts.map +1 -1
  740. package/lib/types/ink/termio/csi.js +13 -0
  741. package/lib/types/ink/update-overflow-guard.d.ts +6 -0
  742. package/lib/types/ink/update-overflow-guard.d.ts.map +1 -1
  743. package/lib/types/ink/update-overflow-guard.js +17 -0
  744. package/lib/types/ink/wrap-text.d.ts +6 -0
  745. package/lib/types/ink/wrap-text.d.ts.map +1 -1
  746. package/lib/types/ink/wrap-text.js +17 -0
  747. package/lib/types/kernelPrefs.d.ts +130 -17
  748. package/lib/types/kernelPrefs.d.ts.map +1 -1
  749. package/lib/types/kernelPrefs.js +98 -35
  750. package/lib/types/math/inline-layout.d.ts +2 -0
  751. package/lib/types/math/inline-layout.d.ts.map +1 -1
  752. package/lib/types/math/inline-layout.js +5 -27
  753. package/lib/types/modelGroups.d.ts +15 -27
  754. package/lib/types/modelGroups.d.ts.map +1 -1
  755. package/lib/types/modelGroups.js +17 -31
  756. package/lib/types/modelPrefs.d.ts +5 -4
  757. package/lib/types/modelPrefs.d.ts.map +1 -1
  758. package/lib/types/modelPrefs.js +5 -4
  759. package/lib/types/modelRoute.d.ts +23 -9
  760. package/lib/types/modelRoute.d.ts.map +1 -1
  761. package/lib/types/modelRoute.js +25 -11
  762. package/lib/types/native-ts/yoga-layout/index.d.ts.map +1 -1
  763. package/lib/types/native-ts/yoga-layout/index.js +8 -1
  764. package/lib/types/permissionPrefs.d.ts +34 -0
  765. package/lib/types/permissionPrefs.d.ts.map +1 -0
  766. package/lib/types/permissionPrefs.js +61 -0
  767. package/lib/types/permissionPresetLabels.d.ts +25 -0
  768. package/lib/types/permissionPresetLabels.d.ts.map +1 -0
  769. package/lib/types/permissionPresetLabels.js +33 -0
  770. package/lib/types/plugin-host.d.ts +1 -0
  771. package/lib/types/plugin-host.d.ts.map +1 -1
  772. package/lib/types/preset-patch.d.ts +22 -0
  773. package/lib/types/preset-patch.d.ts.map +1 -0
  774. package/lib/types/preset-patch.js +14 -0
  775. package/lib/types/presetPrefs.d.ts +17 -3
  776. package/lib/types/presetPrefs.d.ts.map +1 -1
  777. package/lib/types/presetPrefs.js +20 -3
  778. package/lib/types/reload.d.ts +6 -10
  779. package/lib/types/reload.d.ts.map +1 -1
  780. package/lib/types/reload.js +14 -14
  781. package/lib/types/screens/Chat.d.ts +55 -16
  782. package/lib/types/screens/Chat.d.ts.map +1 -1
  783. package/lib/types/screens/Chat.js +742 -280
  784. package/lib/types/screens/Launchpad.d.ts +33 -17
  785. package/lib/types/screens/Launchpad.d.ts.map +1 -1
  786. package/lib/types/screens/Launchpad.js +256 -78
  787. package/lib/types/screens/SessionSupervisor.d.ts.map +1 -1
  788. package/lib/types/screens/SessionSupervisor.js +53 -12
  789. package/lib/types/screens/Settings.d.ts.map +1 -1
  790. package/lib/types/screens/Settings.js +7 -0
  791. package/lib/types/screens/StatusLine.d.ts.map +1 -1
  792. package/lib/types/screens/StatusLine.js +24 -7
  793. package/lib/types/screens/StatusMetrics.d.ts +46 -1
  794. package/lib/types/screens/StatusMetrics.d.ts.map +1 -1
  795. package/lib/types/screens/StatusMetrics.js +72 -0
  796. package/lib/types/screens/chat/useKernelPicker.d.ts +8 -4
  797. package/lib/types/screens/chat/useKernelPicker.d.ts.map +1 -1
  798. package/lib/types/screens/chat/useKernelPicker.js +61 -21
  799. package/lib/types/screens/chat/useModelPicker.d.ts +42 -0
  800. package/lib/types/screens/chat/useModelPicker.d.ts.map +1 -0
  801. package/lib/types/screens/chat/useModelPicker.js +182 -0
  802. package/lib/types/screens/chat/usePluginWriteFlow.d.ts +68 -0
  803. package/lib/types/screens/chat/usePluginWriteFlow.d.ts.map +1 -0
  804. package/lib/types/screens/chat/usePluginWriteFlow.js +92 -0
  805. package/lib/types/screens/chatOverlay.d.ts +30 -5
  806. package/lib/types/screens/chatOverlay.d.ts.map +1 -1
  807. package/lib/types/screens/chatOverlay.js +0 -1
  808. package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.d.ts +4 -1
  809. package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.d.ts.map +1 -1
  810. package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.js +26 -5
  811. package/lib/types/screens/sessionSupervisor/useSessionSupervisor.d.ts +1 -1
  812. package/lib/types/screens/sessionSupervisor/useSessionSupervisor.d.ts.map +1 -1
  813. package/lib/types/screens/sessionSupervisor/useSessionSupervisor.js +51 -29
  814. package/lib/types/sessionHistory.d.ts +5 -0
  815. package/lib/types/sessionHistory.d.ts.map +1 -1
  816. package/lib/types/sessionHistory.js +5 -0
  817. package/lib/types/sessionModes.d.ts +5 -3
  818. package/lib/types/sessionModes.d.ts.map +1 -1
  819. package/lib/types/sessionModes.js +9 -3
  820. package/lib/types/sessions/listSnapshot.d.ts +6 -0
  821. package/lib/types/sessions/listSnapshot.d.ts.map +1 -0
  822. package/lib/types/sessions/listSnapshot.js +67 -0
  823. package/lib/types/settings/definitions.d.ts +50 -0
  824. package/lib/types/settings/definitions.d.ts.map +1 -1
  825. package/lib/types/settings/definitions.js +42 -8
  826. package/lib/types/terminal-utils/cjk-emphasis.d.ts +28 -0
  827. package/lib/types/terminal-utils/cjk-emphasis.d.ts.map +1 -0
  828. package/lib/types/terminal-utils/cjk-emphasis.js +31 -0
  829. package/lib/types/terminal-utils/markdown.d.ts +3 -1
  830. package/lib/types/terminal-utils/markdown.d.ts.map +1 -1
  831. package/lib/types/terminal-utils/markdown.js +7 -2
  832. package/lib/types/theme.d.ts +29 -12
  833. package/lib/types/theme.d.ts.map +1 -1
  834. package/lib/types/theme.js +310 -23
  835. package/lib/types/themeCatalog.d.ts.map +1 -1
  836. package/lib/types/themeCatalog.js +21 -2
  837. package/lib/types/tips.js +4 -4
  838. package/lib/types/tuiSettingsFile.d.ts +56 -0
  839. package/lib/types/tuiSettingsFile.d.ts.map +1 -0
  840. package/lib/types/tuiSettingsFile.js +206 -0
  841. package/lib/types/ui.d.ts +2 -0
  842. package/lib/types/ui.d.ts.map +1 -1
  843. package/lib/types/ui.js +2 -0
  844. package/lib/types/update.d.ts +72 -26
  845. package/lib/types/update.d.ts.map +1 -1
  846. package/lib/types/update.js +131 -43
  847. package/lib/types/utils/bmp.d.ts +7 -0
  848. package/lib/types/utils/bmp.d.ts.map +1 -1
  849. package/lib/types/utils/bmp.js +27 -0
  850. package/lib/types/utils/bootTrace.d.ts +2 -0
  851. package/lib/types/utils/bootTrace.d.ts.map +1 -0
  852. package/lib/types/utils/bootTrace.js +20 -0
  853. package/lib/types/utils/clipboard.d.ts.map +1 -1
  854. package/lib/types/utils/clipboard.js +11 -3
  855. package/lib/types/utils/credentials.d.ts +14 -2
  856. package/lib/types/utils/credentials.d.ts.map +1 -1
  857. package/lib/types/utils/credentials.js +34 -11
  858. package/lib/types/utils/imageResize.d.ts +10 -20
  859. package/lib/types/utils/imageResize.d.ts.map +1 -1
  860. package/lib/types/utils/imageResize.js +61 -134
  861. package/lib/types/utils/inputPaste.d.ts +2 -2
  862. package/lib/types/utils/inputPaste.js +2 -2
  863. package/lib/types/utils/pastedImagePath.d.ts +5 -0
  864. package/lib/types/utils/pastedImagePath.d.ts.map +1 -1
  865. package/lib/types/utils/pastedImagePath.js +33 -0
  866. package/lib/types/utils/paths.d.ts +11 -0
  867. package/lib/types/utils/paths.d.ts.map +1 -1
  868. package/lib/types/utils/paths.js +13 -0
  869. package/package.json +150 -114
  870. package/presets/winbash.mjs +716 -0
  871. package/tui-profile/feed/README.md +63 -0
  872. package/tui-profile/feed/first-party.json +10 -0
  873. package/tui-profile/protocols/profile-definitions.d.ts +1 -0
  874. package/tui-profile/protocols/profile-definitions.js +14 -0
  875. package/tui-profile/protocols/tui-contributions.d.ts +55 -0
  876. package/tui-profile/protocols/tui-contributions.js +141 -0
  877. package/tui-profile/registry/contracts/backend-v1alpha1.json +13 -0
  878. package/tui-profile/registry/registry-0.15.json +12 -0
  879. package/lib/types/backends/claude/install.d.ts +0 -15
  880. package/lib/types/backends/claude/install.d.ts.map +0 -1
  881. package/lib/types/backends/claude/install.js +0 -91
  882. package/lib/types/channel/elicitation.d.ts.map +0 -1
  883. package/lib/types/dsh-adapter/channel/session-lineage.d.ts +0 -42
  884. package/lib/types/dsh-adapter/channel/session-lineage.d.ts.map +0 -1
  885. package/lib/types/dsh-adapter/channel/session-lineage.js +0 -51
  886. package/lib/types/utils/jsonl.d.ts.map +0 -1
package/lib/types/i18n.js CHANGED
@@ -56,10 +56,19 @@
56
56
  import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
57
57
  import { join } from 'node:path';
58
58
  import { DATA_DIR } from './utils/paths.js';
59
+ import { PLATFORM_TEXT } from './backends/shared/platform-text.js';
59
60
  const PREFS_DIR = DATA_DIR;
60
61
  /** The languages shipped with the plugin, in display order. */
61
62
  export const LANGS = ['zh', 'en'];
62
63
  const dict = {
64
+ // ── 平台文案:真源在 src/backends/shared/platform-text.ts ────────────
65
+ // 这 10 条是宿主界面与内置后端渲染的同一批字符串(状态行的速率窗口、
66
+ // /doctor、/rename、回退、工具卡名)。真源放在后端中立缝里:后端读不到宿主
67
+ // 字典(D2),第三方贡献也不得借宿主的词说话,于是两边共读一份值,各自保留
68
+ // 自己字典里的条目、照旧渲染。宿主侧仍用 t() 取;scripts/verify-i18n.ts 的
69
+ // 「跨字典一致性」段逐字比对宿主字典与两个后端,此处若有人再写一份内联副本
70
+ // (同名键在展开之后会覆盖它)即红。
71
+ ...PLATFORM_TEXT,
63
72
  // ── channel.ts ───────────────────────────────────────────────────────
64
73
  // Working spinner labels. WorkingSpinner resolves these through the
65
74
  // `spinner-verb-*` dynamic family so the status stays localized after a
@@ -130,6 +139,8 @@ const dict = {
130
139
  'export-dir': { zh: '- 目录: {{cwd}}', en: '- Directory: {{cwd}}' },
131
140
  'mentions-attached': { zh: '已附加 {{count}} 个文件引用', en: { one: 'Attached {{count}} file reference', other: 'Attached {{count}} file references' } },
132
141
  'mentions-missing': { zh: '未找到引用: {{paths}}', en: 'References not found: {{paths}}' },
142
+ // Agent Teams: the tag after the sender of a peer message bubble.
143
+ 'team-message-label': { zh: '团队消息', en: 'team message' },
133
144
  // T06 (PR-B · AC-5): transcript indicator above a user bubble whose send
134
145
  // consumed the live IDE selection. The ⧉ glyph lives in MessageList, not here.
135
146
  'selection-attached': {
@@ -178,77 +189,11 @@ const dict = {
178
189
  'conversation-reset-fresh': { zh: '已开新会话来执行计划', en: 'Started a fresh session to carry out the plan' },
179
190
  'cost-source-backend': { zh: '内核上报的会话费用', en: 'session cost reported by the kernel' },
180
191
  'capability-unavailable-backend': { zh: '当前内核不支持:{{name}}', en: 'Not supported by this kernel: {{name}}' },
181
- 'capability-failed': { zh: '{{name}} 失败 · {{err}}', en: '{{name}} failed · {{err}}' },
182
- // ── backends/claude (Claude Agent backend) ─────────────────────────
183
- 'claude-permission-denied': { zh: '{{tool}} 被权限规则拒绝', en: '{{tool}} was denied by a permission rule' },
184
- 'claude-permission-denied-reason': { zh: '{{tool}} 被自动拒绝:{{reason}}', en: '{{tool}} was denied automatically: {{reason}}' },
185
- 'claude-denied-reason': { zh: '拒绝原因:{{reason}}', en: 'Denied: {{reason}}' },
186
- 'claude-question-unreadable': { zh: '无法读取这次提问的内容,已拒绝', en: 'The question could not be read and was declined' },
187
- 'claude-always-rules-session': { zh: '允许,本次会话不再询问 {{rules}}', en: 'Yes, and don\'t ask again for {{rules}} this session' },
188
- 'claude-always-rules-project': { zh: '允许,本项目不再询问 {{rules}}', en: 'Yes, and don\'t ask again for {{rules}} in this project' },
189
- 'claude-always-rules-user': { zh: '允许,所有项目都不再询问 {{rules}}', en: 'Yes, and don\'t ask again for {{rules}} in any project' },
190
- 'claude-always-accept-edits': { zh: '允许,本次会话自动接受编辑', en: 'Yes, and auto-accept edits this session' },
191
- 'claude-always-mode': { zh: '允许,并切换到 {{mode}} 模式', en: 'Yes, and switch to {{mode}} mode' },
192
- 'claude-always-directories': { zh: '允许,并允许访问 {{dirs}}', en: 'Yes, and allow access to {{dirs}}' },
193
- 'claude-plan-review-header': { zh: '计划评审', en: 'Plan review' },
194
- 'claude-plan-review-question': { zh: 'Claude 准备好了计划,要开始执行吗?', en: 'Claude has a plan. Ready to start?' },
195
- 'claude-plan-accept-edits': { zh: '批准,并自动接受编辑', en: 'Yes, and auto-accept edits' },
196
- 'claude-plan-accept-edits-desc': { zh: '退出计划模式,之后的文件编辑不再逐个询问', en: 'Leave plan mode; file edits no longer ask one by one' },
197
- 'claude-plan-manual': { zh: '批准,编辑仍逐个确认', en: 'Yes, and approve each edit' },
198
- 'claude-plan-manual-desc': { zh: '退出计划模式,回到默认权限模式', en: 'Leave plan mode for the default permission mode' },
199
- 'claude-plan-keep': { zh: '继续规划', en: 'No, keep planning' },
200
- 'claude-plan-keep-desc': { zh: '可在输入行写下要修改的地方', en: 'Type what to change on the input row' },
201
- 'claude-plan-approved': { zh: '计划已批准,开始执行', en: 'Plan approved; starting' },
202
- 'claude-plan-kept': { zh: '计划未批准,继续规划', en: 'Plan not approved; planning continues' },
203
- 'claude-model-unknown': { zh: 'Claude 没有模型 {{model}}(/model 查看可用模型)', en: 'Claude has no model {{model}} (see /model)' },
204
- 'claude-mode-default': { zh: '默认', en: 'Default' },
205
- 'claude-mode-acceptEdits': { zh: '自动接受编辑', en: 'Accept edits' },
206
- 'claude-mode-plan': { zh: '计划模式', en: 'Plan mode' },
207
- 'claude-mode-auto': { zh: '自动审批', en: 'Auto' },
208
- 'claude-mode-dontAsk': { zh: '不询问', en: "Don't ask" },
209
- 'claude-mode-bypassPermissions': { zh: '跳过权限', en: 'Bypass permissions' },
210
- 'claude-mode-desc-default': { zh: '默认:每个危险操作前都询问', en: 'Default: asks before every risky action' },
211
- 'claude-mode-desc-acceptEdits': { zh: '自动接受文件编辑,其他操作仍询问', en: 'Auto-accepts file edits, still asks for the rest' },
212
- 'claude-mode-desc-plan': { zh: '计划模式:只读,先出方案不动手', en: 'Plan mode: read-only, proposes before acting' },
213
- 'claude-mode-desc-auto': { zh: '自动审批:由模型分类器判定', en: 'Auto: a model classifier decides' },
214
- 'claude-mode-desc-dontAsk': { zh: '不询问:未预先批准的操作一律拒绝', en: "Don't ask: anything not pre-approved is denied" },
215
- 'claude-mode-desc-bypassPermissions': { zh: '跳过全部权限检查(谨慎使用)', en: 'Skips every permission check (use with care)' },
216
- 'claude-effort-low': { zh: '低', en: 'Low' },
217
- 'claude-effort-medium': { zh: '中', en: 'Medium' },
218
- 'claude-effort-high': { zh: '高', en: 'High' },
219
- 'claude-effort-xhigh': { zh: '超高', en: 'Extra high' },
220
- 'claude-effort-max': { zh: '最高', en: 'Max' },
221
- 'claude-auth-failed-login': { zh: 'Claude 凭证仍被拒绝:用 /login 重新登录,或设置 ANTHROPIC_API_KEY、在终端运行 claude login', en: 'Claude still refuses the credential: sign in again with /login, set ANTHROPIC_API_KEY, or run `claude login` in a terminal' },
222
- 'claude-auth-reconnected': { zh: '凭证已刷新并重新连接同一会话,请重发上一条消息', en: 'Credential renewed and the same session reconnected; send your last message again' },
223
- 'claude-auth-refresh-failed': { zh: '刷新 Claude 凭证失败{{detail}}(可用 /login 重新登录)', en: 'Renewing the Claude credential failed{{detail}} (sign in again with /login)' },
224
- 'claude-channel-token-missing': {
225
- zh: '渠道 {{name}}({{host}})指向自定义端点,但没有可用的 token,已拒绝启动,以免向中转端点发送不带凭据的请求。请在 /channel → 管理渠道 里补上 token,或换一个渠道后重试。',
226
- en: 'Channel {{name}} ({{host}}) points at a custom endpoint but has no usable token, so the session was not started (no unauthenticated requests to a relay). Add a token under /channel → Manage channels, or switch to another channel, then retry.',
227
- },
228
- 'claude-channel-helper-conflict': {
229
- zh: 'settings.json 配置了 apiKeyHelper,与当前渠道冲突:它生成的 x-api-key 会随请求发到渠道端点。请从 settings.json 删掉 apiKeyHelper,或在 /channel 里停用该渠道后再启动。',
230
- en: 'settings.json sets apiKeyHelper, which conflicts with the active channel: the x-api-key it produces would be sent to the channel endpoint. Remove apiKeyHelper from settings.json, or deactivate the channel in /channel, then retry.',
231
- },
232
- 'claude-auth-refresh-status': { zh: ' · HTTP {{status}}', en: ' · HTTP {{status}}' },
233
- 'claude-auth-reconnect-failed': { zh: '重新连接 Claude 会话失败;可用 /login 重新登录', en: 'Reconnecting the Claude session failed; sign in again with /login' },
234
- 'claude-auth-reconnect-deferred': { zh: '当前回合结束后再用新凭证重新连接', en: 'Reconnecting with the new credential once the current turn ends' },
235
- 'claude-auth-reconnect-forced': { zh: '等待当前回合结束超时,现在重新连接,正在运行的回合会被中断', en: 'The turn did not finish in time; reconnecting now, which interrupts the running turn' },
236
- 'claude-auth-inputs-dropped': { zh: '重新连接失败,{{n}} 条尚未开始的消息未能送达', en: 'Reconnecting failed; {{n}} message(s) that had not started were not delivered' },
237
- 'claude-auth-route': { zh: '未使用订阅登录:{{route}}', en: 'Subscription sign-in not used: {{route}}' },
238
- 'claude-route-custom-endpoint': { zh: '自定义端点 {{host}}(ANTHROPIC_BASE_URL)', en: 'custom endpoint {{host}} (ANTHROPIC_BASE_URL)' },
239
- 'claude-route-custom-oauth': { zh: '自定义 OAuth 部署', en: 'custom OAuth deployment' },
240
- 'claude-route-unix-socket': { zh: 'Unix 套接字(ANTHROPIC_UNIX_SOCKET)', en: 'Unix socket (ANTHROPIC_UNIX_SOCKET)' },
241
- 'claude-route-gateway': { zh: '云网关', en: 'cloud gateway' },
242
- 'claude-route-api-key-helper': { zh: '设置中的 apiKeyHelper', en: 'apiKeyHelper in settings' },
243
- 'claude-route-settings-unreadable': { zh: '无法读取 Claude 设置,无法确认连接方式', en: 'Claude settings could not be read, so the connection route is unknown' },
244
- 'claude-auth-source': { zh: '凭证来源:{{source}}', en: 'Credential: {{source}}' },
245
- 'claude-auth-missing-hint': { zh: '未找到 Claude 凭证:用 /login 登录 anthropic,或设置 ANTHROPIC_API_KEY、在终端运行 claude login', en: 'No Claude credential found: sign in to anthropic with /login, set ANTHROPIC_API_KEY, or run `claude login` in a terminal' },
246
- 'claude-auth-cli': { zh: 'CLI 报告 · apiKeySource:{{source}} · tokenSource:{{token}}', en: 'CLI reports · apiKeySource: {{source}} · tokenSource: {{token}}' },
247
- 'claude-auth-source-dsh-auth': { zh: 'dsh-auth anthropic 登录', en: 'dsh-auth anthropic sign-in' },
248
- 'claude-auth-source-dsh-auth-expires': { zh: 'dsh-auth anthropic 登录(令牌到期 {{time}})', en: 'dsh-auth anthropic sign-in (token expires {{time}})' },
249
- 'claude-auth-source-cloud': { zh: '云厂商 {{provider}}(环境变量)', en: 'Cloud provider {{provider}} (environment)' },
250
- 'claude-auth-source-claude-login': { zh: '本机 claude login', en: 'Local `claude login`' },
251
- 'claude-auth-account': { zh: '账户:{{account}}', en: 'Account: {{account}}' },
192
+ 'effort-tier-low': { zh: '低', en: 'Low' },
193
+ 'effort-tier-medium': { zh: '中', en: 'Medium' },
194
+ 'effort-tier-high': { zh: '高', en: 'High' },
195
+ 'effort-tier-xhigh': { zh: '超高', en: 'Extra high' },
196
+ 'effort-tier-max': { zh: '最高', en: 'Max' },
252
197
  'login-backend-heading': { zh: '{{backend}} 登录状态', en: '{{backend}} sign-in' },
253
198
  'login-backend-no-oauth': { zh: '未挂载 dsh-auth 登录服务:只能用内核自己的凭证(环境变量或它自己的登录)', en: 'No dsh-auth sign-in service is mounted: only the kernel\'s own credentials apply (environment or its own login)' },
254
199
  'login-backend-oauth-removed': { zh: '已移除 {{provider}} 的 dsh-auth 登录;内核原生登录未修改,已载入令牌需正常重启后停止使用', en: 'Removed the {{provider}} dsh-auth credential; native login is unchanged. Restart normally to stop using already-loaded tokens' },
@@ -265,288 +210,11 @@ const dict = {
265
210
  'mcp-reconnected': { zh: '已重新连接 MCP 服务器 {{name}}', en: 'Reconnected the MCP server {{name}}' },
266
211
  'mcp-enabled': { zh: '已开启 MCP 服务器 {{name}}', en: 'Enabled the MCP server {{name}}' },
267
212
  'mcp-disabled': { zh: '已关闭 MCP 服务器 {{name}}', en: 'Disabled the MCP server {{name}}' },
268
- 'claude-side-query-empty': { zh: '会话还没有保存任何对话,暂无内容可问', en: 'The session has no saved conversation to ask about yet' },
269
- 'claude-side-query-no-answer': { zh: '没有得到回答', en: 'No answer was received' },
270
213
  'backend-mcp-needs-auth': { zh: '需要授权的服务器请在终端运行 claude 后用 /mcp 完成', en: 'For servers that need auth, finish it with /mcp in an interactive `claude`' },
271
214
  'context-tokens': { zh: '{{n}} tokens', en: '{{n}} tokens' },
272
215
  'status-rate-limit': { zh: '订阅用量 {{usage}}', en: 'Subscription usage {{usage}}' },
273
- 'status-rate-limit-five-hour': { zh: '5小时', en: '5h' },
274
- 'status-rate-limit-seven-day': { zh: '7天', en: '7d' },
275
- 'claude-process-exited': { zh: 'Claude 进程已退出:{{reason}}', en: 'The Claude process exited: {{reason}}' },
276
- 'claude-process-ended': { zh: '会话流已结束', en: 'the session stream ended' },
277
- 'claude-cancel-forced': { zh: '中断 30 秒未得到确认,已强制结束本回合', en: 'The interrupt was not confirmed within 30s; the turn was force-closed' },
278
216
  'interrupt-failed': { zh: '打断请求失败:排队消息没有撤回,仍会在下一回合发送;已取消暂存,避免重复发送', en: 'The interrupt request failed: the queued messages were not withdrawn and will still run next turn; they are no longer held, so nothing is sent twice' },
279
217
  'interrupt-unconfirmed': { zh: '无法确认排队消息已撤回:它们仍会在下一回合发送,不再暂存', en: 'Could not confirm the queued messages were withdrawn: they will still run next turn and are no longer held' },
280
- 'claude-version-drift': { zh: 'Claude CLI {{version}} 未经本版 dsh-tui 验证(已验证:{{validated}}),继续运行', en: 'Claude CLI {{version}} is not validated with this dsh-tui (validated: {{validated}}); continuing' },
281
- 'claude-sdk-drift': { zh: 'Claude Agent SDK {{version}} 与验证版本 {{validated}} 不一致,继续运行', en: 'Claude Agent SDK {{version}} differs from the validated {{validated}}; continuing' },
282
- 'claude-sdk-missing': { zh: '未安装 Claude Agent SDK:在 dsh-tui 安装目录运行 pnpm add @anthropic-ai/claude-agent-sdk@{{version}}', en: 'The Claude Agent SDK is not installed: run pnpm add @anthropic-ai/claude-agent-sdk@{{version}} in the dsh-tui install directory' },
283
- 'claude-resume-not-found': { zh: '本机 Claude 会话库中没有会话 {{id}}', en: 'No Claude session {{id}} in the local session store' },
284
- 'claude-rewind-files-unavailable': { zh: '该会话没有可用的文件检查点', en: 'No file checkpoints are available for this session' },
285
- 'claude-fork-empty': { zh: '会话还没有保存任何消息,无可分叉的内容', en: 'Nothing to fork yet — the session has no saved messages' },
286
- 'claude-task-unnamed': { zh: '任务 {{id}}(标题未恢复)', en: 'Task {{id}} (subject not recovered)' },
287
- 'claude-task-output-refused': { zh: '不读取任务 {{id}} 的输出:路径不在 Claude 的目录内', en: 'Not reading the output of task {{id}}: the path is outside the Claude directories' },
288
- 'claude-task-output-missing': { zh: '任务 {{id}} 的输出文件还不存在', en: 'The output file of task {{id}} does not exist yet' },
289
- 'claude-task-output-unknown': { zh: '任务 {{id}} 没有报告输出文件', en: 'Task {{id}} reported no output file' },
290
- 'claude-transcript-missing': { zh: '找不到会话 {{id}} 的转录文件', en: 'The transcript file of session {{id}} was not found' },
291
- 'claude-transcript-too-large': { zh: '会话转录超过 {{mb}} MB,不读取', en: 'The session transcript is larger than {{mb}} MB; not reading it' },
292
- 'claude-rewind-not-found': { zh: '该消息不在会话已保存的对话链中', en: 'That message is not in the session\'s saved conversation' },
293
- 'claude-images-too-many': { zh: '一条消息最多附 {{n}} 张图片', en: 'A message carries at most {{n}} images' },
294
- 'claude-images-too-large': { zh: '这条消息的图片合计超过 {{mb}} MB', en: 'The images of this message exceed {{mb}} MB together' },
295
- 'claude-image-too-large': { zh: '图片 {{name}} 超过 {{mb}} MB', en: 'The image {{name}} exceeds {{mb}} MB' },
296
- 'claude-image-type-refused': { zh: 'Claude 不接受图片 {{name}} 的格式({{type}})', en: 'Claude does not take the format of {{name}} ({{type}})' },
297
- 'claude-image-unreadable': { zh: '无法读取图片 {{name}}:{{err}}', en: 'The image {{name}} could not be read: {{err}}' },
298
- 'claude-image-gone': { zh: '暂存的图片已不在内存中,请重新粘贴', en: 'the staged image is no longer in memory; paste it again' },
299
- 'claude-session-closed': { zh: 'Claude 会话已关闭', en: 'The Claude session is closed' },
300
- 'claude-start-timeout': { zh: 'Claude CLI 未在时限内完成启动握手', en: 'The Claude CLI did not finish its start handshake in time' },
301
- 'claude-start-mode-downgraded': { zh: '设置中的权限模式 {{mode}} 需在 /permission 里显式选择,本会话先以 default 启动', en: 'The configured permission mode {{mode}} needs an explicit choice in /permission; this session starts in default' },
302
- 'claude-start-mode-env': { zh: '权限模式由 DSH_TUI_CLAUDE_PERMISSION_MODE 指定:{{mode}}', en: 'Permission mode set by DSH_TUI_CLAUDE_PERMISSION_MODE: {{mode}}' },
303
- 'claude-start-mode-env-ignored': { zh: '已忽略 DSH_TUI_CLAUDE_PERMISSION_MODE={{mode}}(只接受 default/acceptEdits/plan/dontAsk/bypassPermissions)', en: 'Ignored DSH_TUI_CLAUDE_PERMISSION_MODE={{mode}} (accepts default/acceptEdits/plan/dontAsk/bypassPermissions)' },
304
- 'claude-start-mode-bypass-not-carried': { zh: '上次的「跳过权限」不会带到新会话,本会话照常审批;可用 /permission 重新开启', en: 'Bypass permissions from the last session is not carried into a new one; approvals are on. Turn it back on with /permission' },
305
- 'claude-input-refused': { zh: 'Claude 拒绝了这条输入', en: 'Claude refused this input' },
306
- 'claude-assistant-error': { zh: 'Claude 错误:{{error}}', en: 'Claude error: {{error}}' },
307
- 'claude-api-retry': { zh: 'API 重试 {{attempt}}/{{max}}{{detail}}…', en: 'API retry {{attempt}}/{{max}}{{detail}}…' },
308
- 'claude-api-retry-status': { zh: ' · HTTP {{status}}', en: ' · HTTP {{status}}' },
309
- 'claude-notification-turn': { zh: '后台任务完成,模型继续处理', en: 'A background task finished; the model continues' },
310
- 'claude-model-fallback': { zh: '{{original}} 拒绝了这次请求{{category}},已改用 {{model}} 重试(本会话之后都用它)', en: '{{original}} declined this request{{category}}; retried on {{model}} (the session continues on it)' },
311
- 'claude-model-fallback-local': { zh: '一个子任务改由 {{model}} 回答({{original}} 拒绝了它),会话模型不变', en: 'A side task was answered by {{model}} ({{original}} declined it); the session model is unchanged' },
312
- 'claude-model-refused': { zh: '{{model}} 拒绝了这次请求{{category}},没有可用的回退模型', en: '{{model}} declined this request{{category}} and no fallback model is available' },
313
- 'claude-refusal-category-suffix': { zh: '(类别:{{category}})', en: ' (category: {{category}})' },
314
- 'claude-rate-limit-warning': { zh: '订阅用量接近{{window}}上限({{percent}}%){{resets}}', en: 'Approaching the {{window}} usage limit ({{percent}}%){{resets}}' },
315
- 'claude-rate-limit-rejected': { zh: '已达到{{window}}用量上限{{resets}}', en: 'The {{window}} usage limit is reached{{resets}}' },
316
- 'claude-rate-limit-resets': { zh: ',{{time}}重置', en: ' — resets {{time}}' },
317
- 'claude-rate-limit-in': { zh: '{{duration}}后', en: 'in {{duration}}' },
318
- 'claude-auth-status-error': { zh: 'Claude 认证出错:{{error}}', en: 'Claude authentication error: {{error}}' },
319
- 'claude-memory-recalled': { zh: '已回忆 {{count}} 条记忆', en: { one: 'Recalled {{count}} memory', other: 'Recalled {{count}} memories' } },
320
- 'claude-memory-synthesized': { zh: '已从记忆中归纳相关上下文', en: 'Recalled a summary of relevant memories' },
321
- 'claude-activity-thinking': { zh: '思考中', en: 'Thinking' },
322
- 'claude-activity-waiting': { zh: '等待确认', en: 'Waiting for approval' },
323
- 'claude-activity-done': { zh: '完成', en: 'Done' },
324
- 'claude-activity-done-tools': { zh: '完成 · {{count}} 个工具', en: { one: 'Done · 1 tool', other: 'Done · {{count}} tools' } },
325
- // ── MCP elicitation → questionnaire (backend-neutral: src/channel/elicitation.ts)
326
- 'elicit-skip': { zh: '跳过', en: 'Skip' },
327
- 'elicit-skip-desc': { zh: '这一项不填', en: 'Leave this field empty' },
328
- 'elicit-optional': { zh: '{{title}}(可选)', en: '{{title}} (optional)' },
329
- 'elicit-yes': { zh: '是', en: 'Yes' },
330
- 'elicit-no': { zh: '否', en: 'No' },
331
- 'elicit-send': { zh: '发送', en: 'Send' },
332
- 'elicit-send-desc': { zh: '把这些回答交给 MCP 服务器', en: 'Give these answers to the MCP server' },
333
- 'elicit-decline': { zh: '拒绝', en: 'Decline' },
334
- 'elicit-decline-desc': { zh: '不提供,告诉服务器你拒绝了', en: 'Provide nothing; tell the server you declined' },
335
- 'elicit-confirm': { zh: '把回答发送给 MCP 服务器 {{server}}?', en: 'Send your answers to the MCP server {{server}}?' },
336
- 'elicit-invalid': { zh: '请重新填写:{{reason}}', en: 'Please answer again: {{reason}}' },
337
- 'elicit-invalid-required': { zh: '这一项必填', en: 'this field is required' },
338
- 'elicit-invalid-choice': { zh: '请选择一项', en: 'pick one of the options' },
339
- 'elicit-invalid-number': { zh: '需要一个数字', en: 'a number is expected' },
340
- 'elicit-invalid-integer': { zh: '需要一个整数', en: 'a whole number is expected' },
341
- 'elicit-invalid-min': { zh: '不能小于 {{min}}', en: 'must be at least {{min}}' },
342
- 'elicit-invalid-max': { zh: '不能大于 {{max}}', en: 'must be at most {{max}}' },
343
- 'elicit-invalid-min-length': { zh: '至少 {{n}} 个字符', en: 'at least {{n}} characters' },
344
- 'elicit-invalid-max-length': { zh: '至多 {{n}} 个字符', en: 'at most {{n}} characters' },
345
- 'elicit-invalid-min-items': { zh: '至少选 {{n}} 项', en: 'pick at least {{n}}' },
346
- 'elicit-invalid-max-items': { zh: '至多选 {{n}} 项', en: 'pick at most {{n}}' },
347
- 'elicit-invalid-email': { zh: '需要一个邮箱地址', en: 'an email address is expected' },
348
- 'elicit-invalid-uri': { zh: '需要一个完整的网址(URI)', en: 'a full URI is expected' },
349
- 'elicit-invalid-date': { zh: '需要日期(YYYY-MM-DD)', en: 'a date is expected (YYYY-MM-DD)' },
350
- 'elicit-invalid-date-time': { zh: '需要日期时间(ISO 8601)', en: 'a date and time is expected (ISO 8601)' },
351
- 'elicit-invalid-pattern': { zh: '格式不符合要求', en: 'the format does not match' },
352
- 'elicit-invalid-json': { zh: '需要 JSON 形式的值', en: 'a JSON value is expected' },
353
- 'elicit-kind-number': { zh: '数字', en: 'number' },
354
- 'elicit-kind-integer': { zh: '整数', en: 'whole number' },
355
- 'elicit-hint-range': { zh: '{{kind}},{{min}}–{{max}}', en: '{{kind}}, {{min}}–{{max}}' },
356
- 'elicit-hint-min': { zh: '{{kind}},不小于 {{min}}', en: '{{kind}}, at least {{min}}' },
357
- 'elicit-hint-max': { zh: '{{kind}},不大于 {{max}}', en: '{{kind}}, at most {{max}}' },
358
- 'elicit-hint-json': { zh: '以 JSON 形式输入', en: 'enter it as JSON' },
359
- 'elicit-hint-format': { zh: '格式:{{format}}', en: 'format: {{format}}' },
360
- 'elicit-url-notice': { zh: 'MCP 服务器 {{server}} 请你在浏览器中打开:{{url}}', en: 'The MCP server {{server}} asks you to open: {{url}}' },
361
- 'elicit-url-question': { zh: 'MCP 服务器 {{server}} 需要你在浏览器中完成一步', en: 'The MCP server {{server}} needs you to finish a step in the browser' },
362
- 'elicit-url-detail': { zh: '打开下面的链接完成后选「继续」;完成时服务器也可能自动关闭这个面板', en: 'Open the link below, then choose Continue; the server may also close this panel when it is done' },
363
- 'elicit-url-accept': { zh: '继续(已打开链接)', en: 'Continue (link opened)' },
364
- 'elicit-url-accept-desc': { zh: '告诉服务器你同意并已打开链接', en: 'Tell the server you agreed and opened the link' },
365
- 'elicit-url-complete': { zh: 'MCP 服务器 {{server}} 确认已完成', en: 'The MCP server {{server}} confirmed it is done' },
366
- 'elicit-url-missing': { zh: 'MCP 服务器 {{server}} 请求打开链接却没有给出网址,已拒绝', en: 'The MCP server {{server}} asked to open a link but gave none; declined' },
367
- 'elicit-unsupported': { zh: 'MCP 服务器 {{server}} 的请求({{mode}})无法在此显示,已拒绝', en: 'The request of the MCP server {{server}} ({{mode}}) cannot be shown here; declined' },
368
- 'claude-refusal-header': { zh: '模型拒绝', en: 'Model declined' },
369
- 'claude-refusal-question': { zh: '{{model}} 拒绝了这次请求,要换模型重试吗?', en: '{{model}} declined this request. Retry on another model?' },
370
- 'claude-refusal-this-model': { zh: '当前模型', en: 'The current model' },
371
- 'claude-refusal-retry': { zh: '用 {{model}} 重试', en: 'Retry on {{model}}' },
372
- 'claude-refusal-retry-desc': { zh: '本次请求改由回退模型回答', en: 'The fallback model answers this request' },
373
- 'claude-refusal-cancel': { zh: '取消', en: 'Cancel' },
374
- 'claude-refusal-cancel-desc': { zh: '保留拒绝结果,结束本回合', en: 'Keep the refusal and end the turn' },
375
- 'claude-refusal-category': { zh: '拒绝类别:{{category}}', en: 'Refusal category: {{category}}' },
376
- 'claude-doctor-cli': { zh: 'Claude CLI: {{path}}({{source}})· 版本 {{version}}', en: 'Claude CLI: {{path}} ({{source}}) · version {{version}}' },
377
- 'claude-doctor-bundled': { zh: 'SDK 自带二进制', en: 'SDK bundled binary' },
378
- 'claude-doctor-sdk': { zh: 'Claude Agent SDK {{version}}(已验证 {{validated}})', en: 'Claude Agent SDK {{version}} (validated {{validated}})' },
379
- 'claude-doctor-mode': { zh: '起始权限模式: {{mode}}(来源 {{source}})', en: 'Start permission mode: {{mode}} (from {{source}})' },
380
- // Codex backend (src/backends/codex/): approval wording follows the official
381
- // client (docs/codex-backend-design.md §8.4); notices name what to do next.
382
- 'codex-approve-accept': { zh: '是,执行', en: 'Yes, proceed' },
383
- 'codex-approve-decline': { zh: '否,跳过它继续', en: 'No, continue without running it' },
384
- 'codex-approve-cancel': { zh: '否,并告诉 Codex 怎么做', en: 'No, and tell Codex what to do differently' },
385
- 'codex-approve-decline-files': { zh: '否,不应用这些改动,继续', en: 'No, continue without these changes' },
386
- 'codex-approve-grant-turn': { zh: '是,本回合授予这些权限', en: 'Yes, grant these permissions for this turn' },
387
- 'codex-approve-deny-permissions': { zh: '否,不授予权限继续', en: 'No, continue without permissions' },
388
- 'codex-approve-stdin-name': { zh: '终端输入', en: 'Terminal input' },
389
- 'codex-approve-stdin': { zh: '向运行中的终端写入输入', en: 'writes input to a running terminal' },
390
- 'codex-approve-network-context': { zh: '访问网络主机 {{host}}({{protocol}})', en: 'network access to {{host}} ({{protocol}})' },
391
- 'codex-approve-extra-permissions': { zh: '额外权限:{{what}}', en: 'extra permissions: {{what}}' },
392
- 'codex-approve-cwd': { zh: '在 {{cwd}} 中运行', en: 'runs in {{cwd}}' },
393
- 'codex-approve-prefix': { zh: '是,以后以 `{{prefix}}` 开头的命令不再询问', en: 'Yes, and don\'t ask again for commands that start with `{{prefix}}`' },
394
- 'codex-approve-session-command': { zh: '是,本会话内此命令不再询问', en: 'Yes, and don\'t ask again for this command in this session' },
395
- 'codex-approve-session-files': { zh: '是,本会话内这些文件不再询问', en: 'Yes, and don\'t ask again for these files' },
396
- 'codex-approve-session-permissions': { zh: '是,本会话内都授予这些权限', en: 'Yes, grant these permissions for this session' },
397
- 'codex-approve-network': { zh: '是,以后允许访问 {{host}}', en: 'Yes, and allow {{host}} in the future' },
398
- 'codex-permissions-name': { zh: '额外权限', en: 'Extra permissions' },
399
- 'codex-perm-network': { zh: '联网', en: 'network' },
400
- 'codex-perm-read': { zh: '读取 {{paths}}', en: 'read {{paths}}' },
401
- 'codex-perm-write': { zh: '写入 {{paths}}', en: 'write {{paths}}' },
402
- 'codex-declined': { zh: '已拒绝', en: 'Declined' },
403
- 'codex-interrupted': { zh: '已中断', en: 'Interrupted' },
404
- 'codex-tool-failed': { zh: '执行失败', en: 'Failed' },
405
- 'codex-tool-unfinished': { zh: '回合结束时仍未完成', en: 'Unfinished when the turn ended' },
406
- 'codex-turn-failed': { zh: '回合失败', en: 'The turn failed' },
407
- 'codex-turn-start-failed': { zh: 'Codex 没有接受这条消息:{{err}}', en: 'Codex did not take this message: {{err}}' },
408
- 'codex-steer-fallback': { zh: '当前回合无法插话,这条消息会在回合结束后发送', en: 'The running turn cannot take this message now; it will be sent when the turn ends' },
409
- 'codex-cancel-forced': { zh: '中断 15 秒未得到确认,已在本地结束本回合', en: 'The interrupt was not confirmed within 15s; the turn was closed here' },
410
- 'codex-session-closed': { zh: 'Codex 会话已关闭', en: 'The Codex session is closed' },
411
- 'codex-retrying': { zh: '请求失败,Codex 正在重试:{{message}}', en: 'The request failed; Codex is retrying: {{message}}' },
412
- 'codex-rerouted': { zh: '模型已由 {{from}} 改为 {{to}}({{reason}})', en: 'The model was rerouted from {{from}} to {{to}} ({{reason}})' },
413
- 'codex-system-error': { zh: 'Codex 报告该会话出现系统错误', en: 'Codex reported a system error on this thread' },
414
- 'codex-review-start': { zh: '开始代码审查:{{review}}', en: 'Code review started: {{review}}' },
415
- 'codex-auto-review-started': { zh: '自动审查中…', en: 'Auto-review in progress…' },
416
- 'codex-auto-review-approved': { zh: '自动审查:已批准', en: 'Auto-review: approved' },
417
- 'codex-auto-review-denied': { zh: '自动审查:已拒绝', en: 'Auto-review: denied' },
418
- 'codex-auto-review-ended': { zh: '自动审查已结束', en: 'Auto-review ended' },
419
- 'codex-strict-review': { zh: '本回合之后的命令需要先通过审查', en: 'Further commands in this turn need a review first' },
420
- 'codex-hook-started': { zh: 'hook {{event}} 运行中…', en: 'Hook {{event}} running…' },
421
- 'codex-hook-done': { zh: 'hook {{event}} 完成 {{duration}}', en: 'Hook {{event}} finished {{duration}}' },
422
- 'codex-hook-failed': { zh: 'hook {{event}} 失败 {{duration}}', en: 'Hook {{event}} failed {{duration}}' },
423
- 'codex-mcp-failed': { zh: 'MCP 服务器 {{name}} 启动失败:{{error}}', en: 'The MCP server {{name}} failed to start: {{error}}' },
424
- 'codex-thread-closed': { zh: '该会话已在别处关闭,仍可继续对话', en: 'This thread was closed elsewhere; you can keep talking' },
425
- 'codex-thread-archived': { zh: '该会话已在别处归档,仍可继续对话', en: 'This thread was archived elsewhere; you can keep talking' },
426
- 'codex-thread-deleted': { zh: '该会话已在别处删除', en: 'This thread was deleted elsewhere' },
427
- 'codex-rate-limit-reached': { zh: '已达到 Codex 用量上限({{kind}})', en: 'The Codex usage limit is reached ({{kind}})' },
428
- 'codex-hint-unauthorized': { zh: 'Codex 凭据无效或已过期:在终端运行 codex login 重新登录', en: 'The Codex credential is invalid or expired: sign in again with `codex login` in a terminal' },
429
- 'codex-hint-context': { zh: '上下文已满:可以用 /compact 压缩后继续', en: 'The context is full: run /compact and continue' },
430
- 'codex-hint-limit': { zh: '已达到用量上限,稍后再试', en: 'A usage limit is reached; try again later' },
431
- 'codex-hint-sandbox': { zh: '沙箱出错:Linux 上请安装 bubblewrap(例如 apt install bubblewrap)', en: 'Sandbox error: on Linux install bubblewrap (e.g. apt install bubblewrap)' },
432
- 'codex-connection-lost': { zh: 'Codex 进程退出,正在重连…', en: 'The Codex process exited; reconnecting…' },
433
- 'codex-connection-failed': { zh: 'Codex 进程无法启动:{{err}}', en: 'The Codex process cannot start: {{err}}' },
434
- 'codex-connection-dead': { zh: '连接已断开且无法恢复,请重新打开会话', en: 'The connection is gone for good; please reopen the session' },
435
- 'codex-reconnected': { zh: '已重新连接 Codex', en: 'Reconnected to Codex' },
436
- 'codex-not-installed': { zh: '未找到 codex:npm i -g @openai/codex 或 brew install codex,或设置 CODEX_EXECUTABLE', en: 'codex was not found: npm i -g @openai/codex or brew install codex, or set CODEX_EXECUTABLE' },
437
- 'codex-too-old': { zh: 'codex {{version}} 太旧(至少 {{min}}):请升级', en: 'codex {{version}} is too old (needs {{min}}): please upgrade' },
438
- 'codex-auth-missing-hint': { zh: '未检测到 Codex 凭据:启动后用 /login 登录,或设置 OPENAI_API_KEY', en: 'No Codex credential found: sign in with /login after start, or set OPENAI_API_KEY' },
439
- 'codex-start-failed': { zh: 'Codex app-server 启动失败:{{err}}', en: 'The Codex app-server failed to start: {{err}}' },
440
- 'codex-open-failed': { zh: '无法打开 Codex 会话:{{err}}', en: 'Could not open the Codex thread: {{err}}' },
441
- 'codex-thread-busy': { zh: 'Codex 会话 {{id}} 正被另一个 Codex 进程使用,先关闭那边再打开', en: 'The Codex thread {{id}} is in use by another Codex process; close it there first' },
442
- 'codex-resume-not-found': { zh: '找不到 Codex 会话 {{id}}({{err}})', en: 'The Codex thread {{id}} was not found ({{err}})' },
443
- 'codex-version-drift': { zh: 'codex {{version}} 未经本版 dsh-tui 验证(已验证:{{validated}}),继续运行', en: 'codex {{version}} is not validated with this dsh-tui (validated: {{validated}}); continuing' },
444
- 'codex-doctor-cli': { zh: 'Codex CLI: {{path}}({{source}})· 版本 {{version}}', en: 'Codex CLI: {{path}} ({{source}}) · version {{version}}' },
445
- 'codex-doctor-home': { zh: 'Codex 主目录: {{home}}', en: 'Codex home: {{home}}' },
446
- 'codex-doctor-thread': { zh: 'Codex 会话: {{id}} · provider {{provider}} · 模型 {{model}}', en: 'Codex thread: {{id}} · provider {{provider}} · model {{model}}' },
447
- 'codex-doctor-mode': { zh: '权限模式: {{mode}}', en: 'Permission mode: {{mode}}' },
448
- 'codex-doctor-bubblewrap': { zh: '未找到 bubblewrap:Codex 改用自带沙箱;建议用系统包管理器安装 bubblewrap', en: 'bubblewrap was not found: Codex uses its bundled sandbox; installing bubblewrap from the system package manager is recommended' },
449
- 'codex-mode-read-only': { zh: '只读', en: 'Read Only' },
450
- 'codex-mode-read-only-desc': { zh: '只读取文件;命令和修改需审批', en: 'Read files; commands and changes require approval' },
451
- 'codex-mode-auto': { zh: '默认', en: 'Default' },
452
- 'codex-mode-auto-desc': { zh: '可修改工作区;工作区外和网络操作需审批', en: 'Edit the workspace; ask before outside-workspace or network access' },
453
- 'codex-mode-full-access': { zh: '完全访问', en: 'Full Access' },
454
- 'codex-mode-full-access-desc': { zh: '关闭沙箱和审批,仅通过显式选择进入', en: 'Disable sandbox and approvals; explicit selection only' },
455
- 'codex-mode-plan': { zh: '计划', en: 'Plan' },
456
- 'codex-mode-plan-desc': { zh: '先调研和规划,保留当前权限档', en: 'Research and plan, preserving the current permissions' },
457
- 'codex-mode-invalid': { zh: '未知 Codex 模式:{{mode}}', en: 'Unknown Codex mode: {{mode}}' },
458
- 'codex-settings-deferred': { zh: '当前 Codex 版本不支持即时改设置,选择将在下一回合生效', en: 'This Codex version cannot update idle settings; your choices apply on the next turn' },
459
- 'codex-capability-unavailable': { zh: '当前 Codex 版本不支持 {{feature}},请升级', en: 'This Codex version does not support {{feature}}; please upgrade' },
460
- 'codex-effort-none': { zh: '无', en: 'None' },
461
- 'codex-effort-minimal': { zh: '极低', en: 'Minimal' },
462
- 'codex-effort-low': { zh: '低', en: 'Low' },
463
- 'codex-effort-medium': { zh: '中', en: 'Medium' },
464
- 'codex-effort-high': { zh: '高', en: 'High' },
465
- 'codex-effort-xhigh': { zh: '极高', en: 'Extra high' },
466
- 'codex-effort-ultra': { zh: '超高', en: 'Ultra' },
467
- 'codex-command-idle': { zh: '请先结束或中断当前回合', en: 'Finish or interrupt the current turn first' },
468
- 'codex-command-review': { zh: '审查未提交改动、分支、提交或自定义范围', en: 'Review working changes, a branch, a commit, or custom instructions' },
469
- 'codex-command-diff': { zh: '显示最近回合的文件差异', en: 'Show the latest turn\'s file diff' },
470
- 'codex-command-plan': { zh: '切换到 Plan 模式,可附带提示词', en: 'Enter Plan mode, optionally with a prompt' },
471
- 'codex-command-usage': { zh: '查看 Codex 额度和重置时间', en: 'Show Codex usage limits and reset times' },
472
- 'codex-diff-empty': { zh: '没有文件差异', en: 'No file differences' },
473
- 'codex-usage-window': { zh: '{{name}}:已用 {{used}}% · 重置 {{reset}}', en: '{{name}}: {{used}}% used · resets {{reset}}' },
474
- 'codex-usage-credits': { zh: '额度余额 {{balance}} · 不限量:{{unlimited}}', en: 'Credits {{balance}} · unlimited: {{unlimited}}' },
475
- 'codex-usage-unavailable': { zh: '当前 provider 未提供额度信息', en: 'The current provider supplies no usage-limit information' },
476
- 'codex-yes': { zh: '是', en: 'yes' },
477
- 'codex-no': { zh: '否', en: 'no' },
478
- 'codex-question-auto-answered': { zh: '问卷等待超时,已按服务端设置选择默认答案', en: 'The question timed out; the server\'s default answer was selected' },
479
- 'codex-plan-implement': { zh: '要实施这个计划吗?', en: 'Implement this plan?' },
480
- 'codex-plan-yes': { zh: '是,实施这个计划', en: 'Yes, implement this plan' },
481
- 'codex-plan-clear': { zh: '是,清空上下文后实施', en: 'Yes, clear context and implement' },
482
- 'codex-plan-stay': { zh: '否,留在 Plan 模式', en: 'No, stay in Plan mode' },
483
- 'codex-plan-action-failed': { zh: '无法开始实施计划:{{error}}', en: 'Could not start implementing the plan: {{error}}' },
484
- 'codex-bwrap-warning': { zh: '未找到 bubblewrap,沙箱命令可能失败。请安装(如 apt install bubblewrap),或在 /permission 中明确选择完全访问', en: 'bubblewrap was not found; sandboxed commands may fail. Install it (e.g. apt install bubblewrap), or explicitly select Full Access in /permission' },
485
- 'codex-model-waiting': { zh: '等待模型响应…', en: 'Waiting for the model…' },
486
- 'codex-model-stalled': { zh: '模型长时间无响应,可按 Esc 中断', en: 'The model has not responded for a long time; press Esc to interrupt' },
487
- 'codex-working-command': { zh: '运行 {{command}}', en: 'Running {{command}}' },
488
- 'codex-working-files': { zh: '编辑 {{files}}', en: 'Editing {{files}}' },
489
- 'codex-working-subagents': { zh: '等待子代理', en: 'Waiting for subagents' },
490
- 'codex-working-thinking': { zh: '思考中…', en: 'Thinking…' },
491
- 'codex-channel-url-required': { zh: '渠道连接缺少 base URL,请用 /channel 配置', en: 'The channel connection has no base URL; configure it with /channel' },
492
- 'codex-channel-token-missing': { zh: '渠道 {{name}} 缺少可用令牌,请用 /channel 补充', en: 'Channel {{name}} has no usable token; add one with /channel' },
493
- 'codex-channel-store-unavailable': { zh: '宿主未提供渠道令牌库,无法保存令牌', en: 'The host did not provide a channel token store; the token cannot be saved' },
494
- 'codex-channel-token-write-failed': { zh: '渠道令牌保存失败,连接未更新', en: 'The channel token could not be saved; the connection was not updated' },
495
- 'codex-auth-login-needed': { zh: 'Codex 需要凭据:用 /login 登录', en: 'Codex needs credentials: sign in with /login' },
496
- 'codex-auth-refresh-failed': { zh: 'ChatGPT 订阅令牌刷新失败,已停止注入;用 /login 重新登录,或使用自己的 Codex 登录', en: 'The ChatGPT subscription token refresh failed; injection stopped. Use /login again or your own Codex login' },
497
- 'codex-auth-login-failed': { zh: 'Codex 登录未完成,已停止托管令牌注入;请用 /login 重试', en: 'Codex login did not complete; managed token injection stopped. Retry with /login' },
498
- 'codex-auth-claims-missing': { zh: '内置 OAuth 令牌缺少 ChatGPT 账户信息,未注入;请用 /login 重新登录', en: 'The built-in OAuth token has no ChatGPT account identity and was not injected; sign in again with /login' },
499
- 'codex-auth-source-channel': { zh: '凭据来源:渠道 {{name}}', en: 'Credential source: channel {{name}}' },
500
- 'codex-auth-source-oauth': { zh: '凭据来源:dsh-auth ChatGPT 订阅', en: 'Credential source: dsh-auth ChatGPT subscription' },
501
- 'codex-auth-source-native': { zh: '凭据来源:Codex 自己的登录', en: 'Credential source: Codex native login' },
502
- 'codex-auth-source-api-key': { zh: '凭据来源:API key', en: 'Credential source: API key' },
503
- 'codex-auth-source-missing': { zh: '凭据来源:未登录', en: 'Credential source: not signed in' },
504
- 'codex-auth-source-unknown': { zh: '凭据来源:由 Codex 配置管理(无法确定)', en: 'Credential source: managed by Codex configuration (unknown)' },
505
- 'codex-auth-plan': { zh: '订阅:{{plan}}', en: 'Subscription: {{plan}}' },
506
- 'codex-auth-host': { zh: 'Provider 主机:{{host}}', en: 'Provider host: {{host}}' },
507
- 'codex-auth-route-blocked': { zh: '当前路由不接受内置订阅令牌;请使用自己的 Codex 登录或 /channel 渠道', en: 'This route does not accept built-in subscription tokens; use your own Codex login or /channel' },
508
- 'codex-auth-channel-active': { zh: '当前使用渠道凭据;请在 /channel 管理连接,不改动 OpenAI 登录', en: 'Channel credentials are active; manage the connection in /channel without changing OpenAI login' },
509
- 'codex-auth-api-key-required': { zh: '请输入非空 API key', en: 'Enter a non-empty API key' },
510
- 'codex-login-choose': { zh: '选择 Codex 登录方式', en: 'Choose a Codex sign-in method' },
511
- 'codex-login-oauth': { zh: '内置 ChatGPT OAuth', en: 'Built-in ChatGPT OAuth' },
512
- 'codex-login-oauth-desc': { zh: '复用 dsh-auth 登录,只向第一方路由提供内存令牌', en: 'Use dsh-auth; supply in-memory tokens only to first-party routes' },
513
- 'codex-login-device': { zh: 'Codex 设备码登录', en: 'Codex device-code login' },
514
- 'codex-login-device-desc': { zh: '在浏览器输入设备码,凭据由 Codex 保存', en: 'Enter a device code in a browser; Codex stores the credential' },
515
- 'codex-login-api-key': { zh: 'API key', en: 'API key' },
516
- 'codex-login-api-key-prompt': { zh: '输入 OpenAI API key', en: 'Enter an OpenAI API key' },
517
- 'codex-login-api-key-storage': { zh: '此方式会把 API key 写入用户的 Codex 凭据存储', en: 'This method writes the API key into your Codex credential store' },
518
- 'codex-login-device-code': { zh: '在验证页面输入设备码:{{code}}', en: 'Enter this device code on the verification page: {{code}}' },
519
- 'codex-login-device-wait': { zh: '等待浏览器授权完成;可取消此次登录', en: 'Waiting for browser authorization; you can cancel this login' },
520
- 'codex-login-cancel': { zh: '取消此次登录', en: 'Cancel this login' },
521
- 'codex-login-success': { zh: 'Codex 登录已完成', en: 'Codex sign-in completed' },
522
- 'codex-goal-usage-limited': { zh: 'Codex 用量额度已达到上限', en: 'The Codex usage limit was reached' },
523
- 'codex-goal-budget-limited': { zh: '目标的 token 预算已用尽', en: 'The goal token budget was exhausted' },
524
- 'codex-goal-blocked': { zh: 'Codex 目标暂时受阻', en: 'The Codex goal is blocked' },
525
- 'codex-tasks-unsupported': { zh: '此 Codex 不支持后台终端监控,任务能力已关闭', en: 'This Codex does not support background terminal monitoring; task controls are unavailable' },
526
- 'codex-terminal-ended': { zh: '终端已不在运行列表中;退出状态不可用', en: 'The terminal is no longer running; exit status is unavailable' },
527
- 'codex-terminal-stopped': { zh: '后台终端已停止', en: 'The background terminal was stopped' },
528
- 'codex-terminal-no-output': { zh: '此后台终端暂没有可读取的输出', en: 'No readable output is available for this background terminal' },
529
- 'codex-side-open-failed': { zh: '无法创建临时旁问会话', en: 'Could not create the ephemeral side-question thread' },
530
- 'codex-images-too-many': { zh: 'Codex 一条消息最多接受 {{n}} 张图片', en: 'Codex accepts at most {{n}} images per message' },
531
- 'codex-image-type-refused': { zh: '图片 {{name}} 的格式 {{type}} 不受 Codex 支持', en: 'Image {{name}} uses {{type}}, which Codex does not accept' },
532
- 'codex-image-unreadable': { zh: '无法读取图片 {{name}}', en: 'Image {{name}} could not be read' },
533
- 'codex-image-too-large': { zh: '图片 {{name}} 超过 Codex 的 {{mb}} MiB 限制', en: 'Image {{name}} exceeds the Codex {{mb}} MiB limit' },
534
- 'codex-images-too-large': { zh: '本条消息的图片总大小超过 {{mb}} MiB', en: 'The message images exceed {{mb}} MiB in total' },
535
- 'codex-image-dimensions-refused': { zh: '图片 {{name}} 超过 {{px}} 像素限制,请缩小后重试', en: 'Image {{name}} exceeds the {{px}} pixel limit; resize it and retry' },
536
- 'codex-history-fetch-failed': { zh: 'Codex 更早历史连续读取失败,暂时停止预取;可重新打开会话后重试', en: 'Earlier Codex history could not be read after three attempts; reopen the session to retry' },
537
- 'codex-preview-image': { zh: '[图片]', en: '[Image]' },
538
- 'codex-archive-busy': { zh: '该 Codex 会话由活动中的内部任务使用,暂时无法归档', en: 'This Codex thread is owned by an active internal worker and cannot be archived yet' },
539
- 'codex-orphan-request': { zh: '无法确定 Codex 子代理请求所属会话,已取消该请求', en: 'Could not find the session owning a Codex subagent request; the request was cancelled' },
540
- 'codex-channel-url-invalid': { zh: '渠道 URL 只接受 HTTPS(HTTP 仅限 localhost/127.0.0.1),不能含账号密码、查询串、片段或疑似密钥路径', en: 'A channel URL must use HTTPS (HTTP only on localhost/127.0.0.1), without userinfo, query, fragment, or key-like path segments' },
541
- 'codex-channel-id-invalid': { zh: '渠道 ID 只能含字母、数字、下划线和连字符', en: 'A channel ID may only contain letters, digits, underscores and hyphens' },
542
- 'codex-channel-wire-api-invalid': { zh: 'Codex 渠道仅支持 Responses API', en: 'Codex channels only support the Responses API' },
543
- 'codex-channel-env-invalid': { zh: '渠道 env 只能存非凭据变量;令牌请填入令牌输入框', en: 'Channel env may only hold non-credential variables; use the token input for credentials' },
544
- 'codex-anchor-missing': { zh: '找不到这条消息的原生回合,无法 fork 或回退', en: 'The native turn for this message is unavailable; it cannot be forked or rewound' },
545
- 'codex-rewind-files-unsupported': { zh: 'Codex 仅支持对话回退,不恢复工作区文件', en: 'Codex supports conversation rewind only; workspace files are not restored' },
546
- 'codex-rewind-load-older': { zh: '请先加载更早的消息,再回退到这一回合', en: 'Load earlier messages before rewinding to this turn' },
547
- 'codex-goals-unsupported': { zh: '此 Codex 不支持目标管理,目标能力已关闭', en: 'This Codex does not support goal management; goal controls are unavailable' },
548
- 'codex-subagent-unavailable': { zh: '无法读取此 Codex 子代理的历史', en: 'This Codex subagent history is unavailable' },
549
- 'codex-reconnect-incomplete': { zh: 'Codex 恢复缺口超过读取预算或游标失效,请重新打开会话', en: 'Codex recovery exceeded its history budget or could not reach a known turn; reopen the session' },
550
218
  'cmd-unavailable-backend': { zh: '/{{cmd}} 在 {{backend}} 内核下不可用', en: '/{{cmd}} is not available on the {{backend}} kernel' },
551
219
  'export-user-section': { zh: '## 用户', en: '## User' },
552
220
  'export-thinking-section': { zh: '## 思考', en: '## Thinking' },
@@ -565,7 +233,6 @@ const dict = {
565
233
  'doctor-model': { zh: '模型: {{model}} · 提供方: {{provider}}', en: 'Model: {{model}} · Provider: {{provider}}' },
566
234
  'doctor-cwd': { zh: '工作目录: {{cwd}}', en: 'Working directory: {{cwd}}' },
567
235
  'doctor-context-window': { zh: '上下文窗口: {{window}} tokens', en: 'Context window: {{window}} tokens' },
568
- 'doctor-unknown': { zh: '未知', en: 'unknown' },
569
236
  'doctor-session': { zh: '会话: {{id}}', en: 'Session: {{id}}' },
570
237
  'doctor-backend': { zh: '内核: {{label}} ({{id}})', en: 'Kernel: {{label}} ({{id}})' },
571
238
  'doctor-config': { zh: '配置: {{candidate}} {{state}}', en: 'Config: {{candidate}} {{state}}' },
@@ -586,6 +253,7 @@ const dict = {
586
253
  'subagent-status-failed': { zh: '失败', en: 'failed' },
587
254
  'subagent-status-unknown': { zh: '状态未知', en: 'status unknown' },
588
255
  'subagent-task-fallback': { zh: '{{kind}} 任务', en: '{{kind}} task' },
256
+ 'task-complete-notification': { zh: 'dsh-TUI · 任务已完成', en: 'dsh-TUI · Task complete' },
589
257
  'subagent-background': { zh: '后台', en: 'background' },
590
258
  'subagent-interrupt-failed': { zh: '无法停止子代理 {{id}}(已结束或被拒绝)', en: 'Could not stop subagent {{id}} (already finished or refused)' },
591
259
  'agent-preset-switched': { zh: 'Agent preset 已切换:{{preset}}', en: 'Agent preset switched: {{preset}}' },
@@ -597,7 +265,6 @@ const dict = {
597
265
  'rewind-attach-failed': { zh: '已回退,但工作区挂载失败 · {{err}}', en: 'Session rewound, but workspace attachment failed · {{err}}' },
598
266
  'rewind-no-persistence': { zh: '回退不可用——持久化服务未加载', en: 'Rewind unavailable — session persistence not loaded' },
599
267
  'rewind-load-failed': { zh: '无法读取该会话日志 · {{err}}', en: 'Could not read that session log · {{err}}' },
600
- 'rewind-first-message': { zh: '不能回退到第一条消息之前', en: 'Cannot rewind past the very first message' },
601
268
  'rewind-noop': { zh: '该点之后没有可回退的内容', en: 'Nothing to rewind past this point' },
602
269
  'rewind-while-working': { zh: '回合运行中,无法回退', en: 'Cannot rewind while a turn is running' },
603
270
  'rewind-unanchored': { zh: '这条消息没有可回退的锚点', en: 'This message has no rewind anchor' },
@@ -608,7 +275,6 @@ const dict = {
608
275
  'rewind-fork-kept': { zh: '回退副本已保存但未能切换过去;可用此命令进入:{{command}}', en: 'The rewound copy is saved but could not be opened here; enter it with: {{command}}' },
609
276
  'rewind-mode-both': { zh: '回退会话并恢复文件', en: 'Rewind conversation and restore files' },
610
277
  'rewind-mode-files': { zh: '仅恢复文件(会话不变)', en: 'Restore files only (conversation unchanged)' },
611
- 'rename-failed': { zh: '重命名失败 · {{err}}', en: 'Rename failed · {{err}}' },
612
278
  'session-archive-failed': { zh: '归档会话失败 · {{err}}', en: 'Archiving the session failed · {{err}}' },
613
279
  'session-delete-failed': { zh: '删除会话失败 · {{err}}', en: 'Deleting the session failed · {{err}}' },
614
280
  'rewind-session-changed': { zh: '会话已切换,回退已放弃', en: 'The session changed; the rewind was dropped' },
@@ -622,6 +288,14 @@ const dict = {
622
288
  zh: '已分叉({{id}})——仍在原会话中\n新进程进入分叉:{{command}}',
623
289
  en: 'Forked ({{id}}) — still in the original session\nEnter the fork in a new process: {{command}}',
624
290
  },
291
+ // A fork of a session that holds no conversation keeps NO log until its own
292
+ // first real event (the fresh-session deferral), so there is no artifact a
293
+ // resume command could enter. This notice says that instead of printing a
294
+ // command that cannot work yet.
295
+ 'fork-done-unstored': {
296
+ zh: '已分叉({{id}})——仍在原会话中\n源会话还没有内容,分叉副本没有日志可恢复',
297
+ en: 'Forked ({{id}}) — still in the original session\nThe source session has no content yet, so the fork has no log to resume',
298
+ },
625
299
  // ── /tree screen (session family tree) ─────────────────────────────────
626
300
  'tree-title': { zh: '会话树', en: 'Session tree' },
627
301
  'tree-sessions': { zh: '会话', en: 'sessions' },
@@ -683,14 +357,20 @@ const dict = {
683
357
  'new-session-while-working': { zh: '回合运行中,无法新建会话', en: 'Cannot start a new session while a turn is running' },
684
358
  'new-session-unavailable': { zh: '新建会话不可用——agents 服务未加载', en: 'New session unavailable — agents service not loaded' },
685
359
  'new-session-failed': { zh: '新建会话失败 · {{err}}', en: 'New session failed · {{err}}' },
360
+ // ── startup phase (`ChannelUi.ready === false`) ──
361
+ 'startup-not-ready': { zh: '{{backend}} 还在启动——就绪后按 Enter 发送', en: '{{backend}} is still starting — press Enter to send once it is ready' },
362
+ 'startup-open-failed': { zh: '{{backend}} 会话没能打开:{{err}}', en: '{{backend}} session failed to open: {{err}}' },
363
+ 'startup-open-failed-hint': { zh: '/new 重试 · /kernel 切换内核 · /quit 退出', en: '/new to retry · /kernel to switch kernel · /quit to exit' },
364
+ 'startup-compose-failed-hint': { zh: 'DSH 没能启动 · /kernel 切换内核 · /quit 退出', en: 'DSH did not start · /kernel to switch kernel · /quit to exit' },
365
+ 'startup-compose-failed-hint-log': { zh: '启动日志:{{path}} · /kernel 切换内核 · /quit 退出', en: 'Startup log: {{path}} · /kernel to switch kernel · /quit to exit' },
366
+ 'status-starting': { zh: '正在启动 {{backend}}…', en: 'Starting {{backend}}…' },
367
+ 'host-dsh-unavailable': { zh: '没有用上已安装的 dsh:{{reason}}', en: 'Not using the installed dsh: {{reason}}' },
686
368
  'resume-raced': { zh: '会话打开期间当前会话开始了新的回合,已取消恢复;该回合在当前会话中继续', en: 'The current session started a turn while the other one was opening — the resume was cancelled; the turn continues here' },
687
369
  'new-session-raced': { zh: '新会话打开期间当前会话开始了新的回合,已取消 /new;该回合在当前会话中继续', en: 'The current session started a turn while the new one was opening — /new was cancelled; the turn continues here' },
688
370
  'new-session-attach-failed': { zh: '会话已创建,但工作区挂载失败 · {{err}}', en: 'Session created, but workspace attachment failed · {{err}}' },
689
371
  'model-switch-while-working': { zh: '回合运行中,无法切换模型', en: 'Cannot switch models while a turn is running' },
690
- 'model-switch-unavailable': { zh: '模型切换不可用——会话服务未加载', en: 'Model switch unavailable — session services not loaded' },
691
- 'model-switch-fork-failed': { zh: '无法切换模型 · {{err}}', en: 'Cannot switch models · {{err}}' },
372
+ 'model-switch-legacy-unavailable': { zh: '同会话切换模型需要 DSH >= 0.1.2-alpha.3,请先升级 DSH', en: 'Switching models within a session requires DSH >= 0.1.2-alpha.3; upgrade DSH first' },
692
373
  'model-switch-failed': { zh: '模型切换失败 · {{err}}', en: 'Model switch failed · {{err}}' },
693
- 'model-switch-attach-failed': { zh: '模型已切换,但工作区挂载失败 · {{err}}', en: 'Model switched, but workspace attachment failed · {{err}}' },
694
374
  'model-usage': { zh: '用法:/model <provider/model>(如 deepseek/deepseek-flash)', en: 'Usage: /model <provider/model> (e.g. deepseek/deepseek-flash)' },
695
375
  'model-unknown': { zh: '未知模型「{{spec}}」· /model 查看全部', en: 'Unknown model "{{spec}}" · /model to view all' },
696
376
  'compact-unavailable': { zh: '压缩不可用——当前 leaf 没有压缩服务', en: 'Compaction unavailable · no compaction service in this leaf' },
@@ -1014,6 +694,19 @@ const dict = {
1014
694
  'permission-preset-workspace-write-desc': { zh: '工作区内读写;写入需先读该文件', en: 'Read/write inside the workspace; writes need a prior read' },
1015
695
  'permission-preset-full-access': { zh: '完全访问', en: 'Full access' },
1016
696
  'permission-preset-full-access-desc': { zh: '不受限读写,无需审批', en: 'Unrestricted access, no approvals' },
697
+ 'permission-preset-auto': { zh: '自动授权审查', en: 'Auto review' },
698
+ 'permission-preset-auto-desc': { zh: '模型在每次工具调用前审查授权;无文件沙箱,仅当前会话', en: 'The model reviews every tool call before it runs; no file sandbox, this session only' },
699
+ 'permission-preset-exp-tag': { zh: 'EXP', en: 'EXP' },
700
+ 'permission-auto-confirm-title': { zh: '启用自动授权审查(实验性)?', en: 'Enable Auto review (experimental)?' },
701
+ 'permission-auto-confirm-session': { zh: '仅对当前会话生效,不会成为新会话的默认', en: 'Applies to this session only; never becomes the default for new sessions' },
702
+ 'permission-auto-confirm-sandbox': { zh: '无文件沙箱:放行的调用拥有完全访问权限', en: 'No file sandbox: allowed calls run with full access' },
703
+ 'permission-auto-confirm-cost': { zh: '每次工具调用都会额外发起一次模型审查请求', en: 'Every tool call costs one extra model review request' },
704
+ 'permission-auto-confirm-risk': { zh: '审查放行的调用(含你已明确授权的中风险操作)直接执行;被拒的调用(含高风险)转为审批由你决定,子代理中直接拒绝;审查失败即不执行', en: 'Calls the review allows (including medium-risk ones you explicitly authorized) run without asking; denied calls, high-risk included, come to you as an approval, or are denied outright in subagents; a failed review never runs' },
705
+ 'permission-auto-confirm-actions': { zh: '**Enter** 启用 · Esc 返回', en: '**Enter** to enable · Esc to go back' },
706
+ 'permission-auto-confirm-enable': { zh: '启用', en: 'Enable' },
707
+ 'permission-auto-confirm-back': { zh: '返回', en: 'Go back' },
708
+ 'permission-auto-unavailable': { zh: '自动授权审查已不可用', en: 'Auto review is no longer available' },
709
+ 'tool-error-auto-review-denied': { zh: '自动授权审查拒绝,未执行', en: 'Auto review denied; not executed' },
1017
710
  'plan-picker-title': { zh: '计划模式', en: 'Plan mode' },
1018
711
  'plan-mode-on': { zh: '开启', en: 'On' },
1019
712
  'plan-mode-on-desc': { zh: '进入计划模式:只读,先规划后动手', en: 'Enter plan mode: read-only, plan before acting' },
@@ -1058,20 +751,30 @@ const dict = {
1058
751
  'theme-switch-failed': { zh: '主题「{{name}}」切换失败(无法写入 ~/.dsh-tui/theme.json)', en: 'Theme "{{name}}" switch failed (cannot write ~/.dsh-tui/theme.json)' },
1059
752
  'btw-usage': { zh: '用法:/btw <问题> —— 不打断当前对话的快速侧问', en: 'Usage: /btw <question> — quick side question without interrupting the conversation' },
1060
753
  'panel-title-btw': { zh: '侧问', en: 'btw' },
1061
- 'btw-thread-empty': { zh: '还没有侧问。输入 /btw <问题>,或在下方直接追问。', en: 'No side questions yet. Type /btw <question>, or ask a follow-up below.' },
754
+ 'btw-thread-empty': { zh: '还没有侧问。输入 /btw <问题>,或点击下方输入框开始提问。', en: 'No side questions yet. Type /btw <question>, or click the input below to ask.' },
1062
755
  'btw-thread-new': { zh: '新话题', en: 'New topic' },
1063
756
  'btw-thread-clear': { zh: '已开始新话题:上下文与未读已清空', en: 'New topic started: context and unread cleared' },
1064
757
  'btw-thread-context-recent': { zh: '后续答案参考最近 {{n}} 组问答', en: 'Answers use the last {{n}} Q/A pairs as context' },
1065
758
  'btw-thread-context-omitted': { zh: '已省略更早 {{n}} 组问答', en: '{{n}} earlier Q/A pair(s) omitted' },
1066
759
  'btw-thread-followup': { zh: '输入追问…(Enter 发送 · Esc 回到对话 · Tab 切列表)', en: 'Type a follow-up… (Enter send · Esc back to chat · Tab list)' },
760
+ 'btw-input-placeholder': { zh: 'Enter 提问', en: 'Enter to ask' },
761
+ 'btw-input-hint-edit': { zh: 'Enter 发送 · Esc', en: 'Enter send · Esc' },
762
+ // 底栏(宿主拼的那行)里 btw 的面板段:列表层说选择与 s/c(已附加时同一个键是
763
+ // 撤回),编辑层只说「↑ 选择」——框内不再放键位提示,那里只剩一句占位。
764
+ 'btw-list-hint': { zh: '↑/↓ 选择 · s 送聊天 · c 复制', en: '↑/↓ select · s to chat · c copy' },
765
+ 'btw-list-hint-attached': { zh: '↑/↓ 选择 · s 撤回 · c 复制', en: '↑/↓ select · s unsend · c copy' },
766
+ // 编辑层:↑ 离开输入框、把光标放到列表上开始选择。用全局最主流的「选择」而不是
767
+ // 自造词(「回标题」没人看得懂);列表层那条紧接着告诉你在列表里能做什么。
768
+ 'btw-hint-edit-back': { zh: '↑ 选择', en: '↑ select' },
769
+ 'btw-empty-lines': { zh: '旁路问答不打断主线:答案只留在这里,不进主聊天与会话记录。', en: 'Side questions never derail the main line: answers stay here, out of the main chat and session log.' },
1067
770
  'btw-thread-busy': { zh: '上一个侧问还在回答,等它结束再追问', en: 'Still answering the last side question; ask again once it finishes' },
1068
771
  'btw-thread-error': { zh: '本轮失败', en: 'This turn failed' },
1069
772
  'btw-thread-cancelled': { zh: '已取消本轮侧问', en: 'Side question cancelled' },
1070
773
  'btw-thread-unread': { zh: '有新回答', en: 'New answer' },
1071
- 'btw-thread-send-to-chat': { zh: '发送到聊天', en: 'Send to chat' },
1072
774
  'btw-thread-answer-attached': { zh: '答案已附加到下一次主聊天提交', en: 'Answer attached to your next main chat submission' },
1073
775
  'btw-thread-answer-truncated': { zh: '答案过长,附加时已截断', en: 'Answer exceeded the attach limit and was truncated' },
1074
- 'btw-fullscreen-title': { zh: 'btw 侧问线程', en: 'btw side thread' },
776
+ 'btw-fullscreen-title': { zh: '侧问线程', en: 'Side thread' },
777
+ 'btw-scene-hints': { zh: 'Enter 追问 · ↑/↓ 选择 · n 新话题 · s 送聊天 · c 复制 · Esc 返回', en: 'Enter ask · ↑/↓ select · n new · s to chat · c copy · Esc back' },
1075
778
  'btw-panel-unavailable': { zh: 'btw 面板未启用(/settings → dsh-tui.sidePanel.panels)', en: 'btw panel not enabled (/settings → dsh-tui.sidePanel.panels)' },
1076
779
  'btw-output-unavailable': { zh: '没有收到回答', en: 'No answer received' },
1077
780
  'btw-answering': { zh: '思考中…', en: 'Answering…' },
@@ -1175,7 +878,6 @@ const dict = {
1175
878
  'effort-preference-downgraded': { zh: '偏好推理强度 {{preferred}} 不被当前模型支持,已就近降档至 {{applied}}', en: 'Preferred reasoning effort {{preferred}} is unavailable on this model; fell back to the nearest lower tier {{applied}}' },
1176
879
  'effort-preference-unsupported': { zh: '偏好推理强度 {{preferred}} 不被当前模型支持,且无更低可用档,保持模型默认', en: 'Preferred reasoning effort {{preferred}} is unavailable on this model with no lower tier; keeping the model default' },
1177
880
  'effort-switched': { zh: '推理强度 → {{name}}', en: 'Reasoning effort → {{name}}' },
1178
- 'effort-invalid': { zh: '未知推理等级 {{id}}(当前模型可选:{{ids}})', en: 'Unknown reasoning effort {{id}} (this model offers: {{ids}})' },
1179
881
  'effort-current': { zh: '当前推理强度 {{name}}', en: 'Current reasoning effort {{name}}' },
1180
882
  'effort-usage': { zh: '用法:/effort(滑杆)| /effort <id> | /effort status', en: 'Usage: /effort (slider) | /effort <id> | /effort status' },
1181
883
  'effort-fallback-tier-note': { zh: '该模型没有声明推理档位,这里列出的是通用档位', en: 'This model declares no effort levels; these are the standard ones' },
@@ -1191,6 +893,8 @@ const dict = {
1191
893
  'mode-permission-unconfirmed': { zh: '权限切换未被 DSH 确认,模式未改变', en: 'The permission switch was not confirmed by DSH; the mode is unchanged' },
1192
894
  'mode-permission-no-canonical': { zh: '模式「{{name}}」的 sandbox/approval 组合没有对应权限预设,无法安全切换', en: 'Mode "{{name}}" has no matching permission preset for its sandbox/approval combo; cannot switch safely' },
1193
895
  'cmd-desc-permission': { zh: '切换权限预设(沙箱模式 + 审批策略)', en: 'Switch the permission preset (sandbox mode + approval policy)' },
896
+ // ── channel/upstream-retry.ts — 上游断链自动重试 ──────────────────────
897
+ 'upstream-retry-enabled': { zh: '已为当前渠道 {{routes}} 启用上游断链自动重试(最多重试 5 次;cordis.yml upstreamRetry: false 可关闭)', en: 'Upstream auto-retry enabled for {{routes}} (the route in use) — up to 5 retries per request (opt out with upstreamRetry: false in cordis.yml)' },
1194
898
  // ── components/LogoV2.tsx ───────────────────────────────────────────
1195
899
  'logo-tagline': { zh: '探索未至之境!', en: 'Explore the uncharted!' },
1196
900
  // Star easter egg (bottom welcome line on ~1/20 of mounts, see
@@ -1324,15 +1028,19 @@ const dict = {
1324
1028
  // 代码里以字面量出现,无需登记 DYNAMIC_PREFIXES)。bash / powershell 是
1325
1029
  // 产品名,zh 不译;未登记的 id(插件、上游新增)回退首字母大写——那是
1326
1030
  // 名字不是文案,没有可翻译的内容。
1327
- 'tool-name-bash': { zh: 'Bash', en: 'Bash' },
1328
1031
  'tool-name-powershell': { zh: 'PowerShell', en: 'PowerShell' },
1329
1032
  'tool-name-read': { zh: '读取', en: 'Read' },
1330
1033
  'tool-name-glob': { zh: '文件搜索', en: 'Glob' },
1331
1034
  'tool-name-grep': { zh: '内容搜索', en: 'Grep' },
1332
1035
  'tool-name-write': { zh: '写入', en: 'Write' },
1333
- 'tool-name-edit': { zh: '编辑', en: 'Edit' },
1334
1036
  'tool-name-todo_write': { zh: '待办清单', en: 'TodoWrite' },
1335
1037
  'tool-name-subagent': { zh: '子代理', en: 'Task' },
1038
+ // Agent Teams tools (dsh-adapter/team-tools.ts supplies these as displayKey).
1039
+ 'tool-name-team-message': { zh: '团队消息', en: 'Message' },
1040
+ 'tool-name-team-roster': { zh: '团队成员', en: 'Team' },
1041
+ 'tool-name-team-wait': { zh: '等待团队', en: 'Wait' },
1042
+ 'tool-name-team-interrupt': { zh: '中断成员', en: 'Interrupt' },
1043
+ 'tool-name-team-task': { zh: '任务板', en: 'Tasks' },
1336
1044
  'tool-name-web_search': { zh: '联网搜索', en: 'WebSearch' },
1337
1045
  'tool-name-multiedit': { zh: '多处编辑', en: 'MultiEdit' },
1338
1046
  'tool-name-notebookedit': { zh: '笔记本编辑', en: 'NotebookEdit' },
@@ -1377,6 +1085,8 @@ const dict = {
1377
1085
  'sugg-more-below': { zh: '↓{{n}}', en: '↓{{n}}' },
1378
1086
  // 二级补全子项描述(/lang /theme /effort /preset /activity 的 children)
1379
1087
  'sugg-status-desc': { zh: '显示当前选择', en: 'Show the current choice' },
1088
+ 'sugg-team-on-desc': { zh: '开启 Agent Teams(启用团队 bundle)', en: 'Switch Agent Teams on (enable the team bundle)' },
1089
+ 'sugg-team-off-desc': { zh: '关闭 Agent Teams(停用团队 bundle)', en: 'Switch Agent Teams off (disable the team bundle)' },
1380
1090
  'sugg-lang-zh-desc': { zh: '切换界面语言到中文', en: 'Switch the UI language to Chinese' },
1381
1091
  'sugg-lang-en-desc': { zh: '切换界面语言到英文', en: 'Switch the UI language to English' },
1382
1092
  'sugg-theme-auto-desc': { zh: '跟随终端背景自动切换', en: 'Follow the terminal background' },
@@ -1395,6 +1105,7 @@ const dict = {
1395
1105
  'sugg-color-name-desc': { zh: '会话强调色', en: 'Session accent color' },
1396
1106
  // ── dsh-adapter/plugin.ts(/settings 渲染设置)───────────────────────
1397
1107
  'settings-fullscreen-restart': { zh: '全屏设置已保存,重启 dsh-tui 后生效', en: 'Fullscreen preference saved — restart dsh-tui to apply' },
1108
+ 'settings-launchpad-restart': { zh: '启动页设置已保存,重启 dsh-tui 后生效', en: 'Launchpad preference saved — restart dsh-tui to apply' },
1398
1109
  'settings-terminal-images-restart': { zh: '图片预览设置已保存,使用 /restart 重启 TUI 后生效', en: 'Image preview preference saved — use /restart to apply' },
1399
1110
  'settings-fullscreen-migrated': { zh: '全屏已是出厂默认(已清除更新前的 inline 选择);偏好 inline 可在 /settings 改回', en: 'Fullscreen is now the factory default (pre-update inline choice cleared); prefer inline? Switch back in /settings' },
1400
1111
  // ── components/HelpMenu.tsx ─────────────────────────────────────────
@@ -1468,6 +1179,8 @@ const dict = {
1468
1179
  'settings-group-empty': { zh: '此分组没有可配置字段', en: 'No configurable fields in this group' },
1469
1180
  'settings-section-unavailable': { zh: '命名空间未注册', en: 'namespace not served' },
1470
1181
  'settings-badge-restart': { zh: '重启生效', en: 'applies on restart' },
1182
+ 'settings-badge-unreadable': { zh: '设置文件无法读取——已回退默认;保存前会先备份原文件', en: 'settings file unreadable — defaults shown; saving backs up the original first' },
1183
+ 'settings-badge-recovered': { zh: '损坏的设置文件已备份到 {{backup}}', en: 'the broken settings file was backed up to {{backup}}' },
1471
1184
  'settings-badge-dirty': { zh: '未保存', en: 'unsaved' },
1472
1185
  'settings-badge-saving': { zh: '保存中', en: 'saving' },
1473
1186
  'settings-badge-failed': { zh: '保存失败', en: 'save failed' },
@@ -1480,6 +1193,7 @@ const dict = {
1480
1193
  'settings-saved': { zh: '已保存 {{ns}}', en: 'Saved {{ns}}' },
1481
1194
  'settings-save-failed': { zh: '保存 {{ns}} 失败——请重试', en: 'Saving {{ns}} failed — please retry' },
1482
1195
  'settings-secret-ref-reserved': { zh: '凭据 {{ref}} 由宿主保留,写入被拒绝:第三方设置区块不能覆盖宿主共享凭据', en: 'Credential {{ref}} is reserved by the host; write rejected: third-party settings sections cannot overwrite host-shared credentials' },
1196
+ 'settings-web-key-changed': { zh: '网页搜索设置已变化,请重新打开设置后输入密钥', en: 'Web search settings changed. Reopen settings and enter the key again.' },
1483
1197
  // /settings 里 sidePanel.panels 的勾选列表。
1484
1198
  'settings-panels-unclaimed': { zh: '暂无面板使用此 id:先保留,等插件注册后生效', en: 'No panel uses this id yet; kept until a plugin registers it' },
1485
1199
  'settings-panels-plugin': { zh: '插件面板({{plugin}})', en: 'Plugin panel ({{plugin}})' },
@@ -1543,9 +1257,17 @@ const dict = {
1543
1257
  // ── components/ModelPicker.tsx / ThemePicker.tsx / ActivityPicker.tsx / EffortSlider.tsx ──
1544
1258
  'picker-title-model': { zh: '模型', en: 'Model' },
1545
1259
  'picker-group-recent': { zh: '最近使用', en: 'Recently used' },
1546
- 'picker-group-count': { zh: '{{count}} 个模型', en: '{{count}} models' },
1547
- 'hint-model-groups': { zh: '**Enter** 查看模型 · Esc 退出', en: '**Enter** to view models · Esc to exit' },
1548
- 'hint-model-back': { zh: '**Enter** 切换模型 · Esc/⌫ 返回上级', en: '**Enter** to switch · Esc/⌫ to go back' },
1260
+ 'hint-model-provider': { zh: '**Tab** / **Shift+Tab** 提供商', en: '**Tab** / **Shift+Tab** providers' },
1261
+ 'hint-model-navigation': { zh: '**↑/↓** 模型', en: '**↑/↓** model' },
1262
+ 'hint-model-effort': { zh: '**←/→** 调整', en: '**←/→** adjust' },
1263
+ 'hint-model-select': { zh: '**Enter** 选择', en: '**Enter** select' },
1264
+ 'hint-model-cancel': { zh: '**Esc** 取消', en: '**Esc** cancel' },
1265
+ 'picker-recents-empty': { zh: '暂无最近使用的模型,按 Tab 查看提供商', en: 'No recent models; press Tab to browse providers' },
1266
+ 'picker-models-empty': { zh: '暂无可用模型', en: 'No models available' },
1267
+ 'picker-effort-loading': { zh: '正在加载…', en: 'Loading…' },
1268
+ 'picker-effort-error': { zh: '读取失败', en: 'Failed to load' },
1269
+ 'picker-effort-unavailable': { zh: '不支持', en: 'Unavailable' },
1270
+ 'picker-effort-default': { zh: '默认', en: 'Default' },
1549
1271
  'picker-title-skills': { zh: '技能', en: 'Skills' },
1550
1272
  'skills-loading': { zh: '正在加载技能', en: 'Loading skills' },
1551
1273
  'skills-loading-subtitle': { zh: '正在查询技能注册表…', en: 'Querying the skill registry…' },
@@ -1564,7 +1286,7 @@ const dict = {
1564
1286
  'picker-title-color': { zh: '会话强调色', en: 'Session accent color' },
1565
1287
  'picker-title-effort': { zh: '推理强度', en: 'Reasoning effort' },
1566
1288
  'model-loading': { zh: '正在加载模型', en: 'Loading models' },
1567
- 'model-loading-subtitle': { zh: '正在查询 provider…', en: 'Querying the provider…' },
1289
+ 'model-load-failed': { zh: '模型列表加载失败', en: 'Failed to load the model list' },
1568
1290
  'model-switching': { zh: '正在切换模型到 {{name}}…', en: 'Switching model to {{name}}…' },
1569
1291
  'model-switched': { zh: '模型已切换为 {{name}}', en: 'Model switched to {{name}}' },
1570
1292
  // ── components/RewindPicker.tsx ─────────────────────────────────────
@@ -1583,14 +1305,13 @@ const dict = {
1583
1305
  'ext-action-handled': { zh: '输入已由插件处理', en: 'Input handled by a plugin' },
1584
1306
  'ext-decision-pending': { zh: '正在等待插件决定({{event}})…', en: 'Waiting for a plugin decision ({{event}})…' },
1585
1307
  'ext-stale-dropped': { zh: '等待插件期间会话已切换,该条输入已丢弃', en: 'Session switched while a plugin decided — the input was dropped' },
1586
- 'ext-compact-stale': { zh: '等待插件期间会话已切换,压缩已取消', en: 'Session switched while a plugin decided — compaction abandoned' },
1587
1308
  'ext-shortcut-failed': { zh: '插件快捷键 {{combo}} 执行失败', en: 'Plugin shortcut {{combo}} failed' },
1588
1309
  'command-invoke-denied': { zh: '命令调用已被授权文件拒绝(commands.invoke 已撤销)', en: 'Command invocation denied by the grants file (commands.invoke revoked)' },
1589
1310
  'command-invoke-denied-owner': {
1590
1311
  zh: '命令 "/{{name}}" 的调用已被拒绝——注册它的插件 "{{owner}}" 已被撤销 commands.invoke',
1591
1312
  en: 'Command "/{{name}}" invocation denied — its owner plugin "{{owner}}" lost commands.invoke',
1592
1313
  },
1593
- // /plugins 诊断面(C-070 信任披露 + 协商诊断)
1314
+ // /plugin 诊断面(C-070 信任披露 + 协商诊断)
1594
1315
  'plugins-trust-banner': {
1595
1316
  zh: '插件与宿主同进程运行:授权是行为约束而非安全隔离;通过校验 ≠ 插件安全(C-070)。',
1596
1317
  en: 'Plugins run in-process with the host: grants are behavioral constraints, not a security boundary; passing validation ≠ a safe plugin (C-070).',
@@ -1603,8 +1324,8 @@ const dict = {
1603
1324
  'plugins-footprint-overflow': { zh: '…另有 {{count}} 个插件未显示', en: { one: '…{{count}} more plugin not shown', other: '…{{count}} more plugins not shown' } },
1604
1325
  'plugins-ledger-empty': { zh: '效果台账为空。', en: 'The effect ledger is empty.' },
1605
1326
  'plugins-ledger-header': { zh: '效果台账({{file}})尾 5 条:', en: 'Effect ledger ({{file}}), last 5 records:' },
1606
- 'plugins-unknown-subcommand': { zh: '未知子命令:{{sub}}(支持:check <路径>)', en: 'Unknown subcommand: {{sub}} (supported: check <path>)' },
1607
- 'plugins-check-usage': { zh: '用法:/plugins check <dsh-plugin.json 路径>', en: 'Usage: /plugins check <path-to-dsh-plugin.json>' },
1327
+ 'plugins-unknown-subcommand': { zh: '未知子命令:{{sub}}(支持:list / install <spec> / remove <bundle> / disable <名称|id> / enable <名称|id> / check <路径> / info <spec> / registries)', en: 'Unknown subcommand: {{sub}} (supported: list / install <spec> / remove <bundle> / disable <name|id> / enable <name|id> / check <path> / info <spec> / registries)' },
1328
+ 'plugins-check-usage': { zh: '用法:/plugin check <dsh-plugin.json 路径>', en: 'Usage: /plugin check <path-to-dsh-plugin.json>' },
1608
1329
  'plugins-check-not-found': { zh: '文件不存在:{{path}}', en: 'File not found: {{path}}' },
1609
1330
  'plugins-check-invalid-json': { zh: '不是可解析的 JSON:{{err}}', en: 'Not parseable JSON: {{err}}' },
1610
1331
  'plugins-check-spec-unavailable': { zh: 'vendored 规范数据不可用(tui-profile/),无法校验。', en: 'Vendored spec data unavailable (tui-profile/); cannot validate.' },
@@ -1621,6 +1342,251 @@ const dict = {
1621
1342
  },
1622
1343
  'plugins-check-dropped': { zh: '(宿主描述符已剔除漂移契约:{{dropped}})', en: '(host descriptor dropped drifted contracts: {{dropped}})' },
1623
1344
  'plugins-check-host-unavailable': { zh: '当前没有 live Host Descriptor;只做静态 manifest 校验,不进行协议支持声明/协商。', en: 'No live Host Descriptor is available; only static manifest validation was performed, no protocol support declaration/negotiation.' },
1345
+ // profile 插件服务(ctx.pluginManager):bundle/行列表与门禁 1 的标签
1346
+ 'plugins-service-unavailable': {
1347
+ zh: '当前内核没有 profile 插件服务(ctx.pluginManager):bundle / 行列表与生命周期动作都不可用。',
1348
+ en: 'This kernel provides no profile plugin service (ctx.pluginManager): the bundle/row list and the lifecycle actions are unavailable.',
1349
+ },
1350
+ // 第二行单独一条:转录里的报告行只留 preview 那么宽,把出口挤在第一行末尾等于看不见。
1351
+ // 也不承诺 CLI 没有的动词——enable / disable 是服务写 profile 自己的文件(决策 C)。
1352
+ 'plugins-service-unavailable-route': {
1353
+ zh: '装 / 卸走命令行:`dsh plugin --profile dsh-tui add|remove …`;启用 / 关闭没有命令行动词,请以 `dsh --profile dsh-tui` 启动本应用后在 /plugin 里操作。',
1354
+ en: 'Install and remove go through the CLI: `dsh plugin --profile dsh-tui add|remove …`. Enable and disable have no CLI verb — start this app with `dsh --profile dsh-tui` and use /plugin.',
1355
+ },
1356
+ 'plugins-service-error': {
1357
+ zh: '插件服务调用失败:{{err}}(上面的诊断部分照常显示。重试一次;仍失败请用 `dsh plugin --profile dsh-tui` 查看 CLI 侧的报错。)',
1358
+ en: 'The plugin service call failed: {{err}} (the diagnostics above are unaffected. Retry once; if it keeps failing, read the CLI-side error with `dsh plugin --profile dsh-tui`.)',
1359
+ },
1360
+ 'plugins-list-header': { zh: '你装的额外插件({{count}}):', en: 'Plugins you added ({{count}}):' },
1361
+ 'plugins-list-empty': {
1362
+ zh: '本 profile 没有额外插件:只有安装自带与 dsh-tui 自身。装好后用 /plugin list 复查。',
1363
+ en: 'No extra plugins in this profile: only the installation-supplied bundles and dsh-tui itself. Run /plugin list again after installing one.',
1364
+ },
1365
+ 'plugins-list-hint': {
1366
+ zh: '详情:/plugin info <名字>;卸载:/plugin remove <名字>;启用 / 关闭:/plugin enable|disable <名字|行 id>;安装源:/plugin registries;完整诊断:无参 /plugin。',
1367
+ en: 'Details: /plugin info <name>; remove: /plugin remove <name>; enable or disable: /plugin enable|disable <name|row id>; registries: /plugin registries; full diagnostics: bare /plugin.',
1368
+ },
1369
+ 'plugins-bundles-header': { zh: '已装 bundle(数据来自 profile 插件服务):', en: 'Installed bundles (from the profile plugin service):' },
1370
+ 'plugins-bundles-official': { zh: '安装自带', en: 'Official (installation-supplied)' },
1371
+ 'plugins-bundles-installed': { zh: 'profile 依赖', en: 'Profile dependencies' },
1372
+ 'plugins-bundles-empty': { zh: '(这个 profile 里还没有 bundle)', en: '(no bundles in this profile yet)' },
1373
+ 'plugins-bundle-on': { zh: '已启用', en: 'on' },
1374
+ 'plugins-bundle-off': { zh: '未启用', en: 'off' },
1375
+ 'plugins-bundle-kept': { zh: '不可卸载', en: 'not removable' },
1376
+ 'plugins-bundle-locked': { zh: '不可管理({{reason}})', en: 'locked ({{reason}})' },
1377
+ 'plugins-bundle-problem': { zh: '问题:{{code}}', en: 'problem: {{code}}' },
1378
+ 'plugins-bundle-rows': { zh: '行 {{rows}} / 覆盖 {{overrides}}', en: 'rows {{rows}} / overrides {{overrides}}' },
1379
+ 'plugins-rows-header': { zh: '没有 patch 行可管理的 loader 条目:', en: 'Loader entries no patch row can address:' },
1380
+ 'plugins-tag-undeclared': { zh: '未声明 TUI 贡献', en: 'no TUI contribution declared' },
1381
+ 'plugins-tag-undeclared-hint': {
1382
+ zh: '「未声明 TUI 贡献」= 该包没有包根 dsh-plugin.json(@dsh-std/manifest 0.15 形状):它不会作为后端或贡献出现,运行时既不拒绝也不报错。声明写法见 tui-profile/docs/plugin-admission-and-development.md。',
1383
+ en: '“no TUI contribution declared” = the package ships no package-root dsh-plugin.json (@dsh-std/manifest 0.15): it will not appear as a backend or contribution, and the runtime neither refuses it nor reports an error. See tui-profile/docs/plugin-admission-and-development.md for how to declare one.',
1384
+ },
1385
+ 'plugins-tag-invalid': { zh: '声明无法判定:{{err}}', en: 'declaration undecidable: {{err}}' },
1386
+ 'plugins-tag-declared': { zh: 'TUI 贡献:{{state}}', en: 'TUI contribution: {{state}}' },
1387
+ // /plugin info 与 /plugin registries
1388
+ 'plugins-info-usage': { zh: '用法:/plugin info <已装 bundle 名或待装 spec>', en: 'Usage: /plugin info <installed bundle name or install spec>' },
1389
+ 'plugins-info-bundle': { zh: '已装 bundle:{{name}}', en: 'Installed bundle: {{name}}' },
1390
+ 'plugins-info-rows-label': { zh: ' 行:', en: ' rows:' },
1391
+ 'plugins-info-overrides-label': { zh: ' 覆盖的行:{{list}}', en: ' overridden rows: {{list}}' },
1392
+ 'plugins-info-problem': { zh: ' 问题:{{code}}{{diagnostic}}', en: ' problem: {{code}}{{diagnostic}}' },
1393
+ 'plugins-info-inspect-refused': { zh: '不可安装:{{problem}} — {{reason}}', en: 'Not installable: {{problem}} — {{reason}}' },
1394
+ 'plugins-info-inspect-accepted': {
1395
+ zh: '可安装:{{name}} {{version}} · {{kind}} · bundle={{bundle}} · 来源 {{registry}}',
1396
+ en: 'Installable: {{name}} {{version}} · {{kind}} · bundle={{bundle}} · from {{registry}}',
1397
+ },
1398
+ 'plugins-info-inspect-description': { zh: ' {{description}}', en: ' {{description}}' },
1399
+ 'plugins-info-inspect-host': { zh: ' 来源主机:{{host}}', en: ' source host: {{host}}' },
1400
+ 'plugins-info-registries-header': { zh: '安装源(首用优先,逐级回退):', en: 'Registries (asked first, then in order):' },
1401
+ 'plugins-info-registries-first': { zh: ' 首选:{{registry}}', en: ' first: {{registry}}' },
1402
+ 'plugins-info-registries-fallbacks': { zh: ' 回退:{{list}}', en: ' fallbacks: {{list}}' },
1403
+ 'plugins-info-registries-resolved': { zh: ' pnpm 配置解析:{{registry}}', en: ' resolved from pnpm: {{registry}}' },
1404
+ 'plugins-info-registries-none': { zh: '(无)', en: '(none)' },
1405
+ // ── /plugin install(C-4 装链路:报告行由 dsh-adapter/plugin-install.ts 产出)──
1406
+ 'plugins-install-busy': {
1407
+ zh: '回合正在运行,先结束它(或 /new)再装插件:安装会改动 profile 并触发应用/热重载',
1408
+ en: 'A turn is running; finish it (or /new) before installing: an install changes the profile and applies or hot-reloads plugins',
1409
+ },
1410
+ 'plugins-install-inspect': { zh: '将要安装:{{spec}}({{kind}} · {{bundle}})', en: 'About to install: {{spec}} ({{kind}} · {{bundle}})' },
1411
+ 'plugins-install-trusted': {
1412
+ zh: '嫡系(feed 命中):{{name}}@{{version}} —— 跳过装包信任确认;仍记 effect ledger,仍在 /plugin 列表可见',
1413
+ en: 'First-party (feed hit): {{name}}@{{version}} — skipping the package trust confirmation; the effect ledger and the /plugin list are unaffected',
1414
+ },
1415
+ 'plugins-install-attempt': { zh: '正在询问第 {{index}}/{{total}} 个安装源:{{registry}}', en: 'Asking registry {{index}}/{{total}}: {{registry}}' },
1416
+ 'plugins-install-installing': { zh: '正在安装…', en: 'Installing…' },
1417
+ 'plugins-install-cancelling': { zh: '正在取消…', en: 'Cancelling…' },
1418
+ 'plugins-install-applying': { zh: '正在应用…', en: 'Applying…' },
1419
+ 'plugins-install-log-line-omitted': {
1420
+ zh: '已省略超长日志行(每行上限 {{bytes}} 字节)。',
1421
+ en: 'An oversized log line was omitted (limit: {{bytes}} bytes per line).',
1422
+ },
1423
+ 'plugins-install-build-blocked': {
1424
+ zh: '安装被构建脚本拦住:有 {{count}} 个脚本待批准(批准后才会重试安装)',
1425
+ en: 'Blocked by build scripts: {{count}} awaiting approval (the install retries only after approval)',
1426
+ },
1427
+ 'plugins-install-build-approved': {
1428
+ zh: '已批准 {{count}} 个构建脚本(写入 profile 的 allowBuilds),正在重试安装',
1429
+ en: 'Approved {{count}} build scripts (written to the profile allowBuilds); retrying the install',
1430
+ },
1431
+ 'plugins-install-incompatible': { zh: '版本不兼容:{{packages}}(当前 DSH {{runtime}})', en: 'Incompatible version: {{packages}} (running DSH {{runtime}})' },
1432
+ 'plugins-install-exempted': {
1433
+ zh: '已为 {{count}} 个包登记精确版本豁免(accept-risk)',
1434
+ en: 'Recorded an exact-version exemption for {{count}} package(s) (accept-risk)',
1435
+ },
1436
+ 'plugins-install-exemptions-unreadable': {
1437
+ zh: '读不到当前的版本豁免清单:{{reason}}(面板按"没有豁免"继续)',
1438
+ en: 'Could not read the current version exemptions: {{reason}} (the pane continues as if there were none)',
1439
+ },
1440
+ 'plugins-install-done': { zh: '已安装 {{bundle}}:{{state}}', en: 'Installed {{bundle}}: {{state}}' },
1441
+ 'plugins-install-state-applied': { zh: '已应用', en: 'applied' },
1442
+ 'plugins-install-state-restart': { zh: '需要重启', en: 'restart required' },
1443
+ 'plugins-install-state-overridden': { zh: '被覆盖(HMR 生效中)', en: 'overridden (HMR is live)' },
1444
+ 'plugins-install-restart-hint': { zh: '重启本应用后它才会作为后端 / 贡献生效。', en: 'Restart this app for it to take effect as a backend / contribution.' },
1445
+ 'plugins-install-failed': { zh: '安装失败:{{reason}}', en: 'Install failed: {{reason}}' },
1446
+ 'plugins-install-manual': { zh: '手工命令:dsh plugin --profile {{profile}} add {{spec}}', en: 'Manual command: dsh plugin --profile {{profile}} add {{spec}}' },
1447
+ 'plugins-install-rescue': { zh: '反复失败时用救援 profile:dsh-tui safe --rescue', en: 'If it keeps failing, use the rescue profile: dsh-tui safe --rescue' },
1448
+ 'plugins-install-cancelled': { zh: '已取消安装(profile 已回滚)', en: 'Install cancelled (the profile was rolled back)' },
1449
+ 'plugins-install-cancel-too-late': { zh: '已进入应用阶段,无法取消', en: 'Already applying; it cannot be cancelled' },
1450
+ 'plugins-install-cancel-not-running': { zh: '没有在跑的安装(可能已经结束)', en: 'No installation is running (it may have finished)' },
1451
+ 'plugins-install-cancel-failed': { zh: '取消失败:{{reason}}', en: 'Cancel failed: {{reason}}' },
1452
+ 'plugins-install-drift': {
1453
+ zh: '注意:profile 里的 {{name}} 现在是 {{found}},本进程运行的是 {{running}};对齐它:dsh plugin --profile {{profile}} add {{name}}@{{running}}',
1454
+ en: 'Heads up: {{name}} in the profile is now {{found}} while this process runs {{running}}; realign it: dsh plugin --profile {{profile}} add {{name}}@{{running}}',
1455
+ },
1456
+ 'plugins-install-usage': { zh: '用法:/plugin install <包名[@版本] | 路径 | git URL>', en: 'Usage: /plugin install <package[@version] | path | git url>' },
1457
+ // ── components/PluginInstallPane.tsx(装前提醒 / 信任确认 / 两个"再决定"步骤)──
1458
+ 'plugins-install-pane-title': { zh: '安装插件', en: 'Install plugin' },
1459
+ 'plugins-install-configure': { zh: '要安装:{{spec}} · {{kind}} · bundle={{bundle}}', en: 'To install: {{spec}} · {{kind}} · bundle={{bundle}}' },
1460
+ 'plugins-install-unidentified': { zh: '(服务未给出包名)', en: '(the service named no package)' },
1461
+ 'plugins-install-trust-third-party': {
1462
+ zh: '信任确认:插件与本应用同进程运行 —— 进程内全信任、无沙箱;装上后不会自动更新;它的行为受声明的 grants 约束(授权是行为约束,不是安全隔离)。',
1463
+ en: 'Trust: the plugin runs in-process with this app — full trust, no sandbox; it will not auto-update; its behaviour is bounded by the grants it declares (grants are behavioural constraints, not a security boundary).',
1464
+ },
1465
+ 'plugins-install-notice-declared': {
1466
+ zh: '声明可判定:该包的 dsh-plugin.json 已通过本 profile 的准入判定。',
1467
+ en: 'Declaration readable: the package-root dsh-plugin.json passes this profile’s admission.',
1468
+ },
1469
+ 'plugins-install-notice-undeclared': {
1470
+ zh: '提醒:该包没有声明 TUI 贡献(包根缺少 dsh-plugin.json);装上后不会作为后端/贡献出现,并会在 /plugin 列表里带常驻标签。',
1471
+ en: 'Heads up: this package declares no TUI contribution (no package-root dsh-plugin.json); it will not appear as a backend/contribution, and /plugin will tag it.',
1472
+ },
1473
+ 'plugins-install-notice-invalid': {
1474
+ zh: '提醒:该包的声明本 profile 无法通过({{err}});装上后不会作为后端/贡献出现。',
1475
+ en: 'Heads up: this profile cannot accept the package’s declaration ({{err}}); it will not appear as a backend/contribution.',
1476
+ },
1477
+ 'plugins-install-notice-unjudged': {
1478
+ zh: '提醒:注册表里的包在装上之前无法判定是否声明了 TUI 贡献;若未声明,它不会作为后端/贡献出现,并会在 /plugin 列表里带常驻标签。',
1479
+ en: 'Heads up: a registry package’s declaration cannot be read before it lands; if it declares none, it will not appear as a backend/contribution and /plugin will tag it.',
1480
+ },
1481
+ 'plugins-install-builds-title': { zh: '以下构建脚本需要批准(写进 profile 的 allowBuilds):', en: 'These build scripts need approval (written to the profile allowBuilds):' },
1482
+ 'plugins-install-incompatible-title': { zh: '版本不兼容的包:', en: 'Incompatible packages:' },
1483
+ 'plugins-install-exemptions-title': { zh: '已登记的精确版本豁免:', en: 'Exact-version exemptions recorded:' },
1484
+ 'plugins-install-key-confirm': { zh: '⏎ 安装 · esc 取消', en: '⏎ install · esc cancel' },
1485
+ 'plugins-install-key-builds': { zh: '⏎ 允许这些脚本并重试 · esc 取消', en: '⏎ allow these scripts and retry · esc cancel' },
1486
+ 'plugins-install-key-incompatible': { zh: '⏎ 接受风险并重试 · esc 取消', en: '⏎ accept the risk and retry · esc cancel' },
1487
+ 'plugins-install-key-cancel': { zh: 'esc 取消安装', en: 'esc cancel the install' },
1488
+ // ── dsh-adapter/plugin-manage.ts + components/PluginManagePane.tsx(C-5 生命周期动作) ──
1489
+ 'plugins-manage-busy': {
1490
+ zh: '有回合正在运行:先结束它或 /new,再执行这个动作(不改动 profile)。',
1491
+ en: 'A turn is running: finish it or /new before this action (the profile is left alone).',
1492
+ },
1493
+ 'plugins-manage-unknown': {
1494
+ zh: '找不到目标:{{target}}(可寻址的:{{names}})',
1495
+ en: 'No such target: {{target}} (addressable: {{names}})',
1496
+ },
1497
+ 'plugins-manage-ambiguous': {
1498
+ zh: '{{target}} 匹配多行,请改用具体行 id:{{ids}}(profile 没有改动)。',
1499
+ en: '{{target}} matches multiple rows. Use a specific row id: {{ids}} (the profile was not changed).',
1500
+ },
1501
+ 'plugins-manage-refused-service-locked': {
1502
+ zh: '拒绝:插件服务锁定了 {{target}}({{reason}})——两个方向都不是本应用能改的。',
1503
+ en: 'Refused: the plugin service has {{target}} locked ({{reason}}); neither direction is this app\'s to take.',
1504
+ },
1505
+ 'plugins-manage-refused-app-bundle': {
1506
+ zh: '拒绝:{{target}} 就是本应用自己(门禁 2)——关了它,界面当场消失。',
1507
+ en: 'Refused: {{target}} is this application itself (gate 2); switching it off takes the interface down with it.',
1508
+ },
1509
+ 'plugins-manage-refused-host-bundle': {
1510
+ zh: '拒绝:{{target}} 是本应用赖以运行的宿主层(门禁 2)——它提供本应用离不开的服务。',
1511
+ en: 'Refused: {{target}} is the host layer this application runs on (gate 2); it provides services the interface needs.',
1512
+ },
1513
+ 'plugins-manage-refused-not-removable': {
1514
+ zh: '拒绝:{{target}} 不是本 profile 装的(安装自带),不可卸载。',
1515
+ en: 'Refused: {{target}} was not installed by this profile (the dsh installation supplies it), so it cannot be removed.',
1516
+ },
1517
+ 'plugins-manage-refused-row-not-removable': {
1518
+ zh: '拒绝:{{target}} 是一行 patch,不能单独卸载——它随所属 bundle 走。',
1519
+ en: 'Refused: {{target}} is a patch row and cannot be removed on its own; it goes with its bundle.',
1520
+ },
1521
+ 'plugins-manage-refused-app-row': {
1522
+ zh: '拒绝:{{target}} 提供本应用的界面(门禁 2)——关掉它,界面当场消失。',
1523
+ en: 'Refused: {{target}} provides this application\'s interface (gate 2); switching it off takes the interface down with it.',
1524
+ },
1525
+ 'plugins-manage-unchanged': {
1526
+ zh: '{{target}} 已经是这个状态,profile 没有改动。',
1527
+ en: '{{target}} is already in that state; the profile was not changed.',
1528
+ },
1529
+ 'plugins-manage-removed': { zh: '已卸载 {{target}}:{{state}}', en: 'Removed {{target}}: {{state}}' },
1530
+ 'plugins-manage-enabled': { zh: '已启用 {{target}}:{{state}}', en: 'Enabled {{target}}: {{state}}' },
1531
+ 'plugins-manage-disabled': { zh: '已关闭 {{target}}:{{state}}', en: 'Disabled {{target}}: {{state}}' },
1532
+ 'plugins-manage-failed': { zh: '操作失败:{{reason}}', en: 'The action failed: {{reason}}' },
1533
+ 'plugins-manage-incompatible': {
1534
+ zh: '版本不兼容:{{packages}}——要强行启用,先接受风险:dsh plugin --profile {{profile}} allow-version <包@版本> <当前版本> --accept-risk',
1535
+ en: 'Incompatible version: {{packages}} — to force it, accept the risk first: dsh plugin --profile {{profile}} allow-version <package@version> <running version> --accept-risk',
1536
+ },
1537
+ 'plugins-manage-manual-remove': {
1538
+ zh: '手工命令:dsh plugin --profile {{profile}} remove {{target}}',
1539
+ en: 'Manual command: dsh plugin --profile {{profile}} remove {{target}}',
1540
+ },
1541
+ 'plugins-manage-manual-profile': {
1542
+ zh: '启用 / 关闭没有命令行动词(profile 的依赖与 cordis.patch.yml 是服务写自己的文件):请用 `dsh --profile {{profile}}` 启动本应用,在 /plugin 里操作;命令行只有 add / remove。',
1543
+ en: 'Enable and disable have no CLI verb (the profile\'s dependencies and cordis.patch.yml are files the service writes for itself): start this app with `dsh --profile {{profile}}` and use /plugin; the CLI has add and remove only.',
1544
+ },
1545
+ 'plugins-manage-residue': {
1546
+ zh: '用户数据仍在:{{paths}} —— 不再需要时可手动删除。',
1547
+ en: 'Your own data is still there: {{paths}} — delete it by hand when you no longer need it.',
1548
+ },
1549
+ 'plugins-manage-residue-footprint': {
1550
+ zh: '{{id}} 仍在授权文件 / 效果台账 / 存储目录里留有足迹',
1551
+ en: '{{id}} still has a footprint in the grants file, the effect ledger or the storage directory',
1552
+ },
1553
+ 'plugins-manage-residue-unjudged': {
1554
+ zh: '读不到 {{target}} 的包内声明,无法判断它是否留下了用户数据(不猜)。',
1555
+ en: 'The declaration inside {{target}} could not be read, so what data it left behind cannot be judged (nothing is guessed).',
1556
+ },
1557
+ 'plugins-manage-usage': { zh: '用法:/plugin {{sub}} <bundle 名 | 行 id>', en: 'Usage: /plugin {{sub}} <bundle name | row id>' },
1558
+ 'plugins-manage-pane-title': { zh: '插件生命周期', en: 'Plugin lifecycle' },
1559
+ 'plugins-manage-action-remove': { zh: '卸载', en: 'remove' },
1560
+ 'plugins-manage-action-enable': { zh: '启用', en: 'enable' },
1561
+ 'plugins-manage-action-disable': { zh: '关闭', en: 'disable' },
1562
+ 'plugins-manage-configure': { zh: '要{{action}}:{{target}}', en: 'About to {{action}}: {{target}}' },
1563
+ 'plugins-manage-working': { zh: '正在写入 profile…', en: 'Writing the profile…' },
1564
+ 'plugins-manage-remove-facts': {
1565
+ zh: '这是破坏性操作:它会改 profile 的 package.json 与 lockfile(服务失败时回滚),并移除它的 {{rows}} 行 / {{overrides}} 项覆盖;它留下的你自己的数据不会被删(有残留会另行提示)。',
1566
+ en: 'This is destructive: it changes the profile\'s package.json and lockfile (rolled back if the service fails) and drops its {{rows}} rows / {{overrides}} overrides. Your own data is not deleted (any residue is reported separately).',
1567
+ },
1568
+ 'plugins-manage-trust-facts': {
1569
+ zh: '无法验证已装代码的安装来源:启用后它就在本进程内运行、不自动更新、没有沙箱。它声明的权限见 /plugin 的授权矩阵。',
1570
+ en: 'The installed code\'s source cannot be verified: once enabled it runs inside this process, with no auto-update and no sandbox. Its declared permissions are in the /plugin grant matrix.',
1571
+ },
1572
+ 'plugins-manage-host-row-facts': {
1573
+ zh: '这一行属于宿主层(dsh-base):关掉它会卸载本应用注入的服务,本应用可能重启或退出。',
1574
+ en: 'This row belongs to the host layer (dsh-base): switching it off unloads services this application injects, and the app may restart or exit.',
1575
+ },
1576
+ 'plugins-manage-team-active-facts': {
1577
+ zh: '本会话有 {{members}} 个 teammate 正在运行或准备中。',
1578
+ en: '{{members}} teammate(s) in this session are running or being created.',
1579
+ },
1580
+ 'plugins-manage-team-unseen-facts': {
1581
+ zh: '团队里有 {{members}} 个 teammate 可能正在运行:从 teammate 会话里看不到它们的运行状态。',
1582
+ en: '{{members}} teammate(s) of this team may be running: their runs are not visible from a teammate session.',
1583
+ },
1584
+ 'plugins-manage-team-active-stop': {
1585
+ zh: '关闭团队会停止它们:团队服务卸载时释放仍在运行的 teammate。团队消息与任务板停止,团队记录留在会话里。',
1586
+ en: 'Switching the team off stops them: the team service releases the teammates still running as it unloads. Team messages and the task board stop; the team record stays in the session.',
1587
+ },
1588
+ 'plugins-manage-key-confirm': { zh: '⏎ 执行 · esc 关闭', en: '⏎ do it · esc close' },
1589
+ 'plugins-manage-key-busy': { zh: '写入中 · esc 只关面板,操作会继续(这三个动作没有取消面)', en: 'writing · esc only closes the pane, the action goes on (these three have no cancellation)' },
1624
1590
  'doctor-plugin-generation': { zh: '插件运行时 generation:{{id}}', en: 'Plugin runtime generation: {{id}}' },
1625
1591
  'doctor-plugin-registry': { zh: '插件规范注册表自检:{{state}}', en: 'Plugin-spec registry self-check: {{state}}' },
1626
1592
  'doctor-plugin-host-missing': { zh: 'plugin-host 行未挂载', en: 'plugin-host row not mounted' },
@@ -1647,7 +1613,6 @@ const dict = {
1647
1613
  'time-days-ago': { zh: '{{n}} 天前', en: '{{n}}d ago' },
1648
1614
  // ── screens/Chat.tsx(/ 转录搜索条)─────────────────────────────────
1649
1615
  'search-no-matches': { zh: '无匹配', en: 'no matches' },
1650
- 'rename-usage': { zh: '用法 /rename <新名称>', en: 'Usage /rename <new title>' },
1651
1616
  'rename-current': { zh: '当前名称 {{title}}', en: 'Current title {{title}}' },
1652
1617
  'rename-done': { zh: '已重命名为「{{title}}」', en: 'Renamed to "{{title}}"' },
1653
1618
  'compact-summary-folded': { zh: '摘要已折叠', en: 'Summary folded' },
@@ -1655,7 +1620,7 @@ const dict = {
1655
1620
  'new-messages': { zh: '↓ {{n}} 条新消息', en: '↓ {{n}} new messages' },
1656
1621
  'back-to-bottom': { zh: '↓ 回到底部(Enter/End)', en: '↓ back to bottom (Enter/End)' },
1657
1622
  // ── components/ThemePicker.tsx ──────────────────────────────────────
1658
- 'theme-builtin-base': { zh: '内置 · {{name}} 基底', en: 'Built-in · {{name}} base' },
1623
+ 'theme-builtin-base': { zh: '内置 · {{base}} 基底', en: 'Built-in · {{base}} base' },
1659
1624
  'theme-auto-base': { zh: '内置 · 跟随系统/终端背景自动选择 light/dark', en: 'Built-in · follows the system/terminal background (light/dark)' },
1660
1625
  'theme-user-base': { zh: '{{base}} 基底 · ~/.dsh-tui/themes/{{name}}.json', en: '{{base}} base · ~/.dsh-tui/themes/{{name}}.json' },
1661
1626
  'theme-plugin-base': { zh: '插件 · {{base}} 基底 · {{name}}', en: 'Plugin · {{base}} base · {{name}}' },
@@ -1759,6 +1724,55 @@ const dict = {
1759
1724
  'subagent-hint-back': { zh: '返回', en: 'back' },
1760
1725
  'subagent-hint-compose': { zh: '发消息', en: 'compose' },
1761
1726
  'subagent-empty-hint': { zh: '让主代理发起 Task 后,子代理会出现在这里', en: 'Subagents appear here once the main agent starts Task delegations' },
1727
+ // ── Agent Teams:代理面板的团队模式(components/SubagentDashboard.tsx)──
1728
+ 'team-dashboard-title': { zh: ' 代理团队 ', en: ' Agent Team ' },
1729
+ 'team-status-provisioning': { zh: '准备中', en: 'provisioning' },
1730
+ 'team-status-running': { zh: '运行中', en: 'running' },
1731
+ 'team-status-idle': { zh: '空闲', en: 'idle' },
1732
+ 'team-status-active': { zh: '活跃', en: 'active' },
1733
+ 'team-status-failed': { zh: '失败', en: 'failed' },
1734
+ 'team-members-title': { zh: '成员', en: 'Members' },
1735
+ 'team-lead-row': { zh: 'lead · 当前会话', en: 'lead · this session' },
1736
+ 'team-lead-row-peer': { zh: 'lead', en: 'lead' },
1737
+ 'team-self-mark': { zh: '当前会话', en: 'this session' },
1738
+ 'team-others-title': { zh: '其他子代理', en: 'Other subagents' },
1739
+ 'team-tasks-title': { zh: '任务板 · {{completed}}/{{total}}', en: 'Tasks · {{completed}}/{{total}}' },
1740
+ 'team-tasks-empty': { zh: '暂无任务', en: 'No tasks' },
1741
+ 'team-tasks-count': { zh: '任务 {{completed}}/{{total}}', en: 'tasks {{completed}}/{{total}}' },
1742
+ 'team-last-run-failed': { zh: '上一轮失败 {{error}}', en: 'last run failed {{error}}' },
1743
+ 'team-task-blocked': { zh: '阻塞', en: 'blocked' },
1744
+ 'team-failure': { zh: '团队记录被拒:{{failure}}', en: 'Team record rejected: {{failure}}' },
1745
+ // ── /team:团队模式开关(团队 bundle 的启停,见 docs/agent-teams-design.md「开关机制」)──
1746
+ 'team-cmd-unavailable': { zh: '当前内核没有 Agent Teams。', en: 'The current kernel has no Agent Teams.' },
1747
+ 'team-cmd-usage': { zh: '未知子命令「{{sub}}」。用法:/team [status] | on | off', en: 'Unknown subcommand "{{sub}}". Usage: /team [status] | on | off' },
1748
+ 'team-cmd-no-manager': {
1749
+ zh: '本次启动没有 profile 插件服务,无法在会话内切换。改用:dsh plugin --profile {{profile}} add {{bundle}}(关闭用 remove),然后重启。',
1750
+ en: 'This launch has no profile plugin service, so the team cannot be switched here. Use dsh plugin --profile {{profile}} add {{bundle}} (remove to switch off), then restart.',
1751
+ },
1752
+ 'team-cmd-bundle': { zh: '团队 bundle:{{state}}', en: 'Team bundle: {{state}}' },
1753
+ 'team-cmd-on': { zh: '已开启', en: 'on' },
1754
+ 'team-cmd-off': { zh: '已关闭', en: 'off' },
1755
+ 'team-cmd-already-on': { zh: '团队 bundle 已开启,无需改动。', en: 'The team bundle is already on; nothing to change.' },
1756
+ 'team-cmd-not-installed': {
1757
+ zh: '团队 bundle 未安装。在这里安装:/plugin install {{bundle}}(装完即开启);或在终端:dsh plugin --profile {{profile}} add {{bundle}}',
1758
+ en: 'The team bundle is not installed. Install it here with /plugin install {{bundle}} (it is switched on once installed), or in a terminal with dsh plugin --profile {{profile}} add {{bundle}}',
1759
+ },
1760
+ 'team-cmd-kernel-unsupported': {
1761
+ zh: '运行中的 DSH {{version}} 没有本应用能读取的团队 bundle:先把 DSH 换成 {{lines}} 之一,再安装同版本的团队 bundle。',
1762
+ en: 'The running DSH {{version}} has no team bundle this app can read: switch DSH to one of {{lines}} first, then install the team bundle of that same version.',
1763
+ },
1764
+ 'team-cmd-off-not-installed': { zh: '团队 bundle 未安装,团队本就是关闭的,无需改动。', en: 'The team bundle is not installed, so the team is already off; nothing to change.' },
1765
+ 'team-cmd-service': { zh: '团队服务:{{state}}', en: 'Team service: {{state}}' },
1766
+ 'team-cmd-running': { zh: '运行中', en: 'running' },
1767
+ 'team-cmd-stopped': { zh: '未运行', en: 'not running' },
1768
+ 'team-cmd-pending-on': { zh: 'profile 已开启团队,但服务没有运行:重启后生效,或服务激活失败(见日志)。', en: 'The profile has the team on but the service is not running: it applies after a restart, or the service failed to activate (see the log).' },
1769
+ 'team-cmd-pending-off': { zh: 'profile 已关闭团队,但服务仍在运行:重启后生效。', en: 'The profile has the team off but the service is still running: it applies after a restart.' },
1770
+ 'team-cmd-no-members': { zh: '本会话没有 teammate。', en: 'No teammates in this session.' },
1771
+ 'team-cmd-members': { zh: '本会话 teammate:{{total}} 个,其中 {{active}} 个运行中或准备中。', en: 'Teammates in this session: {{total}}, {{active}} running or provisioning.' },
1772
+ 'team-cmd-members-unseen': {
1773
+ zh: '本会话 teammate:{{total}} 个,其中 {{active}} 个运行中或准备中,{{unseen}} 个可能在运行(从 teammate 会话里看不到)。',
1774
+ en: 'Teammates in this session: {{total}}, {{active}} running or provisioning, {{unseen}} may be running (not visible from a teammate).',
1775
+ },
1762
1776
  // ── agent team:子代理转录视图、发消息输入框、消息流 ──
1763
1777
  'agent-view-title': { zh: '子代理转录', en: 'Agent transcript' },
1764
1778
  'agent-view-readonly': { zh: '只读', en: 'read-only' },
@@ -2129,9 +2143,13 @@ const dict = {
2129
2143
  'cmd-desc-migrate': { zh: '从其他编程代理导入对话(claude-code/codex/omp/zcode/grok-build)' },
2130
2144
  'cmd-desc-init': { zh: '在工作目录创建 AGENTS.md' },
2131
2145
  'cmd-desc-agents': { zh: '查看本会话的子代理' },
2146
+ 'cmd-desc-team': { zh: '团队模式:查看状态,或 on / off 开关(启停 Agent Teams bundle)' },
2132
2147
  'cmd-desc-jobs': { zh: '查看本会话的后台任务' },
2133
2148
  'cmd-desc-panel': { zh: '侧栏面板:开关 / 聚焦 / 缩放 / 切换', en: 'Side panel: toggle / focus / zoom / switch' },
2134
2149
  'cmd-desc-kernel': { zh: '选择内核(切换后重启进入)', en: 'Choose the kernel (restarts into it)' },
2150
+ 'cmd-desc-dsh': { zh: '切换到 DSH 内核(重启进入新会话)' },
2151
+ 'cmd-desc-codex': { zh: '切换到 Codex 内核(重启进入新会话)' },
2152
+ 'cmd-desc-claude': { zh: '切换到 Claude 内核(重启进入新会话)' },
2135
2153
  'cmd-desc-channel': { zh: '渠道档案:切换 / 导入 / 查看映射(Claude)', en: 'Channel profiles: switch / import / view mappings (Claude)' },
2136
2154
  // Side panel(侧栏)
2137
2155
  'panel-title-todo': { zh: '待办', en: 'Todo' },
@@ -2222,8 +2240,15 @@ const dict = {
2222
2240
  'companion-stat-sessions': { zh: '会话 ×{{n}}', en: 'sessions ×{{n}}' },
2223
2241
  'picker-title-panel': { zh: '打开面板', en: 'Open panel' },
2224
2242
  'panel-sent-to-chat': { zh: '已附加到输入框:{{title}}(Esc 可撤)', en: 'Attached to the composer: {{title}} (Esc to remove)' },
2243
+ // 面板把内容送进主输入框之后再撤回时的提示(btw 的 s 二次按下走这条)。
2244
+ 'panel-context-detached': { zh: '已从输入框撤回,不再附加到主聊天', en: 'Removed from the composer' },
2225
2245
  'companion-send-title': { zh: '伙伴状态', en: 'Companion status' },
2226
- 'panel-hint-focused': { zh: 'Esc 聊天 · ←/→ 切换 · z 缩放 · +/- 调宽', en: 'Esc chat · ←/→ panels · z zoom · +/- width' },
2246
+ // 底栏是拼出来的:导航(每个面板都有)→ 面板自己的能力键 → 列自身的缩放/调宽。
2247
+ // 拼序就是重要性:窄面板从尾部截断(truncate-end),面板键因此不会被列控制挤掉。
2248
+ 'panel-hint-focused': { zh: 'Esc 聊天 · ←/→ 切换', en: 'Esc chat · ←/→ panels' },
2249
+ // 声明 capabilities.sendToChat 的面板自己绑 s(btw/jobs 都是)。
2250
+ 'panel-hint-send-to-chat': { zh: 's 送聊天', en: 's to chat' },
2251
+ 'panel-hint-zoom-width': { zh: 'z 缩放 · +/- 调宽', en: 'z zoom · +/- width' },
2227
2252
  'panel-hint-unfocused': { zh: 'Ctrl+B 聚焦侧栏', en: 'Ctrl+B focus panel' },
2228
2253
  'panel-empty-none': { zh: '没有已启用的面板(/panel manage 管理)', en: 'No enabled panels (/panel manage)' },
2229
2254
  'panel-too-narrow': { zh: '宽度不足(需 ≥ {{min}} 列)', en: 'Too narrow (needs ≥ {{min}} cols)' },
@@ -2237,6 +2262,19 @@ const dict = {
2237
2262
  'sugg-panel-focus-desc': { zh: '聚焦侧栏面板', en: 'Focus the side panel' },
2238
2263
  'sugg-panel-zoom-desc': { zh: '缩放当前面板', en: 'Zoom the active panel' },
2239
2264
  'sugg-panel-id-desc': { zh: '打开该面板', en: 'Open this panel' },
2265
+ // /plugin 的子命令提示(补全树;动态实参见 plugin-completions.ts)
2266
+ 'sugg-plugin-list-desc': { zh: '列出你装的额外插件', en: 'List the plugins this profile added' },
2267
+ 'sugg-plugin-info-desc': { zh: '查单个条目或待装 spec', en: 'Describe an installed plugin or an install spec' },
2268
+ 'sugg-plugin-registries-desc': { zh: '查看安装源', en: 'Show where installations ask' },
2269
+ 'sugg-plugin-check-desc': { zh: '校验清单,不安装', en: 'Validate a manifest without installing it' },
2270
+ 'sugg-plugin-install-desc': { zh: '把这个插件装进当前 profile', en: 'Install a plugin bundle into this profile' },
2271
+ 'sugg-plugin-remove-desc': { zh: '把这个插件从 profile 卸载', en: 'Uninstall a plugin bundle from this profile' },
2272
+ 'sugg-plugin-enable-desc': { zh: '重新启用一个 bundle 或行', en: 'Switch a plugin bundle or row back on' },
2273
+ 'sugg-plugin-disable-desc': { zh: '关闭一个 bundle 或行', en: 'Switch a plugin bundle or row off' },
2274
+ // /plugin install | info 的参数位(示例 spec 的形状,不是可插入的候选)
2275
+ 'sugg-plugin-spec-path-desc': { zh: '示例:本地目录或仓库路径', en: 'Example: a local directory' },
2276
+ 'sugg-plugin-spec-git-desc': { zh: '示例:git 仓库 URL', en: 'Example: a git URL' },
2277
+ 'sugg-plugin-spec-package-desc': { zh: '示例:registry 包名(@版本 可钉死)', en: 'Example: a registry package, @version pins it' },
2240
2278
  'panel-unavailable-hint': { zh: '侧栏需要全屏且内容区 ≥93 列;该面板没有整屏形态', en: 'Sidebar needs fullscreen and ≥93 content columns; this panel has no fullscreen form' },
2241
2279
  // Model / display
2242
2280
  'cmd-desc-activity': { zh: '切换工作状态指示器预设' },
@@ -2255,7 +2293,7 @@ const dict = {
2255
2293
  'cmd-desc-hooks': { zh: '查看 hooks 状态' },
2256
2294
  'cmd-desc-mcp': { zh: '查看 MCP 状态' },
2257
2295
  'cmd-desc-skills': { zh: '列出所有可用技能' },
2258
- 'cmd-desc-plugins': { zh: '显示插件契约、授权与台账诊断' },
2296
+ 'cmd-desc-plugin': { zh: '插件诊断;`list` 列你装的额外插件,`info` 查单个条目或待装 spec' },
2259
2297
  'cmd-desc-update': { zh: '更新 dsh-tui 并重启' },
2260
2298
  // Misc
2261
2299
  'cmd-desc-vim': { zh: '切换 vim 模式' },
@@ -2363,12 +2401,14 @@ const dict = {
2363
2401
  'launchpad-action-update': { zh: '有新版本', en: 'Update available' },
2364
2402
  'launchpad-action-star': { zh: '投喂一颗 Star', en: 'Feed us a star' },
2365
2403
  // 内核选择器:行标签、不可选原因、切换重启提示。
2404
+ // 这三个 label 键只给**随包内置**的后端(manifest 的 `inTree: true` /
2405
+ // `label.kind: 'key'`)。插件后端的名字是外部字面量:原样渲染、不进本字典、
2406
+ // 不过 t()(P0 D2,见 components/KernelPicker.tsx)。
2366
2407
  'kernel-label-dsh': { zh: 'DeepSeek Harness', en: 'DeepSeek Harness' },
2367
2408
  'kernel-label-claude': { zh: 'Claude Agent', en: 'Claude Agent' },
2368
2409
  'kernel-label-codex': { zh: 'Codex', en: 'Codex' },
2369
- 'kernel-login-in-session': { zh: '未登录 · 启动后用 /login 登录', en: 'Not signed in · sign in with /login after start' },
2410
+ 'kernel-login-in-session': { zh: '未登录', en: 'Not signed in' },
2370
2411
  'kernel-unavailable-not-installed': { zh: '未安装', en: 'Not installed' },
2371
- 'kernel-unavailable-auth-missing': { zh: '未登录', en: 'Not signed in' },
2372
2412
  'kernel-unavailable-too-old': { zh: '版本过旧 · 需升级', en: 'Too old · upgrade needed' },
2373
2413
  'kernel-switch-restarting': { zh: '正在以 {{name}} 内核重启…', en: 'Restarting on the {{name}} kernel…' },
2374
2414
  // 切换内核时的过场行。failed/crashed 由旧进程报告新进程的结局;安全模式
@@ -2390,6 +2430,29 @@ const dict = {
2390
2430
  zh: '上次选择的 {{name}} 内核启动失败,已先以 DSH 内核启动:{{reason}}',
2391
2431
  en: 'The remembered {{name}} kernel failed to start; booted on DSH instead: {{reason}}',
2392
2432
  },
2433
+ // 启动恢复的失败面(roadmap §6 第 11 条,B-2a):恢复目标只归派生它的后端,落在
2434
+ // 别的后端上就明确报错 + 非零退出,不跨后端恢复、不冷启动、不新建会话。唯一例外
2435
+ // 是安全模式重试(RESUME_RETRY_ENV),它降级为告警并冷启动——那是用户最后的退路。
2436
+ // {{from}} 是后端 id(可直接喂给 --backend),{{kernel}} 是显示名,{{kernelId}} 是
2437
+ // 本次所选后端的 id(命令里只能用 id)。建议必须可执行(PR #1449 review R2):来源
2438
+ // 后端已不在注册表时,`--backend {{from}} --resume` 会再撞同一条拒绝,那一支因此走
2439
+ // resume-target-revoked-uninstalled,只给「装上再试」。
2440
+ 'resume-target-revoked': {
2441
+ zh: '无法恢复上次会话:它由「{{from}}」后端记录,而本次启动使用的是「{{kernel}}」后端。启动恢复只针对所选后端——要恢复「{{from}}」记下的那条:dsh-tui --backend {{from}} --resume;要恢复本次所选后端自己的上次会话:dsh-tui --backend {{kernelId}} --resume;也可以去掉 --resume 重新启动。',
2442
+ en: 'Cannot resume the last session: it was recorded by the "{{from}}" backend while this launch runs on "{{kernel}}". Startup recovery only ever targets the selected backend — to reopen the session "{{from}}" recorded: `dsh-tui --backend {{from}} --resume`; to reopen the last session of this launch\'s backend: `dsh-tui --backend {{kernelId}} --resume`; or drop --resume to start fresh.',
2443
+ },
2444
+ 'resume-target-revoked-uninstalled': {
2445
+ zh: '无法恢复上次会话:它由「{{from}}」后端记录,而该后端本次启动未安装(或已不在此 profile 的注册表里),本次启动使用的是「{{kernel}}」后端。恢复它要先装上该后端,再运行 dsh-tui --backend {{from}} --resume;或去掉 --resume 重新启动。',
2446
+ en: 'Cannot resume the last session: it was recorded by the "{{from}}" backend, which is not installed for this launch (or is no longer in this profile\'s registry), while this launch runs on "{{kernel}}". Resuming it needs that backend installed first, then `dsh-tui --backend {{from}} --resume`; or drop --resume to start fresh.',
2447
+ },
2448
+ 'resume-target-revoked-retry': {
2449
+ zh: '安全模式重试:忽略由「{{from}}」后端记录的上次会话(本次启动用的是「{{kernel}}」),按冷启动继续。',
2450
+ en: 'Safe-mode retry: ignoring the last session recorded by the "{{from}}" backend (this launch runs on "{{kernel}}") and continuing with a cold start.',
2451
+ },
2452
+ 'resume-backend-unavailable': {
2453
+ zh: '无法恢复会话:本次启动指定的后端「{{backend}}」不可用(未安装或 id 不合法;已注册:{{installed}}),而要恢复的会话「{{session}}」属于它。回落 DSH 只会把别的后端的会话 id 交给 dsh,因此本次启动失败——装上该后端后重试,或去掉 --resume 重新启动。',
2454
+ en: 'Cannot resume: the backend named for this launch, "{{backend}}", is unavailable (not installed, or not a valid id; registered: {{installed}}), and the session "{{session}}" belongs to it. Falling back to DSH would only hand another backend\'s session id to dsh, so this launch fails — install the backend and retry, or drop --resume to start fresh.',
2455
+ },
2393
2456
  'kernel-pinned-hint': {
2394
2457
  zh: '启动参数已指定内核:本次会按你的选择重启,下次直接启动仍按参数进入。',
2395
2458
  en: 'A startup flag pins the kernel: this restart follows your choice, a later direct launch follows the flag.',
@@ -2397,18 +2460,19 @@ const dict = {
2397
2460
  // SDK 安装向导(内核选择器「未安装」行 Enter 进入):确认、安装中、结果
2398
2461
  // 与手动兜底。{{dir}} 是 profile 目录,{{specifier}} 是锁定版本的完整包名。
2399
2462
  'kernel-not-installed-installable': { zh: '未安装 · 按 Enter 安装', en: 'Not installed · Enter to install' },
2400
- 'sdk-install-title': { zh: '安装 Claude 内核', en: 'Install the Claude kernel' },
2401
- 'sdk-install-confirm-what': { zh: '将安装 Claude Agent SDK {{version}}(内置 Claude Code CLI)', en: 'This installs Claude Agent SDK {{version}} (bundles the Claude Code CLI)' },
2463
+ 'sdk-install-title': { zh: '安装内核依赖', en: 'Install kernel dependencies' },
2464
+ 'sdk-install-confirm-what': { zh: '将安装 {{specifier}}(验证版本:{{version}})', en: 'This installs {{specifier}} (validated version: {{version}})' },
2402
2465
  'sdk-install-confirm-where': { zh: '安装位置:{{dir}}', en: 'Install location: {{dir}}' },
2403
2466
  'sdk-install-confirm-note': {
2404
- zh: '只装进 dsh-tui 自己的目录:版本经过验证、不随全局变化;PATH 上已有的 Claude Code 会优先使用,不受影响。需要网络与 pnpm。',
2405
- en: 'Installs only into the dsh-tui directory: the version is validated and never follows your global one; a Claude Code already on PATH is used first and is not touched. Needs network and pnpm.',
2467
+ zh: '只安装到当前 profile 目录。需要网络与 pnpm。',
2468
+ en: 'Installs only into the current profile directory. Needs network and pnpm.',
2406
2469
  },
2407
2470
  'sdk-install-confirm-hint': { zh: '**Enter** 安装 · Esc 返回', en: '**Enter** install · Esc back' },
2408
2471
  'sdk-install-checking': { zh: '正在检查 pnpm…', en: 'Checking pnpm…' },
2409
2472
  'sdk-install-running': { zh: '正在安装,可能需要一分钟…', en: 'Installing… this can take a minute' },
2410
2473
  'sdk-install-running-sub': { zh: 'Esc 取消', en: 'Esc to cancel' },
2411
- 'sdk-install-done': { zh: 'SDK 安装完成,Claude 内核已可用。', en: 'SDK installed — the Claude kernel is ready.' },
2474
+ 'sdk-install-done': { zh: '依赖安装完成,返回内核选择查看可用状态。', en: 'Dependencies installed. Return to the kernel picker to check availability.' },
2475
+ 'sdk-install-rebuilt': { zh: '检测到 pnpm store 漂移,已自动重建依赖后装好。', en: 'pnpm store drift detected — dependencies were rebuilt automatically.' },
2412
2476
  'sdk-install-done-hint': { zh: '**Enter** 返回内核选择 · Esc 关闭', en: '**Enter** back to the kernel picker · Esc close' },
2413
2477
  'sdk-install-failed': { zh: '安装失败(pnpm 退出码 {{code}})。可手动安装:', en: 'Install failed (pnpm exit code {{code}}). Manual install:' },
2414
2478
  'sdk-install-manual': { zh: '{{command}}', en: '{{command}}' },
@@ -2436,14 +2500,6 @@ const dict = {
2436
2500
  'channel-picker-hint': { zh: '↑↓ 移动 · Enter 切换/执行 · Esc 关闭', en: '↑↓ move · Enter switch/run · Esc close' },
2437
2501
  'channel-already-active': { zh: '已是当前渠道', en: 'Already the active channel' },
2438
2502
  'channel-switch-while-working': { zh: '回合运行中,无法切换或改动渠道', en: 'Cannot switch or change channels while a turn is running' },
2439
- 'channel-conn-settings-mismatch': {
2440
- zh: 'settings.json 的 ANTHROPIC_BASE_URL 与当前渠道 {{name}} 不一致;本会话按渠道配置连接(settings.json 不改,直接运行 claude 时仍按它)',
2441
- en: 'The ANTHROPIC_BASE_URL in settings.json differs from the active channel {{name}}; this session connects as the channel says (settings.json is left as is for running claude directly)',
2442
- },
2443
- 'channel-conn-creds-superseded': {
2444
- zh: '本会话使用渠道凭据,settings.json 里的 {{keys}} 本次不生效(settings.json 不改,直接运行 claude 时仍会用到)',
2445
- en: 'This session uses the channel credential; {{keys}} from settings.json do not apply (settings.json is left as is for running claude directly)',
2446
- },
2447
2503
  'channel-switched': { zh: '已切换到 {{name}},模型显示已刷新', en: 'Switched to {{name}}; the model display refreshed' },
2448
2504
  'channel-import-done': { zh: '已导入渠道 {{name}}(重复导入会刷新它)', en: 'Imported channel {{name}} (a re-import refreshes it)' },
2449
2505
  'channel-import-none': { zh: 'settings.json 里没有可导入的映射(ANTHROPIC_BASE_URL / ANTHROPIC_*_MODEL)', en: 'Nothing importable in settings.json (ANTHROPIC_BASE_URL / ANTHROPIC_*_MODEL)' },