From 01d38ae0c713df36716a13ae4f29f0c8ee0b2526 Mon Sep 17 00:00:00 2001 From: H-TTTTT Date: Sat, 11 Jul 2026 00:36:58 +0800 Subject: [PATCH] refactor(tui): remove dead session renderer --- packages/tui/src/routes/session/index.tsx | 173 +--------------------- 1 file changed, 4 insertions(+), 169 deletions(-) diff --git a/packages/tui/src/routes/session/index.tsx b/packages/tui/src/routes/session/index.tsx index 9f71e3e943b2..a1d1669fc9fa 100644 --- a/packages/tui/src/routes/session/index.tsx +++ b/packages/tui/src/routes/session/index.tsx @@ -8,7 +8,6 @@ import { Match, on, onCleanup, - onMount, Show, Switch, useContext, @@ -21,10 +20,10 @@ import { createStore } from "solid-js/store" import { useProject } from "../../context/project" import { useData } from "../../context/data" import { SplitBorder } from "../../ui/border" -import { useTuiPaths, useTuiTerminalEnvironment } from "../../context/runtime" +import { useTuiTerminalEnvironment } from "../../context/runtime" import { Spinner, SPINNER_FRAMES } from "../../component/spinner" import { createSyntaxStyleMemo, generateSubtleSyntax, useTheme } from "../../context/theme" -import { BoxRenderable, ScrollBoxRenderable, addDefaultParsers, TextAttributes, RGBA } from "@opentui/core" +import { ScrollBoxRenderable, addDefaultParsers, TextAttributes, RGBA } from "@opentui/core" import { Prompt, type PromptRef } from "../../component/prompt" import type { ModelInfo, @@ -42,7 +41,6 @@ import { webSearchProviderLabel } from "../../util/tool-display" import { useRenderer, useTerminalDimensions, type JSX } from "@opentui/solid" import { useSDK } from "../../context/sdk" import { useEditorContext } from "../../context/editor" -import { openEditor } from "../../editor" import { useDialog } from "../../ui/dialog" import { DialogSessionRename } from "../../component/dialog-session-rename" import { DialogMessage } from "./dialog-message" @@ -153,7 +151,6 @@ export function Session() { const { navigate } = useRoute() const data = useData() const project = useProject() - const paths = useTuiPaths() const tuiConfig = useTuiConfig() const kv = useKV() const { theme } = useTheme() @@ -196,16 +193,6 @@ export function Session() { }) const disabled = createMemo(() => permissions().length > 0 || forms().length > 0) - const pending = createMemo(() => { - const completed = messages().findLast((x) => x.type === "assistant" && x.time.completed)?.id - return messages().findLast((x) => x.type === "assistant" && !x.time.completed && (!completed || x.id > completed)) - ?.id - }) - - const lastAssistant = createMemo(() => { - return messages().findLast((x) => x.type === "assistant") - }) - const dimensions = useTerminalDimensions() const [sidebar, setSidebar] = kv.signal<"auto" | "hide">("sidebar", "auto") const [sidebarOpen, setSidebarOpen] = createSignal(false) @@ -314,7 +301,7 @@ export function Session() { const messagesList = messages() const scrollTop = scroll.y - // Get visible messages sorted by position, filtering for valid non-synthetic, non-ignored content + // Find rendered V2 message boundaries that contain visible user or assistant text. const visibleMessages = children .filter((c) => { if (!c.id) return false @@ -653,7 +640,7 @@ export function Session() { const messages = sessionMessages() if (!messages || !messages.length) return - // Find the most recent user message with non-ignored, non-synthetic text parts + // Find the most recent rendered V2 user message with visible text. for (let i = messages.length - 1; i >= 0; i--) { const message = messages[i] if (!message || message.type !== "user" || !message.text.trim()) continue @@ -1562,122 +1549,6 @@ function UserMessage(props: { message: SessionMessageUser }) { ) } -function AssistantMessage(props: { message: SessionMessageAssistant; last: boolean }) { - const ctx = use() - const local = useLocal() - const { theme } = useTheme() - const model = createMemo( - () => - ctx - .models() - .find((model) => model.providerID === props.message.model.providerID && model.id === props.message.model.id) - ?.name ?? `${props.message.model.providerID}/${props.message.model.id}`, - ) - - const final = createMemo(() => { - return props.message.finish && !["tool-calls", "unknown"].includes(props.message.finish) - }) - - const duration = createMemo(() => { - if (!final()) return 0 - if (!props.message.time.completed) return 0 - return props.message.time.completed - props.message.time.created - }) - - const exploration = createMemo(() => { - const grouped = new Map() - if (!ctx.groupExploration()) return grouped - const runs = props.message.content - .map((part) => - part.type === "tool" && - ["read", "glob", "grep"].includes(toolDisplay(part.name)) && - part.state.status !== "streaming" - ? part - : undefined, - ) - .reduce( - (runs, part) => { - if (part) runs[runs.length - 1].push(part) - if (!part && runs[runs.length - 1].length) runs.push([]) - return runs - }, - [[]], - ) - .filter((run) => run.length > 0) - for (const run of runs) { - const summary = { - parts: run, - active: false, - } - run.forEach((part, index) => grouped.set(part.id, { ...summary, first: index === 0 })) - } - return grouped - }) - - return ( - <> - - {(content, index) => ( - - - - - - - - - - } - > - {(summary) => } - - - - - )} - - - - {errorMessage(props.message.error)} - - - - - - - - - {Locale.titlecase(props.message.agent)} - - · {model()} - - · {Locale.duration(duration())} - - - - - - - ) -} - function AssistantRetry(props: { retry: SessionMessageAssistant["retry"] }) { const { theme } = useTheme() return ( @@ -1693,40 +1564,6 @@ function AssistantRetry(props: { retry: SessionMessageAssistant["retry"] }) { ) } -function ExplorationSummary(props: { parts: SessionMessageAssistantTool[]; active: boolean }) { - const { theme } = useTheme() - const pathFormatter = usePathFormatter() - const label = (part: SessionMessageAssistantTool) => { - const input = typeof part.state.input === "string" ? {} : part.state.input - const tool = toolDisplay(part.name) - if (tool === "read") return `Read ${pathFormatter.format(stringValue(input.path))}` - if (tool === "glob") return `Glob "${stringValue(input.pattern)}"` - return `Grep "${stringValue(input.pattern)}"` - } - return ( - - - {props.active ? "Exploring" : "Explored"} - - - {(part, index) => ( - - - {index() === props.parts.length - 1 ? "└" : "├"} {label(part)} - - - )} - - - ) -} - const INLINE_TOOL_ICON_WIDTH = 2 function ReasoningPart(props: { @@ -1856,8 +1693,6 @@ function TextPart(props: { last: boolean; part: SessionMessageAssistantText }) { ) } -// Pending messages moved to individual tool pending functions - function ToolPart(props: { part: SessionMessageAssistantTool }) { const ctx = use() const data = useData()