From a99ebd1d65750ecf48375ca75e00d35172fda53c Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Mon, 25 May 2026 15:56:52 -0400 Subject: [PATCH] fix(httpapi): model optional session payloads as no content (#29247) --- .../routes/instance/httpapi/groups/session.ts | 2 +- .../test/server/httpapi-session.test.ts | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts b/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts index cd2f3be19c..29b98d16d4 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts @@ -236,7 +236,7 @@ export const SessionApi = HttpApi.make("session") HttpApiEndpoint.post("fork", SessionPaths.fork, { params: { sessionID: SessionID }, query: WorkspaceRoutingQuery, - payload: Schema.optional(ForkPayload), + payload: [HttpApiSchema.NoContent, ForkPayload], success: described(Session.Info, "200"), error: [HttpApiError.BadRequest, ApiNotFoundError], }).annotateMerge( diff --git a/packages/opencode/test/server/httpapi-session.test.ts b/packages/opencode/test/server/httpapi-session.test.ts index 1e87ddc6b1..5c8f3fb24e 100644 --- a/packages/opencode/test/server/httpapi-session.test.ts +++ b/packages/opencode/test/server/httpapi-session.test.ts @@ -602,6 +602,32 @@ describe("session HttpApi", () => { }) expect(forked.id).not.toBe(created.id) + const forkedWithoutContentType = yield* requestJson( + pathFor(SessionPaths.fork, { sessionID: created.id }), + { + method: "POST", + headers: { "x-opencode-directory": test.directory }, + }, + ) + expect(forkedWithoutContentType.id).not.toBe(created.id) + + const invalidFork = yield* request(pathFor(SessionPaths.fork, { sessionID: created.id }), { + method: "POST", + headers, + body: "{", + }) + expect(invalidFork.status).toBe(400) + + const forkedWhitespace = yield* requestJson( + pathFor(SessionPaths.fork, { sessionID: created.id }), + { + method: "POST", + headers, + body: " \n", + }, + ) + expect(forkedWhitespace.id).not.toBe(created.id) + expect( yield* requestJson(pathFor(SessionPaths.abort, { sessionID: created.id }), { method: "POST",