@deepseek-harness-tui/dsh-tui 0.15.0 → 0.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/README.md +98 -8
  2. package/guide/dsh-tui-guide/claude-backend.en.md +8 -0
  3. package/guide/dsh-tui-guide/claude-backend.md +5 -0
  4. package/guide/dsh-tui-guide/codex-backend.en.md +13 -3
  5. package/guide/dsh-tui-guide/codex-backend.md +9 -2
  6. package/guide/dsh-tui-guide/configuration.en.md +39 -2
  7. package/guide/dsh-tui-guide/configuration.md +34 -2
  8. package/guide/dsh-tui-guide/getting-started.en.md +32 -9
  9. package/guide/dsh-tui-guide/getting-started.md +27 -8
  10. package/guide/dsh-tui-guide/interaction.en.md +8 -1
  11. package/guide/dsh-tui-guide/interaction.md +8 -1
  12. package/guide/dsh-tui-guide/plugins.en.md +66 -5
  13. package/guide/dsh-tui-guide/plugins.md +37 -3
  14. package/guide/dsh-tui-guide/user-guide.en.md +3 -2
  15. package/guide/dsh-tui-guide/user-guide.md +3 -2
  16. package/lib/settings.json +1 -1
  17. package/lib/types/adapter/channel/projection.d.ts.map +1 -1
  18. package/lib/types/adapter/channel/projection.js +1 -0
  19. package/lib/types/adapter/channel/ui-policy.d.ts +1 -1
  20. package/lib/types/adapter/channel/ui-policy.d.ts.map +1 -1
  21. package/lib/types/adapter/channel/ui-policy.js +1 -0
  22. package/lib/types/adapter/ports/channel-catalog.d.ts +5 -1
  23. package/lib/types/adapter/ports/channel-catalog.d.ts.map +1 -1
  24. package/lib/types/adapter/ports/channel-settings.d.ts +5 -3
  25. package/lib/types/adapter/ports/channel-settings.d.ts.map +1 -1
  26. package/lib/types/adapter/ports/channel-ui.d.ts +7 -1
  27. package/lib/types/adapter/ports/channel-ui.d.ts.map +1 -1
  28. package/lib/types/adapter/ports/channel-view.d.ts +47 -0
  29. package/lib/types/adapter/ports/channel-view.d.ts.map +1 -1
  30. package/lib/types/adapter/ports/channel.d.ts +2 -0
  31. package/lib/types/adapter/ports/channel.d.ts.map +1 -1
  32. package/lib/types/agent/events.d.ts +3 -2
  33. package/lib/types/agent/events.d.ts.map +1 -1
  34. package/lib/types/backends/codex/contract.d.ts +3 -0
  35. package/lib/types/backends/codex/contract.d.ts.map +1 -1
  36. package/lib/types/backends/codex/contract.js +3 -0
  37. package/lib/types/backends/codex/session/async-questions.d.ts +17 -0
  38. package/lib/types/backends/codex/session/async-questions.d.ts.map +1 -0
  39. package/lib/types/backends/codex/session/async-questions.js +89 -0
  40. package/lib/types/backends/codex/session/session.d.ts.map +1 -1
  41. package/lib/types/backends/codex/session/session.js +35 -9
  42. package/lib/types/backends/codex/text.d.ts +3 -3
  43. package/lib/types/backends/codex/text.js +1 -1
  44. package/lib/types/backends/codex/translate/items.d.ts.map +1 -1
  45. package/lib/types/backends/codex/translate/items.js +3 -1
  46. package/lib/types/backends/codex/translate/question-reply.d.ts +11 -0
  47. package/lib/types/backends/codex/translate/question-reply.d.ts.map +1 -0
  48. package/lib/types/backends/codex/translate/question-reply.js +53 -0
  49. package/lib/types/channel/projection.d.ts.map +1 -1
  50. package/lib/types/channel/projection.js +10 -0
  51. package/lib/types/commands.d.ts +10 -0
  52. package/lib/types/commands.d.ts.map +1 -1
  53. package/lib/types/commands.js +11 -2
  54. package/lib/types/components/CommandSuggestions.d.ts.map +1 -1
  55. package/lib/types/components/CommandSuggestions.js +4 -1
  56. package/lib/types/components/LogoV2.d.ts +4 -1
  57. package/lib/types/components/LogoV2.d.ts.map +1 -1
  58. package/lib/types/components/LogoV2.js +5 -3
  59. package/lib/types/components/MessageList.d.ts.map +1 -1
  60. package/lib/types/components/MessageList.js +95 -14
  61. package/lib/types/components/PermissionsPicker.d.ts +10 -1
  62. package/lib/types/components/PermissionsPicker.d.ts.map +1 -1
  63. package/lib/types/components/PermissionsPicker.js +24 -16
  64. package/lib/types/components/PluginInstallPane.d.ts +21 -0
  65. package/lib/types/components/PluginInstallPane.d.ts.map +1 -0
  66. package/lib/types/components/PluginInstallPane.js +84 -0
  67. package/lib/types/components/PluginManagePane.d.ts +21 -0
  68. package/lib/types/components/PluginManagePane.d.ts.map +1 -0
  69. package/lib/types/components/PluginManagePane.js +69 -0
  70. package/lib/types/components/PromptInput.d.ts.map +1 -1
  71. package/lib/types/components/PromptInput.js +7 -3
  72. package/lib/types/components/SubagentCard.d.ts +13 -1
  73. package/lib/types/components/SubagentCard.d.ts.map +1 -1
  74. package/lib/types/components/SubagentCard.js +27 -12
  75. package/lib/types/components/SubagentDashboard.d.ts +8 -1
  76. package/lib/types/components/SubagentDashboard.d.ts.map +1 -1
  77. package/lib/types/components/SubagentDashboard.js +58 -16
  78. package/lib/types/components/launchpadLayout.d.ts +14 -1
  79. package/lib/types/components/launchpadLayout.d.ts.map +1 -1
  80. package/lib/types/components/launchpadLayout.js +36 -17
  81. package/lib/types/components/messages/TeamMessageBubble.d.ts +20 -0
  82. package/lib/types/components/messages/TeamMessageBubble.d.ts.map +1 -0
  83. package/lib/types/components/messages/TeamMessageBubble.js +15 -0
  84. package/lib/types/components/sidePanel/PanelHost.d.ts.map +1 -1
  85. package/lib/types/components/sidePanel/PanelHost.js +5 -1
  86. package/lib/types/components/sidePanel/PanelStore.d.ts +8 -0
  87. package/lib/types/components/sidePanel/PanelStore.d.ts.map +1 -1
  88. package/lib/types/components/sidePanel/PanelStore.js +11 -0
  89. package/lib/types/components/sidePanel/SidePanelColumn.d.ts.map +1 -1
  90. package/lib/types/components/sidePanel/SidePanelColumn.js +13 -1
  91. package/lib/types/components/sidePanel/SidePanelRuntimeContext.d.ts +7 -0
  92. package/lib/types/components/sidePanel/SidePanelRuntimeContext.d.ts.map +1 -1
  93. package/lib/types/components/sidePanel/SidePanelRuntimeContext.js +4 -0
  94. package/lib/types/components/sidePanel/btw/BtwComposer.d.ts +3 -0
  95. package/lib/types/components/sidePanel/btw/BtwComposer.d.ts.map +1 -1
  96. package/lib/types/components/sidePanel/btw/BtwComposer.js +20 -8
  97. package/lib/types/components/sidePanel/btw/BtwPanelAdapter.d.ts +2 -1
  98. package/lib/types/components/sidePanel/btw/BtwPanelAdapter.d.ts.map +1 -1
  99. package/lib/types/components/sidePanel/btw/BtwPanelAdapter.js +104 -13
  100. package/lib/types/components/sidePanel/btw/BtwThreadScene.d.ts +6 -2
  101. package/lib/types/components/sidePanel/btw/BtwThreadScene.d.ts.map +1 -1
  102. package/lib/types/components/sidePanel/btw/BtwThreadScene.js +61 -15
  103. package/lib/types/components/sidePanel/btw/BtwThreadView.d.ts +14 -4
  104. package/lib/types/components/sidePanel/btw/BtwThreadView.d.ts.map +1 -1
  105. package/lib/types/components/sidePanel/btw/BtwThreadView.js +90 -5
  106. package/lib/types/components/sidePanel/btw/threads.d.ts +18 -0
  107. package/lib/types/components/sidePanel/btw/threads.d.ts.map +1 -1
  108. package/lib/types/components/sidePanel/btw/threads.js +51 -0
  109. package/lib/types/components/sidePanel/builtinPanels.d.ts.map +1 -1
  110. package/lib/types/components/sidePanel/builtinPanels.js +5 -1
  111. package/lib/types/components/sidePanel/companion/SplashMascot.d.ts +5 -1
  112. package/lib/types/components/sidePanel/companion/SplashMascot.d.ts.map +1 -1
  113. package/lib/types/components/sidePanel/companion/SplashMascot.js +19 -4
  114. package/lib/types/components/sidePanel/companion/skins.d.ts +8 -0
  115. package/lib/types/components/sidePanel/companion/skins.d.ts.map +1 -1
  116. package/lib/types/components/sidePanel/companion/skins.js +57 -12
  117. package/lib/types/components/sidePanel/types.d.ts +6 -0
  118. package/lib/types/components/sidePanel/types.d.ts.map +1 -1
  119. package/lib/types/components/splashArtRows.d.ts +29 -0
  120. package/lib/types/components/splashArtRows.d.ts.map +1 -0
  121. package/lib/types/components/splashArtRows.js +31 -0
  122. package/lib/types/components/teamRoster.d.ts +70 -0
  123. package/lib/types/components/teamRoster.d.ts.map +1 -0
  124. package/lib/types/components/teamRoster.js +78 -0
  125. package/lib/types/dsh-adapter/admission-loader.d.ts +82 -0
  126. package/lib/types/dsh-adapter/admission-loader.d.ts.map +1 -1
  127. package/lib/types/dsh-adapter/admission-loader.js +73 -28
  128. package/lib/types/dsh-adapter/agent-view.d.ts.map +1 -1
  129. package/lib/types/dsh-adapter/agent-view.js +3 -1
  130. package/lib/types/dsh-adapter/approvals.d.ts +7 -0
  131. package/lib/types/dsh-adapter/approvals.d.ts.map +1 -1
  132. package/lib/types/dsh-adapter/approvals.js +45 -1
  133. package/lib/types/dsh-adapter/backend/translate.d.ts.map +1 -1
  134. package/lib/types/dsh-adapter/backend/translate.js +68 -8
  135. package/lib/types/dsh-adapter/backend-assembly.d.ts +31 -0
  136. package/lib/types/dsh-adapter/backend-assembly.d.ts.map +1 -0
  137. package/lib/types/dsh-adapter/backend-assembly.js +225 -0
  138. package/lib/types/dsh-adapter/backend-contribution.d.ts +36 -0
  139. package/lib/types/dsh-adapter/backend-contribution.d.ts.map +1 -1
  140. package/lib/types/dsh-adapter/backend-contribution.js +41 -0
  141. package/lib/types/dsh-adapter/backend-registry.d.ts.map +1 -1
  142. package/lib/types/dsh-adapter/backend-registry.js +22 -3
  143. package/lib/types/dsh-adapter/backends.d.ts.map +1 -1
  144. package/lib/types/dsh-adapter/backends.js +4 -5
  145. package/lib/types/dsh-adapter/bundled-presets.d.ts.map +1 -1
  146. package/lib/types/dsh-adapter/bundled-presets.js +60 -3
  147. package/lib/types/dsh-adapter/channel/binding-events.d.ts +1 -0
  148. package/lib/types/dsh-adapter/channel/binding-events.d.ts.map +1 -1
  149. package/lib/types/dsh-adapter/channel/binding-events.js +1 -0
  150. package/lib/types/dsh-adapter/channel/command-completions.d.ts.map +1 -1
  151. package/lib/types/dsh-adapter/channel/command-completions.js +64 -7
  152. package/lib/types/dsh-adapter/channel/compaction.d.ts +7 -2
  153. package/lib/types/dsh-adapter/channel/compaction.d.ts.map +1 -1
  154. package/lib/types/dsh-adapter/channel/compaction.js +100 -26
  155. package/lib/types/dsh-adapter/channel/core/binding-feed.d.ts +3 -0
  156. package/lib/types/dsh-adapter/channel/core/binding-feed.d.ts.map +1 -1
  157. package/lib/types/dsh-adapter/channel/core/binding-feed.js +2 -1
  158. package/lib/types/dsh-adapter/channel/core/compose.d.ts.map +1 -1
  159. package/lib/types/dsh-adapter/channel/core/compose.js +12 -0
  160. package/lib/types/dsh-adapter/channel/extensions.d.ts.map +1 -1
  161. package/lib/types/dsh-adapter/channel/extensions.js +68 -8
  162. package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts +6 -0
  163. package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts.map +1 -1
  164. package/lib/types/dsh-adapter/channel/mode-permission-actions.js +104 -12
  165. package/lib/types/dsh-adapter/channel/model-actions.d.ts.map +1 -1
  166. package/lib/types/dsh-adapter/channel/model-actions.js +8 -1
  167. package/lib/types/dsh-adapter/channel/permissions.d.ts.map +1 -1
  168. package/lib/types/dsh-adapter/channel/permissions.js +4 -1
  169. package/lib/types/dsh-adapter/channel/projection-helpers.d.ts.map +1 -1
  170. package/lib/types/dsh-adapter/channel/projection-helpers.js +2 -0
  171. package/lib/types/dsh-adapter/channel/session-metadata.d.ts.map +1 -1
  172. package/lib/types/dsh-adapter/channel/session-metadata.js +4 -3
  173. package/lib/types/dsh-adapter/channel/session-reset.js +2 -2
  174. package/lib/types/dsh-adapter/channel/session-resume.d.ts.map +1 -1
  175. package/lib/types/dsh-adapter/channel/session-resume.js +7 -0
  176. package/lib/types/dsh-adapter/channel/settings-host.d.ts +3 -0
  177. package/lib/types/dsh-adapter/channel/settings-host.d.ts.map +1 -1
  178. package/lib/types/dsh-adapter/channel/settings-host.js +135 -5
  179. package/lib/types/dsh-adapter/channel/state.d.ts +6 -0
  180. package/lib/types/dsh-adapter/channel/state.d.ts.map +1 -1
  181. package/lib/types/dsh-adapter/channel/subagent-projection.d.ts.map +1 -1
  182. package/lib/types/dsh-adapter/channel/subagent-projection.js +18 -6
  183. package/lib/types/dsh-adapter/channel/transcript.d.ts +7 -0
  184. package/lib/types/dsh-adapter/channel/transcript.d.ts.map +1 -1
  185. package/lib/types/dsh-adapter/channel/transcript.js +19 -2
  186. package/lib/types/dsh-adapter/compat/agent-team-0.2.0.d.ts +55 -0
  187. package/lib/types/dsh-adapter/compat/agent-team-0.2.0.d.ts.map +1 -0
  188. package/lib/types/dsh-adapter/compat/agent-team-0.2.0.js +96 -0
  189. package/lib/types/dsh-adapter/contract.d.ts +4 -4
  190. package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
  191. package/lib/types/dsh-adapter/contract.js +5 -5
  192. package/lib/types/dsh-adapter/effect-ledger.d.ts +7 -0
  193. package/lib/types/dsh-adapter/effect-ledger.d.ts.map +1 -1
  194. package/lib/types/dsh-adapter/effect-ledger.js +8 -1
  195. package/lib/types/dsh-adapter/entry-slot.d.ts +3 -1
  196. package/lib/types/dsh-adapter/entry-slot.d.ts.map +1 -1
  197. package/lib/types/dsh-adapter/entry-slot.js +2 -2
  198. package/lib/types/dsh-adapter/fresh-agent.d.ts.map +1 -1
  199. package/lib/types/dsh-adapter/fresh-agent.js +6 -1
  200. package/lib/types/dsh-adapter/host-access.d.ts.map +1 -1
  201. package/lib/types/dsh-adapter/host-access.js +99 -0
  202. package/lib/types/dsh-adapter/host-contract.d.ts +1 -1
  203. package/lib/types/dsh-adapter/host-contract.d.ts.map +1 -1
  204. package/lib/types/dsh-adapter/host-contract.js +4 -3
  205. package/lib/types/dsh-adapter/host-dsh.d.ts +8 -2
  206. package/lib/types/dsh-adapter/host-dsh.d.ts.map +1 -1
  207. package/lib/types/dsh-adapter/host-dsh.js +45 -30
  208. package/lib/types/dsh-adapter/host-entry.js +40 -13
  209. package/lib/types/dsh-adapter/index.d.ts +9 -10
  210. package/lib/types/dsh-adapter/index.d.ts.map +1 -1
  211. package/lib/types/dsh-adapter/index.js +8 -6
  212. package/lib/types/dsh-adapter/install/pnpm-profile-add.d.ts.map +1 -1
  213. package/lib/types/dsh-adapter/install/pnpm-profile-add.js +9 -3
  214. package/lib/types/dsh-adapter/invariant.d.ts +7 -2
  215. package/lib/types/dsh-adapter/invariant.d.ts.map +1 -1
  216. package/lib/types/dsh-adapter/invariant.js +6 -3
  217. package/lib/types/dsh-adapter/migrate/index.js +2 -2
  218. package/lib/types/dsh-adapter/panels.d.ts.map +1 -1
  219. package/lib/types/dsh-adapter/panels.js +6 -0
  220. package/lib/types/dsh-adapter/plugin-declaration.d.ts +99 -1
  221. package/lib/types/dsh-adapter/plugin-declaration.d.ts.map +1 -1
  222. package/lib/types/dsh-adapter/plugin-declaration.js +132 -2
  223. package/lib/types/dsh-adapter/plugin-feed.d.ts +94 -0
  224. package/lib/types/dsh-adapter/plugin-feed.d.ts.map +1 -0
  225. package/lib/types/dsh-adapter/plugin-feed.js +135 -0
  226. package/lib/types/dsh-adapter/plugin-guard.d.ts +115 -0
  227. package/lib/types/dsh-adapter/plugin-guard.d.ts.map +1 -0
  228. package/lib/types/dsh-adapter/plugin-guard.js +108 -0
  229. package/lib/types/dsh-adapter/plugin-install.d.ts +160 -0
  230. package/lib/types/dsh-adapter/plugin-install.d.ts.map +1 -0
  231. package/lib/types/dsh-adapter/plugin-install.js +545 -0
  232. package/lib/types/dsh-adapter/plugin-manage.d.ts +178 -0
  233. package/lib/types/dsh-adapter/plugin-manage.d.ts.map +1 -0
  234. package/lib/types/dsh-adapter/plugin-manage.js +468 -0
  235. package/lib/types/dsh-adapter/plugin-manager.d.ts +78 -2
  236. package/lib/types/dsh-adapter/plugin-manager.d.ts.map +1 -1
  237. package/lib/types/dsh-adapter/plugin-manager.js +32 -0
  238. package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
  239. package/lib/types/dsh-adapter/plugin.js +49 -2
  240. package/lib/types/dsh-adapter/plugins-info.d.ts +87 -1
  241. package/lib/types/dsh-adapter/plugins-info.d.ts.map +1 -1
  242. package/lib/types/dsh-adapter/plugins-info.js +131 -26
  243. package/lib/types/dsh-adapter/process-exit.d.ts +1 -1
  244. package/lib/types/dsh-adapter/process-exit.d.ts.map +1 -1
  245. package/lib/types/dsh-adapter/process-exit.js +1 -1
  246. package/lib/types/dsh-adapter/session-projection-store.d.ts +66 -0
  247. package/lib/types/dsh-adapter/session-projection-store.d.ts.map +1 -0
  248. package/lib/types/dsh-adapter/session-projection-store.js +149 -0
  249. package/lib/types/dsh-adapter/settingsEditor.js +2 -2
  250. package/lib/types/dsh-adapter/sideQuestion.d.ts +21 -0
  251. package/lib/types/dsh-adapter/sideQuestion.d.ts.map +1 -1
  252. package/lib/types/dsh-adapter/sideQuestion.js +53 -0
  253. package/lib/types/dsh-adapter/subagents.d.ts.map +1 -1
  254. package/lib/types/dsh-adapter/subagents.js +2 -1
  255. package/lib/types/dsh-adapter/team-mode.d.ts +74 -0
  256. package/lib/types/dsh-adapter/team-mode.d.ts.map +1 -0
  257. package/lib/types/dsh-adapter/team-mode.js +188 -0
  258. package/lib/types/dsh-adapter/team-roster.d.ts +67 -0
  259. package/lib/types/dsh-adapter/team-roster.d.ts.map +1 -0
  260. package/lib/types/dsh-adapter/team-roster.js +136 -0
  261. package/lib/types/dsh-adapter/team-tools.d.ts +58 -0
  262. package/lib/types/dsh-adapter/team-tools.d.ts.map +1 -0
  263. package/lib/types/dsh-adapter/team-tools.js +208 -0
  264. package/lib/types/dsh-adapter/types.d.ts +1 -1
  265. package/lib/types/dsh-adapter/types.d.ts.map +1 -1
  266. package/lib/types/i18n.d.ts +607 -16
  267. package/lib/types/i18n.d.ts.map +1 -1
  268. package/lib/types/i18n.js +295 -9
  269. package/lib/types/ink/components/ScrollBox.d.ts +9 -0
  270. package/lib/types/ink/components/ScrollBox.d.ts.map +1 -1
  271. package/lib/types/ink/components/ScrollBox.js +23 -0
  272. package/lib/types/ink/dom.d.ts.map +1 -1
  273. package/lib/types/kernelPrefs.d.ts +1 -1
  274. package/lib/types/kernelPrefs.d.ts.map +1 -1
  275. package/lib/types/native-ts/yoga-layout/index.d.ts.map +1 -1
  276. package/lib/types/native-ts/yoga-layout/index.js +8 -1
  277. package/lib/types/permissionPresetLabels.d.ts +25 -0
  278. package/lib/types/permissionPresetLabels.d.ts.map +1 -0
  279. package/lib/types/permissionPresetLabels.js +33 -0
  280. package/lib/types/preset-patch.d.ts +22 -0
  281. package/lib/types/preset-patch.d.ts.map +1 -0
  282. package/lib/types/preset-patch.js +14 -0
  283. package/lib/types/screens/Chat.d.ts +33 -1
  284. package/lib/types/screens/Chat.d.ts.map +1 -1
  285. package/lib/types/screens/Chat.js +301 -9
  286. package/lib/types/screens/Launchpad.d.ts +7 -1
  287. package/lib/types/screens/Launchpad.d.ts.map +1 -1
  288. package/lib/types/screens/Launchpad.js +19 -4
  289. package/lib/types/screens/Settings.d.ts.map +1 -1
  290. package/lib/types/screens/Settings.js +1 -0
  291. package/lib/types/screens/chat/usePluginWriteFlow.d.ts +68 -0
  292. package/lib/types/screens/chat/usePluginWriteFlow.d.ts.map +1 -0
  293. package/lib/types/screens/chat/usePluginWriteFlow.js +92 -0
  294. package/lib/types/screens/chatOverlay.d.ts +19 -1
  295. package/lib/types/screens/chatOverlay.d.ts.map +1 -1
  296. package/lib/types/sessionModes.d.ts +5 -3
  297. package/lib/types/sessionModes.d.ts.map +1 -1
  298. package/lib/types/sessionModes.js +9 -3
  299. package/lib/types/tips.js +2 -2
  300. package/lib/types/update.d.ts +31 -22
  301. package/lib/types/update.d.ts.map +1 -1
  302. package/lib/types/update.js +85 -42
  303. package/lib/types/utils/paths.d.ts +11 -0
  304. package/lib/types/utils/paths.d.ts.map +1 -1
  305. package/lib/types/utils/paths.js +13 -0
  306. package/package.json +126 -120
  307. package/tui-profile/feed/README.md +63 -0
  308. package/tui-profile/feed/first-party.json +10 -0
@@ -1,4 +1,13 @@
1
1
  import type { SplashFont } from './splashFonts.js';
2
+ /**
3
+ * 块体大字的行数:上排 5 + 空 1 + 下排 5。
4
+ *
5
+ * 导出是给回归钉的:`portrait` 立绘槽高(`splashArtRows.ts` 的
6
+ * `PORTRAIT_ART_ROWS`)**等于这个数**——`LogoV2` 把娘立绘钳在与文字列等高的
7
+ * 槽里(`textColumnRows` = 两排大字 + 空行),落地页是 `chrome="minimal"`,
8
+ * 槽高就是大字块的行数。两处一漂移,预算就重新和渲染分叉。
9
+ */
10
+ export declare const BIG_TITLE_ROWS = 11;
2
11
  /** 输入框卡片占的行数:边框 2 + 输入 1(第三版:参数行移出框外)。 */
3
12
  export declare const CARD_ROWS = 3;
4
13
  /** 框下参数行的行数(模型/思考深度/模式/权限全空时整行不画)。 */
@@ -50,7 +59,9 @@ export interface LaunchpadLayout {
50
59
  * @param rows - 内容区行数。
51
60
  * @param options - whale / whaleGirl 对应设置项;font 是当天那款字体(字身宽度
52
61
  * 不同,宽轴阈值也跟着不同);params 是框下有没有参数行(模型/思考深度/模式/
53
- * 权限全拿不到时为 false,成组行矮一行)。
62
+ * 权限全拿不到时为 false,成组行矮一行);`artRows` 是**当天真正上场的立绘**
63
+ * 占的行数(`splashArtRows.ts` 解,缺省按像素鲸鱼 13 行);`cornerRows` 是
64
+ * 右下角铭牌自身的行数(第一行 + 内核数,缺省按老口径 2 行)。
54
65
  * @returns 该尺寸下要渲染的部件。
55
66
  */
56
67
  export declare function resolveLaunchpadLayout(columns: number, rows: number, options: {
@@ -58,5 +69,7 @@ export declare function resolveLaunchpadLayout(columns: number, rows: number, op
58
69
  whaleGirl?: boolean;
59
70
  font: SplashFont;
60
71
  params?: boolean;
72
+ artRows?: number;
73
+ cornerRows?: number;
61
74
  }): LaunchpadLayout;
62
75
  //# sourceMappingURL=launchpadLayout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"launchpadLayout.d.ts","sourceRoot":"","sources":["../../../src/components/launchpadLayout.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AA0ClD,0CAA0C;AAC1C,eAAO,MAAM,SAAS,IAAI,CAAA;AAC1B,sCAAsC;AACtC,eAAO,MAAM,UAAU,IAAI,CAAA;AAwC3B,iBAAiB;AACjB,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAA;AAErF,yBAAyB;AACzB,MAAM,WAAW,eAAe;IAC9B,gBAAgB;IAChB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;IAC9B,sCAAsC;IACtC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,kCAAkC;IAClC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,+BAA+B;IAC/B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC,gBAAgB;IAChB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,4BAA4B;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,0BAA0B;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,6BAA6B;IAC7B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;IAC7B,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,yCAAyC;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,6BAA6B;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACnF,eAAe,CA2FjB"}
1
+ {"version":3,"file":"launchpadLayout.d.ts","sourceRoot":"","sources":["../../../src/components/launchpadLayout.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAyClD;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,KAAK,CAAA;AAIhC,0CAA0C;AAC1C,eAAO,MAAM,SAAS,IAAI,CAAA;AAC1B,sCAAsC;AACtC,eAAO,MAAM,UAAU,IAAI,CAAA;AA2C3B,iBAAiB;AACjB,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAA;AAErF,yBAAyB;AACzB,MAAM,WAAW,eAAe;IAC9B,gBAAgB;IAChB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;IAC9B,sCAAsC;IACtC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,kCAAkC;IAClC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,+BAA+B;IAC/B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC,gBAAgB;IAChB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,4BAA4B;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,0BAA0B;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,6BAA6B;IAC7B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;IAC7B,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,yCAAyC;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,6BAA6B;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,KAAK,EAAE,OAAO,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,IAAI,EAAE,UAAU,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,GACA,eAAe,CA6FjB"}
@@ -1,5 +1,6 @@
1
1
  import { bigTextWidth } from './bigfont.js';
2
2
  import { WHALE_BOX_WIDTH } from './splashLayout.js';
3
+ import { WHALE_ART_ROWS } from './splashArtRows.js';
3
4
  /**
4
5
  * 落地页的降级阶梯——两个轴一起解:
5
6
  *
@@ -32,10 +33,21 @@ import { WHALE_BOX_WIDTH } from './splashLayout.js';
32
33
  * 所有列数按**内容区**算(PageMargin 已经把 TerminalSizeContext 收窄);行数
33
34
  * 同理。落地页不自己减页边距。
34
35
  */
35
- /** 鲸鱼/女仆娘立绘(含盒)的行数。 */
36
- const WHALE_ART_ROWS = 13;
37
- /** 块体大字的行数:上排 5 + 空 1 + 下排 5。 */
38
- const BIG_TITLE_ROWS = 11;
36
+ /**
37
+ * 立绘槽的默认行数(像素鲸鱼 13 行)。**真实行数由调用方传 `artRows`**——
38
+ * 槽高随形态变(女仆娘/Claude 娘 11、吉祥物 15),写死 13 会让默认的吉祥物
39
+ * 路径少算 2 行(见 `splashArtRows.ts` 的表与那段修复说明)。
40
+ */
41
+ const DEFAULT_ART_ROWS = WHALE_ART_ROWS;
42
+ /**
43
+ * 块体大字的行数:上排 5 + 空 1 + 下排 5。
44
+ *
45
+ * 导出是给回归钉的:`portrait` 立绘槽高(`splashArtRows.ts` 的
46
+ * `PORTRAIT_ART_ROWS`)**等于这个数**——`LogoV2` 把娘立绘钳在与文字列等高的
47
+ * 槽里(`textColumnRows` = 两排大字 + 空行),落地页是 `chrome="minimal"`,
48
+ * 槽高就是大字块的行数。两处一漂移,预算就重新和渲染分叉。
49
+ */
50
+ export const BIG_TITLE_ROWS = 11;
39
51
  /** 只留文字的档位:一行纯标题。 */
40
52
  const PLAIN_TITLE_ROWS = 1;
41
53
  /** 输入框卡片占的行数:边框 2 + 输入 1(第三版:参数行移出框外)。 */
@@ -73,18 +85,23 @@ const TIP_BLOCK_ROWS = 3;
73
85
  /** 矮屏撤呼吸后的紧档(自身 1 + 留白 1)。 */
74
86
  const TIP_BLOCK_ROWS_TIGHT = 2;
75
87
  /**
76
- * 双角铭牌:自身 2 行 + 上方 1 行留白。自身 2 行是第七版**版本号竖排**带来
77
- * 的——右下角两行(`dsh-tui v…` 在上、`dsh-core v…` 在下),左下目录铭牌仍
78
- * 1 行、与第一行顶对齐。内核版本读不到时右侧只画 1 行(预算按 2 行上限算,
79
- * 矮屏阶梯的取舍顺序不变:先撤装饰、绝不让输入框被挤掉)。
88
+ * 双角铭牌:自身行数 + 上方 1 行留白。自身 = 第一行(`工作目录:分支` 与
89
+ * `dsh-tui v…` 共用底边)+ **一行一个内核**——第八版给右下角扩了内核区,
90
+ * 行数随内核数变,所以**由调用方传 `cornerRows`**;写死 2 行时,装了多个
91
+ * 内核的机器(DSH + Claude + Codex)会少算两行,和立绘槽那处是同一类账
92
+ * 不平(矮屏阶梯以为放得下、实际溢出)。
80
93
  */
81
- const CORNERS_BLOCK_ROWS = 3;
94
+ const CORNERS_TOP_GAP_ROWS = 1;
95
+ /** 铭牌自身行数的老口径(第一行 + 一个内核行):内核数拿不到时的上限估算。 */
96
+ const DEFAULT_CORNER_ROWS = 2;
82
97
  /**
83
98
  * @param columns - 内容区列数。
84
99
  * @param rows - 内容区行数。
85
100
  * @param options - whale / whaleGirl 对应设置项;font 是当天那款字体(字身宽度
86
101
  * 不同,宽轴阈值也跟着不同);params 是框下有没有参数行(模型/思考深度/模式/
87
- * 权限全拿不到时为 false,成组行矮一行)。
102
+ * 权限全拿不到时为 false,成组行矮一行);`artRows` 是**当天真正上场的立绘**
103
+ * 占的行数(`splashArtRows.ts` 解,缺省按像素鲸鱼 13 行);`cornerRows` 是
104
+ * 右下角铭牌自身的行数(第一行 + 内核数,缺省按老口径 2 行)。
88
105
  * @returns 该尺寸下要渲染的部件。
89
106
  */
90
107
  export function resolveLaunchpadLayout(columns, rows, options) {
@@ -100,21 +117,23 @@ export function resolveLaunchpadLayout(columns, rows, options) {
100
117
  const showPlainTitle = !showBigTitle && !showWhale;
101
118
  const showHero = showWhale || showBigTitle || showPlainTitle;
102
119
  // 上下排布时头部 = 立绘 + 间隔 1 + 大字;退化档位取各自实际行数。
103
- const artRows = showWhale ? WHALE_ART_ROWS : 0;
120
+ // 立绘行数按**当天上场的形态**算(鲸鱼 13 / 娘与吉祥物 15),不写死。
121
+ const artRows = showWhale ? (options.artRows ?? DEFAULT_ART_ROWS) : 0;
104
122
  const titleRows = showBigTitle ? BIG_TITLE_ROWS : PLAIN_TITLE_ROWS;
105
123
  const heroRows = showHero ? (artRows > 0 ? artRows + 1 + titleRows : titleRows) : 0;
106
124
  // 头部整块(含根盒 marginTop)实际占的行数:阶梯与 totalRows 都按它算。
107
125
  const heroBlockRows = showHero ? heroRows + HERO_TOP_MARGIN : 0;
108
126
  // 第六版行数预算:输入框(恒 3)+ 框下成组行(参数 1 + 呼吸留白 0/1 +
109
- // 键帽 1 + Tips 3)+ 双角铭牌 2。撤的顺序「从最可省到最不可省」:
110
- // 新增的两处呼吸(词标↔输入框、入口行↔Tips)→ 参数行呼吸留白 → Tips 行
111
- // 本身 → 键帽行 → 立绘(**所有留白永远排在 Tips/入口行之前撤**,
112
- // 绝不让呼吸把输入框挤掉)。
127
+ // 键帽 1 + Tips 3)+ 双角铭牌(自身行数 + 上方留白)。撤的顺序「从最可省
128
+ // 到最不可省」:新增的两处呼吸(词标↔输入框、入口行↔Tips)→ 参数行呼吸
129
+ // 留白 → Tips 行本身 → 键帽行 → 立绘(**所有留白永远排在 Tips/入口行之
130
+ // 前撤**,绝不让呼吸把输入框挤掉)。
113
131
  const paramRows = options.params === true ? PARAM_ROWS : 0;
114
132
  const gapRows = paramRows > 0 ? PARAM_HINTS_GAP_ROWS : 0;
115
133
  const cardRows = CARD_ROWS;
134
+ const cornersBlockRows = (options.cornerRows ?? DEFAULT_CORNER_ROWS) + CORNERS_TOP_GAP_ROWS;
116
135
  const withArt = artRows > 0 ? artRows + 1 : 0;
117
- const core = heroBlockRows + cardRows + paramRows + CORNERS_BLOCK_ROWS;
136
+ const core = heroBlockRows + cardRows + paramRows + cornersBlockRows;
118
137
  // 每一档的总行数。顺序即从最全的往下掉:先试最全的,放不下就往下掉。
119
138
  // full 带 4 个变体(呼吸×参数留白的紧/松组合)、no-tip 带 3 个:
120
139
  // 呼吸在(默认 2/2)→ 撤呼吸(紧档 1/1)→ 撤参数留白,全部都矮于撤 Tips。
@@ -154,7 +173,7 @@ export function resolveLaunchpadLayout(columns, rows, options) {
154
173
  const heroGapRows = keepBreath ? HERO_TO_CARD_GAP : HERO_TO_CARD_GAP_TIGHT;
155
174
  const tipGapRows = keepBreath ? TIP_BLOCK_ROWS - 1 : TIP_BLOCK_ROWS_TIGHT - 1;
156
175
  const total = (showTip ? 1 + tipGapRows : 0) + hintsGapRows + (showHints ? HINTS_ROWS : 0) + heroBlockFinal
157
- + heroGapRows + cardRows + paramRows + CORNERS_BLOCK_ROWS;
176
+ + heroGapRows + cardRows + paramRows + cornersBlockRows;
158
177
  return {
159
178
  stage,
160
179
  // dropArt 只撤立绘——`heroRowsFinal`/`totalRows` 都按「撤立绘、留大字」算,
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ type Props = {
3
+ /** The sending team member's name. */
4
+ sender: string;
5
+ text: string;
6
+ /** Adds the top margin between turns. */
7
+ marginTopOnTurn: boolean;
8
+ /** Message-selection mode highlight. */
9
+ isSelected?: boolean;
10
+ };
11
+ /**
12
+ * An Agent Teams peer message delivered to this session: a `✉ <sender>` line
13
+ * in the agent tint, then the body in plain text with a hanging indent — it
14
+ * reads apart from the human's bold `❯` prompt it shares a log role with.
15
+ * The body wraps in its own flex column, so it fits whatever column hosts it
16
+ * (the main list, a child scene's padded page, a split with the workbench).
17
+ */
18
+ export declare function TeamMessageBubble({ sender, text, marginTopOnTurn, isSelected }: Props): React.ReactNode;
19
+ export {};
20
+ //# sourceMappingURL=TeamMessageBubble.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TeamMessageBubble.d.ts","sourceRoot":"","sources":["../../../../src/components/messages/TeamMessageBubble.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,KAAK,KAAK,GAAG;IACX,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,yCAAyC;IACzC,eAAe,EAAE,OAAO,CAAA;IACxB,wCAAwC;IACxC,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAID;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,UAAkB,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,SAAS,CAmB/G"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from '../../ui.js';
3
+ import { stringWidth } from '../../ink/stringWidth.js';
4
+ import { t } from '../../i18n.js';
5
+ const MARK = '✉ ';
6
+ /**
7
+ * An Agent Teams peer message delivered to this session: a `✉ <sender>` line
8
+ * in the agent tint, then the body in plain text with a hanging indent — it
9
+ * reads apart from the human's bold `❯` prompt it shares a log role with.
10
+ * The body wraps in its own flex column, so it fits whatever column hosts it
11
+ * (the main list, a child scene's padded page, a split with the workbench).
12
+ */
13
+ export function TeamMessageBubble({ sender, text, marginTopOnTurn, isSelected = false }) {
14
+ return (_jsxs(Box, { flexDirection: "column", marginTop: marginTopOnTurn ? 1 : 0, backgroundColor: isSelected ? 'messageActionsBackground' : undefined, paddingRight: 1, children: [_jsxs(Text, { color: "toolDotTask", wrap: "truncate-end", children: [MARK, _jsx(Text, { bold: true, children: sender }), _jsx(Text, { dimColor: true, children: ` · ${t('team-message-label')}` })] }), _jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { width: stringWidth(MARK), flexShrink: 0 }), _jsx(Box, { flexGrow: 1, flexShrink: 1, children: _jsx(Text, { wrap: "wrap", children: text }) })] })] }));
15
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"PanelHost.d.ts","sourceRoot":"","sources":["../../../../src/components/sidePanel/PanelHost.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;AAKnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAE5D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAA;IACxC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,qCAAqC,EAAE,YAAY,CAAA;IAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/E,yCAAyC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,uCAAuC,EAAE,SAAS,CAAA;IAC/E,oDAAoD;IACpD,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACpD;AA4BD,wBAAgB,SAAS,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE,cAAc,GAAG,KAAK,CAAC,SAAS,CAiFlJ"}
1
+ {"version":3,"file":"PanelHost.d.ts","sourceRoot":"","sources":["../../../../src/components/sidePanel/PanelHost.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;AAKnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAE5D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAA;IACxC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,qCAAqC,EAAE,YAAY,CAAA;IAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/E,yCAAyC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,uCAAuC,EAAE,SAAS,CAAA;IAC/E,oDAAoD;IACpD,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACpD;AA4BD,wBAAgB,SAAS,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE,cAAc,GAAG,KAAK,CAAC,SAAS,CAqFlJ"}
@@ -59,7 +59,11 @@ export function PanelHost({ controller, channel, width, height, activity, attent
59
59
  panelStore.clearBadge(activeId);
60
60
  }, [activeId]);
61
61
  const mode = controller.zoom ? 'zoom' : 'split';
62
- const runtimeContext = React.useMemo(() => ({ runtime: controller.runtime, channel, activity, attention, trajectory, openFullscreen }), [controller.runtime, channel, activity, attention, trajectory, openFullscreen]);
62
+ // focusChat 从控制器注入:面板送聊天后要能把列焦点交回聊天(见
63
+ // SidePanelRuntimeContext 的出口注释)。控制器对象每次渲染都是新的,
64
+ // 但 focusChat 本身是空依赖 useCallback,引用稳定。
65
+ const focusChat = controller.focusChat;
66
+ const runtimeContext = React.useMemo(() => ({ runtime: controller.runtime, channel, activity, attention, trajectory, openFullscreen, focusChat }), [controller.runtime, channel, activity, attention, trajectory, openFullscreen, focusChat]);
63
67
  return (_jsx(SidePanelRuntimeContext.Provider, { value: runtimeContext, children: visibleEntries.map(entry => {
64
68
  const def = entry.definition;
65
69
  const isActive = activeEntry !== undefined && def.id === activeEntry.definition.id;
@@ -25,6 +25,9 @@ export type PanelStoreEvent = {
25
25
  } | {
26
26
  readonly type: 'badge';
27
27
  readonly id: string;
28
+ } | {
29
+ readonly type: 'hint';
30
+ readonly id: string;
28
31
  } | {
29
32
  readonly type: 'error';
30
33
  readonly id: string;
@@ -47,6 +50,11 @@ export declare class PanelStore {
47
50
  * level/unread 都没变时不通知:适配器在每次 channel 变化(流式时每个
48
51
  * delta)都会调这里,每次通知都会让订阅 list() 的宿主重渲染。 */
49
52
  setBadge(id: string, badge: Omit<PanelBadge, 'latestAt'> | null): void;
53
+ /**
54
+ * 面板广告自己当前的键位片段(见 PanelEntry.hint)。每次 channel delta 都会
55
+ * 有适配器调 setBadge,这里同理按值短路:没变就不通知宿主重渲染。
56
+ */
57
+ setHint(id: string, hint: string): void;
50
58
  clearBadge(id: string): void;
51
59
  reportError(id: string, error: unknown): void;
52
60
  subscribe: (listener: (event: PanelStoreEvent) => void) => (() => void);
@@ -1 +1 @@
1
- {"version":3,"file":"PanelStore.d.ts","sourceRoot":"","sources":["../../../../src/components/sidePanel/PanelStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAErF,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAElC,uCAAuC;AACvC,eAAO,MAAM,6BAA6B,IAAI,CAAA;AAC9C,kBAAkB;AAClB,eAAO,MAAM,qBAAqB,QAAS,CAAA;AAE3C;;4CAE4C;AAC5C,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAatD,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,QAAQ,CAAI;IACpB,+CAA+C;IAC/C,OAAO,CAAC,UAAU,CAA8B;IAEhD,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,IAAI;IA0BpE,IAAI,IAAI,SAAS,UAAU,EAAE;IAI7B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIvC;;+CAE2C;IAC3C,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI;IAWtE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAO5B,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAsB7C,SAAS,GAAI,UAAU,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAGrE;IAED,OAAO,CAAC,IAAI;CAIb;AAED,0DAA0D;AAC1D,eAAO,MAAM,UAAU,YAAmB,CAAA"}
1
+ {"version":3,"file":"PanelStore.d.ts","sourceRoot":"","sources":["../../../../src/components/sidePanel/PanelStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAErF,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAElC,uCAAuC;AACvC,eAAO,MAAM,6BAA6B,IAAI,CAAA;AAC9C,kBAAkB;AAClB,eAAO,MAAM,qBAAqB,QAAS,CAAA;AAE3C;;4CAE4C;AAC5C,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAatD,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,QAAQ,CAAI;IACpB,+CAA+C;IAC/C,OAAO,CAAC,UAAU,CAA8B;IAEhD,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,IAAI;IA0BpE,IAAI,IAAI,SAAS,UAAU,EAAE;IAI7B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIvC;;+CAE2C;IAC3C,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI;IAWtE;;;OAGG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAOvC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAO5B,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAsB7C,SAAS,GAAI,UAAU,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAGrE;IAED,OAAO,CAAC,IAAI;CAIb;AAED,0DAA0D;AAC1D,eAAO,MAAM,UAAU,YAAmB,CAAA"}
@@ -69,6 +69,17 @@ export class PanelStore {
69
69
  this.entries.set(id, { ...entry, badge: next });
70
70
  this.emit({ type: 'badge', id });
71
71
  }
72
+ /**
73
+ * 面板广告自己当前的键位片段(见 PanelEntry.hint)。每次 channel delta 都会
74
+ * 有适配器调 setBadge,这里同理按值短路:没变就不通知宿主重渲染。
75
+ */
76
+ setHint(id, hint) {
77
+ const entry = this.entries.get(id);
78
+ if (entry === undefined || entry.hint === hint)
79
+ return;
80
+ this.entries.set(id, { ...entry, hint });
81
+ this.emit({ type: 'hint', id });
82
+ }
72
83
  clearBadge(id) {
73
84
  const entry = this.entries.get(id);
74
85
  if (entry === undefined || entry.badge === null)
@@ -1 +1 @@
1
- {"version":3,"file":"SidePanelColumn.d.ts","sourceRoot":"","sources":["../../../../src/components/sidePanel/SidePanelColumn.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;AAMnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAI5D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAA;IACxC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,qCAAqC,EAAE,YAAY,CAAA;IAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/E,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7C,6BAA6B;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,uCAAuC,EAAE,SAAS,CAAA;CAChF;AAoCD,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,oBAAoB,GAAG,KAAK,CAAC,SAAS,CAuEhJ"}
1
+ {"version":3,"file":"SidePanelColumn.d.ts","sourceRoot":"","sources":["../../../../src/components/sidePanel/SidePanelColumn.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;AAMnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAI5D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAA;IACxC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,qCAAqC,EAAE,YAAY,CAAA;IAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/E,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7C,6BAA6B;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,uCAAuC,EAAE,SAAS,CAAA;CAChF;AAoCD,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,oBAAoB,GAAG,KAAK,CAAC,SAAS,CAmFhJ"}
@@ -55,6 +55,18 @@ export function SidePanelColumn({ width, controller, channel, activity, attentio
55
55
  // oxlint-disable-next-line typescript/no-unnecessary-condition -- runtime guard: partial fixture channels
56
56
  const trajectoryUnsupported = controller.activePanelId === 'trajectory' && channel.trajectorySource?.() === 'unsupported';
57
57
  const canExpand = activeEntry?.definition.capabilities?.fullscreen === true && onExpand !== undefined && !trajectoryUnsupported;
58
+ // 底栏拼序 = 重要性:导航 → 面板自己绑的键 → 列控制。宿主不点名任何面板:
59
+ // 面板经 panelStore 广告自己此刻的键位(例如 btw 在编辑层只说「↑ 回标题」、
60
+ // 在列表层才说 s/c),没广告过的才退回能力位那一段。窄面板从尾部截断,所以
61
+ // 面板键排在列控制前;未聚焦时面板收不到按键,那一格继续只说怎么把焦点拿过来。
62
+ const panelSegment = activeEntry === undefined
63
+ ? ''
64
+ : activeEntry.hint !== undefined
65
+ ? activeEntry.hint
66
+ : activeEntry.definition.capabilities?.sendToChat === true ? t('panel-hint-send-to-chat') : '';
67
+ const focusedHint = t('panel-hint-focused')
68
+ + (panelSegment === '' ? '' : ' · ' + panelSegment)
69
+ + ' · ' + t('panel-hint-zoom-width');
58
70
  // 标签点击与 ←/→ 宿主键走同一条路(openPanel 会顺带把焦点给右栏)。
59
71
  const onSelectPanel = React.useCallback((id) => { controller.openPanel(id, { focus: true }); },
60
72
  // openPanel 在 useSidePanel 里是空依赖 useCallback(引用稳定);
@@ -64,5 +76,5 @@ export function SidePanelColumn({ width, controller, channel, activity, attentio
64
76
  const hostHeight = Math.max(1, rows - 4);
65
77
  return (_jsxs(Box, { flexDirection: "column", width: width, flexGrow: 1, children: [_jsx(PanelBar, { tabs: tabs, activeId: controller.activePanelId, width: width - 2, focused: focused, canExpand: canExpand, onExpand: canExpand ? () => onExpand?.(controller.activePanelId ?? '') : undefined, onSelect: onSelectPanel }), _jsx(Rule, { focused: focused }), _jsx(Box, { flexDirection: "column", flexGrow: 1, overflow: "hidden", children: anyRegistered
66
78
  ? (_jsx(PanelHost, { controller: controller, channel: channel, width: width, height: hostHeight, activity: activity, attention: attention, trajectory: trajectory, openFullscreen: onExpand }))
67
- : _jsx(EmptyNone, {}) }), _jsx(Rule, { focused: focused }), _jsx(Box, { height: 1, flexShrink: 0, paddingX: 1, overflow: "hidden", children: _jsx(Text, { dimColor: true, wrap: "truncate-end", children: focused ? t('panel-hint-focused') : t('panel-hint-unfocused') }) })] }));
79
+ : _jsx(EmptyNone, {}) }), _jsx(Rule, { focused: focused }), _jsx(Box, { height: 1, flexShrink: 0, paddingX: 1, overflow: "hidden", children: _jsx(Text, { dimColor: true, wrap: "truncate-end", children: focused ? focusedHint : t('panel-hint-unfocused') }) })] }));
68
80
  }
@@ -30,6 +30,11 @@ export interface SidePanelRuntimeContextValue {
30
30
  * 未接(或该 Panel 没有整屏形态)时 undefined,按钮照画但点击无效——
31
31
  * 宿主是否可展开由 PanelDefinition.capabilities.fullscreen 决定。 */
32
32
  readonly openFullscreen?: (panelId: string) => void;
33
+ /** 「回主输入框」出口:Panel 把内容送聊天(attachContext)后把列焦点交回
34
+ * 聊天——chip 就在眼前、可直接接着打字,toast 里的「Esc 可撤」也立刻
35
+ * 成立(剥 chip 的那把 Esc 只有主输入框有焦点时才收得到)。宿主
36
+ * (PanelHost)从 controller.focusChat 注入;未接时送完焦点不动。 */
37
+ readonly focusChat?: () => void;
33
38
  }
34
39
  export declare const SidePanelRuntimeContext: React.Context<SidePanelRuntimeContextValue | null>;
35
40
  export declare function useSidePanelChannel(): ChannelUi;
@@ -37,6 +42,8 @@ export declare function useSidePanelChannel(): ChannelUi;
37
42
  export declare function useSidePanelTrajectory(): TrajBuild | undefined;
38
43
  /** 「全屏」出口:宿主没接时返回 undefined(按钮点击静默无效)。 */
39
44
  export declare function useSidePanelFullscreen(): ((panelId: string) => void) | undefined;
45
+ /** 「回主输入框」出口:宿主没接时返回 undefined(送聊天后焦点不动)。 */
46
+ export declare function useSidePanelFocusChat(): (() => void) | undefined;
40
47
  export declare const PanelContext: React.Context<{
41
48
  readonly panelId: string;
42
49
  } | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"SidePanelRuntimeContext.d.ts","sourceRoot":"","sources":["../../../../src/components/sidePanel/SidePanelRuntimeContext.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAA;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAA;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAA;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;IAC3B;sDACkD;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAA;IAChC,oDAAoD;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/E;6CACyC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAA;IAC/B;;+DAE2D;IAC3D,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACpD;AAED,eAAO,MAAM,uBAAuB,oDAAiE,CAAA;AAErG,wBAAgB,mBAAmB,IAAI,SAAS,CAI/C;AAED,sDAAsD;AACtD,wBAAgB,sBAAsB,IAAI,SAAS,GAAG,SAAS,CAE9D;AAED,0CAA0C;AAC1C,wBAAgB,sBAAsB,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAEhF;AAED,eAAO,MAAM,YAAY;sBAA2C,MAAM;SAAgB,CAAA"}
1
+ {"version":3,"file":"SidePanelRuntimeContext.d.ts","sourceRoot":"","sources":["../../../../src/components/sidePanel/SidePanelRuntimeContext.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAA;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAA;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAA;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;IAC3B;sDACkD;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAA;IAChC,oDAAoD;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/E;6CACyC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAA;IAC/B;;+DAE2D;IAC3D,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACnD;;;0DAGsD;IACtD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CAChC;AAED,eAAO,MAAM,uBAAuB,oDAAiE,CAAA;AAErG,wBAAgB,mBAAmB,IAAI,SAAS,CAI/C;AAED,sDAAsD;AACtD,wBAAgB,sBAAsB,IAAI,SAAS,GAAG,SAAS,CAE9D;AAED,0CAA0C;AAC1C,wBAAgB,sBAAsB,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAEhF;AAED,6CAA6C;AAC7C,wBAAgB,qBAAqB,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAEhE;AAED,eAAO,MAAM,YAAY;sBAA2C,MAAM;SAAgB,CAAA"}
@@ -23,4 +23,8 @@ export function useSidePanelTrajectory() {
23
23
  export function useSidePanelFullscreen() {
24
24
  return React.useContext(SidePanelRuntimeContext)?.openFullscreen;
25
25
  }
26
+ /** 「回主输入框」出口:宿主没接时返回 undefined(送聊天后焦点不动)。 */
27
+ export function useSidePanelFocusChat() {
28
+ return React.useContext(SidePanelRuntimeContext)?.focusChat;
29
+ }
26
30
  export const PanelContext = React.createContext(null);
@@ -32,6 +32,9 @@ type BtwKeyFlags = SidePanelKeyFlags & {
32
32
  /**
33
33
  * 单行 composer 的键语义。返回 null = 未消费(面板形态交宿主回退键,
34
34
  * 全屏形态交场景其余分支);返回对象按 exitFocus > submit > 编辑 写回。
35
+ * ←/→ 先移光标,贴到行首/行尾后返回未消费——面板形态据此切面板。
36
+ * ↑ 让位给列表(选中轮,见 BtwPanelAdapter 的选中态);↓ 在单行框里没有
37
+ * 语义,吃掉即可,免得漏给主聊天去滚 transcript。
35
38
  */
36
39
  export declare function btwComposerKey(state: BtwComposerState, input: string, key: BtwKeyFlags): BtwComposerKeyResult | null;
37
40
  export declare function BtwComposer({ state, focused, busy, notice, onActivate, }: {
@@ -1 +1 @@
1
- {"version":3,"file":"BtwComposer.d.ts","sourceRoot":"","sources":["../../../../../src/components/sidePanel/btw/BtwComposer.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGpD,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,8DAA8D;AAC9D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,wCAAwC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,qDAAqD;AACrD,KAAK,WAAW,GAAG,iBAAiB,GAAG;IACrC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,oBAAoB,GAAG,IAAI,CA0BpH;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,OAAO,EACP,IAAI,EACJ,MAAM,EACN,UAAU,GACX,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAA;IAChC,2BAA2B;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,2BAA2B;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAA;IAClF,iCAAiC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;CACjC,GAAG,KAAK,CAAC,SAAS,CA6ClB"}
1
+ {"version":3,"file":"BtwComposer.d.ts","sourceRoot":"","sources":["../../../../../src/components/sidePanel/btw/BtwComposer.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGpD,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,8DAA8D;AAC9D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,wCAAwC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,qDAAqD;AACrD,KAAK,WAAW,GAAG,iBAAiB,GAAG;IACrC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,oBAAoB,GAAG,IAAI,CAsCpH;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,OAAO,EACP,IAAI,EACJ,MAAM,EACN,UAAU,GACX,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAA;IAChC,2BAA2B;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,2BAA2B;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAA;IAClF,iCAAiC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;CACjC,GAAG,KAAK,CAAC,SAAS,CA6ClB"}
@@ -5,6 +5,9 @@ import { nextCodePoint, previousCodePoint } from '../../AgentMessageComposer.js'
5
5
  /**
6
6
  * 单行 composer 的键语义。返回 null = 未消费(面板形态交宿主回退键,
7
7
  * 全屏形态交场景其余分支);返回对象按 exitFocus > submit > 编辑 写回。
8
+ * ←/→ 先移光标,贴到行首/行尾后返回未消费——面板形态据此切面板。
9
+ * ↑ 让位给列表(选中轮,见 BtwPanelAdapter 的选中态);↓ 在单行框里没有
10
+ * 语义,吃掉即可,免得漏给主聊天去滚 transcript。
8
11
  */
9
12
  export function btwComposerKey(state, input, key) {
10
13
  if (key.escape === true)
@@ -19,6 +22,11 @@ export function btwComposerKey(state, input, key) {
19
22
  // Tab 离开编辑层去列表(与 TrajectoryPanel 同款双形态判定)。
20
23
  if (key.tab === true || input === '\t')
21
24
  return { exitFocus: true };
25
+ // ↑ 也从编辑层上到列表:光标落在本轮标题上(列表形态默认选中最后一条)。
26
+ if (key.upArrow === true)
27
+ return { exitFocus: true };
28
+ if (key.downArrow === true)
29
+ return {};
22
30
  if (key.backspace === true || key.delete === true) {
23
31
  if (caret <= 0)
24
32
  return { state: { ...state, caret } };
@@ -29,10 +37,17 @@ export function btwComposerKey(state, input, key) {
29
37
  // leftArrow 判定不看 shift)——编辑中途也能一键换面板,不必先 Esc 收起。
30
38
  if ((key.leftArrow === true || key.rightArrow === true) && key.shift === true)
31
39
  return null;
32
- if (key.leftArrow === true)
33
- return { state: { ...state, caret: previousCodePoint(state.text, caret) } };
34
- if (key.rightArrow === true)
35
- return { state: { ...state, caret: nextCodePoint(state.text, caret) } };
40
+ // 光标先走、到头让位:还能移就移一格,已经贴着行首/行尾则返回未消费——
41
+ // 面板形态下落宿主切面板,底栏「←/→ 切换」因此在编辑层同样成立;场景
42
+ // 形态下无人接管,等于空操作。
43
+ if (key.leftArrow === true) {
44
+ const previous = previousCodePoint(state.text, caret);
45
+ return previous === caret ? null : { state: { ...state, caret: previous } };
46
+ }
47
+ if (key.rightArrow === true) {
48
+ const next = nextCodePoint(state.text, caret);
49
+ return next === caret ? null : { state: { ...state, caret: next } };
50
+ }
36
51
  if (key.home === true)
37
52
  return { state: { ...state, caret: 0 } };
38
53
  if (key.end === true)
@@ -46,8 +61,5 @@ export function BtwComposer({ state, focused, busy, notice, onActivate, }) {
46
61
  const { text, caret } = state;
47
62
  const shown = Math.min(caret, text.length);
48
63
  const afterCaret = nextCodePoint(text, shown);
49
- return (_jsxs(Box, { flexDirection: "column", flexShrink: 0, children: [_jsx(Box, { width: "100%", flexShrink: 0, borderStyle: "round", borderColor: focused ? 'accent' : undefined, onClick: onActivate === undefined ? undefined : event => {
50
- event.stopImmediatePropagation();
51
- onActivate();
52
- }, children: _jsxs(Box, { flexDirection: "row", flexShrink: 0, paddingLeft: 1, paddingRight: 1, children: [_jsx(Text, { color: focused ? 'accent' : undefined, bold: true, children: '›' }), _jsx(Text, { children: ' ' }), focused ? (_jsxs(_Fragment, { children: [_jsxs(Box, { flexDirection: "row", flexShrink: 1, minWidth: 0, children: [_jsx(Text, { wrap: "truncate", children: text.slice(0, shown) }), _jsx(InputCaret, { children: text.slice(shown, afterCaret) || ' ' }), text.slice(afterCaret) !== '' ? _jsx(Text, { wrap: "truncate", children: text.slice(afterCaret) }) : null] }), _jsx(Box, { flexGrow: 1, flexShrink: 0, children: _jsx(Text, { children: " " }) }), _jsx(Box, { flexShrink: 0, children: _jsxs(Text, { dimColor: true, children: [" ", t('btw-input-hint-edit')] }) })] })) : (_jsx(Text, { dimColor: true, wrap: "truncate", children: text === '' ? t('btw-input-placeholder') : text }))] }) }), notice !== undefined && (_jsx(Text, { color: notice.failure ? 'error' : undefined, wrap: "truncate", children: notice.text }))] }));
64
+ return (_jsxs(Box, { flexDirection: "column", flexShrink: 0, children: [_jsx(Box, { width: "100%", flexShrink: 0, borderStyle: "round", borderColor: focused ? 'accent' : undefined, onClick: onActivate === undefined ? undefined : () => onActivate(), children: _jsxs(Box, { flexDirection: "row", flexShrink: 0, paddingLeft: 1, paddingRight: 1, children: [_jsx(Text, { color: focused ? 'accent' : undefined, bold: true, children: '›' }), _jsx(Text, { children: ' ' }), focused ? (_jsxs(_Fragment, { children: [_jsxs(Box, { flexDirection: "row", flexShrink: 1, minWidth: 0, children: [_jsx(Text, { wrap: "truncate", children: text.slice(0, shown) }), _jsx(InputCaret, { children: text.slice(shown, afterCaret) || ' ' }), text.slice(afterCaret) !== '' ? _jsx(Text, { wrap: "truncate", children: text.slice(afterCaret) }) : null] }), _jsx(Box, { flexGrow: 1, flexShrink: 0, children: _jsx(Text, { children: " " }) }), _jsx(Box, { flexShrink: 0, children: _jsxs(Text, { dimColor: true, children: [" ", t('btw-input-hint-edit')] }) })] })) : (_jsx(Text, { dimColor: true, wrap: "truncate", children: text === '' ? t('btw-input-placeholder') : text }))] }) }), notice !== undefined && (_jsx(Text, { color: notice.failure ? 'error' : undefined, wrap: "truncate", children: notice.text }))] }));
53
65
  }
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * btw 侧栏面板:线程滚动 + Markdown + 底部 composer 连续追问。Esc 先退出
3
3
  * composer 编辑(草稿保留),列表层不消费 Esc,再交宿主回聊天;Tab 在列表
4
- * 与 composer 间切焦点;未消费的键交宿主(←/→ 仍切面板)。
4
+ * 与 composer 间切焦点;未消费的键交宿主(←/→ 切面板——编辑层里光标贴到
5
+ * 行首/行尾后也让位)。
5
6
  *
6
7
  * badge 派生(镜像 jobs/agents 适配器):面板不可见期间完成的新 answer
7
8
  * 增 info unread、失败 error level 计未读、运行中只亮点不计未读;进入
@@ -1 +1 @@
1
- {"version":3,"file":"BtwPanelAdapter.d.ts","sourceRoot":"","sources":["../../../../../src/components/sidePanel/btw/BtwPanelAdapter.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AAazB,OAAO,KAAK,EAAmB,UAAU,EAAE,MAAM,aAAa,CAAA;AAY9D,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,UAAU,GAAG,KAAK,CAAC,SAAS,CAsLhG"}
1
+ {"version":3,"file":"BtwPanelAdapter.d.ts","sourceRoot":"","sources":["../../../../../src/components/sidePanel/btw/BtwPanelAdapter.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AAazB,OAAO,KAAK,EAAmB,UAAU,EAAE,MAAM,aAAa,CAAA;AAY9D,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,UAAU,GAAG,KAAK,CAAC,SAAS,CAiRhG"}