diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index c2df2814c..c8d867284 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -24,6 +24,7 @@ jobs:
run: |
git config --global user.email "bot@opencode.ai"
git config --global user.name "opencode"
+ bun turbo typecheck
bun turbo test
env:
CI: true
diff --git a/.opencode/command/commit.md b/.opencode/command/commit.md
index 05a47895c..337379178 100644
--- a/.opencode/command/commit.md
+++ b/.opencode/command/commit.md
@@ -1,3 +1,7 @@
+---
+description: Git commit and push
+---
+
commit and push
make sure it includes a prefix like
@@ -8,6 +12,10 @@ ci:
ignore:
wip:
+For anything in the packages/web use the docs: prefix.
+
+For anything in the packages/app use the ignore: prefix.
+
prefer to explain WHY something was done from an end user perspective instead of
WHAT was done.
diff --git a/bun.lock b/bun.lock
index 7ee247a34..6c2d60fd0 100644
--- a/bun.lock
+++ b/bun.lock
@@ -33,6 +33,7 @@
"zod": "catalog:",
},
"devDependencies": {
+ "@typescript/native-preview": "catalog:",
"typescript": "catalog:",
},
},
@@ -57,6 +58,7 @@
"@tsconfig/node22": "22.0.2",
"@types/bun": "1.3.0",
"@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
"drizzle-kit": "0.30.5",
"mysql2": "3.14.4",
"typescript": "catalog:",
@@ -81,6 +83,7 @@
"@cloudflare/workers-types": "catalog:",
"@tsconfig/node22": "22.0.2",
"@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
"openai": "5.11.0",
"typescript": "catalog:",
},
@@ -147,6 +150,7 @@
"@tsconfig/bun": "1.0.9",
"@types/luxon": "3.7.1",
"@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
"typescript": "catalog:",
"vite": "catalog:",
"vite-plugin-icons-spritesheet": "3.0.1",
@@ -181,6 +185,7 @@
"@modelcontextprotocol/sdk": "1.15.1",
"@openauthjs/openauth": "catalog:",
"@opencode-ai/plugin": "workspace:*",
+ "@opencode-ai/script": "workspace:*",
"@opencode-ai/sdk": "workspace:*",
"@opentui/core": "0.0.0-20251010-2eed09fd",
"@opentui/solid": "0.0.0-20251010-2eed09fd",
@@ -229,6 +234,7 @@
"@types/bun": "catalog:",
"@types/turndown": "5.0.5",
"@types/yargs": "17.0.33",
+ "@typescript/native-preview": "catalog:",
"typescript": "catalog:",
"vscode-languageserver-types": "3.17.5",
"why-is-node-running": "3.2.2",
@@ -245,6 +251,7 @@
"devDependencies": {
"@tsconfig/node22": "catalog:",
"@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
"typescript": "catalog:",
},
},
@@ -261,6 +268,7 @@
"@hey-api/openapi-ts": "0.81.0",
"@tsconfig/node22": "catalog:",
"@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
"typescript": "catalog:",
},
},
@@ -273,6 +281,7 @@
},
"devDependencies": {
"@types/node": "catalog:",
+ "@typescript/native-preview": "catalog:",
"typescript": "catalog:",
},
},
@@ -345,6 +354,7 @@
"@tsconfig/node22": "22.0.2",
"@types/bun": "1.3.0",
"@types/node": "22.13.9",
+ "@typescript/native-preview": "7.0.0-dev.20251014.1",
"ai": "5.0.8",
"diff": "8.0.2",
"fuzzysort": "3.1.0",
@@ -1420,6 +1430,22 @@
"@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="],
+ "@typescript/native-preview": ["@typescript/native-preview@7.0.0-dev.20251014.1", "", { "optionalDependencies": { "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20251014.1", "@typescript/native-preview-darwin-x64": "7.0.0-dev.20251014.1", "@typescript/native-preview-linux-arm": "7.0.0-dev.20251014.1", "@typescript/native-preview-linux-arm64": "7.0.0-dev.20251014.1", "@typescript/native-preview-linux-x64": "7.0.0-dev.20251014.1", "@typescript/native-preview-win32-arm64": "7.0.0-dev.20251014.1", "@typescript/native-preview-win32-x64": "7.0.0-dev.20251014.1" }, "bin": { "tsgo": "bin/tsgo.js" } }, "sha512-IqmX5CYCBqXbfL+HKlcQAMaDlfJ0Z8OhUxvADFV2TENnzSYI4CuhvKxwOB2wFSLXufVsgtAlf3Fjwn24KmMyPQ=="],
+
+ "@typescript/native-preview-darwin-arm64": ["@typescript/native-preview-darwin-arm64@7.0.0-dev.20251014.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-7rQoLlerWnwnvrM56hP4rdEbo4xDE4zr7cch+EzgENq/tbXYereGq1fmnR83UNglb1Eyy53OvJZ3O2csYBa2vg=="],
+
+ "@typescript/native-preview-darwin-x64": ["@typescript/native-preview-darwin-x64@7.0.0-dev.20251014.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-SF29o9NFRGDM23Jz0nVO4/yS78GQ81rtOemmCVNXuJotoY4bP3npGDyEmfkZQHZgDOXogs2OWy3t7NUJ235ANQ=="],
+
+ "@typescript/native-preview-linux-arm": ["@typescript/native-preview-linux-arm@7.0.0-dev.20251014.1", "", { "os": "linux", "cpu": "arm" }, "sha512-o5cu7h+BBAp6V4qxYY5RWuaYouN3j+MGFLrrUtvvNj4XKM+kbq5qwsgVRsmJZ1LfUvHmzyQs86vt9djAWedzjQ=="],
+
+ "@typescript/native-preview-linux-arm64": ["@typescript/native-preview-linux-arm64@7.0.0-dev.20251014.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-+YWbW/JF4uggEUBr+vflqI5i7bL4Z3XInCOyUO1qQEY7VmfDCsPEzIwGi37O1mixfxw9Qj8LQsptCkU+fqKwGw=="],
+
+ "@typescript/native-preview-linux-x64": ["@typescript/native-preview-linux-x64@7.0.0-dev.20251014.1", "", { "os": "linux", "cpu": "x64" }, "sha512-3LC4tgcgi6zWJWBUpBNXOGSY3yISJrQezSP/T+v+mQRApkdoIpTSHIyQAhgaagcs3MOQRaqiIPaLOVrdHXdU6A=="],
+
+ "@typescript/native-preview-win32-arm64": ["@typescript/native-preview-win32-arm64@7.0.0-dev.20251014.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-P0D4UEXwzFZh3pHexe2Ky1tW/HjY/HxTBTIajz2ViDCNPw7uDSEsXSB4H9TTiFJw8gVdTUFbsoAQp1MteTeORA=="],
+
+ "@typescript/native-preview-win32-x64": ["@typescript/native-preview-win32-x64@7.0.0-dev.20251014.1", "", { "os": "win32", "cpu": "x64" }, "sha512-fi53g2ihH7tkQLlz8hZGAb2V+3aNZpcxrZ530CQ4xcWwAqssEj0EaZJX0VLEtIQBar1ttGVK9Pz/wJU9sYyVzg=="],
+
"@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
"@vercel/nft": ["@vercel/nft@0.30.2", "", { "dependencies": { "@mapbox/node-pre-gyp": "^2.0.0", "@rollup/pluginutils": "^5.1.3", "acorn": "^8.6.0", "acorn-import-attributes": "^1.9.5", "async-sema": "^3.1.1", "bindings": "^1.4.0", "estree-walker": "2.0.2", "glob": "^10.4.5", "graceful-fs": "^4.2.9", "node-gyp-build": "^4.2.2", "picomatch": "^4.0.2", "resolve-from": "^5.0.0" }, "bin": { "nft": "out/cli.js" } }, "sha512-pquXF3XZFg/T3TBor08rUhIGgOhdSilbn7WQLVP/aVSSO+25Rs4H/m3nxNDQ2x3znX7Z3yYjryN8xaLwypcwQg=="],
diff --git a/package.json b/package.json
index c12f61804..c1deb7420 100644
--- a/package.json
+++ b/package.json
@@ -34,6 +34,7 @@
"fuzzysort": "3.1.0",
"luxon": "3.6.1",
"typescript": "5.8.2",
+ "@typescript/native-preview": "7.0.0-dev.20251014.1",
"zod": "4.1.8",
"remeda": "2.26.0",
"solid-js": "1.9.9",
diff --git a/packages/console/app/package.json b/packages/console/app/package.json
index 5c4a63f14..c4019388e 100644
--- a/packages/console/app/package.json
+++ b/packages/console/app/package.json
@@ -2,7 +2,7 @@
"name": "@opencode-ai/console-app",
"type": "module",
"scripts": {
- "typecheck": "tsc --noEmit",
+ "typecheck": "tsgo --noEmit",
"dev": "vinxi dev --host 0.0.0.0",
"dev:remote": "VITE_AUTH_URL=https://auth.dev.opencode.ai bun sst shell --stage=dev bun dev",
"build": "vinxi build && ../../opencode/script/schema.ts ./.output/public/config.json",
@@ -25,7 +25,8 @@
"zod": "catalog:"
},
"devDependencies": {
- "typescript": "catalog:"
+ "typescript": "catalog:",
+ "@typescript/native-preview": "catalog:"
},
"engines": {
"node": ">=22"
diff --git a/packages/console/app/src/component/header.tsx b/packages/console/app/src/component/header.tsx
index 29b35bfa4..d6b3e2a43 100644
--- a/packages/console/app/src/component/header.tsx
+++ b/packages/console/app/src/component/header.tsx
@@ -4,9 +4,11 @@ import { A, createAsync } from "@solidjs/router"
import { createMemo, Match, Show, Switch } from "solid-js"
import { createStore } from "solid-js/store"
import { github } from "~/lib/github"
+import { queryIsLoggedIn } from "~/routes/workspace/common"
export function Header(props: { zen?: boolean }) {
const githubData = createAsync(() => github())
+ const isLoggedIn = createAsync(() => queryIsLoggedIn())
const starCount = createMemo(() =>
githubData()?.stars
? new Intl.NumberFormat("en-US", {
@@ -39,7 +41,7 @@ export function Header(props: { zen?: boolean }) {
- Login
+ {isLoggedIn() ? "Workspace" : "Login"}
Zen
@@ -110,7 +112,7 @@ export function Header(props: { zen?: boolean }) {
- Login
+ {isLoggedIn() ? "Workspace" : "Login"}
Zen
diff --git a/packages/console/app/src/component/icon.tsx b/packages/console/app/src/component/icon.tsx
index ccf2dccfc..fc27ef3b4 100644
--- a/packages/console/app/src/component/icon.tsx
+++ b/packages/console/app/src/component/icon.tsx
@@ -118,3 +118,86 @@ export function IconWorkspaceLogo(props: JSX.SvgSVGAttributes) {
)
}
+
+export function IconOpenAI(props: JSX.SvgSVGAttributes) {
+ return (
+
+ )
+}
+
+export function IconAnthropic(props: JSX.SvgSVGAttributes) {
+ return (
+
+ )
+}
+
+export function IconXai(props: JSX.SvgSVGAttributes) {
+ return (
+
+ )
+}
+
+export function IconAlibaba(props: JSX.SvgSVGAttributes) {
+ return (
+
+ )
+}
+
+export function IconMoonshotAI(props: JSX.SvgSVGAttributes) {
+ return (
+
+ )
+}
+
+export function IconZai(props: JSX.SvgSVGAttributes) {
+ return (
+
+ )
+}
+
+export function IconStealth(props: JSX.SvgSVGAttributes) {
+ return (
+
+ )
+}
diff --git a/packages/console/app/src/routes/index.tsx b/packages/console/app/src/routes/index.tsx
index d51e9ec18..287c25735 100644
--- a/packages/console/app/src/routes/index.tsx
+++ b/packages/console/app/src/routes/index.tsx
@@ -43,7 +43,7 @@ export default function Home() {
OpenCode | The AI coding agent built for the terminal
-
+