@yancyyu/openhermit 1.6.41 → 1.6.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/README.md +98 -89
  2. package/bin/hermit.mjs +96 -0
  3. package/dist-renderer/assets/{ProjectEditorOverlay-Br0X83Jf.js → ProjectEditorOverlay-C98qSs7-.js} +1 -1
  4. package/dist-renderer/assets/{TeamGraphOverlay-DHMTbZPZ.js → TeamGraphOverlay-CsBbZwcL.js} +1 -1
  5. package/dist-renderer/assets/{_basePickBy-DzIiX7yH.js → _basePickBy-ZOyLWjMK.js} +1 -1
  6. package/dist-renderer/assets/{_baseUniq-6hZuzTLU.js → _baseUniq-DBb726rt.js} +1 -1
  7. package/dist-renderer/assets/{arc-CXgO6fx_.js → arc-CdiTaR_R.js} +1 -1
  8. package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-DKWgtDHr.js → architectureDiagram-VXUJARFQ-Cz3sc5TH.js} +1 -1
  9. package/dist-renderer/assets/{blockDiagram-VD42YOAC-DOMUcC40.js → blockDiagram-VD42YOAC-DE4c-KJ3.js} +1 -1
  10. package/dist-renderer/assets/{c4Diagram-YG6GDRKO-B_k2L7qX.js → c4Diagram-YG6GDRKO-CmTMDTrV.js} +1 -1
  11. package/dist-renderer/assets/channel-KTpqi9eT.js +1 -0
  12. package/dist-renderer/assets/{chunk-4BX2VUAB-BeD_ccFy.js → chunk-4BX2VUAB-rhHy3tFl.js} +1 -1
  13. package/dist-renderer/assets/{chunk-55IACEB6-ClZfkA5w.js → chunk-55IACEB6-fLZBzuo_.js} +1 -1
  14. package/dist-renderer/assets/{chunk-B4BG7PRW-5XluxXsn.js → chunk-B4BG7PRW-DOzxQhim.js} +1 -1
  15. package/dist-renderer/assets/{chunk-DI55MBZ5-BzIjjNVm.js → chunk-DI55MBZ5-COQCcXC5.js} +1 -1
  16. package/dist-renderer/assets/{chunk-FMBD7UC4-HgH3MK_H.js → chunk-FMBD7UC4-IKU9U_Y4.js} +1 -1
  17. package/dist-renderer/assets/{chunk-QN33PNHL-WeC5T3Ba.js → chunk-QN33PNHL-D6WV154X.js} +1 -1
  18. package/dist-renderer/assets/{chunk-QZHKN3VN-Cu1ApHfW.js → chunk-QZHKN3VN-D90_2DQp.js} +1 -1
  19. package/dist-renderer/assets/{chunk-TZMSLE5B-BOhlynJM.js → chunk-TZMSLE5B-BQEil57G.js} +1 -1
  20. package/dist-renderer/assets/classDiagram-2ON5EDUG-lpzulY5X.js +1 -0
  21. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-lpzulY5X.js +1 -0
  22. package/dist-renderer/assets/clone-CriGymY9.js +1 -0
  23. package/dist-renderer/assets/{cose-bilkent-S5V4N54A-DGZSihDQ.js → cose-bilkent-S5V4N54A-6WiK6U2P.js} +1 -1
  24. package/dist-renderer/assets/{dagre-6UL2VRFP-CnxwCbku.js → dagre-6UL2VRFP-DF4MMuTn.js} +1 -1
  25. package/dist-renderer/assets/{diagram-PSM6KHXK-DsIhoxdI.js → diagram-PSM6KHXK-CcF1eZ7E.js} +1 -1
  26. package/dist-renderer/assets/{diagram-QEK2KX5R-Cmh9KUF5.js → diagram-QEK2KX5R-DYlOVPQB.js} +1 -1
  27. package/dist-renderer/assets/{diagram-S2PKOQOG-CKxV456A.js → diagram-S2PKOQOG-BHXWsZOP.js} +1 -1
  28. package/dist-renderer/assets/{erDiagram-Q2GNP2WA-EnvYjOjc.js → erDiagram-Q2GNP2WA-GjmuBx8d.js} +1 -1
  29. package/dist-renderer/assets/{flowDiagram-NV44I4VS-BmNeWY_A.js → flowDiagram-NV44I4VS-BuS7YVHk.js} +1 -1
  30. package/dist-renderer/assets/{ganttDiagram-JELNMOA3-D30fyK-u.js → ganttDiagram-JELNMOA3-3Teu5tAa.js} +1 -1
  31. package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-CrUNiYg1.js → gitGraphDiagram-V2S2FVAM-BiLdCYu5.js} +1 -1
  32. package/dist-renderer/assets/{graph-CY1gTfTb.js → graph-CDP_R8ct.js} +1 -1
  33. package/dist-renderer/assets/{index-CaEbzwAU.js → index-BSZdT-g-.js} +1 -1
  34. package/dist-renderer/assets/{index-D5K-SjBG.js → index-BhWvMqsz.js} +1 -1
  35. package/dist-renderer/assets/{index-9_hO4N1e.js → index-C2_AupSj.js} +1 -1
  36. package/dist-renderer/assets/{index-59r209c1.js → index-C5ujiwAR.js} +580 -588
  37. package/dist-renderer/assets/index-CIS2CTK9.css +1 -0
  38. package/dist-renderer/assets/{index-DMR9B1UP.js → index-CVNjLwkq.js} +1 -1
  39. package/dist-renderer/assets/{index-BC2hXmg_.js → index-CwG3se0q.js} +1 -1
  40. package/dist-renderer/assets/{infoDiagram-HS3SLOUP-By_XUlcD.js → infoDiagram-HS3SLOUP-DLHUFo72.js} +1 -1
  41. package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-BM1LJE9m.js → journeyDiagram-XKPGCS4Q-BE07RpJD.js} +1 -1
  42. package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-DHIW3aTA.js → kanban-definition-3W4ZIXB7-DDHZy4NB.js} +1 -1
  43. package/dist-renderer/assets/{layout-DAKiL_Mo.js → layout-5nA5wUxO.js} +1 -1
  44. package/dist-renderer/assets/{linear-DwOaRYea.js → linear-BtF1i2qN.js} +1 -1
  45. package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-b7bJ2cha.js → mindmap-definition-VGOIOE7T-Z1Ui9Sqy.js} +1 -1
  46. package/dist-renderer/assets/{pieDiagram-ADFJNKIX-DxyL9Zr2.js → pieDiagram-ADFJNKIX-LCjxckWv.js} +1 -1
  47. package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-CR33pHlF.js → quadrantDiagram-AYHSOK5B-BOwKjSco.js} +1 -1
  48. package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-BAiSRSlh.js → requirementDiagram-UZGBJVZJ-pChP8Znd.js} +1 -1
  49. package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-C8JmDjoa.js → sankeyDiagram-TZEHDZUN-DifZ2qpo.js} +1 -1
  50. package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-c1d0Wi1m.js → sequenceDiagram-WL72ISMW-CJg-WYyY.js} +1 -1
  51. package/dist-renderer/assets/{splashScene-D0YB9uxm.js → splashScene-94xWCzLA.js} +1 -1
  52. package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-nT8BiH2O.js → stateDiagram-FKZM4ZOC-DWHOoFdv.js} +1 -1
  53. package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-CGYZOoMb.js +1 -0
  54. package/dist-renderer/assets/{timeline-definition-IT6M3QCI-DpoRepUA.js → timeline-definition-IT6M3QCI-CPgokIo8.js} +1 -1
  55. package/dist-renderer/assets/{treemap-GDKQZRPO-C41UJeIH.js → treemap-GDKQZRPO-DAVqSR9L.js} +1 -1
  56. package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-KMjGARKN.js → xychartDiagram-PRI3JC2R-CCOcGbrD.js} +1 -1
  57. package/dist-renderer/chat-community-qr.jpg +0 -0
  58. package/dist-renderer/fonts/Agave-Bold.ttf +0 -0
  59. package/dist-renderer/fonts/Agave-Regular.ttf +0 -0
  60. package/dist-renderer/icon.png +0 -0
  61. package/dist-renderer/icon.rar +0 -0
  62. package/dist-renderer/index.html +3 -3
  63. package/package.json +21 -26
  64. package/src/features/worker-society/core/application/WorkerSocietyService.test.ts +802 -0
  65. package/src/features/worker-society/core/application/WorkerSocietyService.ts +428 -0
  66. package/src/features/worker-society/core/application/fakes.ts +101 -0
  67. package/src/features/worker-society/core/application/ports.ts +70 -0
  68. package/src/features/worker-society/core/domain/models/society.ts +141 -0
  69. package/src/features/worker-society/core/domain/policies/societyPolicies.test.ts +739 -0
  70. package/src/features/worker-society/core/domain/policies/societyPolicies.ts +496 -0
  71. package/src/features/worker-society/main/adapters/input/societyMcp.test.ts +317 -0
  72. package/src/features/worker-society/main/adapters/input/societyMcp.ts +257 -0
  73. package/src/features/worker-society/main/adapters/input/societyRoutes.test.ts +695 -0
  74. package/src/features/worker-society/main/adapters/input/societyRoutes.ts +194 -0
  75. package/src/features/worker-society/main/composition/societyComposition.test.ts +74 -0
  76. package/src/features/worker-society/main/composition/societyComposition.ts +70 -0
  77. package/src/features/worker-society/main/composition/workerSocietyPlugin.test.ts +69 -0
  78. package/src/features/worker-society/main/composition/workerSocietyPlugin.ts +67 -0
  79. package/src/features/worker-society/main/infrastructure/crossTeamMessageGateway.test.ts +132 -0
  80. package/src/features/worker-society/main/infrastructure/crossTeamMessageGateway.ts +84 -0
  81. package/src/features/worker-society/main/infrastructure/fsStores.test.ts +216 -0
  82. package/src/features/worker-society/main/infrastructure/fsStores.ts +113 -0
  83. package/src/features/worker-society/main/infrastructure/mergingProfileStore.test.ts +195 -0
  84. package/src/features/worker-society/main/infrastructure/mergingProfileStore.ts +96 -0
  85. package/src/features/worker-society/renderer/SocietyGraph.tsx +166 -0
  86. package/src/features/worker-society/renderer/SocietyNodeLabels.tsx +139 -0
  87. package/src/features/worker-society/renderer/SocietyNodeOverlay.tsx +339 -0
  88. package/src/features/worker-society/renderer/SocietyView.tsx +437 -0
  89. package/src/features/worker-society/renderer/index.ts +11 -0
  90. package/src/features/worker-society/renderer/societyApi.test.ts +259 -0
  91. package/src/features/worker-society/renderer/societyApi.ts +144 -0
  92. package/src/features/worker-society/renderer/societyGraphAdapter.test.ts +321 -0
  93. package/src/features/worker-society/renderer/societyGraphAdapter.ts +240 -0
  94. package/src/features/worker-society/renderer/societyOverlayActions.test.ts +57 -0
  95. package/src/features/worker-society/renderer/societyOverlayActions.ts +49 -0
  96. package/src/features/worker-society/renderer/societyStore.test.ts +218 -0
  97. package/src/features/worker-society/renderer/societyStore.ts +146 -0
  98. package/src/features/worker-society/renderer/societyViewUtils.test.ts +81 -0
  99. package/src/features/worker-society/renderer/societyViewUtils.ts +68 -0
  100. package/src/main/ipc/extensions.ts +27 -0
  101. package/src/main/server.ts +1731 -539
  102. package/src/main/services/ccConnect/CcConnectBridge.ts +26 -11
  103. package/src/main/services/ccConnect/CcConnectClient.ts +9 -2
  104. package/src/main/services/ccConnect/workDirReconcile.test.ts +57 -0
  105. package/src/main/services/ccConnect/workDirReconcile.ts +36 -0
  106. package/src/main/services/direct-cli/DirectCliSessionManager.test.ts +397 -0
  107. package/src/main/services/direct-cli/DirectCliSessionManager.ts +508 -0
  108. package/src/main/services/direct-cli/DirectCliSessionStore.test.ts +79 -0
  109. package/src/main/services/direct-cli/DirectCliSessionStore.ts +97 -0
  110. package/src/main/services/direct-cli/__tests__/directCliMessageId.test.ts +40 -0
  111. package/src/main/services/direct-cli/directCliMessageId.ts +21 -0
  112. package/src/main/services/direct-cli/index.ts +17 -0
  113. package/src/main/services/extensions/capability-packs/CapabilityPackLoaderService.ts +637 -0
  114. package/src/main/services/extensions/catalog/PluginCatalogService.ts +2 -2
  115. package/src/main/services/loop-assets/LoopAssetsScannerService.ts +657 -0
  116. package/src/main/services/runtime/providerAwareCliEnv.ts +33 -5
  117. package/src/main/services/session-intelligence/LocalSessionScanner.ts +156 -71
  118. package/src/main/services/session-intelligence/SessionUsageParser.ts +103 -8
  119. package/src/main/services/session-intelligence/UsageTelemetryService.ts +11 -0
  120. package/src/main/services/session-intelligence/__tests__/teamSessionListMapper.test.ts +104 -0
  121. package/src/main/services/session-intelligence/teamSessionListMapper.ts +78 -0
  122. package/src/main/services/system-manager/AdminLoopInitializer.ts +95 -0
  123. package/src/main/services/system-manager/BuiltinWorkflowSeeder.ts +744 -0
  124. package/src/main/services/system-manager/SystemManagerConfigService.ts +19 -1
  125. package/src/main/services/system-manager/WorkflowPromptService.ts +58 -5
  126. package/src/main/services/system-manager/__tests__/AdminLoopInitializer.test.ts +129 -0
  127. package/src/main/services/system-manager/__tests__/SystemManagerConfigService.test.ts +60 -0
  128. package/src/main/services/teams-mvp/CollaborationBoardService.ts +2 -0
  129. package/src/main/services/teams-mvp/OpsRunbookContext.ts +60 -0
  130. package/src/main/services/teams-mvp/TaskDispatchService.test.ts +305 -0
  131. package/src/main/services/teams-mvp/TaskDispatchService.ts +250 -131
  132. package/src/main/services/teams-mvp/TeamProvisioningService.ts +12 -2
  133. package/src/main/services/teams-mvp/TeamWorkspaceService.test.ts +207 -0
  134. package/src/main/services/teams-mvp/TeamWorkspaceService.ts +104 -51
  135. package/src/main/services/teams-mvp/index.ts +6 -0
  136. package/src/main/utils/externalPlatformSessionRouting.ts +92 -0
  137. package/src/main/utils/toolApprovalRules.ts +151 -0
  138. package/src/renderer/App.tsx +24 -89
  139. package/src/renderer/api/httpClient.ts +132 -52
  140. package/src/renderer/api/providers.ts +5 -16
  141. package/src/renderer/components/chat/CommunityChatView.tsx +81 -0
  142. package/src/renderer/components/dashboard/DashboardView.tsx +130 -84
  143. package/src/renderer/components/extensions/ExtensionStoreView.tsx +39 -5
  144. package/src/renderer/components/extensions/ExtensionsSubTabTrigger.tsx +2 -1
  145. package/src/renderer/components/extensions/capability-packs/CapabilityPacksPanel.tsx +170 -0
  146. package/src/renderer/components/layout/PaneContent.tsx +10 -2
  147. package/src/renderer/components/layout/SortableTab.tsx +4 -0
  148. package/src/renderer/components/layout/TabBarActions.tsx +13 -16
  149. package/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx +4 -135
  150. package/src/renderer/components/schedules/SchedulesView.tsx +22 -14
  151. package/src/renderer/components/schedules/calendar/CalendarEventBlock.tsx +7 -6
  152. package/src/renderer/components/settings/SettingsTabs.tsx +24 -21
  153. package/src/renderer/components/settings/SettingsView.tsx +22 -13
  154. package/src/renderer/components/settings/components/SettingRow.tsx +13 -5
  155. package/src/renderer/components/settings/components/SettingsSectionCard.tsx +53 -0
  156. package/src/renderer/components/settings/components/SettingsSectionHeader.tsx +10 -6
  157. package/src/renderer/components/settings/components/SettingsSelect.tsx +12 -9
  158. package/src/renderer/components/settings/components/SettingsToggle.tsx +6 -5
  159. package/src/renderer/components/settings/components/index.ts +1 -0
  160. package/src/renderer/components/settings/sections/AdvancedSection.tsx +78 -59
  161. package/src/renderer/components/settings/sections/CliStatusSection.tsx +32 -44
  162. package/src/renderer/components/settings/sections/ConfigEditorDialog.tsx +1 -1
  163. package/src/renderer/components/settings/sections/GeneralSection.tsx +216 -186
  164. package/src/renderer/components/settings/sections/PlatformsSection.tsx +25 -17
  165. package/src/renderer/components/settings/sections/TaskBusSection.tsx +63 -22
  166. package/src/renderer/components/sidebar/SidebarSessions.tsx +120 -80
  167. package/src/renderer/components/sidebar/SidebarTaskItem.tsx +1 -1
  168. package/src/renderer/components/splash/splashScene.ts +6 -2
  169. package/src/renderer/components/system-manager/SystemManagerView.tsx +169 -255
  170. package/src/renderer/components/tasks/TasksView.tsx +63 -37
  171. package/src/renderer/components/team/CcSessionsSection.tsx +124 -89
  172. package/src/renderer/components/team/HarnessBrandLogos.tsx +318 -0
  173. package/src/renderer/components/team/HarnessSelect.tsx +25 -26
  174. package/src/renderer/components/team/TeamDetailView.tsx +137 -153
  175. package/src/renderer/components/team/TeamEmptyState.tsx +9 -37
  176. package/src/renderer/components/team/TeamListView.tsx +144 -30
  177. package/src/renderer/components/team/__tests__/CcSessionsSection.hasLocalFile.test.tsx +128 -0
  178. package/src/renderer/components/team/activity/ActivityItem.tsx +21 -9
  179. package/src/renderer/components/team/activity/ActivityTimeline.tsx +2 -2
  180. package/src/renderer/components/team/dialogs/AdvancedCliSection.tsx +1 -1
  181. package/src/renderer/components/team/dialogs/CreateTaskDialog.tsx +13 -10
  182. package/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +189 -57
  183. package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +9 -157
  184. package/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx +19 -15
  185. package/src/renderer/components/team/dialogs/PlatformBindingDialog.tsx +48 -10
  186. package/src/renderer/components/team/dialogs/PlatformManualForm.tsx +11 -12
  187. package/src/renderer/components/team/dialogs/PlatformSetupQR.tsx +39 -37
  188. package/src/renderer/components/team/dialogs/RuntimeConfigDialog.tsx +434 -64
  189. package/src/renderer/components/team/dialogs/SendMessageDialog.tsx +12 -10
  190. package/src/renderer/components/team/dialogs/TaskDetailDialog.tsx +2 -2
  191. package/src/renderer/components/team/dialogs/__tests__/CreateTeamDialog.bindProject.test.tsx +399 -0
  192. package/src/renderer/components/team/dialogs/__tests__/CreateTeamDialog.chineseRepro.test.tsx +253 -0
  193. package/src/renderer/components/team/dialogs/platformAllowUtils.ts +91 -0
  194. package/src/renderer/components/team/dialogs/teammateRuntimeCompatibility.tsx +1 -1
  195. package/src/renderer/components/team/kanban/KanbanTaskCard.test.tsx +41 -0
  196. package/src/renderer/components/team/kanban/KanbanTaskCard.tsx +41 -86
  197. package/src/renderer/components/team/loop-console/LoopCommandComposer.tsx +310 -0
  198. package/src/renderer/components/team/loop-console/LoopConsolePanel.tsx +372 -0
  199. package/src/renderer/components/team/loop-console/loopSendIntent.test.ts +85 -0
  200. package/src/renderer/components/team/loop-console/loopSendIntent.ts +221 -0
  201. package/src/renderer/components/team/loop-console/useLeadSessionToolActivity.ts +74 -0
  202. package/src/renderer/components/team/loop-console/useLoopCommandSuggestions.ts +165 -0
  203. package/src/renderer/components/team/loop-console/useLoopConsoleController.ts +266 -0
  204. package/src/renderer/components/team/members/LeadModelRow.test.tsx +1 -1
  205. package/src/renderer/components/team/members/LeadModelRow.tsx +5 -3
  206. package/src/renderer/components/team/members/MemberDetailDialog.tsx +11 -0
  207. package/src/renderer/components/team/members/MemberDetailStats.tsx +13 -3
  208. package/src/renderer/components/team/members/MemberDraftRow.test.tsx +1 -1
  209. package/src/renderer/components/team/members/MemberDraftRow.tsx +1 -1
  210. package/src/renderer/components/team/members/MemberMessagesTab.tsx +2 -2
  211. package/src/renderer/components/team/members/MemberStatsTab.tsx +1 -1
  212. package/src/renderer/components/team/messages/MessageComposer.tsx +150 -44
  213. package/src/renderer/components/team/messages/MessagesFilterPopover.tsx +2 -2
  214. package/src/renderer/components/team/messages/MessagesPanel.tsx +34 -28
  215. package/src/renderer/components/team/schedule/CcCronScheduleDialog.tsx +6 -6
  216. package/src/renderer/components/team/taskLogs/ExactTaskLogCard.tsx +2 -2
  217. package/src/renderer/components/team/taskLogs/TaskLogStreamSection.tsx +1 -1
  218. package/src/renderer/components/terminal/TerminalPanel.tsx +2 -3
  219. package/src/renderer/components/ui/MentionableTextarea.tsx +5 -1
  220. package/src/renderer/constants/teamColors.ts +5 -5
  221. package/src/renderer/hooks/useExtensionsTabState.ts +1 -1
  222. package/src/renderer/hooks/useMentionDetection.ts +5 -1
  223. package/src/renderer/hooks/useProjectWorkflowCommands.ts +57 -0
  224. package/src/renderer/hooks/useTeamSuggestions.ts +2 -0
  225. package/src/renderer/index.css +19 -2
  226. package/src/renderer/main.tsx +7 -1
  227. package/src/renderer/store/index.ts +18 -1
  228. package/src/renderer/store/slices/extensionsSlice.ts +83 -0
  229. package/src/renderer/store/slices/tabSlice.ts +61 -0
  230. package/src/renderer/store/slices/teamSlice.ts +138 -9
  231. package/src/renderer/types/mention.ts +8 -0
  232. package/src/renderer/types/tabs.ts +3 -1
  233. package/src/renderer/utils/__tests__/bindProjectSlug.test.ts +69 -0
  234. package/src/renderer/utils/__tests__/groupTransformer.test.ts +148 -0
  235. package/src/renderer/utils/__tests__/initialRoute.test.ts +101 -0
  236. package/src/renderer/utils/__tests__/leadToolActivity.test.ts +124 -0
  237. package/src/renderer/utils/__tests__/mergeTeamMessages.test.ts +81 -0
  238. package/src/renderer/utils/__tests__/teamMessageFiltering.test.ts +213 -0
  239. package/src/renderer/utils/__tests__/teamMessageKey.test.ts +75 -0
  240. package/src/renderer/utils/__tests__/workflowCommandExecution.test.ts +173 -0
  241. package/src/renderer/utils/__tests__/workflowCommandSuggestions.test.ts +59 -0
  242. package/src/renderer/utils/bindProjectSlug.ts +57 -0
  243. package/src/renderer/utils/capabilityCommandExecution.ts +113 -0
  244. package/src/renderer/utils/initialRoute.ts +89 -0
  245. package/src/renderer/utils/leadToolActivity.ts +117 -0
  246. package/src/renderer/utils/loopShortcutSuggestions.ts +106 -0
  247. package/src/renderer/utils/mentionSuggestions.ts +1 -1
  248. package/src/renderer/utils/slashCommandRegistry.ts +231 -0
  249. package/src/renderer/utils/teamMentionDirective.ts +31 -0
  250. package/src/renderer/utils/workflowCommandExecution.ts +96 -0
  251. package/src/renderer/utils/workflowCommandSuggestions.ts +49 -0
  252. package/src/shared/types/api.ts +79 -4
  253. package/src/shared/types/ccConnect.ts +1 -0
  254. package/src/shared/types/extensions/api.ts +19 -0
  255. package/src/shared/types/extensions/capabilityPack.ts +118 -0
  256. package/src/shared/types/extensions/index.ts +29 -1
  257. package/src/shared/types/index.ts +6 -0
  258. package/src/shared/types/loopAssets.ts +54 -0
  259. package/src/shared/types/providers.ts +0 -16
  260. package/src/shared/types/systemManager.ts +26 -1
  261. package/src/shared/types/team.ts +43 -3
  262. package/src/shared/types/terminal.ts +2 -36
  263. package/src/shared/types/worker.test.ts +28 -0
  264. package/src/shared/types/worker.ts +3 -0
  265. package/src/shared/utils/__tests__/effortLevels.test.ts +88 -0
  266. package/src/shared/utils/__tests__/providerBackend.test.ts +88 -0
  267. package/src/shared/utils/__tests__/providerLaunchArgs.test.ts +220 -0
  268. package/src/shared/utils/claudeStreamJson.test.ts +187 -0
  269. package/src/shared/utils/claudeStreamJson.ts +153 -0
  270. package/src/shared/utils/providerLaunchArgs.ts +217 -0
  271. package/src/shared/utils/slashCommands.ts +10 -0
  272. package/src/types/node-pty.d.ts +8 -0
  273. package/dist-renderer/assets/channel-D0XS_akr.js +0 -1
  274. package/dist-renderer/assets/classDiagram-2ON5EDUG-D13Ffs0U.js +0 -1
  275. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-D13Ffs0U.js +0 -1
  276. package/dist-renderer/assets/clone-B1ZrxI1D.js +0 -1
  277. package/dist-renderer/assets/index-iyjkpSus.css +0 -32
  278. package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-Dmibmlso.js +0 -1
  279. package/src/main/services/system-manager/SystemManagerPtyService.ts +0 -233
  280. package/src/renderer/components/common/TerminalPane.tsx +0 -213
  281. package/src/renderer/components/team/dialogs/useTeamEditForm.ts +0 -292
@@ -0,0 +1,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;
@@ -99,10 +100,14 @@ export interface TeamSummaryMember {
99
100
  export interface TeamSummary {
100
101
  teamName: string;
101
102
  displayName: string;
103
+ /** cc-connect project name — ASCII, unique identifier for routing */
104
+ bindProject?: string;
102
105
  description: string;
103
106
  color?: string;
104
107
  memberCount: number;
105
108
  members?: TeamSummaryMember[];
109
+ /** Runtime harness used to launch the team, e.g. claudecode/codex/opencode. */
110
+ harness?: string;
106
111
  taskCount: number;
107
112
  lastActivity: string | null;
108
113
  projectPath?: string;
@@ -147,6 +152,10 @@ export interface TeamSummary {
147
152
  sessions: number;
148
153
  messages: number;
149
154
  tokens: number;
155
+ tokensIn?: number;
156
+ tokensOut?: number;
157
+ cacheRead?: number;
158
+ cacheCreation?: number;
150
159
  durationMs: number;
151
160
  };
152
161
  }
@@ -198,6 +207,8 @@ export interface DiscoverableTeam {
198
207
  capabilities?: AgentCapability[];
199
208
  description?: string;
200
209
  harness?: string;
210
+ /** Canonical project path — surfaced via /workers so admins know where each team lives. */
211
+ workDir?: string;
201
212
  }
202
213
 
203
214
  export interface TaskBusConfig {
@@ -270,7 +281,9 @@ export interface TaskHandshakeResponse {
270
281
 
271
282
  export type CollabTaskStatus =
272
283
  | 'pending_accept'
284
+ | 'received'
273
285
  | 'accepted'
286
+ | 'in_progress'
274
287
  | 'delivered'
275
288
  | 'approved'
276
289
  | 'revision'
@@ -322,6 +335,8 @@ export interface CollabTask {
322
335
  rejectedAt?: string;
323
336
  deliveredAt?: string;
324
337
  approvedAt?: string;
338
+ completedAt?: string;
339
+ remoteTaskId?: string;
325
340
  }
326
341
 
327
342
  export interface TaskWorkInterval {
@@ -1183,6 +1198,13 @@ export interface TeamLaunchRequest {
1183
1198
 
1184
1199
  export interface TeamLaunchResponse {
1185
1200
  runId: string;
1201
+ ok?: boolean;
1202
+ data?: {
1203
+ teamName: string;
1204
+ bindProject: string;
1205
+ projectExists: boolean;
1206
+ isOnline: boolean;
1207
+ };
1186
1208
  }
1187
1209
 
1188
1210
  export interface CreateTaskRequest {
@@ -1391,11 +1413,24 @@ export interface TeamChangeEvent {
1391
1413
  | 'lead-message'
1392
1414
  | 'tool-activity'
1393
1415
  | 'process'
1394
- | 'member-spawn';
1416
+ | 'member-spawn'
1417
+ | 'direct-cli-stream';
1395
1418
  teamName: string;
1396
1419
  runId?: string;
1397
1420
  detail?: string;
1398
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;
1399
1434
  }
1400
1435
 
1401
1436
  export interface ProjectBranchChangeEvent {
@@ -1500,7 +1535,10 @@ export interface TeamProvisioningMemberInput {
1500
1535
 
1501
1536
  export interface TeamCreateRequest {
1502
1537
  teamName: string;
1503
- 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;
1504
1542
  description?: string;
1505
1543
  color?: string;
1506
1544
  members: TeamProvisioningMemberInput[];
@@ -1743,6 +1781,8 @@ export interface MemberFullStats {
1743
1781
  inputTokens: number;
1744
1782
  outputTokens: number;
1745
1783
  cacheReadTokens: number;
1784
+ cacheCreationTokens: number;
1785
+ totalTokens: number;
1746
1786
  costUsd: number;
1747
1787
  tasksCompleted: number;
1748
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
+ });