@yancyyu/openhermit 1.6.37 → 1.6.39

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 (205) hide show
  1. package/dist-renderer/assets/ProjectEditorOverlay-krO5vQxX.js +58 -0
  2. package/dist-renderer/assets/{TeamGraphOverlay-DYT3bwFR.js → TeamGraphOverlay-DqhQzcTr.js} +1 -1
  3. package/dist-renderer/assets/{_basePickBy-Dbt_EU-e.js → _basePickBy-B7kSYPxr.js} +1 -1
  4. package/dist-renderer/assets/{_baseUniq-DWo68sXI.js → _baseUniq-CnjxqwAk.js} +1 -1
  5. package/dist-renderer/assets/{arc-DXH1iZQK.js → arc-CLeZuINP.js} +1 -1
  6. package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-cjffS2Qr.js → architectureDiagram-VXUJARFQ-QKtqaqdY.js} +1 -1
  7. package/dist-renderer/assets/{blockDiagram-VD42YOAC-BKdZF02Y.js → blockDiagram-VD42YOAC-BqdrzO_f.js} +1 -1
  8. package/dist-renderer/assets/{c4Diagram-YG6GDRKO-CN27pqaI.js → c4Diagram-YG6GDRKO-gwPlCxDC.js} +1 -1
  9. package/dist-renderer/assets/channel-DpMHF50r.js +1 -0
  10. package/dist-renderer/assets/{chunk-4BX2VUAB-CXPCI7g_.js → chunk-4BX2VUAB-C6XLurL4.js} +1 -1
  11. package/dist-renderer/assets/{chunk-55IACEB6-BGAXQZRC.js → chunk-55IACEB6-Ds6quhEP.js} +1 -1
  12. package/dist-renderer/assets/{chunk-B4BG7PRW-TPDaA_KQ.js → chunk-B4BG7PRW-5UlA1_e9.js} +1 -1
  13. package/dist-renderer/assets/{chunk-DI55MBZ5-D1ADe_tq.js → chunk-DI55MBZ5-ywFrqIsY.js} +1 -1
  14. package/dist-renderer/assets/{chunk-FMBD7UC4-Beimtg3a.js → chunk-FMBD7UC4-C7ifUA17.js} +1 -1
  15. package/dist-renderer/assets/{chunk-QN33PNHL-OjNBu854.js → chunk-QN33PNHL-BxGCo80U.js} +1 -1
  16. package/dist-renderer/assets/{chunk-QZHKN3VN-DinqvbH8.js → chunk-QZHKN3VN-B2CuaZs6.js} +1 -1
  17. package/dist-renderer/assets/{chunk-TZMSLE5B-BfFtlPSZ.js → chunk-TZMSLE5B-Ds1hInvp.js} +1 -1
  18. package/dist-renderer/assets/classDiagram-2ON5EDUG-CBYCBVRl.js +1 -0
  19. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-CBYCBVRl.js +1 -0
  20. package/dist-renderer/assets/clone-DcMF6Psb.js +1 -0
  21. package/dist-renderer/assets/{cose-bilkent-S5V4N54A-D9z9Dgt7.js → cose-bilkent-S5V4N54A-Cz1GVtLp.js} +1 -1
  22. package/dist-renderer/assets/{dagre-6UL2VRFP-n1g-DhEE.js → dagre-6UL2VRFP-BrmR-P4h.js} +1 -1
  23. package/dist-renderer/assets/{diagram-PSM6KHXK-BvxFq-BE.js → diagram-PSM6KHXK-DbNjC5Rg.js} +1 -1
  24. package/dist-renderer/assets/{diagram-QEK2KX5R-wVnJuwza.js → diagram-QEK2KX5R-qkRX5_Mq.js} +1 -1
  25. package/dist-renderer/assets/{diagram-S2PKOQOG-B707WJQw.js → diagram-S2PKOQOG-CyL5rCv2.js} +1 -1
  26. package/dist-renderer/assets/{erDiagram-Q2GNP2WA-C-_1dGHs.js → erDiagram-Q2GNP2WA-Dox3-bA5.js} +1 -1
  27. package/dist-renderer/assets/{flowDiagram-NV44I4VS-CMTSi3H6.js → flowDiagram-NV44I4VS-BtkaxlDL.js} +1 -1
  28. package/dist-renderer/assets/{ganttDiagram-JELNMOA3-DZ0bNrAA.js → ganttDiagram-JELNMOA3-Dhy_d9GK.js} +1 -1
  29. package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-DNVfGooQ.js → gitGraphDiagram-V2S2FVAM-B5XRhIQA.js} +1 -1
  30. package/dist-renderer/assets/{graph-865j_tM_.js → graph-CsoEwUhS.js} +1 -1
  31. package/dist-renderer/assets/{index-C_F9N5x-.js → index-BWPWmJNo.js} +1 -1
  32. package/dist-renderer/assets/{index-LwDIsXJN.js → index-Bu2R-Se7.js} +586 -740
  33. package/dist-renderer/assets/index-CnWV3BhG.css +32 -0
  34. package/dist-renderer/assets/{index-DuUaf8at.js → index-D-3KgskL.js} +1 -1
  35. package/dist-renderer/assets/{index-BTx1nc4T.js → index-DGEBzLNT.js} +1 -1
  36. package/dist-renderer/assets/{index-2EW-eu3q.js → index-NhHNs2Oo.js} +1 -1
  37. package/dist-renderer/assets/{index-4dEMStJj.js → index-h17WuEyf.js} +1 -1
  38. package/dist-renderer/assets/{infoDiagram-HS3SLOUP-CyqtElLq.js → infoDiagram-HS3SLOUP-hMGmNojH.js} +1 -1
  39. package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-BvjQ0Hm0.js → journeyDiagram-XKPGCS4Q-DXV2rBDl.js} +1 -1
  40. package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-CJJ-k0zT.js → kanban-definition-3W4ZIXB7-Bf99WLRy.js} +1 -1
  41. package/dist-renderer/assets/{layout-CnV6rQAG.js → layout-C3XWrpwo.js} +1 -1
  42. package/dist-renderer/assets/{linear-Cw3UQgyX.js → linear-OEEcn8KN.js} +1 -1
  43. package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-C5tDaGSK.js → mindmap-definition-VGOIOE7T-Dpi3S2x4.js} +1 -1
  44. package/dist-renderer/assets/{pieDiagram-ADFJNKIX-CiIpPsau.js → pieDiagram-ADFJNKIX-xTPPhtNx.js} +1 -1
  45. package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-C3gtowNj.js → quadrantDiagram-AYHSOK5B-euniyDlz.js} +1 -1
  46. package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-CXBTrAnU.js → requirementDiagram-UZGBJVZJ-D9Uiw4kF.js} +1 -1
  47. package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-wziX77xG.js → sankeyDiagram-TZEHDZUN-CySU4nED.js} +1 -1
  48. package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-sYqopcrj.js → sequenceDiagram-WL72ISMW-JVGpET6V.js} +1 -1
  49. package/dist-renderer/assets/splashScene-D0YB9uxm.js +17 -0
  50. package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-Bl1-0_Cp.js → stateDiagram-FKZM4ZOC-B2FY5qqi.js} +1 -1
  51. package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-DcoMiR8H.js +1 -0
  52. package/dist-renderer/assets/{timeline-definition-IT6M3QCI-CIRjJUBo.js → timeline-definition-IT6M3QCI-DmycNUUe.js} +1 -1
  53. package/dist-renderer/assets/{treemap-GDKQZRPO-CVPuNe1n.js → treemap-GDKQZRPO-DPq4gZuB.js} +1 -1
  54. package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-3nT9yHwp.js → xychartDiagram-PRI3JC2R-J6VVJzRq.js} +1 -1
  55. package/dist-renderer/index.html +20 -53
  56. package/package.json +25 -18
  57. package/src/main/ipc/extensions.ts +30 -50
  58. package/src/main/server.ts +890 -247
  59. package/src/main/services/extensions/ExtensionFacadeService.ts +4 -56
  60. package/src/main/services/extensions/catalog/PluginCatalogService.ts +4 -2
  61. package/src/main/services/extensions/library/McpLibraryService.ts +243 -0
  62. package/src/main/services/session-intelligence/ConversationTelemetryService.ts +1101 -0
  63. package/src/main/services/session-intelligence/LocalSessionScanner.ts +512 -0
  64. package/src/main/services/session-intelligence/SessionUsageParser.ts +4 -4
  65. package/src/main/services/session-intelligence/UsageTelemetryService.ts +14 -1
  66. package/src/main/services/system-manager/SystemManagerConfigService.ts +122 -0
  67. package/src/main/services/system-manager/SystemManagerPtyService.ts +233 -0
  68. package/src/main/services/system-manager/WorkflowPromptService.ts +75 -0
  69. package/src/main/services/teams-mvp/TaskDispatchService.ts +32 -8
  70. package/src/main/services/teams-mvp/TeamProvisioningService.ts +39 -2
  71. package/src/main/services/teams-mvp/TeamWorkspaceService.ts +22 -4
  72. package/src/main/utils/teamProjectResolution.ts +15 -0
  73. package/src/renderer/App.tsx +8 -4
  74. package/src/renderer/api/httpClient.ts +174 -38
  75. package/src/renderer/api/providers.ts +23 -2
  76. package/src/renderer/assets/participant-avatars/01.svg +3 -0
  77. package/src/renderer/assets/participant-avatars/02.svg +3 -0
  78. package/src/renderer/assets/participant-avatars/03.svg +3 -0
  79. package/src/renderer/assets/participant-avatars/04.svg +3 -0
  80. package/src/renderer/assets/participant-avatars/05.svg +3 -0
  81. package/src/renderer/assets/participant-avatars/06.svg +3 -0
  82. package/src/renderer/assets/participant-avatars/07.svg +3 -0
  83. package/src/renderer/assets/participant-avatars/08.svg +3 -0
  84. package/src/renderer/assets/participant-avatars/09.svg +3 -0
  85. package/src/renderer/assets/participant-avatars/10.svg +3 -0
  86. package/src/renderer/assets/participant-avatars/11.svg +3 -0
  87. package/src/renderer/assets/participant-avatars/12.svg +3 -0
  88. package/src/renderer/assets/participant-avatars/13.svg +3 -0
  89. package/src/renderer/components/common/TerminalPane.tsx +213 -0
  90. package/src/renderer/components/dashboard/DashboardView.tsx +9 -36
  91. package/src/renderer/components/extensions/ExtensionStoreView.tsx +12 -221
  92. package/src/renderer/components/extensions/ExtensionsSubTabTrigger.tsx +1 -1
  93. package/src/renderer/components/extensions/mcp/McpLibraryEnableDialog.tsx +305 -0
  94. package/src/renderer/components/extensions/mcp/McpLibraryEntryDialog.tsx +418 -0
  95. package/src/renderer/components/extensions/mcp/McpLibraryPanel.tsx +404 -0
  96. package/src/renderer/components/extensions/plugins/PluginCard.tsx +10 -2
  97. package/src/renderer/components/extensions/plugins/PluginsPanel.tsx +40 -22
  98. package/src/renderer/components/extensions/skills/SkillsLibraryPanel.tsx +335 -0
  99. package/src/renderer/components/layout/PaneContent.tsx +8 -1
  100. package/src/renderer/components/layout/Sidebar.tsx +11 -54
  101. package/src/renderer/components/layout/SortableTab.tsx +20 -31
  102. package/src/renderer/components/layout/TabBar.tsx +1 -1
  103. package/src/renderer/components/layout/TabContextMenu.tsx +1 -1
  104. package/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx +768 -157
  105. package/src/renderer/components/schedules/SchedulesView.tsx +51 -462
  106. package/src/renderer/components/schedules/calendar/CalendarDayView.tsx +173 -0
  107. package/src/renderer/components/schedules/calendar/CalendarEventBlock.tsx +113 -0
  108. package/src/renderer/components/schedules/calendar/CalendarHeader.tsx +148 -0
  109. package/src/renderer/components/schedules/calendar/CalendarMonthView.tsx +142 -0
  110. package/src/renderer/components/schedules/calendar/CalendarWeekView.tsx +219 -0
  111. package/src/renderer/components/schedules/calendar/ScheduleCalendarBoard.tsx +41 -0
  112. package/src/renderer/components/schedules/calendar/TeamGanttView.tsx +405 -0
  113. package/src/renderer/components/schedules/calendar/computeOccurrences.ts +234 -0
  114. package/src/renderer/components/schedules/calendar/index.ts +2 -0
  115. package/src/renderer/components/schedules/calendar/types.ts +44 -0
  116. package/src/renderer/components/settings/SettingsTabs.tsx +50 -55
  117. package/src/renderer/components/settings/SettingsView.tsx +30 -35
  118. package/src/renderer/components/settings/components/SettingsSectionHeader.tsx +5 -1
  119. package/src/renderer/components/settings/components/SettingsSelect.tsx +5 -3
  120. package/src/renderer/components/settings/components/SettingsToggle.tsx +2 -2
  121. package/src/renderer/components/settings/sections/AdvancedSection.tsx +11 -42
  122. package/src/renderer/components/settings/sections/CliStatusSection.tsx +71 -112
  123. package/src/renderer/components/settings/sections/ConfigEditorDialog.tsx +1 -1
  124. package/src/renderer/components/settings/sections/GeneralSection.tsx +11 -3
  125. package/src/renderer/components/settings/sections/HarnessSection.tsx +18 -14
  126. package/src/renderer/components/settings/sections/PlatformsSection.tsx +3 -3
  127. package/src/renderer/components/settings/sections/TaskBusSection.tsx +33 -40
  128. package/src/renderer/components/settings/sections/index.ts +0 -1
  129. package/src/renderer/components/sidebar/SidebarSessions.tsx +182 -4
  130. package/src/renderer/components/sidebar/SidebarTaskItem.tsx +4 -4
  131. package/src/renderer/components/sidebar/WorkspaceBrowser.tsx +39 -4
  132. package/src/renderer/components/splash/splashScene.ts +121 -929
  133. package/src/renderer/components/system-manager/FolderBrowser.tsx +163 -0
  134. package/src/renderer/components/system-manager/SystemManagerView.tsx +351 -0
  135. package/src/renderer/components/tasks/TasksView.tsx +112 -134
  136. package/src/renderer/components/team/CcSessionsSection.tsx +431 -89
  137. package/src/renderer/components/team/CollapsibleTeamSection.tsx +17 -32
  138. package/src/renderer/components/team/TeamDetailView.tsx +325 -114
  139. package/src/renderer/components/team/TeamListView.tsx +108 -123
  140. package/src/renderer/components/team/dialogs/CreateTaskDialog.tsx +2 -2
  141. package/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +84 -306
  142. package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +259 -342
  143. package/src/renderer/components/team/dialogs/GlobalTaskDetailDialog.tsx +1 -1
  144. package/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx +17 -15
  145. package/src/renderer/components/team/dialogs/PlatformBindingDialog.tsx +221 -0
  146. package/src/renderer/components/team/dialogs/PlatformManualForm.tsx +7 -0
  147. package/src/renderer/components/team/dialogs/PlatformSetupQR.tsx +1 -1
  148. package/src/renderer/components/team/dialogs/RuntimeConfigDialog.tsx +361 -0
  149. package/src/renderer/components/team/dialogs/platformMeta.ts +122 -11
  150. package/src/renderer/components/team/dialogs/useTeamEditForm.ts +17 -5
  151. package/src/renderer/components/team/kanban/KanbanBoard.tsx +9 -9
  152. package/src/renderer/components/team/members/MemberCard.tsx +14 -47
  153. package/src/renderer/components/team/members/MemberDetailDialog.tsx +3 -95
  154. package/src/renderer/components/team/members/MemberDetailStats.tsx +50 -65
  155. package/src/renderer/components/team/messages/MessageComposer.tsx +8 -110
  156. package/src/renderer/components/team/messages/MessagesPanel.tsx +131 -114
  157. package/src/renderer/components/team/schedule/ScheduleStatusBadge.tsx +2 -2
  158. package/src/renderer/components/team/tools/AddMcpInline.tsx +57 -0
  159. package/src/renderer/components/team/tools/AddSkillInline.tsx +61 -0
  160. package/src/renderer/components/team/tools/McpChip.tsx +45 -0
  161. package/src/renderer/components/team/tools/SkillChip.tsx +35 -0
  162. package/src/renderer/components/team/tools/ToolsSection.tsx +556 -0
  163. package/src/renderer/hooks/useExtensionsTabState.ts +3 -114
  164. package/src/renderer/index.css +39 -22
  165. package/src/renderer/index.html +17 -50
  166. package/src/renderer/store/index.ts +2 -1
  167. package/src/renderer/store/slices/scheduleSlice.ts +1 -1
  168. package/src/renderer/store/slices/teamSlice.ts +45 -168
  169. package/src/renderer/utils/claudeCodeOnlyProviders.ts +3 -10
  170. package/src/renderer/utils/memberHelpers.ts +5 -17
  171. package/src/renderer/utils/openCodeRuntimeDeliveryDiagnostics.ts +4 -2
  172. package/src/renderer/utils/providerSlashCommands.ts +0 -5
  173. package/src/renderer/utils/scheduleFormatters.ts +3 -1
  174. package/src/renderer/utils/teamMessageFiltering.ts +14 -1
  175. package/src/renderer/utils/teamModelAvailability.ts +18 -2
  176. package/src/shared/types/api.ts +121 -2
  177. package/src/shared/types/ccConnect.ts +2 -0
  178. package/src/shared/types/extensions/api.ts +9 -0
  179. package/src/shared/types/extensions/index.ts +4 -0
  180. package/src/shared/types/extensions/mcp.ts +41 -0
  181. package/src/shared/types/index.ts +3 -0
  182. package/src/shared/types/systemManager.ts +49 -0
  183. package/src/shared/types/team.ts +29 -0
  184. package/src/shared/types/terminal.ts +4 -2
  185. package/src/shared/utils/extensionNormalizers.ts +29 -0
  186. package/src/shared/utils/providerExtensionCapabilities.ts +2 -2
  187. package/dist-renderer/assets/ProjectEditorOverlay-Va_Vz-zz.js +0 -52
  188. package/dist-renderer/assets/channel-5dJIx68e.js +0 -1
  189. package/dist-renderer/assets/classDiagram-2ON5EDUG-BMGXWJ2d.js +0 -1
  190. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-BMGXWJ2d.js +0 -1
  191. package/dist-renderer/assets/clone-D7FWfGY9.js +0 -1
  192. package/dist-renderer/assets/index-B2z_IyRH.css +0 -1
  193. package/dist-renderer/assets/splashScene-C8lWNnm4.js +0 -1
  194. package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-DOYYvDbi.js +0 -1
  195. package/src/main/services/extensions/catalog/GlamaMcpEnrichmentService.ts +0 -190
  196. package/src/main/services/extensions/catalog/McpCatalogAggregator.ts +0 -150
  197. package/src/main/services/extensions/catalog/OfficialMcpRegistryService.ts +0 -381
  198. package/src/main/services/extensions/install/McpInstallService.ts +0 -407
  199. package/src/main/services/extensions/state/McpInstallationStateService.ts +0 -42
  200. package/src/renderer/components/extensions/mcp/McpServerCard.tsx +0 -314
  201. package/src/renderer/components/extensions/mcp/McpServerDetailDialog.tsx +0 -765
  202. package/src/renderer/components/extensions/mcp/McpServersPanel.tsx +0 -593
  203. package/src/renderer/components/extensions/skills/SkillDetailDialog.tsx +0 -372
  204. package/src/renderer/components/extensions/skills/SkillImportDialog.tsx +0 -343
  205. package/src/renderer/components/extensions/skills/SkillsPanel.tsx +0 -659
@@ -12,7 +12,7 @@ import {
12
12
  import { Textarea } from '@renderer/components/ui/textarea';
13
13
  import { emitOpenHermitEvent, OPEN_HERMIT_EVENTS } from '@renderer/utils/openHermitEvents';
14
14
  import appIcon from '@renderer/favicon.png';
15
- import { Check, FileEdit, Loader2, RefreshCw, RotateCcw, X } from 'lucide-react';
15
+ import { Check, FileEdit, Loader2, RotateCcw, X } from 'lucide-react';
16
16
 
17
17
  import { SettingsSectionHeader } from '../components';
18
18
 
@@ -25,7 +25,7 @@ const CcConnectConfigRawDialog = ({
25
25
  open,
26
26
  onClose,
27
27
  }: CcConnectConfigRawDialogProps): React.JSX.Element | null => {
28
- const [filePath, setFilePath] = useState('~/.hermit/cc-connect/config.toml');
28
+ const [filePath, setFilePath] = useState('~/.hermit/config.toml');
29
29
  const [content, setContent] = useState('');
30
30
  const [loading, setLoading] = useState(false);
31
31
  const [saving, setSaving] = useState(false);
@@ -82,7 +82,7 @@ const CcConnectConfigRawDialog = ({
82
82
  >
83
83
  <DialogContent className="max-w-4xl">
84
84
  <DialogHeader>
85
- <DialogTitle>编辑 配置</DialogTitle>
85
+ <DialogTitle>编辑配置</DialogTitle>
86
86
  </DialogHeader>
87
87
  <div className="space-y-3">
88
88
  <p className="text-xs text-[var(--color-text-muted)]">配置文件:{filePath}</p>
@@ -105,8 +105,8 @@ const CcConnectConfigRawDialog = ({
105
105
  </div>
106
106
  )}
107
107
  <p className="text-xs text-[var(--color-text-muted)]">
108
- 保存后将直接覆盖 Hermit 管理的 cc-connect config.toml。若修改了端口或
109
- token,请点击“重启服务”生效。
108
+ 保存后将直接覆盖 Hermit 管理的配置文件。若修改了端口或
109
+ token,请点击”重启服务”生效。
110
110
  </p>
111
111
  </div>
112
112
  <DialogFooter>
@@ -136,7 +136,6 @@ export const AdvancedSection = ({}: AdvancedSectionProps): React.JSX.Element =>
136
136
  const [version, setVersion] = useState<string>('');
137
137
  const [ccConfigOpen, setCcConfigOpen] = useState(false);
138
138
  const [restarting, setRestarting] = useState(false);
139
- const [reloading, setReloading] = useState(false);
140
139
  const [restartMsg, setRestartMsg] = useState<string | null>(null);
141
140
 
142
141
  useEffect(() => {
@@ -158,58 +157,28 @@ export const AdvancedSection = ({}: AdvancedSectionProps): React.JSX.Element =>
158
157
  }
159
158
  }, []);
160
159
 
161
- const handleReload = useCallback(async () => {
162
- setReloading(true);
163
- setRestartMsg(null);
164
- try {
165
- await api.ccSettings.reload();
166
- setRestartMsg('配置已重载');
167
- } catch {
168
- setRestartMsg('重载失败');
169
- } finally {
170
- setReloading(false);
171
- setTimeout(() => setRestartMsg(null), 3000);
172
- }
173
- }, []);
174
-
175
160
  return (
176
161
  <div>
177
162
  <SettingsSectionHeader title="服务配置" />
178
163
  <div className="flex flex-wrap gap-2 py-2">
179
164
  <button
180
165
  onClick={() => setCcConfigOpen(true)}
181
- className="flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-all duration-150 hover:bg-white/5"
166
+ className="flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-all duration-150 hover:bg-cyan-500/5"
182
167
  style={{
183
- borderColor: 'var(--color-border)',
184
- color: 'var(--color-text)',
168
+ borderColor: 'rgba(6, 182, 212, 0.3)',
169
+ color: '#67e8f9',
185
170
  }}
186
171
  >
187
172
  <FileEdit className="size-4" />
188
173
  编辑 配置
189
174
  </button>
190
- <button
191
- onClick={() => void handleReload()}
192
- disabled={reloading || restarting}
193
- className="flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-all duration-150 hover:bg-white/5 disabled:cursor-not-allowed disabled:opacity-50"
194
- style={{
195
- borderColor: 'var(--color-border)',
196
- color: 'var(--color-text-secondary)',
197
- }}
198
- >
199
- {reloading ? (
200
- <Loader2 className="size-4 animate-spin" />
201
- ) : (
202
- <RefreshCw className="size-4" />
203
- )}
204
- 重载配置
205
- </button>
206
175
  <button
207
176
  onClick={() => void handleRestart()}
208
- disabled={restarting || reloading}
177
+ disabled={restarting}
209
178
  className="flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-all duration-150 hover:bg-white/5 disabled:cursor-not-allowed disabled:opacity-50"
210
179
  style={{
211
180
  borderColor: 'var(--color-border)',
212
- color: 'var(--color-text-secondary)',
181
+ color: 'var(--color-text-muted)',
213
182
  }}
214
183
  >
215
184
  {restarting ? (
@@ -240,7 +209,7 @@ export const AdvancedSection = ({}: AdvancedSectionProps): React.JSX.Element =>
240
209
  Version {version || '...'}
241
210
  </p>
242
211
  <p className="mt-2 text-xs leading-relaxed" style={{ color: 'var(--color-text-muted)' }}>
243
- 渠道与模型供应商由后端服务统一管理;团队内部任务由 harness 自主管理。
212
+ 本地优先的 AI Agent 团队工作台。支持多模型供应商接入、自主任务管理和跨团队协作。
244
213
  </p>
245
214
  </div>
246
215
  </div>
@@ -425,112 +425,67 @@ export const CliStatusSection = ({
425
425
  {effectiveCliStatus.binaryPath}
426
426
  </p>
427
427
  )}
428
- <div className="ml-6 mt-3 space-y-2">
428
+ <div className="mt-3 grid gap-2">
429
429
  {ALL_AGENT_TYPES.map((agentType) => {
430
430
  const provider = cliProviderStatusByAgentType.get(agentType) ?? null;
431
431
  const harnessProviders = globalProvidersByAgentType.get(agentType) ?? [];
432
- if (!provider) {
433
- return (
434
- <div
435
- key={agentType}
436
- className="grid grid-cols-[minmax(0,1fr)_auto] gap-x-3 gap-y-2 rounded-md border px-3 py-2"
437
- style={{
438
- borderColor: 'var(--color-border-subtle)',
439
- backgroundColor: 'rgba(255, 255, 255, 0.02)',
440
- }}
441
- >
442
- <div className="min-w-0">
443
- <div className="flex items-center gap-2 text-xs">
444
- <Terminal
445
- className="size-4 shrink-0"
446
- style={{ color: 'var(--color-text-muted)' }}
447
- />
448
- <span
449
- className="font-medium"
450
- style={{ color: 'var(--color-text-secondary)' }}
451
- >
452
- {AGENT_TYPE_LABELS[agentType]}
453
- </span>
454
- <span style={{ color: 'var(--color-text-muted)' }}>
455
- {harnessProviders.length > 0
456
- ? `${harnessProviders.length} 个 Provider`
457
- : '未配置 Provider'}
458
- </span>
459
- </div>
460
- <div
461
- className="mt-1 flex flex-wrap gap-x-3 gap-y-1 text-[11px]"
462
- style={{ color: 'var(--color-text-muted)' }}
463
- >
464
- <span>Agent 类型:{agentType}</span>
465
- <span>Provider:{harnessProviders.length}</span>
466
- </div>
467
- </div>
468
- <div className="flex shrink-0 items-start gap-2">
469
- <button
470
- type="button"
471
- onClick={() => handleHarnessManage(agentType)}
472
- className="flex items-center gap-1 rounded-md border px-2 py-[3px] text-[10px] font-medium transition-colors hover:bg-white/5"
473
- style={{
474
- borderColor: 'var(--color-border)',
475
- color: 'var(--color-text-secondary)',
476
- }}
477
- >
478
- <SlidersHorizontal className="size-3" />
479
- 配置
480
- </button>
481
- </div>
482
- </div>
483
- );
484
- }
432
+ const hasProviders = harnessProviders.length > 0;
433
+
485
434
  return (
486
435
  <div
487
436
  key={agentType}
488
- className="grid grid-cols-[minmax(0,1fr)_auto] gap-x-3 gap-y-2 rounded-md border px-3 py-2"
437
+ className="flex items-center gap-3 rounded-lg border px-3.5 py-2.5 transition-colors"
489
438
  style={{
490
- borderColor: 'var(--color-border-subtle)',
491
- backgroundColor: 'rgba(255, 255, 255, 0.02)',
439
+ borderColor: hasProviders ? 'var(--color-border-emphasis)' : 'var(--color-border-subtle)',
440
+ backgroundColor: 'var(--color-surface-raised)',
441
+ borderLeftWidth: hasProviders ? '2px' : '1px',
442
+ borderLeftColor: hasProviders ? 'var(--color-accent)' : 'var(--color-border-subtle)',
443
+ opacity: hasProviders ? 1 : 0.5,
492
444
  }}
493
445
  >
494
- <div className="col-span-2 flex items-start justify-between gap-3">
495
- <div className="min-w-0 flex-1">
496
- <div className="flex items-center gap-2 text-xs">
497
- <span className="flex items-center gap-2">
498
- <ProviderBrandLogo
499
- providerId={provider.providerId}
500
- className="size-4 shrink-0"
501
- />
502
- <span
503
- className="font-medium"
504
- style={{ color: 'var(--color-text-secondary)' }}
505
- >
506
- {provider.displayName}
507
- </span>
508
- {provider.providerId === 'codex' ? <ProviderBetaBadge /> : null}
509
- </span>
510
- </div>
511
- <div
512
- className="mt-1 flex flex-wrap gap-x-3 gap-y-1 text-[11px]"
513
- style={{ color: 'var(--color-text-muted)' }}
446
+ {provider ? (
447
+ <ProviderBrandLogo
448
+ providerId={provider.providerId}
449
+ className="size-4 shrink-0"
450
+ />
451
+ ) : (
452
+ <Terminal
453
+ className="size-4 shrink-0"
454
+ style={{ color: 'var(--color-text-muted)' }}
455
+ />
456
+ )}
457
+ <div className="min-w-0 flex-1">
458
+ <div className="flex items-center gap-1.5">
459
+ <span
460
+ className="truncate text-xs font-medium"
461
+ style={{ color: 'var(--color-text)' }}
514
462
  >
515
- <span>Agent 类型:{agentType}</span>
516
- <span>Provider:{harnessProviders.length}</span>
517
- </div>
518
- </div>
519
- <div className="flex shrink-0 items-start gap-2">
520
- <button
521
- type="button"
522
- onClick={() => handleProviderManage(provider.providerId)}
523
- className="flex items-center gap-1 rounded-md border px-2 py-[3px] text-[10px] font-medium transition-colors hover:bg-white/5 disabled:opacity-50"
524
- style={{
525
- borderColor: 'var(--color-border)',
526
- color: 'var(--color-text-secondary)',
527
- }}
528
- >
529
- <SlidersHorizontal className="size-3" />
530
- 配置
531
- </button>
463
+ {provider?.displayName ?? AGENT_TYPE_LABELS[agentType]}
464
+ </span>
465
+ {provider?.providerId === 'codex' ? <ProviderBetaBadge /> : null}
532
466
  </div>
467
+ {hasProviders && (
468
+ <span className="text-[10px]" style={{ color: 'var(--color-text-muted)' }}>
469
+ {harnessProviders.length} provider
470
+ </span>
471
+ )}
533
472
  </div>
473
+ <button
474
+ type="button"
475
+ onClick={() =>
476
+ provider
477
+ ? handleProviderManage(provider.providerId)
478
+ : handleHarnessManage(agentType)
479
+ }
480
+ className="flex shrink-0 items-center gap-1.5 rounded-md border px-2 py-1 text-[10px] font-medium transition-colors hover:bg-white/5"
481
+ style={{
482
+ borderColor: 'var(--color-border-subtle)',
483
+ color: 'var(--color-text-muted)',
484
+ }}
485
+ >
486
+ <SlidersHorizontal className="size-3" />
487
+ 配置
488
+ </button>
534
489
  </div>
535
490
  );
536
491
  })}
@@ -597,7 +552,7 @@ export const CliStatusSection = ({
597
552
  className="h-full rounded-full transition-all duration-300"
598
553
  style={{
599
554
  width: `${downloadProgress}%`,
600
- backgroundColor: '#3b82f6',
555
+ backgroundColor: '#6366f1',
601
556
  }}
602
557
  />
603
558
  ) : (
@@ -888,30 +843,34 @@ const GenericHarnessProviderDialog = ({
888
843
  return (
889
844
  <div
890
845
  key={provider.name}
891
- className="rounded-lg border px-3 py-2"
846
+ className="rounded-lg border px-3.5 py-2.5"
892
847
  style={{
893
- borderColor: 'var(--color-border-subtle)',
894
- backgroundColor: 'rgba(255, 255, 255, 0.025)',
848
+ borderColor: provider.api_key ? 'var(--color-border)' : 'var(--color-border-subtle)',
849
+ backgroundColor: 'var(--color-surface-raised)',
850
+ borderLeftWidth: provider.api_key ? '2px' : '1px',
851
+ borderLeftColor: provider.api_key ? 'var(--color-accent)' : 'var(--color-border-subtle)',
895
852
  }}
896
853
  >
897
- <div className="flex flex-wrap items-center justify-between gap-2">
898
- <div className="text-sm font-medium" style={{ color: 'var(--color-text)' }}>
899
- {provider.name}
854
+ <div className="flex items-center justify-between gap-2">
855
+ <div className="flex items-center gap-2">
856
+ <span
857
+ className="size-1.5 shrink-0 rounded-full"
858
+ style={{
859
+ backgroundColor: provider.api_key ? 'var(--color-accent)' : '#fbbf24',
860
+ }}
861
+ />
862
+ <span className="text-sm font-medium" style={{ color: 'var(--color-text)' }}>
863
+ {provider.name}
864
+ </span>
900
865
  </div>
901
- <span
902
- className="rounded-full px-2 py-0.5 text-[11px]"
903
- style={{
904
- color: provider.api_key ? '#86efac' : '#fbbf24',
905
- backgroundColor: provider.api_key
906
- ? 'rgba(74, 222, 128, 0.14)'
907
- : 'rgba(245, 158, 11, 0.12)',
908
- }}
909
- >
910
- {provider.api_key ? 'API Key 已配置' : '未配置 Key'}
866
+ <span className="text-[10px]" style={{
867
+ color: provider.api_key ? 'var(--color-accent)' : '#fbbf24',
868
+ }}>
869
+ {provider.api_key ? 'Key 已配置' : '未配置'}
911
870
  </span>
912
871
  </div>
913
872
  <div
914
- className="mt-1 flex flex-wrap gap-x-3 gap-y-1 text-[11px]"
873
+ className="mt-1.5 flex flex-wrap gap-x-4 gap-y-1 text-[11px]"
915
874
  style={{ color: 'var(--color-text-muted)' }}
916
875
  >
917
876
  <span>端点:{endpoint}</span>
@@ -346,7 +346,7 @@ const SaveStatusBadge = ({
346
346
  return (
347
347
  <span
348
348
  className="flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px]"
349
- style={{ backgroundColor: 'rgba(96, 165, 250, 0.15)', color: '#60a5fa' }}
349
+ style={{ backgroundColor: 'rgba(129, 140, 248, 0.15)', color: '#818cf8' }}
350
350
  >
351
351
  <Loader2 className="size-3 animate-spin" />
352
352
  保存中...
@@ -81,7 +81,7 @@ const CompactNum = ({
81
81
  }}
82
82
  className={cn(
83
83
  'h-8 w-24 rounded-md border bg-transparent px-2 text-right text-xs tabular-nums',
84
- 'focus:outline-none focus:ring-1 focus:ring-zinc-700',
84
+ 'focus:outline-none focus:ring-1 focus:ring-[var(--color-border-emphasis)]',
85
85
  className
86
86
  )}
87
87
  style={{ borderColor: 'var(--color-border-subtle)', color: 'var(--color-text)' }}
@@ -439,9 +439,17 @@ export const GeneralSection = ({
439
439
  className={cn(
440
440
  'rounded-[3px] px-3 py-1 text-xs font-medium transition-colors disabled:opacity-50',
441
441
  safeConfig.general.theme === opt.value
442
- ? 'bg-[var(--color-surface-raised)] text-[var(--color-text)] shadow-sm'
442
+ ? 'shadow-sm'
443
443
  : 'text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]'
444
444
  )}
445
+ style={
446
+ safeConfig.general.theme === opt.value
447
+ ? {
448
+ backgroundColor: 'rgba(6, 182, 212, 0.1)',
449
+ color: '#67e8f9',
450
+ }
451
+ : undefined
452
+ }
445
453
  onClick={() => onThemeChange(opt.value)}
446
454
  >
447
455
  {opt.label}
@@ -526,7 +534,7 @@ export const GeneralSection = ({
526
534
  min={0}
527
535
  />
528
536
  </SettingRow>
529
- <SettingRow label="日志等级" description="cc-connect 日志输出级别">
537
+ <SettingRow label="日志等级" description="运行时日志输出级别">
530
538
  <SettingsSelect
531
539
  value={ccSettings.log_level}
532
540
  options={CC_LOG_LEVEL_OPTIONS}
@@ -13,7 +13,6 @@ import type { CcAgentType } from '@renderer/components/team/HarnessCards';
13
13
  import { HarnessIcon } from '@renderer/components/team/HarnessSelect';
14
14
  import { cn } from '@renderer/lib/utils';
15
15
  import { OPEN_HERMIT_EVENTS } from '@renderer/utils/openHermitEvents';
16
- import { CheckCircle2 } from 'lucide-react';
17
16
 
18
17
  import { SettingsSectionHeader } from '../components/SettingsSectionHeader';
19
18
  import { CliStatusSection } from './CliStatusSection';
@@ -110,13 +109,16 @@ export const HarnessSection = (): React.JSX.Element => {
110
109
  return (
111
110
  <div
112
111
  key={type}
113
- className="flex items-center gap-2 rounded-lg border px-3 py-2.5"
112
+ className="flex h-14 items-center gap-2.5 rounded-lg border px-3"
114
113
  style={{
115
- borderColor: 'var(--color-border)',
116
- background: 'var(--color-surface-raised)',
114
+ borderLeftWidth: covered ? '2px' : '1px',
115
+ borderLeftColor: covered ? 'var(--color-accent)' : 'var(--color-border-subtle)',
116
+ borderColor: covered ? 'var(--color-border)' : 'var(--color-border-subtle)',
117
+ backgroundColor: 'var(--color-surface-raised)',
118
+ opacity: covered ? 1 : 0.5,
117
119
  }}
118
120
  >
119
- <HarnessIcon type={type} className="size-5 shrink-0" />
121
+ <HarnessIcon type={type} className="size-4 shrink-0" />
120
122
  <div className="min-w-0 flex-1">
121
123
  <p
122
124
  className="truncate text-xs font-medium"
@@ -124,16 +126,18 @@ export const HarnessSection = (): React.JSX.Element => {
124
126
  >
125
127
  {AGENT_TYPE_LABELS[type]}
126
128
  </p>
127
- {covered && (
128
- <p
129
- className="truncate text-[10px]"
130
- style={{ color: 'var(--color-text-muted)' }}
131
- >
132
- {covering.join(', ')}
133
- </p>
134
- )}
135
129
  </div>
136
- {covered && <CheckCircle2 size={12} className="shrink-0 text-green-500" />}
130
+ {covered && (
131
+ <span
132
+ className="shrink-0 rounded-full px-1.5 py-0.5 text-[10px] font-medium"
133
+ style={{
134
+ backgroundColor: 'rgba(74, 222, 128, 0.1)',
135
+ color: 'var(--color-accent)',
136
+ }}
137
+ >
138
+ {covering.length}
139
+ </span>
140
+ )}
137
141
  </div>
138
142
  );
139
143
  })}
@@ -501,8 +501,8 @@ function AddPlatformDialog({
501
501
  onAdded(projectName);
502
502
  if (result.restartRequired) {
503
503
  const shouldRestart = await confirm({
504
- title: '重启 cc-connect',
505
- message: '渠道已添加。需要重启 cc-connect 才会生效。',
504
+ title: '重启服务',
505
+ message: '渠道已添加。需要重启服务才会生效。',
506
506
  confirmLabel: '立即重启',
507
507
  cancelLabel: '稍后重启',
508
508
  });
@@ -585,7 +585,7 @@ function AddPlatformDialog({
585
585
  {error && <p className="text-sm text-red-400">{error}</p>}
586
586
 
587
587
  <p className="text-xs" style={{ color: 'var(--color-text-muted)' }}>
588
- 添加后需要重启 cc-connect 才能生效。
588
+ 添加后需要重启服务才能生效。
589
589
  </p>
590
590
  </div>
591
591
 
@@ -229,24 +229,17 @@ export function TaskBusSection(): React.JSX.Element {
229
229
  .catch(() => {})
230
230
  .finally(() => setLoading(false));
231
231
 
232
- // Restore telemetry status + Redis connection state on mount
233
- fetch('/api/settings/task-bus')
232
+ // Restore telemetry status on mount. Local data collection does not depend on Redis/task bus.
233
+ fetch('/api/telemetry/status')
234
234
  .then((r) => r.json())
235
- .then((busConfig: TaskBusConfig) => {
236
- if (busConfig.enabled) {
237
- fetch('/api/telemetry/status')
238
- .then((r) => r.json())
239
- .then((s: TelemetryStatus) => {
240
- if (s.connected) setConnected(true);
241
- if ('sessions' in s && s.sessions > 0) setTelemetryStatus(s);
242
- })
243
- .catch(() => {});
244
- }
235
+ .then((s: TelemetryStatus) => {
236
+ setTelemetryStatus(s);
237
+ setConnected(s.connected === true);
245
238
  })
246
239
  .catch(() => {});
247
240
 
248
241
  const poll = setInterval(() => {
249
- if (enabled && collectionEnabled) {
242
+ if (collectionEnabled) {
250
243
  fetch('/api/telemetry/status')
251
244
  .then((r) => r.json())
252
245
  .then((s: TelemetryStatus) => {
@@ -440,34 +433,34 @@ export function TaskBusSection(): React.JSX.Element {
440
433
  </div>
441
434
  </SettingRow>
442
435
 
443
- {collectionEnabled && (
444
- <>
445
- <div
446
- className="flex items-center gap-3 border-b py-3"
447
- style={{ borderColor: 'var(--color-border-subtle)' }}
448
- >
449
- <Button
450
- size="sm"
451
- variant="outline"
452
- onClick={triggerScan}
453
- disabled={scanning}
454
- className="gap-1.5"
455
- >
456
- {scanning ? <Loader2 size={12} className="animate-spin" /> : <BarChart3 size={12} />}
457
- {scanning ? '采集中...' : '立即采集'}
458
- </Button>
459
- <span className="text-[10px] text-[var(--color-text-muted)]">
460
- 本地扫描,不依赖团队总线或 Redis。
461
- </span>
462
- </div>
436
+ <div
437
+ className="flex items-center gap-3 border-b py-3"
438
+ style={{ borderColor: 'var(--color-border-subtle)' }}
439
+ >
440
+ <Button
441
+ size="sm"
442
+ variant="outline"
443
+ onClick={triggerScan}
444
+ disabled={scanning || !collectionEnabled}
445
+ className="gap-1.5"
446
+ >
447
+ {scanning ? <Loader2 size={12} className="animate-spin" /> : <BarChart3 size={12} />}
448
+ {scanning ? '采集中...' : '立即采集'}
449
+ </Button>
450
+ <span className="text-[10px] text-[var(--color-text-muted)]">
451
+ 本地扫描,不依赖团队总线或 Redis。{!collectionEnabled ? '开启数据采集后可手动刷新。' : ''}
452
+ </span>
453
+ </div>
463
454
 
464
- {telemetryStatus && (
465
- <div className="py-3">
466
- <UsageDashboard status={telemetryStatus} />
467
- </div>
468
- )}
469
- </>
470
- )}
455
+ <div className="py-3">
456
+ {telemetryStatus ? (
457
+ <UsageDashboard status={telemetryStatus} />
458
+ ) : (
459
+ <div className="rounded-md border border-[var(--color-border)] bg-[var(--color-surface-raised)] p-4 text-xs text-[var(--color-text-muted)]">
460
+ 使用指标概览加载中;开启数据采集后会扫描本机 Claude Code 会话文件。
461
+ </div>
462
+ )}
463
+ </div>
471
464
 
472
465
  <SettingsSectionHeader title="团队总线" icon={<Radio size={12} />} />
473
466
 
@@ -5,4 +5,3 @@
5
5
  export { AdvancedSection } from './AdvancedSection';
6
6
  export { GeneralSection } from './GeneralSection';
7
7
  export { HarnessSection } from './HarnessSection';
8
- export { PlatformsSection } from './PlatformsSection';