diff --git a/web/src/App.tsx b/web/src/App.tsx
index 67a7e73..91ef78e 100644
--- a/web/src/App.tsx
+++ b/web/src/App.tsx
@@ -474,6 +474,13 @@ function App() {
return result
}, [messages])
+ // 视图标识:用于 MessageList 保存/恢复每个视图的滚动位置
+ const viewKey = useMemo(() => {
+ if (schedulerView) return `scheduler:${schedulerView.jobId}`
+ if (subAgentView) return `subagent:${subAgentView.taskId}`
+ return 'main'
+ }, [schedulerView, subAgentView])
+
return (
{/* Header */}
@@ -686,6 +693,7 @@ function App() {
onNavigateToSubAgent={handleNavigateToSubAgent}
onStop={handleStopExecution}
showThinking={showThinking}
+ viewKey={viewKey}
todoPanel={
-
+
{todoPanel}
void
showThinking?: boolean
+ /** 视图标识,用于保存/恢复滚动位置。不同视图间切换时保持各自的滚动位置。 */
+ viewKey?: string
}
-export function MessageList({ messages, onNavigateToSubAgent, showThinking = true }: MessageListProps) {
+export function MessageList({ messages, onNavigateToSubAgent, showThinking = true, viewKey }: MessageListProps) {
const bottomRef = useRef(null)
const containerRef = useRef(null)
const isAtBottomRef = useRef(true)
const prevShowBottomRef = useRef(false)
const prevShowTopRef = useRef(false)
+ const prevViewKeyRef = useRef(viewKey)
+ const viewKeyRef = useRef(viewKey)
+ viewKeyRef.current = viewKey
+
+ // Per-view scroll position memory
+ const scrollPositionsRef = useRef