@yancyyu/openhermit 1.6.38 → 1.6.40

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 (243) hide show
  1. package/dist-renderer/assets/ProjectEditorOverlay-CemDOX-3.js +58 -0
  2. package/dist-renderer/assets/{TeamGraphOverlay-ZEDfZyHb.js → TeamGraphOverlay-hPY770Db.js} +1 -1
  3. package/dist-renderer/assets/{_basePickBy-CIhniz70.js → _basePickBy-BHHrJT1i.js} +1 -1
  4. package/dist-renderer/assets/{_baseUniq-cKAW4Q8I.js → _baseUniq-CWErBtke.js} +1 -1
  5. package/dist-renderer/assets/{arc-YmNsoDXW.js → arc-C_o2_Uv8.js} +1 -1
  6. package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-DHEls2sX.js → architectureDiagram-VXUJARFQ-DUW0LI3t.js} +1 -1
  7. package/dist-renderer/assets/{blockDiagram-VD42YOAC-Bpwf1Sbg.js → blockDiagram-VD42YOAC-CWbCE9hQ.js} +1 -1
  8. package/dist-renderer/assets/{c4Diagram-YG6GDRKO-B0IaQ4w5.js → c4Diagram-YG6GDRKO-BjLadrfV.js} +1 -1
  9. package/dist-renderer/assets/channel-DyP9YlCF.js +1 -0
  10. package/dist-renderer/assets/{chunk-4BX2VUAB-DLk-hcFc.js → chunk-4BX2VUAB-CPnvjZl9.js} +1 -1
  11. package/dist-renderer/assets/{chunk-55IACEB6-1XRmX_Zm.js → chunk-55IACEB6-OlL47yXQ.js} +1 -1
  12. package/dist-renderer/assets/{chunk-B4BG7PRW-1waH1DAD.js → chunk-B4BG7PRW-DTasjbm8.js} +1 -1
  13. package/dist-renderer/assets/{chunk-DI55MBZ5-BqpZBtrN.js → chunk-DI55MBZ5-C5_Xaqkk.js} +1 -1
  14. package/dist-renderer/assets/{chunk-FMBD7UC4-Bly7vVym.js → chunk-FMBD7UC4-NdoM4DMR.js} +1 -1
  15. package/dist-renderer/assets/{chunk-QN33PNHL-Ci2QWBAs.js → chunk-QN33PNHL-C8Fybejy.js} +1 -1
  16. package/dist-renderer/assets/{chunk-QZHKN3VN-YCqFW7d-.js → chunk-QZHKN3VN-E98TYFXJ.js} +1 -1
  17. package/dist-renderer/assets/{chunk-TZMSLE5B-B0xGXInl.js → chunk-TZMSLE5B-h4lFgkIq.js} +1 -1
  18. package/dist-renderer/assets/classDiagram-2ON5EDUG-BqffFTae.js +1 -0
  19. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-BqffFTae.js +1 -0
  20. package/dist-renderer/assets/clone-MPcKWs2O.js +1 -0
  21. package/dist-renderer/assets/{cose-bilkent-S5V4N54A-DxcFNQKT.js → cose-bilkent-S5V4N54A-DtQ7fkrs.js} +1 -1
  22. package/dist-renderer/assets/{dagre-6UL2VRFP-DPo_RfZY.js → dagre-6UL2VRFP-CN-nL_z4.js} +1 -1
  23. package/dist-renderer/assets/{diagram-PSM6KHXK-U3hQsFe4.js → diagram-PSM6KHXK-DVJtqmm-.js} +1 -1
  24. package/dist-renderer/assets/{diagram-QEK2KX5R-OrwrAy0V.js → diagram-QEK2KX5R-DlxHxyXh.js} +1 -1
  25. package/dist-renderer/assets/{diagram-S2PKOQOG-CXATPWVw.js → diagram-S2PKOQOG-7dpzO6x6.js} +1 -1
  26. package/dist-renderer/assets/{erDiagram-Q2GNP2WA-B0e8AfMF.js → erDiagram-Q2GNP2WA-GP1TqsHi.js} +1 -1
  27. package/dist-renderer/assets/{flowDiagram-NV44I4VS-CXfzA4jJ.js → flowDiagram-NV44I4VS-C7ZLETuH.js} +1 -1
  28. package/dist-renderer/assets/{ganttDiagram-JELNMOA3-CMr08qVl.js → ganttDiagram-JELNMOA3-CvPB68dH.js} +1 -1
  29. package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-vYFHpPmy.js → gitGraphDiagram-V2S2FVAM-B5yOm3w7.js} +1 -1
  30. package/dist-renderer/assets/{graph-DOe5j8dH.js → graph-smeyY1YZ.js} +1 -1
  31. package/dist-renderer/assets/{index-BySQS7AB.js → index-BJx8XvG1.js} +1 -1
  32. package/dist-renderer/assets/{index-C_okzZXP.js → index-CQaXUAua.js} +1 -1
  33. package/dist-renderer/assets/{index-VJ-MM9xa.js → index-CajRpxO2.js} +1 -1
  34. package/dist-renderer/assets/{index-V7dAKPqd.js → index-ChG4rE-E.js} +587 -705
  35. package/dist-renderer/assets/index-DUd0uw9C.css +32 -0
  36. package/dist-renderer/assets/{index-CzWxVCRL.js → index-IhmXZWqf.js} +1 -1
  37. package/dist-renderer/assets/{index-B2Dy7M2G.js → index-x_JkoDRH.js} +1 -1
  38. package/dist-renderer/assets/{infoDiagram-HS3SLOUP-D_WubR0B.js → infoDiagram-HS3SLOUP-D-hWRQGY.js} +1 -1
  39. package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-w9ca-1TI.js → journeyDiagram-XKPGCS4Q-Bb6W8rUG.js} +1 -1
  40. package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-Jg9p6_pN.js → kanban-definition-3W4ZIXB7-CnHdUX0q.js} +1 -1
  41. package/dist-renderer/assets/{layout-B-z3y17c.js → layout-pqss_zkI.js} +1 -1
  42. package/dist-renderer/assets/{linear-D-RTX5UW.js → linear-B1mFITNh.js} +1 -1
  43. package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-CDQmHOYP.js → mindmap-definition-VGOIOE7T-DTD9q7-D.js} +1 -1
  44. package/dist-renderer/assets/{pieDiagram-ADFJNKIX-D_odsQL7.js → pieDiagram-ADFJNKIX-Df3mhrn7.js} +1 -1
  45. package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-BRsmYWSA.js → quadrantDiagram-AYHSOK5B-B1FZ09vH.js} +1 -1
  46. package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-ChNE_BOV.js → requirementDiagram-UZGBJVZJ-aEO78thZ.js} +1 -1
  47. package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-C8FtpwKc.js → sankeyDiagram-TZEHDZUN-6Ui--jp-.js} +1 -1
  48. package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-DmLCzNcc.js → sequenceDiagram-WL72ISMW-DF4Q1cAM.js} +1 -1
  49. package/dist-renderer/assets/splashScene-D0YB9uxm.js +17 -0
  50. package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-WJBm4bhu.js → stateDiagram-FKZM4ZOC-BqA2BI8C.js} +1 -1
  51. package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-Cs2ZtUD2.js +1 -0
  52. package/dist-renderer/assets/{timeline-definition-IT6M3QCI-BXs_hOJs.js → timeline-definition-IT6M3QCI-DoOkw_A8.js} +1 -1
  53. package/dist-renderer/assets/{treemap-GDKQZRPO-o04MA0G9.js → treemap-GDKQZRPO-DUe26QdD.js} +1 -1
  54. package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-Czj69XRd.js → xychartDiagram-PRI3JC2R-BKCnj5Xn.js} +1 -1
  55. package/dist-renderer/index.html +20 -53
  56. package/package.json +25 -18
  57. package/src/main/ipc/extensions.ts +2 -1
  58. package/src/main/server.ts +873 -221
  59. package/src/main/services/extensions/ExtensionFacadeService.ts +2 -5
  60. package/src/main/services/extensions/catalog/PluginCatalogService.ts +4 -2
  61. package/src/main/services/session-intelligence/ConversationTelemetryService.ts +1101 -0
  62. package/src/main/services/session-intelligence/LocalSessionScanner.ts +512 -0
  63. package/src/main/services/session-intelligence/SessionUsageParser.ts +4 -4
  64. package/src/main/services/system-manager/SystemManagerConfigService.ts +122 -0
  65. package/src/main/services/system-manager/SystemManagerPtyService.ts +233 -0
  66. package/src/main/services/system-manager/WorkflowPromptService.ts +75 -0
  67. package/src/main/services/teams-mvp/TaskDispatchService.ts +5 -6
  68. package/src/main/services/teams-mvp/TeamProvisioningService.ts +39 -2
  69. package/src/main/services/teams-mvp/TeamWorkspaceService.ts +22 -4
  70. package/src/main/utils/teamProjectResolution.ts +15 -0
  71. package/src/renderer/App.tsx +8 -4
  72. package/src/renderer/api/httpClient.ts +68 -18
  73. package/src/renderer/api/providers.ts +23 -2
  74. package/src/renderer/assets/participant-avatars/01.svg +3 -0
  75. package/src/renderer/assets/participant-avatars/02.svg +3 -0
  76. package/src/renderer/assets/participant-avatars/03.svg +3 -0
  77. package/src/renderer/assets/participant-avatars/04.svg +3 -0
  78. package/src/renderer/assets/participant-avatars/05.svg +3 -0
  79. package/src/renderer/assets/participant-avatars/06.svg +3 -0
  80. package/src/renderer/assets/participant-avatars/07.svg +3 -0
  81. package/src/renderer/assets/participant-avatars/08.svg +3 -0
  82. package/src/renderer/assets/participant-avatars/09.svg +3 -0
  83. package/src/renderer/assets/participant-avatars/10.svg +3 -0
  84. package/src/renderer/assets/participant-avatars/11.svg +3 -0
  85. package/src/renderer/assets/participant-avatars/12.svg +3 -0
  86. package/src/renderer/assets/participant-avatars/13.svg +3 -0
  87. package/src/renderer/components/chat/ChatHistoryItem.tsx +1 -1
  88. package/src/renderer/components/chat/items/SubagentItem.tsx +2 -2
  89. package/src/renderer/components/chat/viewers/MermaidDiagram.tsx +2 -2
  90. package/src/renderer/components/common/ErrorBoundary.tsx +1 -1
  91. package/src/renderer/components/common/TerminalPane.tsx +213 -0
  92. package/src/renderer/components/dashboard/CliStatusBanner.tsx +7 -7
  93. package/src/renderer/components/dashboard/DashboardView.tsx +9 -36
  94. package/src/renderer/components/extensions/ExtensionStoreView.tsx +7 -126
  95. package/src/renderer/components/extensions/ExtensionsSubTabTrigger.tsx +1 -1
  96. package/src/renderer/components/extensions/common/ExtensionToast.tsx +3 -3
  97. package/src/renderer/components/extensions/common/SourceBadge.tsx +1 -1
  98. package/src/renderer/components/extensions/mcp/McpLibraryEnableDialog.tsx +305 -0
  99. package/src/renderer/components/extensions/mcp/McpLibraryEntryDialog.tsx +418 -0
  100. package/src/renderer/components/extensions/mcp/McpLibraryPanel.tsx +404 -0
  101. package/src/renderer/components/extensions/plugins/CategoryChips.tsx +1 -1
  102. package/src/renderer/components/extensions/plugins/PluginCard.tsx +6 -6
  103. package/src/renderer/components/extensions/plugins/PluginDetailDialog.tsx +2 -2
  104. package/src/renderer/components/extensions/plugins/PluginsPanel.tsx +34 -21
  105. package/src/renderer/components/extensions/skills/SkillEditorDialog.tsx +1 -1
  106. package/src/renderer/components/extensions/skills/SkillsLibraryPanel.tsx +335 -0
  107. package/src/renderer/components/layout/PaneContent.tsx +8 -1
  108. package/src/renderer/components/layout/PaneResizeHandle.tsx +2 -2
  109. package/src/renderer/components/layout/Sidebar.tsx +13 -56
  110. package/src/renderer/components/layout/SortableTab.tsx +22 -33
  111. package/src/renderer/components/layout/TabBar.tsx +1 -1
  112. package/src/renderer/components/layout/TabContextMenu.tsx +1 -1
  113. package/src/renderer/components/report/sections/CostSection.tsx +2 -2
  114. package/src/renderer/components/report/sections/InsightsSection.tsx +1 -1
  115. package/src/renderer/components/runtime/ProviderRuntimeBackendSelector.tsx +2 -2
  116. package/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx +768 -157
  117. package/src/renderer/components/schedules/SchedulesView.tsx +51 -462
  118. package/src/renderer/components/schedules/calendar/CalendarDayView.tsx +173 -0
  119. package/src/renderer/components/schedules/calendar/CalendarEventBlock.tsx +113 -0
  120. package/src/renderer/components/schedules/calendar/CalendarHeader.tsx +148 -0
  121. package/src/renderer/components/schedules/calendar/CalendarMonthView.tsx +142 -0
  122. package/src/renderer/components/schedules/calendar/CalendarWeekView.tsx +219 -0
  123. package/src/renderer/components/schedules/calendar/ScheduleCalendarBoard.tsx +41 -0
  124. package/src/renderer/components/schedules/calendar/TeamGanttView.tsx +405 -0
  125. package/src/renderer/components/schedules/calendar/computeOccurrences.ts +234 -0
  126. package/src/renderer/components/schedules/calendar/index.ts +2 -0
  127. package/src/renderer/components/schedules/calendar/types.ts +44 -0
  128. package/src/renderer/components/search/CommandPalette.tsx +4 -4
  129. package/src/renderer/components/settings/SettingsTabs.tsx +50 -55
  130. package/src/renderer/components/settings/SettingsView.tsx +30 -35
  131. package/src/renderer/components/settings/components/SettingsSectionHeader.tsx +5 -1
  132. package/src/renderer/components/settings/components/SettingsSelect.tsx +5 -3
  133. package/src/renderer/components/settings/components/SettingsToggle.tsx +2 -2
  134. package/src/renderer/components/settings/sections/AdvancedSection.tsx +11 -42
  135. package/src/renderer/components/settings/sections/CliStatusSection.tsx +72 -113
  136. package/src/renderer/components/settings/sections/ConfigEditorDialog.tsx +1 -1
  137. package/src/renderer/components/settings/sections/GeneralSection.tsx +11 -3
  138. package/src/renderer/components/settings/sections/HarnessSection.tsx +18 -14
  139. package/src/renderer/components/settings/sections/PlatformsSection.tsx +3 -3
  140. package/src/renderer/components/settings/sections/TaskBusSection.tsx +33 -40
  141. package/src/renderer/components/settings/sections/index.ts +0 -1
  142. package/src/renderer/components/sidebar/SessionFiltersPopover.tsx +1 -1
  143. package/src/renderer/components/sidebar/SessionItem.tsx +3 -3
  144. package/src/renderer/components/sidebar/SidebarSessions.tsx +184 -6
  145. package/src/renderer/components/sidebar/SidebarTaskItem.tsx +4 -4
  146. package/src/renderer/components/sidebar/WorkspaceBrowser.tsx +40 -5
  147. package/src/renderer/components/splash/splashScene.ts +121 -929
  148. package/src/renderer/components/system-manager/FolderBrowser.tsx +163 -0
  149. package/src/renderer/components/system-manager/SystemManagerView.tsx +351 -0
  150. package/src/renderer/components/tasks/TasksView.tsx +112 -134
  151. package/src/renderer/components/team/CcSessionsSection.tsx +431 -89
  152. package/src/renderer/components/team/ClaudeLogsFilterPopover.tsx +1 -1
  153. package/src/renderer/components/team/ClaudeLogsPanel.tsx +1 -1
  154. package/src/renderer/components/team/CollapsibleTeamSection.tsx +17 -32
  155. package/src/renderer/components/team/ProcessesSection.tsx +2 -2
  156. package/src/renderer/components/team/TaskTooltip.tsx +2 -2
  157. package/src/renderer/components/team/TeamDetailView.tsx +319 -123
  158. package/src/renderer/components/team/TeamListFilterPopover.tsx +1 -1
  159. package/src/renderer/components/team/TeamListView.tsx +109 -124
  160. package/src/renderer/components/team/TeamSessionsSection.tsx +6 -6
  161. package/src/renderer/components/team/UnreadCommentsBadge.tsx +1 -1
  162. package/src/renderer/components/team/activity/ActivityItem.tsx +9 -9
  163. package/src/renderer/components/team/activity/ActivityTimeline.tsx +5 -5
  164. package/src/renderer/components/team/activity/LeadThoughtsGroup.tsx +3 -3
  165. package/src/renderer/components/team/activity/ReplyQuoteBlock.tsx +4 -4
  166. package/src/renderer/components/team/dialogs/CreateTaskDialog.tsx +4 -4
  167. package/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +84 -306
  168. package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +259 -342
  169. package/src/renderer/components/team/dialogs/GlobalTaskDetailDialog.tsx +1 -1
  170. package/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx +18 -16
  171. package/src/renderer/components/team/dialogs/PlatformBindingDialog.tsx +221 -0
  172. package/src/renderer/components/team/dialogs/PlatformManualForm.tsx +8 -1
  173. package/src/renderer/components/team/dialogs/PlatformSetupQR.tsx +5 -5
  174. package/src/renderer/components/team/dialogs/RuntimeConfigDialog.tsx +361 -0
  175. package/src/renderer/components/team/dialogs/SendMessageDialog.tsx +6 -6
  176. package/src/renderer/components/team/dialogs/SkipPermissionsCheckbox.tsx +6 -6
  177. package/src/renderer/components/team/dialogs/StatusHistoryTimeline.tsx +1 -1
  178. package/src/renderer/components/team/dialogs/TaskAttachments.tsx +1 -1
  179. package/src/renderer/components/team/dialogs/TaskCommentInput.tsx +6 -6
  180. package/src/renderer/components/team/dialogs/TaskCommentsSection.tsx +4 -4
  181. package/src/renderer/components/team/dialogs/TaskDetailDialog.tsx +3 -3
  182. package/src/renderer/components/team/dialogs/platformMeta.ts +122 -11
  183. package/src/renderer/components/team/dialogs/useTeamEditForm.ts +17 -5
  184. package/src/renderer/components/team/editor/EditorFileTree.tsx +4 -4
  185. package/src/renderer/components/team/editor/EditorSearchPanel.tsx +1 -1
  186. package/src/renderer/components/team/editor/MarkdownSplitView.tsx +1 -1
  187. package/src/renderer/components/team/editor/NewFileDialog.tsx +1 -1
  188. package/src/renderer/components/team/editor/ProjectEditorOverlay.tsx +1 -1
  189. package/src/renderer/components/team/editor/SearchInFilesPanel.tsx +1 -1
  190. package/src/renderer/components/team/kanban/KanbanBoard.tsx +9 -9
  191. package/src/renderer/components/team/kanban/KanbanFilterPopover.tsx +4 -4
  192. package/src/renderer/components/team/kanban/KanbanSearchInput.tsx +1 -1
  193. package/src/renderer/components/team/kanban/KanbanSortPopover.tsx +5 -5
  194. package/src/renderer/components/team/kanban/KanbanTaskCard.tsx +4 -4
  195. package/src/renderer/components/team/members/MemberCard.tsx +14 -47
  196. package/src/renderer/components/team/members/MemberDetailDialog.tsx +3 -95
  197. package/src/renderer/components/team/members/MemberDetailStats.tsx +50 -65
  198. package/src/renderer/components/team/members/MemberDraftRow.tsx +1 -1
  199. package/src/renderer/components/team/members/MemberStatsTab.tsx +2 -2
  200. package/src/renderer/components/team/members/MemberWorkspaceTab.tsx +1 -1
  201. package/src/renderer/components/team/messages/MessageComposer.tsx +10 -112
  202. package/src/renderer/components/team/messages/MessagesFilterPopover.tsx +1 -1
  203. package/src/renderer/components/team/messages/MessagesPanel.tsx +136 -119
  204. package/src/renderer/components/team/review/ChangeReviewDialog.tsx +1 -1
  205. package/src/renderer/components/team/schedule/ScheduleStatusBadge.tsx +3 -3
  206. package/src/renderer/components/team/sidebar/TeamSidebarRail.tsx +4 -4
  207. package/src/renderer/components/team/tasks/TaskRow.tsx +1 -1
  208. package/src/renderer/components/team/tools/AddMcpInline.tsx +27 -17
  209. package/src/renderer/components/team/tools/McpChip.tsx +6 -3
  210. package/src/renderer/components/team/tools/SkillChip.tsx +3 -3
  211. package/src/renderer/components/team/tools/ToolsSection.tsx +418 -70
  212. package/src/renderer/components/ui/MemberSelect.tsx +2 -2
  213. package/src/renderer/components/ui/MentionSuggestionList.tsx +2 -2
  214. package/src/renderer/components/ui/MentionableTextarea.tsx +3 -3
  215. package/src/renderer/hooks/useExtensionsTabState.ts +3 -114
  216. package/src/renderer/index.css +56 -39
  217. package/src/renderer/index.html +17 -50
  218. package/src/renderer/store/index.ts +2 -1
  219. package/src/renderer/store/slices/scheduleSlice.ts +1 -1
  220. package/src/renderer/store/slices/teamSlice.ts +45 -168
  221. package/src/renderer/utils/claudeCodeOnlyProviders.ts +3 -10
  222. package/src/renderer/utils/memberHelpers.ts +5 -17
  223. package/src/renderer/utils/openCodeRuntimeDeliveryDiagnostics.ts +4 -2
  224. package/src/renderer/utils/providerSlashCommands.ts +0 -5
  225. package/src/renderer/utils/scheduleFormatters.ts +3 -1
  226. package/src/renderer/utils/teamMessageFiltering.ts +14 -1
  227. package/src/renderer/utils/teamModelAvailability.ts +18 -2
  228. package/src/shared/types/api.ts +121 -2
  229. package/src/shared/types/ccConnect.ts +2 -0
  230. package/src/shared/types/index.ts +3 -0
  231. package/src/shared/types/systemManager.ts +49 -0
  232. package/src/shared/types/team.ts +29 -0
  233. package/src/shared/types/terminal.ts +4 -2
  234. package/src/shared/utils/extensionNormalizers.ts +15 -8
  235. package/src/shared/utils/providerExtensionCapabilities.ts +2 -2
  236. package/dist-renderer/assets/ProjectEditorOverlay-lJZi-9Hp.js +0 -52
  237. package/dist-renderer/assets/channel-yIlSKy0e.js +0 -1
  238. package/dist-renderer/assets/classDiagram-2ON5EDUG-24fHez0s.js +0 -1
  239. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-24fHez0s.js +0 -1
  240. package/dist-renderer/assets/clone-BTNuUva-.js +0 -1
  241. package/dist-renderer/assets/index-Bi6nrZ4z.css +0 -1
  242. package/dist-renderer/assets/splashScene-C8lWNnm4.js +0 -1
  243. package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-_m6iPPUR.js +0 -1
@@ -1,12 +1,12 @@
1
1
  import { useCallback, useEffect, useMemo, useState } from 'react';
2
2
 
3
- import { Button } from '@renderer/components/ui/button';
4
3
  import { cn } from '@renderer/lib/utils';
5
4
  import { useStore } from '@renderer/store';
6
5
  import { deriveTaskDisplayId } from '@shared/utils/taskIdentity';
7
- import { Calendar, CheckCircle2, Circle, Columns3, Loader2, RefreshCw } from 'lucide-react';
6
+ import { CheckCircle2, ClipboardList, PlayCircle, Calendar, Columns3, RefreshCw } from 'lucide-react';
8
7
  import { useShallow } from 'zustand/react/shallow';
9
8
 
9
+ import { KanbanColumn } from '../team/kanban/KanbanColumn';
10
10
  import { SchedulesView } from '../schedules/SchedulesView';
11
11
 
12
12
  import type { GlobalTask, TeamTaskStatus } from '@shared/types';
@@ -15,37 +15,37 @@ type TasksSubTab = 'overview' | 'schedules';
15
15
  type OverviewStatus = Extract<TeamTaskStatus, 'pending' | 'in_progress' | 'completed'>;
16
16
 
17
17
  const SUB_TABS: { id: TasksSubTab; label: string; icon: React.ReactNode }[] = [
18
- { id: 'overview', label: '任务总览', icon: <Columns3 size={14} /> },
19
- { id: 'schedules', label: '定时任务', icon: <Calendar size={14} /> },
18
+ { id: 'overview', label: '任务总览', icon: <Columns3 size={13} /> },
19
+ { id: 'schedules', label: '定时任务', icon: <Calendar size={13} /> },
20
20
  ];
21
21
 
22
22
  const COLUMNS: {
23
23
  id: OverviewStatus;
24
24
  title: string;
25
- icon: React.ReactNode;
26
25
  headerBg: string;
27
26
  bodyBg: string;
27
+ icon: React.ReactNode;
28
28
  }[] = [
29
29
  {
30
30
  id: 'pending',
31
31
  title: 'TODO',
32
- icon: <Circle size={14} className="shrink-0 text-[var(--color-text-muted)]" />,
33
- headerBg: 'rgba(59, 130, 246, 0.22)',
34
- bodyBg: 'rgba(59, 130, 246, 0.05)',
32
+ headerBg: 'rgba(148, 163, 184, 0.08)',
33
+ bodyBg: 'rgba(148, 163, 184, 0.02)',
34
+ icon: <ClipboardList size={13} className="shrink-0 text-[var(--color-text-muted)]" />,
35
35
  },
36
36
  {
37
37
  id: 'in_progress',
38
38
  title: 'IN PROGRESS',
39
- icon: <Loader2 size={14} className="shrink-0 text-[var(--color-text-muted)]" />,
40
- headerBg: 'rgba(234, 179, 8, 0.24)',
41
- bodyBg: 'rgba(234, 179, 8, 0.06)',
39
+ headerBg: 'rgba(6, 182, 212, 0.08)',
40
+ bodyBg: 'rgba(6, 182, 212, 0.02)',
41
+ icon: <PlayCircle size={13} className="shrink-0 text-cyan-400/60" />,
42
42
  },
43
43
  {
44
44
  id: 'completed',
45
45
  title: 'DONE',
46
- icon: <CheckCircle2 size={14} className="shrink-0 text-[var(--color-text-muted)]" />,
47
- headerBg: 'rgba(34, 197, 94, 0.22)',
48
- bodyBg: 'rgba(34, 197, 94, 0.05)',
46
+ headerBg: 'rgba(34, 197, 94, 0.08)',
47
+ bodyBg: 'rgba(34, 197, 94, 0.02)',
48
+ icon: <CheckCircle2 size={13} className="shrink-0 text-green-400/60" />,
49
49
  },
50
50
  ];
51
51
 
@@ -69,15 +69,16 @@ export const TasksView = (): React.JSX.Element => {
69
69
 
70
70
  return (
71
71
  <div className="flex h-full flex-col">
72
- <div className="flex items-center border-b border-[var(--color-border)] px-4 pt-2">
72
+ {/* Minimal tab bar */}
73
+ <div className="flex items-center gap-0 px-4 pt-3">
73
74
  {SUB_TABS.map((tab) => (
74
75
  <button
75
76
  key={tab.id}
76
77
  onClick={() => setActiveTab(tab.id)}
77
78
  className={cn(
78
- 'flex items-center gap-1.5 border-b-2 px-4 pb-2 text-sm font-medium transition-colors',
79
+ 'flex items-center gap-1.5 border-b-2 px-3 pb-2 text-xs transition-colors',
79
80
  activeTab === tab.id
80
- ? 'border-[var(--color-primary)] text-[var(--color-text)]'
81
+ ? 'border-[var(--color-text)] font-medium text-[var(--color-text)]'
81
82
  : 'border-transparent text-[var(--color-text-muted)] hover:text-[var(--color-text)]'
82
83
  )}
83
84
  >
@@ -168,6 +169,8 @@ const TaskOverviewPool = (): React.JSX.Element => {
168
169
  setOwnerFilter('all');
169
170
  }, []);
170
171
 
172
+ const hasFilters = teamFilter !== 'all' || statusFilter !== 'all' || ownerFilter !== 'all';
173
+
171
174
  if (globalTasksLoading && !globalTasksInitialized) {
172
175
  return (
173
176
  <div className="flex h-full items-center justify-center text-sm text-[var(--color-text-muted)]">
@@ -176,127 +179,97 @@ const TaskOverviewPool = (): React.JSX.Element => {
176
179
  );
177
180
  }
178
181
 
182
+ const selectCls =
183
+ 'h-7 rounded-md border border-[var(--color-border)] bg-[var(--color-surface)] px-2 text-[11px] text-[var(--color-text-muted)] transition-colors hover:border-[var(--color-border-emphasis)] focus:text-[var(--color-text)]';
184
+
179
185
  return (
180
186
  <div className="flex h-full min-w-0 flex-col gap-3 p-4">
181
- <div className="flex flex-wrap items-end gap-2">
182
- <div className="min-w-[180px]">
183
- <label
184
- htmlFor="tasks-overview-team-filter"
185
- className="mb-1 block text-[11px] font-medium text-[var(--color-text-muted)]"
186
- >
187
- 团队
188
- </label>
189
- <select
190
- id="tasks-overview-team-filter"
191
- value={teamFilter}
192
- onChange={(event) => setTeamFilter(event.target.value)}
193
- className="h-8 w-full rounded-md border border-[var(--color-border)] bg-[var(--color-surface)] px-2 text-xs text-[var(--color-text)]"
194
- >
195
- <option value="all">全部团队</option>
196
- {teamOptions.map(([teamName, displayName]) => (
197
- <option key={teamName} value={teamName}>
198
- {displayName}
199
- </option>
200
- ))}
201
- </select>
202
- </div>
187
+ {/* Compact filter row */}
188
+ <div className="flex flex-wrap items-center gap-2">
189
+ <select
190
+ value={teamFilter}
191
+ onChange={(e) => setTeamFilter(e.target.value)}
192
+ className={selectCls}
193
+ >
194
+ <option value="all">全部团队</option>
195
+ {teamOptions.map(([teamName, displayName]) => (
196
+ <option key={teamName} value={teamName}>
197
+ {displayName}
198
+ </option>
199
+ ))}
200
+ </select>
203
201
 
204
- <div className="min-w-[160px]">
205
- <label
206
- htmlFor="tasks-overview-status-filter"
207
- className="mb-1 block text-[11px] font-medium text-[var(--color-text-muted)]"
208
- >
209
- 状态
210
- </label>
211
- <select
212
- id="tasks-overview-status-filter"
213
- value={statusFilter}
214
- onChange={(event) => setStatusFilter(event.target.value as 'all' | OverviewStatus)}
215
- className="h-8 w-full rounded-md border border-[var(--color-border)] bg-[var(--color-surface)] px-2 text-xs text-[var(--color-text)]"
216
- >
217
- <option value="all">全部状态</option>
218
- <option value="pending">TODO</option>
219
- <option value="in_progress">IN PROGRESS</option>
220
- <option value="completed">DONE</option>
221
- </select>
222
- </div>
202
+ <select
203
+ value={statusFilter}
204
+ onChange={(e) => setStatusFilter(e.target.value as 'all' | OverviewStatus)}
205
+ className={selectCls}
206
+ >
207
+ <option value="all">全部状态</option>
208
+ <option value="pending">TODO</option>
209
+ <option value="in_progress">IN PROGRESS</option>
210
+ <option value="completed">DONE</option>
211
+ </select>
223
212
 
224
- <div className="min-w-[160px]">
225
- <label
226
- htmlFor="tasks-overview-owner-filter"
227
- className="mb-1 block text-[11px] font-medium text-[var(--color-text-muted)]"
228
- >
229
- 负责人
230
- </label>
231
- <select
232
- id="tasks-overview-owner-filter"
233
- value={ownerFilter}
234
- onChange={(event) => setOwnerFilter(event.target.value)}
235
- className="h-8 w-full rounded-md border border-[var(--color-border)] bg-[var(--color-surface)] px-2 text-xs text-[var(--color-text)]"
213
+ <select
214
+ value={ownerFilter}
215
+ onChange={(e) => setOwnerFilter(e.target.value)}
216
+ className={selectCls}
217
+ >
218
+ <option value="all">全部负责人</option>
219
+ {ownerOptions.map((owner) => (
220
+ <option key={owner} value={owner}>
221
+ {owner}
222
+ </option>
223
+ ))}
224
+ </select>
225
+
226
+ {hasFilters && (
227
+ <button
228
+ type="button"
229
+ onClick={clearFilters}
230
+ className="text-[11px] text-[var(--color-text-muted)] transition-colors hover:text-[var(--color-text)]"
236
231
  >
237
- <option value="all">全部负责人</option>
238
- {ownerOptions.map((owner) => (
239
- <option key={owner} value={owner}>
240
- {owner}
241
- </option>
242
- ))}
243
- </select>
244
- </div>
232
+ 清空筛选
233
+ </button>
234
+ )}
245
235
 
246
- <Button variant="outline" size="sm" className="h-8 gap-1.5 text-xs" onClick={clearFilters}>
247
- 清空筛选
248
- </Button>
249
- <Button
250
- variant="ghost"
251
- size="sm"
252
- className="ml-auto h-8 gap-1.5 text-xs text-[var(--color-text-muted)]"
236
+ <button
237
+ type="button"
238
+ className="ml-auto text-[11px] text-[var(--color-text-muted)] transition-colors hover:text-[var(--color-text)]"
253
239
  onClick={() => void fetchAllTasks()}
254
240
  >
255
241
  <RefreshCw size={12} />
256
- 刷新
257
- </Button>
242
+ </button>
258
243
  </div>
259
244
 
245
+ {/* Kanban columns — reuse team kanban styling */}
260
246
  <div className="w-full min-w-0 max-w-full overflow-x-auto overflow-y-hidden pb-6">
261
247
  <div className="grid min-w-[900px] grid-cols-3 items-start gap-3">
262
248
  {COLUMNS.map((column) => {
263
249
  const tasks = grouped.get(column.id) ?? [];
264
250
  return (
265
- <section
251
+ <KanbanColumn
266
252
  key={column.id}
267
- className="relative rounded-md"
268
- style={{ backgroundColor: column.bodyBg }}
253
+ title={column.title}
254
+ count={tasks.length}
255
+ icon={column.icon}
256
+ headerBg={column.headerBg}
257
+ bodyBg={column.bodyBg}
269
258
  >
270
- {tasks.length > 0 ? (
271
- <span className="absolute -right-2 -top-2 z-10 min-w-5 rounded-full bg-[var(--color-surface-raised)] px-1.5 py-0 text-center text-[10px] font-medium leading-5 text-[var(--color-text-secondary)] ring-1 ring-[var(--color-border)]">
272
- {tasks.length}
273
- </span>
274
- ) : null}
275
- <header
276
- className="rounded-t-md px-3 py-2"
277
- style={{ backgroundColor: column.headerBg }}
278
- >
279
- <h4 className="flex items-center gap-2 text-xs font-semibold uppercase tracking-wide text-[var(--color-text)]">
280
- {column.icon}
281
- {column.title}
282
- </h4>
283
- </header>
284
- <div className="flex flex-col gap-1.5 p-2">
285
- {tasks.length === 0 ? (
286
- <div className="rounded-md border border-dashed border-[var(--color-border)] p-3 text-xs text-[var(--color-text-muted)]">
287
- No tasks
288
- </div>
289
- ) : (
290
- tasks.map((task) => (
291
- <GlobalOverviewTaskCard
292
- key={`${task.teamName}:${task.id}`}
293
- task={task}
294
- onOpen={() => openGlobalTaskDetail(task.teamName, task.id)}
295
- />
296
- ))
297
- )}
298
- </div>
299
- </section>
259
+ {tasks.length === 0 ? (
260
+ <div className="py-6 text-center text-[11px] text-[var(--color-text-muted)] opacity-40">
261
+ No tasks
262
+ </div>
263
+ ) : (
264
+ tasks.map((task) => (
265
+ <GlobalOverviewTaskCard
266
+ key={`${task.teamName}:${task.id}`}
267
+ task={task}
268
+ onOpen={() => openGlobalTaskDetail(task.teamName, task.id)}
269
+ />
270
+ ))
271
+ )}
272
+ </KanbanColumn>
300
273
  );
301
274
  })}
302
275
  </div>
@@ -318,25 +291,30 @@ const GlobalOverviewTaskCard = ({
318
291
  return (
319
292
  <button
320
293
  type="button"
321
- className="relative w-full rounded-md border border-[var(--color-border)] bg-[var(--color-surface-raised)] px-1.5 py-3 text-left text-xs transition-colors hover:border-[var(--color-border-emphasis)]"
294
+ className="w-full rounded-md border px-2.5 py-2 text-left transition-colors hover:border-[var(--color-border-emphasis)]"
295
+ style={{
296
+ borderColor: 'var(--color-border)',
297
+ backgroundColor: 'var(--color-surface-raised)',
298
+ }}
322
299
  onClick={onOpen}
323
300
  >
324
- <span className="absolute left-[3px] top-[2px] text-[9px] leading-none text-[var(--color-text-muted)]">
325
- #{task.displayId ?? deriveTaskDisplayId(task.id)}
326
- </span>
327
- <div className="mb-2 pt-[11px]">
328
- <h5 className="line-clamp-2 text-xs font-medium text-[var(--color-text)]">
301
+ <div className="flex items-start gap-1.5">
302
+ <span className="mt-0.5 shrink-0 text-[9px] tabular-nums text-[var(--color-text-muted)] opacity-50">
303
+ #{task.displayId ?? deriveTaskDisplayId(task.id)}
304
+ </span>
305
+ <h5 className="min-w-0 flex-1 line-clamp-2 text-[11px] font-medium" style={{ color: 'var(--color-text)' }}>
329
306
  {task.subject}
330
307
  </h5>
331
- {task.dispatchMeta ? (
332
- <span className="mt-1 inline-flex items-center rounded-full bg-yellow-500/15 px-1.5 py-0.5 text-[10px] font-medium text-yellow-600 dark:text-yellow-400">
333
- {dispatchFrom} 给 {dispatchTo} 派单
334
- </span>
335
- ) : null}
336
308
  </div>
337
- <div className="flex flex-wrap items-center gap-1.5 text-[10px] text-[var(--color-text-muted)]">
338
- <span className="rounded bg-white/5 px-1.5 py-0.5">{task.teamDisplayName}</span>
339
- <span className="rounded bg-white/5 px-1.5 py-0.5">{ownerLabel}</span>
309
+ {task.dispatchMeta ? (
310
+ <span className="mt-1 inline-flex items-center rounded-full bg-amber-500/10 px-1.5 py-0.5 text-[9px] font-medium text-amber-500">
311
+ {dispatchFrom} {dispatchTo}
312
+ </span>
313
+ ) : null}
314
+ <div className="mt-1.5 flex items-center gap-1.5 text-[10px]" style={{ color: 'var(--color-text-muted)' }}>
315
+ <span>{task.teamDisplayName}</span>
316
+ <span style={{ opacity: 0.3 }}>·</span>
317
+ <span>{ownerLabel}</span>
340
318
  </div>
341
319
  </button>
342
320
  );