+7


![opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com>](/assets/img/avatar_default.png)



![opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>](/assets/img/avatar_default.png)


Kit Langton
Brendan Allan
opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Affan Ali
affanali2k3
Frank
opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com>
James Long
Aiden Cline
Jay V
Dax Raad
Aarav Sareen
OpeOginni
Luke Parker
Ben Guthrie
Dax
Filip
41283933ff
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Affan Ali <93028901+affanali2k3@users.noreply.github.com> Co-authored-by: affanali2k3 <affanalikhanxx@gmail.com> Co-authored-by: Frank <frank@anoma.ly> Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> Co-authored-by: James Long <longster@gmail.com> Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Co-authored-by: Jay V <air@live.ca> Co-authored-by: Dax Raad <d@ironbay.co> Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com> Co-authored-by: OpeOginni <107570612+OpeOginni@users.noreply.github.com> Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com> Co-authored-by: Ben Guthrie <benjee.012@gmail.com> Co-authored-by: Dax <mail@thdxr.com> Co-authored-by: Filip <34747899+neriousy@users.noreply.github.com>
68 lines
2.4 KiB
TypeScript
68 lines
2.4 KiB
TypeScript
import { Database } from "@opencode-ai/core/database/database"
|
|
import { LocationServiceMap } from "@opencode-ai/core/location-services"
|
|
import { Location } from "@opencode-ai/core/location"
|
|
import { AbsolutePath } from "@opencode-ai/core/schema"
|
|
import { SessionV2 } from "@opencode-ai/core/session"
|
|
import { SessionTable } from "@opencode-ai/core/session/sql"
|
|
import { WorkspaceV2 } from "@opencode-ai/core/workspace"
|
|
import { eq } from "drizzle-orm"
|
|
import { Effect, Layer, Schema } from "effect"
|
|
import { HttpRouter } from "effect/unstable/http"
|
|
import { HttpApiMiddleware } from "effect/unstable/httpapi"
|
|
import { InvalidRequestError, SessionNotFoundError } from "@opencode-ai/protocol/errors"
|
|
import type { LocationServices } from "../location"
|
|
|
|
export class SessionLocationMiddleware extends HttpApiMiddleware.Service<
|
|
SessionLocationMiddleware,
|
|
{ provides: LocationServices }
|
|
>()("@opencode/HttpApiSessionLocation", {
|
|
error: [InvalidRequestError, SessionNotFoundError],
|
|
}) {}
|
|
|
|
const decodeSessionID = Schema.decodeUnknownEffect(SessionV2.ID)
|
|
|
|
export const sessionLocationLayer = Layer.effect(
|
|
SessionLocationMiddleware,
|
|
Effect.gen(function* () {
|
|
const { db } = yield* Database.Service
|
|
const locations = yield* LocationServiceMap.Service
|
|
|
|
return SessionLocationMiddleware.of((effect) =>
|
|
Effect.gen(function* () {
|
|
const route = yield* HttpRouter.RouteContext
|
|
const sessionID = yield* decodeSessionID(route.params.sessionID).pipe(
|
|
Effect.mapError(
|
|
() =>
|
|
new InvalidRequestError({
|
|
message: "Invalid session ID",
|
|
field: "sessionID",
|
|
}),
|
|
),
|
|
)
|
|
const row = yield* db
|
|
.select({ directory: SessionTable.directory, workspaceID: SessionTable.workspace_id })
|
|
.from(SessionTable)
|
|
.where(eq(SessionTable.id, sessionID))
|
|
.get()
|
|
.pipe(Effect.orDie)
|
|
if (!row)
|
|
return yield* new SessionNotFoundError({
|
|
sessionID,
|
|
message: `Session not found: ${sessionID}`,
|
|
})
|
|
|
|
return yield* effect.pipe(
|
|
Effect.provide(
|
|
locations.get(
|
|
Location.Ref.make({
|
|
directory: AbsolutePath.make(row.directory),
|
|
workspaceID: row.workspaceID ? WorkspaceV2.ID.make(row.workspaceID) : undefined,
|
|
}),
|
|
),
|
|
),
|
|
)
|
|
}),
|
|
)
|
|
}),
|
|
)
|