diff --git a/frontend-web/src/components/page-sidebar.tsx b/frontend-web/src/components/page-sidebar.tsx index a00206e9..306dc883 100644 --- a/frontend-web/src/components/page-sidebar.tsx +++ b/frontend-web/src/components/page-sidebar.tsx @@ -2,7 +2,6 @@ import { useEffect, useState } from "react"; import type { ElementType } from "react"; import { useNavigate, useLocation } from "react-router-dom"; import { - BarChart3, Bell, Bot, Brain, @@ -11,7 +10,6 @@ import { ChevronRight, ChevronsUpDown, CircleHelp, - Compass, Database, FileBox, FileText, @@ -27,15 +25,11 @@ import { ListTodo, MessageSquareCode, MessageSquarePlus, - MoreHorizontal, Network, Plus, - Scale, Settings, Sparkles, - Tags, Target, - TrendingUp, User, Users, Wrench, @@ -200,97 +194,14 @@ const menuItems: MenuItem[] = [ }, ], }, - { - id: "result-management", - label: "结果管理", - icon: BarChart3, - children: [ - { - id: "result-planning", - label: "规划结果", - icon: Target, - children: [ - { id: "result-planning-all", label: "全部", icon: BarChart3 }, - { id: "result-planning-goal", label: "目标分析", icon: Target }, - { id: "result-planning-brand", label: "品牌策略", icon: Target }, - { id: "result-planning-content", label: "内容规划", icon: Target }, - { id: "result-planning-channel", label: "渠道规划", icon: Target }, - { id: "result-planning-narrative", label: "叙事策略", icon: Target }, - ], - }, - { - id: "result-mnty", - label: "MNTY结果", - icon: Brain, - children: [ - { id: "result-mnty-all", label: "全部", icon: BarChart3 }, - { id: "result-mnty-mechanism", label: "机制研究", icon: Brain }, - { id: "result-mnty-plan", label: "规划设计", icon: Brain }, - { id: "result-mnty-zsty", label: "ZSTY分析", icon: Brain }, - ], - }, - { - id: "result-effect-pg", - label: "效果PG结果", - icon: TrendingUp, - children: [ - { id: "result-effect-pg-all", label: "全部", icon: BarChart3 }, - { id: "result-effect-pg-behavior", label: "行为PG", icon: TrendingUp }, - { id: "result-effect-pg-evaluation", label: "效果复盘", icon: TrendingUp }, - { id: "result-effect-pg-info", label: "信息PG", icon: TrendingUp }, - { id: "result-effect-pg-account", label: "账号PG", icon: TrendingUp }, - ], - }, - { - id: "result-xk", - label: "XK结果", - icon: Compass, - children: [ - { id: "result-xk-all", label: "全部", icon: BarChart3 }, - { id: "result-xk-jc", label: "任务JC", icon: Compass }, - { id: "result-xk-dispatch", label: "任务调度", icon: Compass }, - ], - }, - { - id: "result-dq", - label: "DQ结果", - icon: Database, - children: [ - { id: "result-dq-all", label: "全部", icon: BarChart3 }, - { id: "result-dq-audience", label: "受众分析", icon: Database }, - { id: "result-dq-kb", label: "知识研究", icon: Database }, - { id: "result-dq-trend", label: "趋势研究", icon: Database }, - ], - }, - { - id: "result-other", - label: "其他结果", - icon: MoreHorizontal, - children: [ - { id: "result-other-all", label: "全部", icon: BarChart3 }, - { id: "result-other-general", label: "通用分析", icon: MoreHorizontal }, - { id: "result-other-temp", label: "临时任务", icon: MoreHorizontal }, - { id: "result-other-other", label: "其他", icon: MoreHorizontal }, - ], - }, - ], - }, { id: "resource-management", label: "资源管理", icon: Database, children: [ - { - id: "resource-tags", - label: "标签管理", - icon: Tags, - path: "/page/strategy/admin/tags", - adminOnly: true, - }, - { id: "resource-zz", label: "ZZ资源", icon: FileBox }, - { id: "resource-network-actor", label: "网络达人", icon: Network }, - { id: "resource-knowledge-base", label: "知识库", icon: Library }, - { id: "resource-evaluation-index", label: "评估指标", icon: Scale }, + { id: "resource-network-xwt", label: "网络xwt资源管理", icon: Network }, + { id: "resource-knowledge-base", label: "知识库资源管理", icon: Library }, + { id: "resource-zz", label: "ZZ资源管理", icon: FileBox }, ], }, ]; @@ -299,8 +210,6 @@ const defaultExpandedIds = new Set([ "qa-center", "task-management", "xk-center-task", - "result-management", - "result-planning", ]); function filterMenuItemsByRole(items: MenuItem[], isAdmin: boolean): MenuItem[] { @@ -490,15 +399,8 @@ export function PageSidebar({ isDark ? "text-white" : "text-gray-900" }`} > - DeerFlow + CM助手 -

- Page Navigation -

)} diff --git a/frontend-web/src/open-canvas/components/ai-writing/AIWritingPanel.tsx b/frontend-web/src/open-canvas/components/ai-writing/AIWritingPanel.tsx index b5cdfaf1..8c488573 100644 --- a/frontend-web/src/open-canvas/components/ai-writing/AIWritingPanel.tsx +++ b/frontend-web/src/open-canvas/components/ai-writing/AIWritingPanel.tsx @@ -17,6 +17,24 @@ import { useCanvasGraphContext } from '../../contexts/CanvasGraphContext'; import { useAIWriting } from '../../hooks/useAIWritingStream'; import { useAIWritingSessions } from '../../hooks/useAIWritingSessions'; import { adminCleanupAIWritingSessions } from '../../api/ai-writing-sessions'; + +/** + * 暂停 / 继续功能开关(默认 false = 关)。 + * + * 历史背景:legacy 路径下,为了让用户点"停止"后还能"继续",引入了 per-worker + * 内存 dict(``_event_queues`` / ``_session_pending_pause``)。多 worker 部署下 + * 这些 dict 互相看不见 → SSE 重连失败 / "会话丢失" → 触发了整个 ai-writing-优化.md + * 的迁移计划。 + * + * 当前 LangGraph Server 路径下架构已无 per-worker 状态,但 ``stream.stop()`` 仅 + * 取消客户端 SSE 订阅,**不会真正暂停后端 run**(LLM 继续烧 token);``resume`` + * 也无法重新订阅同一个 run。这是个产品语义没想清楚的功能,先关掉。 + * + * 后期想清楚怎么做"真·暂停"(``client.runs.cancel(run_id, action='interrupt')`` + * 保留 checkpoint)+ "真·继续"(``client.runs.joinStream`` 续上原 run)时, + * 把这个 flag 翻成 true 即可,UI / hook 全套代码都已就位。 + */ +const ENABLE_PAUSE_RESUME_UI = false; import { AIWritingForm } from './AIWritingForm'; import { AIWritingTimeline } from './AIWritingTimeline'; import { InterventionCard } from './InterventionCard'; @@ -269,7 +287,9 @@ export function AIWritingPanel() { 新建 )} - {isRunning && !state.isPaused && ( + {/* ⏸️/▶️ "停止 / 继续" 由 ENABLE_PAUSE_RESUME_UI 控制(默认 false 隐藏)。 + 后期把 flag 翻成 true 即可恢复,UI / hook 全套代码都已就位。 */} + {ENABLE_PAUSE_RESUME_UI && isRunning && !state.isPaused && (