diff --git a/packages/opencode/src/project/instance-store.ts b/packages/opencode/src/project/instance-store.ts index 4fa1c3dfff..9707305f93 100644 --- a/packages/opencode/src/project/instance-store.ts +++ b/packages/opencode/src/project/instance-store.ts @@ -86,7 +86,7 @@ export const layer: Layer.Layer runDisposers(ctx.directory)) yield* emitDisposed({ directory: ctx.directory, project: ctx.project.id }) }) @@ -109,7 +109,7 @@ export const layer: Layer.Layer() } cache.set(directory, entry) yield* Effect.gen(function* () { - yield* Effect.logInfo("creating instance", { directory }) + yield* Effect.logInfo("creating instance").pipe(Effect.annotateLogs("directory", directory)) yield* completeLoad(directory, input, entry) }).pipe(Effect.forkIn(scope, { startImmediately: true })) return yield* restore(Deferred.await(entry.deferred)) @@ -125,7 +125,7 @@ export const layer: Layer.Layer() } cache.set(directory, entry) yield* Effect.gen(function* () { - yield* Effect.logInfo("reloading instance", { directory }) + yield* Effect.logInfo("reloading instance").pipe(Effect.annotateLogs("directory", directory)) if (previous) { yield* Deferred.await(previous.deferred).pipe(Effect.ignore) yield* Effect.promise(() => runDisposers(directory)) 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 ea68e76caf..2053aba3b4 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/groups/session.ts @@ -236,9 +236,9 @@ export const SessionApi = HttpApi.make("session") HttpApiEndpoint.post("fork", SessionPaths.fork, { params: { sessionID: SessionID }, query: WorkspaceRoutingQuery, - payload: ForkPayload, + payload: Schema.optional(ForkPayload), success: described(Session.Info, "200"), - error: ApiNotFoundError, + error: [HttpApiError.BadRequest, ApiNotFoundError], }).annotateMerge( OpenApi.annotations({ identifier: "session.fork", diff --git a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts index 6aa87ee84e..9230a6fe57 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts @@ -187,13 +187,30 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", const fork = Effect.fn("SessionHttpApi.fork")(function* (ctx: { params: { sessionID: SessionID } - payload: typeof ForkPayload.Type + payload?: typeof ForkPayload.Type }) { return yield* SessionError.mapStorageNotFound( - session.fork({ sessionID: ctx.params.sessionID, messageID: ctx.payload.messageID }), + session.fork({ sessionID: ctx.params.sessionID, messageID: ctx.payload?.messageID }), ) }) + const forkRaw = Effect.fn("SessionHttpApi.forkRaw")(function* (ctx: { + params: { sessionID: SessionID } + request: HttpServerRequest.HttpServerRequest + }) { + const body = yield* Effect.orDie(ctx.request.text) + if (body.trim().length === 0) return yield* fork({ params: ctx.params }) + + const json = yield* Effect.try({ + try: () => JSON.parse(body) as unknown, + catch: () => new HttpApiError.BadRequest({}), + }) + const payload = yield* Schema.decodeUnknownEffect(ForkPayload)(json).pipe( + Effect.mapError(() => new HttpApiError.BadRequest({})), + ) + return yield* fork({ params: ctx.params, payload }) + }) + const abort = Effect.fn("SessionHttpApi.abort")(function* (ctx: { params: { sessionID: SessionID } }) { yield* promptSvc.cancel(ctx.params.sessionID) return true @@ -373,7 +390,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", .handleRaw("create", createRaw) .handle("remove", remove) .handle("update", update) - .handle("fork", fork) + .handleRaw("fork", forkRaw) .handle("abort", abort) .handle("init", init) .handle("share", share) diff --git a/packages/opencode/test/server/httpapi-session.test.ts b/packages/opencode/test/server/httpapi-session.test.ts index 24c845183d..210863e0c9 100644 --- a/packages/opencode/test/server/httpapi-session.test.ts +++ b/packages/opencode/test/server/httpapi-session.test.ts @@ -356,7 +356,6 @@ describe("session HttpApi", () => { const forked = yield* requestJson(pathFor(SessionPaths.fork, { sessionID: created.id }), { method: "POST", headers, - body: JSON.stringify({}), }) expect(forked.id).not.toBe(created.id)