@yancyyu/openhermit 1.6.42 → 1.6.43
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/README.md +98 -89
- package/bin/hermit.mjs +96 -0
- package/dist-renderer/assets/{ProjectEditorOverlay-DlFQ6mai.js → ProjectEditorOverlay-C98qSs7-.js} +1 -1
- package/dist-renderer/assets/{TeamGraphOverlay-D2TPMPGR.js → TeamGraphOverlay-CsBbZwcL.js} +1 -1
- package/dist-renderer/assets/{_basePickBy-Cmd0RHLQ.js → _basePickBy-ZOyLWjMK.js} +1 -1
- package/dist-renderer/assets/{_baseUniq-BI_iy8ea.js → _baseUniq-DBb726rt.js} +1 -1
- package/dist-renderer/assets/{arc-NzW2mjTP.js → arc-CdiTaR_R.js} +1 -1
- package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-Bzq85AYv.js → architectureDiagram-VXUJARFQ-Cz3sc5TH.js} +1 -1
- package/dist-renderer/assets/{blockDiagram-VD42YOAC-D1PvYS-b.js → blockDiagram-VD42YOAC-DE4c-KJ3.js} +1 -1
- package/dist-renderer/assets/{c4Diagram-YG6GDRKO-D49RKzPC.js → c4Diagram-YG6GDRKO-CmTMDTrV.js} +1 -1
- package/dist-renderer/assets/channel-KTpqi9eT.js +1 -0
- package/dist-renderer/assets/{chunk-4BX2VUAB-fmI_MQmQ.js → chunk-4BX2VUAB-rhHy3tFl.js} +1 -1
- package/dist-renderer/assets/{chunk-55IACEB6-Xsv9RCXZ.js → chunk-55IACEB6-fLZBzuo_.js} +1 -1
- package/dist-renderer/assets/{chunk-B4BG7PRW-BE1KO8Um.js → chunk-B4BG7PRW-DOzxQhim.js} +1 -1
- package/dist-renderer/assets/{chunk-DI55MBZ5-tqJ7Mv7f.js → chunk-DI55MBZ5-COQCcXC5.js} +1 -1
- package/dist-renderer/assets/{chunk-FMBD7UC4-DMD45MVJ.js → chunk-FMBD7UC4-IKU9U_Y4.js} +1 -1
- package/dist-renderer/assets/{chunk-QN33PNHL-DOhGrz-q.js → chunk-QN33PNHL-D6WV154X.js} +1 -1
- package/dist-renderer/assets/{chunk-QZHKN3VN-D8yDgJdD.js → chunk-QZHKN3VN-D90_2DQp.js} +1 -1
- package/dist-renderer/assets/{chunk-TZMSLE5B-BcsEDu7A.js → chunk-TZMSLE5B-BQEil57G.js} +1 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-lpzulY5X.js +1 -0
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-lpzulY5X.js +1 -0
- package/dist-renderer/assets/clone-CriGymY9.js +1 -0
- package/dist-renderer/assets/{cose-bilkent-S5V4N54A-DlSqGHMX.js → cose-bilkent-S5V4N54A-6WiK6U2P.js} +1 -1
- package/dist-renderer/assets/{dagre-6UL2VRFP-BTT9tSAx.js → dagre-6UL2VRFP-DF4MMuTn.js} +1 -1
- package/dist-renderer/assets/{diagram-PSM6KHXK-Du-U-mK2.js → diagram-PSM6KHXK-CcF1eZ7E.js} +1 -1
- package/dist-renderer/assets/{diagram-QEK2KX5R-jFdHeKas.js → diagram-QEK2KX5R-DYlOVPQB.js} +1 -1
- package/dist-renderer/assets/{diagram-S2PKOQOG-DKLNK2bu.js → diagram-S2PKOQOG-BHXWsZOP.js} +1 -1
- package/dist-renderer/assets/{erDiagram-Q2GNP2WA-CZxHgIIo.js → erDiagram-Q2GNP2WA-GjmuBx8d.js} +1 -1
- package/dist-renderer/assets/{flowDiagram-NV44I4VS-v4XStCD0.js → flowDiagram-NV44I4VS-BuS7YVHk.js} +1 -1
- package/dist-renderer/assets/{ganttDiagram-JELNMOA3-DJjD_BEL.js → ganttDiagram-JELNMOA3-3Teu5tAa.js} +1 -1
- package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-BNy-jr03.js → gitGraphDiagram-V2S2FVAM-BiLdCYu5.js} +1 -1
- package/dist-renderer/assets/{graph-DDTrn6je.js → graph-CDP_R8ct.js} +1 -1
- package/dist-renderer/assets/{index-BBp78BAu.js → index-BSZdT-g-.js} +1 -1
- package/dist-renderer/assets/{index-eotrJaYy.js → index-BhWvMqsz.js} +1 -1
- package/dist-renderer/assets/{index-D8_B-cfs.js → index-C2_AupSj.js} +1 -1
- package/dist-renderer/assets/{index-BQrwHZ-k.js → index-C5ujiwAR.js} +580 -588
- package/dist-renderer/assets/index-CIS2CTK9.css +1 -0
- package/dist-renderer/assets/{index-CRKQSG9S.js → index-CVNjLwkq.js} +1 -1
- package/dist-renderer/assets/{index-DR6Wz52b.js → index-CwG3se0q.js} +1 -1
- package/dist-renderer/assets/{infoDiagram-HS3SLOUP-DqnOsuza.js → infoDiagram-HS3SLOUP-DLHUFo72.js} +1 -1
- package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-DTobaO1d.js → journeyDiagram-XKPGCS4Q-BE07RpJD.js} +1 -1
- package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-HbwVOvWc.js → kanban-definition-3W4ZIXB7-DDHZy4NB.js} +1 -1
- package/dist-renderer/assets/{layout--VYmTcw2.js → layout-5nA5wUxO.js} +1 -1
- package/dist-renderer/assets/{linear-BsJh89Mr.js → linear-BtF1i2qN.js} +1 -1
- package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-BZqUZePd.js → mindmap-definition-VGOIOE7T-Z1Ui9Sqy.js} +1 -1
- package/dist-renderer/assets/{pieDiagram-ADFJNKIX-B1q_nH6P.js → pieDiagram-ADFJNKIX-LCjxckWv.js} +1 -1
- package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-UD8QhSEu.js → quadrantDiagram-AYHSOK5B-BOwKjSco.js} +1 -1
- package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-BA_i7Nw8.js → requirementDiagram-UZGBJVZJ-pChP8Znd.js} +1 -1
- package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-CMTnX-2d.js → sankeyDiagram-TZEHDZUN-DifZ2qpo.js} +1 -1
- package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-BQXDB615.js → sequenceDiagram-WL72ISMW-CJg-WYyY.js} +1 -1
- package/dist-renderer/assets/{splashScene-D0YB9uxm.js → splashScene-94xWCzLA.js} +1 -1
- package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-BAsPXy6X.js → stateDiagram-FKZM4ZOC-DWHOoFdv.js} +1 -1
- package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-CGYZOoMb.js +1 -0
- package/dist-renderer/assets/{timeline-definition-IT6M3QCI-BdasmVkC.js → timeline-definition-IT6M3QCI-CPgokIo8.js} +1 -1
- package/dist-renderer/assets/{treemap-GDKQZRPO-BkKQqIui.js → treemap-GDKQZRPO-DAVqSR9L.js} +1 -1
- package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-EAlPHOdx.js → xychartDiagram-PRI3JC2R-CCOcGbrD.js} +1 -1
- package/dist-renderer/chat-community-qr.jpg +0 -0
- package/dist-renderer/fonts/Agave-Bold.ttf +0 -0
- package/dist-renderer/fonts/Agave-Regular.ttf +0 -0
- package/dist-renderer/icon.png +0 -0
- package/dist-renderer/icon.rar +0 -0
- package/dist-renderer/index.html +3 -3
- package/package.json +21 -26
- package/src/features/worker-society/core/application/WorkerSocietyService.test.ts +802 -0
- package/src/features/worker-society/core/application/WorkerSocietyService.ts +428 -0
- package/src/features/worker-society/core/application/fakes.ts +101 -0
- package/src/features/worker-society/core/application/ports.ts +70 -0
- package/src/features/worker-society/core/domain/models/society.ts +141 -0
- package/src/features/worker-society/core/domain/policies/societyPolicies.test.ts +739 -0
- package/src/features/worker-society/core/domain/policies/societyPolicies.ts +496 -0
- package/src/features/worker-society/main/adapters/input/societyMcp.test.ts +317 -0
- package/src/features/worker-society/main/adapters/input/societyMcp.ts +257 -0
- package/src/features/worker-society/main/adapters/input/societyRoutes.test.ts +695 -0
- package/src/features/worker-society/main/adapters/input/societyRoutes.ts +194 -0
- package/src/features/worker-society/main/composition/societyComposition.test.ts +74 -0
- package/src/features/worker-society/main/composition/societyComposition.ts +70 -0
- package/src/features/worker-society/main/composition/workerSocietyPlugin.test.ts +69 -0
- package/src/features/worker-society/main/composition/workerSocietyPlugin.ts +67 -0
- package/src/features/worker-society/main/infrastructure/crossTeamMessageGateway.test.ts +132 -0
- package/src/features/worker-society/main/infrastructure/crossTeamMessageGateway.ts +84 -0
- package/src/features/worker-society/main/infrastructure/fsStores.test.ts +216 -0
- package/src/features/worker-society/main/infrastructure/fsStores.ts +113 -0
- package/src/features/worker-society/main/infrastructure/mergingProfileStore.test.ts +195 -0
- package/src/features/worker-society/main/infrastructure/mergingProfileStore.ts +96 -0
- package/src/features/worker-society/renderer/SocietyGraph.tsx +166 -0
- package/src/features/worker-society/renderer/SocietyNodeLabels.tsx +139 -0
- package/src/features/worker-society/renderer/SocietyNodeOverlay.tsx +339 -0
- package/src/features/worker-society/renderer/SocietyView.tsx +437 -0
- package/src/features/worker-society/renderer/index.ts +11 -0
- package/src/features/worker-society/renderer/societyApi.test.ts +259 -0
- package/src/features/worker-society/renderer/societyApi.ts +144 -0
- package/src/features/worker-society/renderer/societyGraphAdapter.test.ts +321 -0
- package/src/features/worker-society/renderer/societyGraphAdapter.ts +240 -0
- package/src/features/worker-society/renderer/societyOverlayActions.test.ts +57 -0
- package/src/features/worker-society/renderer/societyOverlayActions.ts +49 -0
- package/src/features/worker-society/renderer/societyStore.test.ts +218 -0
- package/src/features/worker-society/renderer/societyStore.ts +146 -0
- package/src/features/worker-society/renderer/societyViewUtils.test.ts +81 -0
- package/src/features/worker-society/renderer/societyViewUtils.ts +68 -0
- package/src/main/ipc/extensions.ts +27 -0
- package/src/main/server.ts +1709 -534
- package/src/main/services/ccConnect/CcConnectBridge.ts +26 -11
- package/src/main/services/ccConnect/CcConnectClient.ts +9 -2
- package/src/main/services/ccConnect/workDirReconcile.test.ts +57 -0
- package/src/main/services/ccConnect/workDirReconcile.ts +36 -0
- package/src/main/services/direct-cli/DirectCliSessionManager.test.ts +397 -0
- package/src/main/services/direct-cli/DirectCliSessionManager.ts +508 -0
- package/src/main/services/direct-cli/DirectCliSessionStore.test.ts +79 -0
- package/src/main/services/direct-cli/DirectCliSessionStore.ts +97 -0
- package/src/main/services/direct-cli/__tests__/directCliMessageId.test.ts +40 -0
- package/src/main/services/direct-cli/directCliMessageId.ts +21 -0
- package/src/main/services/direct-cli/index.ts +17 -0
- package/src/main/services/extensions/capability-packs/CapabilityPackLoaderService.ts +637 -0
- package/src/main/services/extensions/catalog/PluginCatalogService.ts +2 -2
- package/src/main/services/loop-assets/LoopAssetsScannerService.ts +657 -0
- package/src/main/services/runtime/providerAwareCliEnv.ts +33 -5
- package/src/main/services/session-intelligence/LocalSessionScanner.ts +156 -71
- package/src/main/services/session-intelligence/SessionUsageParser.ts +103 -8
- package/src/main/services/session-intelligence/UsageTelemetryService.ts +11 -0
- package/src/main/services/session-intelligence/__tests__/teamSessionListMapper.test.ts +104 -0
- package/src/main/services/session-intelligence/teamSessionListMapper.ts +78 -0
- package/src/main/services/system-manager/AdminLoopInitializer.ts +95 -0
- package/src/main/services/system-manager/BuiltinWorkflowSeeder.ts +679 -74
- package/src/main/services/system-manager/SystemManagerConfigService.ts +19 -1
- package/src/main/services/system-manager/WorkflowPromptService.ts +58 -5
- package/src/main/services/system-manager/__tests__/AdminLoopInitializer.test.ts +129 -0
- package/src/main/services/system-manager/__tests__/SystemManagerConfigService.test.ts +60 -0
- package/src/main/services/teams-mvp/CollaborationBoardService.ts +2 -0
- package/src/main/services/teams-mvp/OpsRunbookContext.ts +60 -0
- package/src/main/services/teams-mvp/TaskDispatchService.test.ts +305 -0
- package/src/main/services/teams-mvp/TaskDispatchService.ts +250 -131
- package/src/main/services/teams-mvp/TeamProvisioningService.ts +12 -2
- package/src/main/services/teams-mvp/TeamWorkspaceService.test.ts +207 -0
- package/src/main/services/teams-mvp/TeamWorkspaceService.ts +104 -51
- package/src/main/services/teams-mvp/index.ts +6 -0
- package/src/main/utils/externalPlatformSessionRouting.ts +92 -0
- package/src/main/utils/toolApprovalRules.ts +151 -0
- package/src/renderer/App.tsx +24 -89
- package/src/renderer/api/httpClient.ts +115 -37
- package/src/renderer/api/providers.ts +5 -16
- package/src/renderer/components/chat/CommunityChatView.tsx +81 -0
- package/src/renderer/components/dashboard/DashboardView.tsx +130 -84
- package/src/renderer/components/extensions/ExtensionStoreView.tsx +39 -5
- package/src/renderer/components/extensions/ExtensionsSubTabTrigger.tsx +2 -1
- package/src/renderer/components/extensions/capability-packs/CapabilityPacksPanel.tsx +170 -0
- package/src/renderer/components/layout/PaneContent.tsx +10 -2
- package/src/renderer/components/layout/SortableTab.tsx +4 -0
- package/src/renderer/components/layout/TabBarActions.tsx +13 -16
- package/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx +4 -135
- package/src/renderer/components/schedules/SchedulesView.tsx +22 -14
- package/src/renderer/components/schedules/calendar/CalendarEventBlock.tsx +7 -6
- package/src/renderer/components/settings/SettingsTabs.tsx +24 -21
- package/src/renderer/components/settings/SettingsView.tsx +22 -13
- package/src/renderer/components/settings/components/SettingRow.tsx +13 -5
- package/src/renderer/components/settings/components/SettingsSectionCard.tsx +53 -0
- package/src/renderer/components/settings/components/SettingsSectionHeader.tsx +10 -6
- package/src/renderer/components/settings/components/SettingsSelect.tsx +12 -9
- package/src/renderer/components/settings/components/SettingsToggle.tsx +6 -5
- package/src/renderer/components/settings/components/index.ts +1 -0
- package/src/renderer/components/settings/sections/AdvancedSection.tsx +78 -59
- package/src/renderer/components/settings/sections/CliStatusSection.tsx +32 -44
- package/src/renderer/components/settings/sections/ConfigEditorDialog.tsx +1 -1
- package/src/renderer/components/settings/sections/GeneralSection.tsx +216 -186
- package/src/renderer/components/settings/sections/PlatformsSection.tsx +25 -17
- package/src/renderer/components/settings/sections/TaskBusSection.tsx +63 -22
- package/src/renderer/components/sidebar/SidebarSessions.tsx +120 -80
- package/src/renderer/components/sidebar/SidebarTaskItem.tsx +1 -1
- package/src/renderer/components/splash/splashScene.ts +6 -2
- package/src/renderer/components/system-manager/SystemManagerView.tsx +169 -255
- package/src/renderer/components/tasks/TasksView.tsx +63 -37
- package/src/renderer/components/team/CcSessionsSection.tsx +124 -89
- package/src/renderer/components/team/HarnessBrandLogos.tsx +318 -0
- package/src/renderer/components/team/HarnessSelect.tsx +25 -26
- package/src/renderer/components/team/TeamDetailView.tsx +137 -153
- package/src/renderer/components/team/TeamEmptyState.tsx +9 -37
- package/src/renderer/components/team/TeamListView.tsx +143 -30
- package/src/renderer/components/team/__tests__/CcSessionsSection.hasLocalFile.test.tsx +128 -0
- package/src/renderer/components/team/activity/ActivityItem.tsx +21 -9
- package/src/renderer/components/team/activity/ActivityTimeline.tsx +2 -2
- package/src/renderer/components/team/dialogs/AdvancedCliSection.tsx +1 -1
- package/src/renderer/components/team/dialogs/CreateTaskDialog.tsx +13 -10
- package/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +156 -83
- package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +9 -157
- package/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx +19 -15
- package/src/renderer/components/team/dialogs/PlatformBindingDialog.tsx +48 -10
- package/src/renderer/components/team/dialogs/PlatformManualForm.tsx +11 -12
- package/src/renderer/components/team/dialogs/PlatformSetupQR.tsx +39 -37
- package/src/renderer/components/team/dialogs/RuntimeConfigDialog.tsx +434 -64
- package/src/renderer/components/team/dialogs/SendMessageDialog.tsx +12 -10
- package/src/renderer/components/team/dialogs/TaskDetailDialog.tsx +2 -2
- package/src/renderer/components/team/dialogs/__tests__/CreateTeamDialog.bindProject.test.tsx +399 -0
- package/src/renderer/components/team/dialogs/__tests__/CreateTeamDialog.chineseRepro.test.tsx +253 -0
- package/src/renderer/components/team/dialogs/platformAllowUtils.ts +91 -0
- package/src/renderer/components/team/dialogs/teammateRuntimeCompatibility.tsx +1 -1
- package/src/renderer/components/team/kanban/KanbanTaskCard.test.tsx +41 -0
- package/src/renderer/components/team/kanban/KanbanTaskCard.tsx +41 -86
- package/src/renderer/components/team/loop-console/LoopCommandComposer.tsx +310 -0
- package/src/renderer/components/team/loop-console/LoopConsolePanel.tsx +372 -0
- package/src/renderer/components/team/loop-console/loopSendIntent.test.ts +85 -0
- package/src/renderer/components/team/loop-console/loopSendIntent.ts +221 -0
- package/src/renderer/components/team/loop-console/useLeadSessionToolActivity.ts +74 -0
- package/src/renderer/components/team/loop-console/useLoopCommandSuggestions.ts +165 -0
- package/src/renderer/components/team/loop-console/useLoopConsoleController.ts +266 -0
- package/src/renderer/components/team/members/LeadModelRow.test.tsx +1 -1
- package/src/renderer/components/team/members/LeadModelRow.tsx +5 -3
- package/src/renderer/components/team/members/MemberDetailDialog.tsx +11 -0
- package/src/renderer/components/team/members/MemberDetailStats.tsx +13 -3
- package/src/renderer/components/team/members/MemberDraftRow.test.tsx +1 -1
- package/src/renderer/components/team/members/MemberDraftRow.tsx +1 -1
- package/src/renderer/components/team/members/MemberMessagesTab.tsx +2 -2
- package/src/renderer/components/team/members/MemberStatsTab.tsx +1 -1
- package/src/renderer/components/team/messages/MessageComposer.tsx +150 -44
- package/src/renderer/components/team/messages/MessagesFilterPopover.tsx +2 -2
- package/src/renderer/components/team/messages/MessagesPanel.tsx +34 -28
- package/src/renderer/components/team/schedule/CcCronScheduleDialog.tsx +6 -6
- package/src/renderer/components/team/taskLogs/ExactTaskLogCard.tsx +2 -2
- package/src/renderer/components/team/taskLogs/TaskLogStreamSection.tsx +1 -1
- package/src/renderer/components/terminal/TerminalPanel.tsx +2 -3
- package/src/renderer/components/ui/MentionableTextarea.tsx +5 -1
- package/src/renderer/constants/teamColors.ts +5 -5
- package/src/renderer/hooks/useExtensionsTabState.ts +1 -1
- package/src/renderer/hooks/useMentionDetection.ts +5 -1
- package/src/renderer/hooks/useProjectWorkflowCommands.ts +57 -0
- package/src/renderer/hooks/useTeamSuggestions.ts +2 -0
- package/src/renderer/index.css +19 -2
- package/src/renderer/main.tsx +7 -1
- package/src/renderer/store/index.ts +18 -1
- package/src/renderer/store/slices/extensionsSlice.ts +83 -0
- package/src/renderer/store/slices/tabSlice.ts +61 -0
- package/src/renderer/store/slices/teamSlice.ts +138 -9
- package/src/renderer/types/mention.ts +8 -0
- package/src/renderer/types/tabs.ts +3 -1
- package/src/renderer/utils/__tests__/bindProjectSlug.test.ts +69 -0
- package/src/renderer/utils/__tests__/groupTransformer.test.ts +148 -0
- package/src/renderer/utils/__tests__/initialRoute.test.ts +101 -0
- package/src/renderer/utils/__tests__/leadToolActivity.test.ts +124 -0
- package/src/renderer/utils/__tests__/mergeTeamMessages.test.ts +81 -0
- package/src/renderer/utils/__tests__/teamMessageFiltering.test.ts +213 -0
- package/src/renderer/utils/__tests__/teamMessageKey.test.ts +75 -0
- package/src/renderer/utils/__tests__/workflowCommandExecution.test.ts +173 -0
- package/src/renderer/utils/__tests__/workflowCommandSuggestions.test.ts +59 -0
- package/src/renderer/utils/bindProjectSlug.ts +57 -0
- package/src/renderer/utils/capabilityCommandExecution.ts +113 -0
- package/src/renderer/utils/initialRoute.ts +89 -0
- package/src/renderer/utils/leadToolActivity.ts +117 -0
- package/src/renderer/utils/loopShortcutSuggestions.ts +106 -0
- package/src/renderer/utils/mentionSuggestions.ts +1 -1
- package/src/renderer/utils/slashCommandRegistry.ts +231 -0
- package/src/renderer/utils/teamMentionDirective.ts +31 -0
- package/src/renderer/utils/workflowCommandExecution.ts +96 -0
- package/src/renderer/utils/workflowCommandSuggestions.ts +49 -0
- package/src/shared/types/api.ts +79 -4
- package/src/shared/types/ccConnect.ts +1 -0
- package/src/shared/types/extensions/api.ts +19 -0
- package/src/shared/types/extensions/capabilityPack.ts +118 -0
- package/src/shared/types/extensions/index.ts +29 -1
- package/src/shared/types/index.ts +6 -0
- package/src/shared/types/loopAssets.ts +54 -0
- package/src/shared/types/providers.ts +0 -16
- package/src/shared/types/systemManager.ts +26 -1
- package/src/shared/types/team.ts +41 -5
- package/src/shared/types/terminal.ts +2 -36
- package/src/shared/types/worker.test.ts +28 -0
- package/src/shared/types/worker.ts +3 -0
- package/src/shared/utils/__tests__/effortLevels.test.ts +88 -0
- package/src/shared/utils/__tests__/providerBackend.test.ts +88 -0
- package/src/shared/utils/__tests__/providerLaunchArgs.test.ts +220 -0
- package/src/shared/utils/claudeStreamJson.test.ts +187 -0
- package/src/shared/utils/claudeStreamJson.ts +153 -0
- package/src/shared/utils/providerLaunchArgs.ts +217 -0
- package/src/shared/utils/slashCommands.ts +10 -0
- package/src/types/node-pty.d.ts +8 -0
- package/dist-renderer/assets/channel-Ch7JrfUu.js +0 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-z9I4AnFy.js +0 -1
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-z9I4AnFy.js +0 -1
- package/dist-renderer/assets/clone-Dfi1Jx6l.js +0 -1
- package/dist-renderer/assets/index-iyjkpSus.css +0 -32
- package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-DTUIBfce.js +0 -1
- package/src/main/services/system-manager/SystemManagerPtyService.ts +0 -233
- package/src/renderer/components/common/TerminalPane.tsx +0 -213
- package/src/renderer/components/team/dialogs/useTeamEditForm.ts +0 -292
|
@@ -7,110 +7,145 @@ import React from 'react';
|
|
|
7
7
|
|
|
8
8
|
import { RecentProjectsSection } from '@features/recent-projects/renderer';
|
|
9
9
|
import { useStore } from '@renderer/store';
|
|
10
|
-
import {
|
|
10
|
+
import { Bot, MessageCircle, Settings, ShieldCheck, TerminalSquare, Users } from 'lucide-react';
|
|
11
11
|
import { useShallow } from 'zustand/react/shallow';
|
|
12
12
|
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
const DASHBOARD_BOUNDARIES = [
|
|
14
|
+
{
|
|
15
|
+
title: 'Helm Loop',
|
|
16
|
+
description:
|
|
17
|
+
'只放全局巡检、诊断、复盘、治理和改进提案。常用 workflow 不再铺成卡片,统一在指令台输入 / 查看。',
|
|
18
|
+
badge: '全局控制台',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
title: 'Team Loop',
|
|
22
|
+
description:
|
|
23
|
+
'只负责当前团队消息、runtime 注入、Loop session 和跨团队派单,避免把 Admin workflow 混进普通团队。',
|
|
24
|
+
badge: '团队作用域',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
title: '消息面板',
|
|
28
|
+
description:
|
|
29
|
+
'默认读取最近 50 条动态;需要历史时手动分页加载,每次 50 条,不一次性渲染全部历史。',
|
|
30
|
+
badge: '分页边界',
|
|
31
|
+
},
|
|
20
32
|
];
|
|
21
33
|
|
|
22
34
|
export const DashboardView = (): React.JSX.Element => {
|
|
23
|
-
const {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
35
|
+
const { openChatTab, openSettingsTab, openSystemManager, openTeamsTab, teams, teamsLoading } =
|
|
36
|
+
useStore(
|
|
37
|
+
useShallow((state) => ({
|
|
38
|
+
openChatTab: state.openChatTab,
|
|
39
|
+
openSettingsTab: state.openSettingsTab,
|
|
40
|
+
openSystemManager: state.openSystemManager,
|
|
41
|
+
openTeamsTab: state.openTeamsTab,
|
|
42
|
+
teams: state.teams,
|
|
43
|
+
teamsLoading: state.teamsLoading,
|
|
44
|
+
}))
|
|
45
|
+
);
|
|
31
46
|
const showQuickstartGuide = !teamsLoading && teams.length === 0;
|
|
32
47
|
|
|
33
48
|
return (
|
|
34
49
|
<div className="relative flex-1 overflow-auto bg-surface">
|
|
35
50
|
<div
|
|
36
|
-
className="pointer-events-none absolute inset-x-0 top-0 h-[600px] bg-[radial-gradient(ellipse_80%_50%_at_50%_-20%,rgba(99,102,241,0.
|
|
51
|
+
className="pointer-events-none absolute inset-x-0 top-0 h-[600px] bg-[radial-gradient(ellipse_80%_50%_at_50%_-20%,rgba(99,102,241,0.1),transparent)]"
|
|
37
52
|
aria-hidden="true"
|
|
38
53
|
/>
|
|
39
54
|
|
|
40
|
-
<div className="relative mx-auto max-w-
|
|
41
|
-
<section className="mb-
|
|
42
|
-
<div className="border-b border-border px-6 py-
|
|
43
|
-
<div
|
|
44
|
-
<
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
<h1 className="text-2xl font-semibold tracking-tight text-text">
|
|
48
|
-
Hermit:一人公司的 AI 团队控制台
|
|
49
|
-
</h1>
|
|
50
|
-
<p className="mt-2 text-sm text-text-secondary">
|
|
51
|
-
几乎覆盖所有主流 Harness,把团队编排、消息协作、任务推进和运行状态放在同一个工作台。
|
|
52
|
-
</p>
|
|
53
|
-
</div>
|
|
54
|
-
<div className="grid gap-4 px-6 py-5 md:grid-cols-3">
|
|
55
|
-
<div className="rounded-lg border border-border bg-surface px-4 py-3">
|
|
56
|
-
<div className="mb-2 inline-flex items-center gap-1.5 text-xs font-medium text-text-secondary">
|
|
57
|
-
<Workflow className="size-3.5" />
|
|
58
|
-
Harness 覆盖
|
|
59
|
-
</div>
|
|
60
|
-
<p className="text-xs text-text-muted">几乎所有主流运行时都能接入统一团队控制台。</p>
|
|
61
|
-
<div className="mt-3 flex flex-wrap gap-1.5">
|
|
62
|
-
{HIGHLIGHT_HARNESSES.map((harness) => (
|
|
63
|
-
<span
|
|
64
|
-
key={harness}
|
|
65
|
-
className="rounded-md border border-border bg-surface-overlay px-2 py-1 text-[11px] text-text-secondary"
|
|
66
|
-
>
|
|
67
|
-
{harness}
|
|
68
|
-
</span>
|
|
69
|
-
))}
|
|
55
|
+
<div className="relative mx-auto max-w-6xl px-8 py-10">
|
|
56
|
+
<section className="mb-6 overflow-hidden rounded-2xl border border-border bg-surface-raised shadow-sm">
|
|
57
|
+
<div className="grid gap-6 border-b border-border px-6 py-6 lg:grid-cols-[minmax(0,1fr)_340px]">
|
|
58
|
+
<div>
|
|
59
|
+
<div className="mb-3 inline-flex items-center gap-2 rounded-full border border-indigo-500/25 bg-indigo-500/10 px-3 py-1 text-[11px] font-medium text-indigo-300">
|
|
60
|
+
<TerminalSquare className="size-3.5" />
|
|
61
|
+
Loop Engineering 首页
|
|
70
62
|
</div>
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
汇总本地会话、任务、消息和 Token 使用情况,帮助你判断团队执行状态。
|
|
63
|
+
<h1 className="text-2xl font-semibold tracking-tight text-text">
|
|
64
|
+
先从这里进入:全局控制、团队协作、社区入口分开
|
|
65
|
+
</h1>
|
|
66
|
+
<p className="mt-3 max-w-3xl text-sm leading-6 text-text-secondary">
|
|
67
|
+
首页只做总览和入口;Helm Loop 是全局指令台,团队详情里的 Loop
|
|
68
|
+
是当前团队指令台,飞书群独立成扫码页。这样边界更清楚,也不会把常用命令堆在 Admin
|
|
69
|
+
Loop 下方。
|
|
79
70
|
</p>
|
|
80
|
-
<div className="mt-
|
|
81
|
-
|
|
71
|
+
<div className="mt-5 flex flex-wrap gap-2">
|
|
72
|
+
<button
|
|
73
|
+
type="button"
|
|
74
|
+
onClick={() => void openSystemManager()}
|
|
75
|
+
className="inline-flex items-center gap-2 rounded-lg border border-indigo-500/35 bg-indigo-500/10 px-4 py-2 text-sm font-medium text-indigo-100 transition-colors hover:bg-indigo-500/15"
|
|
76
|
+
>
|
|
77
|
+
<Bot className="size-4" />
|
|
78
|
+
打开 Helm Loop
|
|
79
|
+
</button>
|
|
80
|
+
<button
|
|
81
|
+
type="button"
|
|
82
|
+
onClick={openTeamsTab}
|
|
83
|
+
className="inline-flex items-center gap-2 rounded-lg border border-border bg-surface px-4 py-2 text-sm text-text-secondary transition-colors hover:bg-surface-overlay hover:text-text"
|
|
84
|
+
>
|
|
85
|
+
<Users className="size-4" />
|
|
86
|
+
选择团队
|
|
87
|
+
</button>
|
|
88
|
+
<button
|
|
89
|
+
type="button"
|
|
90
|
+
onClick={openChatTab}
|
|
91
|
+
className="inline-flex items-center gap-2 rounded-lg border border-border bg-surface px-4 py-2 text-sm text-text-secondary transition-colors hover:bg-surface-overlay hover:text-text"
|
|
92
|
+
>
|
|
93
|
+
<MessageCircle className="size-4" />
|
|
94
|
+
加入飞书群
|
|
95
|
+
</button>
|
|
82
96
|
</div>
|
|
83
97
|
</div>
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
98
|
+
|
|
99
|
+
<div className="rounded-xl border border-border bg-surface px-4 py-4">
|
|
100
|
+
<div className="mb-3 flex items-center justify-between gap-2">
|
|
101
|
+
<div className="text-sm font-medium text-text">工作区状态</div>
|
|
102
|
+
<span className="rounded-full border border-border bg-surface-overlay px-2 py-0.5 text-[10px] text-text-muted">
|
|
103
|
+
{teamsLoading ? 'loading' : `${teams.length} teams`}
|
|
104
|
+
</span>
|
|
88
105
|
</div>
|
|
89
|
-
<
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
106
|
+
<div className="space-y-2 text-xs text-text-muted">
|
|
107
|
+
<div className="flex items-center justify-between rounded-lg border border-border bg-surface-overlay px-3 py-2">
|
|
108
|
+
<span>全局 workflow</span>
|
|
109
|
+
<span>在 Helm Loop 输入 / 查看</span>
|
|
110
|
+
</div>
|
|
111
|
+
<div className="flex items-center justify-between rounded-lg border border-border bg-surface-overlay px-3 py-2">
|
|
112
|
+
<span>团队 Loop</span>
|
|
113
|
+
<span>按团队隔离</span>
|
|
114
|
+
</div>
|
|
115
|
+
<div className="flex items-center justify-between rounded-lg border border-border bg-surface-overlay px-3 py-2">
|
|
116
|
+
<span>消息历史</span>
|
|
117
|
+
<span>50 条分页加载</span>
|
|
118
|
+
</div>
|
|
94
119
|
</div>
|
|
95
120
|
</div>
|
|
96
121
|
</div>
|
|
97
|
-
</section>
|
|
98
122
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
123
|
+
<div className="grid gap-3 px-6 py-5 md:grid-cols-3">
|
|
124
|
+
{DASHBOARD_BOUNDARIES.map((item) => (
|
|
125
|
+
<div
|
|
126
|
+
key={item.title}
|
|
127
|
+
className="rounded-xl border border-border bg-surface px-4 py-4"
|
|
128
|
+
>
|
|
129
|
+
<div className="mb-2 flex items-center justify-between gap-2">
|
|
130
|
+
<div className="text-sm font-medium text-text">{item.title}</div>
|
|
131
|
+
<span className="rounded-full border border-border bg-surface-overlay px-2 py-0.5 text-[10px] text-text-muted">
|
|
132
|
+
{item.badge}
|
|
133
|
+
</span>
|
|
134
|
+
</div>
|
|
135
|
+
<p className="text-xs leading-5 text-text-muted">{item.description}</p>
|
|
136
|
+
</div>
|
|
137
|
+
))}
|
|
138
|
+
</div>
|
|
139
|
+
</section>
|
|
108
140
|
|
|
109
141
|
{showQuickstartGuide ? (
|
|
110
142
|
<section className="rounded-xl border border-border bg-surface-raised p-5">
|
|
111
|
-
<
|
|
143
|
+
<div className="flex items-center gap-2 text-sm font-semibold text-text">
|
|
144
|
+
<ShieldCheck className="size-4 text-indigo-300" />
|
|
145
|
+
快速开始(2 步)
|
|
146
|
+
</div>
|
|
112
147
|
<p className="mt-1 text-xs text-text-muted">
|
|
113
|
-
|
|
148
|
+
首次使用会看到空白首页。先连接运行时,再创建团队或进入 Helm Loop。
|
|
114
149
|
</p>
|
|
115
150
|
<div className="mt-4 grid gap-3 md:grid-cols-2">
|
|
116
151
|
<button
|
|
@@ -118,18 +153,22 @@ export const DashboardView = (): React.JSX.Element => {
|
|
|
118
153
|
onClick={() => openSettingsTab('harness')}
|
|
119
154
|
className="rounded-lg border border-border bg-surface px-3 py-3 text-left transition-colors hover:bg-surface-overlay"
|
|
120
155
|
>
|
|
121
|
-
<p className="text-
|
|
122
|
-
|
|
123
|
-
|
|
156
|
+
<p className="flex items-center gap-2 text-sm font-medium text-text">
|
|
157
|
+
<Settings className="size-4" />
|
|
158
|
+
配置 Harness
|
|
159
|
+
</p>
|
|
160
|
+
<p className="mt-1 text-xs text-text-muted">连接 Claude/Codex/Gemini 等运行时。</p>
|
|
124
161
|
</button>
|
|
125
162
|
<button
|
|
126
163
|
type="button"
|
|
127
164
|
onClick={openTeamsTab}
|
|
128
165
|
className="rounded-lg border border-border bg-surface px-3 py-3 text-left transition-colors hover:bg-surface-overlay"
|
|
129
166
|
>
|
|
130
|
-
<p className="text-
|
|
131
|
-
|
|
132
|
-
|
|
167
|
+
<p className="flex items-center gap-2 text-sm font-medium text-text">
|
|
168
|
+
<Users className="size-4" />
|
|
169
|
+
创建团队并启动
|
|
170
|
+
</p>
|
|
171
|
+
<p className="mt-1 text-xs text-text-muted">设置工作目录后即可开始分发任务。</p>
|
|
133
172
|
</button>
|
|
134
173
|
</div>
|
|
135
174
|
</section>
|
|
@@ -139,6 +178,13 @@ export const DashboardView = (): React.JSX.Element => {
|
|
|
139
178
|
<h2 className="text-xs font-medium uppercase tracking-wider text-text-muted">
|
|
140
179
|
最近项目
|
|
141
180
|
</h2>
|
|
181
|
+
<button
|
|
182
|
+
type="button"
|
|
183
|
+
onClick={() => void openSystemManager()}
|
|
184
|
+
className="text-xs text-text-muted transition-colors hover:text-text"
|
|
185
|
+
>
|
|
186
|
+
Helm Loop →
|
|
187
|
+
</button>
|
|
142
188
|
</div>
|
|
143
189
|
|
|
144
190
|
<RecentProjectsSection searchQuery="" />
|
|
@@ -37,9 +37,10 @@ import {
|
|
|
37
37
|
import { resolveProjectPathById } from '@renderer/utils/projectLookup';
|
|
38
38
|
import { refreshCliStatusForCurrentMode } from '@renderer/utils/refreshCliStatus';
|
|
39
39
|
import { getRuntimeDisplayName } from '@renderer/utils/runtimeDisplayName';
|
|
40
|
-
import { AlertTriangle, Info, Loader2, Puzzle, RefreshCw } from 'lucide-react';
|
|
40
|
+
import { AlertTriangle, Boxes, Info, Loader2, Puzzle, RefreshCw } from 'lucide-react';
|
|
41
41
|
import { useShallow } from 'zustand/react/shallow';
|
|
42
42
|
|
|
43
|
+
import { CapabilityPacksPanel } from './capability-packs/CapabilityPacksPanel';
|
|
43
44
|
import { PluginsPanel } from './plugins/PluginsPanel';
|
|
44
45
|
import { StoreExtensionToast } from './common/ExtensionToast';
|
|
45
46
|
import { ExtensionsSubTabTrigger } from './ExtensionsSubTabTrigger';
|
|
@@ -104,9 +105,15 @@ function isCodexSnapshotPending(
|
|
|
104
105
|
const EXTENSION_SUB_TABS = [
|
|
105
106
|
{
|
|
106
107
|
value: 'plugins' as const,
|
|
107
|
-
label: '
|
|
108
|
+
label: 'cc 扩展',
|
|
108
109
|
icon: Puzzle,
|
|
109
|
-
description: '
|
|
110
|
+
description: '为 Agent loop 注入工具、Skills、MCP 和连接器。',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
value: 'capability-packs' as const,
|
|
114
|
+
label: '能力包',
|
|
115
|
+
icon: Boxes,
|
|
116
|
+
description: '本地 commands、skills metadata 和 workflows metadata 集合。',
|
|
110
117
|
},
|
|
111
118
|
] as const;
|
|
112
119
|
|
|
@@ -241,15 +248,38 @@ export const ExtensionStoreView = (): React.JSX.Element => {
|
|
|
241
248
|
<div className="bg-surface/70 mx-4 mt-3 flex items-start gap-3 rounded-md border border-border px-4 py-3">
|
|
242
249
|
<Info className="mt-0.5 size-4 shrink-0 text-text-secondary" />
|
|
243
250
|
<div>
|
|
244
|
-
<p className="text-sm font-medium text-text"
|
|
251
|
+
<p className="text-sm font-medium text-text">正在检查 cc 扩展运行时可用性</p>
|
|
245
252
|
<p className="mt-0.5 text-xs text-text-muted">
|
|
246
|
-
|
|
253
|
+
cc 扩展需要配置好的运行时来管理工具、Skills 和提供商连接。
|
|
247
254
|
</p>
|
|
248
255
|
</div>
|
|
249
256
|
</div>
|
|
250
257
|
);
|
|
251
258
|
}
|
|
252
259
|
|
|
260
|
+
if (shouldShowMultimodelProviderCards) {
|
|
261
|
+
const loadingProviders = visibleProviders.filter(
|
|
262
|
+
(provider) =>
|
|
263
|
+
isProviderCapabilityCardLoading(
|
|
264
|
+
provider,
|
|
265
|
+
Boolean(cliProviderStatusLoading?.[provider.providerId])
|
|
266
|
+
) || isCodexSnapshotPending(provider, codexSnapshotPending)
|
|
267
|
+
);
|
|
268
|
+
if (loadingProviders.length > 0) {
|
|
269
|
+
return (
|
|
270
|
+
<div className="mx-4 mt-3 grid gap-2 md:grid-cols-2">
|
|
271
|
+
{loadingProviders.map((provider) => (
|
|
272
|
+
<ProviderCapabilityCardSkeleton
|
|
273
|
+
key={provider.providerId}
|
|
274
|
+
providerId={provider.providerId}
|
|
275
|
+
displayName={provider.displayName}
|
|
276
|
+
/>
|
|
277
|
+
))}
|
|
278
|
+
</div>
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
253
283
|
if (!effectiveCliStatus.installed) {
|
|
254
284
|
const cliLaunchIssue = Boolean(
|
|
255
285
|
effectiveCliStatus.binaryPath && effectiveCliStatus.launchError
|
|
@@ -395,6 +425,10 @@ export const ExtensionStoreView = (): React.JSX.Element => {
|
|
|
395
425
|
cliStatusLoading={effectiveCliStatusLoading}
|
|
396
426
|
/>
|
|
397
427
|
</TabsContent>
|
|
428
|
+
|
|
429
|
+
<TabsContent value="capability-packs" className="mt-0 pt-4">
|
|
430
|
+
<CapabilityPacksPanel />
|
|
431
|
+
</TabsContent>
|
|
398
432
|
</Tabs>
|
|
399
433
|
</div>
|
|
400
434
|
</div>
|
|
@@ -2,10 +2,11 @@ import { TabsTrigger } from '@renderer/components/ui/tabs';
|
|
|
2
2
|
import { Tooltip, TooltipContent, TooltipTrigger } from '@renderer/components/ui/tooltip';
|
|
3
3
|
import { Info } from 'lucide-react';
|
|
4
4
|
|
|
5
|
+
import type { ExtensionsSubTab } from '@renderer/hooks/useExtensionsTabState';
|
|
5
6
|
import type { LucideIcon } from 'lucide-react';
|
|
6
7
|
|
|
7
8
|
interface ExtensionsSubTabTriggerProps {
|
|
8
|
-
value:
|
|
9
|
+
value: ExtensionsSubTab;
|
|
9
10
|
label: string;
|
|
10
11
|
description: string;
|
|
11
12
|
icon: LucideIcon;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { useEffect, useMemo } from 'react';
|
|
2
|
+
|
|
3
|
+
import { Badge } from '@renderer/components/ui/badge';
|
|
4
|
+
import { Button } from '@renderer/components/ui/button';
|
|
5
|
+
import { useStore } from '@renderer/store';
|
|
6
|
+
import { AlertTriangle, Loader2, Package, RefreshCw } from 'lucide-react';
|
|
7
|
+
import { useShallow } from 'zustand/react/shallow';
|
|
8
|
+
|
|
9
|
+
import type { LoadedCapabilityPack } from '@shared/types/extensions';
|
|
10
|
+
|
|
11
|
+
function getPackCounts(pack: LoadedCapabilityPack): string {
|
|
12
|
+
const commands = pack.manifest.capabilities.commands?.length ?? 0;
|
|
13
|
+
const skills = pack.manifest.capabilities.skills?.length ?? 0;
|
|
14
|
+
const workflows = pack.manifest.capabilities.workflows?.length ?? 0;
|
|
15
|
+
return `${commands} commands · ${skills} skills · ${workflows} workflows`;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function CapabilityPackCard({ pack, index }: { pack: LoadedCapabilityPack; index: number }) {
|
|
19
|
+
const baseStriped = index % 2 === 0;
|
|
20
|
+
return (
|
|
21
|
+
<div
|
|
22
|
+
className={`relative flex w-full flex-col gap-3 rounded-xl border p-4 text-left transition-all duration-200 ${
|
|
23
|
+
baseStriped ? 'bg-white/[0.045]' : 'bg-white/[0.015]'
|
|
24
|
+
} ${pack.enabled ? 'border-l-2 border-border border-l-emerald-500/35' : 'border-border'}`}
|
|
25
|
+
>
|
|
26
|
+
<div className="flex items-start justify-between gap-2">
|
|
27
|
+
<div className="min-w-0 space-y-1">
|
|
28
|
+
<h3 className="truncate text-sm font-semibold text-text">{pack.manifest.name}</h3>
|
|
29
|
+
<div className="flex flex-wrap items-center gap-1.5">
|
|
30
|
+
<Badge variant="secondary" className="text-[11px]">
|
|
31
|
+
namespace: {pack.manifest.namespace}
|
|
32
|
+
</Badge>
|
|
33
|
+
<Badge variant="outline" className="border-border text-text-secondary">
|
|
34
|
+
{pack.source === 'builtin' ? '官方预装' : '团队本地'}
|
|
35
|
+
</Badge>
|
|
36
|
+
<Badge
|
|
37
|
+
variant="outline"
|
|
38
|
+
className={
|
|
39
|
+
pack.enabled
|
|
40
|
+
? 'border-emerald-500/30 bg-emerald-500/10 text-emerald-400'
|
|
41
|
+
: 'border-border text-text-muted'
|
|
42
|
+
}
|
|
43
|
+
>
|
|
44
|
+
{pack.enabled ? 'enabled' : 'disabled'}
|
|
45
|
+
</Badge>
|
|
46
|
+
<Badge variant="outline" className="border-border text-text-secondary">
|
|
47
|
+
v{pack.manifest.version}
|
|
48
|
+
</Badge>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
<Package className="size-4 shrink-0 text-text-muted" />
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<p className="line-clamp-2 min-h-10 text-xs leading-5 text-text-secondary">
|
|
55
|
+
{pack.manifest.description || '团队能力包:commands、skills metadata、workflows metadata。'}
|
|
56
|
+
</p>
|
|
57
|
+
|
|
58
|
+
<div className="flex flex-wrap items-center justify-between gap-2 text-xs text-text-muted">
|
|
59
|
+
<span>{getPackCounts(pack)}</span>
|
|
60
|
+
<span className="max-w-[50%] truncate font-mono text-[11px]" title={pack.packDir}>
|
|
61
|
+
{pack.packDir}
|
|
62
|
+
</span>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
{pack.warnings.length > 0 ? (
|
|
66
|
+
<div className="rounded-lg border border-amber-500/20 bg-amber-500/5 px-3 py-2 text-[11px] leading-5 text-amber-300">
|
|
67
|
+
{pack.warnings.join(';')}
|
|
68
|
+
</div>
|
|
69
|
+
) : null}
|
|
70
|
+
</div>
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function CapabilityPacksPanel(): React.JSX.Element {
|
|
75
|
+
const {
|
|
76
|
+
capabilityPacks,
|
|
77
|
+
capabilityPackList,
|
|
78
|
+
capabilityPacksLoading,
|
|
79
|
+
capabilityPacksError,
|
|
80
|
+
fetchCapabilityPacks,
|
|
81
|
+
} = useStore(
|
|
82
|
+
useShallow((state) => ({
|
|
83
|
+
capabilityPacks: state.capabilityPacks,
|
|
84
|
+
capabilityPackList: state.capabilityPackList,
|
|
85
|
+
capabilityPacksLoading: state.capabilityPacksLoading,
|
|
86
|
+
capabilityPacksError: state.capabilityPacksError,
|
|
87
|
+
fetchCapabilityPacks: state.fetchCapabilityPacks,
|
|
88
|
+
}))
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
void fetchCapabilityPacks();
|
|
93
|
+
}, [fetchCapabilityPacks]);
|
|
94
|
+
|
|
95
|
+
const warnings = useMemo(
|
|
96
|
+
() => [
|
|
97
|
+
...(capabilityPackList?.warnings ?? []),
|
|
98
|
+
...(capabilityPacksError ? [capabilityPacksError] : []),
|
|
99
|
+
],
|
|
100
|
+
[capabilityPackList?.warnings, capabilityPacksError]
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
return (
|
|
104
|
+
<div className="space-y-4">
|
|
105
|
+
<div className="bg-surface-raised/50 rounded-xl border border-indigo-500/20 p-4">
|
|
106
|
+
<div className="flex items-start gap-3">
|
|
107
|
+
<Package className="mt-0.5 size-5 text-indigo-300" />
|
|
108
|
+
<div className="min-w-0">
|
|
109
|
+
<h2 className="text-sm font-semibold text-text">团队能力包</h2>
|
|
110
|
+
<p className="mt-1 text-xs leading-5 text-text-secondary">
|
|
111
|
+
官方测试过的 Hermit 运维检测包会默认安装到{' '}
|
|
112
|
+
<span className="font-mono">~/.claude/commands/hermit</span>,所有团队可直接运行{' '}
|
|
113
|
+
<span className="font-mono">/hermit:*</span>。 后续插件包按团队启用。
|
|
114
|
+
</p>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
|
|
119
|
+
{warnings.length > 0 && (
|
|
120
|
+
<div className="flex items-start gap-2 rounded-md border border-amber-500/30 bg-amber-500/5 px-4 py-3 text-sm text-amber-300">
|
|
121
|
+
<AlertTriangle className="mt-0.5 size-4 shrink-0" />
|
|
122
|
+
<div className="space-y-1">
|
|
123
|
+
{warnings.map((warning) => (
|
|
124
|
+
<p key={warning}>{warning}</p>
|
|
125
|
+
))}
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
)}
|
|
129
|
+
|
|
130
|
+
<div className="flex items-center justify-between gap-3">
|
|
131
|
+
<div>
|
|
132
|
+
<h2 className="text-sm font-semibold text-text">团队可用能力包</h2>
|
|
133
|
+
<p className="text-xs text-text-muted">
|
|
134
|
+
默认官方包 + 团队本地包 · {capabilityPacks.length} packs
|
|
135
|
+
</p>
|
|
136
|
+
</div>
|
|
137
|
+
<Button
|
|
138
|
+
type="button"
|
|
139
|
+
variant="ghost"
|
|
140
|
+
size="sm"
|
|
141
|
+
onClick={() => void fetchCapabilityPacks()}
|
|
142
|
+
disabled={capabilityPacksLoading}
|
|
143
|
+
>
|
|
144
|
+
{capabilityPacksLoading ? (
|
|
145
|
+
<Loader2 className="size-4 animate-spin" />
|
|
146
|
+
) : (
|
|
147
|
+
<RefreshCw className="size-4" />
|
|
148
|
+
)}
|
|
149
|
+
刷新
|
|
150
|
+
</Button>
|
|
151
|
+
</div>
|
|
152
|
+
|
|
153
|
+
{capabilityPacksLoading && capabilityPacks.length === 0 ? (
|
|
154
|
+
<div className="bg-surface-raised/50 rounded-xl border border-border px-4 py-8 text-center text-sm text-text-muted">
|
|
155
|
+
正在加载能力包...
|
|
156
|
+
</div>
|
|
157
|
+
) : capabilityPacks.length === 0 ? (
|
|
158
|
+
<div className="bg-surface/60 rounded-xl border border-dashed border-border px-4 py-8 text-center text-sm text-text-muted">
|
|
159
|
+
还没有可用能力包。官方 Hermit 运维包会自动预装。
|
|
160
|
+
</div>
|
|
161
|
+
) : (
|
|
162
|
+
<div className="grid gap-3 md:grid-cols-2 xl:grid-cols-3">
|
|
163
|
+
{capabilityPacks.map((pack, index) => (
|
|
164
|
+
<CapabilityPackCard key={pack.manifest.id} pack={pack} index={index} />
|
|
165
|
+
))}
|
|
166
|
+
</div>
|
|
167
|
+
)}
|
|
168
|
+
</div>
|
|
169
|
+
);
|
|
170
|
+
}
|
|
@@ -4,9 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { TeamGraphTab } from '@features/agent-graph/renderer';
|
|
7
|
+
import { SocietyView } from '@features/worker-society/renderer';
|
|
7
8
|
import { TabUIProvider } from '@renderer/contexts/TabUIContext';
|
|
8
9
|
import { SYSTEM_MANAGER_TEAM_NAME } from '@shared/types/team';
|
|
9
10
|
|
|
11
|
+
import { CommunityChatView } from '../chat/CommunityChatView';
|
|
10
12
|
import { DashboardView } from '../dashboard/DashboardView';
|
|
11
13
|
import { ExtensionStoreView } from '../extensions/ExtensionStoreView';
|
|
12
14
|
import { NotificationsView } from '../notifications/NotificationsView';
|
|
@@ -30,7 +32,11 @@ interface PaneContentProps {
|
|
|
30
32
|
export const PaneContent = ({ pane, isPaneFocused }: PaneContentProps): React.JSX.Element => {
|
|
31
33
|
const activeTabId = pane.activeTabId;
|
|
32
34
|
|
|
33
|
-
// Show the team workspace
|
|
35
|
+
// Show the team workspace as the home whenever no tab is active. The initial
|
|
36
|
+
// route is restored into a real tab BEFORE first render (main.tsx), so on a
|
|
37
|
+
// fresh deep-link load pane.tabs already holds the right tab and this fallback
|
|
38
|
+
// never double-mounts TeamListView. It only renders for the true no-tab state
|
|
39
|
+
// (root '/', or after all tabs are closed) so the pane is never blank.
|
|
34
40
|
const showDefaultTeams = !activeTabId && pane.tabs.length === 0;
|
|
35
41
|
|
|
36
42
|
return (
|
|
@@ -50,12 +56,14 @@ export const PaneContent = ({ pane, isPaneFocused }: PaneContentProps): React.JS
|
|
|
50
56
|
style={{ display: isActive ? 'flex' : 'none' }}
|
|
51
57
|
>
|
|
52
58
|
{tab.type === 'dashboard' && <DashboardView />}
|
|
59
|
+
{tab.type === 'society' && <SocietyView />}
|
|
60
|
+
{tab.type === 'chat' && <CommunityChatView />}
|
|
53
61
|
{tab.type === 'notifications' && <NotificationsView />}
|
|
54
62
|
{tab.type === 'settings' && <SettingsView />}
|
|
55
63
|
{tab.type === 'teams' && <TeamListView />}
|
|
56
64
|
{tab.type === 'team' && tab.teamName === SYSTEM_MANAGER_TEAM_NAME && (
|
|
57
65
|
<TabUIProvider tabId={tab.id}>
|
|
58
|
-
<SystemManagerView isPaneFocused={isPaneFocused} />
|
|
66
|
+
<SystemManagerView isPaneFocused={isPaneFocused} isActive={isActive} />
|
|
59
67
|
</TabUIProvider>
|
|
60
68
|
)}
|
|
61
69
|
{tab.type === 'team' && tab.teamName !== SYSTEM_MANAGER_TEAM_NAME && (
|
|
@@ -15,9 +15,11 @@ import { nameColorSet } from '@renderer/utils/projectColor';
|
|
|
15
15
|
import {
|
|
16
16
|
Activity,
|
|
17
17
|
Bell,
|
|
18
|
+
Bot,
|
|
18
19
|
Calendar,
|
|
19
20
|
FileText,
|
|
20
21
|
LayoutDashboard,
|
|
22
|
+
MessageSquare,
|
|
21
23
|
Network,
|
|
22
24
|
Pin,
|
|
23
25
|
Puzzle,
|
|
@@ -56,6 +58,8 @@ const TAB_ICONS = {
|
|
|
56
58
|
schedules: Calendar,
|
|
57
59
|
tasks: Calendar,
|
|
58
60
|
graph: Network,
|
|
61
|
+
chat: MessageSquare,
|
|
62
|
+
society: Bot,
|
|
59
63
|
} as const;
|
|
60
64
|
|
|
61
65
|
export const SortableTab = ({
|