This commit is contained in:
Frank
2025-10-08 00:03:34 -04:00
parent 22a6849ff8
commit 99b72eb1ea
9 changed files with 1112 additions and 0 deletions

View File

@@ -6,6 +6,7 @@ export namespace Identifier {
account: "acc",
billing: "bil",
key: "key",
model: "mod",
payment: "pay",
usage: "usg",
user: "usr",

View File

@@ -1,4 +1,11 @@
import { z } from "zod"
import { eq, and } from "drizzle-orm"
import { Database } from "./drizzle"
import { ModelTable } from "./schema/model.sql"
import { Identifier } from "./identifier"
import { fn } from "./util/fn"
import { Actor } from "./actor"
import { Resource } from "@opencode-ai/console-resource"
export namespace ZenModel {
const ModelCostSchema = z.object({
@@ -27,4 +34,59 @@ export namespace ZenModel {
})
export const ModelsSchema = z.record(z.string(), ModelSchema)
export const list = fn(z.void(), () => ModelsSchema.parse(JSON.parse(Resource.ZEN_MODELS.value)))
}
export namespace Model {
export const enable = fn(z.object({ model: z.string() }), ({ model }) => {
const workspaceID = Actor.workspace()
return Database.use((db) =>
db.delete(ModelTable).where(and(eq(ModelTable.workspaceID, workspaceID), eq(ModelTable.model, model))),
)
})
export const disable = fn(z.object({ model: z.string() }), ({ model }) => {
return Database.use((db) =>
db
.insert(ModelTable)
.values({
id: Identifier.create("model"),
workspaceID: Actor.workspace(),
model: model,
})
.onDuplicateKeyUpdate({
set: {
timeDeleted: null,
},
}),
)
})
export const listDisabled = fn(z.void(), () => {
return Database.use((db) =>
db
.select({ model: ModelTable.model })
.from(ModelTable)
.where(eq(ModelTable.workspaceID, Actor.workspace()))
.then((rows) => rows.map((row) => row.model)),
)
})
export const isDisabled = fn(
z.object({
model: z.string(),
}),
({ model }) => {
return Database.use(async (db) => {
const result = await db
.select()
.from(ModelTable)
.where(and(eq(ModelTable.workspaceID, Actor.workspace()), eq(ModelTable.model, model)))
.limit(1)
return result.length > 0
})
},
)
}

View File

@@ -0,0 +1,13 @@
import { mysqlTable, varchar, uniqueIndex } from "drizzle-orm/mysql-core"
import { timestamps, workspaceColumns } from "../drizzle/types"
import { workspaceIndexes } from "./workspace.sql"
export const ModelTable = mysqlTable(
"model",
{
...workspaceColumns,
...timestamps,
model: varchar("model", { length: 64 }).notNull(),
},
(table) => [...workspaceIndexes(table), uniqueIndex("model_workspace_model").on(table.workspaceID, table.model)],
)