summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-05 14:42:56 -0600
committerGitHub <[email protected]>2026-02-05 14:42:56 -0600
commitd7c2d5db3bc261764b415f0e6c50f1d5908a99a6 (patch)
treedb9e325f714af673655fe4de342e437eeb92c196 /packages/ui/src
parent1dd88aeae64fd52ed35d082b42fd7aa2c25975ca (diff)
downloadopencode-d7c2d5db3bc261764b415f0e6c50f1d5908a99a6.tar.gz
opencode-d7c2d5db3bc261764b415f0e6c50f1d5908a99a6.zip
fix(app): hide prompt input when there are perms or questions (#12339)
Diffstat (limited to 'packages/ui/src')
-rw-r--r--packages/ui/src/components/session-turn.tsx89
1 files changed, 23 insertions, 66 deletions
diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx
index 5c4678701..5ea9f64bb 100644
--- a/packages/ui/src/components/session-turn.tsx
+++ b/packages/ui/src/components/session-turn.tsx
@@ -10,7 +10,6 @@ import {
} from "@opencode-ai/sdk/v2/client"
import { useData } from "../context"
import { type UiI18nKey, type UiI18nParams, useI18n } from "../context/i18n"
-import { findLast } from "@opencode-ai/util/array"
import { Binary } from "@opencode-ai/util/binary"
import { createEffect, createMemo, createSignal, For, Match, on, onCleanup, ParentProps, Show, Switch } from "solid-js"
@@ -84,6 +83,7 @@ function AssistantMessageItem(props: {
responsePartId: string | undefined
hideResponsePart: boolean
hideReasoning: boolean
+ hidden?: () => readonly { messageID: string; callID: string }[]
}) {
const data = useData()
const emptyParts: PartType[] = []
@@ -104,13 +104,22 @@ function AssistantMessageItem(props: {
parts = parts.filter((part) => part?.type !== "reasoning")
}
- if (!props.hideResponsePart) return parts
+ if (props.hideResponsePart) {
+ const responsePartId = props.responsePartId
+ if (responsePartId && responsePartId === lastTextPart()?.id) {
+ parts = parts.filter((part) => part?.id !== responsePartId)
+ }
+ }
- const responsePartId = props.responsePartId
- if (!responsePartId) return parts
- if (responsePartId !== lastTextPart()?.id) return parts
+ const hidden = props.hidden?.() ?? []
+ if (hidden.length === 0) return parts
- return parts.filter((part) => part?.id !== responsePartId)
+ const id = props.message.id
+ return parts.filter((part) => {
+ if (part?.type !== "tool") return true
+ const tool = part as ToolPart
+ return !hidden.some((h) => h.messageID === id && h.callID === tool.callID)
+ })
})
return <Message message={props.message} parts={filteredParts()} />
@@ -140,7 +149,6 @@ export function SessionTurn(
const emptyFiles: FilePart[] = []
const emptyAssistant: AssistantMessage[] = []
const emptyPermissions: PermissionRequest[] = []
- const emptyPermissionParts: { part: ToolPart; message: AssistantMessage }[] = []
const emptyQuestions: QuestionRequest[] = []
const emptyQuestionParts: { part: ToolPart; message: AssistantMessage }[] = []
const idle = { type: "idle" as const }
@@ -253,48 +261,18 @@ export function SessionTurn(
})
const permissions = createMemo(() => data.store.permission?.[props.sessionID] ?? emptyPermissions)
- const permissionCount = createMemo(() => permissions().length)
const nextPermission = createMemo(() => permissions()[0])
- const permissionParts = createMemo(() => {
- if (props.stepsExpanded) return emptyPermissionParts
-
- const next = nextPermission()
- if (!next || !next.tool) return emptyPermissionParts
-
- const message = findLast(assistantMessages(), (m) => m.id === next.tool!.messageID)
- if (!message) return emptyPermissionParts
-
- const parts = data.store.part[message.id] ?? emptyParts
- for (const part of parts) {
- if (part?.type !== "tool") continue
- const tool = part as ToolPart
- if (tool.callID === next.tool?.callID) return [{ part: tool, message }]
- }
-
- return emptyPermissionParts
- })
-
const questions = createMemo(() => data.store.question?.[props.sessionID] ?? emptyQuestions)
const nextQuestion = createMemo(() => questions()[0])
- const questionParts = createMemo(() => {
- if (props.stepsExpanded) return emptyQuestionParts
-
- const next = nextQuestion()
- if (!next || !next.tool) return emptyQuestionParts
-
- const message = findLast(assistantMessages(), (m) => m.id === next.tool!.messageID)
- if (!message) return emptyQuestionParts
-
- const parts = data.store.part[message.id] ?? emptyParts
- for (const part of parts) {
- if (part?.type !== "tool") continue
- const tool = part as ToolPart
- if (tool.callID === next.tool?.callID) return [{ part: tool, message }]
- }
-
- return emptyQuestionParts
+ const hidden = createMemo(() => {
+ const out: { messageID: string; callID: string }[] = []
+ const perm = nextPermission()
+ if (perm?.tool) out.push(perm.tool)
+ const question = nextQuestion()
+ if (question?.tool) out.push(question.tool)
+ return out
})
const answeredQuestionParts = createMemo(() => {
@@ -499,14 +477,6 @@ export function SessionTurn(
onCleanup(() => clearInterval(timer))
})
- createEffect(
- on(permissionCount, (count, prev) => {
- if (!count) return
- if (prev !== undefined && count <= prev) return
- autoScroll.forceScrollToBottom()
- }),
- )
-
let lastStatusChange = Date.now()
let statusTimeout: number | undefined
createEffect(() => {
@@ -664,6 +634,7 @@ export function SessionTurn(
responsePartId={responsePartId()}
hideResponsePart={hideResponsePart()}
hideReasoning={!working()}
+ hidden={hidden}
/>
)}
</For>
@@ -674,20 +645,6 @@ export function SessionTurn(
</Show>
</div>
</Show>
- <Show when={!props.stepsExpanded && permissionParts().length > 0}>
- <div data-slot="session-turn-permission-parts">
- <For each={permissionParts()}>
- {({ part, message }) => <Part part={part} message={message} />}
- </For>
- </div>
- </Show>
- <Show when={!props.stepsExpanded && questionParts().length > 0}>
- <div data-slot="session-turn-question-parts">
- <For each={questionParts()}>
- {({ part, message }) => <Part part={part} message={message} />}
- </For>
- </div>
- </Show>
<Show when={!props.stepsExpanded && answeredQuestionParts().length > 0}>
<div data-slot="session-turn-answered-question-parts">
<For each={answeredQuestionParts()}>