@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.
Files changed (281) hide show
  1. package/README.md +98 -89
  2. package/bin/hermit.mjs +96 -0
  3. package/dist-renderer/assets/{ProjectEditorOverlay-Br0X83Jf.js → ProjectEditorOverlay-C98qSs7-.js} +1 -1
  4. package/dist-renderer/assets/{TeamGraphOverlay-DHMTbZPZ.js → TeamGraphOverlay-CsBbZwcL.js} +1 -1
  5. package/dist-renderer/assets/{_basePickBy-DzIiX7yH.js → _basePickBy-ZOyLWjMK.js} +1 -1
  6. package/dist-renderer/assets/{_baseUniq-6hZuzTLU.js → _baseUniq-DBb726rt.js} +1 -1
  7. package/dist-renderer/assets/{arc-CXgO6fx_.js → arc-CdiTaR_R.js} +1 -1
  8. package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-DKWgtDHr.js → architectureDiagram-VXUJARFQ-Cz3sc5TH.js} +1 -1
  9. package/dist-renderer/assets/{blockDiagram-VD42YOAC-DOMUcC40.js → blockDiagram-VD42YOAC-DE4c-KJ3.js} +1 -1
  10. package/dist-renderer/assets/{c4Diagram-YG6GDRKO-B_k2L7qX.js → c4Diagram-YG6GDRKO-CmTMDTrV.js} +1 -1
  11. package/dist-renderer/assets/channel-KTpqi9eT.js +1 -0
  12. package/dist-renderer/assets/{chunk-4BX2VUAB-BeD_ccFy.js → chunk-4BX2VUAB-rhHy3tFl.js} +1 -1
  13. package/dist-renderer/assets/{chunk-55IACEB6-ClZfkA5w.js → chunk-55IACEB6-fLZBzuo_.js} +1 -1
  14. package/dist-renderer/assets/{chunk-B4BG7PRW-5XluxXsn.js → chunk-B4BG7PRW-DOzxQhim.js} +1 -1
  15. package/dist-renderer/assets/{chunk-DI55MBZ5-BzIjjNVm.js → chunk-DI55MBZ5-COQCcXC5.js} +1 -1
  16. package/dist-renderer/assets/{chunk-FMBD7UC4-HgH3MK_H.js → chunk-FMBD7UC4-IKU9U_Y4.js} +1 -1
  17. package/dist-renderer/assets/{chunk-QN33PNHL-WeC5T3Ba.js → chunk-QN33PNHL-D6WV154X.js} +1 -1
  18. package/dist-renderer/assets/{chunk-QZHKN3VN-Cu1ApHfW.js → chunk-QZHKN3VN-D90_2DQp.js} +1 -1
  19. package/dist-renderer/assets/{chunk-TZMSLE5B-BOhlynJM.js → chunk-TZMSLE5B-BQEil57G.js} +1 -1
  20. package/dist-renderer/assets/classDiagram-2ON5EDUG-lpzulY5X.js +1 -0
  21. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-lpzulY5X.js +1 -0
  22. package/dist-renderer/assets/clone-CriGymY9.js +1 -0
  23. package/dist-renderer/assets/{cose-bilkent-S5V4N54A-DGZSihDQ.js → cose-bilkent-S5V4N54A-6WiK6U2P.js} +1 -1
  24. package/dist-renderer/assets/{dagre-6UL2VRFP-CnxwCbku.js → dagre-6UL2VRFP-DF4MMuTn.js} +1 -1
  25. package/dist-renderer/assets/{diagram-PSM6KHXK-DsIhoxdI.js → diagram-PSM6KHXK-CcF1eZ7E.js} +1 -1
  26. package/dist-renderer/assets/{diagram-QEK2KX5R-Cmh9KUF5.js → diagram-QEK2KX5R-DYlOVPQB.js} +1 -1
  27. package/dist-renderer/assets/{diagram-S2PKOQOG-CKxV456A.js → diagram-S2PKOQOG-BHXWsZOP.js} +1 -1
  28. package/dist-renderer/assets/{erDiagram-Q2GNP2WA-EnvYjOjc.js → erDiagram-Q2GNP2WA-GjmuBx8d.js} +1 -1
  29. package/dist-renderer/assets/{flowDiagram-NV44I4VS-BmNeWY_A.js → flowDiagram-NV44I4VS-BuS7YVHk.js} +1 -1
  30. package/dist-renderer/assets/{ganttDiagram-JELNMOA3-D30fyK-u.js → ganttDiagram-JELNMOA3-3Teu5tAa.js} +1 -1
  31. package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-CrUNiYg1.js → gitGraphDiagram-V2S2FVAM-BiLdCYu5.js} +1 -1
  32. package/dist-renderer/assets/{graph-CY1gTfTb.js → graph-CDP_R8ct.js} +1 -1
  33. package/dist-renderer/assets/{index-CaEbzwAU.js → index-BSZdT-g-.js} +1 -1
  34. package/dist-renderer/assets/{index-D5K-SjBG.js → index-BhWvMqsz.js} +1 -1
  35. package/dist-renderer/assets/{index-9_hO4N1e.js → index-C2_AupSj.js} +1 -1
  36. package/dist-renderer/assets/{index-59r209c1.js → index-C5ujiwAR.js} +580 -588
  37. package/dist-renderer/assets/index-CIS2CTK9.css +1 -0
  38. package/dist-renderer/assets/{index-DMR9B1UP.js → index-CVNjLwkq.js} +1 -1
  39. package/dist-renderer/assets/{index-BC2hXmg_.js → index-CwG3se0q.js} +1 -1
  40. package/dist-renderer/assets/{infoDiagram-HS3SLOUP-By_XUlcD.js → infoDiagram-HS3SLOUP-DLHUFo72.js} +1 -1
  41. package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-BM1LJE9m.js → journeyDiagram-XKPGCS4Q-BE07RpJD.js} +1 -1
  42. package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-DHIW3aTA.js → kanban-definition-3W4ZIXB7-DDHZy4NB.js} +1 -1
  43. package/dist-renderer/assets/{layout-DAKiL_Mo.js → layout-5nA5wUxO.js} +1 -1
  44. package/dist-renderer/assets/{linear-DwOaRYea.js → linear-BtF1i2qN.js} +1 -1
  45. package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-b7bJ2cha.js → mindmap-definition-VGOIOE7T-Z1Ui9Sqy.js} +1 -1
  46. package/dist-renderer/assets/{pieDiagram-ADFJNKIX-DxyL9Zr2.js → pieDiagram-ADFJNKIX-LCjxckWv.js} +1 -1
  47. package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-CR33pHlF.js → quadrantDiagram-AYHSOK5B-BOwKjSco.js} +1 -1
  48. package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-BAiSRSlh.js → requirementDiagram-UZGBJVZJ-pChP8Znd.js} +1 -1
  49. package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-C8JmDjoa.js → sankeyDiagram-TZEHDZUN-DifZ2qpo.js} +1 -1
  50. package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-c1d0Wi1m.js → sequenceDiagram-WL72ISMW-CJg-WYyY.js} +1 -1
  51. package/dist-renderer/assets/{splashScene-D0YB9uxm.js → splashScene-94xWCzLA.js} +1 -1
  52. package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-nT8BiH2O.js → stateDiagram-FKZM4ZOC-DWHOoFdv.js} +1 -1
  53. package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-CGYZOoMb.js +1 -0
  54. package/dist-renderer/assets/{timeline-definition-IT6M3QCI-DpoRepUA.js → timeline-definition-IT6M3QCI-CPgokIo8.js} +1 -1
  55. package/dist-renderer/assets/{treemap-GDKQZRPO-C41UJeIH.js → treemap-GDKQZRPO-DAVqSR9L.js} +1 -1
  56. package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-KMjGARKN.js → xychartDiagram-PRI3JC2R-CCOcGbrD.js} +1 -1
  57. package/dist-renderer/chat-community-qr.jpg +0 -0
  58. package/dist-renderer/fonts/Agave-Bold.ttf +0 -0
  59. package/dist-renderer/fonts/Agave-Regular.ttf +0 -0
  60. package/dist-renderer/icon.png +0 -0
  61. package/dist-renderer/icon.rar +0 -0
  62. package/dist-renderer/index.html +3 -3
  63. package/package.json +21 -26
  64. package/src/features/worker-society/core/application/WorkerSocietyService.test.ts +802 -0
  65. package/src/features/worker-society/core/application/WorkerSocietyService.ts +428 -0
  66. package/src/features/worker-society/core/application/fakes.ts +101 -0
  67. package/src/features/worker-society/core/application/ports.ts +70 -0
  68. package/src/features/worker-society/core/domain/models/society.ts +141 -0
  69. package/src/features/worker-society/core/domain/policies/societyPolicies.test.ts +739 -0
  70. package/src/features/worker-society/core/domain/policies/societyPolicies.ts +496 -0
  71. package/src/features/worker-society/main/adapters/input/societyMcp.test.ts +317 -0
  72. package/src/features/worker-society/main/adapters/input/societyMcp.ts +257 -0
  73. package/src/features/worker-society/main/adapters/input/societyRoutes.test.ts +695 -0
  74. package/src/features/worker-society/main/adapters/input/societyRoutes.ts +194 -0
  75. package/src/features/worker-society/main/composition/societyComposition.test.ts +74 -0
  76. package/src/features/worker-society/main/composition/societyComposition.ts +70 -0
  77. package/src/features/worker-society/main/composition/workerSocietyPlugin.test.ts +69 -0
  78. package/src/features/worker-society/main/composition/workerSocietyPlugin.ts +67 -0
  79. package/src/features/worker-society/main/infrastructure/crossTeamMessageGateway.test.ts +132 -0
  80. package/src/features/worker-society/main/infrastructure/crossTeamMessageGateway.ts +84 -0
  81. package/src/features/worker-society/main/infrastructure/fsStores.test.ts +216 -0
  82. package/src/features/worker-society/main/infrastructure/fsStores.ts +113 -0
  83. package/src/features/worker-society/main/infrastructure/mergingProfileStore.test.ts +195 -0
  84. package/src/features/worker-society/main/infrastructure/mergingProfileStore.ts +96 -0
  85. package/src/features/worker-society/renderer/SocietyGraph.tsx +166 -0
  86. package/src/features/worker-society/renderer/SocietyNodeLabels.tsx +139 -0
  87. package/src/features/worker-society/renderer/SocietyNodeOverlay.tsx +339 -0
  88. package/src/features/worker-society/renderer/SocietyView.tsx +437 -0
  89. package/src/features/worker-society/renderer/index.ts +11 -0
  90. package/src/features/worker-society/renderer/societyApi.test.ts +259 -0
  91. package/src/features/worker-society/renderer/societyApi.ts +144 -0
  92. package/src/features/worker-society/renderer/societyGraphAdapter.test.ts +321 -0
  93. package/src/features/worker-society/renderer/societyGraphAdapter.ts +240 -0
  94. package/src/features/worker-society/renderer/societyOverlayActions.test.ts +57 -0
  95. package/src/features/worker-society/renderer/societyOverlayActions.ts +49 -0
  96. package/src/features/worker-society/renderer/societyStore.test.ts +218 -0
  97. package/src/features/worker-society/renderer/societyStore.ts +146 -0
  98. package/src/features/worker-society/renderer/societyViewUtils.test.ts +81 -0
  99. package/src/features/worker-society/renderer/societyViewUtils.ts +68 -0
  100. package/src/main/ipc/extensions.ts +27 -0
  101. package/src/main/server.ts +1731 -539
  102. package/src/main/services/ccConnect/CcConnectBridge.ts +26 -11
  103. package/src/main/services/ccConnect/CcConnectClient.ts +9 -2
  104. package/src/main/services/ccConnect/workDirReconcile.test.ts +57 -0
  105. package/src/main/services/ccConnect/workDirReconcile.ts +36 -0
  106. package/src/main/services/direct-cli/DirectCliSessionManager.test.ts +397 -0
  107. package/src/main/services/direct-cli/DirectCliSessionManager.ts +508 -0
  108. package/src/main/services/direct-cli/DirectCliSessionStore.test.ts +79 -0
  109. package/src/main/services/direct-cli/DirectCliSessionStore.ts +97 -0
  110. package/src/main/services/direct-cli/__tests__/directCliMessageId.test.ts +40 -0
  111. package/src/main/services/direct-cli/directCliMessageId.ts +21 -0
  112. package/src/main/services/direct-cli/index.ts +17 -0
  113. package/src/main/services/extensions/capability-packs/CapabilityPackLoaderService.ts +637 -0
  114. package/src/main/services/extensions/catalog/PluginCatalogService.ts +2 -2
  115. package/src/main/services/loop-assets/LoopAssetsScannerService.ts +657 -0
  116. package/src/main/services/runtime/providerAwareCliEnv.ts +33 -5
  117. package/src/main/services/session-intelligence/LocalSessionScanner.ts +156 -71
  118. package/src/main/services/session-intelligence/SessionUsageParser.ts +103 -8
  119. package/src/main/services/session-intelligence/UsageTelemetryService.ts +11 -0
  120. package/src/main/services/session-intelligence/__tests__/teamSessionListMapper.test.ts +104 -0
  121. package/src/main/services/session-intelligence/teamSessionListMapper.ts +78 -0
  122. package/src/main/services/system-manager/AdminLoopInitializer.ts +95 -0
  123. package/src/main/services/system-manager/BuiltinWorkflowSeeder.ts +744 -0
  124. package/src/main/services/system-manager/SystemManagerConfigService.ts +19 -1
  125. package/src/main/services/system-manager/WorkflowPromptService.ts +58 -5
  126. package/src/main/services/system-manager/__tests__/AdminLoopInitializer.test.ts +129 -0
  127. package/src/main/services/system-manager/__tests__/SystemManagerConfigService.test.ts +60 -0
  128. package/src/main/services/teams-mvp/CollaborationBoardService.ts +2 -0
  129. package/src/main/services/teams-mvp/OpsRunbookContext.ts +60 -0
  130. package/src/main/services/teams-mvp/TaskDispatchService.test.ts +305 -0
  131. package/src/main/services/teams-mvp/TaskDispatchService.ts +250 -131
  132. package/src/main/services/teams-mvp/TeamProvisioningService.ts +12 -2
  133. package/src/main/services/teams-mvp/TeamWorkspaceService.test.ts +207 -0
  134. package/src/main/services/teams-mvp/TeamWorkspaceService.ts +104 -51
  135. package/src/main/services/teams-mvp/index.ts +6 -0
  136. package/src/main/utils/externalPlatformSessionRouting.ts +92 -0
  137. package/src/main/utils/toolApprovalRules.ts +151 -0
  138. package/src/renderer/App.tsx +24 -89
  139. package/src/renderer/api/httpClient.ts +132 -52
  140. package/src/renderer/api/providers.ts +5 -16
  141. package/src/renderer/components/chat/CommunityChatView.tsx +81 -0
  142. package/src/renderer/components/dashboard/DashboardView.tsx +130 -84
  143. package/src/renderer/components/extensions/ExtensionStoreView.tsx +39 -5
  144. package/src/renderer/components/extensions/ExtensionsSubTabTrigger.tsx +2 -1
  145. package/src/renderer/components/extensions/capability-packs/CapabilityPacksPanel.tsx +170 -0
  146. package/src/renderer/components/layout/PaneContent.tsx +10 -2
  147. package/src/renderer/components/layout/SortableTab.tsx +4 -0
  148. package/src/renderer/components/layout/TabBarActions.tsx +13 -16
  149. package/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx +4 -135
  150. package/src/renderer/components/schedules/SchedulesView.tsx +22 -14
  151. package/src/renderer/components/schedules/calendar/CalendarEventBlock.tsx +7 -6
  152. package/src/renderer/components/settings/SettingsTabs.tsx +24 -21
  153. package/src/renderer/components/settings/SettingsView.tsx +22 -13
  154. package/src/renderer/components/settings/components/SettingRow.tsx +13 -5
  155. package/src/renderer/components/settings/components/SettingsSectionCard.tsx +53 -0
  156. package/src/renderer/components/settings/components/SettingsSectionHeader.tsx +10 -6
  157. package/src/renderer/components/settings/components/SettingsSelect.tsx +12 -9
  158. package/src/renderer/components/settings/components/SettingsToggle.tsx +6 -5
  159. package/src/renderer/components/settings/components/index.ts +1 -0
  160. package/src/renderer/components/settings/sections/AdvancedSection.tsx +78 -59
  161. package/src/renderer/components/settings/sections/CliStatusSection.tsx +32 -44
  162. package/src/renderer/components/settings/sections/ConfigEditorDialog.tsx +1 -1
  163. package/src/renderer/components/settings/sections/GeneralSection.tsx +216 -186
  164. package/src/renderer/components/settings/sections/PlatformsSection.tsx +25 -17
  165. package/src/renderer/components/settings/sections/TaskBusSection.tsx +63 -22
  166. package/src/renderer/components/sidebar/SidebarSessions.tsx +120 -80
  167. package/src/renderer/components/sidebar/SidebarTaskItem.tsx +1 -1
  168. package/src/renderer/components/splash/splashScene.ts +6 -2
  169. package/src/renderer/components/system-manager/SystemManagerView.tsx +169 -255
  170. package/src/renderer/components/tasks/TasksView.tsx +63 -37
  171. package/src/renderer/components/team/CcSessionsSection.tsx +124 -89
  172. package/src/renderer/components/team/HarnessBrandLogos.tsx +318 -0
  173. package/src/renderer/components/team/HarnessSelect.tsx +25 -26
  174. package/src/renderer/components/team/TeamDetailView.tsx +137 -153
  175. package/src/renderer/components/team/TeamEmptyState.tsx +9 -37
  176. package/src/renderer/components/team/TeamListView.tsx +144 -30
  177. package/src/renderer/components/team/__tests__/CcSessionsSection.hasLocalFile.test.tsx +128 -0
  178. package/src/renderer/components/team/activity/ActivityItem.tsx +21 -9
  179. package/src/renderer/components/team/activity/ActivityTimeline.tsx +2 -2
  180. package/src/renderer/components/team/dialogs/AdvancedCliSection.tsx +1 -1
  181. package/src/renderer/components/team/dialogs/CreateTaskDialog.tsx +13 -10
  182. package/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +189 -57
  183. package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +9 -157
  184. package/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx +19 -15
  185. package/src/renderer/components/team/dialogs/PlatformBindingDialog.tsx +48 -10
  186. package/src/renderer/components/team/dialogs/PlatformManualForm.tsx +11 -12
  187. package/src/renderer/components/team/dialogs/PlatformSetupQR.tsx +39 -37
  188. package/src/renderer/components/team/dialogs/RuntimeConfigDialog.tsx +434 -64
  189. package/src/renderer/components/team/dialogs/SendMessageDialog.tsx +12 -10
  190. package/src/renderer/components/team/dialogs/TaskDetailDialog.tsx +2 -2
  191. package/src/renderer/components/team/dialogs/__tests__/CreateTeamDialog.bindProject.test.tsx +399 -0
  192. package/src/renderer/components/team/dialogs/__tests__/CreateTeamDialog.chineseRepro.test.tsx +253 -0
  193. package/src/renderer/components/team/dialogs/platformAllowUtils.ts +91 -0
  194. package/src/renderer/components/team/dialogs/teammateRuntimeCompatibility.tsx +1 -1
  195. package/src/renderer/components/team/kanban/KanbanTaskCard.test.tsx +41 -0
  196. package/src/renderer/components/team/kanban/KanbanTaskCard.tsx +41 -86
  197. package/src/renderer/components/team/loop-console/LoopCommandComposer.tsx +310 -0
  198. package/src/renderer/components/team/loop-console/LoopConsolePanel.tsx +372 -0
  199. package/src/renderer/components/team/loop-console/loopSendIntent.test.ts +85 -0
  200. package/src/renderer/components/team/loop-console/loopSendIntent.ts +221 -0
  201. package/src/renderer/components/team/loop-console/useLeadSessionToolActivity.ts +74 -0
  202. package/src/renderer/components/team/loop-console/useLoopCommandSuggestions.ts +165 -0
  203. package/src/renderer/components/team/loop-console/useLoopConsoleController.ts +266 -0
  204. package/src/renderer/components/team/members/LeadModelRow.test.tsx +1 -1
  205. package/src/renderer/components/team/members/LeadModelRow.tsx +5 -3
  206. package/src/renderer/components/team/members/MemberDetailDialog.tsx +11 -0
  207. package/src/renderer/components/team/members/MemberDetailStats.tsx +13 -3
  208. package/src/renderer/components/team/members/MemberDraftRow.test.tsx +1 -1
  209. package/src/renderer/components/team/members/MemberDraftRow.tsx +1 -1
  210. package/src/renderer/components/team/members/MemberMessagesTab.tsx +2 -2
  211. package/src/renderer/components/team/members/MemberStatsTab.tsx +1 -1
  212. package/src/renderer/components/team/messages/MessageComposer.tsx +150 -44
  213. package/src/renderer/components/team/messages/MessagesFilterPopover.tsx +2 -2
  214. package/src/renderer/components/team/messages/MessagesPanel.tsx +34 -28
  215. package/src/renderer/components/team/schedule/CcCronScheduleDialog.tsx +6 -6
  216. package/src/renderer/components/team/taskLogs/ExactTaskLogCard.tsx +2 -2
  217. package/src/renderer/components/team/taskLogs/TaskLogStreamSection.tsx +1 -1
  218. package/src/renderer/components/terminal/TerminalPanel.tsx +2 -3
  219. package/src/renderer/components/ui/MentionableTextarea.tsx +5 -1
  220. package/src/renderer/constants/teamColors.ts +5 -5
  221. package/src/renderer/hooks/useExtensionsTabState.ts +1 -1
  222. package/src/renderer/hooks/useMentionDetection.ts +5 -1
  223. package/src/renderer/hooks/useProjectWorkflowCommands.ts +57 -0
  224. package/src/renderer/hooks/useTeamSuggestions.ts +2 -0
  225. package/src/renderer/index.css +19 -2
  226. package/src/renderer/main.tsx +7 -1
  227. package/src/renderer/store/index.ts +18 -1
  228. package/src/renderer/store/slices/extensionsSlice.ts +83 -0
  229. package/src/renderer/store/slices/tabSlice.ts +61 -0
  230. package/src/renderer/store/slices/teamSlice.ts +138 -9
  231. package/src/renderer/types/mention.ts +8 -0
  232. package/src/renderer/types/tabs.ts +3 -1
  233. package/src/renderer/utils/__tests__/bindProjectSlug.test.ts +69 -0
  234. package/src/renderer/utils/__tests__/groupTransformer.test.ts +148 -0
  235. package/src/renderer/utils/__tests__/initialRoute.test.ts +101 -0
  236. package/src/renderer/utils/__tests__/leadToolActivity.test.ts +124 -0
  237. package/src/renderer/utils/__tests__/mergeTeamMessages.test.ts +81 -0
  238. package/src/renderer/utils/__tests__/teamMessageFiltering.test.ts +213 -0
  239. package/src/renderer/utils/__tests__/teamMessageKey.test.ts +75 -0
  240. package/src/renderer/utils/__tests__/workflowCommandExecution.test.ts +173 -0
  241. package/src/renderer/utils/__tests__/workflowCommandSuggestions.test.ts +59 -0
  242. package/src/renderer/utils/bindProjectSlug.ts +57 -0
  243. package/src/renderer/utils/capabilityCommandExecution.ts +113 -0
  244. package/src/renderer/utils/initialRoute.ts +89 -0
  245. package/src/renderer/utils/leadToolActivity.ts +117 -0
  246. package/src/renderer/utils/loopShortcutSuggestions.ts +106 -0
  247. package/src/renderer/utils/mentionSuggestions.ts +1 -1
  248. package/src/renderer/utils/slashCommandRegistry.ts +231 -0
  249. package/src/renderer/utils/teamMentionDirective.ts +31 -0
  250. package/src/renderer/utils/workflowCommandExecution.ts +96 -0
  251. package/src/renderer/utils/workflowCommandSuggestions.ts +49 -0
  252. package/src/shared/types/api.ts +79 -4
  253. package/src/shared/types/ccConnect.ts +1 -0
  254. package/src/shared/types/extensions/api.ts +19 -0
  255. package/src/shared/types/extensions/capabilityPack.ts +118 -0
  256. package/src/shared/types/extensions/index.ts +29 -1
  257. package/src/shared/types/index.ts +6 -0
  258. package/src/shared/types/loopAssets.ts +54 -0
  259. package/src/shared/types/providers.ts +0 -16
  260. package/src/shared/types/systemManager.ts +26 -1
  261. package/src/shared/types/team.ts +43 -3
  262. package/src/shared/types/terminal.ts +2 -36
  263. package/src/shared/types/worker.test.ts +28 -0
  264. package/src/shared/types/worker.ts +3 -0
  265. package/src/shared/utils/__tests__/effortLevels.test.ts +88 -0
  266. package/src/shared/utils/__tests__/providerBackend.test.ts +88 -0
  267. package/src/shared/utils/__tests__/providerLaunchArgs.test.ts +220 -0
  268. package/src/shared/utils/claudeStreamJson.test.ts +187 -0
  269. package/src/shared/utils/claudeStreamJson.ts +153 -0
  270. package/src/shared/utils/providerLaunchArgs.ts +217 -0
  271. package/src/shared/utils/slashCommands.ts +10 -0
  272. package/src/types/node-pty.d.ts +8 -0
  273. package/dist-renderer/assets/channel-D0XS_akr.js +0 -1
  274. package/dist-renderer/assets/classDiagram-2ON5EDUG-D13Ffs0U.js +0 -1
  275. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-D13Ffs0U.js +0 -1
  276. package/dist-renderer/assets/clone-B1ZrxI1D.js +0 -1
  277. package/dist-renderer/assets/index-iyjkpSus.css +0 -32
  278. package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-Dmibmlso.js +0 -1
  279. package/src/main/services/system-manager/SystemManagerPtyService.ts +0 -233
  280. package/src/renderer/components/common/TerminalPane.tsx +0 -213
  281. 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, FolderOpen, Laptop, Loader2, RotateCcw } from 'lucide-react';
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, SettingsSectionHeader, SettingsSelect, SettingsToggle } from '../components';
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
- <SettingsSectionHeader title="Agent 语言" />
416
- <SettingRow label="语言" description={agentLanguageDescription}>
417
- <Combobox
418
- options={languageComboboxOptions}
419
- value={safeConfig.general.agentLanguage ?? 'system'}
420
- onValueChange={onLanguageChange}
421
- placeholder="选择语言..."
422
- searchPlaceholder="搜索语言..."
423
- emptyMessage="未找到匹配语言。"
424
- disabled={saving}
425
- className="min-w-[180px]"
426
- renderOption={renderLanguageOption}
427
- />
428
- </SettingRow>
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
- <SettingsSectionHeader title="外观" />
432
- <SettingRow label="主题" description="选择你偏好的界面主题">
433
- <div className="inline-flex rounded-md border border-[var(--color-border)] bg-[var(--color-surface)] p-0.5">
434
- {THEME_OPTIONS.map((opt) => (
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
- <SettingsToggle
465
- enabled={safeConfig.general.autoExpandAIGroups ?? false}
466
- onChange={(v) => onGeneralToggle('autoExpandAIGroups', v)}
467
- disabled={saving}
468
- />
469
- </SettingRow>
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
- <SettingsSectionHeader title="服务状态" />
473
- <div
474
- className="mb-2 flex items-center gap-3 rounded-md px-3 py-2.5"
475
- style={{ backgroundColor: 'var(--color-surface-raised)' }}
482
+ <SettingsSectionCard
483
+ title="服务状态"
484
+ description="查看 Web Helm Loop 连接和本地服务地址。"
485
+ icon={<Server className="size-3.5" />}
476
486
  >
477
487
  <div
478
- className="size-2 shrink-0 rounded-full"
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
- color: 'var(--color-text)',
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
- {copied ? <Check className="size-3" /> : <Copy className="size-3" />}
503
- {copied ? '已复制' : '复制链接'}
504
- </button>
505
- </div>
506
- {serverError && <p className="mb-2 text-xs text-red-400">服务状态获取失败:{serverError}</p>}
507
- <p className="text-xs" style={{ color: 'var(--color-text-muted)' }}>
508
- 当前为 Web 控制台模式。服务由 Hermit 后端托管,不能在浏览器内启动或关闭。
509
- </p>
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
- <SettingsSectionHeader title="运行设置" />
513
- {ccSettingsLoading ? (
514
- <div className="flex items-center gap-2 py-3 text-xs text-[var(--color-text-muted)]">
515
- <Loader2 className="size-3.5 animate-spin" />
516
- 正在加载...
517
- </div>
518
- ) : (
519
- <>
520
- <SettingRow label="附件回传" description="控制是否将对话中的附件文件回传给 Agent">
521
- <SettingsSelect
522
- value={ccSettings.attachment_send}
523
- options={CC_ATTACHMENT_OPTIONS}
524
- onChange={(v) => void autoSaveCcSetting('attachment_send', v)}
525
- />
526
- </SettingRow>
527
- <SettingRow label="空闲超时" description="Agent 空闲多久后自动断开(分钟)">
528
- <CompactNum
529
- value={ccSettings.idle_timeout_mins}
530
- onChange={(v) => patchCcSettings({ idle_timeout_mins: v })}
531
- onSave={() =>
532
- void autoSaveCcSetting('idle_timeout_mins', ccSettings.idle_timeout_mins)
533
- }
534
- min={0}
535
- />
536
- </SettingRow>
537
- <SettingRow label="日志等级" description="运行时日志输出级别">
538
- <SettingsSelect
539
- value={ccSettings.log_level}
540
- options={CC_LOG_LEVEL_OPTIONS}
541
- onChange={(v) => void autoSaveCcSetting('log_level', v)}
542
- />
543
- </SettingRow>
544
- <SettingRow label="显示 Thinking 消息" description="在对话中展示 Agent 的思考过程">
545
- <SettingsToggle
546
- enabled={ccSettings.thinking_messages}
547
- onChange={(v) => void autoSaveCcSetting('thinking_messages', v)}
548
- />
549
- </SettingRow>
550
- <SettingRow label="显示工具进度" description="在对话中展示 Agent 调用工具的详细信息">
551
- <SettingsToggle
552
- enabled={ccSettings.tool_messages}
553
- onChange={(v) => void autoSaveCcSetting('tool_messages', v)}
554
- />
555
- </SettingRow>
556
- <SettingRow label="启用流式预览" description="实时预览 Agent 的流式输出内容">
557
- <SettingsToggle
558
- enabled={ccSettings.stream_preview_enabled}
559
- onChange={(v) => void autoSaveCcSetting('stream_preview_enabled', v)}
560
- />
561
- </SettingRow>
562
- <SettingRow label="Thinking 最大长度" description="截断展示的 Thinking 消息最大字符数">
563
- <CompactNum
564
- value={ccSettings.thinking_max_len}
565
- onChange={(v) => patchCcSettings({ thinking_max_len: v })}
566
- onSave={() => void autoSaveCcSetting('thinking_max_len', ccSettings.thinking_max_len)}
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.rate_limit_max_messages}
595
- onChange={(v) => patchCcSettings({ rate_limit_max_messages: v })}
596
- onSave={() => void saveRateLimit()}
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
- <span>条 /</span>
595
+ </SettingRow>
596
+ <SettingRow label="工具消息最大长度" description="截断展示的工具消息最大字符数">
601
597
  <CompactNum
602
- value={ccSettings.rate_limit_window_secs}
603
- onChange={(v) => patchCcSettings({ rate_limit_window_secs: v })}
604
- onSave={() => void saveRateLimit()}
605
- min={1}
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
- <span>秒</span>
609
- </div>
610
- </SettingRow>
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
- <SettingsSectionHeader title="隐私" />
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
- ): Promise<{ restartRequired: boolean }> {
205
- const res = await fetch(`/api/v1/projects/${encodeURIComponent(projectName)}/add-platform`, {
206
- method: 'POST',
207
- headers: { 'Content-Type': 'application/json' },
208
- body: JSON.stringify({ type, options }),
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: json.data?.restart_required === true || json.restart_required === true,
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 size="sm" variant="outline" onClick={() => setAddOpen(proj.name)}>
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.restartRequired) {
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: '渠道已添加。需要重启服务才会生效。',