summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-12-18 12:03:21 -0600
committerAdam <[email protected]>2025-12-18 12:03:21 -0600
commita6dd35d73d839d5bb368b1c7d10fb2445fec3e75 (patch)
treef3e0c310de40d20623b57228f279a3075a124d61
parentfaeaafa5f5022f03415bdce81ea8374219c00988 (diff)
downloadopencode-a6dd35d73d839d5bb368b1c7d10fb2445fec3e75.tar.gz
opencode-a6dd35d73d839d5bb368b1c7d10fb2445fec3e75.zip
fix(desktop): submit prompt
-rw-r--r--packages/ui/src/components/session-turn.tsx87
1 files changed, 45 insertions, 42 deletions
diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx
index 3f4c30fe3..fc3e18343 100644
--- a/packages/ui/src/components/session-turn.tsx
+++ b/packages/ui/src/components/session-turn.tsx
@@ -70,6 +70,7 @@ export function SessionTurn(
)
const summary = createMemo(() => message().summary?.body)
const response = createMemo(() => lastTextPart()?.text)
+ const hasSteps = createMemo(() => assistantParts()?.some((p) => p?.type === "tool"))
const currentTask = createMemo(
() =>
@@ -315,7 +316,7 @@ export function SessionTurn(
<Typewriter as="h1" text={message().summary?.title} data-slot="session-turn-typewriter" />
</Match>
<Match when={true}>
- <h1>{message().summary?.title ?? "New message"}</h1>
+ <h1>{message().summary?.title}</h1>
</Match>
</Switch>
</div>
@@ -326,47 +327,49 @@ export function SessionTurn(
<Message message={message()} parts={parts()} />
</div>
{/* Trigger (sticky) */}
- <div ref={(el) => setStore("stickyTriggerRef", el)} data-slot="session-turn-response-trigger">
- <Button
- data-expandable={assistantMessages().length > 0}
- data-slot="session-turn-collapsible-trigger-content"
- variant="ghost"
- size="small"
- onClick={() => {
- if (assistantMessages().length === 0) return
- const next = !store.stepsExpanded
- setStore("stepsExpanded", next)
- props.onStepsExpandedChange?.(next)
- }}
- >
- <Show when={working()}>
- <Spinner />
- </Show>
- <Switch>
- <Match when={retry()}>
- <span data-slot="session-turn-retry-message">
- {(() => {
- const r = retry()
- if (!r) return ""
- return r.message.length > 60 ? r.message.slice(0, 60) + "..." : r.message
- })()}
- </span>
- <span data-slot="session-turn-retry-seconds">
- · retrying {store.retrySeconds > 0 ? `in ${store.retrySeconds}s ` : ""}
- </span>
- <span data-slot="session-turn-retry-attempt">(#{retry()?.attempt})</span>
- </Match>
- <Match when={working()}>{store.status ?? "Considering next steps"}</Match>
- <Match when={store.stepsExpanded}>Hide steps</Match>
- <Match when={!store.stepsExpanded}>Show steps</Match>
- </Switch>
- <span>·</span>
- <span>{store.duration}</span>
- <Show when={assistantMessages().length > 0}>
- <Icon name="chevron-grabber-vertical" size="small" />
- </Show>
- </Button>
- </div>
+ <Show when={working() || hasSteps()}>
+ <div ref={(el) => setStore("stickyTriggerRef", el)} data-slot="session-turn-response-trigger">
+ <Button
+ data-expandable={assistantMessages().length > 0}
+ data-slot="session-turn-collapsible-trigger-content"
+ variant="ghost"
+ size="small"
+ onClick={() => {
+ if (assistantMessages().length === 0) return
+ const next = !store.stepsExpanded
+ setStore("stepsExpanded", next)
+ props.onStepsExpandedChange?.(next)
+ }}
+ >
+ <Show when={working()}>
+ <Spinner />
+ </Show>
+ <Switch>
+ <Match when={retry()}>
+ <span data-slot="session-turn-retry-message">
+ {(() => {
+ const r = retry()
+ if (!r) return ""
+ return r.message.length > 60 ? r.message.slice(0, 60) + "..." : r.message
+ })()}
+ </span>
+ <span data-slot="session-turn-retry-seconds">
+ · retrying {store.retrySeconds > 0 ? `in ${store.retrySeconds}s ` : ""}
+ </span>
+ <span data-slot="session-turn-retry-attempt">(#{retry()?.attempt})</span>
+ </Match>
+ <Match when={working()}>{store.status ?? "Considering next steps"}</Match>
+ <Match when={store.stepsExpanded}>Hide steps</Match>
+ <Match when={!store.stepsExpanded}>Show steps</Match>
+ </Switch>
+ <span>·</span>
+ <span>{store.duration}</span>
+ <Show when={assistantMessages().length > 0}>
+ <Icon name="chevron-grabber-vertical" size="small" />
+ </Show>
+ </Button>
+ </div>
+ </Show>
{/* Response */}
<Show when={store.stepsExpanded && assistantMessages().length > 0}>
<div data-slot="session-turn-collapsible-content-inner">