@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
@@ -0,0 +1,361 @@
1
+ import { useEffect, useMemo, useRef, useState } from 'react';
2
+
3
+ import { Button } from '@renderer/components/ui/button';
4
+ import {
5
+ Dialog,
6
+ DialogContent,
7
+ DialogDescription,
8
+ DialogFooter,
9
+ DialogHeader,
10
+ DialogTitle,
11
+ } from '@renderer/components/ui/dialog';
12
+ import { AGENT_TYPE_LABELS } from '@renderer/components/team/HarnessCards';
13
+ import { HarnessSelect } from '@renderer/components/team/HarnessSelect';
14
+ import { Loader2, Settings2 } from 'lucide-react';
15
+
16
+ import { api } from '@renderer/api';
17
+ import { useStore } from '@renderer/store';
18
+ import { isTeamProvisioningActive } from '@renderer/store/slices/teamSlice';
19
+ import type { GlobalProvider } from '@shared/types';
20
+ import type { CcAgentType } from '@shared/types/ccConnect';
21
+ import { PERMISSION_MODE_OPTIONS } from './useTeamEditForm';
22
+ import { PlatformBindingContent } from './PlatformBindingDialog';
23
+
24
+ // ── Section wrapper ──────────────────────────────────────────
25
+ function FormSection({
26
+ title,
27
+ description,
28
+ children,
29
+ }: {
30
+ title: string;
31
+ description?: string;
32
+ children: React.ReactNode;
33
+ }): React.JSX.Element {
34
+ return (
35
+ <div className="rounded-md border border-[var(--color-border)] p-3">
36
+ <h3 className="text-sm font-medium text-[var(--color-text)]">{title}</h3>
37
+ {description && (
38
+ <p className="mt-0.5 text-xs text-[var(--color-text-muted)]">{description}</p>
39
+ )}
40
+ <div className="mt-3 space-y-3">{children}</div>
41
+ </div>
42
+ );
43
+ }
44
+
45
+ const inputCls =
46
+ 'w-full rounded-md border border-[var(--color-border)] bg-[var(--color-surface)] px-3 py-1.5 text-sm text-[var(--color-text)] outline-none focus:border-[var(--color-border-emphasis)]';
47
+ const labelCls = 'mb-1 block text-xs font-medium text-[var(--color-text-secondary)]';
48
+
49
+ interface RuntimeConfigDialogProps {
50
+ open: boolean;
51
+ teamName: string;
52
+ onClose: () => void;
53
+ }
54
+
55
+ export function RuntimeConfigDialog({
56
+ open,
57
+ teamName,
58
+ onClose,
59
+ }: RuntimeConfigDialogProps): React.JSX.Element {
60
+ const { data, fetchTeams, selectTeam } = useStore((s) => ({
61
+ data: s.selectedTeamName === teamName ? s.selectedTeamData : null,
62
+ fetchTeams: s.fetchTeams,
63
+ selectTeam: s.selectTeam,
64
+ }));
65
+ const isProvisioning = useStore((s) => isTeamProvisioningActive(s, teamName));
66
+
67
+ // ── Derived defaults ─────────────────────────────────────────
68
+ const defaults = useMemo(() => {
69
+ const cfg = data?.config;
70
+ const d = data as Record<string, unknown> | null;
71
+ return {
72
+ agentType: cfg?.agentType ?? (d?.harness as string | undefined) ?? 'claudecode',
73
+ workDir: (d?.workDir as string | undefined) ?? cfg?.projectPath ?? '',
74
+ permissionMode: cfg?.permissionMode ?? (d?.permissionMode as string | undefined) ?? 'default',
75
+ disabledCommands: Array.isArray(cfg?.disabledCommands)
76
+ ? cfg.disabledCommands
77
+ : [],
78
+ providerRefs: data?.providerRefs ?? [],
79
+ globalProviders: data?.globalProviders ?? [],
80
+ bindProject: (d?.bindProject as string | undefined) ?? teamName,
81
+ };
82
+ }, [data, teamName]);
83
+
84
+ // ── Local form state ─────────────────────────────────────────
85
+ const [agentType, setAgentType] = useState(defaults.agentType);
86
+ const [permissionMode, setPermissionMode] = useState(defaults.permissionMode);
87
+ const [workDir, setWorkDir] = useState(defaults.workDir);
88
+ const [disabledCommandsInput, setDisabledCommandsInput] = useState(
89
+ defaults.disabledCommands.join(', ')
90
+ );
91
+ const [providerRef, setProviderRef] = useState(defaults.providerRefs[0] ?? '');
92
+
93
+ const [savePhase, setSavePhase] = useState<'idle' | 'saving' | 'restarting' | 'done'>('idle');
94
+ const [error, setError] = useState<string | null>(null);
95
+ const saving = savePhase === 'saving' || savePhase === 'restarting';
96
+
97
+ const defaultsRef = useRef(defaults);
98
+ if (defaults.agentType) defaultsRef.current = defaults;
99
+
100
+ // ── Reset form when dialog opens ─────────────────────────────
101
+ const prevOpenRef = useRef(false);
102
+ useEffect(() => {
103
+ if (!open || prevOpenRef.current) {
104
+ prevOpenRef.current = open;
105
+ return;
106
+ }
107
+ prevOpenRef.current = true;
108
+ const d = defaultsRef.current;
109
+ setSavePhase('idle');
110
+ setError(null);
111
+ setAgentType(d.agentType);
112
+ setPermissionMode(d.permissionMode);
113
+ setWorkDir(d.workDir);
114
+ setDisabledCommandsInput(d.disabledCommands.join(', '));
115
+ setProviderRef(d.providerRefs[0] ?? '');
116
+ }, [open]);
117
+
118
+ // ── Computed ─────────────────────────────────────────────────
119
+ const compatibleProviders = useMemo(
120
+ () =>
121
+ defaults.globalProviders.filter(
122
+ (p) =>
123
+ !p.agent_types ||
124
+ p.agent_types.length === 0 ||
125
+ (p.agent_types as string[]).includes(agentType)
126
+ ),
127
+ [defaults.globalProviders, agentType]
128
+ );
129
+
130
+ const toggleProviderRef = (providerName: string): void => {
131
+ setError(null);
132
+ setProviderRef(providerRef === providerName ? '' : providerName);
133
+ };
134
+
135
+ // ── Save ─────────────────────────────────────────────────────
136
+ const handleSave = (): void => {
137
+ if (savePhase !== 'idle') return;
138
+ const disabledCommands = disabledCommandsInput
139
+ .split(',')
140
+ .map((e) => e.trim())
141
+ .filter((e) => e.length > 0);
142
+
143
+ setSavePhase('saving');
144
+ setError(null);
145
+
146
+ void (async () => {
147
+ try {
148
+ await api.teams.updateConfig(teamName, {
149
+ agentType: agentType.trim() || undefined,
150
+ workDir: workDir.trim() || undefined,
151
+ permissionMode: permissionMode.trim() || undefined,
152
+ disabledCommands,
153
+ providerRefs: providerRef ? [providerRef] : [],
154
+ });
155
+ await Promise.all([fetchTeams(), selectTeam(teamName)]);
156
+
157
+ setSavePhase('restarting');
158
+ try {
159
+ await api.ccSettings.restart();
160
+ setSavePhase('done');
161
+ } catch (restartErr) {
162
+ setError(
163
+ `配置已保存,但重启失败:${restartErr instanceof Error ? restartErr.message : '未知错误'}`
164
+ );
165
+ setSavePhase('idle');
166
+ }
167
+ } catch (err) {
168
+ setError(err instanceof Error ? err.message : '保存失败');
169
+ setSavePhase('idle');
170
+ }
171
+ })();
172
+ };
173
+
174
+ const saveLabel =
175
+ savePhase === 'done'
176
+ ? '已完成'
177
+ : savePhase === 'restarting'
178
+ ? '正在重启...'
179
+ : savePhase === 'saving'
180
+ ? '保存中...'
181
+ : '保存并重启';
182
+
183
+ const [bindingStep, setBindingStep] = useState<'runtime' | 'bind'>('runtime');
184
+
185
+ return (
186
+ <Dialog
187
+ open={savePhase === 'saving' ? true : open}
188
+ onOpenChange={(nextOpen) => {
189
+ if (saving) return;
190
+ if (!nextOpen) onClose();
191
+ }}
192
+ >
193
+ <DialogContent className="max-w-2xl">
194
+ <DialogHeader>
195
+ <DialogTitle className="flex items-center gap-2">
196
+ <Settings2 size={16} />
197
+ 运行时配置
198
+ </DialogTitle>
199
+ <DialogDescription>
200
+ 修改 Agent 类型、渠道、消息设置等运行时参数。部分变更需要重启服务。
201
+ </DialogDescription>
202
+ </DialogHeader>
203
+
204
+ {bindingStep === 'bind' ? (
205
+ <PlatformBindingContent
206
+ projectName={defaults.bindProject}
207
+ workDir={workDir}
208
+ agentType={agentType}
209
+ onComplete={() => setBindingStep('runtime')}
210
+ onCancel={() => setBindingStep('runtime')}
211
+ />
212
+ ) : (
213
+ <div className="space-y-4">
214
+ {/* Agent & 权限 */}
215
+ <FormSection title="Agent & 权限">
216
+ <div className="grid gap-3 md:grid-cols-2">
217
+ <div>
218
+ <label className={labelCls}>Agent 类型</label>
219
+ <HarnessSelect
220
+ value={agentType as CcAgentType}
221
+ onChange={(v) => { setError(null); setAgentType(v); }}
222
+ className="w-full"
223
+ />
224
+ </div>
225
+ <div>
226
+ <label className={labelCls}>权限模式</label>
227
+ <select
228
+ value={permissionMode}
229
+ onChange={(e) => { setError(null); setPermissionMode(e.target.value); }}
230
+ className={inputCls}
231
+ >
232
+ {PERMISSION_MODE_OPTIONS.map((opt) => (
233
+ <option key={opt.value} value={opt.value}>{opt.label}</option>
234
+ ))}
235
+ </select>
236
+ </div>
237
+ </div>
238
+ <div>
239
+ <label className={labelCls}>工作目录</label>
240
+ <input
241
+ type="text"
242
+ value={workDir}
243
+ onChange={(e) => { setError(null); setWorkDir(e.target.value); }}
244
+ className={`${inputCls} font-mono`}
245
+ placeholder="/Users/you/code/project"
246
+ />
247
+ </div>
248
+ </FormSection>
249
+
250
+ {/* 渠道 */}
251
+ <FormSection title="渠道" description="绑定外部消息平台(飞书、Telegram 等)。">
252
+ <Button
253
+ variant="outline"
254
+ size="sm"
255
+ onClick={() => setBindingStep('bind')}
256
+ >
257
+ 绑定新渠道
258
+ </Button>
259
+ </FormSection>
260
+
261
+ {/* Provider */}
262
+ <div className="rounded-lg border border-[var(--color-border-subtle)] bg-white/[0.02] p-3">
263
+ <div className="flex items-start justify-between gap-3">
264
+ <div>
265
+ <p className="text-xs font-medium text-[var(--color-text)]">Provider(可选)</p>
266
+ <p className="mt-1 text-[11px] leading-relaxed text-[var(--color-text-muted)]">
267
+ 留空时使用本机 {AGENT_TYPE_LABELS[agentType as CcAgentType] ?? agentType} 默认配置。
268
+ </p>
269
+ </div>
270
+ {providerRef ? (
271
+ <button
272
+ type="button"
273
+ className="shrink-0 rounded-md border border-[var(--color-border)] px-2 py-1 text-[11px] text-[var(--color-text-muted)] hover:bg-white/5"
274
+ onClick={() => setProviderRef('')}
275
+ >
276
+ 使用本机默认
277
+ </button>
278
+ ) : null}
279
+ </div>
280
+ <div className="mt-3 space-y-2">
281
+ {compatibleProviders.length > 0 ? (
282
+ compatibleProviders.map((provider) => {
283
+ const checked = providerRef === provider.name;
284
+ const at = agentType as CcAgentType;
285
+ const endpoint = provider.endpoints?.[at] ?? provider.base_url ?? '默认端点';
286
+ const model =
287
+ provider.agent_models?.[at] ?? provider.model ?? provider.models?.[0]?.model ?? '未指定模型';
288
+ return (
289
+ <button
290
+ key={provider.name}
291
+ type="button"
292
+ onClick={() => toggleProviderRef(provider.name)}
293
+ className={`w-full rounded-lg border px-3 py-2 text-left transition-colors ${
294
+ checked
295
+ ? 'border-indigo-400/60 bg-indigo-500/10'
296
+ : 'border-[var(--color-border-subtle)] bg-black/10 hover:border-[var(--color-border)] hover:bg-white/[0.04]'
297
+ }`}
298
+ >
299
+ <div className="flex items-center justify-between gap-3">
300
+ <div className="min-w-0">
301
+ <p className="truncate text-xs font-medium text-[var(--color-text)]">{provider.name}</p>
302
+ <p className="mt-0.5 truncate text-[11px] text-[var(--color-text-muted)]">
303
+ {model} · {endpoint}
304
+ </p>
305
+ </div>
306
+ <span
307
+ className={`shrink-0 rounded-full px-2 py-0.5 text-[10px] ${
308
+ checked ? 'bg-indigo-400/20 text-indigo-200' : 'bg-white/5 text-[var(--color-text-muted)]'
309
+ }`}
310
+ >
311
+ {checked ? '已绑定' : '可绑定'}
312
+ </span>
313
+ </div>
314
+ </button>
315
+ );
316
+ })
317
+ ) : (
318
+ <div className="rounded-md border border-dashed border-[var(--color-border)] px-3 py-3 text-xs text-[var(--color-text-muted)]">
319
+ 暂无适用于 {AGENT_TYPE_LABELS[agentType as CcAgentType] ?? agentType} 的全局 Provider。
320
+ </div>
321
+ )}
322
+ </div>
323
+ </div>
324
+
325
+ {/* 高级 */}
326
+ <FormSection title="高级">
327
+ <div>
328
+ <label className={labelCls}>已禁用命令</label>
329
+ <input
330
+ type="text"
331
+ value={disabledCommandsInput}
332
+ onChange={(e) => { setError(null); setDisabledCommandsInput(e.target.value); }}
333
+ className={inputCls}
334
+ placeholder="restart, upgrade, cron"
335
+ />
336
+ </div>
337
+ </FormSection>
338
+
339
+ {error && <p className="text-xs text-red-400">{error}</p>}
340
+ </div>
341
+ )}
342
+
343
+ {bindingStep === 'runtime' && (
344
+ <DialogFooter>
345
+ <Button variant="outline" size="sm" onClick={onClose} disabled={saving}>
346
+ {savePhase === 'done' ? '关闭' : '取消'}
347
+ </Button>
348
+ <Button
349
+ size="sm"
350
+ onClick={handleSave}
351
+ disabled={saving || savePhase === 'done'}
352
+ >
353
+ {saving && <Loader2 size={14} className="mr-1.5 animate-spin" />}
354
+ {saveLabel}
355
+ </Button>
356
+ </DialogFooter>
357
+ )}
358
+ </DialogContent>
359
+ </Dialog>
360
+ );
361
+ }
@@ -421,9 +421,9 @@ export const SendMessageDialog = ({
421
421
 
422
422
  <div className={quote ? 'flex flex-col' : 'contents'}>
423
423
  {quote ? (
424
- <div className="relative overflow-hidden rounded-t-md border border-b-0 border-blue-400/30 bg-blue-100/80 py-2 pl-3 pr-2 dark:border-blue-500/20 dark:bg-blue-950/20">
424
+ <div className="relative overflow-hidden rounded-t-md border border-b-0 border-indigo-400/30 bg-blue-100/80 py-2 pl-3 pr-2 dark:border-indigo-500/20 dark:bg-blue-950/20">
425
425
  {/* Decorative quotation mark */}
426
- <span className="pointer-events-none absolute -right-1 top-1/2 -translate-y-1/2 select-none font-serif text-[64px] leading-none text-blue-500/[0.08] dark:text-blue-400/[0.08]">
426
+ <span className="pointer-events-none absolute -right-1 top-1/2 -translate-y-1/2 select-none font-serif text-[64px] leading-none text-indigo-500/[0.08] dark:text-indigo-400/[0.08]">
427
427
  &ldquo;
428
428
  </span>
429
429
 
@@ -431,7 +431,7 @@ export const SendMessageDialog = ({
431
431
  <TooltipTrigger asChild>
432
432
  <button
433
433
  type="button"
434
- className="absolute right-1.5 top-1.5 z-10 rounded p-0.5 text-blue-400/60 hover:text-blue-600 dark:text-blue-300/40 dark:hover:text-blue-200"
434
+ className="absolute right-1.5 top-1.5 z-10 rounded p-0.5 text-indigo-400/60 hover:text-indigo-600 dark:text-indigo-300/40 dark:hover:text-blue-200"
435
435
  onClick={() => setQuote(undefined)}
436
436
  >
437
437
  <X size={12} />
@@ -441,7 +441,7 @@ export const SendMessageDialog = ({
441
441
  </Tooltip>
442
442
 
443
443
  <div className="mb-1 flex items-center gap-1.5">
444
- <span className="text-[10px] text-blue-600/70 dark:text-blue-300/60">
444
+ <span className="text-[10px] text-indigo-600/70 dark:text-indigo-300/60">
445
445
  正在回复
446
446
  </span>
447
447
  <MemberBadge name={quote.from} color={colorMap.get(quote.from)} size="sm" />
@@ -458,7 +458,7 @@ export const SendMessageDialog = ({
458
458
  {isQuoteLong ? (
459
459
  <button
460
460
  type="button"
461
- className="mt-0.5 text-[10px] text-blue-500 hover:text-blue-700 dark:text-blue-400/60 dark:hover:text-blue-300"
461
+ className="mt-0.5 text-[10px] text-indigo-500 hover:text-blue-700 dark:text-indigo-400/60 dark:hover:text-indigo-300"
462
462
  onClick={() => setQuoteExpanded((v) => !v)}
463
463
  >
464
464
  {quoteExpanded ? '收起' : '展开'}
@@ -487,7 +487,7 @@ export const SendMessageDialog = ({
487
487
  cornerAction={
488
488
  <button
489
489
  type="button"
490
- className="inline-flex shrink-0 items-center gap-1 rounded-full bg-blue-600 px-3 py-1.5 text-[11px] font-medium text-white shadow-sm transition-colors hover:bg-blue-500 disabled:cursor-not-allowed disabled:opacity-50"
490
+ className="inline-flex shrink-0 items-center gap-1 rounded-full bg-indigo-600 px-3 py-1.5 text-[11px] font-medium text-white shadow-sm transition-colors hover:bg-indigo-500 disabled:cursor-not-allowed disabled:opacity-50"
491
491
  disabled={!canSend}
492
492
  onClick={handleSubmit}
493
493
  >
@@ -33,13 +33,13 @@ export const SkipPermissionsCheckbox: React.FC<SkipPermissionsCheckboxProps> = (
33
33
  <div
34
34
  className="mt-1.5 rounded-md border px-3 py-2 text-xs"
35
35
  style={{
36
- backgroundColor: 'rgba(59, 130, 246, 0.08)',
37
- borderColor: 'rgba(59, 130, 246, 0.2)',
36
+ backgroundColor: 'rgba(99, 102, 241, 0.08)',
37
+ borderColor: 'rgba(99, 102, 241, 0.2)',
38
38
  color: 'var(--color-text-secondary)',
39
39
  }}
40
40
  >
41
41
  <div className="flex items-start gap-2">
42
- <Info className="mt-0.5 size-3.5 shrink-0 text-blue-400" />
42
+ <Info className="mt-0.5 size-3.5 shrink-0 text-indigo-400" />
43
43
  <p>启用自主模式后,所有工具都会直接执行,不再逐次请求确认。处理不可信代码时请谨慎。</p>
44
44
  </div>
45
45
  </div>
@@ -47,13 +47,13 @@ export const SkipPermissionsCheckbox: React.FC<SkipPermissionsCheckboxProps> = (
47
47
  <div
48
48
  className="mt-1.5 rounded-md border px-3 py-2 text-xs"
49
49
  style={{
50
- backgroundColor: 'rgba(59, 130, 246, 0.08)',
51
- borderColor: 'rgba(59, 130, 246, 0.2)',
50
+ backgroundColor: 'rgba(99, 102, 241, 0.08)',
51
+ borderColor: 'rgba(99, 102, 241, 0.2)',
52
52
  color: 'var(--color-text-secondary)',
53
53
  }}
54
54
  >
55
55
  <div className="flex items-start gap-2">
56
- <Info className="mt-0.5 size-3.5 shrink-0 text-blue-400" />
56
+ <Info className="mt-0.5 size-3.5 shrink-0 text-indigo-400" />
57
57
  <p>手动模式:每次工具调用都需要你实时批准或拒绝。</p>
58
58
  </div>
59
59
  </div>
@@ -203,7 +203,7 @@ function dotColorForStatus(status: TeamTaskStatus): string {
203
203
  case 'pending':
204
204
  return 'bg-zinc-500';
205
205
  case 'in_progress':
206
- return 'bg-blue-400';
206
+ return 'bg-indigo-400';
207
207
  case 'completed':
208
208
  return 'bg-emerald-400';
209
209
  case 'deleted':
@@ -241,7 +241,7 @@ export const TaskAttachments = ({
241
241
 
242
242
  {/* Drop zone indicator */}
243
243
  {dragOver ? (
244
- <div className="flex items-center justify-center rounded-md border-2 border-dashed border-blue-500/40 bg-blue-500/5 py-4 text-xs text-blue-400">
244
+ <div className="flex items-center justify-center rounded-md border-2 border-dashed border-indigo-500/40 bg-indigo-500/5 py-4 text-xs text-indigo-400">
245
245
  Drop image here
246
246
  </div>
247
247
  ) : null}
@@ -228,9 +228,9 @@ export const TaskCommentInput = ({
228
228
  return (
229
229
  <div>
230
230
  {replyTo ? (
231
- <div className="relative overflow-hidden rounded-t-md border border-b-0 border-blue-400/30 bg-blue-100/80 py-2 pl-3 pr-2 dark:border-blue-500/20 dark:bg-blue-950/20">
231
+ <div className="relative overflow-hidden rounded-t-md border border-b-0 border-indigo-400/30 bg-blue-100/80 py-2 pl-3 pr-2 dark:border-indigo-500/20 dark:bg-blue-950/20">
232
232
  {/* Decorative quotation mark */}
233
- <span className="pointer-events-none absolute -right-1 top-1/2 -translate-y-1/2 select-none font-serif text-[64px] leading-none text-blue-500/[0.08] dark:text-blue-400/[0.08]">
233
+ <span className="pointer-events-none absolute -right-1 top-1/2 -translate-y-1/2 select-none font-serif text-[64px] leading-none text-indigo-500/[0.08] dark:text-indigo-400/[0.08]">
234
234
  &ldquo;
235
235
  </span>
236
236
 
@@ -238,7 +238,7 @@ export const TaskCommentInput = ({
238
238
  <TooltipTrigger asChild>
239
239
  <button
240
240
  type="button"
241
- className="absolute right-1.5 top-1.5 z-10 rounded p-0.5 text-blue-400/60 hover:text-blue-600 dark:text-blue-300/40 dark:hover:text-blue-200"
241
+ className="absolute right-1.5 top-1.5 z-10 rounded p-0.5 text-indigo-400/60 hover:text-indigo-600 dark:text-indigo-300/40 dark:hover:text-blue-200"
242
242
  onClick={onClearReply}
243
243
  >
244
244
  <X size={12} />
@@ -248,7 +248,7 @@ export const TaskCommentInput = ({
248
248
  </Tooltip>
249
249
 
250
250
  <div className="mb-1 flex items-center gap-1.5">
251
- <span className="text-[10px] text-blue-600/70 dark:text-blue-300/60">正在回复</span>
251
+ <span className="text-[10px] text-indigo-600/70 dark:text-indigo-300/60">正在回复</span>
252
252
  <MemberBadge name={replyTo.author} color={colorMap.get(replyTo.author)} size="sm" />
253
253
  </div>
254
254
  <div
@@ -263,7 +263,7 @@ export const TaskCommentInput = ({
263
263
  {replyTo.text.length > LONG_QUOTE_THRESHOLD ? (
264
264
  <button
265
265
  type="button"
266
- className="mt-0.5 text-[10px] text-blue-500 hover:text-blue-700 dark:text-blue-400/60 dark:hover:text-blue-300"
266
+ className="mt-0.5 text-[10px] text-indigo-500 hover:text-blue-700 dark:text-indigo-400/60 dark:hover:text-indigo-300"
267
267
  onClick={() => setQuoteExpanded((v) => !v)}
268
268
  >
269
269
  {quoteExpanded ? '收起' : '展开'}
@@ -390,7 +390,7 @@ export const TaskCommentInput = ({
390
390
  </Tooltip>
391
391
  <button
392
392
  type="button"
393
- className="inline-flex shrink-0 items-center gap-1 rounded-full bg-blue-600 px-3 py-1.5 text-[11px] font-medium text-white shadow-sm transition-colors hover:bg-blue-500 disabled:cursor-not-allowed disabled:opacity-50"
393
+ className="inline-flex shrink-0 items-center gap-1 rounded-full bg-indigo-600 px-3 py-1.5 text-[11px] font-medium text-white shadow-sm transition-colors hover:bg-indigo-500 disabled:cursor-not-allowed disabled:opacity-50"
394
394
  disabled={!canSubmit}
395
395
  onClick={() => void handleSubmit()}
396
396
  >
@@ -223,7 +223,7 @@ export const TaskCommentsSection = ({
223
223
  comment.type === 'review_approved'
224
224
  ? 'border-y border-emerald-500/20 bg-emerald-500/5'
225
225
  : comment.type === 'review_request'
226
- ? 'border-y border-blue-500/20 bg-blue-500/5'
226
+ ? 'border-y border-indigo-500/20 bg-indigo-500/5'
227
227
  : '',
228
228
  ].join(' ')}
229
229
  style={
@@ -244,7 +244,7 @@ export const TaskCommentsSection = ({
244
244
  >
245
245
  <div className="mb-1 flex items-center gap-2 text-[10px] text-[var(--color-text-muted)]">
246
246
  {unreadCommentIds?.has(comment.id) ? (
247
- <span className="size-2 shrink-0 rounded-full bg-blue-500" />
247
+ <span className="size-2 shrink-0 rounded-full bg-indigo-500" />
248
248
  ) : null}
249
249
  <MemberBadge
250
250
  name={comment.author}
@@ -257,7 +257,7 @@ export const TaskCommentsSection = ({
257
257
  已批准
258
258
  </span>
259
259
  ) : comment.type === 'review_request' ? (
260
- <span className="inline-flex items-center gap-0.5 rounded-full bg-blue-500/15 px-1.5 py-0.5 text-[10px] font-medium text-blue-600 dark:text-blue-400">
260
+ <span className="inline-flex items-center gap-0.5 rounded-full bg-indigo-500/15 px-1.5 py-0.5 text-[10px] font-medium text-indigo-600 dark:text-indigo-400">
261
261
  <Eye size={10} />
262
262
  已请求审查
263
263
  </span>
@@ -440,7 +440,7 @@ export const TaskCommentsSection = ({
440
440
  cornerAction={
441
441
  <button
442
442
  type="button"
443
- className="inline-flex shrink-0 items-center gap-1 rounded-full bg-blue-600 px-3 py-1.5 text-[11px] font-medium text-white shadow-sm transition-colors hover:bg-blue-500 disabled:cursor-not-allowed disabled:opacity-50"
443
+ className="inline-flex shrink-0 items-center gap-1 rounded-full bg-indigo-600 px-3 py-1.5 text-[11px] font-medium text-white shadow-sm transition-colors hover:bg-indigo-500 disabled:cursor-not-allowed disabled:opacity-50"
444
444
  disabled={!canSubmit}
445
445
  onClick={() => void handleSubmit()}
446
446
  >
@@ -821,7 +821,7 @@ export const TaskDetailDialog = ({
821
821
  className={`flex items-center justify-between rounded-md px-3 py-2 text-xs ${
822
822
  currentTask.needsClarification === 'user'
823
823
  ? 'border border-red-500/20 bg-red-500/10 text-red-400'
824
- : 'border border-blue-500/20 bg-blue-500/10 text-blue-400'
824
+ : 'border border-indigo-500/20 bg-indigo-500/10 text-indigo-400'
825
825
  }`}
826
826
  >
827
827
  <span className="flex items-center gap-1.5">
@@ -953,7 +953,7 @@ export const TaskDetailDialog = ({
953
953
 
954
954
  {blocksIds.length > 0 ? (
955
955
  <div className="flex flex-wrap items-center gap-1.5">
956
- <span className="inline-flex items-center gap-0.5 text-xs text-blue-600 dark:text-blue-400">
956
+ <span className="inline-flex items-center gap-0.5 text-xs text-indigo-600 dark:text-indigo-400">
957
957
  <ArrowRightFromLine size={12} />
958
958
  阻塞
959
959
  </span>
@@ -971,7 +971,7 @@ export const TaskDetailDialog = ({
971
971
  className={`inline-flex items-center rounded px-1.5 py-0.5 text-[10px] font-medium transition-colors ${
972
972
  isCompleted
973
973
  ? 'bg-emerald-500/15 text-emerald-700 hover:bg-emerald-500/25 dark:text-emerald-400'
974
- : 'bg-blue-500/15 text-blue-600 hover:bg-blue-500/25 dark:text-blue-400'
974
+ : 'bg-indigo-500/15 text-indigo-600 hover:bg-indigo-500/25 dark:text-indigo-400'
975
975
  } cursor-pointer`}
976
976
  onClick={() => handleDependencyClick(id)}
977
977
  >