diff --git a/packages/opencode/src/cli/cmd/tui/context/sync.tsx b/packages/opencode/src/cli/cmd/tui/context/sync.tsx index 9f8a384f777..f0121f5951d 100644 --- a/packages/opencode/src/cli/cmd/tui/context/sync.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/sync.tsx @@ -152,6 +152,13 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ case "permission.asked": { const request = event.properties + if (kv.get("yolo_mode", false)) { + void sdk.client.permission.reply({ + requestID: request.id, + reply: "once", + }) + break + } const requests = store.permission[request.sessionID] if (!requests) { setStore("permission", request.sessionID, [request]) diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/footer.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/footer.tsx index c3a96254e98..dd54367b6b6 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/footer.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/footer.tsx @@ -5,11 +5,13 @@ import { useDirectory } from "../../context/directory" import { useConnected } from "../../component/use-connected" import { createStore } from "solid-js/store" import { useRoute } from "../../context/route" +import { useKV } from "../../context/kv" export function Footer() { const { theme } = useTheme() const sync = useSync() const route = useRoute() + const kv = useKV() const mcp = createMemo(() => Object.values(sync.data.mcp).filter((x) => x.status === "connected").length) const mcpError = createMemo(() => Object.values(sync.data.mcp).some((x) => x.status === "failed")) const lsp = createMemo(() => Object.keys(sync.data.lsp)) @@ -82,6 +84,9 @@ export function Footer() { {mcp()} MCP + + YOLO + /status 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 ce651fdbe46..44b14edff9d 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -134,6 +134,7 @@ const sessionBindingCommands = [ "session.toggle.actions", "session.toggle.scrollbar", "session.toggle.generic_tool_output", + "session.toggle.yolo", "session.page.up", "session.page.down", "session.line.up", @@ -226,6 +227,7 @@ export function Session() { const [diffWrapMode] = kv.signal<"word" | "none">("diff_wrap_mode", "word") const [_animationsEnabled, _setAnimationsEnabled] = kv.signal("animations_enabled", true) const [showGenericToolOutput, setShowGenericToolOutput] = kv.signal("generic_tool_output_visibility", false) + const [yoloMode, setYoloMode] = kv.signal("yolo_mode", false) const wide = createMemo(() => dimensions().width > 120) const sidebarVisible = createMemo(() => { @@ -730,6 +732,23 @@ export function Session() { dialog.clear() }, }, + { + title: yoloMode() ? "Disable YOLO mode" : "Enable YOLO mode", + value: "session.toggle.yolo", + category: "Session", + slash: { + name: "yolo", + }, + run: () => { + const next = !yoloMode() + setYoloMode(next) + toast.show({ + message: next ? "YOLO mode enabled — permissions will be auto-approved" : "YOLO mode disabled", + variant: next ? "warning" : "success", + }) + dialog.clear() + }, + }, { title: "Page up", value: "session.page.up", diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx index 0f9214092eb..45aa3812696 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx @@ -5,6 +5,7 @@ import { useTheme } from "../../context/theme" import { useTuiConfig } from "../../context/tui-config" import { InstallationChannel, InstallationVersion } from "@opencode-ai/core/installation/version" import { TuiPluginRuntime } from "@/cli/cmd/tui/plugin/runtime" +import { useKV } from "../../context/kv" import { getScrollAcceleration } from "../../util/scroll" import { WorkspaceLabel } from "../../component/workspace-label" @@ -14,6 +15,7 @@ export function Sidebar(props: { sessionID: string; overlay?: boolean }) { const sync = useSync() const { theme } = useTheme() const tuiConfig = useTuiConfig() + const kv = useKV() const session = createMemo(() => sync.session.get(props.sessionID)) const workspace = () => { const workspaceID = session()?.workspaceID @@ -85,7 +87,12 @@ export function Sidebar(props: { sessionID: string; overlay?: boolean }) { - + + + + YOLO MODE + + Open