@yancyyu/openhermit 1.6.38 → 1.6.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/dist-renderer/assets/ProjectEditorOverlay-CemDOX-3.js +58 -0
  2. package/dist-renderer/assets/{TeamGraphOverlay-ZEDfZyHb.js → TeamGraphOverlay-hPY770Db.js} +1 -1
  3. package/dist-renderer/assets/{_basePickBy-CIhniz70.js → _basePickBy-BHHrJT1i.js} +1 -1
  4. package/dist-renderer/assets/{_baseUniq-cKAW4Q8I.js → _baseUniq-CWErBtke.js} +1 -1
  5. package/dist-renderer/assets/{arc-YmNsoDXW.js → arc-C_o2_Uv8.js} +1 -1
  6. package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-DHEls2sX.js → architectureDiagram-VXUJARFQ-DUW0LI3t.js} +1 -1
  7. package/dist-renderer/assets/{blockDiagram-VD42YOAC-Bpwf1Sbg.js → blockDiagram-VD42YOAC-CWbCE9hQ.js} +1 -1
  8. package/dist-renderer/assets/{c4Diagram-YG6GDRKO-B0IaQ4w5.js → c4Diagram-YG6GDRKO-BjLadrfV.js} +1 -1
  9. package/dist-renderer/assets/channel-DyP9YlCF.js +1 -0
  10. package/dist-renderer/assets/{chunk-4BX2VUAB-DLk-hcFc.js → chunk-4BX2VUAB-CPnvjZl9.js} +1 -1
  11. package/dist-renderer/assets/{chunk-55IACEB6-1XRmX_Zm.js → chunk-55IACEB6-OlL47yXQ.js} +1 -1
  12. package/dist-renderer/assets/{chunk-B4BG7PRW-1waH1DAD.js → chunk-B4BG7PRW-DTasjbm8.js} +1 -1
  13. package/dist-renderer/assets/{chunk-DI55MBZ5-BqpZBtrN.js → chunk-DI55MBZ5-C5_Xaqkk.js} +1 -1
  14. package/dist-renderer/assets/{chunk-FMBD7UC4-Bly7vVym.js → chunk-FMBD7UC4-NdoM4DMR.js} +1 -1
  15. package/dist-renderer/assets/{chunk-QN33PNHL-Ci2QWBAs.js → chunk-QN33PNHL-C8Fybejy.js} +1 -1
  16. package/dist-renderer/assets/{chunk-QZHKN3VN-YCqFW7d-.js → chunk-QZHKN3VN-E98TYFXJ.js} +1 -1
  17. package/dist-renderer/assets/{chunk-TZMSLE5B-B0xGXInl.js → chunk-TZMSLE5B-h4lFgkIq.js} +1 -1
  18. package/dist-renderer/assets/classDiagram-2ON5EDUG-BqffFTae.js +1 -0
  19. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-BqffFTae.js +1 -0
  20. package/dist-renderer/assets/clone-MPcKWs2O.js +1 -0
  21. package/dist-renderer/assets/{cose-bilkent-S5V4N54A-DxcFNQKT.js → cose-bilkent-S5V4N54A-DtQ7fkrs.js} +1 -1
  22. package/dist-renderer/assets/{dagre-6UL2VRFP-DPo_RfZY.js → dagre-6UL2VRFP-CN-nL_z4.js} +1 -1
  23. package/dist-renderer/assets/{diagram-PSM6KHXK-U3hQsFe4.js → diagram-PSM6KHXK-DVJtqmm-.js} +1 -1
  24. package/dist-renderer/assets/{diagram-QEK2KX5R-OrwrAy0V.js → diagram-QEK2KX5R-DlxHxyXh.js} +1 -1
  25. package/dist-renderer/assets/{diagram-S2PKOQOG-CXATPWVw.js → diagram-S2PKOQOG-7dpzO6x6.js} +1 -1
  26. package/dist-renderer/assets/{erDiagram-Q2GNP2WA-B0e8AfMF.js → erDiagram-Q2GNP2WA-GP1TqsHi.js} +1 -1
  27. package/dist-renderer/assets/{flowDiagram-NV44I4VS-CXfzA4jJ.js → flowDiagram-NV44I4VS-C7ZLETuH.js} +1 -1
  28. package/dist-renderer/assets/{ganttDiagram-JELNMOA3-CMr08qVl.js → ganttDiagram-JELNMOA3-CvPB68dH.js} +1 -1
  29. package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-vYFHpPmy.js → gitGraphDiagram-V2S2FVAM-B5yOm3w7.js} +1 -1
  30. package/dist-renderer/assets/{graph-DOe5j8dH.js → graph-smeyY1YZ.js} +1 -1
  31. package/dist-renderer/assets/{index-BySQS7AB.js → index-BJx8XvG1.js} +1 -1
  32. package/dist-renderer/assets/{index-C_okzZXP.js → index-CQaXUAua.js} +1 -1
  33. package/dist-renderer/assets/{index-VJ-MM9xa.js → index-CajRpxO2.js} +1 -1
  34. package/dist-renderer/assets/{index-V7dAKPqd.js → index-ChG4rE-E.js} +587 -705
  35. package/dist-renderer/assets/index-DUd0uw9C.css +32 -0
  36. package/dist-renderer/assets/{index-CzWxVCRL.js → index-IhmXZWqf.js} +1 -1
  37. package/dist-renderer/assets/{index-B2Dy7M2G.js → index-x_JkoDRH.js} +1 -1
  38. package/dist-renderer/assets/{infoDiagram-HS3SLOUP-D_WubR0B.js → infoDiagram-HS3SLOUP-D-hWRQGY.js} +1 -1
  39. package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-w9ca-1TI.js → journeyDiagram-XKPGCS4Q-Bb6W8rUG.js} +1 -1
  40. package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-Jg9p6_pN.js → kanban-definition-3W4ZIXB7-CnHdUX0q.js} +1 -1
  41. package/dist-renderer/assets/{layout-B-z3y17c.js → layout-pqss_zkI.js} +1 -1
  42. package/dist-renderer/assets/{linear-D-RTX5UW.js → linear-B1mFITNh.js} +1 -1
  43. package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-CDQmHOYP.js → mindmap-definition-VGOIOE7T-DTD9q7-D.js} +1 -1
  44. package/dist-renderer/assets/{pieDiagram-ADFJNKIX-D_odsQL7.js → pieDiagram-ADFJNKIX-Df3mhrn7.js} +1 -1
  45. package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-BRsmYWSA.js → quadrantDiagram-AYHSOK5B-B1FZ09vH.js} +1 -1
  46. package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-ChNE_BOV.js → requirementDiagram-UZGBJVZJ-aEO78thZ.js} +1 -1
  47. package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-C8FtpwKc.js → sankeyDiagram-TZEHDZUN-6Ui--jp-.js} +1 -1
  48. package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-DmLCzNcc.js → sequenceDiagram-WL72ISMW-DF4Q1cAM.js} +1 -1
  49. package/dist-renderer/assets/splashScene-D0YB9uxm.js +17 -0
  50. package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-WJBm4bhu.js → stateDiagram-FKZM4ZOC-BqA2BI8C.js} +1 -1
  51. package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-Cs2ZtUD2.js +1 -0
  52. package/dist-renderer/assets/{timeline-definition-IT6M3QCI-BXs_hOJs.js → timeline-definition-IT6M3QCI-DoOkw_A8.js} +1 -1
  53. package/dist-renderer/assets/{treemap-GDKQZRPO-o04MA0G9.js → treemap-GDKQZRPO-DUe26QdD.js} +1 -1
  54. package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-Czj69XRd.js → xychartDiagram-PRI3JC2R-BKCnj5Xn.js} +1 -1
  55. package/dist-renderer/index.html +20 -53
  56. package/package.json +25 -18
  57. package/src/main/ipc/extensions.ts +2 -1
  58. package/src/main/server.ts +873 -221
  59. package/src/main/services/extensions/ExtensionFacadeService.ts +2 -5
  60. package/src/main/services/extensions/catalog/PluginCatalogService.ts +4 -2
  61. package/src/main/services/session-intelligence/ConversationTelemetryService.ts +1101 -0
  62. package/src/main/services/session-intelligence/LocalSessionScanner.ts +512 -0
  63. package/src/main/services/session-intelligence/SessionUsageParser.ts +4 -4
  64. package/src/main/services/system-manager/SystemManagerConfigService.ts +122 -0
  65. package/src/main/services/system-manager/SystemManagerPtyService.ts +233 -0
  66. package/src/main/services/system-manager/WorkflowPromptService.ts +75 -0
  67. package/src/main/services/teams-mvp/TaskDispatchService.ts +5 -6
  68. package/src/main/services/teams-mvp/TeamProvisioningService.ts +39 -2
  69. package/src/main/services/teams-mvp/TeamWorkspaceService.ts +22 -4
  70. package/src/main/utils/teamProjectResolution.ts +15 -0
  71. package/src/renderer/App.tsx +8 -4
  72. package/src/renderer/api/httpClient.ts +68 -18
  73. package/src/renderer/api/providers.ts +23 -2
  74. package/src/renderer/assets/participant-avatars/01.svg +3 -0
  75. package/src/renderer/assets/participant-avatars/02.svg +3 -0
  76. package/src/renderer/assets/participant-avatars/03.svg +3 -0
  77. package/src/renderer/assets/participant-avatars/04.svg +3 -0
  78. package/src/renderer/assets/participant-avatars/05.svg +3 -0
  79. package/src/renderer/assets/participant-avatars/06.svg +3 -0
  80. package/src/renderer/assets/participant-avatars/07.svg +3 -0
  81. package/src/renderer/assets/participant-avatars/08.svg +3 -0
  82. package/src/renderer/assets/participant-avatars/09.svg +3 -0
  83. package/src/renderer/assets/participant-avatars/10.svg +3 -0
  84. package/src/renderer/assets/participant-avatars/11.svg +3 -0
  85. package/src/renderer/assets/participant-avatars/12.svg +3 -0
  86. package/src/renderer/assets/participant-avatars/13.svg +3 -0
  87. package/src/renderer/components/chat/ChatHistoryItem.tsx +1 -1
  88. package/src/renderer/components/chat/items/SubagentItem.tsx +2 -2
  89. package/src/renderer/components/chat/viewers/MermaidDiagram.tsx +2 -2
  90. package/src/renderer/components/common/ErrorBoundary.tsx +1 -1
  91. package/src/renderer/components/common/TerminalPane.tsx +213 -0
  92. package/src/renderer/components/dashboard/CliStatusBanner.tsx +7 -7
  93. package/src/renderer/components/dashboard/DashboardView.tsx +9 -36
  94. package/src/renderer/components/extensions/ExtensionStoreView.tsx +7 -126
  95. package/src/renderer/components/extensions/ExtensionsSubTabTrigger.tsx +1 -1
  96. package/src/renderer/components/extensions/common/ExtensionToast.tsx +3 -3
  97. package/src/renderer/components/extensions/common/SourceBadge.tsx +1 -1
  98. package/src/renderer/components/extensions/mcp/McpLibraryEnableDialog.tsx +305 -0
  99. package/src/renderer/components/extensions/mcp/McpLibraryEntryDialog.tsx +418 -0
  100. package/src/renderer/components/extensions/mcp/McpLibraryPanel.tsx +404 -0
  101. package/src/renderer/components/extensions/plugins/CategoryChips.tsx +1 -1
  102. package/src/renderer/components/extensions/plugins/PluginCard.tsx +6 -6
  103. package/src/renderer/components/extensions/plugins/PluginDetailDialog.tsx +2 -2
  104. package/src/renderer/components/extensions/plugins/PluginsPanel.tsx +34 -21
  105. package/src/renderer/components/extensions/skills/SkillEditorDialog.tsx +1 -1
  106. package/src/renderer/components/extensions/skills/SkillsLibraryPanel.tsx +335 -0
  107. package/src/renderer/components/layout/PaneContent.tsx +8 -1
  108. package/src/renderer/components/layout/PaneResizeHandle.tsx +2 -2
  109. package/src/renderer/components/layout/Sidebar.tsx +13 -56
  110. package/src/renderer/components/layout/SortableTab.tsx +22 -33
  111. package/src/renderer/components/layout/TabBar.tsx +1 -1
  112. package/src/renderer/components/layout/TabContextMenu.tsx +1 -1
  113. package/src/renderer/components/report/sections/CostSection.tsx +2 -2
  114. package/src/renderer/components/report/sections/InsightsSection.tsx +1 -1
  115. package/src/renderer/components/runtime/ProviderRuntimeBackendSelector.tsx +2 -2
  116. package/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx +768 -157
  117. package/src/renderer/components/schedules/SchedulesView.tsx +51 -462
  118. package/src/renderer/components/schedules/calendar/CalendarDayView.tsx +173 -0
  119. package/src/renderer/components/schedules/calendar/CalendarEventBlock.tsx +113 -0
  120. package/src/renderer/components/schedules/calendar/CalendarHeader.tsx +148 -0
  121. package/src/renderer/components/schedules/calendar/CalendarMonthView.tsx +142 -0
  122. package/src/renderer/components/schedules/calendar/CalendarWeekView.tsx +219 -0
  123. package/src/renderer/components/schedules/calendar/ScheduleCalendarBoard.tsx +41 -0
  124. package/src/renderer/components/schedules/calendar/TeamGanttView.tsx +405 -0
  125. package/src/renderer/components/schedules/calendar/computeOccurrences.ts +234 -0
  126. package/src/renderer/components/schedules/calendar/index.ts +2 -0
  127. package/src/renderer/components/schedules/calendar/types.ts +44 -0
  128. package/src/renderer/components/search/CommandPalette.tsx +4 -4
  129. package/src/renderer/components/settings/SettingsTabs.tsx +50 -55
  130. package/src/renderer/components/settings/SettingsView.tsx +30 -35
  131. package/src/renderer/components/settings/components/SettingsSectionHeader.tsx +5 -1
  132. package/src/renderer/components/settings/components/SettingsSelect.tsx +5 -3
  133. package/src/renderer/components/settings/components/SettingsToggle.tsx +2 -2
  134. package/src/renderer/components/settings/sections/AdvancedSection.tsx +11 -42
  135. package/src/renderer/components/settings/sections/CliStatusSection.tsx +72 -113
  136. package/src/renderer/components/settings/sections/ConfigEditorDialog.tsx +1 -1
  137. package/src/renderer/components/settings/sections/GeneralSection.tsx +11 -3
  138. package/src/renderer/components/settings/sections/HarnessSection.tsx +18 -14
  139. package/src/renderer/components/settings/sections/PlatformsSection.tsx +3 -3
  140. package/src/renderer/components/settings/sections/TaskBusSection.tsx +33 -40
  141. package/src/renderer/components/settings/sections/index.ts +0 -1
  142. package/src/renderer/components/sidebar/SessionFiltersPopover.tsx +1 -1
  143. package/src/renderer/components/sidebar/SessionItem.tsx +3 -3
  144. package/src/renderer/components/sidebar/SidebarSessions.tsx +184 -6
  145. package/src/renderer/components/sidebar/SidebarTaskItem.tsx +4 -4
  146. package/src/renderer/components/sidebar/WorkspaceBrowser.tsx +40 -5
  147. package/src/renderer/components/splash/splashScene.ts +121 -929
  148. package/src/renderer/components/system-manager/FolderBrowser.tsx +163 -0
  149. package/src/renderer/components/system-manager/SystemManagerView.tsx +351 -0
  150. package/src/renderer/components/tasks/TasksView.tsx +112 -134
  151. package/src/renderer/components/team/CcSessionsSection.tsx +431 -89
  152. package/src/renderer/components/team/ClaudeLogsFilterPopover.tsx +1 -1
  153. package/src/renderer/components/team/ClaudeLogsPanel.tsx +1 -1
  154. package/src/renderer/components/team/CollapsibleTeamSection.tsx +17 -32
  155. package/src/renderer/components/team/ProcessesSection.tsx +2 -2
  156. package/src/renderer/components/team/TaskTooltip.tsx +2 -2
  157. package/src/renderer/components/team/TeamDetailView.tsx +319 -123
  158. package/src/renderer/components/team/TeamListFilterPopover.tsx +1 -1
  159. package/src/renderer/components/team/TeamListView.tsx +109 -124
  160. package/src/renderer/components/team/TeamSessionsSection.tsx +6 -6
  161. package/src/renderer/components/team/UnreadCommentsBadge.tsx +1 -1
  162. package/src/renderer/components/team/activity/ActivityItem.tsx +9 -9
  163. package/src/renderer/components/team/activity/ActivityTimeline.tsx +5 -5
  164. package/src/renderer/components/team/activity/LeadThoughtsGroup.tsx +3 -3
  165. package/src/renderer/components/team/activity/ReplyQuoteBlock.tsx +4 -4
  166. package/src/renderer/components/team/dialogs/CreateTaskDialog.tsx +4 -4
  167. package/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +84 -306
  168. package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +259 -342
  169. package/src/renderer/components/team/dialogs/GlobalTaskDetailDialog.tsx +1 -1
  170. package/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx +18 -16
  171. package/src/renderer/components/team/dialogs/PlatformBindingDialog.tsx +221 -0
  172. package/src/renderer/components/team/dialogs/PlatformManualForm.tsx +8 -1
  173. package/src/renderer/components/team/dialogs/PlatformSetupQR.tsx +5 -5
  174. package/src/renderer/components/team/dialogs/RuntimeConfigDialog.tsx +361 -0
  175. package/src/renderer/components/team/dialogs/SendMessageDialog.tsx +6 -6
  176. package/src/renderer/components/team/dialogs/SkipPermissionsCheckbox.tsx +6 -6
  177. package/src/renderer/components/team/dialogs/StatusHistoryTimeline.tsx +1 -1
  178. package/src/renderer/components/team/dialogs/TaskAttachments.tsx +1 -1
  179. package/src/renderer/components/team/dialogs/TaskCommentInput.tsx +6 -6
  180. package/src/renderer/components/team/dialogs/TaskCommentsSection.tsx +4 -4
  181. package/src/renderer/components/team/dialogs/TaskDetailDialog.tsx +3 -3
  182. package/src/renderer/components/team/dialogs/platformMeta.ts +122 -11
  183. package/src/renderer/components/team/dialogs/useTeamEditForm.ts +17 -5
  184. package/src/renderer/components/team/editor/EditorFileTree.tsx +4 -4
  185. package/src/renderer/components/team/editor/EditorSearchPanel.tsx +1 -1
  186. package/src/renderer/components/team/editor/MarkdownSplitView.tsx +1 -1
  187. package/src/renderer/components/team/editor/NewFileDialog.tsx +1 -1
  188. package/src/renderer/components/team/editor/ProjectEditorOverlay.tsx +1 -1
  189. package/src/renderer/components/team/editor/SearchInFilesPanel.tsx +1 -1
  190. package/src/renderer/components/team/kanban/KanbanBoard.tsx +9 -9
  191. package/src/renderer/components/team/kanban/KanbanFilterPopover.tsx +4 -4
  192. package/src/renderer/components/team/kanban/KanbanSearchInput.tsx +1 -1
  193. package/src/renderer/components/team/kanban/KanbanSortPopover.tsx +5 -5
  194. package/src/renderer/components/team/kanban/KanbanTaskCard.tsx +4 -4
  195. package/src/renderer/components/team/members/MemberCard.tsx +14 -47
  196. package/src/renderer/components/team/members/MemberDetailDialog.tsx +3 -95
  197. package/src/renderer/components/team/members/MemberDetailStats.tsx +50 -65
  198. package/src/renderer/components/team/members/MemberDraftRow.tsx +1 -1
  199. package/src/renderer/components/team/members/MemberStatsTab.tsx +2 -2
  200. package/src/renderer/components/team/members/MemberWorkspaceTab.tsx +1 -1
  201. package/src/renderer/components/team/messages/MessageComposer.tsx +10 -112
  202. package/src/renderer/components/team/messages/MessagesFilterPopover.tsx +1 -1
  203. package/src/renderer/components/team/messages/MessagesPanel.tsx +136 -119
  204. package/src/renderer/components/team/review/ChangeReviewDialog.tsx +1 -1
  205. package/src/renderer/components/team/schedule/ScheduleStatusBadge.tsx +3 -3
  206. package/src/renderer/components/team/sidebar/TeamSidebarRail.tsx +4 -4
  207. package/src/renderer/components/team/tasks/TaskRow.tsx +1 -1
  208. package/src/renderer/components/team/tools/AddMcpInline.tsx +27 -17
  209. package/src/renderer/components/team/tools/McpChip.tsx +6 -3
  210. package/src/renderer/components/team/tools/SkillChip.tsx +3 -3
  211. package/src/renderer/components/team/tools/ToolsSection.tsx +418 -70
  212. package/src/renderer/components/ui/MemberSelect.tsx +2 -2
  213. package/src/renderer/components/ui/MentionSuggestionList.tsx +2 -2
  214. package/src/renderer/components/ui/MentionableTextarea.tsx +3 -3
  215. package/src/renderer/hooks/useExtensionsTabState.ts +3 -114
  216. package/src/renderer/index.css +56 -39
  217. package/src/renderer/index.html +17 -50
  218. package/src/renderer/store/index.ts +2 -1
  219. package/src/renderer/store/slices/scheduleSlice.ts +1 -1
  220. package/src/renderer/store/slices/teamSlice.ts +45 -168
  221. package/src/renderer/utils/claudeCodeOnlyProviders.ts +3 -10
  222. package/src/renderer/utils/memberHelpers.ts +5 -17
  223. package/src/renderer/utils/openCodeRuntimeDeliveryDiagnostics.ts +4 -2
  224. package/src/renderer/utils/providerSlashCommands.ts +0 -5
  225. package/src/renderer/utils/scheduleFormatters.ts +3 -1
  226. package/src/renderer/utils/teamMessageFiltering.ts +14 -1
  227. package/src/renderer/utils/teamModelAvailability.ts +18 -2
  228. package/src/shared/types/api.ts +121 -2
  229. package/src/shared/types/ccConnect.ts +2 -0
  230. package/src/shared/types/index.ts +3 -0
  231. package/src/shared/types/systemManager.ts +49 -0
  232. package/src/shared/types/team.ts +29 -0
  233. package/src/shared/types/terminal.ts +4 -2
  234. package/src/shared/utils/extensionNormalizers.ts +15 -8
  235. package/src/shared/utils/providerExtensionCapabilities.ts +2 -2
  236. package/dist-renderer/assets/ProjectEditorOverlay-lJZi-9Hp.js +0 -52
  237. package/dist-renderer/assets/channel-yIlSKy0e.js +0 -1
  238. package/dist-renderer/assets/classDiagram-2ON5EDUG-24fHez0s.js +0 -1
  239. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-24fHez0s.js +0 -1
  240. package/dist-renderer/assets/clone-BTNuUva-.js +0 -1
  241. package/dist-renderer/assets/index-Bi6nrZ4z.css +0 -1
  242. package/dist-renderer/assets/splashScene-C8lWNnm4.js +0 -1
  243. package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-_m6iPPUR.js +0 -1
@@ -2020,7 +2020,12 @@ export interface TeamSlice {
2020
2020
  fetchTeams: () => Promise<void>;
2021
2021
  fetchAllTasks: () => Promise<void>;
2022
2022
  openTeamsTab: () => void;
2023
- openTeamTab: (teamName: string, projectPath?: string, taskId?: string) => void;
2023
+ openSystemManager: () => Promise<void>;
2024
+ openTeamTab: (
2025
+ teamName: string,
2026
+ projectPath?: string,
2027
+ options?: { taskId?: string; displayName?: string }
2028
+ ) => void;
2024
2029
  clearKanbanFilter: () => void;
2025
2030
  ensureTeamGraphSlotAssignments: (
2026
2031
  teamName: string,
@@ -2726,7 +2731,21 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
2726
2731
  });
2727
2732
  },
2728
2733
 
2729
- openTeamTab: (teamName: string, projectPath?: string, _taskId?: string) => {
2734
+ openSystemManager: async () => {
2735
+ const manager = await unwrapIpc('team:ensureSystemManager', () =>
2736
+ api.teams.ensureSystemManager()
2737
+ );
2738
+ await get().fetchTeams();
2739
+ get().openTeamTab(manager.teamName, manager.projectPath || manager.workDir, {
2740
+ displayName: manager.displayName,
2741
+ });
2742
+ },
2743
+
2744
+ openTeamTab: (
2745
+ teamName: string,
2746
+ projectPath?: string,
2747
+ options?: { taskId?: string; displayName?: string }
2748
+ ) => {
2730
2749
  if (!teamName.trim()) {
2731
2750
  return;
2732
2751
  }
@@ -2749,7 +2768,8 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
2749
2768
  const teamSummary = state.teamByName[teamName];
2750
2769
  const selectedTeamDisplayName =
2751
2770
  state.selectedTeamName === teamName ? state.selectedTeamData?.config.name : undefined;
2752
- const displayName = teamSummary?.displayName || selectedTeamDisplayName || teamName;
2771
+ const displayName =
2772
+ options?.displayName || teamSummary?.displayName || selectedTeamDisplayName || teamName;
2753
2773
 
2754
2774
  const allTabs = state.getAllPaneTabs();
2755
2775
  const existing = allTabs.find((tab) => tab.type === 'team' && tab.teamName === teamName);
@@ -3674,12 +3694,10 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
3674
3694
  page.messages
3675
3695
  );
3676
3696
  const preserveLoadedOlderTail =
3677
- current.olderHydrated &&
3678
- Array.isArray(retainedOlderTail) &&
3679
- retainedOlderTail.length > 0;
3697
+ Array.isArray(retainedOlderTail) && retainedOlderTail.length > 0;
3680
3698
  const nextCanonical = headChanged
3681
3699
  ? preserveLoadedOlderTail
3682
- ? mergeTeamMessages(retainedOlderTail, page.messages)
3700
+ ? mergeTeamMessages(page.messages, retainedOlderTail)
3683
3701
  : page.messages
3684
3702
  : current.canonicalMessages;
3685
3703
  const nextOptimistic = pruneOptimisticMessages(current.optimisticMessages, nextCanonical);
@@ -4368,6 +4386,7 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
4368
4386
  clearTeamScopedTransientState(teamName);
4369
4387
  set((state) => ({
4370
4388
  ...collectTeamScopedStateRemovals(state, teamName),
4389
+ ...buildTeamScopedProgressTombstones(state, teamName, nowIso()),
4371
4390
  teams: state.teams.filter((team) => team.teamName !== teamName),
4372
4391
  selectedTeamName: state.selectedTeamName === teamName ? null : state.selectedTeamName,
4373
4392
  selectedTeamData: state.selectedTeamName === teamName ? null : state.selectedTeamData,
@@ -4430,118 +4449,20 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
4430
4449
  },
4431
4450
 
4432
4451
  createTeam: async (request: TeamCreateRequest) => {
4433
- // Ensure provisioning progress subscription is active (defensive).
4434
- get().subscribeProvisioningProgress();
4435
4452
  invalidateTeamLocalStateEpoch(request.teamName);
4436
4453
  clearPendingReplyRefreshTimer(request.teamName);
4437
4454
  clearPendingReplyRefreshWaits(request.teamName);
4438
4455
  clearTeamScopedTransientState(request.teamName);
4439
4456
 
4440
- // Establish a per-team floor so late events from a previous run can't override UI.
4441
- const floor = nowIso();
4442
- set((state) => ({
4443
- provisioningStartedAtFloorByTeam: {
4444
- ...state.provisioningStartedAtFloorByTeam,
4445
- [request.teamName]: floor,
4446
- },
4447
- }));
4448
-
4449
- // Clear stale provisioning runs for this team so the banner starts fresh
4450
- set((state) => {
4451
- const cleaned = { ...state.provisioningRuns };
4452
- for (const [runId, run] of Object.entries(cleaned)) {
4453
- if (run.teamName === request.teamName) {
4454
- delete cleaned[runId];
4455
- }
4456
- }
4457
- const nextErrors = { ...state.provisioningErrorByTeam };
4458
- delete nextErrors[request.teamName];
4459
- const nextSpawnStatuses = { ...state.memberSpawnStatusesByTeam };
4460
- delete nextSpawnStatuses[request.teamName];
4461
- const nextSpawnSnapshots = { ...state.memberSpawnSnapshotsByTeam };
4462
- delete nextSpawnSnapshots[request.teamName];
4463
- const nextRuntime = { ...state.teamAgentRuntimeByTeam };
4464
- delete nextRuntime[request.teamName];
4465
- const nextActiveTools = { ...state.activeToolsByTeam };
4466
- delete nextActiveTools[request.teamName];
4467
- const nextFinishedVisible = { ...state.finishedVisibleByTeam };
4468
- delete nextFinishedVisible[request.teamName];
4469
- const nextToolHistory = { ...state.toolHistoryByTeam };
4470
- delete nextToolHistory[request.teamName];
4471
- const nextRuntimeRunIdByTeam = { ...state.currentRuntimeRunIdByTeam };
4472
- const previousRuntimeRunId = nextRuntimeRunIdByTeam[request.teamName];
4473
- delete nextRuntimeRunIdByTeam[request.teamName];
4474
- const nextIgnoredRuntimeRunIds = previousRuntimeRunId
4475
- ? {
4476
- ...state.ignoredRuntimeRunIds,
4477
- [previousRuntimeRunId]: request.teamName,
4478
- }
4479
- : state.ignoredRuntimeRunIds;
4480
- const visibleLoadingResets = collectTeamScopedVisibleLoadingResets(state, request.teamName);
4481
- return {
4482
- provisioningRuns: cleaned,
4483
- provisioningErrorByTeam: nextErrors,
4484
- memberSpawnStatusesByTeam: nextSpawnStatuses,
4485
- memberSpawnSnapshotsByTeam: nextSpawnSnapshots,
4486
- teamAgentRuntimeByTeam: nextRuntime,
4487
- activeToolsByTeam: nextActiveTools,
4488
- finishedVisibleByTeam: nextFinishedVisible,
4489
- toolHistoryByTeam: nextToolHistory,
4490
- currentRuntimeRunIdByTeam: nextRuntimeRunIdByTeam,
4491
- ignoredProvisioningRunIds: state.ignoredProvisioningRunIds,
4492
- ignoredRuntimeRunIds: nextIgnoredRuntimeRunIds,
4493
- ...visibleLoadingResets,
4494
- };
4495
- });
4496
-
4497
- // Optimistic progress entry: ensures banner shows even if IPC progress is delayed/missed.
4498
- const pendingRunId = `pending:${request.teamName}:${Date.now()}`;
4499
- set((state) => ({
4500
- provisioningRuns: {
4501
- ...state.provisioningRuns,
4502
- [pendingRunId]: {
4503
- runId: pendingRunId,
4504
- teamName: request.teamName,
4505
- state: 'spawning',
4506
- message: '正在启动 Claude CLI 进程...',
4507
- startedAt: floor,
4508
- updatedAt: floor,
4509
- },
4510
- },
4511
- currentProvisioningRunIdByTeam: {
4512
- ...state.currentProvisioningRunIdByTeam,
4513
- [request.teamName]: pendingRunId,
4514
- },
4515
- // Synthetic card for the team list — visible until fetchTeams() picks up the real team.
4516
- provisioningSnapshotByTeam: {
4517
- ...state.provisioningSnapshotByTeam,
4518
- [request.teamName]: {
4519
- teamName: request.teamName,
4520
- displayName: request.displayName || request.teamName,
4521
- description: request.description || '',
4522
- color: request.color,
4523
- memberCount: request.members.length,
4524
- members: request.members.map((m) => ({ name: m.name, role: m.role })),
4525
- taskCount: 0,
4526
- lastActivity: null,
4527
- projectPath: request.cwd || undefined,
4528
- },
4529
- },
4530
- }));
4531
- // Initialize per-team tool approval settings based on skipPermissions flag
4532
- const initialSettings: ToolApprovalSettings =
4533
- request.skipPermissions === false
4534
- ? DEFAULT_TOOL_APPROVAL_SETTINGS
4535
- : { ...DEFAULT_TOOL_APPROVAL_SETTINGS, autoAllowAll: true };
4536
- saveToolApprovalSettingsForTeam(request.teamName, initialSettings);
4537
- set({ toolApprovalSettings: initialSettings });
4538
4457
  try {
4539
4458
  if (typeof api.teams.createTeam !== 'function') {
4540
4459
  throw new Error(
4541
4460
  'Current preload version does not support team:create. Restart the dev app.'
4542
4461
  );
4543
4462
  }
4544
- const response = await unwrapIpc('team:create', () => api.teams.createTeam(request));
4463
+
4464
+ // Just create the team config — no provisioning, no launching.
4465
+ await unwrapIpc('team:create', () => api.teams.createTeam(request));
4545
4466
 
4546
4467
  // Persist per-team launch params (model, effort, limit context)
4547
4468
  const baseModel = extractBaseModel(request.model, request.providerId);
@@ -4554,55 +4475,21 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
4554
4475
  limitContext: request.limitContext ?? false,
4555
4476
  };
4556
4477
  saveLaunchParams(request.teamName, params);
4557
- set((state) => ({
4558
- launchParamsByTeam: {
4559
- ...state.launchParamsByTeam,
4560
- [request.teamName]: params,
4561
- },
4562
- }));
4563
4478
 
4564
- set((state) => {
4565
- const nextRuns = { ...state.provisioningRuns };
4566
- const pendingRun = nextRuns[pendingRunId];
4567
- const realProgressAlreadyExists = response.runId in nextRuns;
4568
- if (pendingRun) {
4569
- delete nextRuns[pendingRunId];
4570
- // Only use pending data as fallback if real progress events haven't arrived yet.
4571
- // This prevents overwriting real progress (e.g. 'assembling') with stale pending data ('spawning')
4572
- // when the invoke response arrives before IPC progress events.
4573
- if (!realProgressAlreadyExists) {
4574
- nextRuns[response.runId] = { ...pendingRun, runId: response.runId };
4575
- }
4576
- }
4577
- return {
4578
- provisioningRuns: nextRuns,
4579
- currentProvisioningRunIdByTeam: {
4580
- ...state.currentProvisioningRunIdByTeam,
4581
- [request.teamName]: response.runId,
4582
- },
4583
- currentRuntimeRunIdByTeam: {
4584
- ...state.currentRuntimeRunIdByTeam,
4585
- [request.teamName]: response.runId,
4586
- },
4587
- };
4588
- });
4589
- try {
4590
- await get().getProvisioningStatus(response.runId);
4591
- } catch {
4592
- // ignore — polling below will retry
4593
- }
4479
+ // Initialize per-team tool approval settings based on skipPermissions flag
4480
+ const initialSettings: ToolApprovalSettings =
4481
+ request.skipPermissions === false
4482
+ ? DEFAULT_TOOL_APPROVAL_SETTINGS
4483
+ : { ...DEFAULT_TOOL_APPROVAL_SETTINGS, autoAllowAll: true };
4484
+ saveToolApprovalSettingsForTeam(request.teamName, initialSettings);
4485
+
4486
+ // Refresh team list to pick up the new team
4594
4487
  void get().fetchTeams();
4595
- if (get().selectedTeamName === request.teamName) {
4596
- void get().selectTeam(request.teamName, { allowReloadWhileProvisioning: true });
4597
- }
4598
4488
  window.setTimeout(() => {
4599
4489
  void get().fetchTeams();
4600
- if (get().selectedTeamName === request.teamName) {
4601
- void get().selectTeam(request.teamName, { allowReloadWhileProvisioning: true });
4602
- }
4603
4490
  }, 1200);
4604
- void pollProvisioningStatus(get, response.runId);
4605
- return response.runId;
4491
+
4492
+ return request.teamName;
4606
4493
  } catch (error) {
4607
4494
  const message =
4608
4495
  error instanceof IpcError
@@ -4610,22 +4497,12 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
4610
4497
  : error instanceof Error
4611
4498
  ? error.message
4612
4499
  : 'Failed to create team';
4613
- set((state) => {
4614
- const nextRuns = { ...state.provisioningRuns };
4615
- delete nextRuns[pendingRunId];
4616
- const nextCurrentRunIdByTeam = { ...state.currentProvisioningRunIdByTeam };
4617
- if (nextCurrentRunIdByTeam[request.teamName] === pendingRunId) {
4618
- delete nextCurrentRunIdByTeam[request.teamName];
4619
- }
4620
- return {
4621
- provisioningRuns: nextRuns,
4622
- currentProvisioningRunIdByTeam: nextCurrentRunIdByTeam,
4623
- provisioningErrorByTeam: {
4624
- ...state.provisioningErrorByTeam,
4625
- [request.teamName]: message,
4626
- },
4627
- };
4628
- });
4500
+ set((state) => ({
4501
+ provisioningErrorByTeam: {
4502
+ ...state.provisioningErrorByTeam,
4503
+ [request.teamName]: message,
4504
+ },
4505
+ }));
4629
4506
  throw error;
4630
4507
  }
4631
4508
  },
@@ -12,9 +12,7 @@ export function filterMainScreenCliProviders<
12
12
  providerId: CliProviderId;
13
13
  },
14
14
  >(providers: readonly T[]): T[] {
15
- return providers.filter((provider) =>
16
- ['anthropic', 'codex', 'gemini', 'opencode'].includes(provider.providerId)
17
- );
15
+ return providers.filter((provider) => ['anthropic', 'codex'].includes(provider.providerId));
18
16
  }
19
17
 
20
18
  function createClaudeCodeProviderFromCliStatus(status: CliInstallationStatus): CliProviderStatus {
@@ -110,17 +108,12 @@ export function normalizeCreateLaunchProviderForUi(
110
108
  providerId: TeamProviderId | undefined,
111
109
  _multimodelEnabled: boolean
112
110
  ): TeamProviderId {
113
- return providerId === 'anthropic' ||
114
- providerId === 'codex' ||
115
- providerId === 'gemini' ||
116
- providerId === 'opencode'
117
- ? providerId
118
- : 'anthropic';
111
+ return providerId === 'anthropic' || providerId === 'codex' ? providerId : 'anthropic';
119
112
  }
120
113
 
121
114
  export function isCreateLaunchProviderDisabled(
122
115
  providerId: TeamProviderId,
123
116
  _multimodelEnabled: boolean
124
117
  ): boolean {
125
- return !['anthropic', 'codex', 'gemini', 'opencode'].includes(providerId);
118
+ return !['anthropic', 'codex'].includes(providerId);
126
119
  }
@@ -46,15 +46,9 @@ function hashStringToIndex(str: string): number {
46
46
  export function agentAvatarUrl(name: string, size = 64): string {
47
47
  void size;
48
48
  const normalized = name.trim().toLowerCase();
49
- if (isLeadMemberName(normalized)) {
50
- return LEAD_PARTICIPANT_AVATAR_URL;
51
- }
52
49
 
53
- // Temporarily disabled external avatar API.
54
- // return `https://robohash.org/${encodeURIComponent(name)}?size=${size}x${size}`;
55
- return getParticipantAvatarUrlByIndex(
56
- hashStringToIndex(normalized) % PARTICIPANT_AVATAR_URLS.length
57
- );
50
+ // DiceBear adventurer avatars deterministic per name, no API key needed
51
+ return `https://api.dicebear.com/9.x/adventurer/svg?seed=${encodeURIComponent(normalized)}&backgroundColor=c0aede,d1d4f9,ffd5dc,ffdfbf,b6e3f4,c1f0c1`;
58
52
  }
59
53
 
60
54
  export const STATUS_DOT_COLORS: Record<MemberStatus, string> = {
@@ -804,22 +798,16 @@ export function buildMemberAvatarMap(members: readonly MemberAvatarInput[]): Map
804
798
  const teammateMembers = activeMembers.filter((member) => !isLeadMember(member));
805
799
 
806
800
  for (const [index, member] of leadMembers.entries()) {
807
- map.set(member.name, index === 0 ? LEAD_PARTICIPANT_AVATAR_URL : agentAvatarUrl(member.name));
801
+ map.set(member.name, agentAvatarUrl(member.name));
808
802
  }
809
803
 
810
804
  for (const [index, member] of teammateMembers.entries()) {
811
- map.set(
812
- member.name,
813
- getParticipantAvatarUrlByIndex(1 + (index % (PARTICIPANT_AVATAR_URLS.length - 1)))
814
- );
805
+ map.set(member.name, agentAvatarUrl(member.name));
815
806
  }
816
807
 
817
808
  for (const member of members) {
818
809
  if (!map.has(member.name)) {
819
- map.set(
820
- member.name,
821
- isLeadMember(member) ? LEAD_PARTICIPANT_AVATAR_URL : agentAvatarUrl(member.name)
822
- );
810
+ map.set(member.name, agentAvatarUrl(member.name));
823
811
  }
824
812
  }
825
813
 
@@ -17,6 +17,8 @@ interface OpenCodeRuntimeDeliveryDiagnostics {
17
17
  debugDetails: OpenCodeRuntimeDeliveryDebugDetails | null;
18
18
  }
19
19
 
20
+ const FAILED_WARNING =
21
+ 'OpenCode runtime delivery failed. Message was saved to inbox, but live delivery did not complete.';
20
22
  const PENDING_WARNING =
21
23
  'OpenCode runtime delivery is still being checked. Message was saved and will be retried if needed.';
22
24
 
@@ -33,7 +35,7 @@ export function buildOpenCodeRuntimeDeliveryDiagnostics(
33
35
  const isFailed = runtimeDelivery.delivered === false;
34
36
  if (isFailed) {
35
37
  return {
36
- warning: null,
38
+ warning: FAILED_WARNING,
37
39
  debugDetails: {
38
40
  messageId: result.messageId,
39
41
  providerId: runtimeDelivery.providerId,
@@ -64,7 +66,7 @@ export function buildOpenCodeRuntimeDeliveryDiagnostics(
64
66
  debugDetails: {
65
67
  messageId: result.messageId,
66
68
  providerId: runtimeDelivery.providerId,
67
- delivered: null,
69
+ delivered: typeof runtimeDelivery.delivered === 'boolean' ? runtimeDelivery.delivered : null,
68
70
  responsePending: true,
69
71
  responseState: runtimeDelivery.responseState ?? null,
70
72
  ledgerStatus: runtimeDelivery.ledgerStatus ?? null,
@@ -39,11 +39,6 @@ const CODEX_SLASH_COMMAND_SUGGESTIONS: readonly KnownSlashCommandDefinition[] =
39
39
  command: '/status',
40
40
  description: 'Show session configuration and token usage.',
41
41
  },
42
- {
43
- name: 'mcp',
44
- command: '/mcp',
45
- description: 'List configured MCP tools for this session.',
46
- },
47
42
  {
48
43
  name: 'mention',
49
44
  command: '/mention',
@@ -8,8 +8,10 @@ export function formatNextRun(isoString?: string): string {
8
8
  if (!isoString) return '暂无';
9
9
  try {
10
10
  const date = new Date(isoString);
11
+ const ts = date.getTime();
12
+ if (!Number.isFinite(ts)) return isoString;
11
13
  const now = Date.now();
12
- const diffMs = date.getTime() - now;
14
+ const diffMs = ts - now;
13
15
 
14
16
  if (diffMs < 0) return '已逾期';
15
17
 
@@ -70,7 +70,20 @@ export function filterTeamMessages(
70
70
  const summary = getSanitizedInboxMessageSummary(m).toLowerCase();
71
71
  const from = (m.from ?? '').toLowerCase();
72
72
  const to = (m.to ?? '').toLowerCase();
73
- return text.includes(q) || summary.includes(q) || from.includes(q) || to.includes(q);
73
+ const sessionTitle = (m.session?.title ?? '').toLowerCase();
74
+ const sessionUserName = (m.session?.userName ?? '').toLowerCase();
75
+ const sessionChatName = (m.session?.chatName ?? '').toLowerCase();
76
+ const sessionKey = (m.session?.key ?? '').toLowerCase();
77
+ return (
78
+ text.includes(q) ||
79
+ summary.includes(q) ||
80
+ from.includes(q) ||
81
+ to.includes(q) ||
82
+ sessionTitle.includes(q) ||
83
+ sessionUserName.includes(q) ||
84
+ sessionChatName.includes(q) ||
85
+ sessionKey.includes(q)
86
+ );
74
87
  });
75
88
  }
76
89
 
@@ -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 {
@@ -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