@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.
- package/README.md +98 -89
- package/bin/hermit.mjs +96 -0
- package/dist-renderer/assets/{ProjectEditorOverlay-Br0X83Jf.js → ProjectEditorOverlay-C98qSs7-.js} +1 -1
- package/dist-renderer/assets/{TeamGraphOverlay-DHMTbZPZ.js → TeamGraphOverlay-CsBbZwcL.js} +1 -1
- package/dist-renderer/assets/{_basePickBy-DzIiX7yH.js → _basePickBy-ZOyLWjMK.js} +1 -1
- package/dist-renderer/assets/{_baseUniq-6hZuzTLU.js → _baseUniq-DBb726rt.js} +1 -1
- package/dist-renderer/assets/{arc-CXgO6fx_.js → arc-CdiTaR_R.js} +1 -1
- package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-DKWgtDHr.js → architectureDiagram-VXUJARFQ-Cz3sc5TH.js} +1 -1
- package/dist-renderer/assets/{blockDiagram-VD42YOAC-DOMUcC40.js → blockDiagram-VD42YOAC-DE4c-KJ3.js} +1 -1
- package/dist-renderer/assets/{c4Diagram-YG6GDRKO-B_k2L7qX.js → c4Diagram-YG6GDRKO-CmTMDTrV.js} +1 -1
- package/dist-renderer/assets/channel-KTpqi9eT.js +1 -0
- package/dist-renderer/assets/{chunk-4BX2VUAB-BeD_ccFy.js → chunk-4BX2VUAB-rhHy3tFl.js} +1 -1
- package/dist-renderer/assets/{chunk-55IACEB6-ClZfkA5w.js → chunk-55IACEB6-fLZBzuo_.js} +1 -1
- package/dist-renderer/assets/{chunk-B4BG7PRW-5XluxXsn.js → chunk-B4BG7PRW-DOzxQhim.js} +1 -1
- package/dist-renderer/assets/{chunk-DI55MBZ5-BzIjjNVm.js → chunk-DI55MBZ5-COQCcXC5.js} +1 -1
- package/dist-renderer/assets/{chunk-FMBD7UC4-HgH3MK_H.js → chunk-FMBD7UC4-IKU9U_Y4.js} +1 -1
- package/dist-renderer/assets/{chunk-QN33PNHL-WeC5T3Ba.js → chunk-QN33PNHL-D6WV154X.js} +1 -1
- package/dist-renderer/assets/{chunk-QZHKN3VN-Cu1ApHfW.js → chunk-QZHKN3VN-D90_2DQp.js} +1 -1
- package/dist-renderer/assets/{chunk-TZMSLE5B-BOhlynJM.js → chunk-TZMSLE5B-BQEil57G.js} +1 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-lpzulY5X.js +1 -0
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-lpzulY5X.js +1 -0
- package/dist-renderer/assets/clone-CriGymY9.js +1 -0
- package/dist-renderer/assets/{cose-bilkent-S5V4N54A-DGZSihDQ.js → cose-bilkent-S5V4N54A-6WiK6U2P.js} +1 -1
- package/dist-renderer/assets/{dagre-6UL2VRFP-CnxwCbku.js → dagre-6UL2VRFP-DF4MMuTn.js} +1 -1
- package/dist-renderer/assets/{diagram-PSM6KHXK-DsIhoxdI.js → diagram-PSM6KHXK-CcF1eZ7E.js} +1 -1
- package/dist-renderer/assets/{diagram-QEK2KX5R-Cmh9KUF5.js → diagram-QEK2KX5R-DYlOVPQB.js} +1 -1
- package/dist-renderer/assets/{diagram-S2PKOQOG-CKxV456A.js → diagram-S2PKOQOG-BHXWsZOP.js} +1 -1
- package/dist-renderer/assets/{erDiagram-Q2GNP2WA-EnvYjOjc.js → erDiagram-Q2GNP2WA-GjmuBx8d.js} +1 -1
- package/dist-renderer/assets/{flowDiagram-NV44I4VS-BmNeWY_A.js → flowDiagram-NV44I4VS-BuS7YVHk.js} +1 -1
- package/dist-renderer/assets/{ganttDiagram-JELNMOA3-D30fyK-u.js → ganttDiagram-JELNMOA3-3Teu5tAa.js} +1 -1
- package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-CrUNiYg1.js → gitGraphDiagram-V2S2FVAM-BiLdCYu5.js} +1 -1
- package/dist-renderer/assets/{graph-CY1gTfTb.js → graph-CDP_R8ct.js} +1 -1
- package/dist-renderer/assets/{index-CaEbzwAU.js → index-BSZdT-g-.js} +1 -1
- package/dist-renderer/assets/{index-D5K-SjBG.js → index-BhWvMqsz.js} +1 -1
- package/dist-renderer/assets/{index-9_hO4N1e.js → index-C2_AupSj.js} +1 -1
- package/dist-renderer/assets/{index-59r209c1.js → index-C5ujiwAR.js} +580 -588
- package/dist-renderer/assets/index-CIS2CTK9.css +1 -0
- package/dist-renderer/assets/{index-DMR9B1UP.js → index-CVNjLwkq.js} +1 -1
- package/dist-renderer/assets/{index-BC2hXmg_.js → index-CwG3se0q.js} +1 -1
- package/dist-renderer/assets/{infoDiagram-HS3SLOUP-By_XUlcD.js → infoDiagram-HS3SLOUP-DLHUFo72.js} +1 -1
- package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-BM1LJE9m.js → journeyDiagram-XKPGCS4Q-BE07RpJD.js} +1 -1
- package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-DHIW3aTA.js → kanban-definition-3W4ZIXB7-DDHZy4NB.js} +1 -1
- package/dist-renderer/assets/{layout-DAKiL_Mo.js → layout-5nA5wUxO.js} +1 -1
- package/dist-renderer/assets/{linear-DwOaRYea.js → linear-BtF1i2qN.js} +1 -1
- package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-b7bJ2cha.js → mindmap-definition-VGOIOE7T-Z1Ui9Sqy.js} +1 -1
- package/dist-renderer/assets/{pieDiagram-ADFJNKIX-DxyL9Zr2.js → pieDiagram-ADFJNKIX-LCjxckWv.js} +1 -1
- package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-CR33pHlF.js → quadrantDiagram-AYHSOK5B-BOwKjSco.js} +1 -1
- package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-BAiSRSlh.js → requirementDiagram-UZGBJVZJ-pChP8Znd.js} +1 -1
- package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-C8JmDjoa.js → sankeyDiagram-TZEHDZUN-DifZ2qpo.js} +1 -1
- package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-c1d0Wi1m.js → sequenceDiagram-WL72ISMW-CJg-WYyY.js} +1 -1
- package/dist-renderer/assets/{splashScene-D0YB9uxm.js → splashScene-94xWCzLA.js} +1 -1
- package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-nT8BiH2O.js → stateDiagram-FKZM4ZOC-DWHOoFdv.js} +1 -1
- package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-CGYZOoMb.js +1 -0
- package/dist-renderer/assets/{timeline-definition-IT6M3QCI-DpoRepUA.js → timeline-definition-IT6M3QCI-CPgokIo8.js} +1 -1
- package/dist-renderer/assets/{treemap-GDKQZRPO-C41UJeIH.js → treemap-GDKQZRPO-DAVqSR9L.js} +1 -1
- package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-KMjGARKN.js → xychartDiagram-PRI3JC2R-CCOcGbrD.js} +1 -1
- package/dist-renderer/chat-community-qr.jpg +0 -0
- package/dist-renderer/fonts/Agave-Bold.ttf +0 -0
- package/dist-renderer/fonts/Agave-Regular.ttf +0 -0
- package/dist-renderer/icon.png +0 -0
- package/dist-renderer/icon.rar +0 -0
- package/dist-renderer/index.html +3 -3
- package/package.json +21 -26
- package/src/features/worker-society/core/application/WorkerSocietyService.test.ts +802 -0
- package/src/features/worker-society/core/application/WorkerSocietyService.ts +428 -0
- package/src/features/worker-society/core/application/fakes.ts +101 -0
- package/src/features/worker-society/core/application/ports.ts +70 -0
- package/src/features/worker-society/core/domain/models/society.ts +141 -0
- package/src/features/worker-society/core/domain/policies/societyPolicies.test.ts +739 -0
- package/src/features/worker-society/core/domain/policies/societyPolicies.ts +496 -0
- package/src/features/worker-society/main/adapters/input/societyMcp.test.ts +317 -0
- package/src/features/worker-society/main/adapters/input/societyMcp.ts +257 -0
- package/src/features/worker-society/main/adapters/input/societyRoutes.test.ts +695 -0
- package/src/features/worker-society/main/adapters/input/societyRoutes.ts +194 -0
- package/src/features/worker-society/main/composition/societyComposition.test.ts +74 -0
- package/src/features/worker-society/main/composition/societyComposition.ts +70 -0
- package/src/features/worker-society/main/composition/workerSocietyPlugin.test.ts +69 -0
- package/src/features/worker-society/main/composition/workerSocietyPlugin.ts +67 -0
- package/src/features/worker-society/main/infrastructure/crossTeamMessageGateway.test.ts +132 -0
- package/src/features/worker-society/main/infrastructure/crossTeamMessageGateway.ts +84 -0
- package/src/features/worker-society/main/infrastructure/fsStores.test.ts +216 -0
- package/src/features/worker-society/main/infrastructure/fsStores.ts +113 -0
- package/src/features/worker-society/main/infrastructure/mergingProfileStore.test.ts +195 -0
- package/src/features/worker-society/main/infrastructure/mergingProfileStore.ts +96 -0
- package/src/features/worker-society/renderer/SocietyGraph.tsx +166 -0
- package/src/features/worker-society/renderer/SocietyNodeLabels.tsx +139 -0
- package/src/features/worker-society/renderer/SocietyNodeOverlay.tsx +339 -0
- package/src/features/worker-society/renderer/SocietyView.tsx +437 -0
- package/src/features/worker-society/renderer/index.ts +11 -0
- package/src/features/worker-society/renderer/societyApi.test.ts +259 -0
- package/src/features/worker-society/renderer/societyApi.ts +144 -0
- package/src/features/worker-society/renderer/societyGraphAdapter.test.ts +321 -0
- package/src/features/worker-society/renderer/societyGraphAdapter.ts +240 -0
- package/src/features/worker-society/renderer/societyOverlayActions.test.ts +57 -0
- package/src/features/worker-society/renderer/societyOverlayActions.ts +49 -0
- package/src/features/worker-society/renderer/societyStore.test.ts +218 -0
- package/src/features/worker-society/renderer/societyStore.ts +146 -0
- package/src/features/worker-society/renderer/societyViewUtils.test.ts +81 -0
- package/src/features/worker-society/renderer/societyViewUtils.ts +68 -0
- package/src/main/ipc/extensions.ts +27 -0
- package/src/main/server.ts +1731 -539
- package/src/main/services/ccConnect/CcConnectBridge.ts +26 -11
- package/src/main/services/ccConnect/CcConnectClient.ts +9 -2
- package/src/main/services/ccConnect/workDirReconcile.test.ts +57 -0
- package/src/main/services/ccConnect/workDirReconcile.ts +36 -0
- package/src/main/services/direct-cli/DirectCliSessionManager.test.ts +397 -0
- package/src/main/services/direct-cli/DirectCliSessionManager.ts +508 -0
- package/src/main/services/direct-cli/DirectCliSessionStore.test.ts +79 -0
- package/src/main/services/direct-cli/DirectCliSessionStore.ts +97 -0
- package/src/main/services/direct-cli/__tests__/directCliMessageId.test.ts +40 -0
- package/src/main/services/direct-cli/directCliMessageId.ts +21 -0
- package/src/main/services/direct-cli/index.ts +17 -0
- package/src/main/services/extensions/capability-packs/CapabilityPackLoaderService.ts +637 -0
- package/src/main/services/extensions/catalog/PluginCatalogService.ts +2 -2
- package/src/main/services/loop-assets/LoopAssetsScannerService.ts +657 -0
- package/src/main/services/runtime/providerAwareCliEnv.ts +33 -5
- package/src/main/services/session-intelligence/LocalSessionScanner.ts +156 -71
- package/src/main/services/session-intelligence/SessionUsageParser.ts +103 -8
- package/src/main/services/session-intelligence/UsageTelemetryService.ts +11 -0
- package/src/main/services/session-intelligence/__tests__/teamSessionListMapper.test.ts +104 -0
- package/src/main/services/session-intelligence/teamSessionListMapper.ts +78 -0
- package/src/main/services/system-manager/AdminLoopInitializer.ts +95 -0
- package/src/main/services/system-manager/BuiltinWorkflowSeeder.ts +744 -0
- package/src/main/services/system-manager/SystemManagerConfigService.ts +19 -1
- package/src/main/services/system-manager/WorkflowPromptService.ts +58 -5
- package/src/main/services/system-manager/__tests__/AdminLoopInitializer.test.ts +129 -0
- package/src/main/services/system-manager/__tests__/SystemManagerConfigService.test.ts +60 -0
- package/src/main/services/teams-mvp/CollaborationBoardService.ts +2 -0
- package/src/main/services/teams-mvp/OpsRunbookContext.ts +60 -0
- package/src/main/services/teams-mvp/TaskDispatchService.test.ts +305 -0
- package/src/main/services/teams-mvp/TaskDispatchService.ts +250 -131
- package/src/main/services/teams-mvp/TeamProvisioningService.ts +12 -2
- package/src/main/services/teams-mvp/TeamWorkspaceService.test.ts +207 -0
- package/src/main/services/teams-mvp/TeamWorkspaceService.ts +104 -51
- package/src/main/services/teams-mvp/index.ts +6 -0
- package/src/main/utils/externalPlatformSessionRouting.ts +92 -0
- package/src/main/utils/toolApprovalRules.ts +151 -0
- package/src/renderer/App.tsx +24 -89
- package/src/renderer/api/httpClient.ts +132 -52
- package/src/renderer/api/providers.ts +5 -16
- package/src/renderer/components/chat/CommunityChatView.tsx +81 -0
- package/src/renderer/components/dashboard/DashboardView.tsx +130 -84
- package/src/renderer/components/extensions/ExtensionStoreView.tsx +39 -5
- package/src/renderer/components/extensions/ExtensionsSubTabTrigger.tsx +2 -1
- package/src/renderer/components/extensions/capability-packs/CapabilityPacksPanel.tsx +170 -0
- package/src/renderer/components/layout/PaneContent.tsx +10 -2
- package/src/renderer/components/layout/SortableTab.tsx +4 -0
- package/src/renderer/components/layout/TabBarActions.tsx +13 -16
- package/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx +4 -135
- package/src/renderer/components/schedules/SchedulesView.tsx +22 -14
- package/src/renderer/components/schedules/calendar/CalendarEventBlock.tsx +7 -6
- package/src/renderer/components/settings/SettingsTabs.tsx +24 -21
- package/src/renderer/components/settings/SettingsView.tsx +22 -13
- package/src/renderer/components/settings/components/SettingRow.tsx +13 -5
- package/src/renderer/components/settings/components/SettingsSectionCard.tsx +53 -0
- package/src/renderer/components/settings/components/SettingsSectionHeader.tsx +10 -6
- package/src/renderer/components/settings/components/SettingsSelect.tsx +12 -9
- package/src/renderer/components/settings/components/SettingsToggle.tsx +6 -5
- package/src/renderer/components/settings/components/index.ts +1 -0
- package/src/renderer/components/settings/sections/AdvancedSection.tsx +78 -59
- package/src/renderer/components/settings/sections/CliStatusSection.tsx +32 -44
- package/src/renderer/components/settings/sections/ConfigEditorDialog.tsx +1 -1
- package/src/renderer/components/settings/sections/GeneralSection.tsx +216 -186
- package/src/renderer/components/settings/sections/PlatformsSection.tsx +25 -17
- package/src/renderer/components/settings/sections/TaskBusSection.tsx +63 -22
- package/src/renderer/components/sidebar/SidebarSessions.tsx +120 -80
- package/src/renderer/components/sidebar/SidebarTaskItem.tsx +1 -1
- package/src/renderer/components/splash/splashScene.ts +6 -2
- package/src/renderer/components/system-manager/SystemManagerView.tsx +169 -255
- package/src/renderer/components/tasks/TasksView.tsx +63 -37
- package/src/renderer/components/team/CcSessionsSection.tsx +124 -89
- package/src/renderer/components/team/HarnessBrandLogos.tsx +318 -0
- package/src/renderer/components/team/HarnessSelect.tsx +25 -26
- package/src/renderer/components/team/TeamDetailView.tsx +137 -153
- package/src/renderer/components/team/TeamEmptyState.tsx +9 -37
- package/src/renderer/components/team/TeamListView.tsx +144 -30
- package/src/renderer/components/team/__tests__/CcSessionsSection.hasLocalFile.test.tsx +128 -0
- package/src/renderer/components/team/activity/ActivityItem.tsx +21 -9
- package/src/renderer/components/team/activity/ActivityTimeline.tsx +2 -2
- package/src/renderer/components/team/dialogs/AdvancedCliSection.tsx +1 -1
- package/src/renderer/components/team/dialogs/CreateTaskDialog.tsx +13 -10
- package/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +189 -57
- package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +9 -157
- package/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx +19 -15
- package/src/renderer/components/team/dialogs/PlatformBindingDialog.tsx +48 -10
- package/src/renderer/components/team/dialogs/PlatformManualForm.tsx +11 -12
- package/src/renderer/components/team/dialogs/PlatformSetupQR.tsx +39 -37
- package/src/renderer/components/team/dialogs/RuntimeConfigDialog.tsx +434 -64
- package/src/renderer/components/team/dialogs/SendMessageDialog.tsx +12 -10
- package/src/renderer/components/team/dialogs/TaskDetailDialog.tsx +2 -2
- package/src/renderer/components/team/dialogs/__tests__/CreateTeamDialog.bindProject.test.tsx +399 -0
- package/src/renderer/components/team/dialogs/__tests__/CreateTeamDialog.chineseRepro.test.tsx +253 -0
- package/src/renderer/components/team/dialogs/platformAllowUtils.ts +91 -0
- package/src/renderer/components/team/dialogs/teammateRuntimeCompatibility.tsx +1 -1
- package/src/renderer/components/team/kanban/KanbanTaskCard.test.tsx +41 -0
- package/src/renderer/components/team/kanban/KanbanTaskCard.tsx +41 -86
- package/src/renderer/components/team/loop-console/LoopCommandComposer.tsx +310 -0
- package/src/renderer/components/team/loop-console/LoopConsolePanel.tsx +372 -0
- package/src/renderer/components/team/loop-console/loopSendIntent.test.ts +85 -0
- package/src/renderer/components/team/loop-console/loopSendIntent.ts +221 -0
- package/src/renderer/components/team/loop-console/useLeadSessionToolActivity.ts +74 -0
- package/src/renderer/components/team/loop-console/useLoopCommandSuggestions.ts +165 -0
- package/src/renderer/components/team/loop-console/useLoopConsoleController.ts +266 -0
- package/src/renderer/components/team/members/LeadModelRow.test.tsx +1 -1
- package/src/renderer/components/team/members/LeadModelRow.tsx +5 -3
- package/src/renderer/components/team/members/MemberDetailDialog.tsx +11 -0
- package/src/renderer/components/team/members/MemberDetailStats.tsx +13 -3
- package/src/renderer/components/team/members/MemberDraftRow.test.tsx +1 -1
- package/src/renderer/components/team/members/MemberDraftRow.tsx +1 -1
- package/src/renderer/components/team/members/MemberMessagesTab.tsx +2 -2
- package/src/renderer/components/team/members/MemberStatsTab.tsx +1 -1
- package/src/renderer/components/team/messages/MessageComposer.tsx +150 -44
- package/src/renderer/components/team/messages/MessagesFilterPopover.tsx +2 -2
- package/src/renderer/components/team/messages/MessagesPanel.tsx +34 -28
- package/src/renderer/components/team/schedule/CcCronScheduleDialog.tsx +6 -6
- package/src/renderer/components/team/taskLogs/ExactTaskLogCard.tsx +2 -2
- package/src/renderer/components/team/taskLogs/TaskLogStreamSection.tsx +1 -1
- package/src/renderer/components/terminal/TerminalPanel.tsx +2 -3
- package/src/renderer/components/ui/MentionableTextarea.tsx +5 -1
- package/src/renderer/constants/teamColors.ts +5 -5
- package/src/renderer/hooks/useExtensionsTabState.ts +1 -1
- package/src/renderer/hooks/useMentionDetection.ts +5 -1
- package/src/renderer/hooks/useProjectWorkflowCommands.ts +57 -0
- package/src/renderer/hooks/useTeamSuggestions.ts +2 -0
- package/src/renderer/index.css +19 -2
- package/src/renderer/main.tsx +7 -1
- package/src/renderer/store/index.ts +18 -1
- package/src/renderer/store/slices/extensionsSlice.ts +83 -0
- package/src/renderer/store/slices/tabSlice.ts +61 -0
- package/src/renderer/store/slices/teamSlice.ts +138 -9
- package/src/renderer/types/mention.ts +8 -0
- package/src/renderer/types/tabs.ts +3 -1
- package/src/renderer/utils/__tests__/bindProjectSlug.test.ts +69 -0
- package/src/renderer/utils/__tests__/groupTransformer.test.ts +148 -0
- package/src/renderer/utils/__tests__/initialRoute.test.ts +101 -0
- package/src/renderer/utils/__tests__/leadToolActivity.test.ts +124 -0
- package/src/renderer/utils/__tests__/mergeTeamMessages.test.ts +81 -0
- package/src/renderer/utils/__tests__/teamMessageFiltering.test.ts +213 -0
- package/src/renderer/utils/__tests__/teamMessageKey.test.ts +75 -0
- package/src/renderer/utils/__tests__/workflowCommandExecution.test.ts +173 -0
- package/src/renderer/utils/__tests__/workflowCommandSuggestions.test.ts +59 -0
- package/src/renderer/utils/bindProjectSlug.ts +57 -0
- package/src/renderer/utils/capabilityCommandExecution.ts +113 -0
- package/src/renderer/utils/initialRoute.ts +89 -0
- package/src/renderer/utils/leadToolActivity.ts +117 -0
- package/src/renderer/utils/loopShortcutSuggestions.ts +106 -0
- package/src/renderer/utils/mentionSuggestions.ts +1 -1
- package/src/renderer/utils/slashCommandRegistry.ts +231 -0
- package/src/renderer/utils/teamMentionDirective.ts +31 -0
- package/src/renderer/utils/workflowCommandExecution.ts +96 -0
- package/src/renderer/utils/workflowCommandSuggestions.ts +49 -0
- package/src/shared/types/api.ts +79 -4
- package/src/shared/types/ccConnect.ts +1 -0
- package/src/shared/types/extensions/api.ts +19 -0
- package/src/shared/types/extensions/capabilityPack.ts +118 -0
- package/src/shared/types/extensions/index.ts +29 -1
- package/src/shared/types/index.ts +6 -0
- package/src/shared/types/loopAssets.ts +54 -0
- package/src/shared/types/providers.ts +0 -16
- package/src/shared/types/systemManager.ts +26 -1
- package/src/shared/types/team.ts +43 -3
- package/src/shared/types/terminal.ts +2 -36
- package/src/shared/types/worker.test.ts +28 -0
- package/src/shared/types/worker.ts +3 -0
- package/src/shared/utils/__tests__/effortLevels.test.ts +88 -0
- package/src/shared/utils/__tests__/providerBackend.test.ts +88 -0
- package/src/shared/utils/__tests__/providerLaunchArgs.test.ts +220 -0
- package/src/shared/utils/claudeStreamJson.test.ts +187 -0
- package/src/shared/utils/claudeStreamJson.ts +153 -0
- package/src/shared/utils/providerLaunchArgs.ts +217 -0
- package/src/shared/utils/slashCommands.ts +10 -0
- package/src/types/node-pty.d.ts +8 -0
- package/dist-renderer/assets/channel-D0XS_akr.js +0 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-D13Ffs0U.js +0 -1
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-D13Ffs0U.js +0 -1
- package/dist-renderer/assets/clone-B1ZrxI1D.js +0 -1
- package/dist-renderer/assets/index-iyjkpSus.css +0 -32
- package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-Dmibmlso.js +0 -1
- package/src/main/services/system-manager/SystemManagerPtyService.ts +0 -233
- package/src/renderer/components/common/TerminalPane.tsx +0 -213
- 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 {
|
|
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 {
|
package/src/shared/types/team.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
*
|
|
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
|
-
/**
|
|
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
|
+
});
|