diff --git a/packages/opencode/src/server/tui.ts b/packages/opencode/src/server/tui.ts index 60ac5eef..48c79ae0 100644 --- a/packages/opencode/src/server/tui.ts +++ b/packages/opencode/src/server/tui.ts @@ -1,10 +1,14 @@ import { Hono, type Context } from "hono" +import { describeRoute, resolver, validator } from "hono-openapi" +import { z } from "zod" import { AsyncQueue } from "../util/queue" -interface Request { - path: string - body: any -} +const TuiRequest = z.object({ + path: z.string(), + body: z.any(), +}) + +type Request = z.infer const request = new AsyncQueue() const response = new AsyncQueue() @@ -19,12 +23,47 @@ export async function callTui(ctx: Context) { } export const TuiRoute = new Hono() - .get("/next", async (c) => { - const req = await request.next() - return c.json(req) - }) - .post("/response", async (c) => { - const body = await c.req.json() - response.push(body) - return c.json(true) - }) + .get( + "/next", + describeRoute({ + description: "Get the next TUI request from the queue", + operationId: "tui.control.next", + responses: { + 200: { + description: "Next TUI request", + content: { + "application/json": { + schema: resolver(TuiRequest), + }, + }, + }, + }, + }), + async (c) => { + const req = await request.next() + return c.json(req) + }, + ) + .post( + "/response", + describeRoute({ + description: "Submit a response to the TUI request queue", + operationId: "tui.control.response", + responses: { + 200: { + description: "Response submitted successfully", + content: { + "application/json": { + schema: resolver(z.boolean()), + }, + }, + }, + }, + }), + validator("json", z.any()), + async (c) => { + const body = c.req.valid("json") + response.push(body) + return c.json(true) + }, + )