@yancyyu/openhermit 1.6.41 → 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-Br0X83Jf.js → ProjectEditorOverlay-C98qSs7-.js} +1 -1
- package/dist-renderer/assets/{TeamGraphOverlay-DHMTbZPZ.js → TeamGraphOverlay-CsBbZwcL.js} +1 -1
- package/dist-renderer/assets/{_basePickBy-DzIiX7yH.js → _basePickBy-ZOyLWjMK.js} +1 -1
- package/dist-renderer/assets/{_baseUniq-6hZuzTLU.js → _baseUniq-DBb726rt.js} +1 -1
- package/dist-renderer/assets/{arc-CXgO6fx_.js → arc-CdiTaR_R.js} +1 -1
- package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-DKWgtDHr.js → architectureDiagram-VXUJARFQ-Cz3sc5TH.js} +1 -1
- package/dist-renderer/assets/{blockDiagram-VD42YOAC-DOMUcC40.js → blockDiagram-VD42YOAC-DE4c-KJ3.js} +1 -1
- package/dist-renderer/assets/{c4Diagram-YG6GDRKO-B_k2L7qX.js → c4Diagram-YG6GDRKO-CmTMDTrV.js} +1 -1
- package/dist-renderer/assets/channel-KTpqi9eT.js +1 -0
- package/dist-renderer/assets/{chunk-4BX2VUAB-BeD_ccFy.js → chunk-4BX2VUAB-rhHy3tFl.js} +1 -1
- package/dist-renderer/assets/{chunk-55IACEB6-ClZfkA5w.js → chunk-55IACEB6-fLZBzuo_.js} +1 -1
- package/dist-renderer/assets/{chunk-B4BG7PRW-5XluxXsn.js → chunk-B4BG7PRW-DOzxQhim.js} +1 -1
- package/dist-renderer/assets/{chunk-DI55MBZ5-BzIjjNVm.js → chunk-DI55MBZ5-COQCcXC5.js} +1 -1
- package/dist-renderer/assets/{chunk-FMBD7UC4-HgH3MK_H.js → chunk-FMBD7UC4-IKU9U_Y4.js} +1 -1
- package/dist-renderer/assets/{chunk-QN33PNHL-WeC5T3Ba.js → chunk-QN33PNHL-D6WV154X.js} +1 -1
- package/dist-renderer/assets/{chunk-QZHKN3VN-Cu1ApHfW.js → chunk-QZHKN3VN-D90_2DQp.js} +1 -1
- package/dist-renderer/assets/{chunk-TZMSLE5B-BOhlynJM.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-DGZSihDQ.js → cose-bilkent-S5V4N54A-6WiK6U2P.js} +1 -1
- package/dist-renderer/assets/{dagre-6UL2VRFP-CnxwCbku.js → dagre-6UL2VRFP-DF4MMuTn.js} +1 -1
- package/dist-renderer/assets/{diagram-PSM6KHXK-DsIhoxdI.js → diagram-PSM6KHXK-CcF1eZ7E.js} +1 -1
- package/dist-renderer/assets/{diagram-QEK2KX5R-Cmh9KUF5.js → diagram-QEK2KX5R-DYlOVPQB.js} +1 -1
- package/dist-renderer/assets/{diagram-S2PKOQOG-CKxV456A.js → diagram-S2PKOQOG-BHXWsZOP.js} +1 -1
- package/dist-renderer/assets/{erDiagram-Q2GNP2WA-EnvYjOjc.js → erDiagram-Q2GNP2WA-GjmuBx8d.js} +1 -1
- package/dist-renderer/assets/{flowDiagram-NV44I4VS-BmNeWY_A.js → flowDiagram-NV44I4VS-BuS7YVHk.js} +1 -1
- package/dist-renderer/assets/{ganttDiagram-JELNMOA3-D30fyK-u.js → ganttDiagram-JELNMOA3-3Teu5tAa.js} +1 -1
- package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-CrUNiYg1.js → gitGraphDiagram-V2S2FVAM-BiLdCYu5.js} +1 -1
- package/dist-renderer/assets/{graph-CY1gTfTb.js → graph-CDP_R8ct.js} +1 -1
- package/dist-renderer/assets/{index-CaEbzwAU.js → index-BSZdT-g-.js} +1 -1
- package/dist-renderer/assets/{index-D5K-SjBG.js → index-BhWvMqsz.js} +1 -1
- package/dist-renderer/assets/{index-9_hO4N1e.js → index-C2_AupSj.js} +1 -1
- package/dist-renderer/assets/{index-59r209c1.js → index-C5ujiwAR.js} +580 -588
- package/dist-renderer/assets/index-CIS2CTK9.css +1 -0
- package/dist-renderer/assets/{index-DMR9B1UP.js → index-CVNjLwkq.js} +1 -1
- package/dist-renderer/assets/{index-BC2hXmg_.js → index-CwG3se0q.js} +1 -1
- package/dist-renderer/assets/{infoDiagram-HS3SLOUP-By_XUlcD.js → infoDiagram-HS3SLOUP-DLHUFo72.js} +1 -1
- package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-BM1LJE9m.js → journeyDiagram-XKPGCS4Q-BE07RpJD.js} +1 -1
- package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-DHIW3aTA.js → kanban-definition-3W4ZIXB7-DDHZy4NB.js} +1 -1
- package/dist-renderer/assets/{layout-DAKiL_Mo.js → layout-5nA5wUxO.js} +1 -1
- package/dist-renderer/assets/{linear-DwOaRYea.js → linear-BtF1i2qN.js} +1 -1
- package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-b7bJ2cha.js → mindmap-definition-VGOIOE7T-Z1Ui9Sqy.js} +1 -1
- package/dist-renderer/assets/{pieDiagram-ADFJNKIX-DxyL9Zr2.js → pieDiagram-ADFJNKIX-LCjxckWv.js} +1 -1
- package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-CR33pHlF.js → quadrantDiagram-AYHSOK5B-BOwKjSco.js} +1 -1
- package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-BAiSRSlh.js → requirementDiagram-UZGBJVZJ-pChP8Znd.js} +1 -1
- package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-C8JmDjoa.js → sankeyDiagram-TZEHDZUN-DifZ2qpo.js} +1 -1
- package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-c1d0Wi1m.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-nT8BiH2O.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-DpoRepUA.js → timeline-definition-IT6M3QCI-CPgokIo8.js} +1 -1
- package/dist-renderer/assets/{treemap-GDKQZRPO-C41UJeIH.js → treemap-GDKQZRPO-DAVqSR9L.js} +1 -1
- package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-KMjGARKN.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 +1731 -539
- 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 +744 -0
- 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 +132 -52
- 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 +144 -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 +189 -57
- 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 +43 -3
- 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-D0XS_akr.js +0 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-D13Ffs0U.js +0 -1
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-D13Ffs0U.js +0 -1
- package/dist-renderer/assets/clone-B1ZrxI1D.js +0 -1
- package/dist-renderer/assets/index-iyjkpSus.css +0 -32
- package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-Dmibmlso.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
|
@@ -11,11 +11,11 @@ import { cn } from '@renderer/lib/utils';
|
|
|
11
11
|
import { useStore } from '@renderer/store';
|
|
12
12
|
import { getFullResetState } from '@renderer/store/utils/stateResetHelpers';
|
|
13
13
|
import { AGENT_LANGUAGE_OPTIONS, resolveLanguageName } from '@shared/utils/agentLanguage';
|
|
14
|
-
import { Check, Copy,
|
|
14
|
+
import { Bot, Check, Copy, Gauge, Loader2, Palette, Shield, Server } from 'lucide-react';
|
|
15
15
|
import { useShallow } from 'zustand/react/shallow';
|
|
16
16
|
|
|
17
17
|
import { Button } from '@renderer/components/ui/button';
|
|
18
|
-
import { SettingRow,
|
|
18
|
+
import { SettingRow, SettingsSectionCard, SettingsSelect, SettingsToggle } from '../components';
|
|
19
19
|
|
|
20
20
|
import type { SafeConfig } from '../hooks/useSettingsConfig';
|
|
21
21
|
import type { ClaudeRootInfo, WslClaudeRootCandidate } from '@shared/types';
|
|
@@ -410,211 +410,241 @@ export const GeneralSection = ({
|
|
|
410
410
|
}, [ccSettings.rate_limit_max_messages, ccSettings.rate_limit_window_secs]);
|
|
411
411
|
|
|
412
412
|
return (
|
|
413
|
-
<div>
|
|
413
|
+
<div className="space-y-5">
|
|
414
414
|
{/* Language */}
|
|
415
|
-
<
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
415
|
+
<SettingsSectionCard
|
|
416
|
+
title="Agent 语言"
|
|
417
|
+
description="控制数字员工与用户交流时默认使用的语言。"
|
|
418
|
+
icon={<Bot className="size-3.5" />}
|
|
419
|
+
>
|
|
420
|
+
<SettingRow label="语言" description={agentLanguageDescription}>
|
|
421
|
+
<Combobox
|
|
422
|
+
options={languageComboboxOptions}
|
|
423
|
+
value={safeConfig.general.agentLanguage ?? 'system'}
|
|
424
|
+
onValueChange={onLanguageChange}
|
|
425
|
+
placeholder="选择语言..."
|
|
426
|
+
searchPlaceholder="搜索语言..."
|
|
427
|
+
emptyMessage="未找到匹配语言。"
|
|
428
|
+
disabled={saving}
|
|
429
|
+
className="min-w-[180px]"
|
|
430
|
+
renderOption={renderLanguageOption}
|
|
431
|
+
/>
|
|
432
|
+
</SettingRow>
|
|
433
|
+
</SettingsSectionCard>
|
|
429
434
|
|
|
430
435
|
{/* Appearance */}
|
|
431
|
-
<
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
<button
|
|
436
|
-
key={opt.value}
|
|
437
|
-
type="button"
|
|
438
|
-
disabled={saving}
|
|
439
|
-
className={cn(
|
|
440
|
-
'rounded-[3px] px-3 py-1 text-xs font-medium transition-colors disabled:opacity-50',
|
|
441
|
-
safeConfig.general.theme === opt.value
|
|
442
|
-
? 'shadow-sm'
|
|
443
|
-
: 'text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]'
|
|
444
|
-
)}
|
|
445
|
-
style={
|
|
446
|
-
safeConfig.general.theme === opt.value
|
|
447
|
-
? {
|
|
448
|
-
backgroundColor: 'rgba(6, 182, 212, 0.1)',
|
|
449
|
-
color: '#818cf8',
|
|
450
|
-
}
|
|
451
|
-
: undefined
|
|
452
|
-
}
|
|
453
|
-
onClick={() => onThemeChange(opt.value)}
|
|
454
|
-
>
|
|
455
|
-
{opt.label}
|
|
456
|
-
</button>
|
|
457
|
-
))}
|
|
458
|
-
</div>
|
|
459
|
-
</SettingRow>
|
|
460
|
-
<SettingRow
|
|
461
|
-
label="默认展开 AI 回复"
|
|
462
|
-
description="打开会话记录或收到新消息时,自动展开每轮回复"
|
|
436
|
+
<SettingsSectionCard
|
|
437
|
+
title="外观"
|
|
438
|
+
description="调整主题、展开行为和界面默认显示方式。"
|
|
439
|
+
icon={<Palette className="size-3.5" />}
|
|
463
440
|
>
|
|
464
|
-
<
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
441
|
+
<SettingRow label="主题" description="选择你偏好的界面主题">
|
|
442
|
+
<div className="inline-flex rounded-md border border-[var(--color-border)] bg-[var(--color-surface)] p-0.5">
|
|
443
|
+
{THEME_OPTIONS.map((opt) => (
|
|
444
|
+
<button
|
|
445
|
+
key={opt.value}
|
|
446
|
+
type="button"
|
|
447
|
+
disabled={saving}
|
|
448
|
+
className={cn(
|
|
449
|
+
'rounded-[3px] px-3 py-1 text-xs font-medium transition-colors disabled:opacity-50',
|
|
450
|
+
safeConfig.general.theme === opt.value
|
|
451
|
+
? 'shadow-sm'
|
|
452
|
+
: 'text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]'
|
|
453
|
+
)}
|
|
454
|
+
style={
|
|
455
|
+
safeConfig.general.theme === opt.value
|
|
456
|
+
? {
|
|
457
|
+
backgroundColor: 'var(--color-accent-muted)',
|
|
458
|
+
color: 'var(--color-accent)',
|
|
459
|
+
}
|
|
460
|
+
: undefined
|
|
461
|
+
}
|
|
462
|
+
onClick={() => onThemeChange(opt.value)}
|
|
463
|
+
>
|
|
464
|
+
{opt.label}
|
|
465
|
+
</button>
|
|
466
|
+
))}
|
|
467
|
+
</div>
|
|
468
|
+
</SettingRow>
|
|
469
|
+
<SettingRow
|
|
470
|
+
label="默认展开 AI 回复"
|
|
471
|
+
description="打开会话记录或收到新消息时,自动展开每轮回复"
|
|
472
|
+
>
|
|
473
|
+
<SettingsToggle
|
|
474
|
+
enabled={safeConfig.general.autoExpandAIGroups ?? false}
|
|
475
|
+
onChange={(v) => onGeneralToggle('autoExpandAIGroups', v)}
|
|
476
|
+
disabled={saving}
|
|
477
|
+
/>
|
|
478
|
+
</SettingRow>
|
|
479
|
+
</SettingsSectionCard>
|
|
470
480
|
|
|
471
481
|
{/* Server Status */}
|
|
472
|
-
<
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
482
|
+
<SettingsSectionCard
|
|
483
|
+
title="服务状态"
|
|
484
|
+
description="查看 Web Helm Loop 连接和本地服务地址。"
|
|
485
|
+
icon={<Server className="size-3.5" />}
|
|
476
486
|
>
|
|
477
487
|
<div
|
|
478
|
-
className="
|
|
479
|
-
style={{ backgroundColor: serverStatus.running ? '#22c55e' : '#f59e0b' }}
|
|
480
|
-
/>
|
|
481
|
-
<span className="text-xs font-medium" style={{ color: 'var(--color-text-secondary)' }}>
|
|
482
|
-
{serverStatus.running ? 'Web 服务运行中' : 'Web 服务状态未知'}
|
|
483
|
-
</span>
|
|
484
|
-
<code
|
|
485
|
-
className="rounded px-1.5 py-0.5 font-mono text-xs"
|
|
488
|
+
className="m-3 flex items-center gap-3 rounded-xl border px-3 py-2.5"
|
|
486
489
|
style={{
|
|
487
490
|
backgroundColor: 'var(--color-surface)',
|
|
488
|
-
|
|
489
|
-
border: '1px solid var(--color-border)',
|
|
490
|
-
}}
|
|
491
|
-
>
|
|
492
|
-
{serverLoading ? '检查中...' : serverUrl}
|
|
493
|
-
</code>
|
|
494
|
-
<button
|
|
495
|
-
onClick={handleCopyUrl}
|
|
496
|
-
className="ml-auto flex items-center gap-1.5 rounded-md border px-2.5 py-1 text-xs font-medium transition-colors hover:bg-white/5"
|
|
497
|
-
style={{
|
|
498
|
-
borderColor: 'var(--color-border)',
|
|
499
|
-
color: copied ? '#22c55e' : 'var(--color-text-secondary)',
|
|
491
|
+
borderColor: 'var(--color-border-subtle)',
|
|
500
492
|
}}
|
|
501
493
|
>
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
494
|
+
<div
|
|
495
|
+
className="size-2 shrink-0 rounded-full"
|
|
496
|
+
style={{ backgroundColor: serverStatus.running ? '#22c55e' : '#f59e0b' }}
|
|
497
|
+
/>
|
|
498
|
+
<span className="text-xs font-medium" style={{ color: 'var(--color-text-secondary)' }}>
|
|
499
|
+
{serverStatus.running ? 'Web 服务运行中' : 'Web 服务状态未知'}
|
|
500
|
+
</span>
|
|
501
|
+
<code
|
|
502
|
+
className="rounded px-1.5 py-0.5 font-mono text-xs"
|
|
503
|
+
style={{
|
|
504
|
+
backgroundColor: 'var(--color-surface)',
|
|
505
|
+
color: 'var(--color-text)',
|
|
506
|
+
border: '1px solid var(--color-border)',
|
|
507
|
+
}}
|
|
508
|
+
>
|
|
509
|
+
{serverLoading ? '检查中...' : serverUrl}
|
|
510
|
+
</code>
|
|
511
|
+
<button
|
|
512
|
+
onClick={handleCopyUrl}
|
|
513
|
+
className="ml-auto flex items-center gap-1.5 rounded-md border px-2.5 py-1 text-xs font-medium transition-colors hover:bg-white/5"
|
|
514
|
+
style={{
|
|
515
|
+
borderColor: 'var(--color-border)',
|
|
516
|
+
color: copied ? '#22c55e' : 'var(--color-text-secondary)',
|
|
517
|
+
}}
|
|
518
|
+
>
|
|
519
|
+
{copied ? <Check className="size-3" /> : <Copy className="size-3" />}
|
|
520
|
+
{copied ? '已复制' : '复制链接'}
|
|
521
|
+
</button>
|
|
522
|
+
</div>
|
|
523
|
+
{serverError && (
|
|
524
|
+
<p className="px-3 pb-2 text-xs text-red-400">服务状态获取失败:{serverError}</p>
|
|
525
|
+
)}
|
|
526
|
+
<p className="px-3 pb-3 text-xs" style={{ color: 'var(--color-text-muted)' }}>
|
|
527
|
+
当前为 Web Helm Loop 模式。服务由 Hermit 后端托管,不能在浏览器内启动或关闭。
|
|
528
|
+
</p>
|
|
529
|
+
</SettingsSectionCard>
|
|
510
530
|
|
|
511
531
|
{/* Runtime Settings */}
|
|
512
|
-
<
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
min={0}
|
|
568
|
-
/>
|
|
569
|
-
</SettingRow>
|
|
570
|
-
<SettingRow label="工具消息最大长度" description="截断展示的工具消息最大字符数">
|
|
571
|
-
<CompactNum
|
|
572
|
-
value={ccSettings.tool_max_len}
|
|
573
|
-
onChange={(v) => patchCcSettings({ tool_max_len: v })}
|
|
574
|
-
onSave={() => void autoSaveCcSetting('tool_max_len', ccSettings.tool_max_len)}
|
|
575
|
-
min={0}
|
|
576
|
-
/>
|
|
577
|
-
</SettingRow>
|
|
578
|
-
<SettingRow label="预览间隔" description="流式预览刷新间隔(毫秒)">
|
|
579
|
-
<CompactNum
|
|
580
|
-
value={ccSettings.stream_preview_interval_ms}
|
|
581
|
-
onChange={(v) => patchCcSettings({ stream_preview_interval_ms: v })}
|
|
582
|
-
onSave={() =>
|
|
583
|
-
void autoSaveCcSetting(
|
|
584
|
-
'stream_preview_interval_ms',
|
|
585
|
-
ccSettings.stream_preview_interval_ms
|
|
586
|
-
)
|
|
587
|
-
}
|
|
588
|
-
min={100}
|
|
589
|
-
/>
|
|
590
|
-
</SettingRow>
|
|
591
|
-
<SettingRow label="频率限制" description="限制时间窗口内发送的最大消息数">
|
|
592
|
-
<div className="flex items-center gap-1.5 text-xs text-[var(--color-text-muted)]">
|
|
532
|
+
<SettingsSectionCard
|
|
533
|
+
title="运行设置"
|
|
534
|
+
description="控制 Claude Code 运行时输出、限流和会话超时策略。"
|
|
535
|
+
icon={<Gauge className="size-3.5" />}
|
|
536
|
+
>
|
|
537
|
+
{ccSettingsLoading ? (
|
|
538
|
+
<div className="flex items-center gap-2 py-3 text-xs text-[var(--color-text-muted)]">
|
|
539
|
+
<Loader2 className="size-3.5 animate-spin" />
|
|
540
|
+
正在加载...
|
|
541
|
+
</div>
|
|
542
|
+
) : (
|
|
543
|
+
<>
|
|
544
|
+
<SettingRow label="附件回传" description="控制是否将对话中的附件文件回传给 Agent">
|
|
545
|
+
<SettingsSelect
|
|
546
|
+
value={ccSettings.attachment_send}
|
|
547
|
+
options={CC_ATTACHMENT_OPTIONS}
|
|
548
|
+
onChange={(v) => void autoSaveCcSetting('attachment_send', v)}
|
|
549
|
+
/>
|
|
550
|
+
</SettingRow>
|
|
551
|
+
<SettingRow label="空闲超时" description="Agent 空闲多久后自动断开(分钟)">
|
|
552
|
+
<CompactNum
|
|
553
|
+
value={ccSettings.idle_timeout_mins}
|
|
554
|
+
onChange={(v) => patchCcSettings({ idle_timeout_mins: v })}
|
|
555
|
+
onSave={() =>
|
|
556
|
+
void autoSaveCcSetting('idle_timeout_mins', ccSettings.idle_timeout_mins)
|
|
557
|
+
}
|
|
558
|
+
min={0}
|
|
559
|
+
/>
|
|
560
|
+
</SettingRow>
|
|
561
|
+
<SettingRow label="日志等级" description="运行时日志输出级别">
|
|
562
|
+
<SettingsSelect
|
|
563
|
+
value={ccSettings.log_level}
|
|
564
|
+
options={CC_LOG_LEVEL_OPTIONS}
|
|
565
|
+
onChange={(v) => void autoSaveCcSetting('log_level', v)}
|
|
566
|
+
/>
|
|
567
|
+
</SettingRow>
|
|
568
|
+
<SettingRow label="显示 Thinking 消息" description="在对话中展示 Agent 的思考过程">
|
|
569
|
+
<SettingsToggle
|
|
570
|
+
enabled={ccSettings.thinking_messages}
|
|
571
|
+
onChange={(v) => void autoSaveCcSetting('thinking_messages', v)}
|
|
572
|
+
/>
|
|
573
|
+
</SettingRow>
|
|
574
|
+
<SettingRow label="显示工具进度" description="在对话中展示 Agent 调用工具的详细信息">
|
|
575
|
+
<SettingsToggle
|
|
576
|
+
enabled={ccSettings.tool_messages}
|
|
577
|
+
onChange={(v) => void autoSaveCcSetting('tool_messages', v)}
|
|
578
|
+
/>
|
|
579
|
+
</SettingRow>
|
|
580
|
+
<SettingRow label="启用流式预览" description="实时预览 Agent 的流式输出内容">
|
|
581
|
+
<SettingsToggle
|
|
582
|
+
enabled={ccSettings.stream_preview_enabled}
|
|
583
|
+
onChange={(v) => void autoSaveCcSetting('stream_preview_enabled', v)}
|
|
584
|
+
/>
|
|
585
|
+
</SettingRow>
|
|
586
|
+
<SettingRow label="Thinking 最大长度" description="截断展示的 Thinking 消息最大字符数">
|
|
593
587
|
<CompactNum
|
|
594
|
-
value={ccSettings.
|
|
595
|
-
onChange={(v) => patchCcSettings({
|
|
596
|
-
onSave={() =>
|
|
588
|
+
value={ccSettings.thinking_max_len}
|
|
589
|
+
onChange={(v) => patchCcSettings({ thinking_max_len: v })}
|
|
590
|
+
onSave={() =>
|
|
591
|
+
void autoSaveCcSetting('thinking_max_len', ccSettings.thinking_max_len)
|
|
592
|
+
}
|
|
597
593
|
min={0}
|
|
598
|
-
className="w-20"
|
|
599
594
|
/>
|
|
600
|
-
|
|
595
|
+
</SettingRow>
|
|
596
|
+
<SettingRow label="工具消息最大长度" description="截断展示的工具消息最大字符数">
|
|
601
597
|
<CompactNum
|
|
602
|
-
value={ccSettings.
|
|
603
|
-
onChange={(v) => patchCcSettings({
|
|
604
|
-
onSave={() => void
|
|
605
|
-
min={
|
|
606
|
-
className="w-20"
|
|
598
|
+
value={ccSettings.tool_max_len}
|
|
599
|
+
onChange={(v) => patchCcSettings({ tool_max_len: v })}
|
|
600
|
+
onSave={() => void autoSaveCcSetting('tool_max_len', ccSettings.tool_max_len)}
|
|
601
|
+
min={0}
|
|
607
602
|
/>
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
603
|
+
</SettingRow>
|
|
604
|
+
<SettingRow label="预览间隔" description="流式预览刷新间隔(毫秒)">
|
|
605
|
+
<CompactNum
|
|
606
|
+
value={ccSettings.stream_preview_interval_ms}
|
|
607
|
+
onChange={(v) => patchCcSettings({ stream_preview_interval_ms: v })}
|
|
608
|
+
onSave={() =>
|
|
609
|
+
void autoSaveCcSetting(
|
|
610
|
+
'stream_preview_interval_ms',
|
|
611
|
+
ccSettings.stream_preview_interval_ms
|
|
612
|
+
)
|
|
613
|
+
}
|
|
614
|
+
min={100}
|
|
615
|
+
/>
|
|
616
|
+
</SettingRow>
|
|
617
|
+
<SettingRow label="频率限制" description="限制时间窗口内发送的最大消息数">
|
|
618
|
+
<div className="flex items-center gap-1.5 text-xs text-[var(--color-text-muted)]">
|
|
619
|
+
<CompactNum
|
|
620
|
+
value={ccSettings.rate_limit_max_messages}
|
|
621
|
+
onChange={(v) => patchCcSettings({ rate_limit_max_messages: v })}
|
|
622
|
+
onSave={() => void saveRateLimit()}
|
|
623
|
+
min={0}
|
|
624
|
+
className="w-20"
|
|
625
|
+
/>
|
|
626
|
+
<span>条 /</span>
|
|
627
|
+
<CompactNum
|
|
628
|
+
value={ccSettings.rate_limit_window_secs}
|
|
629
|
+
onChange={(v) => patchCcSettings({ rate_limit_window_secs: v })}
|
|
630
|
+
onSave={() => void saveRateLimit()}
|
|
631
|
+
min={1}
|
|
632
|
+
className="w-20"
|
|
633
|
+
/>
|
|
634
|
+
<span>秒</span>
|
|
635
|
+
</div>
|
|
636
|
+
</SettingRow>
|
|
637
|
+
</>
|
|
638
|
+
)}
|
|
639
|
+
</SettingsSectionCard>
|
|
613
640
|
|
|
614
641
|
{/* Privacy */}
|
|
615
642
|
{import.meta.env.VITE_SENTRY_DSN && (
|
|
616
|
-
|
|
617
|
-
|
|
643
|
+
<SettingsSectionCard
|
|
644
|
+
title="隐私"
|
|
645
|
+
description="配置匿名崩溃与性能数据上报。"
|
|
646
|
+
icon={<Shield className="size-3.5" />}
|
|
647
|
+
>
|
|
618
648
|
<SettingRow label="发送崩溃报告" description="发送匿名崩溃与性能数据,帮助改进应用">
|
|
619
649
|
<SettingsToggle
|
|
620
650
|
enabled={safeConfig.general.telemetryEnabled ?? true}
|
|
@@ -622,7 +652,7 @@ export const GeneralSection = ({
|
|
|
622
652
|
disabled={saving}
|
|
623
653
|
/>
|
|
624
654
|
</SettingRow>
|
|
625
|
-
|
|
655
|
+
</SettingsSectionCard>
|
|
626
656
|
)}
|
|
627
657
|
</div>
|
|
628
658
|
);
|
|
@@ -182,6 +182,7 @@ interface ProjectDetail {
|
|
|
182
182
|
agent_type: string;
|
|
183
183
|
platforms: Array<{ type: string; connected: boolean }>;
|
|
184
184
|
platform_configs: Array<Record<string, string>>;
|
|
185
|
+
work_dir?: string;
|
|
185
186
|
}
|
|
186
187
|
|
|
187
188
|
async function fetchProjects(): Promise<ProjectSummary[]> {
|
|
@@ -200,22 +201,18 @@ async function fetchProjectDetail(name: string): Promise<ProjectDetail> {
|
|
|
200
201
|
async function addPlatform(
|
|
201
202
|
projectName: string,
|
|
202
203
|
type: string,
|
|
203
|
-
options: Record<string, string
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
204
|
+
options: Record<string, string>,
|
|
205
|
+
detail?: ProjectDetail
|
|
206
|
+
): Promise<{ restartRequired: boolean; restartHandled: boolean }> {
|
|
207
|
+
const result = await api.ccSetup.addPlatform(projectName, {
|
|
208
|
+
type,
|
|
209
|
+
options,
|
|
210
|
+
work_dir: detail?.work_dir,
|
|
211
|
+
agent_type: detail?.agent_type,
|
|
209
212
|
});
|
|
210
|
-
const json = (await res.json()) as {
|
|
211
|
-
ok: boolean;
|
|
212
|
-
error?: string;
|
|
213
|
-
data?: { restart_required?: boolean };
|
|
214
|
-
restart_required?: boolean;
|
|
215
|
-
};
|
|
216
|
-
if (!json.ok) throw new Error(json.error ?? '添加失败');
|
|
217
213
|
return {
|
|
218
|
-
restartRequired:
|
|
214
|
+
restartRequired: result.restart_required === true,
|
|
215
|
+
restartHandled: result.restart_handled === true,
|
|
219
216
|
};
|
|
220
217
|
}
|
|
221
218
|
|
|
@@ -425,7 +422,12 @@ export const PlatformsSection = (): React.JSX.Element => {
|
|
|
425
422
|
</p>
|
|
426
423
|
)}
|
|
427
424
|
|
|
428
|
-
<Button
|
|
425
|
+
<Button
|
|
426
|
+
size="sm"
|
|
427
|
+
variant="outline"
|
|
428
|
+
disabled={!detail}
|
|
429
|
+
onClick={() => setAddOpen(proj.name)}
|
|
430
|
+
>
|
|
429
431
|
<Plus className="mr-1.5 size-3.5" />
|
|
430
432
|
添加渠道
|
|
431
433
|
</Button>
|
|
@@ -442,6 +444,7 @@ export const PlatformsSection = (): React.JSX.Element => {
|
|
|
442
444
|
open={!!addOpen}
|
|
443
445
|
onClose={() => setAddOpen(null)}
|
|
444
446
|
onAdded={handleAdded}
|
|
447
|
+
projectDetail={details[addOpen ?? '']}
|
|
445
448
|
/>
|
|
446
449
|
</div>
|
|
447
450
|
);
|
|
@@ -456,11 +459,13 @@ function AddPlatformDialog({
|
|
|
456
459
|
open,
|
|
457
460
|
onClose,
|
|
458
461
|
onAdded,
|
|
462
|
+
projectDetail,
|
|
459
463
|
}: {
|
|
460
464
|
projectName: string;
|
|
461
465
|
open: boolean;
|
|
462
466
|
onClose: () => void;
|
|
463
467
|
onAdded: (projectName: string) => void;
|
|
468
|
+
projectDetail?: ProjectDetail;
|
|
464
469
|
}) {
|
|
465
470
|
const [platformType, setPlatformType] = useState<PlatformType>('feishu');
|
|
466
471
|
const [fields, setFields] = useState<Record<string, string>>({});
|
|
@@ -496,10 +501,13 @@ function AddPlatformDialog({
|
|
|
496
501
|
const result = await addPlatform(
|
|
497
502
|
projectName,
|
|
498
503
|
platformType,
|
|
499
|
-
ccOptions as Record<string, string
|
|
504
|
+
ccOptions as Record<string, string>,
|
|
505
|
+
projectDetail
|
|
500
506
|
);
|
|
501
507
|
onAdded(projectName);
|
|
502
|
-
if (result.
|
|
508
|
+
if (result.restartHandled) {
|
|
509
|
+
emitOpenHermitEvent(OPEN_HERMIT_EVENTS.runtimeRestarted);
|
|
510
|
+
} else if (result.restartRequired) {
|
|
503
511
|
const shouldRestart = await confirm({
|
|
504
512
|
title: '重启服务',
|
|
505
513
|
message: '渠道已添加。需要重启服务才会生效。',
|