@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
@@ -93,7 +93,7 @@ export const TeamListFilterPopover = ({
93
93
  >
94
94
  <Filter size={14} />
95
95
  {activeCount > 0 && (
96
- <span className="absolute -right-1 -top-1 flex size-4 items-center justify-center rounded-full bg-blue-500 text-[10px] font-medium text-white">
96
+ <span className="absolute -right-1 -top-1 flex size-4 items-center justify-center rounded-full bg-indigo-500 text-[10px] font-medium text-white">
97
97
  {activeCount}
98
98
  </span>
99
99
  )}
@@ -36,6 +36,7 @@ import { buildTaskCountsByTeam, normalizePath } from '@renderer/utils/pathNormal
36
36
  import { emitOpenHermitEvent, OPEN_HERMIT_EVENTS } from '@renderer/utils/openHermitEvents';
37
37
  import { getBaseName } from '@renderer/utils/pathUtils';
38
38
  import { nameColorSet } from '@renderer/utils/projectColor';
39
+ import { formatRelativeTime, formatTokensCompact } from '@renderer/utils/formatters';
39
40
  import {
40
41
  CheckCircle,
41
42
  Clock,
@@ -48,9 +49,12 @@ import {
48
49
  RotateCcw,
49
50
  Search,
50
51
  Trash2,
52
+ Users,
51
53
  } from 'lucide-react';
52
54
  import { useShallow } from 'zustand/react/shallow';
53
55
 
56
+ import { SYSTEM_MANAGER_TEAM_NAME } from '@shared/types/team';
57
+
54
58
  import { CreateTeamDialog } from './dialogs/CreateTeamDialog';
55
59
  import { LaunchTeamDialog } from './dialogs/LaunchTeamDialog';
56
60
  import { TeamEmptyState } from './TeamEmptyState';
@@ -61,8 +65,6 @@ import {
61
65
  teamMatchesProjectSelection,
62
66
  } from './teamProjectSelection';
63
67
 
64
- import type { ActiveTeamRef, TeamCopyData } from './dialogs/CreateTeamDialog';
65
- import type { TeamListFilterState } from './TeamListFilterPopover';
66
68
  import type {
67
69
  ResolvedTeamMember,
68
70
  TeamCreateRequest,
@@ -73,6 +75,8 @@ import type {
73
75
  TeamTemplateSource,
74
76
  TeamTemplateSummary,
75
77
  } from '@shared/types';
78
+ import type { ActiveTeamRef, TeamCopyData } from './dialogs/CreateTeamDialog';
79
+ import type { TeamListFilterState } from './TeamListFilterPopover';
76
80
 
77
81
  function generateUniqueName(sourceName: string, existingNames: string[]): string {
78
82
  const base = sourceName.replace(/-\d+$/, '');
@@ -226,6 +230,17 @@ function resolveTeamStatus(
226
230
  return null;
227
231
  }
228
232
 
233
+ function formatDurationShort(ms: number): string {
234
+ if (ms < 60_000) return `${Math.round(ms / 1000)}s`;
235
+ const minutes = Math.floor(ms / 60_000);
236
+ if (minutes < 60) return `${minutes}m`;
237
+ const hours = Math.floor(minutes / 60);
238
+ const remainMin = minutes % 60;
239
+ if (hours < 24) return `${hours}h ${remainMin}m`;
240
+ const days = Math.floor(hours / 24);
241
+ return `${days}d ${hours % 24}h`;
242
+ }
243
+
229
244
  const StatusBadge = ({ status }: { status: TeamStatus | null }): React.JSX.Element | null => {
230
245
  if (!status) return null;
231
246
  switch (status) {
@@ -279,6 +294,7 @@ export const TeamListView = (): React.JSX.Element => {
279
294
  teamsError,
280
295
  fetchTeams,
281
296
  openTeamTab,
297
+ openSystemManager,
282
298
  deleteTeam,
283
299
  restoreTeam,
284
300
  permanentlyDeleteTeam,
@@ -298,6 +314,7 @@ export const TeamListView = (): React.JSX.Element => {
298
314
  teamsError: s.teamsError,
299
315
  fetchTeams: s.fetchTeams,
300
316
  openTeamTab: s.openTeamTab,
317
+ openSystemManager: s.openSystemManager,
301
318
  deleteTeam: s.deleteTeam,
302
319
  restoreTeam: s.restoreTeam,
303
320
  permanentlyDeleteTeam: s.permanentlyDeleteTeam,
@@ -442,6 +459,11 @@ export const TeamListView = (): React.JSX.Element => {
442
459
  : null;
443
460
 
444
461
  result = [...result].sort((a, b) => {
462
+ // 0. Project-level system manager is a namespace node, not a regular worker team.
463
+ const managerA = a.teamName === SYSTEM_MANAGER_TEAM_NAME ? 0 : 1;
464
+ const managerB = b.teamName === SYSTEM_MANAGER_TEAM_NAME ? 0 : 1;
465
+ if (managerA !== managerB) return managerA - managerB;
466
+
445
467
  // 1. Alive (running) teams first
446
468
  const aliveA = aliveSet.has(a.teamName) ? 0 : 1;
447
469
  const aliveB = aliveSet.has(b.teamName) ? 0 : 1;
@@ -528,8 +550,8 @@ export const TeamListView = (): React.JSX.Element => {
528
550
  }
529
551
  const confirmed = await confirm({
530
552
  title: '删除数字员工',
531
- message: `确定删除数字员工”${teamDisplayName}”吗?此操作会同步删除 cc-connect 项目并移除本地数据。`,
532
- confirmLabel: '删除并重启',
553
+ message: `确定删除数字员工”${teamDisplayName}”吗?此操作会移除本地配置数据。`,
554
+ confirmLabel: '删除',
533
555
  cancelLabel: '取消',
534
556
  variant: 'danger',
535
557
  });
@@ -952,7 +974,7 @@ export const TeamListView = (): React.JSX.Element => {
952
974
  {template.members.map((member) => (
953
975
  <span
954
976
  key={member.name}
955
- className="rounded bg-blue-500/10 px-1.5 py-0.5 text-[10px] text-blue-300"
977
+ className="rounded bg-indigo-500/10 px-1.5 py-0.5 text-[10px] text-indigo-300"
956
978
  >
957
979
  {member.name}
958
980
  {member.role ? ` · ${formatTeamRoleLabel(member.role)}` : ''}
@@ -988,8 +1010,13 @@ export const TeamListView = (): React.JSX.Element => {
988
1010
  <div className="flex items-center justify-between">
989
1011
  <h2 className="text-base font-semibold text-[var(--color-text)]">选择数字员工</h2>
990
1012
  <div className="flex items-center gap-2">
991
- <Button variant="outline" size="sm" disabled={!canCreate} onClick={openTemplateDialog}>
992
- 从模板创建
1013
+ <Button
1014
+ variant="outline"
1015
+ size="sm"
1016
+ className="border-cyan-500/30 text-cyan-300 hover:bg-cyan-500/10"
1017
+ onClick={() => void openSystemManager()}
1018
+ >
1019
+ 控制台
993
1020
  </Button>
994
1021
  <Button
995
1022
  variant="outline"
@@ -1100,13 +1127,13 @@ export const TeamListView = (): React.JSX.Element => {
1100
1127
  ? teamMatchesProjectSelection(team, currentProjectPath)
1101
1128
  : false;
1102
1129
  const isDeleting = deletingTeamName === team.teamName;
1130
+ const isSystemManager = team.teamName === SYSTEM_MANAGER_TEAM_NAME;
1103
1131
  return (
1104
1132
  <div
1105
1133
  key={team.teamName}
1106
1134
  role="button"
1107
1135
  tabIndex={0}
1108
- className="group relative flex cursor-pointer flex-col overflow-hidden rounded-lg border border-l-[3px] border-[var(--color-border)] bg-[var(--color-surface)] p-4 hover:bg-[var(--color-surface-raised)]"
1109
- style={teamColorSet ? { borderLeftColor: teamColorSet.border } : undefined}
1136
+ className="group relative flex cursor-pointer flex-col overflow-hidden rounded-lg border border-[var(--color-border)] bg-[var(--color-surface)] p-4 transition-colors hover:border-[var(--color-border-emphasis)] hover:bg-[var(--color-surface-raised)]"
1110
1137
  onClick={
1111
1138
  isDeleting ? undefined : () => openTeamTab(team.teamName, team.projectPath)
1112
1139
  }
@@ -1124,149 +1151,107 @@ export const TeamListView = (): React.JSX.Element => {
1124
1151
  </div>
1125
1152
  )}
1126
1153
  <div className="flex flex-1 flex-col">
1127
- <div className="flex items-start justify-between gap-2">
1128
- <div className="flex min-w-0 flex-1 items-center gap-2.5">
1129
- <img
1130
- src={agentAvatarUrl(team.teamName)}
1131
- alt={team.displayName}
1132
- className="size-9 shrink-0 rounded-lg border bg-[var(--color-surface-raised)] object-cover"
1133
- style={teamColorSet ? { borderColor: teamColorSet.border } : undefined}
1134
- draggable={false}
1135
- />
1136
- <div className="flex min-w-0 flex-1 flex-col gap-0.5">
1137
- <div className="flex min-w-0 items-center gap-1.5">
1138
- <h3 className="min-w-0 flex-1 truncate text-sm font-semibold text-[var(--color-text)]">
1139
- {team.displayName}
1140
- </h3>
1141
- <StatusBadge status={status} />
1142
- {team.pendingDelete || team.restartRequired ? (
1143
- <PendingDeleteBadge />
1144
- ) : null}
1145
- </div>
1146
- <span className="truncate font-mono text-[10px] text-[var(--color-text-muted)]">
1147
- 工号 {team.teamName}
1154
+ {/* Row 1: Avatar + Name + Status + Actions */}
1155
+ <div className="flex items-center gap-2.5">
1156
+ <img
1157
+ src={agentAvatarUrl(team.teamName)}
1158
+ alt={team.displayName}
1159
+ className="size-8 shrink-0 rounded-md border border-transparent"
1160
+ style={teamColorSet ? { borderColor: teamColorSet.border + '60' } : undefined}
1161
+ draggable={false}
1162
+ />
1163
+ <div className="flex min-w-0 flex-1 items-center gap-2">
1164
+ <h3 className="min-w-0 truncate text-[13px] font-medium text-[var(--color-text)]">
1165
+ {team.displayName}
1166
+ </h3>
1167
+ {isSystemManager ? (
1168
+ <span className="shrink-0 rounded bg-cyan-500/15 px-1.5 py-px text-[9px] font-medium text-cyan-400">
1169
+ SYS
1148
1170
  </span>
1149
- </div>
1171
+ ) : null}
1172
+ <StatusBadge status={status} />
1173
+ {team.pendingDelete || team.restartRequired ? (
1174
+ <PendingDeleteBadge />
1175
+ ) : null}
1150
1176
  {team.projectPath &&
1151
1177
  (() => {
1152
1178
  const branch = branchByPath[normalizePath(team.projectPath)];
1153
1179
  if (!branch) return null;
1154
1180
  return (
1155
1181
  <span
1156
- className="flex shrink-0 items-center gap-1 rounded bg-[var(--color-surface-raised)] px-1.5 py-0.5 text-[10px] text-[var(--color-text-muted)]"
1182
+ className="flex shrink-0 items-center gap-1 text-[10px] text-[var(--color-text-muted)] opacity-60"
1157
1183
  title={branch}
1158
1184
  >
1159
- <GitBranch size={10} />
1160
- <span className="max-w-24 truncate">{branch}</span>
1185
+ <GitBranch size={9} />
1186
+ <span className="max-w-20 truncate">{branch}</span>
1161
1187
  </span>
1162
1188
  );
1163
1189
  })()}
1164
1190
  </div>
1165
- <div className="flex shrink-0 gap-1">
1166
- {!team.pendingCreate && (
1191
+ <div className="flex shrink-0 gap-0.5">
1192
+ {!team.pendingCreate && !isSystemManager && (
1167
1193
  <Tooltip>
1168
1194
  <TooltipTrigger asChild>
1169
1195
  <button
1170
1196
  type="button"
1171
- className="shrink-0 rounded p-1 text-[var(--color-text-muted)] opacity-0 transition-opacity hover:bg-blue-500/10 hover:text-blue-300 group-hover:opacity-100"
1197
+ className="rounded p-1 text-[var(--color-text-muted)] opacity-0 transition-opacity hover:bg-[var(--color-surface-raised)] group-hover:opacity-60 hover:!opacity-100"
1172
1198
  onClick={(e) => handleCopyTeam(team.teamName, e)}
1173
1199
  >
1174
- <Copy size={14} />
1200
+ <Copy size={13} />
1175
1201
  </button>
1176
1202
  </TooltipTrigger>
1177
1203
  <TooltipContent side="bottom">复制数字员工</TooltipContent>
1178
1204
  </Tooltip>
1179
1205
  )}
1180
- {team.teamName !== 'default' && team.teamName !== 'my-project' && (
1181
- <Tooltip>
1182
- <TooltipTrigger asChild>
1183
- <button
1184
- type="button"
1185
- className="shrink-0 rounded p-1 text-[var(--color-text-muted)] opacity-0 transition-opacity hover:bg-red-500/10 hover:text-red-300 group-hover:opacity-100"
1186
- onClick={(e) =>
1187
- handleDeleteTeam(team.teamName, !!team.pendingCreate, e)
1188
- }
1189
- >
1190
- <Trash2 size={14} />
1191
- </button>
1192
- </TooltipTrigger>
1193
- <TooltipContent side="bottom">删除数字员工</TooltipContent>
1194
- </Tooltip>
1195
- )}
1206
+ {team.teamName !== 'default' &&
1207
+ team.teamName !== 'my-project' &&
1208
+ !isSystemManager && (
1209
+ <Tooltip>
1210
+ <TooltipTrigger asChild>
1211
+ <button
1212
+ type="button"
1213
+ className="rounded p-1 text-[var(--color-text-muted)] opacity-0 transition-opacity hover:bg-red-500/10 hover:text-red-400 group-hover:opacity-60 hover:!opacity-100"
1214
+ onClick={(e) =>
1215
+ handleDeleteTeam(team.teamName, !!team.pendingCreate, e)
1216
+ }
1217
+ >
1218
+ <Trash2 size={13} />
1219
+ </button>
1220
+ </TooltipTrigger>
1221
+ <TooltipContent side="bottom">删除数字员工</TooltipContent>
1222
+ </Tooltip>
1223
+ )}
1196
1224
  </div>
1197
1225
  </div>
1198
- <div className="mt-2 flex min-h-10 items-start gap-2">
1199
- <p className="line-clamp-2 min-w-0 flex-1 text-xs text-[var(--color-text-muted)]">
1200
- {team.description || '暂无描述'}
1201
- </p>
1202
- </div>
1203
- <div className="mt-3 flex flex-wrap items-center gap-1.5">
1204
- {team.members && team.members.length > 0 ? (
1205
- renderMemberChips(team.members, isLight)
1206
- ) : team.memberCount === 0 ? (
1207
- <Badge variant="secondary" className="text-[10px] font-normal">
1208
- 单人
1209
- </Badge>
1226
+
1227
+ {/* Row 2: Description */}
1228
+ <p className="mt-1.5 line-clamp-1 min-w-0 pl-[42px] text-[11px] leading-snug text-[var(--color-text-muted)]">
1229
+ {team.description || '暂无描述'}
1230
+ </p>
1231
+
1232
+ {/* Row 3: Stats bar */}
1233
+ <div className="mt-2 flex items-center gap-1.5 pl-[42px] text-[10px] tabular-nums">
1234
+ {team.stats && team.stats.sessions > 0 ? (
1235
+ <>
1236
+ <span className="text-indigo-400">{team.stats.sessions} sessions</span>
1237
+ <span className="text-[var(--color-text-muted)] opacity-30">·</span>
1238
+ <span className="text-emerald-400">{formatTokensCompact(team.stats.tokens)}</span>
1239
+ {team.stats.durationMs > 0 && (
1240
+ <>
1241
+ <span className="text-[var(--color-text-muted)] opacity-30">·</span>
1242
+ <span className="text-amber-400">{formatDurationShort(team.stats.durationMs)}</span>
1243
+ </>
1244
+ )}
1245
+ </>
1210
1246
  ) : (
1211
- <Badge variant="secondary" className="text-[10px] font-normal">
1212
- 成员:{team.memberCount}
1213
- </Badge>
1247
+ <span className="text-[var(--color-text-muted)] opacity-50">no activity</span>
1248
+ )}
1249
+ {team.lastActivity && (
1250
+ <>
1251
+ <span className="text-[var(--color-text-muted)] opacity-30">·</span>
1252
+ <span className="text-[var(--color-text-muted)]">{formatRelativeTime(team.lastActivity)}</span>
1253
+ </>
1214
1254
  )}
1215
- </div>
1216
- <div className="mt-auto">
1217
- {(() => {
1218
- const tc = taskCountsByTeam.get(team.teamName);
1219
- const pending = tc?.pending ?? 0;
1220
- const inProgress = tc?.inProgress ?? 0;
1221
- const completed = tc?.completed ?? 0;
1222
- const totalTasks = pending + inProgress + completed;
1223
- const completedRatio = totalTasks > 0 ? completed / totalTasks : 0;
1224
- return (
1225
- <div className="mt-2 w-full space-y-1.5">
1226
- <div className="flex items-center gap-2">
1227
- <div
1228
- className="h-1.5 flex-1 overflow-hidden rounded-full bg-[var(--color-surface-raised)]"
1229
- role="progressbar"
1230
- aria-valuenow={completed}
1231
- aria-valuemin={0}
1232
- aria-valuemax={totalTasks}
1233
- aria-label={`任务 ${completed}/${totalTasks} 已完成`}
1234
- >
1235
- <div
1236
- className="h-full rounded-full bg-emerald-500 transition-all duration-200"
1237
- style={{ width: `${Math.round(completedRatio * 100)}%` }}
1238
- />
1239
- </div>
1240
- <span className="shrink-0 text-[10px] font-medium tracking-tight text-[var(--color-text-muted)]">
1241
- {completed}/{totalTasks}
1242
- </span>
1243
- </div>
1244
- {totalTasks > 0 && (
1245
- <div className="flex flex-wrap items-center gap-x-3 gap-y-0.5 text-[10px] text-[var(--color-text-muted)]">
1246
- {inProgress > 0 && (
1247
- <span className="inline-flex items-center gap-1">
1248
- <Play size={10} className="shrink-0 text-blue-400" />
1249
- {inProgress} 进行中
1250
- </span>
1251
- )}
1252
- {pending > 0 && (
1253
- <span className="inline-flex items-center gap-1">
1254
- <Clock size={10} className="shrink-0 text-amber-400" />
1255
- {pending} 待办
1256
- </span>
1257
- )}
1258
- {completed > 0 && (
1259
- <span className="inline-flex items-center gap-1">
1260
- <CheckCircle size={10} className="shrink-0 text-emerald-400" />
1261
- {completed} 已完成
1262
- </span>
1263
- )}
1264
- </div>
1265
- )}
1266
- </div>
1267
- );
1268
- })()}
1269
- {renderTeamRecentPaths(team, status, matchesCurrentProject, isLight)}
1270
1255
  </div>
1271
1256
  </div>
1272
1257
  </div>
@@ -128,7 +128,7 @@ export const TeamSessionsSection = ({
128
128
  {selectedSessionId !== null && (
129
129
  <button
130
130
  type="button"
131
- className="flex w-full items-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs text-blue-600 transition-colors hover:bg-blue-500/10 dark:text-blue-400"
131
+ className="flex w-full items-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs text-indigo-600 transition-colors hover:bg-indigo-500/10 dark:text-indigo-400"
132
132
  onClick={() => onSelectSession(null)}
133
133
  >
134
134
  <FilterX size={12} />
@@ -176,10 +176,10 @@ const SessionRow = ({
176
176
  return (
177
177
  <div
178
178
  className={`group flex w-full items-center gap-2 rounded-md px-2.5 py-2 text-left text-xs transition-colors hover:bg-[var(--color-surface-raised)] ${
179
- isLead ? 'border border-blue-500/20 bg-blue-500/5' : ''
180
- } ${isSelected ? 'bg-blue-500/10 ring-1 ring-blue-400/50' : ''}`}
179
+ isLead ? 'border border-indigo-500/20 bg-indigo-500/5' : ''
180
+ } ${isSelected ? 'bg-indigo-500/10 ring-1 ring-indigo-400/50' : ''}`}
181
181
  >
182
- {isLead && <Crown size={12} className="shrink-0 text-blue-400" />}
182
+ {isLead && <Crown size={12} className="shrink-0 text-indigo-400" />}
183
183
 
184
184
  <button type="button" className="min-w-0 flex-1 text-left" onClick={onClick}>
185
185
  <div className="flex items-center gap-1.5">
@@ -199,7 +199,7 @@ const SessionRow = ({
199
199
  {isLead && (
200
200
  <>
201
201
  <span style={{ opacity: 0.5 }}>·</span>
202
- <span className="text-blue-600 dark:text-blue-400">负责人</span>
202
+ <span className="text-indigo-600 dark:text-indigo-400">负责人</span>
203
203
  </>
204
204
  )}
205
205
  </div>
@@ -210,7 +210,7 @@ const SessionRow = ({
210
210
  <TooltipTrigger asChild>
211
211
  <button
212
212
  type="button"
213
- className={`rounded p-0.5 text-[var(--color-text-muted)] transition-opacity hover:text-blue-400 ${
213
+ className={`rounded p-0.5 text-[var(--color-text-muted)] transition-opacity hover:text-indigo-400 ${
214
214
  isSelected ? 'opacity-100' : 'opacity-0 group-hover:opacity-100'
215
215
  }`}
216
216
  onClick={(e) => {
@@ -21,7 +21,7 @@ export const UnreadCommentsBadge = ({
21
21
  {totalCount}
22
22
  </span>
23
23
  {unreadCount > 0 ? (
24
- <span className="absolute -right-1 -top-1 flex h-4 min-w-4 items-center justify-center rounded-full bg-blue-500 px-1 text-[8px] font-bold leading-none text-white shadow-sm">
24
+ <span className="absolute -right-1 -top-1 flex h-4 min-w-4 items-center justify-center rounded-full bg-indigo-500 px-1 text-[8px] font-bold leading-none text-white shadow-sm">
25
25
  {unreadCount}
26
26
  </span>
27
27
  ) : null}
@@ -223,7 +223,7 @@ const SessionSourceBadge = ({ message }: { message: InboxMessage }): React.JSX.E
223
223
  className="inline-flex max-w-[180px] items-center truncate rounded-full px-1.5 py-0.5 text-[10px] font-medium"
224
224
  title={`${platform}${label}${session?.key ? ` (${session.key})` : ''}`}
225
225
  style={{
226
- backgroundColor: 'rgba(59, 130, 246, 0.12)',
226
+ backgroundColor: 'rgba(99, 102, 241, 0.12)',
227
227
  color: '#93c5fd',
228
228
  }}
229
229
  >
@@ -578,7 +578,7 @@ function linkifyTaskIds(text: string, onClick: (taskId: string) => void): React.
578
578
  <TaskTooltip key={i} taskId={taskId}>
579
579
  <button
580
580
  type="button"
581
- className="inline cursor-pointer font-medium text-blue-600 hover:underline dark:text-blue-400"
581
+ className="inline cursor-pointer font-medium text-indigo-600 hover:underline dark:text-indigo-400"
582
582
  onClick={(e) => {
583
583
  e.stopPropagation();
584
584
  onClick(taskId);
@@ -636,7 +636,7 @@ const TaskRecipientBadge = ({
636
636
  className="inline-flex items-center rounded px-1.5 py-0.5 text-[10px] font-medium tracking-wide"
637
637
  style={{
638
638
  backgroundColor: 'rgba(96, 165, 250, 0.14)',
639
- color: '#60a5fa',
639
+ color: '#818cf8',
640
640
  border: '1px solid rgba(96, 165, 250, 0.3)',
641
641
  }}
642
642
  >
@@ -1209,7 +1209,7 @@ export const ActivityItem = memo(
1209
1209
  <div className="flex min-w-0 flex-1 items-center gap-2 overflow-hidden">
1210
1210
  {isUnread ? (
1211
1211
  <span
1212
- className="size-2 shrink-0 rounded-full bg-blue-500"
1212
+ className="size-2 shrink-0 rounded-full bg-indigo-500"
1213
1213
  title="未读"
1214
1214
  aria-hidden
1215
1215
  />
@@ -1239,7 +1239,7 @@ export const ActivityItem = memo(
1239
1239
  <button
1240
1240
  type="button"
1241
1241
  aria-label="展开消息"
1242
- className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-500/50 group-hover:opacity-100"
1242
+ className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-indigo-500/50 group-hover:opacity-100"
1243
1243
  style={{ color: CARD_ICON_MUTED }}
1244
1244
  onClick={(e) => {
1245
1245
  e.stopPropagation();
@@ -1279,7 +1279,7 @@ export const ActivityItem = memo(
1279
1279
  <div className="flex min-w-0 items-center gap-2">
1280
1280
  {isUnread ? (
1281
1281
  <span
1282
- className="size-2 shrink-0 rounded-full bg-blue-500"
1282
+ className="size-2 shrink-0 rounded-full bg-indigo-500"
1283
1283
  title="未读"
1284
1284
  aria-hidden
1285
1285
  />
@@ -1322,7 +1322,7 @@ export const ActivityItem = memo(
1322
1322
  <button
1323
1323
  type="button"
1324
1324
  aria-label="展开消息"
1325
- className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-500/50 group-hover:opacity-100"
1325
+ className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-indigo-500/50 group-hover:opacity-100"
1326
1326
  style={{ color: CARD_ICON_MUTED }}
1327
1327
  onClick={(e) => {
1328
1328
  e.stopPropagation();
@@ -1361,7 +1361,7 @@ export const ActivityItem = memo(
1361
1361
  <>
1362
1362
  {isUnread ? (
1363
1363
  <span
1364
- className="size-2 shrink-0 rounded-full bg-blue-500"
1364
+ className="size-2 shrink-0 rounded-full bg-indigo-500"
1365
1365
  title="未读"
1366
1366
  aria-hidden
1367
1367
  />
@@ -1406,7 +1406,7 @@ export const ActivityItem = memo(
1406
1406
  <button
1407
1407
  type="button"
1408
1408
  aria-label="展开消息"
1409
- className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-500/50 group-hover:opacity-100"
1409
+ className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-indigo-500/50 group-hover:opacity-100"
1410
1410
  style={{ color: CARD_ICON_MUTED }}
1411
1411
  onClick={(e) => {
1412
1412
  e.stopPropagation();
@@ -762,11 +762,11 @@ export const ActivityTimeline = React.memo(function ActivityTimeline({
762
762
  className="flex items-center gap-3"
763
763
  style={{ paddingTop: 45, paddingBottom: 45 }}
764
764
  >
765
- <div className="h-px flex-1 bg-blue-600/30 dark:bg-blue-400/30" />
766
- <span className="whitespace-nowrap text-[11px] font-medium text-blue-600 dark:text-blue-400">
765
+ <div className="h-px flex-1 bg-indigo-600/30 dark:bg-indigo-400/30" />
766
+ <span className="whitespace-nowrap text-[11px] font-medium text-indigo-600 dark:text-indigo-400">
767
767
  New session
768
768
  </span>
769
- <div className="h-px flex-1 bg-blue-600/30 dark:bg-blue-400/30" />
769
+ <div className="h-px flex-1 bg-indigo-600/30 dark:bg-indigo-400/30" />
770
770
  </div>
771
771
  );
772
772
  case 'compaction-divider':
@@ -933,7 +933,7 @@ export const ActivityTimeline = React.memo(function ActivityTimeline({
933
933
  <span className="text-[11px] tabular-nums text-[var(--color-text-muted)]">
934
934
  +{hiddenCount} older
935
935
  </span>
936
- <span className="h-3 w-px bg-blue-600/30 dark:bg-blue-400/30" />
936
+ <span className="h-3 w-px bg-indigo-600/30 dark:bg-indigo-400/30" />
937
937
  <button
938
938
  onClick={handleShowMore}
939
939
  className="rounded-full px-2.5 py-0.5 text-[11px] font-medium text-[var(--color-text-secondary)] transition-all hover:bg-[rgba(255,255,255,0.08)] hover:text-[var(--color-text)]"
@@ -942,7 +942,7 @@ export const ActivityTimeline = React.memo(function ActivityTimeline({
942
942
  </button>
943
943
  {hiddenCount > MESSAGES_PAGE_SIZE && (
944
944
  <>
945
- <span className="h-3 w-px bg-blue-600/30 dark:bg-blue-400/30" />
945
+ <span className="h-3 w-px bg-indigo-600/30 dark:bg-indigo-400/30" />
946
946
  <button
947
947
  onClick={handleShowAll}
948
948
  className="rounded-full px-2.5 py-0.5 text-[11px] text-[var(--color-text-muted)] transition-all hover:bg-[rgba(255,255,255,0.08)] hover:text-[var(--color-text-secondary)]"
@@ -848,7 +848,7 @@ const LeadThoughtsGroupRowComponent = ({
848
848
  <button
849
849
  type="button"
850
850
  aria-label="Expand thoughts"
851
- className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-500/50 group-hover:opacity-100"
851
+ className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-indigo-500/50 group-hover:opacity-100"
852
852
  style={{ color: CARD_ICON_MUTED }}
853
853
  onClick={(e) => {
854
854
  e.stopPropagation();
@@ -933,7 +933,7 @@ const LeadThoughtsGroupRowComponent = ({
933
933
  <button
934
934
  type="button"
935
935
  aria-label="Expand thoughts"
936
- className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-500/50 group-hover:opacity-100"
936
+ className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-indigo-500/50 group-hover:opacity-100"
937
937
  style={{ color: CARD_ICON_MUTED }}
938
938
  onClick={(e) => {
939
939
  e.stopPropagation();
@@ -1032,7 +1032,7 @@ const LeadThoughtsGroupRowComponent = ({
1032
1032
  <button
1033
1033
  type="button"
1034
1034
  aria-label="Expand thoughts"
1035
- className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-500/50 group-hover:opacity-100"
1035
+ className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-indigo-500/50 group-hover:opacity-100"
1036
1036
  style={{ color: CARD_ICON_MUTED }}
1037
1037
  onClick={(e) => {
1038
1038
  e.stopPropagation();
@@ -34,15 +34,15 @@ export const ReplyQuoteBlock = ({
34
34
  return (
35
35
  <div className="space-y-2">
36
36
  {/* Quote block — styled like SendMessageDialog */}
37
- <div className="relative overflow-hidden rounded-md border border-blue-400/20 bg-blue-100/40 py-2 pl-3 pr-2 dark:border-blue-500/20 dark:bg-blue-950/20">
37
+ <div className="relative overflow-hidden rounded-md border border-indigo-400/20 bg-blue-100/40 py-2 pl-3 pr-2 dark:border-indigo-500/20 dark:bg-blue-950/20">
38
38
  {/* Decorative quotation mark */}
39
- <span className="pointer-events-none absolute -right-1 top-1/2 -translate-y-1/2 select-none font-serif text-[48px] leading-none text-blue-600/[0.08] dark:text-blue-400/[0.08]">
39
+ <span className="pointer-events-none absolute -right-1 top-1/2 -translate-y-1/2 select-none font-serif text-[48px] leading-none text-indigo-600/[0.08] dark:text-indigo-400/[0.08]">
40
40
  &ldquo;
41
41
  </span>
42
42
 
43
43
  {/* "Replying to" + MemberBadge */}
44
44
  <div className="mb-1 flex items-center gap-1.5">
45
- <span className="text-[10px] text-blue-600/60 dark:text-blue-300/60">Replying to</span>
45
+ <span className="text-[10px] text-indigo-600/60 dark:text-indigo-300/60">Replying to</span>
46
46
  <MemberBadge name={reply.agentName} color={memberColor} size="sm" />
47
47
  </div>
48
48
 
@@ -59,7 +59,7 @@ export const ReplyQuoteBlock = ({
59
59
  {isLong ? (
60
60
  <button
61
61
  type="button"
62
- className="mt-0.5 text-[10px] text-blue-600/60 hover:text-blue-700 dark:text-blue-400/60 dark:hover:text-blue-300"
62
+ className="mt-0.5 text-[10px] text-indigo-600/60 hover:text-blue-700 dark:text-indigo-400/60 dark:hover:text-indigo-300"
63
63
  onClick={() => setExpanded((v) => !v)}
64
64
  >
65
65
  {expanded ? 'less' : 'more'}
@@ -233,7 +233,7 @@ export const CreateTaskDialog = ({
233
233
  >
234
234
  <AlertTriangle size={14} className="mt-0.5 shrink-0" />
235
235
  <p className="text-xs leading-relaxed">
236
- 团队当前离线。任务会加入 <strong>待处理</strong>,启动团队后即可开始执行。
236
+ 数字员工当前未运行:没有本地 Claude/Agent 进程在运行。任务会加入 <strong>待处理</strong>,启动数字员工后即可开始执行。
237
237
  </p>
238
238
  </div>
239
239
  ) : null}
@@ -342,7 +342,7 @@ export const CreateTaskDialog = ({
342
342
  type="button"
343
343
  className={`flex w-full items-center gap-2 rounded px-2 py-1.5 text-left text-xs transition-colors ${
344
344
  isSelected
345
- ? 'bg-blue-500/15 text-blue-300'
345
+ ? 'bg-indigo-500/15 text-indigo-300'
346
346
  : 'text-[var(--color-text-secondary)] hover:bg-[var(--color-surface-raised)]'
347
347
  }`}
348
348
  onClick={() => toggleBlockedBy(t.id)}
@@ -350,7 +350,7 @@ export const CreateTaskDialog = ({
350
350
  <span
351
351
  className={`flex size-3.5 shrink-0 items-center justify-center rounded-sm border text-[9px] ${
352
352
  isSelected
353
- ? 'border-blue-400 bg-blue-500/30 text-blue-300'
353
+ ? 'border-indigo-400 bg-indigo-500/30 text-indigo-300'
354
354
  : 'border-[var(--color-border-emphasis)]'
355
355
  }`}
356
356
  >
@@ -468,7 +468,7 @@ export const CreateTaskDialog = ({
468
468
  </div>
469
469
  {!isTeamAlive ? (
470
470
  <p className="text-[10px] text-[var(--color-text-muted)]">
471
- 团队当前离线。请先启动团队,才能立即开始任务。
471
+ 数字员工当前未运行。请先启动数字员工,才能立即开始任务。
472
472
  </p>
473
473
  ) : null}
474
474
  </div>