unify blocker labels and base view picking

This commit is contained in:
Simon Klee
2026-04-18 14:19:00 +02:00
parent 491454e18e
commit d5e5fc50fb
2 changed files with 32 additions and 42 deletions

View File

@@ -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),
}
}

View File

@@ -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<string, number>, id: string) {
return order.get(id) ?? Number.MAX_SAFE_INTEGER
}
@@ -240,17 +230,10 @@ function firstByOrder<T extends { id: string }>(left: T[], right: T[], order: Ma
}
function pickView(data: SessionData, subagent: SubagentData, order: Map<string, number>): 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: {