summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-12-24 09:04:52 -0600
committerAdam <[email protected]>2025-12-24 09:07:31 -0600
commit09a399d8d68e188d31b3914e31bb376709a527ba (patch)
tree58427ff64db8c7d0110a5a721149b2af499c846d
parentb75575884af2cee6effc4cb7fc632215d60c25e2 (diff)
downloadopencode-09a399d8d68e188d31b3914e31bb376709a527ba.tar.gz
opencode-09a399d8d68e188d31b3914e31bb376709a527ba.zip
fix(desktop): summary flicker
-rw-r--r--packages/ui/src/components/session-turn.tsx44
1 files changed, 42 insertions, 2 deletions
diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx
index e49e70864..e5dfd0f1a 100644
--- a/packages/ui/src/components/session-turn.tsx
+++ b/packages/ui/src/components/session-turn.tsx
@@ -246,6 +246,7 @@ export function SessionTurn(
retrySeconds: 0,
status: rawStatus(),
duration: duration(),
+ summaryWaitTimedOut: false,
})
createEffect(() => {
@@ -286,6 +287,44 @@ export function SessionTurn(
onCleanup(() => clearInterval(timer))
})
+ // Reset summary wait timeout when session starts working
+ createEffect(() => {
+ if (working()) {
+ setStore("summaryWaitTimedOut", false)
+ }
+ })
+
+ // Set timeout when waiting for summary body (only when diffs are present)
+ createEffect(() => {
+ if (working() || !derived().isLastUserMessage) return
+
+ const diffs = message()?.summary?.diffs
+ if (!diffs?.length) return
+ if (summary()) return
+ if (store.summaryWaitTimedOut) return
+
+ const timer = setTimeout(() => {
+ setStore("summaryWaitTimedOut", true)
+ }, 6000)
+ onCleanup(() => clearTimeout(timer))
+ })
+
+ const waitingForSummary = createMemo(() => {
+ if (!derived().isLastUserMessage) return false
+ if (working()) return false
+
+ const diffs = message()?.summary?.diffs
+ if (!diffs?.length) return false
+ if (summary()) return false
+
+ return !store.summaryWaitTimedOut
+ })
+
+ const showSummarySection = createMemo(() => {
+ if (working()) return false
+ return !waitingForSummary()
+ })
+
let lastStatusChange = Date.now()
let statusTimeout: number | undefined
createEffect(() => {
@@ -362,7 +401,7 @@ export function SessionTurn(
size="small"
onClick={props.onStepsExpandedToggle ?? (() => {})}
>
- <Show when={working()}>
+ <Show when={working() || waitingForSummary()}>
<Spinner />
</Show>
<Switch>
@@ -379,6 +418,7 @@ export function SessionTurn(
</span>
<span data-slot="session-turn-retry-attempt">(#{retry()?.attempt})</span>
</Match>
+ <Match when={waitingForSummary()}>Generating summary</Match>
<Match when={working()}>{store.status ?? "Considering next steps"}</Match>
<Match when={props.stepsExpanded}>Hide steps</Match>
<Match when={!props.stepsExpanded}>Show steps</Match>
@@ -425,7 +465,7 @@ export function SessionTurn(
</div>
</Show>
{/* Summary */}
- <Show when={!working()}>
+ <Show when={showSummarySection()}>
<div data-slot="session-turn-summary-section">
<div data-slot="session-turn-summary-header">
<Switch>