diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index a3567a4e1..6227f3722 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -1,4 +1,15 @@ -import { createEffect, createMemo, createSignal, For, Match, Show, Switch, type Component } from "solid-js" +import { + createContext, + createEffect, + createMemo, + createSignal, + For, + Match, + Show, + Switch, + useContext, + type Component, +} from "solid-js" import { Dynamic } from "solid-js/web" import path from "path" import { useRouteData } from "@tui/context/route" @@ -37,6 +48,16 @@ import { DialogConfirm } from "@tui/ui/dialog-confirm" import { DialogTimeline } from "./dialog-timeline" import { Sidebar } from "./sidebar" +const context = createContext<{ + width: number +}>() + +function use() { + const ctx = useContext(context) + if (!ctx) throw new Error("useContext must be used within a Session component") + return ctx +} + export function Session() { const route = useRouteData("session") const sync = useSync() @@ -45,8 +66,10 @@ export function Session() { const permissions = createMemo(() => sync.data.permission[route.sessionID] ?? []) const dimensions = useTerminalDimensions() const [sidebar, setSidebar] = createSignal<"show" | "hide" | "auto">("auto") + const wide = createMemo(() => dimensions().width > 120) const sidebarVisible = createMemo(() => sidebar() === "show" || (sidebar() === "auto" && wide())) + const contentWidth = createMemo(() => dimensions().width - (sidebarVisible() ? 42 : 0) - 4) createEffect(() => sync.session.sync(route.sessionID)) @@ -284,123 +307,131 @@ export function Session() { const dialog = useDialog() return ( - - - - -
- - (scroll = r)} - scrollbarOptions={{ visible: false }} - stickyScroll={true} - stickyStart="bottom" - flexGrow={1} - > - - {(message, index) => ( - - - {(function () { - const command = useCommandDialog() - const [hover, setHover] = createSignal(false) - const dialog = useDialog() + + + + + +
+ + (scroll = r)} + scrollbarOptions={{ visible: false }} + stickyScroll={true} + stickyStart="bottom" + flexGrow={1} + > + + {(message, index) => ( + + + {(function () { + const command = useCommandDialog() + const [hover, setHover] = createSignal(false) + const dialog = useDialog() - const handleUnrevert = async () => { - const confirmed = await DialogConfirm.show( - dialog, - "Confirm Redo", - "Are you sure you want to restore the reverted messages?", - ) - if (confirmed) { - command.trigger("session.redo") + const handleUnrevert = async () => { + const confirmed = await DialogConfirm.show( + dialog, + "Confirm Redo", + "Are you sure you want to restore the reverted messages?", + ) + if (confirmed) { + command.trigger("session.redo") + } } - } - return ( - setHover(true)} - onMouseOut={() => setHover(false)} - onMouseUp={handleUnrevert} - marginTop={1} - flexShrink={0} - border={["left"]} - customBorderChars={SplitBorder.customBorderChars} - borderColor={Theme.backgroundPanel} - > + return ( setHover(true)} + onMouseOut={() => setHover(false)} + onMouseUp={handleUnrevert} + marginTop={1} + flexShrink={0} + border={["left"]} + customBorderChars={SplitBorder.customBorderChars} + borderColor={Theme.backgroundPanel} > - {revert()!.reverted.length} message reverted - - {keybind.print("messages_redo")} or /redo to - restore - - - - - {(file) => ( - - {file.filename} - 0}> - +{file.additions} - - 0}> - -{file.deletions} - - - )} - - - + + {revert()!.reverted.length} message reverted + + {keybind.print("messages_redo")} or /redo to + restore + + + + + {(file) => ( + + {file.filename} + 0}> + +{file.additions} + + 0}> + -{file.deletions} + + + )} + + + + - - ) - })()} - - = revert()!.messageID}> - <> - - - - dialog.replace(() => ) - } - message={message as UserMessage} - parts={sync.data.part[message.id] ?? []} - /> - - - - - - )} - - - - (prompt = r)} - disabled={permissions().length > 0} - onSubmit={() => { - toBottom() - }} - sessionID={route.sessionID} - /> - + ) + })()} + + = revert()!.messageID}> + <> + + + + dialog.replace(() => ) + } + message={message as UserMessage} + parts={sync.data.part[message.id] ?? []} + /> + + + + + + )} + + + + (prompt = r)} + disabled={permissions().length > 0} + onSubmit={() => { + toBottom() + }} + sessionID={route.sessionID} + /> + + + + + - - - - + ) } @@ -867,6 +898,10 @@ ToolRegistry.register({ name: "edit", container: "block", render(props) { + const ctx = use() + + const style = createMemo(() => (ctx.width > 120 ? "split" : "stacked")) + const diff = createMemo(() => { const diff = props.metadata.diff ?? props.permission["diff"] if (!diff) return null @@ -942,7 +977,7 @@ ToolRegistry.register({ {props.permission["diff"]?.trim()} - + @@ -954,7 +989,7 @@ ToolRegistry.register({ - +