@vibe-forge/client 2.0.0 → 3.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/AGENTS.md +4 -1
  2. package/dist/assets/{arc-CbOXL0l9.js → arc-1JbypnRY.js} +1 -1
  3. package/dist/assets/{blockDiagram-c4efeb88-CqxINvsS.js → blockDiagram-c4efeb88-jT5b9nId.js} +1 -1
  4. package/dist/assets/{c4Diagram-c83219d4-BKazU0hb.js → c4Diagram-c83219d4-KNPh-1ta.js} +1 -1
  5. package/dist/assets/channel-pzvjJnfd.js +1 -0
  6. package/dist/assets/{classDiagram-beda092f-fAFX5BpB.js → classDiagram-beda092f-vvXuOT3F.js} +1 -1
  7. package/dist/assets/{classDiagram-v2-2358418a-w1VkNGJj.js → classDiagram-v2-2358418a-vH4j7skr.js} +1 -1
  8. package/dist/assets/clone-CtWwIeUb.js +1 -0
  9. package/dist/assets/{createText-1719965b-CEinakVP.js → createText-1719965b-COeSYnf3.js} +1 -1
  10. package/dist/assets/{cssMode-DPqRki4y.js → cssMode-Doc7QRKn.js} +1 -1
  11. package/dist/assets/{edges-96097737-Cb0F1_3K.js → edges-96097737-D09v6R_r.js} +1 -1
  12. package/dist/assets/{erDiagram-0228fc6a-C-N2fx-J.js → erDiagram-0228fc6a-CbZ6rfxl.js} +1 -1
  13. package/dist/assets/{flowDb-c6c81e3f-D1Xz_8Gf.js → flowDb-c6c81e3f-CnZOzhdk.js} +1 -1
  14. package/dist/assets/{flowDiagram-50d868cf-DyPSZyAj.js → flowDiagram-50d868cf-jv-xWM2p.js} +1 -1
  15. package/dist/assets/flowDiagram-v2-4f6560a1-BiyrkIKs.js +1 -0
  16. package/dist/assets/{flowchart-elk-definition-6af322e1-Dr1DDXwE.js → flowchart-elk-definition-6af322e1-D8pf677G.js} +1 -1
  17. package/dist/assets/{freemarker2-C3DvPFaK.js → freemarker2-CL0o23Gj.js} +1 -1
  18. package/dist/assets/{ganttDiagram-a2739b55-DmvY1GRj.js → ganttDiagram-a2739b55-BAPQzC4u.js} +1 -1
  19. package/dist/assets/{gitGraphDiagram-82fe8481-CoXfPYYi.js → gitGraphDiagram-82fe8481-BI2x71m0.js} +1 -1
  20. package/dist/assets/{graph-BkDQy7Qt.js → graph-CZK4Bjpq.js} +1 -1
  21. package/dist/assets/{handlebars-BcTFdqjl.js → handlebars-CCG38Pg6.js} +1 -1
  22. package/dist/assets/{html-Dg-O6XFr.js → html-BddshTWG.js} +1 -1
  23. package/dist/assets/{htmlMode-B_wqYWvn.js → htmlMode-xKXiYcDz.js} +1 -1
  24. package/dist/assets/{index-5325376f-kxPTR3_e.js → index-5325376f-BWMTD8RU.js} +1 -1
  25. package/dist/assets/{index-wkhI4dr6.js → index-CBe7kDkV.js} +398 -377
  26. package/dist/assets/index-MWOwVzqE.css +32 -0
  27. package/dist/assets/{infoDiagram-8eee0895-BEvqkwPI.js → infoDiagram-8eee0895-CR78btIF.js} +1 -1
  28. package/dist/assets/{javascript-DhlOH8_z.js → javascript-BPlRHPjg.js} +1 -1
  29. package/dist/assets/{journeyDiagram-c64418c1-gKtLYmmp.js → journeyDiagram-c64418c1-DZRv6FKz.js} +1 -1
  30. package/dist/assets/{jsonMode-DxTbF9OD.js → jsonMode-BYLVfdkf.js} +1 -1
  31. package/dist/assets/{layout-CDaZEk6E.js → layout-BtudyPU2.js} +1 -1
  32. package/dist/assets/{line-DNRQu8iq.js → line-DgHXrIhS.js} +1 -1
  33. package/dist/assets/{linear-Cph9Z6_j.js → linear-DtBoKICx.js} +1 -1
  34. package/dist/assets/{liquid-ByZ6JgRG.js → liquid-DxBlJk0W.js} +1 -1
  35. package/dist/assets/{lspLanguageFeatures-DzvhkgnM.js → lspLanguageFeatures-DmKVpmeH.js} +1 -1
  36. package/dist/assets/{mdx-D8RGHTl6.js → mdx-DrScsd-w.js} +1 -1
  37. package/dist/assets/{mermaid.core-BgcryF__.js → mermaid.core-Cj_NJ_lZ.js} +4 -4
  38. package/dist/assets/{mindmap-definition-8da855dc-WrxK0FcB.js → mindmap-definition-8da855dc-CMXbwtsc.js} +1 -1
  39. package/dist/assets/{pieDiagram-a8764435-VsZBsiQy.js → pieDiagram-a8764435-Bd6rfpJv.js} +1 -1
  40. package/dist/assets/{python-CXVtk_cg.js → python-Crbi7B7n.js} +1 -1
  41. package/dist/assets/{quadrantDiagram-1e28029f-BVlgwOvU.js → quadrantDiagram-1e28029f-H-FdBQn6.js} +1 -1
  42. package/dist/assets/{razor-0tind7h2.js → razor-DHyrzIfE.js} +1 -1
  43. package/dist/assets/{requirementDiagram-08caed73-CpPMPoYp.js → requirementDiagram-08caed73-BSyCVDSG.js} +1 -1
  44. package/dist/assets/{sankeyDiagram-a04cb91d-Cm5nnRmc.js → sankeyDiagram-a04cb91d-S6E6BReg.js} +1 -1
  45. package/dist/assets/{sequenceDiagram-c5b8d532-DpMlJvJB.js → sequenceDiagram-c5b8d532-BMHY4KMj.js} +1 -1
  46. package/dist/assets/{stateDiagram-1ecb1508-DU1zc7vq.js → stateDiagram-1ecb1508-BMrMw6XR.js} +1 -1
  47. package/dist/assets/{stateDiagram-v2-c2b004d7-D-0RgmAp.js → stateDiagram-v2-c2b004d7-B5SIFUb_.js} +1 -1
  48. package/dist/assets/{styles-b4e223ce-BSO-yNWV.js → styles-b4e223ce-DqiXwnx3.js} +1 -1
  49. package/dist/assets/{styles-ca3715f6-CHnsn2Ro.js → styles-ca3715f6-jNxW2Db8.js} +1 -1
  50. package/dist/assets/{styles-d45a18b0-B-rVGjEq.js → styles-d45a18b0-C4nlfLcZ.js} +1 -1
  51. package/dist/assets/{svgDrawCommon-b86b1483-CA3Pl89f.js → svgDrawCommon-b86b1483-FIWFuZfb.js} +1 -1
  52. package/dist/assets/{timeline-definition-faaaa080-BcihLR6s.js → timeline-definition-faaaa080-CEQDoqdf.js} +1 -1
  53. package/dist/assets/{tsMode-D9GGa5Ur.js → tsMode-DnNy3rE9.js} +1 -1
  54. package/dist/assets/{typescript-BT9CK_EL.js → typescript-YBZ4vw5B.js} +1 -1
  55. package/dist/assets/{xml-DNO75J-T.js → xml-BJGGYD70.js} +1 -1
  56. package/dist/assets/{xychartDiagram-f5964ef8-DJTwe32X.js → xychartDiagram-f5964ef8-DUNOFOk0.js} +1 -1
  57. package/dist/assets/{yaml-7CVzhiP2.js → yaml-BMY4mu5s.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 +596 -28
  85. package/src/components/ConfigView.tsx +569 -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 +110 -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 +220 -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 +211 -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 +130 -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 +254 -123
  119. package/src/components/chat/NewSessionGuide.scss +274 -204
  120. package/src/components/chat/NewSessionGuide.tsx +46 -111
  121. package/src/components/chat/NewSessionGuideStarterList.tsx +190 -0
  122. package/src/components/chat/NewSessionGuideStarterSection.tsx +121 -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 +21 -6
  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 +29 -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 +257 -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 +85 -9
  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/@hooks/use-skills-cli-modal-controller.ts +157 -0
  244. package/src/components/knowledge-base/components/@hooks/use-skills-tab-actions.ts +63 -0
  245. package/src/components/knowledge-base/components/ActionButton.scss +30 -4
  246. package/src/components/knowledge-base/components/ActionButton.tsx +13 -3
  247. package/src/components/knowledge-base/components/CreateSkillModal.tsx +59 -0
  248. package/src/components/knowledge-base/components/EmptyState.scss +4 -2
  249. package/src/components/knowledge-base/components/EntitiesTab.tsx +20 -20
  250. package/src/components/knowledge-base/components/EntityList.scss +3 -0
  251. package/src/components/knowledge-base/components/FilterBar.scss +1 -0
  252. package/src/components/knowledge-base/components/FilterBar.tsx +12 -8
  253. package/src/components/knowledge-base/components/FlowsTab.tsx +20 -20
  254. package/src/components/knowledge-base/components/KnowledgeBaseHeader.tsx +7 -6
  255. package/src/components/knowledge-base/components/KnowledgeContentControls.tsx +35 -0
  256. package/src/components/knowledge-base/components/KnowledgeList.scss +14 -3
  257. package/src/components/knowledge-base/components/KnowledgeMobilePanel.tsx +122 -0
  258. package/src/components/knowledge-base/components/KnowledgeSidebar.tsx +97 -0
  259. package/src/components/knowledge-base/components/LoadingState.scss +2 -1
  260. package/src/components/knowledge-base/components/ProjectSkillsList.tsx +79 -0
  261. package/src/components/knowledge-base/components/RuleList.scss +3 -0
  262. package/src/components/knowledge-base/components/RulesTab.tsx +31 -30
  263. package/src/components/knowledge-base/components/SectionHeader.scss +13 -1
  264. package/src/components/knowledge-base/components/SectionHeader.tsx +5 -3
  265. package/src/components/knowledge-base/components/SkillArchiveInput.tsx +43 -0
  266. package/src/components/knowledge-base/components/SkillHubResultItem.tsx +112 -0
  267. package/src/components/knowledge-base/components/SkillMarketResults.tsx +98 -0
  268. package/src/components/knowledge-base/components/SkillMarketView.tsx +198 -0
  269. package/src/components/knowledge-base/components/SkillMarketView.types.ts +28 -0
  270. package/src/components/knowledge-base/components/SkillRegistryErrors.tsx +21 -0
  271. package/src/components/knowledge-base/components/SkillRegistryModal.tsx +74 -0
  272. package/src/components/knowledge-base/components/SkillsCliModal.tsx +154 -0
  273. package/src/components/knowledge-base/components/SkillsTab.scss +424 -0
  274. package/src/components/knowledge-base/components/SkillsTab.tsx +166 -35
  275. package/src/components/knowledge-base/components/SkillsTabActions.tsx +88 -0
  276. package/src/components/knowledge-base/components/SpecList.scss +3 -0
  277. package/src/components/knowledge-base/components/TabContent.scss +4 -3
  278. package/src/components/knowledge-base/components/skill-hub-utils.ts +108 -0
  279. package/src/components/knowledge-base/components/use-skill-market-filters.ts +37 -0
  280. package/src/components/knowledge-base/components/use-skill-market-query-input.ts +44 -0
  281. package/src/components/knowledge-base/components/use-skill-market-search.ts +49 -0
  282. package/src/components/knowledge-base/components/use-skill-registry-modal.ts +68 -0
  283. package/src/components/monaco/monaco-runtime.ts +44 -0
  284. package/src/components/monaco/use-monaco-theme.ts +63 -0
  285. package/src/components/nav-rail-account-actions.tsx +104 -0
  286. package/src/components/server-connection/ServerConnectionGate.scss +356 -0
  287. package/src/components/server-connection/ServerConnectionGate.tsx +238 -0
  288. package/src/components/server-connection/ServerConnectionProfileModal.tsx +145 -0
  289. package/src/components/server-connection/ServerConnectionProfiles.tsx +113 -0
  290. package/src/components/server-connection/ServerConnectionUrlInput.tsx +85 -0
  291. package/src/components/sidebar/SidebarHeader.scss +5 -41
  292. package/src/components/sidebar/SidebarHeader.tsx +117 -91
  293. package/src/components/sidebar/SidebarHeaderSearchActions.tsx +24 -28
  294. package/src/components/sidebar/sidebar-search-visibility.ts +18 -0
  295. package/src/components/sidebar-list/SidebarListHeader.scss +246 -0
  296. package/src/components/sidebar-list/SidebarListHeader.tsx +146 -0
  297. package/src/components/workspace/ContextFilePicker.scss +9 -26
  298. package/src/components/workspace/ContextFilePicker.tsx +31 -113
  299. package/src/components/workspace/context-file-types.ts +36 -0
  300. package/src/components/workspace/project-file-tree/ProjectFileTree.scss +298 -0
  301. package/src/components/workspace/project-file-tree/ProjectFileTree.tsx +138 -0
  302. package/src/components/workspace/project-file-tree/ProjectFileTreeRow.tsx +167 -0
  303. package/src/components/workspace/project-file-tree/ProjectFileTreeRowContextMenu.tsx +106 -0
  304. package/src/components/workspace/project-file-tree/ProjectFileTreeRows.tsx +139 -0
  305. package/src/components/workspace/project-file-tree/project-file-tree-helpers.ts +101 -0
  306. package/src/components/workspace/project-file-tree/project-file-tree-icons.ts +93 -0
  307. package/src/components/workspace/project-file-tree/project-file-tree-types.ts +27 -0
  308. package/src/components/workspace/project-file-tree/use-project-file-tree-data.ts +197 -0
  309. package/src/components/workspace/project-file-tree/use-project-file-tree-selection.ts +144 -0
  310. package/src/hooks/chat/chat-session-target.ts +69 -0
  311. package/src/hooks/chat/chat-session-workspace-draft.ts +11 -4
  312. package/src/hooks/chat/interaction-state.ts +1 -0
  313. package/src/hooks/chat/optimistic-session-creation.ts +189 -0
  314. package/src/hooks/chat/use-chat-adapter-account-selection.tsx +156 -0
  315. package/src/hooks/chat/use-chat-route-bottom-panel.ts +181 -0
  316. package/src/hooks/chat/use-chat-route-deep-link-view.ts +33 -0
  317. package/src/hooks/chat/use-chat-session-actions.ts +259 -65
  318. package/src/hooks/chat/use-chat-session-messages.ts +71 -4
  319. package/src/hooks/chat/use-chat-session.ts +36 -1
  320. package/src/hooks/chat/workspace-file-panel-state.ts +43 -0
  321. package/src/hooks/session-subscription-cache.ts +25 -0
  322. package/src/hooks/use-chat-layout-query-state.ts +29 -0
  323. package/src/hooks/use-sender-header-query-state.ts +35 -0
  324. package/src/hooks/use-session-subscription.ts +17 -8
  325. package/src/hooks/useQueryParams.ts +91 -23
  326. package/src/i18n-resources.ts +44 -0
  327. package/src/i18n.ts +21 -6
  328. package/src/main.tsx +8 -0
  329. package/src/pwa.ts +46 -0
  330. package/src/resources/locales/en.json +741 -24
  331. package/src/resources/locales/zh.json +743 -26
  332. package/src/routes/ChatRoute.scss +110 -7
  333. package/src/routes/ChatRoute.tsx +11 -165
  334. package/src/routes/ChatRouteBottomPanel.tsx +47 -0
  335. package/src/routes/ChatRouteView.tsx +199 -0
  336. package/src/runtime-config.ts +155 -2
  337. package/src/server-connection-history.ts +179 -0
  338. package/src/store/index.ts +151 -3
  339. package/src/styles/global.scss +3 -0
  340. package/src/utils/mobile-viewport.ts +67 -0
  341. package/src/version-compatibility.ts +37 -0
  342. package/src/vite-env.d.ts +9 -0
  343. package/src/ws.ts +20 -9
  344. package/vite.config.ts +23 -1
  345. package/dist/assets/channel-Dnopc5A6.js +0 -1
  346. package/dist/assets/clone-sQthahUA.js +0 -1
  347. package/dist/assets/flowDiagram-v2-4f6560a1-OazrdWQO.js +0 -1
  348. package/dist/assets/index-o93dlo92.css +0 -32
  349. package/src/components/chat/NewSessionGuideCompactPanel.tsx +0 -130
  350. package/src/components/chat/NewSessionGuideGrid.tsx +0 -141
  351. package/src/components/chat/sender/@components/reference-actions/ReferencePermissionActionsPopover.tsx +0 -114
@@ -13,13 +13,22 @@ import type {
13
13
  SessionQueuedMessage,
14
14
  SessionQueuedMessageMode
15
15
  } from '@vibe-forge/core'
16
- import type { ConfigResponse, SessionInfo } from '@vibe-forge/types'
16
+ import type { ConfigResponse, ConversationStarterConfig, SessionInfo } from '@vibe-forge/types'
17
17
 
18
18
  import { getConfig } from '#~/api'
19
+ import { ComposerLanding, ComposerStack } from '#~/components/composer-landing/ComposerLanding'
20
+ import type { ContextReferenceRequest } from '#~/components/workspace/context-file-types'
21
+ import {
22
+ DEFAULT_CHAT_SESSION_TARGET_DRAFT,
23
+ getChatSessionTargetDraftFromSession,
24
+ isChatSessionTargetReady
25
+ } from '#~/hooks/chat/chat-session-target'
26
+ import type { ChatSessionTargetDraft } from '#~/hooks/chat/chat-session-target'
19
27
  import {
20
28
  DEFAULT_CHAT_SESSION_WORKSPACE_DRAFT,
21
29
  getChatSessionWorkspaceDraftFromConfig
22
30
  } from '#~/hooks/chat/chat-session-workspace-draft'
31
+ import type { ChatAdapterAccountOption } from '#~/hooks/chat/use-chat-adapter-account-selection'
23
32
  import type { ChatEffort } from '#~/hooks/chat/use-chat-effort'
24
33
  import type { ModelSelectMenuGroup, ModelSelectOption } from '#~/hooks/chat/use-chat-model-adapter-selection'
25
34
  import type { PermissionMode } from '#~/hooks/chat/use-chat-permission-mode'
@@ -33,8 +42,15 @@ import { QueuedMessagesCard } from './QueuedMessagesCard'
33
42
  import { MessageItem } from './messages/MessageItem'
34
43
  import { MessageStatusNotice } from './messages/MessageStatusNotice'
35
44
  import type { ChatHistoryStatusNotice } from './messages/build-chat-history-status-notices'
45
+ import { getLastAssistantActionAnchorId, getLastMessageAnchorId } from './messages/message-action-utils'
36
46
  import { buildMessageTurns } from './messages/message-turns'
37
47
  import { processMessages } from './messages/message-utils'
48
+ import {
49
+ buildConversationStarterInitialContent,
50
+ buildConversationStarterTargetDraft,
51
+ buildConversationStarterWorkspacePatch,
52
+ getNewSessionGuideData
53
+ } from './new-session-guide-config'
38
54
  import { SenderInteractionPanel } from './sender/@components/sender-interaction-panel/SenderInteractionPanel'
39
55
  import { Sender } from './sender/Sender'
40
56
  import { ChatStatusBar } from './status-bar/ChatStatusBar'
@@ -73,8 +89,13 @@ export function ChatHistoryView({
73
89
  selectedAdapter,
74
90
  adapterOptions,
75
91
  onAdapterChange,
92
+ selectedAccount,
93
+ accountOptions,
94
+ showAccountSelector,
95
+ onAccountChange,
76
96
  modelUnavailable,
77
- hasAvailableModels
97
+ hasAvailableModels,
98
+ contextReferenceRequest
78
99
  }: {
79
100
  isReady: boolean
80
101
  messages: ChatMessage[]
@@ -108,8 +129,13 @@ export function ChatHistoryView({
108
129
  selectedAdapter?: string
109
130
  adapterOptions: Array<{ value: string; label: React.ReactNode }>
110
131
  onAdapterChange: (adapter: string) => void
132
+ selectedAccount?: string
133
+ accountOptions: ChatAdapterAccountOption[]
134
+ showAccountSelector: boolean
135
+ onAccountChange: (account: string) => void
111
136
  modelUnavailable: boolean
112
137
  hasAvailableModels: boolean
138
+ contextReferenceRequest?: ContextReferenceRequest | null
113
139
  }) {
114
140
  const { t } = useTranslation()
115
141
  const { message } = App.useApp()
@@ -121,17 +147,18 @@ export function ChatHistoryView({
121
147
  [configRes]
122
148
  )
123
149
  const workspaceDraftDirtyRef = useRef(false)
150
+ const [sessionTargetDraft, setSessionTargetDraft] = useState<ChatSessionTargetDraft>(() => ({
151
+ ...DEFAULT_CHAT_SESSION_TARGET_DRAFT
152
+ }))
124
153
  const [workspaceDraft, setWorkspaceDraft] = useState(() => ({
125
154
  ...DEFAULT_CHAT_SESSION_WORKSPACE_DRAFT
126
155
  }))
127
- const historyRenderCount = messages.length + historyStatusNotices.length
128
- const { messagesEndRef, messagesContainerRef, messagesContentRef, showScrollBottom, scrollToBottom } = useChatScroll({
129
- contentVersion: historyRenderCount
130
- })
156
+ const [newSessionInitialContent, setNewSessionInitialContent] = useState<ChatMessageContent[] | undefined>(undefined)
131
157
  const {
132
158
  isCreating,
133
159
  send,
134
160
  sendContent,
161
+ retrySessionCreation,
135
162
  enqueueContent,
136
163
  removeQueuedContent,
137
164
  moveQueuedContent,
@@ -148,9 +175,16 @@ export function ChatHistoryView({
148
175
  effort,
149
176
  permissionMode,
150
177
  adapter: selectedAdapter,
178
+ account: selectedAccount,
179
+ sessionTargetDraft,
151
180
  workspaceDraft,
152
181
  onClearMessages
153
182
  })
183
+ const showThinkingIndicator = isCreating || session?.status === 'running'
184
+ const historyRenderCount = messages.length + historyStatusNotices.length + (showThinkingIndicator ? 1 : 0)
185
+ const { messagesEndRef, messagesContainerRef, messagesContentRef, showScrollBottom, scrollToBottom } = useChatScroll({
186
+ contentVersion: historyRenderCount
187
+ })
154
188
  const initialScrollDoneRef = useRef(false)
155
189
  const handledHashAnchorIdRef = useRef('')
156
190
  const handledTargetScrollKeyRef = useRef('')
@@ -160,6 +194,10 @@ export function ChatHistoryView({
160
194
  const [queuedDraft, setQueuedDraft] = useState<{ content: ChatMessageContent[] } | null>(null)
161
195
  const [activeInteractionOptionIndex, setActiveInteractionOptionIndex] = useState(0)
162
196
  const interactionOptions = interactionRequest?.payload.options ?? []
197
+ const { announcements, startupPresets, builtinActions } = useMemo(
198
+ () => getNewSessionGuideData(configRes),
199
+ [configRes]
200
+ )
163
201
  const buildUserMessage = (content: string | ChatMessageContent[]): ChatMessage => {
164
202
  const id = globalThis.crypto?.randomUUID
165
203
  ? globalThis.crypto.randomUUID()
@@ -171,8 +209,20 @@ export function ChatHistoryView({
171
209
  createdAt: Date.now()
172
210
  }
173
211
  }
212
+ const validateSessionTarget = () => {
213
+ if (session?.id != null || isChatSessionTargetReady(sessionTargetDraft)) {
214
+ return true
215
+ }
216
+
217
+ void message.warning(t('chat.sessionTarget.missingResourceWarning'))
218
+ return false
219
+ }
174
220
 
175
221
  const handleSendContent = async (content: ChatMessageContent[], mode?: SessionQueuedMessageMode) => {
222
+ if (!validateSessionTarget()) {
223
+ return false
224
+ }
225
+
176
226
  const resolvedMode = mode ?? queueMode
177
227
 
178
228
  if (session?.id && session.status === 'running') {
@@ -185,12 +235,7 @@ export function ChatHistoryView({
185
235
  }
186
236
 
187
237
  if (!session?.id) {
188
- const optimisticMessage = buildUserMessage(content)
189
- setMessages((prev) => [...prev, optimisticMessage])
190
238
  const didSend = await sendContent(content, mode)
191
- if (!didSend) {
192
- setMessages((prev) => prev.filter((message) => message.id !== optimisticMessage.id))
193
- }
194
239
  if (didSend && queuedDraft != null) {
195
240
  setQueuedDraft(null)
196
241
  setQueueMode('steer')
@@ -210,6 +255,10 @@ export function ChatHistoryView({
210
255
  }
211
256
 
212
257
  const handleSend = async (text: string, mode?: SessionQueuedMessageMode) => {
258
+ if (!validateSessionTarget()) {
259
+ return false
260
+ }
261
+
213
262
  const resolvedMode = mode ?? queueMode
214
263
 
215
264
  if (session?.id && session.status === 'running') {
@@ -222,12 +271,7 @@ export function ChatHistoryView({
222
271
  }
223
272
 
224
273
  if (!session?.id) {
225
- const optimisticMessage = buildUserMessage(text)
226
- setMessages((prev) => [...prev, optimisticMessage])
227
274
  const didSend = await send(text, mode)
228
- if (!didSend) {
229
- setMessages((prev) => prev.filter((message) => message.id !== optimisticMessage.id))
230
- }
231
275
  if (didSend && queuedDraft != null) {
232
276
  setQueuedDraft(null)
233
277
  setQueueMode('steer')
@@ -253,7 +297,13 @@ export function ChatHistoryView({
253
297
  setExpandedTurnIds(new Set())
254
298
  setQueuedDraft(null)
255
299
  setQueueMode('steer')
256
- }, [session?.id])
300
+ setNewSessionInitialContent(undefined)
301
+ setSessionTargetDraft(
302
+ session?.id != null
303
+ ? getChatSessionTargetDraftFromSession(session)
304
+ : { ...DEFAULT_CHAT_SESSION_TARGET_DRAFT }
305
+ )
306
+ }, [session?.id, session?.promptName, session?.promptType])
257
307
  useEffect(() => {
258
308
  if (session?.id != null) {
259
309
  return
@@ -339,6 +389,56 @@ export function ChatHistoryView({
339
389
  }
340
390
  const isInlineEditing = editingMessageId != null
341
391
  const shouldShowNewSessionGuide = !session?.id && messages.length === 0 && historyStatusNotices.length === 0
392
+ const handleApplyConversationStarter = useCallback((starter: ConversationStarterConfig) => {
393
+ if (session?.id != null) {
394
+ return
395
+ }
396
+
397
+ if (starter.mode != null) {
398
+ setSessionTargetDraft(buildConversationStarterTargetDraft(starter))
399
+ }
400
+
401
+ const workspacePatch = buildConversationStarterWorkspacePatch(starter)
402
+ if (workspacePatch != null) {
403
+ workspaceDraftDirtyRef.current = true
404
+ setWorkspaceDraft(current => ({
405
+ ...current,
406
+ ...workspacePatch
407
+ }))
408
+ }
409
+
410
+ const model = starter.model?.trim()
411
+ if (model != null && model !== '') {
412
+ onModelChange(model)
413
+ }
414
+
415
+ const adapter = starter.adapter?.trim()
416
+ if (adapter != null && adapter !== '') {
417
+ onAdapterChange(adapter)
418
+ }
419
+
420
+ const account = starter.account?.trim()
421
+ if (account != null && account !== '') {
422
+ onAccountChange(account)
423
+ }
424
+
425
+ if (starter.effort != null) {
426
+ onEffortChange(starter.effort)
427
+ }
428
+
429
+ if (starter.permissionMode != null) {
430
+ onPermissionModeChange(starter.permissionMode)
431
+ }
432
+
433
+ setNewSessionInitialContent(buildConversationStarterInitialContent(starter))
434
+ }, [
435
+ onAccountChange,
436
+ onAdapterChange,
437
+ onEffortChange,
438
+ onModelChange,
439
+ onPermissionModeChange,
440
+ session?.id
441
+ ])
342
442
  const renderItems = useMemo(() => processMessages(messages), [messages])
343
443
  const hashAnchorId = useMemo(() => decodeURIComponent(location.hash.replace(/^#/, '')), [location.hash])
344
444
  const targetAnchorId = useMemo(() => {
@@ -365,16 +465,9 @@ export function ChatHistoryView({
365
465
  hashAnchorId: hashAnchorId !== '' ? hashAnchorId : targetAnchorId,
366
466
  keepLastTurnExpanded: isCreating || session?.status === 'running' || session?.status === 'waiting_input'
367
467
  }), [expandedTurnIds, hashAnchorId, isCreating, renderItems, session?.status, targetAnchorId])
368
- const lastAssistantActionAnchorId = useMemo(() => {
369
- for (let index = renderItems.length - 1; index >= 0; index -= 1) {
370
- const item = renderItems[index]
371
- if (item == null) continue
372
- if (item.type === 'tool-group') continue
373
- if (item.message.role === 'user') continue
374
- return item.anchorId
375
- }
376
- return null
377
- }, [renderItems])
468
+ const isSessionBusy = isCreating || session?.status === 'running' || session?.status === 'waiting_input'
469
+ const lastAssistantActionAnchorId = useMemo(() => getLastAssistantActionAnchorId(renderItems), [renderItems])
470
+ const lastMessageAnchorId = useMemo(() => getLastMessageAnchorId(renderItems), [renderItems])
378
471
  const handleEditQueuedMessage = async (item: SessionQueuedMessage) => {
379
472
  const removed = await removeQueuedContent(item.id)
380
473
  if (!removed) {
@@ -576,8 +669,8 @@ export function ChatHistoryView({
576
669
  isEditing={editingMessageId === item.originalMessage.id}
577
670
  isCompactLayout={isCompactLayout}
578
671
  isTouchInteraction={isTouchInteraction}
579
- isSessionBusy={isCreating || session?.status === 'running' ||
580
- session?.status === 'waiting_input'}
672
+ isSessionBusy={isSessionBusy}
673
+ hideActionButtons={isSessionBusy && item.anchorId === lastMessageAnchorId}
581
674
  showAssistantActions={item.anchorId === lastAssistantActionAnchorId}
582
675
  onEditMessage={editMessage}
583
676
  onForkMessage={forkMessage}
@@ -604,6 +697,111 @@ export function ChatHistoryView({
604
697
  )
605
698
  }
606
699
 
700
+ const composerContent = (
701
+ <>
702
+ {isPermissionInteraction && interactionPanel}
703
+ <CurrentTodoList messages={messages} />
704
+ {!isInlineEditing && (
705
+ <QueuedMessagesCard
706
+ mode='next'
707
+ items={queuedMessages.next}
708
+ onMove={(item, targetMode) => void handleMoveQueuedMessage(item, targetMode)}
709
+ onDelete={(item) => void removeQueuedContent(item.id)}
710
+ onEdit={(item) => void handleEditQueuedMessage(item)}
711
+ onReorder={(ids) => reorderQueuedContent('next', ids)}
712
+ />
713
+ )}
714
+ {!isInlineEditing && (
715
+ <QueuedMessagesCard
716
+ mode='steer'
717
+ items={queuedMessages.steer}
718
+ onMove={(item, targetMode) => void handleMoveQueuedMessage(item, targetMode)}
719
+ onDelete={(item) => void removeQueuedContent(item.id)}
720
+ onEdit={(item) => void handleEditQueuedMessage(item)}
721
+ onReorder={(ids) => reorderQueuedContent('steer', ids)}
722
+ />
723
+ )}
724
+ {!isPermissionInteraction && interactionPanel}
725
+ {!isInlineEditing && (
726
+ <div className='sender-container'>
727
+ <Sender
728
+ onSend={handleSend}
729
+ onSendContent={handleSendContent}
730
+ adapterLocked={session?.id != null}
731
+ sessionId={session?.id}
732
+ sessionStatus={isCreating ? 'running' : session?.status}
733
+ onInterrupt={interrupt}
734
+ onClear={clearMessages}
735
+ sessionInfo={sessionInfo}
736
+ interactionRequest={interactionRequest}
737
+ onInteractionResponse={onInteractionResponse}
738
+ interactionOptionNavigation={interactionRequest != null && interactionOptions.length > 0
739
+ ? {
740
+ optionCount: interactionOptions.length,
741
+ activeIndex: activeInteractionOptionIndex,
742
+ onMove: handleMoveInteractionOption,
743
+ onSubmit: handleSubmitActiveInteractionOption
744
+ }
745
+ : undefined}
746
+ initialContent={queuedDraft?.content ?? newSessionInitialContent}
747
+ placeholder={placeholder}
748
+ submitLabel={queuedDraft != null ? t('chat.queue.requeueMessage') : undefined}
749
+ modelMenuGroups={modelMenuGroups}
750
+ modelSearchOptions={modelSearchOptions}
751
+ recommendedModelOptions={recommendedModelOptions}
752
+ servicePreviewModelOptions={servicePreviewModelOptions}
753
+ onToggleRecommendedModel={onToggleRecommendedModel}
754
+ updatingRecommendedModelValue={updatingRecommendedModelValue}
755
+ selectedModel={selectedModel}
756
+ onModelChange={onModelChange}
757
+ effort={effort}
758
+ effortOptions={effortOptions}
759
+ onEffortChange={onEffortChange}
760
+ permissionMode={permissionMode}
761
+ permissionModeOptions={permissionModeOptions}
762
+ onPermissionModeChange={onPermissionModeChange}
763
+ selectedAdapter={selectedAdapter}
764
+ adapterOptions={adapterOptions}
765
+ onAdapterChange={onAdapterChange}
766
+ selectedAccount={selectedAccount}
767
+ accountOptions={accountOptions}
768
+ showAccountSelector={showAccountSelector}
769
+ onAccountChange={onAccountChange}
770
+ modelUnavailable={modelUnavailable}
771
+ sessionTarget={{
772
+ draft: session?.id != null ? getChatSessionTargetDraftFromSession(session) : sessionTargetDraft,
773
+ locked: session?.id != null,
774
+ disabled: isCreating,
775
+ onChange: setSessionTargetDraft
776
+ }}
777
+ queueMode={queueMode}
778
+ onQueueModeChange={setQueueMode}
779
+ contextReferenceRequest={contextReferenceRequest}
780
+ />
781
+ <ChatStatusBar
782
+ draftWorkspace={workspaceDraft}
783
+ isCreating={isCreating}
784
+ sessionId={session?.id}
785
+ adapterLocked={session?.id != null}
786
+ isThinking={isCreating || session?.status === 'running'}
787
+ modelUnavailable={modelUnavailable}
788
+ selectedAdapter={selectedAdapter}
789
+ adapterOptions={adapterOptions}
790
+ onAdapterChange={onAdapterChange}
791
+ selectedAccount={selectedAccount}
792
+ accountOptions={accountOptions}
793
+ showAccountSelector={showAccountSelector}
794
+ onAccountChange={onAccountChange}
795
+ onDraftWorkspaceChange={(nextDraft) => {
796
+ workspaceDraftDirtyRef.current = true
797
+ setWorkspaceDraft(nextDraft)
798
+ }}
799
+ />
800
+ </div>
801
+ )}
802
+ </>
803
+ )
804
+
607
805
  return (
608
806
  <>
609
807
  <div className={`chat-messages ${isReady ? 'ready' : ''}`} ref={messagesContainerRef}>
@@ -644,8 +842,16 @@ export function ChatHistoryView({
644
842
  key={notice.id}
645
843
  notice={notice}
646
844
  onRetryConnection={onRetryConnection}
845
+ onRetrySessionCreation={() => {
846
+ void retrySessionCreation()
847
+ }}
647
848
  />
648
849
  ))}
850
+ {showThinkingIndicator && (
851
+ <div className='chat-thinking-indicator' role='status' aria-live='polite'>
852
+ <span className='chat-thinking-indicator__text'>{t('chat.thinking')}</span>
853
+ </div>
854
+ )}
649
855
  <div ref={messagesEndRef} />
650
856
  </div>
651
857
 
@@ -656,101 +862,26 @@ export function ChatHistoryView({
656
862
  )}
657
863
  </div>
658
864
 
659
- {shouldShowNewSessionGuide && !isCompactLayout && (
660
- <div className='new-session-guide-wrapper'>
661
- <NewSessionGuide />
662
- </div>
663
- )}
664
-
665
- {shouldShowNewSessionGuide && isCompactLayout && (
666
- <div className='new-session-guide-wrapper is-compact-layout'>
667
- <NewSessionGuide />
668
- </div>
669
- )}
670
-
671
- <div className='chat-composer-stack'>
672
- <div className='chat-composer-stack__inner'>
673
- {isPermissionInteraction && interactionPanel}
674
- <CurrentTodoList messages={messages} />
675
- {!isInlineEditing && (
676
- <QueuedMessagesCard
677
- mode='next'
678
- items={queuedMessages.next}
679
- onMove={(item, targetMode) => void handleMoveQueuedMessage(item, targetMode)}
680
- onDelete={(item) => void removeQueuedContent(item.id)}
681
- onEdit={(item) => void handleEditQueuedMessage(item)}
682
- onReorder={(ids) => reorderQueuedContent('next', ids)}
865
+ {shouldShowNewSessionGuide
866
+ ? (
867
+ <ComposerLanding
868
+ compact={isCompactLayout}
869
+ composer={composerContent}
870
+ contentClassName='chat-history-view__new-session-content'
871
+ >
872
+ <NewSessionGuide
873
+ announcements={announcements}
874
+ startupPresets={startupPresets}
875
+ builtinActions={builtinActions}
876
+ onApplyStarter={handleApplyConversationStarter}
683
877
  />
684
- )}
685
- {!isInlineEditing && (
686
- <QueuedMessagesCard
687
- mode='steer'
688
- items={queuedMessages.steer}
689
- onMove={(item, targetMode) => void handleMoveQueuedMessage(item, targetMode)}
690
- onDelete={(item) => void removeQueuedContent(item.id)}
691
- onEdit={(item) => void handleEditQueuedMessage(item)}
692
- onReorder={(ids) => reorderQueuedContent('steer', ids)}
693
- />
694
- )}
695
- {!isPermissionInteraction && interactionPanel}
696
- {!isInlineEditing && (
697
- <div className='sender-container'>
698
- <Sender
699
- onSend={handleSend}
700
- onSendContent={handleSendContent}
701
- adapterLocked={session?.id != null}
702
- sessionId={session?.id}
703
- sessionStatus={isCreating ? 'running' : session?.status}
704
- onInterrupt={interrupt}
705
- onClear={clearMessages}
706
- sessionInfo={sessionInfo}
707
- interactionRequest={interactionRequest}
708
- onInteractionResponse={onInteractionResponse}
709
- interactionOptionNavigation={interactionRequest != null && interactionOptions.length > 0
710
- ? {
711
- optionCount: interactionOptions.length,
712
- activeIndex: activeInteractionOptionIndex,
713
- onMove: handleMoveInteractionOption,
714
- onSubmit: handleSubmitActiveInteractionOption
715
- }
716
- : undefined}
717
- initialContent={queuedDraft?.content}
718
- placeholder={placeholder}
719
- submitLabel={queuedDraft != null ? t('chat.queue.requeueMessage') : undefined}
720
- modelMenuGroups={modelMenuGroups}
721
- modelSearchOptions={modelSearchOptions}
722
- recommendedModelOptions={recommendedModelOptions}
723
- servicePreviewModelOptions={servicePreviewModelOptions}
724
- onToggleRecommendedModel={onToggleRecommendedModel}
725
- updatingRecommendedModelValue={updatingRecommendedModelValue}
726
- selectedModel={selectedModel}
727
- onModelChange={onModelChange}
728
- effort={effort}
729
- effortOptions={effortOptions}
730
- onEffortChange={onEffortChange}
731
- permissionMode={permissionMode}
732
- permissionModeOptions={permissionModeOptions}
733
- onPermissionModeChange={onPermissionModeChange}
734
- selectedAdapter={selectedAdapter}
735
- adapterOptions={adapterOptions}
736
- onAdapterChange={onAdapterChange}
737
- modelUnavailable={modelUnavailable}
738
- queueMode={queueMode}
739
- onQueueModeChange={setQueueMode}
740
- />
741
- <ChatStatusBar
742
- draftWorkspace={workspaceDraft}
743
- isCreating={isCreating}
744
- sessionId={session?.id}
745
- onDraftWorkspaceChange={(nextDraft) => {
746
- workspaceDraftDirtyRef.current = true
747
- setWorkspaceDraft(nextDraft)
748
- }}
749
- />
750
- </div>
751
- )}
752
- </div>
753
- </div>
878
+ </ComposerLanding>
879
+ )
880
+ : (
881
+ <ComposerStack>
882
+ {composerContent}
883
+ </ComposerStack>
884
+ )}
754
885
  </>
755
886
  )
756
887
  }