@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
@@ -99,10 +99,15 @@ export function RuleSidebar({
99
99
 
100
100
  return (
101
101
  <div className='automation-view__sidebar'>
102
- <div className='automation-view__sidebar-header'>
103
- <div className='automation-view__title'>
104
- <h2 className='automation-view__title-text'>{t('automation.title')}</h2>
105
- </div>
102
+ <div className='automation-view__sidebar-search-row'>
103
+ <Input
104
+ value={query}
105
+ onChange={(event) => onQueryChange(event.target.value)}
106
+ placeholder={t('automation.searchRule')}
107
+ prefix={<span className='material-symbols-rounded automation-view__search-icon'>search</span>}
108
+ allowClear
109
+ className='automation-view__sidebar-search-input'
110
+ />
106
111
  <Tooltip title={isCreating ? t('automation.creatingRule') : t('automation.newRule')}>
107
112
  <Button
108
113
  className='automation-view__icon-button automation-view__icon-button--add'
@@ -116,15 +121,6 @@ export function RuleSidebar({
116
121
  </Button>
117
122
  </Tooltip>
118
123
  </div>
119
- <div className='automation-view__sidebar-search'>
120
- <Input
121
- value={query}
122
- onChange={(event) => onQueryChange(event.target.value)}
123
- placeholder={t('automation.searchRule')}
124
- prefix={<span className='material-symbols-rounded automation-view__search-icon'>search</span>}
125
- allowClear
126
- />
127
- </div>
128
124
 
129
125
  {filteredRules.length === 0
130
126
  ? (
@@ -1,15 +1,32 @@
1
1
  .automation-view {
2
+ &__surface {
3
+ border: none;
4
+ border-radius: 0;
5
+ background: transparent;
6
+ }
7
+
2
8
  &__content {
3
9
  display: flex;
4
10
  flex-direction: column;
5
- gap: 12px;
11
+ gap: 18px;
6
12
  height: 100%;
7
13
  }
8
14
 
15
+ &__detail-surface,
16
+ &__history-surface {
17
+ padding: 0;
18
+ }
19
+
20
+ &__history-surface {
21
+ padding-top: 16px;
22
+ border-top: 1px solid var(--border-color);
23
+ }
24
+
9
25
  &__content-header {
10
26
  display: flex;
11
27
  align-items: baseline;
12
28
  justify-content: space-between;
29
+ margin-bottom: 10px;
13
30
  }
14
31
 
15
32
  &__content-title {
@@ -32,7 +49,7 @@
32
49
  &__detail {
33
50
  display: flex;
34
51
  flex-direction: column;
35
- gap: 12px;
52
+ gap: 10px;
36
53
  }
37
54
 
38
55
  &__detail-header {
@@ -63,19 +80,28 @@
63
80
  &__detail-body {
64
81
  display: grid;
65
82
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
66
- gap: 16px;
83
+ gap: 12px;
67
84
  }
68
85
 
69
- &__detail-left {
86
+ &__detail-column {
70
87
  display: flex;
71
88
  flex-direction: column;
72
- gap: 12px;
89
+ gap: 10px;
73
90
  }
74
91
 
75
- &__detail-right {
92
+ &__detail-panel {
76
93
  display: flex;
77
94
  flex-direction: column;
78
- gap: 12px;
95
+ gap: var(--subpage-tertiary-gap);
96
+ min-height: 0;
97
+ padding: var(--subpage-tertiary-padding);
98
+ border: var(--subpage-tertiary-border);
99
+ border-radius: var(--subpage-tertiary-radius);
100
+ background: var(--subpage-tertiary-bg);
101
+ }
102
+
103
+ &__detail-panel--list {
104
+ min-height: 120px;
79
105
  }
80
106
 
81
107
  &__detail-row {
@@ -95,7 +121,6 @@
95
121
  display: flex;
96
122
  flex-direction: column;
97
123
  gap: 6px;
98
- padding-left: 22px;
99
124
  }
100
125
 
101
126
  &__run-item {
@@ -177,20 +202,78 @@
177
202
 
178
203
  &__run-filters {
179
204
  display: flex;
205
+ flex-wrap: wrap;
180
206
  align-items: center;
181
- gap: 12px;
207
+ gap: 8px;
182
208
  }
183
209
 
184
210
  &__run-search {
185
- max-width: 240px;
211
+ flex: 1 1 220px;
212
+ min-width: 220px;
186
213
  }
187
214
 
188
215
  &__run-select {
189
- min-width: 140px;
216
+ min-width: 132px;
190
217
  }
191
218
 
192
219
  &__run-table {
193
220
  flex: 1;
221
+ min-height: 0;
222
+
223
+ .ant-table-container {
224
+ border: var(--subpage-tertiary-border);
225
+ border-radius: var(--subpage-tertiary-radius);
226
+ overflow: hidden;
227
+ background: var(--subpage-tertiary-bg);
228
+ }
229
+
230
+ .ant-table-thead > tr > th {
231
+ background: var(--subpage-tertiary-bg);
232
+ }
233
+ }
234
+
235
+ &__run-card-list {
236
+ display: flex;
237
+ flex-direction: column;
238
+ gap: 8px;
239
+ }
240
+
241
+ &__run-card {
242
+ display: flex;
243
+ flex-direction: column;
244
+ gap: 6px;
245
+ padding: 10px 12px;
246
+ border: var(--subpage-tertiary-border);
247
+ border-radius: var(--subpage-tertiary-radius);
248
+ background: var(--subpage-tertiary-bg);
249
+ color: inherit;
250
+ }
251
+
252
+ &__run-card-header {
253
+ display: flex;
254
+ align-items: flex-start;
255
+ justify-content: space-between;
256
+ gap: 10px;
257
+ }
258
+
259
+ &__run-card-title {
260
+ min-width: 0;
261
+ font-size: 13px;
262
+ font-weight: 600;
263
+ color: var(--text-color);
264
+ }
265
+
266
+ &__run-card-time,
267
+ &__run-card-summary {
268
+ font-size: 12px;
269
+ color: var(--sub-text-color);
270
+ }
271
+
272
+ &__run-card-summary {
273
+ display: -webkit-box;
274
+ overflow: hidden;
275
+ -webkit-box-orient: vertical;
276
+ -webkit-line-clamp: 2;
194
277
  }
195
278
 
196
279
  &__run-summary {
@@ -260,8 +343,9 @@
260
343
  display: inline-flex;
261
344
  align-items: center;
262
345
  justify-content: center;
263
- width: 32px;
264
- height: 32px;
346
+ width: 28px;
347
+ min-width: 28px;
348
+ height: 28px;
265
349
  padding: 0;
266
350
 
267
351
  &--edit .automation-view__action-icon {
@@ -283,4 +367,48 @@
283
367
  align-items: center;
284
368
  justify-content: center;
285
369
  }
370
+
371
+ &__run-search .ant-input-affix-wrapper,
372
+ &__run-select .ant-select-selector {
373
+ height: 30px !important;
374
+ border-radius: 6px !important;
375
+ background: var(--bg-color);
376
+ }
377
+
378
+ &__run-select .ant-select-selector {
379
+ align-items: center !important;
380
+ }
381
+ }
382
+
383
+ @media (max-width: 960px) {
384
+ .automation-view {
385
+ &__content {
386
+ gap: 14px;
387
+ }
388
+
389
+ &__detail-header,
390
+ &__content-header {
391
+ align-items: flex-start;
392
+ gap: 10px;
393
+ }
394
+
395
+ &__detail-description {
396
+ align-items: flex-start;
397
+ }
398
+
399
+ &__run-filters {
400
+ display: grid;
401
+ grid-template-columns: 1fr;
402
+ }
403
+
404
+ &__run-search,
405
+ &__run-select {
406
+ min-width: 0;
407
+ width: 100%;
408
+ }
409
+
410
+ &__detail-body {
411
+ grid-template-columns: 1fr;
412
+ }
413
+ }
286
414
  }
@@ -9,6 +9,7 @@ import { useTranslation } from 'react-i18next'
9
9
  import type { AutomationRule, AutomationRun } from '#~/api.js'
10
10
 
11
11
  interface RunHistoryPanelProps {
12
+ compact?: boolean
12
13
  rule: AutomationRule | null
13
14
  runs: AutomationRun[]
14
15
  runQuery: string
@@ -23,6 +24,7 @@ interface RunHistoryPanelProps {
23
24
  }
24
25
 
25
26
  export function RunHistoryPanel({
27
+ compact = false,
26
28
  rule,
27
29
  runs,
28
30
  runQuery,
@@ -140,181 +142,221 @@ export function RunHistoryPanel({
140
142
 
141
143
  return (
142
144
  <div className='automation-view__content'>
143
- <div className='automation-view__detail'>
144
- <div className='automation-view__detail-header'>
145
- <div className='automation-view__detail-title'>
146
- <h3 className='automation-view__content-text'>{rule.name}</h3>
147
- <span className='automation-view__detail-id'>{rule.id}</span>
148
- </div>
149
- <Button
150
- className='automation-view__icon-button automation-view__icon-button--edit'
151
- type='text'
152
- onClick={() => onEditRule(rule)}
153
- >
154
- <span className='material-symbols-rounded automation-view__action-icon'>edit</span>
155
- </Button>
156
- </div>
157
- <div className='automation-view__detail-description'>
158
- <span className='material-symbols-rounded automation-view__meta-icon'>description</span>
159
- <span>{rule.description || t('automation.noDescription')}</span>
160
- </div>
161
- <div className='automation-view__detail-body'>
162
- <div className='automation-view__detail-left'>
163
- <div className='automation-view__detail-row'>
164
- <span className='material-symbols-rounded automation-view__meta-icon'>event</span>
165
- <span className='automation-view__detail-label'>{t('automation.createdAt')}</span>
166
- <span className='automation-view__detail-value'>
167
- {dayjs(rule.createdAt).format('YYYY-MM-DD HH:mm')}
168
- </span>
169
- </div>
170
- <div className='automation-view__detail-row'>
171
- <span className='material-symbols-rounded automation-view__meta-icon'>toggle_on</span>
172
- <span className='automation-view__detail-label'>{t('automation.ruleStatus')}</span>
173
- <span className='automation-view__detail-value' data-status={rule.enabled ? 'enabled' : 'disabled'}>
174
- {rule.enabled ? t('automation.enabledOn') : t('automation.enabledOff')}
175
- </span>
176
- </div>
177
- <div className='automation-view__detail-list'>
178
- <div className='automation-view__detail-row'>
179
- <span className='material-symbols-rounded automation-view__meta-icon'>update</span>
180
- <span className='automation-view__detail-label'>{t('automation.lastRunLabel')}</span>
181
- </div>
182
- <div className='automation-view__run-list'>
183
- {recentRuns.length > 0
184
- ? recentRuns.map((run) => (
185
- <div key={run.id} className='automation-view__run-item'>
186
- <a
187
- className='automation-view__run-link'
188
- href={`/session/${run.sessionId}?tag=${
189
- encodeURIComponent(`automation:${rule.id}:${rule.name}`)
190
- }`}
191
- target='_blank'
192
- rel='noreferrer'
193
- >
194
- {run.taskTitle ?? t('automation.taskUnknown')}
195
- </a>
196
- <span className='automation-view__run-time'>
197
- {dayjs(run.runAt).format('YYYY-MM-DD HH:mm')}
198
- </span>
199
- </div>
200
- ))
201
- : <span className='automation-view__detail-value'>{t('automation.noRunYet')}</span>}
202
- </div>
145
+ <div className='automation-view__surface automation-view__detail-surface'>
146
+ <div className='automation-view__detail'>
147
+ <div className='automation-view__detail-header'>
148
+ <div className='automation-view__detail-title'>
149
+ <h3 className='automation-view__content-text'>{rule.name}</h3>
150
+ <span className='automation-view__detail-id'>{rule.id}</span>
203
151
  </div>
204
- {rule.lastSessionId && (
205
- <div className='automation-view__detail-row'>
206
- <span className='material-symbols-rounded automation-view__meta-icon'>open_in_new</span>
207
- <a
208
- className='automation-view__detail-label automation-view__detail-link'
209
- href={`/session/${rule.lastSessionId}?tag=${
210
- encodeURIComponent(`automation:${rule.id}:${rule.name}`)
211
- }`}
212
- target='_blank'
213
- rel='noreferrer'
214
- >
215
- {t('automation.relatedSession')}
216
- </a>
217
- </div>
218
- )}
152
+ <Button
153
+ className='automation-view__icon-button automation-view__icon-button--edit'
154
+ type='text'
155
+ onClick={() => onEditRule(rule)}
156
+ >
157
+ <span className='material-symbols-rounded automation-view__action-icon'>edit</span>
158
+ </Button>
219
159
  </div>
220
- <div className='automation-view__detail-right'>
221
- <div className='automation-view__detail-section'>
222
- <div className='automation-view__detail-section-title'>
223
- <span className='material-symbols-rounded automation-view__meta-icon'>bolt</span>
224
- {t('automation.sectionTriggers')}
160
+ <div className='automation-view__detail-description'>
161
+ <span className='material-symbols-rounded automation-view__meta-icon'>description</span>
162
+ <span>{rule.description || t('automation.noDescription')}</span>
163
+ </div>
164
+ <div className='automation-view__detail-body'>
165
+ <div className='automation-view__detail-column'>
166
+ <div className='automation-view__detail-panel'>
167
+ <div className='automation-view__detail-row'>
168
+ <span className='material-symbols-rounded automation-view__meta-icon'>event</span>
169
+ <span className='automation-view__detail-label'>{t('automation.createdAt')}</span>
170
+ <span className='automation-view__detail-value'>
171
+ {dayjs(rule.createdAt).format('YYYY-MM-DD HH:mm')}
172
+ </span>
173
+ </div>
174
+ <div className='automation-view__detail-row'>
175
+ <span className='material-symbols-rounded automation-view__meta-icon'>toggle_on</span>
176
+ <span className='automation-view__detail-label'>{t('automation.ruleStatus')}</span>
177
+ <span className='automation-view__detail-value' data-status={rule.enabled ? 'enabled' : 'disabled'}>
178
+ {rule.enabled ? t('automation.enabledOn') : t('automation.enabledOff')}
179
+ </span>
180
+ </div>
181
+ {rule.lastSessionId && (
182
+ <div className='automation-view__detail-row'>
183
+ <span className='material-symbols-rounded automation-view__meta-icon'>open_in_new</span>
184
+ <a
185
+ className='automation-view__detail-label automation-view__detail-link'
186
+ href={`/session/${rule.lastSessionId}?tag=${
187
+ encodeURIComponent(`automation:${rule.id}:${rule.name}`)
188
+ }`}
189
+ target='_blank'
190
+ rel='noreferrer'
191
+ >
192
+ {t('automation.relatedSession')}
193
+ </a>
194
+ </div>
195
+ )}
225
196
  </div>
226
- <div className='automation-view__detail-chips'>
227
- {triggerLabels.length
228
- ? triggerLabels.map((label, index) => (
229
- <span key={`${label}-${index}`} className='automation-view__detail-chip'>
230
- {label}
231
- </span>
232
- ))
233
- : <span className='automation-view__detail-placeholder'>{t('automation.noTriggers')}</span>}
197
+ <div className='automation-view__detail-panel automation-view__detail-panel--list'>
198
+ <div className='automation-view__detail-row'>
199
+ <span className='material-symbols-rounded automation-view__meta-icon'>update</span>
200
+ <span className='automation-view__detail-label'>{t('automation.lastRunLabel')}</span>
201
+ </div>
202
+ <div className='automation-view__run-list'>
203
+ {recentRuns.length > 0
204
+ ? recentRuns.map((run) => (
205
+ <div key={run.id} className='automation-view__run-item'>
206
+ <a
207
+ className='automation-view__run-link'
208
+ href={`/session/${run.sessionId}?tag=${
209
+ encodeURIComponent(`automation:${rule.id}:${rule.name}`)
210
+ }`}
211
+ target='_blank'
212
+ rel='noreferrer'
213
+ >
214
+ {run.taskTitle ?? t('automation.taskUnknown')}
215
+ </a>
216
+ <span className='automation-view__run-time'>
217
+ {dayjs(run.runAt).format('YYYY-MM-DD HH:mm')}
218
+ </span>
219
+ </div>
220
+ ))
221
+ : <span className='automation-view__detail-value'>{t('automation.noRunYet')}</span>}
222
+ </div>
234
223
  </div>
235
224
  </div>
236
- <div className='automation-view__detail-section'>
237
- <div className='automation-view__detail-section-title'>
238
- <span className='material-symbols-rounded automation-view__meta-icon'>task</span>
239
- {t('automation.sectionTasks')}
225
+ <div className='automation-view__detail-column'>
226
+ <div className='automation-view__detail-panel'>
227
+ <div className='automation-view__detail-section-title'>
228
+ <span className='material-symbols-rounded automation-view__meta-icon'>bolt</span>
229
+ {t('automation.sectionTriggers')}
230
+ </div>
231
+ <div className='automation-view__detail-chips'>
232
+ {triggerLabels.length
233
+ ? triggerLabels.map((label, index) => (
234
+ <span key={`${label}-${index}`} className='automation-view__detail-chip'>
235
+ {label}
236
+ </span>
237
+ ))
238
+ : <span className='automation-view__detail-placeholder'>{t('automation.noTriggers')}</span>}
239
+ </div>
240
240
  </div>
241
- <div className='automation-view__detail-chips'>
242
- {taskLabels.length
243
- ? taskLabels.map((label, index) => (
244
- <span key={`${label}-${index}`} className='automation-view__detail-chip'>
245
- {label}
246
- </span>
247
- ))
248
- : <span className='automation-view__detail-placeholder'>{t('automation.noTasks')}</span>}
241
+ <div className='automation-view__detail-panel'>
242
+ <div className='automation-view__detail-section-title'>
243
+ <span className='material-symbols-rounded automation-view__meta-icon'>task</span>
244
+ {t('automation.sectionTasks')}
245
+ </div>
246
+ <div className='automation-view__detail-chips'>
247
+ {taskLabels.length
248
+ ? taskLabels.map((label, index) => (
249
+ <span key={`${label}-${index}`} className='automation-view__detail-chip'>
250
+ {label}
251
+ </span>
252
+ ))
253
+ : <span className='automation-view__detail-placeholder'>{t('automation.noTasks')}</span>}
254
+ </div>
249
255
  </div>
250
256
  </div>
251
257
  </div>
252
258
  </div>
253
259
  </div>
254
260
 
255
- <div className='automation-view__content-header'>
256
- <div className='automation-view__content-title'>
257
- <span className='material-symbols-rounded automation-view__content-icon'>history</span>
258
- <h3 className='automation-view__content-text'>{t('automation.runHistory')}</h3>
259
- </div>
260
- </div>
261
- <div className='automation-view__run-filters'>
262
- <Input
263
- value={runQuery}
264
- onChange={(event) => onRunQueryChange(event.target.value)}
265
- placeholder={t('automation.runSearch')}
266
- className='automation-view__run-search'
267
- allowClear
268
- />
269
- <Select
270
- value={statusFilter}
271
- onChange={onStatusFilterChange}
272
- className='automation-view__run-select'
273
- options={[
274
- { label: t('automation.statusAll'), value: 'all' },
275
- { label: t('common.status.running'), value: 'running' },
276
- { label: t('common.status.completed'), value: 'completed' },
277
- { label: t('common.status.failed'), value: 'failed' },
278
- { label: t('common.status.terminated'), value: 'terminated' },
279
- { label: t('common.status.waiting_input'), value: 'waiting_input' }
280
- ]}
281
- />
282
- <Select
283
- value={timeFilter}
284
- onChange={onTimeFilterChange}
285
- className='automation-view__run-select'
286
- options={[
287
- { label: t('automation.timeAll'), value: 'all' },
288
- { label: t('automation.time24h'), value: '24h' },
289
- { label: t('automation.time7d'), value: '7d' },
290
- { label: t('automation.time30d'), value: '30d' }
291
- ]}
292
- />
293
- <Select
294
- value={sortOrder}
295
- onChange={onSortOrderChange}
296
- className='automation-view__run-select'
297
- options={[
298
- { label: t('automation.sortDesc'), value: 'desc' },
299
- { label: t('automation.sortAsc'), value: 'asc' }
300
- ]}
301
- />
302
- </div>
303
- {filteredRuns.length === 0
304
- ? (
305
- <div className='automation-view__empty'>
306
- <Empty description={t('automation.noRuns')} />
261
+ <div className='automation-view__surface automation-view__history-surface'>
262
+ <div className='automation-view__content-header'>
263
+ <div className='automation-view__content-title'>
264
+ <span className='material-symbols-rounded automation-view__content-icon'>history</span>
265
+ <h3 className='automation-view__content-text'>{t('automation.runHistory')}</h3>
307
266
  </div>
308
- )
309
- : (
310
- <Table
311
- rowKey='id'
312
- className='automation-view__run-table'
313
- columns={columns}
314
- dataSource={filteredRuns}
315
- pagination={{ pageSize: 8, hideOnSinglePage: true }}
267
+ </div>
268
+ <div className='automation-view__run-filters'>
269
+ <Input
270
+ value={runQuery}
271
+ onChange={(event) => onRunQueryChange(event.target.value)}
272
+ placeholder={t('automation.runSearch')}
273
+ className='automation-view__run-search'
274
+ allowClear
275
+ />
276
+ <Select
277
+ value={statusFilter}
278
+ onChange={onStatusFilterChange}
279
+ className='automation-view__run-select'
280
+ options={[
281
+ { label: t('automation.statusAll'), value: 'all' },
282
+ { label: t('common.status.running'), value: 'running' },
283
+ { label: t('common.status.completed'), value: 'completed' },
284
+ { label: t('common.status.failed'), value: 'failed' },
285
+ { label: t('common.status.terminated'), value: 'terminated' },
286
+ { label: t('common.status.waiting_input'), value: 'waiting_input' }
287
+ ]}
288
+ />
289
+ <Select
290
+ value={timeFilter}
291
+ onChange={onTimeFilterChange}
292
+ className='automation-view__run-select'
293
+ options={[
294
+ { label: t('automation.timeAll'), value: 'all' },
295
+ { label: t('automation.time24h'), value: '24h' },
296
+ { label: t('automation.time7d'), value: '7d' },
297
+ { label: t('automation.time30d'), value: '30d' }
298
+ ]}
299
+ />
300
+ <Select
301
+ value={sortOrder}
302
+ onChange={onSortOrderChange}
303
+ className='automation-view__run-select'
304
+ options={[
305
+ { label: t('automation.sortDesc'), value: 'desc' },
306
+ { label: t('automation.sortAsc'), value: 'asc' }
307
+ ]}
316
308
  />
317
- )}
309
+ </div>
310
+ {filteredRuns.length === 0
311
+ ? (
312
+ <div className='automation-view__empty'>
313
+ <Empty description={t('automation.noRuns')} />
314
+ </div>
315
+ )
316
+ : compact
317
+ ? (
318
+ <div className='automation-view__run-card-list'>
319
+ {filteredRuns.map((run) => (
320
+ <a
321
+ key={run.id}
322
+ className='automation-view__run-card'
323
+ href={`/session/${run.sessionId}`}
324
+ >
325
+ <div className='automation-view__run-card-header'>
326
+ <span className='automation-view__run-card-title'>
327
+ {run.taskTitle ?? t('automation.taskUnknown')}
328
+ </span>
329
+ {run.status
330
+ ? (
331
+ <span className='automation-view__status' data-status={run.status}>
332
+ <span className='material-symbols-rounded automation-view__status-icon'>
333
+ fiber_manual_record
334
+ </span>
335
+ {t(`common.status.${run.status}`, run.status)}
336
+ </span>
337
+ )
338
+ : null}
339
+ </div>
340
+ <div className='automation-view__run-card-time'>
341
+ {dayjs(run.runAt).format('YYYY-MM-DD HH:mm')}
342
+ </div>
343
+ <div className='automation-view__run-card-summary'>
344
+ {run.title ?? run.lastMessage ?? run.lastUserMessage ?? '-'}
345
+ </div>
346
+ </a>
347
+ ))}
348
+ </div>
349
+ )
350
+ : (
351
+ <Table
352
+ rowKey='id'
353
+ className='automation-view__run-table'
354
+ columns={columns}
355
+ dataSource={filteredRuns}
356
+ pagination={{ pageSize: 8, hideOnSinglePage: true }}
357
+ />
358
+ )}
359
+ </div>
318
360
  </div>
319
361
  )
320
362
  }