Compare commits

...
Sign in to create a new pull request.

1 commit

Author SHA1 Message Date
Kit Langton
19d51650f6 feat(opencode): add request route spans 2026-04-15 13:12:42 -04:00
3 changed files with 56 additions and 33 deletions

View file

@ -5,12 +5,10 @@ import { Config } from "../../config/config"
import { Provider } from "../../provider/provider" import { Provider } from "../../provider/provider"
import { mapValues } from "remeda" import { mapValues } from "remeda"
import { errors } from "../error" import { errors } from "../error"
import { Log } from "../../util/log"
import { lazy } from "../../util/lazy" import { lazy } from "../../util/lazy"
import { AppRuntime } from "../../effect/app-runtime" import { AppRuntime } from "../../effect/app-runtime"
import { Effect } from "effect" import { Effect } from "effect"
import { jsonRequest } from "./trace"
const log = Log.create({ service: "server" })
export const ConfigRoutes = lazy(() => export const ConfigRoutes = lazy(() =>
new Hono() new Hono()
@ -31,9 +29,10 @@ export const ConfigRoutes = lazy(() =>
}, },
}, },
}), }),
async (c) => { jsonRequest("ConfigRoutes.get", function* () {
return c.json(await AppRuntime.runPromise(Config.Service.use((cfg) => cfg.get()))) const cfg = yield* Config.Service
}, return yield* cfg.get()
}),
) )
.patch( .patch(
"/", "/",
@ -82,18 +81,13 @@ export const ConfigRoutes = lazy(() =>
}, },
}, },
}), }),
async (c) => { jsonRequest("ConfigRoutes.providers", function* () {
using _ = log.time("providers") const svc = yield* Provider.Service
const providers = await AppRuntime.runPromise( const providers = mapValues(yield* svc.list(), (item) => item)
Effect.gen(function* () { return {
const svc = yield* Provider.Service
return mapValues(yield* svc.list(), (item) => item)
}),
)
return c.json({
providers: Object.values(providers), providers: Object.values(providers),
default: mapValues(providers, (item) => Provider.sort(Object.values(item.models))[0].id), default: mapValues(providers, (item) => Provider.sort(Object.values(item.models))[0].id),
}) }
}, }),
), ),
) )

View file

@ -26,6 +26,7 @@ import { errors } from "../error"
import { lazy } from "../../util/lazy" import { lazy } from "../../util/lazy"
import { Bus } from "../../bus" import { Bus } from "../../bus"
import { NamedError } from "@opencode-ai/shared/util/error" import { NamedError } from "@opencode-ai/shared/util/error"
import { jsonRequest } from "./trace"
const log = Log.create({ service: "server" }) const log = Log.create({ service: "server" })
@ -94,10 +95,10 @@ export const SessionRoutes = lazy(() =>
...errors(400), ...errors(400),
}, },
}), }),
async (c) => { jsonRequest("SessionRoutes.status", function* () {
const result = await AppRuntime.runPromise(SessionStatus.Service.use((svc) => svc.list())) const svc = yield* SessionStatus.Service
return c.json(Object.fromEntries(result)) return Object.fromEntries(yield* svc.list())
}, }),
) )
.get( .get(
"/:sessionID", "/:sessionID",
@ -124,11 +125,11 @@ export const SessionRoutes = lazy(() =>
sessionID: Session.GetInput, sessionID: Session.GetInput,
}), }),
), ),
async (c) => { jsonRequest("SessionRoutes.get", function* (c) {
const sessionID = c.req.valid("param").sessionID const sessionID = c.req.valid("param").sessionID
const session = await AppRuntime.runPromise(Session.Service.use((svc) => svc.get(sessionID))) const session = yield* Session.Service
return c.json(session) return yield* session.get(sessionID)
}, }),
) )
.get( .get(
"/:sessionID/children", "/:sessionID/children",
@ -155,11 +156,11 @@ export const SessionRoutes = lazy(() =>
sessionID: Session.ChildrenInput, sessionID: Session.ChildrenInput,
}), }),
), ),
async (c) => { jsonRequest("SessionRoutes.children", function* (c) {
const sessionID = c.req.valid("param").sessionID const sessionID = c.req.valid("param").sessionID
const session = await AppRuntime.runPromise(Session.Service.use((svc) => svc.children(sessionID))) const session = yield* Session.Service
return c.json(session) return yield* session.children(sessionID)
}, }),
) )
.get( .get(
"/:sessionID/todo", "/:sessionID/todo",
@ -185,11 +186,11 @@ export const SessionRoutes = lazy(() =>
sessionID: SessionID.zod, sessionID: SessionID.zod,
}), }),
), ),
async (c) => { jsonRequest("SessionRoutes.todo", function* (c) {
const sessionID = c.req.valid("param").sessionID const sessionID = c.req.valid("param").sessionID
const todos = await AppRuntime.runPromise(Todo.Service.use((svc) => svc.get(sessionID))) const todo = yield* Todo.Service
return c.json(todos) return yield* todo.get(sessionID)
}, }),
) )
.post( .post(
"/", "/",

View file

@ -0,0 +1,28 @@
import type { Context } from "hono"
import { Effect } from "effect"
import { AppRuntime } from "../../effect/app-runtime"
export function runRequest<A, E>(name: string, c: Context, effect: Effect.Effect<A, E, any>) {
const url = new URL(c.req.url)
return AppRuntime.runPromise(
effect.pipe(
Effect.withSpan(name, {
attributes: {
"http.method": c.req.method,
"http.path": url.pathname,
},
}),
),
)
}
export function jsonRequest<A, E>(name: string, effect: (c: any) => Effect.gen.Return<A, E, any>) {
return async (c: Context) =>
c.json(
await runRequest(
name,
c,
Effect.gen(() => effect(c)),
),
)
}