@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
|
@@ -93,7 +93,7 @@ export const TeamListFilterPopover = ({
|
|
|
93
93
|
>
|
|
94
94
|
<Filter size={14} />
|
|
95
95
|
{activeCount > 0 && (
|
|
96
|
-
<span className="absolute -right-1 -top-1 flex size-4 items-center justify-center rounded-full bg-
|
|
96
|
+
<span className="absolute -right-1 -top-1 flex size-4 items-center justify-center rounded-full bg-indigo-500 text-[10px] font-medium text-white">
|
|
97
97
|
{activeCount}
|
|
98
98
|
</span>
|
|
99
99
|
)}
|
|
@@ -36,6 +36,7 @@ import { buildTaskCountsByTeam, normalizePath } from '@renderer/utils/pathNormal
|
|
|
36
36
|
import { emitOpenHermitEvent, OPEN_HERMIT_EVENTS } from '@renderer/utils/openHermitEvents';
|
|
37
37
|
import { getBaseName } from '@renderer/utils/pathUtils';
|
|
38
38
|
import { nameColorSet } from '@renderer/utils/projectColor';
|
|
39
|
+
import { formatRelativeTime, formatTokensCompact } from '@renderer/utils/formatters';
|
|
39
40
|
import {
|
|
40
41
|
CheckCircle,
|
|
41
42
|
Clock,
|
|
@@ -48,9 +49,12 @@ import {
|
|
|
48
49
|
RotateCcw,
|
|
49
50
|
Search,
|
|
50
51
|
Trash2,
|
|
52
|
+
Users,
|
|
51
53
|
} from 'lucide-react';
|
|
52
54
|
import { useShallow } from 'zustand/react/shallow';
|
|
53
55
|
|
|
56
|
+
import { SYSTEM_MANAGER_TEAM_NAME } from '@shared/types/team';
|
|
57
|
+
|
|
54
58
|
import { CreateTeamDialog } from './dialogs/CreateTeamDialog';
|
|
55
59
|
import { LaunchTeamDialog } from './dialogs/LaunchTeamDialog';
|
|
56
60
|
import { TeamEmptyState } from './TeamEmptyState';
|
|
@@ -61,8 +65,6 @@ import {
|
|
|
61
65
|
teamMatchesProjectSelection,
|
|
62
66
|
} from './teamProjectSelection';
|
|
63
67
|
|
|
64
|
-
import type { ActiveTeamRef, TeamCopyData } from './dialogs/CreateTeamDialog';
|
|
65
|
-
import type { TeamListFilterState } from './TeamListFilterPopover';
|
|
66
68
|
import type {
|
|
67
69
|
ResolvedTeamMember,
|
|
68
70
|
TeamCreateRequest,
|
|
@@ -73,6 +75,8 @@ import type {
|
|
|
73
75
|
TeamTemplateSource,
|
|
74
76
|
TeamTemplateSummary,
|
|
75
77
|
} from '@shared/types';
|
|
78
|
+
import type { ActiveTeamRef, TeamCopyData } from './dialogs/CreateTeamDialog';
|
|
79
|
+
import type { TeamListFilterState } from './TeamListFilterPopover';
|
|
76
80
|
|
|
77
81
|
function generateUniqueName(sourceName: string, existingNames: string[]): string {
|
|
78
82
|
const base = sourceName.replace(/-\d+$/, '');
|
|
@@ -226,6 +230,17 @@ function resolveTeamStatus(
|
|
|
226
230
|
return null;
|
|
227
231
|
}
|
|
228
232
|
|
|
233
|
+
function formatDurationShort(ms: number): string {
|
|
234
|
+
if (ms < 60_000) return `${Math.round(ms / 1000)}s`;
|
|
235
|
+
const minutes = Math.floor(ms / 60_000);
|
|
236
|
+
if (minutes < 60) return `${minutes}m`;
|
|
237
|
+
const hours = Math.floor(minutes / 60);
|
|
238
|
+
const remainMin = minutes % 60;
|
|
239
|
+
if (hours < 24) return `${hours}h ${remainMin}m`;
|
|
240
|
+
const days = Math.floor(hours / 24);
|
|
241
|
+
return `${days}d ${hours % 24}h`;
|
|
242
|
+
}
|
|
243
|
+
|
|
229
244
|
const StatusBadge = ({ status }: { status: TeamStatus | null }): React.JSX.Element | null => {
|
|
230
245
|
if (!status) return null;
|
|
231
246
|
switch (status) {
|
|
@@ -279,6 +294,7 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
279
294
|
teamsError,
|
|
280
295
|
fetchTeams,
|
|
281
296
|
openTeamTab,
|
|
297
|
+
openSystemManager,
|
|
282
298
|
deleteTeam,
|
|
283
299
|
restoreTeam,
|
|
284
300
|
permanentlyDeleteTeam,
|
|
@@ -298,6 +314,7 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
298
314
|
teamsError: s.teamsError,
|
|
299
315
|
fetchTeams: s.fetchTeams,
|
|
300
316
|
openTeamTab: s.openTeamTab,
|
|
317
|
+
openSystemManager: s.openSystemManager,
|
|
301
318
|
deleteTeam: s.deleteTeam,
|
|
302
319
|
restoreTeam: s.restoreTeam,
|
|
303
320
|
permanentlyDeleteTeam: s.permanentlyDeleteTeam,
|
|
@@ -442,6 +459,11 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
442
459
|
: null;
|
|
443
460
|
|
|
444
461
|
result = [...result].sort((a, b) => {
|
|
462
|
+
// 0. Project-level system manager is a namespace node, not a regular worker team.
|
|
463
|
+
const managerA = a.teamName === SYSTEM_MANAGER_TEAM_NAME ? 0 : 1;
|
|
464
|
+
const managerB = b.teamName === SYSTEM_MANAGER_TEAM_NAME ? 0 : 1;
|
|
465
|
+
if (managerA !== managerB) return managerA - managerB;
|
|
466
|
+
|
|
445
467
|
// 1. Alive (running) teams first
|
|
446
468
|
const aliveA = aliveSet.has(a.teamName) ? 0 : 1;
|
|
447
469
|
const aliveB = aliveSet.has(b.teamName) ? 0 : 1;
|
|
@@ -528,8 +550,8 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
528
550
|
}
|
|
529
551
|
const confirmed = await confirm({
|
|
530
552
|
title: '删除数字员工',
|
|
531
|
-
message: `确定删除数字员工”${teamDisplayName}
|
|
532
|
-
confirmLabel: '
|
|
553
|
+
message: `确定删除数字员工”${teamDisplayName}”吗?此操作会移除本地配置数据。`,
|
|
554
|
+
confirmLabel: '删除',
|
|
533
555
|
cancelLabel: '取消',
|
|
534
556
|
variant: 'danger',
|
|
535
557
|
});
|
|
@@ -952,7 +974,7 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
952
974
|
{template.members.map((member) => (
|
|
953
975
|
<span
|
|
954
976
|
key={member.name}
|
|
955
|
-
className="rounded bg-
|
|
977
|
+
className="rounded bg-indigo-500/10 px-1.5 py-0.5 text-[10px] text-indigo-300"
|
|
956
978
|
>
|
|
957
979
|
{member.name}
|
|
958
980
|
{member.role ? ` · ${formatTeamRoleLabel(member.role)}` : ''}
|
|
@@ -988,8 +1010,13 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
988
1010
|
<div className="flex items-center justify-between">
|
|
989
1011
|
<h2 className="text-base font-semibold text-[var(--color-text)]">选择数字员工</h2>
|
|
990
1012
|
<div className="flex items-center gap-2">
|
|
991
|
-
<Button
|
|
992
|
-
|
|
1013
|
+
<Button
|
|
1014
|
+
variant="outline"
|
|
1015
|
+
size="sm"
|
|
1016
|
+
className="border-cyan-500/30 text-cyan-300 hover:bg-cyan-500/10"
|
|
1017
|
+
onClick={() => void openSystemManager()}
|
|
1018
|
+
>
|
|
1019
|
+
控制台
|
|
993
1020
|
</Button>
|
|
994
1021
|
<Button
|
|
995
1022
|
variant="outline"
|
|
@@ -1100,13 +1127,13 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
1100
1127
|
? teamMatchesProjectSelection(team, currentProjectPath)
|
|
1101
1128
|
: false;
|
|
1102
1129
|
const isDeleting = deletingTeamName === team.teamName;
|
|
1130
|
+
const isSystemManager = team.teamName === SYSTEM_MANAGER_TEAM_NAME;
|
|
1103
1131
|
return (
|
|
1104
1132
|
<div
|
|
1105
1133
|
key={team.teamName}
|
|
1106
1134
|
role="button"
|
|
1107
1135
|
tabIndex={0}
|
|
1108
|
-
className="group relative flex cursor-pointer flex-col overflow-hidden rounded-lg border border-
|
|
1109
|
-
style={teamColorSet ? { borderLeftColor: teamColorSet.border } : undefined}
|
|
1136
|
+
className="group relative flex cursor-pointer flex-col overflow-hidden rounded-lg border border-[var(--color-border)] bg-[var(--color-surface)] p-4 transition-colors hover:border-[var(--color-border-emphasis)] hover:bg-[var(--color-surface-raised)]"
|
|
1110
1137
|
onClick={
|
|
1111
1138
|
isDeleting ? undefined : () => openTeamTab(team.teamName, team.projectPath)
|
|
1112
1139
|
}
|
|
@@ -1124,149 +1151,107 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
1124
1151
|
</div>
|
|
1125
1152
|
)}
|
|
1126
1153
|
<div className="flex flex-1 flex-col">
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
<PendingDeleteBadge />
|
|
1144
|
-
) : null}
|
|
1145
|
-
</div>
|
|
1146
|
-
<span className="truncate font-mono text-[10px] text-[var(--color-text-muted)]">
|
|
1147
|
-
工号 {team.teamName}
|
|
1154
|
+
{/* Row 1: Avatar + Name + Status + Actions */}
|
|
1155
|
+
<div className="flex items-center gap-2.5">
|
|
1156
|
+
<img
|
|
1157
|
+
src={agentAvatarUrl(team.teamName)}
|
|
1158
|
+
alt={team.displayName}
|
|
1159
|
+
className="size-8 shrink-0 rounded-md border border-transparent"
|
|
1160
|
+
style={teamColorSet ? { borderColor: teamColorSet.border + '60' } : undefined}
|
|
1161
|
+
draggable={false}
|
|
1162
|
+
/>
|
|
1163
|
+
<div className="flex min-w-0 flex-1 items-center gap-2">
|
|
1164
|
+
<h3 className="min-w-0 truncate text-[13px] font-medium text-[var(--color-text)]">
|
|
1165
|
+
{team.displayName}
|
|
1166
|
+
</h3>
|
|
1167
|
+
{isSystemManager ? (
|
|
1168
|
+
<span className="shrink-0 rounded bg-cyan-500/15 px-1.5 py-px text-[9px] font-medium text-cyan-400">
|
|
1169
|
+
SYS
|
|
1148
1170
|
</span>
|
|
1149
|
-
|
|
1171
|
+
) : null}
|
|
1172
|
+
<StatusBadge status={status} />
|
|
1173
|
+
{team.pendingDelete || team.restartRequired ? (
|
|
1174
|
+
<PendingDeleteBadge />
|
|
1175
|
+
) : null}
|
|
1150
1176
|
{team.projectPath &&
|
|
1151
1177
|
(() => {
|
|
1152
1178
|
const branch = branchByPath[normalizePath(team.projectPath)];
|
|
1153
1179
|
if (!branch) return null;
|
|
1154
1180
|
return (
|
|
1155
1181
|
<span
|
|
1156
|
-
className="flex shrink-0 items-center gap-1
|
|
1182
|
+
className="flex shrink-0 items-center gap-1 text-[10px] text-[var(--color-text-muted)] opacity-60"
|
|
1157
1183
|
title={branch}
|
|
1158
1184
|
>
|
|
1159
|
-
<GitBranch size={
|
|
1160
|
-
<span className="max-w-
|
|
1185
|
+
<GitBranch size={9} />
|
|
1186
|
+
<span className="max-w-20 truncate">{branch}</span>
|
|
1161
1187
|
</span>
|
|
1162
1188
|
);
|
|
1163
1189
|
})()}
|
|
1164
1190
|
</div>
|
|
1165
|
-
<div className="flex shrink-0 gap-
|
|
1166
|
-
{!team.pendingCreate && (
|
|
1191
|
+
<div className="flex shrink-0 gap-0.5">
|
|
1192
|
+
{!team.pendingCreate && !isSystemManager && (
|
|
1167
1193
|
<Tooltip>
|
|
1168
1194
|
<TooltipTrigger asChild>
|
|
1169
1195
|
<button
|
|
1170
1196
|
type="button"
|
|
1171
|
-
className="
|
|
1197
|
+
className="rounded p-1 text-[var(--color-text-muted)] opacity-0 transition-opacity hover:bg-[var(--color-surface-raised)] group-hover:opacity-60 hover:!opacity-100"
|
|
1172
1198
|
onClick={(e) => handleCopyTeam(team.teamName, e)}
|
|
1173
1199
|
>
|
|
1174
|
-
<Copy size={
|
|
1200
|
+
<Copy size={13} />
|
|
1175
1201
|
</button>
|
|
1176
1202
|
</TooltipTrigger>
|
|
1177
1203
|
<TooltipContent side="bottom">复制数字员工</TooltipContent>
|
|
1178
1204
|
</Tooltip>
|
|
1179
1205
|
)}
|
|
1180
|
-
{team.teamName !== 'default' &&
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1206
|
+
{team.teamName !== 'default' &&
|
|
1207
|
+
team.teamName !== 'my-project' &&
|
|
1208
|
+
!isSystemManager && (
|
|
1209
|
+
<Tooltip>
|
|
1210
|
+
<TooltipTrigger asChild>
|
|
1211
|
+
<button
|
|
1212
|
+
type="button"
|
|
1213
|
+
className="rounded p-1 text-[var(--color-text-muted)] opacity-0 transition-opacity hover:bg-red-500/10 hover:text-red-400 group-hover:opacity-60 hover:!opacity-100"
|
|
1214
|
+
onClick={(e) =>
|
|
1215
|
+
handleDeleteTeam(team.teamName, !!team.pendingCreate, e)
|
|
1216
|
+
}
|
|
1217
|
+
>
|
|
1218
|
+
<Trash2 size={13} />
|
|
1219
|
+
</button>
|
|
1220
|
+
</TooltipTrigger>
|
|
1221
|
+
<TooltipContent side="bottom">删除数字员工</TooltipContent>
|
|
1222
|
+
</Tooltip>
|
|
1223
|
+
)}
|
|
1196
1224
|
</div>
|
|
1197
1225
|
</div>
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
</
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1226
|
+
|
|
1227
|
+
{/* Row 2: Description */}
|
|
1228
|
+
<p className="mt-1.5 line-clamp-1 min-w-0 pl-[42px] text-[11px] leading-snug text-[var(--color-text-muted)]">
|
|
1229
|
+
{team.description || '暂无描述'}
|
|
1230
|
+
</p>
|
|
1231
|
+
|
|
1232
|
+
{/* Row 3: Stats bar */}
|
|
1233
|
+
<div className="mt-2 flex items-center gap-1.5 pl-[42px] text-[10px] tabular-nums">
|
|
1234
|
+
{team.stats && team.stats.sessions > 0 ? (
|
|
1235
|
+
<>
|
|
1236
|
+
<span className="text-indigo-400">{team.stats.sessions} sessions</span>
|
|
1237
|
+
<span className="text-[var(--color-text-muted)] opacity-30">·</span>
|
|
1238
|
+
<span className="text-emerald-400">{formatTokensCompact(team.stats.tokens)}</span>
|
|
1239
|
+
{team.stats.durationMs > 0 && (
|
|
1240
|
+
<>
|
|
1241
|
+
<span className="text-[var(--color-text-muted)] opacity-30">·</span>
|
|
1242
|
+
<span className="text-amber-400">{formatDurationShort(team.stats.durationMs)}</span>
|
|
1243
|
+
</>
|
|
1244
|
+
)}
|
|
1245
|
+
</>
|
|
1210
1246
|
) : (
|
|
1211
|
-
<
|
|
1212
|
-
|
|
1213
|
-
|
|
1247
|
+
<span className="text-[var(--color-text-muted)] opacity-50">no activity</span>
|
|
1248
|
+
)}
|
|
1249
|
+
{team.lastActivity && (
|
|
1250
|
+
<>
|
|
1251
|
+
<span className="text-[var(--color-text-muted)] opacity-30">·</span>
|
|
1252
|
+
<span className="text-[var(--color-text-muted)]">{formatRelativeTime(team.lastActivity)}</span>
|
|
1253
|
+
</>
|
|
1214
1254
|
)}
|
|
1215
|
-
</div>
|
|
1216
|
-
<div className="mt-auto">
|
|
1217
|
-
{(() => {
|
|
1218
|
-
const tc = taskCountsByTeam.get(team.teamName);
|
|
1219
|
-
const pending = tc?.pending ?? 0;
|
|
1220
|
-
const inProgress = tc?.inProgress ?? 0;
|
|
1221
|
-
const completed = tc?.completed ?? 0;
|
|
1222
|
-
const totalTasks = pending + inProgress + completed;
|
|
1223
|
-
const completedRatio = totalTasks > 0 ? completed / totalTasks : 0;
|
|
1224
|
-
return (
|
|
1225
|
-
<div className="mt-2 w-full space-y-1.5">
|
|
1226
|
-
<div className="flex items-center gap-2">
|
|
1227
|
-
<div
|
|
1228
|
-
className="h-1.5 flex-1 overflow-hidden rounded-full bg-[var(--color-surface-raised)]"
|
|
1229
|
-
role="progressbar"
|
|
1230
|
-
aria-valuenow={completed}
|
|
1231
|
-
aria-valuemin={0}
|
|
1232
|
-
aria-valuemax={totalTasks}
|
|
1233
|
-
aria-label={`任务 ${completed}/${totalTasks} 已完成`}
|
|
1234
|
-
>
|
|
1235
|
-
<div
|
|
1236
|
-
className="h-full rounded-full bg-emerald-500 transition-all duration-200"
|
|
1237
|
-
style={{ width: `${Math.round(completedRatio * 100)}%` }}
|
|
1238
|
-
/>
|
|
1239
|
-
</div>
|
|
1240
|
-
<span className="shrink-0 text-[10px] font-medium tracking-tight text-[var(--color-text-muted)]">
|
|
1241
|
-
{completed}/{totalTasks}
|
|
1242
|
-
</span>
|
|
1243
|
-
</div>
|
|
1244
|
-
{totalTasks > 0 && (
|
|
1245
|
-
<div className="flex flex-wrap items-center gap-x-3 gap-y-0.5 text-[10px] text-[var(--color-text-muted)]">
|
|
1246
|
-
{inProgress > 0 && (
|
|
1247
|
-
<span className="inline-flex items-center gap-1">
|
|
1248
|
-
<Play size={10} className="shrink-0 text-blue-400" />
|
|
1249
|
-
{inProgress} 进行中
|
|
1250
|
-
</span>
|
|
1251
|
-
)}
|
|
1252
|
-
{pending > 0 && (
|
|
1253
|
-
<span className="inline-flex items-center gap-1">
|
|
1254
|
-
<Clock size={10} className="shrink-0 text-amber-400" />
|
|
1255
|
-
{pending} 待办
|
|
1256
|
-
</span>
|
|
1257
|
-
)}
|
|
1258
|
-
{completed > 0 && (
|
|
1259
|
-
<span className="inline-flex items-center gap-1">
|
|
1260
|
-
<CheckCircle size={10} className="shrink-0 text-emerald-400" />
|
|
1261
|
-
{completed} 已完成
|
|
1262
|
-
</span>
|
|
1263
|
-
)}
|
|
1264
|
-
</div>
|
|
1265
|
-
)}
|
|
1266
|
-
</div>
|
|
1267
|
-
);
|
|
1268
|
-
})()}
|
|
1269
|
-
{renderTeamRecentPaths(team, status, matchesCurrentProject, isLight)}
|
|
1270
1255
|
</div>
|
|
1271
1256
|
</div>
|
|
1272
1257
|
</div>
|
|
@@ -128,7 +128,7 @@ export const TeamSessionsSection = ({
|
|
|
128
128
|
{selectedSessionId !== null && (
|
|
129
129
|
<button
|
|
130
130
|
type="button"
|
|
131
|
-
className="flex w-full items-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs text-
|
|
131
|
+
className="flex w-full items-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs text-indigo-600 transition-colors hover:bg-indigo-500/10 dark:text-indigo-400"
|
|
132
132
|
onClick={() => onSelectSession(null)}
|
|
133
133
|
>
|
|
134
134
|
<FilterX size={12} />
|
|
@@ -176,10 +176,10 @@ const SessionRow = ({
|
|
|
176
176
|
return (
|
|
177
177
|
<div
|
|
178
178
|
className={`group flex w-full items-center gap-2 rounded-md px-2.5 py-2 text-left text-xs transition-colors hover:bg-[var(--color-surface-raised)] ${
|
|
179
|
-
isLead ? 'border border-
|
|
180
|
-
} ${isSelected ? 'bg-
|
|
179
|
+
isLead ? 'border border-indigo-500/20 bg-indigo-500/5' : ''
|
|
180
|
+
} ${isSelected ? 'bg-indigo-500/10 ring-1 ring-indigo-400/50' : ''}`}
|
|
181
181
|
>
|
|
182
|
-
{isLead && <Crown size={12} className="shrink-0 text-
|
|
182
|
+
{isLead && <Crown size={12} className="shrink-0 text-indigo-400" />}
|
|
183
183
|
|
|
184
184
|
<button type="button" className="min-w-0 flex-1 text-left" onClick={onClick}>
|
|
185
185
|
<div className="flex items-center gap-1.5">
|
|
@@ -199,7 +199,7 @@ const SessionRow = ({
|
|
|
199
199
|
{isLead && (
|
|
200
200
|
<>
|
|
201
201
|
<span style={{ opacity: 0.5 }}>·</span>
|
|
202
|
-
<span className="text-
|
|
202
|
+
<span className="text-indigo-600 dark:text-indigo-400">负责人</span>
|
|
203
203
|
</>
|
|
204
204
|
)}
|
|
205
205
|
</div>
|
|
@@ -210,7 +210,7 @@ const SessionRow = ({
|
|
|
210
210
|
<TooltipTrigger asChild>
|
|
211
211
|
<button
|
|
212
212
|
type="button"
|
|
213
|
-
className={`rounded p-0.5 text-[var(--color-text-muted)] transition-opacity hover:text-
|
|
213
|
+
className={`rounded p-0.5 text-[var(--color-text-muted)] transition-opacity hover:text-indigo-400 ${
|
|
214
214
|
isSelected ? 'opacity-100' : 'opacity-0 group-hover:opacity-100'
|
|
215
215
|
}`}
|
|
216
216
|
onClick={(e) => {
|
|
@@ -21,7 +21,7 @@ export const UnreadCommentsBadge = ({
|
|
|
21
21
|
{totalCount}
|
|
22
22
|
</span>
|
|
23
23
|
{unreadCount > 0 ? (
|
|
24
|
-
<span className="absolute -right-1 -top-1 flex h-4 min-w-4 items-center justify-center rounded-full bg-
|
|
24
|
+
<span className="absolute -right-1 -top-1 flex h-4 min-w-4 items-center justify-center rounded-full bg-indigo-500 px-1 text-[8px] font-bold leading-none text-white shadow-sm">
|
|
25
25
|
{unreadCount}
|
|
26
26
|
</span>
|
|
27
27
|
) : null}
|
|
@@ -223,7 +223,7 @@ const SessionSourceBadge = ({ message }: { message: InboxMessage }): React.JSX.E
|
|
|
223
223
|
className="inline-flex max-w-[180px] items-center truncate rounded-full px-1.5 py-0.5 text-[10px] font-medium"
|
|
224
224
|
title={`${platform}${label}${session?.key ? ` (${session.key})` : ''}`}
|
|
225
225
|
style={{
|
|
226
|
-
backgroundColor: 'rgba(
|
|
226
|
+
backgroundColor: 'rgba(99, 102, 241, 0.12)',
|
|
227
227
|
color: '#93c5fd',
|
|
228
228
|
}}
|
|
229
229
|
>
|
|
@@ -578,7 +578,7 @@ function linkifyTaskIds(text: string, onClick: (taskId: string) => void): React.
|
|
|
578
578
|
<TaskTooltip key={i} taskId={taskId}>
|
|
579
579
|
<button
|
|
580
580
|
type="button"
|
|
581
|
-
className="inline cursor-pointer font-medium text-
|
|
581
|
+
className="inline cursor-pointer font-medium text-indigo-600 hover:underline dark:text-indigo-400"
|
|
582
582
|
onClick={(e) => {
|
|
583
583
|
e.stopPropagation();
|
|
584
584
|
onClick(taskId);
|
|
@@ -636,7 +636,7 @@ const TaskRecipientBadge = ({
|
|
|
636
636
|
className="inline-flex items-center rounded px-1.5 py-0.5 text-[10px] font-medium tracking-wide"
|
|
637
637
|
style={{
|
|
638
638
|
backgroundColor: 'rgba(96, 165, 250, 0.14)',
|
|
639
|
-
color: '#
|
|
639
|
+
color: '#818cf8',
|
|
640
640
|
border: '1px solid rgba(96, 165, 250, 0.3)',
|
|
641
641
|
}}
|
|
642
642
|
>
|
|
@@ -1209,7 +1209,7 @@ export const ActivityItem = memo(
|
|
|
1209
1209
|
<div className="flex min-w-0 flex-1 items-center gap-2 overflow-hidden">
|
|
1210
1210
|
{isUnread ? (
|
|
1211
1211
|
<span
|
|
1212
|
-
className="size-2 shrink-0 rounded-full bg-
|
|
1212
|
+
className="size-2 shrink-0 rounded-full bg-indigo-500"
|
|
1213
1213
|
title="未读"
|
|
1214
1214
|
aria-hidden
|
|
1215
1215
|
/>
|
|
@@ -1239,7 +1239,7 @@ export const ActivityItem = memo(
|
|
|
1239
1239
|
<button
|
|
1240
1240
|
type="button"
|
|
1241
1241
|
aria-label="展开消息"
|
|
1242
|
-
className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-
|
|
1242
|
+
className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-indigo-500/50 group-hover:opacity-100"
|
|
1243
1243
|
style={{ color: CARD_ICON_MUTED }}
|
|
1244
1244
|
onClick={(e) => {
|
|
1245
1245
|
e.stopPropagation();
|
|
@@ -1279,7 +1279,7 @@ export const ActivityItem = memo(
|
|
|
1279
1279
|
<div className="flex min-w-0 items-center gap-2">
|
|
1280
1280
|
{isUnread ? (
|
|
1281
1281
|
<span
|
|
1282
|
-
className="size-2 shrink-0 rounded-full bg-
|
|
1282
|
+
className="size-2 shrink-0 rounded-full bg-indigo-500"
|
|
1283
1283
|
title="未读"
|
|
1284
1284
|
aria-hidden
|
|
1285
1285
|
/>
|
|
@@ -1322,7 +1322,7 @@ export const ActivityItem = memo(
|
|
|
1322
1322
|
<button
|
|
1323
1323
|
type="button"
|
|
1324
1324
|
aria-label="展开消息"
|
|
1325
|
-
className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-
|
|
1325
|
+
className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-indigo-500/50 group-hover:opacity-100"
|
|
1326
1326
|
style={{ color: CARD_ICON_MUTED }}
|
|
1327
1327
|
onClick={(e) => {
|
|
1328
1328
|
e.stopPropagation();
|
|
@@ -1361,7 +1361,7 @@ export const ActivityItem = memo(
|
|
|
1361
1361
|
<>
|
|
1362
1362
|
{isUnread ? (
|
|
1363
1363
|
<span
|
|
1364
|
-
className="size-2 shrink-0 rounded-full bg-
|
|
1364
|
+
className="size-2 shrink-0 rounded-full bg-indigo-500"
|
|
1365
1365
|
title="未读"
|
|
1366
1366
|
aria-hidden
|
|
1367
1367
|
/>
|
|
@@ -1406,7 +1406,7 @@ export const ActivityItem = memo(
|
|
|
1406
1406
|
<button
|
|
1407
1407
|
type="button"
|
|
1408
1408
|
aria-label="展开消息"
|
|
1409
|
-
className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-
|
|
1409
|
+
className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-indigo-500/50 group-hover:opacity-100"
|
|
1410
1410
|
style={{ color: CARD_ICON_MUTED }}
|
|
1411
1411
|
onClick={(e) => {
|
|
1412
1412
|
e.stopPropagation();
|
|
@@ -762,11 +762,11 @@ export const ActivityTimeline = React.memo(function ActivityTimeline({
|
|
|
762
762
|
className="flex items-center gap-3"
|
|
763
763
|
style={{ paddingTop: 45, paddingBottom: 45 }}
|
|
764
764
|
>
|
|
765
|
-
<div className="h-px flex-1 bg-
|
|
766
|
-
<span className="whitespace-nowrap text-[11px] font-medium text-
|
|
765
|
+
<div className="h-px flex-1 bg-indigo-600/30 dark:bg-indigo-400/30" />
|
|
766
|
+
<span className="whitespace-nowrap text-[11px] font-medium text-indigo-600 dark:text-indigo-400">
|
|
767
767
|
New session
|
|
768
768
|
</span>
|
|
769
|
-
<div className="h-px flex-1 bg-
|
|
769
|
+
<div className="h-px flex-1 bg-indigo-600/30 dark:bg-indigo-400/30" />
|
|
770
770
|
</div>
|
|
771
771
|
);
|
|
772
772
|
case 'compaction-divider':
|
|
@@ -933,7 +933,7 @@ export const ActivityTimeline = React.memo(function ActivityTimeline({
|
|
|
933
933
|
<span className="text-[11px] tabular-nums text-[var(--color-text-muted)]">
|
|
934
934
|
+{hiddenCount} older
|
|
935
935
|
</span>
|
|
936
|
-
<span className="h-3 w-px bg-
|
|
936
|
+
<span className="h-3 w-px bg-indigo-600/30 dark:bg-indigo-400/30" />
|
|
937
937
|
<button
|
|
938
938
|
onClick={handleShowMore}
|
|
939
939
|
className="rounded-full px-2.5 py-0.5 text-[11px] font-medium text-[var(--color-text-secondary)] transition-all hover:bg-[rgba(255,255,255,0.08)] hover:text-[var(--color-text)]"
|
|
@@ -942,7 +942,7 @@ export const ActivityTimeline = React.memo(function ActivityTimeline({
|
|
|
942
942
|
</button>
|
|
943
943
|
{hiddenCount > MESSAGES_PAGE_SIZE && (
|
|
944
944
|
<>
|
|
945
|
-
<span className="h-3 w-px bg-
|
|
945
|
+
<span className="h-3 w-px bg-indigo-600/30 dark:bg-indigo-400/30" />
|
|
946
946
|
<button
|
|
947
947
|
onClick={handleShowAll}
|
|
948
948
|
className="rounded-full px-2.5 py-0.5 text-[11px] text-[var(--color-text-muted)] transition-all hover:bg-[rgba(255,255,255,0.08)] hover:text-[var(--color-text-secondary)]"
|
|
@@ -848,7 +848,7 @@ const LeadThoughtsGroupRowComponent = ({
|
|
|
848
848
|
<button
|
|
849
849
|
type="button"
|
|
850
850
|
aria-label="Expand thoughts"
|
|
851
|
-
className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-
|
|
851
|
+
className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-indigo-500/50 group-hover:opacity-100"
|
|
852
852
|
style={{ color: CARD_ICON_MUTED }}
|
|
853
853
|
onClick={(e) => {
|
|
854
854
|
e.stopPropagation();
|
|
@@ -933,7 +933,7 @@ const LeadThoughtsGroupRowComponent = ({
|
|
|
933
933
|
<button
|
|
934
934
|
type="button"
|
|
935
935
|
aria-label="Expand thoughts"
|
|
936
|
-
className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-
|
|
936
|
+
className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-indigo-500/50 group-hover:opacity-100"
|
|
937
937
|
style={{ color: CARD_ICON_MUTED }}
|
|
938
938
|
onClick={(e) => {
|
|
939
939
|
e.stopPropagation();
|
|
@@ -1032,7 +1032,7 @@ const LeadThoughtsGroupRowComponent = ({
|
|
|
1032
1032
|
<button
|
|
1033
1033
|
type="button"
|
|
1034
1034
|
aria-label="Expand thoughts"
|
|
1035
|
-
className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-
|
|
1035
|
+
className="absolute right-0 top-1/2 -translate-y-1/2 rounded p-0.5 opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-indigo-500/50 group-hover:opacity-100"
|
|
1036
1036
|
style={{ color: CARD_ICON_MUTED }}
|
|
1037
1037
|
onClick={(e) => {
|
|
1038
1038
|
e.stopPropagation();
|
|
@@ -34,15 +34,15 @@ export const ReplyQuoteBlock = ({
|
|
|
34
34
|
return (
|
|
35
35
|
<div className="space-y-2">
|
|
36
36
|
{/* Quote block — styled like SendMessageDialog */}
|
|
37
|
-
<div className="relative overflow-hidden rounded-md border border-
|
|
37
|
+
<div className="relative overflow-hidden rounded-md border border-indigo-400/20 bg-blue-100/40 py-2 pl-3 pr-2 dark:border-indigo-500/20 dark:bg-blue-950/20">
|
|
38
38
|
{/* Decorative quotation mark */}
|
|
39
|
-
<span className="pointer-events-none absolute -right-1 top-1/2 -translate-y-1/2 select-none font-serif text-[48px] leading-none text-
|
|
39
|
+
<span className="pointer-events-none absolute -right-1 top-1/2 -translate-y-1/2 select-none font-serif text-[48px] leading-none text-indigo-600/[0.08] dark:text-indigo-400/[0.08]">
|
|
40
40
|
“
|
|
41
41
|
</span>
|
|
42
42
|
|
|
43
43
|
{/* "Replying to" + MemberBadge */}
|
|
44
44
|
<div className="mb-1 flex items-center gap-1.5">
|
|
45
|
-
<span className="text-[10px] text-
|
|
45
|
+
<span className="text-[10px] text-indigo-600/60 dark:text-indigo-300/60">Replying to</span>
|
|
46
46
|
<MemberBadge name={reply.agentName} color={memberColor} size="sm" />
|
|
47
47
|
</div>
|
|
48
48
|
|
|
@@ -59,7 +59,7 @@ export const ReplyQuoteBlock = ({
|
|
|
59
59
|
{isLong ? (
|
|
60
60
|
<button
|
|
61
61
|
type="button"
|
|
62
|
-
className="mt-0.5 text-[10px] text-
|
|
62
|
+
className="mt-0.5 text-[10px] text-indigo-600/60 hover:text-blue-700 dark:text-indigo-400/60 dark:hover:text-indigo-300"
|
|
63
63
|
onClick={() => setExpanded((v) => !v)}
|
|
64
64
|
>
|
|
65
65
|
{expanded ? 'less' : 'more'}
|
|
@@ -233,7 +233,7 @@ export const CreateTaskDialog = ({
|
|
|
233
233
|
>
|
|
234
234
|
<AlertTriangle size={14} className="mt-0.5 shrink-0" />
|
|
235
235
|
<p className="text-xs leading-relaxed">
|
|
236
|
-
|
|
236
|
+
数字员工当前未运行:没有本地 Claude/Agent 进程在运行。任务会加入 <strong>待处理</strong>,启动数字员工后即可开始执行。
|
|
237
237
|
</p>
|
|
238
238
|
</div>
|
|
239
239
|
) : null}
|
|
@@ -342,7 +342,7 @@ export const CreateTaskDialog = ({
|
|
|
342
342
|
type="button"
|
|
343
343
|
className={`flex w-full items-center gap-2 rounded px-2 py-1.5 text-left text-xs transition-colors ${
|
|
344
344
|
isSelected
|
|
345
|
-
? 'bg-
|
|
345
|
+
? 'bg-indigo-500/15 text-indigo-300'
|
|
346
346
|
: 'text-[var(--color-text-secondary)] hover:bg-[var(--color-surface-raised)]'
|
|
347
347
|
}`}
|
|
348
348
|
onClick={() => toggleBlockedBy(t.id)}
|
|
@@ -350,7 +350,7 @@ export const CreateTaskDialog = ({
|
|
|
350
350
|
<span
|
|
351
351
|
className={`flex size-3.5 shrink-0 items-center justify-center rounded-sm border text-[9px] ${
|
|
352
352
|
isSelected
|
|
353
|
-
? 'border-
|
|
353
|
+
? 'border-indigo-400 bg-indigo-500/30 text-indigo-300'
|
|
354
354
|
: 'border-[var(--color-border-emphasis)]'
|
|
355
355
|
}`}
|
|
356
356
|
>
|
|
@@ -468,7 +468,7 @@ export const CreateTaskDialog = ({
|
|
|
468
468
|
</div>
|
|
469
469
|
{!isTeamAlive ? (
|
|
470
470
|
<p className="text-[10px] text-[var(--color-text-muted)]">
|
|
471
|
-
|
|
471
|
+
数字员工当前未运行。请先启动数字员工,才能立即开始任务。
|
|
472
472
|
</p>
|
|
473
473
|
) : null}
|
|
474
474
|
</div>
|