summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorKit Langton <[email protected]>2026-04-28 09:23:54 -0400
committerGitHub <[email protected]>2026-04-28 09:23:54 -0400
commite57d0c2fee02199c7ee2f38a968a5d06df55b622 (patch)
tree894b1c76d585c7f931156187014edf75dc1c5631
parent2a4f2bf527050a2ff89ccf53b65ab605caf883c4 (diff)
downloadopencode-e57d0c2fee02199c7ee2f38a968a5d06df55b622.tar.gz
opencode-e57d0c2fee02199c7ee2f38a968a5d06df55b622.zip
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.
-rw-r--r--packages/opencode/src/server/routes/instance/httpapi/tui.ts5
-rw-r--r--packages/opencode/test/server/httpapi-tui.test.ts13
2 files changed, 16 insertions, 2 deletions
diff --git a/packages/opencode/src/server/routes/instance/httpapi/tui.ts b/packages/opencode/src/server/routes/instance/httpapi/tui.ts
index c5695cf07..36004ea25 100644
--- a/packages/opencode/src/server/routes/instance/httpapi/tui.ts
+++ b/packages/opencode/src/server/routes/instance/httpapi/tui.ts
@@ -61,6 +61,7 @@ export const TuiApi = HttpApi.make("tui")
HttpApiEndpoint.post("appendPrompt", TuiPaths.appendPrompt, {
payload: TuiEvent.PromptAppend.properties,
success: Schema.Boolean,
+ error: HttpApiError.BadRequest,
}).annotateMerge(
OpenApi.annotations({
identifier: "tui.appendPrompt",
@@ -113,6 +114,7 @@ export const TuiApi = HttpApi.make("tui")
HttpApiEndpoint.post("executeCommand", TuiPaths.executeCommand, {
payload: CommandPayload,
success: Schema.Boolean,
+ error: HttpApiError.BadRequest,
}).annotateMerge(
OpenApi.annotations({
identifier: "tui.executeCommand",
@@ -133,6 +135,7 @@ export const TuiApi = HttpApi.make("tui")
HttpApiEndpoint.post("publish", TuiPaths.publish, {
payload: TuiPublishPayload,
success: Schema.Boolean,
+ error: HttpApiError.BadRequest,
}).annotateMerge(
OpenApi.annotations({
identifier: "tui.publish",
@@ -143,7 +146,7 @@ export const TuiApi = HttpApi.make("tui")
HttpApiEndpoint.post("selectSession", TuiPaths.selectSession, {
payload: TuiEvent.SessionSelect.properties,
success: Schema.Boolean,
- error: HttpApiError.NotFound,
+ error: [HttpApiError.BadRequest, HttpApiError.NotFound],
}).annotateMerge(
OpenApi.annotations({
identifier: "tui.selectSession",
diff --git a/packages/opencode/test/server/httpapi-tui.test.ts b/packages/opencode/test/server/httpapi-tui.test.ts
index f47d11c67..e6364fc88 100644
--- a/packages/opencode/test/server/httpapi-tui.test.ts
+++ b/packages/opencode/test/server/httpapi-tui.test.ts
@@ -5,9 +5,11 @@ import { Flag } from "@opencode-ai/core/flag/flag"
import { SessionID } from "../../src/session/schema"
import { Instance } from "../../src/project/instance"
import { InstanceRoutes } from "../../src/server/routes/instance"
-import { TuiPaths } from "../../src/server/routes/instance/httpapi/tui"
+import { TuiApi, TuiPaths } from "../../src/server/routes/instance/httpapi/tui"
import { callTui } from "../../src/server/routes/instance/tui"
+import { Server } from "../../src/server/server"
import * as Log from "@opencode-ai/core/util/log"
+import { OpenApi } from "effect/unstable/httpapi"
import { resetDatabase } from "../fixture/db"
import { tmpdir } from "../fixture/fixture"
@@ -38,6 +40,15 @@ afterEach(async () => {
})
describe("tui HttpApi bridge", () => {
+ test("documents legacy bad request responses", async () => {
+ const legacy = await Server.openapi()
+ const effect = OpenApi.fromApi(TuiApi)
+ for (const path of [TuiPaths.appendPrompt, TuiPaths.executeCommand, TuiPaths.publish, TuiPaths.selectSession]) {
+ expect(legacy.paths[path].post?.responses?.[400]).toBeDefined()
+ expect(effect.paths[path].post?.responses?.[400]).toBeDefined()
+ }
+ })
+
test("serves TUI command and event routes through experimental Effect routes", async () => {
await using tmp = await tmpdir({ git: true, config: { formatter: false, lsp: false } })
const headers = { "x-opencode-directory": tmp.path }