Skip to content

Commit b46cec2

Browse files
authored
fix(httpapi): model optional worktree payload as no content (#29246)
1 parent a99ebd1 commit b46cec2

3 files changed

Lines changed: 26 additions & 4 deletions

File tree

packages/opencode/src/server/routes/instance/httpapi/groups/experimental.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Session } from "@/session/session"
55
import { Worktree } from "@/worktree"
66
import { NonNegativeInt } from "@opencode-ai/core/schema"
77
import { Schema } from "effect"
8-
import { HttpApi, HttpApiEndpoint, HttpApiError, HttpApiGroup, OpenApi } from "effect/unstable/httpapi"
8+
import { HttpApi, HttpApiEndpoint, HttpApiError, HttpApiGroup, HttpApiSchema, OpenApi } from "effect/unstable/httpapi"
99
import { Authorization } from "../middleware/authorization"
1010
import { InstanceContextMiddleware } from "../middleware/instance-context"
1111
import {
@@ -168,7 +168,7 @@ export const ExperimentalApi = HttpApi.make("experimental")
168168
HttpApiEndpoint.post("worktreeCreate", ExperimentalPaths.worktree, {
169169
disableCodecs: true,
170170
query: WorkspaceRoutingQuery,
171-
payload: Schema.UndefinedOr(Worktree.CreateInput),
171+
payload: [HttpApiSchema.NoContent, Worktree.CreateInput],
172172
success: described(Worktree.Info, "Worktree created"),
173173
error: WorktreeApiError,
174174
}).annotateMerge(

packages/opencode/src/server/routes/instance/httpapi/handlers/experimental.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,9 @@ export const experimentalHandlers = HttpApiBuilder.group(InstanceHttpApi, "exper
104104
})
105105

106106
const worktreeCreate = Effect.fn("ExperimentalHttpApi.worktreeCreate")(function* (ctx: {
107-
payload: Worktree.CreateInput | undefined
107+
payload: typeof Worktree.CreateInput.Type | void
108108
}) {
109-
return yield* mapWorktreeError(worktreeSvc.create(ctx.payload))
109+
return yield* mapWorktreeError(worktreeSvc.create(ctx.payload ?? undefined))
110110
})
111111

112112
const worktreeRemove = Effect.fn("ExperimentalHttpApi.worktreeRemove")(function* (input: {

packages/opencode/test/server/worktree-endpoint-repro.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,28 @@ describe("worktree endpoint reproduction", () => {
228228
{ git: true },
229229
)
230230

231+
worktreeTest(
232+
"direct HttpApi worktree create rejects explicit null payload",
233+
() =>
234+
Effect.gen(function* () {
235+
const test = yield* TestInstance
236+
const server = yield* serverScoped()
237+
238+
const response = yield* request(
239+
server,
240+
`${ExperimentalPaths.worktree}?directory=${encodeURIComponent(test.directory)}`,
241+
{
242+
method: "POST",
243+
headers: { "content-type": "application/json" },
244+
body: "null",
245+
},
246+
)
247+
248+
expect(response.status).toBe(400)
249+
}),
250+
{ git: true },
251+
)
252+
231253
worktreeTest(
232254
"workspace worktree create does not hang",
233255
() =>

0 commit comments

Comments
 (0)