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",