Skip to content

Commit e57d0c2

Browse files
authored
fix(httpapi): document tui bad request responses
Document legacy 400 bad-request responses on TUI Effect HttpApi payload-validation endpoints and cover them with OpenAPI parity tests.
1 parent 2a4f2bf commit e57d0c2

2 files changed

Lines changed: 16 additions & 2 deletions

File tree

packages/opencode/src/server/routes/instance/httpapi/tui.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ export const TuiApi = HttpApi.make("tui")
6161
HttpApiEndpoint.post("appendPrompt", TuiPaths.appendPrompt, {
6262
payload: TuiEvent.PromptAppend.properties,
6363
success: Schema.Boolean,
64+
error: HttpApiError.BadRequest,
6465
}).annotateMerge(
6566
OpenApi.annotations({
6667
identifier: "tui.appendPrompt",
@@ -113,6 +114,7 @@ export const TuiApi = HttpApi.make("tui")
113114
HttpApiEndpoint.post("executeCommand", TuiPaths.executeCommand, {
114115
payload: CommandPayload,
115116
success: Schema.Boolean,
117+
error: HttpApiError.BadRequest,
116118
}).annotateMerge(
117119
OpenApi.annotations({
118120
identifier: "tui.executeCommand",
@@ -133,6 +135,7 @@ export const TuiApi = HttpApi.make("tui")
133135
HttpApiEndpoint.post("publish", TuiPaths.publish, {
134136
payload: TuiPublishPayload,
135137
success: Schema.Boolean,
138+
error: HttpApiError.BadRequest,
136139
}).annotateMerge(
137140
OpenApi.annotations({
138141
identifier: "tui.publish",
@@ -143,7 +146,7 @@ export const TuiApi = HttpApi.make("tui")
143146
HttpApiEndpoint.post("selectSession", TuiPaths.selectSession, {
144147
payload: TuiEvent.SessionSelect.properties,
145148
success: Schema.Boolean,
146-
error: HttpApiError.NotFound,
149+
error: [HttpApiError.BadRequest, HttpApiError.NotFound],
147150
}).annotateMerge(
148151
OpenApi.annotations({
149152
identifier: "tui.selectSession",

packages/opencode/test/server/httpapi-tui.test.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ import { Flag } from "@opencode-ai/core/flag/flag"
55
import { SessionID } from "../../src/session/schema"
66
import { Instance } from "../../src/project/instance"
77
import { InstanceRoutes } from "../../src/server/routes/instance"
8-
import { TuiPaths } from "../../src/server/routes/instance/httpapi/tui"
8+
import { TuiApi, TuiPaths } from "../../src/server/routes/instance/httpapi/tui"
99
import { callTui } from "../../src/server/routes/instance/tui"
10+
import { Server } from "../../src/server/server"
1011
import * as Log from "@opencode-ai/core/util/log"
12+
import { OpenApi } from "effect/unstable/httpapi"
1113
import { resetDatabase } from "../fixture/db"
1214
import { tmpdir } from "../fixture/fixture"
1315

@@ -38,6 +40,15 @@ afterEach(async () => {
3840
})
3941

4042
describe("tui HttpApi bridge", () => {
43+
test("documents legacy bad request responses", async () => {
44+
const legacy = await Server.openapi()
45+
const effect = OpenApi.fromApi(TuiApi)
46+
for (const path of [TuiPaths.appendPrompt, TuiPaths.executeCommand, TuiPaths.publish, TuiPaths.selectSession]) {
47+
expect(legacy.paths[path].post?.responses?.[400]).toBeDefined()
48+
expect(effect.paths[path].post?.responses?.[400]).toBeDefined()
49+
}
50+
})
51+
4152
test("serves TUI command and event routes through experimental Effect routes", async () => {
4253
await using tmp = await tmpdir({ git: true, config: { formatter: false, lsp: false } })
4354
const headers = { "x-opencode-directory": tmp.path }

0 commit comments

Comments
 (0)