diff --git a/packages/core/src/database/database.ts b/packages/core/src/database/database.ts index 3a681030c..140063051 100644 --- a/packages/core/src/database/database.ts +++ b/packages/core/src/database/database.ts @@ -12,18 +12,17 @@ import { InstallationChannel } from "../installation/version" const makeDatabase = EffectDrizzleSqlite.makeWithDefaults() type DatabaseShape = Effect.Success -export type Info = { + +export interface Interface { db: DatabaseShape - native: unknown drizzle: Sqlite.DrizzleClient } -export class Service extends Context.Service()("@opencode/v2/storage/Database") {} +export class Service extends Context.Service()("@opencode/v2/storage/Database") {} export const layer = Layer.effect( Service, Effect.gen(function* () { - const native = yield* Sqlite.Native const drizzle = yield* Sqlite.Drizzle const db = yield* makeDatabase @@ -36,7 +35,7 @@ export const layer = Layer.effect( yield* Effect.log("Applying database migrations") yield* DatabaseMigration.apply(db) - return { db, native, drizzle } + return { db, drizzle } }).pipe(Effect.orDie), ) @@ -44,8 +43,6 @@ export function layerFromPath(filename: string) { return layer.pipe(Layer.provide(sqliteLayer({ filename }))) } -export const memoryLayer = layerFromPath(":memory:") - export function path() { if (Flag.OPENCODE_DB) { if (Flag.OPENCODE_DB === ":memory:" || isAbsolute(Flag.OPENCODE_DB)) return Flag.OPENCODE_DB diff --git a/packages/core/src/database/sqlite.bun.ts b/packages/core/src/database/sqlite.bun.ts index 28801e789..02a41e07c 100644 --- a/packages/core/src/database/sqlite.bun.ts +++ b/packages/core/src/database/sqlite.bun.ts @@ -172,4 +172,6 @@ export const layer = (config: Config) => Layer.merge( nativeLayer(config), Layer.merge(sqliteLayer(config), drizzleLayer).pipe(Layer.provide(nativeLayer(config))), - ).pipe(Layer.provide(Reactivity.layer)) + ).pipe( + Layer.provide(Reactivity.layer), + ) diff --git a/packages/core/src/database/sqlite.node.ts b/packages/core/src/database/sqlite.node.ts index 4f1057ea0..cb9272adf 100644 --- a/packages/core/src/database/sqlite.node.ts +++ b/packages/core/src/database/sqlite.node.ts @@ -167,4 +167,6 @@ export const layer = (config: Config) => Layer.merge( nativeLayer(config), Layer.merge(sqliteLayer(config), drizzleLayer).pipe(Layer.provide(nativeLayer(config))), - ).pipe(Layer.provide(Reactivity.layer)) + ).pipe( + Layer.provide(Reactivity.layer), + ) diff --git a/packages/core/src/database/sqlite.ts b/packages/core/src/database/sqlite.ts index cba003b4c..d2304a547 100644 --- a/packages/core/src/database/sqlite.ts +++ b/packages/core/src/database/sqlite.ts @@ -4,11 +4,5 @@ import { Context } from "effect" import type { drizzle } from "drizzle-orm/bun-sqlite" export type DrizzleClient = ReturnType - -export interface Info { - native: Native - drizzle: DrizzleClient -} - export class Native extends Context.Service()("@opencode-ai/core/database/SqliteNative") {} export class Drizzle extends Context.Service()("@opencode-ai/core/database/SqliteDrizzle") {} diff --git a/packages/opencode/src/storage/db.bun.ts b/packages/opencode/src/storage/db.bun.ts index fa6190925..f2541c74e 100644 --- a/packages/opencode/src/storage/db.bun.ts +++ b/packages/opencode/src/storage/db.bun.ts @@ -1,8 +1,12 @@ import { Database } from "bun:sqlite" +import { Sqlite } from "@opencode-ai/core/database/sqlite" +import { layer } from "@opencode-ai/core/database/sqlite.bun" +import { makeRuntime } from "@opencode-ai/core/effect/runtime" import { drizzle } from "drizzle-orm/bun-sqlite" +import { Effect } from "effect" export function init(path: string) { - const sqlite = new Database(path, { create: true }) - const db = drizzle({ client: sqlite }) - return db + const runtime = makeRuntime(Sqlite.Native, layer({ filename: path })) + const native = runtime.runSync((native) => Effect.succeed(native)) as Database + return drizzle({ client: native }) } diff --git a/packages/opencode/src/storage/db.node.ts b/packages/opencode/src/storage/db.node.ts index 0dba8dcef..ec6eb1243 100644 --- a/packages/opencode/src/storage/db.node.ts +++ b/packages/opencode/src/storage/db.node.ts @@ -1,8 +1,12 @@ import { DatabaseSync } from "node:sqlite" +import { Sqlite } from "@opencode-ai/core/database/sqlite" +import { layer } from "@opencode-ai/core/database/sqlite.node" +import { makeRuntime } from "@opencode-ai/core/effect/runtime" import { drizzle } from "drizzle-orm/node-sqlite" +import { Effect } from "effect" export function init(path: string) { - const sqlite = new DatabaseSync(path) - const db = drizzle({ client: sqlite }) - return db + const runtime = makeRuntime(Sqlite.Native, layer({ filename: path })) + const native = runtime.runSync((native) => Effect.succeed(native)) as DatabaseSync + return drizzle({ client: native }) } diff --git a/packages/opencode/src/storage/db.ts b/packages/opencode/src/storage/db.ts index 66b1d44c9..580a0bb81 100644 --- a/packages/opencode/src/storage/db.ts +++ b/packages/opencode/src/storage/db.ts @@ -21,7 +21,7 @@ export const getPath = () => Database.path() export type Transaction = SQLiteTransaction<"sync", void, Record, TablesRelationalConfig> -type Client = Database.Info["drizzle"] +type Client = Database.Interface["drizzle"] let client: Client | undefined let loaded = false