diff --git a/src/App.tsx b/src/App.tsx
index 9bb3327..654f5f8 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -15,7 +15,8 @@ import PromptLibraryPage from './pages/PromptLibraryPage';
import StatsPage from './pages/StatsPage';
import ProfilePage from './pages/ProfilePage';
import PricingPage from './pages/PricingPage';
-import SharedSessionPage from './pages/SharedSessionPage';
+import SharedSessionPage from './pages/SharedSessionPage';
+import ChatPagePure from './pages/chat/ChatPagePure';
import WorkflowsPage from './pages/WorkflowsPage';
import KnowledgeBasePage from './pages/KnowledgeBase';
import { useAuth } from './store/auth';
@@ -83,6 +84,12 @@ export default function App() {
} />
} />
+ ) : location.pathname.startsWith('/pure-chat') ? (
+
+ {/* 纯会话页:无全局 Sidebar,无 AgentSidebar,仅保留聊天主区域 */}
+ } />
+ } />
+
) : (
{/* 只有编辑器全屏显示,其他页面均保留侧边栏 */}
diff --git a/src/pages/chat/ChatPagePure.tsx b/src/pages/chat/ChatPagePure.tsx
new file mode 100644
index 0000000..af58cee
--- /dev/null
+++ b/src/pages/chat/ChatPagePure.tsx
@@ -0,0 +1,179 @@
+import { useEffect, useState, useCallback, useRef } from 'react';
+import { App as AntApp, Empty } from 'antd';
+import type { ChatPageLogicOutput } from './ChatPageLogic';
+import { markdownToPlainText } from './utils/copy';
+import { useChatPageLogic } from './ChatPageLogic';
+import ChatBody from './components/ChatBody';
+import ChatDrawers from './components/ChatDrawers';
+import ChatHeader from './components/ChatHeader';
+import ChatInput from './components/ChatInput';
+import ChatOutline from './components/ChatOutline';
+import type { ModelOverrides } from '../../api';
+import './styles/chat-page-pure.css';
+
+/**
+ * 纯会话页面组件
+ * 仅保留聊天主区域(section.chat-main),去掉全局 Sidebar 和 AgentSidebar(chat-side)
+ * 会话功能与原聊天页面完全一致
+ */
+export default function ChatPagePure() {
+ const logic = useChatPageLogic();
+ const { message } = AntApp.useApp();
+ const [outlineCollapsed, setOutlineCollapsed] = useState(true);
+ const isAutoScrolling = useRef(false);
+
+ const {
+ id,
+ roomId,
+ highlightId,
+ historyDrawerOpen,
+ mcpDrawerOpen,
+ paramsDrawerOpen,
+ tplDrawerOpen,
+ agent,
+ agentList,
+ messages,
+ branches,
+ bodyRef,
+ sender,
+ navigate,
+ overrides,
+ setOverrides,
+ setRoomId,
+ setHighlightId,
+ setHistoryDrawerOpen,
+ setMcpDrawerOpen,
+ setParamsDrawerOpen,
+ setTplDrawerOpen,
+ handleNewSession,
+ } = logic;
+
+ // 初始化时,如果有历史消息,激活最后一条 Agent 消息
+ useEffect(() => {
+ if (messages.length > 0 && !highlightId) {
+ const agentMsgs = messages.filter(m => m.role === 'assistant' || m.role === 'agent' || m.speaker?.type === 'agent');
+ if (agentMsgs.length > 0) {
+ setHighlightId(agentMsgs[agentMsgs.length - 1].id);
+ }
+ }
+ }, [messages.length]);
+
+ const handleJump = useCallback((msgId: string) => {
+ isAutoScrolling.current = true;
+ setHighlightId(msgId);
+ const el = document.getElementById('msg-' + msgId);
+ if (el) {
+ el.scrollIntoView({ block: 'start', behavior: 'smooth' });
+ setTimeout(() => {
+ isAutoScrolling.current = false;
+ }, 800);
+ }
+ }, [setHighlightId]);
+
+ return (
+
+
+ {!agent ? (
+
+
+
+ ) : (
+
+
+ setHistoryDrawerOpen(true)}
+ onOpenParams={() => setParamsDrawerOpen(true)}
+ onOpenMcp={() => setMcpDrawerOpen(true)}
+ onManageAgent={() => navigate(`/agents/${id}`)}
+ onClear={sender.handleClear}
+ />
+
+ {
+ const content = mode === 'markdown' ? text : markdownToPlainText(text);
+ navigator.clipboard?.writeText(content).then(() => {
+ message.success(mode === 'markdown' ? '已复制(Markdown)' : '已复制(纯文本)');
+ });
+ }}
+ />
+
+ setTplDrawerOpen(true)}
+ modelOptions={sender.modelOptions}
+ activeModelValue={sender.activeModelValue}
+ onChangeModel={(modelId) => {
+ const picked = sender.modelOptions.find((o) => o.value === modelId);
+ setOverrides((o: ModelOverrides) => ({
+ ...o,
+ model_id: modelId,
+ model: picked?.label ?? o.model
+ }));
+ }}
+ agentList={agentList}
+ onInsertMention={() => {}}
+ onOpenHistory={() => setHistoryDrawerOpen(true)}
+ onNewSession={handleNewSession}
+ />
+
+
+
setOutlineCollapsed(!outlineCollapsed)}
+ onJump={handleJump}
+ />
+
+ )}
+
+
+
sender.setInput(updater)}
+ overrides={overrides}
+ setOverrides={setOverrides}
+ roomId={roomId}
+ setRoomId={setRoomId}
+ setHighlightId={setHighlightId}
+ sessionRefresh={sender.sessionRefresh}
+ mcpDrawerOpen={mcpDrawerOpen}
+ setMcpDrawerOpen={setMcpDrawerOpen}
+ tplDrawerOpen={tplDrawerOpen}
+ setTplDrawerOpen={setTplDrawerOpen}
+ paramsDrawerOpen={paramsDrawerOpen}
+ setParamsDrawerOpen={setParamsDrawerOpen}
+ historyDrawerOpen={historyDrawerOpen}
+ setHistoryDrawerOpen={setHistoryDrawerOpen}
+ notify={{ success: (t) => message.success(t) }}
+ />
+
+ );
+}
diff --git a/src/pages/chat/styles/chat-page-pure.css b/src/pages/chat/styles/chat-page-pure.css
new file mode 100644
index 0000000..b2d2cd9
--- /dev/null
+++ b/src/pages/chat/styles/chat-page-pure.css
@@ -0,0 +1,16 @@
+/* 纯会话页面样式 - 无侧边栏,仅保留聊天主区域 */
+
+.chat-pure-shell {
+ width: 100%;
+ height: 100vh;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+}
+
+.chat-pure-shell .chat-main {
+ flex: 1;
+ height: 100vh;
+ overflow: hidden;
+ min-width: 0;
+}