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 && (