summaryrefslogtreecommitdiffhomepage
path: root/packages/console/core/src
diff options
context:
space:
mode:
authorFrank <[email protected]>2025-10-08 00:03:34 -0400
committerFrank <[email protected]>2025-10-08 00:03:36 -0400
commit99b72eb1ea136ef6569751061d50b6f691718564 (patch)
tree98e93be1fe291cb884b5e83817613954c447649e /packages/console/core/src
parent22a6849ff8f34ef9d3fab55a295fcfbb766f9d5a (diff)
downloadopencode-99b72eb1ea136ef6569751061d50b6f691718564.tar.gz
opencode-99b72eb1ea136ef6569751061d50b6f691718564.zip
wip: zen
Diffstat (limited to 'packages/console/core/src')
-rw-r--r--packages/console/core/src/identifier.ts1
-rw-r--r--packages/console/core/src/model.ts62
-rw-r--r--packages/console/core/src/schema/model.sql.ts13
3 files changed, 76 insertions, 0 deletions
diff --git a/packages/console/core/src/identifier.ts b/packages/console/core/src/identifier.ts
index f8e73852e..98c12a6c6 100644
--- a/packages/console/core/src/identifier.ts
+++ b/packages/console/core/src/identifier.ts
@@ -6,6 +6,7 @@ export namespace Identifier {
account: "acc",
billing: "bil",
key: "key",
+ model: "mod",
payment: "pay",
usage: "usg",
user: "usr",
diff --git a/packages/console/core/src/model.ts b/packages/console/core/src/model.ts
index 028d94655..ae636c4f3 100644
--- a/packages/console/core/src/model.ts
+++ b/packages/console/core/src/model.ts
@@ -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
+ })
+ },
+ )
}
diff --git a/packages/console/core/src/schema/model.sql.ts b/packages/console/core/src/schema/model.sql.ts
new file mode 100644
index 000000000..1c032aad2
--- /dev/null
+++ b/packages/console/core/src/schema/model.sql.ts
@@ -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)],
+)