import { For, Show, createEffect, createMemo, createSignal, on, onCleanup } from "solid-js" import type { QuestionRequest, Todo } from "@opencode-ai/sdk/v2" import { Button } from "@opencode-ai/ui/button" import { BasicTool } from "@opencode-ai/ui/basic-tool" import { PromptInput } from "@/components/prompt-input" import { QuestionDock } from "@/components/question-dock" import { SessionTodoDock } from "@/components/session-todo-dock" export function SessionPromptDock(props: { centered: boolean questionRequest: () => QuestionRequest | undefined permissionRequest: () => { patterns: string[]; permission: string } | undefined blocked: boolean todos: Todo[] promptReady: boolean handoffPrompt?: string t: (key: string, vars?: Record) => string responding: boolean onDecide: (response: "once" | "always" | "reject") => void inputRef: (el: HTMLDivElement) => void newSessionWorktree: string onNewSessionWorktreeReset: () => void onSubmit: () => void setPromptDockRef: (el: HTMLDivElement) => void }) { const done = createMemo( () => props.todos.length > 0 && props.todos.every((todo) => todo.status === "completed" || todo.status === "cancelled"), ) const [dock, setDock] = createSignal(props.todos.length > 0) const [closing, setClosing] = createSignal(false) const [opening, setOpening] = createSignal(false) let timer: number | undefined let raf: number | undefined const scheduleClose = () => { if (timer) window.clearTimeout(timer) timer = window.setTimeout(() => { setDock(false) setClosing(false) timer = undefined }, 400) } createEffect( on( () => [props.todos.length, done()] as const, ([count, complete], prev) => { if (raf) cancelAnimationFrame(raf) raf = undefined if (count === 0) { if (timer) window.clearTimeout(timer) timer = undefined setDock(false) setClosing(false) setOpening(false) return } if (!complete) { if (timer) window.clearTimeout(timer) timer = undefined const wasHidden = !dock() || closing() setDock(true) setClosing(false) if (wasHidden) { setOpening(true) raf = requestAnimationFrame(() => { setOpening(false) raf = undefined }) return } setOpening(false) return } if (prev && prev[1]) { if (closing() && !timer) scheduleClose() return } setDock(true) setOpening(false) setClosing(true) scheduleClose() }, ), ) onCleanup(() => { if (!timer) return window.clearTimeout(timer) }) onCleanup(() => { if (!raf) return cancelAnimationFrame(raf) }) return (
{(req) => { return (
) }}
{(perm) => (
0}>
{(pattern) => {pattern}}
{props.t("settings.permissions.tool.doom_loop.description")}
)}
{props.handoffPrompt || props.t("prompt.loading")}
} >
) }