summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
authorKit Langton <[email protected]>2026-04-27 13:17:11 -0400
committerGitHub <[email protected]>2026-04-27 17:17:11 +0000
commit55ecb0674846ad9f914fd852c53ad8e8deab7da4 (patch)
tree925b9919c93a808d1582ba8feb24dcf34166bda3 /packages
parentdc6991e5a8efd963a43e8834a35706ec67f6a903 (diff)
downloadopencode-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.ts22
-rw-r--r--packages/opencode/test/server/httpapi-session.test.ts8
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",