@yancyyu/openhermit 1.6.42 → 1.6.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/README.md +98 -89
  2. package/bin/hermit.mjs +96 -0
  3. package/dist-renderer/assets/{ProjectEditorOverlay-DlFQ6mai.js → ProjectEditorOverlay-C98qSs7-.js} +1 -1
  4. package/dist-renderer/assets/{TeamGraphOverlay-D2TPMPGR.js → TeamGraphOverlay-CsBbZwcL.js} +1 -1
  5. package/dist-renderer/assets/{_basePickBy-Cmd0RHLQ.js → _basePickBy-ZOyLWjMK.js} +1 -1
  6. package/dist-renderer/assets/{_baseUniq-BI_iy8ea.js → _baseUniq-DBb726rt.js} +1 -1
  7. package/dist-renderer/assets/{arc-NzW2mjTP.js → arc-CdiTaR_R.js} +1 -1
  8. package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-Bzq85AYv.js → architectureDiagram-VXUJARFQ-Cz3sc5TH.js} +1 -1
  9. package/dist-renderer/assets/{blockDiagram-VD42YOAC-D1PvYS-b.js → blockDiagram-VD42YOAC-DE4c-KJ3.js} +1 -1
  10. package/dist-renderer/assets/{c4Diagram-YG6GDRKO-D49RKzPC.js → c4Diagram-YG6GDRKO-CmTMDTrV.js} +1 -1
  11. package/dist-renderer/assets/channel-KTpqi9eT.js +1 -0
  12. package/dist-renderer/assets/{chunk-4BX2VUAB-fmI_MQmQ.js → chunk-4BX2VUAB-rhHy3tFl.js} +1 -1
  13. package/dist-renderer/assets/{chunk-55IACEB6-Xsv9RCXZ.js → chunk-55IACEB6-fLZBzuo_.js} +1 -1
  14. package/dist-renderer/assets/{chunk-B4BG7PRW-BE1KO8Um.js → chunk-B4BG7PRW-DOzxQhim.js} +1 -1
  15. package/dist-renderer/assets/{chunk-DI55MBZ5-tqJ7Mv7f.js → chunk-DI55MBZ5-COQCcXC5.js} +1 -1
  16. package/dist-renderer/assets/{chunk-FMBD7UC4-DMD45MVJ.js → chunk-FMBD7UC4-IKU9U_Y4.js} +1 -1
  17. package/dist-renderer/assets/{chunk-QN33PNHL-DOhGrz-q.js → chunk-QN33PNHL-D6WV154X.js} +1 -1
  18. package/dist-renderer/assets/{chunk-QZHKN3VN-D8yDgJdD.js → chunk-QZHKN3VN-D90_2DQp.js} +1 -1
  19. package/dist-renderer/assets/{chunk-TZMSLE5B-BcsEDu7A.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-DlSqGHMX.js → cose-bilkent-S5V4N54A-6WiK6U2P.js} +1 -1
  24. package/dist-renderer/assets/{dagre-6UL2VRFP-BTT9tSAx.js → dagre-6UL2VRFP-DF4MMuTn.js} +1 -1
  25. package/dist-renderer/assets/{diagram-PSM6KHXK-Du-U-mK2.js → diagram-PSM6KHXK-CcF1eZ7E.js} +1 -1
  26. package/dist-renderer/assets/{diagram-QEK2KX5R-jFdHeKas.js → diagram-QEK2KX5R-DYlOVPQB.js} +1 -1
  27. package/dist-renderer/assets/{diagram-S2PKOQOG-DKLNK2bu.js → diagram-S2PKOQOG-BHXWsZOP.js} +1 -1
  28. package/dist-renderer/assets/{erDiagram-Q2GNP2WA-CZxHgIIo.js → erDiagram-Q2GNP2WA-GjmuBx8d.js} +1 -1
  29. package/dist-renderer/assets/{flowDiagram-NV44I4VS-v4XStCD0.js → flowDiagram-NV44I4VS-BuS7YVHk.js} +1 -1
  30. package/dist-renderer/assets/{ganttDiagram-JELNMOA3-DJjD_BEL.js → ganttDiagram-JELNMOA3-3Teu5tAa.js} +1 -1
  31. package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-BNy-jr03.js → gitGraphDiagram-V2S2FVAM-BiLdCYu5.js} +1 -1
  32. package/dist-renderer/assets/{graph-DDTrn6je.js → graph-CDP_R8ct.js} +1 -1
  33. package/dist-renderer/assets/{index-BBp78BAu.js → index-BSZdT-g-.js} +1 -1
  34. package/dist-renderer/assets/{index-eotrJaYy.js → index-BhWvMqsz.js} +1 -1
  35. package/dist-renderer/assets/{index-D8_B-cfs.js → index-C2_AupSj.js} +1 -1
  36. package/dist-renderer/assets/{index-BQrwHZ-k.js → index-C5ujiwAR.js} +580 -588
  37. package/dist-renderer/assets/index-CIS2CTK9.css +1 -0
  38. package/dist-renderer/assets/{index-CRKQSG9S.js → index-CVNjLwkq.js} +1 -1
  39. package/dist-renderer/assets/{index-DR6Wz52b.js → index-CwG3se0q.js} +1 -1
  40. package/dist-renderer/assets/{infoDiagram-HS3SLOUP-DqnOsuza.js → infoDiagram-HS3SLOUP-DLHUFo72.js} +1 -1
  41. package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-DTobaO1d.js → journeyDiagram-XKPGCS4Q-BE07RpJD.js} +1 -1
  42. package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-HbwVOvWc.js → kanban-definition-3W4ZIXB7-DDHZy4NB.js} +1 -1
  43. package/dist-renderer/assets/{layout--VYmTcw2.js → layout-5nA5wUxO.js} +1 -1
  44. package/dist-renderer/assets/{linear-BsJh89Mr.js → linear-BtF1i2qN.js} +1 -1
  45. package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-BZqUZePd.js → mindmap-definition-VGOIOE7T-Z1Ui9Sqy.js} +1 -1
  46. package/dist-renderer/assets/{pieDiagram-ADFJNKIX-B1q_nH6P.js → pieDiagram-ADFJNKIX-LCjxckWv.js} +1 -1
  47. package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-UD8QhSEu.js → quadrantDiagram-AYHSOK5B-BOwKjSco.js} +1 -1
  48. package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-BA_i7Nw8.js → requirementDiagram-UZGBJVZJ-pChP8Znd.js} +1 -1
  49. package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-CMTnX-2d.js → sankeyDiagram-TZEHDZUN-DifZ2qpo.js} +1 -1
  50. package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-BQXDB615.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-BAsPXy6X.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-BdasmVkC.js → timeline-definition-IT6M3QCI-CPgokIo8.js} +1 -1
  55. package/dist-renderer/assets/{treemap-GDKQZRPO-BkKQqIui.js → treemap-GDKQZRPO-DAVqSR9L.js} +1 -1
  56. package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-EAlPHOdx.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 +1709 -534
  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 +679 -74
  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 +115 -37
  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 +143 -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 +156 -83
  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 +41 -5
  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-Ch7JrfUu.js +0 -1
  274. package/dist-renderer/assets/classDiagram-2ON5EDUG-z9I4AnFy.js +0 -1
  275. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-z9I4AnFy.js +0 -1
  276. package/dist-renderer/assets/clone-Dfi1Jx6l.js +0 -1
  277. package/dist-renderer/assets/index-iyjkpSus.css +0 -32
  278. package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-DTUIBfce.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,266 @@
1
+ import { useCallback, useState } from 'react';
2
+
3
+ import { api } from '@renderer/api';
4
+ import { useStore } from '@renderer/store';
5
+ import { SYSTEM_MANAGER_TEAM_NAME } from '@shared/types/team';
6
+ import { useShallow } from 'zustand/react/shallow';
7
+
8
+ import type { LoopSendIntent } from './loopSendIntent';
9
+ import type { DiscoverableWorker, InboxMessage } from '@shared/types';
10
+
11
+ interface UseLoopConsoleControllerOptions {
12
+ teamName: string;
13
+ sessionKey?: string | null;
14
+ onPendingReplyChange: (updater: (prev: Record<string, number>) => Record<string, number>) => void;
15
+ }
16
+
17
+ interface UseLoopConsoleControllerResult {
18
+ sending: boolean;
19
+ statusMessage: string | null;
20
+ submitIntent: (intent: LoopSendIntent) => Promise<boolean>;
21
+ }
22
+
23
+ function currentIso(): string {
24
+ return new Date().toISOString();
25
+ }
26
+
27
+ function buildOptimisticSystemMessage(text: string, to: string = 'user'): InboxMessage {
28
+ return {
29
+ from: 'system',
30
+ to,
31
+ text,
32
+ timestamp: currentIso(),
33
+ read: true,
34
+ messageId: `loop-console-${Date.now().toString(36)}`,
35
+ source: 'system_notification',
36
+ };
37
+ }
38
+
39
+ function normalizeSessionKey(sessionKey?: string | null): string | undefined {
40
+ return sessionKey && sessionKey !== '__unassigned__' ? sessionKey : undefined;
41
+ }
42
+
43
+ function formatWorkersList(workers: DiscoverableWorker[]): string {
44
+ if (!workers.length) return '当前没有可用数字员工。';
45
+ const lines = workers.map((worker) => {
46
+ const status = worker.status === 'online' ? 'online' : 'offline';
47
+ const workDir = worker.workDir ? ` · ${worker.workDir}` : '';
48
+ const harness = worker.harness ? ` · ${worker.harness}` : '';
49
+ const description = worker.description ? ` — ${worker.description}` : '';
50
+ return `- @${worker.workerId} ${worker.name} · ${status}${workDir}${harness}${description}`;
51
+ });
52
+ return [
53
+ '当前数字员工:',
54
+ ...lines,
55
+ '',
56
+ '在指令台输入 `@workerId 任务内容` 可直接调用对应员工。',
57
+ ].join('\n');
58
+ }
59
+
60
+ export function useLoopConsoleController({
61
+ teamName,
62
+ sessionKey,
63
+ onPendingReplyChange,
64
+ }: UseLoopConsoleControllerOptions): UseLoopConsoleControllerResult {
65
+ const [localSending, setLocalSending] = useState(false);
66
+ const [statusMessage, setStatusMessage] = useState<string | null>(null);
67
+ const { sendTeamMessage, addOptimisticTeamMessage, refreshTeamMessagesHead, sendingMessage } =
68
+ useStore(
69
+ useShallow((s) => ({
70
+ sendTeamMessage: s.sendTeamMessage,
71
+ addOptimisticTeamMessage: s.addOptimisticTeamMessage,
72
+ refreshTeamMessagesHead: s.refreshTeamMessagesHead,
73
+ sendingMessage: s.sendingMessage,
74
+ }))
75
+ );
76
+
77
+ const submitIntent = useCallback(
78
+ async (intent: LoopSendIntent): Promise<boolean> => {
79
+ const routedSessionKey = normalizeSessionKey(sessionKey);
80
+ setStatusMessage(null);
81
+
82
+ if (intent.kind === 'message') {
83
+ const sentAtMs = Date.now();
84
+ onPendingReplyChange((prev) => ({ ...prev, [intent.recipient]: sentAtMs }));
85
+ try {
86
+ const result = await sendTeamMessage(teamName, {
87
+ member: intent.recipient,
88
+ text: intent.text,
89
+ summary: intent.summary,
90
+ attachments: intent.attachments,
91
+ taskRefs: intent.taskRefs,
92
+ slashCommand: intent.slashCommand,
93
+ sessionKey: routedSessionKey,
94
+ });
95
+ if (
96
+ result.runtimeDelivery?.attempted === true &&
97
+ result.runtimeDelivery.delivered === false
98
+ ) {
99
+ onPendingReplyChange((prev) => {
100
+ if (prev[intent.recipient] !== sentAtMs) return prev;
101
+ const next = { ...prev };
102
+ delete next[intent.recipient];
103
+ return next;
104
+ });
105
+ }
106
+ return true;
107
+ } catch (error) {
108
+ onPendingReplyChange((prev) => {
109
+ if (prev[intent.recipient] !== sentAtMs) return prev;
110
+ const next = { ...prev };
111
+ delete next[intent.recipient];
112
+ return next;
113
+ });
114
+ setStatusMessage(error instanceof Error ? error.message : '指令发送失败');
115
+ return false;
116
+ }
117
+ }
118
+
119
+ if (intent.kind === 'workers-list') {
120
+ setLocalSending(true);
121
+ try {
122
+ const result = await api.workers.list();
123
+ addOptimisticTeamMessage(
124
+ teamName,
125
+ buildOptimisticSystemMessage(formatWorkersList(result.workers))
126
+ );
127
+ return true;
128
+ } catch (error) {
129
+ const message = error instanceof Error ? error.message : '获取数字员工列表失败';
130
+ setStatusMessage(message);
131
+ addOptimisticTeamMessage(teamName, buildOptimisticSystemMessage(message));
132
+ return false;
133
+ } finally {
134
+ setLocalSending(false);
135
+ }
136
+ }
137
+
138
+ if (intent.kind === 'cross-team-task') {
139
+ const now = Date.now();
140
+ const optimisticMessageId = `loop-cross-team-${now}`;
141
+ addOptimisticTeamMessage(teamName, {
142
+ from: 'user',
143
+ to: intent.toTeam,
144
+ text: `@${intent.toTeam} ${intent.subject}`,
145
+ timestamp: new Date(now).toISOString(),
146
+ read: true,
147
+ messageId: optimisticMessageId,
148
+ source: 'cross_team_sent',
149
+ session: routedSessionKey ? { key: routedSessionKey } : undefined,
150
+ });
151
+ if (teamName === SYSTEM_MANAGER_TEAM_NAME) {
152
+ try {
153
+ const result = await api.workers.invoke(intent.toTeam, {
154
+ fromTeam: teamName,
155
+ text: intent.subject,
156
+ summary: intent.summary,
157
+ sessionName: intent.toTeam,
158
+ reuse: true,
159
+ sessionKey: routedSessionKey,
160
+ });
161
+ const verb = result.reused ? '已复用' : '已创建';
162
+ addOptimisticTeamMessage(
163
+ teamName,
164
+ buildOptimisticSystemMessage(
165
+ `${verb} ${result.worker.name} 的 Loop 会话并直接下发指令,无需审批。`
166
+ )
167
+ );
168
+ await refreshTeamMessagesHead(teamName).catch(() => undefined);
169
+ return true;
170
+ } catch (error) {
171
+ const message = error instanceof Error ? error.message : '调用数字员工失败';
172
+ addOptimisticTeamMessage(
173
+ teamName,
174
+ buildOptimisticSystemMessage(`无法调用 ${intent.toTeam}:${message}`)
175
+ );
176
+ await refreshTeamMessagesHead(teamName).catch(() => undefined);
177
+ setStatusMessage(message);
178
+ return false;
179
+ }
180
+ }
181
+ try {
182
+ const result = await api.crossTeam.send({
183
+ fromTeam: teamName,
184
+ fromMember: 'user',
185
+ toTeam: intent.toTeam,
186
+ text: intent.text,
187
+ summary: intent.summary,
188
+ taskRefs: intent.taskRefs,
189
+ messageId: optimisticMessageId,
190
+ sessionKey: routedSessionKey,
191
+ });
192
+ if ('ok' in result && result.ok === false) {
193
+ const errorMessage =
194
+ 'error' in result && typeof result.error === 'string'
195
+ ? result.error
196
+ : '跨团队任务派发失败';
197
+ throw new Error(errorMessage);
198
+ }
199
+ window.dispatchEvent(new CustomEvent('collab:refresh'));
200
+ await refreshTeamMessagesHead(teamName);
201
+ return true;
202
+ } catch (error) {
203
+ const message = error instanceof Error ? error.message : '跨团队任务派发失败';
204
+ addOptimisticTeamMessage(
205
+ teamName,
206
+ buildOptimisticSystemMessage(`无法派发给 ${intent.toTeam}:${message}`)
207
+ );
208
+ await refreshTeamMessagesHead(teamName).catch(() => undefined);
209
+ setStatusMessage(message);
210
+ return false;
211
+ }
212
+ }
213
+
214
+ setLocalSending(true);
215
+ try {
216
+ if (intent.kind === 'runtime') {
217
+ await api.teams.processSend(teamName, intent.text);
218
+ addOptimisticTeamMessage(
219
+ teamName,
220
+ buildOptimisticSystemMessage(
221
+ `已注入 runtime(不写入消息看板):${intent.summary ?? intent.text}`
222
+ )
223
+ );
224
+ return true;
225
+ }
226
+
227
+ const response = await api.teams.createLoopSession(teamName, {
228
+ sessionName: intent.sessionName,
229
+ message: intent.text,
230
+ reuse: intent.reuse,
231
+ });
232
+ const verb = response.reused ? '已复用' : '已创建';
233
+ addOptimisticTeamMessage(
234
+ teamName,
235
+ buildOptimisticSystemMessage(
236
+ `${verb} Loop 会话「${response.session.title || response.session.sessionKey}」并下发初始指令。`,
237
+ 'cc'
238
+ )
239
+ );
240
+ await refreshTeamMessagesHead(teamName).catch(() => undefined);
241
+ return true;
242
+ } catch (error) {
243
+ const message = error instanceof Error ? error.message : 'Loop runtime 操作失败';
244
+ setStatusMessage(message);
245
+ addOptimisticTeamMessage(teamName, buildOptimisticSystemMessage(message));
246
+ return false;
247
+ } finally {
248
+ setLocalSending(false);
249
+ }
250
+ },
251
+ [
252
+ addOptimisticTeamMessage,
253
+ onPendingReplyChange,
254
+ refreshTeamMessagesHead,
255
+ sendTeamMessage,
256
+ sessionKey,
257
+ teamName,
258
+ ]
259
+ );
260
+
261
+ return {
262
+ sending: localSending || sendingMessage,
263
+ statusMessage,
264
+ submitIntent,
265
+ };
266
+ }
@@ -22,7 +22,7 @@ vi.mock('@renderer/components/team/dialogs/TeamModelSelector', () => ({
22
22
  getTeamProviderLabel: (providerId: string) => providerId,
23
23
  OPENCODE_TEAM_LEAD_DISABLED_BADGE_LABEL: '侧路',
24
24
  OPENCODE_TEAM_LEAD_DISABLED_REASON:
25
- '当前阶段 OpenCode 只能作为成员运行。请使用 Anthropic、Codex 或 Gemini 作为团队负责人,再把 OpenCode 添加为成员。',
25
+ '当前阶段 OpenCode 只能作为成员运行。请使用 Anthropic、Codex 或 Gemini 作为 Loop Lead,再把 OpenCode 添加为成员。',
26
26
  TeamModelSelector: () => React.createElement('div', null, 'team-model-selector'),
27
27
  }));
28
28
 
@@ -88,8 +88,10 @@ export const LeadModelRow = ({
88
88
  loading="lazy"
89
89
  />
90
90
  <div className="flex h-8 min-w-0 items-center gap-3">
91
- <span className="truncate text-sm font-medium text-[var(--color-text)]">负责人</span>
92
- <span className="shrink-0 text-xs text-[var(--color-text-secondary)]">团队负责人</span>
91
+ <span className="truncate text-sm font-medium text-[var(--color-text)]">Loop Lead</span>
92
+ <span className="shrink-0 text-xs text-[var(--color-text-secondary)]">
93
+ 运行时负责人
94
+ </span>
93
95
  </div>
94
96
  </div>
95
97
  </div>
@@ -173,7 +175,7 @@ export const LeadModelRow = ({
173
175
  <div className="flex items-start gap-2 rounded-md border border-sky-500/20 bg-sky-500/5 px-3 py-2">
174
176
  <Info className="mt-0.5 size-3.5 shrink-0 text-sky-400" />
175
177
  <p className="text-[11px] leading-relaxed text-sky-300">
176
- 这些设置控制团队负责人,并作为未单独覆盖设置的成员默认运行时。
178
+ 这些设置控制 Loop Lead,并作为未单独覆盖设置的成员默认运行时。
177
179
  </p>
178
180
  </div>
179
181
  </div>
@@ -126,6 +126,15 @@ export const MemberDetailDialog = ({
126
126
  error: statsError,
127
127
  } = useMemberStats(teamName, member?.name ?? null);
128
128
 
129
+ const memberActivityCount = useMemo(() => {
130
+ if (!member) return 0;
131
+ const authoredComments = tasks.reduce((count, task) => {
132
+ const comments = Array.isArray(task.comments) ? task.comments : [];
133
+ return count + comments.filter((comment) => comment.author === member.name).length;
134
+ }, 0);
135
+ return Math.max(member.messageCount ?? 0, authoredComments);
136
+ }, [member, tasks]);
137
+
129
138
  if (!member) return null;
130
139
 
131
140
  return (
@@ -156,7 +165,9 @@ export const MemberDetailDialog = ({
156
165
  stats={memberStats}
157
166
  statsLoading={statsLoading}
158
167
  statsError={statsError}
168
+ activityCount={memberActivityCount}
159
169
  />
170
+ <span className="sr-only">Activity{memberActivityCount}</span>
160
171
  </div>
161
172
 
162
173
  <DialogFooter>
@@ -6,6 +6,7 @@ interface MemberDetailStatsProps {
6
6
  stats: MemberFullStats | null;
7
7
  statsLoading?: boolean;
8
8
  statsError?: string | null;
9
+ activityCount?: number;
9
10
  }
10
11
 
11
12
  function formatDurationShort(ms: number): string {
@@ -22,8 +23,9 @@ function formatDurationShort(ms: number): string {
22
23
  export const MemberDetailStats = ({
23
24
  stats,
24
25
  statsLoading,
26
+ activityCount,
25
27
  }: MemberDetailStatsProps): React.JSX.Element => {
26
- const totalTokens = stats ? stats.inputTokens + stats.outputTokens : 0;
28
+ const totalTokens = stats?.totalTokens ?? 0;
27
29
 
28
30
  const items = [
29
31
  {
@@ -37,13 +39,21 @@ export const MemberDetailStats = ({
37
39
  },
38
40
  {
39
41
  label: 'Duration',
40
- value: statsLoading ? '...' : stats?.totalDurationMs ? formatDurationShort(stats.totalDurationMs) : '—',
42
+ value: statsLoading
43
+ ? '...'
44
+ : stats?.totalDurationMs
45
+ ? formatDurationShort(stats.totalDurationMs)
46
+ : '—',
41
47
  sub: !statsLoading && stats?.tasksCompleted ? `${stats.tasksCompleted} completed` : undefined,
42
48
  },
49
+ {
50
+ label: 'Activity',
51
+ value: String(activityCount ?? stats?.messageCount ?? 0),
52
+ },
43
53
  ];
44
54
 
45
55
  return (
46
- <div className="grid min-w-0 flex-1 grid-cols-3 gap-1.5">
56
+ <div className="grid min-w-0 flex-1 grid-cols-4 gap-1.5">
47
57
  {items.map((item) => (
48
58
  <div
49
59
  key={item.label}
@@ -158,7 +158,7 @@ describe('MemberDraftRow', () => {
158
158
  lockProviderModel: false,
159
159
  forceInheritedModelSettings: false,
160
160
  modelLockReason:
161
- '该成员当前与团队负责人模型保持同步。关闭同步后可单独设置提供商、模型或推理强度。',
161
+ '该成员当前与 Loop Lead 模型保持同步。关闭同步后可单独设置提供商、模型或推理强度。',
162
162
  });
163
163
 
164
164
  expect(host.textContent).not.toBeNull();
@@ -214,7 +214,7 @@ export const MemberDraftRow = ({
214
214
  const modelButtonAriaLabel = `${getTeamProviderLabel(effectiveProviderId)} 提供商,${modelButtonLabel}`;
215
215
  const canOpenLockedModelPanel = lockProviderModel && !isRemoved && Boolean(lockedModelAction);
216
216
  const modelTooltipText = forceInheritedModelSettings
217
- ? '同步开启时,提供商、模型和推理强度会继承团队负责人设置。'
217
+ ? '同步开启时,提供商、模型和推理强度会继承 Loop Lead 设置。'
218
218
  : lockProviderModel
219
219
  ? (lockedModelAction?.description ?? modelLockReason)
220
220
  : undefined;
@@ -32,7 +32,7 @@ interface MemberMessagesTabProps {
32
32
  const MAX_MESSAGES = 100;
33
33
  const FILTER_OPTIONS: readonly { value: MemberActivityFilter; label: string }[] = [
34
34
  { value: 'all', label: 'All' },
35
- { value: 'messages', label: 'Messages' },
35
+ { value: 'messages', label: 'Loop events' },
36
36
  { value: 'comments', label: 'Comments' },
37
37
  ];
38
38
 
@@ -227,7 +227,7 @@ export const MemberMessagesTab = ({
227
227
  disabled={loadingOlderMessages}
228
228
  onClick={() => void loadOlderMessages()}
229
229
  >
230
- Load older messages
230
+ Load older Loop events
231
231
  </Button>
232
232
  </div>
233
233
  )}
@@ -96,7 +96,7 @@ export const MemberStatsTab = ({
96
96
  );
97
97
  }
98
98
 
99
- const totalTokens = stats.inputTokens + stats.outputTokens;
99
+ const totalTokens = stats.totalTokens;
100
100
  const totalToolCalls = Object.values(stats.toolUsage).reduce((sum, c) => sum + c, 0);
101
101
 
102
102
  return (