diff --git a/bun.lock b/bun.lock
index 787264e4fa6..c14691910bf 100644
--- a/bun.lock
+++ b/bun.lock
@@ -424,6 +424,7 @@
"@tailwindcss/vite": "catalog:",
"@tsconfig/node22": "catalog:",
"@types/bun": "catalog:",
+ "@types/dompurify": "catalog:",
"@types/katex": "0.16.7",
"@types/luxon": "catalog:",
"tailwindcss": "catalog:",
@@ -503,6 +504,7 @@
"@tsconfig/bun": "1.0.9",
"@tsconfig/node22": "22.0.2",
"@types/bun": "1.3.4",
+ "@types/dompurify": "3.2.0",
"@types/luxon": "3.7.1",
"@types/node": "22.13.9",
"@typescript/native-preview": "7.0.0-dev.20251207.1",
@@ -1768,6 +1770,8 @@
"@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="],
+ "@types/dompurify": ["@types/dompurify@3.2.0", "", { "dependencies": { "dompurify": "*" } }, "sha512-Fgg31wv9QbLDA0SpTOXO3MaxySc4DKGLi8sna4/Utjo4r3ZRPdCt4UQee8BWr+Q5z21yifghREPJGYaEOEIACg=="],
+
"@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
"@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="],
diff --git a/package.json b/package.json
index d134a187a7c..6310105f3cf 100644
--- a/package.json
+++ b/package.json
@@ -37,6 +37,7 @@
"@tailwindcss/vite": "4.1.11",
"diff": "8.0.2",
"dompurify": "3.3.1",
+ "@types/dompurify": "3.2.0",
"ai": "5.0.119",
"hono": "4.10.7",
"hono-openapi": "1.1.2",
diff --git a/packages/app/src/custom-elements.d.ts b/packages/app/src/custom-elements.d.ts
index e4ea0d6cebd..bd6fdcad3b4 120000
--- a/packages/app/src/custom-elements.d.ts
+++ b/packages/app/src/custom-elements.d.ts
@@ -1 +1,2 @@
-../../ui/src/custom-elements.d.ts
\ No newline at end of file
+///
+export {}
diff --git a/packages/enterprise/src/custom-elements.d.ts b/packages/enterprise/src/custom-elements.d.ts
index e4ea0d6cebd..bd6fdcad3b4 120000
--- a/packages/enterprise/src/custom-elements.d.ts
+++ b/packages/enterprise/src/custom-elements.d.ts
@@ -1 +1,2 @@
-../../ui/src/custom-elements.d.ts
\ No newline at end of file
+///
+export {}
diff --git a/packages/opencode/src/provider/models-macro.ts b/packages/opencode/src/provider/models-macro.ts
deleted file mode 100644
index 6c8492a7017..00000000000
--- a/packages/opencode/src/provider/models-macro.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-export async function data() {
- const path = Bun.env.MODELS_DEV_API_JSON
- if (path) {
- const file = Bun.file(path)
- if (await file.exists()) {
- return await file.text()
- }
- }
- const json = await fetch("https://models.dev/api.json").then((x) => x.text())
- return json
-}
diff --git a/packages/opencode/src/provider/models.ts b/packages/opencode/src/provider/models.ts
index 796dcb7c238..c1b93cd0577 100644
--- a/packages/opencode/src/provider/models.ts
+++ b/packages/opencode/src/provider/models.ts
@@ -2,7 +2,6 @@ import { Global } from "../global"
import { Log } from "../util/log"
import path from "path"
import z from "zod"
-import { data } from "./models-macro" with { type: "macro" }
import { Installation } from "../installation"
import { Flag } from "../flag/flag"
@@ -10,6 +9,25 @@ export namespace ModelsDev {
const log = Log.create({ service: "models.dev" })
const filepath = path.join(Global.Path.cache, "models.json")
+ async function fetchModelsData() {
+ const envPath = Bun.env.MODELS_DEV_API_JSON
+ if (envPath) {
+ const file = Bun.file(envPath)
+ if (await file.exists()) {
+ return await file.json()
+ }
+ }
+ const res = await fetch("https://models.dev/api.json", {
+ headers: {
+ "User-Agent": Installation.USER_AGENT,
+ },
+ }).catch(() => null)
+ if (res && res.ok) {
+ return await res.json()
+ }
+ return {}
+ }
+
export const Model = z.object({
id: z.string(),
name: z.string(),
@@ -80,8 +98,7 @@ export namespace ModelsDev {
const file = Bun.file(filepath)
const result = await file.json().catch(() => {})
if (result) return result as Record
- const json = await data()
- return JSON.parse(json) as Record
+ return (await fetchModelsData()) as Record
}
export async function refresh() {
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 5b440f515d0..9decdf0a716 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -29,6 +29,7 @@
"@tailwindcss/vite": "catalog:",
"@tsconfig/node22": "catalog:",
"@types/bun": "catalog:",
+ "@types/dompurify": "catalog:",
"@types/katex": "0.16.7",
"@types/luxon": "catalog:",
"tailwindcss": "catalog:",