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({
-
+