From ac7eaf21dc49cbc8d2105345cc9d7eb57094aad3 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Mon, 2 Feb 2026 14:00:57 -0500 Subject: [PATCH] update run command output and permissions --- packages/opencode/src/cli/cmd/run.ts | 45 ++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/packages/opencode/src/cli/cmd/run.ts b/packages/opencode/src/cli/cmd/run.ts index a34769c6b1..59d2db3682 100644 --- a/packages/opencode/src/cli/cmd/run.ts +++ b/packages/opencode/src/cli/cmd/run.ts @@ -5,7 +5,7 @@ import { cmd } from "./cmd" import { Flag } from "../../flag/flag" import { bootstrap } from "../bootstrap" import { EOL } from "os" -import { createOpencodeClient, type OpencodeClient, type ToolPart } from "@opencode-ai/sdk/v2" +import { createOpencodeClient, type Message, type OpencodeClient, type ToolPart } from "@opencode-ai/sdk/v2" import { Server } from "../../server/server" import { Provider } from "../../provider/provider" import { Agent } from "../../agent/agent" @@ -54,7 +54,8 @@ function inline(info: Inline) { function block(info: Inline, output?: string) { UI.empty() inline(info) - if (output?.trim()) UI.println(output) + if (!output?.trim()) return + UI.println(output) UI.empty() } @@ -321,6 +322,16 @@ export const RunCommand = cmd({ action: "deny", pattern: "*", }, + { + permission: "plan_enter", + action: "deny", + pattern: "*", + }, + { + permission: "plan_exit", + action: "deny", + pattern: "*", + }, ] function title() { @@ -336,7 +347,7 @@ export const RunCommand = cmd({ } if (args.session) return args.session const name = title() - const result = await sdk.session.create(name ? { title: name, permission: rules } : { permission: rules }) + const result = await sdk.session.create({ title: name, permission: rules }) return result.data?.id } @@ -356,6 +367,28 @@ export const RunCommand = cmd({ } async function execute(sdk: OpencodeClient) { + function show() { + if (args.format === "json") return + if (!process.stdout.isTTY) return + const text = message.trimEnd() + if (!text) return + UI.empty() + text.split("\n").forEach((line) => UI.println(`> ${line}`)) + UI.empty() + } + const seen = new Set() + + function head(info: Message) { + if (args.format === "json") return + if (!process.stdout.isTTY) return + if (info.role !== "assistant") return + if (seen.has(info.id)) return + seen.add(info.id) + const model = info.modelID ? ` ยท ${info.modelID}` : "" + UI.empty() + UI.println(`$ ${info.agent}${model}`) + } + function tool(part: ToolPart) { if (part.tool === "bash") return bash(props(part)) if (part.tool === "glob") return glob(props(part)) @@ -456,8 +489,8 @@ export const RunCommand = cmd({ if (permission.sessionID !== sessionID) continue UI.println( UI.Style.TEXT_WARNING_BOLD + "!", - UI.Style.TEXT_NORMAL, - `permission requested: ${permission.permission} (${permission.patterns.join(", ")}); auto-rejecting`, + UI.Style.TEXT_NORMAL + + `permission requested: ${permission.permission} (${permission.patterns.join(", ")}); auto-rejecting`, ) await sdk.permission.reply({ requestID: permission.id, @@ -497,6 +530,8 @@ export const RunCommand = cmd({ } await share(sdk, sessionID) + if (!args.command) show() + loop().catch((e) => { console.error(e) process.exit(1)