@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
|
@@ -31,10 +31,17 @@ export const platformMeta: Record<string, PlatformMeta> = {
|
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
key: 'allow_from',
|
|
34
|
-
label: '
|
|
35
|
-
placeholder: '*
|
|
34
|
+
label: '私聊权限(允许的用户 ID)',
|
|
35
|
+
placeholder: '* 或 user_id',
|
|
36
36
|
group: 'advanced',
|
|
37
|
-
hint: '
|
|
37
|
+
hint: '控制哪些用户可以私聊机器人,* 表示所有',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
key: 'allow_chat',
|
|
41
|
+
label: '群聊权限(允许的群聊 ID)',
|
|
42
|
+
placeholder: '* 或 chat_id',
|
|
43
|
+
group: 'advanced',
|
|
44
|
+
hint: '控制哪些群聊可以 @机器人,* 表示所有群聊',
|
|
38
45
|
},
|
|
39
46
|
{ key: 'group_reply_all', label: '群聊回复全部', type: 'boolean', group: 'advanced' },
|
|
40
47
|
{ key: 'share_session_in_channel', label: '共享群会话', type: 'boolean', group: 'advanced' },
|
|
@@ -44,7 +51,20 @@ export const platformMeta: Record<string, PlatformMeta> = {
|
|
|
44
51
|
label: 'Discord',
|
|
45
52
|
fields: [
|
|
46
53
|
{ key: 'token', label: 'Bot Token', required: true, type: 'password' },
|
|
47
|
-
{
|
|
54
|
+
{
|
|
55
|
+
key: 'allow_from',
|
|
56
|
+
label: '私聊权限(允许的用户 ID)',
|
|
57
|
+
placeholder: '* 或 user_id',
|
|
58
|
+
group: 'advanced',
|
|
59
|
+
hint: '控制哪些用户可以私聊机器人',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
key: 'allow_chat',
|
|
63
|
+
label: '群聊权限(允许的频道 ID)',
|
|
64
|
+
placeholder: '* 或 channel_id',
|
|
65
|
+
group: 'advanced',
|
|
66
|
+
hint: '控制哪些频道可以 @机器人',
|
|
67
|
+
},
|
|
48
68
|
{
|
|
49
69
|
key: 'guild_id',
|
|
50
70
|
label: 'Guild ID',
|
|
@@ -79,7 +99,20 @@ export const platformMeta: Record<string, PlatformMeta> = {
|
|
|
79
99
|
type: 'password',
|
|
80
100
|
placeholder: 'xapp-...',
|
|
81
101
|
},
|
|
82
|
-
{
|
|
102
|
+
{
|
|
103
|
+
key: 'allow_from',
|
|
104
|
+
label: '私聊权限(允许的用户 ID)',
|
|
105
|
+
placeholder: '* 或 user_id',
|
|
106
|
+
group: 'advanced',
|
|
107
|
+
hint: '控制哪些用户可以私聊机器人',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
key: 'allow_chat',
|
|
111
|
+
label: '群聊权限(允许的频道 ID)',
|
|
112
|
+
placeholder: '* 或 channel_id',
|
|
113
|
+
group: 'advanced',
|
|
114
|
+
hint: '控制哪些频道可以 @机器人',
|
|
115
|
+
},
|
|
83
116
|
{
|
|
84
117
|
key: 'share_session_in_channel',
|
|
85
118
|
label: '共享频道会话',
|
|
@@ -93,7 +126,20 @@ export const platformMeta: Record<string, PlatformMeta> = {
|
|
|
93
126
|
fields: [
|
|
94
127
|
{ key: 'client_id', label: 'Client ID', required: true },
|
|
95
128
|
{ key: 'client_secret', label: 'Client Secret', required: true, type: 'password' },
|
|
96
|
-
{
|
|
129
|
+
{
|
|
130
|
+
key: 'allow_from',
|
|
131
|
+
label: '私聊权限(允许的用户 ID)',
|
|
132
|
+
placeholder: '* 或 user_id',
|
|
133
|
+
group: 'advanced',
|
|
134
|
+
hint: '控制哪些用户可以私聊机器人',
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
key: 'allow_chat',
|
|
138
|
+
label: '群聊权限(允许的群聊 ID)',
|
|
139
|
+
placeholder: '* 或 chat_id',
|
|
140
|
+
group: 'advanced',
|
|
141
|
+
hint: '控制哪些群聊可以 @机器人',
|
|
142
|
+
},
|
|
97
143
|
{ key: 'share_session_in_channel', label: '共享群会话', type: 'boolean', group: 'advanced' },
|
|
98
144
|
],
|
|
99
145
|
},
|
|
@@ -123,7 +169,20 @@ export const platformMeta: Record<string, PlatformMeta> = {
|
|
|
123
169
|
placeholder: 'https://qyapi.weixin.qq.com',
|
|
124
170
|
group: 'advanced',
|
|
125
171
|
},
|
|
126
|
-
{
|
|
172
|
+
{
|
|
173
|
+
key: 'allow_from',
|
|
174
|
+
label: '私聊权限(允许的用户 ID)',
|
|
175
|
+
placeholder: '* 或 user_id',
|
|
176
|
+
group: 'advanced',
|
|
177
|
+
hint: '控制哪些用户可以私聊机器人',
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
key: 'allow_chat',
|
|
181
|
+
label: '群聊权限(允许的群聊 ID)',
|
|
182
|
+
placeholder: '* 或 chat_id',
|
|
183
|
+
group: 'advanced',
|
|
184
|
+
hint: '控制哪些群聊可以 @机器人',
|
|
185
|
+
},
|
|
127
186
|
],
|
|
128
187
|
},
|
|
129
188
|
qq: {
|
|
@@ -131,7 +190,20 @@ export const platformMeta: Record<string, PlatformMeta> = {
|
|
|
131
190
|
fields: [
|
|
132
191
|
{ key: 'ws_url', label: 'WebSocket URL', required: true, placeholder: 'ws://127.0.0.1:3001' },
|
|
133
192
|
{ key: 'token', label: 'Access Token', type: 'password', group: 'advanced' },
|
|
134
|
-
{
|
|
193
|
+
{
|
|
194
|
+
key: 'allow_from',
|
|
195
|
+
label: '私聊权限(允许的用户 ID)',
|
|
196
|
+
placeholder: '* 或 user_id',
|
|
197
|
+
group: 'advanced',
|
|
198
|
+
hint: '控制哪些用户可以私聊机器人',
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
key: 'allow_chat',
|
|
202
|
+
label: '群聊权限(允许的群聊 ID)',
|
|
203
|
+
placeholder: '* 或 group_id',
|
|
204
|
+
group: 'advanced',
|
|
205
|
+
hint: '控制哪些群聊可以 @机器人',
|
|
206
|
+
},
|
|
135
207
|
{ key: 'share_session_in_channel', label: '共享群会话', type: 'boolean', group: 'advanced' },
|
|
136
208
|
],
|
|
137
209
|
},
|
|
@@ -141,7 +213,20 @@ export const platformMeta: Record<string, PlatformMeta> = {
|
|
|
141
213
|
{ key: 'app_id', label: 'App ID', required: true },
|
|
142
214
|
{ key: 'app_secret', label: 'App Secret', required: true, type: 'password' },
|
|
143
215
|
{ key: 'sandbox', label: '沙盒模式', type: 'boolean', group: 'advanced' },
|
|
144
|
-
{
|
|
216
|
+
{
|
|
217
|
+
key: 'allow_from',
|
|
218
|
+
label: '私聊权限(允许的用户 ID)',
|
|
219
|
+
placeholder: '* 或 user_id',
|
|
220
|
+
group: 'advanced',
|
|
221
|
+
hint: '控制哪些用户可以私聊机器人',
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
key: 'allow_chat',
|
|
225
|
+
label: '群聊权限(允许的群聊 ID)',
|
|
226
|
+
placeholder: '* 或 group_id',
|
|
227
|
+
group: 'advanced',
|
|
228
|
+
hint: '控制哪些群聊可以 @机器人',
|
|
229
|
+
},
|
|
145
230
|
{ key: 'share_session_in_channel', label: '共享群会话', type: 'boolean', group: 'advanced' },
|
|
146
231
|
],
|
|
147
232
|
},
|
|
@@ -152,7 +237,20 @@ export const platformMeta: Record<string, PlatformMeta> = {
|
|
|
152
237
|
{ key: 'channel_token', label: 'Channel Token', required: true, type: 'password' },
|
|
153
238
|
{ key: 'port', label: '端口', required: true, placeholder: '8080' },
|
|
154
239
|
{ key: 'callback_path', label: 'Callback Path', placeholder: '/callback', group: 'advanced' },
|
|
155
|
-
{
|
|
240
|
+
{
|
|
241
|
+
key: 'allow_from',
|
|
242
|
+
label: '私聊权限(允许的用户 ID)',
|
|
243
|
+
placeholder: '* 或 user_id',
|
|
244
|
+
group: 'advanced',
|
|
245
|
+
hint: '控制哪些用户可以私聊机器人',
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
key: 'allow_chat',
|
|
249
|
+
label: '群聊权限(允许的群聊 ID)',
|
|
250
|
+
placeholder: '* 或 room_id',
|
|
251
|
+
group: 'advanced',
|
|
252
|
+
hint: '控制哪些群聊可以 @机器人',
|
|
253
|
+
},
|
|
156
254
|
],
|
|
157
255
|
},
|
|
158
256
|
weibo: {
|
|
@@ -160,7 +258,20 @@ export const platformMeta: Record<string, PlatformMeta> = {
|
|
|
160
258
|
fields: [
|
|
161
259
|
{ key: 'app_id', label: 'App ID', required: true, placeholder: '1234567890' },
|
|
162
260
|
{ key: 'app_secret', label: 'App Secret', required: true, type: 'password' },
|
|
163
|
-
{
|
|
261
|
+
{
|
|
262
|
+
key: 'allow_from',
|
|
263
|
+
label: '私聊权限(允许的用户 ID)',
|
|
264
|
+
placeholder: '* 或 user_id',
|
|
265
|
+
group: 'advanced',
|
|
266
|
+
hint: '控制哪些用户可以私聊机器人',
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
key: 'allow_chat',
|
|
270
|
+
label: '群聊权限(允许的群聊 ID)',
|
|
271
|
+
placeholder: '* 或 chat_id',
|
|
272
|
+
group: 'advanced',
|
|
273
|
+
hint: '控制哪些群聊可以 @机器人',
|
|
274
|
+
},
|
|
164
275
|
],
|
|
165
276
|
},
|
|
166
277
|
};
|
|
@@ -8,7 +8,7 @@ import { useShallow } from 'zustand/react/shallow';
|
|
|
8
8
|
import type { GlobalProvider } from '@shared/types';
|
|
9
9
|
import type { CcAgentType } from '@shared/types/ccConnect';
|
|
10
10
|
|
|
11
|
-
type SavePhase = 'idle' | 'saving' | '
|
|
11
|
+
type SavePhase = 'idle' | 'saving' | 'done';
|
|
12
12
|
|
|
13
13
|
export interface UseTeamEditFormReturn {
|
|
14
14
|
loading: boolean;
|
|
@@ -29,6 +29,8 @@ export interface UseTeamEditFormReturn {
|
|
|
29
29
|
setManagedSources: (v: string) => void;
|
|
30
30
|
feishuAllowFrom: string;
|
|
31
31
|
setFeishuAllowFrom: (v: string) => void;
|
|
32
|
+
feishuAllowChat: string;
|
|
33
|
+
setFeishuAllowChat: (v: string) => void;
|
|
32
34
|
disabledCommandsInput: string;
|
|
33
35
|
setDisabledCommandsInput: (v: string) => void;
|
|
34
36
|
providerRef: string;
|
|
@@ -106,6 +108,13 @@ export function useTeamEditForm(teamName: string, open: boolean): UseTeamEditFor
|
|
|
106
108
|
!Array.isArray(rawSettings.platform_allow_from)
|
|
107
109
|
? (rawSettings.platform_allow_from as Record<string, string>)
|
|
108
110
|
: {}),
|
|
111
|
+
platformAllowChat:
|
|
112
|
+
cfg?.platformAllowChat ??
|
|
113
|
+
(typeof (rawSettings as Record<string, unknown>).platform_allow_chat === 'object' &&
|
|
114
|
+
(rawSettings as Record<string, unknown>).platform_allow_chat !== null &&
|
|
115
|
+
!Array.isArray((rawSettings as Record<string, unknown>).platform_allow_chat)
|
|
116
|
+
? ((rawSettings as Record<string, unknown>).platform_allow_chat as Record<string, string>)
|
|
117
|
+
: {}),
|
|
109
118
|
providerRefs: data?.providerRefs ?? [],
|
|
110
119
|
globalProviders: data?.globalProviders ?? [],
|
|
111
120
|
showContextIndicator:
|
|
@@ -134,6 +143,7 @@ export function useTeamEditForm(teamName: string, open: boolean): UseTeamEditFor
|
|
|
134
143
|
defaults.disabledCommands.join(', ')
|
|
135
144
|
);
|
|
136
145
|
const [feishuAllowFrom, setFeishuAllowFrom] = useState(defaults.platformAllowFrom.feishu ?? '*');
|
|
146
|
+
const [feishuAllowChat, setFeishuAllowChat] = useState(defaults.platformAllowChat.feishu ?? '*');
|
|
137
147
|
const [providerRef, setProviderRef] = useState(defaults.providerRefs[0] ?? '');
|
|
138
148
|
const [showContextIndicator, setShowContextIndicator] = useState(defaults.showContextIndicator);
|
|
139
149
|
const [replyFooter, setReplyFooter] = useState(defaults.replyFooter);
|
|
@@ -142,7 +152,7 @@ export function useTeamEditForm(teamName: string, open: boolean): UseTeamEditFor
|
|
|
142
152
|
// ── Single async lifecycle state ─────────────────────────────
|
|
143
153
|
const [savePhase, setSavePhase] = useState<SavePhase>('idle');
|
|
144
154
|
const [error, setError] = useState<string | null>(null);
|
|
145
|
-
const saving = savePhase === 'saving'
|
|
155
|
+
const saving = savePhase === 'saving';
|
|
146
156
|
|
|
147
157
|
// ── Refs ─────────────────────────────────────────────────────
|
|
148
158
|
const defaultsRef = useRef(defaults);
|
|
@@ -170,6 +180,7 @@ export function useTeamEditForm(teamName: string, open: boolean): UseTeamEditFor
|
|
|
170
180
|
setManagedSources(d.managedSources);
|
|
171
181
|
setDisabledCommandsInput(d.disabledCommands.join(', '));
|
|
172
182
|
setFeishuAllowFrom(d.platformAllowFrom.feishu ?? '*');
|
|
183
|
+
setFeishuAllowChat(d.platformAllowChat.feishu ?? '*');
|
|
173
184
|
setProviderRef(d.providerRefs[0] ?? '');
|
|
174
185
|
setShowContextIndicator(d.showContextIndicator);
|
|
175
186
|
setReplyFooter(d.replyFooter);
|
|
@@ -204,6 +215,7 @@ export function useTeamEditForm(teamName: string, open: boolean): UseTeamEditFor
|
|
|
204
215
|
.map((e) => e.trim())
|
|
205
216
|
.filter((e) => e.length > 0);
|
|
206
217
|
const feishu = feishuAllowFrom.trim();
|
|
218
|
+
const feishuChat = feishuAllowChat.trim();
|
|
207
219
|
|
|
208
220
|
setSavePhase('saving');
|
|
209
221
|
setError(null);
|
|
@@ -224,12 +236,10 @@ export function useTeamEditForm(teamName: string, open: boolean): UseTeamEditFor
|
|
|
224
236
|
managedSources: managedSources.trim() || undefined,
|
|
225
237
|
disabledCommands,
|
|
226
238
|
platformAllowFrom: feishu ? { feishu } : {},
|
|
239
|
+
platformAllowChat: feishuChat ? { feishu: feishuChat } : {},
|
|
227
240
|
providerRefs: providerRef ? [providerRef] : [],
|
|
228
241
|
});
|
|
229
242
|
|
|
230
|
-
setSavePhase('restarting');
|
|
231
|
-
await api.ccSettings.restart();
|
|
232
|
-
|
|
233
243
|
await Promise.all([fetchTeams(), selectTeam(teamName)]);
|
|
234
244
|
setSavePhase('done');
|
|
235
245
|
} catch (err) {
|
|
@@ -258,6 +268,8 @@ export function useTeamEditForm(teamName: string, open: boolean): UseTeamEditFor
|
|
|
258
268
|
setManagedSources,
|
|
259
269
|
feishuAllowFrom,
|
|
260
270
|
setFeishuAllowFrom,
|
|
271
|
+
feishuAllowChat,
|
|
272
|
+
setFeishuAllowChat,
|
|
261
273
|
disabledCommandsInput,
|
|
262
274
|
setDisabledCommandsInput,
|
|
263
275
|
providerRef,
|
|
@@ -589,7 +589,7 @@ const RootDropZone = React.forwardRef<
|
|
|
589
589
|
<div
|
|
590
590
|
ref={combinedRef}
|
|
591
591
|
className={`scrollbar-thin h-full overflow-y-auto transition-colors ${
|
|
592
|
-
isDropTarget ? 'bg-
|
|
592
|
+
isDropTarget ? 'bg-indigo-400/5 ring-1 ring-inset ring-indigo-400/30' : ''
|
|
593
593
|
}`}
|
|
594
594
|
role="tree"
|
|
595
595
|
>
|
|
@@ -709,8 +709,8 @@ const DraggableTreeItem = React.memo(
|
|
|
709
709
|
className={`flex h-full cursor-pointer select-none items-center gap-1 truncate px-2 text-xs transition-colors hover:bg-surface-raised ${
|
|
710
710
|
isSelected ? 'bg-surface-raised text-text' : 'text-text-secondary'
|
|
711
711
|
} ${isDragging ? 'opacity-30' : ''} ${
|
|
712
|
-
isDropTarget ? 'rounded bg-
|
|
713
|
-
} ${isInsideDropTarget && !isDropTarget ? 'border-l-2 border-l-
|
|
712
|
+
isDropTarget ? 'rounded bg-indigo-400/10 ring-2 ring-indigo-400/50' : ''
|
|
713
|
+
} ${isInsideDropTarget && !isDropTarget ? 'border-l-2 border-l-indigo-400/40 bg-indigo-400/5' : ''}`}
|
|
714
714
|
style={{ paddingLeft: `${visualDepth * INDENT_PX + 8}px` }}
|
|
715
715
|
onClick={handleClick}
|
|
716
716
|
onKeyDown={handleKeyDown}
|
|
@@ -843,7 +843,7 @@ const InlineRenameInput = ({
|
|
|
843
843
|
}}
|
|
844
844
|
onBlur={() => requestAnimationFrame(() => inputRef.current?.focus())}
|
|
845
845
|
onClick={(e) => e.stopPropagation()}
|
|
846
|
-
className="min-w-0 flex-1 rounded border border-
|
|
846
|
+
className="min-w-0 flex-1 rounded border border-indigo-400/50 bg-surface px-1 py-0 text-xs text-text outline-none focus:ring-1 focus:ring-indigo-400/50"
|
|
847
847
|
/>
|
|
848
848
|
);
|
|
849
849
|
};
|
|
@@ -76,7 +76,7 @@ const SearchToggleButton = React.memo(function SearchToggleButton({
|
|
|
76
76
|
className={cn(
|
|
77
77
|
'flex size-[22px] items-center justify-center rounded transition-colors',
|
|
78
78
|
active
|
|
79
|
-
? 'bg-
|
|
79
|
+
? 'bg-indigo-500/20 text-indigo-400'
|
|
80
80
|
: 'text-[var(--color-text-muted)] hover:bg-[var(--color-surface-raised)] hover:text-[var(--color-text-secondary)]'
|
|
81
81
|
)}
|
|
82
82
|
onClick={onClick}
|
|
@@ -107,7 +107,7 @@ export const MarkdownSplitView = React.memo(function MarkdownSplitView({
|
|
|
107
107
|
// eslint-disable-next-line jsx-a11y/no-static-element-interactions -- resize handle
|
|
108
108
|
<div
|
|
109
109
|
className={`shrink-0 cursor-col-resize border-x border-border transition-colors ${
|
|
110
|
-
isResizing ? 'bg-
|
|
110
|
+
isResizing ? 'bg-indigo-500/50' : 'hover:bg-indigo-500/30'
|
|
111
111
|
}`}
|
|
112
112
|
style={{ width: HANDLE_WIDTH }}
|
|
113
113
|
onMouseDown={handleMouseDown}
|
|
@@ -121,7 +121,7 @@ export const NewFileDialog = ({
|
|
|
121
121
|
onKeyDown={handleKeyDown}
|
|
122
122
|
onBlur={() => requestAnimationFrame(() => inputRef.current?.focus())}
|
|
123
123
|
placeholder={type === 'file' ? '文件名...' : '文件夹名...'}
|
|
124
|
-
className="min-w-0 flex-1 rounded border border-border-emphasis bg-surface px-1.5 py-0.5 text-xs text-text outline-none focus:border-
|
|
124
|
+
className="min-w-0 flex-1 rounded border border-border-emphasis bg-surface px-1.5 py-0.5 text-xs text-text outline-none focus:border-indigo-500"
|
|
125
125
|
aria-label={type === 'file' ? '新文件名' : '新文件夹名'}
|
|
126
126
|
/>
|
|
127
127
|
</div>
|
|
@@ -720,7 +720,7 @@ export const ProjectEditorOverlay = ({
|
|
|
720
720
|
|
|
721
721
|
{/* External change banner */}
|
|
722
722
|
{activeTabId && externalChanges[activeTabId] && (
|
|
723
|
-
<div className="flex shrink-0 items-center gap-2 border-b border-
|
|
723
|
+
<div className="flex shrink-0 items-center gap-2 border-b border-indigo-400/30 bg-blue-100/50 px-3 py-1.5 text-xs text-blue-700 dark:border-indigo-500/30 dark:bg-indigo-500/10 dark:text-indigo-300">
|
|
724
724
|
<RefreshCw className="size-3.5 shrink-0" />
|
|
725
725
|
<span>
|
|
726
726
|
{externalChanges[activeTabId] === 'delete'
|
|
@@ -193,7 +193,7 @@ export const SearchInFilesPanel = ({
|
|
|
193
193
|
onClick={handleCaseSensitiveToggle}
|
|
194
194
|
className={`rounded px-1.5 py-0.5 text-[10px] font-medium transition-colors ${
|
|
195
195
|
caseSensitive
|
|
196
|
-
? 'bg-
|
|
196
|
+
? 'bg-indigo-500/20 text-indigo-400'
|
|
197
197
|
: 'text-text-muted hover:bg-surface-raised'
|
|
198
198
|
}`}
|
|
199
199
|
aria-label="区分大小写"
|
|
@@ -37,19 +37,19 @@ const COLUMN_ACCENTS: Record<
|
|
|
37
37
|
{ headerBg: string; bodyBg: string; icon: React.ReactNode }
|
|
38
38
|
> = {
|
|
39
39
|
todo: {
|
|
40
|
-
headerBg: 'rgba(
|
|
41
|
-
bodyBg: 'rgba(
|
|
42
|
-
icon: <ClipboardList size={
|
|
40
|
+
headerBg: 'rgba(148, 163, 184, 0.08)',
|
|
41
|
+
bodyBg: 'rgba(148, 163, 184, 0.02)',
|
|
42
|
+
icon: <ClipboardList size={13} className="shrink-0 text-[var(--color-text-muted)]" />,
|
|
43
43
|
},
|
|
44
44
|
in_progress: {
|
|
45
|
-
headerBg: 'rgba(
|
|
46
|
-
bodyBg: 'rgba(
|
|
47
|
-
icon: <PlayCircle size={
|
|
45
|
+
headerBg: 'rgba(6, 182, 212, 0.08)',
|
|
46
|
+
bodyBg: 'rgba(6, 182, 212, 0.02)',
|
|
47
|
+
icon: <PlayCircle size={13} className="shrink-0 text-cyan-400/60" />,
|
|
48
48
|
},
|
|
49
49
|
done: {
|
|
50
|
-
headerBg: 'rgba(34, 197, 94, 0.
|
|
51
|
-
bodyBg: 'rgba(34, 197, 94, 0.
|
|
52
|
-
icon: <CheckCircle2 size={
|
|
50
|
+
headerBg: 'rgba(34, 197, 94, 0.08)',
|
|
51
|
+
bodyBg: 'rgba(34, 197, 94, 0.02)',
|
|
52
|
+
icon: <CheckCircle2 size={13} className="shrink-0 text-green-400/60" />,
|
|
53
53
|
},
|
|
54
54
|
};
|
|
55
55
|
|
|
@@ -91,7 +91,7 @@ export const KanbanFilterPopover = ({
|
|
|
91
91
|
>
|
|
92
92
|
<Filter size={14} />
|
|
93
93
|
{activeCount > 0 && (
|
|
94
|
-
<span className="absolute -right-1 -top-1 flex size-4 items-center justify-center rounded-full bg-
|
|
94
|
+
<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">
|
|
95
95
|
{activeCount}
|
|
96
96
|
</span>
|
|
97
97
|
)}
|
|
@@ -111,7 +111,7 @@ export const KanbanFilterPopover = ({
|
|
|
111
111
|
type="button"
|
|
112
112
|
className={`w-full rounded-md px-2 py-1.5 text-left text-xs transition-colors ${
|
|
113
113
|
filter.sessionId === null
|
|
114
|
-
? 'bg-
|
|
114
|
+
? 'bg-indigo-500/15 text-indigo-300'
|
|
115
115
|
: 'text-[var(--color-text-secondary)] hover:bg-[var(--color-surface-raised)]'
|
|
116
116
|
}`}
|
|
117
117
|
onClick={() => handleSessionSelect(null)}
|
|
@@ -128,12 +128,12 @@ export const KanbanFilterPopover = ({
|
|
|
128
128
|
type="button"
|
|
129
129
|
className={`flex w-full items-center gap-1.5 rounded-md px-2 py-1.5 text-left text-xs transition-colors ${
|
|
130
130
|
isSelected
|
|
131
|
-
? 'bg-
|
|
131
|
+
? 'bg-indigo-500/15 text-indigo-300'
|
|
132
132
|
: 'text-[var(--color-text-secondary)] hover:bg-[var(--color-surface-raised)]'
|
|
133
133
|
}`}
|
|
134
134
|
onClick={() => handleSessionSelect(isSelected ? null : session.id)}
|
|
135
135
|
>
|
|
136
|
-
{isLead && <Crown size={11} className="shrink-0 text-
|
|
136
|
+
{isLead && <Crown size={11} className="shrink-0 text-indigo-400" />}
|
|
137
137
|
<span className="truncate">{label}</span>
|
|
138
138
|
</button>
|
|
139
139
|
);
|
|
@@ -228,7 +228,7 @@ const TaskSuggestionItem = React.memo(function TaskSuggestionItem({
|
|
|
228
228
|
case 'pending':
|
|
229
229
|
return 'bg-zinc-500/15 text-zinc-400';
|
|
230
230
|
case 'in_progress':
|
|
231
|
-
return 'bg-
|
|
231
|
+
return 'bg-indigo-500/15 text-indigo-400';
|
|
232
232
|
case 'completed':
|
|
233
233
|
return 'bg-emerald-500/15 text-emerald-400';
|
|
234
234
|
case 'deleted':
|
|
@@ -66,7 +66,7 @@ export const KanbanSortPopover = ({
|
|
|
66
66
|
>
|
|
67
67
|
<ArrowUpDown size={14} />
|
|
68
68
|
{isNonDefault && (
|
|
69
|
-
<span className="absolute -right-1 -top-1 flex size-4 items-center justify-center rounded-full bg-
|
|
69
|
+
<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">
|
|
70
70
|
1
|
|
71
71
|
</span>
|
|
72
72
|
)}
|
|
@@ -90,7 +90,7 @@ export const KanbanSortPopover = ({
|
|
|
90
90
|
className={cn(
|
|
91
91
|
'flex w-full items-center gap-2.5 rounded-md px-2 py-1.5 text-left text-xs transition-colors',
|
|
92
92
|
isSelected
|
|
93
|
-
? 'bg-
|
|
93
|
+
? 'bg-indigo-500/15 text-indigo-300'
|
|
94
94
|
: 'text-[var(--color-text-secondary)] hover:bg-[var(--color-surface-raised)]'
|
|
95
95
|
)}
|
|
96
96
|
onClick={() => onSortChange({ field: option.field })}
|
|
@@ -98,7 +98,7 @@ export const KanbanSortPopover = ({
|
|
|
98
98
|
<span
|
|
99
99
|
className={cn(
|
|
100
100
|
'shrink-0',
|
|
101
|
-
isSelected ? 'text-
|
|
101
|
+
isSelected ? 'text-indigo-400' : 'text-[var(--color-text-muted)]'
|
|
102
102
|
)}
|
|
103
103
|
>
|
|
104
104
|
{option.icon}
|
|
@@ -108,14 +108,14 @@ export const KanbanSortPopover = ({
|
|
|
108
108
|
<div
|
|
109
109
|
className={cn(
|
|
110
110
|
'text-[10px]',
|
|
111
|
-
isSelected ? 'text-
|
|
111
|
+
isSelected ? 'text-indigo-300/70' : 'text-[var(--color-text-muted)]'
|
|
112
112
|
)}
|
|
113
113
|
>
|
|
114
114
|
{option.description}
|
|
115
115
|
</div>
|
|
116
116
|
</div>
|
|
117
117
|
{isSelected && (
|
|
118
|
-
<ArrowDownUp size={12} className="ml-auto shrink-0 text-
|
|
118
|
+
<ArrowDownUp size={12} className="ml-auto shrink-0 text-indigo-400" />
|
|
119
119
|
)}
|
|
120
120
|
</button>
|
|
121
121
|
);
|
|
@@ -63,8 +63,8 @@ const DISPATCH_STATUS_STYLE: Record<string, { bg: string; text: string; label: s
|
|
|
63
63
|
text: 'text-yellow-600 dark:text-yellow-400',
|
|
64
64
|
label: '已派发',
|
|
65
65
|
},
|
|
66
|
-
received: { bg: 'bg-
|
|
67
|
-
in_progress: { bg: 'bg-
|
|
66
|
+
received: { bg: 'bg-indigo-500/15', text: 'text-indigo-600 dark:text-indigo-400', label: '已接收' },
|
|
67
|
+
in_progress: { bg: 'bg-indigo-500/15', text: 'text-indigo-600 dark:text-indigo-400', label: '执行中' },
|
|
68
68
|
completed: {
|
|
69
69
|
bg: 'bg-emerald-500/15',
|
|
70
70
|
text: 'text-emerald-600 dark:text-emerald-400',
|
|
@@ -355,7 +355,7 @@ export const KanbanTaskCard = memo(
|
|
|
355
355
|
className={`mt-1 inline-flex items-center gap-1 rounded-full px-1.5 py-0.5 text-[10px] font-medium ${
|
|
356
356
|
task.needsClarification === 'user'
|
|
357
357
|
? 'bg-red-500/15 text-red-400'
|
|
358
|
-
: 'bg-
|
|
358
|
+
: 'bg-indigo-500/15 text-indigo-600 dark:text-indigo-400'
|
|
359
359
|
}`}
|
|
360
360
|
>
|
|
361
361
|
<HelpCircle size={10} />
|
|
@@ -392,7 +392,7 @@ export const KanbanTaskCard = memo(
|
|
|
392
392
|
|
|
393
393
|
{hasBlocks ? (
|
|
394
394
|
<div className="mb-2 flex flex-wrap items-center gap-1">
|
|
395
|
-
<span className="inline-flex items-center gap-0.5 text-[10px] text-
|
|
395
|
+
<span className="inline-flex items-center gap-0.5 text-[10px] text-indigo-600 dark:text-indigo-400">
|
|
396
396
|
<ArrowRightFromLine size={10} />
|
|
397
397
|
阻塞
|
|
398
398
|
</span>
|
|
@@ -607,55 +607,22 @@ export const MemberCard = ({
|
|
|
607
607
|
className="shrink-0"
|
|
608
608
|
title={totalTasks > 0 ? `${completed}/${totalTasks} completed` : undefined}
|
|
609
609
|
>
|
|
610
|
-
<Badge
|
|
611
|
-
variant="secondary"
|
|
612
|
-
className="shrink-0 px-1.5 py-0.5 text-[10px] font-normal leading-none"
|
|
613
|
-
>
|
|
614
|
-
{member.taskCount} {member.taskCount === 1 ? 'task' : 'tasks'}
|
|
615
|
-
</Badge>
|
|
616
610
|
{totalTasks > 0 && (
|
|
617
|
-
|
|
618
|
-
<
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
/>
|
|
622
|
-
</div>
|
|
623
|
-
)}
|
|
624
|
-
{/* NOTE: lead context bar disabled — usage formula is inaccurate */}
|
|
625
|
-
</div>
|
|
626
|
-
)}
|
|
627
|
-
{!isRemoved && (
|
|
628
|
-
<div className="flex shrink-0 items-center gap-0.5">
|
|
629
|
-
<Tooltip>
|
|
630
|
-
<TooltipTrigger asChild>
|
|
631
|
-
<button
|
|
632
|
-
type="button"
|
|
633
|
-
className="rounded p-1 text-[var(--color-text-muted)] transition-colors hover:bg-[var(--color-surface)] hover:text-[var(--color-text)]"
|
|
634
|
-
onClick={(e) => {
|
|
635
|
-
e.stopPropagation();
|
|
636
|
-
onSendMessage?.();
|
|
637
|
-
}}
|
|
638
|
-
>
|
|
639
|
-
<MessageSquare size={13} />
|
|
640
|
-
</button>
|
|
641
|
-
</TooltipTrigger>
|
|
642
|
-
<TooltipContent side="bottom">发送消息</TooltipContent>
|
|
643
|
-
</Tooltip>
|
|
644
|
-
<Tooltip>
|
|
645
|
-
<TooltipTrigger asChild>
|
|
646
|
-
<button
|
|
647
|
-
type="button"
|
|
648
|
-
className="rounded p-1 text-[var(--color-text-muted)] transition-colors hover:bg-[var(--color-surface)] hover:text-[var(--color-text)]"
|
|
649
|
-
onClick={(e) => {
|
|
650
|
-
e.stopPropagation();
|
|
651
|
-
onAssignTask?.();
|
|
652
|
-
}}
|
|
611
|
+
<>
|
|
612
|
+
<Badge
|
|
613
|
+
variant="secondary"
|
|
614
|
+
className="shrink-0 px-1.5 py-0.5 text-[10px] font-normal leading-none"
|
|
653
615
|
>
|
|
654
|
-
|
|
655
|
-
</
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
616
|
+
{completed}/{totalTasks}
|
|
617
|
+
</Badge>
|
|
618
|
+
<div className="mx-0.5 mt-0.5 h-[2px] rounded-full bg-[var(--color-border)]">
|
|
619
|
+
<div
|
|
620
|
+
className="h-full rounded-full bg-emerald-500 transition-all duration-500"
|
|
621
|
+
style={{ width: `${progressPercent}%` }}
|
|
622
|
+
/>
|
|
623
|
+
</div>
|
|
624
|
+
</>
|
|
625
|
+
)}
|
|
659
626
|
</div>
|
|
660
627
|
)}
|
|
661
628
|
</div>
|