@vibe-forge/client 0.11.2 → 1.0.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 (232) hide show
  1. package/cli.cjs +6 -11
  2. package/dist/assets/{arc-De_WjPJ3.js → arc-CbOXL0l9.js} +1 -1
  3. package/dist/assets/{blockDiagram-c4efeb88-C4aR2zTE.js → blockDiagram-c4efeb88-CqxINvsS.js} +1 -1
  4. package/dist/assets/{c4Diagram-c83219d4-BZH3rq_m.js → c4Diagram-c83219d4-BKazU0hb.js} +1 -1
  5. package/dist/assets/channel-Dnopc5A6.js +1 -0
  6. package/dist/assets/{classDiagram-beda092f-BzJgBrIK.js → classDiagram-beda092f-fAFX5BpB.js} +1 -1
  7. package/dist/assets/{classDiagram-v2-2358418a-5ZtXcnT3.js → classDiagram-v2-2358418a-w1VkNGJj.js} +1 -1
  8. package/dist/assets/clone-sQthahUA.js +1 -0
  9. package/dist/assets/{createText-1719965b-DUVvEtmR.js → createText-1719965b-CEinakVP.js} +1 -1
  10. package/dist/assets/{cssMode-GoTNjuXX.js → cssMode-DPqRki4y.js} +1 -1
  11. package/dist/assets/{edges-96097737-Dd7m4Cvs.js → edges-96097737-Cb0F1_3K.js} +1 -1
  12. package/dist/assets/{erDiagram-0228fc6a-DxqFlG_f.js → erDiagram-0228fc6a-C-N2fx-J.js} +1 -1
  13. package/dist/assets/{flowDb-c6c81e3f-DU0C5kCI.js → flowDb-c6c81e3f-D1Xz_8Gf.js} +1 -1
  14. package/dist/assets/{flowDiagram-50d868cf-Di1uDa_X.js → flowDiagram-50d868cf-DyPSZyAj.js} +1 -1
  15. package/dist/assets/flowDiagram-v2-4f6560a1-OazrdWQO.js +1 -0
  16. package/dist/assets/{flowchart-elk-definition-6af322e1-CwG8aty5.js → flowchart-elk-definition-6af322e1-Dr1DDXwE.js} +1 -1
  17. package/dist/assets/{freemarker2-j39cqTlI.js → freemarker2-C3DvPFaK.js} +1 -1
  18. package/dist/assets/{ganttDiagram-a2739b55-baO_lzL-.js → ganttDiagram-a2739b55-DmvY1GRj.js} +1 -1
  19. package/dist/assets/{gitGraphDiagram-82fe8481-COoHjYMf.js → gitGraphDiagram-82fe8481-CoXfPYYi.js} +1 -1
  20. package/dist/assets/{graph-KxESr4M5.js → graph-BkDQy7Qt.js} +1 -1
  21. package/dist/assets/{handlebars-BgjdZO8G.js → handlebars-BcTFdqjl.js} +1 -1
  22. package/dist/assets/{html-Ba7tYObe.js → html-Dg-O6XFr.js} +1 -1
  23. package/dist/assets/{htmlMode-Bztvbig1.js → htmlMode-B_wqYWvn.js} +1 -1
  24. package/dist/assets/{index-5325376f-BMTAx2mL.js → index-5325376f-kxPTR3_e.js} +1 -1
  25. package/dist/assets/index-o93dlo92.css +32 -0
  26. package/dist/assets/{index-Pm_kLJvG.js → index-wkhI4dr6.js} +350 -329
  27. package/dist/assets/{infoDiagram-8eee0895-CC74qbHY.js → infoDiagram-8eee0895-BEvqkwPI.js} +1 -1
  28. package/dist/assets/{javascript-C1e1cllX.js → javascript-DhlOH8_z.js} +1 -1
  29. package/dist/assets/{journeyDiagram-c64418c1-C4MyOdE6.js → journeyDiagram-c64418c1-gKtLYmmp.js} +1 -1
  30. package/dist/assets/{jsonMode-BC98AlvF.js → jsonMode-DxTbF9OD.js} +1 -1
  31. package/dist/assets/{layout-CxAyTlr7.js → layout-CDaZEk6E.js} +1 -1
  32. package/dist/assets/{line-DhaUfI71.js → line-DNRQu8iq.js} +1 -1
  33. package/dist/assets/{linear-MYukzldK.js → linear-Cph9Z6_j.js} +1 -1
  34. package/dist/assets/{liquid-DahfJEYl.js → liquid-ByZ6JgRG.js} +1 -1
  35. package/dist/assets/{lspLanguageFeatures-BWDJcswW.js → lspLanguageFeatures-DzvhkgnM.js} +1 -1
  36. package/dist/assets/{mdx-BELlF_FD.js → mdx-D8RGHTl6.js} +1 -1
  37. package/dist/assets/{mermaid.core-BrQnSGSY.js → mermaid.core-BgcryF__.js} +4 -4
  38. package/dist/assets/{mindmap-definition-8da855dc-B0FoxTiy.js → mindmap-definition-8da855dc-WrxK0FcB.js} +1 -1
  39. package/dist/assets/{pieDiagram-a8764435-Ddr2cjSL.js → pieDiagram-a8764435-VsZBsiQy.js} +1 -1
  40. package/dist/assets/{python--C9if_AD.js → python-CXVtk_cg.js} +1 -1
  41. package/dist/assets/{quadrantDiagram-1e28029f-BlEs7Mrl.js → quadrantDiagram-1e28029f-BVlgwOvU.js} +1 -1
  42. package/dist/assets/{razor-B9U9JxKn.js → razor-0tind7h2.js} +1 -1
  43. package/dist/assets/{requirementDiagram-08caed73-kEFOAu2v.js → requirementDiagram-08caed73-CpPMPoYp.js} +1 -1
  44. package/dist/assets/{sankeyDiagram-a04cb91d-BBghez8I.js → sankeyDiagram-a04cb91d-Cm5nnRmc.js} +1 -1
  45. package/dist/assets/{sequenceDiagram-c5b8d532-CJqgzdUE.js → sequenceDiagram-c5b8d532-DpMlJvJB.js} +1 -1
  46. package/dist/assets/{stateDiagram-1ecb1508-BER4XEI6.js → stateDiagram-1ecb1508-DU1zc7vq.js} +1 -1
  47. package/dist/assets/{stateDiagram-v2-c2b004d7-EBV2vSks.js → stateDiagram-v2-c2b004d7-D-0RgmAp.js} +1 -1
  48. package/dist/assets/{styles-b4e223ce-k0eswZsE.js → styles-b4e223ce-BSO-yNWV.js} +1 -1
  49. package/dist/assets/{styles-ca3715f6-Ckr7GA-0.js → styles-ca3715f6-CHnsn2Ro.js} +1 -1
  50. package/dist/assets/{styles-d45a18b0-C1bpSwV3.js → styles-d45a18b0-B-rVGjEq.js} +1 -1
  51. package/dist/assets/{svgDrawCommon-b86b1483-CDtKpGvy.js → svgDrawCommon-b86b1483-CA3Pl89f.js} +1 -1
  52. package/dist/assets/{timeline-definition-faaaa080-BeGR-vua.js → timeline-definition-faaaa080-BcihLR6s.js} +1 -1
  53. package/dist/assets/{tsMode-D_gJXIy3.js → tsMode-D9GGa5Ur.js} +1 -1
  54. package/dist/assets/{typescript-BoKcNXkN.js → typescript-BT9CK_EL.js} +1 -1
  55. package/dist/assets/{xml-DZvURlJ-.js → xml-DNO75J-T.js} +1 -1
  56. package/dist/assets/{xychartDiagram-f5964ef8-DxfeLuYV.js → xychartDiagram-f5964ef8-DJTwe32X.js} +1 -1
  57. package/dist/assets/{yaml-CTC8PAGY.js → yaml-7CVzhiP2.js} +1 -1
  58. package/dist/index.html +2 -2
  59. package/package.json +13 -10
  60. package/src/api/git.ts +12 -0
  61. package/src/api/sessions.ts +131 -4
  62. package/src/api/types.ts +2 -1
  63. package/src/api.ts +13 -0
  64. package/src/components/ArchiveView.scss +143 -54
  65. package/src/components/ArchiveView.tsx +181 -167
  66. package/src/components/CodeBlock.scss +5 -0
  67. package/src/components/ConfigView.scss +142 -31
  68. package/src/components/ConfigView.tsx +161 -86
  69. package/src/components/MarkdownContent.tsx +7 -0
  70. package/src/components/NavRail.scss +248 -0
  71. package/src/components/NavRail.tsx +80 -107
  72. package/src/components/NavRailCompact.tsx +107 -0
  73. package/src/components/NavRailCompactMoreSheet.tsx +141 -0
  74. package/src/components/ShortcutTooltip.tsx +4 -2
  75. package/src/components/Sidebar.scss +51 -0
  76. package/src/components/Sidebar.tsx +43 -16
  77. package/src/components/automation-view/RuleFormPanel.scss +40 -13
  78. package/src/components/automation-view/RuleSidebar.scss +73 -47
  79. package/src/components/automation-view/RuleSidebar.tsx +9 -13
  80. package/src/components/automation-view/RunHistoryPanel.scss +141 -13
  81. package/src/components/automation-view/RunHistoryPanel.tsx +203 -161
  82. package/src/components/automation-view/TaskList.scss +44 -13
  83. package/src/components/automation-view/TriggerList.scss +46 -14
  84. package/src/components/automation-view/index.scss +82 -10
  85. package/src/components/automation-view/index.tsx +108 -55
  86. package/src/components/benchmark-view/BenchmarkCasePanel.scss +36 -16
  87. package/src/components/benchmark-view/BenchmarkSidebar.scss +44 -22
  88. package/src/components/benchmark-view/BenchmarkSidebar.tsx +0 -6
  89. package/src/components/benchmark-view/BenchmarkView.scss +63 -20
  90. package/src/components/benchmark-view/index.tsx +71 -34
  91. package/src/components/chat/AGENTS.md +14 -2
  92. package/src/components/chat/ChatComposerCard.scss +77 -0
  93. package/src/components/chat/ChatComposerCard.tsx +59 -0
  94. package/src/components/chat/ChatHeader.scss +187 -0
  95. package/src/components/chat/ChatHeader.tsx +209 -57
  96. package/src/components/chat/ChatHistoryView.tsx +279 -52
  97. package/src/components/chat/ChatTimelineView.scss +94 -1
  98. package/src/components/chat/ChatTimelineView.tsx +42 -0
  99. package/src/components/chat/CurrentTodoList.scss +210 -200
  100. package/src/components/chat/CurrentTodoList.tsx +116 -48
  101. package/src/components/chat/NewSessionGuide.scss +139 -1
  102. package/src/components/chat/NewSessionGuide.tsx +57 -100
  103. package/src/components/chat/NewSessionGuideCompactPanel.tsx +130 -0
  104. package/src/components/chat/NewSessionGuideGrid.tsx +141 -0
  105. package/src/components/chat/QueuedMessagesCard.scss +195 -0
  106. package/src/components/chat/QueuedMessagesCard.tsx +170 -0
  107. package/src/components/chat/git-controls/BranchSwitcherDropdown.tsx +61 -56
  108. package/src/components/chat/git-controls/BranchSwitcherResults.tsx +167 -0
  109. package/src/components/chat/git-controls/BranchTreeEntries.tsx +99 -0
  110. package/src/components/chat/git-controls/ChatGitControls.scss +437 -5
  111. package/src/components/chat/git-controls/ChatGitControls.tsx +136 -109
  112. package/src/components/chat/git-controls/DraftGitControls.tsx +91 -0
  113. package/src/components/chat/git-controls/GitOperationsDropdown.tsx +10 -2
  114. package/src/components/chat/git-controls/GitWorktreeDropdown.tsx +301 -28
  115. package/src/components/chat/git-controls/git-branch-tree.ts +148 -0
  116. package/src/components/chat/git-controls/use-chat-draft-git-controls.ts +168 -0
  117. package/src/components/chat/git-controls/use-chat-git-controls.ts +76 -3
  118. package/src/components/chat/messages/MessageContextMenu.tsx +3 -1
  119. package/src/components/chat/messages/MessageItem.scss +78 -4
  120. package/src/components/chat/messages/MessageItem.tsx +47 -3
  121. package/src/components/chat/sender/@components/adapter-select/AdapterSelectControl.scss +23 -0
  122. package/src/components/chat/sender/@components/reference-actions/ReferenceActionsControl.scss +17 -0
  123. package/src/components/chat/sender/@components/reference-actions/ReferencePermissionActionsPopover.tsx +4 -1
  124. package/src/components/chat/sender/@components/sender-attachments/SenderAttachments.scss +167 -30
  125. package/src/components/chat/sender/@components/sender-attachments/SenderAttachments.tsx +95 -23
  126. package/src/components/chat/sender/@components/sender-body/SenderBody.tsx +10 -0
  127. package/src/components/chat/sender/@components/sender-interaction-panel/SenderInteractionPanel.scss +161 -45
  128. package/src/components/chat/sender/@components/sender-interaction-panel/SenderInteractionPanel.tsx +310 -71
  129. package/src/components/chat/sender/@components/sender-monaco-editor/SenderMonacoEditor.tsx +18 -0
  130. package/src/components/chat/sender/@components/sender-monaco-editor/use-sender-monaco-editor.ts +86 -9
  131. package/src/components/chat/sender/@components/sender-monaco-editor/use-sender-monaco-theme.ts +52 -3
  132. package/src/components/chat/sender/@components/sender-submit-action/SenderSubmitAction.scss +110 -1
  133. package/src/components/chat/sender/@components/sender-submit-action/SenderSubmitAction.tsx +137 -17
  134. package/src/components/chat/sender/@components/sender-toolbar/SenderSelectBase.scss +21 -0
  135. package/src/components/chat/sender/@components/sender-toolbar/SenderSelectShared.scss +21 -0
  136. package/src/components/chat/sender/@components/sender-toolbar/SenderToolbar.scss +63 -0
  137. package/src/components/chat/sender/@components/sender-toolbar/SenderToolbar.tsx +12 -6
  138. package/src/components/chat/sender/@core/build-sender-controller-result.ts +6 -0
  139. package/src/components/chat/sender/@core/build-sender-toolbar.ts +25 -2
  140. package/src/components/chat/sender/@core/create-sender-toolbar-handlers.ts +9 -2
  141. package/src/components/chat/sender/@core/get-sender-runtime-state.ts +1 -1
  142. package/src/components/chat/sender/@core/interaction-request.ts +2 -2
  143. package/src/components/chat/sender/@core/sender-toolbar-bindings.ts +28 -4
  144. package/src/components/chat/sender/@hooks/use-model-select-browser.tsx +4 -2
  145. package/src/components/chat/sender/@hooks/use-sender-controller.ts +56 -11
  146. package/src/components/chat/sender/@hooks/use-sender-keydown.ts +64 -0
  147. package/src/components/chat/sender/@hooks/use-sender-shortcuts.ts +16 -1
  148. package/src/components/chat/sender/@hooks/use-sender-submit.ts +16 -8
  149. package/src/components/chat/sender/@types/sender-props.ts +20 -3
  150. package/src/components/chat/sender/@types/sender-toolbar-types.ts +12 -1
  151. package/src/components/chat/sender/Sender.scss +4 -1
  152. package/src/components/chat/sender/Sender.tsx +3 -12
  153. package/src/components/chat/session-timeline-panel/EventList.scss +88 -0
  154. package/src/components/chat/session-timeline-panel/EventList.tsx +99 -47
  155. package/src/components/chat/session-timeline-panel/gantt.ts +23 -7
  156. package/src/components/chat/session-timeline-panel/git-graph.ts +6 -1
  157. package/src/components/chat/session-timeline-panel/index.scss +14 -1
  158. package/src/components/chat/session-timeline-panel/index.tsx +86 -10
  159. package/src/components/chat/session-timeline-panel/types.ts +4 -0
  160. package/src/components/chat/status-bar/ChatStatusBar.scss +27 -0
  161. package/src/components/chat/status-bar/ChatStatusBar.tsx +39 -0
  162. package/src/components/chat/terminal/ChatTerminalView.tsx +6 -0
  163. package/src/components/chat/tools/core/ToolCallBox.scss +19 -0
  164. package/src/components/chat/tools/core/ToolGroup.scss +32 -0
  165. package/src/components/chat/tools/task/components/TaskToolCard.scss +59 -1
  166. package/src/components/config/ConfigEditors.scss +20 -6
  167. package/src/components/config/ConfigFieldRow.scss +57 -17
  168. package/src/components/config/ConfigSectionForm.scss +10 -4
  169. package/src/components/config/ConfigSectionPanel.tsx +18 -11
  170. package/src/components/config/configSchema.ts +1 -0
  171. package/src/components/config/record-editors/RecordEditors.scss +42 -9
  172. package/src/components/dock-panel/DockPanel.scss +6 -2
  173. package/src/components/dock-panel/DockPanel.tsx +12 -16
  174. package/src/components/knowledge-base/KnowledgeBaseView.scss +180 -6
  175. package/src/components/knowledge-base/KnowledgeBaseView.tsx +98 -26
  176. package/src/components/knowledge-base/components/ActionButton.scss +4 -0
  177. package/src/components/knowledge-base/components/EmptyState.scss +5 -8
  178. package/src/components/knowledge-base/components/EntitiesTab.tsx +8 -2
  179. package/src/components/knowledge-base/components/EntityItem.scss +10 -3
  180. package/src/components/knowledge-base/components/FilterBar.scss +13 -2
  181. package/src/components/knowledge-base/components/FlowsTab.tsx +8 -2
  182. package/src/components/knowledge-base/components/KnowledgeBaseHeader.scss +2 -23
  183. package/src/components/knowledge-base/components/KnowledgeBaseHeader.tsx +0 -5
  184. package/src/components/knowledge-base/components/KnowledgeList.scss +15 -6
  185. package/src/components/knowledge-base/components/LoadingState.scss +4 -0
  186. package/src/components/knowledge-base/components/RuleItem.scss +86 -0
  187. package/src/components/knowledge-base/components/RuleItem.tsx +2 -0
  188. package/src/components/knowledge-base/components/RulesTab.tsx +8 -2
  189. package/src/components/knowledge-base/components/SectionHeader.scss +3 -18
  190. package/src/components/knowledge-base/components/SectionHeader.tsx +3 -7
  191. package/src/components/knowledge-base/components/SkillsTab.tsx +8 -3
  192. package/src/components/knowledge-base/components/SpecItem.scss +16 -7
  193. package/src/components/layout/@hooks/use-mobile-sidebar-modal.ts +190 -0
  194. package/src/components/layout/AppShell.scss +106 -6
  195. package/src/components/layout/AppShell.tsx +118 -10
  196. package/src/components/layout/PageShell.scss +41 -0
  197. package/src/components/layout/PageShell.tsx +32 -0
  198. package/src/components/layout/mobile-sidebar-constants.ts +1 -0
  199. package/src/components/nav-rail-compact-config.ts +114 -0
  200. package/src/components/nav-rail-items.tsx +181 -0
  201. package/src/components/sidebar/SessionContextMenu.tsx +3 -1
  202. package/src/components/sidebar/SessionItem.scss +62 -0
  203. package/src/components/sidebar/SessionItem.tsx +97 -52
  204. package/src/components/sidebar/SessionList.tsx +6 -0
  205. package/src/components/sidebar/SidebarHeader.scss +49 -0
  206. package/src/components/sidebar/SidebarHeader.tsx +27 -5
  207. package/src/components/sidebar/SidebarHeaderBatchActions.tsx +8 -4
  208. package/src/components/sidebar/SidebarHeaderSearchActions.tsx +6 -3
  209. package/src/components/sidebar/SidebarUtilityFooter.tsx +69 -0
  210. package/src/components/workspace/ContextFilePicker.tsx +12 -4
  211. package/src/hooks/chat/chat-session-workspace-draft.ts +25 -0
  212. package/src/hooks/chat/session-view-cache.ts +4 -1
  213. package/src/hooks/chat/use-chat-adapter.ts +5 -1
  214. package/src/hooks/chat/use-chat-model-adapter-selection.tsx +5 -1
  215. package/src/hooks/chat/use-chat-scroll.ts +24 -7
  216. package/src/hooks/chat/use-chat-session-actions.ts +118 -6
  217. package/src/hooks/chat/use-chat-session-messages.ts +20 -1
  218. package/src/hooks/chat/use-chat-session.ts +2 -0
  219. package/src/hooks/use-responsive-layout.ts +115 -0
  220. package/src/main.tsx +8 -0
  221. package/src/resources/adapters.ts +15 -0
  222. package/src/resources/locales/en.json +84 -1
  223. package/src/resources/locales/zh.json +84 -1
  224. package/src/routes/ChatRoute.scss +152 -9
  225. package/src/routes/ChatRoute.tsx +31 -34
  226. package/src/store/index.ts +2 -0
  227. package/dist/assets/channel-BvERb8WU.js +0 -1
  228. package/dist/assets/clone-B9_0v-6Y.js +0 -1
  229. package/dist/assets/flowDiagram-v2-4f6560a1-LpS8Kb00.js +0 -1
  230. package/dist/assets/index-C1oh0w9H.css +0 -32
  231. package/src/components/chat/ThinkingStatus.scss +0 -70
  232. package/src/components/chat/ThinkingStatus.tsx +0 -13
@@ -0,0 +1,141 @@
1
+ interface NavRailCompactMoreAction {
2
+ active?: boolean
3
+ icon: string
4
+ key: string
5
+ label: string
6
+ onSelect: () => void
7
+ }
8
+
9
+ interface NavRailCompactChoiceAction {
10
+ active: boolean
11
+ icon?: string
12
+ key: string
13
+ label: string
14
+ onSelect: () => void
15
+ }
16
+
17
+ export function NavRailCompactMoreSheet({
18
+ actions,
19
+ isOpen,
20
+ languageActions,
21
+ languageLabel,
22
+ moreLabel,
23
+ onClose,
24
+ themeActions,
25
+ themeLabel
26
+ }: {
27
+ actions: NavRailCompactMoreAction[]
28
+ isOpen: boolean
29
+ languageActions: NavRailCompactChoiceAction[]
30
+ languageLabel: string
31
+ moreLabel: string
32
+ onClose: () => void
33
+ themeActions: NavRailCompactChoiceAction[]
34
+ themeLabel: string
35
+ }) {
36
+ const activeLanguageKey = languageActions.find((action) => action.active)?.key ?? languageActions[0]?.key ?? ''
37
+
38
+ const handleActionSelect = (action: { onSelect: () => void }) => {
39
+ action.onSelect()
40
+ onClose()
41
+ }
42
+
43
+ const handleChoiceSelect = (action: NavRailCompactChoiceAction) => {
44
+ action.onSelect()
45
+ }
46
+
47
+ return (
48
+ <>
49
+ <button
50
+ type='button'
51
+ className={`nav-rail-compact-sheet-backdrop ${isOpen ? 'is-open' : ''}`}
52
+ aria-hidden={!isOpen}
53
+ tabIndex={-1}
54
+ onClick={onClose}
55
+ />
56
+ <div
57
+ className={`nav-rail-compact-sheet ${isOpen ? 'is-open' : ''}`}
58
+ role='dialog'
59
+ aria-modal={isOpen ? 'true' : undefined}
60
+ aria-hidden={!isOpen}
61
+ aria-label={moreLabel}
62
+ >
63
+ <div className='nav-rail-compact-sheet__handle' />
64
+
65
+ {actions.length > 0 && (
66
+ <div className='nav-rail-compact-sheet__section'>
67
+ <div className='nav-rail-compact-sheet__section-title'>
68
+ <span className='material-symbols-rounded nav-rail-compact-sheet__section-title-icon'>tune</span>
69
+ <span>{moreLabel}</span>
70
+ </div>
71
+ <div className='nav-rail-compact-sheet__actions'>
72
+ {actions.map((action) => (
73
+ <button
74
+ key={action.key}
75
+ type='button'
76
+ className={`nav-rail-compact-sheet__action ${action.active ? 'is-active' : ''}`}
77
+ onClick={() => handleActionSelect(action)}
78
+ >
79
+ <span className='material-symbols-rounded'>{action.icon}</span>
80
+ <span>{action.label}</span>
81
+ </button>
82
+ ))}
83
+ </div>
84
+ </div>
85
+ )}
86
+
87
+ <div className='nav-rail-compact-sheet__section'>
88
+ <div className='nav-rail-compact-sheet__section-title'>
89
+ <span className='material-symbols-rounded nav-rail-compact-sheet__section-title-icon'>palette</span>
90
+ <span>{themeLabel}</span>
91
+ </div>
92
+ <div className='nav-rail-compact-sheet__segmented'>
93
+ {themeActions.map((action) => (
94
+ <button
95
+ key={action.key}
96
+ type='button'
97
+ className={`nav-rail-compact-sheet__segment ${action.active ? 'is-active' : ''}`}
98
+ onClick={() => handleChoiceSelect(action)}
99
+ >
100
+ {action.icon != null && (
101
+ <span className='material-symbols-rounded nav-rail-compact-sheet__segment-icon'>
102
+ {action.icon}
103
+ </span>
104
+ )}
105
+ <span>{action.label}</span>
106
+ </button>
107
+ ))}
108
+ </div>
109
+ </div>
110
+
111
+ <div className='nav-rail-compact-sheet__section'>
112
+ <div className='nav-rail-compact-sheet__section-title'>
113
+ <span className='material-symbols-rounded nav-rail-compact-sheet__section-title-icon'>language</span>
114
+ <span>{languageLabel}</span>
115
+ </div>
116
+ <label className='nav-rail-compact-sheet__select-shell'>
117
+ <span className='material-symbols-rounded nav-rail-compact-sheet__select-icon'>translate</span>
118
+ <select
119
+ className='nav-rail-compact-sheet__select'
120
+ value={activeLanguageKey}
121
+ aria-label={languageLabel}
122
+ onChange={(event) => {
123
+ const selectedAction = languageActions.find((action) => action.key === event.target.value)
124
+ if (selectedAction != null) {
125
+ handleChoiceSelect(selectedAction)
126
+ }
127
+ }}
128
+ >
129
+ {languageActions.map((action) => (
130
+ <option key={action.key} value={action.key}>
131
+ {action.label}
132
+ </option>
133
+ ))}
134
+ </select>
135
+ <span className='material-symbols-rounded nav-rail-compact-sheet__select-chevron'>expand_more</span>
136
+ </label>
137
+ </div>
138
+ </div>
139
+ </>
140
+ )
141
+ }
@@ -4,6 +4,7 @@ import { Tooltip } from 'antd'
4
4
  import type { TooltipPlacement } from 'antd/es/tooltip'
5
5
  import React, { forwardRef, useMemo } from 'react'
6
6
 
7
+ import { useResponsiveLayout } from '#~/hooks/use-responsive-layout'
7
8
  import { formatShortcutLabel } from '#~/utils/shortcutUtils'
8
9
  import { ShortcutDisplay } from './ShortcutDisplay'
9
10
 
@@ -38,14 +39,15 @@ export const ShortcutTooltip = forwardRef<HTMLDivElement, ShortcutTooltipProps>(
38
39
  className,
39
40
  ...divProps
40
41
  }, ref) => {
42
+ const { isTouchInteraction } = useResponsiveLayout()
41
43
  const shortcutLabel = useMemo(() => formatShortcutLabel(shortcut, isMac), [isMac, shortcut])
42
44
  const resolvedTitle = useMemo(() => {
43
- if (!enabled || shortcutLabel === '') {
45
+ if (!enabled || isTouchInteraction || shortcutLabel === '') {
44
46
  return null
45
47
  }
46
48
 
47
49
  return resolveShortcutTooltipTitle(title, shortcutLabel)
48
- }, [enabled, shortcutLabel, title])
50
+ }, [enabled, isTouchInteraction, shortcutLabel, title])
49
51
 
50
52
  const trigger = (
51
53
  <div
@@ -89,6 +89,20 @@
89
89
  }
90
90
  }
91
91
 
92
+ .sidebar-container--compact {
93
+ width: 100%;
94
+ height: 100%;
95
+ border-right: 1px solid var(--border-color);
96
+
97
+ .sidebar-content {
98
+ width: 100%;
99
+ }
100
+
101
+ .sidebar-footer {
102
+ padding-bottom: max(8px, env(safe-area-inset-bottom));
103
+ }
104
+ }
105
+
92
106
  .sidebar-collapsed-header {
93
107
  position: absolute;
94
108
  top: 12px;
@@ -142,6 +156,43 @@
142
156
  align-items: center;
143
157
  }
144
158
 
159
+ .sidebar-utility-footer {
160
+ margin-top: auto;
161
+ display: grid;
162
+ grid-template-columns: repeat(3, minmax(0, 1fr));
163
+ gap: 8px;
164
+ padding: 12px;
165
+ border-top: 1px solid var(--border-color);
166
+ background: var(--sub-bg-color);
167
+ }
168
+
169
+ .sidebar-utility-footer__action.ant-btn.ant-btn-text {
170
+ min-width: 0;
171
+ height: 40px;
172
+ padding: 0 8px;
173
+ border-radius: 8px;
174
+ border: 1px solid var(--border-color);
175
+ background: var(--bg-color);
176
+ color: var(--text-color);
177
+ display: inline-flex;
178
+ align-items: center;
179
+ justify-content: center;
180
+ gap: 6px;
181
+
182
+ .material-symbols-rounded {
183
+ font-size: 16px;
184
+ line-height: 1;
185
+ }
186
+
187
+ > span:last-child {
188
+ min-width: 0;
189
+ overflow: hidden;
190
+ text-overflow: ellipsis;
191
+ white-space: nowrap;
192
+ font-size: 11px;
193
+ }
194
+ }
195
+
145
196
  html.dark .sidebar-container {
146
197
  --sidebar-hover-bg: #1f1f1f;
147
198
  --sidebar-active-bg: #111b26;
@@ -6,6 +6,7 @@ import React, { useMemo, useRef, useState } from 'react'
6
6
  import { useTranslation } from 'react-i18next'
7
7
  import useSWR from 'swr'
8
8
 
9
+ import { useResponsiveLayout } from '#~/hooks/use-responsive-layout'
9
10
  import { useSidebarQueryState } from '#~/hooks/use-sidebar-query-state'
10
11
  import type { SidebarSessionSortOrder } from '#~/hooks/use-sidebar-query-state'
11
12
  import { getAdapterDisplay } from '#~/resources/adapters.js'
@@ -30,11 +31,17 @@ const sortSessionsByOrder = (sessions: Session[], sortOrder: SidebarSessionSortO
30
31
 
31
32
  export function Sidebar({
32
33
  activeId,
34
+ isCompactLayout = false,
35
+ isMobileOpen = false,
36
+ onRequestClose,
33
37
  onSelectSession,
34
38
  onDeletedSession,
35
39
  width
36
40
  }: {
37
41
  activeId?: string
42
+ isCompactLayout?: boolean
43
+ isMobileOpen?: boolean
44
+ onRequestClose?: () => void
38
45
  onSelectSession: (session: Session, isNew?: boolean) => void
39
46
  onDeletedSession?: (id: string, nextId?: string) => void
40
47
  width: number
@@ -58,6 +65,7 @@ export function Sidebar({
58
65
  const [isBatchMode, setIsBatchMode] = useState(false)
59
66
  const [selectedIds, setSelectedIds] = useState(new Set<string>())
60
67
  const { t } = useTranslation()
68
+ const { isTouchInteraction } = useResponsiveLayout()
61
69
  const isMac = navigator.platform.includes('Mac')
62
70
 
63
71
  const { data: sessionsRes, mutate: mutateSessions } = useSWR<{ sessions: Session[] }>(
@@ -124,6 +132,7 @@ export function Sidebar({
124
132
  }, [adapterFilters, searchQuery, sessions, sortOrder, tagFilters])
125
133
 
126
134
  async function handleCreateSession() {
135
+ onRequestClose?.()
127
136
  onSelectSession({ id: '' } as Session, true)
128
137
  }
129
138
 
@@ -259,6 +268,8 @@ export function Sidebar({
259
268
  }
260
269
 
261
270
  const isCreatingSession = activeId === undefined || activeId === ''
271
+ const effectiveSidebarCollapsed = isCompactLayout ? false : isSidebarCollapsed
272
+ const resolveTooltipTitle = (title: string) => isTouchInteraction ? undefined : title
262
273
 
263
274
  const createBtnRef = useRef<HTMLButtonElement>(null)
264
275
 
@@ -280,27 +291,37 @@ export function Sidebar({
280
291
 
281
292
  return (
282
293
  <div
283
- className={`sidebar-container ${isSidebarCollapsed ? 'collapsed' : ''}`}
284
- style={{
285
- width: isSidebarCollapsed ? 0 : width,
286
- minWidth: isSidebarCollapsed ? 0 : undefined,
287
- transition: isResizing ? 'none' : 'width 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
288
- borderRight: isSidebarCollapsed ? 'none' : undefined
289
- }}
294
+ className={[
295
+ 'sidebar-container',
296
+ effectiveSidebarCollapsed ? 'collapsed' : '',
297
+ isCompactLayout ? 'sidebar-container--compact' : '',
298
+ isMobileOpen ? 'is-mobile-open' : ''
299
+ ].filter(Boolean).join(' ')}
300
+ style={isCompactLayout
301
+ ? undefined
302
+ : {
303
+ width: effectiveSidebarCollapsed ? 0 : width,
304
+ minWidth: effectiveSidebarCollapsed ? 0 : undefined,
305
+ transition: isResizing ? 'none' : 'width 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
306
+ borderRight: effectiveSidebarCollapsed ? 'none' : undefined
307
+ }}
290
308
  >
291
309
  <div
292
310
  className='sidebar-content'
293
- style={{
294
- width,
295
- transition: isResizing ? 'none' : 'transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
296
- transform: isSidebarCollapsed ? `translateX(-${width}px)` : 'translateX(0)'
297
- }}
311
+ style={isCompactLayout
312
+ ? undefined
313
+ : {
314
+ width,
315
+ transition: isResizing ? 'none' : 'transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
316
+ transform: effectiveSidebarCollapsed ? `translateX(-${width}px)` : 'translateX(0)'
317
+ }}
298
318
  >
299
319
  <SidebarHeader
300
320
  adapterFilters={adapterFilters}
301
321
  availableAdapters={availableAdapters}
302
322
  hasActiveSearchControls={hasActiveSearchControls}
303
- isSidebarCollapsed={isSidebarCollapsed}
323
+ isCompactLayout={isCompactLayout}
324
+ isSidebarCollapsed={effectiveSidebarCollapsed}
304
325
  searchQuery={searchQuery}
305
326
  sortOrder={sortOrder}
306
327
  sortSelection={sortSelection}
@@ -313,6 +334,7 @@ export function Sidebar({
313
334
  isBatchMode={isBatchMode}
314
335
  onToggleBatchMode={toggleBatchMode}
315
336
  onToggleSidebarCollapsed={() => setSidebarCollapsed(!isSidebarCollapsed)}
337
+ onCloseSidebar={onRequestClose}
316
338
  selectedCount={selectedIds.size}
317
339
  totalCount={filteredSessions.length}
318
340
  onSelectAll={handleSelectAll}
@@ -337,7 +359,9 @@ export function Sidebar({
337
359
  sessions={filteredSessions}
338
360
  activeId={activeId}
339
361
  isBatchMode={isBatchMode}
362
+ isCompactLayout={isCompactLayout}
340
363
  selectedIds={selectedIds}
364
+ isTouchInteraction={isTouchInteraction}
341
365
  searchQuery={searchQuery}
342
366
  onSelectSession={onSelectSession}
343
367
  onArchiveSession={handleArchiveSession}
@@ -347,9 +371,12 @@ export function Sidebar({
347
371
  onToggleSelect={handleToggleSelect}
348
372
  />
349
373
  </div>
350
- {isSidebarCollapsed && (
374
+ {!isCompactLayout && isSidebarCollapsed && (
351
375
  <div className='sidebar-collapsed-header'>
352
- <Tooltip title={isCreatingSession ? t('common.alreadyInNewChat') : t('common.newChat')} placement='bottom'>
376
+ <Tooltip
377
+ title={resolveTooltipTitle(isCreatingSession ? t('common.alreadyInNewChat') : t('common.newChat'))}
378
+ placement='bottom'
379
+ >
353
380
  <Button
354
381
  ref={createBtnRef}
355
382
  className={`sidebar-collapsed-control ${isCreatingSession ? 'active' : ''}`}
@@ -364,7 +391,7 @@ export function Sidebar({
364
391
  </span>
365
392
  </Button>
366
393
  </Tooltip>
367
- <Tooltip title={t('common.expand')} placement='bottom'>
394
+ <Tooltip title={resolveTooltipTitle(t('common.expand'))} placement='bottom'>
368
395
  <Button
369
396
  className='sidebar-collapsed-control'
370
397
  type='text'
@@ -6,6 +6,11 @@
6
6
  height: 100%;
7
7
  }
8
8
 
9
+ &__form-panel > .ant-form {
10
+ flex: 1;
11
+ min-height: 0;
12
+ }
13
+
9
14
  &__form-header {
10
15
  display: flex;
11
16
  align-items: center;
@@ -14,7 +19,7 @@
14
19
 
15
20
  &__form-header-actions {
16
21
  display: inline-flex;
17
- gap: 12px;
22
+ gap: 8px;
18
23
  }
19
24
 
20
25
  &__form-title {
@@ -33,7 +38,7 @@
33
38
  &__form-grid {
34
39
  display: grid;
35
40
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr);
36
- gap: 20px;
41
+ gap: 12px;
37
42
  flex: 1;
38
43
  overflow: hidden;
39
44
  }
@@ -61,12 +66,10 @@
61
66
  }
62
67
 
63
68
  &__form-section {
64
- padding: 12px 0;
65
- border-bottom: 1px solid var(--border-color);
66
-
67
- &:last-child {
68
- border-bottom: none;
69
- }
69
+ padding: 12px;
70
+ border: 1px solid var(--border-color);
71
+ border-radius: 8px;
72
+ background: var(--sub-bg-color);
70
73
  }
71
74
 
72
75
  &__label {
@@ -95,8 +98,9 @@
95
98
  align-items: center;
96
99
  justify-content: space-between;
97
100
  padding: 8px 12px;
98
- border-radius: 10px;
99
- background: var(--tag-bg);
101
+ border-radius: 8px;
102
+ border: 1px solid var(--border-color);
103
+ background: var(--bg-color);
100
104
  }
101
105
 
102
106
  &__toggle-label {
@@ -114,9 +118,10 @@
114
118
  display: inline-flex;
115
119
  align-items: center;
116
120
  justify-content: center;
117
- height: 36px;
118
- padding: 0 12px;
119
- border-radius: 8px;
121
+ height: 28px;
122
+ min-width: 28px;
123
+ padding: 0 10px;
124
+ border-radius: 6px;
120
125
 
121
126
  &--confirm {
122
127
  font-weight: 600;
@@ -126,4 +131,26 @@
126
131
  &__action-icon {
127
132
  font-size: 18px;
128
133
  }
134
+
135
+ &__form-section .ant-input,
136
+ &__form-section .ant-input-affix-wrapper,
137
+ &__form-section .ant-input-number,
138
+ &__form-section .ant-select-selector {
139
+ border-radius: 6px !important;
140
+ background: var(--bg-color);
141
+ }
142
+
143
+ &__form-section .ant-input,
144
+ &__form-section .ant-input-affix-wrapper,
145
+ &__form-section .ant-select-selector {
146
+ min-height: 30px;
147
+ }
148
+ }
149
+
150
+ @media (max-width: 1080px) {
151
+ .automation-view {
152
+ &__form-grid {
153
+ grid-template-columns: 1fr;
154
+ }
155
+ }
129
156
  }
@@ -5,15 +5,24 @@
5
5
  height: 100%;
6
6
  }
7
7
 
8
- &__sidebar-header {
8
+ &__sidebar-search-row {
9
9
  display: flex;
10
10
  align-items: center;
11
- justify-content: space-between;
12
- padding-bottom: 16px;
11
+ gap: 8px;
12
+ padding: 10px 12px 8px;
13
13
  }
14
14
 
15
- &__sidebar-search {
16
- padding-bottom: 12px;
15
+ &__sidebar-search-input {
16
+ flex: 1;
17
+ min-width: 0;
18
+
19
+ .ant-input-affix-wrapper {
20
+ height: 30px;
21
+ border-radius: 6px;
22
+ background: var(--bg-color);
23
+ padding: 0 8px;
24
+ font-size: 12px;
25
+ }
17
26
  }
18
27
 
19
28
  &__search-icon {
@@ -21,46 +30,22 @@
21
30
  color: var(--sub-text-color);
22
31
  }
23
32
 
24
- &__title {
25
- display: flex;
26
- align-items: center;
27
- gap: 8px;
28
- }
29
-
30
- &__title-icon {
31
- font-size: 24px;
32
- color: var(--sub-text-color);
33
- }
34
-
35
- &__title-text {
36
- margin: 0;
37
- font-size: 18px;
38
- color: var(--text-color);
39
- }
40
-
41
33
  &__rule-list {
42
34
  flex: 1;
43
35
  overflow: auto;
36
+ padding: 0 12px 12px;
44
37
  }
45
38
 
46
39
  &__rule-item {
47
40
  padding: 0 !important;
48
- margin-bottom: 10px;
41
+ margin-bottom: 6px;
49
42
  cursor: pointer;
50
43
  display: flex;
51
- position: relative;
52
44
  border-block-end: none !important;
53
45
 
54
- &--active::before {
55
- content: '';
56
- position: absolute;
57
- left: 0;
58
- top: 0;
59
- width: 100%;
60
- height: 100%;
61
- border: 2px solid var(--primary-color);
62
- border-radius: 8px;
63
- pointer-events: none;
46
+ &--active .automation-view__rule-card {
47
+ border-color: var(--primary-color);
48
+ background: var(--primary-soft-bg);
64
49
  }
65
50
  }
66
51
 
@@ -70,26 +55,45 @@
70
55
  justify-content: space-between;
71
56
  width: 100%;
72
57
  border: 1px solid var(--border-color);
73
- border-radius: 12px;
74
- padding: 12px 12px 12px 16px;
58
+ border-radius: 8px;
59
+ padding: 8px;
75
60
  background: var(--bg-color);
61
+ transition:
62
+ border-color .2s ease,
63
+ background-color .2s ease,
64
+ color .2s ease;
65
+ }
66
+
67
+ &__rule-card:hover {
68
+ border-color: var(--sidebar-hover-bg, #e5e5e5);
69
+ background: var(--sidebar-hover-bg, #e5e5e5);
76
70
  }
77
71
 
78
72
  &__rule-content {
79
73
  display: flex;
80
74
  flex-direction: column;
81
- gap: 8px;
75
+ gap: 6px;
82
76
  align-items: flex-start;
77
+ min-width: 0;
83
78
  }
84
79
 
85
80
  &__rule-name {
86
81
  display: flex;
87
82
  align-items: center;
88
- gap: 8px;
83
+ gap: 6px;
84
+ min-width: 0;
85
+
86
+ .ant-tag {
87
+ margin-inline-end: 0;
88
+ padding-inline: 4px;
89
+ font-size: 9px;
90
+ line-height: 13px;
91
+ border-radius: 2px;
92
+ }
89
93
  }
90
94
 
91
95
  &__rule-icon {
92
- font-size: 20px;
96
+ font-size: 18px;
93
97
  color: var(--sub-text-color);
94
98
 
95
99
  &--interval,
@@ -100,7 +104,13 @@
100
104
  }
101
105
 
102
106
  &__rule-title {
103
- font-weight: 600;
107
+ min-width: 0;
108
+ overflow: hidden;
109
+ text-overflow: ellipsis;
110
+ white-space: nowrap;
111
+ font-size: 12px;
112
+ line-height: 1.35;
113
+ font-weight: 500;
104
114
  color: var(--text-color);
105
115
  }
106
116
 
@@ -109,7 +119,7 @@
109
119
  flex-direction: column;
110
120
  gap: 4px;
111
121
  color: var(--sub-text-color);
112
- font-size: 12px;
122
+ font-size: 11px;
113
123
  }
114
124
 
115
125
  &__rule-trigger-list {
@@ -124,6 +134,7 @@
124
134
  align-items: center;
125
135
  gap: 4px;
126
136
  border-radius: 999px;
137
+ padding: 1px 8px;
127
138
  background: var(--tag-bg);
128
139
  color: var(--sub-text-color);
129
140
  }
@@ -147,8 +158,8 @@
147
158
  display: flex;
148
159
  flex-direction: column;
149
160
  align-items: flex-end;
150
- gap: 12px;
151
- padding-left: 12px;
161
+ gap: 8px;
162
+ padding-left: 8px;
152
163
  flex-shrink: 0;
153
164
 
154
165
  &-top {
@@ -161,10 +172,22 @@
161
172
  &-bottom {
162
173
  display: inline-flex;
163
174
  align-items: center;
164
- gap: 8px;
175
+ gap: 4px;
176
+ opacity: 0;
177
+ max-width: 0;
178
+ overflow: hidden;
179
+ pointer-events: none;
180
+ transition: opacity .2s ease, max-width .24s ease;
165
181
  }
166
182
  }
167
183
 
184
+ &__rule-item--active .automation-view__rule-actions-bottom,
185
+ &__rule-card:hover .automation-view__rule-actions-bottom {
186
+ opacity: 1;
187
+ max-width: 88px;
188
+ pointer-events: auto;
189
+ }
190
+
168
191
  &__rule-last {
169
192
  display: inline-flex;
170
193
  align-items: center;
@@ -180,9 +203,11 @@
180
203
  display: inline-flex;
181
204
  align-items: center;
182
205
  justify-content: center;
183
- width: 32px;
184
- height: 32px;
206
+ width: 20px;
207
+ min-width: 20px;
208
+ height: 20px;
185
209
  padding: 0;
210
+ border-radius: 4px;
186
211
 
187
212
  &--run .automation-view__action-icon,
188
213
  &--add .automation-view__action-icon {
@@ -203,7 +228,7 @@
203
228
  }
204
229
 
205
230
  &__action-icon {
206
- font-size: 18px;
231
+ font-size: 16px;
207
232
  }
208
233
 
209
234
  &__action-icon--star {
@@ -215,5 +240,6 @@
215
240
  display: flex;
216
241
  align-items: center;
217
242
  justify-content: center;
243
+ padding: 12px;
218
244
  }
219
245
  }