@vibe-forge/client 0.11.3 → 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 (200) hide show
  1. package/cli.cjs +6 -11
  2. package/dist/assets/{arc-h39NrT24.js → arc-CbOXL0l9.js} +1 -1
  3. package/dist/assets/{blockDiagram-c4efeb88-CaDg46I6.js → blockDiagram-c4efeb88-CqxINvsS.js} +1 -1
  4. package/dist/assets/{c4Diagram-c83219d4-CDqjcF9U.js → c4Diagram-c83219d4-BKazU0hb.js} +1 -1
  5. package/dist/assets/channel-Dnopc5A6.js +1 -0
  6. package/dist/assets/{classDiagram-beda092f-BDnZm8nO.js → classDiagram-beda092f-fAFX5BpB.js} +1 -1
  7. package/dist/assets/{classDiagram-v2-2358418a-BUi85KJW.js → classDiagram-v2-2358418a-w1VkNGJj.js} +1 -1
  8. package/dist/assets/clone-sQthahUA.js +1 -0
  9. package/dist/assets/{createText-1719965b-Ca5dEwfo.js → createText-1719965b-CEinakVP.js} +1 -1
  10. package/dist/assets/{cssMode-Ysz7NfYo.js → cssMode-DPqRki4y.js} +1 -1
  11. package/dist/assets/{edges-96097737-CdSKqxZt.js → edges-96097737-Cb0F1_3K.js} +1 -1
  12. package/dist/assets/{erDiagram-0228fc6a-B-veAUv_.js → erDiagram-0228fc6a-C-N2fx-J.js} +1 -1
  13. package/dist/assets/{flowDb-c6c81e3f-DD8Cx7_9.js → flowDb-c6c81e3f-D1Xz_8Gf.js} +1 -1
  14. package/dist/assets/{flowDiagram-50d868cf-9f-_x1ET.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-5RhpQM4M.js → flowchart-elk-definition-6af322e1-Dr1DDXwE.js} +1 -1
  17. package/dist/assets/{freemarker2-SgMdIXw4.js → freemarker2-C3DvPFaK.js} +1 -1
  18. package/dist/assets/{ganttDiagram-a2739b55-DnxNghZA.js → ganttDiagram-a2739b55-DmvY1GRj.js} +1 -1
  19. package/dist/assets/{gitGraphDiagram-82fe8481-CBvS3Tf9.js → gitGraphDiagram-82fe8481-CoXfPYYi.js} +1 -1
  20. package/dist/assets/{graph-CkHF299-.js → graph-BkDQy7Qt.js} +1 -1
  21. package/dist/assets/{handlebars-C57IyLUe.js → handlebars-BcTFdqjl.js} +1 -1
  22. package/dist/assets/{html-YsDy5wvW.js → html-Dg-O6XFr.js} +1 -1
  23. package/dist/assets/{htmlMode-7o_VDODD.js → htmlMode-B_wqYWvn.js} +1 -1
  24. package/dist/assets/{index-5325376f-BzOVQPu-.js → index-5325376f-kxPTR3_e.js} +1 -1
  25. package/dist/assets/index-o93dlo92.css +32 -0
  26. package/dist/assets/{index-BHFpctk6.js → index-wkhI4dr6.js} +357 -337
  27. package/dist/assets/{infoDiagram-8eee0895-DJ-UI1h4.js → infoDiagram-8eee0895-BEvqkwPI.js} +1 -1
  28. package/dist/assets/{javascript-BHQ9NEZr.js → javascript-DhlOH8_z.js} +1 -1
  29. package/dist/assets/{journeyDiagram-c64418c1-DwfykcG9.js → journeyDiagram-c64418c1-gKtLYmmp.js} +1 -1
  30. package/dist/assets/{jsonMode-3QjftkMM.js → jsonMode-DxTbF9OD.js} +1 -1
  31. package/dist/assets/{layout-CbViRb_b.js → layout-CDaZEk6E.js} +1 -1
  32. package/dist/assets/{line-DBdBvv9D.js → line-DNRQu8iq.js} +1 -1
  33. package/dist/assets/{linear-BDAfhcjn.js → linear-Cph9Z6_j.js} +1 -1
  34. package/dist/assets/{liquid-B0cPPzIR.js → liquid-ByZ6JgRG.js} +1 -1
  35. package/dist/assets/{lspLanguageFeatures-IOxbobOz.js → lspLanguageFeatures-DzvhkgnM.js} +1 -1
  36. package/dist/assets/{mdx-Dma_RA8P.js → mdx-D8RGHTl6.js} +1 -1
  37. package/dist/assets/{mermaid.core-Cvn8Go4x.js → mermaid.core-BgcryF__.js} +4 -4
  38. package/dist/assets/{mindmap-definition-8da855dc-DEnYq0Lc.js → mindmap-definition-8da855dc-WrxK0FcB.js} +1 -1
  39. package/dist/assets/{pieDiagram-a8764435-ZC4j8sHU.js → pieDiagram-a8764435-VsZBsiQy.js} +1 -1
  40. package/dist/assets/{python-Be0WX4q5.js → python-CXVtk_cg.js} +1 -1
  41. package/dist/assets/{quadrantDiagram-1e28029f-DUaqHlIB.js → quadrantDiagram-1e28029f-BVlgwOvU.js} +1 -1
  42. package/dist/assets/{razor-Tjhny-uT.js → razor-0tind7h2.js} +1 -1
  43. package/dist/assets/{requirementDiagram-08caed73-DjSal3es.js → requirementDiagram-08caed73-CpPMPoYp.js} +1 -1
  44. package/dist/assets/{sankeyDiagram-a04cb91d-BMDXMrMz.js → sankeyDiagram-a04cb91d-Cm5nnRmc.js} +1 -1
  45. package/dist/assets/{sequenceDiagram-c5b8d532-CQl9YUlH.js → sequenceDiagram-c5b8d532-DpMlJvJB.js} +1 -1
  46. package/dist/assets/{stateDiagram-1ecb1508-DG7mU9jD.js → stateDiagram-1ecb1508-DU1zc7vq.js} +1 -1
  47. package/dist/assets/{stateDiagram-v2-c2b004d7-DTbR_azy.js → stateDiagram-v2-c2b004d7-D-0RgmAp.js} +1 -1
  48. package/dist/assets/{styles-b4e223ce-C9aS3zb8.js → styles-b4e223ce-BSO-yNWV.js} +1 -1
  49. package/dist/assets/{styles-ca3715f6-Bh3keVTZ.js → styles-ca3715f6-CHnsn2Ro.js} +1 -1
  50. package/dist/assets/{styles-d45a18b0-BDcLLa65.js → styles-d45a18b0-B-rVGjEq.js} +1 -1
  51. package/dist/assets/{svgDrawCommon-b86b1483-B9H5ZS_9.js → svgDrawCommon-b86b1483-CA3Pl89f.js} +1 -1
  52. package/dist/assets/{timeline-definition-faaaa080-DCMYCBhK.js → timeline-definition-faaaa080-BcihLR6s.js} +1 -1
  53. package/dist/assets/{tsMode-DVqLsn98.js → tsMode-D9GGa5Ur.js} +1 -1
  54. package/dist/assets/{typescript-wMVyXw7G.js → typescript-BT9CK_EL.js} +1 -1
  55. package/dist/assets/{xml-w0gzmn0c.js → xml-DNO75J-T.js} +1 -1
  56. package/dist/assets/{xychartDiagram-f5964ef8-CdxyD3K5.js → xychartDiagram-f5964ef8-DJTwe32X.js} +1 -1
  57. package/dist/assets/{yaml-C29TL1ed.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 +61 -3
  62. package/src/api.ts +8 -0
  63. package/src/components/ArchiveView.scss +143 -54
  64. package/src/components/ArchiveView.tsx +181 -167
  65. package/src/components/CodeBlock.scss +5 -0
  66. package/src/components/ConfigView.scss +142 -31
  67. package/src/components/ConfigView.tsx +161 -86
  68. package/src/components/MarkdownContent.tsx +7 -0
  69. package/src/components/NavRail.scss +248 -0
  70. package/src/components/NavRail.tsx +80 -107
  71. package/src/components/NavRailCompact.tsx +107 -0
  72. package/src/components/NavRailCompactMoreSheet.tsx +141 -0
  73. package/src/components/ShortcutTooltip.tsx +4 -2
  74. package/src/components/Sidebar.scss +51 -0
  75. package/src/components/Sidebar.tsx +43 -16
  76. package/src/components/automation-view/RuleFormPanel.scss +40 -13
  77. package/src/components/automation-view/RuleSidebar.scss +73 -47
  78. package/src/components/automation-view/RuleSidebar.tsx +9 -13
  79. package/src/components/automation-view/RunHistoryPanel.scss +141 -13
  80. package/src/components/automation-view/RunHistoryPanel.tsx +203 -161
  81. package/src/components/automation-view/TaskList.scss +44 -13
  82. package/src/components/automation-view/TriggerList.scss +46 -14
  83. package/src/components/automation-view/index.scss +82 -10
  84. package/src/components/automation-view/index.tsx +108 -55
  85. package/src/components/benchmark-view/BenchmarkCasePanel.scss +36 -16
  86. package/src/components/benchmark-view/BenchmarkSidebar.scss +44 -22
  87. package/src/components/benchmark-view/BenchmarkSidebar.tsx +0 -6
  88. package/src/components/benchmark-view/BenchmarkView.scss +63 -20
  89. package/src/components/benchmark-view/index.tsx +71 -34
  90. package/src/components/chat/ChatComposerCard.scss +4 -0
  91. package/src/components/chat/ChatHeader.scss +187 -0
  92. package/src/components/chat/ChatHeader.tsx +206 -56
  93. package/src/components/chat/ChatHistoryView.tsx +63 -2
  94. package/src/components/chat/ChatTimelineView.scss +94 -1
  95. package/src/components/chat/ChatTimelineView.tsx +42 -0
  96. package/src/components/chat/NewSessionGuide.scss +139 -1
  97. package/src/components/chat/NewSessionGuide.tsx +57 -100
  98. package/src/components/chat/NewSessionGuideCompactPanel.tsx +130 -0
  99. package/src/components/chat/NewSessionGuideGrid.tsx +141 -0
  100. package/src/components/chat/git-controls/BranchSwitcherDropdown.tsx +61 -56
  101. package/src/components/chat/git-controls/BranchSwitcherResults.tsx +167 -0
  102. package/src/components/chat/git-controls/BranchTreeEntries.tsx +99 -0
  103. package/src/components/chat/git-controls/ChatGitControls.scss +437 -5
  104. package/src/components/chat/git-controls/ChatGitControls.tsx +136 -109
  105. package/src/components/chat/git-controls/DraftGitControls.tsx +91 -0
  106. package/src/components/chat/git-controls/GitOperationsDropdown.tsx +10 -2
  107. package/src/components/chat/git-controls/GitWorktreeDropdown.tsx +301 -28
  108. package/src/components/chat/git-controls/git-branch-tree.ts +148 -0
  109. package/src/components/chat/git-controls/use-chat-draft-git-controls.ts +168 -0
  110. package/src/components/chat/git-controls/use-chat-git-controls.ts +76 -3
  111. package/src/components/chat/messages/MessageContextMenu.tsx +3 -1
  112. package/src/components/chat/messages/MessageItem.scss +78 -4
  113. package/src/components/chat/messages/MessageItem.tsx +47 -3
  114. package/src/components/chat/sender/@components/adapter-select/AdapterSelectControl.scss +15 -0
  115. package/src/components/chat/sender/@components/reference-actions/ReferenceActionsControl.scss +17 -0
  116. package/src/components/chat/sender/@components/reference-actions/ReferencePermissionActionsPopover.tsx +4 -1
  117. package/src/components/chat/sender/@components/sender-attachments/SenderAttachments.scss +15 -2
  118. package/src/components/chat/sender/@components/sender-body/SenderBody.tsx +3 -0
  119. package/src/components/chat/sender/@components/sender-monaco-editor/use-sender-monaco-theme.ts +52 -3
  120. package/src/components/chat/sender/@components/sender-submit-action/SenderSubmitAction.scss +12 -0
  121. package/src/components/chat/sender/@components/sender-toolbar/SenderSelectBase.scss +21 -0
  122. package/src/components/chat/sender/@components/sender-toolbar/SenderSelectShared.scss +21 -0
  123. package/src/components/chat/sender/@components/sender-toolbar/SenderToolbar.scss +63 -0
  124. package/src/components/chat/sender/@core/get-sender-runtime-state.ts +1 -1
  125. package/src/components/chat/sender/@hooks/use-model-select-browser.tsx +4 -2
  126. package/src/components/chat/sender/@types/sender-props.ts +1 -0
  127. package/src/components/chat/sender/Sender.scss +1 -1
  128. package/src/components/chat/sender/Sender.tsx +1 -0
  129. package/src/components/chat/session-timeline-panel/EventList.scss +88 -0
  130. package/src/components/chat/session-timeline-panel/EventList.tsx +99 -47
  131. package/src/components/chat/session-timeline-panel/gantt.ts +23 -7
  132. package/src/components/chat/session-timeline-panel/git-graph.ts +6 -1
  133. package/src/components/chat/session-timeline-panel/index.scss +14 -1
  134. package/src/components/chat/session-timeline-panel/index.tsx +86 -10
  135. package/src/components/chat/session-timeline-panel/types.ts +4 -0
  136. package/src/components/chat/status-bar/ChatStatusBar.scss +27 -0
  137. package/src/components/chat/status-bar/ChatStatusBar.tsx +39 -0
  138. package/src/components/chat/terminal/ChatTerminalView.tsx +6 -0
  139. package/src/components/chat/tools/core/ToolCallBox.scss +19 -0
  140. package/src/components/chat/tools/core/ToolGroup.scss +32 -0
  141. package/src/components/chat/tools/task/components/TaskToolCard.scss +59 -1
  142. package/src/components/config/ConfigEditors.scss +20 -6
  143. package/src/components/config/ConfigFieldRow.scss +57 -17
  144. package/src/components/config/ConfigSectionForm.scss +10 -4
  145. package/src/components/config/ConfigSectionPanel.tsx +18 -11
  146. package/src/components/config/configSchema.ts +1 -0
  147. package/src/components/config/record-editors/RecordEditors.scss +42 -9
  148. package/src/components/dock-panel/DockPanel.scss +6 -2
  149. package/src/components/dock-panel/DockPanel.tsx +12 -16
  150. package/src/components/knowledge-base/KnowledgeBaseView.scss +180 -6
  151. package/src/components/knowledge-base/KnowledgeBaseView.tsx +98 -26
  152. package/src/components/knowledge-base/components/ActionButton.scss +4 -0
  153. package/src/components/knowledge-base/components/EmptyState.scss +5 -8
  154. package/src/components/knowledge-base/components/EntitiesTab.tsx +8 -2
  155. package/src/components/knowledge-base/components/EntityItem.scss +10 -3
  156. package/src/components/knowledge-base/components/FilterBar.scss +13 -2
  157. package/src/components/knowledge-base/components/FlowsTab.tsx +8 -2
  158. package/src/components/knowledge-base/components/KnowledgeBaseHeader.scss +2 -23
  159. package/src/components/knowledge-base/components/KnowledgeBaseHeader.tsx +0 -5
  160. package/src/components/knowledge-base/components/KnowledgeList.scss +15 -6
  161. package/src/components/knowledge-base/components/LoadingState.scss +4 -0
  162. package/src/components/knowledge-base/components/RuleItem.scss +86 -0
  163. package/src/components/knowledge-base/components/RuleItem.tsx +2 -0
  164. package/src/components/knowledge-base/components/RulesTab.tsx +8 -2
  165. package/src/components/knowledge-base/components/SectionHeader.scss +3 -18
  166. package/src/components/knowledge-base/components/SectionHeader.tsx +3 -7
  167. package/src/components/knowledge-base/components/SkillsTab.tsx +8 -3
  168. package/src/components/knowledge-base/components/SpecItem.scss +16 -7
  169. package/src/components/layout/@hooks/use-mobile-sidebar-modal.ts +190 -0
  170. package/src/components/layout/AppShell.scss +106 -6
  171. package/src/components/layout/AppShell.tsx +118 -10
  172. package/src/components/layout/PageShell.scss +41 -0
  173. package/src/components/layout/PageShell.tsx +32 -0
  174. package/src/components/layout/mobile-sidebar-constants.ts +1 -0
  175. package/src/components/nav-rail-compact-config.ts +114 -0
  176. package/src/components/nav-rail-items.tsx +181 -0
  177. package/src/components/sidebar/SessionContextMenu.tsx +3 -1
  178. package/src/components/sidebar/SessionItem.scss +62 -0
  179. package/src/components/sidebar/SessionItem.tsx +97 -52
  180. package/src/components/sidebar/SessionList.tsx +6 -0
  181. package/src/components/sidebar/SidebarHeader.scss +49 -0
  182. package/src/components/sidebar/SidebarHeader.tsx +27 -5
  183. package/src/components/sidebar/SidebarHeaderBatchActions.tsx +8 -4
  184. package/src/components/sidebar/SidebarHeaderSearchActions.tsx +6 -3
  185. package/src/components/sidebar/SidebarUtilityFooter.tsx +69 -0
  186. package/src/components/workspace/ContextFilePicker.tsx +12 -4
  187. package/src/hooks/chat/chat-session-workspace-draft.ts +25 -0
  188. package/src/hooks/chat/use-chat-scroll.ts +24 -7
  189. package/src/hooks/chat/use-chat-session-actions.ts +19 -2
  190. package/src/hooks/use-responsive-layout.ts +115 -0
  191. package/src/resources/adapters.ts +15 -0
  192. package/src/resources/locales/en.json +52 -0
  193. package/src/resources/locales/zh.json +52 -0
  194. package/src/routes/ChatRoute.scss +113 -14
  195. package/src/routes/ChatRoute.tsx +29 -35
  196. package/src/store/index.ts +2 -0
  197. package/dist/assets/channel-CBULQbJz.js +0 -1
  198. package/dist/assets/clone-dkS7LczW.js +0 -1
  199. package/dist/assets/flowDiagram-v2-4f6560a1-1miffU4x.js +0 -1
  200. package/dist/assets/index-D_XqxIvp.css +0 -32
@@ -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
  }