@yancyyu/openhermit 1.6.38 → 1.6.40
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-CemDOX-3.js +58 -0
- package/dist-renderer/assets/{TeamGraphOverlay-ZEDfZyHb.js → TeamGraphOverlay-hPY770Db.js} +1 -1
- package/dist-renderer/assets/{_basePickBy-CIhniz70.js → _basePickBy-BHHrJT1i.js} +1 -1
- package/dist-renderer/assets/{_baseUniq-cKAW4Q8I.js → _baseUniq-CWErBtke.js} +1 -1
- package/dist-renderer/assets/{arc-YmNsoDXW.js → arc-C_o2_Uv8.js} +1 -1
- package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-DHEls2sX.js → architectureDiagram-VXUJARFQ-DUW0LI3t.js} +1 -1
- package/dist-renderer/assets/{blockDiagram-VD42YOAC-Bpwf1Sbg.js → blockDiagram-VD42YOAC-CWbCE9hQ.js} +1 -1
- package/dist-renderer/assets/{c4Diagram-YG6GDRKO-B0IaQ4w5.js → c4Diagram-YG6GDRKO-BjLadrfV.js} +1 -1
- package/dist-renderer/assets/channel-DyP9YlCF.js +1 -0
- package/dist-renderer/assets/{chunk-4BX2VUAB-DLk-hcFc.js → chunk-4BX2VUAB-CPnvjZl9.js} +1 -1
- package/dist-renderer/assets/{chunk-55IACEB6-1XRmX_Zm.js → chunk-55IACEB6-OlL47yXQ.js} +1 -1
- package/dist-renderer/assets/{chunk-B4BG7PRW-1waH1DAD.js → chunk-B4BG7PRW-DTasjbm8.js} +1 -1
- package/dist-renderer/assets/{chunk-DI55MBZ5-BqpZBtrN.js → chunk-DI55MBZ5-C5_Xaqkk.js} +1 -1
- package/dist-renderer/assets/{chunk-FMBD7UC4-Bly7vVym.js → chunk-FMBD7UC4-NdoM4DMR.js} +1 -1
- package/dist-renderer/assets/{chunk-QN33PNHL-Ci2QWBAs.js → chunk-QN33PNHL-C8Fybejy.js} +1 -1
- package/dist-renderer/assets/{chunk-QZHKN3VN-YCqFW7d-.js → chunk-QZHKN3VN-E98TYFXJ.js} +1 -1
- package/dist-renderer/assets/{chunk-TZMSLE5B-B0xGXInl.js → chunk-TZMSLE5B-h4lFgkIq.js} +1 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-BqffFTae.js +1 -0
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-BqffFTae.js +1 -0
- package/dist-renderer/assets/clone-MPcKWs2O.js +1 -0
- package/dist-renderer/assets/{cose-bilkent-S5V4N54A-DxcFNQKT.js → cose-bilkent-S5V4N54A-DtQ7fkrs.js} +1 -1
- package/dist-renderer/assets/{dagre-6UL2VRFP-DPo_RfZY.js → dagre-6UL2VRFP-CN-nL_z4.js} +1 -1
- package/dist-renderer/assets/{diagram-PSM6KHXK-U3hQsFe4.js → diagram-PSM6KHXK-DVJtqmm-.js} +1 -1
- package/dist-renderer/assets/{diagram-QEK2KX5R-OrwrAy0V.js → diagram-QEK2KX5R-DlxHxyXh.js} +1 -1
- package/dist-renderer/assets/{diagram-S2PKOQOG-CXATPWVw.js → diagram-S2PKOQOG-7dpzO6x6.js} +1 -1
- package/dist-renderer/assets/{erDiagram-Q2GNP2WA-B0e8AfMF.js → erDiagram-Q2GNP2WA-GP1TqsHi.js} +1 -1
- package/dist-renderer/assets/{flowDiagram-NV44I4VS-CXfzA4jJ.js → flowDiagram-NV44I4VS-C7ZLETuH.js} +1 -1
- package/dist-renderer/assets/{ganttDiagram-JELNMOA3-CMr08qVl.js → ganttDiagram-JELNMOA3-CvPB68dH.js} +1 -1
- package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-vYFHpPmy.js → gitGraphDiagram-V2S2FVAM-B5yOm3w7.js} +1 -1
- package/dist-renderer/assets/{graph-DOe5j8dH.js → graph-smeyY1YZ.js} +1 -1
- package/dist-renderer/assets/{index-BySQS7AB.js → index-BJx8XvG1.js} +1 -1
- package/dist-renderer/assets/{index-C_okzZXP.js → index-CQaXUAua.js} +1 -1
- package/dist-renderer/assets/{index-VJ-MM9xa.js → index-CajRpxO2.js} +1 -1
- package/dist-renderer/assets/{index-V7dAKPqd.js → index-ChG4rE-E.js} +587 -705
- package/dist-renderer/assets/index-DUd0uw9C.css +32 -0
- package/dist-renderer/assets/{index-CzWxVCRL.js → index-IhmXZWqf.js} +1 -1
- package/dist-renderer/assets/{index-B2Dy7M2G.js → index-x_JkoDRH.js} +1 -1
- package/dist-renderer/assets/{infoDiagram-HS3SLOUP-D_WubR0B.js → infoDiagram-HS3SLOUP-D-hWRQGY.js} +1 -1
- package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-w9ca-1TI.js → journeyDiagram-XKPGCS4Q-Bb6W8rUG.js} +1 -1
- package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-Jg9p6_pN.js → kanban-definition-3W4ZIXB7-CnHdUX0q.js} +1 -1
- package/dist-renderer/assets/{layout-B-z3y17c.js → layout-pqss_zkI.js} +1 -1
- package/dist-renderer/assets/{linear-D-RTX5UW.js → linear-B1mFITNh.js} +1 -1
- package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-CDQmHOYP.js → mindmap-definition-VGOIOE7T-DTD9q7-D.js} +1 -1
- package/dist-renderer/assets/{pieDiagram-ADFJNKIX-D_odsQL7.js → pieDiagram-ADFJNKIX-Df3mhrn7.js} +1 -1
- package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-BRsmYWSA.js → quadrantDiagram-AYHSOK5B-B1FZ09vH.js} +1 -1
- package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-ChNE_BOV.js → requirementDiagram-UZGBJVZJ-aEO78thZ.js} +1 -1
- package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-C8FtpwKc.js → sankeyDiagram-TZEHDZUN-6Ui--jp-.js} +1 -1
- package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-DmLCzNcc.js → sequenceDiagram-WL72ISMW-DF4Q1cAM.js} +1 -1
- package/dist-renderer/assets/splashScene-D0YB9uxm.js +17 -0
- package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-WJBm4bhu.js → stateDiagram-FKZM4ZOC-BqA2BI8C.js} +1 -1
- package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-Cs2ZtUD2.js +1 -0
- package/dist-renderer/assets/{timeline-definition-IT6M3QCI-BXs_hOJs.js → timeline-definition-IT6M3QCI-DoOkw_A8.js} +1 -1
- package/dist-renderer/assets/{treemap-GDKQZRPO-o04MA0G9.js → treemap-GDKQZRPO-DUe26QdD.js} +1 -1
- package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-Czj69XRd.js → xychartDiagram-PRI3JC2R-BKCnj5Xn.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/chat/ChatHistoryItem.tsx +1 -1
- package/src/renderer/components/chat/items/SubagentItem.tsx +2 -2
- package/src/renderer/components/chat/viewers/MermaidDiagram.tsx +2 -2
- package/src/renderer/components/common/ErrorBoundary.tsx +1 -1
- package/src/renderer/components/common/TerminalPane.tsx +213 -0
- package/src/renderer/components/dashboard/CliStatusBanner.tsx +7 -7
- package/src/renderer/components/dashboard/DashboardView.tsx +9 -36
- package/src/renderer/components/extensions/ExtensionStoreView.tsx +7 -126
- package/src/renderer/components/extensions/ExtensionsSubTabTrigger.tsx +1 -1
- package/src/renderer/components/extensions/common/ExtensionToast.tsx +3 -3
- package/src/renderer/components/extensions/common/SourceBadge.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/CategoryChips.tsx +1 -1
- package/src/renderer/components/extensions/plugins/PluginCard.tsx +6 -6
- package/src/renderer/components/extensions/plugins/PluginDetailDialog.tsx +2 -2
- package/src/renderer/components/extensions/plugins/PluginsPanel.tsx +34 -21
- package/src/renderer/components/extensions/skills/SkillEditorDialog.tsx +1 -1
- package/src/renderer/components/extensions/skills/SkillsLibraryPanel.tsx +335 -0
- package/src/renderer/components/layout/PaneContent.tsx +8 -1
- package/src/renderer/components/layout/PaneResizeHandle.tsx +2 -2
- package/src/renderer/components/layout/Sidebar.tsx +13 -56
- package/src/renderer/components/layout/SortableTab.tsx +22 -33
- package/src/renderer/components/layout/TabBar.tsx +1 -1
- package/src/renderer/components/layout/TabContextMenu.tsx +1 -1
- package/src/renderer/components/report/sections/CostSection.tsx +2 -2
- package/src/renderer/components/report/sections/InsightsSection.tsx +1 -1
- package/src/renderer/components/runtime/ProviderRuntimeBackendSelector.tsx +2 -2
- 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/search/CommandPalette.tsx +4 -4
- 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 +72 -113
- 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/SessionFiltersPopover.tsx +1 -1
- package/src/renderer/components/sidebar/SessionItem.tsx +3 -3
- package/src/renderer/components/sidebar/SidebarSessions.tsx +184 -6
- package/src/renderer/components/sidebar/SidebarTaskItem.tsx +4 -4
- package/src/renderer/components/sidebar/WorkspaceBrowser.tsx +40 -5
- 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/ClaudeLogsFilterPopover.tsx +1 -1
- package/src/renderer/components/team/ClaudeLogsPanel.tsx +1 -1
- package/src/renderer/components/team/CollapsibleTeamSection.tsx +17 -32
- package/src/renderer/components/team/ProcessesSection.tsx +2 -2
- package/src/renderer/components/team/TaskTooltip.tsx +2 -2
- package/src/renderer/components/team/TeamDetailView.tsx +319 -123
- package/src/renderer/components/team/TeamListFilterPopover.tsx +1 -1
- package/src/renderer/components/team/TeamListView.tsx +109 -124
- package/src/renderer/components/team/TeamSessionsSection.tsx +6 -6
- package/src/renderer/components/team/UnreadCommentsBadge.tsx +1 -1
- package/src/renderer/components/team/activity/ActivityItem.tsx +9 -9
- package/src/renderer/components/team/activity/ActivityTimeline.tsx +5 -5
- package/src/renderer/components/team/activity/LeadThoughtsGroup.tsx +3 -3
- package/src/renderer/components/team/activity/ReplyQuoteBlock.tsx +4 -4
- package/src/renderer/components/team/dialogs/CreateTaskDialog.tsx +4 -4
- 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 +18 -16
- package/src/renderer/components/team/dialogs/PlatformBindingDialog.tsx +221 -0
- package/src/renderer/components/team/dialogs/PlatformManualForm.tsx +8 -1
- package/src/renderer/components/team/dialogs/PlatformSetupQR.tsx +5 -5
- package/src/renderer/components/team/dialogs/RuntimeConfigDialog.tsx +361 -0
- package/src/renderer/components/team/dialogs/SendMessageDialog.tsx +6 -6
- package/src/renderer/components/team/dialogs/SkipPermissionsCheckbox.tsx +6 -6
- package/src/renderer/components/team/dialogs/StatusHistoryTimeline.tsx +1 -1
- package/src/renderer/components/team/dialogs/TaskAttachments.tsx +1 -1
- package/src/renderer/components/team/dialogs/TaskCommentInput.tsx +6 -6
- package/src/renderer/components/team/dialogs/TaskCommentsSection.tsx +4 -4
- package/src/renderer/components/team/dialogs/TaskDetailDialog.tsx +3 -3
- 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/editor/EditorFileTree.tsx +4 -4
- package/src/renderer/components/team/editor/EditorSearchPanel.tsx +1 -1
- package/src/renderer/components/team/editor/MarkdownSplitView.tsx +1 -1
- package/src/renderer/components/team/editor/NewFileDialog.tsx +1 -1
- package/src/renderer/components/team/editor/ProjectEditorOverlay.tsx +1 -1
- package/src/renderer/components/team/editor/SearchInFilesPanel.tsx +1 -1
- package/src/renderer/components/team/kanban/KanbanBoard.tsx +9 -9
- package/src/renderer/components/team/kanban/KanbanFilterPopover.tsx +4 -4
- package/src/renderer/components/team/kanban/KanbanSearchInput.tsx +1 -1
- package/src/renderer/components/team/kanban/KanbanSortPopover.tsx +5 -5
- package/src/renderer/components/team/kanban/KanbanTaskCard.tsx +4 -4
- 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/members/MemberDraftRow.tsx +1 -1
- package/src/renderer/components/team/members/MemberStatsTab.tsx +2 -2
- package/src/renderer/components/team/members/MemberWorkspaceTab.tsx +1 -1
- package/src/renderer/components/team/messages/MessageComposer.tsx +10 -112
- package/src/renderer/components/team/messages/MessagesFilterPopover.tsx +1 -1
- package/src/renderer/components/team/messages/MessagesPanel.tsx +136 -119
- package/src/renderer/components/team/review/ChangeReviewDialog.tsx +1 -1
- package/src/renderer/components/team/schedule/ScheduleStatusBadge.tsx +3 -3
- package/src/renderer/components/team/sidebar/TeamSidebarRail.tsx +4 -4
- package/src/renderer/components/team/tasks/TaskRow.tsx +1 -1
- 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 +3 -3
- package/src/renderer/components/team/tools/ToolsSection.tsx +418 -70
- package/src/renderer/components/ui/MemberSelect.tsx +2 -2
- package/src/renderer/components/ui/MentionSuggestionList.tsx +2 -2
- package/src/renderer/components/ui/MentionableTextarea.tsx +3 -3
- package/src/renderer/hooks/useExtensionsTabState.ts +3 -114
- package/src/renderer/index.css +56 -39
- 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
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
import { Button } from '@renderer/components/ui/button';
|
|
4
|
+
import {
|
|
5
|
+
Dialog,
|
|
6
|
+
DialogContent,
|
|
7
|
+
DialogDescription,
|
|
8
|
+
DialogFooter,
|
|
9
|
+
DialogHeader,
|
|
10
|
+
DialogTitle,
|
|
11
|
+
} from '@renderer/components/ui/dialog';
|
|
12
|
+
import { AGENT_TYPE_LABELS } from '@renderer/components/team/HarnessCards';
|
|
13
|
+
import { HarnessSelect } from '@renderer/components/team/HarnessSelect';
|
|
14
|
+
import { Loader2, Settings2 } from 'lucide-react';
|
|
15
|
+
|
|
16
|
+
import { api } from '@renderer/api';
|
|
17
|
+
import { useStore } from '@renderer/store';
|
|
18
|
+
import { isTeamProvisioningActive } from '@renderer/store/slices/teamSlice';
|
|
19
|
+
import type { GlobalProvider } from '@shared/types';
|
|
20
|
+
import type { CcAgentType } from '@shared/types/ccConnect';
|
|
21
|
+
import { PERMISSION_MODE_OPTIONS } from './useTeamEditForm';
|
|
22
|
+
import { PlatformBindingContent } from './PlatformBindingDialog';
|
|
23
|
+
|
|
24
|
+
// ── Section wrapper ──────────────────────────────────────────
|
|
25
|
+
function FormSection({
|
|
26
|
+
title,
|
|
27
|
+
description,
|
|
28
|
+
children,
|
|
29
|
+
}: {
|
|
30
|
+
title: string;
|
|
31
|
+
description?: string;
|
|
32
|
+
children: React.ReactNode;
|
|
33
|
+
}): React.JSX.Element {
|
|
34
|
+
return (
|
|
35
|
+
<div className="rounded-md border border-[var(--color-border)] p-3">
|
|
36
|
+
<h3 className="text-sm font-medium text-[var(--color-text)]">{title}</h3>
|
|
37
|
+
{description && (
|
|
38
|
+
<p className="mt-0.5 text-xs text-[var(--color-text-muted)]">{description}</p>
|
|
39
|
+
)}
|
|
40
|
+
<div className="mt-3 space-y-3">{children}</div>
|
|
41
|
+
</div>
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const inputCls =
|
|
46
|
+
'w-full rounded-md border border-[var(--color-border)] bg-[var(--color-surface)] px-3 py-1.5 text-sm text-[var(--color-text)] outline-none focus:border-[var(--color-border-emphasis)]';
|
|
47
|
+
const labelCls = 'mb-1 block text-xs font-medium text-[var(--color-text-secondary)]';
|
|
48
|
+
|
|
49
|
+
interface RuntimeConfigDialogProps {
|
|
50
|
+
open: boolean;
|
|
51
|
+
teamName: string;
|
|
52
|
+
onClose: () => void;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function RuntimeConfigDialog({
|
|
56
|
+
open,
|
|
57
|
+
teamName,
|
|
58
|
+
onClose,
|
|
59
|
+
}: RuntimeConfigDialogProps): React.JSX.Element {
|
|
60
|
+
const { data, fetchTeams, selectTeam } = useStore((s) => ({
|
|
61
|
+
data: s.selectedTeamName === teamName ? s.selectedTeamData : null,
|
|
62
|
+
fetchTeams: s.fetchTeams,
|
|
63
|
+
selectTeam: s.selectTeam,
|
|
64
|
+
}));
|
|
65
|
+
const isProvisioning = useStore((s) => isTeamProvisioningActive(s, teamName));
|
|
66
|
+
|
|
67
|
+
// ── Derived defaults ─────────────────────────────────────────
|
|
68
|
+
const defaults = useMemo(() => {
|
|
69
|
+
const cfg = data?.config;
|
|
70
|
+
const d = data as Record<string, unknown> | null;
|
|
71
|
+
return {
|
|
72
|
+
agentType: cfg?.agentType ?? (d?.harness as string | undefined) ?? 'claudecode',
|
|
73
|
+
workDir: (d?.workDir as string | undefined) ?? cfg?.projectPath ?? '',
|
|
74
|
+
permissionMode: cfg?.permissionMode ?? (d?.permissionMode as string | undefined) ?? 'default',
|
|
75
|
+
disabledCommands: Array.isArray(cfg?.disabledCommands)
|
|
76
|
+
? cfg.disabledCommands
|
|
77
|
+
: [],
|
|
78
|
+
providerRefs: data?.providerRefs ?? [],
|
|
79
|
+
globalProviders: data?.globalProviders ?? [],
|
|
80
|
+
bindProject: (d?.bindProject as string | undefined) ?? teamName,
|
|
81
|
+
};
|
|
82
|
+
}, [data, teamName]);
|
|
83
|
+
|
|
84
|
+
// ── Local form state ─────────────────────────────────────────
|
|
85
|
+
const [agentType, setAgentType] = useState(defaults.agentType);
|
|
86
|
+
const [permissionMode, setPermissionMode] = useState(defaults.permissionMode);
|
|
87
|
+
const [workDir, setWorkDir] = useState(defaults.workDir);
|
|
88
|
+
const [disabledCommandsInput, setDisabledCommandsInput] = useState(
|
|
89
|
+
defaults.disabledCommands.join(', ')
|
|
90
|
+
);
|
|
91
|
+
const [providerRef, setProviderRef] = useState(defaults.providerRefs[0] ?? '');
|
|
92
|
+
|
|
93
|
+
const [savePhase, setSavePhase] = useState<'idle' | 'saving' | 'restarting' | 'done'>('idle');
|
|
94
|
+
const [error, setError] = useState<string | null>(null);
|
|
95
|
+
const saving = savePhase === 'saving' || savePhase === 'restarting';
|
|
96
|
+
|
|
97
|
+
const defaultsRef = useRef(defaults);
|
|
98
|
+
if (defaults.agentType) defaultsRef.current = defaults;
|
|
99
|
+
|
|
100
|
+
// ── Reset form when dialog opens ─────────────────────────────
|
|
101
|
+
const prevOpenRef = useRef(false);
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
if (!open || prevOpenRef.current) {
|
|
104
|
+
prevOpenRef.current = open;
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
prevOpenRef.current = true;
|
|
108
|
+
const d = defaultsRef.current;
|
|
109
|
+
setSavePhase('idle');
|
|
110
|
+
setError(null);
|
|
111
|
+
setAgentType(d.agentType);
|
|
112
|
+
setPermissionMode(d.permissionMode);
|
|
113
|
+
setWorkDir(d.workDir);
|
|
114
|
+
setDisabledCommandsInput(d.disabledCommands.join(', '));
|
|
115
|
+
setProviderRef(d.providerRefs[0] ?? '');
|
|
116
|
+
}, [open]);
|
|
117
|
+
|
|
118
|
+
// ── Computed ─────────────────────────────────────────────────
|
|
119
|
+
const compatibleProviders = useMemo(
|
|
120
|
+
() =>
|
|
121
|
+
defaults.globalProviders.filter(
|
|
122
|
+
(p) =>
|
|
123
|
+
!p.agent_types ||
|
|
124
|
+
p.agent_types.length === 0 ||
|
|
125
|
+
(p.agent_types as string[]).includes(agentType)
|
|
126
|
+
),
|
|
127
|
+
[defaults.globalProviders, agentType]
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
const toggleProviderRef = (providerName: string): void => {
|
|
131
|
+
setError(null);
|
|
132
|
+
setProviderRef(providerRef === providerName ? '' : providerName);
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// ── Save ─────────────────────────────────────────────────────
|
|
136
|
+
const handleSave = (): void => {
|
|
137
|
+
if (savePhase !== 'idle') return;
|
|
138
|
+
const disabledCommands = disabledCommandsInput
|
|
139
|
+
.split(',')
|
|
140
|
+
.map((e) => e.trim())
|
|
141
|
+
.filter((e) => e.length > 0);
|
|
142
|
+
|
|
143
|
+
setSavePhase('saving');
|
|
144
|
+
setError(null);
|
|
145
|
+
|
|
146
|
+
void (async () => {
|
|
147
|
+
try {
|
|
148
|
+
await api.teams.updateConfig(teamName, {
|
|
149
|
+
agentType: agentType.trim() || undefined,
|
|
150
|
+
workDir: workDir.trim() || undefined,
|
|
151
|
+
permissionMode: permissionMode.trim() || undefined,
|
|
152
|
+
disabledCommands,
|
|
153
|
+
providerRefs: providerRef ? [providerRef] : [],
|
|
154
|
+
});
|
|
155
|
+
await Promise.all([fetchTeams(), selectTeam(teamName)]);
|
|
156
|
+
|
|
157
|
+
setSavePhase('restarting');
|
|
158
|
+
try {
|
|
159
|
+
await api.ccSettings.restart();
|
|
160
|
+
setSavePhase('done');
|
|
161
|
+
} catch (restartErr) {
|
|
162
|
+
setError(
|
|
163
|
+
`配置已保存,但重启失败:${restartErr instanceof Error ? restartErr.message : '未知错误'}`
|
|
164
|
+
);
|
|
165
|
+
setSavePhase('idle');
|
|
166
|
+
}
|
|
167
|
+
} catch (err) {
|
|
168
|
+
setError(err instanceof Error ? err.message : '保存失败');
|
|
169
|
+
setSavePhase('idle');
|
|
170
|
+
}
|
|
171
|
+
})();
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const saveLabel =
|
|
175
|
+
savePhase === 'done'
|
|
176
|
+
? '已完成'
|
|
177
|
+
: savePhase === 'restarting'
|
|
178
|
+
? '正在重启...'
|
|
179
|
+
: savePhase === 'saving'
|
|
180
|
+
? '保存中...'
|
|
181
|
+
: '保存并重启';
|
|
182
|
+
|
|
183
|
+
const [bindingStep, setBindingStep] = useState<'runtime' | 'bind'>('runtime');
|
|
184
|
+
|
|
185
|
+
return (
|
|
186
|
+
<Dialog
|
|
187
|
+
open={savePhase === 'saving' ? true : open}
|
|
188
|
+
onOpenChange={(nextOpen) => {
|
|
189
|
+
if (saving) return;
|
|
190
|
+
if (!nextOpen) onClose();
|
|
191
|
+
}}
|
|
192
|
+
>
|
|
193
|
+
<DialogContent className="max-w-2xl">
|
|
194
|
+
<DialogHeader>
|
|
195
|
+
<DialogTitle className="flex items-center gap-2">
|
|
196
|
+
<Settings2 size={16} />
|
|
197
|
+
运行时配置
|
|
198
|
+
</DialogTitle>
|
|
199
|
+
<DialogDescription>
|
|
200
|
+
修改 Agent 类型、渠道、消息设置等运行时参数。部分变更需要重启服务。
|
|
201
|
+
</DialogDescription>
|
|
202
|
+
</DialogHeader>
|
|
203
|
+
|
|
204
|
+
{bindingStep === 'bind' ? (
|
|
205
|
+
<PlatformBindingContent
|
|
206
|
+
projectName={defaults.bindProject}
|
|
207
|
+
workDir={workDir}
|
|
208
|
+
agentType={agentType}
|
|
209
|
+
onComplete={() => setBindingStep('runtime')}
|
|
210
|
+
onCancel={() => setBindingStep('runtime')}
|
|
211
|
+
/>
|
|
212
|
+
) : (
|
|
213
|
+
<div className="space-y-4">
|
|
214
|
+
{/* Agent & 权限 */}
|
|
215
|
+
<FormSection title="Agent & 权限">
|
|
216
|
+
<div className="grid gap-3 md:grid-cols-2">
|
|
217
|
+
<div>
|
|
218
|
+
<label className={labelCls}>Agent 类型</label>
|
|
219
|
+
<HarnessSelect
|
|
220
|
+
value={agentType as CcAgentType}
|
|
221
|
+
onChange={(v) => { setError(null); setAgentType(v); }}
|
|
222
|
+
className="w-full"
|
|
223
|
+
/>
|
|
224
|
+
</div>
|
|
225
|
+
<div>
|
|
226
|
+
<label className={labelCls}>权限模式</label>
|
|
227
|
+
<select
|
|
228
|
+
value={permissionMode}
|
|
229
|
+
onChange={(e) => { setError(null); setPermissionMode(e.target.value); }}
|
|
230
|
+
className={inputCls}
|
|
231
|
+
>
|
|
232
|
+
{PERMISSION_MODE_OPTIONS.map((opt) => (
|
|
233
|
+
<option key={opt.value} value={opt.value}>{opt.label}</option>
|
|
234
|
+
))}
|
|
235
|
+
</select>
|
|
236
|
+
</div>
|
|
237
|
+
</div>
|
|
238
|
+
<div>
|
|
239
|
+
<label className={labelCls}>工作目录</label>
|
|
240
|
+
<input
|
|
241
|
+
type="text"
|
|
242
|
+
value={workDir}
|
|
243
|
+
onChange={(e) => { setError(null); setWorkDir(e.target.value); }}
|
|
244
|
+
className={`${inputCls} font-mono`}
|
|
245
|
+
placeholder="/Users/you/code/project"
|
|
246
|
+
/>
|
|
247
|
+
</div>
|
|
248
|
+
</FormSection>
|
|
249
|
+
|
|
250
|
+
{/* 渠道 */}
|
|
251
|
+
<FormSection title="渠道" description="绑定外部消息平台(飞书、Telegram 等)。">
|
|
252
|
+
<Button
|
|
253
|
+
variant="outline"
|
|
254
|
+
size="sm"
|
|
255
|
+
onClick={() => setBindingStep('bind')}
|
|
256
|
+
>
|
|
257
|
+
绑定新渠道
|
|
258
|
+
</Button>
|
|
259
|
+
</FormSection>
|
|
260
|
+
|
|
261
|
+
{/* Provider */}
|
|
262
|
+
<div className="rounded-lg border border-[var(--color-border-subtle)] bg-white/[0.02] p-3">
|
|
263
|
+
<div className="flex items-start justify-between gap-3">
|
|
264
|
+
<div>
|
|
265
|
+
<p className="text-xs font-medium text-[var(--color-text)]">Provider(可选)</p>
|
|
266
|
+
<p className="mt-1 text-[11px] leading-relaxed text-[var(--color-text-muted)]">
|
|
267
|
+
留空时使用本机 {AGENT_TYPE_LABELS[agentType as CcAgentType] ?? agentType} 默认配置。
|
|
268
|
+
</p>
|
|
269
|
+
</div>
|
|
270
|
+
{providerRef ? (
|
|
271
|
+
<button
|
|
272
|
+
type="button"
|
|
273
|
+
className="shrink-0 rounded-md border border-[var(--color-border)] px-2 py-1 text-[11px] text-[var(--color-text-muted)] hover:bg-white/5"
|
|
274
|
+
onClick={() => setProviderRef('')}
|
|
275
|
+
>
|
|
276
|
+
使用本机默认
|
|
277
|
+
</button>
|
|
278
|
+
) : null}
|
|
279
|
+
</div>
|
|
280
|
+
<div className="mt-3 space-y-2">
|
|
281
|
+
{compatibleProviders.length > 0 ? (
|
|
282
|
+
compatibleProviders.map((provider) => {
|
|
283
|
+
const checked = providerRef === provider.name;
|
|
284
|
+
const at = agentType as CcAgentType;
|
|
285
|
+
const endpoint = provider.endpoints?.[at] ?? provider.base_url ?? '默认端点';
|
|
286
|
+
const model =
|
|
287
|
+
provider.agent_models?.[at] ?? provider.model ?? provider.models?.[0]?.model ?? '未指定模型';
|
|
288
|
+
return (
|
|
289
|
+
<button
|
|
290
|
+
key={provider.name}
|
|
291
|
+
type="button"
|
|
292
|
+
onClick={() => toggleProviderRef(provider.name)}
|
|
293
|
+
className={`w-full rounded-lg border px-3 py-2 text-left transition-colors ${
|
|
294
|
+
checked
|
|
295
|
+
? 'border-indigo-400/60 bg-indigo-500/10'
|
|
296
|
+
: 'border-[var(--color-border-subtle)] bg-black/10 hover:border-[var(--color-border)] hover:bg-white/[0.04]'
|
|
297
|
+
}`}
|
|
298
|
+
>
|
|
299
|
+
<div className="flex items-center justify-between gap-3">
|
|
300
|
+
<div className="min-w-0">
|
|
301
|
+
<p className="truncate text-xs font-medium text-[var(--color-text)]">{provider.name}</p>
|
|
302
|
+
<p className="mt-0.5 truncate text-[11px] text-[var(--color-text-muted)]">
|
|
303
|
+
{model} · {endpoint}
|
|
304
|
+
</p>
|
|
305
|
+
</div>
|
|
306
|
+
<span
|
|
307
|
+
className={`shrink-0 rounded-full px-2 py-0.5 text-[10px] ${
|
|
308
|
+
checked ? 'bg-indigo-400/20 text-indigo-200' : 'bg-white/5 text-[var(--color-text-muted)]'
|
|
309
|
+
}`}
|
|
310
|
+
>
|
|
311
|
+
{checked ? '已绑定' : '可绑定'}
|
|
312
|
+
</span>
|
|
313
|
+
</div>
|
|
314
|
+
</button>
|
|
315
|
+
);
|
|
316
|
+
})
|
|
317
|
+
) : (
|
|
318
|
+
<div className="rounded-md border border-dashed border-[var(--color-border)] px-3 py-3 text-xs text-[var(--color-text-muted)]">
|
|
319
|
+
暂无适用于 {AGENT_TYPE_LABELS[agentType as CcAgentType] ?? agentType} 的全局 Provider。
|
|
320
|
+
</div>
|
|
321
|
+
)}
|
|
322
|
+
</div>
|
|
323
|
+
</div>
|
|
324
|
+
|
|
325
|
+
{/* 高级 */}
|
|
326
|
+
<FormSection title="高级">
|
|
327
|
+
<div>
|
|
328
|
+
<label className={labelCls}>已禁用命令</label>
|
|
329
|
+
<input
|
|
330
|
+
type="text"
|
|
331
|
+
value={disabledCommandsInput}
|
|
332
|
+
onChange={(e) => { setError(null); setDisabledCommandsInput(e.target.value); }}
|
|
333
|
+
className={inputCls}
|
|
334
|
+
placeholder="restart, upgrade, cron"
|
|
335
|
+
/>
|
|
336
|
+
</div>
|
|
337
|
+
</FormSection>
|
|
338
|
+
|
|
339
|
+
{error && <p className="text-xs text-red-400">{error}</p>}
|
|
340
|
+
</div>
|
|
341
|
+
)}
|
|
342
|
+
|
|
343
|
+
{bindingStep === 'runtime' && (
|
|
344
|
+
<DialogFooter>
|
|
345
|
+
<Button variant="outline" size="sm" onClick={onClose} disabled={saving}>
|
|
346
|
+
{savePhase === 'done' ? '关闭' : '取消'}
|
|
347
|
+
</Button>
|
|
348
|
+
<Button
|
|
349
|
+
size="sm"
|
|
350
|
+
onClick={handleSave}
|
|
351
|
+
disabled={saving || savePhase === 'done'}
|
|
352
|
+
>
|
|
353
|
+
{saving && <Loader2 size={14} className="mr-1.5 animate-spin" />}
|
|
354
|
+
{saveLabel}
|
|
355
|
+
</Button>
|
|
356
|
+
</DialogFooter>
|
|
357
|
+
)}
|
|
358
|
+
</DialogContent>
|
|
359
|
+
</Dialog>
|
|
360
|
+
);
|
|
361
|
+
}
|
|
@@ -421,9 +421,9 @@ export const SendMessageDialog = ({
|
|
|
421
421
|
|
|
422
422
|
<div className={quote ? 'flex flex-col' : 'contents'}>
|
|
423
423
|
{quote ? (
|
|
424
|
-
<div className="relative overflow-hidden rounded-t-md border border-b-0 border-
|
|
424
|
+
<div className="relative overflow-hidden rounded-t-md border border-b-0 border-indigo-400/30 bg-blue-100/80 py-2 pl-3 pr-2 dark:border-indigo-500/20 dark:bg-blue-950/20">
|
|
425
425
|
{/* Decorative quotation mark */}
|
|
426
|
-
<span className="pointer-events-none absolute -right-1 top-1/2 -translate-y-1/2 select-none font-serif text-[64px] leading-none text-
|
|
426
|
+
<span className="pointer-events-none absolute -right-1 top-1/2 -translate-y-1/2 select-none font-serif text-[64px] leading-none text-indigo-500/[0.08] dark:text-indigo-400/[0.08]">
|
|
427
427
|
“
|
|
428
428
|
</span>
|
|
429
429
|
|
|
@@ -431,7 +431,7 @@ export const SendMessageDialog = ({
|
|
|
431
431
|
<TooltipTrigger asChild>
|
|
432
432
|
<button
|
|
433
433
|
type="button"
|
|
434
|
-
className="absolute right-1.5 top-1.5 z-10 rounded p-0.5 text-
|
|
434
|
+
className="absolute right-1.5 top-1.5 z-10 rounded p-0.5 text-indigo-400/60 hover:text-indigo-600 dark:text-indigo-300/40 dark:hover:text-blue-200"
|
|
435
435
|
onClick={() => setQuote(undefined)}
|
|
436
436
|
>
|
|
437
437
|
<X size={12} />
|
|
@@ -441,7 +441,7 @@ export const SendMessageDialog = ({
|
|
|
441
441
|
</Tooltip>
|
|
442
442
|
|
|
443
443
|
<div className="mb-1 flex items-center gap-1.5">
|
|
444
|
-
<span className="text-[10px] text-
|
|
444
|
+
<span className="text-[10px] text-indigo-600/70 dark:text-indigo-300/60">
|
|
445
445
|
正在回复
|
|
446
446
|
</span>
|
|
447
447
|
<MemberBadge name={quote.from} color={colorMap.get(quote.from)} size="sm" />
|
|
@@ -458,7 +458,7 @@ export const SendMessageDialog = ({
|
|
|
458
458
|
{isQuoteLong ? (
|
|
459
459
|
<button
|
|
460
460
|
type="button"
|
|
461
|
-
className="mt-0.5 text-[10px] text-
|
|
461
|
+
className="mt-0.5 text-[10px] text-indigo-500 hover:text-blue-700 dark:text-indigo-400/60 dark:hover:text-indigo-300"
|
|
462
462
|
onClick={() => setQuoteExpanded((v) => !v)}
|
|
463
463
|
>
|
|
464
464
|
{quoteExpanded ? '收起' : '展开'}
|
|
@@ -487,7 +487,7 @@ export const SendMessageDialog = ({
|
|
|
487
487
|
cornerAction={
|
|
488
488
|
<button
|
|
489
489
|
type="button"
|
|
490
|
-
className="inline-flex shrink-0 items-center gap-1 rounded-full bg-
|
|
490
|
+
className="inline-flex shrink-0 items-center gap-1 rounded-full bg-indigo-600 px-3 py-1.5 text-[11px] font-medium text-white shadow-sm transition-colors hover:bg-indigo-500 disabled:cursor-not-allowed disabled:opacity-50"
|
|
491
491
|
disabled={!canSend}
|
|
492
492
|
onClick={handleSubmit}
|
|
493
493
|
>
|
|
@@ -33,13 +33,13 @@ export const SkipPermissionsCheckbox: React.FC<SkipPermissionsCheckboxProps> = (
|
|
|
33
33
|
<div
|
|
34
34
|
className="mt-1.5 rounded-md border px-3 py-2 text-xs"
|
|
35
35
|
style={{
|
|
36
|
-
backgroundColor: 'rgba(
|
|
37
|
-
borderColor: 'rgba(
|
|
36
|
+
backgroundColor: 'rgba(99, 102, 241, 0.08)',
|
|
37
|
+
borderColor: 'rgba(99, 102, 241, 0.2)',
|
|
38
38
|
color: 'var(--color-text-secondary)',
|
|
39
39
|
}}
|
|
40
40
|
>
|
|
41
41
|
<div className="flex items-start gap-2">
|
|
42
|
-
<Info className="mt-0.5 size-3.5 shrink-0 text-
|
|
42
|
+
<Info className="mt-0.5 size-3.5 shrink-0 text-indigo-400" />
|
|
43
43
|
<p>启用自主模式后,所有工具都会直接执行,不再逐次请求确认。处理不可信代码时请谨慎。</p>
|
|
44
44
|
</div>
|
|
45
45
|
</div>
|
|
@@ -47,13 +47,13 @@ export const SkipPermissionsCheckbox: React.FC<SkipPermissionsCheckboxProps> = (
|
|
|
47
47
|
<div
|
|
48
48
|
className="mt-1.5 rounded-md border px-3 py-2 text-xs"
|
|
49
49
|
style={{
|
|
50
|
-
backgroundColor: 'rgba(
|
|
51
|
-
borderColor: 'rgba(
|
|
50
|
+
backgroundColor: 'rgba(99, 102, 241, 0.08)',
|
|
51
|
+
borderColor: 'rgba(99, 102, 241, 0.2)',
|
|
52
52
|
color: 'var(--color-text-secondary)',
|
|
53
53
|
}}
|
|
54
54
|
>
|
|
55
55
|
<div className="flex items-start gap-2">
|
|
56
|
-
<Info className="mt-0.5 size-3.5 shrink-0 text-
|
|
56
|
+
<Info className="mt-0.5 size-3.5 shrink-0 text-indigo-400" />
|
|
57
57
|
<p>手动模式:每次工具调用都需要你实时批准或拒绝。</p>
|
|
58
58
|
</div>
|
|
59
59
|
</div>
|
|
@@ -203,7 +203,7 @@ function dotColorForStatus(status: TeamTaskStatus): string {
|
|
|
203
203
|
case 'pending':
|
|
204
204
|
return 'bg-zinc-500';
|
|
205
205
|
case 'in_progress':
|
|
206
|
-
return 'bg-
|
|
206
|
+
return 'bg-indigo-400';
|
|
207
207
|
case 'completed':
|
|
208
208
|
return 'bg-emerald-400';
|
|
209
209
|
case 'deleted':
|
|
@@ -241,7 +241,7 @@ export const TaskAttachments = ({
|
|
|
241
241
|
|
|
242
242
|
{/* Drop zone indicator */}
|
|
243
243
|
{dragOver ? (
|
|
244
|
-
<div className="flex items-center justify-center rounded-md border-2 border-dashed border-
|
|
244
|
+
<div className="flex items-center justify-center rounded-md border-2 border-dashed border-indigo-500/40 bg-indigo-500/5 py-4 text-xs text-indigo-400">
|
|
245
245
|
Drop image here
|
|
246
246
|
</div>
|
|
247
247
|
) : null}
|
|
@@ -228,9 +228,9 @@ export const TaskCommentInput = ({
|
|
|
228
228
|
return (
|
|
229
229
|
<div>
|
|
230
230
|
{replyTo ? (
|
|
231
|
-
<div className="relative overflow-hidden rounded-t-md border border-b-0 border-
|
|
231
|
+
<div className="relative overflow-hidden rounded-t-md border border-b-0 border-indigo-400/30 bg-blue-100/80 py-2 pl-3 pr-2 dark:border-indigo-500/20 dark:bg-blue-950/20">
|
|
232
232
|
{/* Decorative quotation mark */}
|
|
233
|
-
<span className="pointer-events-none absolute -right-1 top-1/2 -translate-y-1/2 select-none font-serif text-[64px] leading-none text-
|
|
233
|
+
<span className="pointer-events-none absolute -right-1 top-1/2 -translate-y-1/2 select-none font-serif text-[64px] leading-none text-indigo-500/[0.08] dark:text-indigo-400/[0.08]">
|
|
234
234
|
“
|
|
235
235
|
</span>
|
|
236
236
|
|
|
@@ -238,7 +238,7 @@ export const TaskCommentInput = ({
|
|
|
238
238
|
<TooltipTrigger asChild>
|
|
239
239
|
<button
|
|
240
240
|
type="button"
|
|
241
|
-
className="absolute right-1.5 top-1.5 z-10 rounded p-0.5 text-
|
|
241
|
+
className="absolute right-1.5 top-1.5 z-10 rounded p-0.5 text-indigo-400/60 hover:text-indigo-600 dark:text-indigo-300/40 dark:hover:text-blue-200"
|
|
242
242
|
onClick={onClearReply}
|
|
243
243
|
>
|
|
244
244
|
<X size={12} />
|
|
@@ -248,7 +248,7 @@ export const TaskCommentInput = ({
|
|
|
248
248
|
</Tooltip>
|
|
249
249
|
|
|
250
250
|
<div className="mb-1 flex items-center gap-1.5">
|
|
251
|
-
<span className="text-[10px] text-
|
|
251
|
+
<span className="text-[10px] text-indigo-600/70 dark:text-indigo-300/60">正在回复</span>
|
|
252
252
|
<MemberBadge name={replyTo.author} color={colorMap.get(replyTo.author)} size="sm" />
|
|
253
253
|
</div>
|
|
254
254
|
<div
|
|
@@ -263,7 +263,7 @@ export const TaskCommentInput = ({
|
|
|
263
263
|
{replyTo.text.length > LONG_QUOTE_THRESHOLD ? (
|
|
264
264
|
<button
|
|
265
265
|
type="button"
|
|
266
|
-
className="mt-0.5 text-[10px] text-
|
|
266
|
+
className="mt-0.5 text-[10px] text-indigo-500 hover:text-blue-700 dark:text-indigo-400/60 dark:hover:text-indigo-300"
|
|
267
267
|
onClick={() => setQuoteExpanded((v) => !v)}
|
|
268
268
|
>
|
|
269
269
|
{quoteExpanded ? '收起' : '展开'}
|
|
@@ -390,7 +390,7 @@ export const TaskCommentInput = ({
|
|
|
390
390
|
</Tooltip>
|
|
391
391
|
<button
|
|
392
392
|
type="button"
|
|
393
|
-
className="inline-flex shrink-0 items-center gap-1 rounded-full bg-
|
|
393
|
+
className="inline-flex shrink-0 items-center gap-1 rounded-full bg-indigo-600 px-3 py-1.5 text-[11px] font-medium text-white shadow-sm transition-colors hover:bg-indigo-500 disabled:cursor-not-allowed disabled:opacity-50"
|
|
394
394
|
disabled={!canSubmit}
|
|
395
395
|
onClick={() => void handleSubmit()}
|
|
396
396
|
>
|
|
@@ -223,7 +223,7 @@ export const TaskCommentsSection = ({
|
|
|
223
223
|
comment.type === 'review_approved'
|
|
224
224
|
? 'border-y border-emerald-500/20 bg-emerald-500/5'
|
|
225
225
|
: comment.type === 'review_request'
|
|
226
|
-
? 'border-y border-
|
|
226
|
+
? 'border-y border-indigo-500/20 bg-indigo-500/5'
|
|
227
227
|
: '',
|
|
228
228
|
].join(' ')}
|
|
229
229
|
style={
|
|
@@ -244,7 +244,7 @@ export const TaskCommentsSection = ({
|
|
|
244
244
|
>
|
|
245
245
|
<div className="mb-1 flex items-center gap-2 text-[10px] text-[var(--color-text-muted)]">
|
|
246
246
|
{unreadCommentIds?.has(comment.id) ? (
|
|
247
|
-
<span className="size-2 shrink-0 rounded-full bg-
|
|
247
|
+
<span className="size-2 shrink-0 rounded-full bg-indigo-500" />
|
|
248
248
|
) : null}
|
|
249
249
|
<MemberBadge
|
|
250
250
|
name={comment.author}
|
|
@@ -257,7 +257,7 @@ export const TaskCommentsSection = ({
|
|
|
257
257
|
已批准
|
|
258
258
|
</span>
|
|
259
259
|
) : comment.type === 'review_request' ? (
|
|
260
|
-
<span className="inline-flex items-center gap-0.5 rounded-full bg-
|
|
260
|
+
<span className="inline-flex items-center gap-0.5 rounded-full bg-indigo-500/15 px-1.5 py-0.5 text-[10px] font-medium text-indigo-600 dark:text-indigo-400">
|
|
261
261
|
<Eye size={10} />
|
|
262
262
|
已请求审查
|
|
263
263
|
</span>
|
|
@@ -440,7 +440,7 @@ export const TaskCommentsSection = ({
|
|
|
440
440
|
cornerAction={
|
|
441
441
|
<button
|
|
442
442
|
type="button"
|
|
443
|
-
className="inline-flex shrink-0 items-center gap-1 rounded-full bg-
|
|
443
|
+
className="inline-flex shrink-0 items-center gap-1 rounded-full bg-indigo-600 px-3 py-1.5 text-[11px] font-medium text-white shadow-sm transition-colors hover:bg-indigo-500 disabled:cursor-not-allowed disabled:opacity-50"
|
|
444
444
|
disabled={!canSubmit}
|
|
445
445
|
onClick={() => void handleSubmit()}
|
|
446
446
|
>
|
|
@@ -821,7 +821,7 @@ export const TaskDetailDialog = ({
|
|
|
821
821
|
className={`flex items-center justify-between rounded-md px-3 py-2 text-xs ${
|
|
822
822
|
currentTask.needsClarification === 'user'
|
|
823
823
|
? 'border border-red-500/20 bg-red-500/10 text-red-400'
|
|
824
|
-
: 'border border-
|
|
824
|
+
: 'border border-indigo-500/20 bg-indigo-500/10 text-indigo-400'
|
|
825
825
|
}`}
|
|
826
826
|
>
|
|
827
827
|
<span className="flex items-center gap-1.5">
|
|
@@ -953,7 +953,7 @@ export const TaskDetailDialog = ({
|
|
|
953
953
|
|
|
954
954
|
{blocksIds.length > 0 ? (
|
|
955
955
|
<div className="flex flex-wrap items-center gap-1.5">
|
|
956
|
-
<span className="inline-flex items-center gap-0.5 text-xs text-
|
|
956
|
+
<span className="inline-flex items-center gap-0.5 text-xs text-indigo-600 dark:text-indigo-400">
|
|
957
957
|
<ArrowRightFromLine size={12} />
|
|
958
958
|
阻塞
|
|
959
959
|
</span>
|
|
@@ -971,7 +971,7 @@ export const TaskDetailDialog = ({
|
|
|
971
971
|
className={`inline-flex items-center rounded px-1.5 py-0.5 text-[10px] font-medium transition-colors ${
|
|
972
972
|
isCompleted
|
|
973
973
|
? 'bg-emerald-500/15 text-emerald-700 hover:bg-emerald-500/25 dark:text-emerald-400'
|
|
974
|
-
: 'bg-
|
|
974
|
+
: 'bg-indigo-500/15 text-indigo-600 hover:bg-indigo-500/25 dark:text-indigo-400'
|
|
975
975
|
} cursor-pointer`}
|
|
976
976
|
onClick={() => handleDependencyClick(id)}
|
|
977
977
|
>
|