@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,118 @@
1
+ export type CapabilityScope = 'admin-loop' | 'team-loop' | 'kanban-card' | 'task-detail';
2
+
3
+ export type CapabilitySafety = 'read-only' | 'reporting' | 'proposal-only' | 'write' | 'audit';
4
+
5
+ export type CapabilityCommandSurface = 'slash' | 'quick-run';
6
+
7
+ export type CapabilityCommandExecutionType = 'send-message' | 'loop-session';
8
+
9
+ export interface CapabilityCommandExecution {
10
+ type: CapabilityCommandExecutionType;
11
+ reuse?: boolean;
12
+ }
13
+
14
+ export interface CapabilityCommand {
15
+ id: string;
16
+ alias: string;
17
+ title: string;
18
+ description?: string;
19
+ scope: CapabilityScope[];
20
+ surfaces: CapabilityCommandSurface[];
21
+ safety: CapabilitySafety;
22
+ prompt: string;
23
+ usesSkills?: string[];
24
+ workflow?: string | null;
25
+ order?: number;
26
+ execution?: CapabilityCommandExecution;
27
+ }
28
+
29
+ export interface CapabilitySkill {
30
+ id: string;
31
+ name: string;
32
+ description?: string;
33
+ path: string;
34
+ }
35
+
36
+ export interface CapabilityWorkflow {
37
+ id: string;
38
+ name: string;
39
+ description?: string;
40
+ path: string;
41
+ }
42
+
43
+ export interface CapabilityPackManifest {
44
+ schemaVersion: 1;
45
+ id: string;
46
+ name: string;
47
+ namespace: string;
48
+ version: string;
49
+ author?: string;
50
+ description?: string;
51
+ capabilities: {
52
+ commands?: CapabilityCommand[];
53
+ skills?: CapabilitySkill[];
54
+ workflows?: CapabilityWorkflow[];
55
+ };
56
+ }
57
+
58
+ export type CapabilityPackSource = 'builtin' | 'user' | 'project';
59
+
60
+ export interface LoadedCapabilityPack {
61
+ manifest: CapabilityPackManifest;
62
+ packDir: string;
63
+ source: CapabilityPackSource;
64
+ enabled: boolean;
65
+ warnings: string[];
66
+ }
67
+
68
+ export interface CapabilityPackListResult {
69
+ packs: LoadedCapabilityPack[];
70
+ warnings: string[];
71
+ rootDir: string;
72
+ }
73
+
74
+ export interface CapabilityPackImportRequest {
75
+ sourceDir: string;
76
+ overwrite?: boolean;
77
+ }
78
+
79
+ export interface CapabilityPackExportRequest {
80
+ packId: string;
81
+ destinationDir: string;
82
+ overwrite?: boolean;
83
+ }
84
+
85
+ export interface CapabilityPackMutationResult {
86
+ pack: LoadedCapabilityPack | null;
87
+ warnings: string[];
88
+ }
89
+
90
+ export interface CapabilityCommandPromptRequest {
91
+ canonicalId: string;
92
+ scope?: CapabilityScope;
93
+ }
94
+
95
+ export interface CapabilityCommandPromptResult {
96
+ command: RegisteredSlashCommand;
97
+ prompt: string;
98
+ }
99
+
100
+ export type SlashCommandSource = 'builtin' | 'project' | 'pack' | 'official';
101
+
102
+ export interface RegisteredSlashCommand {
103
+ canonicalId: string;
104
+ alias: string;
105
+ namespace: string;
106
+ slash: `/${string}`;
107
+ namespacedSlash: `/${string}:${string}`;
108
+ source: SlashCommandSource;
109
+ packId?: string;
110
+ command: CapabilityCommand;
111
+ conflictsWith?: string[];
112
+ }
113
+
114
+ export interface SlashCommandResolveResult {
115
+ status: 'not-found' | 'resolved' | 'conflict';
116
+ command?: RegisteredSlashCommand;
117
+ candidates?: RegisteredSlashCommand[];
118
+ }
@@ -2,13 +2,41 @@
2
2
  * Extension Store types — barrel export.
3
3
  */
4
4
 
5
- export type { ApiKeysAPI, McpCatalogAPI, PluginCatalogAPI, SkillsCatalogAPI } from './api';
5
+ export type {
6
+ ApiKeysAPI,
7
+ CapabilityPacksAPI,
8
+ McpCatalogAPI,
9
+ PluginCatalogAPI,
10
+ SkillsCatalogAPI,
11
+ } from './api';
6
12
  export type {
7
13
  ApiKeyEntry,
8
14
  ApiKeyLookupResult,
9
15
  ApiKeySaveRequest,
10
16
  ApiKeyStorageStatus,
11
17
  } from './apikey';
18
+ export type {
19
+ CapabilityCommand,
20
+ CapabilityCommandExecution,
21
+ CapabilityCommandExecutionType,
22
+ CapabilityCommandSurface,
23
+ CapabilityPackImportRequest,
24
+ CapabilityPackExportRequest,
25
+ CapabilityPackListResult,
26
+ CapabilityPackManifest,
27
+ CapabilityPackMutationResult,
28
+ CapabilityPackSource,
29
+ CapabilityCommandPromptRequest,
30
+ CapabilityCommandPromptResult,
31
+ CapabilitySafety,
32
+ CapabilityScope,
33
+ CapabilitySkill,
34
+ CapabilityWorkflow,
35
+ LoadedCapabilityPack,
36
+ RegisteredSlashCommand,
37
+ SlashCommandResolveResult,
38
+ SlashCommandSource,
39
+ } from './capabilityPack';
12
40
  export type { ExtensionOperationState, InstallScope, OperationResult } from './common';
13
41
  export type {
14
42
  InstalledMcpEntry,
@@ -44,6 +44,12 @@ export type * from './terminal';
44
44
  // Re-export System Manager types
45
45
  export type * from './systemManager';
46
46
 
47
+ // Re-export Worker types
48
+ export type * from './worker';
49
+
50
+ // Re-export Loop Assets types
51
+ export type * from './loopAssets';
52
+
47
53
  // Re-export Editor types
48
54
  export type * from './editor';
49
55
 
@@ -0,0 +1,54 @@
1
+ export type LoopAssetCategoryKey = 'automations' | 'worktrees' | 'skills' | 'subagents' | 'state';
2
+
3
+ export type LoopAssetStatus = 'ready' | 'partial' | 'missing' | 'warning';
4
+
5
+ export type LoopAssetLifecycle = 'ready' | 'active' | 'missing-assets' | 'stale' | 'unknown';
6
+
7
+ export interface LoopAssetAction {
8
+ id: string;
9
+ label: string;
10
+ kind:
11
+ | 'navigate'
12
+ | 'open-dialog'
13
+ | 'open-file'
14
+ | 'run-workflow'
15
+ | 'copy-command'
16
+ | 'loop-session'
17
+ | 'run-command';
18
+ target?: string;
19
+ payload?: Record<string, unknown>;
20
+ disabled?: boolean;
21
+ tooltip?: string;
22
+ }
23
+
24
+ export interface LoopAssetSourceRef {
25
+ label: string;
26
+ path?: string;
27
+ scope: 'project' | 'team' | 'user' | 'system' | 'external';
28
+ kind?: string;
29
+ }
30
+
31
+ export interface LoopAssetCategorySnapshot {
32
+ key: LoopAssetCategoryKey;
33
+ title: string;
34
+ subtitle: string;
35
+ status: LoopAssetStatus;
36
+ count: number;
37
+ details: string[];
38
+ gap: string;
39
+ sources: LoopAssetSourceRef[];
40
+ actions: LoopAssetAction[];
41
+ warnings?: string[];
42
+ }
43
+
44
+ export interface LoopAssetsSnapshot {
45
+ teamName: string;
46
+ displayName?: string;
47
+ bindProject?: string;
48
+ workDir: string;
49
+ lifecycle: LoopAssetLifecycle;
50
+ healthScore: number;
51
+ scannedAt: string;
52
+ categories: LoopAssetCategorySnapshot[];
53
+ warnings?: string[];
54
+ }
@@ -98,19 +98,3 @@ export interface ProviderPresetsResponse {
98
98
  updated_at?: string;
99
99
  providers: ProviderPreset[];
100
100
  }
101
-
102
- /** Result of reading from cc-switch SQLite DB. */
103
- export interface CCSwitchProvider {
104
- name: string;
105
- app_type: string;
106
- api_key?: string;
107
- base_url?: string;
108
- model?: string;
109
- is_current: boolean;
110
- }
111
-
112
- export interface CCSwitchListResponse {
113
- providers: CCSwitchProvider[];
114
- available: boolean;
115
- error?: string;
116
- }
@@ -1,8 +1,11 @@
1
1
  export interface SystemManagerStatus {
2
- displayName: '控制台';
2
+ displayName: 'Helm Loop';
3
+ /** Canonical, isolated runtime path for the admin loop (~/.hermit/admin-workspace). */
4
+ adminWorkDir: string;
3
5
  defaultWorkDir: string;
4
6
  selectedWorkDir: string;
5
7
  workflowFolder?: string;
8
+ globalHermitWorkflowFolder?: string;
6
9
  claudeCommand: 'claude';
7
10
  localStatus: 'ready' | 'missing-claude' | 'error';
8
11
  error?: string;
@@ -12,14 +15,28 @@ export interface SystemManagerConfig {
12
15
  schemaVersion: 1;
13
16
  selectedWorkDir: string;
14
17
  workflowFolder?: string;
18
+ /** One-shot marker: the ops-guide bootstrap has been fed into the admin lead session. */
19
+ adminInitialized?: boolean;
15
20
  updatedAt: string;
16
21
  }
17
22
 
18
23
  export interface SystemManagerConfigPatch {
19
24
  selectedWorkDir?: string;
20
25
  workflowFolder?: string | null;
26
+ adminInitialized?: boolean;
21
27
  }
22
28
 
29
+ export type WorkflowPromptSource = 'claude-command' | 'workflow-folder';
30
+
31
+ export type WorkflowPromptSafety =
32
+ | 'read-only'
33
+ | 'reporting'
34
+ | 'audit'
35
+ | 'proposal-only'
36
+ | 'apply'
37
+ | 'destructive'
38
+ | 'unknown';
39
+
23
40
  export interface WorkflowPromptSummary {
24
41
  id: string;
25
42
  label: string;
@@ -27,6 +44,14 @@ export interface WorkflowPromptSummary {
27
44
  path: string;
28
45
  sizeBytes: number;
29
46
  updatedAt: string;
47
+ folder?: string;
48
+ source?: WorkflowPromptSource;
49
+ commandName?: string;
50
+ description?: string;
51
+ category?: string;
52
+ safety?: WorkflowPromptSafety;
53
+ builtin?: boolean;
54
+ order?: number;
30
55
  }
31
56
 
32
57
  export interface WorkflowPromptListResponse {
@@ -2,7 +2,7 @@ import type { ExecutionTarget } from './api';
2
2
  import type { EnhancedChunk } from '@main/types';
3
3
 
4
4
  export const SYSTEM_MANAGER_TEAM_NAME = 'system-manager';
5
- export const SYSTEM_MANAGER_DISPLAY_NAME = '控制台';
5
+ export const SYSTEM_MANAGER_DISPLAY_NAME = 'Helm Loop';
6
6
  export const SYSTEM_MANAGER_BIND_PROJECT = 'my-project';
7
7
 
8
8
  export interface SystemManagerSummary {
@@ -57,6 +57,7 @@ export interface TeamConfig {
57
57
  members?: TeamMember[];
58
58
  projectPath?: string;
59
59
  projectPathHistory?: string[];
60
+ ccSyncError?: string | null;
60
61
  /** Default machine/cwd used when launching this team. */
61
62
  executionTarget?: ExecutionTarget;
62
63
  leadSessionId?: string;
@@ -105,6 +106,8 @@ export interface TeamSummary {
105
106
  color?: string;
106
107
  memberCount: number;
107
108
  members?: TeamSummaryMember[];
109
+ /** Runtime harness used to launch the team, e.g. claudecode/codex/opencode. */
110
+ harness?: string;
108
111
  taskCount: number;
109
112
  lastActivity: string | null;
110
113
  projectPath?: string;
@@ -149,6 +152,10 @@ export interface TeamSummary {
149
152
  sessions: number;
150
153
  messages: number;
151
154
  tokens: number;
155
+ tokensIn?: number;
156
+ tokensOut?: number;
157
+ cacheRead?: number;
158
+ cacheCreation?: number;
152
159
  durationMs: number;
153
160
  };
154
161
  }
@@ -200,6 +207,8 @@ export interface DiscoverableTeam {
200
207
  capabilities?: AgentCapability[];
201
208
  description?: string;
202
209
  harness?: string;
210
+ /** Canonical project path — surfaced via /workers so admins know where each team lives. */
211
+ workDir?: string;
203
212
  }
204
213
 
205
214
  export interface TaskBusConfig {
@@ -272,7 +281,9 @@ export interface TaskHandshakeResponse {
272
281
 
273
282
  export type CollabTaskStatus =
274
283
  | 'pending_accept'
284
+ | 'received'
275
285
  | 'accepted'
286
+ | 'in_progress'
276
287
  | 'delivered'
277
288
  | 'approved'
278
289
  | 'revision'
@@ -324,6 +335,8 @@ export interface CollabTask {
324
335
  rejectedAt?: string;
325
336
  deliveredAt?: string;
326
337
  approvedAt?: string;
338
+ completedAt?: string;
339
+ remoteTaskId?: string;
327
340
  }
328
341
 
329
342
  export interface TaskWorkInterval {
@@ -1185,6 +1198,13 @@ export interface TeamLaunchRequest {
1185
1198
 
1186
1199
  export interface TeamLaunchResponse {
1187
1200
  runId: string;
1201
+ ok?: boolean;
1202
+ data?: {
1203
+ teamName: string;
1204
+ bindProject: string;
1205
+ projectExists: boolean;
1206
+ isOnline: boolean;
1207
+ };
1188
1208
  }
1189
1209
 
1190
1210
  export interface CreateTaskRequest {
@@ -1393,11 +1413,24 @@ export interface TeamChangeEvent {
1393
1413
  | 'lead-message'
1394
1414
  | 'tool-activity'
1395
1415
  | 'process'
1396
- | 'member-spawn';
1416
+ | 'member-spawn'
1417
+ | 'direct-cli-stream';
1397
1418
  teamName: string;
1398
1419
  runId?: string;
1399
1420
  detail?: string;
1400
1421
  taskId?: string;
1422
+ /** direct-cli-stream: which session this live token/turn came from. */
1423
+ sessionKey?: string;
1424
+ /** direct-cli-stream: optimistic id shared with the canonical reply (drives dedup). */
1425
+ messageId?: string;
1426
+ /** direct-cli-stream: init | delta | thinking | tool. */
1427
+ kind?: string;
1428
+ /** direct-cli-stream: incremental assistant text (delta) or tool name. */
1429
+ text?: string;
1430
+ toolName?: string;
1431
+ toolInput?: unknown;
1432
+ /** direct-cli-stream: reply sender shown during streaming (team name or member name). */
1433
+ from?: string;
1401
1434
  }
1402
1435
 
1403
1436
  export interface ProjectBranchChangeEvent {
@@ -1502,9 +1535,10 @@ export interface TeamProvisioningMemberInput {
1502
1535
 
1503
1536
  export interface TeamCreateRequest {
1504
1537
  teamName: string;
1505
- /** cc-connect project name — ASCII, unique. Auto-generated if not provided. */
1506
- bindProject?: string;
1507
- displayName?: string;
1538
+ /** cc-connect project name — ASCII, unique. Required for URL routing and cc-connect binding. */
1539
+ bindProject: string;
1540
+ /** Human-facing display name. Required and may contain Chinese/Unicode characters. */
1541
+ displayName: string;
1508
1542
  description?: string;
1509
1543
  color?: string;
1510
1544
  members: TeamProvisioningMemberInput[];
@@ -1747,6 +1781,8 @@ export interface MemberFullStats {
1747
1781
  inputTokens: number;
1748
1782
  outputTokens: number;
1749
1783
  cacheReadTokens: number;
1784
+ cacheCreationTokens: number;
1785
+ totalTokens: number;
1750
1786
  costUsd: number;
1751
1787
  tasksCompleted: number;
1752
1788
  messageCount: number;
@@ -1,31 +1,9 @@
1
1
  /**
2
2
  * Terminal types — shared between main, preload, and renderer processes.
3
3
  *
4
- * Used for embedded PTY terminal (xterm.js + node-pty).
4
+ * Commands open in the system/default terminal.
5
5
  */
6
6
 
7
- // =============================================================================
8
- // PTY Spawn Options
9
- // =============================================================================
10
-
11
- /**
12
- * Options for spawning a new PTY process.
13
- */
14
- export interface PtySpawnOptions {
15
- /** Command to run (default: user's shell) */
16
- command?: string;
17
- /** Arguments for the command */
18
- args?: string[];
19
- /** Working directory */
20
- cwd?: string;
21
- /** Environment variables (merged with process.env) */
22
- env?: Record<string, string>;
23
- /** Initial terminal columns */
24
- cols?: number;
25
- /** Initial terminal rows */
26
- rows?: number;
27
- }
28
-
29
7
  // =============================================================================
30
8
  // Preload API
31
9
  // =============================================================================
@@ -34,18 +12,6 @@ export interface PtySpawnOptions {
34
12
  * Terminal API exposed via preload bridge.
35
13
  */
36
14
  export interface TerminalAPI {
37
- /** Spawn a new PTY process. Returns unique pty ID. */
38
- spawn: (options?: PtySpawnOptions) => Promise<string>;
39
- /** Write data to PTY stdin (fire-and-forget). */
40
- write: (ptyId: string, data: string) => void;
41
- /** Resize PTY terminal (fire-and-forget). */
42
- resize: (ptyId: string, cols: number, rows: number) => void;
43
- /** Kill PTY process. */
44
- kill: (ptyId: string) => Promise<void>;
45
- /** Open command in system Terminal.app (macOS). */
15
+ /** Open command in the system terminal. */
46
16
  openExternal: (options: { command: string; args?: string[]; cwd?: string }) => Promise<void>;
47
- /** Subscribe to PTY data output. Returns cleanup function. */
48
- onData: (cb: (event: unknown, ptyId: string, data: string) => void) => () => void;
49
- /** Subscribe to PTY exit events. Returns cleanup function. */
50
- onExit: (cb: (event: unknown, ptyId: string, exitCode: number) => void) => () => void;
51
17
  }
@@ -0,0 +1,28 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { discoverableTeamToWorker } from './worker';
4
+ import type { DiscoverableTeam } from './team';
5
+
6
+ function makeTeam(overrides: Partial<DiscoverableTeam> = {}): DiscoverableTeam {
7
+ return {
8
+ slug: 'team-1',
9
+ displayName: '产品助手',
10
+ location: 'local',
11
+ status: 'online',
12
+ collaboration: true,
13
+ ...overrides,
14
+ };
15
+ }
16
+
17
+ describe('discoverableTeamToWorker', () => {
18
+ it('forwards the workDir so /workers can show where each team lives', () => {
19
+ const worker = discoverableTeamToWorker(makeTeam({ workDir: '/Users/x/projects/demo' }));
20
+ expect(worker.workerId).toBe('team-1');
21
+ expect(worker.workDir).toBe('/Users/x/projects/demo');
22
+ });
23
+
24
+ it('leaves workDir undefined when the team manifest has none', () => {
25
+ const worker = discoverableTeamToWorker(makeTeam());
26
+ expect(worker.workDir).toBeUndefined();
27
+ });
28
+ });
@@ -28,6 +28,8 @@ export interface DiscoverableWorker extends WorkerIdentity {
28
28
  status: 'online' | 'offline';
29
29
  capabilities?: WorkerCapability[];
30
30
  description?: string;
31
+ /** Canonical project path, forwarded from the team manifest for /workers output. */
32
+ workDir?: string;
31
33
  }
32
34
 
33
35
  /** atomic worker 的 dispatch 立即响应(fire-and-forget,不阻塞长任务)。 */
@@ -58,5 +60,6 @@ export function discoverableTeamToWorker(team: DiscoverableTeam): DiscoverableWo
58
60
  status: team.status,
59
61
  capabilities: team.capabilities,
60
62
  description: team.description,
63
+ workDir: team.workDir,
61
64
  };
62
65
  }
@@ -0,0 +1,88 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import {
4
+ ANTHROPIC_TEAM_EFFORT_LEVELS,
5
+ CODEX_TEAM_EFFORT_LEVELS,
6
+ formatEffortLevelList,
7
+ formatEffortLevelListForProvider,
8
+ isTeamEffortLevel,
9
+ isTeamEffortLevelForProvider,
10
+ TEAM_EFFORT_LEVELS,
11
+ } from '../effortLevels';
12
+
13
+ describe('TEAM_EFFORT_LEVELS', () => {
14
+ it('contains the full ordered set of effort levels', () => {
15
+ expect(TEAM_EFFORT_LEVELS).toEqual([
16
+ 'none',
17
+ 'minimal',
18
+ 'low',
19
+ 'medium',
20
+ 'high',
21
+ 'xhigh',
22
+ 'max',
23
+ ]);
24
+ });
25
+ });
26
+
27
+ describe('isTeamEffortLevel', () => {
28
+ it.each(TEAM_EFFORT_LEVELS)('accepts %s', (level) => {
29
+ expect(isTeamEffortLevel(level)).toBe(true);
30
+ });
31
+
32
+ it.each(['', 'turbo', 'extra', undefined, null, 5])('rejects %s', (level) => {
33
+ expect(isTeamEffortLevel(level)).toBe(false);
34
+ });
35
+ });
36
+
37
+ describe('isTeamEffortLevelForProvider', () => {
38
+ it('accepts Codex effort levels for Codex', () => {
39
+ for (const level of CODEX_TEAM_EFFORT_LEVELS) {
40
+ expect(isTeamEffortLevelForProvider(level, 'codex')).toBe(true);
41
+ }
42
+ });
43
+
44
+ it('rejects max effort for Codex (not in its set)', () => {
45
+ expect(isTeamEffortLevelForProvider('max', 'codex')).toBe(false);
46
+ });
47
+
48
+ it('accepts Anthropic effort levels for Anthropic', () => {
49
+ for (const level of ANTHROPIC_TEAM_EFFORT_LEVELS) {
50
+ expect(isTeamEffortLevelForProvider(level, 'anthropic')).toBe(true);
51
+ }
52
+ });
53
+
54
+ it('rejects minimal effort for Anthropic', () => {
55
+ expect(isTeamEffortLevelForProvider('minimal', 'anthropic')).toBe(false);
56
+ });
57
+
58
+ it('falls back to the legacy set for gemini/opencode (low/medium/high only)', () => {
59
+ expect(isTeamEffortLevelForProvider('low', 'gemini')).toBe(true);
60
+ expect(isTeamEffortLevelForProvider('medium', 'opencode')).toBe(true);
61
+ expect(isTeamEffortLevelForProvider('high', 'gemini')).toBe(true);
62
+ expect(isTeamEffortLevelForProvider('minimal', 'gemini')).toBe(false);
63
+ expect(isTeamEffortLevelForProvider('max', 'opencode')).toBe(false);
64
+ });
65
+ });
66
+
67
+ describe('formatEffortLevelList', () => {
68
+ it('returns the full comma-separated list', () => {
69
+ expect(formatEffortLevelList()).toBe(TEAM_EFFORT_LEVELS.join(', '));
70
+ });
71
+ });
72
+
73
+ describe('formatEffortLevelListForProvider', () => {
74
+ it('returns the Codex-specific list', () => {
75
+ expect(formatEffortLevelListForProvider('codex')).toBe(CODEX_TEAM_EFFORT_LEVELS.join(', '));
76
+ });
77
+
78
+ it('returns the Anthropic-specific list', () => {
79
+ expect(formatEffortLevelListForProvider('anthropic')).toBe(
80
+ ANTHROPIC_TEAM_EFFORT_LEVELS.join(', ')
81
+ );
82
+ });
83
+
84
+ it('returns the legacy list for other providers', () => {
85
+ expect(formatEffortLevelListForProvider('gemini')).toBe('low, medium, high');
86
+ expect(formatEffortLevelListForProvider()).toBe('low, medium, high');
87
+ });
88
+ });