@yancyyu/openhermit 1.6.42 → 1.6.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -89
- package/bin/hermit.mjs +96 -0
- package/dist-renderer/assets/{ProjectEditorOverlay-DlFQ6mai.js → ProjectEditorOverlay-C98qSs7-.js} +1 -1
- package/dist-renderer/assets/{TeamGraphOverlay-D2TPMPGR.js → TeamGraphOverlay-CsBbZwcL.js} +1 -1
- package/dist-renderer/assets/{_basePickBy-Cmd0RHLQ.js → _basePickBy-ZOyLWjMK.js} +1 -1
- package/dist-renderer/assets/{_baseUniq-BI_iy8ea.js → _baseUniq-DBb726rt.js} +1 -1
- package/dist-renderer/assets/{arc-NzW2mjTP.js → arc-CdiTaR_R.js} +1 -1
- package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-Bzq85AYv.js → architectureDiagram-VXUJARFQ-Cz3sc5TH.js} +1 -1
- package/dist-renderer/assets/{blockDiagram-VD42YOAC-D1PvYS-b.js → blockDiagram-VD42YOAC-DE4c-KJ3.js} +1 -1
- package/dist-renderer/assets/{c4Diagram-YG6GDRKO-D49RKzPC.js → c4Diagram-YG6GDRKO-CmTMDTrV.js} +1 -1
- package/dist-renderer/assets/channel-KTpqi9eT.js +1 -0
- package/dist-renderer/assets/{chunk-4BX2VUAB-fmI_MQmQ.js → chunk-4BX2VUAB-rhHy3tFl.js} +1 -1
- package/dist-renderer/assets/{chunk-55IACEB6-Xsv9RCXZ.js → chunk-55IACEB6-fLZBzuo_.js} +1 -1
- package/dist-renderer/assets/{chunk-B4BG7PRW-BE1KO8Um.js → chunk-B4BG7PRW-DOzxQhim.js} +1 -1
- package/dist-renderer/assets/{chunk-DI55MBZ5-tqJ7Mv7f.js → chunk-DI55MBZ5-COQCcXC5.js} +1 -1
- package/dist-renderer/assets/{chunk-FMBD7UC4-DMD45MVJ.js → chunk-FMBD7UC4-IKU9U_Y4.js} +1 -1
- package/dist-renderer/assets/{chunk-QN33PNHL-DOhGrz-q.js → chunk-QN33PNHL-D6WV154X.js} +1 -1
- package/dist-renderer/assets/{chunk-QZHKN3VN-D8yDgJdD.js → chunk-QZHKN3VN-D90_2DQp.js} +1 -1
- package/dist-renderer/assets/{chunk-TZMSLE5B-BcsEDu7A.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-DlSqGHMX.js → cose-bilkent-S5V4N54A-6WiK6U2P.js} +1 -1
- package/dist-renderer/assets/{dagre-6UL2VRFP-BTT9tSAx.js → dagre-6UL2VRFP-DF4MMuTn.js} +1 -1
- package/dist-renderer/assets/{diagram-PSM6KHXK-Du-U-mK2.js → diagram-PSM6KHXK-CcF1eZ7E.js} +1 -1
- package/dist-renderer/assets/{diagram-QEK2KX5R-jFdHeKas.js → diagram-QEK2KX5R-DYlOVPQB.js} +1 -1
- package/dist-renderer/assets/{diagram-S2PKOQOG-DKLNK2bu.js → diagram-S2PKOQOG-BHXWsZOP.js} +1 -1
- package/dist-renderer/assets/{erDiagram-Q2GNP2WA-CZxHgIIo.js → erDiagram-Q2GNP2WA-GjmuBx8d.js} +1 -1
- package/dist-renderer/assets/{flowDiagram-NV44I4VS-v4XStCD0.js → flowDiagram-NV44I4VS-BuS7YVHk.js} +1 -1
- package/dist-renderer/assets/{ganttDiagram-JELNMOA3-DJjD_BEL.js → ganttDiagram-JELNMOA3-3Teu5tAa.js} +1 -1
- package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-BNy-jr03.js → gitGraphDiagram-V2S2FVAM-BiLdCYu5.js} +1 -1
- package/dist-renderer/assets/{graph-DDTrn6je.js → graph-CDP_R8ct.js} +1 -1
- package/dist-renderer/assets/{index-BBp78BAu.js → index-BSZdT-g-.js} +1 -1
- package/dist-renderer/assets/{index-eotrJaYy.js → index-BhWvMqsz.js} +1 -1
- package/dist-renderer/assets/{index-D8_B-cfs.js → index-C2_AupSj.js} +1 -1
- package/dist-renderer/assets/{index-BQrwHZ-k.js → index-C5ujiwAR.js} +580 -588
- package/dist-renderer/assets/index-CIS2CTK9.css +1 -0
- package/dist-renderer/assets/{index-CRKQSG9S.js → index-CVNjLwkq.js} +1 -1
- package/dist-renderer/assets/{index-DR6Wz52b.js → index-CwG3se0q.js} +1 -1
- package/dist-renderer/assets/{infoDiagram-HS3SLOUP-DqnOsuza.js → infoDiagram-HS3SLOUP-DLHUFo72.js} +1 -1
- package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-DTobaO1d.js → journeyDiagram-XKPGCS4Q-BE07RpJD.js} +1 -1
- package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-HbwVOvWc.js → kanban-definition-3W4ZIXB7-DDHZy4NB.js} +1 -1
- package/dist-renderer/assets/{layout--VYmTcw2.js → layout-5nA5wUxO.js} +1 -1
- package/dist-renderer/assets/{linear-BsJh89Mr.js → linear-BtF1i2qN.js} +1 -1
- package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-BZqUZePd.js → mindmap-definition-VGOIOE7T-Z1Ui9Sqy.js} +1 -1
- package/dist-renderer/assets/{pieDiagram-ADFJNKIX-B1q_nH6P.js → pieDiagram-ADFJNKIX-LCjxckWv.js} +1 -1
- package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-UD8QhSEu.js → quadrantDiagram-AYHSOK5B-BOwKjSco.js} +1 -1
- package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-BA_i7Nw8.js → requirementDiagram-UZGBJVZJ-pChP8Znd.js} +1 -1
- package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-CMTnX-2d.js → sankeyDiagram-TZEHDZUN-DifZ2qpo.js} +1 -1
- package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-BQXDB615.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-BAsPXy6X.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-BdasmVkC.js → timeline-definition-IT6M3QCI-CPgokIo8.js} +1 -1
- package/dist-renderer/assets/{treemap-GDKQZRPO-BkKQqIui.js → treemap-GDKQZRPO-DAVqSR9L.js} +1 -1
- package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-EAlPHOdx.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 +1709 -534
- 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 +679 -74
- 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 +115 -37
- 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 +143 -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 +156 -83
- 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 +41 -5
- 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-Ch7JrfUu.js +0 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-z9I4AnFy.js +0 -1
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-z9I4AnFy.js +0 -1
- package/dist-renderer/assets/clone-Dfi1Jx6l.js +0 -1
- package/dist-renderer/assets/index-iyjkpSus.css +0 -32
- package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-DTUIBfce.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;
|
|
@@ -105,6 +106,8 @@ export interface TeamSummary {
|
|
|
105
106
|
color?: string;
|
|
106
107
|
memberCount: number;
|
|
107
108
|
members?: TeamSummaryMember[];
|
|
109
|
+
/** Runtime harness used to launch the team, e.g. claudecode/codex/opencode. */
|
|
110
|
+
harness?: string;
|
|
108
111
|
taskCount: number;
|
|
109
112
|
lastActivity: string | null;
|
|
110
113
|
projectPath?: string;
|
|
@@ -149,6 +152,10 @@ export interface TeamSummary {
|
|
|
149
152
|
sessions: number;
|
|
150
153
|
messages: number;
|
|
151
154
|
tokens: number;
|
|
155
|
+
tokensIn?: number;
|
|
156
|
+
tokensOut?: number;
|
|
157
|
+
cacheRead?: number;
|
|
158
|
+
cacheCreation?: number;
|
|
152
159
|
durationMs: number;
|
|
153
160
|
};
|
|
154
161
|
}
|
|
@@ -200,6 +207,8 @@ export interface DiscoverableTeam {
|
|
|
200
207
|
capabilities?: AgentCapability[];
|
|
201
208
|
description?: string;
|
|
202
209
|
harness?: string;
|
|
210
|
+
/** Canonical project path — surfaced via /workers so admins know where each team lives. */
|
|
211
|
+
workDir?: string;
|
|
203
212
|
}
|
|
204
213
|
|
|
205
214
|
export interface TaskBusConfig {
|
|
@@ -272,7 +281,9 @@ export interface TaskHandshakeResponse {
|
|
|
272
281
|
|
|
273
282
|
export type CollabTaskStatus =
|
|
274
283
|
| 'pending_accept'
|
|
284
|
+
| 'received'
|
|
275
285
|
| 'accepted'
|
|
286
|
+
| 'in_progress'
|
|
276
287
|
| 'delivered'
|
|
277
288
|
| 'approved'
|
|
278
289
|
| 'revision'
|
|
@@ -324,6 +335,8 @@ export interface CollabTask {
|
|
|
324
335
|
rejectedAt?: string;
|
|
325
336
|
deliveredAt?: string;
|
|
326
337
|
approvedAt?: string;
|
|
338
|
+
completedAt?: string;
|
|
339
|
+
remoteTaskId?: string;
|
|
327
340
|
}
|
|
328
341
|
|
|
329
342
|
export interface TaskWorkInterval {
|
|
@@ -1185,6 +1198,13 @@ export interface TeamLaunchRequest {
|
|
|
1185
1198
|
|
|
1186
1199
|
export interface TeamLaunchResponse {
|
|
1187
1200
|
runId: string;
|
|
1201
|
+
ok?: boolean;
|
|
1202
|
+
data?: {
|
|
1203
|
+
teamName: string;
|
|
1204
|
+
bindProject: string;
|
|
1205
|
+
projectExists: boolean;
|
|
1206
|
+
isOnline: boolean;
|
|
1207
|
+
};
|
|
1188
1208
|
}
|
|
1189
1209
|
|
|
1190
1210
|
export interface CreateTaskRequest {
|
|
@@ -1393,11 +1413,24 @@ export interface TeamChangeEvent {
|
|
|
1393
1413
|
| 'lead-message'
|
|
1394
1414
|
| 'tool-activity'
|
|
1395
1415
|
| 'process'
|
|
1396
|
-
| 'member-spawn'
|
|
1416
|
+
| 'member-spawn'
|
|
1417
|
+
| 'direct-cli-stream';
|
|
1397
1418
|
teamName: string;
|
|
1398
1419
|
runId?: string;
|
|
1399
1420
|
detail?: string;
|
|
1400
1421
|
taskId?: string;
|
|
1422
|
+
/** direct-cli-stream: which session this live token/turn came from. */
|
|
1423
|
+
sessionKey?: string;
|
|
1424
|
+
/** direct-cli-stream: optimistic id shared with the canonical reply (drives dedup). */
|
|
1425
|
+
messageId?: string;
|
|
1426
|
+
/** direct-cli-stream: init | delta | thinking | tool. */
|
|
1427
|
+
kind?: string;
|
|
1428
|
+
/** direct-cli-stream: incremental assistant text (delta) or tool name. */
|
|
1429
|
+
text?: string;
|
|
1430
|
+
toolName?: string;
|
|
1431
|
+
toolInput?: unknown;
|
|
1432
|
+
/** direct-cli-stream: reply sender shown during streaming (team name or member name). */
|
|
1433
|
+
from?: string;
|
|
1401
1434
|
}
|
|
1402
1435
|
|
|
1403
1436
|
export interface ProjectBranchChangeEvent {
|
|
@@ -1502,9 +1535,10 @@ export interface TeamProvisioningMemberInput {
|
|
|
1502
1535
|
|
|
1503
1536
|
export interface TeamCreateRequest {
|
|
1504
1537
|
teamName: string;
|
|
1505
|
-
/** cc-connect project name — ASCII, unique.
|
|
1506
|
-
bindProject
|
|
1507
|
-
|
|
1538
|
+
/** cc-connect project name — ASCII, unique. Required for URL routing and cc-connect binding. */
|
|
1539
|
+
bindProject: string;
|
|
1540
|
+
/** Human-facing display name. Required and may contain Chinese/Unicode characters. */
|
|
1541
|
+
displayName: string;
|
|
1508
1542
|
description?: string;
|
|
1509
1543
|
color?: string;
|
|
1510
1544
|
members: TeamProvisioningMemberInput[];
|
|
@@ -1747,6 +1781,8 @@ export interface MemberFullStats {
|
|
|
1747
1781
|
inputTokens: number;
|
|
1748
1782
|
outputTokens: number;
|
|
1749
1783
|
cacheReadTokens: number;
|
|
1784
|
+
cacheCreationTokens: number;
|
|
1785
|
+
totalTokens: number;
|
|
1750
1786
|
costUsd: number;
|
|
1751
1787
|
tasksCompleted: number;
|
|
1752
1788
|
messageCount: number;
|
|
@@ -1,31 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Terminal types — shared between main, preload, and renderer processes.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
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
|
+
});
|