diff --git a/packages/opencode/src/server/routes/instance/httpapi/handlers/instance.ts b/packages/opencode/src/server/routes/instance/httpapi/handlers/instance.ts index 50a7fecfa7..4ae318ef21 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/handlers/instance.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/handlers/instance.ts @@ -38,7 +38,9 @@ export const instanceHandlers = HttpApiBuilder.group(InstanceHttpApi, "instance" }) const getVcs = Effect.fn("InstanceHttpApi.vcs")(function* () { - const [branch, default_branch] = yield* Effect.all([vcs.branch(), vcs.defaultBranch()], { concurrency: 2 }) + const [branch, default_branch] = yield* Effect.all([vcs.branch(), vcs.defaultBranch()], { + concurrency: "unbounded", + }) return { branch, default_branch } }) 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 df2b40de56..1fb2455ab5 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts @@ -36,6 +36,12 @@ import { } from "../groups/session" import * as SessionError from "./session-errors" +const tryParseJson = (text: string) => + Effect.try({ + try: () => JSON.parse(text) as unknown, + catch: () => new HttpApiError.BadRequest({}), + }) + export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", (handlers) => Effect.gen(function* () { const session = yield* Session.Service @@ -160,10 +166,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", 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 json = yield* tryParseJson(body) const payload = yield* Schema.decodeUnknownEffect(Session.CreateInput)(json).pipe( Effect.mapError(() => new HttpApiError.BadRequest({})), ) @@ -211,10 +214,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", 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 json = yield* tryParseJson(body) const payload = yield* Schema.decodeUnknownEffect(ForkPayload)(json).pipe( Effect.mapError(() => new HttpApiError.BadRequest({})), ) diff --git a/packages/opencode/src/server/routes/instance/httpapi/handlers/sync.ts b/packages/opencode/src/server/routes/instance/httpapi/handlers/sync.ts index 152d22f98e..ffe8d0baa4 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/handlers/sync.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/handlers/sync.ts @@ -11,7 +11,7 @@ import { lte } from "drizzle-orm" import { not } from "drizzle-orm" import { or } from "drizzle-orm" import { Effect, Scope } from "effect" -import { HttpApiBuilder } from "effect/unstable/httpapi" +import { HttpApiBuilder, HttpApiError } from "effect/unstable/httpapi" import { InstanceHttpApi } from "../api" import { HistoryPayload, ReplayPayload, SessionPayload } from "../groups/sync" import * as Log from "@opencode-ai/core/util/log" @@ -59,7 +59,7 @@ export const syncHandlers = HttpApiBuilder.group(InstanceHttpApi, "sync", (handl const steal = Effect.fn("SyncHttpApi.steal")(function* (ctx: { payload: typeof SessionPayload.Type }) { const workspaceID = yield* InstanceState.workspaceID - if (!workspaceID) throw new Error("Cannot steal session without workspace context") + if (!workspaceID) return yield* new HttpApiError.BadRequest({}) yield* sync.run(Session.Event.Updated, { sessionID: ctx.payload.sessionID,