Skip to content

Commit 105688b

Browse files
committed
sync
1 parent 1e7b476 commit 105688b

14 files changed

Lines changed: 275 additions & 187 deletions

File tree

packages/opencode/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@
9797
"chokidar": "4.0.3",
9898
"clipboardy": "4.0.0",
9999
"decimal.js": "10.5.0",
100-
"drizzle-orm": "0.44.2",
101100
"diff": "catalog:",
101+
"drizzle-orm": "0.44.2",
102102
"fuzzysort": "3.1.0",
103103
"gray-matter": "4.0.3",
104104
"hono": "catalog:",

packages/opencode/src/cli/cmd/database.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { Argv } from "yargs"
22
import { cmd } from "./cmd"
33
import { bootstrap } from "../bootstrap"
44
import { UI } from "../ui"
5-
import { db } from "../../storage/db"
5+
import { Database } from "../../storage/db"
66
import { ProjectTable } from "../../project/project.sql"
77
import { Project } from "../../project/project"
88
import {
@@ -56,15 +56,15 @@ const ExportCommand = cmd({
5656
// Export projects
5757
const projectDir = path.join(outDir, "project")
5858
await fs.mkdir(projectDir, { recursive: true })
59-
for (const row of db().select().from(ProjectTable).all()) {
59+
for (const row of Database.use((db) => db.select().from(ProjectTable).all())) {
6060
const project = Project.fromRow(row)
6161
await Bun.write(path.join(projectDir, `${row.id}.json`), JSON.stringify(project, null, 2))
6262
stats.projects++
6363
}
6464

6565
// Export sessions (organized by projectID)
6666
const sessionDir = path.join(outDir, "session")
67-
for (const row of db().select().from(SessionTable).all()) {
67+
for (const row of Database.use((db) => db.select().from(SessionTable).all())) {
6868
const dir = path.join(sessionDir, row.projectID)
6969
await fs.mkdir(dir, { recursive: true })
7070
await Bun.write(path.join(dir, `${row.id}.json`), JSON.stringify(Session.fromRow(row), null, 2))
@@ -73,7 +73,7 @@ const ExportCommand = cmd({
7373

7474
// Export messages (organized by sessionID)
7575
const messageDir = path.join(outDir, "message")
76-
for (const row of db().select().from(MessageTable).all()) {
76+
for (const row of Database.use((db) => db.select().from(MessageTable).all())) {
7777
const dir = path.join(messageDir, row.sessionID)
7878
await fs.mkdir(dir, { recursive: true })
7979
await Bun.write(path.join(dir, `${row.id}.json`), JSON.stringify(row.data, null, 2))
@@ -82,7 +82,7 @@ const ExportCommand = cmd({
8282

8383
// Export parts (organized by messageID)
8484
const partDir = path.join(outDir, "part")
85-
for (const row of db().select().from(PartTable).all()) {
85+
for (const row of Database.use((db) => db.select().from(PartTable).all())) {
8686
const dir = path.join(partDir, row.messageID)
8787
await fs.mkdir(dir, { recursive: true })
8888
await Bun.write(path.join(dir, `${row.id}.json`), JSON.stringify(row.data, null, 2))
@@ -92,39 +92,39 @@ const ExportCommand = cmd({
9292
// Export session diffs
9393
const diffDir = path.join(outDir, "session_diff")
9494
await fs.mkdir(diffDir, { recursive: true })
95-
for (const row of db().select().from(SessionDiffTable).all()) {
95+
for (const row of Database.use((db) => db.select().from(SessionDiffTable).all())) {
9696
await Bun.write(path.join(diffDir, `${row.sessionID}.json`), JSON.stringify(row.data, null, 2))
9797
stats.diffs++
9898
}
9999

100100
// Export todos
101101
const todoDir = path.join(outDir, "todo")
102102
await fs.mkdir(todoDir, { recursive: true })
103-
for (const row of db().select().from(TodoTable).all()) {
103+
for (const row of Database.use((db) => db.select().from(TodoTable).all())) {
104104
await Bun.write(path.join(todoDir, `${row.sessionID}.json`), JSON.stringify(row.data, null, 2))
105105
stats.todos++
106106
}
107107

108108
// Export permissions
109109
const permDir = path.join(outDir, "permission")
110110
await fs.mkdir(permDir, { recursive: true })
111-
for (const row of db().select().from(PermissionTable).all()) {
111+
for (const row of Database.use((db) => db.select().from(PermissionTable).all())) {
112112
await Bun.write(path.join(permDir, `${row.projectID}.json`), JSON.stringify(row.data, null, 2))
113113
stats.permissions++
114114
}
115115

116116
// Export session shares
117117
const sessionShareDir = path.join(outDir, "session_share")
118118
await fs.mkdir(sessionShareDir, { recursive: true })
119-
for (const row of db().select().from(SessionShareTable).all()) {
119+
for (const row of Database.use((db) => db.select().from(SessionShareTable).all())) {
120120
await Bun.write(path.join(sessionShareDir, `${row.sessionID}.json`), JSON.stringify(row.data, null, 2))
121121
stats.sessionShares++
122122
}
123123

124124
// Export shares
125125
const shareDir = path.join(outDir, "share")
126126
await fs.mkdir(shareDir, { recursive: true })
127-
for (const row of db().select().from(ShareTable).all()) {
127+
for (const row of Database.use((db) => db.select().from(ShareTable).all())) {
128128
await Bun.write(path.join(shareDir, `${row.sessionID}.json`), JSON.stringify(row.data, null, 2))
129129
stats.shares++
130130
}

packages/opencode/src/cli/cmd/import.ts

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { Argv } from "yargs"
22
import { Session } from "../../session"
33
import { cmd } from "./cmd"
44
import { bootstrap } from "../bootstrap"
5-
import { db } from "../../storage/db"
5+
import { Database } from "../../storage/db"
66
import { SessionTable, MessageTable, PartTable } from "../../session/session.sql"
77
import { Instance } from "../../project/instance"
88
import { EOL } from "os"
@@ -82,31 +82,35 @@ export const ImportCommand = cmd({
8282
return
8383
}
8484

85-
db().insert(SessionTable).values(Session.toRow(exportData.info)).onConflictDoNothing().run()
85+
Database.use((db) => db.insert(SessionTable).values(Session.toRow(exportData.info)).onConflictDoNothing().run())
8686

8787
for (const msg of exportData.messages) {
88-
db()
89-
.insert(MessageTable)
90-
.values({
91-
id: msg.info.id,
92-
sessionID: exportData.info.id,
93-
createdAt: msg.info.time?.created ?? Date.now(),
94-
data: msg.info,
95-
})
96-
.onConflictDoNothing()
97-
.run()
98-
99-
for (const part of msg.parts) {
100-
db()
101-
.insert(PartTable)
88+
Database.use((db) =>
89+
db
90+
.insert(MessageTable)
10291
.values({
103-
id: part.id,
104-
messageID: msg.info.id,
92+
id: msg.info.id,
10593
sessionID: exportData.info.id,
106-
data: part,
94+
createdAt: msg.info.time?.created ?? Date.now(),
95+
data: msg.info,
10796
})
10897
.onConflictDoNothing()
109-
.run()
98+
.run(),
99+
)
100+
101+
for (const part of msg.parts) {
102+
Database.use((db) =>
103+
db
104+
.insert(PartTable)
105+
.values({
106+
id: part.id,
107+
messageID: msg.info.id,
108+
sessionID: exportData.info.id,
109+
data: part,
110+
})
111+
.onConflictDoNothing()
112+
.run(),
113+
)
110114
}
111115
}
112116

packages/opencode/src/cli/cmd/stats.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { Argv } from "yargs"
22
import { cmd } from "./cmd"
33
import { Session } from "../../session"
44
import { bootstrap } from "../bootstrap"
5-
import { db } from "../../storage/db"
5+
import { Database } from "../../storage/db"
66
import { SessionTable } from "../../session/session.sql"
77
import { Project } from "../../project/project"
88
import { Instance } from "../../project/instance"
@@ -84,7 +84,7 @@ async function getCurrentProject(): Promise<Project.Info> {
8484
}
8585

8686
async function getAllSessions(): Promise<Session.Info[]> {
87-
const rows = db().select().from(SessionTable).all()
87+
const rows = Database.use((db) => db.select().from(SessionTable).all())
8888
return rows.map((row) => Session.fromRow(row))
8989
}
9090

packages/opencode/src/permission/next.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@ import { BusEvent } from "@/bus/bus-event"
33
import { Config } from "@/config/config"
44
import { Identifier } from "@/id/id"
55
import { Instance } from "@/project/instance"
6-
import { db } from "@/storage/db"
6+
import { Database, eq } from "@/storage/db"
77
import { PermissionTable } from "@/session/session.sql"
8-
import { eq } from "drizzle-orm"
98
import { fn } from "@/util/fn"
109
import { Log } from "@/util/log"
1110
import { Wildcard } from "@/util/wildcard"
@@ -109,7 +108,9 @@ export namespace PermissionNext {
109108

110109
const state = Instance.state(() => {
111110
const projectID = Instance.project.id
112-
const row = db().select().from(PermissionTable).where(eq(PermissionTable.projectID, projectID)).get()
111+
const row = Database.use((db) =>
112+
db.select().from(PermissionTable).where(eq(PermissionTable.projectID, projectID)).get(),
113+
)
113114
const stored = row?.data ?? ([] as Ruleset)
114115

115116
const pending: Record<

packages/opencode/src/project/project.ts

Lines changed: 61 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@ import fs from "fs/promises"
33
import { Filesystem } from "../util/filesystem"
44
import path from "path"
55
import { $ } from "bun"
6-
import { db } from "../storage/db"
6+
import { Database, eq } from "../storage/db"
77
import { ProjectTable } from "./project.sql"
88
import { SessionTable } from "../session/session.sql"
9-
import { eq } from "drizzle-orm"
109
import { Log } from "../util/log"
1110
import { Flag } from "@/flag/flag"
1211
import { work } from "../util/queue"
@@ -199,7 +198,7 @@ export namespace Project {
199198
}
200199
})
201200

202-
const row = db().select().from(ProjectTable).where(eq(ProjectTable.id, id)).get()
201+
const row = Database.use((db) => db.select().from(ProjectTable).where(eq(ProjectTable.id, id)).get())
203202
const existing = await iife(async () => {
204203
if (row) return fromRow(row)
205204
const fresh: Info = {
@@ -253,7 +252,9 @@ export namespace Project {
253252
time_initialized: result.time.initialized,
254253
sandboxes: result.sandboxes,
255254
}
256-
db().insert(ProjectTable).values(insert).onConflictDoUpdate({ target: ProjectTable.id, set: updateSet }).run()
255+
Database.use((db) =>
256+
db.insert(ProjectTable).values(insert).onConflictDoUpdate({ target: ProjectTable.id, set: updateSet }).run(),
257+
)
257258
GlobalBus.emit("event", {
258259
payload: {
259260
type: Event.Updated.type,
@@ -294,10 +295,12 @@ export namespace Project {
294295
}
295296

296297
async function migrateFromGlobal(newProjectID: string, worktree: string) {
297-
const globalRow = db().select().from(ProjectTable).where(eq(ProjectTable.id, "global")).get()
298+
const globalRow = Database.use((db) => db.select().from(ProjectTable).where(eq(ProjectTable.id, "global")).get())
298299
if (!globalRow) return
299300

300-
const globalSessions = db().select().from(SessionTable).where(eq(SessionTable.projectID, "global")).all()
301+
const globalSessions = Database.use((db) =>
302+
db.select().from(SessionTable).where(eq(SessionTable.projectID, "global")).all(),
303+
)
301304
if (globalSessions.length === 0) return
302305

303306
log.info("migrating sessions from global", { newProjectID, worktree, count: globalSessions.length })
@@ -307,32 +310,38 @@ export namespace Project {
307310
if (row.directory && row.directory !== worktree) return
308311

309312
log.info("migrating session", { sessionID: row.id, from: "global", to: newProjectID })
310-
db().update(SessionTable).set({ projectID: newProjectID }).where(eq(SessionTable.id, row.id)).run()
313+
Database.use((db) =>
314+
db.update(SessionTable).set({ projectID: newProjectID }).where(eq(SessionTable.id, row.id)).run(),
315+
)
311316
}).catch((error) => {
312317
log.error("failed to migrate sessions from global to project", { error, projectId: newProjectID })
313318
})
314319
}
315320

316321
export function setInitialized(projectID: string) {
317-
db()
318-
.update(ProjectTable)
319-
.set({
320-
time_initialized: Date.now(),
321-
})
322-
.where(eq(ProjectTable.id, projectID))
323-
.run()
322+
Database.use((db) =>
323+
db
324+
.update(ProjectTable)
325+
.set({
326+
time_initialized: Date.now(),
327+
})
328+
.where(eq(ProjectTable.id, projectID))
329+
.run(),
330+
)
324331
}
325332

326333
export function list() {
327-
return db()
328-
.select()
329-
.from(ProjectTable)
330-
.all()
331-
.map((row) => fromRow(row))
334+
return Database.use((db) =>
335+
db
336+
.select()
337+
.from(ProjectTable)
338+
.all()
339+
.map((row) => fromRow(row)),
340+
)
332341
}
333342

334343
export function get(projectID: string): Info | undefined {
335-
const row = db().select().from(ProjectTable).where(eq(ProjectTable.id, projectID)).get()
344+
const row = Database.use((db) => db.select().from(ProjectTable).where(eq(ProjectTable.id, projectID)).get())
336345
if (!row) return undefined
337346
return fromRow(row)
338347
}
@@ -345,17 +354,19 @@ export namespace Project {
345354
commands: Info.shape.commands.optional(),
346355
}),
347356
async (input) => {
348-
const result = db()
349-
.update(ProjectTable)
350-
.set({
351-
name: input.name,
352-
icon_url: input.icon?.url,
353-
icon_color: input.icon?.color,
354-
time_updated: Date.now(),
355-
})
356-
.where(eq(ProjectTable.id, input.projectID))
357-
.returning()
358-
.get()
357+
const result = Database.use((db) =>
358+
db
359+
.update(ProjectTable)
360+
.set({
361+
name: input.name,
362+
icon_url: input.icon?.url,
363+
icon_color: input.icon?.color,
364+
time_updated: Date.now(),
365+
})
366+
.where(eq(ProjectTable.id, input.projectID))
367+
.returning()
368+
.get(),
369+
)
359370
if (!result) throw new Error(`Project not found: ${input.projectID}`)
360371
const data = fromRow(result)
361372
GlobalBus.emit("event", {
@@ -369,7 +380,7 @@ export namespace Project {
369380
)
370381

371382
export async function sandboxes(projectID: string) {
372-
const row = db().select().from(ProjectTable).where(eq(ProjectTable.id, projectID)).get()
383+
const row = Database.use((db) => db.select().from(ProjectTable).where(eq(ProjectTable.id, projectID)).get())
373384
if (!row) return []
374385
const data = fromRow(row)
375386
const valid: string[] = []
@@ -381,16 +392,18 @@ export namespace Project {
381392
}
382393

383394
export async function addSandbox(projectID: string, directory: string) {
384-
const row = db().select().from(ProjectTable).where(eq(ProjectTable.id, projectID)).get()
395+
const row = Database.use((db) => db.select().from(ProjectTable).where(eq(ProjectTable.id, projectID)).get())
385396
if (!row) throw new Error(`Project not found: ${projectID}`)
386397
const sandboxes = [...row.sandboxes]
387398
if (!sandboxes.includes(directory)) sandboxes.push(directory)
388-
const result = db()
389-
.update(ProjectTable)
390-
.set({ sandboxes, time_updated: Date.now() })
391-
.where(eq(ProjectTable.id, projectID))
392-
.returning()
393-
.get()
399+
const result = Database.use((db) =>
400+
db
401+
.update(ProjectTable)
402+
.set({ sandboxes, time_updated: Date.now() })
403+
.where(eq(ProjectTable.id, projectID))
404+
.returning()
405+
.get(),
406+
)
394407
if (!result) throw new Error(`Project not found: ${projectID}`)
395408
const data = fromRow(result)
396409
GlobalBus.emit("event", {
@@ -403,15 +416,17 @@ export namespace Project {
403416
}
404417

405418
export async function removeSandbox(projectID: string, directory: string) {
406-
const row = db().select().from(ProjectTable).where(eq(ProjectTable.id, projectID)).get()
419+
const row = Database.use((db) => db.select().from(ProjectTable).where(eq(ProjectTable.id, projectID)).get())
407420
if (!row) throw new Error(`Project not found: ${projectID}`)
408421
const sandboxes = row.sandboxes.filter((s: string) => s !== directory)
409-
const result = db()
410-
.update(ProjectTable)
411-
.set({ sandboxes, time_updated: Date.now() })
412-
.where(eq(ProjectTable.id, projectID))
413-
.returning()
414-
.get()
422+
const result = Database.use((db) =>
423+
db
424+
.update(ProjectTable)
425+
.set({ sandboxes, time_updated: Date.now() })
426+
.where(eq(ProjectTable.id, projectID))
427+
.returning()
428+
.get(),
429+
)
415430
if (!result) throw new Error(`Project not found: ${projectID}`)
416431
const data = fromRow(result)
417432
GlobalBus.emit("event", {

0 commit comments

Comments
 (0)