From f90e2de09ce31252e9e5ae394b1bd8b761b8e93c Mon Sep 17 00:00:00 2001 From: jquense Date: Sun, 15 Feb 2026 11:40:41 -0500 Subject: [PATCH 1/2] Expose `askQuestion` on plugin tool context --- packages/opencode/src/tool/registry.ts | 7 +++++++ packages/plugin/src/tool.ts | 17 +++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/packages/opencode/src/tool/registry.ts b/packages/opencode/src/tool/registry.ts index 9a06cb59937b..bd794be9fb38 100644 --- a/packages/opencode/src/tool/registry.ts +++ b/packages/opencode/src/tool/registry.ts @@ -19,6 +19,7 @@ import path from "path" import { type ToolContext as PluginToolContext, type ToolDefinition } from "@opencode-ai/plugin" import z from "zod" import { Plugin } from "../plugin" +import { Question } from "../question" import { WebSearchTool } from "./websearch" import { CodeSearchTool } from "./codesearch" import { Flag } from "@/flag/flag" @@ -68,6 +69,12 @@ export namespace ToolRegistry { ...ctx, directory: Instance.directory, worktree: Instance.worktree, + question: (input: { questions: Question.Info[] }) => + Question.ask({ + sessionID: ctx.sessionID, + questions: input.questions, + tool: ctx.callID ? { messageID: ctx.messageID, callID: ctx.callID } : undefined, + }), } as unknown as PluginToolContext const result = await def.execute(args as any, pluginCtx) const out = await Truncate.output(result, {}, initCtx?.agent) diff --git a/packages/plugin/src/tool.ts b/packages/plugin/src/tool.ts index 23aa512d9a43..e26243eb86ee 100644 --- a/packages/plugin/src/tool.ts +++ b/packages/plugin/src/tool.ts @@ -17,6 +17,7 @@ export type ToolContext = { abort: AbortSignal metadata(input: { title?: string; metadata?: { [key: string]: any } }): void ask(input: AskInput): Promise + askQuestion(input: { questions: QuestionInput[] }): Promise } type AskInput = { @@ -26,6 +27,22 @@ type AskInput = { metadata: { [key: string]: any } } +export type QuestionOption = { + label: string + description: string +} + +export type QuestionInput = { + question: string + header: string + options: QuestionOption[] + multiple?: boolean + custom?: boolean +} + +/** Each answer is an array of selected labels */ +export type QuestionAnswer = string[] + export function tool(input: { description: string args: Args From ddb605e9efff3d95b26c05b14aeb5aa3bc32bbe5 Mon Sep 17 00:00:00 2001 From: jquense Date: Sun, 15 Feb 2026 11:49:33 -0500 Subject: [PATCH 2/2] Update registry.ts --- packages/opencode/src/tool/registry.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opencode/src/tool/registry.ts b/packages/opencode/src/tool/registry.ts index bd794be9fb38..401d7e1fb2bc 100644 --- a/packages/opencode/src/tool/registry.ts +++ b/packages/opencode/src/tool/registry.ts @@ -69,7 +69,7 @@ export namespace ToolRegistry { ...ctx, directory: Instance.directory, worktree: Instance.worktree, - question: (input: { questions: Question.Info[] }) => + askQuestion: (input: { questions: Question.Info[] }) => Question.ask({ sessionID: ctx.sessionID, questions: input.questions,