@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
@@ -1,314 +0,0 @@
1
- /**
2
- * McpServerCard — grid card for a single MCP server in the catalog.
3
- * Shows server icon from registry when available.
4
- */
5
-
6
- import { useState } from 'react';
7
-
8
- import { api } from '@renderer/api';
9
- import { Badge } from '@renderer/components/ui/badge';
10
- import { Button } from '@renderer/components/ui/button';
11
- import { Tooltip, TooltipContent, TooltipTrigger } from '@renderer/components/ui/tooltip';
12
- import { useStore } from '@renderer/store';
13
- import { formatCompactNumber, formatRelativeTime } from '@renderer/utils/formatters';
14
- import {
15
- getMcpInstallationSummaryLabel,
16
- getMcpOperationKey,
17
- sanitizeMcpServerName,
18
- } from '@shared/utils/extensionNormalizers';
19
- import { getDefaultMcpSharedScope } from '@shared/utils/mcpScopes';
20
- import { Clock, Cloud, Globe, KeyRound, Lock, Monitor, Star, Tag, Wrench } from 'lucide-react';
21
- import { Github as GithubIcon } from 'lucide-react';
22
-
23
- import { InstallButton } from '../common/InstallButton';
24
- import { SourceBadge } from '../common/SourceBadge';
25
-
26
- import type { CliInstallationStatus } from '@shared/types';
27
- import type {
28
- InstalledMcpEntry,
29
- McpCatalogItem,
30
- McpServerDiagnostic,
31
- } from '@shared/types/extensions';
32
-
33
- interface McpServerCardProps {
34
- server: McpCatalogItem;
35
- isInstalled: boolean;
36
- installedEntry?: InstalledMcpEntry | null;
37
- installedEntries?: InstalledMcpEntry[];
38
- diagnostic?: McpServerDiagnostic | null;
39
- diagnosticsLoading?: boolean;
40
- onClick: (serverId: string) => void;
41
- cliStatus?: Pick<
42
- CliInstallationStatus,
43
- 'installed' | 'authLoggedIn' | 'binaryPath' | 'launchError' | 'flavor' | 'providers'
44
- > | null;
45
- cliStatusLoading?: boolean;
46
- }
47
-
48
- export const McpServerCard = ({
49
- server,
50
- isInstalled,
51
- installedEntry,
52
- installedEntries = [],
53
- diagnostic,
54
- diagnosticsLoading,
55
- onClick,
56
- cliStatus: cliStatusOverride,
57
- cliStatusLoading,
58
- }: McpServerCardProps): React.JSX.Element => {
59
- const storedCliStatus = useStore((s) => s.cliStatus);
60
- const cliStatus = cliStatusOverride ?? storedCliStatus;
61
- const sharedScope = getDefaultMcpSharedScope(cliStatus?.flavor);
62
- const operationKey = getMcpOperationKey(server.id, sharedScope);
63
- const installProgress = useStore((s) => s.mcpInstallProgress[operationKey] ?? 'idle');
64
- const installMcpServer = useStore((s) => s.installMcpServer);
65
- const uninstallMcpServer = useStore((s) => s.uninstallMcpServer);
66
- const installError = useStore((s) => s.installErrors[operationKey]);
67
- const stars = useStore((s) =>
68
- server.repositoryUrl ? s.mcpGitHubStars[server.repositoryUrl] : undefined
69
- );
70
- const canAutoInstall = !!server.installSpec;
71
- const normalizedInstalledEntries = installedEntries.length
72
- ? installedEntries
73
- : installedEntry
74
- ? [installedEntry]
75
- : [];
76
- const requiresConfiguration =
77
- server.installSpec?.type === 'http' ||
78
- server.envVars.length > 0 ||
79
- server.requiresAuth ||
80
- (server.authHeaders?.length ?? 0) > 0;
81
- const defaultServerName = sanitizeMcpServerName(server.name);
82
- const sharedInstallEntry =
83
- normalizedInstalledEntries.find((entry) => entry.scope === sharedScope) ?? null;
84
- const installSummaryLabel = getMcpInstallationSummaryLabel(normalizedInstalledEntries);
85
- const supportsDirectInstalledAction =
86
- isInstalled &&
87
- normalizedInstalledEntries.length === 1 &&
88
- sharedInstallEntry?.name === defaultServerName &&
89
- !requiresConfiguration;
90
- const shouldShowDirectInstallButton =
91
- canAutoInstall && (!isInstalled ? !requiresConfiguration : supportsDirectInstalledAction);
92
- const [imgError, setImgError] = useState(false);
93
- const hasIcon = !!server.iconUrl && !imgError;
94
- const diagnosticBadgeClass =
95
- diagnostic?.status === 'connected'
96
- ? 'border-emerald-500/30 bg-emerald-500/10 text-emerald-400'
97
- : diagnostic?.status === 'needs-authentication'
98
- ? 'border-amber-500/30 bg-amber-500/10 text-amber-400'
99
- : diagnostic?.status === 'failed'
100
- ? 'border-red-500/30 bg-red-500/10 text-red-400'
101
- : 'border-border bg-surface-raised text-text-muted';
102
-
103
- return (
104
- <div
105
- role="button"
106
- tabIndex={0}
107
- onClick={() => onClick(server.id)}
108
- onKeyDown={(e) => {
109
- if (e.key === 'Enter' || e.key === ' ') {
110
- e.preventDefault();
111
- onClick(server.id);
112
- }
113
- }}
114
- className={`relative flex w-full cursor-pointer flex-col gap-2 overflow-hidden rounded-lg border p-4 text-left transition-all duration-200 hover:border-border-emphasis hover:bg-surface-raised hover:shadow-[0_0_12px_rgba(255,255,255,0.02)] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-border-emphasis)] ${
115
- isInstalled ? 'border-l-2 border-border border-l-emerald-500/30' : 'border-border'
116
- }`}
117
- >
118
- {/* Header: icon + name */}
119
- <div className="flex items-start gap-2.5">
120
- {/* Server icon (only when available) */}
121
- {hasIcon && (
122
- <div className="flex size-9 shrink-0 items-center justify-center rounded-lg border border-border bg-surface-raised">
123
- <img
124
- src={server.iconUrl}
125
- alt=""
126
- className="size-7 rounded object-contain"
127
- onError={() => setImgError(true)}
128
- />
129
- </div>
130
- )}
131
- <div className="min-w-0 flex-1">
132
- <div className="flex items-start justify-between gap-2">
133
- <div className="min-w-0">
134
- <h3 className="truncate text-sm font-semibold text-text">{server.name}</h3>
135
- {server.source !== 'official' && (
136
- <div className="mt-1">
137
- <SourceBadge source={server.source} />
138
- </div>
139
- )}
140
- </div>
141
- <div className="flex shrink-0 items-center gap-1.5">
142
- {isInstalled && (
143
- <Badge
144
- className="border-emerald-500/30 bg-emerald-500/10 text-emerald-400"
145
- variant="outline"
146
- >
147
- {installSummaryLabel ?? 'Installed'}
148
- </Badge>
149
- )}
150
- {isInstalled && diagnosticsLoading && !diagnostic && (
151
- <Badge
152
- className="border-border bg-surface-raised text-text-muted"
153
- variant="outline"
154
- >
155
- Checking...
156
- </Badge>
157
- )}
158
- {diagnostic && (
159
- <Badge className={diagnosticBadgeClass} variant="outline">
160
- {diagnostic.statusLabel}
161
- </Badge>
162
- )}
163
- </div>
164
- </div>
165
- </div>
166
- </div>
167
-
168
- {/* Description */}
169
- <p className="line-clamp-2 text-xs text-text-secondary">{server.description}</p>
170
- {diagnostic?.target && (
171
- <p className="truncate font-mono text-[10px] text-text-muted" title={diagnostic.target}>
172
- {diagnostic.target}
173
- </p>
174
- )}
175
-
176
- {/* Footer indicators + install button */}
177
- <div className="flex items-center justify-between gap-2">
178
- <div className="flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 text-xs text-text-muted">
179
- {server.tools.length > 0 && (
180
- <span className="inline-flex items-center gap-1 rounded-full bg-surface-raised px-1.5 py-0.5 ring-1 ring-border">
181
- <Wrench className="size-3" />
182
- {server.tools.length} {server.tools.length === 1 ? 'tool' : 'tools'}
183
- </span>
184
- )}
185
- {server.envVars.length > 0 && (
186
- <span className="inline-flex items-center gap-1">
187
- <KeyRound className="size-3" />
188
- {server.envVars.length} {server.envVars.length === 1 ? 'env' : 'envs'}
189
- </span>
190
- )}
191
- {server.requiresAuth && (
192
- <span className="inline-flex items-center gap-1 text-amber-400">
193
- <Lock className="size-3" />
194
- Auth
195
- </span>
196
- )}
197
- {server.version && (
198
- <span className="inline-flex items-center gap-1">
199
- <Tag className="size-3" />
200
- {server.version}
201
- </span>
202
- )}
203
- {server.updatedAt && (
204
- <span className="inline-flex items-center gap-1">
205
- <Clock className="size-3" />
206
- {formatRelativeTime(server.updatedAt)}
207
- </span>
208
- )}
209
- {server.author && <span className="truncate">by {server.author}</span>}
210
- {server.hostingType === 'remote' && (
211
- <span className="inline-flex items-center gap-1">
212
- <Cloud className="size-3" />
213
- Remote
214
- </span>
215
- )}
216
- {server.hostingType === 'local' && (
217
- <span className="inline-flex items-center gap-1">
218
- <Monitor className="size-3" />
219
- Local
220
- </span>
221
- )}
222
- {server.hostingType === 'both' && (
223
- <span className="inline-flex items-center gap-1">
224
- <Globe className="size-3" />
225
- Both
226
- </span>
227
- )}
228
- {/* External links + stars */}
229
- {server.repositoryUrl && (
230
- <Tooltip>
231
- <TooltipTrigger asChild>
232
- <button
233
- className="inline-flex items-center gap-1.5 text-text-muted transition-colors hover:text-text"
234
- onClick={(e) => {
235
- e.stopPropagation();
236
- void api.openExternal(server.repositoryUrl!);
237
- }}
238
- >
239
- <GithubIcon className="size-3.5" />
240
- {stars != null && (
241
- <span className="inline-flex items-center gap-0.5">
242
- <Star className="size-3 fill-amber-400 text-amber-400" />
243
- {formatCompactNumber(stars)}
244
- </span>
245
- )}
246
- </button>
247
- </TooltipTrigger>
248
- <TooltipContent side="top">Repository</TooltipContent>
249
- </Tooltip>
250
- )}
251
- {server.websiteUrl && (
252
- <Tooltip>
253
- <TooltipTrigger asChild>
254
- <button
255
- className="inline-flex items-center text-text-muted transition-colors hover:text-text"
256
- onClick={(e) => {
257
- e.stopPropagation();
258
- void api.openExternal(server.websiteUrl!);
259
- }}
260
- >
261
- <Globe className="size-3.5" />
262
- </button>
263
- </TooltipTrigger>
264
- <TooltipContent side="top">Website</TooltipContent>
265
- </Tooltip>
266
- )}
267
- </div>
268
- {shouldShowDirectInstallButton && (
269
- <div className="shrink-0">
270
- <InstallButton
271
- state={installProgress}
272
- isInstalled={isInstalled}
273
- section="mcp"
274
- cliStatus={cliStatus}
275
- cliStatusLoading={cliStatusLoading}
276
- onInstall={() =>
277
- installMcpServer({
278
- registryId: server.id,
279
- serverName: defaultServerName,
280
- scope: sharedScope,
281
- envValues: {},
282
- headers: [],
283
- })
284
- }
285
- onUninstall={() =>
286
- uninstallMcpServer(
287
- server.id,
288
- sharedInstallEntry?.name ?? defaultServerName,
289
- sharedScope
290
- )
291
- }
292
- size="sm"
293
- errorMessage={installError}
294
- />
295
- </div>
296
- )}
297
- {canAutoInstall && (!shouldShowDirectInstallButton || requiresConfiguration) && (
298
- <div className="shrink-0">
299
- <Button
300
- size="sm"
301
- variant="outline"
302
- onClick={(e) => {
303
- e.stopPropagation();
304
- onClick(server.id);
305
- }}
306
- >
307
- {isInstalled ? 'Manage' : 'Configure'}
308
- </Button>
309
- </div>
310
- )}
311
- </div>
312
- </div>
313
- );
314
- };