fix(effect): preserve logger context in prompt runs
This commit is contained in:
parent
a53fae1511
commit
1c059ae0d5
3 changed files with 47 additions and 5 deletions
|
|
@ -49,7 +49,7 @@ import { ShareNext } from "@/share/share-next"
|
||||||
import { SessionShare } from "@/share/session"
|
import { SessionShare } from "@/share/session"
|
||||||
|
|
||||||
export const AppLayer = Layer.mergeAll(
|
export const AppLayer = Layer.mergeAll(
|
||||||
// Observability.layer,
|
Observability.layer,
|
||||||
AppFileSystem.defaultLayer,
|
AppFileSystem.defaultLayer,
|
||||||
Bus.defaultLayer,
|
Bus.defaultLayer,
|
||||||
Auth.defaultLayer,
|
Auth.defaultLayer,
|
||||||
|
|
@ -95,6 +95,6 @@ export const AppLayer = Layer.mergeAll(
|
||||||
Installation.defaultLayer,
|
Installation.defaultLayer,
|
||||||
ShareNext.defaultLayer,
|
ShareNext.defaultLayer,
|
||||||
SessionShare.defaultLayer,
|
SessionShare.defaultLayer,
|
||||||
).pipe(Layer.provide(Observability.layer))
|
)
|
||||||
|
|
||||||
export const AppRuntime = ManagedRuntime.make(AppLayer, { memoMap })
|
export const AppRuntime = ManagedRuntime.make(AppLayer, { memoMap })
|
||||||
|
|
|
||||||
|
|
@ -104,11 +104,11 @@ export namespace SessionPrompt {
|
||||||
const summary = yield* SessionSummary.Service
|
const summary = yield* SessionSummary.Service
|
||||||
const sys = yield* SystemPrompt.Service
|
const sys = yield* SystemPrompt.Service
|
||||||
const llm = yield* LLM.Service
|
const llm = yield* LLM.Service
|
||||||
|
const ctx = yield* Effect.context<any>()
|
||||||
|
|
||||||
const run = {
|
const run = {
|
||||||
promise: <A, E>(effect: Effect.Effect<A, E>) =>
|
promise: <A, E>(effect: Effect.Effect<A, E>) => Effect.runPromiseWith(ctx)(effect),
|
||||||
Effect.runPromise(effect.pipe(Effect.provide(EffectLogger.layer))),
|
fork: <A, E>(effect: Effect.Effect<A, E>) => Effect.runForkWith(ctx)(effect),
|
||||||
fork: <A, E>(effect: Effect.Effect<A, E>) => Effect.runFork(effect.pipe(Effect.provide(EffectLogger.layer))),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const cancel = Effect.fn("SessionPrompt.cancel")(function* (sessionID: SessionID) {
|
const cancel = Effect.fn("SessionPrompt.cancel")(function* (sessionID: SessionID) {
|
||||||
|
|
|
||||||
42
packages/opencode/test/effect/app-runtime-logger.test.ts
Normal file
42
packages/opencode/test/effect/app-runtime-logger.test.ts
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
import { expect, test } from "bun:test"
|
||||||
|
import { Context, Effect, Layer, Logger } from "effect"
|
||||||
|
import { AppRuntime } from "../../src/effect/app-runtime"
|
||||||
|
import { makeRuntime } from "../../src/effect/run-service"
|
||||||
|
import { EffectLogger } from "../../src/effect/logger"
|
||||||
|
|
||||||
|
function check(loggers: ReadonlySet<Logger.Logger<unknown, any>>) {
|
||||||
|
return {
|
||||||
|
defaultLogger: loggers.has(Logger.defaultLogger),
|
||||||
|
tracerLogger: loggers.has(Logger.tracerLogger),
|
||||||
|
effectLogger: loggers.has(EffectLogger.logger),
|
||||||
|
size: loggers.size,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test("makeRuntime installs EffectLogger through Observability.layer", async () => {
|
||||||
|
class Dummy extends Context.Service<Dummy, { readonly current: () => Effect.Effect<ReturnType<typeof check>> }>()(
|
||||||
|
"@test/Dummy",
|
||||||
|
) {}
|
||||||
|
|
||||||
|
const layer = Layer.effect(
|
||||||
|
Dummy,
|
||||||
|
Effect.gen(function* () {
|
||||||
|
return Dummy.of({
|
||||||
|
current: () => Effect.map(Effect.service(Logger.CurrentLoggers), check),
|
||||||
|
})
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
const rt = makeRuntime(Dummy, layer)
|
||||||
|
const current = await rt.runPromise((svc) => svc.current())
|
||||||
|
|
||||||
|
expect(current.effectLogger).toBe(true)
|
||||||
|
expect(current.defaultLogger).toBe(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
test("AppRuntime also installs EffectLogger through Observability.layer", async () => {
|
||||||
|
const current = await AppRuntime.runPromise(Effect.map(Effect.service(Logger.CurrentLoggers), check))
|
||||||
|
|
||||||
|
expect(current.effectLogger).toBe(true)
|
||||||
|
expect(current.defaultLogger).toBe(false)
|
||||||
|
})
|
||||||
Loading…
Add table
Add a link
Reference in a new issue