@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
@@ -402,7 +402,19 @@ export function isTeamModelAvailableForUi(
402
402
  return getRuntimeModelAvailability(providerId, trimmed, providerStatus) === 'available';
403
403
  }
404
404
 
405
- return true;
405
+ if (!providerStatus) {
406
+ return true;
407
+ }
408
+
409
+ const hasRuntimeModelTruth =
410
+ providerStatus.models.length > 0 ||
411
+ (providerStatus.modelCatalog?.models.length ?? 0) > 0 ||
412
+ (providerStatus.modelAvailability?.length ?? 0) > 0;
413
+ if (!hasRuntimeModelTruth) {
414
+ return true;
415
+ }
416
+
417
+ return getRuntimeModelAvailability(providerId, trimmed, providerStatus) === 'available';
406
418
  }
407
419
 
408
420
  export function normalizeExplicitTeamModelForUi(
@@ -437,7 +449,11 @@ export function normalizeTeamModelForUi(
437
449
  return isTeamModelAvailableForUi(providerId, trimmed, providerStatus) ? normalized : '';
438
450
  }
439
451
 
440
- return normalized;
452
+ if (providerId === 'codex' && trimmed === 'gpt-5.4-mini') {
453
+ return '';
454
+ }
455
+
456
+ return isTeamModelAvailableForUi(providerId, trimmed, providerStatus) ? normalized : '';
441
457
  }
442
458
 
443
459
  export function getTeamModelSelectionError(
@@ -81,6 +81,7 @@ import type {
81
81
  TeamProvisioningModelVerificationMode,
82
82
  TeamProvisioningPrepareResult,
83
83
  TeamProvisioningProgress,
84
+ SystemManagerSummary,
84
85
  TeamSummary,
85
86
  TeamTask,
86
87
  TeamTaskStatus,
@@ -93,6 +94,7 @@ import type {
93
94
  ToolApprovalSettings,
94
95
  UpdateKanbanPatch,
95
96
  } from './team';
97
+ import type { SystemManagerAPI } from './systemManager';
96
98
  import type { TerminalAPI } from './terminal';
97
99
  import type { WaterfallData } from './visualization';
98
100
  import type { RecentProjectsElectronApi } from '@features/recent-projects/contracts';
@@ -491,8 +493,8 @@ export interface CcSession {
491
493
  projectId: string;
492
494
  sessionKey: string;
493
495
  platform: string;
494
- userName: string;
495
- chatName: string;
496
+ userName: string | null;
497
+ chatName: string | null;
496
498
  active: boolean;
497
499
  live: boolean;
498
500
  historyCount: number;
@@ -522,8 +524,122 @@ export interface CcSessionDetail {
522
524
  history: CcSessionMessage[];
523
525
  }
524
526
 
527
+ export type ConversationTelemetryExportFormat = 'csv' | 'json' | 'markdown' | 'plaintext';
528
+
529
+ export type ConversationTelemetryIncludeContent = 'none' | 'summary' | 'full';
530
+
531
+ export interface ConversationTelemetryQuery {
532
+ teamName?: string;
533
+ platform?: string;
534
+ from?: string;
535
+ to?: string;
536
+ identityType?: 'person' | 'group' | 'unknown';
537
+ identityId?: string;
538
+ includeContent?: ConversationTelemetryIncludeContent;
539
+ includeToolResults?: boolean;
540
+ includeSystemMessages?: boolean;
541
+ limit?: number;
542
+ offset?: number;
543
+ }
544
+
545
+ export interface ConversationTelemetryMessage {
546
+ role: 'user' | 'assistant' | 'system' | 'tool' | 'unknown';
547
+ timestamp?: string;
548
+ content: string;
549
+ uuid?: string;
550
+ parentUuid?: string | null;
551
+ model?: string;
552
+ requestId?: string;
553
+ usage?: {
554
+ inputTokens: number;
555
+ outputTokens: number;
556
+ cacheReadTokens: number;
557
+ cacheCreationTokens: number;
558
+ totalTokens: number;
559
+ };
560
+ isMeta?: boolean;
561
+ }
562
+
563
+ export interface ConversationTelemetryRow {
564
+ teamName: string;
565
+ teamDisplayName: string;
566
+ projectName: string;
567
+ session: {
568
+ ccSessionId?: string;
569
+ sessionKey: string;
570
+ agentSessionId?: string;
571
+ claudeSessionId?: string;
572
+ projectPath?: string;
573
+ jsonlRelPath?: string;
574
+ createdAt?: string;
575
+ updatedAt?: string;
576
+ startTime?: string;
577
+ endTime?: string;
578
+ active?: boolean;
579
+ live?: boolean;
580
+ matchStatus: 'matched' | 'missing-agent-session-id' | 'jsonl-not-found' | 'ambiguous' | 'local-only';
581
+ };
582
+ identity: {
583
+ platform: string;
584
+ type: 'person' | 'group' | 'unknown';
585
+ id?: string;
586
+ userId?: string;
587
+ chatId?: string;
588
+ displayName: string;
589
+ userName?: string;
590
+ chatName?: string;
591
+ confidence: 'exact-id' | 'name-only' | 'allowlist-fallback' | 'session-key-only' | 'missing-id';
592
+ };
593
+ content: {
594
+ messageCount: number;
595
+ userMessageCount: number;
596
+ assistantMessageCount: number;
597
+ toolResultCount: number;
598
+ firstUserMessage?: string;
599
+ firstUserMessageAt?: string;
600
+ lastUserMessage?: string;
601
+ lastUserMessageAt?: string;
602
+ lastMessageRole?: ConversationTelemetryMessage['role'];
603
+ lastMessageContent?: string;
604
+ lastMessageAt?: string;
605
+ text?: string;
606
+ messages?: ConversationTelemetryMessage[];
607
+ };
608
+ usage: {
609
+ inputTokens: number;
610
+ outputTokens: number;
611
+ cacheReadTokens: number;
612
+ cacheCreationTokens: number;
613
+ totalTokens: number;
614
+ assistantTurnsWithUsage: number;
615
+ models: Record<string, number>;
616
+ toolCalls: Record<string, number>;
617
+ usageSource: 'claude-jsonl' | 'missing';
618
+ };
619
+ }
620
+
621
+ export interface ConversationTelemetryResponse {
622
+ rows: ConversationTelemetryRow[];
623
+ nextOffset?: number;
624
+ computedAt: string;
625
+ summary: {
626
+ conversations: number;
627
+ runningConversations: number;
628
+ missingIdentityIds: number;
629
+ unmatchedSessions: number;
630
+ totalTokens: number;
631
+ };
632
+ }
633
+
634
+ export interface ConversationTelemetryExportResponse {
635
+ filename: string;
636
+ mimeType: string;
637
+ content: string;
638
+ }
639
+
525
640
  export interface TeamsAPI {
526
641
  list: () => Promise<TeamSummary[]>;
642
+ ensureSystemManager: () => Promise<SystemManagerSummary>;
527
643
  getData: (teamName: string) => Promise<TeamViewSnapshot>;
528
644
  getTaskChangePresence: (teamName: string) => Promise<Record<string, TaskChangePresenceState>>;
529
645
  setChangePresenceTracking: (teamName: string, enabled: boolean) => Promise<void>;
@@ -1096,6 +1212,9 @@ export interface ElectronAPI extends RecentProjectsElectronApi {
1096
1212
  // CLI Installer API
1097
1213
  cliInstaller: CliInstallerAPI;
1098
1214
 
1215
+ // System Manager / Control Console API
1216
+ systemManager: SystemManagerAPI;
1217
+
1099
1218
  // Embedded Terminal API (xterm.js + node-pty)
1100
1219
  terminal: TerminalAPI;
1101
1220
 
@@ -93,6 +93,8 @@ export interface CcProjectSettingsUpdate {
93
93
  reply_footer?: boolean;
94
94
  inject_sender?: boolean;
95
95
  platform_allow_from?: Record<string, string>;
96
+ /** 群聊允许的 chat ID,* 表示所有群聊 */
97
+ platform_allow_chat?: Record<string, string>;
96
98
  }
97
99
 
98
100
  export interface CcAddPlatformRequest {
@@ -15,6 +15,10 @@ import type {
15
15
  McpCatalogItem,
16
16
  McpCustomInstallRequest,
17
17
  McpInstallRequest,
18
+ McpLibraryEntry,
19
+ McpLibraryImportRequest,
20
+ McpLibraryImportResult,
21
+ McpLibraryUpsertRequest,
18
22
  McpSearchResult,
19
23
  McpServerDiagnostic,
20
24
  } from './mcp';
@@ -59,6 +63,11 @@ export interface McpCatalogAPI {
59
63
  installCustom: (request: McpCustomInstallRequest) => Promise<OperationResult>;
60
64
  uninstall: (name: string, scope?: string, projectPath?: string) => Promise<OperationResult>;
61
65
  githubStars: (repositoryUrls: string[]) => Promise<Record<string, number>>;
66
+ // ── Library (cc-switch style global library of server definitions) ──
67
+ libraryList: () => Promise<McpLibraryEntry[]>;
68
+ libraryUpsert: (request: McpLibraryUpsertRequest) => Promise<McpLibraryEntry>;
69
+ libraryDelete: (id: string) => Promise<void>;
70
+ libraryImport: (request: McpLibraryImportRequest) => Promise<McpLibraryImportResult>;
62
71
  }
63
72
 
64
73
  // ── Skills API ─────────────────────────────────────────────────────────────
@@ -21,6 +21,10 @@ export type {
21
21
  McpHttpInstallSpec,
22
22
  McpInstallRequest,
23
23
  McpInstallSpec,
24
+ McpLibraryEntry,
25
+ McpLibraryImportRequest,
26
+ McpLibraryImportResult,
27
+ McpLibraryUpsertRequest,
24
28
  McpSearchResult,
25
29
  McpServerDiagnostic,
26
30
  McpServerHealthStatus,
@@ -132,3 +132,44 @@ export interface McpSearchResult {
132
132
  servers: McpCatalogItem[];
133
133
  warnings: string[]; // e.g. "Official registry unavailable"
134
134
  }
135
+
136
+ // ── MCP Library (cc-switch style: a reusable global library of server defs) ──
137
+ //
138
+ // A saved server definition lives once in the library and can be enabled for
139
+ // any worker (= installed into that worker's project config) without re-typing
140
+ // the command / URL / env each time.
141
+
142
+ export interface McpLibraryEntry {
143
+ id: string; // stable uuid
144
+ name: string; // server name used when installing (`claude mcp add <name>`)
145
+ description?: string;
146
+ installSpec: McpInstallSpec;
147
+ envValues?: Record<string, string>; // saved non-secret defaults
148
+ headers?: McpHeaderDef[];
149
+ createdAt: number;
150
+ updatedAt: number;
151
+ }
152
+
153
+ /** Create (omit id) or update (provide id) a library entry. */
154
+ export interface McpLibraryUpsertRequest {
155
+ id?: string;
156
+ name: string;
157
+ description?: string;
158
+ installSpec: McpInstallSpec;
159
+ envValues?: Record<string, string>;
160
+ headers?: McpHeaderDef[];
161
+ }
162
+
163
+ /**
164
+ * Import existing MCP servers from live config into the library.
165
+ * Pulls user-scope servers plus, when a projectPath is given, that worker's
166
+ * project-scope servers. Existing library entries (matched by name) are skipped.
167
+ */
168
+ export interface McpLibraryImportRequest {
169
+ projectPath?: string;
170
+ }
171
+
172
+ export interface McpLibraryImportResult {
173
+ imported: string[];
174
+ skipped: string[];
175
+ }
@@ -41,6 +41,9 @@ export type * from './providers';
41
41
  // Re-export Terminal types
42
42
  export type * from './terminal';
43
43
 
44
+ // Re-export System Manager types
45
+ export type * from './systemManager';
46
+
44
47
  // Re-export Editor types
45
48
  export type * from './editor';
46
49
 
@@ -0,0 +1,49 @@
1
+ export interface SystemManagerStatus {
2
+ displayName: '控制台';
3
+ defaultWorkDir: string;
4
+ selectedWorkDir: string;
5
+ workflowFolder?: string;
6
+ claudeCommand: 'claude';
7
+ localStatus: 'ready' | 'missing-claude' | 'error';
8
+ error?: string;
9
+ }
10
+
11
+ export interface SystemManagerConfig {
12
+ schemaVersion: 1;
13
+ selectedWorkDir: string;
14
+ workflowFolder?: string;
15
+ updatedAt: string;
16
+ }
17
+
18
+ export interface SystemManagerConfigPatch {
19
+ selectedWorkDir?: string;
20
+ workflowFolder?: string | null;
21
+ }
22
+
23
+ export interface WorkflowPromptSummary {
24
+ id: string;
25
+ label: string;
26
+ filename: string;
27
+ path: string;
28
+ sizeBytes: number;
29
+ updatedAt: string;
30
+ }
31
+
32
+ export interface WorkflowPromptListResponse {
33
+ folder: string;
34
+ prompts: WorkflowPromptSummary[];
35
+ warnings: string[];
36
+ }
37
+
38
+ export interface WorkflowPromptContentResponse {
39
+ prompt: WorkflowPromptSummary;
40
+ content: string;
41
+ }
42
+
43
+ export interface SystemManagerAPI {
44
+ getStatus: () => Promise<SystemManagerStatus>;
45
+ getConfig: () => Promise<SystemManagerConfig>;
46
+ updateConfig: (patch: SystemManagerConfigPatch) => Promise<SystemManagerConfig>;
47
+ listWorkflowPrompts: (folder: string) => Promise<WorkflowPromptListResponse>;
48
+ readWorkflowPrompt: (folder: string, id: string) => Promise<WorkflowPromptContentResponse>;
49
+ }
@@ -1,6 +1,22 @@
1
1
  import type { ExecutionTarget } from './api';
2
2
  import type { EnhancedChunk } from '@main/types';
3
3
 
4
+ export const SYSTEM_MANAGER_TEAM_NAME = 'system-manager';
5
+ export const SYSTEM_MANAGER_DISPLAY_NAME = '控制台';
6
+ export const SYSTEM_MANAGER_BIND_PROJECT = 'my-project';
7
+
8
+ export interface SystemManagerSummary {
9
+ teamName: typeof SYSTEM_MANAGER_TEAM_NAME;
10
+ displayName: typeof SYSTEM_MANAGER_DISPLAY_NAME;
11
+ bindProject: typeof SYSTEM_MANAGER_BIND_PROJECT;
12
+ workDir: string;
13
+ projectPath?: string;
14
+ description: string;
15
+ localStatus: 'ready';
16
+ ccConnectProjectStatus: 'bound' | 'missing';
17
+ feishuStatus: 'unbound' | 'connected' | 'error' | 'unknown';
18
+ }
19
+
4
20
  export interface TeamMember {
5
21
  name: string;
6
22
  agentId?: string;
@@ -36,6 +52,8 @@ export interface TeamConfig {
36
52
  managedSources?: string;
37
53
  disabledCommands?: string[];
38
54
  platformAllowFrom?: Record<string, string>;
55
+ /** 群聊允许的 chat ID(按平台),* 表示所有群聊 */
56
+ platformAllowChat?: Record<string, string>;
39
57
  members?: TeamMember[];
40
58
  projectPath?: string;
41
59
  projectPathHistory?: string[];
@@ -61,6 +79,8 @@ export interface TeamUpdateConfigRequest {
61
79
  managedSources?: string;
62
80
  disabledCommands?: string[];
63
81
  platformAllowFrom?: Record<string, string>;
82
+ /** 群聊允许的 chat ID(按平台),* 表示所有群聊 */
83
+ platformAllowChat?: Record<string, string>;
64
84
  executionTarget?: ExecutionTarget;
65
85
  leadProviderId?: TeamProviderId;
66
86
  leadModel?: string;
@@ -122,6 +142,13 @@ export interface TeamSummary {
122
142
  runtimeCandidatePendingCount?: number;
123
143
  noRuntimePendingCount?: number;
124
144
  permissionPendingCount?: number;
145
+ /** Aggregated session stats from local JSONL files */
146
+ stats?: {
147
+ sessions: number;
148
+ messages: number;
149
+ tokens: number;
150
+ durationMs: number;
151
+ };
125
152
  }
126
153
 
127
154
  export type TeamTaskStatus = 'pending' | 'in_progress' | 'completed' | 'deleted';
@@ -1092,6 +1119,8 @@ export interface TeamViewSnapshot {
1092
1119
  processes: TeamProcess[];
1093
1120
  warnings?: string[];
1094
1121
  isAlive?: boolean;
1122
+ /** Bound external platforms (feishu, telegram, etc.) from cc-connect */
1123
+ platforms?: import('./ccConnect').CcProjectPlatform[];
1095
1124
  /** cc-connect project name this team is bound to */
1096
1125
  bindProject?: string;
1097
1126
  /** 团队协作开关:false = 独立作战,true = 可跨团队调度 */
@@ -40,8 +40,10 @@ export interface TerminalAPI {
40
40
  write: (ptyId: string, data: string) => void;
41
41
  /** Resize PTY terminal (fire-and-forget). */
42
42
  resize: (ptyId: string, cols: number, rows: number) => void;
43
- /** Kill PTY process (fire-and-forget). */
44
- kill: (ptyId: string) => void;
43
+ /** Kill PTY process. */
44
+ kill: (ptyId: string) => Promise<void>;
45
+ /** Open command in system Terminal.app (macOS). */
46
+ openExternal: (options: { command: string; args?: string[]; cwd?: string }) => Promise<void>;
45
47
  /** Subscribe to PTY data output. Returns cleanup function. */
46
48
  onData: (cb: (event: unknown, ptyId: string, data: string) => void) => () => void;
47
49
  /** Subscribe to PTY exit events. Returns cleanup function. */
@@ -106,6 +106,35 @@ export function buildPluginId(pluginName: string, marketplaceName: string): stri
106
106
  return `${pluginName}@${marketplaceName}`;
107
107
  }
108
108
 
109
+ /**
110
+ * Substrings that mark a plugin as "essential" (必装) — recommended/required for
111
+ * the workbench. Matched against both the pluginId and homepage so it works
112
+ * regardless of the marketplace name a plugin is published under.
113
+ */
114
+ export const ESSENTIAL_PLUGIN_PATTERNS = ['oh-my-claudecode'] as const;
115
+
116
+ /**
117
+ * Marketplace plugins that should not be shown in Hermit's plugin store.
118
+ */
119
+ export const HIDDEN_PLUGIN_PATTERNS = ['codex@openai-codex', 'codex-plugin-cc'] as const;
120
+
121
+ /**
122
+ * Whether a plugin is one of the essential plugins surfaced with a 必装 badge and
123
+ * the recommendation banner.
124
+ */
125
+ export function isEssentialPlugin(plugin: { pluginId: string; homepage?: string }): boolean {
126
+ const haystack = `${plugin.pluginId} ${plugin.homepage ?? ''}`.toLowerCase();
127
+ return ESSENTIAL_PLUGIN_PATTERNS.some((pattern) => haystack.includes(pattern));
128
+ }
129
+
130
+ /**
131
+ * Whether a plugin should be hidden from the plugin store catalog.
132
+ */
133
+ export function isHiddenPluginFromStore(plugin: { pluginId: string; homepage?: string }): boolean {
134
+ const haystack = `${plugin.pluginId} ${plugin.homepage ?? ''}`.toLowerCase();
135
+ return HIDDEN_PLUGIN_PATTERNS.some((pattern) => haystack.includes(pattern));
136
+ }
137
+
109
138
  /**
110
139
  * Namespaced operation-state key for plugin install/uninstall UI state.
111
140
  */
@@ -58,12 +58,12 @@ export function createLegacyRuntimeFallbackCliExtensionCapabilities(
58
58
  export function getCliProviderExtensionCapabilities(
59
59
  provider: Pick<CliProviderStatus, 'capabilities'> | null | undefined
60
60
  ): CliExtensionCapabilities {
61
- const fallback = createDefaultCliExtensionCapabilities();
62
61
  const extensions = provider?.capabilities?.extensions;
63
62
  if (!extensions) {
64
- return fallback;
63
+ return createLegacyRuntimeFallbackCliExtensionCapabilities();
65
64
  }
66
65
 
66
+ const fallback = createDefaultCliExtensionCapabilities();
67
67
  return {
68
68
  plugins: extensions.plugins ?? fallback.plugins,
69
69
  mcp: extensions.mcp ?? fallback.mcp,