diff options
| author | Kit Langton <[email protected]> | 2026-04-27 13:17:11 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-04-27 17:17:11 +0000 |
| commit | 55ecb0674846ad9f914fd852c53ad8e8deab7da4 (patch) | |
| tree | 925b9919c93a808d1582ba8feb24dcf34166bda3 /packages | |
| parent | dc6991e5a8efd963a43e8834a35706ec67f6a903 (diff) | |
| download | opencode-55ecb0674846ad9f914fd852c53ad8e8deab7da4.tar.gz opencode-55ecb0674846ad9f914fd852c53ad8e8deab7da4.zip | |
fix(httpapi): accept empty session create body (#24640)
Diffstat (limited to 'packages')
| -rw-r--r-- | packages/opencode/src/server/routes/instance/httpapi/session.ts | 22 | ||||
| -rw-r--r-- | packages/opencode/test/server/httpapi-session.test.ts | 8 |
2 files changed, 27 insertions, 3 deletions
diff --git a/packages/opencode/src/server/routes/instance/httpapi/session.ts b/packages/opencode/src/server/routes/instance/httpapi/session.ts index 08bf424f4..0d25c5bd9 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/session.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/session.ts @@ -203,7 +203,7 @@ export const SessionApi = HttpApi.make("session") }), ), HttpApiEndpoint.post("create", SessionPaths.create, { - payload: Session.CreateInput, + payload: [HttpApiSchema.NoContent, Session.CreateInput], success: Session.Info, }).annotateMerge( OpenApi.annotations({ @@ -513,7 +513,7 @@ export const sessionHandlers = Layer.unwrap( ) }) - const create = Effect.fn("SessionHttpApi.create")(function* (ctx: { payload: Session.CreateInput }) { + const create = Effect.fn("SessionHttpApi.create")(function* (ctx: { payload?: Session.CreateInput }) { const instance = yield* InstanceState.context return yield* Effect.promise(() => Instance.restore(instance, () => @@ -524,6 +524,22 @@ export const sessionHandlers = Layer.unwrap( ) }) + const createRaw = Effect.fn("SessionHttpApi.createRaw")(function* (ctx: { + request: HttpServerRequest.HttpServerRequest + }) { + const body = yield* Effect.orDie(ctx.request.text) + if (body.trim().length === 0) return yield* create({}) + + const json = yield* Effect.try({ + try: () => JSON.parse(body) as unknown, + catch: () => new HttpApiError.BadRequest({}), + }) + const payload = yield* Schema.decodeUnknownEffect(Session.CreateInput)(json).pipe( + Effect.mapError(() => new HttpApiError.BadRequest({})), + ) + return yield* create({ payload }) + }) + const remove = Effect.fn("SessionHttpApi.remove")(function* (ctx: { params: { sessionID: SessionID } }) { const instance = yield* InstanceState.context yield* Effect.promise(() => @@ -894,7 +910,7 @@ export const sessionHandlers = Layer.unwrap( .handle("diff", diff) .handle("messages", messages) .handle("message", message) - .handle("create", create) + .handleRaw("create", createRaw) .handle("remove", remove) .handle("update", update) .handle("fork", fork) diff --git a/packages/opencode/test/server/httpapi-session.test.ts b/packages/opencode/test/server/httpapi-session.test.ts index e6c091982..d1d36c7d4 100644 --- a/packages/opencode/test/server/httpapi-session.test.ts +++ b/packages/opencode/test/server/httpapi-session.test.ts @@ -151,6 +151,14 @@ describe("session HttpApi", () => { await using tmp = await tmpdir({ git: true, config: { formatter: false, lsp: false, share: "disabled" } }) const headers = { "x-opencode-directory": tmp.path, "content-type": "application/json" } + const createdEmpty = await json<Session.Info>( + await app().request(SessionPaths.create, { + method: "POST", + headers, + }), + ) + expect(createdEmpty.id).toBeTruthy() + const created = await json<Session.Info>( await app().request(SessionPaths.create, { method: "POST", |
