@@ -1602,6 +1605,16 @@ ToolRegistry.register({
const i18n = useI18n()
const diffComponent = useDiffComponent()
const files = createMemo(() => (props.metadata.files ?? []) as ApplyPatchFile[])
+ const [expanded, setExpanded] = createSignal
([])
+ let seeded = false
+
+ createEffect(() => {
+ const list = files()
+ if (list.length === 0) return
+ if (seeded) return
+ seeded = true
+ setExpanded(list.filter((f) => f.type !== "delete").map((f) => f.filePath))
+ })
const subtitle = createMemo(() => {
const count = files().length
@@ -1613,60 +1626,89 @@ ToolRegistry.register({
0}>
-
+
setExpanded(Array.isArray(value) ? value : value ? [value] : [])}
+ >
- {(file) => (
-
-
-
-
-
- {i18n.t("ui.patch.action.deleted")}
-
-
-
-
- {i18n.t("ui.patch.action.created")}
-
-
-
-
- {i18n.t("ui.patch.action.moved")}
-
-
-
-
- {i18n.t("ui.patch.action.patched")}
-
-
-
- {file.relativePath}
-
-
-
-
- -{file.deletions}
-
-
-
-
-
-
-
-
- )}
+ {(file) => {
+ const active = createMemo(() => expanded().includes(file.filePath))
+ const [visible, setVisible] = createSignal(false)
+
+ createEffect(() => {
+ if (!active()) {
+ setVisible(false)
+ return
+ }
+
+ requestAnimationFrame(() => {
+ if (!active()) return
+ setVisible(true)
+ })
+ })
+
+ return (
+
+
+
+
+
{file.relativePath}
+
+
+
+
+ {i18n.t("ui.patch.action.deleted")}
+
+
+
+
+ {i18n.t("ui.patch.action.created")}
+
+
+
+
+ {i18n.t("ui.patch.action.moved")}
+
+
+
+
+
+
+
+ -{file.deletions}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+ }}
-
+
)
diff --git a/packages/ui/src/components/session-turn.css b/packages/ui/src/components/session-turn.css
index 5d58f0f71..e7da2b6f0 100644
--- a/packages/ui/src/components/session-turn.css
+++ b/packages/ui/src/components/session-turn.css
@@ -130,19 +130,13 @@
gap: 12px;
}
- [data-component="session-turn-diff"] {
- border: 1px solid var(--border-weaker-base);
- border-radius: var(--radius-md);
- overflow: clip;
- }
-
- [data-slot="session-turn-diff-header"] {
+ [data-slot="session-turn-diff-trigger"] {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
- padding: 6px 10px;
- border-bottom: 1px solid var(--border-weaker-base);
+ width: 100%;
+ min-width: 0;
}
[data-slot="session-turn-diff-path"] {
@@ -166,9 +160,36 @@
font-weight: var(--font-weight-medium);
}
+ [data-slot="session-turn-diff-meta"] {
+ flex-shrink: 0;
+ display: inline-flex;
+ align-items: center;
+ gap: 10px;
+ }
+
+ [data-slot="session-turn-diff-chevron"] {
+ display: inline-flex;
+ color: var(--icon-weaker);
+ transform: rotate(-90deg);
+ transition: transform 0.15s ease;
+ }
+
+ [data-slot="accordion-item"][data-expanded] [data-slot="session-turn-diff-chevron"] {
+ transform: rotate(0deg);
+ }
+
[data-slot="session-turn-diff-view"] {
background-color: var(--surface-inset-base);
width: 100%;
min-width: 0;
+ max-height: 420px;
+ overflow-y: auto;
+ overflow-x: hidden;
+ scrollbar-width: none;
+ -ms-overflow-style: none;
+ }
+
+ [data-slot="session-turn-diff-view"]::-webkit-scrollbar {
+ display: none;
}
}
diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx
index e4c0a2273..a418fddd9 100644
--- a/packages/ui/src/components/session-turn.tsx
+++ b/packages/ui/src/components/session-turn.tsx
@@ -4,12 +4,14 @@ import { useDiffComponent } from "../context/diff"
import { Binary } from "@opencode-ai/util/binary"
import { getDirectory, getFilename } from "@opencode-ai/util/path"
-import { createMemo, createSignal, For, ParentProps, Show } from "solid-js"
+import { createEffect, createMemo, createSignal, For, on, ParentProps, Show } from "solid-js"
import { Dynamic } from "solid-js/web"
import { AssistantParts, Message } from "./message-part"
import { Card } from "./card"
+import { Accordion } from "./accordion"
import { Collapsible } from "./collapsible"
import { DiffChanges } from "./diff-changes"
+import { Icon } from "./icon"
import { TextShimmer } from "./text-shimmer"
import { createAutoScroll } from "../hooks"
import { useI18n } from "../context/i18n"
@@ -175,6 +177,17 @@ export function SessionTurn(
})
const edited = createMemo(() => diffs().length)
const [open, setOpen] = createSignal(false)
+ const [expanded, setExpanded] = createSignal([])
+
+ createEffect(
+ on(
+ open,
+ (value, prev) => {
+ if (!value && prev) setExpanded([])
+ },
+ { defer: true },
+ ),
+ )
const assistantMessages = createMemo(
() => {
@@ -280,7 +293,7 @@ export function SessionTurn(
/>
-