@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
@@ -31,10 +31,17 @@ export const platformMeta: Record<string, PlatformMeta> = {
31
31
  },
32
32
  {
33
33
  key: 'allow_from',
34
- label: 'Allow From',
35
- placeholder: '* (all)',
34
+ label: '私聊权限(允许的用户 ID)',
35
+ placeholder: '* 或 user_id',
36
36
  group: 'advanced',
37
- hint: '限制可交互的用户/群,* 表示所有',
37
+ hint: '控制哪些用户可以私聊机器人,* 表示所有',
38
+ },
39
+ {
40
+ key: 'allow_chat',
41
+ label: '群聊权限(允许的群聊 ID)',
42
+ placeholder: '* 或 chat_id',
43
+ group: 'advanced',
44
+ hint: '控制哪些群聊可以 @机器人,* 表示所有群聊',
38
45
  },
39
46
  { key: 'group_reply_all', label: '群聊回复全部', type: 'boolean', group: 'advanced' },
40
47
  { key: 'share_session_in_channel', label: '共享群会话', type: 'boolean', group: 'advanced' },
@@ -44,7 +51,20 @@ export const platformMeta: Record<string, PlatformMeta> = {
44
51
  label: 'Discord',
45
52
  fields: [
46
53
  { key: 'token', label: 'Bot Token', required: true, type: 'password' },
47
- { key: 'allow_from', label: 'Allow From', placeholder: '* (all)', group: 'advanced' },
54
+ {
55
+ key: 'allow_from',
56
+ label: '私聊权限(允许的用户 ID)',
57
+ placeholder: '* 或 user_id',
58
+ group: 'advanced',
59
+ hint: '控制哪些用户可以私聊机器人',
60
+ },
61
+ {
62
+ key: 'allow_chat',
63
+ label: '群聊权限(允许的频道 ID)',
64
+ placeholder: '* 或 channel_id',
65
+ group: 'advanced',
66
+ hint: '控制哪些频道可以 @机器人',
67
+ },
48
68
  {
49
69
  key: 'guild_id',
50
70
  label: 'Guild ID',
@@ -79,7 +99,20 @@ export const platformMeta: Record<string, PlatformMeta> = {
79
99
  type: 'password',
80
100
  placeholder: 'xapp-...',
81
101
  },
82
- { key: 'allow_from', label: 'Allow From', placeholder: '* (all)', group: 'advanced' },
102
+ {
103
+ key: 'allow_from',
104
+ label: '私聊权限(允许的用户 ID)',
105
+ placeholder: '* 或 user_id',
106
+ group: 'advanced',
107
+ hint: '控制哪些用户可以私聊机器人',
108
+ },
109
+ {
110
+ key: 'allow_chat',
111
+ label: '群聊权限(允许的频道 ID)',
112
+ placeholder: '* 或 channel_id',
113
+ group: 'advanced',
114
+ hint: '控制哪些频道可以 @机器人',
115
+ },
83
116
  {
84
117
  key: 'share_session_in_channel',
85
118
  label: '共享频道会话',
@@ -93,7 +126,20 @@ export const platformMeta: Record<string, PlatformMeta> = {
93
126
  fields: [
94
127
  { key: 'client_id', label: 'Client ID', required: true },
95
128
  { key: 'client_secret', label: 'Client Secret', required: true, type: 'password' },
96
- { key: 'allow_from', label: 'Allow From', placeholder: '* (all)', group: 'advanced' },
129
+ {
130
+ key: 'allow_from',
131
+ label: '私聊权限(允许的用户 ID)',
132
+ placeholder: '* 或 user_id',
133
+ group: 'advanced',
134
+ hint: '控制哪些用户可以私聊机器人',
135
+ },
136
+ {
137
+ key: 'allow_chat',
138
+ label: '群聊权限(允许的群聊 ID)',
139
+ placeholder: '* 或 chat_id',
140
+ group: 'advanced',
141
+ hint: '控制哪些群聊可以 @机器人',
142
+ },
97
143
  { key: 'share_session_in_channel', label: '共享群会话', type: 'boolean', group: 'advanced' },
98
144
  ],
99
145
  },
@@ -123,7 +169,20 @@ export const platformMeta: Record<string, PlatformMeta> = {
123
169
  placeholder: 'https://qyapi.weixin.qq.com',
124
170
  group: 'advanced',
125
171
  },
126
- { key: 'allow_from', label: 'Allow From', placeholder: '* (all)', group: 'advanced' },
172
+ {
173
+ key: 'allow_from',
174
+ label: '私聊权限(允许的用户 ID)',
175
+ placeholder: '* 或 user_id',
176
+ group: 'advanced',
177
+ hint: '控制哪些用户可以私聊机器人',
178
+ },
179
+ {
180
+ key: 'allow_chat',
181
+ label: '群聊权限(允许的群聊 ID)',
182
+ placeholder: '* 或 chat_id',
183
+ group: 'advanced',
184
+ hint: '控制哪些群聊可以 @机器人',
185
+ },
127
186
  ],
128
187
  },
129
188
  qq: {
@@ -131,7 +190,20 @@ export const platformMeta: Record<string, PlatformMeta> = {
131
190
  fields: [
132
191
  { key: 'ws_url', label: 'WebSocket URL', required: true, placeholder: 'ws://127.0.0.1:3001' },
133
192
  { key: 'token', label: 'Access Token', type: 'password', group: 'advanced' },
134
- { key: 'allow_from', label: 'Allow From', placeholder: '* (all)', group: 'advanced' },
193
+ {
194
+ key: 'allow_from',
195
+ label: '私聊权限(允许的用户 ID)',
196
+ placeholder: '* 或 user_id',
197
+ group: 'advanced',
198
+ hint: '控制哪些用户可以私聊机器人',
199
+ },
200
+ {
201
+ key: 'allow_chat',
202
+ label: '群聊权限(允许的群聊 ID)',
203
+ placeholder: '* 或 group_id',
204
+ group: 'advanced',
205
+ hint: '控制哪些群聊可以 @机器人',
206
+ },
135
207
  { key: 'share_session_in_channel', label: '共享群会话', type: 'boolean', group: 'advanced' },
136
208
  ],
137
209
  },
@@ -141,7 +213,20 @@ export const platformMeta: Record<string, PlatformMeta> = {
141
213
  { key: 'app_id', label: 'App ID', required: true },
142
214
  { key: 'app_secret', label: 'App Secret', required: true, type: 'password' },
143
215
  { key: 'sandbox', label: '沙盒模式', type: 'boolean', group: 'advanced' },
144
- { key: 'allow_from', label: 'Allow From', placeholder: '* (all)', group: 'advanced' },
216
+ {
217
+ key: 'allow_from',
218
+ label: '私聊权限(允许的用户 ID)',
219
+ placeholder: '* 或 user_id',
220
+ group: 'advanced',
221
+ hint: '控制哪些用户可以私聊机器人',
222
+ },
223
+ {
224
+ key: 'allow_chat',
225
+ label: '群聊权限(允许的群聊 ID)',
226
+ placeholder: '* 或 group_id',
227
+ group: 'advanced',
228
+ hint: '控制哪些群聊可以 @机器人',
229
+ },
145
230
  { key: 'share_session_in_channel', label: '共享群会话', type: 'boolean', group: 'advanced' },
146
231
  ],
147
232
  },
@@ -152,7 +237,20 @@ export const platformMeta: Record<string, PlatformMeta> = {
152
237
  { key: 'channel_token', label: 'Channel Token', required: true, type: 'password' },
153
238
  { key: 'port', label: '端口', required: true, placeholder: '8080' },
154
239
  { key: 'callback_path', label: 'Callback Path', placeholder: '/callback', group: 'advanced' },
155
- { key: 'allow_from', label: 'Allow From', placeholder: '* (all)', group: 'advanced' },
240
+ {
241
+ key: 'allow_from',
242
+ label: '私聊权限(允许的用户 ID)',
243
+ placeholder: '* 或 user_id',
244
+ group: 'advanced',
245
+ hint: '控制哪些用户可以私聊机器人',
246
+ },
247
+ {
248
+ key: 'allow_chat',
249
+ label: '群聊权限(允许的群聊 ID)',
250
+ placeholder: '* 或 room_id',
251
+ group: 'advanced',
252
+ hint: '控制哪些群聊可以 @机器人',
253
+ },
156
254
  ],
157
255
  },
158
256
  weibo: {
@@ -160,7 +258,20 @@ export const platformMeta: Record<string, PlatformMeta> = {
160
258
  fields: [
161
259
  { key: 'app_id', label: 'App ID', required: true, placeholder: '1234567890' },
162
260
  { key: 'app_secret', label: 'App Secret', required: true, type: 'password' },
163
- { key: 'allow_from', label: 'Allow From', placeholder: '* (all)', group: 'advanced' },
261
+ {
262
+ key: 'allow_from',
263
+ label: '私聊权限(允许的用户 ID)',
264
+ placeholder: '* 或 user_id',
265
+ group: 'advanced',
266
+ hint: '控制哪些用户可以私聊机器人',
267
+ },
268
+ {
269
+ key: 'allow_chat',
270
+ label: '群聊权限(允许的群聊 ID)',
271
+ placeholder: '* 或 chat_id',
272
+ group: 'advanced',
273
+ hint: '控制哪些群聊可以 @机器人',
274
+ },
164
275
  ],
165
276
  },
166
277
  };
@@ -8,7 +8,7 @@ import { useShallow } from 'zustand/react/shallow';
8
8
  import type { GlobalProvider } from '@shared/types';
9
9
  import type { CcAgentType } from '@shared/types/ccConnect';
10
10
 
11
- type SavePhase = 'idle' | 'saving' | 'restarting' | 'done';
11
+ type SavePhase = 'idle' | 'saving' | 'done';
12
12
 
13
13
  export interface UseTeamEditFormReturn {
14
14
  loading: boolean;
@@ -29,6 +29,8 @@ export interface UseTeamEditFormReturn {
29
29
  setManagedSources: (v: string) => void;
30
30
  feishuAllowFrom: string;
31
31
  setFeishuAllowFrom: (v: string) => void;
32
+ feishuAllowChat: string;
33
+ setFeishuAllowChat: (v: string) => void;
32
34
  disabledCommandsInput: string;
33
35
  setDisabledCommandsInput: (v: string) => void;
34
36
  providerRef: string;
@@ -106,6 +108,13 @@ export function useTeamEditForm(teamName: string, open: boolean): UseTeamEditFor
106
108
  !Array.isArray(rawSettings.platform_allow_from)
107
109
  ? (rawSettings.platform_allow_from as Record<string, string>)
108
110
  : {}),
111
+ platformAllowChat:
112
+ cfg?.platformAllowChat ??
113
+ (typeof (rawSettings as Record<string, unknown>).platform_allow_chat === 'object' &&
114
+ (rawSettings as Record<string, unknown>).platform_allow_chat !== null &&
115
+ !Array.isArray((rawSettings as Record<string, unknown>).platform_allow_chat)
116
+ ? ((rawSettings as Record<string, unknown>).platform_allow_chat as Record<string, string>)
117
+ : {}),
109
118
  providerRefs: data?.providerRefs ?? [],
110
119
  globalProviders: data?.globalProviders ?? [],
111
120
  showContextIndicator:
@@ -134,6 +143,7 @@ export function useTeamEditForm(teamName: string, open: boolean): UseTeamEditFor
134
143
  defaults.disabledCommands.join(', ')
135
144
  );
136
145
  const [feishuAllowFrom, setFeishuAllowFrom] = useState(defaults.platformAllowFrom.feishu ?? '*');
146
+ const [feishuAllowChat, setFeishuAllowChat] = useState(defaults.platformAllowChat.feishu ?? '*');
137
147
  const [providerRef, setProviderRef] = useState(defaults.providerRefs[0] ?? '');
138
148
  const [showContextIndicator, setShowContextIndicator] = useState(defaults.showContextIndicator);
139
149
  const [replyFooter, setReplyFooter] = useState(defaults.replyFooter);
@@ -142,7 +152,7 @@ export function useTeamEditForm(teamName: string, open: boolean): UseTeamEditFor
142
152
  // ── Single async lifecycle state ─────────────────────────────
143
153
  const [savePhase, setSavePhase] = useState<SavePhase>('idle');
144
154
  const [error, setError] = useState<string | null>(null);
145
- const saving = savePhase === 'saving' || savePhase === 'restarting';
155
+ const saving = savePhase === 'saving';
146
156
 
147
157
  // ── Refs ─────────────────────────────────────────────────────
148
158
  const defaultsRef = useRef(defaults);
@@ -170,6 +180,7 @@ export function useTeamEditForm(teamName: string, open: boolean): UseTeamEditFor
170
180
  setManagedSources(d.managedSources);
171
181
  setDisabledCommandsInput(d.disabledCommands.join(', '));
172
182
  setFeishuAllowFrom(d.platformAllowFrom.feishu ?? '*');
183
+ setFeishuAllowChat(d.platformAllowChat.feishu ?? '*');
173
184
  setProviderRef(d.providerRefs[0] ?? '');
174
185
  setShowContextIndicator(d.showContextIndicator);
175
186
  setReplyFooter(d.replyFooter);
@@ -204,6 +215,7 @@ export function useTeamEditForm(teamName: string, open: boolean): UseTeamEditFor
204
215
  .map((e) => e.trim())
205
216
  .filter((e) => e.length > 0);
206
217
  const feishu = feishuAllowFrom.trim();
218
+ const feishuChat = feishuAllowChat.trim();
207
219
 
208
220
  setSavePhase('saving');
209
221
  setError(null);
@@ -224,12 +236,10 @@ export function useTeamEditForm(teamName: string, open: boolean): UseTeamEditFor
224
236
  managedSources: managedSources.trim() || undefined,
225
237
  disabledCommands,
226
238
  platformAllowFrom: feishu ? { feishu } : {},
239
+ platformAllowChat: feishuChat ? { feishu: feishuChat } : {},
227
240
  providerRefs: providerRef ? [providerRef] : [],
228
241
  });
229
242
 
230
- setSavePhase('restarting');
231
- await api.ccSettings.restart();
232
-
233
243
  await Promise.all([fetchTeams(), selectTeam(teamName)]);
234
244
  setSavePhase('done');
235
245
  } catch (err) {
@@ -258,6 +268,8 @@ export function useTeamEditForm(teamName: string, open: boolean): UseTeamEditFor
258
268
  setManagedSources,
259
269
  feishuAllowFrom,
260
270
  setFeishuAllowFrom,
271
+ feishuAllowChat,
272
+ setFeishuAllowChat,
261
273
  disabledCommandsInput,
262
274
  setDisabledCommandsInput,
263
275
  providerRef,
@@ -589,7 +589,7 @@ const RootDropZone = React.forwardRef<
589
589
  <div
590
590
  ref={combinedRef}
591
591
  className={`scrollbar-thin h-full overflow-y-auto transition-colors ${
592
- isDropTarget ? 'bg-blue-400/5 ring-1 ring-inset ring-blue-400/30' : ''
592
+ isDropTarget ? 'bg-indigo-400/5 ring-1 ring-inset ring-indigo-400/30' : ''
593
593
  }`}
594
594
  role="tree"
595
595
  >
@@ -709,8 +709,8 @@ const DraggableTreeItem = React.memo(
709
709
  className={`flex h-full cursor-pointer select-none items-center gap-1 truncate px-2 text-xs transition-colors hover:bg-surface-raised ${
710
710
  isSelected ? 'bg-surface-raised text-text' : 'text-text-secondary'
711
711
  } ${isDragging ? 'opacity-30' : ''} ${
712
- isDropTarget ? 'rounded bg-blue-400/10 ring-2 ring-blue-400/50' : ''
713
- } ${isInsideDropTarget && !isDropTarget ? 'border-l-2 border-l-blue-400/40 bg-blue-400/5' : ''}`}
712
+ isDropTarget ? 'rounded bg-indigo-400/10 ring-2 ring-indigo-400/50' : ''
713
+ } ${isInsideDropTarget && !isDropTarget ? 'border-l-2 border-l-indigo-400/40 bg-indigo-400/5' : ''}`}
714
714
  style={{ paddingLeft: `${visualDepth * INDENT_PX + 8}px` }}
715
715
  onClick={handleClick}
716
716
  onKeyDown={handleKeyDown}
@@ -843,7 +843,7 @@ const InlineRenameInput = ({
843
843
  }}
844
844
  onBlur={() => requestAnimationFrame(() => inputRef.current?.focus())}
845
845
  onClick={(e) => e.stopPropagation()}
846
- className="min-w-0 flex-1 rounded border border-blue-400/50 bg-surface px-1 py-0 text-xs text-text outline-none focus:ring-1 focus:ring-blue-400/50"
846
+ className="min-w-0 flex-1 rounded border border-indigo-400/50 bg-surface px-1 py-0 text-xs text-text outline-none focus:ring-1 focus:ring-indigo-400/50"
847
847
  />
848
848
  );
849
849
  };
@@ -76,7 +76,7 @@ const SearchToggleButton = React.memo(function SearchToggleButton({
76
76
  className={cn(
77
77
  'flex size-[22px] items-center justify-center rounded transition-colors',
78
78
  active
79
- ? 'bg-blue-500/20 text-blue-400'
79
+ ? 'bg-indigo-500/20 text-indigo-400'
80
80
  : 'text-[var(--color-text-muted)] hover:bg-[var(--color-surface-raised)] hover:text-[var(--color-text-secondary)]'
81
81
  )}
82
82
  onClick={onClick}
@@ -107,7 +107,7 @@ export const MarkdownSplitView = React.memo(function MarkdownSplitView({
107
107
  // eslint-disable-next-line jsx-a11y/no-static-element-interactions -- resize handle
108
108
  <div
109
109
  className={`shrink-0 cursor-col-resize border-x border-border transition-colors ${
110
- isResizing ? 'bg-blue-500/50' : 'hover:bg-blue-500/30'
110
+ isResizing ? 'bg-indigo-500/50' : 'hover:bg-indigo-500/30'
111
111
  }`}
112
112
  style={{ width: HANDLE_WIDTH }}
113
113
  onMouseDown={handleMouseDown}
@@ -121,7 +121,7 @@ export const NewFileDialog = ({
121
121
  onKeyDown={handleKeyDown}
122
122
  onBlur={() => requestAnimationFrame(() => inputRef.current?.focus())}
123
123
  placeholder={type === 'file' ? '文件名...' : '文件夹名...'}
124
- className="min-w-0 flex-1 rounded border border-border-emphasis bg-surface px-1.5 py-0.5 text-xs text-text outline-none focus:border-blue-500"
124
+ className="min-w-0 flex-1 rounded border border-border-emphasis bg-surface px-1.5 py-0.5 text-xs text-text outline-none focus:border-indigo-500"
125
125
  aria-label={type === 'file' ? '新文件名' : '新文件夹名'}
126
126
  />
127
127
  </div>
@@ -720,7 +720,7 @@ export const ProjectEditorOverlay = ({
720
720
 
721
721
  {/* External change banner */}
722
722
  {activeTabId && externalChanges[activeTabId] && (
723
- <div className="flex shrink-0 items-center gap-2 border-b border-blue-400/30 bg-blue-100/50 px-3 py-1.5 text-xs text-blue-700 dark:border-blue-500/30 dark:bg-blue-500/10 dark:text-blue-300">
723
+ <div className="flex shrink-0 items-center gap-2 border-b border-indigo-400/30 bg-blue-100/50 px-3 py-1.5 text-xs text-blue-700 dark:border-indigo-500/30 dark:bg-indigo-500/10 dark:text-indigo-300">
724
724
  <RefreshCw className="size-3.5 shrink-0" />
725
725
  <span>
726
726
  {externalChanges[activeTabId] === 'delete'
@@ -193,7 +193,7 @@ export const SearchInFilesPanel = ({
193
193
  onClick={handleCaseSensitiveToggle}
194
194
  className={`rounded px-1.5 py-0.5 text-[10px] font-medium transition-colors ${
195
195
  caseSensitive
196
- ? 'bg-blue-500/20 text-blue-400'
196
+ ? 'bg-indigo-500/20 text-indigo-400'
197
197
  : 'text-text-muted hover:bg-surface-raised'
198
198
  }`}
199
199
  aria-label="区分大小写"
@@ -37,19 +37,19 @@ const COLUMN_ACCENTS: Record<
37
37
  { headerBg: string; bodyBg: string; icon: React.ReactNode }
38
38
  > = {
39
39
  todo: {
40
- headerBg: 'rgba(59, 130, 246, 0.22)',
41
- bodyBg: 'rgba(59, 130, 246, 0.05)',
42
- icon: <ClipboardList size={14} className="shrink-0 text-[var(--color-text-muted)]" />,
40
+ headerBg: 'rgba(148, 163, 184, 0.08)',
41
+ bodyBg: 'rgba(148, 163, 184, 0.02)',
42
+ icon: <ClipboardList size={13} className="shrink-0 text-[var(--color-text-muted)]" />,
43
43
  },
44
44
  in_progress: {
45
- headerBg: 'rgba(234, 179, 8, 0.24)',
46
- bodyBg: 'rgba(234, 179, 8, 0.06)',
47
- icon: <PlayCircle size={14} className="shrink-0 text-[var(--color-text-muted)]" />,
45
+ headerBg: 'rgba(6, 182, 212, 0.08)',
46
+ bodyBg: 'rgba(6, 182, 212, 0.02)',
47
+ icon: <PlayCircle size={13} className="shrink-0 text-cyan-400/60" />,
48
48
  },
49
49
  done: {
50
- headerBg: 'rgba(34, 197, 94, 0.22)',
51
- bodyBg: 'rgba(34, 197, 94, 0.05)',
52
- icon: <CheckCircle2 size={14} className="shrink-0 text-[var(--color-text-muted)]" />,
50
+ headerBg: 'rgba(34, 197, 94, 0.08)',
51
+ bodyBg: 'rgba(34, 197, 94, 0.02)',
52
+ icon: <CheckCircle2 size={13} className="shrink-0 text-green-400/60" />,
53
53
  },
54
54
  };
55
55
 
@@ -91,7 +91,7 @@ export const KanbanFilterPopover = ({
91
91
  >
92
92
  <Filter size={14} />
93
93
  {activeCount > 0 && (
94
- <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">
94
+ <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">
95
95
  {activeCount}
96
96
  </span>
97
97
  )}
@@ -111,7 +111,7 @@ export const KanbanFilterPopover = ({
111
111
  type="button"
112
112
  className={`w-full rounded-md px-2 py-1.5 text-left text-xs transition-colors ${
113
113
  filter.sessionId === null
114
- ? 'bg-blue-500/15 text-blue-300'
114
+ ? 'bg-indigo-500/15 text-indigo-300'
115
115
  : 'text-[var(--color-text-secondary)] hover:bg-[var(--color-surface-raised)]'
116
116
  }`}
117
117
  onClick={() => handleSessionSelect(null)}
@@ -128,12 +128,12 @@ export const KanbanFilterPopover = ({
128
128
  type="button"
129
129
  className={`flex w-full items-center gap-1.5 rounded-md px-2 py-1.5 text-left text-xs transition-colors ${
130
130
  isSelected
131
- ? 'bg-blue-500/15 text-blue-300'
131
+ ? 'bg-indigo-500/15 text-indigo-300'
132
132
  : 'text-[var(--color-text-secondary)] hover:bg-[var(--color-surface-raised)]'
133
133
  }`}
134
134
  onClick={() => handleSessionSelect(isSelected ? null : session.id)}
135
135
  >
136
- {isLead && <Crown size={11} className="shrink-0 text-blue-400" />}
136
+ {isLead && <Crown size={11} className="shrink-0 text-indigo-400" />}
137
137
  <span className="truncate">{label}</span>
138
138
  </button>
139
139
  );
@@ -228,7 +228,7 @@ const TaskSuggestionItem = React.memo(function TaskSuggestionItem({
228
228
  case 'pending':
229
229
  return 'bg-zinc-500/15 text-zinc-400';
230
230
  case 'in_progress':
231
- return 'bg-blue-500/15 text-blue-400';
231
+ return 'bg-indigo-500/15 text-indigo-400';
232
232
  case 'completed':
233
233
  return 'bg-emerald-500/15 text-emerald-400';
234
234
  case 'deleted':
@@ -66,7 +66,7 @@ export const KanbanSortPopover = ({
66
66
  >
67
67
  <ArrowUpDown size={14} />
68
68
  {isNonDefault && (
69
- <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">
69
+ <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">
70
70
  1
71
71
  </span>
72
72
  )}
@@ -90,7 +90,7 @@ export const KanbanSortPopover = ({
90
90
  className={cn(
91
91
  'flex w-full items-center gap-2.5 rounded-md px-2 py-1.5 text-left text-xs transition-colors',
92
92
  isSelected
93
- ? 'bg-blue-500/15 text-blue-300'
93
+ ? 'bg-indigo-500/15 text-indigo-300'
94
94
  : 'text-[var(--color-text-secondary)] hover:bg-[var(--color-surface-raised)]'
95
95
  )}
96
96
  onClick={() => onSortChange({ field: option.field })}
@@ -98,7 +98,7 @@ export const KanbanSortPopover = ({
98
98
  <span
99
99
  className={cn(
100
100
  'shrink-0',
101
- isSelected ? 'text-blue-400' : 'text-[var(--color-text-muted)]'
101
+ isSelected ? 'text-indigo-400' : 'text-[var(--color-text-muted)]'
102
102
  )}
103
103
  >
104
104
  {option.icon}
@@ -108,14 +108,14 @@ export const KanbanSortPopover = ({
108
108
  <div
109
109
  className={cn(
110
110
  'text-[10px]',
111
- isSelected ? 'text-blue-300/70' : 'text-[var(--color-text-muted)]'
111
+ isSelected ? 'text-indigo-300/70' : 'text-[var(--color-text-muted)]'
112
112
  )}
113
113
  >
114
114
  {option.description}
115
115
  </div>
116
116
  </div>
117
117
  {isSelected && (
118
- <ArrowDownUp size={12} className="ml-auto shrink-0 text-blue-400" />
118
+ <ArrowDownUp size={12} className="ml-auto shrink-0 text-indigo-400" />
119
119
  )}
120
120
  </button>
121
121
  );
@@ -63,8 +63,8 @@ const DISPATCH_STATUS_STYLE: Record<string, { bg: string; text: string; label: s
63
63
  text: 'text-yellow-600 dark:text-yellow-400',
64
64
  label: '已派发',
65
65
  },
66
- received: { bg: 'bg-blue-500/15', text: 'text-blue-600 dark:text-blue-400', label: '已接收' },
67
- in_progress: { bg: 'bg-blue-500/15', text: 'text-blue-600 dark:text-blue-400', label: '执行中' },
66
+ received: { bg: 'bg-indigo-500/15', text: 'text-indigo-600 dark:text-indigo-400', label: '已接收' },
67
+ in_progress: { bg: 'bg-indigo-500/15', text: 'text-indigo-600 dark:text-indigo-400', label: '执行中' },
68
68
  completed: {
69
69
  bg: 'bg-emerald-500/15',
70
70
  text: 'text-emerald-600 dark:text-emerald-400',
@@ -355,7 +355,7 @@ export const KanbanTaskCard = memo(
355
355
  className={`mt-1 inline-flex items-center gap-1 rounded-full px-1.5 py-0.5 text-[10px] font-medium ${
356
356
  task.needsClarification === 'user'
357
357
  ? 'bg-red-500/15 text-red-400'
358
- : 'bg-blue-500/15 text-blue-600 dark:text-blue-400'
358
+ : 'bg-indigo-500/15 text-indigo-600 dark:text-indigo-400'
359
359
  }`}
360
360
  >
361
361
  <HelpCircle size={10} />
@@ -392,7 +392,7 @@ export const KanbanTaskCard = memo(
392
392
 
393
393
  {hasBlocks ? (
394
394
  <div className="mb-2 flex flex-wrap items-center gap-1">
395
- <span className="inline-flex items-center gap-0.5 text-[10px] text-blue-600 dark:text-blue-400">
395
+ <span className="inline-flex items-center gap-0.5 text-[10px] text-indigo-600 dark:text-indigo-400">
396
396
  <ArrowRightFromLine size={10} />
397
397
  阻塞
398
398
  </span>
@@ -607,55 +607,22 @@ export const MemberCard = ({
607
607
  className="shrink-0"
608
608
  title={totalTasks > 0 ? `${completed}/${totalTasks} completed` : undefined}
609
609
  >
610
- <Badge
611
- variant="secondary"
612
- className="shrink-0 px-1.5 py-0.5 text-[10px] font-normal leading-none"
613
- >
614
- {member.taskCount} {member.taskCount === 1 ? 'task' : 'tasks'}
615
- </Badge>
616
610
  {totalTasks > 0 && (
617
- <div className="mx-0.5 mt-0.5 h-[2px] rounded-full bg-[var(--color-border)]">
618
- <div
619
- className="h-full rounded-full bg-emerald-500 transition-all duration-500"
620
- style={{ width: `${progressPercent}%` }}
621
- />
622
- </div>
623
- )}
624
- {/* NOTE: lead context bar disabled — usage formula is inaccurate */}
625
- </div>
626
- )}
627
- {!isRemoved && (
628
- <div className="flex shrink-0 items-center gap-0.5">
629
- <Tooltip>
630
- <TooltipTrigger asChild>
631
- <button
632
- type="button"
633
- className="rounded p-1 text-[var(--color-text-muted)] transition-colors hover:bg-[var(--color-surface)] hover:text-[var(--color-text)]"
634
- onClick={(e) => {
635
- e.stopPropagation();
636
- onSendMessage?.();
637
- }}
638
- >
639
- <MessageSquare size={13} />
640
- </button>
641
- </TooltipTrigger>
642
- <TooltipContent side="bottom">发送消息</TooltipContent>
643
- </Tooltip>
644
- <Tooltip>
645
- <TooltipTrigger asChild>
646
- <button
647
- type="button"
648
- className="rounded p-1 text-[var(--color-text-muted)] transition-colors hover:bg-[var(--color-surface)] hover:text-[var(--color-text)]"
649
- onClick={(e) => {
650
- e.stopPropagation();
651
- onAssignTask?.();
652
- }}
611
+ <>
612
+ <Badge
613
+ variant="secondary"
614
+ className="shrink-0 px-1.5 py-0.5 text-[10px] font-normal leading-none"
653
615
  >
654
- <Plus size={13} />
655
- </button>
656
- </TooltipTrigger>
657
- <TooltipContent side="bottom">分配任务</TooltipContent>
658
- </Tooltip>
616
+ {completed}/{totalTasks}
617
+ </Badge>
618
+ <div className="mx-0.5 mt-0.5 h-[2px] rounded-full bg-[var(--color-border)]">
619
+ <div
620
+ className="h-full rounded-full bg-emerald-500 transition-all duration-500"
621
+ style={{ width: `${progressPercent}%` }}
622
+ />
623
+ </div>
624
+ </>
625
+ )}
659
626
  </div>
660
627
  )}
661
628
  </div>