opencode.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. export * as OpenCode from "./opencode"
  2. import { Context, Effect, Layer } from "effect"
  3. import { Database } from "./database/database"
  4. import { EventV2 } from "./event"
  5. import { LocationServiceMap } from "./location-layer"
  6. import { ProjectV2 } from "./project"
  7. import { SessionV2 } from "./session"
  8. import { SessionProjector } from "./session/projector"
  9. import * as SessionExecutionLocal from "./session/execution/local"
  10. import { SessionStore } from "./session/store"
  11. export interface Interface {
  12. readonly sessions: SessionV2.Interface
  13. }
  14. /** Public embedded OpenCode API for Effect-native applications. */
  15. export class Service extends Context.Service<Service, Interface>()("@opencode/OpenCode") {}
  16. const DefaultSessions = SessionV2.layer.pipe(
  17. Layer.provide(SessionProjector.layer),
  18. Layer.provide(SessionExecutionLocal.layer),
  19. Layer.provide(LocationServiceMap.layer),
  20. Layer.provide(SessionStore.layer),
  21. Layer.provide(EventV2.layer),
  22. Layer.provide(Database.defaultLayer),
  23. Layer.provide(ProjectV2.defaultLayer),
  24. Layer.orDie,
  25. )
  26. // TODO: Accept explicit storage so tests and embeddings can select disposable or application-owned persistence.
  27. export const layer = Layer.effect(
  28. Service,
  29. Effect.gen(function* () {
  30. return Service.of({ sessions: yield* SessionV2.Service })
  31. }),
  32. ).pipe(Layer.provide(DefaultSessions))
  33. // TODO: Add OpenCode.create(...) as the Promise facade over the same embedded API semantics.