@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
@@ -1,12 +1,11 @@
1
1
  .automation-view {
2
+ position: relative;
3
+
2
4
  &__body {
3
5
  flex-direction: row;
4
6
  gap: 0;
5
7
  padding: 0;
6
- }
7
-
8
- &__mobile-switcher-shell {
9
- display: none;
8
+ position: relative;
10
9
  }
11
10
 
12
11
  display: flex;
@@ -25,9 +24,29 @@
25
24
  flex-direction: column;
26
25
  overflow: hidden;
27
26
  background: var(--sub-bg-color);
27
+ transition:
28
+ width .3s cubic-bezier(.4, 0, .2, 1),
29
+ min-width .3s cubic-bezier(.4, 0, .2, 1),
30
+ max-width .3s cubic-bezier(.4, 0, .2, 1);
31
+
32
+ &.is-collapsed {
33
+ width: 0;
34
+ min-width: 0;
35
+ max-width: 0;
36
+ pointer-events: none;
37
+
38
+ .automation-view__sidebar {
39
+ transform: translateX(calc(-1 * var(--subpage-secondary-panel-width)));
40
+ }
41
+ }
28
42
  }
29
43
 
30
44
  &__right {
45
+ --automation-view-right-padding-x: 12px;
46
+ --automation-view-right-padding-bottom: 12px;
47
+
48
+ display: flex;
49
+ flex-direction: column;
31
50
  flex: 1;
32
51
  overflow: hidden;
33
52
  min-width: 0;
@@ -37,23 +56,81 @@
37
56
  border-radius: var(--subpage-content-card-radius);
38
57
  background: var(--subpage-content-card-bg);
39
58
  }
40
- }
41
59
 
42
- @media (max-width: 1100px) {
43
- .automation-view {
44
- &__body {
45
- flex-direction: column;
60
+ &__mobile-rule-backdrop,
61
+ &__mobile-rule-sheet {
62
+ display: none;
63
+ }
64
+
65
+ &__select-arrow {
66
+ color: var(--sub-text-color);
67
+ font-size: 16px;
68
+ line-height: 1;
69
+ pointer-events: none;
70
+ transition: transform .18s ease, color .18s ease;
71
+ }
72
+
73
+ .ant-select-open &__select-arrow,
74
+ .ant-select-focused &__select-arrow {
75
+ color: var(--text-color);
76
+ }
77
+
78
+ .ant-select-open &__select-arrow {
79
+ transform: rotate(180deg);
80
+ }
81
+
82
+ &__title-leading-actions {
83
+ display: inline-flex;
84
+ align-items: center;
85
+ gap: 4px;
86
+ flex-shrink: 0;
87
+ }
88
+
89
+ &__title-action-button.ant-btn {
90
+ display: inline-flex;
91
+ align-items: center;
92
+ justify-content: center;
93
+ width: 24px;
94
+ min-width: 24px;
95
+ height: 24px;
96
+ padding: 0;
97
+ border: none;
98
+ border-radius: 6px;
99
+ background: transparent;
100
+ color: var(--sub-text-color);
101
+ box-shadow: none;
102
+
103
+ .ant-btn-icon {
104
+ display: inline-flex;
105
+ align-items: center;
106
+ justify-content: center;
107
+ margin-inline-end: 0;
108
+ line-height: 1;
46
109
  }
47
110
 
48
- &__left {
49
- width: 100%;
50
- min-width: 0;
51
- max-height: 360px;
111
+ &:not(:disabled):hover,
112
+ &:not(:disabled):focus-visible {
113
+ background: var(--nav-hover-bg, var(--tag-hover-bg));
114
+ color: var(--text-color);
115
+ }
116
+
117
+ &.is-active,
118
+ &.is-active:disabled {
119
+ border: 1px solid var(--primary-color);
120
+ background: transparent;
121
+ color: var(--primary-color);
122
+ opacity: 1;
52
123
  }
124
+ }
125
+
126
+ &__title-action-icon {
127
+ font-size: 16px;
128
+ line-height: 1;
129
+ }
53
130
 
54
- &__right {
55
- margin-top: 0;
56
- margin-left: var(--subpage-content-card-gap);
131
+ &--left-collapsed {
132
+ .automation-view__right {
133
+ margin: 4px;
57
134
  }
58
135
  }
59
136
  }
@@ -62,24 +139,7 @@
62
139
  .automation-view--compact {
63
140
  .automation-view__body {
64
141
  gap: 0;
65
- }
66
-
67
- .automation-view__mobile-switcher-shell {
68
- display: block;
69
- padding: 12px;
70
- padding-bottom: 0;
71
- }
72
-
73
- .automation-view__mobile-switcher {
74
- width: 100%;
75
-
76
- .ant-segmented-group {
77
- gap: 4px;
78
- }
79
-
80
- .ant-segmented-item {
81
- min-height: 32px;
82
- }
142
+ height: 100%;
83
143
  }
84
144
 
85
145
  .automation-view__left,
@@ -88,9 +148,9 @@
88
148
  min-width: 0;
89
149
  max-width: none;
90
150
  max-height: none;
91
- margin: 12px;
92
- margin-top: 12px;
93
- border-radius: var(--subpage-content-card-radius);
151
+ height: 100%;
152
+ margin: 0;
153
+ border-radius: 0;
94
154
  background: var(--subpage-content-card-bg);
95
155
  overflow: hidden;
96
156
  }
@@ -98,5 +158,73 @@
98
158
  .automation-view__right {
99
159
  padding: 12px;
100
160
  }
161
+
162
+ .automation-view__mobile-rule-backdrop {
163
+ position: absolute;
164
+ inset: 0;
165
+ display: block;
166
+ border: none;
167
+ background: rgba(0, 0, 0, .28);
168
+ opacity: 0;
169
+ visibility: hidden;
170
+ pointer-events: none;
171
+ transition: opacity .24s ease, visibility 0s linear .24s;
172
+ z-index: 30;
173
+ }
174
+
175
+ .automation-view__mobile-rule-backdrop.is-open {
176
+ opacity: 1;
177
+ visibility: visible;
178
+ pointer-events: auto;
179
+ transition-delay: 0s;
180
+ }
181
+
182
+ .automation-view__mobile-rule-sheet {
183
+ position: absolute;
184
+ top: 0;
185
+ left: 0;
186
+ bottom: 0;
187
+ display: block;
188
+ width: min(320px, calc(100% - 24px));
189
+ max-width: calc(100% - 24px);
190
+ transform: translateX(-100%);
191
+ visibility: hidden;
192
+ pointer-events: none;
193
+ transition:
194
+ transform .24s cubic-bezier(.4, 0, .2, 1),
195
+ visibility 0s linear .24s;
196
+ z-index: 31;
197
+ overscroll-behavior: contain;
198
+ }
199
+
200
+ .automation-view__mobile-rule-sheet.is-open {
201
+ transform: translateX(0);
202
+ visibility: visible;
203
+ pointer-events: auto;
204
+ transition-delay: 0s;
205
+ }
206
+
207
+ .automation-view__left--mobile-sheet {
208
+ width: 100%;
209
+ min-width: 0;
210
+ max-width: none;
211
+ height: 100%;
212
+ border-right: 1px solid var(--border-color);
213
+ border-radius: 0 8px 8px 0;
214
+ background: var(--sub-bg-color);
215
+ box-shadow: 0 16px 36px rgba(15, 23, 42, .22);
216
+ overflow: hidden;
217
+ overscroll-behavior: contain;
218
+ }
219
+ }
220
+ }
221
+
222
+ html.dark .automation-view--compact {
223
+ .automation-view__mobile-rule-backdrop {
224
+ background: rgba(0, 0, 0, .48);
225
+ }
226
+
227
+ .automation-view__left--mobile-sheet {
228
+ box-shadow: 0 18px 44px rgba(0, 0, 0, .42);
101
229
  }
102
230
  }
@@ -1,7 +1,7 @@
1
1
  import './index.scss'
2
2
 
3
- import { App, Segmented } from 'antd'
4
- import React, { useCallback, useEffect, useMemo, useState } from 'react'
3
+ import { App } from 'antd'
4
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
5
5
  import { useTranslation } from 'react-i18next'
6
6
  import { useNavigate } from 'react-router-dom'
7
7
  import useSWR from 'swr'
@@ -16,6 +16,7 @@ import {
16
16
  runAutomationRule,
17
17
  updateAutomationRule
18
18
  } from '#~/api.js'
19
+ import { useMobileSidebarModal } from '#~/components/layout/@hooks/use-mobile-sidebar-modal'
19
20
  import { PageShell } from '#~/components/layout/PageShell'
20
21
  import { useResponsiveLayout } from '#~/hooks/use-responsive-layout'
21
22
  import { useQueryParams } from '#~/hooks/useQueryParams.js'
@@ -47,8 +48,24 @@ export function AutomationView() {
47
48
  const rules = data?.rules ?? []
48
49
  const [panelMode, setPanelMode] = useState<PanelMode>('view')
49
50
  const [submitting, setSubmitting] = useState(false)
50
- const [mobilePanel, setMobilePanel] = useState<'rules' | 'details'>('rules')
51
+ const [mobilePanel, setMobilePanel] = useState<'rules' | 'details'>('details')
52
+ const [isRulePanelCollapsed, setIsRulePanelCollapsed] = useState(false)
53
+ const detailPanelRef = useRef<HTMLDivElement | null>(null)
54
+ const mobileRulePanelSheetRef = useRef<HTMLDivElement | null>(null)
55
+ const [favorites, setFavorites] = useState<string[]>(() => {
56
+ try {
57
+ const raw = window.localStorage.getItem('automationRuleFavorites')
58
+ if (!raw) return []
59
+ const parsed = JSON.parse(raw) as string[]
60
+ if (!Array.isArray(parsed)) return []
61
+ return parsed
62
+ } catch {
63
+ return []
64
+ }
65
+ })
51
66
  const isCompactView = isCompactLayout || isTouchInteraction
67
+ const isMobileRulePanelOpen = isCompactView && mobilePanel === 'rules'
68
+ const mobileRulePanelBackgroundRefs = useMemo(() => [detailPanelRef], [])
52
69
 
53
70
  const { values, update } = useQueryParams<AutomationQueryParams>({
54
71
  keys: ['rule', 'q', 'runQ', 'status', 'time', 'sort'],
@@ -73,7 +90,7 @@ export function AutomationView() {
73
90
  const selectedRuleId = useMemo(() => {
74
91
  const fromUrl = values.rule
75
92
  if (fromUrl && rules.some(rule => rule.id === fromUrl)) return fromUrl
76
- return rules[0]?.id ?? null
93
+ return null
77
94
  }, [rules, values.rule])
78
95
 
79
96
  const selectedRule = useMemo(
@@ -86,32 +103,47 @@ export function AutomationView() {
86
103
  () => listAutomationRuns(selectedRuleId ?? '')
87
104
  )
88
105
  const runs = runsData?.runs ?? []
106
+ const favoriteSet = useMemo(() => new Set(favorites), [favorites])
89
107
 
90
108
  useEffect(() => {
91
- if (rules.length === 0) return
92
- if (!values.rule || !rules.some(rule => rule.id === values.rule)) {
93
- update({ rule: rules[0].id })
94
- }
109
+ window.localStorage.setItem('automationRuleFavorites', JSON.stringify(favorites))
110
+ }, [favorites])
111
+
112
+ useEffect(() => {
113
+ if (!values.rule) return
114
+ if (rules.some(rule => rule.id === values.rule)) return
115
+ update({ rule: '' })
95
116
  }, [rules, update, values.rule])
96
117
 
97
118
  useEffect(() => {
98
119
  if (!isCompactView) return
99
- if (panelMode !== 'view') {
120
+ if (panelMode !== 'view' || values.rule) {
100
121
  setMobilePanel('details')
101
- return
102
122
  }
103
- if (selectedRuleId == null) {
104
- setMobilePanel('rules')
105
- }
106
- }, [isCompactView, panelMode, selectedRuleId])
123
+ }, [isCompactView, panelMode, values.rule])
124
+
125
+ useMobileSidebarModal({
126
+ backgroundRefs: mobileRulePanelBackgroundRefs,
127
+ isCompactLayout: isCompactView,
128
+ isMobileSidebarOpen: isMobileRulePanelOpen,
129
+ setIsMobileSidebarOpen: (nextOpen) => setMobilePanel(nextOpen ? 'rules' : 'details'),
130
+ sheetRef: mobileRulePanelSheetRef
131
+ })
107
132
 
108
133
  const handleSelectRule = useCallback((ruleId: string) => {
109
134
  setPanelMode('view')
135
+ if (panelMode === 'view' && selectedRuleId === ruleId) {
136
+ update({ rule: '' })
137
+ if (isCompactView) {
138
+ setMobilePanel('details')
139
+ }
140
+ return
141
+ }
110
142
  update({ rule: ruleId })
111
143
  if (isCompactView) {
112
144
  setMobilePanel('details')
113
145
  }
114
- }, [isCompactView, update])
146
+ }, [isCompactView, panelMode, selectedRuleId, update])
115
147
 
116
148
  const handleCreateRule = useCallback(() => {
117
149
  setPanelMode('create')
@@ -120,6 +152,24 @@ export function AutomationView() {
120
152
  }
121
153
  }, [isCompactView])
122
154
 
155
+ const handleCollapseRulePanel = useCallback(() => {
156
+ if (isCompactView) {
157
+ setMobilePanel('details')
158
+ return
159
+ }
160
+
161
+ setIsRulePanelCollapsed(true)
162
+ }, [isCompactView])
163
+
164
+ const handleExpandRulePanel = useCallback(() => {
165
+ if (isCompactView) {
166
+ setMobilePanel('rules')
167
+ return
168
+ }
169
+
170
+ setIsRulePanelCollapsed(false)
171
+ }, [isCompactView])
172
+
123
173
  const handleEditRule = useCallback((rule: AutomationRule) => {
124
174
  setPanelMode('edit')
125
175
  update({ rule: rule.id })
@@ -131,13 +181,11 @@ export function AutomationView() {
131
181
  const handleCancelForm = useCallback(() => {
132
182
  setPanelMode('view')
133
183
  if (isCompactView) {
134
- setMobilePanel(selectedRuleId != null ? 'details' : 'rules')
184
+ setMobilePanel('details')
135
185
  }
136
- }, [isCompactView, selectedRuleId])
186
+ }, [isCompactView])
137
187
 
138
- const showRuleList = !isCompactView || mobilePanel === 'rules'
139
- const showDetails = !isCompactView || mobilePanel === 'details'
140
- const detailDisabled = panelMode === 'view' && selectedRule == null
188
+ const detailsShouldShowRulePanelAction = isCompactView || (!isCompactView && isRulePanelCollapsed)
141
189
 
142
190
  const handleSubmit = useCallback(async (
143
191
  payload: Partial<AutomationRule>,
@@ -204,79 +252,118 @@ export function AutomationView() {
204
252
  }
205
253
  }, [message, mutate, t])
206
254
 
255
+ const handleToggleFavorite = useCallback((ruleId: string) => {
256
+ setFavorites(prev => prev.includes(ruleId) ? prev.filter(id => id !== ruleId) : [...prev, ruleId])
257
+ }, [])
258
+
259
+ const ruleSidebar = (
260
+ <RuleSidebar
261
+ rules={rules}
262
+ selectedRuleId={selectedRuleId}
263
+ query={values.q}
264
+ isCreating={panelMode === 'create'}
265
+ favoriteIds={favorites}
266
+ collapsible
267
+ onCreate={handleCreateRule}
268
+ onSelect={handleSelectRule}
269
+ onRun={handleRun}
270
+ onDelete={handleDelete}
271
+ onToggleFavorite={handleToggleFavorite}
272
+ onToggle={handleToggle}
273
+ onToggleCollapsed={handleCollapseRulePanel}
274
+ onQueryChange={(value: string) => update({ q: value })}
275
+ />
276
+ )
277
+
207
278
  return (
208
279
  <PageShell
209
- className={`automation-view ${isCompactView ? 'automation-view--compact' : ''}`}
280
+ className={[
281
+ 'automation-view',
282
+ isCompactView ? 'automation-view--compact' : '',
283
+ !isCompactView && isRulePanelCollapsed ? 'automation-view--left-collapsed' : ''
284
+ ].filter(Boolean).join(' ')}
210
285
  bodyClassName='automation-view__body'
211
286
  >
212
- {isCompactView && (
213
- <div className='automation-view__mobile-switcher-shell'>
214
- <Segmented
215
- block
216
- className='automation-view__mobile-switcher'
217
- value={mobilePanel}
218
- onChange={(value) => setMobilePanel(value as 'rules' | 'details')}
219
- options={[
220
- { label: t('automation.mobileRules'), value: 'rules' },
221
- { label: t('automation.mobileDetails'), value: 'details', disabled: detailDisabled }
222
- ]}
287
+ {isCompactView
288
+ ? (
289
+ <>
290
+ <button
291
+ type='button'
292
+ className={`automation-view__mobile-rule-backdrop ${isMobileRulePanelOpen ? 'is-open' : ''}`}
293
+ aria-label={t('common.close')}
294
+ aria-hidden={!isMobileRulePanelOpen}
295
+ tabIndex={-1}
296
+ onClick={() => setMobilePanel('details')}
297
+ />
298
+ <div
299
+ ref={mobileRulePanelSheetRef}
300
+ className={`automation-view__mobile-rule-sheet ${isMobileRulePanelOpen ? 'is-open' : ''}`}
301
+ role='dialog'
302
+ aria-modal={isMobileRulePanelOpen ? 'true' : undefined}
303
+ aria-label={t('automation.mobileRules')}
304
+ aria-hidden={!isMobileRulePanelOpen}
305
+ tabIndex={-1}
306
+ >
307
+ <div className='automation-view__left automation-view__left--mobile-sheet'>
308
+ {ruleSidebar}
309
+ </div>
310
+ </div>
311
+ </>
312
+ )
313
+ : (
314
+ <div className={`automation-view__left ${!isCompactView && isRulePanelCollapsed ? 'is-collapsed' : ''}`}>
315
+ {ruleSidebar}
316
+ </div>
317
+ )}
318
+ <div ref={detailPanelRef} className='automation-view__right'>
319
+ {panelMode === 'create' && (
320
+ <RuleFormPanel
321
+ isRulePanelCollapsed={detailsShouldShowRulePanelAction}
322
+ mode='create'
323
+ rule={null}
324
+ submitting={submitting}
325
+ onCreateRule={handleCreateRule}
326
+ onExpandRulePanel={handleExpandRulePanel}
327
+ onSubmit={handleSubmit}
328
+ onCancel={handleCancelForm}
223
329
  />
224
- </div>
225
- )}
226
- {showRuleList && (
227
- <div className='automation-view__left'>
228
- <RuleSidebar
229
- rules={rules}
230
- selectedRuleId={selectedRuleId}
231
- query={values.q}
232
- isCreating={panelMode === 'create'}
233
- onCreate={handleCreateRule}
234
- onSelect={handleSelectRule}
235
- onRun={handleRun}
236
- onDelete={handleDelete}
237
- onToggle={handleToggle}
238
- onQueryChange={(value: string) => update({ q: value })}
330
+ )}
331
+ {panelMode === 'edit' && (
332
+ <RuleFormPanel
333
+ isRulePanelCollapsed={detailsShouldShowRulePanelAction}
334
+ mode='edit'
335
+ rule={selectedRule}
336
+ submitting={submitting}
337
+ onCreateRule={handleCreateRule}
338
+ onExpandRulePanel={handleExpandRulePanel}
339
+ onSubmit={handleSubmit}
340
+ onCancel={handleCancelForm}
239
341
  />
240
- </div>
241
- )}
242
- {showDetails && (
243
- <div className='automation-view__right'>
244
- {panelMode === 'create' && (
245
- <RuleFormPanel
246
- mode='create'
247
- rule={null}
248
- submitting={submitting}
249
- onSubmit={handleSubmit}
250
- onCancel={handleCancelForm}
251
- />
252
- )}
253
- {panelMode === 'edit' && (
254
- <RuleFormPanel
255
- mode='edit'
256
- rule={selectedRule}
257
- submitting={submitting}
258
- onSubmit={handleSubmit}
259
- onCancel={handleCancelForm}
260
- />
261
- )}
262
- {panelMode === 'view' && (
263
- <RunHistoryPanel
264
- compact={isCompactView}
265
- rule={selectedRule}
266
- runs={runs}
267
- runQuery={values.runQ}
268
- statusFilter={values.status}
269
- timeFilter={values.time}
270
- sortOrder={values.sort}
271
- onEditRule={handleEditRule}
272
- onRunQueryChange={(value: string) => update({ runQ: value })}
273
- onStatusFilterChange={(value: string) => update({ status: value })}
274
- onTimeFilterChange={(value: string) => update({ time: value })}
275
- onSortOrderChange={(value: string) => update({ sort: value })}
276
- />
277
- )}
278
- </div>
279
- )}
342
+ )}
343
+ {panelMode === 'view' && (
344
+ <RunHistoryPanel
345
+ compact={isCompactView}
346
+ isRulePanelCollapsed={detailsShouldShowRulePanelAction}
347
+ rule={selectedRule}
348
+ runs={runs}
349
+ runQuery={values.runQ}
350
+ statusFilter={values.status}
351
+ timeFilter={values.time}
352
+ sortOrder={values.sort}
353
+ onCreateRule={handleCreateRule}
354
+ onExpandRulePanel={handleExpandRulePanel}
355
+ onEditRule={handleEditRule}
356
+ onRunRule={handleRun}
357
+ onDeleteRule={handleDelete}
358
+ isFavorite={selectedRule != null && favoriteSet.has(selectedRule.id)}
359
+ onToggleFavorite={handleToggleFavorite}
360
+ onRunQueryChange={(value: string) => update({ runQ: value })}
361
+ onStatusFilterChange={(value: string) => update({ status: value })}
362
+ onTimeFilterChange={(value: string) => update({ time: value })}
363
+ onSortOrderChange={(value: string) => update({ sort: value })}
364
+ />
365
+ )}
366
+ </div>
280
367
  </PageShell>
281
368
  )
282
369
  }
@@ -1,3 +1,8 @@
1
+ import type { EffortLevel, GitBranchKind, SessionPermissionMode } from '@vibe-forge/types'
2
+
3
+ export type AutomationCreateWorktreeMode = 'default' | 'managed' | 'local'
4
+ export type AutomationBranchAction = 'default' | 'checkout' | 'create'
5
+
1
6
  export interface RuleFormValues {
2
7
  name: string
3
8
  description?: string
@@ -17,5 +22,13 @@ export interface RuleFormValues {
17
22
  id?: string
18
23
  title?: string
19
24
  prompt: string
25
+ model?: string
26
+ adapter?: string
27
+ effort?: EffortLevel | 'default'
28
+ permissionMode?: SessionPermissionMode | 'default'
29
+ createWorktreeMode?: AutomationCreateWorktreeMode
30
+ branchAction?: AutomationBranchAction
31
+ branchName?: string
32
+ branchKind?: GitBranchKind
20
33
  }>
21
34
  }
@@ -37,7 +37,9 @@
37
37
  - 统一承载标题、meta、关闭动作和拖拽调高能力。
38
38
  - terminal 以及后续其他底部面板优先复用这里,不要再各自复制一套 resize/header 逻辑。
39
39
  - `../../components/workspace/ContextFilePicker.tsx`
40
- - 工作区文件选择器;如果别的输入入口也要复用目录树选择,直接走这里。
40
+ - 工作区文件选择器;如果别的输入入口也要复用文件引用弹窗,直接走这里。
41
+ - `../../components/workspace/project-file-tree/ProjectFileTree.tsx`
42
+ - 可复用项目目录树;目录抽屉和文件引用弹窗共用这里,不要在 chat 局部再复制树结构、展开状态或右键菜单逻辑。
41
43
 
42
44
  ## 消息级操作的当前约束
43
45