@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.
- package/dist-renderer/assets/ProjectEditorOverlay-CemDOX-3.js +58 -0
- package/dist-renderer/assets/{TeamGraphOverlay-ZEDfZyHb.js → TeamGraphOverlay-hPY770Db.js} +1 -1
- package/dist-renderer/assets/{_basePickBy-CIhniz70.js → _basePickBy-BHHrJT1i.js} +1 -1
- package/dist-renderer/assets/{_baseUniq-cKAW4Q8I.js → _baseUniq-CWErBtke.js} +1 -1
- package/dist-renderer/assets/{arc-YmNsoDXW.js → arc-C_o2_Uv8.js} +1 -1
- package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-DHEls2sX.js → architectureDiagram-VXUJARFQ-DUW0LI3t.js} +1 -1
- package/dist-renderer/assets/{blockDiagram-VD42YOAC-Bpwf1Sbg.js → blockDiagram-VD42YOAC-CWbCE9hQ.js} +1 -1
- package/dist-renderer/assets/{c4Diagram-YG6GDRKO-B0IaQ4w5.js → c4Diagram-YG6GDRKO-BjLadrfV.js} +1 -1
- package/dist-renderer/assets/channel-DyP9YlCF.js +1 -0
- package/dist-renderer/assets/{chunk-4BX2VUAB-DLk-hcFc.js → chunk-4BX2VUAB-CPnvjZl9.js} +1 -1
- package/dist-renderer/assets/{chunk-55IACEB6-1XRmX_Zm.js → chunk-55IACEB6-OlL47yXQ.js} +1 -1
- package/dist-renderer/assets/{chunk-B4BG7PRW-1waH1DAD.js → chunk-B4BG7PRW-DTasjbm8.js} +1 -1
- package/dist-renderer/assets/{chunk-DI55MBZ5-BqpZBtrN.js → chunk-DI55MBZ5-C5_Xaqkk.js} +1 -1
- package/dist-renderer/assets/{chunk-FMBD7UC4-Bly7vVym.js → chunk-FMBD7UC4-NdoM4DMR.js} +1 -1
- package/dist-renderer/assets/{chunk-QN33PNHL-Ci2QWBAs.js → chunk-QN33PNHL-C8Fybejy.js} +1 -1
- package/dist-renderer/assets/{chunk-QZHKN3VN-YCqFW7d-.js → chunk-QZHKN3VN-E98TYFXJ.js} +1 -1
- package/dist-renderer/assets/{chunk-TZMSLE5B-B0xGXInl.js → chunk-TZMSLE5B-h4lFgkIq.js} +1 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-BqffFTae.js +1 -0
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-BqffFTae.js +1 -0
- package/dist-renderer/assets/clone-MPcKWs2O.js +1 -0
- package/dist-renderer/assets/{cose-bilkent-S5V4N54A-DxcFNQKT.js → cose-bilkent-S5V4N54A-DtQ7fkrs.js} +1 -1
- package/dist-renderer/assets/{dagre-6UL2VRFP-DPo_RfZY.js → dagre-6UL2VRFP-CN-nL_z4.js} +1 -1
- package/dist-renderer/assets/{diagram-PSM6KHXK-U3hQsFe4.js → diagram-PSM6KHXK-DVJtqmm-.js} +1 -1
- package/dist-renderer/assets/{diagram-QEK2KX5R-OrwrAy0V.js → diagram-QEK2KX5R-DlxHxyXh.js} +1 -1
- package/dist-renderer/assets/{diagram-S2PKOQOG-CXATPWVw.js → diagram-S2PKOQOG-7dpzO6x6.js} +1 -1
- package/dist-renderer/assets/{erDiagram-Q2GNP2WA-B0e8AfMF.js → erDiagram-Q2GNP2WA-GP1TqsHi.js} +1 -1
- package/dist-renderer/assets/{flowDiagram-NV44I4VS-CXfzA4jJ.js → flowDiagram-NV44I4VS-C7ZLETuH.js} +1 -1
- package/dist-renderer/assets/{ganttDiagram-JELNMOA3-CMr08qVl.js → ganttDiagram-JELNMOA3-CvPB68dH.js} +1 -1
- package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-vYFHpPmy.js → gitGraphDiagram-V2S2FVAM-B5yOm3w7.js} +1 -1
- package/dist-renderer/assets/{graph-DOe5j8dH.js → graph-smeyY1YZ.js} +1 -1
- package/dist-renderer/assets/{index-BySQS7AB.js → index-BJx8XvG1.js} +1 -1
- package/dist-renderer/assets/{index-C_okzZXP.js → index-CQaXUAua.js} +1 -1
- package/dist-renderer/assets/{index-VJ-MM9xa.js → index-CajRpxO2.js} +1 -1
- package/dist-renderer/assets/{index-V7dAKPqd.js → index-ChG4rE-E.js} +587 -705
- package/dist-renderer/assets/index-DUd0uw9C.css +32 -0
- package/dist-renderer/assets/{index-CzWxVCRL.js → index-IhmXZWqf.js} +1 -1
- package/dist-renderer/assets/{index-B2Dy7M2G.js → index-x_JkoDRH.js} +1 -1
- package/dist-renderer/assets/{infoDiagram-HS3SLOUP-D_WubR0B.js → infoDiagram-HS3SLOUP-D-hWRQGY.js} +1 -1
- package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-w9ca-1TI.js → journeyDiagram-XKPGCS4Q-Bb6W8rUG.js} +1 -1
- package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-Jg9p6_pN.js → kanban-definition-3W4ZIXB7-CnHdUX0q.js} +1 -1
- package/dist-renderer/assets/{layout-B-z3y17c.js → layout-pqss_zkI.js} +1 -1
- package/dist-renderer/assets/{linear-D-RTX5UW.js → linear-B1mFITNh.js} +1 -1
- package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-CDQmHOYP.js → mindmap-definition-VGOIOE7T-DTD9q7-D.js} +1 -1
- package/dist-renderer/assets/{pieDiagram-ADFJNKIX-D_odsQL7.js → pieDiagram-ADFJNKIX-Df3mhrn7.js} +1 -1
- package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-BRsmYWSA.js → quadrantDiagram-AYHSOK5B-B1FZ09vH.js} +1 -1
- package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-ChNE_BOV.js → requirementDiagram-UZGBJVZJ-aEO78thZ.js} +1 -1
- package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-C8FtpwKc.js → sankeyDiagram-TZEHDZUN-6Ui--jp-.js} +1 -1
- package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-DmLCzNcc.js → sequenceDiagram-WL72ISMW-DF4Q1cAM.js} +1 -1
- package/dist-renderer/assets/splashScene-D0YB9uxm.js +17 -0
- package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-WJBm4bhu.js → stateDiagram-FKZM4ZOC-BqA2BI8C.js} +1 -1
- package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-Cs2ZtUD2.js +1 -0
- package/dist-renderer/assets/{timeline-definition-IT6M3QCI-BXs_hOJs.js → timeline-definition-IT6M3QCI-DoOkw_A8.js} +1 -1
- package/dist-renderer/assets/{treemap-GDKQZRPO-o04MA0G9.js → treemap-GDKQZRPO-DUe26QdD.js} +1 -1
- package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-Czj69XRd.js → xychartDiagram-PRI3JC2R-BKCnj5Xn.js} +1 -1
- package/dist-renderer/index.html +20 -53
- package/package.json +25 -18
- package/src/main/ipc/extensions.ts +2 -1
- package/src/main/server.ts +873 -221
- package/src/main/services/extensions/ExtensionFacadeService.ts +2 -5
- package/src/main/services/extensions/catalog/PluginCatalogService.ts +4 -2
- package/src/main/services/session-intelligence/ConversationTelemetryService.ts +1101 -0
- package/src/main/services/session-intelligence/LocalSessionScanner.ts +512 -0
- package/src/main/services/session-intelligence/SessionUsageParser.ts +4 -4
- package/src/main/services/system-manager/SystemManagerConfigService.ts +122 -0
- package/src/main/services/system-manager/SystemManagerPtyService.ts +233 -0
- package/src/main/services/system-manager/WorkflowPromptService.ts +75 -0
- package/src/main/services/teams-mvp/TaskDispatchService.ts +5 -6
- package/src/main/services/teams-mvp/TeamProvisioningService.ts +39 -2
- package/src/main/services/teams-mvp/TeamWorkspaceService.ts +22 -4
- package/src/main/utils/teamProjectResolution.ts +15 -0
- package/src/renderer/App.tsx +8 -4
- package/src/renderer/api/httpClient.ts +68 -18
- package/src/renderer/api/providers.ts +23 -2
- package/src/renderer/assets/participant-avatars/01.svg +3 -0
- package/src/renderer/assets/participant-avatars/02.svg +3 -0
- package/src/renderer/assets/participant-avatars/03.svg +3 -0
- package/src/renderer/assets/participant-avatars/04.svg +3 -0
- package/src/renderer/assets/participant-avatars/05.svg +3 -0
- package/src/renderer/assets/participant-avatars/06.svg +3 -0
- package/src/renderer/assets/participant-avatars/07.svg +3 -0
- package/src/renderer/assets/participant-avatars/08.svg +3 -0
- package/src/renderer/assets/participant-avatars/09.svg +3 -0
- package/src/renderer/assets/participant-avatars/10.svg +3 -0
- package/src/renderer/assets/participant-avatars/11.svg +3 -0
- package/src/renderer/assets/participant-avatars/12.svg +3 -0
- package/src/renderer/assets/participant-avatars/13.svg +3 -0
- package/src/renderer/components/chat/ChatHistoryItem.tsx +1 -1
- package/src/renderer/components/chat/items/SubagentItem.tsx +2 -2
- package/src/renderer/components/chat/viewers/MermaidDiagram.tsx +2 -2
- package/src/renderer/components/common/ErrorBoundary.tsx +1 -1
- package/src/renderer/components/common/TerminalPane.tsx +213 -0
- package/src/renderer/components/dashboard/CliStatusBanner.tsx +7 -7
- package/src/renderer/components/dashboard/DashboardView.tsx +9 -36
- package/src/renderer/components/extensions/ExtensionStoreView.tsx +7 -126
- package/src/renderer/components/extensions/ExtensionsSubTabTrigger.tsx +1 -1
- package/src/renderer/components/extensions/common/ExtensionToast.tsx +3 -3
- package/src/renderer/components/extensions/common/SourceBadge.tsx +1 -1
- package/src/renderer/components/extensions/mcp/McpLibraryEnableDialog.tsx +305 -0
- package/src/renderer/components/extensions/mcp/McpLibraryEntryDialog.tsx +418 -0
- package/src/renderer/components/extensions/mcp/McpLibraryPanel.tsx +404 -0
- package/src/renderer/components/extensions/plugins/CategoryChips.tsx +1 -1
- package/src/renderer/components/extensions/plugins/PluginCard.tsx +6 -6
- package/src/renderer/components/extensions/plugins/PluginDetailDialog.tsx +2 -2
- package/src/renderer/components/extensions/plugins/PluginsPanel.tsx +34 -21
- package/src/renderer/components/extensions/skills/SkillEditorDialog.tsx +1 -1
- package/src/renderer/components/extensions/skills/SkillsLibraryPanel.tsx +335 -0
- package/src/renderer/components/layout/PaneContent.tsx +8 -1
- package/src/renderer/components/layout/PaneResizeHandle.tsx +2 -2
- package/src/renderer/components/layout/Sidebar.tsx +13 -56
- package/src/renderer/components/layout/SortableTab.tsx +22 -33
- package/src/renderer/components/layout/TabBar.tsx +1 -1
- package/src/renderer/components/layout/TabContextMenu.tsx +1 -1
- package/src/renderer/components/report/sections/CostSection.tsx +2 -2
- package/src/renderer/components/report/sections/InsightsSection.tsx +1 -1
- package/src/renderer/components/runtime/ProviderRuntimeBackendSelector.tsx +2 -2
- package/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx +768 -157
- package/src/renderer/components/schedules/SchedulesView.tsx +51 -462
- package/src/renderer/components/schedules/calendar/CalendarDayView.tsx +173 -0
- package/src/renderer/components/schedules/calendar/CalendarEventBlock.tsx +113 -0
- package/src/renderer/components/schedules/calendar/CalendarHeader.tsx +148 -0
- package/src/renderer/components/schedules/calendar/CalendarMonthView.tsx +142 -0
- package/src/renderer/components/schedules/calendar/CalendarWeekView.tsx +219 -0
- package/src/renderer/components/schedules/calendar/ScheduleCalendarBoard.tsx +41 -0
- package/src/renderer/components/schedules/calendar/TeamGanttView.tsx +405 -0
- package/src/renderer/components/schedules/calendar/computeOccurrences.ts +234 -0
- package/src/renderer/components/schedules/calendar/index.ts +2 -0
- package/src/renderer/components/schedules/calendar/types.ts +44 -0
- package/src/renderer/components/search/CommandPalette.tsx +4 -4
- package/src/renderer/components/settings/SettingsTabs.tsx +50 -55
- package/src/renderer/components/settings/SettingsView.tsx +30 -35
- package/src/renderer/components/settings/components/SettingsSectionHeader.tsx +5 -1
- package/src/renderer/components/settings/components/SettingsSelect.tsx +5 -3
- package/src/renderer/components/settings/components/SettingsToggle.tsx +2 -2
- package/src/renderer/components/settings/sections/AdvancedSection.tsx +11 -42
- package/src/renderer/components/settings/sections/CliStatusSection.tsx +72 -113
- package/src/renderer/components/settings/sections/ConfigEditorDialog.tsx +1 -1
- package/src/renderer/components/settings/sections/GeneralSection.tsx +11 -3
- package/src/renderer/components/settings/sections/HarnessSection.tsx +18 -14
- package/src/renderer/components/settings/sections/PlatformsSection.tsx +3 -3
- package/src/renderer/components/settings/sections/TaskBusSection.tsx +33 -40
- package/src/renderer/components/settings/sections/index.ts +0 -1
- package/src/renderer/components/sidebar/SessionFiltersPopover.tsx +1 -1
- package/src/renderer/components/sidebar/SessionItem.tsx +3 -3
- package/src/renderer/components/sidebar/SidebarSessions.tsx +184 -6
- package/src/renderer/components/sidebar/SidebarTaskItem.tsx +4 -4
- package/src/renderer/components/sidebar/WorkspaceBrowser.tsx +40 -5
- package/src/renderer/components/splash/splashScene.ts +121 -929
- package/src/renderer/components/system-manager/FolderBrowser.tsx +163 -0
- package/src/renderer/components/system-manager/SystemManagerView.tsx +351 -0
- package/src/renderer/components/tasks/TasksView.tsx +112 -134
- package/src/renderer/components/team/CcSessionsSection.tsx +431 -89
- package/src/renderer/components/team/ClaudeLogsFilterPopover.tsx +1 -1
- package/src/renderer/components/team/ClaudeLogsPanel.tsx +1 -1
- package/src/renderer/components/team/CollapsibleTeamSection.tsx +17 -32
- package/src/renderer/components/team/ProcessesSection.tsx +2 -2
- package/src/renderer/components/team/TaskTooltip.tsx +2 -2
- package/src/renderer/components/team/TeamDetailView.tsx +319 -123
- package/src/renderer/components/team/TeamListFilterPopover.tsx +1 -1
- package/src/renderer/components/team/TeamListView.tsx +109 -124
- package/src/renderer/components/team/TeamSessionsSection.tsx +6 -6
- package/src/renderer/components/team/UnreadCommentsBadge.tsx +1 -1
- package/src/renderer/components/team/activity/ActivityItem.tsx +9 -9
- package/src/renderer/components/team/activity/ActivityTimeline.tsx +5 -5
- package/src/renderer/components/team/activity/LeadThoughtsGroup.tsx +3 -3
- package/src/renderer/components/team/activity/ReplyQuoteBlock.tsx +4 -4
- package/src/renderer/components/team/dialogs/CreateTaskDialog.tsx +4 -4
- package/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +84 -306
- package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +259 -342
- package/src/renderer/components/team/dialogs/GlobalTaskDetailDialog.tsx +1 -1
- package/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx +18 -16
- package/src/renderer/components/team/dialogs/PlatformBindingDialog.tsx +221 -0
- package/src/renderer/components/team/dialogs/PlatformManualForm.tsx +8 -1
- package/src/renderer/components/team/dialogs/PlatformSetupQR.tsx +5 -5
- package/src/renderer/components/team/dialogs/RuntimeConfigDialog.tsx +361 -0
- package/src/renderer/components/team/dialogs/SendMessageDialog.tsx +6 -6
- package/src/renderer/components/team/dialogs/SkipPermissionsCheckbox.tsx +6 -6
- package/src/renderer/components/team/dialogs/StatusHistoryTimeline.tsx +1 -1
- package/src/renderer/components/team/dialogs/TaskAttachments.tsx +1 -1
- package/src/renderer/components/team/dialogs/TaskCommentInput.tsx +6 -6
- package/src/renderer/components/team/dialogs/TaskCommentsSection.tsx +4 -4
- package/src/renderer/components/team/dialogs/TaskDetailDialog.tsx +3 -3
- package/src/renderer/components/team/dialogs/platformMeta.ts +122 -11
- package/src/renderer/components/team/dialogs/useTeamEditForm.ts +17 -5
- package/src/renderer/components/team/editor/EditorFileTree.tsx +4 -4
- package/src/renderer/components/team/editor/EditorSearchPanel.tsx +1 -1
- package/src/renderer/components/team/editor/MarkdownSplitView.tsx +1 -1
- package/src/renderer/components/team/editor/NewFileDialog.tsx +1 -1
- package/src/renderer/components/team/editor/ProjectEditorOverlay.tsx +1 -1
- package/src/renderer/components/team/editor/SearchInFilesPanel.tsx +1 -1
- package/src/renderer/components/team/kanban/KanbanBoard.tsx +9 -9
- package/src/renderer/components/team/kanban/KanbanFilterPopover.tsx +4 -4
- package/src/renderer/components/team/kanban/KanbanSearchInput.tsx +1 -1
- package/src/renderer/components/team/kanban/KanbanSortPopover.tsx +5 -5
- package/src/renderer/components/team/kanban/KanbanTaskCard.tsx +4 -4
- package/src/renderer/components/team/members/MemberCard.tsx +14 -47
- package/src/renderer/components/team/members/MemberDetailDialog.tsx +3 -95
- package/src/renderer/components/team/members/MemberDetailStats.tsx +50 -65
- package/src/renderer/components/team/members/MemberDraftRow.tsx +1 -1
- package/src/renderer/components/team/members/MemberStatsTab.tsx +2 -2
- package/src/renderer/components/team/members/MemberWorkspaceTab.tsx +1 -1
- package/src/renderer/components/team/messages/MessageComposer.tsx +10 -112
- package/src/renderer/components/team/messages/MessagesFilterPopover.tsx +1 -1
- package/src/renderer/components/team/messages/MessagesPanel.tsx +136 -119
- package/src/renderer/components/team/review/ChangeReviewDialog.tsx +1 -1
- package/src/renderer/components/team/schedule/ScheduleStatusBadge.tsx +3 -3
- package/src/renderer/components/team/sidebar/TeamSidebarRail.tsx +4 -4
- package/src/renderer/components/team/tasks/TaskRow.tsx +1 -1
- package/src/renderer/components/team/tools/AddMcpInline.tsx +27 -17
- package/src/renderer/components/team/tools/McpChip.tsx +6 -3
- package/src/renderer/components/team/tools/SkillChip.tsx +3 -3
- package/src/renderer/components/team/tools/ToolsSection.tsx +418 -70
- package/src/renderer/components/ui/MemberSelect.tsx +2 -2
- package/src/renderer/components/ui/MentionSuggestionList.tsx +2 -2
- package/src/renderer/components/ui/MentionableTextarea.tsx +3 -3
- package/src/renderer/hooks/useExtensionsTabState.ts +3 -114
- package/src/renderer/index.css +56 -39
- package/src/renderer/index.html +17 -50
- package/src/renderer/store/index.ts +2 -1
- package/src/renderer/store/slices/scheduleSlice.ts +1 -1
- package/src/renderer/store/slices/teamSlice.ts +45 -168
- package/src/renderer/utils/claudeCodeOnlyProviders.ts +3 -10
- package/src/renderer/utils/memberHelpers.ts +5 -17
- package/src/renderer/utils/openCodeRuntimeDeliveryDiagnostics.ts +4 -2
- package/src/renderer/utils/providerSlashCommands.ts +0 -5
- package/src/renderer/utils/scheduleFormatters.ts +3 -1
- package/src/renderer/utils/teamMessageFiltering.ts +14 -1
- package/src/renderer/utils/teamModelAvailability.ts +18 -2
- package/src/shared/types/api.ts +121 -2
- package/src/shared/types/ccConnect.ts +2 -0
- package/src/shared/types/index.ts +3 -0
- package/src/shared/types/systemManager.ts +49 -0
- package/src/shared/types/team.ts +29 -0
- package/src/shared/types/terminal.ts +4 -2
- package/src/shared/utils/extensionNormalizers.ts +15 -8
- package/src/shared/utils/providerExtensionCapabilities.ts +2 -2
- package/dist-renderer/assets/ProjectEditorOverlay-lJZi-9Hp.js +0 -52
- package/dist-renderer/assets/channel-yIlSKy0e.js +0 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-24fHez0s.js +0 -1
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-24fHez0s.js +0 -1
- package/dist-renderer/assets/clone-BTNuUva-.js +0 -1
- package/dist-renderer/assets/index-Bi6nrZ4z.css +0 -1
- package/dist-renderer/assets/splashScene-C8lWNnm4.js +0 -1
- 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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
4565
|
-
|
|
4566
|
-
|
|
4567
|
-
|
|
4568
|
-
|
|
4569
|
-
|
|
4570
|
-
|
|
4571
|
-
|
|
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
|
-
|
|
4605
|
-
return
|
|
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
|
-
|
|
4615
|
-
|
|
4616
|
-
|
|
4617
|
-
|
|
4618
|
-
|
|
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'
|
|
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
|
-
//
|
|
54
|
-
|
|
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,
|
|
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:
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
package/src/shared/types/api.ts
CHANGED
|
@@ -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 {
|