@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
@@ -3,12 +3,16 @@
3
3
  * 滚动、composer 追问。Esc 返回侧栏,面板状态原样(mountPolicy=enabled
4
4
  * 不卸载,thread 与 draft 都在线程 store)。
5
5
  *
6
- * 键层级:composer 编辑(Esc 收起草稿)> 场景滚动/动作 > Esc 退出场景。
6
+ * 键层级:composer 编辑(Esc 收起草稿、↑ 上到标题)> 场景动作(↑/↓ 选轮、
7
+ * s 送聊天/撤回、c 复制)> Esc 退出场景。选中态与侧栏面板同源(线程 store),
8
+ * 两个形态的键位与落点逐条对齐。
7
9
  */
8
10
  import React from 'react';
9
11
  import type { ChannelUi } from '../../../adapter/channel/ui-policy.js';
10
- export declare function BtwThreadScene({ channel, onClose, }: {
12
+ export declare function BtwThreadScene({ channel, onClose, onFocusChat, }: {
11
13
  readonly channel: ChannelUi;
12
14
  readonly onClose: () => void;
15
+ /** 送聊天之后把焦点交回主输入框(宿主没接时只关场景)。 */
16
+ readonly onFocusChat?: (() => void) | undefined;
13
17
  }): React.ReactNode;
14
18
  //# sourceMappingURL=BtwThreadScene.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BtwThreadScene.d.ts","sourceRoot":"","sources":["../../../../../src/components/sidePanel/btw/BtwThreadScene.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAA;AAOtE,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,OAAO,GACR,EAAE;IACD,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAC7B,GAAG,KAAK,CAAC,SAAS,CAkHlB"}
1
+ {"version":3,"file":"BtwThreadScene.d.ts","sourceRoot":"","sources":["../../../../../src/components/sidePanel/btw/BtwThreadScene.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAA;AAQtE,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,OAAO,EACP,WAAW,GACZ,EAAE;IACD,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAA;IAC5B,iCAAiC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;CAChD,GAAG,KAAK,CAAC,SAAS,CAuKlB"}
@@ -4,7 +4,9 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
4
  * 滚动、composer 追问。Esc 返回侧栏,面板状态原样(mountPolicy=enabled
5
5
  * 不卸载,thread 与 draft 都在线程 store)。
6
6
  *
7
- * 键层级:composer 编辑(Esc 收起草稿)> 场景滚动/动作 > Esc 退出场景。
7
+ * 键层级:composer 编辑(Esc 收起草稿、↑ 上到标题)> 场景动作(↑/↓ 选轮、
8
+ * s 送聊天/撤回、c 复制)> Esc 退出场景。选中态与侧栏面板同源(线程 store),
9
+ * 两个形态的键位与落点逐条对齐。
8
10
  */
9
11
  import React from 'react';
10
12
  import { Box, Text, useInput, useTerminalSize } from '../../../ui.js';
@@ -14,11 +16,12 @@ import { btwThreads } from './threads.js';
14
16
  import { getBtwContextBudget, getBtwContextTurns } from '../../../tuiDisplayPrefs.js';
15
17
  import { BtwComposer, btwComposerKey } from './BtwComposer.js';
16
18
  import { BtwThreadView } from './BtwThreadView.js';
17
- export function BtwThreadScene({ channel, onClose, }) {
19
+ export function BtwThreadScene({ channel, onClose, onFocusChat, }) {
18
20
  const { columns, rows } = useTerminalSize();
19
21
  const sessionId = String(channel.agentId);
20
22
  const thread = React.useSyncExternalStore(btwThreads.subscribe, () => btwThreads.get(sessionId));
21
23
  const [composerFocus, setComposerFocus] = React.useState(true);
24
+ const activateComposer = React.useCallback(() => setComposerFocus(true), []);
22
25
  const caretRef = React.useRef(0);
23
26
  const [caret, setCaretState] = React.useState(0);
24
27
  const setCaret = (next) => {
@@ -28,11 +31,15 @@ export function BtwThreadScene({ channel, onClose, }) {
28
31
  const [notice, setNotice] = React.useState(null);
29
32
  const scrollRef = React.useRef(null);
30
33
  const busy = thread !== undefined && thread.activeTurnId !== null;
34
+ // 选中轮与侧栏面板同源(线程 store):↑/↓ 移动、s 送聊天/撤回、c 复制。
35
+ const turns = thread?.turns ?? [];
36
+ const selectedId = thread?.selectedTurnId ?? null;
37
+ const selectedTurn = turns.find(turn => turn.turnId === selectedId);
31
38
  const attachTurn = React.useCallback((turn) => {
32
39
  if (turn.phase !== 'completed')
33
- return;
40
+ return false;
34
41
  if (typeof channel.attachContext !== 'function')
35
- return;
42
+ return false;
36
43
  channel.attachContext({
37
44
  source: 'panel',
38
45
  sourceId: turn.turnId,
@@ -41,7 +48,42 @@ export function BtwThreadScene({ channel, onClose, }) {
41
48
  });
42
49
  const staged = channel.attachedContexts.find(entry => entry.sourceId === turn.turnId);
43
50
  channel.notify(staged?.truncated === true ? t('btw-thread-answer-truncated') : t('btw-thread-answer-attached'), { color: 'success' });
51
+ return true;
44
52
  }, [channel]);
53
+ /**
54
+ * `s` = 送聊天,再按一次 = 撤回(与侧栏面板、jobs/companion 同一契约)。
55
+ * 送出去之后这个整屏场景就让位:关掉场景 + 焦点交回主输入框——等价于侧栏
56
+ * 形态里「面板留着、焦点回到输入框」,两种形态的落点一致。
57
+ */
58
+ const sendToChat = React.useCallback((turn) => {
59
+ // oxlint-disable-next-line typescript/no-unnecessary-condition -- runtime guard: partial fixture channels
60
+ const staged = (channel.attachedContexts ?? []).find(entry => entry.sourceId === turn.turnId);
61
+ if (staged !== undefined) {
62
+ if (typeof channel.detachContext === 'function')
63
+ channel.detachContext(staged.id);
64
+ channel.notify(t('panel-context-detached'), { color: 'success' });
65
+ return;
66
+ }
67
+ if (!attachTurn(turn))
68
+ return;
69
+ onFocusChat?.();
70
+ onClose();
71
+ }, [attachTurn, channel, onFocusChat, onClose]);
72
+ /** 点标题行:选中那一轮并离开编辑层(高亮只在列表态显示)。 */
73
+ const selectTurn = React.useCallback((turnId) => {
74
+ btwThreads.select(sessionId, turnId);
75
+ setComposerFocus(false);
76
+ }, [sessionId]);
77
+ const copySelected = React.useCallback(() => {
78
+ const turn = btwThreads.selectedTurn(sessionId);
79
+ const answer = turn !== undefined && turn.answer !== ''
80
+ ? turn.answer
81
+ : [...(btwThreads.get(sessionId)?.turns ?? [])].reverse().find(candidate => candidate.phase === 'completed')?.answer;
82
+ if (answer === undefined)
83
+ return;
84
+ void setClipboard(answer);
85
+ channel.notify(t('copied-chars', { n: answer.length }), { timeoutMs: 1500 });
86
+ }, [sessionId, channel]);
45
87
  useInput((input, key, event) => {
46
88
  if (composerFocus) {
47
89
  const text = btwThreads.get(sessionId)?.draft ?? '';
@@ -79,14 +121,23 @@ export function BtwThreadScene({ channel, onClose, }) {
79
121
  onClose();
80
122
  return;
81
123
  }
124
+ // ↑/↓ 只挪选中,滚动交给 BtwThreadView 的「最小揭示」(出了视口才滚)。
82
125
  if (key.upArrow) {
83
- scrollRef.current?.scrollBy(-3);
84
126
  event.stopImmediatePropagation();
127
+ btwThreads.moveSelection(sessionId, -1);
85
128
  return;
86
129
  }
87
130
  if (key.downArrow) {
88
- scrollRef.current?.scrollBy(3);
89
131
  event.stopImmediatePropagation();
132
+ const list = btwThreads.get(sessionId)?.turns ?? [];
133
+ const current = btwThreads.selectedTurn(sessionId);
134
+ const at = current === undefined ? list.length - 1 : list.findIndex(turn => turn.turnId === current.turnId);
135
+ // 已在最后一条:↓ 回输入框(与输入框里按 ↑ 上到标题互为往返)。
136
+ if (list.length === 0 || at === list.length - 1) {
137
+ setComposerFocus(true);
138
+ return;
139
+ }
140
+ btwThreads.moveSelection(sessionId, 1);
90
141
  return;
91
142
  }
92
143
  if (key.pageUp) {
@@ -100,7 +151,8 @@ export function BtwThreadScene({ channel, onClose, }) {
100
151
  return;
101
152
  }
102
153
  // ink reports a plain Tab as key.tab with an empty input.
103
- if (key.tab || input === '\t') {
154
+ // Enter/Tab 都回编辑层:列表态不是死胡同,一键继续问。
155
+ if (key.tab || input === '\t' || key.return || /^[\r\n]+$/u.test(input)) {
104
156
  setComposerFocus(true);
105
157
  event.stopImmediatePropagation();
106
158
  return;
@@ -112,20 +164,16 @@ export function BtwThreadScene({ channel, onClose, }) {
112
164
  return;
113
165
  }
114
166
  if (input === 's' && !key.ctrl && !key.meta) {
115
- const latest = [...(btwThreads.get(sessionId)?.turns ?? [])].reverse().find(turn => turn.phase === 'completed');
116
- if (latest !== undefined)
117
- attachTurn(latest);
167
+ const turn = btwThreads.selectedTurn(sessionId);
168
+ if (turn !== undefined)
169
+ sendToChat(turn);
118
170
  event.stopImmediatePropagation();
119
171
  return;
120
172
  }
121
173
  if (input === 'c' && !key.ctrl && !key.meta) {
122
- const latest = [...(btwThreads.get(sessionId)?.turns ?? [])].reverse().find(turn => turn.phase === 'completed');
123
- if (latest !== undefined) {
124
- void setClipboard(latest.answer);
125
- channel.notify(t('copied-chars', { n: latest.answer.length }), { timeoutMs: 1500 });
126
- }
174
+ copySelected();
127
175
  event.stopImmediatePropagation();
128
176
  }
129
177
  });
130
- return (_jsxs(Box, { flexDirection: "column", width: columns, height: rows, paddingX: 1, children: [_jsxs(Box, { flexDirection: "row", width: "100%", height: 1, flexShrink: 0, children: [_jsx(Text, { color: "warning", bold: true, children: t('btw-fullscreen-title') }), _jsx(Text, { dimColor: true, children: ' ' + t('btw-thread-send-to-chat') + ' [s] · ' + t('btw-thread-new') + ' [n] · Esc' })] }), _jsx(BtwThreadView, { thread: thread, width: columns - 2, height: Math.max(3, rows - 4), alive: true, onAttachTurn: attachTurn, scrollHandleRef: scrollRef }), _jsx(BtwComposer, { state: { text: thread?.draft ?? '', caret }, focused: composerFocus, busy: busy, notice: notice === null ? undefined : notice })] }));
178
+ return (_jsxs(Box, { flexDirection: "column", width: columns, height: rows, paddingX: 1, children: [_jsxs(Box, { flexDirection: "row", width: "100%", height: 1, flexShrink: 0, children: [_jsx(Text, { color: "warning", bold: true, children: t('btw-fullscreen-title') }), _jsx(Text, { dimColor: true, wrap: "truncate", children: ' ' + t('btw-scene-hints') })] }), _jsx(BtwThreadView, { thread: thread, width: columns - 2, height: Math.max(3, rows - 4), alive: true, selectedTurnId: composerFocus ? undefined : selectedId ?? undefined, onSelectTurn: selectTurn, scrollHandleRef: scrollRef }), _jsx(BtwComposer, { state: { text: thread?.draft ?? '', caret }, focused: composerFocus, busy: busy, notice: notice === null ? undefined : notice, onActivate: activateComposer })] }));
131
179
  }
@@ -1,19 +1,29 @@
1
1
  /**
2
2
  * BtwThreadView:Q/A 轮次的滚动列表(面板 / 全屏场景 / 浮层 fallback
3
- * 共用)。Question 走用户侧视觉(accent ❯ 前缀),Answer 走共享
3
+ * 共用)。Question 走用户侧视觉(accent 加粗,无行首箭头),Answer 走共享
4
4
  * Markdown;运行中显示本轮 spinner;失败或中止时保留已流出的部分答复,
5
5
  * 下面标出错误/已中止。
6
6
  *
7
7
  * 跟尾:默认跟随尾部;用户上滚后暂停 follow,
8
8
  * 出现「有新回答」跳尾提示(点击回底)。ScrollBox 的 sticky 位就是
9
9
  * follow 信号——上滚打破 sticky,scrollToBottom/贴底恢复。
10
+ *
11
+ * 消息区不是控件:点它跟点面板其它地方一样,只由宿主把列焦点交给面板
12
+ * (见 BtwComposer 的点击注释),注入/复制的入口是选中轮 + `s`/`c`。
13
+ * 选中只看标题那一行:反色只覆盖标题本身的字,终端光标也声明在那儿。
14
+ * 选中轮滚出视口时只滚到「恰好露出这一行」:往上走贴视口顶、往下走贴视口底;
15
+ * 已经在视口里就只挪高亮,不动滚动位置。
10
16
  */
11
17
  import React from 'react';
12
18
  import { type ScrollBoxHandle } from '../../../ui.js';
13
- import type { BtwThreadSnapshot, BtwTurn } from './threads.js';
19
+ import type { BtwThreadSnapshot } from './threads.js';
14
20
  export declare function BtwThreadView({ thread, width, height,
15
21
  /** 渲时钟的开关(面板不可见/场景失焦时停表)。 */
16
- alive, onAttachTurn,
22
+ alive,
23
+ /** 当前选中的轮(标题反色 + 光标声明);undefined = 列表没有选中态。 */
24
+ selectedTurnId,
25
+ /** 点标题行把选中挪到那一轮(继续冒泡,宿主照旧拿列焦点)。 */
26
+ onSelectTurn,
17
27
  /** 宿主(全屏场景/浮层)接管键盘滚动用的句柄透传。 */
18
28
  scrollHandleRef, }: {
19
29
  readonly thread: BtwThreadSnapshot | undefined;
@@ -21,8 +31,8 @@ scrollHandleRef, }: {
21
31
  /** 滚动区行预算(含滚动区自身;跳尾提示一行另计)。 */
22
32
  readonly height: number;
23
33
  readonly alive: boolean;
24
- /** 点击已完成轮的答案区触发送到聊天(fallback 形态不传 = 无该交互)。 */
25
- readonly onAttachTurn?: (turn: BtwTurn) => void;
34
+ readonly selectedTurnId?: string | undefined;
35
+ readonly onSelectTurn?: ((turnId: string) => void) | undefined;
26
36
  readonly scrollHandleRef?: {
27
37
  current: ScrollBoxHandle | null;
28
38
  };
@@ -1 +1 @@
1
- {"version":3,"file":"BtwThreadView.d.ts","sourceRoot":"","sources":["../../../../../src/components/sidePanel/btw/BtwThreadView.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAI3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAK9D,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,KAAK,EACL,MAAM;AACN,6BAA6B;AAC7B,KAAK,EACL,YAAY;AACZ,+BAA+B;AAC/B,eAAe,GAChB,EAAE;IACD,QAAQ,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAAA;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,+BAA+B;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,8CAA8C;IAC9C,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IAC/C,QAAQ,CAAC,eAAe,CAAC,EAAE;QAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAAA;KAAE,CAAA;CAC/D,GAAG,KAAK,CAAC,SAAS,CAuHlB"}
1
+ {"version":3,"file":"BtwThreadView.d.ts","sourceRoot":"","sources":["../../../../../src/components/sidePanel/btw/BtwThreadView.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAO3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AA2DrD,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,KAAK,EACL,MAAM;AACN,6BAA6B;AAC7B,KAAK;AACL,+CAA+C;AAC/C,cAAc;AACd,mCAAmC;AACnC,YAAY;AACZ,+BAA+B;AAC/B,eAAe,GAChB,EAAE;IACD,QAAQ,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAAA;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,+BAA+B;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5C,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;IAC9D,QAAQ,CAAC,eAAe,CAAC,EAAE;QAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAAA;KAAE,CAAA;CAC/D,GAAG,KAAK,CAAC,SAAS,CA6JlB"}
@@ -1,27 +1,68 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  /**
3
3
  * BtwThreadView:Q/A 轮次的滚动列表(面板 / 全屏场景 / 浮层 fallback
4
- * 共用)。Question 走用户侧视觉(accent ❯ 前缀),Answer 走共享
4
+ * 共用)。Question 走用户侧视觉(accent 加粗,无行首箭头),Answer 走共享
5
5
  * Markdown;运行中显示本轮 spinner;失败或中止时保留已流出的部分答复,
6
6
  * 下面标出错误/已中止。
7
7
  *
8
8
  * 跟尾:默认跟随尾部;用户上滚后暂停 follow,
9
9
  * 出现「有新回答」跳尾提示(点击回底)。ScrollBox 的 sticky 位就是
10
10
  * follow 信号——上滚打破 sticky,scrollToBottom/贴底恢复。
11
+ *
12
+ * 消息区不是控件:点它跟点面板其它地方一样,只由宿主把列焦点交给面板
13
+ * (见 BtwComposer 的点击注释),注入/复制的入口是选中轮 + `s`/`c`。
14
+ * 选中只看标题那一行:反色只覆盖标题本身的字,终端光标也声明在那儿。
15
+ * 选中轮滚出视口时只滚到「恰好露出这一行」:往上走贴视口顶、往下走贴视口底;
16
+ * 已经在视口里就只挪高亮,不动滚动位置。
11
17
  */
12
18
  import React from 'react';
13
19
  import { Box, Text, ScrollBox } from '../../../ui.js';
14
20
  import { Markdown } from '../../Markdown.js';
15
21
  import { SpinnerGlyph } from '../../Spinner/SpinnerGlyph.js';
16
22
  import { t } from '../../../i18n.js';
23
+ import { useDeclaredCursor, useNativeCursor } from '../../../ink/hooks/use-declared-cursor.js';
24
+ import { getBtwContextTurns, subscribeBtwContextTurns } from '../../../tuiDisplayPrefs.js';
17
25
  /** 80ms spinner 帧(只在有 running 轮且其还没收到首段文本时走时钟)。 */
18
26
  const SPINNER_MS = 80;
27
+ /** 空态:一句「还没有」+ 这是什么 + 上下文口径(三条信息各一行,不再一行裸文案)。 */
28
+ function BtwEmptyState({ contextTurns }) {
29
+ return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, children: [_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "subtle", wrap: "truncate", children: t('btw-thread-empty') }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "subtle", wrap: "wrap", children: t('btw-empty-lines') }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, italic: true, wrap: "wrap", children: t('btw-thread-context-recent', { n: contextTurns }) }) })] }));
30
+ }
31
+ /**
32
+ * 一轮的标题行(问题)。选中 = 只反色标题本身的字(不铺满整行),并把终端
33
+ * 光标声明在这一行上:按 ↑/↓ 时原生光标的拖尾是「在标题之间上下走」,而不是
34
+ * 掉到屏幕左下角(没有声明时渲染器的兜底位置)。点这一行 = 把高亮挪过来
35
+ * (`onSelect`),点击继续冒泡,宿主照旧拿到列焦点。
36
+ */
37
+ function QuestionRow({ turnId, text, selected, onSelect, onRegister }) {
38
+ const native = useNativeCursor();
39
+ // 与 ListItem 同款:移动期间可见、静止 500ms 后收起,形状/闪烁归终端。
40
+ const cursorRef = useDeclaredCursor({ line: 0, column: 0, active: selected, visible: native, hideOnIdle: native });
41
+ // 组装 ref 时必须把 cursorRef 的 cleanup 转交出去(React 19 用返回值当卸载
42
+ // 清理),否则这一行被删掉时光标声明会留在原地。
43
+ const setNode = React.useCallback((node) => {
44
+ const cleanup = cursorRef(node);
45
+ onRegister?.(turnId, node);
46
+ return () => {
47
+ if (typeof cleanup === 'function')
48
+ cleanup();
49
+ onRegister?.(turnId, null);
50
+ };
51
+ }, [cursorRef, onRegister, turnId]);
52
+ return (_jsx(Box, { ref: setNode, onClick: onSelect === undefined ? undefined : () => onSelect(turnId), children: _jsx(Text, { color: "accent", bold: true, inverse: selected, wrap: "wrap", children: text }) }));
53
+ }
19
54
  export function BtwThreadView({ thread, width, height,
20
55
  /** 渲时钟的开关(面板不可见/场景失焦时停表)。 */
21
- alive, onAttachTurn,
56
+ alive,
57
+ /** 当前选中的轮(标题反色 + 光标声明);undefined = 列表没有选中态。 */
58
+ selectedTurnId,
59
+ /** 点标题行把选中挪到那一轮(继续冒泡,宿主照旧拿列焦点)。 */
60
+ onSelectTurn,
22
61
  /** 宿主(全屏场景/浮层)接管键盘滚动用的句柄透传。 */
23
62
  scrollHandleRef, }) {
24
63
  const localScrollRef = React.useRef(null);
64
+ // 上下文覆盖提示跟随 dsh-tui.btw.contextTurns 的活值(/settings 改完即换词)。
65
+ const contextTurns = React.useSyncExternalStore(subscribeBtwContextTurns, getBtwContextTurns);
25
66
  const scrollRef = scrollHandleRef ?? localScrollRef;
26
67
  const [frame, setFrame] = React.useState(0);
27
68
  const [follow, setFollow] = React.useState(true);
@@ -70,18 +111,68 @@ scrollHandleRef, }) {
70
111
  setPendingJump(true);
71
112
  // eslint-disable-next-line react-hooks/exhaustive-deps
72
113
  }, [version, answerLengths, follow]);
114
+ // ── 选中轮的最小滚动揭示 ─────────────────────────────────────────────
115
+ // 行节点表:QuestionRow 挂载时交进来;滚动位置一律走 ScrollBox 的
116
+ // scrollToElement(位置在渲染期读元素 Yoga top,不会用到过期数字)。
117
+ const rowNodes = React.useRef(new Map());
118
+ const registerRow = React.useCallback((turnId, node) => {
119
+ if (node === null)
120
+ rowNodes.current.delete(turnId);
121
+ else
122
+ rowNodes.current.set(turnId, node);
123
+ }, []);
124
+ /**
125
+ * 节点在滚动内容里的行号(不含滚动位移):沿祖先累加 Yoga top,直到撞上滚动
126
+ * 容器(ScrollBox 的节点上才有 scrollTop)。没撞到(浮层回退等无滚动区形态)
127
+ * 返回 undefined——宁可不滚,也不要按错误的坐标系乱跳。
128
+ */
129
+ const contentRowOf = (node) => {
130
+ let rows = 0;
131
+ let current = node;
132
+ while (current !== undefined && current.parentNode !== undefined) {
133
+ if (current.parentNode.scrollTop !== undefined)
134
+ return rows;
135
+ rows += current.yogaNode?.getComputedTop() ?? 0;
136
+ current = current.parentNode;
137
+ }
138
+ return undefined;
139
+ };
140
+ const previousSelectedRef = React.useRef(undefined);
141
+ React.useLayoutEffect(() => {
142
+ const previous = previousSelectedRef.current;
143
+ previousSelectedRef.current = selectedTurnId;
144
+ // 从编辑层或主输入框回列表时也要揭示:长答案跟尾后,标题可能在视口外。
145
+ if (selectedTurnId === undefined || previous === selectedTurnId)
146
+ return;
147
+ const handle = scrollRef.current;
148
+ const node = rowNodes.current.get(selectedTurnId);
149
+ if (handle === null || node === undefined)
150
+ return;
151
+ const viewport = handle.getViewportHeight();
152
+ if (viewport <= 0)
153
+ return;
154
+ const rows = Math.max(1, Math.ceil(node.yogaNode?.getComputedHeight() ?? 1));
155
+ const top = contentRowOf(node);
156
+ if (top === undefined)
157
+ return;
158
+ const scrollTop = handle.getScrollTop();
159
+ // 用算好的内容行号直接 scrollTo:scrollToElement 读的是元素相对**父节点**的
160
+ // top,标题盒子嵌在 turn 里,用它会把滚动甩到内容顶部。布局已稳定(只有选中
161
+ // 变了),这里的数字不会过期。
162
+ // 往上走出视口 → 贴视口顶;往下走出视口 → 整行贴视口底(恰好露出,不多滚)。
163
+ if (top < scrollTop)
164
+ handle.scrollTo(top);
165
+ else if (top + rows > scrollTop + viewport)
166
+ handle.scrollTo(top + rows - viewport);
167
+ }, [selectedTurnId]);
73
168
  const jumpTail = React.useCallback(() => {
74
169
  scrollRef.current?.scrollToBottom();
75
170
  setFollow(true);
76
171
  setPendingJump(false);
77
172
  }, []);
78
- if (thread === undefined || thread.turns.length === 0) {
79
- return (_jsx(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, children: _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "subtle", wrap: "truncate", children: t('btw-thread-empty') }) }) }));
80
- }
81
- return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, overflow: "hidden", paddingX: 1, children: [_jsx(ScrollBox, { ref: scrollRef, flexDirection: "column", flexGrow: 1, stickyScroll: true, children: thread.turns.map(turn => (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", flexShrink: 0, children: [_jsx(Text, { color: "accent", bold: true, children: '❯ ' }), _jsx(Text, { color: "accent", wrap: "wrap", children: turn.question })] }), _jsxs(Box, { marginLeft: 2, flexDirection: "column", children: [turn.phase === 'completed' ? (_jsx(Box, { onClick: onAttachTurn === undefined ? undefined : event => {
82
- event.stopImmediatePropagation();
83
- onAttachTurn(turn);
84
- }, children: _jsx(Markdown, { cacheTokens: false, children: turn.answer }) })) : turn.phase === 'failed' || turn.phase === 'cancelled' ? (_jsxs(_Fragment, { children: [turn.answer !== '' && _jsx(Markdown, { cacheTokens: false, children: turn.answer }), turn.phase === 'failed'
173
+ if (thread === undefined || thread.turns.length === 0)
174
+ return _jsx(BtwEmptyState, { contextTurns: contextTurns });
175
+ return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, overflow: "hidden", paddingX: 1, children: [_jsx(ScrollBox, { ref: scrollRef, flexDirection: "column", flexGrow: 1, stickyScroll: true, children: thread.turns.map((turn, index) => (_jsxs(Box, { flexDirection: "column", children: [index > 0 && _jsx(Text, { dimColor: true, children: '┈'.repeat(Math.max(4, width - 2)) }), _jsx(QuestionRow, { turnId: turn.turnId, text: turn.question, selected: turn.turnId === selectedTurnId, onSelect: onSelectTurn, onRegister: registerRow }), _jsxs(Box, { marginLeft: 2, flexDirection: "column", children: [turn.phase === 'completed' ? (_jsx(Markdown, { cacheTokens: false, children: turn.answer })) : turn.phase === 'failed' || turn.phase === 'cancelled' ? (_jsxs(_Fragment, { children: [turn.answer !== '' && _jsx(Markdown, { cacheTokens: false, children: turn.answer }), turn.phase === 'failed'
85
176
  ? _jsxs(Text, { color: "error", wrap: "wrap", children: [t('btw-thread-error'), turn.error === undefined ? '' : ': ' + turn.error] })
86
- : _jsx(Text, { dimColor: true, italic: true, children: t('btw-thread-cancelled') })] })) : turn.answer !== '' ? (_jsx(Markdown, { cacheTokens: false, children: turn.answer })) : (_jsxs(Box, { flexShrink: 0, children: [_jsx(SpinnerGlyph, { frame: frame, messageColor: "warning" }), _jsxs(Text, { color: "warning", children: [" ", t('btw-answering')] })] })), turn.omittedOlderCount > 0 && (_jsx(Text, { dimColor: true, italic: true, wrap: "truncate", children: t('btw-thread-context-omitted', { n: turn.omittedOlderCount }) }))] }), _jsx(Box, { height: 1, flexShrink: 0 })] }, turn.turnId))) }), pendingJump && !follow && (_jsx(Box, { flexShrink: 0, onClick: event => { event.stopImmediatePropagation(); jumpTail(); }, children: _jsxs(Text, { color: "permission", children: ["\u2193 ", t('btw-thread-unread')] }) }))] }));
177
+ : _jsx(Text, { dimColor: true, italic: true, children: t('btw-thread-cancelled') })] })) : turn.answer !== '' ? (_jsx(Markdown, { cacheTokens: false, children: turn.answer })) : (_jsxs(Box, { flexShrink: 0, children: [_jsx(SpinnerGlyph, { frame: frame, messageColor: "warning" }), _jsxs(Text, { color: "warning", children: [" ", t('btw-answering')] })] })), turn.omittedOlderCount > 0 && (_jsx(Text, { dimColor: true, italic: true, wrap: "truncate", children: t('btw-thread-context-omitted', { n: turn.omittedOlderCount }) }))] })] }, turn.turnId))) }), pendingJump && !follow && (_jsx(Box, { flexShrink: 0, onClick: event => { event.stopImmediatePropagation(); jumpTail(); }, children: _jsxs(Text, { color: "permission", children: ["\u2193 ", t('btw-thread-unread')] }) }))] }));
87
178
  }
@@ -22,6 +22,9 @@ export interface BtwThreadSnapshot {
22
22
  readonly turns: readonly BtwTurn[];
23
23
  readonly activeTurnId: string | null;
24
24
  readonly draft: string;
25
+ /** 列表选中的轮(`s` 送聊天 / `c` 复制的对象);null = 跟最后一条。
26
+ * 与 draft 同理放在 store 里:面板与全屏场景共用同一份选中态。 */
27
+ readonly selectedTurnId: string | null;
25
28
  /** seen-through 标尺之后的完成/失败轮(cancelled 不计:用户自己中止,
26
29
  * 不是没看到的新答案)。 */
27
30
  readonly unread: {
@@ -55,6 +58,12 @@ export type BtwSubmitResult = {
55
58
  readonly ok: false;
56
59
  readonly reason: 'empty' | 'busy' | 'congested';
57
60
  };
61
+ /**
62
+ * 有效选中轮:钉住的 id 还在就继续用它,否则跟最后一条(新轮到达自动跟尾、
63
+ * 轮被清掉/换话题自动落回)。面板与全屏场景共用这一条解析,保证两个形态
64
+ * 的选中语义逐字一致。
65
+ */
66
+ export declare function effectiveSelectedTurnId(turns: readonly BtwTurn[], pinned: string | null): string | null;
58
67
  /** 钳到 1–8;非有限值取默认 4。 */
59
68
  export declare function normalizeRecentTurnsLimit(value: number | undefined): number;
60
69
  export interface BtwContextSelection {
@@ -97,6 +106,15 @@ declare class BtwThreadStore {
97
106
  */
98
107
  newTopic(sessionId: string): boolean;
99
108
  setDraft(sessionId: string, text: string): void;
109
+ /** 指定选中某一轮(点标题行;null = 回到跟最后一条)。 */
110
+ select(sessionId: string, turnId: string | null): void;
111
+ /** 当前选中轮(实时解析,不依赖渲染期快照)。 */
112
+ selectedTurn(sessionId: string): BtwTurn | undefined;
113
+ /**
114
+ * ↑/↓ 移动选中:从当前有效选中出发、夹在两端(delta = ±1)。落点即钉住,
115
+ * 所以移动之后不再跟尾;返回新选中轮(线程为空 = undefined)。
116
+ */
117
+ moveSelection(sessionId: string, delta: number): BtwTurn | undefined;
100
118
  /** 看到最新线程:把已落定轮全部记为已读(running 轮落定时再见分晓)。 */
101
119
  markSeen(sessionId: string): void;
102
120
  /** 测试/多夹具隔离用:清空全部线程状态。 */
@@ -1 +1 @@
1
- {"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../../../src/components/sidePanel/btw/threads.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../../../src/components/sidePanel/btw/threads.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,16 @@ export const BTW_CONTEXT_CHAR_BUDGET = 24_000;
24
24
  export const BTW_ANSWER_CHAR_BUDGET = 8_000;
25
25
  /** 跨线程并发上限:超过显示忙,不隐式取消。 */
26
26
  export const BTW_MAX_CONCURRENT_ASKS = 2;
27
+ /**
28
+ * 有效选中轮:钉住的 id 还在就继续用它,否则跟最后一条(新轮到达自动跟尾、
29
+ * 轮被清掉/换话题自动落回)。面板与全屏场景共用这一条解析,保证两个形态
30
+ * 的选中语义逐字一致。
31
+ */
32
+ export function effectiveSelectedTurnId(turns, pinned) {
33
+ if (pinned !== null && turns.some(turn => turn.turnId === pinned))
34
+ return pinned;
35
+ return turns.length === 0 ? null : turns[turns.length - 1].turnId;
36
+ }
27
37
  /** 钳到 1–8;非有限值取默认 4。 */
28
38
  export function normalizeRecentTurnsLimit(value) {
29
39
  if (value === undefined || !Number.isFinite(value))
@@ -92,6 +102,7 @@ function buildSnapshot(record) {
92
102
  turns: Object.freeze([...record.turns]),
93
103
  activeTurnId: active === null ? null : active.turnId,
94
104
  draft: record.draft,
105
+ selectedTurnId: effectiveSelectedTurnId(record.turns, record.selectedTurnId),
95
106
  unread: Object.freeze({ count: unreadCount, error: unreadError }),
96
107
  version: record.version,
97
108
  });
@@ -147,6 +158,8 @@ class BtwThreadStore {
147
158
  omittedOlderCount: selection.omittedOlderCount,
148
159
  };
149
160
  record.turns.push(turn);
161
+ // 新轮到达回到跟尾:选中态跟的是「最后一条」,上一轮的钉位不再有意义。
162
+ record.selectedTurnId = null;
150
163
  this.bump(record);
151
164
  const controller = new AbortController();
152
165
  this.controllers.set(turn.turnId, controller);
@@ -230,6 +243,7 @@ class BtwThreadStore {
230
243
  record.generation += 1;
231
244
  record.turns = [];
232
245
  record.draft = '';
246
+ record.selectedTurnId = null;
233
247
  record.seenThroughSeq = this.turnSeq;
234
248
  this.bump(record);
235
249
  return true;
@@ -241,6 +255,41 @@ class BtwThreadStore {
241
255
  record.draft = text;
242
256
  this.bump(record);
243
257
  }
258
+ /** 指定选中某一轮(点标题行;null = 回到跟最后一条)。 */
259
+ select(sessionId, turnId) {
260
+ const record = this.recordOf(sessionId);
261
+ if (record.selectedTurnId === turnId)
262
+ return;
263
+ record.selectedTurnId = turnId;
264
+ this.bump(record);
265
+ }
266
+ /** 当前选中轮(实时解析,不依赖渲染期快照)。 */
267
+ selectedTurn(sessionId) {
268
+ const record = this.threads.get(sessionId);
269
+ if (record === undefined)
270
+ return undefined;
271
+ const id = effectiveSelectedTurnId(record.turns, record.selectedTurnId);
272
+ return id === null ? undefined : record.turns.find(turn => turn.turnId === id);
273
+ }
274
+ /**
275
+ * ↑/↓ 移动选中:从当前有效选中出发、夹在两端(delta = ±1)。落点即钉住,
276
+ * 所以移动之后不再跟尾;返回新选中轮(线程为空 = undefined)。
277
+ */
278
+ moveSelection(sessionId, delta) {
279
+ const record = this.recordOf(sessionId);
280
+ if (record.turns.length === 0)
281
+ return undefined;
282
+ const current = effectiveSelectedTurnId(record.turns, record.selectedTurnId);
283
+ const at = record.turns.findIndex(turn => turn.turnId === current);
284
+ const from = at === -1 ? record.turns.length - 1 : at;
285
+ const next = Math.min(record.turns.length - 1, Math.max(0, from + delta));
286
+ const turnId = record.turns[next].turnId;
287
+ if (record.selectedTurnId !== turnId) {
288
+ record.selectedTurnId = turnId;
289
+ this.bump(record);
290
+ }
291
+ return record.turns[next];
292
+ }
244
293
  /** 看到最新线程:把已落定轮全部记为已读(running 轮落定时再见分晓)。 */
245
294
  markSeen(sessionId) {
246
295
  const record = this.threads.get(sessionId);
@@ -269,6 +318,7 @@ class BtwThreadStore {
269
318
  generation: 0,
270
319
  turns: [],
271
320
  draft: '',
321
+ selectedTurnId: null,
272
322
  seenThroughSeq: this.turnSeq,
273
323
  version: 0,
274
324
  snapshot: Object.freeze({
@@ -279,6 +329,7 @@ class BtwThreadStore {
279
329
  turns: Object.freeze([]),
280
330
  activeTurnId: null,
281
331
  draft: '',
332
+ selectedTurnId: null,
282
333
  unread: Object.freeze({ count: 0, error: false }),
283
334
  version: 0,
284
335
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"builtinPanels.d.ts","sourceRoot":"","sources":["../../../../src/components/sidePanel/builtinPanels.tsx"],"names":[],"mappings":"AA6NA,2BAA2B;AAC3B,wBAAgB,qBAAqB,IAAI,IAAI,CAmG5C"}
1
+ {"version":3,"file":"builtinPanels.d.ts","sourceRoot":"","sources":["../../../../src/components/sidePanel/builtinPanels.tsx"],"names":[],"mappings":"AAiOA,2BAA2B;AAC3B,wBAAgB,qBAAqB,IAAI,IAAI,CAmG5C"}
@@ -141,6 +141,10 @@ function AgentsPanelAdapter({ focused, visible }) {
141
141
  React.useEffect(() => {
142
142
  const running = subagents.filter(s => s.status === 'running' || s.status === 'starting').length;
143
143
  const failedIds = new Set(subagents.filter(s => s.status === 'failed').map(s => s.agentId));
144
+ // A failed team member is durable; it counts once even beside a failed run.
145
+ for (const member of channel.team?.members ?? [])
146
+ if (member.phase === 'failed')
147
+ failedIds.add(member.id);
144
148
  if (visible) {
145
149
  seenFailedRef.current = failedIds;
146
150
  panelStore.setBadge('agents', running > 0 ? { level: 'info', unread: 0 } : null);
@@ -162,7 +166,7 @@ function AgentsPanelAdapter({ focused, visible }) {
162
166
  if (typeof route === 'object' && detail !== undefined) {
163
167
  return (_jsx(SubagentDetailScene, { subagent: detail, variant: "panel", focused: focused, visible: visible, onBack: () => setRoute('dashboard'), onInterrupt: (id) => channel.subagentControl?.interrupt(id), ...(channel.subagentControl?.history === undefined ? {} : { loadTranscript: channel.subagentControl.history }), onOpenView: () => agentViewStore.request(detail.agentId, 'agent-detail', true), messages: detailMessages, ...(detailCompose === undefined ? {} : { compose: detailCompose }) }));
164
168
  }
165
- return (_jsx(SubagentDashboard, { subagents: subagents, variant: "panel", focused: focused, visible: visible, onSelect: (id) => setRoute({ detail: id }), onOpenView: (id) => agentViewStore.request(id, 'agents-dashboard', true), messages: messageControl?.messages() }));
169
+ return (_jsx(SubagentDashboard, { subagents: subagents, team: channel.team, sessionId: channel.sessionId, variant: "panel", focused: focused, visible: visible, onSelect: (id) => setRoute({ detail: id }), onOpenView: (id) => agentViewStore.request(id, 'agents-dashboard', true), messages: messageControl?.messages() }));
166
170
  }
167
171
  let registered = false;
168
172
  /** 幂等:重复调用(夹具多次挂载)不再注册。 */
@@ -9,7 +9,7 @@ import React from 'react';
9
9
  import { Box, Text, useAnimationFrame } from '../../../ui.js';
10
10
  import instances from '../../../ink/instances.js';
11
11
  import { t } from '../../../i18n.js';
12
- import wrapText from '../../../ink/wrap-text.js';
12
+ import { wrapTextLines } from '../../../ink/wrap-text.js';
13
13
  import { truncateWidth } from '../../../trajectory/format.js';
14
14
  import { panelStore } from '../PanelStore.js';
15
15
  import { PANEL_MIN_COLUMNS } from '../dimensions.js';
@@ -471,7 +471,7 @@ export function CompanionPanel({ width, height, focused, visible }) {
471
471
  let bubbleNode = null;
472
472
  if (bubble !== undefined && bubbleLines > 0 && !compact) {
473
473
  const inner = Math.max(4, width - 4);
474
- const wrapped = wrapText(bubble.text, inner, 'wrap').split('\n');
474
+ const wrapped = wrapTextLines(bubble.text, inner).map(line => line.text);
475
475
  const shown = wrapped.length > bubbleLines
476
476
  ? [...wrapped.slice(0, bubbleLines - 1), truncateWidth(wrapped[bubbleLines - 1] + '…', inner)]
477
477
  : wrapped;
@@ -19,13 +19,17 @@
19
19
  * 渲染路径(LogoV2 底部块,welcomePad 缩进)。
20
20
  */
21
21
  import React from 'react';
22
+ import { type SplashImageBox } from '../../splashArtRows.js';
22
23
  export type SplashMascotSkin = 'deepy' | 'whaleGirl';
23
24
  /** 读 companion.skin(LogoV2 的测试缝 prop 优先);非吉祥物皮肤返回
24
25
  * undefined(LogoV2 走原鲸鱼/女仆娘路径,零改动)。 */
25
26
  export declare function useSplashMascotSkin(pinned?: string): SplashMascotSkin | undefined;
27
+ /** 图片原生尺寸的紧凑槽;仅启动页使用,协议/像元/素材未就绪时保持原回退。 */
28
+ export declare function useSplashMascotBox(skin: SplashMascotSkin | undefined, compact: boolean): SplashImageBox | undefined;
26
29
  /** 启动页吉祥物本体:按 skin 渲染动画,点击交互(poke/连点)在内层盒。 */
27
- export declare function SplashMascot({ skin, active }: {
30
+ export declare function SplashMascot({ skin, active, imageBox }: {
28
31
  readonly skin: SplashMascotSkin;
32
+ readonly imageBox?: SplashImageBox;
29
33
  /** 动画许可:false(冻结/落地页 whaleIdle=false)时定格 idle 帧 0、零时钟。 */
30
34
  readonly active: boolean;
31
35
  }): React.ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"SplashMascot.d.ts","sourceRoot":"","sources":["../../../../../src/components/sidePanel/companion/SplashMascot.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AAiBzB,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,WAAW,CAAA;AAEpD;wCACwC;AACxC,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAIjF;AAGD,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IAC7C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CACzB,GAAG,KAAK,CAAC,SAAS,CAqElB"}
1
+ {"version":3,"file":"SplashMascot.d.ts","sourceRoot":"","sources":["../../../../../src/components/sidePanel/companion/SplashMascot.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAiB/E,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,WAAW,CAAA;AAEpD;wCACwC;AACxC,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAIjF;AAGD,2CAA2C;AAC3C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,cAAc,GAAG,SAAS,CAUnH;AAED,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;IACvD,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAA;IAClC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CACzB,GAAG,KAAK,CAAC,SAAS,CAsElB"}