@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
@@ -14,15 +14,19 @@ export const SettingsSectionHeader = ({
14
14
  }: SettingsSectionHeaderProps): React.JSX.Element => {
15
15
  return (
16
16
  <h3
17
- className="mb-3 mt-7 flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.12em] first:mt-0"
17
+ className="mb-3 mt-8 flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.12em] first:mt-0"
18
18
  style={{ color: 'var(--color-text-muted)' }}
19
19
  >
20
- {icon}
20
+ {icon && (
21
+ <span
22
+ className="flex size-4 items-center justify-center rounded opacity-70"
23
+ style={{ backgroundColor: 'var(--color-border-subtle)' }}
24
+ >
25
+ {icon}
26
+ </span>
27
+ )}
21
28
  {title}
22
- <div
23
- className="ml-1 h-px flex-1"
24
- style={{ backgroundColor: 'var(--color-border-subtle)' }}
25
- />
29
+ <div className="ml-1 h-px flex-1" style={{ backgroundColor: 'var(--color-border-subtle)' }} />
26
30
  </h3>
27
31
  );
28
32
  };
@@ -57,15 +57,15 @@ export const SettingsSelect = <T extends string | number>({
57
57
  type="button"
58
58
  onClick={() => !disabled && setIsOpen(!isOpen)}
59
59
  disabled={disabled}
60
- className={`flex h-8 items-center justify-between gap-2 rounded-md border bg-transparent px-2 text-sm transition-all duration-150 focus:outline-none focus:ring-1 focus:ring-[var(--color-border-emphasis)] ${fullWidth ? 'w-full' : 'min-w-[140px]'} ${disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'} ${isOpen ? 'ring-1 ring-[var(--color-border-emphasis)]' : ''} `}
60
+ className={`flex h-8 items-center justify-between gap-2 rounded-lg border bg-transparent px-2.5 text-sm transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-accent-border)] ${fullWidth ? 'w-full' : 'min-w-[140px]'} ${disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer hover:border-[var(--color-border)]'} ${isOpen ? 'border-[var(--color-accent-border)] ring-1 ring-[var(--color-accent-border)]' : ''} `}
61
61
  style={{
62
62
  color: 'var(--color-text-secondary)',
63
- borderColor: isOpen ? 'var(--color-border)' : 'var(--color-border-subtle)',
63
+ borderColor: isOpen ? undefined : 'var(--color-border-subtle)',
64
64
  }}
65
65
  >
66
66
  <span className="truncate">{currentLabel}</span>
67
67
  <ChevronDown
68
- className={`size-4 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}
68
+ className={`size-3.5 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}
69
69
  style={{ color: 'var(--color-text-muted)' }}
70
70
  />
71
71
  </button>
@@ -73,26 +73,29 @@ export const SettingsSelect = <T extends string | number>({
73
73
  {/* Dropdown Menu */}
74
74
  {isOpen && (
75
75
  <div
76
- className={`absolute z-50 min-w-max overflow-hidden rounded-md border py-1 shadow-xl shadow-black/20 ${fullWidth ? 'inset-x-0' : 'right-0'} ${dropUp ? 'bottom-full mb-1' : 'top-full mt-1'}`}
76
+ className={`absolute z-50 min-w-max overflow-hidden rounded-lg border py-1 shadow-xl shadow-black/30 duration-150 animate-in fade-in zoom-in-95 ${fullWidth ? 'inset-x-0' : 'right-0'} ${dropUp ? 'bottom-full mb-1' : 'top-full mt-1.5'}`}
77
77
  style={{
78
78
  backgroundColor: 'var(--color-surface-raised)',
79
79
  borderColor: 'var(--color-border-subtle)',
80
+ boxShadow: '0 10px 30px rgba(0,0,0,0.3), 0 0 18px var(--color-accent-glow)',
80
81
  }}
81
82
  >
83
+ <div className="pointer-events-none absolute inset-x-4 top-0 h-px bg-gradient-to-r from-transparent via-[var(--color-accent-border)] to-transparent" />
82
84
  {options.map((option) => (
83
85
  <button
84
86
  key={String(option.value)}
85
87
  type="button"
86
88
  onClick={() => handleSelect(option.value)}
87
- className={`flex w-full items-center justify-between gap-3 px-3 py-2 text-left text-sm transition-colors duration-100 ${
89
+ className={`flex w-full items-center justify-between gap-3 px-3 py-2 text-left text-sm transition-colors duration-150 ${
88
90
  value === option.value
89
- ? 'bg-indigo-500/10 text-indigo-300'
90
- : 'hover:bg-white/5'
91
+ ? 'bg-[var(--color-accent-muted)] text-[var(--color-accent)]'
92
+ : 'text-[var(--color-text-secondary)] hover:bg-[var(--color-accent-soft)]'
91
93
  } `}
92
- style={value !== option.value ? { color: 'var(--color-text-secondary)' } : undefined}
93
94
  >
94
95
  <span className="whitespace-nowrap">{option.label}</span>
95
- {value === option.value && <Check className="size-4 shrink-0 text-indigo-400" />}
96
+ {value === option.value && (
97
+ <Check className="size-3.5 shrink-0 text-[var(--color-accent)]" />
98
+ )}
96
99
  </button>
97
100
  ))}
98
101
  </div>
@@ -27,17 +27,18 @@ export const SettingsToggle = ({
27
27
  aria-checked={enabled}
28
28
  disabled={disabled}
29
29
  onClick={handleClick}
30
- className="relative inline-flex h-5 w-9 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none focus:ring-2 focus:ring-[var(--color-text)]/20 focus:ring-offset-2 focus:ring-offset-[var(--color-surface)]"
30
+ className="relative inline-flex h-[22px] w-[40px] shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-all duration-200 ease-in-out focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-accent-border)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--color-surface)] active:scale-95"
31
31
  style={{
32
- backgroundColor: enabled ? '#6366f1' : '#3f3f46',
33
- opacity: disabled ? 0.5 : 1,
32
+ backgroundColor: enabled ? 'var(--color-accent)' : '#3f3f46',
33
+ opacity: disabled ? 0.4 : 1,
34
34
  cursor: disabled ? 'not-allowed' : 'pointer',
35
+ boxShadow: enabled ? '0 0 10px var(--color-accent-glow)' : 'none',
35
36
  }}
36
37
  >
37
38
  <span
38
- className="pointer-events-none inline-block size-4 rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out"
39
+ className="pointer-events-none inline-block size-[18px] rounded-full bg-white shadow-sm ring-0 transition-all duration-200 ease-out"
39
40
  style={{
40
- transform: enabled ? 'translateX(1rem)' : 'translateX(0)',
41
+ transform: enabled ? 'translateX(18px)' : 'translateX(0)',
41
42
  }}
42
43
  />
43
44
  </button>
@@ -3,6 +3,7 @@
3
3
  */
4
4
 
5
5
  export { SettingRow } from './SettingRow';
6
+ export { SettingsSectionCard } from './SettingsSectionCard';
6
7
  export { SettingsSectionHeader } from './SettingsSectionHeader';
7
8
  export { SettingsSelect } from './SettingsSelect';
8
9
  export { SettingsToggle } from './SettingsToggle';
@@ -12,9 +12,9 @@ import {
12
12
  import { Textarea } from '@renderer/components/ui/textarea';
13
13
  import { emitOpenHermitEvent, OPEN_HERMIT_EVENTS } from '@renderer/utils/openHermitEvents';
14
14
  import appIcon from '@renderer/favicon.png';
15
- import { Check, FileEdit, Loader2, RotateCcw, X } from 'lucide-react';
15
+ import { Check, FileEdit, Info, Loader2, RotateCcw, ServerCog, X } from 'lucide-react';
16
16
 
17
- import { SettingsSectionHeader } from '../components';
17
+ import { SettingsSectionCard } from '../components';
18
18
 
19
19
  interface CcConnectConfigRawDialogProps {
20
20
  open: boolean;
@@ -105,8 +105,7 @@ const CcConnectConfigRawDialog = ({
105
105
  </div>
106
106
  )}
107
107
  <p className="text-xs text-[var(--color-text-muted)]">
108
- 保存后将直接覆盖 Hermit 管理的配置文件。若修改了端口或
109
- token,请点击”重启服务”生效。
108
+ 保存后将直接覆盖 Hermit 管理的配置文件。若修改了端口或 token,请点击”重启服务”生效。
110
109
  </p>
111
110
  </div>
112
111
  <DialogFooter>
@@ -133,13 +132,20 @@ interface AdvancedSectionProps {
133
132
  }
134
133
 
135
134
  export const AdvancedSection = ({}: AdvancedSectionProps): React.JSX.Element => {
136
- const [version, setVersion] = useState<string>('');
135
+ const [version, setVersion] = useState<string>(__APP_VERSION__);
137
136
  const [ccConfigOpen, setCcConfigOpen] = useState(false);
138
137
  const [restarting, setRestarting] = useState(false);
139
138
  const [restartMsg, setRestartMsg] = useState<string | null>(null);
140
139
 
141
140
  useEffect(() => {
142
- api.getAppVersion().then(setVersion).catch(console.error);
141
+ api
142
+ .getAppVersion()
143
+ .then((nextVersion) => {
144
+ if (typeof nextVersion === 'string' && nextVersion.trim()) {
145
+ setVersion(nextVersion);
146
+ }
147
+ })
148
+ .catch(console.error);
143
149
  }, []);
144
150
 
145
151
  const handleRestart = useCallback(async () => {
@@ -158,61 +164,74 @@ export const AdvancedSection = ({}: AdvancedSectionProps): React.JSX.Element =>
158
164
  }, []);
159
165
 
160
166
  return (
161
- <div>
162
- <SettingsSectionHeader title="服务配置" />
163
- <div className="flex flex-wrap gap-2 py-2">
164
- <button
165
- onClick={() => setCcConfigOpen(true)}
166
- className="flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-all duration-150 hover:bg-indigo-500/5"
167
- style={{
168
- borderColor: 'rgba(99, 102, 241, 0.3)',
169
- color: '#818cf8',
170
- }}
171
- >
172
- <FileEdit className="size-4" />
173
- 编辑 配置
174
- </button>
175
- <button
176
- onClick={() => void handleRestart()}
177
- disabled={restarting}
178
- className="flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-all duration-150 hover:bg-white/5 disabled:cursor-not-allowed disabled:opacity-50"
179
- style={{
180
- borderColor: 'var(--color-border)',
181
- color: 'var(--color-text-muted)',
182
- }}
183
- >
184
- {restarting ? (
185
- <Loader2 className="size-4 animate-spin" />
186
- ) : (
187
- <RotateCcw className="size-4" />
188
- )}
189
- 重启服务
190
- </button>
191
- </div>
192
- {restartMsg && (
193
- <p
194
- className="mb-2 text-xs"
195
- style={{ color: restartMsg.includes('失败') ? '#f87171' : '#4ade80' }}
196
- >
197
- {restartMsg}
198
- </p>
199
- )}
200
-
201
- <SettingsSectionHeader title="关于" />
202
- <div className="flex items-start gap-4 py-3">
203
- <img src={appIcon} alt="应用图标" className="size-10 rounded-lg" />
204
- <div>
205
- <p className="text-sm font-medium" style={{ color: 'var(--color-text)' }}>
206
- Hermit
207
- </p>
208
- <p className="mt-0.5 text-xs" style={{ color: 'var(--color-text-muted)' }}>
209
- Version {version || '...'}
210
- </p>
211
- <p className="mt-2 text-xs leading-relaxed" style={{ color: 'var(--color-text-muted)' }}>
212
- 本地优先的 AI Agent 团队工作台。支持多模型供应商接入、自主任务管理和跨团队协作。
167
+ <div className="space-y-5">
168
+ <SettingsSectionCard
169
+ title="服务配置"
170
+ description="编辑 Hermit 运行配置,或在配置变更后重启本地服务。"
171
+ icon={<ServerCog className="size-3.5" />}
172
+ >
173
+ <div className="flex flex-wrap gap-2 px-3 py-3">
174
+ <button
175
+ onClick={() => setCcConfigOpen(true)}
176
+ className="flex h-8 items-center gap-1.5 rounded-lg border px-3 text-xs font-medium transition-all duration-150 hover:bg-[var(--color-accent-soft)]"
177
+ style={{
178
+ borderColor: 'var(--color-accent-border)',
179
+ color: 'var(--color-accent)',
180
+ }}
181
+ >
182
+ <FileEdit className="size-3.5" />
183
+ 编辑配置
184
+ </button>
185
+ <button
186
+ onClick={() => void handleRestart()}
187
+ disabled={restarting}
188
+ className="flex h-8 items-center gap-1.5 rounded-lg border px-3 text-xs font-medium transition-all duration-150 hover:bg-[var(--color-accent-soft)] disabled:cursor-not-allowed disabled:opacity-50"
189
+ style={{
190
+ borderColor: 'var(--color-border-subtle)',
191
+ color: 'var(--color-text-secondary)',
192
+ }}
193
+ >
194
+ {restarting ? (
195
+ <Loader2 className="size-3.5 animate-spin" />
196
+ ) : (
197
+ <RotateCcw className="size-3.5" />
198
+ )}
199
+ 重启服务
200
+ </button>
201
+ </div>
202
+ {restartMsg && (
203
+ <p
204
+ className="px-3 pb-3 text-xs"
205
+ style={{ color: restartMsg.includes('失败') ? '#f87171' : 'var(--color-accent)' }}
206
+ >
207
+ {restartMsg}
213
208
  </p>
209
+ )}
210
+ </SettingsSectionCard>
211
+
212
+ <SettingsSectionCard
213
+ title="关于"
214
+ description="当前应用版本和产品信息。"
215
+ icon={<Info className="size-3.5" />}
216
+ >
217
+ <div className="flex items-start gap-4 px-3 py-3">
218
+ <img src={appIcon} alt="应用图标" className="size-10 rounded-lg" />
219
+ <div>
220
+ <p className="text-sm font-medium" style={{ color: 'var(--color-text)' }}>
221
+ Hermit
222
+ </p>
223
+ <p className="mt-0.5 text-xs" style={{ color: 'var(--color-text-muted)' }}>
224
+ Version {version || '...'}
225
+ </p>
226
+ <p
227
+ className="mt-2 text-xs leading-relaxed"
228
+ style={{ color: 'var(--color-text-muted)' }}
229
+ >
230
+ 本地优先的 AI Agent 团队工作台。支持多模型供应商接入、自主任务管理和跨团队协作。
231
+ </p>
232
+ </div>
214
233
  </div>
215
- </div>
234
+ </SettingsSectionCard>
216
235
 
217
236
  <CcConnectConfigRawDialog open={ccConfigOpen} onClose={() => setCcConfigOpen(false)} />
218
237
  </div>
@@ -7,15 +7,16 @@
7
7
 
8
8
  import { useCallback, useEffect, useMemo, useState } from 'react';
9
9
 
10
+ import { providersApi } from '@renderer/api/providers';
10
11
  import { confirm } from '@renderer/components/common/ConfirmDialog';
11
- import { ProviderBrandLogo } from '@renderer/components/common/ProviderBrandLogo';
12
12
  import {
13
13
  getProviderConnectLabel,
14
14
  getProviderDisconnectAction,
15
15
  shouldShowProviderConnectAction,
16
16
  } from '@renderer/components/runtime/providerConnectionUi';
17
17
  import { ProviderRuntimeSettingsDialog } from '@renderer/components/runtime/ProviderRuntimeSettingsDialog';
18
- import { ALL_AGENT_TYPES, AGENT_TYPE_LABELS } from '@renderer/components/team/HarnessCards';
18
+ import { AGENT_TYPE_LABELS, ALL_AGENT_TYPES } from '@renderer/components/team/HarnessCards';
19
+ import { HarnessIcon } from '@renderer/components/team/HarnessSelect';
19
20
  import {
20
21
  Dialog,
21
22
  DialogContent,
@@ -25,7 +26,6 @@ import {
25
26
  } from '@renderer/components/ui/dialog';
26
27
  import { Input } from '@renderer/components/ui/input';
27
28
  import { useCliInstaller } from '@renderer/hooks/useCliInstaller';
28
- import { providersApi } from '@renderer/api/providers';
29
29
  import { useStore } from '@renderer/store';
30
30
  import { createLoadingMultimodelCliStatus } from '@renderer/store/slices/cliInstallerSlice';
31
31
  import { getMainScreenCliProviders } from '@renderer/utils/claudeCodeOnlyProviders';
@@ -41,7 +41,6 @@ import {
41
41
  Loader2,
42
42
  LogIn,
43
43
  LogOut,
44
- Puzzle,
45
44
  RefreshCw,
46
45
  SlidersHorizontal,
47
46
  Terminal,
@@ -153,7 +152,6 @@ export const CliStatusSection = ({
153
152
  const selectedProjectId = useStore((s) => s.selectedProjectId);
154
153
  const projects = useStore((s) => s.projects);
155
154
  const repositoryGroups = useStore((s) => s.repositoryGroups);
156
- const openExtensionsTab = useStore((s) => s.openExtensionsTab);
157
155
  const updateConfig = useStore((s) => s.updateConfig);
158
156
  const {
159
157
  cliStatus,
@@ -196,7 +194,6 @@ export const CliStatusSection = ({
196
194
  () => getMainScreenCliProviders(effectiveCliStatus),
197
195
  [effectiveCliStatus]
198
196
  );
199
- const canOpenExtensions = effectiveCliStatus?.installed === true;
200
197
  const showInstalledControls =
201
198
  effectiveCliStatus !== null && (installerState === 'idle' || installerState === 'completed');
202
199
 
@@ -400,21 +397,6 @@ export const CliStatusSection = ({
400
397
  {runtimeLabel && (
401
398
  <span style={{ color: 'var(--color-text)' }}>{runtimeLabel}</span>
402
399
  )}
403
- {/* Extensions button — right-aligned */}
404
- {canOpenExtensions && (
405
- <button
406
- type="button"
407
- onClick={openExtensionsTab}
408
- className="ml-auto flex items-center gap-1.5 rounded-md border px-2.5 py-1 text-xs font-medium transition-colors hover:bg-white/5"
409
- style={{
410
- borderColor: 'var(--color-border)',
411
- color: 'var(--color-text-secondary)',
412
- }}
413
- >
414
- <Puzzle className="size-3.5" />
415
- 扩展
416
- </button>
417
- )}
418
400
  </div>
419
401
  {effectiveCliStatus.showBinaryPath && effectiveCliStatus.binaryPath && (
420
402
  <p
@@ -436,24 +418,17 @@ export const CliStatusSection = ({
436
418
  key={agentType}
437
419
  className="flex items-center gap-3 rounded-lg border px-3.5 py-2.5 transition-colors"
438
420
  style={{
439
- borderColor: hasProviders ? 'var(--color-border-emphasis)' : 'var(--color-border-subtle)',
421
+ borderColor: hasProviders
422
+ ? 'var(--color-border-emphasis)'
423
+ : 'var(--color-border-subtle)',
440
424
  backgroundColor: 'var(--color-surface-raised)',
441
425
  borderLeftWidth: hasProviders ? '2px' : '1px',
442
- borderLeftColor: hasProviders ? 'var(--color-accent)' : 'var(--color-border-subtle)',
443
- opacity: hasProviders ? 1 : 0.5,
426
+ borderLeftColor: hasProviders
427
+ ? 'var(--color-accent)'
428
+ : 'var(--color-border-subtle)',
444
429
  }}
445
430
  >
446
- {provider ? (
447
- <ProviderBrandLogo
448
- providerId={provider.providerId}
449
- className="size-4 shrink-0"
450
- />
451
- ) : (
452
- <Terminal
453
- className="size-4 shrink-0"
454
- style={{ color: 'var(--color-text-muted)' }}
455
- />
456
- )}
431
+ <HarnessIcon type={agentType} className="size-4 shrink-0" />
457
432
  <div className="min-w-0 flex-1">
458
433
  <div className="flex items-center gap-1.5">
459
434
  <span
@@ -465,7 +440,10 @@ export const CliStatusSection = ({
465
440
  {provider?.providerId === 'codex' ? <ProviderBetaBadge /> : null}
466
441
  </div>
467
442
  {hasProviders && (
468
- <span className="text-[10px]" style={{ color: 'var(--color-text-muted)' }}>
443
+ <span
444
+ className="text-[10px]"
445
+ style={{ color: 'var(--color-text-muted)' }}
446
+ >
469
447
  {harnessProviders.length} provider
470
448
  </span>
471
449
  )}
@@ -811,7 +789,7 @@ const GenericHarnessProviderDialog = ({
811
789
 
812
790
  {loading && providers.length === 0 ? (
813
791
  <div
814
- className="flex items-center gap-2 rounded-md border px-3 py-3 text-xs"
792
+ className="flex items-center gap-2 rounded-md border p-3 text-xs"
815
793
  style={{
816
794
  borderColor: 'var(--color-border-subtle)',
817
795
  color: 'var(--color-text-muted)',
@@ -845,10 +823,14 @@ const GenericHarnessProviderDialog = ({
845
823
  key={provider.name}
846
824
  className="rounded-lg border px-3.5 py-2.5"
847
825
  style={{
848
- borderColor: provider.api_key ? 'var(--color-border)' : 'var(--color-border-subtle)',
826
+ borderColor: provider.api_key
827
+ ? 'var(--color-border)'
828
+ : 'var(--color-border-subtle)',
849
829
  backgroundColor: 'var(--color-surface-raised)',
850
830
  borderLeftWidth: provider.api_key ? '2px' : '1px',
851
- borderLeftColor: provider.api_key ? 'var(--color-accent)' : 'var(--color-border-subtle)',
831
+ borderLeftColor: provider.api_key
832
+ ? 'var(--color-accent)'
833
+ : 'var(--color-border-subtle)',
852
834
  }}
853
835
  >
854
836
  <div className="flex items-center justify-between gap-2">
@@ -859,13 +841,19 @@ const GenericHarnessProviderDialog = ({
859
841
  backgroundColor: provider.api_key ? 'var(--color-accent)' : '#fbbf24',
860
842
  }}
861
843
  />
862
- <span className="text-sm font-medium" style={{ color: 'var(--color-text)' }}>
844
+ <span
845
+ className="text-sm font-medium"
846
+ style={{ color: 'var(--color-text)' }}
847
+ >
863
848
  {provider.name}
864
849
  </span>
865
850
  </div>
866
- <span className="text-[10px]" style={{
867
- color: provider.api_key ? 'var(--color-accent)' : '#fbbf24',
868
- }}>
851
+ <span
852
+ className="text-[10px]"
853
+ style={{
854
+ color: provider.api_key ? 'var(--color-accent)' : '#fbbf24',
855
+ }}
856
+ >
869
857
  {provider.api_key ? 'Key 已配置' : '未配置'}
870
858
  </span>
871
859
  </div>
@@ -883,7 +871,7 @@ const GenericHarnessProviderDialog = ({
883
871
  </div>
884
872
  ) : (
885
873
  <div
886
- className="rounded-md border px-3 py-3 text-xs"
874
+ className="rounded-md border p-3 text-xs"
887
875
  style={{
888
876
  borderColor: 'var(--color-border-subtle)',
889
877
  color: 'var(--color-text-muted)',
@@ -346,7 +346,7 @@ const SaveStatusBadge = ({
346
346
  return (
347
347
  <span
348
348
  className="flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px]"
349
- style={{ backgroundColor: 'rgba(129, 140, 248, 0.15)', color: '#818cf8' }}
349
+ style={{ backgroundColor: 'var(--color-accent-muted)', color: 'var(--color-accent)' }}
350
350
  >
351
351
  <Loader2 className="size-3 animate-spin" />
352
352
  保存中...