@vibe-forge/client 2.0.0 → 2.0.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 (347) hide show
  1. package/AGENTS.md +4 -1
  2. package/dist/assets/{arc-CbOXL0l9.js → arc-CqviK3HX.js} +1 -1
  3. package/dist/assets/{blockDiagram-c4efeb88-CqxINvsS.js → blockDiagram-c4efeb88-BEp50UHp.js} +1 -1
  4. package/dist/assets/{c4Diagram-c83219d4-BKazU0hb.js → c4Diagram-c83219d4-C5w55JzM.js} +1 -1
  5. package/dist/assets/channel-C6LTxxLg.js +1 -0
  6. package/dist/assets/{classDiagram-beda092f-fAFX5BpB.js → classDiagram-beda092f-CQJVtHEy.js} +1 -1
  7. package/dist/assets/{classDiagram-v2-2358418a-w1VkNGJj.js → classDiagram-v2-2358418a-B37Xl9jB.js} +1 -1
  8. package/dist/assets/clone-CG6ZcokX.js +1 -0
  9. package/dist/assets/{createText-1719965b-CEinakVP.js → createText-1719965b-9YwvWMdV.js} +1 -1
  10. package/dist/assets/{cssMode-DPqRki4y.js → cssMode-BX88r5f4.js} +1 -1
  11. package/dist/assets/{edges-96097737-Cb0F1_3K.js → edges-96097737-CNHoXVrD.js} +1 -1
  12. package/dist/assets/{erDiagram-0228fc6a-C-N2fx-J.js → erDiagram-0228fc6a-BoYldy0g.js} +1 -1
  13. package/dist/assets/{flowDb-c6c81e3f-D1Xz_8Gf.js → flowDb-c6c81e3f-CoPw_R-Q.js} +1 -1
  14. package/dist/assets/{flowDiagram-50d868cf-DyPSZyAj.js → flowDiagram-50d868cf-nCqbSXd-.js} +1 -1
  15. package/dist/assets/flowDiagram-v2-4f6560a1-CSZTI7GQ.js +1 -0
  16. package/dist/assets/{flowchart-elk-definition-6af322e1-Dr1DDXwE.js → flowchart-elk-definition-6af322e1-BwMuPTrV.js} +1 -1
  17. package/dist/assets/{freemarker2-C3DvPFaK.js → freemarker2-DUFDSvgj.js} +1 -1
  18. package/dist/assets/{ganttDiagram-a2739b55-DmvY1GRj.js → ganttDiagram-a2739b55-CLNH3S_C.js} +1 -1
  19. package/dist/assets/{gitGraphDiagram-82fe8481-CoXfPYYi.js → gitGraphDiagram-82fe8481-uDu1ectX.js} +1 -1
  20. package/dist/assets/{graph-BkDQy7Qt.js → graph-DuC4kt4I.js} +1 -1
  21. package/dist/assets/{handlebars-BcTFdqjl.js → handlebars-BSd4a6l9.js} +1 -1
  22. package/dist/assets/{html-Dg-O6XFr.js → html-H48gEjQd.js} +1 -1
  23. package/dist/assets/{htmlMode-B_wqYWvn.js → htmlMode-Nqw7-Nqh.js} +1 -1
  24. package/dist/assets/{index-5325376f-kxPTR3_e.js → index-5325376f-rnz0GXAT.js} +1 -1
  25. package/dist/assets/{index-wkhI4dr6.js → index-DeQLT67a.js} +398 -377
  26. package/dist/assets/index-DiOCtPLP.css +32 -0
  27. package/dist/assets/{infoDiagram-8eee0895-BEvqkwPI.js → infoDiagram-8eee0895-BsGB550b.js} +1 -1
  28. package/dist/assets/{javascript-DhlOH8_z.js → javascript-0g2herYV.js} +1 -1
  29. package/dist/assets/{journeyDiagram-c64418c1-gKtLYmmp.js → journeyDiagram-c64418c1-DLldlz0H.js} +1 -1
  30. package/dist/assets/{jsonMode-DxTbF9OD.js → jsonMode-CN5ZURMh.js} +1 -1
  31. package/dist/assets/{layout-CDaZEk6E.js → layout-QKUiDNJK.js} +1 -1
  32. package/dist/assets/{line-DNRQu8iq.js → line-CeP3XWjD.js} +1 -1
  33. package/dist/assets/{linear-Cph9Z6_j.js → linear-74cQVgWT.js} +1 -1
  34. package/dist/assets/{liquid-ByZ6JgRG.js → liquid-B6cRrfrb.js} +1 -1
  35. package/dist/assets/{lspLanguageFeatures-DzvhkgnM.js → lspLanguageFeatures-C5ogOh5E.js} +1 -1
  36. package/dist/assets/{mdx-D8RGHTl6.js → mdx-BBIy-KRj.js} +1 -1
  37. package/dist/assets/{mermaid.core-BgcryF__.js → mermaid.core-BhdbV0mr.js} +4 -4
  38. package/dist/assets/{mindmap-definition-8da855dc-WrxK0FcB.js → mindmap-definition-8da855dc-B67VKJuD.js} +1 -1
  39. package/dist/assets/{pieDiagram-a8764435-VsZBsiQy.js → pieDiagram-a8764435-Cxv9WY_E.js} +1 -1
  40. package/dist/assets/{python-CXVtk_cg.js → python-CBdGo8__.js} +1 -1
  41. package/dist/assets/{quadrantDiagram-1e28029f-BVlgwOvU.js → quadrantDiagram-1e28029f-BTkj65P_.js} +1 -1
  42. package/dist/assets/{razor-0tind7h2.js → razor-azKH0Dwj.js} +1 -1
  43. package/dist/assets/{requirementDiagram-08caed73-CpPMPoYp.js → requirementDiagram-08caed73-D4jVXpOT.js} +1 -1
  44. package/dist/assets/{sankeyDiagram-a04cb91d-Cm5nnRmc.js → sankeyDiagram-a04cb91d-CXhutIA1.js} +1 -1
  45. package/dist/assets/{sequenceDiagram-c5b8d532-DpMlJvJB.js → sequenceDiagram-c5b8d532-B56TTZlx.js} +1 -1
  46. package/dist/assets/{stateDiagram-1ecb1508-DU1zc7vq.js → stateDiagram-1ecb1508-Cs0plMcS.js} +1 -1
  47. package/dist/assets/{stateDiagram-v2-c2b004d7-D-0RgmAp.js → stateDiagram-v2-c2b004d7-LSJaXPJN.js} +1 -1
  48. package/dist/assets/{styles-b4e223ce-BSO-yNWV.js → styles-b4e223ce-UdXfHMuu.js} +1 -1
  49. package/dist/assets/{styles-ca3715f6-CHnsn2Ro.js → styles-ca3715f6-EuRy_hTu.js} +1 -1
  50. package/dist/assets/{styles-d45a18b0-B-rVGjEq.js → styles-d45a18b0-B24zVoK3.js} +1 -1
  51. package/dist/assets/{svgDrawCommon-b86b1483-CA3Pl89f.js → svgDrawCommon-b86b1483-B2S0NW3K.js} +1 -1
  52. package/dist/assets/{timeline-definition-faaaa080-BcihLR6s.js → timeline-definition-faaaa080-DFWKh9mU.js} +1 -1
  53. package/dist/assets/{tsMode-D9GGa5Ur.js → tsMode-FZsHWiOn.js} +1 -1
  54. package/dist/assets/{typescript-BT9CK_EL.js → typescript-CYdJ3s3D.js} +1 -1
  55. package/dist/assets/{xml-DNO75J-T.js → xml-C16X_hpZ.js} +1 -1
  56. package/dist/assets/{xychartDiagram-f5964ef8-DJTwe32X.js → xychartDiagram-f5964ef8-DyBiBYci.js} +1 -1
  57. package/dist/assets/{yaml-7CVzhiP2.js → yaml-CRjA4-Rj.js} +1 -1
  58. package/dist/index.html +8 -3
  59. package/dist/manifest.webmanifest +30 -0
  60. package/dist/pwa-icon-192.png +0 -0
  61. package/dist/pwa-icon-512.png +0 -0
  62. package/dist/sw.js +105 -0
  63. package/index.html +6 -1
  64. package/package.json +13 -13
  65. package/public/manifest.webmanifest +30 -0
  66. package/public/pwa-icon-192.png +0 -0
  67. package/public/pwa-icon-512.png +0 -0
  68. package/public/sw.js +105 -0
  69. package/src/App.tsx +13 -1
  70. package/src/api/README.md +1 -0
  71. package/src/api/adapters.ts +63 -0
  72. package/src/api/auth-token.ts +51 -0
  73. package/src/api/auth.ts +46 -0
  74. package/src/api/automation.ts +10 -0
  75. package/src/api/base.ts +20 -17
  76. package/src/api/config.ts +5 -1
  77. package/src/api/knowledge.ts +59 -0
  78. package/src/api/sessions.ts +35 -3
  79. package/src/api/skill-hub.ts +126 -0
  80. package/src/api/workspace.ts +33 -1
  81. package/src/api/worktree-environments.ts +53 -0
  82. package/src/api.ts +62 -7
  83. package/src/client-build-info.ts +19 -0
  84. package/src/components/ConfigView.scss +595 -28
  85. package/src/components/ConfigView.tsx +568 -138
  86. package/src/components/NavRail.scss +1 -2
  87. package/src/components/NavRail.tsx +33 -3
  88. package/src/components/Sidebar.scss +0 -44
  89. package/src/components/Sidebar.tsx +109 -37
  90. package/src/components/auth/AuthGate.scss +79 -0
  91. package/src/components/auth/AuthGate.tsx +174 -0
  92. package/src/components/automation-view/@components/AutomationTaskComposer.tsx +218 -0
  93. package/src/components/automation-view/@components/AutomationTriggerRow.tsx +192 -0
  94. package/src/components/automation-view/@hooks/use-automation-startup-options-data.tsx +289 -0
  95. package/src/components/automation-view/@hooks/use-automation-startup-static-options.ts +51 -0
  96. package/src/components/automation-view/@utils/sender-model-options.tsx +52 -0
  97. package/src/components/automation-view/@utils/startup-options.ts +26 -0
  98. package/src/components/automation-view/AutomationEmptyGuide.tsx +61 -0
  99. package/src/components/automation-view/AutomationEmptyLanding.scss +165 -0
  100. package/src/components/automation-view/AutomationEmptyLanding.tsx +199 -0
  101. package/src/components/automation-view/AutomationRuleDetailPreview.tsx +179 -0
  102. package/src/components/automation-view/PanelTitleActions.tsx +66 -0
  103. package/src/components/automation-view/RuleFormPanel.scss +172 -49
  104. package/src/components/automation-view/RuleFormPanel.tsx +196 -91
  105. package/src/components/automation-view/RuleSidebar.scss +128 -41
  106. package/src/components/automation-view/RuleSidebar.tsx +173 -89
  107. package/src/components/automation-view/RunHistoryPanel.scss +307 -72
  108. package/src/components/automation-view/RunHistoryPanel.tsx +185 -165
  109. package/src/components/automation-view/TaskList.scss +126 -64
  110. package/src/components/automation-view/TaskList.tsx +15 -31
  111. package/src/components/automation-view/TriggerList.scss +87 -8
  112. package/src/components/automation-view/TriggerList.tsx +14 -173
  113. package/src/components/automation-view/index.scss +165 -37
  114. package/src/components/automation-view/index.tsx +174 -87
  115. package/src/components/automation-view/types.ts +13 -0
  116. package/src/components/chat/AGENTS.md +3 -1
  117. package/src/components/chat/ChatHeader.tsx +56 -33
  118. package/src/components/chat/ChatHistoryView.tsx +250 -121
  119. package/src/components/chat/NewSessionGuide.scss +274 -204
  120. package/src/components/chat/NewSessionGuide.tsx +40 -111
  121. package/src/components/chat/NewSessionGuideStarterList.tsx +187 -0
  122. package/src/components/chat/NewSessionGuideStarterSection.tsx +120 -0
  123. package/src/components/chat/bottom-dock-constants.ts +4 -0
  124. package/src/components/chat/conversation-starter-apply.ts +181 -0
  125. package/src/components/chat/git-controls/ChatGitControls.scss +65 -0
  126. package/src/components/chat/git-controls/DraftGitControls.tsx +14 -0
  127. package/src/components/chat/git-controls/DraftWorktreeEnvironmentDropdown.tsx +115 -0
  128. package/src/components/chat/messages/MessageItem.tsx +3 -2
  129. package/src/components/chat/messages/MessageStatusNotice.tsx +12 -4
  130. package/src/components/chat/messages/build-chat-history-status-notices.ts +18 -13
  131. package/src/components/chat/messages/message-action-utils.ts +18 -0
  132. package/src/components/chat/new-session-guide-config.ts +19 -0
  133. package/src/components/chat/new-session-guide-items.ts +172 -0
  134. package/src/components/chat/new-session-guide-list-order.ts +58 -0
  135. package/src/components/chat/sender/@components/account-select/AccountSelectControl.scss +112 -0
  136. package/src/components/chat/sender/@components/account-select/AccountSelectControl.tsx +280 -0
  137. package/src/components/chat/sender/@components/account-select/AccountSelectDropdown.scss +155 -0
  138. package/src/components/chat/sender/@components/adapter-select/AdapterSelectControl.scss +51 -12
  139. package/src/components/chat/sender/@components/adapter-select/AdapterSelectDropdown.scss +14 -0
  140. package/src/components/chat/sender/@components/effort-select/EffortSelectControl.scss +36 -0
  141. package/src/components/chat/sender/@components/effort-select/EffortSelectControl.tsx +17 -12
  142. package/src/components/chat/sender/@components/model-select/ModelSelectControl.scss +62 -0
  143. package/src/components/chat/sender/@components/model-select/ModelSelectControl.tsx +17 -12
  144. package/src/components/chat/sender/@components/model-select/ModelSelectMenu.scss +2 -0
  145. package/src/components/chat/sender/@components/model-select/ModelSelectMenuLabels.scss +24 -0
  146. package/src/components/chat/sender/@components/permission-mode-control/PermissionModeControl.scss +199 -0
  147. package/src/components/chat/sender/@components/permission-mode-control/PermissionModeControl.tsx +172 -0
  148. package/src/components/chat/sender/@components/reference-actions/ReferenceActionsControl.scss +1 -10
  149. package/src/components/chat/sender/@components/reference-actions/ReferenceActionsControl.tsx +16 -65
  150. package/src/components/chat/sender/@components/sender-body/SenderBody.tsx +13 -1
  151. package/src/components/chat/sender/@components/sender-header-controls/SenderHeaderControls.tsx +157 -0
  152. package/src/components/chat/sender/@components/sender-monaco-editor/monaco-runtime.ts +1 -17
  153. package/src/components/chat/sender/@components/sender-toolbar/SenderSelectBase.scss +18 -2
  154. package/src/components/chat/sender/@components/sender-toolbar/SenderSelectShared.scss +18 -1
  155. package/src/components/chat/sender/@components/sender-toolbar/SenderToolbar.scss +2 -0
  156. package/src/components/chat/sender/@components/sender-toolbar/SenderToolbar.tsx +40 -40
  157. package/src/components/chat/sender/@components/session-target/SenderSessionTargetBar.scss +215 -0
  158. package/src/components/chat/sender/@components/session-target/SenderSessionTargetBar.tsx +185 -0
  159. package/src/components/chat/sender/@core/build-sender-toolbar.ts +6 -0
  160. package/src/components/chat/sender/@core/create-sender-toolbar-handlers.ts +21 -1
  161. package/src/components/chat/sender/@core/get-sender-runtime-state.ts +3 -2
  162. package/src/components/chat/sender/@core/sender-toolbar-bindings.ts +12 -0
  163. package/src/components/chat/sender/@hooks/use-sender-controller.ts +56 -1
  164. package/src/components/chat/sender/@hooks/use-sender-reference-actions.ts +9 -66
  165. package/src/components/chat/sender/@types/sender-props.ts +18 -0
  166. package/src/components/chat/sender/@types/sender-toolbar-types.ts +8 -1
  167. package/src/components/chat/sender/@types/sender-types.ts +1 -3
  168. package/src/components/chat/sender/@utils/sender-constants.ts +1 -1
  169. package/src/components/chat/sender/Sender.scss +245 -2
  170. package/src/components/chat/sender/Sender.tsx +1 -0
  171. package/src/components/chat/status-bar/ChatStatusBar.scss +85 -0
  172. package/src/components/chat/status-bar/ChatStatusBar.tsx +48 -0
  173. package/src/components/chat/terminal/@components/TerminalManagerList.tsx +191 -0
  174. package/src/components/chat/terminal/@components/TerminalPane.scss +71 -0
  175. package/src/components/chat/terminal/@components/TerminalPane.tsx +137 -0
  176. package/src/components/chat/terminal/@components/TerminalPanelActions.tsx +75 -0
  177. package/src/components/chat/terminal/@hooks/use-terminal-instance.ts +36 -0
  178. package/src/components/chat/terminal/@hooks/use-terminal-session.ts +18 -21
  179. package/src/components/chat/terminal/@hooks/use-terminal-title-editor.ts +72 -0
  180. package/src/components/chat/terminal/@utils/terminal-keyboard.ts +141 -0
  181. package/src/components/chat/terminal/@utils/terminal-panes.ts +123 -0
  182. package/src/components/chat/terminal/ChatTerminalView.scss +310 -38
  183. package/src/components/chat/terminal/ChatTerminalView.tsx +151 -79
  184. package/src/components/chat/tools/core/ToolDiffViewer.tsx +3 -17
  185. package/src/components/chat/workspace-drawer/ChatWorkspaceDrawer.scss +778 -0
  186. package/src/components/chat/workspace-drawer/ChatWorkspaceDrawer.tsx +112 -0
  187. package/src/components/chat/workspace-drawer/ChatWorkspaceDrawerToolbar.tsx +183 -0
  188. package/src/components/chat/workspace-drawer/WorkspaceDrawerChangedFileRow.tsx +75 -0
  189. package/src/components/chat/workspace-drawer/WorkspaceDrawerChangedFiles.tsx +161 -0
  190. package/src/components/chat/workspace-drawer/WorkspaceDrawerChangedFolderTree.tsx +191 -0
  191. package/src/components/chat/workspace-drawer/WorkspaceDrawerTree.tsx +35 -0
  192. package/src/components/chat/workspace-drawer/WorkspaceDrawerTreeState.tsx +17 -0
  193. package/src/components/chat/workspace-drawer/changed-files-model.ts +152 -0
  194. package/src/components/chat/workspace-drawer/workspace-drawer-icons.ts +110 -0
  195. package/src/components/chat/workspace-file-editor/WorkspaceFileBreadcrumb.tsx +17 -0
  196. package/src/components/chat/workspace-file-editor/WorkspaceFileEditorView.scss +283 -0
  197. package/src/components/chat/workspace-file-editor/WorkspaceFileEditorView.tsx +165 -0
  198. package/src/components/chat/workspace-file-editor/WorkspaceFileTabs.tsx +135 -0
  199. package/src/components/chat/workspace-file-editor/use-workspace-file-editor-state.ts +113 -0
  200. package/src/components/chat/workspace-file-editor/workspace-file-editor-language.ts +55 -0
  201. package/src/components/composer-landing/ComposerLanding.scss +75 -0
  202. package/src/components/composer-landing/ComposerLanding.tsx +47 -0
  203. package/src/components/config/AGENTS.md +45 -0
  204. package/src/components/config/AdapterAccountsManager.scss +540 -0
  205. package/src/components/config/AdapterAccountsManager.tsx +846 -0
  206. package/src/components/config/AppSettingsPanel.tsx +24 -2
  207. package/src/components/config/ConfigAboutSection.scss +7 -1
  208. package/src/components/config/ConfigAboutSection.tsx +21 -3
  209. package/src/components/config/ConfigEditors.scss +12 -0
  210. package/src/components/config/ConfigFieldRow.scss +88 -4
  211. package/src/components/config/ConfigSectionForm.scss +88 -3
  212. package/src/components/config/ConfigSectionForm.tsx +948 -138
  213. package/src/components/config/ConfigSectionPanel.tsx +188 -12
  214. package/src/components/config/ConfigSourceSwitch.tsx +32 -18
  215. package/src/components/config/DetailCollectionFieldActions.tsx +63 -0
  216. package/src/components/config/DetailListField.tsx +413 -0
  217. package/src/components/config/McpServerItemEditor.tsx +154 -0
  218. package/src/components/config/RecommendedModelsItemEditor.tsx +146 -0
  219. package/src/components/config/WorktreeEnvironmentDetailView.tsx +126 -0
  220. package/src/components/config/WorktreeEnvironmentListView.tsx +126 -0
  221. package/src/components/config/WorktreeEnvironmentPanel.scss +430 -0
  222. package/src/components/config/WorktreeEnvironmentPanel.tsx +147 -0
  223. package/src/components/config/WorktreeEnvironmentScriptEditorCard.tsx +125 -0
  224. package/src/components/config/WorktreeEnvironmentScriptEditors.tsx +189 -0
  225. package/src/components/config/configConflict.ts +41 -0
  226. package/src/components/config/configDetail.ts +381 -0
  227. package/src/components/config/configSchema.ts +850 -179
  228. package/src/components/config/configUtils.ts +1 -1
  229. package/src/components/config/record-editors/RecordEditors.scss +187 -2
  230. package/src/components/config/record-editors/RecordJsonEditor.tsx +27 -2
  231. package/src/components/config/record-editors/SchemaObjectEditor.tsx +183 -0
  232. package/src/components/config/record-editors/SchemaRecordEditor.tsx +184 -0
  233. package/src/components/config/record-editors/index.tsx +2 -1
  234. package/src/components/config/record-editors/schemaRecordUtils.ts +55 -0
  235. package/src/components/config/use-worktree-environment-auto-save.ts +386 -0
  236. package/src/components/config/worktree-environment-panel-model.ts +108 -0
  237. package/src/components/dock-panel/DockPanel.scss +84 -17
  238. package/src/components/dock-panel/DockPanel.tsx +37 -34
  239. package/src/components/dock-panel/DockPanelHeader.tsx +65 -0
  240. package/src/components/dock-panel/use-dock-panel-fullscreen.ts +51 -0
  241. package/src/components/knowledge-base/KnowledgeBaseView.scss +276 -38
  242. package/src/components/knowledge-base/KnowledgeBaseView.tsx +252 -46
  243. package/src/components/knowledge-base/components/ActionButton.scss +30 -4
  244. package/src/components/knowledge-base/components/ActionButton.tsx +13 -3
  245. package/src/components/knowledge-base/components/CreateSkillModal.tsx +59 -0
  246. package/src/components/knowledge-base/components/EmptyState.scss +4 -2
  247. package/src/components/knowledge-base/components/EntitiesTab.tsx +20 -20
  248. package/src/components/knowledge-base/components/EntityList.scss +3 -0
  249. package/src/components/knowledge-base/components/FilterBar.scss +1 -0
  250. package/src/components/knowledge-base/components/FilterBar.tsx +12 -8
  251. package/src/components/knowledge-base/components/FlowsTab.tsx +20 -20
  252. package/src/components/knowledge-base/components/KnowledgeBaseHeader.tsx +7 -6
  253. package/src/components/knowledge-base/components/KnowledgeContentControls.tsx +35 -0
  254. package/src/components/knowledge-base/components/KnowledgeList.scss +14 -3
  255. package/src/components/knowledge-base/components/KnowledgeMobilePanel.tsx +122 -0
  256. package/src/components/knowledge-base/components/KnowledgeSidebar.tsx +97 -0
  257. package/src/components/knowledge-base/components/LoadingState.scss +2 -1
  258. package/src/components/knowledge-base/components/ProjectSkillsList.tsx +79 -0
  259. package/src/components/knowledge-base/components/RuleList.scss +3 -0
  260. package/src/components/knowledge-base/components/RulesTab.tsx +31 -30
  261. package/src/components/knowledge-base/components/SectionHeader.scss +13 -1
  262. package/src/components/knowledge-base/components/SectionHeader.tsx +5 -3
  263. package/src/components/knowledge-base/components/SkillArchiveInput.tsx +43 -0
  264. package/src/components/knowledge-base/components/SkillHubResultItem.tsx +112 -0
  265. package/src/components/knowledge-base/components/SkillMarketResults.tsx +98 -0
  266. package/src/components/knowledge-base/components/SkillMarketView.tsx +198 -0
  267. package/src/components/knowledge-base/components/SkillMarketView.types.ts +28 -0
  268. package/src/components/knowledge-base/components/SkillRegistryErrors.tsx +21 -0
  269. package/src/components/knowledge-base/components/SkillRegistryModal.tsx +74 -0
  270. package/src/components/knowledge-base/components/SkillsCliModal.tsx +154 -0
  271. package/src/components/knowledge-base/components/SkillsTab.scss +424 -0
  272. package/src/components/knowledge-base/components/SkillsTab.tsx +319 -35
  273. package/src/components/knowledge-base/components/SkillsTabActions.tsx +88 -0
  274. package/src/components/knowledge-base/components/SpecList.scss +3 -0
  275. package/src/components/knowledge-base/components/TabContent.scss +4 -3
  276. package/src/components/knowledge-base/components/skill-hub-utils.ts +108 -0
  277. package/src/components/knowledge-base/components/use-skill-market-filters.ts +37 -0
  278. package/src/components/knowledge-base/components/use-skill-market-query-input.ts +44 -0
  279. package/src/components/knowledge-base/components/use-skill-market-search.ts +49 -0
  280. package/src/components/knowledge-base/components/use-skill-registry-modal.ts +68 -0
  281. package/src/components/monaco/monaco-runtime.ts +44 -0
  282. package/src/components/monaco/use-monaco-theme.ts +63 -0
  283. package/src/components/nav-rail-account-actions.tsx +104 -0
  284. package/src/components/server-connection/ServerConnectionGate.scss +356 -0
  285. package/src/components/server-connection/ServerConnectionGate.tsx +238 -0
  286. package/src/components/server-connection/ServerConnectionProfileModal.tsx +145 -0
  287. package/src/components/server-connection/ServerConnectionProfiles.tsx +113 -0
  288. package/src/components/server-connection/ServerConnectionUrlInput.tsx +85 -0
  289. package/src/components/sidebar/SidebarHeader.scss +5 -41
  290. package/src/components/sidebar/SidebarHeader.tsx +74 -66
  291. package/src/components/sidebar/SidebarHeaderSearchActions.tsx +24 -28
  292. package/src/components/sidebar-list/SidebarListHeader.scss +246 -0
  293. package/src/components/sidebar-list/SidebarListHeader.tsx +146 -0
  294. package/src/components/workspace/ContextFilePicker.scss +9 -26
  295. package/src/components/workspace/ContextFilePicker.tsx +31 -113
  296. package/src/components/workspace/context-file-types.ts +36 -0
  297. package/src/components/workspace/project-file-tree/ProjectFileTree.scss +298 -0
  298. package/src/components/workspace/project-file-tree/ProjectFileTree.tsx +138 -0
  299. package/src/components/workspace/project-file-tree/ProjectFileTreeRow.tsx +167 -0
  300. package/src/components/workspace/project-file-tree/ProjectFileTreeRowContextMenu.tsx +106 -0
  301. package/src/components/workspace/project-file-tree/ProjectFileTreeRows.tsx +139 -0
  302. package/src/components/workspace/project-file-tree/project-file-tree-helpers.ts +101 -0
  303. package/src/components/workspace/project-file-tree/project-file-tree-icons.ts +93 -0
  304. package/src/components/workspace/project-file-tree/project-file-tree-types.ts +27 -0
  305. package/src/components/workspace/project-file-tree/use-project-file-tree-data.ts +197 -0
  306. package/src/components/workspace/project-file-tree/use-project-file-tree-selection.ts +144 -0
  307. package/src/hooks/chat/chat-session-target.ts +69 -0
  308. package/src/hooks/chat/chat-session-workspace-draft.ts +11 -4
  309. package/src/hooks/chat/interaction-state.ts +1 -0
  310. package/src/hooks/chat/optimistic-session-creation.ts +189 -0
  311. package/src/hooks/chat/use-chat-adapter-account-selection.tsx +156 -0
  312. package/src/hooks/chat/use-chat-route-bottom-panel.ts +181 -0
  313. package/src/hooks/chat/use-chat-route-deep-link-view.ts +33 -0
  314. package/src/hooks/chat/use-chat-session-actions.ts +259 -65
  315. package/src/hooks/chat/use-chat-session-messages.ts +71 -4
  316. package/src/hooks/chat/use-chat-session.ts +36 -1
  317. package/src/hooks/chat/workspace-file-panel-state.ts +43 -0
  318. package/src/hooks/session-subscription-cache.ts +25 -0
  319. package/src/hooks/use-chat-layout-query-state.ts +29 -0
  320. package/src/hooks/use-sender-header-query-state.ts +35 -0
  321. package/src/hooks/use-session-subscription.ts +17 -8
  322. package/src/i18n-resources.ts +44 -0
  323. package/src/i18n.ts +21 -6
  324. package/src/main.tsx +8 -0
  325. package/src/pwa.ts +46 -0
  326. package/src/resources/locales/en.json +729 -24
  327. package/src/resources/locales/zh.json +731 -26
  328. package/src/routes/ChatRoute.scss +105 -7
  329. package/src/routes/ChatRoute.tsx +11 -165
  330. package/src/routes/ChatRouteBottomPanel.tsx +47 -0
  331. package/src/routes/ChatRouteView.tsx +199 -0
  332. package/src/runtime-config.ts +155 -2
  333. package/src/server-connection-history.ts +179 -0
  334. package/src/store/index.ts +40 -0
  335. package/src/styles/global.scss +3 -0
  336. package/src/utils/mobile-viewport.ts +67 -0
  337. package/src/version-compatibility.ts +37 -0
  338. package/src/vite-env.d.ts +9 -0
  339. package/src/ws.ts +20 -9
  340. package/vite.config.ts +23 -1
  341. package/dist/assets/channel-Dnopc5A6.js +0 -1
  342. package/dist/assets/clone-sQthahUA.js +0 -1
  343. package/dist/assets/flowDiagram-v2-4f6560a1-OazrdWQO.js +0 -1
  344. package/dist/assets/index-o93dlo92.css +0 -32
  345. package/src/components/chat/NewSessionGuideCompactPanel.tsx +0 -130
  346. package/src/components/chat/NewSessionGuideGrid.tsx +0 -141
  347. package/src/components/chat/sender/@components/reference-actions/ReferencePermissionActionsPopover.tsx +0 -114
@@ -0,0 +1,215 @@
1
+ .sender-session-target {
2
+ display: flex;
3
+ align-items: center;
4
+ min-width: 0;
5
+ padding: 5px 6px;
6
+ margin: -12px -12px 6px;
7
+ border-radius: 11px 11px 0 0;
8
+ background: color-mix(in srgb, var(--sub-bg-color) 82%, var(--border-color));
9
+ }
10
+
11
+ .sender-session-target__controls {
12
+ display: flex;
13
+ align-items: center;
14
+ justify-content: flex-start;
15
+ gap: 10px;
16
+ width: 100%;
17
+ min-width: 0;
18
+ }
19
+
20
+ .sender-session-target__actions {
21
+ margin-left: auto;
22
+ display: inline-flex;
23
+ align-items: center;
24
+ justify-content: flex-end;
25
+ min-width: 0;
26
+ flex-shrink: 0;
27
+ }
28
+
29
+ .sender-session-target__trigger {
30
+ width: fit-content;
31
+ min-width: 0;
32
+ max-width: min(420px, 100%);
33
+ height: 24px;
34
+ border: 0;
35
+ border-radius: 8px;
36
+ padding: 0 6px;
37
+ display: inline-flex;
38
+ align-items: center;
39
+ gap: 6px;
40
+ background: transparent;
41
+ color: var(--text-color);
42
+ cursor: pointer;
43
+ text-align: left;
44
+ transition: background-color .2s ease, color .2s ease;
45
+ }
46
+
47
+ .sender-session-target__trigger:hover:not(:disabled) {
48
+ background: color-mix(in srgb, var(--primary-color) 8%, transparent);
49
+ }
50
+
51
+ .sender-session-target__trigger:focus-visible {
52
+ outline: 2px solid color-mix(in srgb, var(--primary-color) 42%, transparent);
53
+ outline-offset: 2px;
54
+ }
55
+
56
+ .sender-session-target__trigger:disabled {
57
+ cursor: not-allowed;
58
+ opacity: .72;
59
+ }
60
+
61
+ .sender-session-target__trigger-icon,
62
+ .sender-session-target__trigger-chevron,
63
+ .sender-session-target__menu-icon {
64
+ font-size: 14px;
65
+ line-height: 1;
66
+ }
67
+
68
+ .sender-session-target__trigger-icon {
69
+ color: var(--primary-color);
70
+ }
71
+
72
+ .sender-session-target__trigger-copy {
73
+ display: flex;
74
+ align-items: baseline;
75
+ gap: 8px;
76
+ min-width: 0;
77
+ flex: 0 1 auto;
78
+ }
79
+
80
+ .sender-session-target__trigger-mode {
81
+ flex-shrink: 0;
82
+ color: var(--sub-text-color);
83
+ font-size: 10px;
84
+ line-height: 1.2;
85
+ }
86
+
87
+ .sender-session-target__trigger-value {
88
+ min-width: 0;
89
+ overflow: hidden;
90
+ color: var(--text-color);
91
+ font-size: 11px;
92
+ font-weight: 600;
93
+ line-height: 1.2;
94
+ text-overflow: ellipsis;
95
+ white-space: nowrap;
96
+ }
97
+
98
+ .sender-session-target__trigger-chevron {
99
+ flex-shrink: 0;
100
+ color: var(--sub-text-color);
101
+ }
102
+
103
+ .sender-session-target__menu-icon {
104
+ color: var(--sub-text-color);
105
+ width: 16px;
106
+ min-width: 16px;
107
+ height: 16px;
108
+ display: inline-flex;
109
+ align-items: center;
110
+ justify-content: center;
111
+ line-height: 16px;
112
+ vertical-align: middle;
113
+ }
114
+
115
+ .sender-session-target__menu-item {
116
+ display: flex;
117
+ flex-direction: column;
118
+ gap: 1px;
119
+ min-width: 160px;
120
+ max-width: 280px;
121
+ }
122
+
123
+ .sender-session-target__menu-item-name {
124
+ overflow: hidden;
125
+ color: var(--text-color);
126
+ font-size: 11px;
127
+ line-height: 1.25;
128
+ text-overflow: ellipsis;
129
+ white-space: nowrap;
130
+ }
131
+
132
+ .sender-session-target__menu-item-desc {
133
+ overflow: hidden;
134
+ color: var(--sub-text-color);
135
+ font-size: 10px;
136
+ line-height: 1.25;
137
+ text-overflow: ellipsis;
138
+ white-space: nowrap;
139
+ }
140
+
141
+ .sender-session-target__dropdown.ant-dropdown,
142
+ .sender-session-target__submenu-popup {
143
+ .ant-dropdown-menu {
144
+ min-width: 168px;
145
+ padding: 4px !important;
146
+ }
147
+
148
+ .ant-dropdown-menu-item,
149
+ .ant-dropdown-menu-submenu-title {
150
+ min-height: 28px !important;
151
+ height: auto;
152
+ display: flex !important;
153
+ align-items: center !important;
154
+ padding: 4px 8px !important;
155
+ border-radius: 8px !important;
156
+ font-size: 11px !important;
157
+ line-height: 16px !important;
158
+ }
159
+
160
+ .ant-dropdown-menu-item-icon {
161
+ width: 16px;
162
+ min-width: 16px;
163
+ height: 16px;
164
+ display: inline-flex !important;
165
+ align-items: center !important;
166
+ align-self: center !important;
167
+ justify-content: center !important;
168
+ margin-inline-end: 8px !important;
169
+ line-height: 16px !important;
170
+ }
171
+
172
+ .ant-dropdown-menu-title-content {
173
+ display: inline-flex !important;
174
+ align-items: center !important;
175
+ min-height: 16px;
176
+ font-size: 11px !important;
177
+ line-height: 16px !important;
178
+ }
179
+
180
+ .ant-dropdown-menu-submenu-expand-icon {
181
+ display: inline-flex !important;
182
+ align-items: center !important;
183
+ justify-content: center !important;
184
+ inset-inline-end: 8px !important;
185
+ color: var(--placeholder-color, #9ca3af) !important;
186
+ }
187
+ }
188
+
189
+ .sender-session-target__submenu-chevron {
190
+ font-size: 14px;
191
+ line-height: 1;
192
+ }
193
+
194
+ @media (max-width: 720px) {
195
+ .sender-session-target__controls {
196
+ display: grid;
197
+ grid-template-columns: minmax(0, 1fr) auto;
198
+ align-items: center;
199
+ gap: 6px;
200
+ }
201
+
202
+ .sender-session-target__actions {
203
+ margin-left: 0;
204
+ justify-self: end;
205
+ max-width: 100%;
206
+ }
207
+
208
+ .sender-session-target__trigger {
209
+ max-width: 100%;
210
+ }
211
+
212
+ .sender-session-target__trigger-copy {
213
+ gap: 6px;
214
+ }
215
+ }
@@ -0,0 +1,185 @@
1
+ import './SenderSessionTargetBar.scss'
2
+
3
+ import { Dropdown } from 'antd'
4
+ import type { MenuProps } from 'antd'
5
+ import type { ReactNode } from 'react'
6
+ import { useMemo } from 'react'
7
+ import { useTranslation } from 'react-i18next'
8
+ import useSWR from 'swr'
9
+
10
+ import type { EntitySummary, SpecSummary, WorkspaceSummary } from '#~/api.js'
11
+ import { DEFAULT_CHAT_SESSION_TARGET_DRAFT, createChatSessionTargetDraft } from '#~/hooks/chat/chat-session-target'
12
+ import type {
13
+ ChatSessionTargetDraft,
14
+ ChatSessionTargetResource,
15
+ ChatSessionTargetType
16
+ } from '#~/hooks/chat/chat-session-target'
17
+
18
+ type SelectableTargetType = Exclude<ChatSessionTargetType, 'default'>
19
+
20
+ const modeIcons: Record<ChatSessionTargetType, string> = {
21
+ default: 'radio_button_checked',
22
+ workspace: 'workspaces',
23
+ entity: 'group_work',
24
+ spec: 'account_tree'
25
+ }
26
+
27
+ const selectableTypes: SelectableTargetType[] = ['workspace', 'entity', 'spec']
28
+ const menuKeySeparator = '::'
29
+
30
+ const toResource = (item: WorkspaceSummary | EntitySummary | SpecSummary): ChatSessionTargetResource => ({
31
+ id: item.id,
32
+ name: item.name,
33
+ description: item.description,
34
+ path: 'path' in item ? item.path : item.id
35
+ })
36
+
37
+ export function SenderSessionTargetBar({
38
+ draft,
39
+ locked,
40
+ disabled,
41
+ onChange,
42
+ actions,
43
+ className,
44
+ ariaHidden
45
+ }: {
46
+ draft: ChatSessionTargetDraft
47
+ locked: boolean
48
+ disabled?: boolean
49
+ onChange: (target: ChatSessionTargetDraft) => void
50
+ actions?: ReactNode
51
+ className?: string
52
+ ariaHidden?: boolean
53
+ }) {
54
+ const { t } = useTranslation()
55
+ const { data: specsRes } = useSWR<{ specs: SpecSummary[] }>('/api/ai/specs')
56
+ const { data: entitiesRes } = useSWR<{ entities: EntitySummary[] }>('/api/ai/entities')
57
+ const { data: workspacesRes } = useSWR<{ workspaces: WorkspaceSummary[] }>('/api/ai/workspaces')
58
+
59
+ const resourcesByType = useMemo<Record<SelectableTargetType, ChatSessionTargetResource[]>>(() => ({
60
+ workspace: (workspacesRes?.workspaces ?? []).map(toResource),
61
+ entity: (entitiesRes?.entities ?? []).map(toResource),
62
+ spec: (specsRes?.specs ?? []).map(toResource)
63
+ }), [entitiesRes?.entities, specsRes?.specs, workspacesRes?.workspaces])
64
+
65
+ const activeType = draft.type
66
+ const isControlDisabled = locked || disabled === true
67
+ const selectedLabel = draft.label ?? draft.name
68
+ const selectedText = activeType === 'default'
69
+ ? null
70
+ : selectedLabel ?? t(`chat.sessionTarget.placeholders.${activeType}`)
71
+
72
+ const handleSelect = (type: ChatSessionTargetType, resource?: ChatSessionTargetResource) => {
73
+ if (isControlDisabled) return
74
+
75
+ if (type === 'default') {
76
+ onChange({ ...DEFAULT_CHAT_SESSION_TARGET_DRAFT })
77
+ return
78
+ }
79
+
80
+ onChange(
81
+ resource == null
82
+ ? { type }
83
+ : createChatSessionTargetDraft(type, resource)
84
+ )
85
+ }
86
+
87
+ const menuItems = useMemo<MenuProps['items']>(() => [
88
+ {
89
+ key: 'default',
90
+ label: t('chat.sessionTarget.modes.default'),
91
+ icon: <span className='material-symbols-rounded sender-session-target__menu-icon'>{modeIcons.default}</span>
92
+ },
93
+ { type: 'divider' },
94
+ ...selectableTypes.map(type => ({
95
+ key: type,
96
+ label: t(`chat.sessionTarget.modes.${type}`),
97
+ icon: <span className='material-symbols-rounded sender-session-target__menu-icon'>{modeIcons[type]}</span>,
98
+ popupClassName: 'sender-session-target__submenu-popup',
99
+ children: resourcesByType[type].length > 0
100
+ ? resourcesByType[type].map(resource => ({
101
+ key: `${type}${menuKeySeparator}${type === 'workspace' ? resource.id : resource.name}`,
102
+ label: (
103
+ <span className='sender-session-target__menu-item'>
104
+ <span className='sender-session-target__menu-item-name'>{resource.name}</span>
105
+ {(resource.description ?? resource.path) != null && (
106
+ <span className='sender-session-target__menu-item-desc'>{resource.description ?? resource.path}</span>
107
+ )}
108
+ </span>
109
+ )
110
+ }))
111
+ : [{
112
+ key: `${type}${menuKeySeparator}__empty`,
113
+ label: t(`chat.sessionTarget.empty.${type}`),
114
+ disabled: true
115
+ }]
116
+ }))
117
+ ], [resourcesByType, t])
118
+
119
+ const handleMenuClick: MenuProps['onClick'] = ({ key }) => {
120
+ const rawKey = String(key)
121
+ if (rawKey === 'default') {
122
+ handleSelect('default')
123
+ return
124
+ }
125
+
126
+ const [type, resourceValue] = rawKey.split(menuKeySeparator) as [SelectableTargetType | undefined, string?]
127
+ if (type == null || !selectableTypes.includes(type) || resourceValue == null || resourceValue === '__empty') {
128
+ return
129
+ }
130
+
131
+ const resource = resourcesByType[type].find(item => (type === 'workspace' ? item.id : item.name) === resourceValue)
132
+ handleSelect(type, resource)
133
+ }
134
+
135
+ return (
136
+ <div
137
+ className={['sender-session-target', locked ? 'is-locked' : '', className ?? ''].filter(Boolean).join(' ')}
138
+ aria-hidden={ariaHidden}
139
+ >
140
+ <div className='sender-session-target__controls'>
141
+ <Dropdown
142
+ menu={{
143
+ items: menuItems,
144
+ onClick: handleMenuClick,
145
+ className: 'sender-session-target__dropdown-menu',
146
+ expandIcon: (
147
+ <span className='material-symbols-rounded sender-session-target__submenu-chevron'>
148
+ chevron_right
149
+ </span>
150
+ )
151
+ }}
152
+ trigger={['click']}
153
+ placement='topLeft'
154
+ overlayClassName='sender-session-target__dropdown'
155
+ disabled={isControlDisabled}
156
+ >
157
+ <button
158
+ type='button'
159
+ className='sender-session-target__trigger'
160
+ disabled={isControlDisabled}
161
+ aria-label={t('chat.sessionTarget.title')}
162
+ >
163
+ <span className='material-symbols-rounded sender-session-target__trigger-icon'>
164
+ {modeIcons[activeType]}
165
+ </span>
166
+ <span className='sender-session-target__trigger-copy'>
167
+ <span className='sender-session-target__trigger-mode'>
168
+ {t(`chat.sessionTarget.modes.${activeType}`)}
169
+ </span>
170
+ {selectedText != null && (
171
+ <span className='sender-session-target__trigger-value'>{selectedText}</span>
172
+ )}
173
+ </span>
174
+ <span className='material-symbols-rounded sender-session-target__trigger-chevron'>expand_more</span>
175
+ </button>
176
+ </Dropdown>
177
+ {actions != null && (
178
+ <div className='sender-session-target__actions'>
179
+ {actions}
180
+ </div>
181
+ )}
182
+ </div>
183
+ </div>
184
+ )
185
+ }
@@ -92,6 +92,7 @@ export const buildSenderToolbar = ({
92
92
  attachments,
93
93
  callbacks: {
94
94
  onAdapterChange: props.onAdapterChange,
95
+ onAccountChange: props.onAccountChange,
95
96
  onEffortChange: props.onEffortChange,
96
97
  onInterrupt: props.onInterrupt,
97
98
  onModelChange: props.onModelChange,
@@ -106,6 +107,7 @@ export const buildSenderToolbar = ({
106
107
  resources: { message, t },
107
108
  selection: {
108
109
  adapterOptions: props.adapterOptions,
110
+ accountOptions: props.accountOptions,
109
111
  effort: props.effort ?? 'default',
110
112
  effortOptions: props.effortOptions ?? [],
111
113
  modelMenuGroups: props.modelMenuGroups,
@@ -118,6 +120,7 @@ export const buildSenderToolbar = ({
118
120
  servicePreviewModelOptions: props.servicePreviewModelOptions,
119
121
  resolvedSendShortcut,
120
122
  selectedAdapter: props.selectedAdapter,
123
+ selectedAccount: props.selectedAccount,
121
124
  selectedModel: props.selectedModel,
122
125
  updatingRecommendedModelValue: props.updatingRecommendedModelValue
123
126
  },
@@ -133,9 +136,12 @@ export const buildSenderToolbar = ({
133
136
  sendBlockedTooltip,
134
137
  showConfirmInteractionAction,
135
138
  modelUnavailable: props.modelUnavailable,
139
+ hideReferenceActions: props.hideReferenceActions === true,
140
+ hideSubmitAction: props.hideSubmitAction === true,
136
141
  referenceActions,
137
142
  refs,
138
143
  selectOverlays,
144
+ showAccountSelector: props.showAccountSelector === true,
139
145
  confirmInteractionLabel,
140
146
  submitLabel: props.submitLabel,
141
147
  submitLoading: props.submitLoading === true,
@@ -15,6 +15,7 @@ export const createSenderToolbarHandlers = ({
15
15
  message,
16
16
  modelUnavailable,
17
17
  onAdapterChange,
18
+ onAccountChange,
18
19
  onEffortChange,
19
20
  onInterrupt,
20
21
  onModelChange,
@@ -39,6 +40,7 @@ export const createSenderToolbarHandlers = ({
39
40
  message: { warning: (content: ReactNode) => unknown }
40
41
  modelUnavailable?: boolean
41
42
  onAdapterChange?: (adapter: string) => void
43
+ onAccountChange?: (account: string) => void
42
44
  onEffortChange?: (effort: ChatEffort) => void
43
45
  onInterrupt: () => void
44
46
  onModelChange?: (model: string) => void
@@ -87,7 +89,24 @@ export const createSenderToolbarHandlers = ({
87
89
  },
88
90
  onShowModelSelectChange: selectOverlays.setShowModelSelect,
89
91
  onShowEffortSelectChange: selectOverlays.setShowEffortSelect,
90
- onShowPermissionActionsChange: referenceActions.setShowPermissionActions,
92
+ onPermissionOpenChange: (nextOpen) => {
93
+ if (nextOpen && !canOpenReferenceActions) {
94
+ if (!isInlineEdit && modelUnavailable) {
95
+ void message.warning(t('chat.modelConfigRequired'))
96
+ }
97
+ return
98
+ }
99
+
100
+ if (!nextOpen) {
101
+ referenceActions.closeReferenceActions({ restoreFocus: true })
102
+ return
103
+ }
104
+
105
+ selectOverlays.setShowModelSelect(false)
106
+ selectOverlays.setShowEffortSelect(false)
107
+ referenceActions.setShowReferenceActions(false)
108
+ referenceActions.setShowPermissionActions(true)
109
+ },
91
110
  onModelSearchValueChange: selectOverlays.setModelSearchValue,
92
111
  onOpenContextPicker: attachments.handleOpenContextPicker,
93
112
  onReferenceImageSelect: attachments.handleImageUpload,
@@ -113,6 +132,7 @@ export const createSenderToolbarHandlers = ({
113
132
  onToggleRecommendedModel,
114
133
  onEffortChange,
115
134
  onAdapterChange,
135
+ onAccountChange,
116
136
  onQueueModeChange,
117
137
  onSend,
118
138
  onInterrupt,
@@ -1,13 +1,14 @@
1
1
  import type { SenderProps } from '../@types/sender-props'
2
2
 
3
3
  export const getSenderRuntimeState = (
4
- props: Pick<SenderProps, 'selectedAdapter' | 'sessionStatus' | 'submitLoading' | 'variant'>
4
+ props: Pick<SenderProps, 'forceEffortControl' | 'selectedAdapter' | 'sessionStatus' | 'submitLoading' | 'variant'>
5
5
  ) => {
6
6
  const isInlineEdit = props.variant === 'inline-edit'
7
7
  const isMac = navigator.platform.includes('Mac')
8
8
  const isThinking = !isInlineEdit && props.sessionStatus === 'running'
9
9
  const isBusy = isThinking || props.submitLoading === true
10
- const supportsEffort = props.selectedAdapter === 'codex' || props.selectedAdapter === 'claude-code' ||
10
+ const supportsEffort = props.forceEffortControl === true ||
11
+ props.selectedAdapter === 'codex' || props.selectedAdapter === 'claude-code' ||
11
12
  props.selectedAdapter === 'copilot' || props.selectedAdapter === 'opencode'
12
13
 
13
14
  return { isInlineEdit, isMac, isThinking, isBusy, supportsEffort }
@@ -30,6 +30,7 @@ export const createSenderToolbarBindings = ({
30
30
  }
31
31
  callbacks: {
32
32
  onAdapterChange?: (adapter: string) => void
33
+ onAccountChange?: (account: string) => void
33
34
  onEffortChange?: (effort: ChatEffort) => void
34
35
  onInterrupt: () => void
35
36
  onModelChange?: (model: string) => void
@@ -44,6 +45,7 @@ export const createSenderToolbarBindings = ({
44
45
  resources: { message: { warning: (content: ReactNode) => unknown }; t: (key: string) => string }
45
46
  selection: {
46
47
  adapterOptions?: Array<{ value: string; label: ReactNode }>
48
+ accountOptions?: SenderToolbarData['accountOptions']
47
49
  effort: ChatEffort
48
50
  effortOptions: SenderToolbarData['effortOptions']
49
51
  modelMenuGroups?: ModelSelectMenuGroup[]
@@ -56,6 +58,7 @@ export const createSenderToolbarBindings = ({
56
58
  servicePreviewModelOptions?: ModelSelectOption[]
57
59
  resolvedSendShortcut: string
58
60
  selectedAdapter?: string
61
+ selectedAccount?: string
59
62
  selectedModel?: string
60
63
  updatingRecommendedModelValue?: string
61
64
  }
@@ -74,6 +77,8 @@ export const createSenderToolbarBindings = ({
74
77
  sendBlockedTooltip?: string
75
78
  showConfirmInteractionAction: boolean
76
79
  modelUnavailable?: boolean
80
+ hideReferenceActions: boolean
81
+ hideSubmitAction: boolean
77
82
  referenceActions: {
78
83
  showReferenceActions: boolean
79
84
  showPermissionActions: boolean
@@ -96,6 +101,7 @@ export const createSenderToolbarBindings = ({
96
101
  openModelSelector: () => boolean
97
102
  openEffortSelector: () => boolean
98
103
  }
104
+ showAccountSelector: boolean
99
105
  submitLabel?: string
100
106
  confirmInteractionLabel?: string
101
107
  submitLoading: boolean
@@ -117,11 +123,15 @@ export const createSenderToolbarBindings = ({
117
123
  showEffortSelect: ui.selectOverlays.showEffortSelect,
118
124
  showReferenceActions: ui.referenceActions.showReferenceActions,
119
125
  showPermissionActions: ui.referenceActions.showPermissionActions,
126
+ hideReferenceActions: ui.hideReferenceActions,
127
+ hideSubmitAction: ui.hideSubmitAction,
120
128
  modelSearchValue: ui.selectOverlays.modelSearchValue,
121
129
  selectedModel: selection.selectedModel,
122
130
  effort: selection.effort,
123
131
  permissionMode: selection.permissionMode,
124
132
  selectedAdapter: selection.selectedAdapter,
133
+ selectedAccount: selection.selectedAccount,
134
+ showAccountSelector: ui.showAccountSelector,
125
135
  isMac: ui.isMac,
126
136
  resolvedSendShortcut: selection.resolvedSendShortcut,
127
137
  queueMode: selection.queueMode,
@@ -139,6 +149,7 @@ export const createSenderToolbarBindings = ({
139
149
  effortOptions: selection.effortOptions,
140
150
  permissionModeOptions: selection.permissionModeOptions,
141
151
  adapterOptions: selection.adapterOptions,
152
+ accountOptions: selection.accountOptions,
142
153
  composerControlShortcuts: {
143
154
  ...ui.composerControlShortcuts,
144
155
  ...selection.queuedMessageShortcuts
@@ -161,6 +172,7 @@ export const createSenderToolbarBindings = ({
161
172
  message: resources.message,
162
173
  modelUnavailable: ui.modelUnavailable,
163
174
  onAdapterChange: callbacks.onAdapterChange,
175
+ onAccountChange: callbacks.onAccountChange,
164
176
  onEffortChange: callbacks.onEffortChange,
165
177
  onInterrupt: callbacks.onInterrupt,
166
178
  onModelChange: callbacks.onModelChange,
@@ -1,5 +1,6 @@
1
1
  /* eslint-disable max-lines */
2
2
  import { App } from 'antd'
3
+ import { useEffect, useRef } from 'react'
3
4
  import { useTranslation } from 'react-i18next'
4
5
 
5
6
  import { buildSenderControllerResult } from '#~/components/chat/sender/@core/build-sender-controller-result'
@@ -22,10 +23,22 @@ import { useSenderSelectOverlays } from './use-sender-select-overlays'
22
23
  import { useSenderShortcuts } from './use-sender-shortcuts'
23
24
  import { useSenderSubmit } from './use-sender-submit'
24
25
 
26
+ const mergePendingContextFiles = <T extends { path: string }>(current: T[], incoming: T[]) => {
27
+ const nextByPath = new Map(current.map(file => [file.path, file]))
28
+ for (const file of incoming) {
29
+ if (file.path.trim() === '') {
30
+ continue
31
+ }
32
+ nextByPath.set(file.path, file)
33
+ }
34
+ return Array.from(nextByPath.values())
35
+ }
36
+
25
37
  export const useSenderController = (props: SenderProps) => {
26
38
  const { t } = useTranslation()
27
39
  const { message } = App.useApp()
28
40
  const { editorRef, fileInputRef, modelSelectRef, effortSelectRef } = useSenderRefs()
41
+ const handledContextReferenceRequestIdRef = useRef<number | null>(null)
29
42
  const { isInlineEdit, isMac, isThinking, isBusy, supportsEffort } = getSenderRuntimeState(props)
30
43
  const composer = useSenderComposerState(props.initialContent)
31
44
  const completion = useSenderCompletion({
@@ -127,6 +140,9 @@ export const useSenderController = (props: SenderProps) => {
127
140
  })
128
141
  }
129
142
  const triggerSend = (mode?: 'steer' | 'next') => {
143
+ if (props.hideSubmitAction === true) {
144
+ return
145
+ }
130
146
  if (isPermissionInteraction) {
131
147
  handleBlockedSendAttempt()
132
148
  return
@@ -135,6 +151,37 @@ export const useSenderController = (props: SenderProps) => {
135
151
  void handleSend(mode)
136
152
  }
137
153
 
154
+ useEffect(() => {
155
+ const request = props.contextReferenceRequest
156
+ if (request == null || request.files.length === 0 || isInlineEdit) {
157
+ return
158
+ }
159
+ if (handledContextReferenceRequestIdRef.current === request.id) {
160
+ return
161
+ }
162
+ handledContextReferenceRequestIdRef.current = request.id
163
+ if (props.modelUnavailable) {
164
+ void message.warning(t('chat.modelConfigRequired'))
165
+ return
166
+ }
167
+ if (props.interactionRequest != null) {
168
+ void message.warning(t('chat.fileNotSupportedInInteraction'))
169
+ return
170
+ }
171
+
172
+ composer.setPendingFiles(current => mergePendingContextFiles(current, request.files))
173
+ focusRestore.queueEditorFocusRestore()
174
+ }, [
175
+ focusRestore,
176
+ isInlineEdit,
177
+ message,
178
+ composer.setPendingFiles,
179
+ props.contextReferenceRequest,
180
+ props.interactionRequest,
181
+ props.modelUnavailable,
182
+ t
183
+ ])
184
+
138
185
  useSenderAutofocus({ autoFocus: props.autoFocus === true, editorRef })
139
186
  useSenderReferenceFocusRestore({ focusRestore, referenceActions })
140
187
 
@@ -209,7 +256,7 @@ export const useSenderController = (props: SenderProps) => {
209
256
  t
210
257
  })
211
258
 
212
- return buildSenderControllerResult({
259
+ const controller = buildSenderControllerResult({
213
260
  attachments,
214
261
  completion,
215
262
  composer,
@@ -233,4 +280,12 @@ export const useSenderController = (props: SenderProps) => {
233
280
  : undefined,
234
281
  toolbar
235
282
  })
283
+
284
+ return {
285
+ ...controller,
286
+ onInputChange: (value: string, cursorOffset: number | null) => {
287
+ controller.onInputChange(value, cursorOffset)
288
+ props.onInputChange?.(value)
289
+ }
290
+ }
236
291
  }