From d5e5fc50fba9d15ea5c4962ff5e61bc8bce9df8c Mon Sep 17 00:00:00 2001 From: Simon Klee Date: Sat, 18 Apr 2026 14:19:00 +0200 Subject: [PATCH] unify blocker labels and base view picking --- .../opencode/src/cli/cmd/run/session-data.ts | 45 +++++++++++-------- .../src/cli/cmd/run/stream.transport.ts | 29 +++--------- 2 files changed, 32 insertions(+), 42 deletions(-) diff --git a/packages/opencode/src/cli/cmd/run/session-data.ts b/packages/opencode/src/cli/cmd/run/session-data.ts index 31f49381d0..b2d3e1e3d0 100644 --- a/packages/opencode/src/cli/cmd/run/session-data.ts +++ b/packages/opencode/src/cli/cmd/run/session-data.ts @@ -205,39 +205,46 @@ function out(data: SessionData, commits: SessionCommit[], footer?: FooterOutput) } } -function pickView(data: SessionData): FooterView { - const permission = data.permissions[0] - if (permission) { - return { type: "permission", request: permission } +export function pickBlockerView(input: { + permission?: PermissionRequest + question?: QuestionRequest +}): FooterView { + if (input.permission) { + return { type: "permission", request: input.permission } } - const question = data.questions[0] - if (question) { - return { type: "question", request: question } + if (input.question) { + return { type: "question", request: input.question } } return { type: "prompt" } } -function queueFooter(data: SessionData): FooterOutput { - const view = pickView(data) +export function blockerStatus(view: FooterView) { if (view.type === "permission") { - return { - view, - patch: { status: "awaiting permission" }, - } + return "awaiting permission" } if (view.type === "question") { - return { - view, - patch: { status: "awaiting answer" }, - } + return "awaiting answer" } + return "" +} + +function pickSessionView(data: SessionData): FooterView { + return pickBlockerView({ + permission: data.permissions[0], + question: data.questions[0], + }) +} + +function queueFooter(data: SessionData): FooterOutput { + const view = pickSessionView(data) + return { view, - patch: { status: "" }, + patch: { status: blockerStatus(view) }, } } @@ -348,7 +355,7 @@ function syncPermission(data: SessionData, part: ToolPart): FooterOutput | undef } return { - view: pickView(data), + view: pickSessionView(data), } } diff --git a/packages/opencode/src/cli/cmd/run/stream.transport.ts b/packages/opencode/src/cli/cmd/run/stream.transport.ts index bb8bb9a459..99bfa4cb2f 100644 --- a/packages/opencode/src/cli/cmd/run/stream.transport.ts +++ b/packages/opencode/src/cli/cmd/run/stream.transport.ts @@ -14,9 +14,11 @@ // delayed idle from an older turn cannot complete a newer busy turn. import type { Event, OpencodeClient } from "@opencode-ai/sdk/v2" import { + blockerStatus, bootstrapSessionData, createSessionData, flushInterrupted, + pickBlockerView, reduceSessionData, type SessionData, } from "./session-data" @@ -212,18 +214,6 @@ function sameView(a: FooterView, b: FooterView) { return a.request === b.request } -function blockerStatus(view: FooterView) { - if (view.type === "permission") { - return "awaiting permission" - } - - if (view.type === "question") { - return "awaiting answer" - } - - return "" -} - function blockerOrder(order: Map, id: string) { return order.get(id) ?? Number.MAX_SAFE_INTEGER } @@ -240,17 +230,10 @@ function firstByOrder(left: T[], right: T[], order: Ma } function pickView(data: SessionData, subagent: SubagentData, order: Map): FooterView { - const permission = firstByOrder(data.permissions, listSubagentPermissions(subagent), order) - if (permission) { - return { type: "permission", request: permission } - } - - const question = firstByOrder(data.questions, listSubagentQuestions(subagent), order) - if (question) { - return { type: "question", request: question } - } - - return { type: "prompt" } + return pickBlockerView({ + permission: firstByOrder(data.permissions, listSubagentPermissions(subagent), order), + question: firstByOrder(data.questions, listSubagentQuestions(subagent), order), + }) } function composeFooter(input: {