@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
@@ -0,0 +1,81 @@
1
+ import React from 'react';
2
+
3
+ import { MessageCircle, QrCode, Sparkles, Users } from 'lucide-react';
4
+
5
+ const COMMUNITY_QR_IMAGE = '/chat-community-qr.jpg';
6
+
7
+ export const CommunityChatView = (): React.JSX.Element => {
8
+ return (
9
+ <div className="relative flex-1 overflow-auto bg-surface">
10
+ <div
11
+ className="pointer-events-none absolute inset-x-0 top-0 h-[520px] bg-[radial-gradient(ellipse_80%_50%_at_50%_-20%,rgba(132,204,22,0.14),transparent)]"
12
+ aria-hidden="true"
13
+ />
14
+
15
+ <div className="relative mx-auto flex min-h-full max-w-5xl flex-col px-8 py-12">
16
+ <section className="overflow-hidden rounded-2xl border border-border bg-surface-raised shadow-sm">
17
+ <div className="border-b border-border bg-gradient-to-br from-lime-500/15 via-emerald-500/10 to-transparent px-8 py-8">
18
+ <div className="mb-3 inline-flex items-center gap-2 rounded-full border border-lime-500/25 bg-lime-500/10 px-3 py-1 text-[11px] font-medium text-lime-300">
19
+ <MessageCircle className="size-3.5" />
20
+ Chat / 交流圈
21
+ </div>
22
+ <h1 className="text-3xl font-semibold tracking-tight text-text">加入 Yancy 的朋友们</h1>
23
+ <p className="mt-3 max-w-2xl text-sm leading-6 text-text-secondary">
24
+ 扫码加入「野生想法」交流圈,聊 Loop Engineering、Agent
25
+ Teams、自动化工作台和一人公司的实践。
26
+ </p>
27
+ </div>
28
+
29
+ <div className="grid gap-8 px-8 py-8 lg:grid-cols-[minmax(0,1fr)_360px]">
30
+ <div className="space-y-4">
31
+ <div className="rounded-xl border border-border bg-surface px-5 py-4">
32
+ <div className="mb-2 flex items-center gap-2 text-sm font-medium text-text">
33
+ <Users className="size-4 text-lime-400" />
34
+ 适合谁加入
35
+ </div>
36
+ <p className="text-sm leading-6 text-text-muted">
37
+ 如果你正在用 Claude Code / Hermit / 多 Agent 团队做真实项目,或者想交流 AI
38
+ 自动化、产品工程和独立创造,这里会持续分享实验和想法。
39
+ </p>
40
+ </div>
41
+
42
+ <div className="rounded-xl border border-border bg-surface px-5 py-4">
43
+ <div className="mb-2 flex items-center gap-2 text-sm font-medium text-text">
44
+ <Sparkles className="size-4 text-emerald-400" />
45
+ 你可以期待
46
+ </div>
47
+ <ul className="space-y-2 text-sm leading-6 text-text-muted">
48
+ <li>• Hermit / OpenHermit 的功能讨论和使用反馈</li>
49
+ <li>• Agent 团队、Loop、Workflow 的实践案例</li>
50
+ <li>• 一人公司、自动化研发和产品想法交流</li>
51
+ </ul>
52
+ </div>
53
+
54
+ <div className="rounded-xl border border-lime-500/20 bg-lime-500/5 px-5 py-4 text-sm leading-6 text-lime-100/90">
55
+ 备注:该二维码来自飞书 / Lark 圈子,仅限企业内部成员加入;如果扫码不可用,请联系
56
+ Yancy 获取新的邀请方式。
57
+ </div>
58
+ </div>
59
+
60
+ <div className="rounded-2xl border border-border bg-surface px-5 py-5 text-center">
61
+ <div className="mb-3 inline-flex items-center gap-2 text-sm font-medium text-text">
62
+ <QrCode className="size-4 text-lime-400" />
63
+ 扫码加入
64
+ </div>
65
+ <div className="rounded-2xl border border-border bg-white p-3 shadow-sm">
66
+ <img
67
+ src={COMMUNITY_QR_IMAGE}
68
+ alt="Yancy 的朋友们交流圈二维码"
69
+ className="mx-auto aspect-square w-full rounded-xl object-cover"
70
+ />
71
+ </div>
72
+ <p className="mt-4 text-xs leading-5 text-text-muted">
73
+ 打开飞书 / Lark 扫一扫,加入「Yancy 的朋友们 · 野生想法」。
74
+ </p>
75
+ </div>
76
+ </div>
77
+ </section>
78
+ </div>
79
+ </div>
80
+ );
81
+ };
@@ -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 { Sparkles, Users, Workflow } from 'lucide-react';
10
+ import { Bot, MessageCircle, Settings, ShieldCheck, TerminalSquare, Users } from 'lucide-react';
11
11
  import { useShallow } from 'zustand/react/shallow';
12
12
 
13
- const HIGHLIGHT_HARNESSES = [
14
- 'Claude Code',
15
- 'Cursor',
16
- 'Codex',
17
- 'Gemini',
18
- 'OpenCode',
19
- 'DeepSeek / IM',
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 { openTeamsTab, openSettingsTab, teams, teamsLoading } = useStore(
24
- useShallow((state) => ({
25
- openTeamsTab: state.openTeamsTab,
26
- openSettingsTab: state.openSettingsTab,
27
- teams: state.teams,
28
- teamsLoading: state.teamsLoading,
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.08),transparent)]"
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-5xl px-8 py-12">
41
- <section className="mb-8 overflow-hidden rounded-xl border border-border bg-surface-raised">
42
- <div className="border-b border-border px-6 py-5">
43
- <div className="mb-2 inline-flex items-center gap-2 rounded-full border border-border bg-surface px-3 py-1 text-[11px] text-text-muted">
44
- <Sparkles className="size-3.5" />
45
- 一人公司优先
46
- </div>
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
- </div>
72
- <div className="rounded-lg border border-border bg-surface px-4 py-3">
73
- <div className="mb-2 inline-flex items-center gap-1.5 text-xs font-medium text-text-secondary">
74
- <Sparkles className="size-3.5" />
75
- 会话洞察
76
- </div>
77
- <p className="text-xs text-text-muted">
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-3 rounded-md border border-border bg-surface-overlay px-2.5 py-2 text-[11px] text-text-muted">
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
- <div className="rounded-lg border border-border bg-surface px-4 py-3">
85
- <div className="mb-2 inline-flex items-center gap-1.5 text-xs font-medium text-text-secondary">
86
- <Users className="size-3.5" />
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
- <p className="text-xs text-text-muted">
90
- 你负责决策,Hermit 负责动态拉起子 agent、分发任务、跟踪执行和回收结果。
91
- </p>
92
- <div className="mt-3 rounded-md border border-border bg-surface-overlay px-2.5 py-2 text-[11px] text-text-muted">
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
- <div className="mb-8 flex items-center justify-center">
100
- <button
101
- onClick={openTeamsTab}
102
- className="flex shrink-0 items-center gap-2 rounded-sm border border-border bg-surface-raised px-4 py-3 text-sm text-text-secondary transition-all duration-200 hover:border-zinc-500 hover:text-text"
103
- >
104
- <Users className="size-4" />
105
- 选择团队
106
- </button>
107
- </div>
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
- <h2 className="text-sm font-semibold text-text">快速开始(3 步)</h2>
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-[11px] font-medium text-text-muted">第 1 步</p>
122
- <p className="mt-1 text-sm font-medium text-text">配置 Harness</p>
123
- <p className="mt-1 text-xs text-text-muted">连接 Claude/Codex/Gemini 等运行时</p>
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-[11px] font-medium text-text-muted">第 2 步</p>
131
- <p className="mt-1 text-sm font-medium text-text">创建团队并启动</p>
132
- <p className="mt-1 text-xs text-text-muted">设置工作目录后即可开始分发任务</p>
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: 'Claude Code 私有扩展,增强运行时的能力与集成。',
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">正在检查扩展运行时可用性</p>
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: 'plugins';
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 by default so startup avoids dashboard background scans.
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 && (