Przeglądaj źródła

unify blocker labels and base view picking

Simon Klee 6 dni temu
rodzic
commit
737b2c4156

+ 26 - 19
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),
   }
 }
 

+ 6 - 23
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<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: {