@yancyyu/openhermit 1.6.38 → 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-ZEDfZyHb.js → TeamGraphOverlay-DqhQzcTr.js} +1 -1
- package/dist-renderer/assets/{_basePickBy-CIhniz70.js → _basePickBy-B7kSYPxr.js} +1 -1
- package/dist-renderer/assets/{_baseUniq-cKAW4Q8I.js → _baseUniq-CnjxqwAk.js} +1 -1
- package/dist-renderer/assets/{arc-YmNsoDXW.js → arc-CLeZuINP.js} +1 -1
- package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-DHEls2sX.js → architectureDiagram-VXUJARFQ-QKtqaqdY.js} +1 -1
- package/dist-renderer/assets/{blockDiagram-VD42YOAC-Bpwf1Sbg.js → blockDiagram-VD42YOAC-BqdrzO_f.js} +1 -1
- package/dist-renderer/assets/{c4Diagram-YG6GDRKO-B0IaQ4w5.js → c4Diagram-YG6GDRKO-gwPlCxDC.js} +1 -1
- package/dist-renderer/assets/channel-DpMHF50r.js +1 -0
- package/dist-renderer/assets/{chunk-4BX2VUAB-DLk-hcFc.js → chunk-4BX2VUAB-C6XLurL4.js} +1 -1
- package/dist-renderer/assets/{chunk-55IACEB6-1XRmX_Zm.js → chunk-55IACEB6-Ds6quhEP.js} +1 -1
- package/dist-renderer/assets/{chunk-B4BG7PRW-1waH1DAD.js → chunk-B4BG7PRW-5UlA1_e9.js} +1 -1
- package/dist-renderer/assets/{chunk-DI55MBZ5-BqpZBtrN.js → chunk-DI55MBZ5-ywFrqIsY.js} +1 -1
- package/dist-renderer/assets/{chunk-FMBD7UC4-Bly7vVym.js → chunk-FMBD7UC4-C7ifUA17.js} +1 -1
- package/dist-renderer/assets/{chunk-QN33PNHL-Ci2QWBAs.js → chunk-QN33PNHL-BxGCo80U.js} +1 -1
- package/dist-renderer/assets/{chunk-QZHKN3VN-YCqFW7d-.js → chunk-QZHKN3VN-B2CuaZs6.js} +1 -1
- package/dist-renderer/assets/{chunk-TZMSLE5B-B0xGXInl.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-DxcFNQKT.js → cose-bilkent-S5V4N54A-Cz1GVtLp.js} +1 -1
- package/dist-renderer/assets/{dagre-6UL2VRFP-DPo_RfZY.js → dagre-6UL2VRFP-BrmR-P4h.js} +1 -1
- package/dist-renderer/assets/{diagram-PSM6KHXK-U3hQsFe4.js → diagram-PSM6KHXK-DbNjC5Rg.js} +1 -1
- package/dist-renderer/assets/{diagram-QEK2KX5R-OrwrAy0V.js → diagram-QEK2KX5R-qkRX5_Mq.js} +1 -1
- package/dist-renderer/assets/{diagram-S2PKOQOG-CXATPWVw.js → diagram-S2PKOQOG-CyL5rCv2.js} +1 -1
- package/dist-renderer/assets/{erDiagram-Q2GNP2WA-B0e8AfMF.js → erDiagram-Q2GNP2WA-Dox3-bA5.js} +1 -1
- package/dist-renderer/assets/{flowDiagram-NV44I4VS-CXfzA4jJ.js → flowDiagram-NV44I4VS-BtkaxlDL.js} +1 -1
- package/dist-renderer/assets/{ganttDiagram-JELNMOA3-CMr08qVl.js → ganttDiagram-JELNMOA3-Dhy_d9GK.js} +1 -1
- package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-vYFHpPmy.js → gitGraphDiagram-V2S2FVAM-B5XRhIQA.js} +1 -1
- package/dist-renderer/assets/{graph-DOe5j8dH.js → graph-CsoEwUhS.js} +1 -1
- package/dist-renderer/assets/{index-BySQS7AB.js → index-BWPWmJNo.js} +1 -1
- package/dist-renderer/assets/{index-V7dAKPqd.js → index-Bu2R-Se7.js} +587 -705
- package/dist-renderer/assets/index-CnWV3BhG.css +32 -0
- package/dist-renderer/assets/{index-CzWxVCRL.js → index-D-3KgskL.js} +1 -1
- package/dist-renderer/assets/{index-VJ-MM9xa.js → index-DGEBzLNT.js} +1 -1
- package/dist-renderer/assets/{index-B2Dy7M2G.js → index-NhHNs2Oo.js} +1 -1
- package/dist-renderer/assets/{index-C_okzZXP.js → index-h17WuEyf.js} +1 -1
- package/dist-renderer/assets/{infoDiagram-HS3SLOUP-D_WubR0B.js → infoDiagram-HS3SLOUP-hMGmNojH.js} +1 -1
- package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-w9ca-1TI.js → journeyDiagram-XKPGCS4Q-DXV2rBDl.js} +1 -1
- package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-Jg9p6_pN.js → kanban-definition-3W4ZIXB7-Bf99WLRy.js} +1 -1
- package/dist-renderer/assets/{layout-B-z3y17c.js → layout-C3XWrpwo.js} +1 -1
- package/dist-renderer/assets/{linear-D-RTX5UW.js → linear-OEEcn8KN.js} +1 -1
- package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-CDQmHOYP.js → mindmap-definition-VGOIOE7T-Dpi3S2x4.js} +1 -1
- package/dist-renderer/assets/{pieDiagram-ADFJNKIX-D_odsQL7.js → pieDiagram-ADFJNKIX-xTPPhtNx.js} +1 -1
- package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-BRsmYWSA.js → quadrantDiagram-AYHSOK5B-euniyDlz.js} +1 -1
- package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-ChNE_BOV.js → requirementDiagram-UZGBJVZJ-D9Uiw4kF.js} +1 -1
- package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-C8FtpwKc.js → sankeyDiagram-TZEHDZUN-CySU4nED.js} +1 -1
- package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-DmLCzNcc.js → sequenceDiagram-WL72ISMW-JVGpET6V.js} +1 -1
- package/dist-renderer/assets/splashScene-D0YB9uxm.js +17 -0
- package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-WJBm4bhu.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-BXs_hOJs.js → timeline-definition-IT6M3QCI-DmycNUUe.js} +1 -1
- package/dist-renderer/assets/{treemap-GDKQZRPO-o04MA0G9.js → treemap-GDKQZRPO-DPq4gZuB.js} +1 -1
- package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-Czj69XRd.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 +2 -1
- package/src/main/server.ts +873 -221
- package/src/main/services/extensions/ExtensionFacadeService.ts +2 -5
- package/src/main/services/extensions/catalog/PluginCatalogService.ts +4 -2
- 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/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 +5 -6
- 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 +68 -18
- 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 +6 -125
- 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 +6 -6
- package/src/renderer/components/extensions/plugins/PluginsPanel.tsx +34 -21
- 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 +319 -123
- 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 +27 -17
- package/src/renderer/components/team/tools/McpChip.tsx +6 -3
- package/src/renderer/components/team/tools/SkillChip.tsx +2 -2
- package/src/renderer/components/team/tools/ToolsSection.tsx +418 -70
- 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/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 +15 -8
- package/src/shared/utils/providerExtensionCapabilities.ts +2 -2
- package/dist-renderer/assets/ProjectEditorOverlay-lJZi-9Hp.js +0 -52
- package/dist-renderer/assets/channel-yIlSKy0e.js +0 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-24fHez0s.js +0 -1
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-24fHez0s.js +0 -1
- package/dist-renderer/assets/clone-BTNuUva-.js +0 -1
- package/dist-renderer/assets/index-Bi6nrZ4z.css +0 -1
- package/dist-renderer/assets/splashScene-C8lWNnm4.js +0 -1
- package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-_m6iPPUR.js +0 -1
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
import { Textarea } from '@renderer/components/ui/textarea';
|
|
13
13
|
import { emitOpenHermitEvent, OPEN_HERMIT_EVENTS } from '@renderer/utils/openHermitEvents';
|
|
14
14
|
import appIcon from '@renderer/favicon.png';
|
|
15
|
-
import { Check, FileEdit, Loader2,
|
|
15
|
+
import { Check, FileEdit, Loader2, RotateCcw, X } from 'lucide-react';
|
|
16
16
|
|
|
17
17
|
import { SettingsSectionHeader } from '../components';
|
|
18
18
|
|
|
@@ -25,7 +25,7 @@ const CcConnectConfigRawDialog = ({
|
|
|
25
25
|
open,
|
|
26
26
|
onClose,
|
|
27
27
|
}: CcConnectConfigRawDialogProps): React.JSX.Element | null => {
|
|
28
|
-
const [filePath, setFilePath] = useState('~/.hermit/
|
|
28
|
+
const [filePath, setFilePath] = useState('~/.hermit/config.toml');
|
|
29
29
|
const [content, setContent] = useState('');
|
|
30
30
|
const [loading, setLoading] = useState(false);
|
|
31
31
|
const [saving, setSaving] = useState(false);
|
|
@@ -82,7 +82,7 @@ const CcConnectConfigRawDialog = ({
|
|
|
82
82
|
>
|
|
83
83
|
<DialogContent className="max-w-4xl">
|
|
84
84
|
<DialogHeader>
|
|
85
|
-
<DialogTitle
|
|
85
|
+
<DialogTitle>编辑配置</DialogTitle>
|
|
86
86
|
</DialogHeader>
|
|
87
87
|
<div className="space-y-3">
|
|
88
88
|
<p className="text-xs text-[var(--color-text-muted)]">配置文件:{filePath}</p>
|
|
@@ -105,8 +105,8 @@ const CcConnectConfigRawDialog = ({
|
|
|
105
105
|
</div>
|
|
106
106
|
)}
|
|
107
107
|
<p className="text-xs text-[var(--color-text-muted)]">
|
|
108
|
-
保存后将直接覆盖 Hermit
|
|
109
|
-
token
|
|
108
|
+
保存后将直接覆盖 Hermit 管理的配置文件。若修改了端口或
|
|
109
|
+
token,请点击”重启服务”生效。
|
|
110
110
|
</p>
|
|
111
111
|
</div>
|
|
112
112
|
<DialogFooter>
|
|
@@ -136,7 +136,6 @@ export const AdvancedSection = ({}: AdvancedSectionProps): React.JSX.Element =>
|
|
|
136
136
|
const [version, setVersion] = useState<string>('');
|
|
137
137
|
const [ccConfigOpen, setCcConfigOpen] = useState(false);
|
|
138
138
|
const [restarting, setRestarting] = useState(false);
|
|
139
|
-
const [reloading, setReloading] = useState(false);
|
|
140
139
|
const [restartMsg, setRestartMsg] = useState<string | null>(null);
|
|
141
140
|
|
|
142
141
|
useEffect(() => {
|
|
@@ -158,58 +157,28 @@ export const AdvancedSection = ({}: AdvancedSectionProps): React.JSX.Element =>
|
|
|
158
157
|
}
|
|
159
158
|
}, []);
|
|
160
159
|
|
|
161
|
-
const handleReload = useCallback(async () => {
|
|
162
|
-
setReloading(true);
|
|
163
|
-
setRestartMsg(null);
|
|
164
|
-
try {
|
|
165
|
-
await api.ccSettings.reload();
|
|
166
|
-
setRestartMsg('配置已重载');
|
|
167
|
-
} catch {
|
|
168
|
-
setRestartMsg('重载失败');
|
|
169
|
-
} finally {
|
|
170
|
-
setReloading(false);
|
|
171
|
-
setTimeout(() => setRestartMsg(null), 3000);
|
|
172
|
-
}
|
|
173
|
-
}, []);
|
|
174
|
-
|
|
175
160
|
return (
|
|
176
161
|
<div>
|
|
177
162
|
<SettingsSectionHeader title="服务配置" />
|
|
178
163
|
<div className="flex flex-wrap gap-2 py-2">
|
|
179
164
|
<button
|
|
180
165
|
onClick={() => setCcConfigOpen(true)}
|
|
181
|
-
className="flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-all duration-150 hover:bg-
|
|
166
|
+
className="flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-all duration-150 hover:bg-cyan-500/5"
|
|
182
167
|
style={{
|
|
183
|
-
borderColor: '
|
|
184
|
-
color: '
|
|
168
|
+
borderColor: 'rgba(6, 182, 212, 0.3)',
|
|
169
|
+
color: '#67e8f9',
|
|
185
170
|
}}
|
|
186
171
|
>
|
|
187
172
|
<FileEdit className="size-4" />
|
|
188
173
|
编辑 配置
|
|
189
174
|
</button>
|
|
190
|
-
<button
|
|
191
|
-
onClick={() => void handleReload()}
|
|
192
|
-
disabled={reloading || restarting}
|
|
193
|
-
className="flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-all duration-150 hover:bg-white/5 disabled:cursor-not-allowed disabled:opacity-50"
|
|
194
|
-
style={{
|
|
195
|
-
borderColor: 'var(--color-border)',
|
|
196
|
-
color: 'var(--color-text-secondary)',
|
|
197
|
-
}}
|
|
198
|
-
>
|
|
199
|
-
{reloading ? (
|
|
200
|
-
<Loader2 className="size-4 animate-spin" />
|
|
201
|
-
) : (
|
|
202
|
-
<RefreshCw className="size-4" />
|
|
203
|
-
)}
|
|
204
|
-
重载配置
|
|
205
|
-
</button>
|
|
206
175
|
<button
|
|
207
176
|
onClick={() => void handleRestart()}
|
|
208
|
-
disabled={restarting
|
|
177
|
+
disabled={restarting}
|
|
209
178
|
className="flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-all duration-150 hover:bg-white/5 disabled:cursor-not-allowed disabled:opacity-50"
|
|
210
179
|
style={{
|
|
211
180
|
borderColor: 'var(--color-border)',
|
|
212
|
-
color: 'var(--color-text-
|
|
181
|
+
color: 'var(--color-text-muted)',
|
|
213
182
|
}}
|
|
214
183
|
>
|
|
215
184
|
{restarting ? (
|
|
@@ -240,7 +209,7 @@ export const AdvancedSection = ({}: AdvancedSectionProps): React.JSX.Element =>
|
|
|
240
209
|
Version {version || '...'}
|
|
241
210
|
</p>
|
|
242
211
|
<p className="mt-2 text-xs leading-relaxed" style={{ color: 'var(--color-text-muted)' }}>
|
|
243
|
-
|
|
212
|
+
本地优先的 AI Agent 团队工作台。支持多模型供应商接入、自主任务管理和跨团队协作。
|
|
244
213
|
</p>
|
|
245
214
|
</div>
|
|
246
215
|
</div>
|
|
@@ -425,112 +425,67 @@ export const CliStatusSection = ({
|
|
|
425
425
|
{effectiveCliStatus.binaryPath}
|
|
426
426
|
</p>
|
|
427
427
|
)}
|
|
428
|
-
<div className="
|
|
428
|
+
<div className="mt-3 grid gap-2">
|
|
429
429
|
{ALL_AGENT_TYPES.map((agentType) => {
|
|
430
430
|
const provider = cliProviderStatusByAgentType.get(agentType) ?? null;
|
|
431
431
|
const harnessProviders = globalProvidersByAgentType.get(agentType) ?? [];
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
<div
|
|
435
|
-
key={agentType}
|
|
436
|
-
className="grid grid-cols-[minmax(0,1fr)_auto] gap-x-3 gap-y-2 rounded-md border px-3 py-2"
|
|
437
|
-
style={{
|
|
438
|
-
borderColor: 'var(--color-border-subtle)',
|
|
439
|
-
backgroundColor: 'rgba(255, 255, 255, 0.02)',
|
|
440
|
-
}}
|
|
441
|
-
>
|
|
442
|
-
<div className="min-w-0">
|
|
443
|
-
<div className="flex items-center gap-2 text-xs">
|
|
444
|
-
<Terminal
|
|
445
|
-
className="size-4 shrink-0"
|
|
446
|
-
style={{ color: 'var(--color-text-muted)' }}
|
|
447
|
-
/>
|
|
448
|
-
<span
|
|
449
|
-
className="font-medium"
|
|
450
|
-
style={{ color: 'var(--color-text-secondary)' }}
|
|
451
|
-
>
|
|
452
|
-
{AGENT_TYPE_LABELS[agentType]}
|
|
453
|
-
</span>
|
|
454
|
-
<span style={{ color: 'var(--color-text-muted)' }}>
|
|
455
|
-
{harnessProviders.length > 0
|
|
456
|
-
? `${harnessProviders.length} 个 Provider`
|
|
457
|
-
: '未配置 Provider'}
|
|
458
|
-
</span>
|
|
459
|
-
</div>
|
|
460
|
-
<div
|
|
461
|
-
className="mt-1 flex flex-wrap gap-x-3 gap-y-1 text-[11px]"
|
|
462
|
-
style={{ color: 'var(--color-text-muted)' }}
|
|
463
|
-
>
|
|
464
|
-
<span>Agent 类型:{agentType}</span>
|
|
465
|
-
<span>Provider:{harnessProviders.length}</span>
|
|
466
|
-
</div>
|
|
467
|
-
</div>
|
|
468
|
-
<div className="flex shrink-0 items-start gap-2">
|
|
469
|
-
<button
|
|
470
|
-
type="button"
|
|
471
|
-
onClick={() => handleHarnessManage(agentType)}
|
|
472
|
-
className="flex items-center gap-1 rounded-md border px-2 py-[3px] text-[10px] font-medium transition-colors hover:bg-white/5"
|
|
473
|
-
style={{
|
|
474
|
-
borderColor: 'var(--color-border)',
|
|
475
|
-
color: 'var(--color-text-secondary)',
|
|
476
|
-
}}
|
|
477
|
-
>
|
|
478
|
-
<SlidersHorizontal className="size-3" />
|
|
479
|
-
配置
|
|
480
|
-
</button>
|
|
481
|
-
</div>
|
|
482
|
-
</div>
|
|
483
|
-
);
|
|
484
|
-
}
|
|
432
|
+
const hasProviders = harnessProviders.length > 0;
|
|
433
|
+
|
|
485
434
|
return (
|
|
486
435
|
<div
|
|
487
436
|
key={agentType}
|
|
488
|
-
className="
|
|
437
|
+
className="flex items-center gap-3 rounded-lg border px-3.5 py-2.5 transition-colors"
|
|
489
438
|
style={{
|
|
490
|
-
borderColor: 'var(--color-border-subtle)',
|
|
491
|
-
backgroundColor: '
|
|
439
|
+
borderColor: hasProviders ? 'var(--color-border-emphasis)' : 'var(--color-border-subtle)',
|
|
440
|
+
backgroundColor: 'var(--color-surface-raised)',
|
|
441
|
+
borderLeftWidth: hasProviders ? '2px' : '1px',
|
|
442
|
+
borderLeftColor: hasProviders ? 'var(--color-accent)' : 'var(--color-border-subtle)',
|
|
443
|
+
opacity: hasProviders ? 1 : 0.5,
|
|
492
444
|
}}
|
|
493
445
|
>
|
|
494
|
-
|
|
495
|
-
<
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
</div>
|
|
511
|
-
<div
|
|
512
|
-
className="mt-1 flex flex-wrap gap-x-3 gap-y-1 text-[11px]"
|
|
513
|
-
style={{ color: 'var(--color-text-muted)' }}
|
|
446
|
+
{provider ? (
|
|
447
|
+
<ProviderBrandLogo
|
|
448
|
+
providerId={provider.providerId}
|
|
449
|
+
className="size-4 shrink-0"
|
|
450
|
+
/>
|
|
451
|
+
) : (
|
|
452
|
+
<Terminal
|
|
453
|
+
className="size-4 shrink-0"
|
|
454
|
+
style={{ color: 'var(--color-text-muted)' }}
|
|
455
|
+
/>
|
|
456
|
+
)}
|
|
457
|
+
<div className="min-w-0 flex-1">
|
|
458
|
+
<div className="flex items-center gap-1.5">
|
|
459
|
+
<span
|
|
460
|
+
className="truncate text-xs font-medium"
|
|
461
|
+
style={{ color: 'var(--color-text)' }}
|
|
514
462
|
>
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
</div>
|
|
519
|
-
<div className="flex shrink-0 items-start gap-2">
|
|
520
|
-
<button
|
|
521
|
-
type="button"
|
|
522
|
-
onClick={() => handleProviderManage(provider.providerId)}
|
|
523
|
-
className="flex items-center gap-1 rounded-md border px-2 py-[3px] text-[10px] font-medium transition-colors hover:bg-white/5 disabled:opacity-50"
|
|
524
|
-
style={{
|
|
525
|
-
borderColor: 'var(--color-border)',
|
|
526
|
-
color: 'var(--color-text-secondary)',
|
|
527
|
-
}}
|
|
528
|
-
>
|
|
529
|
-
<SlidersHorizontal className="size-3" />
|
|
530
|
-
配置
|
|
531
|
-
</button>
|
|
463
|
+
{provider?.displayName ?? AGENT_TYPE_LABELS[agentType]}
|
|
464
|
+
</span>
|
|
465
|
+
{provider?.providerId === 'codex' ? <ProviderBetaBadge /> : null}
|
|
532
466
|
</div>
|
|
467
|
+
{hasProviders && (
|
|
468
|
+
<span className="text-[10px]" style={{ color: 'var(--color-text-muted)' }}>
|
|
469
|
+
{harnessProviders.length} provider
|
|
470
|
+
</span>
|
|
471
|
+
)}
|
|
533
472
|
</div>
|
|
473
|
+
<button
|
|
474
|
+
type="button"
|
|
475
|
+
onClick={() =>
|
|
476
|
+
provider
|
|
477
|
+
? handleProviderManage(provider.providerId)
|
|
478
|
+
: handleHarnessManage(agentType)
|
|
479
|
+
}
|
|
480
|
+
className="flex shrink-0 items-center gap-1.5 rounded-md border px-2 py-1 text-[10px] font-medium transition-colors hover:bg-white/5"
|
|
481
|
+
style={{
|
|
482
|
+
borderColor: 'var(--color-border-subtle)',
|
|
483
|
+
color: 'var(--color-text-muted)',
|
|
484
|
+
}}
|
|
485
|
+
>
|
|
486
|
+
<SlidersHorizontal className="size-3" />
|
|
487
|
+
配置
|
|
488
|
+
</button>
|
|
534
489
|
</div>
|
|
535
490
|
);
|
|
536
491
|
})}
|
|
@@ -597,7 +552,7 @@ export const CliStatusSection = ({
|
|
|
597
552
|
className="h-full rounded-full transition-all duration-300"
|
|
598
553
|
style={{
|
|
599
554
|
width: `${downloadProgress}%`,
|
|
600
|
-
backgroundColor: '#
|
|
555
|
+
backgroundColor: '#6366f1',
|
|
601
556
|
}}
|
|
602
557
|
/>
|
|
603
558
|
) : (
|
|
@@ -888,30 +843,34 @@ const GenericHarnessProviderDialog = ({
|
|
|
888
843
|
return (
|
|
889
844
|
<div
|
|
890
845
|
key={provider.name}
|
|
891
|
-
className="rounded-lg border px-3 py-2"
|
|
846
|
+
className="rounded-lg border px-3.5 py-2.5"
|
|
892
847
|
style={{
|
|
893
|
-
borderColor: 'var(--color-border-subtle)',
|
|
894
|
-
backgroundColor: '
|
|
848
|
+
borderColor: provider.api_key ? 'var(--color-border)' : 'var(--color-border-subtle)',
|
|
849
|
+
backgroundColor: 'var(--color-surface-raised)',
|
|
850
|
+
borderLeftWidth: provider.api_key ? '2px' : '1px',
|
|
851
|
+
borderLeftColor: provider.api_key ? 'var(--color-accent)' : 'var(--color-border-subtle)',
|
|
895
852
|
}}
|
|
896
853
|
>
|
|
897
|
-
<div className="flex
|
|
898
|
-
<div className="
|
|
899
|
-
|
|
854
|
+
<div className="flex items-center justify-between gap-2">
|
|
855
|
+
<div className="flex items-center gap-2">
|
|
856
|
+
<span
|
|
857
|
+
className="size-1.5 shrink-0 rounded-full"
|
|
858
|
+
style={{
|
|
859
|
+
backgroundColor: provider.api_key ? 'var(--color-accent)' : '#fbbf24',
|
|
860
|
+
}}
|
|
861
|
+
/>
|
|
862
|
+
<span className="text-sm font-medium" style={{ color: 'var(--color-text)' }}>
|
|
863
|
+
{provider.name}
|
|
864
|
+
</span>
|
|
900
865
|
</div>
|
|
901
|
-
<span
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
backgroundColor: provider.api_key
|
|
906
|
-
? 'rgba(74, 222, 128, 0.14)'
|
|
907
|
-
: 'rgba(245, 158, 11, 0.12)',
|
|
908
|
-
}}
|
|
909
|
-
>
|
|
910
|
-
{provider.api_key ? 'API Key 已配置' : '未配置 Key'}
|
|
866
|
+
<span className="text-[10px]" style={{
|
|
867
|
+
color: provider.api_key ? 'var(--color-accent)' : '#fbbf24',
|
|
868
|
+
}}>
|
|
869
|
+
{provider.api_key ? 'Key 已配置' : '未配置'}
|
|
911
870
|
</span>
|
|
912
871
|
</div>
|
|
913
872
|
<div
|
|
914
|
-
className="mt-1 flex flex-wrap gap-x-
|
|
873
|
+
className="mt-1.5 flex flex-wrap gap-x-4 gap-y-1 text-[11px]"
|
|
915
874
|
style={{ color: 'var(--color-text-muted)' }}
|
|
916
875
|
>
|
|
917
876
|
<span>端点:{endpoint}</span>
|
|
@@ -346,7 +346,7 @@ const SaveStatusBadge = ({
|
|
|
346
346
|
return (
|
|
347
347
|
<span
|
|
348
348
|
className="flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px]"
|
|
349
|
-
style={{ backgroundColor: 'rgba(
|
|
349
|
+
style={{ backgroundColor: 'rgba(129, 140, 248, 0.15)', color: '#818cf8' }}
|
|
350
350
|
>
|
|
351
351
|
<Loader2 className="size-3 animate-spin" />
|
|
352
352
|
保存中...
|
|
@@ -81,7 +81,7 @@ const CompactNum = ({
|
|
|
81
81
|
}}
|
|
82
82
|
className={cn(
|
|
83
83
|
'h-8 w-24 rounded-md border bg-transparent px-2 text-right text-xs tabular-nums',
|
|
84
|
-
'focus:outline-none focus:ring-1 focus:ring-
|
|
84
|
+
'focus:outline-none focus:ring-1 focus:ring-[var(--color-border-emphasis)]',
|
|
85
85
|
className
|
|
86
86
|
)}
|
|
87
87
|
style={{ borderColor: 'var(--color-border-subtle)', color: 'var(--color-text)' }}
|
|
@@ -439,9 +439,17 @@ export const GeneralSection = ({
|
|
|
439
439
|
className={cn(
|
|
440
440
|
'rounded-[3px] px-3 py-1 text-xs font-medium transition-colors disabled:opacity-50',
|
|
441
441
|
safeConfig.general.theme === opt.value
|
|
442
|
-
? '
|
|
442
|
+
? 'shadow-sm'
|
|
443
443
|
: 'text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]'
|
|
444
444
|
)}
|
|
445
|
+
style={
|
|
446
|
+
safeConfig.general.theme === opt.value
|
|
447
|
+
? {
|
|
448
|
+
backgroundColor: 'rgba(6, 182, 212, 0.1)',
|
|
449
|
+
color: '#67e8f9',
|
|
450
|
+
}
|
|
451
|
+
: undefined
|
|
452
|
+
}
|
|
445
453
|
onClick={() => onThemeChange(opt.value)}
|
|
446
454
|
>
|
|
447
455
|
{opt.label}
|
|
@@ -526,7 +534,7 @@ export const GeneralSection = ({
|
|
|
526
534
|
min={0}
|
|
527
535
|
/>
|
|
528
536
|
</SettingRow>
|
|
529
|
-
<SettingRow label="日志等级" description="
|
|
537
|
+
<SettingRow label="日志等级" description="运行时日志输出级别">
|
|
530
538
|
<SettingsSelect
|
|
531
539
|
value={ccSettings.log_level}
|
|
532
540
|
options={CC_LOG_LEVEL_OPTIONS}
|
|
@@ -13,7 +13,6 @@ import type { CcAgentType } from '@renderer/components/team/HarnessCards';
|
|
|
13
13
|
import { HarnessIcon } from '@renderer/components/team/HarnessSelect';
|
|
14
14
|
import { cn } from '@renderer/lib/utils';
|
|
15
15
|
import { OPEN_HERMIT_EVENTS } from '@renderer/utils/openHermitEvents';
|
|
16
|
-
import { CheckCircle2 } from 'lucide-react';
|
|
17
16
|
|
|
18
17
|
import { SettingsSectionHeader } from '../components/SettingsSectionHeader';
|
|
19
18
|
import { CliStatusSection } from './CliStatusSection';
|
|
@@ -110,13 +109,16 @@ export const HarnessSection = (): React.JSX.Element => {
|
|
|
110
109
|
return (
|
|
111
110
|
<div
|
|
112
111
|
key={type}
|
|
113
|
-
className="flex items-center gap-2 rounded-lg border px-3
|
|
112
|
+
className="flex h-14 items-center gap-2.5 rounded-lg border px-3"
|
|
114
113
|
style={{
|
|
115
|
-
|
|
116
|
-
|
|
114
|
+
borderLeftWidth: covered ? '2px' : '1px',
|
|
115
|
+
borderLeftColor: covered ? 'var(--color-accent)' : 'var(--color-border-subtle)',
|
|
116
|
+
borderColor: covered ? 'var(--color-border)' : 'var(--color-border-subtle)',
|
|
117
|
+
backgroundColor: 'var(--color-surface-raised)',
|
|
118
|
+
opacity: covered ? 1 : 0.5,
|
|
117
119
|
}}
|
|
118
120
|
>
|
|
119
|
-
<HarnessIcon type={type} className="size-
|
|
121
|
+
<HarnessIcon type={type} className="size-4 shrink-0" />
|
|
120
122
|
<div className="min-w-0 flex-1">
|
|
121
123
|
<p
|
|
122
124
|
className="truncate text-xs font-medium"
|
|
@@ -124,16 +126,18 @@ export const HarnessSection = (): React.JSX.Element => {
|
|
|
124
126
|
>
|
|
125
127
|
{AGENT_TYPE_LABELS[type]}
|
|
126
128
|
</p>
|
|
127
|
-
{covered && (
|
|
128
|
-
<p
|
|
129
|
-
className="truncate text-[10px]"
|
|
130
|
-
style={{ color: 'var(--color-text-muted)' }}
|
|
131
|
-
>
|
|
132
|
-
{covering.join(', ')}
|
|
133
|
-
</p>
|
|
134
|
-
)}
|
|
135
129
|
</div>
|
|
136
|
-
{covered &&
|
|
130
|
+
{covered && (
|
|
131
|
+
<span
|
|
132
|
+
className="shrink-0 rounded-full px-1.5 py-0.5 text-[10px] font-medium"
|
|
133
|
+
style={{
|
|
134
|
+
backgroundColor: 'rgba(74, 222, 128, 0.1)',
|
|
135
|
+
color: 'var(--color-accent)',
|
|
136
|
+
}}
|
|
137
|
+
>
|
|
138
|
+
{covering.length}
|
|
139
|
+
</span>
|
|
140
|
+
)}
|
|
137
141
|
</div>
|
|
138
142
|
);
|
|
139
143
|
})}
|
|
@@ -501,8 +501,8 @@ function AddPlatformDialog({
|
|
|
501
501
|
onAdded(projectName);
|
|
502
502
|
if (result.restartRequired) {
|
|
503
503
|
const shouldRestart = await confirm({
|
|
504
|
-
title: '
|
|
505
|
-
message: '
|
|
504
|
+
title: '重启服务',
|
|
505
|
+
message: '渠道已添加。需要重启服务才会生效。',
|
|
506
506
|
confirmLabel: '立即重启',
|
|
507
507
|
cancelLabel: '稍后重启',
|
|
508
508
|
});
|
|
@@ -585,7 +585,7 @@ function AddPlatformDialog({
|
|
|
585
585
|
{error && <p className="text-sm text-red-400">{error}</p>}
|
|
586
586
|
|
|
587
587
|
<p className="text-xs" style={{ color: 'var(--color-text-muted)' }}>
|
|
588
|
-
|
|
588
|
+
添加后需要重启服务才能生效。
|
|
589
589
|
</p>
|
|
590
590
|
</div>
|
|
591
591
|
|
|
@@ -229,24 +229,17 @@ export function TaskBusSection(): React.JSX.Element {
|
|
|
229
229
|
.catch(() => {})
|
|
230
230
|
.finally(() => setLoading(false));
|
|
231
231
|
|
|
232
|
-
// Restore telemetry status
|
|
233
|
-
fetch('/api/
|
|
232
|
+
// Restore telemetry status on mount. Local data collection does not depend on Redis/task bus.
|
|
233
|
+
fetch('/api/telemetry/status')
|
|
234
234
|
.then((r) => r.json())
|
|
235
|
-
.then((
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
.then((r) => r.json())
|
|
239
|
-
.then((s: TelemetryStatus) => {
|
|
240
|
-
if (s.connected) setConnected(true);
|
|
241
|
-
if ('sessions' in s && s.sessions > 0) setTelemetryStatus(s);
|
|
242
|
-
})
|
|
243
|
-
.catch(() => {});
|
|
244
|
-
}
|
|
235
|
+
.then((s: TelemetryStatus) => {
|
|
236
|
+
setTelemetryStatus(s);
|
|
237
|
+
setConnected(s.connected === true);
|
|
245
238
|
})
|
|
246
239
|
.catch(() => {});
|
|
247
240
|
|
|
248
241
|
const poll = setInterval(() => {
|
|
249
|
-
if (
|
|
242
|
+
if (collectionEnabled) {
|
|
250
243
|
fetch('/api/telemetry/status')
|
|
251
244
|
.then((r) => r.json())
|
|
252
245
|
.then((s: TelemetryStatus) => {
|
|
@@ -440,34 +433,34 @@ export function TaskBusSection(): React.JSX.Element {
|
|
|
440
433
|
</div>
|
|
441
434
|
</SettingRow>
|
|
442
435
|
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
</span>
|
|
462
|
-
</div>
|
|
436
|
+
<div
|
|
437
|
+
className="flex items-center gap-3 border-b py-3"
|
|
438
|
+
style={{ borderColor: 'var(--color-border-subtle)' }}
|
|
439
|
+
>
|
|
440
|
+
<Button
|
|
441
|
+
size="sm"
|
|
442
|
+
variant="outline"
|
|
443
|
+
onClick={triggerScan}
|
|
444
|
+
disabled={scanning || !collectionEnabled}
|
|
445
|
+
className="gap-1.5"
|
|
446
|
+
>
|
|
447
|
+
{scanning ? <Loader2 size={12} className="animate-spin" /> : <BarChart3 size={12} />}
|
|
448
|
+
{scanning ? '采集中...' : '立即采集'}
|
|
449
|
+
</Button>
|
|
450
|
+
<span className="text-[10px] text-[var(--color-text-muted)]">
|
|
451
|
+
本地扫描,不依赖团队总线或 Redis。{!collectionEnabled ? '开启数据采集后可手动刷新。' : ''}
|
|
452
|
+
</span>
|
|
453
|
+
</div>
|
|
463
454
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
)
|
|
469
|
-
|
|
470
|
-
|
|
455
|
+
<div className="py-3">
|
|
456
|
+
{telemetryStatus ? (
|
|
457
|
+
<UsageDashboard status={telemetryStatus} />
|
|
458
|
+
) : (
|
|
459
|
+
<div className="rounded-md border border-[var(--color-border)] bg-[var(--color-surface-raised)] p-4 text-xs text-[var(--color-text-muted)]">
|
|
460
|
+
使用指标概览加载中;开启数据采集后会扫描本机 Claude Code 会话文件。
|
|
461
|
+
</div>
|
|
462
|
+
)}
|
|
463
|
+
</div>
|
|
471
464
|
|
|
472
465
|
<SettingsSectionHeader title="团队总线" icon={<Radio size={12} />} />
|
|
473
466
|
|