import { describe, expect } from "bun:test" import { Effect, Layer } from "effect" import { Database } from "@opencode-ai/core/database/database" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" import { LayerNode } from "@opencode-ai/util/effect/layer-node" import { Bus } from "@opencode-ai/core/bus" import { Job } from "@opencode-ai/core/job" import { Location } from "@opencode-ai/core/location" import { Project } from "@opencode-ai/core/project" import { AbsolutePath } from "@opencode-ai/core/schema" import { Session } from "@opencode-ai/core/session" import { SessionProjector } from "@opencode-ai/core/session/projector" import { SessionExecution } from "@opencode-ai/core/session/execution" import { SessionStore } from "@opencode-ai/core/session/store" import { testEffect } from "./lib/effect" const location = Location.Ref.make({ directory: AbsolutePath.make("/project") }) const awaited: Session.ID[] = [] const projects = Layer.mock(Project.Service, { resolve: (directory) => Effect.succeed({ id: Project.ID.global, directory }), }) const execution = Layer.mock(SessionExecution.Service, { awaitIdle: (sessionID) => Effect.sync(() => awaited.push(sessionID)), }) const it = testEffect( AppNodeBuilder.build( LayerNode.group([Database.node, Bus.node, SessionProjector.node, SessionStore.node, Session.node]), [ [Project.node, projects], [SessionExecution.node, execution], ], ), ) describe("Session.wait", () => { it.effect("delegates to SessionExecution.awaitIdle", () => Effect.gen(function* () { awaited.length = 0 const sessions = yield* Session.Service const session = yield* sessions.create({ location }) yield* sessions.wait(session.id) expect(awaited).toEqual([session.id]) }), ) })