@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,104 @@
1
+ /**
2
+ * teamSessionListMapper — mergeLocalAndCcSessions invariant tests.
3
+ *
4
+ * Regression guard for #20: a cc-only session (e.g. a Feishu listening
5
+ * session that has no local Claude JSONL yet) is listed so the user can see
6
+ * it is listening, but expanding it must NOT try to read a local detail file
7
+ * (which 404s and surfaces the misleading "会话文件已不存在"). The merged
8
+ * CcSession must therefore tag whether each entry is backed by a local file
9
+ * via `hasLocalFile`.
10
+ */
11
+ import { describe, expect, it } from 'vitest';
12
+
13
+ import type { CcSessionListItem } from '@shared/types/ccConnect';
14
+
15
+ import type { LocalSessionSummary } from '../LocalSessionScanner';
16
+ import { mergeLocalAndCcSessions } from '../teamSessionListMapper';
17
+
18
+ const PROJECT = 'team-x';
19
+
20
+ function localSummary(id: string): LocalSessionSummary {
21
+ return {
22
+ id,
23
+ title: id,
24
+ projectId: PROJECT,
25
+ messageCount: 3,
26
+ userMessageCount: 1,
27
+ assistantMessageCount: 2,
28
+ inputTokens: 10,
29
+ outputTokens: 20,
30
+ cacheReadTokens: 0,
31
+ cacheCreationTokens: 0,
32
+ totalTokens: 30,
33
+ model: 'claude-sonnet',
34
+ active: false,
35
+ live: false,
36
+ startTime: null,
37
+ endTime: null,
38
+ createdAt: '2026-06-14T10:00:00Z',
39
+ updatedAt: '2026-06-14T10:00:00Z',
40
+ };
41
+ }
42
+
43
+ function ccItem(id: string, platform = 'feishu'): CcSessionListItem {
44
+ return {
45
+ id,
46
+ name: id,
47
+ session_key: id,
48
+ agent_session_id: id,
49
+ agent_type: 'claude-code' as CcSessionListItem['agent_type'],
50
+ active: true,
51
+ live: true,
52
+ history_count: 0,
53
+ created_at: '2026-06-14T10:00:00Z',
54
+ updated_at: '2026-06-14T10:00:00Z',
55
+ last_message: null,
56
+ platform,
57
+ };
58
+ }
59
+
60
+ describe('mergeLocalAndCcSessions — hasLocalFile flag (#20)', () => {
61
+ it('tags a cc-only session (no local JSONL) as hasLocalFile=false', () => {
62
+ // A Feishu listening session reported by cc-connect but with no local
63
+ // Claude JSONL yet. Expanding it must not attempt a local detail read.
64
+ const merged = mergeLocalAndCcSessions([], [ccItem('oc_feishu_only')], PROJECT);
65
+
66
+ const feishu = merged.find((s) => s.id === 'oc_feishu_only');
67
+ expect(feishu, 'cc-only session present in merged list').toBeDefined();
68
+ expect(feishu?.hasLocalFile).toBe(false);
69
+ });
70
+
71
+ it('tags a local session (JSONL-backed) as hasLocalFile=true', () => {
72
+ const merged = mergeLocalAndCcSessions([localSummary('local-1')], [], PROJECT);
73
+
74
+ const local = merged.find((s) => s.id === 'local-1');
75
+ expect(local, 'local session present in merged list').toBeDefined();
76
+ expect(local?.hasLocalFile).toBe(true);
77
+ });
78
+
79
+ it('tags a session backed by BOTH a local file and cc-connect as hasLocalFile=true', () => {
80
+ // Same agent_session_id appears in the local scan AND cc-connect: the
81
+ // local JSONL is authoritative, detail reads from it.
82
+ const sharedId = 'shared-1';
83
+ const merged = mergeLocalAndCcSessions([localSummary(sharedId)], [ccItem(sharedId)], PROJECT);
84
+
85
+ const shared = merged.find((s) => s.id === sharedId);
86
+ expect(shared, 'shared session appears once').toBeDefined();
87
+ expect(merged.filter((s) => s.id === sharedId)).toHaveLength(1);
88
+ expect(shared?.hasLocalFile).toBe(true);
89
+ });
90
+
91
+ it('flags each entry correctly in a mixed list', () => {
92
+ const merged = mergeLocalAndCcSessions(
93
+ [localSummary('local-a'), localSummary('shared-b')],
94
+ [ccItem('shared-b'), ccItem('feishu-c'), ccItem('feishu-d')],
95
+ PROJECT
96
+ );
97
+
98
+ const byId = new Map(merged.map((s) => [s.id, s.hasLocalFile]));
99
+ expect(byId.get('local-a')).toBe(true);
100
+ expect(byId.get('shared-b')).toBe(true);
101
+ expect(byId.get('feishu-c')).toBe(false);
102
+ expect(byId.get('feishu-d')).toBe(false);
103
+ });
104
+ });
@@ -0,0 +1,78 @@
1
+ import type { LocalSessionSummary } from './LocalSessionScanner';
2
+ import type { CcSessionListItem } from '@shared/types/ccConnect';
3
+ import type { CcSession } from '@shared/types/api';
4
+
5
+ function toLastMessage(session: CcSessionListItem): CcSession['lastMessage'] {
6
+ return session.last_message
7
+ ? {
8
+ role: session.last_message.role,
9
+ content: session.last_message.content,
10
+ timestamp: session.last_message.timestamp,
11
+ }
12
+ : null;
13
+ }
14
+
15
+ function timestampMs(value: string): number {
16
+ const parsed = Date.parse(value);
17
+ return Number.isFinite(parsed) ? parsed : 0;
18
+ }
19
+
20
+ function mapCcOnlySession(session: CcSessionListItem, projectId: string): CcSession {
21
+ return {
22
+ id: session.agent_session_id || session.id,
23
+ title: session.name || session.session_key,
24
+ projectId,
25
+ sessionKey: session.session_key,
26
+ platform: session.platform,
27
+ userName: session.user_name ?? null,
28
+ chatName: session.chat_name ?? null,
29
+ active: session.active,
30
+ live: session.live,
31
+ historyCount: session.history_count,
32
+ createdAt: session.created_at,
33
+ updatedAt: session.updated_at,
34
+ lastMessage: toLastMessage(session),
35
+ hasLocalFile: false,
36
+ };
37
+ }
38
+
39
+ export function mergeLocalAndCcSessions(
40
+ localSessions: LocalSessionSummary[],
41
+ ccSessions: CcSessionListItem[],
42
+ projectId: string
43
+ ): CcSession[] {
44
+ const localSessionIds = new Set(localSessions.map((session) => session.id));
45
+ const ccByLocalSessionId = new Map(
46
+ ccSessions
47
+ .map((session) => [session.agent_session_id || session.id, session] as const)
48
+ .filter(([localSessionId]) => localSessionIds.has(localSessionId))
49
+ );
50
+
51
+ const localResults = localSessions.map((session): CcSession => {
52
+ const ccMeta = ccByLocalSessionId.get(session.id);
53
+ return {
54
+ id: session.id,
55
+ title: session.title || session.id,
56
+ projectId,
57
+ sessionKey: ccMeta?.session_key ?? session.id,
58
+ platform: ccMeta?.platform ?? 'local',
59
+ userName: ccMeta?.user_name ?? null,
60
+ chatName: ccMeta?.chat_name ?? null,
61
+ active: session.active,
62
+ live: session.live,
63
+ historyCount: session.messageCount,
64
+ createdAt: session.createdAt,
65
+ updatedAt: session.updatedAt,
66
+ lastMessage: ccMeta ? toLastMessage(ccMeta) : null,
67
+ hasLocalFile: true,
68
+ };
69
+ });
70
+
71
+ const ccOnlyResults = ccSessions
72
+ .filter((session) => !localSessionIds.has(session.agent_session_id || session.id))
73
+ .map((session) => mapCcOnlySession(session, projectId));
74
+
75
+ return [...localResults, ...ccOnlyResults].sort(
76
+ (a, b) => timestampMs(b.updatedAt) - timestampMs(a.updatedAt)
77
+ );
78
+ }
@@ -0,0 +1,95 @@
1
+ import type { SystemManagerConfig, SystemManagerConfigPatch } from '@shared/types/systemManager';
2
+
3
+ /**
4
+ * Helm Loop bootstrap.
5
+ *
6
+ * On first open of the admin console, the GitHub Pages ops guide is fetched and
7
+ * fed to the admin lead session as its first turn, so the agent can seed its own
8
+ * CLAUDE.md from the manual. After a successful feed the `adminInitialized`
9
+ * marker is set so it never repeats.
10
+ *
11
+ * Extracted from server.ts as a pure, dependency-injected unit so the
12
+ * idempotency and failure semantics are unit-testable without spawning the
13
+ * direct-CLI runtime or hitting the network.
14
+ */
15
+
16
+ /** Deterministic id for the bootstrap message (one-shot, never reused). */
17
+ export const ADMIN_INIT_MESSAGE_ID = 'helm-loop-init';
18
+
19
+ /** Lightweight HTML → plain text: strip script/style, drop tags, decode entities, collapse whitespace. */
20
+ export function htmlToPlainText(html: string): string {
21
+ return html
22
+ .replace(/<script[\s\S]*?<\/script>/gi, ' ')
23
+ .replace(/<style[\s\S]*?<\/style>/gi, ' ')
24
+ .replace(/<!--[\s\S]*?-->/g, ' ')
25
+ .replace(/<\/(p|div|li|h[1-6]|tr|br)>/gi, '\n')
26
+ .replace(/<[^>]+>/g, ' ')
27
+ .replace(/&nbsp;/gi, ' ')
28
+ .replace(/&amp;/gi, '&')
29
+ .replace(/&lt;/gi, '<')
30
+ .replace(/&gt;/gi, '>')
31
+ .replace(/&quot;/gi, '"')
32
+ .replace(/&#39;/gi, "'")
33
+ .replace(/[ \t\f\v]+/g, ' ')
34
+ .replace(/\s*\n\s*/g, '\n')
35
+ .replace(/\n{3,}/g, '\n\n')
36
+ .trim();
37
+ }
38
+
39
+ /** Build the bootstrap prompt wrapping the guide text. Pure — tested directly. */
40
+ export function buildAdminInitMessage(guideText: string): string {
41
+ return [
42
+ '【Helm Loop 初始化】以下是 Hermit 运维手册全文。请通读并据此在你的工作目录初始化 CLAUDE.md,',
43
+ '建立对团队治理、消息路由、Loop 工作流的整体认知。',
44
+ '随后可用 `/workers` 查看所有数字员工及其工作路径,用 `@workerId` 直接调度对应员工。',
45
+ '',
46
+ '--- 运维手册 ---',
47
+ guideText,
48
+ ].join('\n');
49
+ }
50
+
51
+ export interface AdminLoopInitDeps {
52
+ getConfig: () => Promise<SystemManagerConfig>;
53
+ updateConfig: (patch: SystemManagerConfigPatch) => Promise<SystemManagerConfig>;
54
+ /** Fetch the ops guide. Resolves with statusCode + raw body; rejects on network error. */
55
+ fetchGuide: () => Promise<{ statusCode: number; body: string }>;
56
+ /** Deliver the bootstrap message to the admin lead session. */
57
+ dispatch: (message: { text: string; messageId: string }) => Promise<void>;
58
+ /** Optional diagnostic sink (warnings only). */
59
+ log?: (message: string) => void;
60
+ }
61
+
62
+ /**
63
+ * Run the one-shot bootstrap if it hasn't run yet.
64
+ *
65
+ * - Idempotent: returns immediately when `adminInitialized` is already set —
66
+ * does NOT fetch or dispatch.
67
+ * - Failure-tolerant: a network error, non-2xx status, or empty body returns
68
+ * WITHOUT setting the marker, so the next console open retries. Only a
69
+ * successful fetch + dispatch sets the flag.
70
+ */
71
+ export async function ensureAdminLoopInitialized(deps: AdminLoopInitDeps): Promise<void> {
72
+ const config = await deps.getConfig();
73
+ if (config.adminInitialized) return;
74
+
75
+ let body = '';
76
+ try {
77
+ const res = await deps.fetchGuide();
78
+ if (res.statusCode >= 200 && res.statusCode < 300) {
79
+ body = htmlToPlainText(res.body);
80
+ }
81
+ } catch (err) {
82
+ deps.log?.(
83
+ `helm loop init: fetch failed (${err instanceof Error ? err.message : String(err)})`
84
+ );
85
+ return;
86
+ }
87
+
88
+ if (!body.trim()) {
89
+ deps.log?.('helm loop init: empty guide body, will retry next open');
90
+ return;
91
+ }
92
+
93
+ await deps.dispatch({ text: buildAdminInitMessage(body), messageId: ADMIN_INIT_MESSAGE_ID });
94
+ await deps.updateConfig({ adminInitialized: true });
95
+ }