Compare commits

...

3 Commits

Author SHA1 Message Date
Dax Raad a5f5eec7db core: simplify question tool output formatting 2026-01-08 17:31:24 -05:00
Dax Raad a70132a7f3 fix(question): include option descriptions in tool output 2026-01-08 17:29:11 -05:00
Dax Raad 59a5eba370 feat(question): support multi-select questions 2026-01-08 17:25:06 -05:00
10 changed files with 1411 additions and 325 deletions
@@ -1840,6 +1840,12 @@ function TodoWrite(props: ToolProps<typeof TodoWriteTool>) {
function Question(props: ToolProps<typeof QuestionTool>) {
const { theme } = useTheme()
const count = createMemo(() => props.input.questions?.length ?? 0)
function format(answer?: string[]) {
if (!answer?.length) return "(no answer)"
return answer.join(", ")
}
return (
<Switch>
<Match when={props.metadata.answers}>
@@ -1849,7 +1855,7 @@ function Question(props: ToolProps<typeof QuestionTool>) {
{(q, i) => (
<box flexDirection="row" gap={1}>
<text fg={theme.textMuted}>{q.question}</text>
<text fg={theme.text}>{props.metadata.answers?.[i()] || "(no answer)"}</text>
<text fg={theme.text}>{format(props.metadata.answers?.[i()])}</text>
</box>
)}
</For>
@@ -4,7 +4,7 @@ import { useKeyboard } from "@opentui/solid"
import type { TextareaRenderable } from "@opentui/core"
import { useKeybind } from "../../context/keybind"
import { useTheme } from "../../context/theme"
import type { QuestionRequest } from "@opencode-ai/sdk/v2"
import type { QuestionAnswer, QuestionRequest } from "@opencode-ai/sdk/v2"
import { useSDK } from "../../context/sdk"
import { SplitBorder } from "../../component/border"
import { useTextareaKeybindings } from "../../component/textarea-keybindings"
@@ -17,11 +17,11 @@ export function QuestionPrompt(props: { request: QuestionRequest }) {
const bindings = useTextareaKeybindings()
const questions = createMemo(() => props.request.questions)
const single = createMemo(() => questions().length === 1)
const tabs = createMemo(() => (single() ? 1 : questions().length + 1)) // questions + confirm tab (no confirm for single)
const single = createMemo(() => questions().length === 1 && questions()[0]?.multiple !== true)
const tabs = createMemo(() => (single() ? 1 : questions().length + 1)) // questions + confirm tab (no confirm for single select)
const [store, setStore] = createStore({
tab: 0,
answers: [] as string[],
answers: [] as QuestionAnswer[],
custom: [] as string[],
selected: 0,
editing: false,
@@ -34,10 +34,15 @@ export function QuestionPrompt(props: { request: QuestionRequest }) {
const options = createMemo(() => question()?.options ?? [])
const other = createMemo(() => store.selected === options().length)
const input = createMemo(() => store.custom[store.tab] ?? "")
const multi = createMemo(() => question()?.multiple === true)
const customPicked = createMemo(() => {
const value = input()
if (!value) return false
return store.answers[store.tab]?.includes(value) ?? false
})
function submit() {
// Fill in empty answers with empty strings
const answers = questions().map((_, i) => store.answers[i] ?? "")
const answers = questions().map((_, i) => store.answers[i] ?? [])
sdk.client.question.reply({
requestID: props.request.id,
answers,
@@ -52,7 +57,7 @@ export function QuestionPrompt(props: { request: QuestionRequest }) {
function pick(answer: string, custom: boolean = false) {
const answers = [...store.answers]
answers[store.tab] = answer
answers[store.tab] = [answer]
setStore("answers", answers)
if (custom) {
const inputs = [...store.custom]
@@ -62,7 +67,7 @@ export function QuestionPrompt(props: { request: QuestionRequest }) {
if (single()) {
sdk.client.question.reply({
requestID: props.request.id,
answers: [answer],
answers: [[answer]],
})
return
}
@@ -70,6 +75,17 @@ export function QuestionPrompt(props: { request: QuestionRequest }) {
setStore("selected", 0)
}
function toggle(answer: string) {
const existing = store.answers[store.tab] ?? []
const next = [...existing]
const index = next.indexOf(answer)
if (index === -1) next.push(answer)
if (index !== -1) next.splice(index, 1)
const answers = [...store.answers]
answers[store.tab] = next
setStore("answers", answers)
}
const dialog = useDialog()
useKeyboard((evt) => {
@@ -82,11 +98,49 @@ export function QuestionPrompt(props: { request: QuestionRequest }) {
}
if (evt.name === "return") {
evt.preventDefault()
const text = textarea?.plainText?.trim()
if (text) {
pick(text, true)
const text = textarea?.plainText?.trim() ?? ""
const prev = store.custom[store.tab]
if (!text) {
if (prev) {
const inputs = [...store.custom]
inputs[store.tab] = ""
setStore("custom", inputs)
}
const answers = [...store.answers]
if (prev) {
answers[store.tab] = (answers[store.tab] ?? []).filter((x) => x !== prev)
}
if (!prev) {
answers[store.tab] = []
}
setStore("answers", answers)
setStore("editing", false)
return
}
if (multi()) {
const inputs = [...store.custom]
inputs[store.tab] = text
setStore("custom", inputs)
const existing = store.answers[store.tab] ?? []
const next = [...existing]
if (prev) {
const index = next.indexOf(prev)
if (index !== -1) next.splice(index, 1)
}
if (!next.includes(text)) next.push(text)
const answers = [...store.answers]
answers[store.tab] = next
setStore("answers", answers)
setStore("editing", false)
return
}
pick(text, true)
setStore("editing", false)
return
}
// Let textarea handle all other keys
@@ -133,13 +187,25 @@ export function QuestionPrompt(props: { request: QuestionRequest }) {
if (evt.name === "return") {
evt.preventDefault()
if (other()) {
setStore("editing", true)
} else {
const opt = opts[store.selected]
if (opt) {
pick(opt.label)
if (!multi()) {
setStore("editing", true)
return
}
const value = input()
if (value && customPicked()) {
toggle(value)
return
}
setStore("editing", true)
return
}
const opt = opts[store.selected]
if (!opt) return
if (multi()) {
toggle(opt.label)
return
}
pick(opt.label)
}
if (evt.name === "escape" || keybind.match("app_exit", evt)) {
@@ -162,7 +228,9 @@ export function QuestionPrompt(props: { request: QuestionRequest }) {
<For each={questions()}>
{(q, index) => {
const isActive = () => index() === store.tab
const isAnswered = () => store.answers[index()] !== undefined
const isAnswered = () => {
return (store.answers[index()]?.length ?? 0) > 0
}
return (
<box
paddingLeft={1}
@@ -185,13 +253,16 @@ export function QuestionPrompt(props: { request: QuestionRequest }) {
<Show when={!confirm()}>
<box paddingLeft={1} gap={1}>
<box>
<text fg={theme.text}>{question()?.question}</text>
<text fg={theme.text}>
{question()?.question}
{multi() ? " (select all that apply)" : ""}
</text>
</box>
<box>
<For each={options()}>
{(opt, i) => {
const active = () => i() === store.selected
const picked = () => store.answers[store.tab] === opt.label
const picked = () => store.answers[store.tab]?.includes(opt.label) ?? false
return (
<box>
<box flexDirection="row" gap={1}>
@@ -212,17 +283,18 @@ export function QuestionPrompt(props: { request: QuestionRequest }) {
<box>
<box flexDirection="row" gap={1}>
<box backgroundColor={other() ? theme.backgroundElement : undefined}>
<text fg={other() ? theme.secondary : input() ? theme.success : theme.text}>
<text fg={other() ? theme.secondary : customPicked() ? theme.success : theme.text}>
{options().length + 1}. Type your own answer
</text>
</box>
<text fg={theme.success}>{input() ? "✓" : ""}</text>
<text fg={theme.success}>{customPicked() ? "✓" : ""}</text>
</box>
<Show when={store.editing}>
<box paddingLeft={3}>
<textarea
ref={(val: TextareaRenderable) => (textarea = val)}
focused
initialValue={input()}
placeholder="Type your own answer"
textColor={theme.text}
focusedTextColor={theme.text}
@@ -247,11 +319,12 @@ export function QuestionPrompt(props: { request: QuestionRequest }) {
</box>
<For each={questions()}>
{(q, index) => {
const answer = () => store.answers[index()]
const value = () => store.answers[index()]?.join(", ") ?? ""
const answered = () => Boolean(value())
return (
<box flexDirection="row" gap={1} paddingLeft={1}>
<text fg={theme.textMuted}>{q.header}:</text>
<text fg={answer() ? theme.text : theme.error}>{answer() ?? "(not answered)"}</text>
<text fg={answered() ? theme.text : theme.error}>{answered() ? value() : "(not answered)"}</text>
</box>
)
}}
@@ -279,8 +352,12 @@ export function QuestionPrompt(props: { request: QuestionRequest }) {
</text>
</Show>
<text fg={theme.text}>
enter <span style={{ fg: theme.textMuted }}>{confirm() ? "submit" : single() ? "submit" : "confirm"}</span>
enter{" "}
<span style={{ fg: theme.textMuted }}>
{confirm() ? "submit" : multi() ? "toggle" : single() ? "submit" : "confirm"}
</span>
</text>
<text fg={theme.text}>
esc <span style={{ fg: theme.textMuted }}>dismiss</span>
</text>
+14 -6
View File
@@ -23,6 +23,7 @@ export namespace Question {
question: z.string().describe("Complete question"),
header: z.string().max(12).describe("Very short label (max 12 chars)"),
options: z.array(Option).describe("Available choices"),
multiple: z.boolean().optional().describe("Allow selecting multiple choices"),
})
.meta({
ref: "QuestionInfo",
@@ -46,8 +47,15 @@ export namespace Question {
})
export type Request = z.infer<typeof Request>
export const Answer = z.array(z.string()).meta({
ref: "QuestionAnswer",
})
export type Answer = z.infer<typeof Answer>
export const Reply = z.object({
answers: z.array(z.string()).describe("User answers in order of questions"),
answers: z
.array(Answer)
.describe("User answers in order of questions (each answer is an array of selected labels)"),
})
export type Reply = z.infer<typeof Reply>
@@ -58,7 +66,7 @@ export namespace Question {
z.object({
sessionID: z.string(),
requestID: z.string(),
answers: z.array(z.string()),
answers: z.array(Answer),
}),
),
Rejected: BusEvent.define(
@@ -75,7 +83,7 @@ export namespace Question {
string,
{
info: Request
resolve: (answers: string[]) => void
resolve: (answers: Answer[]) => void
reject: (e: any) => void
}
> = {}
@@ -89,13 +97,13 @@ export namespace Question {
sessionID: string
questions: Info[]
tool?: { messageID: string; callID: string }
}): Promise<string[]> {
}): Promise<Answer[]> {
const s = await state()
const id = Identifier.ascending("question")
log.info("asking", { id, questions: input.questions.length })
return new Promise<string[]>((resolve, reject) => {
return new Promise<Answer[]>((resolve, reject) => {
const info: Request = {
id,
sessionID: input.sessionID,
@@ -111,7 +119,7 @@ export namespace Question {
})
}
export async function reply(input: { requestID: string; answers: string[] }): Promise<void> {
export async function reply(input: { requestID: string; answers: Answer[] }): Promise<void> {
const s = await state()
const existing = s.pending[input.requestID]
if (!existing) {
+1 -1
View File
@@ -52,7 +52,7 @@ export const QuestionRoute = new Hono()
requestID: z.string(),
}),
),
validator("json", z.object({ answers: z.array(z.string()) })),
validator("json", Question.Reply),
async (c) => {
const params = c.req.valid("param")
const json = c.req.valid("json")
+6 -1
View File
@@ -15,7 +15,12 @@ export const QuestionTool = Tool.define("question", {
tool: ctx.callID ? { messageID: ctx.messageID, callID: ctx.callID } : undefined,
})
const formatted = params.questions.map((q, i) => `"${q.question}"="${answers[i] ?? "Unanswered"}"`).join(", ")
function format(answer: Question.Answer | undefined) {
if (!answer?.length) return "Unanswered"
return answer.join(", ")
}
const formatted = params.questions.map((q, i) => `"${q.question}"="${format(answers[i])}"`).join(", ")
return {
title: `Asked ${params.questions.length} question${params.questions.length > 1 ? "s" : ""}`,
+1
View File
@@ -6,4 +6,5 @@ Use this tool when you need to ask the user questions during execution. This all
Usage notes:
- Users will always be able to select "Other" to provide custom text input
- Answers are returned as arrays of labels; set `multiple: true` to allow selecting more than one
- If you recommend a specific option, make that the first option in the list and add "(Recommended)" at the end of the label
@@ -82,11 +82,11 @@ test("reply - resolves the pending ask with answers", async () => {
await Question.reply({
requestID,
answers: ["Option 1"],
answers: [["Option 1"]],
})
const answers = await askPromise
expect(answers).toEqual(["Option 1"])
expect(answers).toEqual([["Option 1"]])
},
})
})
@@ -115,7 +115,7 @@ test("reply - removes from pending list", async () => {
await Question.reply({
requestID: pending[0].id,
answers: ["Option 1"],
answers: [["Option 1"]],
})
const pendingAfter = await Question.list()
@@ -131,7 +131,7 @@ test("reply - does nothing for unknown requestID", async () => {
fn: async () => {
await Question.reply({
requestID: "que_unknown",
answers: ["Option 1"],
answers: [["Option 1"]],
})
// Should not throw
},
@@ -244,11 +244,11 @@ test("ask - handles multiple questions", async () => {
await Question.reply({
requestID: pending[0].id,
answers: ["Build", "Dev"],
answers: [["Build"], ["Dev"]],
})
const answers = await askPromise
expect(answers).toEqual(["Build", "Dev"])
expect(answers).toEqual([["Build"], ["Dev"]])
},
})
})
+2 -1
View File
@@ -84,6 +84,7 @@ import type {
PtyRemoveResponses,
PtyUpdateErrors,
PtyUpdateResponses,
QuestionAnswer,
QuestionListResponses,
QuestionRejectErrors,
QuestionRejectResponses,
@@ -1815,7 +1816,7 @@ export class Question extends HeyApiClient {
parameters: {
requestID: string
directory?: string
answers?: Array<string>
answers?: Array<QuestionAnswer>
},
options?: Options<never, ThrowOnError>,
) {
+11 -2
View File
@@ -541,6 +541,10 @@ export type QuestionInfo = {
* Available choices
*/
options: Array<QuestionOption>
/**
* Allow selecting multiple choices
*/
multiple?: boolean
}
export type QuestionRequest = {
@@ -561,12 +565,14 @@ export type EventQuestionAsked = {
properties: QuestionRequest
}
export type QuestionAnswer = Array<string>
export type EventQuestionReplied = {
type: "question.replied"
properties: {
sessionID: string
requestID: string
answers: Array<string>
answers: Array<QuestionAnswer>
}
}
@@ -3630,7 +3636,10 @@ export type QuestionListResponse = QuestionListResponses[keyof QuestionListRespo
export type QuestionReplyData = {
body?: {
answers: Array<string>
/**
* User answers in order of questions (each answer is an array of selected labels)
*/
answers: Array<QuestionAnswer>
}
path: {
requestID: string
+1262 -283
View File
@@ -27,7 +27,10 @@
"type": "string"
}
},
"required": ["healthy", "version"]
"required": [
"healthy",
"version"
]
}
}
}
@@ -476,7 +479,10 @@
"type": "number"
}
},
"required": ["rows", "cols"]
"required": [
"rows",
"cols"
]
}
}
}
@@ -1169,7 +1175,9 @@
],
"summary": "Get session",
"description": "Retrieve detailed information about a specific OpenCode session.",
"tags": ["Session"],
"tags": [
"Session"
],
"responses": {
"200": {
"description": "Get session",
@@ -1375,7 +1383,9 @@
}
],
"summary": "Get session children",
"tags": ["Session"],
"tags": [
"Session"
],
"description": "Retrieve all child sessions that were forked from the specified parent session.",
"responses": {
"200": {
@@ -1558,7 +1568,11 @@
"pattern": "^msg.*"
}
},
"required": ["modelID", "providerID", "messageID"]
"required": [
"modelID",
"providerID",
"messageID"
]
}
}
}
@@ -1960,7 +1974,10 @@
"type": "boolean"
}
},
"required": ["providerID", "modelID"]
"required": [
"providerID",
"modelID"
]
}
}
}
@@ -2023,7 +2040,10 @@
}
}
},
"required": ["info", "parts"]
"required": [
"info",
"parts"
]
}
}
}
@@ -2097,7 +2117,10 @@
}
}
},
"required": ["info", "parts"]
"required": [
"info",
"parts"
]
}
}
}
@@ -2143,7 +2166,10 @@
"type": "string"
}
},
"required": ["providerID", "modelID"]
"required": [
"providerID",
"modelID"
]
},
"agent": {
"type": "string"
@@ -2187,7 +2213,9 @@
}
}
},
"required": ["parts"]
"required": [
"parts"
]
}
}
}
@@ -2250,7 +2278,10 @@
}
}
},
"required": ["info", "parts"]
"required": [
"info",
"parts"
]
}
}
}
@@ -2519,7 +2550,10 @@
"type": "string"
}
},
"required": ["providerID", "modelID"]
"required": [
"providerID",
"modelID"
]
},
"agent": {
"type": "string"
@@ -2563,7 +2597,9 @@
}
}
},
"required": ["parts"]
"required": [
"parts"
]
}
}
}
@@ -2617,7 +2653,10 @@
}
}
},
"required": ["info", "parts"]
"required": [
"info",
"parts"
]
}
}
}
@@ -2695,13 +2734,20 @@
"$ref": "#/components/schemas/FilePartSource"
}
},
"required": ["type", "mime", "url"]
"required": [
"type",
"mime",
"url"
]
}
]
}
}
},
"required": ["arguments", "command"]
"required": [
"arguments",
"command"
]
}
}
}
@@ -2788,13 +2834,19 @@
"type": "string"
}
},
"required": ["providerID", "modelID"]
"required": [
"providerID",
"modelID"
]
},
"command": {
"type": "string"
}
},
"required": ["agent", "command"]
"required": [
"agent",
"command"
]
}
}
}
@@ -2876,7 +2928,9 @@
"pattern": "^prt.*"
}
},
"required": ["messageID"]
"required": [
"messageID"
]
}
}
}
@@ -3022,10 +3076,16 @@
"properties": {
"response": {
"type": "string",
"enum": ["once", "always", "reject"]
"enum": [
"once",
"always",
"reject"
]
}
},
"required": ["response"]
"required": [
"response"
]
}
}
}
@@ -3100,13 +3160,19 @@
"properties": {
"reply": {
"type": "string",
"enum": ["once", "always", "reject"]
"enum": [
"once",
"always",
"reject"
]
},
"message": {
"type": "string"
}
},
"required": ["reply"]
"required": [
"reply"
]
}
}
}
@@ -3254,13 +3320,16 @@
"type": "object",
"properties": {
"answers": {
"description": "User answers in order of questions (each answer is an array of selected labels)",
"type": "array",
"items": {
"type": "string"
"$ref": "#/components/schemas/QuestionAnswer"
}
}
},
"required": ["answers"]
"required": [
"answers"
]
}
}
}
@@ -3410,7 +3479,10 @@
}
}
},
"required": ["providers", "default"]
"required": [
"providers",
"default"
]
}
}
}
@@ -3512,10 +3584,15 @@
"properties": {
"field": {
"type": "string",
"enum": ["reasoning_content", "reasoning_details"]
"enum": [
"reasoning_content",
"reasoning_details"
]
}
},
"required": ["field"],
"required": [
"field"
],
"additionalProperties": false
}
]
@@ -3551,10 +3628,16 @@
"type": "number"
}
},
"required": ["input", "output"]
"required": [
"input",
"output"
]
}
},
"required": ["input", "output"]
"required": [
"input",
"output"
]
},
"limit": {
"type": "object",
@@ -3566,7 +3649,10 @@
"type": "number"
}
},
"required": ["context", "output"]
"required": [
"context",
"output"
]
},
"modalities": {
"type": "object",
@@ -3575,25 +3661,44 @@
"type": "array",
"items": {
"type": "string",
"enum": ["text", "audio", "image", "video", "pdf"]
"enum": [
"text",
"audio",
"image",
"video",
"pdf"
]
}
},
"output": {
"type": "array",
"items": {
"type": "string",
"enum": ["text", "audio", "image", "video", "pdf"]
"enum": [
"text",
"audio",
"image",
"video",
"pdf"
]
}
}
},
"required": ["input", "output"]
"required": [
"input",
"output"
]
},
"experimental": {
"type": "boolean"
},
"status": {
"type": "string",
"enum": ["alpha", "beta", "deprecated"]
"enum": [
"alpha",
"beta",
"deprecated"
]
},
"options": {
"type": "object",
@@ -3618,7 +3723,9 @@
"type": "string"
}
},
"required": ["npm"]
"required": [
"npm"
]
},
"variants": {
"type": "object",
@@ -3648,7 +3755,12 @@
}
}
},
"required": ["name", "env", "id", "models"]
"required": [
"name",
"env",
"id",
"models"
]
}
},
"default": {
@@ -3667,7 +3779,11 @@
}
}
},
"required": ["all", "default", "connected"]
"required": [
"all",
"default",
"connected"
]
}
}
}
@@ -3780,7 +3896,9 @@
"type": "number"
}
},
"required": ["method"]
"required": [
"method"
]
}
}
}
@@ -3853,7 +3971,9 @@
"type": "string"
}
},
"required": ["method"]
"required": [
"method"
]
}
}
}
@@ -3905,7 +4025,9 @@
"type": "string"
}
},
"required": ["text"]
"required": [
"text"
]
},
"lines": {
"type": "object",
@@ -3914,7 +4036,9 @@
"type": "string"
}
},
"required": ["text"]
"required": [
"text"
]
},
"line_number": {
"type": "number"
@@ -3934,7 +4058,9 @@
"type": "string"
}
},
"required": ["text"]
"required": [
"text"
]
},
"start": {
"type": "number"
@@ -3943,11 +4069,21 @@
"type": "number"
}
},
"required": ["match", "start", "end"]
"required": [
"match",
"start",
"end"
]
}
}
},
"required": ["path", "lines", "line_number", "absolute_offset", "submatches"]
"required": [
"path",
"lines",
"line_number",
"absolute_offset",
"submatches"
]
}
}
}
@@ -3986,7 +4122,10 @@
"name": "dirs",
"schema": {
"type": "string",
"enum": ["true", "false"]
"enum": [
"true",
"false"
]
}
},
{
@@ -3994,7 +4133,10 @@
"name": "type",
"schema": {
"type": "string",
"enum": ["file", "directory"]
"enum": [
"file",
"directory"
]
}
},
{
@@ -4250,7 +4392,12 @@
"level": {
"description": "Log level",
"type": "string",
"enum": ["debug", "info", "error", "warn"]
"enum": [
"debug",
"info",
"error",
"warn"
]
},
"message": {
"description": "Log message",
@@ -4265,7 +4412,11 @@
"additionalProperties": {}
}
},
"required": ["service", "level", "message"]
"required": [
"service",
"level",
"message"
]
}
}
}
@@ -4415,7 +4566,10 @@
]
}
},
"required": ["name", "config"]
"required": [
"name",
"config"
]
}
}
}
@@ -4463,7 +4617,9 @@
"type": "string"
}
},
"required": ["authorizationUrl"]
"required": [
"authorizationUrl"
]
}
}
}
@@ -4530,7 +4686,9 @@
"const": true
}
},
"required": ["success"]
"required": [
"success"
]
}
}
}
@@ -4619,7 +4777,9 @@
"type": "string"
}
},
"required": ["code"]
"required": [
"code"
]
}
}
}
@@ -4936,7 +5096,9 @@
"type": "string"
}
},
"required": ["text"]
"required": [
"text"
]
}
}
}
@@ -5199,7 +5361,9 @@
"type": "string"
}
},
"required": ["command"]
"required": [
"command"
]
}
}
}
@@ -5252,7 +5416,12 @@
},
"variant": {
"type": "string",
"enum": ["info", "success", "warning", "error"]
"enum": [
"info",
"success",
"warning",
"error"
]
},
"duration": {
"description": "Duration in milliseconds",
@@ -5260,7 +5429,10 @@
"type": "number"
}
},
"required": ["message", "variant"]
"required": [
"message",
"variant"
]
}
}
}
@@ -5397,7 +5569,9 @@
"pattern": "^ses"
}
},
"required": ["sessionID"]
"required": [
"sessionID"
]
}
}
}
@@ -5437,7 +5611,10 @@
},
"body": {}
},
"required": ["path", "body"]
"required": [
"path",
"body"
]
}
}
}
@@ -5604,10 +5781,15 @@
"type": "string"
}
},
"required": ["version"]
"required": [
"version"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.installation.update-available": {
"type": "object",
@@ -5623,10 +5805,15 @@
"type": "string"
}
},
"required": ["version"]
"required": [
"version"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Project": {
"type": "object",
@@ -5668,7 +5855,10 @@
"type": "number"
}
},
"required": ["created", "updated"]
"required": [
"created",
"updated"
]
},
"sandboxes": {
"type": "array",
@@ -5677,7 +5867,12 @@
}
}
},
"required": ["id", "worktree", "time", "sandboxes"]
"required": [
"id",
"worktree",
"time",
"sandboxes"
]
},
"Event.project.updated": {
"type": "object",
@@ -5690,7 +5885,10 @@
"$ref": "#/components/schemas/Project"
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.server.instance.disposed": {
"type": "object",
@@ -5706,10 +5904,15 @@
"type": "string"
}
},
"required": ["directory"]
"required": [
"directory"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.lsp.client.diagnostics": {
"type": "object",
@@ -5728,10 +5931,16 @@
"type": "string"
}
},
"required": ["serverID", "path"]
"required": [
"serverID",
"path"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.lsp.updated": {
"type": "object",
@@ -5745,7 +5954,10 @@
"properties": {}
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"FileDiff": {
"type": "object",
@@ -5766,7 +5978,13 @@
"type": "number"
}
},
"required": ["file", "before", "after", "additions", "deletions"]
"required": [
"file",
"before",
"after",
"additions",
"deletions"
]
},
"UserMessage": {
"type": "object",
@@ -5788,7 +6006,9 @@
"type": "number"
}
},
"required": ["created"]
"required": [
"created"
]
},
"summary": {
"type": "object",
@@ -5806,7 +6026,9 @@
}
}
},
"required": ["diffs"]
"required": [
"diffs"
]
},
"agent": {
"type": "string"
@@ -5821,7 +6043,10 @@
"type": "string"
}
},
"required": ["providerID", "modelID"]
"required": [
"providerID",
"modelID"
]
},
"system": {
"type": "string"
@@ -5839,7 +6064,14 @@
"type": "string"
}
},
"required": ["id", "sessionID", "role", "time", "agent", "model"]
"required": [
"id",
"sessionID",
"role",
"time",
"agent",
"model"
]
},
"ProviderAuthError": {
"type": "object",
@@ -5858,10 +6090,16 @@
"type": "string"
}
},
"required": ["providerID", "message"]
"required": [
"providerID",
"message"
]
}
},
"required": ["name", "data"]
"required": [
"name",
"data"
]
},
"UnknownError": {
"type": "object",
@@ -5877,10 +6115,15 @@
"type": "string"
}
},
"required": ["message"]
"required": [
"message"
]
}
},
"required": ["name", "data"]
"required": [
"name",
"data"
]
},
"MessageOutputLengthError": {
"type": "object",
@@ -5894,7 +6137,10 @@
"properties": {}
}
},
"required": ["name", "data"]
"required": [
"name",
"data"
]
},
"MessageAbortedError": {
"type": "object",
@@ -5910,10 +6156,15 @@
"type": "string"
}
},
"required": ["message"]
"required": [
"message"
]
}
},
"required": ["name", "data"]
"required": [
"name",
"data"
]
},
"APIError": {
"type": "object",
@@ -5956,10 +6207,16 @@
}
}
},
"required": ["message", "isRetryable"]
"required": [
"message",
"isRetryable"
]
}
},
"required": ["name", "data"]
"required": [
"name",
"data"
]
},
"AssistantMessage": {
"type": "object",
@@ -5984,7 +6241,9 @@
"type": "number"
}
},
"required": ["created"]
"required": [
"created"
]
},
"error": {
"anyOf": [
@@ -6030,7 +6289,10 @@
"type": "string"
}
},
"required": ["cwd", "root"]
"required": [
"cwd",
"root"
]
},
"summary": {
"type": "boolean"
@@ -6060,10 +6322,18 @@
"type": "number"
}
},
"required": ["read", "write"]
"required": [
"read",
"write"
]
}
},
"required": ["input", "output", "reasoning", "cache"]
"required": [
"input",
"output",
"reasoning",
"cache"
]
},
"finish": {
"type": "string"
@@ -6108,10 +6378,15 @@
"$ref": "#/components/schemas/Message"
}
},
"required": ["info"]
"required": [
"info"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.message.removed": {
"type": "object",
@@ -6130,10 +6405,16 @@
"type": "string"
}
},
"required": ["sessionID", "messageID"]
"required": [
"sessionID",
"messageID"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"TextPart": {
"type": "object",
@@ -6170,7 +6451,9 @@
"type": "number"
}
},
"required": ["start"]
"required": [
"start"
]
},
"metadata": {
"type": "object",
@@ -6180,7 +6463,13 @@
"additionalProperties": {}
}
},
"required": ["id", "sessionID", "messageID", "type", "text"]
"required": [
"id",
"sessionID",
"messageID",
"type",
"text"
]
},
"ReasoningPart": {
"type": "object",
@@ -6218,10 +6507,19 @@
"type": "number"
}
},
"required": ["start"]
"required": [
"start"
]
}
},
"required": ["id", "sessionID", "messageID", "type", "text", "time"]
"required": [
"id",
"sessionID",
"messageID",
"type",
"text",
"time"
]
},
"FilePartSourceText": {
"type": "object",
@@ -6240,7 +6538,11 @@
"maximum": 9007199254740991
}
},
"required": ["value", "start", "end"]
"required": [
"value",
"start",
"end"
]
},
"FileSource": {
"type": "object",
@@ -6256,7 +6558,11 @@
"type": "string"
}
},
"required": ["text", "type", "path"]
"required": [
"text",
"type",
"path"
]
},
"Range": {
"type": "object",
@@ -6271,7 +6577,10 @@
"type": "number"
}
},
"required": ["line", "character"]
"required": [
"line",
"character"
]
},
"end": {
"type": "object",
@@ -6283,10 +6592,16 @@
"type": "number"
}
},
"required": ["line", "character"]
"required": [
"line",
"character"
]
}
},
"required": ["start", "end"]
"required": [
"start",
"end"
]
},
"SymbolSource": {
"type": "object",
@@ -6313,7 +6628,14 @@
"maximum": 9007199254740991
}
},
"required": ["text", "type", "path", "range", "name", "kind"]
"required": [
"text",
"type",
"path",
"range",
"name",
"kind"
]
},
"ResourceSource": {
"type": "object",
@@ -6332,7 +6654,12 @@
"type": "string"
}
},
"required": ["text", "type", "clientName", "uri"]
"required": [
"text",
"type",
"clientName",
"uri"
]
},
"FilePartSource": {
"anyOf": [
@@ -6376,7 +6703,14 @@
"$ref": "#/components/schemas/FilePartSource"
}
},
"required": ["id", "sessionID", "messageID", "type", "mime", "url"]
"required": [
"id",
"sessionID",
"messageID",
"type",
"mime",
"url"
]
},
"ToolStatePending": {
"type": "object",
@@ -6396,7 +6730,11 @@
"type": "string"
}
},
"required": ["status", "input", "raw"]
"required": [
"status",
"input",
"raw"
]
},
"ToolStateRunning": {
"type": "object",
@@ -6429,10 +6767,16 @@
"type": "number"
}
},
"required": ["start"]
"required": [
"start"
]
}
},
"required": ["status", "input", "time"]
"required": [
"status",
"input",
"time"
]
},
"ToolStateCompleted": {
"type": "object",
@@ -6474,7 +6818,10 @@
"type": "number"
}
},
"required": ["start", "end"]
"required": [
"start",
"end"
]
},
"attachments": {
"type": "array",
@@ -6483,7 +6830,14 @@
}
}
},
"required": ["status", "input", "output", "title", "metadata", "time"]
"required": [
"status",
"input",
"output",
"title",
"metadata",
"time"
]
},
"ToolStateError": {
"type": "object",
@@ -6519,10 +6873,18 @@
"type": "number"
}
},
"required": ["start", "end"]
"required": [
"start",
"end"
]
}
},
"required": ["status", "input", "error", "time"]
"required": [
"status",
"input",
"error",
"time"
]
},
"ToolState": {
"anyOf": [
@@ -6573,7 +6935,15 @@
"additionalProperties": {}
}
},
"required": ["id", "sessionID", "messageID", "type", "callID", "tool", "state"]
"required": [
"id",
"sessionID",
"messageID",
"type",
"callID",
"tool",
"state"
]
},
"StepStartPart": {
"type": "object",
@@ -6595,7 +6965,12 @@
"type": "string"
}
},
"required": ["id", "sessionID", "messageID", "type"]
"required": [
"id",
"sessionID",
"messageID",
"type"
]
},
"StepFinishPart": {
"type": "object",
@@ -6644,13 +7019,29 @@
"type": "number"
}
},
"required": ["read", "write"]
"required": [
"read",
"write"
]
}
},
"required": ["input", "output", "reasoning", "cache"]
"required": [
"input",
"output",
"reasoning",
"cache"
]
}
},
"required": ["id", "sessionID", "messageID", "type", "reason", "cost", "tokens"]
"required": [
"id",
"sessionID",
"messageID",
"type",
"reason",
"cost",
"tokens"
]
},
"SnapshotPart": {
"type": "object",
@@ -6672,7 +7063,13 @@
"type": "string"
}
},
"required": ["id", "sessionID", "messageID", "type", "snapshot"]
"required": [
"id",
"sessionID",
"messageID",
"type",
"snapshot"
]
},
"PatchPart": {
"type": "object",
@@ -6700,7 +7097,14 @@
}
}
},
"required": ["id", "sessionID", "messageID", "type", "hash", "files"]
"required": [
"id",
"sessionID",
"messageID",
"type",
"hash",
"files"
]
},
"AgentPart": {
"type": "object",
@@ -6738,10 +7142,20 @@
"maximum": 9007199254740991
}
},
"required": ["value", "start", "end"]
"required": [
"value",
"start",
"end"
]
}
},
"required": ["id", "sessionID", "messageID", "type", "name"]
"required": [
"id",
"sessionID",
"messageID",
"type",
"name"
]
},
"RetryPart": {
"type": "object",
@@ -6772,10 +7186,20 @@
"type": "number"
}
},
"required": ["created"]
"required": [
"created"
]
}
},
"required": ["id", "sessionID", "messageID", "type", "attempt", "error", "time"]
"required": [
"id",
"sessionID",
"messageID",
"type",
"attempt",
"error",
"time"
]
},
"CompactionPart": {
"type": "object",
@@ -6797,7 +7221,13 @@
"type": "boolean"
}
},
"required": ["id", "sessionID", "messageID", "type", "auto"]
"required": [
"id",
"sessionID",
"messageID",
"type",
"auto"
]
},
"Part": {
"anyOf": [
@@ -6833,7 +7263,15 @@
"type": "string"
}
},
"required": ["id", "sessionID", "messageID", "type", "prompt", "description", "agent"]
"required": [
"id",
"sessionID",
"messageID",
"type",
"prompt",
"description",
"agent"
]
},
{
"$ref": "#/components/schemas/ReasoningPart"
@@ -6884,10 +7322,15 @@
"type": "string"
}
},
"required": ["part"]
"required": [
"part"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.message.part.removed": {
"type": "object",
@@ -6909,10 +7352,17 @@
"type": "string"
}
},
"required": ["sessionID", "messageID", "partID"]
"required": [
"sessionID",
"messageID",
"partID"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"PermissionRequest": {
"type": "object",
@@ -6957,10 +7407,20 @@
"type": "string"
}
},
"required": ["messageID", "callID"]
"required": [
"messageID",
"callID"
]
}
},
"required": ["id", "sessionID", "permission", "patterns", "metadata", "always"]
"required": [
"id",
"sessionID",
"permission",
"patterns",
"metadata",
"always"
]
},
"Event.permission.asked": {
"type": "object",
@@ -6973,7 +7433,10 @@
"$ref": "#/components/schemas/PermissionRequest"
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.permission.replied": {
"type": "object",
@@ -6993,13 +7456,24 @@
},
"reply": {
"type": "string",
"enum": ["once", "always", "reject"]
"enum": [
"once",
"always",
"reject"
]
}
},
"required": ["sessionID", "requestID", "reply"]
"required": [
"sessionID",
"requestID",
"reply"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"SessionStatus": {
"anyOf": [
@@ -7011,7 +7485,9 @@
"const": "idle"
}
},
"required": ["type"]
"required": [
"type"
]
},
{
"type": "object",
@@ -7030,7 +7506,12 @@
"type": "number"
}
},
"required": ["type", "attempt", "message", "next"]
"required": [
"type",
"attempt",
"message",
"next"
]
},
{
"type": "object",
@@ -7040,7 +7521,9 @@
"const": "busy"
}
},
"required": ["type"]
"required": [
"type"
]
}
]
},
@@ -7061,10 +7544,16 @@
"$ref": "#/components/schemas/SessionStatus"
}
},
"required": ["sessionID", "status"]
"required": [
"sessionID",
"status"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.session.idle": {
"type": "object",
@@ -7080,10 +7569,15 @@
"type": "string"
}
},
"required": ["sessionID"]
"required": [
"sessionID"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"QuestionOption": {
"type": "object",
@@ -7097,7 +7591,10 @@
"type": "string"
}
},
"required": ["label", "description"]
"required": [
"label",
"description"
]
},
"QuestionInfo": {
"type": "object",
@@ -7117,9 +7614,17 @@
"items": {
"$ref": "#/components/schemas/QuestionOption"
}
},
"multiple": {
"description": "Allow selecting multiple choices",
"type": "boolean"
}
},
"required": ["question", "header", "options"]
"required": [
"question",
"header",
"options"
]
},
"QuestionRequest": {
"type": "object",
@@ -7149,10 +7654,17 @@
"type": "string"
}
},
"required": ["messageID", "callID"]
"required": [
"messageID",
"callID"
]
}
},
"required": ["id", "sessionID", "questions"]
"required": [
"id",
"sessionID",
"questions"
]
},
"Event.question.asked": {
"type": "object",
@@ -7165,7 +7677,16 @@
"$ref": "#/components/schemas/QuestionRequest"
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"QuestionAnswer": {
"type": "array",
"items": {
"type": "string"
}
},
"Event.question.replied": {
"type": "object",
@@ -7186,14 +7707,21 @@
"answers": {
"type": "array",
"items": {
"type": "string"
"$ref": "#/components/schemas/QuestionAnswer"
}
}
},
"required": ["sessionID", "requestID", "answers"]
"required": [
"sessionID",
"requestID",
"answers"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.question.rejected": {
"type": "object",
@@ -7212,10 +7740,16 @@
"type": "string"
}
},
"required": ["sessionID", "requestID"]
"required": [
"sessionID",
"requestID"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.session.compacted": {
"type": "object",
@@ -7231,10 +7765,15 @@
"type": "string"
}
},
"required": ["sessionID"]
"required": [
"sessionID"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.file.edited": {
"type": "object",
@@ -7250,10 +7789,15 @@
"type": "string"
}
},
"required": ["file"]
"required": [
"file"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Todo": {
"type": "object",
@@ -7275,7 +7819,12 @@
"type": "string"
}
},
"required": ["content", "status", "priority", "id"]
"required": [
"content",
"status",
"priority",
"id"
]
},
"Event.todo.updated": {
"type": "object",
@@ -7297,10 +7846,16 @@
}
}
},
"required": ["sessionID", "todos"]
"required": [
"sessionID",
"todos"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.tui.prompt.append": {
"type": "object",
@@ -7316,10 +7871,15 @@
"type": "string"
}
},
"required": ["text"]
"required": [
"text"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.tui.command.execute": {
"type": "object",
@@ -7358,10 +7918,15 @@
]
}
},
"required": ["command"]
"required": [
"command"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.tui.toast.show": {
"type": "object",
@@ -7381,7 +7946,12 @@
},
"variant": {
"type": "string",
"enum": ["info", "success", "warning", "error"]
"enum": [
"info",
"success",
"warning",
"error"
]
},
"duration": {
"description": "Duration in milliseconds",
@@ -7389,10 +7959,16 @@
"type": "number"
}
},
"required": ["message", "variant"]
"required": [
"message",
"variant"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.tui.session.select": {
"type": "object",
@@ -7410,10 +7986,15 @@
"pattern": "^ses"
}
},
"required": ["sessionID"]
"required": [
"sessionID"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.mcp.tools.changed": {
"type": "object",
@@ -7429,10 +8010,15 @@
"type": "string"
}
},
"required": ["server"]
"required": [
"server"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.command.executed": {
"type": "object",
@@ -7459,14 +8045,26 @@
"pattern": "^msg.*"
}
},
"required": ["name", "sessionID", "arguments", "messageID"]
"required": [
"name",
"sessionID",
"arguments",
"messageID"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"PermissionAction": {
"type": "string",
"enum": ["allow", "deny", "ask"]
"enum": [
"allow",
"deny",
"ask"
]
},
"PermissionRule": {
"type": "object",
@@ -7481,7 +8079,11 @@
"$ref": "#/components/schemas/PermissionAction"
}
},
"required": ["permission", "pattern", "action"]
"required": [
"permission",
"pattern",
"action"
]
},
"PermissionRuleset": {
"type": "array",
@@ -7525,7 +8127,11 @@
}
}
},
"required": ["additions", "deletions", "files"]
"required": [
"additions",
"deletions",
"files"
]
},
"share": {
"type": "object",
@@ -7534,7 +8140,9 @@
"type": "string"
}
},
"required": ["url"]
"required": [
"url"
]
},
"title": {
"type": "string"
@@ -7558,7 +8166,10 @@
"type": "number"
}
},
"required": ["created", "updated"]
"required": [
"created",
"updated"
]
},
"permission": {
"$ref": "#/components/schemas/PermissionRuleset"
@@ -7579,10 +8190,19 @@
"type": "string"
}
},
"required": ["messageID"]
"required": [
"messageID"
]
}
},
"required": ["id", "projectID", "directory", "title", "version", "time"]
"required": [
"id",
"projectID",
"directory",
"title",
"version",
"time"
]
},
"Event.session.created": {
"type": "object",
@@ -7598,10 +8218,15 @@
"$ref": "#/components/schemas/Session"
}
},
"required": ["info"]
"required": [
"info"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.session.updated": {
"type": "object",
@@ -7617,10 +8242,15 @@
"$ref": "#/components/schemas/Session"
}
},
"required": ["info"]
"required": [
"info"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.session.deleted": {
"type": "object",
@@ -7636,10 +8266,15 @@
"$ref": "#/components/schemas/Session"
}
},
"required": ["info"]
"required": [
"info"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.session.diff": {
"type": "object",
@@ -7661,10 +8296,16 @@
}
}
},
"required": ["sessionID", "diff"]
"required": [
"sessionID",
"diff"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.session.error": {
"type": "object",
@@ -7701,7 +8342,10 @@
}
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.file.watcher.updated": {
"type": "object",
@@ -7733,10 +8377,16 @@
]
}
},
"required": ["file", "event"]
"required": [
"file",
"event"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.vcs.branch.updated": {
"type": "object",
@@ -7754,7 +8404,10 @@
}
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Pty": {
"type": "object",
@@ -7780,13 +8433,24 @@
},
"status": {
"type": "string",
"enum": ["running", "exited"]
"enum": [
"running",
"exited"
]
},
"pid": {
"type": "number"
}
},
"required": ["id", "title", "command", "args", "cwd", "status", "pid"]
"required": [
"id",
"title",
"command",
"args",
"cwd",
"status",
"pid"
]
},
"Event.pty.created": {
"type": "object",
@@ -7802,10 +8466,15 @@
"$ref": "#/components/schemas/Pty"
}
},
"required": ["info"]
"required": [
"info"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.pty.updated": {
"type": "object",
@@ -7821,10 +8490,15 @@
"$ref": "#/components/schemas/Pty"
}
},
"required": ["info"]
"required": [
"info"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.pty.exited": {
"type": "object",
@@ -7844,10 +8518,16 @@
"type": "number"
}
},
"required": ["id", "exitCode"]
"required": [
"id",
"exitCode"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.pty.deleted": {
"type": "object",
@@ -7864,10 +8544,15 @@
"pattern": "^pty.*"
}
},
"required": ["id"]
"required": [
"id"
]
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.server.connected": {
"type": "object",
@@ -7881,7 +8566,10 @@
"properties": {}
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event.global.disposed": {
"type": "object",
@@ -7895,7 +8583,10 @@
"properties": {}
}
},
"required": ["type", "properties"]
"required": [
"type",
"properties"
]
},
"Event": {
"anyOf": [
@@ -8028,7 +8719,10 @@
"$ref": "#/components/schemas/Event"
}
},
"required": ["directory", "payload"]
"required": [
"directory",
"payload"
]
},
"BadRequestError": {
"type": "object",
@@ -8049,7 +8743,11 @@
"const": false
}
},
"required": ["data", "errors", "success"]
"required": [
"data",
"errors",
"success"
]
},
"NotFoundError": {
"type": "object",
@@ -8065,10 +8763,15 @@
"type": "string"
}
},
"required": ["message"]
"required": [
"message"
]
}
},
"required": ["name", "data"]
"required": [
"name",
"data"
]
},
"KeybindsConfig": {
"description": "Custom keybind configurations",
@@ -8515,7 +9218,12 @@
"LogLevel": {
"description": "Log level",
"type": "string",
"enum": ["DEBUG", "INFO", "WARN", "ERROR"]
"enum": [
"DEBUG",
"INFO",
"WARN",
"ERROR"
]
},
"ServerConfig": {
"description": "Server configuration for opencode serve and web commands",
@@ -8547,7 +9255,11 @@
},
"PermissionActionConfig": {
"type": "string",
"enum": ["ask", "allow", "deny"]
"enum": [
"ask",
"allow",
"deny"
]
},
"PermissionObjectConfig": {
"type": "object",
@@ -8671,7 +9383,11 @@
},
"mode": {
"type": "string",
"enum": ["subagent", "primary", "all"]
"enum": [
"subagent",
"primary",
"all"
]
},
"hidden": {
"description": "Hide this subagent from the @ autocomplete menu (default: false, only applies to mode: subagent)",
@@ -8771,10 +9487,15 @@
"properties": {
"field": {
"type": "string",
"enum": ["reasoning_content", "reasoning_details"]
"enum": [
"reasoning_content",
"reasoning_details"
]
}
},
"required": ["field"],
"required": [
"field"
],
"additionalProperties": false
}
]
@@ -8810,10 +9531,16 @@
"type": "number"
}
},
"required": ["input", "output"]
"required": [
"input",
"output"
]
}
},
"required": ["input", "output"]
"required": [
"input",
"output"
]
},
"limit": {
"type": "object",
@@ -8825,7 +9552,10 @@
"type": "number"
}
},
"required": ["context", "output"]
"required": [
"context",
"output"
]
},
"modalities": {
"type": "object",
@@ -8834,25 +9564,44 @@
"type": "array",
"items": {
"type": "string",
"enum": ["text", "audio", "image", "video", "pdf"]
"enum": [
"text",
"audio",
"image",
"video",
"pdf"
]
}
},
"output": {
"type": "array",
"items": {
"type": "string",
"enum": ["text", "audio", "image", "video", "pdf"]
"enum": [
"text",
"audio",
"image",
"video",
"pdf"
]
}
}
},
"required": ["input", "output"]
"required": [
"input",
"output"
]
},
"experimental": {
"type": "boolean"
},
"status": {
"type": "string",
"enum": ["alpha", "beta", "deprecated"]
"enum": [
"alpha",
"beta",
"deprecated"
]
},
"options": {
"type": "object",
@@ -8877,7 +9626,9 @@
"type": "string"
}
},
"required": ["npm"]
"required": [
"npm"
]
},
"variants": {
"description": "Variant-specific configuration",
@@ -8986,7 +9737,10 @@
"maximum": 9007199254740991
}
},
"required": ["type", "command"],
"required": [
"type",
"command"
],
"additionalProperties": false
},
"McpOAuthConfig": {
@@ -9052,13 +9806,19 @@
"maximum": 9007199254740991
}
},
"required": ["type", "url"],
"required": [
"type",
"url"
],
"additionalProperties": false
},
"LayoutConfig": {
"description": "@deprecated Always uses stretch layout.",
"type": "string",
"enum": ["auto", "stretch"]
"enum": [
"auto",
"stretch"
]
},
"Config": {
"type": "object",
@@ -9095,12 +9855,17 @@
"type": "boolean"
}
},
"required": ["enabled"]
"required": [
"enabled"
]
},
"diff_style": {
"description": "Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column",
"type": "string",
"enum": ["auto", "stacked"]
"enum": [
"auto",
"stacked"
]
}
}
},
@@ -9132,7 +9897,9 @@
"type": "boolean"
}
},
"required": ["template"]
"required": [
"template"
]
}
},
"watcher": {
@@ -9158,7 +9925,11 @@
"share": {
"description": "Control sharing behavior:'manual' allows manual sharing via commands, 'auto' enables automatic sharing, 'disabled' disables all sharing",
"type": "string",
"enum": ["manual", "auto", "disabled"]
"enum": [
"manual",
"auto",
"disabled"
]
},
"autoshare": {
"description": "@deprecated Use 'share' field instead. Share newly created sessions automatically",
@@ -9286,7 +10057,9 @@
"type": "boolean"
}
},
"required": ["enabled"],
"required": [
"enabled"
],
"additionalProperties": false
}
]
@@ -9356,7 +10129,9 @@
"const": true
}
},
"required": ["disabled"]
"required": [
"disabled"
]
},
{
"type": "object",
@@ -9393,7 +10168,9 @@
"additionalProperties": {}
}
},
"required": ["command"]
"required": [
"command"
]
}
]
}
@@ -9476,7 +10253,9 @@
}
}
},
"required": ["command"]
"required": [
"command"
]
}
}
},
@@ -9501,7 +10280,9 @@
}
}
},
"required": ["command"]
"required": [
"command"
]
}
}
}
@@ -9560,7 +10341,11 @@
},
"parameters": {}
},
"required": ["id", "description", "parameters"]
"required": [
"id",
"description",
"parameters"
]
},
"ToolList": {
"type": "array",
@@ -9587,7 +10372,13 @@
"type": "string"
}
},
"required": ["home", "state", "config", "worktree", "directory"]
"required": [
"home",
"state",
"config",
"worktree",
"directory"
]
},
"Worktree": {
"type": "object",
@@ -9602,7 +10393,11 @@
"type": "string"
}
},
"required": ["name", "branch", "directory"]
"required": [
"name",
"branch",
"directory"
]
},
"WorktreeCreateInput": {
"type": "object",
@@ -9622,7 +10417,9 @@
"type": "string"
}
},
"required": ["branch"]
"required": [
"branch"
]
},
"TextPartInput": {
"type": "object",
@@ -9653,7 +10450,9 @@
"type": "number"
}
},
"required": ["start"]
"required": [
"start"
]
},
"metadata": {
"type": "object",
@@ -9663,7 +10462,10 @@
"additionalProperties": {}
}
},
"required": ["type", "text"]
"required": [
"type",
"text"
]
},
"FilePartInput": {
"type": "object",
@@ -9688,7 +10490,11 @@
"$ref": "#/components/schemas/FilePartSource"
}
},
"required": ["type", "mime", "url"]
"required": [
"type",
"mime",
"url"
]
},
"AgentPartInput": {
"type": "object",
@@ -9720,10 +10526,17 @@
"maximum": 9007199254740991
}
},
"required": ["value", "start", "end"]
"required": [
"value",
"start",
"end"
]
}
},
"required": ["type", "name"]
"required": [
"type",
"name"
]
},
"SubtaskPartInput": {
"type": "object",
@@ -9748,7 +10561,12 @@
"type": "string"
}
},
"required": ["type", "prompt", "description", "agent"]
"required": [
"type",
"prompt",
"description",
"agent"
]
},
"Command": {
"type": "object",
@@ -9788,7 +10606,11 @@
}
}
},
"required": ["name", "template", "hints"]
"required": [
"name",
"template",
"hints"
]
},
"Model": {
"type": "object",
@@ -9812,7 +10634,11 @@
"type": "string"
}
},
"required": ["id", "url", "npm"]
"required": [
"id",
"url",
"npm"
]
},
"name": {
"type": "string"
@@ -9854,7 +10680,13 @@
"type": "boolean"
}
},
"required": ["text", "audio", "image", "video", "pdf"]
"required": [
"text",
"audio",
"image",
"video",
"pdf"
]
},
"output": {
"type": "object",
@@ -9875,7 +10707,13 @@
"type": "boolean"
}
},
"required": ["text", "audio", "image", "video", "pdf"]
"required": [
"text",
"audio",
"image",
"video",
"pdf"
]
},
"interleaved": {
"anyOf": [
@@ -9887,15 +10725,28 @@
"properties": {
"field": {
"type": "string",
"enum": ["reasoning_content", "reasoning_details"]
"enum": [
"reasoning_content",
"reasoning_details"
]
}
},
"required": ["field"]
"required": [
"field"
]
}
]
}
},
"required": ["temperature", "reasoning", "attachment", "toolcall", "input", "output", "interleaved"]
"required": [
"temperature",
"reasoning",
"attachment",
"toolcall",
"input",
"output",
"interleaved"
]
},
"cost": {
"type": "object",
@@ -9916,7 +10767,10 @@
"type": "number"
}
},
"required": ["read", "write"]
"required": [
"read",
"write"
]
},
"experimentalOver200K": {
"type": "object",
@@ -9937,13 +10791,24 @@
"type": "number"
}
},
"required": ["read", "write"]
"required": [
"read",
"write"
]
}
},
"required": ["input", "output", "cache"]
"required": [
"input",
"output",
"cache"
]
}
},
"required": ["input", "output", "cache"]
"required": [
"input",
"output",
"cache"
]
},
"limit": {
"type": "object",
@@ -9955,11 +10820,19 @@
"type": "number"
}
},
"required": ["context", "output"]
"required": [
"context",
"output"
]
},
"status": {
"type": "string",
"enum": ["alpha", "beta", "deprecated", "active"]
"enum": [
"alpha",
"beta",
"deprecated",
"active"
]
},
"options": {
"type": "object",
@@ -10019,7 +10892,12 @@
},
"source": {
"type": "string",
"enum": ["env", "config", "custom", "api"]
"enum": [
"env",
"config",
"custom",
"api"
]
},
"env": {
"type": "array",
@@ -10047,7 +10925,14 @@
}
}
},
"required": ["id", "name", "source", "env", "options", "models"]
"required": [
"id",
"name",
"source",
"env",
"options",
"models"
]
},
"ProviderAuthMethod": {
"type": "object",
@@ -10068,7 +10953,10 @@
"type": "string"
}
},
"required": ["type", "label"]
"required": [
"type",
"label"
]
},
"ProviderAuthAuthorization": {
"type": "object",
@@ -10092,7 +10980,11 @@
"type": "string"
}
},
"required": ["url", "method", "instructions"]
"required": [
"url",
"method",
"instructions"
]
},
"Symbol": {
"type": "object",
@@ -10113,10 +11005,17 @@
"$ref": "#/components/schemas/Range"
}
},
"required": ["uri", "range"]
"required": [
"uri",
"range"
]
}
},
"required": ["name", "kind", "location"]
"required": [
"name",
"kind",
"location"
]
},
"FileNode": {
"type": "object",
@@ -10132,13 +11031,22 @@
},
"type": {
"type": "string",
"enum": ["file", "directory"]
"enum": [
"file",
"directory"
]
},
"ignored": {
"type": "boolean"
}
},
"required": ["name", "path", "absolute", "type", "ignored"]
"required": [
"name",
"path",
"absolute",
"type",
"ignored"
]
},
"FileContent": {
"type": "object",
@@ -10192,14 +11100,24 @@
}
}
},
"required": ["oldStart", "oldLines", "newStart", "newLines", "lines"]
"required": [
"oldStart",
"oldLines",
"newStart",
"newLines",
"lines"
]
}
},
"index": {
"type": "string"
}
},
"required": ["oldFileName", "newFileName", "hunks"]
"required": [
"oldFileName",
"newFileName",
"hunks"
]
},
"encoding": {
"type": "string",
@@ -10209,7 +11127,10 @@
"type": "string"
}
},
"required": ["type", "content"]
"required": [
"type",
"content"
]
},
"File": {
"type": "object",
@@ -10229,10 +11150,19 @@
},
"status": {
"type": "string",
"enum": ["added", "deleted", "modified"]
"enum": [
"added",
"deleted",
"modified"
]
}
},
"required": ["path", "added", "removed", "status"]
"required": [
"path",
"added",
"removed",
"status"
]
},
"Agent": {
"type": "object",
@@ -10245,7 +11175,11 @@
},
"mode": {
"type": "string",
"enum": ["subagent", "primary", "all"]
"enum": [
"subagent",
"primary",
"all"
]
},
"native": {
"type": "boolean"
@@ -10275,7 +11209,10 @@
"type": "string"
}
},
"required": ["modelID", "providerID"]
"required": [
"modelID",
"providerID"
]
},
"prompt": {
"type": "string"
@@ -10293,7 +11230,12 @@
"maximum": 9007199254740991
}
},
"required": ["name", "mode", "permission", "options"]
"required": [
"name",
"mode",
"permission",
"options"
]
},
"MCPStatusConnected": {
"type": "object",
@@ -10303,7 +11245,9 @@
"const": "connected"
}
},
"required": ["status"]
"required": [
"status"
]
},
"MCPStatusDisabled": {
"type": "object",
@@ -10313,7 +11257,9 @@
"const": "disabled"
}
},
"required": ["status"]
"required": [
"status"
]
},
"MCPStatusFailed": {
"type": "object",
@@ -10326,7 +11272,10 @@
"type": "string"
}
},
"required": ["status", "error"]
"required": [
"status",
"error"
]
},
"MCPStatusNeedsAuth": {
"type": "object",
@@ -10336,7 +11285,9 @@
"const": "needs_auth"
}
},
"required": ["status"]
"required": [
"status"
]
},
"MCPStatusNeedsClientRegistration": {
"type": "object",
@@ -10349,7 +11300,10 @@
"type": "string"
}
},
"required": ["status", "error"]
"required": [
"status",
"error"
]
},
"MCPStatus": {
"anyOf": [
@@ -10389,7 +11343,11 @@
"type": "string"
}
},
"required": ["name", "uri", "client"]
"required": [
"name",
"uri",
"client"
]
},
"LSPStatus": {
"type": "object",
@@ -10416,7 +11374,12 @@
]
}
},
"required": ["id", "name", "root", "status"]
"required": [
"id",
"name",
"root",
"status"
]
},
"FormatterStatus": {
"type": "object",
@@ -10434,7 +11397,11 @@
"type": "boolean"
}
},
"required": ["name", "extensions", "enabled"]
"required": [
"name",
"extensions",
"enabled"
]
},
"OAuth": {
"type": "object",
@@ -10456,7 +11423,12 @@
"type": "string"
}
},
"required": ["type", "refresh", "access", "expires"]
"required": [
"type",
"refresh",
"access",
"expires"
]
},
"ApiAuth": {
"type": "object",
@@ -10469,7 +11441,10 @@
"type": "string"
}
},
"required": ["type", "key"]
"required": [
"type",
"key"
]
},
"WellKnownAuth": {
"type": "object",
@@ -10485,7 +11460,11 @@
"type": "string"
}
},
"required": ["type", "key", "token"]
"required": [
"type",
"key",
"token"
]
},
"Auth": {
"anyOf": [
@@ -10502,4 +11481,4 @@
}
}
}
}
}