@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,96 @@
1
+ /**
2
+ * MergingProfileStore —— 把「真实数字员工」与「社会层 overlay」在读取时合并的 WorkerProfileStore。
3
+ *
4
+ * 为什么需要它:society 成员的花名册来源必须是 hermit 的真实团队(GET /api/workers →
5
+ * listDiscoverableWorkers),而不是 profiles.json 里堆出的假数据。但社会层的能力 / 声誉 /
6
+ * 并发 / 兴趣属于「真实员工没有、社会层叠加」的属性,仍需持久化。因此本类在 *读取* 时把两者
7
+ * 合并:身份 / 在线态取真实员工,社会属性取 overlay(无则给默认)。
8
+ *
9
+ * 关键:合并点放在 store 层而非 service。WorkerSocietyService 有 ~10 处读 roster
10
+ * (discoverWorkers / volunteerFor.get / selectAssignee.list / runAutonomyTick.list /
11
+ * reward.get / cancelNeed.get …),只有把合并下沉到 store,所有读路径才能一致看到真实成员——
12
+ * 否则真实员工会在 volunteerFor 被判 worker_not_found。service 代码零改动(DRY,单一合并点)。
13
+ *
14
+ * 写(upsert / delete)只作用于 overlay:身份字段即便被写入也会在下次读取时被真实员工覆盖,
15
+ * 因此注册一个非真实 workerId 是不可见的无害操作(强制「成员 = 真实员工」语义)。
16
+ *
17
+ * 依赖注入:realWorkersProvider 由组合根(server.ts)注入 listDiscoverableWorkers,本层只用
18
+ * @shared/types/worker 的 TYPE 导入,不引入 @main 运行时依赖——society 保持独立可演进。
19
+ */
20
+ import type { DiscoverableWorker } from '@shared/types/worker';
21
+
22
+ import type { WorkerProfile } from '../../core/domain/models/society';
23
+ import { DEFAULT_REPUTATION, clampReputation } from '../../core/domain/policies/societyPolicies';
24
+ import type { WorkerProfileStore } from '../../core/application/ports';
25
+
26
+ /** 真实员工未配置 overlay 时的并发上限(保守默认;可由 overlay 覆盖)。 */
27
+ const DEFAULT_MAX_CONCURRENT = 2;
28
+
29
+ /**
30
+ * 把一个真实员工与(可选)overlay 合并成社会档案。纯函数、可单测。
31
+ *
32
+ * 身份 / 在线态 / 绑定目录恒取真实员工;overlay 仅决定社会属性,且都允许缺省:
33
+ * - capabilities:overlay 非空则用 overlay(人工策展),否则用真实员工被推断的能力
34
+ * (inferCapabilities → {skill:harness}+{skill:'general'},保证自治匹配可用);
35
+ * - reputation:夹取到 [0,100],默认 50;
36
+ * - maxConcurrent / interests / activeTaskCount:overlay 或默认。
37
+ *
38
+ * activeTaskCount 刻意不耦合真实团队任务系统——那是 society 自身的负载计数
39
+ * (select→+1 / accept·cancel→−1),跨层耦合会过度嵌套。
40
+ */
41
+ export function mergeRealWorker(real: DiscoverableWorker, overlay?: WorkerProfile): WorkerProfile {
42
+ return {
43
+ workerId: real.workerId,
44
+ name: real.name,
45
+ kind: real.kind,
46
+ harness: real.harness,
47
+ workDir: real.workDir,
48
+ // DiscoverableWorker.status 只有 online/offline;社会的 'busy' 不由真实态合成。
49
+ status: real.status === 'online' ? 'online' : 'offline',
50
+ description: real.description,
51
+ capabilities:
52
+ overlay && overlay.capabilities.length > 0 ? overlay.capabilities : (real.capabilities ?? []),
53
+ interests: overlay?.interests ?? [],
54
+ maxConcurrent: overlay?.maxConcurrent ?? DEFAULT_MAX_CONCURRENT,
55
+ activeTaskCount: overlay?.activeTaskCount ?? 0,
56
+ reputation: clampReputation(overlay?.reputation ?? DEFAULT_REPUTATION),
57
+ };
58
+ }
59
+
60
+ /**
61
+ * 装饰一个 overlay store:读取时合并真实员工,写入时只动 overlay。
62
+ * base 通常是 FsProfileStore(~/.hermit/society/profiles.json);realWorkersProvider 注入真实花名册。
63
+ */
64
+ export class MergingProfileStore implements WorkerProfileStore {
65
+ constructor(
66
+ private readonly base: WorkerProfileStore,
67
+ private readonly realWorkersProvider: () => Promise<DiscoverableWorker[]>
68
+ ) {}
69
+
70
+ async list(): Promise<WorkerProfile[]> {
71
+ // overlay 索引只读一次(FsProfileStore.list 读一次 profiles.json),N 个真实成员复用之,
72
+ // 而非逐个 base.get 触发 N 次整文件读取(动态规划:算一次,复用)。
73
+ const [real, overlays] = await Promise.all([this.realWorkersProvider(), this.base.list()]);
74
+ const overlayById = new Map(overlays.map((o) => [o.workerId, o]));
75
+ // overlay 中存在但真实员工已不存在的 workerId(旧假数据)自动丢弃——
76
+ // 花名册只反映真实成员,不残留 profiles.json 里的孤儿。
77
+ return real.map((r) => mergeRealWorker(r, overlayById.get(r.workerId)));
78
+ }
79
+
80
+ async get(workerId: string): Promise<WorkerProfile | undefined> {
81
+ const real = await this.realWorkersProvider();
82
+ const r = real.find((w) => w.workerId === workerId);
83
+ if (!r) return undefined; // 非真实员工:不可见(注册假 workerId 的写入因此被忽略)。
84
+ const overlay = await this.base.get(workerId);
85
+ return mergeRealWorker(r, overlay);
86
+ }
87
+
88
+ async upsert(profile: WorkerProfile): Promise<WorkerProfile> {
89
+ // 只写 overlay;身份字段下次读取时被真实员工覆盖。
90
+ return this.base.upsert(profile);
91
+ }
92
+
93
+ async delete(workerId: string): Promise<void> {
94
+ await this.base.delete?.(workerId);
95
+ }
96
+ }
@@ -0,0 +1,166 @@
1
+ /**
2
+ * SocietyGraph — mounts the reusable @claude-teams/agent-graph engine for the
3
+ * worker society, replacing the old hand-rolled SVG canvas.
4
+ *
5
+ * Same input contract as the former AgentCanvas (workers / active needs /
6
+ * relationships), but projected through projectSocietyGraph into the engine's
7
+ * GraphDataPort and rendered with its 1:1 cyan/space holographic theme
8
+ * (hexagon nodes, tapered glowing edges, flowing particles, bloom, hex grid +
9
+ * star field, zoom/pan). Worker nodes carry hermit's own participant-avatars
10
+ * (stable per workerId) so the society stays visually on-brand.
11
+ *
12
+ * A Fullscreen button (wired via onRequestFullscreen) pops the graph into a
13
+ * full-viewport overlay, so the graph is never cramped.
14
+ *
15
+ * Pure projection (projectSocietyGraph) is unit-tested separately; this file
16
+ * is a thin React mount with no logic of its own.
17
+ */
18
+ import { useCallback, useEffect, useMemo, useState } from 'react';
19
+ import { createPortal } from 'react-dom';
20
+
21
+ import { GraphView } from '@claude-teams/agent-graph';
22
+ import type { GraphViewProps } from '@claude-teams/agent-graph';
23
+ import { PARTICIPANT_AVATAR_URLS } from '@renderer/utils/memberAvatarCatalog';
24
+
25
+ import { projectSocietyGraph } from './societyGraphAdapter';
26
+ import { SocietyNodeLabels, type SocietyLabelNode } from './SocietyNodeLabels';
27
+ import { pickAvatarUrl } from './societyViewUtils';
28
+ import type { PublishedNeed, Relationship, WorkerProfile } from '../core/domain/models/society';
29
+
30
+ export interface SocietyGraphProps {
31
+ workers: WorkerProfile[];
32
+ /** Active needs (open/assigned/in_progress/delivered). */
33
+ needs: PublishedNeed[];
34
+ relationships: Relationship[];
35
+ /** Called when the user wants to bootstrap the empty society (add the first worker). */
36
+ onAddFirstWorker?: () => void;
37
+ /**
38
+ * 自定义节点弹卡渲染器(透传给引擎 GraphView.renderOverlay)。点开 worker/need 节点时
39
+ * 引擎以 {node, screenPos, onClose} 调用之;返回的卡片即「纯图谱」的唯一交互入口。
40
+ * 省略则用引擎内置 GraphOverlay。类型直接取自 GraphViewProps 以保证契约一致。
41
+ */
42
+ renderOverlay?: GraphViewProps['renderOverlay'];
43
+ }
44
+
45
+ const GRAPH_CONFIG = {
46
+ showHexGrid: true,
47
+ showStarField: true,
48
+ bloomIntensity: 0.6,
49
+ animationEnabled: true,
50
+ } as const;
51
+
52
+ export function SocietyGraph({
53
+ workers,
54
+ needs,
55
+ relationships,
56
+ onAddFirstWorker,
57
+ renderOverlay,
58
+ }: SocietyGraphProps): React.JSX.Element {
59
+ const [fullscreen, setFullscreen] = useState(false);
60
+
61
+ const graphData = useMemo(
62
+ () =>
63
+ projectSocietyGraph(
64
+ { workers, needs, relationships },
65
+ { resolveAvatarUrl: (id) => pickAvatarUrl(id, PARTICIPANT_AVATAR_URLS) }
66
+ ),
67
+ [workers, needs, relationships]
68
+ );
69
+
70
+ // 引擎 canvas 标签字号固定、在 fit 缩放下对人类不可读 → 改用 HTML 标签层渲染。
71
+ // 给引擎喂 label='' 抑制 canvas 文本;HTML 层(SocietyNodeLabels)用同一份 graphData
72
+ // 的标签复用引擎 getNodeWorldPosition/worldToScreen 定位(不重算坐标)。两份视图同源。
73
+ const engineData = useMemo(
74
+ () => ({ ...graphData, nodes: graphData.nodes.map((n) => ({ ...n, label: '' })) }),
75
+ [graphData]
76
+ );
77
+ const labelNodes = useMemo<SocietyLabelNode[]>(
78
+ () => graphData.nodes.map((n) => ({ id: n.id, label: n.label, kind: n.kind, state: n.state })),
79
+ [graphData]
80
+ );
81
+ const renderHud = useCallback<NonNullable<GraphViewProps['renderHud']>>(
82
+ (hud) => (
83
+ <SocietyNodeLabels
84
+ nodes={labelNodes}
85
+ getNodeWorldPosition={hud.getNodeWorldPosition}
86
+ worldToScreen={hud.worldToScreen}
87
+ getViewportSize={hud.getViewportSize}
88
+ focusNodeIds={hud.focusNodeIds}
89
+ />
90
+ ),
91
+ [labelNodes]
92
+ );
93
+
94
+ // An empty society (no agora hub, nothing to render) shows a guiding overlay
95
+ // instead of a bare starfield void, so a first-run user is never stranded.
96
+ const isEmpty = graphData.nodes.length === 0;
97
+
98
+ // Lock background scroll while the fullscreen overlay is open.
99
+ useEffect(() => {
100
+ if (!fullscreen) return;
101
+ const prev = document.body.style.overflow;
102
+ document.body.style.overflow = 'hidden';
103
+ return () => {
104
+ document.body.style.overflow = prev;
105
+ };
106
+ }, [fullscreen]);
107
+
108
+ return (
109
+ <>
110
+ <div
111
+ className="relative min-h-0 min-w-0 flex-1 overflow-hidden rounded-lg border border-[var(--color-border)]"
112
+ style={{ background: '#050510' }}
113
+ >
114
+ {fullscreen ? null : (
115
+ <GraphView
116
+ data={engineData}
117
+ className="society-graph-view size-full"
118
+ isSurfaceActive
119
+ onRequestFullscreen={() => setFullscreen(true)}
120
+ config={GRAPH_CONFIG}
121
+ renderOverlay={renderOverlay}
122
+ renderHud={renderHud}
123
+ />
124
+ )}
125
+
126
+ {isEmpty && !fullscreen && (
127
+ <div className="pointer-events-none absolute inset-0 flex items-center justify-center">
128
+ <div className="bg-[var(--color-surface-raised)]/95 pointer-events-auto mx-4 max-w-xs rounded-lg border border-[var(--color-border)] p-4 text-center">
129
+ <p className="text-sm font-semibold opacity-80">社会尚未启动</p>
130
+ <p className="mt-1 text-xs leading-relaxed opacity-60">
131
+ 还没有成员与需求。添加第一个 worker,或触发自治让真实团队流入广场。
132
+ </p>
133
+ <div className="mt-3 flex items-center justify-center gap-2">
134
+ {onAddFirstWorker ? (
135
+ <button
136
+ onClick={onAddFirstWorker}
137
+ className="rounded-md bg-[var(--color-text)] px-3 py-1 text-xs text-[var(--color-surface)] hover:opacity-90"
138
+ >
139
+ 去添加成员 →
140
+ </button>
141
+ ) : null}
142
+ </div>
143
+ </div>
144
+ </div>
145
+ )}
146
+ </div>
147
+
148
+ {fullscreen
149
+ ? createPortal(
150
+ <div className="fixed inset-0 z-[1000]" style={{ background: '#050510' }}>
151
+ <GraphView
152
+ data={engineData}
153
+ className="society-graph-view size-full"
154
+ isSurfaceActive
155
+ onRequestClose={() => setFullscreen(false)}
156
+ config={GRAPH_CONFIG}
157
+ renderOverlay={renderOverlay}
158
+ renderHud={renderHud}
159
+ />
160
+ </div>,
161
+ document.body
162
+ )
163
+ : null}
164
+ </>
165
+ );
166
+ }
@@ -0,0 +1,139 @@
1
+ /**
2
+ * SocietyNodeLabels — 常驻可读的 HTML 节点标签层,叠在 society 图谱 canvas 之上。
3
+ *
4
+ * 为什么需要它:引擎(packages/agent-graph)把节点标签画在 <canvas> 上,字号固定且在
5
+ * fit 缩放下对人类不可读(「纯图谱」若读不出谁是谁即失能)。SocietyGraph 因此抑制掉
6
+ * canvas 标签、改由本层用可读 HTML 渲染。定位完全复用引擎自己的 getNodeWorldPosition
7
+ * + worldToScreen(不重复算节点坐标 = 动态规划、复用而非重写)。
8
+ *
9
+ * 单个 requestAnimationFrame 循环每帧重定位 chip,使标签跟随相机平移/缩放与 d3-force
10
+ * 模拟。pointer-events-none 让点击穿透回 canvas 节点(选中弹卡链路不变)。超出视口的
11
+ * chip 隐藏(性能 + 不遮挡)。
12
+ */
13
+ import { useEffect, useRef } from 'react';
14
+
15
+ import type { GraphNode, GraphNodeState } from '@claude-teams/agent-graph';
16
+
17
+ export interface SocietyLabelNode {
18
+ id: string;
19
+ label: string;
20
+ kind: GraphNode['kind'];
21
+ state: GraphNodeState;
22
+ }
23
+
24
+ export interface SocietyNodeLabelsProps {
25
+ nodes: SocietyLabelNode[];
26
+ getNodeWorldPosition: (nodeId: string) => { x: number; y: number } | null;
27
+ worldToScreen: (x: number, y: number) => { x: number; y: number };
28
+ getViewportSize: () => { width: number; height: number };
29
+ /**
30
+ * 引擎焦点集合(选中某节点时 = 该节点 + 其邻接任务/关系成员)。提供时,焦点内标签全亮、
31
+ * 其余压低,让被选簇独占注意力;为 null(未选中)时走分层 ambient(见 OPACITY)。复用引擎
32
+ * 算好的焦点,不在此处重算邻接(动态规划、复用而非重写)。
33
+ */
34
+ focusNodeIds?: ReadonlySet<string> | null;
35
+ }
36
+
37
+ /** chip 落在节点图标正下方(对齐引擎 canvas 标签槽位)。 */
38
+ const LABEL_OFFSET_Y = 24;
39
+
40
+ /**
41
+ * 按 kind/state 给标签上色(worker 青、task 按生命周期)。只给文本上色,不再加描边——
42
+ * 去掉每个节点上的硬边框盒,缓解「满图突兀标签」的拥挤感(底色 + 投影保证可读,见下方 className/style)。
43
+ */
44
+ function chipClass(kind: GraphNode['kind'], state: GraphNodeState): string {
45
+ if (kind === 'lead') return 'text-[#9fd8ff]';
46
+ if (kind === 'task') {
47
+ if (state === 'active') return 'text-[#9eeaad]'; // in_progress
48
+ if (state === 'complete') return 'text-[#c4a7fa]'; // delivered
49
+ return 'text-[#f5d68a]'; // waiting(open/assigned)
50
+ }
51
+ return 'text-[#c9d8ff]'; // member(worker)
52
+ }
53
+
54
+ /**
55
+ * 标签不透明度分层 —— 解决「满图字符串、没有重点」:把视觉重量交给节点本身(发光六边形 /
56
+ * 头像 / 边),文字标签按重要性退到背景,选中时整簇高亮。
57
+ * - lead(广场):恒亮,作为唯一视觉锚点。
58
+ * - 进行中(state==='active'):第二焦点,半亮。
59
+ * - 其余(idle / waiting / complete):ambient,在场但不抢戏。
60
+ * focusNodeIds 非空(选中某节点)时,焦点内全亮、其余压到 dimmed,让被选簇独占注意力。
61
+ */
62
+ const OPACITY = {
63
+ lead: 1,
64
+ active: 0.82,
65
+ ambient: 0.34,
66
+ dimmed: 0.2,
67
+ } as const;
68
+
69
+ function labelOpacity(node: SocietyLabelNode, focus: ReadonlySet<string> | null): number {
70
+ if (focus) return focus.has(node.id) ? 1 : OPACITY.dimmed;
71
+ if (node.kind === 'lead') return OPACITY.lead;
72
+ if (node.state === 'active') return OPACITY.active;
73
+ return OPACITY.ambient;
74
+ }
75
+
76
+ export function SocietyNodeLabels({
77
+ nodes,
78
+ getNodeWorldPosition,
79
+ worldToScreen,
80
+ getViewportSize,
81
+ focusNodeIds,
82
+ }: SocietyNodeLabelsProps): React.JSX.Element {
83
+ // nodeId → chip DOM,单 RAF 批量更新 transform,避免每帧 React 重渲染。
84
+ const chipRefs = useRef<Map<string, HTMLSpanElement>>(new Map());
85
+ // 焦点集合随渲染更新到 ref,RAF 直接读最新值——选中切换不必重启循环。
86
+ const focusRef = useRef<ReadonlySet<string> | null>(null);
87
+ focusRef.current = focusNodeIds ?? null;
88
+
89
+ useEffect(() => {
90
+ let raf = 0;
91
+ const tick = (): void => {
92
+ const vp = getViewportSize();
93
+ const map = chipRefs.current;
94
+ for (const node of nodes) {
95
+ const el = map.get(node.id);
96
+ if (!el) continue;
97
+ const world = getNodeWorldPosition(node.id);
98
+ if (!world) {
99
+ el.style.visibility = 'hidden';
100
+ continue;
101
+ }
102
+ const s = worldToScreen(world.x, world.y);
103
+ const offX = s.x < -100 || s.x > vp.width + 100;
104
+ const offY = s.y < -20 || s.y > vp.height + 60;
105
+ if (offX || offY) {
106
+ el.style.visibility = 'hidden';
107
+ } else {
108
+ el.style.visibility = 'visible';
109
+ el.style.opacity = String(labelOpacity(node, focusRef.current));
110
+ el.style.transform = `translate(-50%, 0) translate(${s.x}px, ${s.y + LABEL_OFFSET_Y}px)`;
111
+ }
112
+ }
113
+ raf = requestAnimationFrame(tick);
114
+ };
115
+ raf = requestAnimationFrame(tick);
116
+ return () => cancelAnimationFrame(raf);
117
+ }, [nodes, getNodeWorldPosition, worldToScreen, getViewportSize]);
118
+
119
+ return (
120
+ <>
121
+ {nodes.map((node) => (
122
+ <span
123
+ key={node.id}
124
+ ref={(el) => {
125
+ if (el) chipRefs.current.set(node.id, el);
126
+ else chipRefs.current.delete(node.id);
127
+ }}
128
+ className={`pointer-events-none absolute left-0 top-0 max-w-[150px] truncate rounded bg-[rgba(5,5,16,0.5)] px-1.5 py-0.5 text-[11px] font-medium leading-tight ${chipClass(
129
+ node.kind,
130
+ node.state
131
+ )}`}
132
+ style={{ visibility: 'hidden', textShadow: '0 1px 3px rgba(0,0,0,0.9)' }}
133
+ >
134
+ {node.label}
135
+ </span>
136
+ ))}
137
+ </>
138
+ );
139
+ }