@yancyyu/openhermit 1.6.37 → 1.6.39
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/dist-renderer/assets/ProjectEditorOverlay-krO5vQxX.js +58 -0
- package/dist-renderer/assets/{TeamGraphOverlay-DYT3bwFR.js → TeamGraphOverlay-DqhQzcTr.js} +1 -1
- package/dist-renderer/assets/{_basePickBy-Dbt_EU-e.js → _basePickBy-B7kSYPxr.js} +1 -1
- package/dist-renderer/assets/{_baseUniq-DWo68sXI.js → _baseUniq-CnjxqwAk.js} +1 -1
- package/dist-renderer/assets/{arc-DXH1iZQK.js → arc-CLeZuINP.js} +1 -1
- package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-cjffS2Qr.js → architectureDiagram-VXUJARFQ-QKtqaqdY.js} +1 -1
- package/dist-renderer/assets/{blockDiagram-VD42YOAC-BKdZF02Y.js → blockDiagram-VD42YOAC-BqdrzO_f.js} +1 -1
- package/dist-renderer/assets/{c4Diagram-YG6GDRKO-CN27pqaI.js → c4Diagram-YG6GDRKO-gwPlCxDC.js} +1 -1
- package/dist-renderer/assets/channel-DpMHF50r.js +1 -0
- package/dist-renderer/assets/{chunk-4BX2VUAB-CXPCI7g_.js → chunk-4BX2VUAB-C6XLurL4.js} +1 -1
- package/dist-renderer/assets/{chunk-55IACEB6-BGAXQZRC.js → chunk-55IACEB6-Ds6quhEP.js} +1 -1
- package/dist-renderer/assets/{chunk-B4BG7PRW-TPDaA_KQ.js → chunk-B4BG7PRW-5UlA1_e9.js} +1 -1
- package/dist-renderer/assets/{chunk-DI55MBZ5-D1ADe_tq.js → chunk-DI55MBZ5-ywFrqIsY.js} +1 -1
- package/dist-renderer/assets/{chunk-FMBD7UC4-Beimtg3a.js → chunk-FMBD7UC4-C7ifUA17.js} +1 -1
- package/dist-renderer/assets/{chunk-QN33PNHL-OjNBu854.js → chunk-QN33PNHL-BxGCo80U.js} +1 -1
- package/dist-renderer/assets/{chunk-QZHKN3VN-DinqvbH8.js → chunk-QZHKN3VN-B2CuaZs6.js} +1 -1
- package/dist-renderer/assets/{chunk-TZMSLE5B-BfFtlPSZ.js → chunk-TZMSLE5B-Ds1hInvp.js} +1 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-CBYCBVRl.js +1 -0
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-CBYCBVRl.js +1 -0
- package/dist-renderer/assets/clone-DcMF6Psb.js +1 -0
- package/dist-renderer/assets/{cose-bilkent-S5V4N54A-D9z9Dgt7.js → cose-bilkent-S5V4N54A-Cz1GVtLp.js} +1 -1
- package/dist-renderer/assets/{dagre-6UL2VRFP-n1g-DhEE.js → dagre-6UL2VRFP-BrmR-P4h.js} +1 -1
- package/dist-renderer/assets/{diagram-PSM6KHXK-BvxFq-BE.js → diagram-PSM6KHXK-DbNjC5Rg.js} +1 -1
- package/dist-renderer/assets/{diagram-QEK2KX5R-wVnJuwza.js → diagram-QEK2KX5R-qkRX5_Mq.js} +1 -1
- package/dist-renderer/assets/{diagram-S2PKOQOG-B707WJQw.js → diagram-S2PKOQOG-CyL5rCv2.js} +1 -1
- package/dist-renderer/assets/{erDiagram-Q2GNP2WA-C-_1dGHs.js → erDiagram-Q2GNP2WA-Dox3-bA5.js} +1 -1
- package/dist-renderer/assets/{flowDiagram-NV44I4VS-CMTSi3H6.js → flowDiagram-NV44I4VS-BtkaxlDL.js} +1 -1
- package/dist-renderer/assets/{ganttDiagram-JELNMOA3-DZ0bNrAA.js → ganttDiagram-JELNMOA3-Dhy_d9GK.js} +1 -1
- package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-DNVfGooQ.js → gitGraphDiagram-V2S2FVAM-B5XRhIQA.js} +1 -1
- package/dist-renderer/assets/{graph-865j_tM_.js → graph-CsoEwUhS.js} +1 -1
- package/dist-renderer/assets/{index-C_F9N5x-.js → index-BWPWmJNo.js} +1 -1
- package/dist-renderer/assets/{index-LwDIsXJN.js → index-Bu2R-Se7.js} +586 -740
- package/dist-renderer/assets/index-CnWV3BhG.css +32 -0
- package/dist-renderer/assets/{index-DuUaf8at.js → index-D-3KgskL.js} +1 -1
- package/dist-renderer/assets/{index-BTx1nc4T.js → index-DGEBzLNT.js} +1 -1
- package/dist-renderer/assets/{index-2EW-eu3q.js → index-NhHNs2Oo.js} +1 -1
- package/dist-renderer/assets/{index-4dEMStJj.js → index-h17WuEyf.js} +1 -1
- package/dist-renderer/assets/{infoDiagram-HS3SLOUP-CyqtElLq.js → infoDiagram-HS3SLOUP-hMGmNojH.js} +1 -1
- package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-BvjQ0Hm0.js → journeyDiagram-XKPGCS4Q-DXV2rBDl.js} +1 -1
- package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-CJJ-k0zT.js → kanban-definition-3W4ZIXB7-Bf99WLRy.js} +1 -1
- package/dist-renderer/assets/{layout-CnV6rQAG.js → layout-C3XWrpwo.js} +1 -1
- package/dist-renderer/assets/{linear-Cw3UQgyX.js → linear-OEEcn8KN.js} +1 -1
- package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-C5tDaGSK.js → mindmap-definition-VGOIOE7T-Dpi3S2x4.js} +1 -1
- package/dist-renderer/assets/{pieDiagram-ADFJNKIX-CiIpPsau.js → pieDiagram-ADFJNKIX-xTPPhtNx.js} +1 -1
- package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-C3gtowNj.js → quadrantDiagram-AYHSOK5B-euniyDlz.js} +1 -1
- package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-CXBTrAnU.js → requirementDiagram-UZGBJVZJ-D9Uiw4kF.js} +1 -1
- package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-wziX77xG.js → sankeyDiagram-TZEHDZUN-CySU4nED.js} +1 -1
- package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-sYqopcrj.js → sequenceDiagram-WL72ISMW-JVGpET6V.js} +1 -1
- package/dist-renderer/assets/splashScene-D0YB9uxm.js +17 -0
- package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-Bl1-0_Cp.js → stateDiagram-FKZM4ZOC-B2FY5qqi.js} +1 -1
- package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-DcoMiR8H.js +1 -0
- package/dist-renderer/assets/{timeline-definition-IT6M3QCI-CIRjJUBo.js → timeline-definition-IT6M3QCI-DmycNUUe.js} +1 -1
- package/dist-renderer/assets/{treemap-GDKQZRPO-CVPuNe1n.js → treemap-GDKQZRPO-DPq4gZuB.js} +1 -1
- package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-3nT9yHwp.js → xychartDiagram-PRI3JC2R-J6VVJzRq.js} +1 -1
- package/dist-renderer/index.html +20 -53
- package/package.json +25 -18
- package/src/main/ipc/extensions.ts +30 -50
- package/src/main/server.ts +890 -247
- package/src/main/services/extensions/ExtensionFacadeService.ts +4 -56
- package/src/main/services/extensions/catalog/PluginCatalogService.ts +4 -2
- package/src/main/services/extensions/library/McpLibraryService.ts +243 -0
- package/src/main/services/session-intelligence/ConversationTelemetryService.ts +1101 -0
- package/src/main/services/session-intelligence/LocalSessionScanner.ts +512 -0
- package/src/main/services/session-intelligence/SessionUsageParser.ts +4 -4
- package/src/main/services/session-intelligence/UsageTelemetryService.ts +14 -1
- package/src/main/services/system-manager/SystemManagerConfigService.ts +122 -0
- package/src/main/services/system-manager/SystemManagerPtyService.ts +233 -0
- package/src/main/services/system-manager/WorkflowPromptService.ts +75 -0
- package/src/main/services/teams-mvp/TaskDispatchService.ts +32 -8
- package/src/main/services/teams-mvp/TeamProvisioningService.ts +39 -2
- package/src/main/services/teams-mvp/TeamWorkspaceService.ts +22 -4
- package/src/main/utils/teamProjectResolution.ts +15 -0
- package/src/renderer/App.tsx +8 -4
- package/src/renderer/api/httpClient.ts +174 -38
- package/src/renderer/api/providers.ts +23 -2
- package/src/renderer/assets/participant-avatars/01.svg +3 -0
- package/src/renderer/assets/participant-avatars/02.svg +3 -0
- package/src/renderer/assets/participant-avatars/03.svg +3 -0
- package/src/renderer/assets/participant-avatars/04.svg +3 -0
- package/src/renderer/assets/participant-avatars/05.svg +3 -0
- package/src/renderer/assets/participant-avatars/06.svg +3 -0
- package/src/renderer/assets/participant-avatars/07.svg +3 -0
- package/src/renderer/assets/participant-avatars/08.svg +3 -0
- package/src/renderer/assets/participant-avatars/09.svg +3 -0
- package/src/renderer/assets/participant-avatars/10.svg +3 -0
- package/src/renderer/assets/participant-avatars/11.svg +3 -0
- package/src/renderer/assets/participant-avatars/12.svg +3 -0
- package/src/renderer/assets/participant-avatars/13.svg +3 -0
- package/src/renderer/components/common/TerminalPane.tsx +213 -0
- package/src/renderer/components/dashboard/DashboardView.tsx +9 -36
- package/src/renderer/components/extensions/ExtensionStoreView.tsx +12 -221
- package/src/renderer/components/extensions/ExtensionsSubTabTrigger.tsx +1 -1
- package/src/renderer/components/extensions/mcp/McpLibraryEnableDialog.tsx +305 -0
- package/src/renderer/components/extensions/mcp/McpLibraryEntryDialog.tsx +418 -0
- package/src/renderer/components/extensions/mcp/McpLibraryPanel.tsx +404 -0
- package/src/renderer/components/extensions/plugins/PluginCard.tsx +10 -2
- package/src/renderer/components/extensions/plugins/PluginsPanel.tsx +40 -22
- package/src/renderer/components/extensions/skills/SkillsLibraryPanel.tsx +335 -0
- package/src/renderer/components/layout/PaneContent.tsx +8 -1
- package/src/renderer/components/layout/Sidebar.tsx +11 -54
- package/src/renderer/components/layout/SortableTab.tsx +20 -31
- package/src/renderer/components/layout/TabBar.tsx +1 -1
- package/src/renderer/components/layout/TabContextMenu.tsx +1 -1
- package/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx +768 -157
- package/src/renderer/components/schedules/SchedulesView.tsx +51 -462
- package/src/renderer/components/schedules/calendar/CalendarDayView.tsx +173 -0
- package/src/renderer/components/schedules/calendar/CalendarEventBlock.tsx +113 -0
- package/src/renderer/components/schedules/calendar/CalendarHeader.tsx +148 -0
- package/src/renderer/components/schedules/calendar/CalendarMonthView.tsx +142 -0
- package/src/renderer/components/schedules/calendar/CalendarWeekView.tsx +219 -0
- package/src/renderer/components/schedules/calendar/ScheduleCalendarBoard.tsx +41 -0
- package/src/renderer/components/schedules/calendar/TeamGanttView.tsx +405 -0
- package/src/renderer/components/schedules/calendar/computeOccurrences.ts +234 -0
- package/src/renderer/components/schedules/calendar/index.ts +2 -0
- package/src/renderer/components/schedules/calendar/types.ts +44 -0
- package/src/renderer/components/settings/SettingsTabs.tsx +50 -55
- package/src/renderer/components/settings/SettingsView.tsx +30 -35
- package/src/renderer/components/settings/components/SettingsSectionHeader.tsx +5 -1
- package/src/renderer/components/settings/components/SettingsSelect.tsx +5 -3
- package/src/renderer/components/settings/components/SettingsToggle.tsx +2 -2
- package/src/renderer/components/settings/sections/AdvancedSection.tsx +11 -42
- package/src/renderer/components/settings/sections/CliStatusSection.tsx +71 -112
- package/src/renderer/components/settings/sections/ConfigEditorDialog.tsx +1 -1
- package/src/renderer/components/settings/sections/GeneralSection.tsx +11 -3
- package/src/renderer/components/settings/sections/HarnessSection.tsx +18 -14
- package/src/renderer/components/settings/sections/PlatformsSection.tsx +3 -3
- package/src/renderer/components/settings/sections/TaskBusSection.tsx +33 -40
- package/src/renderer/components/settings/sections/index.ts +0 -1
- package/src/renderer/components/sidebar/SidebarSessions.tsx +182 -4
- package/src/renderer/components/sidebar/SidebarTaskItem.tsx +4 -4
- package/src/renderer/components/sidebar/WorkspaceBrowser.tsx +39 -4
- package/src/renderer/components/splash/splashScene.ts +121 -929
- package/src/renderer/components/system-manager/FolderBrowser.tsx +163 -0
- package/src/renderer/components/system-manager/SystemManagerView.tsx +351 -0
- package/src/renderer/components/tasks/TasksView.tsx +112 -134
- package/src/renderer/components/team/CcSessionsSection.tsx +431 -89
- package/src/renderer/components/team/CollapsibleTeamSection.tsx +17 -32
- package/src/renderer/components/team/TeamDetailView.tsx +325 -114
- package/src/renderer/components/team/TeamListView.tsx +108 -123
- package/src/renderer/components/team/dialogs/CreateTaskDialog.tsx +2 -2
- package/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +84 -306
- package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +259 -342
- package/src/renderer/components/team/dialogs/GlobalTaskDetailDialog.tsx +1 -1
- package/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx +17 -15
- package/src/renderer/components/team/dialogs/PlatformBindingDialog.tsx +221 -0
- package/src/renderer/components/team/dialogs/PlatformManualForm.tsx +7 -0
- package/src/renderer/components/team/dialogs/PlatformSetupQR.tsx +1 -1
- package/src/renderer/components/team/dialogs/RuntimeConfigDialog.tsx +361 -0
- package/src/renderer/components/team/dialogs/platformMeta.ts +122 -11
- package/src/renderer/components/team/dialogs/useTeamEditForm.ts +17 -5
- package/src/renderer/components/team/kanban/KanbanBoard.tsx +9 -9
- package/src/renderer/components/team/members/MemberCard.tsx +14 -47
- package/src/renderer/components/team/members/MemberDetailDialog.tsx +3 -95
- package/src/renderer/components/team/members/MemberDetailStats.tsx +50 -65
- package/src/renderer/components/team/messages/MessageComposer.tsx +8 -110
- package/src/renderer/components/team/messages/MessagesPanel.tsx +131 -114
- package/src/renderer/components/team/schedule/ScheduleStatusBadge.tsx +2 -2
- package/src/renderer/components/team/tools/AddMcpInline.tsx +57 -0
- package/src/renderer/components/team/tools/AddSkillInline.tsx +61 -0
- package/src/renderer/components/team/tools/McpChip.tsx +45 -0
- package/src/renderer/components/team/tools/SkillChip.tsx +35 -0
- package/src/renderer/components/team/tools/ToolsSection.tsx +556 -0
- package/src/renderer/hooks/useExtensionsTabState.ts +3 -114
- package/src/renderer/index.css +39 -22
- package/src/renderer/index.html +17 -50
- package/src/renderer/store/index.ts +2 -1
- package/src/renderer/store/slices/scheduleSlice.ts +1 -1
- package/src/renderer/store/slices/teamSlice.ts +45 -168
- package/src/renderer/utils/claudeCodeOnlyProviders.ts +3 -10
- package/src/renderer/utils/memberHelpers.ts +5 -17
- package/src/renderer/utils/openCodeRuntimeDeliveryDiagnostics.ts +4 -2
- package/src/renderer/utils/providerSlashCommands.ts +0 -5
- package/src/renderer/utils/scheduleFormatters.ts +3 -1
- package/src/renderer/utils/teamMessageFiltering.ts +14 -1
- package/src/renderer/utils/teamModelAvailability.ts +18 -2
- package/src/shared/types/api.ts +121 -2
- package/src/shared/types/ccConnect.ts +2 -0
- package/src/shared/types/extensions/api.ts +9 -0
- package/src/shared/types/extensions/index.ts +4 -0
- package/src/shared/types/extensions/mcp.ts +41 -0
- package/src/shared/types/index.ts +3 -0
- package/src/shared/types/systemManager.ts +49 -0
- package/src/shared/types/team.ts +29 -0
- package/src/shared/types/terminal.ts +4 -2
- package/src/shared/utils/extensionNormalizers.ts +29 -0
- package/src/shared/utils/providerExtensionCapabilities.ts +2 -2
- package/dist-renderer/assets/ProjectEditorOverlay-Va_Vz-zz.js +0 -52
- package/dist-renderer/assets/channel-5dJIx68e.js +0 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-BMGXWJ2d.js +0 -1
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-BMGXWJ2d.js +0 -1
- package/dist-renderer/assets/clone-D7FWfGY9.js +0 -1
- package/dist-renderer/assets/index-B2z_IyRH.css +0 -1
- package/dist-renderer/assets/splashScene-C8lWNnm4.js +0 -1
- package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-DOYYvDbi.js +0 -1
- package/src/main/services/extensions/catalog/GlamaMcpEnrichmentService.ts +0 -190
- package/src/main/services/extensions/catalog/McpCatalogAggregator.ts +0 -150
- package/src/main/services/extensions/catalog/OfficialMcpRegistryService.ts +0 -381
- package/src/main/services/extensions/install/McpInstallService.ts +0 -407
- package/src/main/services/extensions/state/McpInstallationStateService.ts +0 -42
- package/src/renderer/components/extensions/mcp/McpServerCard.tsx +0 -314
- package/src/renderer/components/extensions/mcp/McpServerDetailDialog.tsx +0 -765
- package/src/renderer/components/extensions/mcp/McpServersPanel.tsx +0 -593
- package/src/renderer/components/extensions/skills/SkillDetailDialog.tsx +0 -372
- package/src/renderer/components/extensions/skills/SkillImportDialog.tsx +0 -343
- package/src/renderer/components/extensions/skills/SkillsPanel.tsx +0 -659
package/src/renderer/index.css
CHANGED
|
@@ -5,30 +5,30 @@
|
|
|
5
5
|
/* Theme CSS Custom Properties */
|
|
6
6
|
|
|
7
7
|
:root {
|
|
8
|
-
/* Dark theme (default) -
|
|
9
|
-
--color-surface: #
|
|
10
|
-
/* Main background —
|
|
11
|
-
--color-surface-raised: #
|
|
12
|
-
/* Active/Selected items —
|
|
13
|
-
--color-surface-overlay: #
|
|
8
|
+
/* Dark theme (default) - Phosphor Green terminal palette */
|
|
9
|
+
--color-surface: #0a0a0f;
|
|
10
|
+
/* Main background — CRT black */
|
|
11
|
+
--color-surface-raised: #121318;
|
|
12
|
+
/* Active/Selected items — terminal surface */
|
|
13
|
+
--color-surface-overlay: #121318;
|
|
14
14
|
/* Overlay surfaces */
|
|
15
|
-
--color-surface-sidebar: #
|
|
16
|
-
/* Sidebar — deepest
|
|
17
|
-
--color-border: rgba(
|
|
18
|
-
/* Borders —
|
|
19
|
-
--color-border-subtle: rgba(
|
|
15
|
+
--color-surface-sidebar: #060609;
|
|
16
|
+
/* Sidebar — deepest black */
|
|
17
|
+
--color-border: rgba(74, 222, 128, 0.07);
|
|
18
|
+
/* Borders — phosphor green-tinted */
|
|
19
|
+
--color-border-subtle: rgba(74, 222, 128, 0.04);
|
|
20
20
|
/* Subtle borders */
|
|
21
|
-
--color-border-emphasis: rgba(
|
|
21
|
+
--color-border-emphasis: rgba(74, 222, 128, 0.14);
|
|
22
22
|
/* Emphasis borders */
|
|
23
|
-
--color-text: #
|
|
24
|
-
--color-text-secondary: #
|
|
25
|
-
--color-text-muted: #
|
|
26
|
-
--color-accent: #
|
|
27
|
-
/* Accent —
|
|
23
|
+
--color-text: #c8cdd8;
|
|
24
|
+
--color-text-secondary: #7a8190;
|
|
25
|
+
--color-text-muted: #4f5564;
|
|
26
|
+
--color-accent: #4ade80;
|
|
27
|
+
/* Accent — phosphor green */
|
|
28
28
|
/* Scrollbar colors */
|
|
29
|
-
--scrollbar-thumb: rgba(
|
|
30
|
-
--scrollbar-thumb-hover: rgba(
|
|
31
|
-
--scrollbar-thumb-active: rgba(
|
|
29
|
+
--scrollbar-thumb: rgba(74, 222, 128, 0.12);
|
|
30
|
+
--scrollbar-thumb-hover: rgba(74, 222, 128, 0.22);
|
|
31
|
+
--scrollbar-thumb-active: rgba(74, 222, 128, 0.32);
|
|
32
32
|
/* Search highlights */
|
|
33
33
|
--highlight-bg: rgba(202, 138, 4, 0.7);
|
|
34
34
|
--highlight-bg-inactive: rgba(113, 63, 18, 0.5);
|
|
@@ -797,14 +797,31 @@ body {
|
|
|
797
797
|
height: 100%;
|
|
798
798
|
overflow: hidden;
|
|
799
799
|
font-family:
|
|
800
|
-
|
|
801
|
-
|
|
800
|
+
'Agave', 'JetBrains Mono', 'Menlo', 'Monaco', 'Consolas',
|
|
801
|
+
-apple-system, BlinkMacSystemFont, 'Segoe UI', monospace;
|
|
802
802
|
-webkit-font-smoothing: antialiased;
|
|
803
803
|
-moz-osx-font-smoothing: grayscale;
|
|
804
804
|
background-color: var(--color-surface);
|
|
805
805
|
color: var(--color-text);
|
|
806
806
|
}
|
|
807
807
|
|
|
808
|
+
/* Agave font face — yume-style monospace */
|
|
809
|
+
@font-face {
|
|
810
|
+
font-family: 'Agave';
|
|
811
|
+
src: url('/fonts/Agave-Regular.ttf') format('truetype');
|
|
812
|
+
font-weight: 400;
|
|
813
|
+
font-style: normal;
|
|
814
|
+
font-display: swap;
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
@font-face {
|
|
818
|
+
font-family: 'Agave';
|
|
819
|
+
src: url('/fonts/Agave-Bold.ttf') format('truetype');
|
|
820
|
+
font-weight: 700;
|
|
821
|
+
font-style: normal;
|
|
822
|
+
font-display: swap;
|
|
823
|
+
}
|
|
824
|
+
|
|
808
825
|
body.theme-transitioning {
|
|
809
826
|
transition:
|
|
810
827
|
background-color 0.2s ease,
|
package/src/renderer/index.html
CHANGED
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
/>
|
|
102
102
|
<title>Hermit</title>
|
|
103
103
|
<style>
|
|
104
|
-
/* Splash:
|
|
104
|
+
/* Splash: clean dark terminal */
|
|
105
105
|
#splash {
|
|
106
106
|
position: fixed;
|
|
107
107
|
inset: 0;
|
|
@@ -112,36 +112,11 @@
|
|
|
112
112
|
justify-content: center;
|
|
113
113
|
overflow: hidden;
|
|
114
114
|
isolation: isolate;
|
|
115
|
-
background:
|
|
116
|
-
|
|
117
|
-
#0c0d13 0%,
|
|
118
|
-
#1a1535 20%,
|
|
119
|
-
#1e1245 35%,
|
|
120
|
-
#231740 50%,
|
|
121
|
-
#1a1535 65%,
|
|
122
|
-
#151230 80%,
|
|
123
|
-
#0c0d13 100%
|
|
124
|
-
);
|
|
125
|
-
background-size: 100% 300%;
|
|
126
|
-
animation: splash-bg 6s ease infinite;
|
|
127
|
-
transition:
|
|
128
|
-
opacity 0.42s ease-out,
|
|
129
|
-
filter 0.42s ease-out;
|
|
115
|
+
background: #0a0a0f;
|
|
116
|
+
transition: opacity 0.35s ease-out;
|
|
130
117
|
}
|
|
131
118
|
#splash.splash-exiting {
|
|
132
119
|
opacity: 0;
|
|
133
|
-
filter: blur(8px);
|
|
134
|
-
}
|
|
135
|
-
@keyframes splash-bg {
|
|
136
|
-
0% {
|
|
137
|
-
background-position: 50% 0%;
|
|
138
|
-
}
|
|
139
|
-
50% {
|
|
140
|
-
background-position: 50% 100%;
|
|
141
|
-
}
|
|
142
|
-
100% {
|
|
143
|
-
background-position: 50% 0%;
|
|
144
|
-
}
|
|
145
120
|
}
|
|
146
121
|
#splash-noise {
|
|
147
122
|
position: absolute;
|
|
@@ -153,19 +128,14 @@
|
|
|
153
128
|
z-index: 0;
|
|
154
129
|
}
|
|
155
130
|
#splash-enhanced-canvas {
|
|
156
|
-
|
|
157
|
-
inset: 0;
|
|
158
|
-
width: 100%;
|
|
159
|
-
height: 100%;
|
|
160
|
-
pointer-events: none;
|
|
161
|
-
z-index: 1;
|
|
162
|
-
opacity: 0;
|
|
163
|
-
animation: splash-canvas-in 0.62s ease-out 0.08s forwards;
|
|
131
|
+
display: none;
|
|
164
132
|
}
|
|
165
|
-
@keyframes splash-
|
|
166
|
-
to {
|
|
167
|
-
|
|
168
|
-
|
|
133
|
+
@keyframes splash-term-in {
|
|
134
|
+
to { opacity: 1; }
|
|
135
|
+
}
|
|
136
|
+
@keyframes splash-cursor-blink {
|
|
137
|
+
0%, 100% { opacity: 1; }
|
|
138
|
+
50% { opacity: 0; }
|
|
169
139
|
}
|
|
170
140
|
#splash-logo,
|
|
171
141
|
#splash-copy {
|
|
@@ -173,10 +143,7 @@
|
|
|
173
143
|
z-index: 3;
|
|
174
144
|
}
|
|
175
145
|
#splash-logo {
|
|
176
|
-
|
|
177
|
-
animation:
|
|
178
|
-
splash-breathe 3s ease-in-out infinite,
|
|
179
|
-
splash-glow 3s ease-in-out infinite;
|
|
146
|
+
display: none;
|
|
180
147
|
}
|
|
181
148
|
#splash-copy {
|
|
182
149
|
display: flex;
|
|
@@ -208,13 +175,13 @@
|
|
|
208
175
|
#splash-text {
|
|
209
176
|
font-family:
|
|
210
177
|
ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
|
|
211
|
-
font-size:
|
|
212
|
-
font-weight:
|
|
213
|
-
letter-spacing: 0.
|
|
214
|
-
color:
|
|
215
|
-
text-shadow: 0 0 22px rgba(129, 140, 248, 0.26);
|
|
178
|
+
font-size: 13px;
|
|
179
|
+
font-weight: 400;
|
|
180
|
+
letter-spacing: 0.02em;
|
|
181
|
+
color: rgba(148, 163, 184, 0.6);
|
|
216
182
|
}
|
|
217
183
|
#splash-tagline {
|
|
184
|
+
display: none;
|
|
218
185
|
margin-top: 7px;
|
|
219
186
|
font-family:
|
|
220
187
|
ui-sans-serif,
|
|
@@ -464,7 +431,7 @@
|
|
|
464
431
|
/>
|
|
465
432
|
</svg>
|
|
466
433
|
<div id="splash-copy">
|
|
467
|
-
<div id="splash-text"
|
|
434
|
+
<div id="splash-text">🦀 hermit</div>
|
|
468
435
|
<div id="splash-tagline"><span>把复杂工作交给团队。</span></div>
|
|
469
436
|
<div id="splash-loading-hint">正在启动...</div>
|
|
470
437
|
</div>
|
|
@@ -240,6 +240,7 @@ export function initializeNotificationListeners(): () => void {
|
|
|
240
240
|
const SESSION_REFRESH_DEBOUNCE_MS = 150;
|
|
241
241
|
const PROJECT_REFRESH_DEBOUNCE_MS = 300;
|
|
242
242
|
const TEAM_REFRESH_THROTTLE_MS = 800;
|
|
243
|
+
const TEAM_MESSAGE_REFRESH_THROTTLE_MS = 150;
|
|
243
244
|
const TEAM_PRESENCE_REFRESH_THROTTLE_MS = 400;
|
|
244
245
|
const TEAM_MEMBER_SPAWN_REFRESH_THROTTLE_MS = 500;
|
|
245
246
|
const TEAM_LIST_REFRESH_THROTTLE_MS = 2000;
|
|
@@ -297,7 +298,7 @@ export function initializeNotificationListeners(): () => void {
|
|
|
297
298
|
const timer = setTimeout(() => {
|
|
298
299
|
teamMessageRefreshTimers.delete(teamName);
|
|
299
300
|
void refreshTrackedTeamMessages(teamName);
|
|
300
|
-
},
|
|
301
|
+
}, TEAM_MESSAGE_REFRESH_THROTTLE_MS);
|
|
301
302
|
teamMessageRefreshTimers.set(teamName, timer);
|
|
302
303
|
};
|
|
303
304
|
const buildToolActivityTimerKey = (
|
|
@@ -161,7 +161,7 @@ export const createScheduleSlice: StateCreator<AppState, [], [], ScheduleSlice>
|
|
|
161
161
|
startedAt: now,
|
|
162
162
|
executionStartedAt: now,
|
|
163
163
|
retryCount: 0,
|
|
164
|
-
summary: '
|
|
164
|
+
summary: '正在触发运行时...',
|
|
165
165
|
},
|
|
166
166
|
...(state.scheduleRuns[id] ?? []),
|
|
167
167
|
],
|
|
@@ -2020,7 +2020,12 @@ export interface TeamSlice {
|
|
|
2020
2020
|
fetchTeams: () => Promise<void>;
|
|
2021
2021
|
fetchAllTasks: () => Promise<void>;
|
|
2022
2022
|
openTeamsTab: () => void;
|
|
2023
|
-
|
|
2023
|
+
openSystemManager: () => Promise<void>;
|
|
2024
|
+
openTeamTab: (
|
|
2025
|
+
teamName: string,
|
|
2026
|
+
projectPath?: string,
|
|
2027
|
+
options?: { taskId?: string; displayName?: string }
|
|
2028
|
+
) => void;
|
|
2024
2029
|
clearKanbanFilter: () => void;
|
|
2025
2030
|
ensureTeamGraphSlotAssignments: (
|
|
2026
2031
|
teamName: string,
|
|
@@ -2726,7 +2731,21 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
|
|
|
2726
2731
|
});
|
|
2727
2732
|
},
|
|
2728
2733
|
|
|
2729
|
-
|
|
2734
|
+
openSystemManager: async () => {
|
|
2735
|
+
const manager = await unwrapIpc('team:ensureSystemManager', () =>
|
|
2736
|
+
api.teams.ensureSystemManager()
|
|
2737
|
+
);
|
|
2738
|
+
await get().fetchTeams();
|
|
2739
|
+
get().openTeamTab(manager.teamName, manager.projectPath || manager.workDir, {
|
|
2740
|
+
displayName: manager.displayName,
|
|
2741
|
+
});
|
|
2742
|
+
},
|
|
2743
|
+
|
|
2744
|
+
openTeamTab: (
|
|
2745
|
+
teamName: string,
|
|
2746
|
+
projectPath?: string,
|
|
2747
|
+
options?: { taskId?: string; displayName?: string }
|
|
2748
|
+
) => {
|
|
2730
2749
|
if (!teamName.trim()) {
|
|
2731
2750
|
return;
|
|
2732
2751
|
}
|
|
@@ -2749,7 +2768,8 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
|
|
|
2749
2768
|
const teamSummary = state.teamByName[teamName];
|
|
2750
2769
|
const selectedTeamDisplayName =
|
|
2751
2770
|
state.selectedTeamName === teamName ? state.selectedTeamData?.config.name : undefined;
|
|
2752
|
-
const displayName =
|
|
2771
|
+
const displayName =
|
|
2772
|
+
options?.displayName || teamSummary?.displayName || selectedTeamDisplayName || teamName;
|
|
2753
2773
|
|
|
2754
2774
|
const allTabs = state.getAllPaneTabs();
|
|
2755
2775
|
const existing = allTabs.find((tab) => tab.type === 'team' && tab.teamName === teamName);
|
|
@@ -3674,12 +3694,10 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
|
|
|
3674
3694
|
page.messages
|
|
3675
3695
|
);
|
|
3676
3696
|
const preserveLoadedOlderTail =
|
|
3677
|
-
|
|
3678
|
-
Array.isArray(retainedOlderTail) &&
|
|
3679
|
-
retainedOlderTail.length > 0;
|
|
3697
|
+
Array.isArray(retainedOlderTail) && retainedOlderTail.length > 0;
|
|
3680
3698
|
const nextCanonical = headChanged
|
|
3681
3699
|
? preserveLoadedOlderTail
|
|
3682
|
-
? mergeTeamMessages(
|
|
3700
|
+
? mergeTeamMessages(page.messages, retainedOlderTail)
|
|
3683
3701
|
: page.messages
|
|
3684
3702
|
: current.canonicalMessages;
|
|
3685
3703
|
const nextOptimistic = pruneOptimisticMessages(current.optimisticMessages, nextCanonical);
|
|
@@ -4368,6 +4386,7 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
|
|
|
4368
4386
|
clearTeamScopedTransientState(teamName);
|
|
4369
4387
|
set((state) => ({
|
|
4370
4388
|
...collectTeamScopedStateRemovals(state, teamName),
|
|
4389
|
+
...buildTeamScopedProgressTombstones(state, teamName, nowIso()),
|
|
4371
4390
|
teams: state.teams.filter((team) => team.teamName !== teamName),
|
|
4372
4391
|
selectedTeamName: state.selectedTeamName === teamName ? null : state.selectedTeamName,
|
|
4373
4392
|
selectedTeamData: state.selectedTeamName === teamName ? null : state.selectedTeamData,
|
|
@@ -4430,118 +4449,20 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
|
|
|
4430
4449
|
},
|
|
4431
4450
|
|
|
4432
4451
|
createTeam: async (request: TeamCreateRequest) => {
|
|
4433
|
-
// Ensure provisioning progress subscription is active (defensive).
|
|
4434
|
-
get().subscribeProvisioningProgress();
|
|
4435
4452
|
invalidateTeamLocalStateEpoch(request.teamName);
|
|
4436
4453
|
clearPendingReplyRefreshTimer(request.teamName);
|
|
4437
4454
|
clearPendingReplyRefreshWaits(request.teamName);
|
|
4438
4455
|
clearTeamScopedTransientState(request.teamName);
|
|
4439
4456
|
|
|
4440
|
-
// Establish a per-team floor so late events from a previous run can't override UI.
|
|
4441
|
-
const floor = nowIso();
|
|
4442
|
-
set((state) => ({
|
|
4443
|
-
provisioningStartedAtFloorByTeam: {
|
|
4444
|
-
...state.provisioningStartedAtFloorByTeam,
|
|
4445
|
-
[request.teamName]: floor,
|
|
4446
|
-
},
|
|
4447
|
-
}));
|
|
4448
|
-
|
|
4449
|
-
// Clear stale provisioning runs for this team so the banner starts fresh
|
|
4450
|
-
set((state) => {
|
|
4451
|
-
const cleaned = { ...state.provisioningRuns };
|
|
4452
|
-
for (const [runId, run] of Object.entries(cleaned)) {
|
|
4453
|
-
if (run.teamName === request.teamName) {
|
|
4454
|
-
delete cleaned[runId];
|
|
4455
|
-
}
|
|
4456
|
-
}
|
|
4457
|
-
const nextErrors = { ...state.provisioningErrorByTeam };
|
|
4458
|
-
delete nextErrors[request.teamName];
|
|
4459
|
-
const nextSpawnStatuses = { ...state.memberSpawnStatusesByTeam };
|
|
4460
|
-
delete nextSpawnStatuses[request.teamName];
|
|
4461
|
-
const nextSpawnSnapshots = { ...state.memberSpawnSnapshotsByTeam };
|
|
4462
|
-
delete nextSpawnSnapshots[request.teamName];
|
|
4463
|
-
const nextRuntime = { ...state.teamAgentRuntimeByTeam };
|
|
4464
|
-
delete nextRuntime[request.teamName];
|
|
4465
|
-
const nextActiveTools = { ...state.activeToolsByTeam };
|
|
4466
|
-
delete nextActiveTools[request.teamName];
|
|
4467
|
-
const nextFinishedVisible = { ...state.finishedVisibleByTeam };
|
|
4468
|
-
delete nextFinishedVisible[request.teamName];
|
|
4469
|
-
const nextToolHistory = { ...state.toolHistoryByTeam };
|
|
4470
|
-
delete nextToolHistory[request.teamName];
|
|
4471
|
-
const nextRuntimeRunIdByTeam = { ...state.currentRuntimeRunIdByTeam };
|
|
4472
|
-
const previousRuntimeRunId = nextRuntimeRunIdByTeam[request.teamName];
|
|
4473
|
-
delete nextRuntimeRunIdByTeam[request.teamName];
|
|
4474
|
-
const nextIgnoredRuntimeRunIds = previousRuntimeRunId
|
|
4475
|
-
? {
|
|
4476
|
-
...state.ignoredRuntimeRunIds,
|
|
4477
|
-
[previousRuntimeRunId]: request.teamName,
|
|
4478
|
-
}
|
|
4479
|
-
: state.ignoredRuntimeRunIds;
|
|
4480
|
-
const visibleLoadingResets = collectTeamScopedVisibleLoadingResets(state, request.teamName);
|
|
4481
|
-
return {
|
|
4482
|
-
provisioningRuns: cleaned,
|
|
4483
|
-
provisioningErrorByTeam: nextErrors,
|
|
4484
|
-
memberSpawnStatusesByTeam: nextSpawnStatuses,
|
|
4485
|
-
memberSpawnSnapshotsByTeam: nextSpawnSnapshots,
|
|
4486
|
-
teamAgentRuntimeByTeam: nextRuntime,
|
|
4487
|
-
activeToolsByTeam: nextActiveTools,
|
|
4488
|
-
finishedVisibleByTeam: nextFinishedVisible,
|
|
4489
|
-
toolHistoryByTeam: nextToolHistory,
|
|
4490
|
-
currentRuntimeRunIdByTeam: nextRuntimeRunIdByTeam,
|
|
4491
|
-
ignoredProvisioningRunIds: state.ignoredProvisioningRunIds,
|
|
4492
|
-
ignoredRuntimeRunIds: nextIgnoredRuntimeRunIds,
|
|
4493
|
-
...visibleLoadingResets,
|
|
4494
|
-
};
|
|
4495
|
-
});
|
|
4496
|
-
|
|
4497
|
-
// Optimistic progress entry: ensures banner shows even if IPC progress is delayed/missed.
|
|
4498
|
-
const pendingRunId = `pending:${request.teamName}:${Date.now()}`;
|
|
4499
|
-
set((state) => ({
|
|
4500
|
-
provisioningRuns: {
|
|
4501
|
-
...state.provisioningRuns,
|
|
4502
|
-
[pendingRunId]: {
|
|
4503
|
-
runId: pendingRunId,
|
|
4504
|
-
teamName: request.teamName,
|
|
4505
|
-
state: 'spawning',
|
|
4506
|
-
message: '正在启动 Claude CLI 进程...',
|
|
4507
|
-
startedAt: floor,
|
|
4508
|
-
updatedAt: floor,
|
|
4509
|
-
},
|
|
4510
|
-
},
|
|
4511
|
-
currentProvisioningRunIdByTeam: {
|
|
4512
|
-
...state.currentProvisioningRunIdByTeam,
|
|
4513
|
-
[request.teamName]: pendingRunId,
|
|
4514
|
-
},
|
|
4515
|
-
// Synthetic card for the team list — visible until fetchTeams() picks up the real team.
|
|
4516
|
-
provisioningSnapshotByTeam: {
|
|
4517
|
-
...state.provisioningSnapshotByTeam,
|
|
4518
|
-
[request.teamName]: {
|
|
4519
|
-
teamName: request.teamName,
|
|
4520
|
-
displayName: request.displayName || request.teamName,
|
|
4521
|
-
description: request.description || '',
|
|
4522
|
-
color: request.color,
|
|
4523
|
-
memberCount: request.members.length,
|
|
4524
|
-
members: request.members.map((m) => ({ name: m.name, role: m.role })),
|
|
4525
|
-
taskCount: 0,
|
|
4526
|
-
lastActivity: null,
|
|
4527
|
-
projectPath: request.cwd || undefined,
|
|
4528
|
-
},
|
|
4529
|
-
},
|
|
4530
|
-
}));
|
|
4531
|
-
// Initialize per-team tool approval settings based on skipPermissions flag
|
|
4532
|
-
const initialSettings: ToolApprovalSettings =
|
|
4533
|
-
request.skipPermissions === false
|
|
4534
|
-
? DEFAULT_TOOL_APPROVAL_SETTINGS
|
|
4535
|
-
: { ...DEFAULT_TOOL_APPROVAL_SETTINGS, autoAllowAll: true };
|
|
4536
|
-
saveToolApprovalSettingsForTeam(request.teamName, initialSettings);
|
|
4537
|
-
set({ toolApprovalSettings: initialSettings });
|
|
4538
4457
|
try {
|
|
4539
4458
|
if (typeof api.teams.createTeam !== 'function') {
|
|
4540
4459
|
throw new Error(
|
|
4541
4460
|
'Current preload version does not support team:create. Restart the dev app.'
|
|
4542
4461
|
);
|
|
4543
4462
|
}
|
|
4544
|
-
|
|
4463
|
+
|
|
4464
|
+
// Just create the team config — no provisioning, no launching.
|
|
4465
|
+
await unwrapIpc('team:create', () => api.teams.createTeam(request));
|
|
4545
4466
|
|
|
4546
4467
|
// Persist per-team launch params (model, effort, limit context)
|
|
4547
4468
|
const baseModel = extractBaseModel(request.model, request.providerId);
|
|
@@ -4554,55 +4475,21 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
|
|
|
4554
4475
|
limitContext: request.limitContext ?? false,
|
|
4555
4476
|
};
|
|
4556
4477
|
saveLaunchParams(request.teamName, params);
|
|
4557
|
-
set((state) => ({
|
|
4558
|
-
launchParamsByTeam: {
|
|
4559
|
-
...state.launchParamsByTeam,
|
|
4560
|
-
[request.teamName]: params,
|
|
4561
|
-
},
|
|
4562
|
-
}));
|
|
4563
4478
|
|
|
4564
|
-
|
|
4565
|
-
|
|
4566
|
-
|
|
4567
|
-
|
|
4568
|
-
|
|
4569
|
-
|
|
4570
|
-
|
|
4571
|
-
|
|
4572
|
-
// when the invoke response arrives before IPC progress events.
|
|
4573
|
-
if (!realProgressAlreadyExists) {
|
|
4574
|
-
nextRuns[response.runId] = { ...pendingRun, runId: response.runId };
|
|
4575
|
-
}
|
|
4576
|
-
}
|
|
4577
|
-
return {
|
|
4578
|
-
provisioningRuns: nextRuns,
|
|
4579
|
-
currentProvisioningRunIdByTeam: {
|
|
4580
|
-
...state.currentProvisioningRunIdByTeam,
|
|
4581
|
-
[request.teamName]: response.runId,
|
|
4582
|
-
},
|
|
4583
|
-
currentRuntimeRunIdByTeam: {
|
|
4584
|
-
...state.currentRuntimeRunIdByTeam,
|
|
4585
|
-
[request.teamName]: response.runId,
|
|
4586
|
-
},
|
|
4587
|
-
};
|
|
4588
|
-
});
|
|
4589
|
-
try {
|
|
4590
|
-
await get().getProvisioningStatus(response.runId);
|
|
4591
|
-
} catch {
|
|
4592
|
-
// ignore — polling below will retry
|
|
4593
|
-
}
|
|
4479
|
+
// Initialize per-team tool approval settings based on skipPermissions flag
|
|
4480
|
+
const initialSettings: ToolApprovalSettings =
|
|
4481
|
+
request.skipPermissions === false
|
|
4482
|
+
? DEFAULT_TOOL_APPROVAL_SETTINGS
|
|
4483
|
+
: { ...DEFAULT_TOOL_APPROVAL_SETTINGS, autoAllowAll: true };
|
|
4484
|
+
saveToolApprovalSettingsForTeam(request.teamName, initialSettings);
|
|
4485
|
+
|
|
4486
|
+
// Refresh team list to pick up the new team
|
|
4594
4487
|
void get().fetchTeams();
|
|
4595
|
-
if (get().selectedTeamName === request.teamName) {
|
|
4596
|
-
void get().selectTeam(request.teamName, { allowReloadWhileProvisioning: true });
|
|
4597
|
-
}
|
|
4598
4488
|
window.setTimeout(() => {
|
|
4599
4489
|
void get().fetchTeams();
|
|
4600
|
-
if (get().selectedTeamName === request.teamName) {
|
|
4601
|
-
void get().selectTeam(request.teamName, { allowReloadWhileProvisioning: true });
|
|
4602
|
-
}
|
|
4603
4490
|
}, 1200);
|
|
4604
|
-
|
|
4605
|
-
return
|
|
4491
|
+
|
|
4492
|
+
return request.teamName;
|
|
4606
4493
|
} catch (error) {
|
|
4607
4494
|
const message =
|
|
4608
4495
|
error instanceof IpcError
|
|
@@ -4610,22 +4497,12 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
|
|
|
4610
4497
|
: error instanceof Error
|
|
4611
4498
|
? error.message
|
|
4612
4499
|
: 'Failed to create team';
|
|
4613
|
-
set((state) => {
|
|
4614
|
-
|
|
4615
|
-
|
|
4616
|
-
|
|
4617
|
-
|
|
4618
|
-
|
|
4619
|
-
}
|
|
4620
|
-
return {
|
|
4621
|
-
provisioningRuns: nextRuns,
|
|
4622
|
-
currentProvisioningRunIdByTeam: nextCurrentRunIdByTeam,
|
|
4623
|
-
provisioningErrorByTeam: {
|
|
4624
|
-
...state.provisioningErrorByTeam,
|
|
4625
|
-
[request.teamName]: message,
|
|
4626
|
-
},
|
|
4627
|
-
};
|
|
4628
|
-
});
|
|
4500
|
+
set((state) => ({
|
|
4501
|
+
provisioningErrorByTeam: {
|
|
4502
|
+
...state.provisioningErrorByTeam,
|
|
4503
|
+
[request.teamName]: message,
|
|
4504
|
+
},
|
|
4505
|
+
}));
|
|
4629
4506
|
throw error;
|
|
4630
4507
|
}
|
|
4631
4508
|
},
|
|
@@ -12,9 +12,7 @@ export function filterMainScreenCliProviders<
|
|
|
12
12
|
providerId: CliProviderId;
|
|
13
13
|
},
|
|
14
14
|
>(providers: readonly T[]): T[] {
|
|
15
|
-
return providers.filter((provider) =>
|
|
16
|
-
['anthropic', 'codex', 'gemini', 'opencode'].includes(provider.providerId)
|
|
17
|
-
);
|
|
15
|
+
return providers.filter((provider) => ['anthropic', 'codex'].includes(provider.providerId));
|
|
18
16
|
}
|
|
19
17
|
|
|
20
18
|
function createClaudeCodeProviderFromCliStatus(status: CliInstallationStatus): CliProviderStatus {
|
|
@@ -110,17 +108,12 @@ export function normalizeCreateLaunchProviderForUi(
|
|
|
110
108
|
providerId: TeamProviderId | undefined,
|
|
111
109
|
_multimodelEnabled: boolean
|
|
112
110
|
): TeamProviderId {
|
|
113
|
-
return providerId === 'anthropic' ||
|
|
114
|
-
providerId === 'codex' ||
|
|
115
|
-
providerId === 'gemini' ||
|
|
116
|
-
providerId === 'opencode'
|
|
117
|
-
? providerId
|
|
118
|
-
: 'anthropic';
|
|
111
|
+
return providerId === 'anthropic' || providerId === 'codex' ? providerId : 'anthropic';
|
|
119
112
|
}
|
|
120
113
|
|
|
121
114
|
export function isCreateLaunchProviderDisabled(
|
|
122
115
|
providerId: TeamProviderId,
|
|
123
116
|
_multimodelEnabled: boolean
|
|
124
117
|
): boolean {
|
|
125
|
-
return !['anthropic', 'codex'
|
|
118
|
+
return !['anthropic', 'codex'].includes(providerId);
|
|
126
119
|
}
|
|
@@ -46,15 +46,9 @@ function hashStringToIndex(str: string): number {
|
|
|
46
46
|
export function agentAvatarUrl(name: string, size = 64): string {
|
|
47
47
|
void size;
|
|
48
48
|
const normalized = name.trim().toLowerCase();
|
|
49
|
-
if (isLeadMemberName(normalized)) {
|
|
50
|
-
return LEAD_PARTICIPANT_AVATAR_URL;
|
|
51
|
-
}
|
|
52
49
|
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
return getParticipantAvatarUrlByIndex(
|
|
56
|
-
hashStringToIndex(normalized) % PARTICIPANT_AVATAR_URLS.length
|
|
57
|
-
);
|
|
50
|
+
// DiceBear adventurer avatars — deterministic per name, no API key needed
|
|
51
|
+
return `https://api.dicebear.com/9.x/adventurer/svg?seed=${encodeURIComponent(normalized)}&backgroundColor=c0aede,d1d4f9,ffd5dc,ffdfbf,b6e3f4,c1f0c1`;
|
|
58
52
|
}
|
|
59
53
|
|
|
60
54
|
export const STATUS_DOT_COLORS: Record<MemberStatus, string> = {
|
|
@@ -804,22 +798,16 @@ export function buildMemberAvatarMap(members: readonly MemberAvatarInput[]): Map
|
|
|
804
798
|
const teammateMembers = activeMembers.filter((member) => !isLeadMember(member));
|
|
805
799
|
|
|
806
800
|
for (const [index, member] of leadMembers.entries()) {
|
|
807
|
-
map.set(member.name,
|
|
801
|
+
map.set(member.name, agentAvatarUrl(member.name));
|
|
808
802
|
}
|
|
809
803
|
|
|
810
804
|
for (const [index, member] of teammateMembers.entries()) {
|
|
811
|
-
map.set(
|
|
812
|
-
member.name,
|
|
813
|
-
getParticipantAvatarUrlByIndex(1 + (index % (PARTICIPANT_AVATAR_URLS.length - 1)))
|
|
814
|
-
);
|
|
805
|
+
map.set(member.name, agentAvatarUrl(member.name));
|
|
815
806
|
}
|
|
816
807
|
|
|
817
808
|
for (const member of members) {
|
|
818
809
|
if (!map.has(member.name)) {
|
|
819
|
-
map.set(
|
|
820
|
-
member.name,
|
|
821
|
-
isLeadMember(member) ? LEAD_PARTICIPANT_AVATAR_URL : agentAvatarUrl(member.name)
|
|
822
|
-
);
|
|
810
|
+
map.set(member.name, agentAvatarUrl(member.name));
|
|
823
811
|
}
|
|
824
812
|
}
|
|
825
813
|
|
|
@@ -17,6 +17,8 @@ interface OpenCodeRuntimeDeliveryDiagnostics {
|
|
|
17
17
|
debugDetails: OpenCodeRuntimeDeliveryDebugDetails | null;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
+
const FAILED_WARNING =
|
|
21
|
+
'OpenCode runtime delivery failed. Message was saved to inbox, but live delivery did not complete.';
|
|
20
22
|
const PENDING_WARNING =
|
|
21
23
|
'OpenCode runtime delivery is still being checked. Message was saved and will be retried if needed.';
|
|
22
24
|
|
|
@@ -33,7 +35,7 @@ export function buildOpenCodeRuntimeDeliveryDiagnostics(
|
|
|
33
35
|
const isFailed = runtimeDelivery.delivered === false;
|
|
34
36
|
if (isFailed) {
|
|
35
37
|
return {
|
|
36
|
-
warning:
|
|
38
|
+
warning: FAILED_WARNING,
|
|
37
39
|
debugDetails: {
|
|
38
40
|
messageId: result.messageId,
|
|
39
41
|
providerId: runtimeDelivery.providerId,
|
|
@@ -64,7 +66,7 @@ export function buildOpenCodeRuntimeDeliveryDiagnostics(
|
|
|
64
66
|
debugDetails: {
|
|
65
67
|
messageId: result.messageId,
|
|
66
68
|
providerId: runtimeDelivery.providerId,
|
|
67
|
-
delivered: null,
|
|
69
|
+
delivered: typeof runtimeDelivery.delivered === 'boolean' ? runtimeDelivery.delivered : null,
|
|
68
70
|
responsePending: true,
|
|
69
71
|
responseState: runtimeDelivery.responseState ?? null,
|
|
70
72
|
ledgerStatus: runtimeDelivery.ledgerStatus ?? null,
|
|
@@ -39,11 +39,6 @@ const CODEX_SLASH_COMMAND_SUGGESTIONS: readonly KnownSlashCommandDefinition[] =
|
|
|
39
39
|
command: '/status',
|
|
40
40
|
description: 'Show session configuration and token usage.',
|
|
41
41
|
},
|
|
42
|
-
{
|
|
43
|
-
name: 'mcp',
|
|
44
|
-
command: '/mcp',
|
|
45
|
-
description: 'List configured MCP tools for this session.',
|
|
46
|
-
},
|
|
47
42
|
{
|
|
48
43
|
name: 'mention',
|
|
49
44
|
command: '/mention',
|
|
@@ -8,8 +8,10 @@ export function formatNextRun(isoString?: string): string {
|
|
|
8
8
|
if (!isoString) return '暂无';
|
|
9
9
|
try {
|
|
10
10
|
const date = new Date(isoString);
|
|
11
|
+
const ts = date.getTime();
|
|
12
|
+
if (!Number.isFinite(ts)) return isoString;
|
|
11
13
|
const now = Date.now();
|
|
12
|
-
const diffMs =
|
|
14
|
+
const diffMs = ts - now;
|
|
13
15
|
|
|
14
16
|
if (diffMs < 0) return '已逾期';
|
|
15
17
|
|
|
@@ -70,7 +70,20 @@ export function filterTeamMessages(
|
|
|
70
70
|
const summary = getSanitizedInboxMessageSummary(m).toLowerCase();
|
|
71
71
|
const from = (m.from ?? '').toLowerCase();
|
|
72
72
|
const to = (m.to ?? '').toLowerCase();
|
|
73
|
-
|
|
73
|
+
const sessionTitle = (m.session?.title ?? '').toLowerCase();
|
|
74
|
+
const sessionUserName = (m.session?.userName ?? '').toLowerCase();
|
|
75
|
+
const sessionChatName = (m.session?.chatName ?? '').toLowerCase();
|
|
76
|
+
const sessionKey = (m.session?.key ?? '').toLowerCase();
|
|
77
|
+
return (
|
|
78
|
+
text.includes(q) ||
|
|
79
|
+
summary.includes(q) ||
|
|
80
|
+
from.includes(q) ||
|
|
81
|
+
to.includes(q) ||
|
|
82
|
+
sessionTitle.includes(q) ||
|
|
83
|
+
sessionUserName.includes(q) ||
|
|
84
|
+
sessionChatName.includes(q) ||
|
|
85
|
+
sessionKey.includes(q)
|
|
86
|
+
);
|
|
74
87
|
});
|
|
75
88
|
}
|
|
76
89
|
|