diff --git a/packages/opencode/src/cli/cmd/tui/context/sync.tsx b/packages/opencode/src/cli/cmd/tui/context/sync.tsx index 2528a4998..7d67f3e76 100644 --- a/packages/opencode/src/cli/cmd/tui/context/sync.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/sync.tsx @@ -7,7 +7,7 @@ import type { Config, Todo, Command, - Permission, + PermissionRequest, LspStatus, McpStatus, FormatterStatus, @@ -39,7 +39,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ agent: Agent[] command: Command[] permission: { - [sessionID: string]: Permission[] + [sessionID: string]: PermissionRequest[] } config: Config session: Session[] @@ -97,30 +97,10 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ sdk.event.listen((e) => { const event = e.details switch (event.type) { - case "permission.updated": { - const permissions = store.permission[event.properties.sessionID] - if (!permissions) { - setStore("permission", event.properties.sessionID, [event.properties]) - break - } - const match = Binary.search(permissions, event.properties.id, (p) => p.id) - setStore( - "permission", - event.properties.sessionID, - produce((draft) => { - if (match.found) { - draft[match.index] = event.properties - return - } - draft.push(event.properties) - }), - ) - break - } - - case "permission.replied": { - const permissions = store.permission[event.properties.sessionID] - const match = Binary.search(permissions, event.properties.permissionID, (p) => p.id) + case "permission.next.replied": { + const requests = store.permission[event.properties.sessionID] + if (!requests) break + const match = Binary.search(requests, event.properties.requestID, (r) => r.id) if (!match.found) break setStore( "permission", @@ -132,6 +112,28 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ break } + case "permission.next.asked": { + const request = event.properties + const requests = store.permission[request.sessionID] + if (!requests) { + setStore("permission", request.sessionID, [request]) + break + } + const match = Binary.search(requests, request.id, (r) => r.id) + if (match.found) { + setStore("permission", request.sessionID, match.index, reconcile(request)) + break + } + setStore( + "permission", + request.sessionID, + produce((draft) => { + draft.splice(match.index, 0, request) + }), + ) + break + } + case "todo.updated": setStore("todo", event.properties.sessionID, event.properties.todos) break diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index 4ad4dc0ca..b73c78451 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -67,6 +67,7 @@ import { Footer } from "./footer.tsx" import { usePromptRef } from "../../context/prompt" import { Filesystem } from "@/util/filesystem" import { DialogSubagent } from "./dialog-subagent.tsx" +import { PermissionPrompt } from "./permission" addDefaultParsers(parsers.parsers) @@ -87,7 +88,6 @@ const context = createContext<{ showTimestamps: () => boolean usernameVisible: () => boolean showDetails: () => boolean - userMessageMarkdown: () => boolean diffWrapMode: () => "word" | "none" sync: ReturnType }>() @@ -125,7 +125,6 @@ export function Session() { const [usernameVisible, setUsernameVisible] = createSignal(kv.get("username_visible", true)) const [showDetails, setShowDetails] = createSignal(kv.get("tool_details_visibility", true)) const [showScrollbar, setShowScrollbar] = createSignal(kv.get("scrollbar_visible", false)) - const [userMessageMarkdown, setUserMessageMarkdown] = createSignal(kv.get("user_message_markdown", true)) const [diffWrapMode, setDiffWrapMode] = createSignal<"word" | "none">("word") const wide = createMemo(() => dimensions().width > 120) @@ -524,19 +523,6 @@ export function Session() { dialog.clear() }, }, - { - title: userMessageMarkdown() ? "Disable user message markdown" : "Enable user message markdown", - value: "session.toggle.user_message_markdown", - category: "Session", - onSelect: (dialog) => { - setUserMessageMarkdown((prev) => { - const next = !prev - kv.set("user_message_markdown", next) - return next - }) - dialog.clear() - }, - }, { title: "Page up", value: "session.page.up", @@ -874,7 +860,6 @@ export function Session() { showTimestamps, usernameVisible, showDetails, - userMessageMarkdown, diffWrapMode, sync, }} @@ -1000,17 +985,24 @@ export function Session() { - { - prompt = r - promptRef.set(r) - }} - disabled={permissions().length > 0} - onSubmit={() => { - toBottom() - }} - sessionID={route.sessionID} - /> + + 0}> + + + + { + prompt = r + promptRef.set(r) + }} + disabled={permissions().length > 0} + onSubmit={() => { + toBottom() + }} + sessionID={route.sessionID} + /> + +