summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/opencode.yml1
-rw-r--r--.github/workflows/publish.yml2
-rw-r--r--.opencode/opencode.jsonc15
-rw-r--r--bun.lock31
-rw-r--r--infra/enterprise.ts6
-rw-r--r--infra/stage.ts6
-rw-r--r--nix/hashes.json2
-rw-r--r--package.json2
-rw-r--r--packages/console/app/package.json2
-rw-r--r--packages/console/app/src/routes/t/[...path].tsx20
-rw-r--r--packages/console/core/package.json2
-rw-r--r--packages/console/function/package.json2
-rw-r--r--packages/console/mail/package.json2
-rw-r--r--packages/desktop/package.json2
-rw-r--r--packages/desktop/tsconfig.json4
-rw-r--r--packages/enterprise/package.json3
-rw-r--r--packages/enterprise/src/entry-server.tsx2
-rw-r--r--packages/enterprise/src/routes/index.tsx3
-rw-r--r--packages/enterprise/src/routes/share/[shareID].tsx455
-rw-r--r--packages/enterprise/vite.config.ts9
-rw-r--r--packages/extensions/zed/extension.toml12
-rw-r--r--packages/function/package.json2
-rw-r--r--packages/opencode/package.json2
-rw-r--r--packages/opencode/src/bus/index.ts17
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/index.tsx2
-rw-r--r--packages/opencode/src/project/instance.ts10
-rw-r--r--packages/opencode/src/provider/provider.ts10
-rw-r--r--packages/opencode/src/provider/transform.ts11
-rw-r--r--packages/opencode/src/server/server.ts30
-rw-r--r--packages/opencode/src/session/index.ts25
-rw-r--r--packages/opencode/src/share/share-next.ts15
-rw-r--r--packages/opencode/src/tool/bash.txt3
-rw-r--r--packages/plugin/package.json2
-rw-r--r--packages/sdk/js/package.json2
-rw-r--r--packages/sdk/js/src/v2/gen/sdk.gen.ts13
-rw-r--r--packages/sdk/js/src/v2/gen/types.gen.ts24
-rw-r--r--packages/sdk/openapi.json42
-rw-r--r--packages/slack/package.json2
-rw-r--r--packages/tauri/package.json2
-rw-r--r--packages/tauri/src-tauri/icons/128x128.pngbin793 -> 9013 bytes
-rw-r--r--packages/tauri/src-tauri/icons/[email protected]bin1161 -> 36840 bytes
-rw-r--r--packages/tauri/src-tauri/icons/32x32.pngbin486 -> 1255 bytes
-rw-r--r--packages/tauri/src-tauri/icons/64x64.pngbin540 -> 2971 bytes
-rw-r--r--packages/tauri/src-tauri/icons/Square107x107Logo.pngbin745 -> 6441 bytes
-rw-r--r--packages/tauri/src-tauri/icons/Square142x142Logo.pngbin940 -> 10850 bytes
-rw-r--r--packages/tauri/src-tauri/icons/Square150x150Logo.pngbin952 -> 12036 bytes
-rw-r--r--packages/tauri/src-tauri/icons/Square284x284Logo.pngbin1557 -> 47137 bytes
-rw-r--r--packages/tauri/src-tauri/icons/Square30x30Logo.pngbin588 -> 1109 bytes
-rw-r--r--packages/tauri/src-tauri/icons/Square310x310Logo.pngbin1724 -> 58165 bytes
-rw-r--r--packages/tauri/src-tauri/icons/Square44x44Logo.pngbin614 -> 1827 bytes
-rw-r--r--packages/tauri/src-tauri/icons/Square71x71Logo.pngbin691 -> 3405 bytes
-rw-r--r--packages/tauri/src-tauri/icons/Square89x89Logo.pngbin751 -> 4760 bytes
-rw-r--r--packages/tauri/src-tauri/icons/StoreLogo.pngbin702 -> 2186 bytes
-rw-r--r--packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher.pngbin817 -> 1886 bytes
-rw-r--r--packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.pngbin1022 -> 13918 bytes
-rw-r--r--packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.pngbin944 -> 1811 bytes
-rw-r--r--packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher.pngbin735 -> 1873 bytes
-rw-r--r--packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.pngbin891 -> 6540 bytes
-rw-r--r--packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.pngbin797 -> 1751 bytes
-rw-r--r--packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.pngbin821 -> 4726 bytes
-rw-r--r--packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.pngbin1286 -> 25393 bytes
-rw-r--r--packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.pngbin1069 -> 4101 bytes
-rw-r--r--packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.pngbin1188 -> 9156 bytes
-rw-r--r--packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.pngbin1667 -> 64829 bytes
-rw-r--r--packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.pngbin1471 -> 8270 bytes
-rw-r--r--packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.pngbin1154 -> 15359 bytes
-rw-r--r--packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.pngbin1641 -> 127895 bytes
-rw-r--r--packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.pngbin1524 -> 14064 bytes
-rw-r--r--packages/tauri/src-tauri/icons/icon.icnsbin107468 -> 1010901 bytes
-rw-r--r--packages/tauri/src-tauri/icons/icon.icobin4669 -> 47600 bytes
-rw-r--r--packages/tauri/src-tauri/icons/icon.pngbin1862 -> 190179 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin420 -> 728 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin606 -> 1607 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin606 -> 1607 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin657 -> 2648 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin481 -> 1094 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin595 -> 2542 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin595 -> 2542 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin747 -> 4709 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin606 -> 1607 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin570 -> 4058 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin570 -> 4058 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin855 -> 7828 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin7412 -> 681769 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin855 -> 7828 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin1085 -> 17106 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin729 -> 3730 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin1016 -> 12166 bytes
-rw-r--r--packages/tauri/src-tauri/icons/ios/[email protected]bin976 -> 14705 bytes
-rw-r--r--packages/tauri/tsconfig.json16
-rw-r--r--packages/ui/package.json2
-rw-r--r--packages/util/package.json2
-rw-r--r--packages/web/package.json2
-rw-r--r--packages/web/src/content/docs/sdk.mdx28
-rw-r--r--sdks/vscode/package.json2
95 files changed, 517 insertions, 332 deletions
diff --git a/.github/workflows/opencode.yml b/.github/workflows/opencode.yml
index 44c8d4a58..4c75ad2e0 100644
--- a/.github/workflows/opencode.yml
+++ b/.github/workflows/opencode.yml
@@ -29,5 +29,6 @@ jobs:
uses: sst/opencode/github@latest
env:
OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
+ OPENCODE_PERMISSION: '{"bash": "deny"}'
with:
model: opencode/claude-haiku-4-5
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index eea0e21ae..14078661c 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -55,7 +55,7 @@ jobs:
- name: Install OpenCode
if: inputs.bump || inputs.version
- run: curl -fsSL https://opencode.ai/install | bash
+ run: bun i -g [email protected]
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
diff --git a/.opencode/opencode.jsonc b/.opencode/opencode.jsonc
index dc0bee7c3..fe70e35fa 100644
--- a/.opencode/opencode.jsonc
+++ b/.opencode/opencode.jsonc
@@ -1,6 +1,6 @@
{
"$schema": "https://opencode.ai/config.json",
- "plugin": ["opencode-openai-codex-auth"],
+ // "plugin": ["opencode-openai-codex-auth"],
// "enterprise": {
// "url": "https://enterprise.dev.opencode.ai",
// },
@@ -10,17 +10,4 @@
"options": {},
},
},
- "mcp": {
- "exa": {
- "type": "remote",
- "url": "https://mcp.exa.ai/mcp",
- },
- "morph": {
- "type": "local",
- "command": ["bunx", "@morphllm/morphmcp"],
- "environment": {
- "ENABLED_TOOLS": "warp_grep",
- },
- },
- },
}
diff --git a/bun.lock b/bun.lock
index bb83e7682..e775f2df8 100644
--- a/bun.lock
+++ b/bun.lock
@@ -20,7 +20,7 @@
},
"packages/console/app": {
"name": "@opencode-ai/console-app",
- "version": "1.0.143",
+ "version": "1.0.146",
"dependencies": {
"@cloudflare/vite-plugin": "1.15.2",
"@ibm/plex": "6.4.1",
@@ -48,7 +48,7 @@
},
"packages/console/core": {
"name": "@opencode-ai/console-core",
- "version": "1.0.143",
+ "version": "1.0.146",
"dependencies": {
"@aws-sdk/client-sts": "3.782.0",
"@jsx-email/render": "1.1.1",
@@ -75,7 +75,7 @@
},
"packages/console/function": {
"name": "@opencode-ai/console-function",
- "version": "1.0.143",
+ "version": "1.0.146",
"dependencies": {
"@ai-sdk/anthropic": "2.0.0",
"@ai-sdk/openai": "2.0.2",
@@ -99,7 +99,7 @@
},
"packages/console/mail": {
"name": "@opencode-ai/console-mail",
- "version": "1.0.143",
+ "version": "1.0.146",
"dependencies": {
"@jsx-email/all": "2.2.3",
"@jsx-email/cli": "1.4.3",
@@ -123,7 +123,7 @@
},
"packages/desktop": {
"name": "@opencode-ai/desktop",
- "version": "1.0.143",
+ "version": "1.0.146",
"dependencies": {
"@kobalte/core": "catalog:",
"@opencode-ai/sdk": "workspace:*",
@@ -168,7 +168,7 @@
},
"packages/enterprise": {
"name": "@opencode-ai/enterprise",
- "version": "1.0.143",
+ "version": "1.0.146",
"dependencies": {
"@opencode-ai/ui": "workspace:*",
"@opencode-ai/util": "workspace:*",
@@ -179,6 +179,7 @@
"aws4fetch": "^1.0.20",
"hono": "catalog:",
"hono-openapi": "catalog:",
+ "js-base64": "3.7.7",
"luxon": "catalog:",
"nitro": "3.0.1-alpha.1",
"solid-js": "catalog:",
@@ -196,7 +197,7 @@
},
"packages/function": {
"name": "@opencode-ai/function",
- "version": "1.0.143",
+ "version": "1.0.146",
"dependencies": {
"@octokit/auth-app": "8.0.1",
"@octokit/rest": "22.0.0",
@@ -212,7 +213,7 @@
},
"packages/opencode": {
"name": "opencode",
- "version": "1.0.143",
+ "version": "1.0.146",
"bin": {
"opencode": "./bin/opencode",
},
@@ -304,7 +305,7 @@
},
"packages/plugin": {
"name": "@opencode-ai/plugin",
- "version": "1.0.143",
+ "version": "1.0.146",
"dependencies": {
"@opencode-ai/sdk": "workspace:*",
"zod": "catalog:",
@@ -324,7 +325,7 @@
},
"packages/sdk/js": {
"name": "@opencode-ai/sdk",
- "version": "1.0.143",
+ "version": "1.0.146",
"devDependencies": {
"@hey-api/openapi-ts": "0.88.1",
"@tsconfig/node22": "catalog:",
@@ -335,7 +336,7 @@
},
"packages/slack": {
"name": "@opencode-ai/slack",
- "version": "1.0.143",
+ "version": "1.0.146",
"dependencies": {
"@opencode-ai/sdk": "workspace:*",
"@slack/bolt": "^3.17.1",
@@ -348,7 +349,7 @@
},
"packages/tauri": {
"name": "@opencode-ai/tauri",
- "version": "1.0.143",
+ "version": "1.0.146",
"dependencies": {
"@opencode-ai/desktop": "workspace:*",
"@tauri-apps/api": "^2",
@@ -370,7 +371,7 @@
},
"packages/ui": {
"name": "@opencode-ai/ui",
- "version": "1.0.143",
+ "version": "1.0.146",
"dependencies": {
"@kobalte/core": "catalog:",
"@opencode-ai/sdk": "workspace:*",
@@ -402,7 +403,7 @@
},
"packages/util": {
"name": "@opencode-ai/util",
- "version": "1.0.143",
+ "version": "1.0.146",
"dependencies": {
"zod": "catalog:",
},
@@ -413,7 +414,7 @@
},
"packages/web": {
"name": "@opencode-ai/web",
- "version": "1.0.143",
+ "version": "1.0.146",
"dependencies": {
"@astrojs/cloudflare": "12.6.3",
"@astrojs/markdown-remark": "6.3.1",
diff --git a/infra/enterprise.ts b/infra/enterprise.ts
index 70693846a..22b4c6f44 100644
--- a/infra/enterprise.ts
+++ b/infra/enterprise.ts
@@ -1,10 +1,10 @@
import { SECRET } from "./secret"
-import { domain } from "./stage"
+import { domain, shortDomain } from "./stage"
const storage = new sst.cloudflare.Bucket("EnterpriseStorage")
-const enterprise = new sst.cloudflare.x.SolidStart("Enterprise", {
- domain: "enterprise." + domain,
+const teams = new sst.cloudflare.x.SolidStart("Teams", {
+ domain: shortDomain,
path: "packages/enterprise",
buildCommand: "bun run build:cloudflare",
environment: {
diff --git a/infra/stage.ts b/infra/stage.ts
index 729422905..f9a6fd755 100644
--- a/infra/stage.ts
+++ b/infra/stage.ts
@@ -11,3 +11,9 @@ new cloudflare.RegionalHostname("RegionalHostname", {
regionKey: "us",
zoneId: zoneID,
})
+
+export const shortDomain = (() => {
+ if ($app.stage === "production") return "opncd.ai"
+ if ($app.stage === "dev") return "dev.opncd.ai"
+ return `${$app.stage}.dev.opncd.ai`
+})()
diff --git a/nix/hashes.json b/nix/hashes.json
index ee38c07f5..84fe54493 100644
--- a/nix/hashes.json
+++ b/nix/hashes.json
@@ -1,3 +1,3 @@
{
- "nodeModules": "sha256-WQMQmqKojxdRtwv6KL9HBaDfwYa4qPn2pvXKqgNM73A="
+ "nodeModules": "sha256-WcFRAG8w1XwgZxzyAawkQ7mYfJxu5VhA3sPApEG6FdI="
}
diff --git a/package.json b/package.json
index 4579a06f3..39733b931 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
"description": "AI-powered development tool",
"private": true,
"type": "module",
- "packageManager": "[email protected]",
+ "packageManager": "[email protected]",
"scripts": {
"dev": "bun run --cwd packages/opencode --conditions=browser src/index.ts",
"typecheck": "bun turbo typecheck",
diff --git a/packages/console/app/package.json b/packages/console/app/package.json
index 96a47a46c..0dcc6e4af 100644
--- a/packages/console/app/package.json
+++ b/packages/console/app/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-app",
- "version": "1.0.143",
+ "version": "1.0.146",
"type": "module",
"scripts": {
"typecheck": "tsgo --noEmit",
diff --git a/packages/console/app/src/routes/t/[...path].tsx b/packages/console/app/src/routes/t/[...path].tsx
new file mode 100644
index 000000000..b877a8d58
--- /dev/null
+++ b/packages/console/app/src/routes/t/[...path].tsx
@@ -0,0 +1,20 @@
+import type { APIEvent } from "@solidjs/start/server"
+
+async function handler(evt: APIEvent) {
+ const req = evt.request.clone()
+ const url = new URL(req.url)
+ const targetUrl = `https://enterprise.opencode.ai/${url.pathname}${url.search}`
+ const response = await fetch(targetUrl, {
+ method: req.method,
+ headers: req.headers,
+ body: req.body,
+ })
+ return response
+}
+
+export const GET = handler
+export const POST = handler
+export const PUT = handler
+export const DELETE = handler
+export const OPTIONS = handler
+export const PATCH = handler
diff --git a/packages/console/core/package.json b/packages/console/core/package.json
index 5540ed2e1..814694f9f 100644
--- a/packages/console/core/package.json
+++ b/packages/console/core/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/console-core",
- "version": "1.0.143",
+ "version": "1.0.146",
"private": true,
"type": "module",
"dependencies": {
diff --git a/packages/console/function/package.json b/packages/console/function/package.json
index 634d53893..f3e04ea1c 100644
--- a/packages/console/function/package.json
+++ b/packages/console/function/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-function",
- "version": "1.0.143",
+ "version": "1.0.146",
"$schema": "https://json.schemastore.org/package.json",
"private": true,
"type": "module",
diff --git a/packages/console/mail/package.json b/packages/console/mail/package.json
index d289b290f..0707ce883 100644
--- a/packages/console/mail/package.json
+++ b/packages/console/mail/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-mail",
- "version": "1.0.143",
+ "version": "1.0.146",
"dependencies": {
"@jsx-email/all": "2.2.3",
"@jsx-email/cli": "1.4.3",
diff --git a/packages/desktop/package.json b/packages/desktop/package.json
index 65a8f9d13..6cd02b9ae 100644
--- a/packages/desktop/package.json
+++ b/packages/desktop/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/desktop",
- "version": "1.0.143",
+ "version": "1.0.146",
"description": "",
"type": "module",
"exports": {
diff --git a/packages/desktop/tsconfig.json b/packages/desktop/tsconfig.json
index e91a254de..db04f79ca 100644
--- a/packages/desktop/tsconfig.json
+++ b/packages/desktop/tsconfig.json
@@ -14,11 +14,11 @@
"strict": true,
"noEmit": false,
"emitDeclarationOnly": true,
- "outDir": "ts-dist",
+ "outDir": "node_modules/.ts-dist",
"isolatedModules": true,
"paths": {
"@/*": ["./src/*"]
}
},
- "exclude": ["dist"]
+ "exclude": ["dist", "ts-dist"]
}
diff --git a/packages/enterprise/package.json b/packages/enterprise/package.json
index cba02388e..b273507e0 100644
--- a/packages/enterprise/package.json
+++ b/packages/enterprise/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/enterprise",
- "version": "1.0.143",
+ "version": "1.0.146",
"private": true,
"type": "module",
"scripts": {
@@ -20,6 +20,7 @@
"@solidjs/meta": "catalog:",
"hono": "catalog:",
"hono-openapi": "catalog:",
+ "js-base64": "3.7.7",
"luxon": "catalog:",
"nitro": "3.0.1-alpha.1",
"solid-js": "catalog:",
diff --git a/packages/enterprise/src/entry-server.tsx b/packages/enterprise/src/entry-server.tsx
index 68f4325c8..fbe5e6e0b 100644
--- a/packages/enterprise/src/entry-server.tsx
+++ b/packages/enterprise/src/entry-server.tsx
@@ -11,8 +11,6 @@ export default createHandler(() => (
<title>OpenCode</title>
<meta name="theme-color" content="#F8F7F7" />
<meta name="theme-color" content="#131010" media="(prefers-color-scheme: dark)" />
- <meta property="og:image" content="/social-share.png" />
- <meta property="twitter:image" content="/social-share.png" />
{assets}
</head>
<body class="antialiased overscroll-none select-none text-12-regular">
diff --git a/packages/enterprise/src/routes/index.tsx b/packages/enterprise/src/routes/index.tsx
new file mode 100644
index 000000000..5a743b039
--- /dev/null
+++ b/packages/enterprise/src/routes/index.tsx
@@ -0,0 +1,3 @@
+export default function () {
+ return <div>Hello World</div>
+}
diff --git a/packages/enterprise/src/routes/share/[shareID].tsx b/packages/enterprise/src/routes/share/[shareID].tsx
index 1c593ca87..fee66b478 100644
--- a/packages/enterprise/src/routes/share/[shareID].tsx
+++ b/packages/enterprise/src/routes/share/[shareID].tsx
@@ -23,6 +23,8 @@ import { preloadMultiFileDiff, PreloadMultiFileDiffResult } from "@pierre/precis
import { Diff as SSRDiff } from "@opencode-ai/ui/diff-ssr"
import { clientOnly } from "@solidjs/start"
import { type IconName } from "@opencode-ai/ui/icons/provider"
+import { Meta } from "@solidjs/meta"
+import { Base64 } from "js-base64"
const ClientOnlyDiff = clientOnly(() => import("@opencode-ai/ui/diff").then((m) => ({ default: m.Diff })))
@@ -41,6 +43,7 @@ const getData = query(async (shareID) => {
const data = await Share.data(shareID)
const result: {
sessionID: string
+ shareID: string
session: Session[]
session_diff: {
[sessionID: string]: FileDiff[]
@@ -65,6 +68,7 @@ const getData = query(async (shareID) => {
}
} = {
sessionID: share.sessionID,
+ shareID,
session: [],
session_diff: {
[share.sessionID]: [],
@@ -153,244 +157,277 @@ export default function () {
)
}}
>
+ <Meta name="robots" content="noindex, nofollow" />
<Show when={data()}>
{(data) => {
const match = createMemo(() => Binary.search(data().session, data().sessionID, (s) => s.id))
if (!match().found) throw new Error(`Session ${data().sessionID} not found`)
const info = createMemo(() => data().session[match().index])
+ const ogImage = createMemo(() => {
+ const models = new Set<string>()
+ const messages = data().message[data().sessionID] ?? []
+ for (const msg of messages) {
+ if (msg.role === "assistant" && msg.modelID) {
+ models.add(msg.modelID)
+ }
+ }
+ const modelIDs = Array.from(models)
+ const encodedTitle = encodeURIComponent(Base64.encode(encodeURIComponent(info().title.substring(0, 700))))
+ let modelParam: string
+ if (modelIDs.length === 1) {
+ modelParam = modelIDs[0]
+ } else if (modelIDs.length === 2) {
+ modelParam = encodeURIComponent(`${modelIDs[0]} & ${modelIDs[1]}`)
+ } else if (modelIDs.length > 2) {
+ modelParam = encodeURIComponent(`${modelIDs[0]} & ${modelIDs.length - 1} others`)
+ } else {
+ modelParam = "unknown"
+ }
+ const version = `v${info().version}`
+ return `https://social-cards.sst.dev/opencode-share/${encodedTitle}.png?model=${modelParam}&version=${version}&id=${data().shareID}`
+ })
return (
- <DiffComponentProvider component={ClientOnlyDiff}>
- <DataProvider data={data()} directory={info().directory}>
- {iife(() => {
- const [store, setStore] = createStore({
- messageId: undefined as string | undefined,
- })
- const messages = createMemo(() =>
- data().sessionID
- ? (data().message[data().sessionID]?.filter((m) => m.role === "user") ?? []).sort(
- (a, b) => b.time.created - a.time.created,
- )
- : [],
- )
- const firstUserMessage = createMemo(() => messages().at(0))
- const activeMessage = createMemo(
- () => messages().find((m) => m.id === store.messageId) ?? firstUserMessage(),
- )
- function setActiveMessage(message: UserMessage | undefined) {
- if (message) {
- setStore("messageId", message.id)
- } else {
- setStore("messageId", undefined)
+ <>
+ <Meta name="description" content="opencode - The AI coding agent built for the terminal." />
+ <Meta property="og:image" content={ogImage()} />
+ <Meta name="twitter:image" content={ogImage()} />
+ <DiffComponentProvider component={ClientOnlyDiff}>
+ <DataProvider data={data()} directory={info().directory}>
+ {iife(() => {
+ const [store, setStore] = createStore({
+ messageId: undefined as string | undefined,
+ })
+ const messages = createMemo(() =>
+ data().sessionID
+ ? (data().message[data().sessionID]?.filter((m) => m.role === "user") ?? []).sort(
+ (a, b) => b.time.created - a.time.created,
+ )
+ : [],
+ )
+ const firstUserMessage = createMemo(() => messages().at(0))
+ const activeMessage = createMemo(
+ () => messages().find((m) => m.id === store.messageId) ?? firstUserMessage(),
+ )
+ function setActiveMessage(message: UserMessage | undefined) {
+ if (message) {
+ setStore("messageId", message.id)
+ } else {
+ setStore("messageId", undefined)
+ }
}
- }
- const provider = createMemo(() => activeMessage()?.model?.providerID)
- const modelID = createMemo(() => activeMessage()?.model?.modelID)
- const model = createMemo(() => data().model[data().sessionID]?.find((m) => m.id === modelID()))
- const diffs = createMemo(() => {
- const diffs = data().session_diff[data().sessionID] ?? []
- const preloaded = data().session_diff_preload[data().sessionID] ?? []
- return diffs.map((diff) => ({
- ...diff,
- preloaded: preloaded.find((d) => d.newFile.name === diff.file),
- }))
- })
- const splitDiffs = createMemo(() => {
- const diffs = data().session_diff[data().sessionID] ?? []
- const preloaded = data().session_diff_preload_split[data().sessionID] ?? []
- return diffs.map((diff) => ({
- ...diff,
- preloaded: preloaded.find((d) => d.newFile.name === diff.file),
- }))
- })
+ const provider = createMemo(() => activeMessage()?.model?.providerID)
+ const modelID = createMemo(() => activeMessage()?.model?.modelID)
+ const model = createMemo(() => data().model[data().sessionID]?.find((m) => m.id === modelID()))
+ const diffs = createMemo(() => {
+ const diffs = data().session_diff[data().sessionID] ?? []
+ const preloaded = data().session_diff_preload[data().sessionID] ?? []
+ return diffs.map((diff) => ({
+ ...diff,
+ preloaded: preloaded.find((d) => d.newFile.name === diff.file),
+ }))
+ })
+ const splitDiffs = createMemo(() => {
+ const diffs = data().session_diff[data().sessionID] ?? []
+ const preloaded = data().session_diff_preload_split[data().sessionID] ?? []
+ return diffs.map((diff) => ({
+ ...diff,
+ preloaded: preloaded.find((d) => d.newFile.name === diff.file),
+ }))
+ })
- const title = () => (
- <div class="flex flex-col gap-4">
- <div class="h-8 flex gap-4 items-center justify-start self-stretch">
- <div class="pl-[2.5px] pr-2 flex items-center gap-1.75 bg-surface-strong shadow-xs-border-base">
- <Mark class="shrink-0 w-3 my-0.5" />
- <div class="text-12-mono text-text-base">v{info().version}</div>
- </div>
- <div class="flex gap-2 items-center">
- <ProviderIcon id={provider() as IconName} class="size-3.5 shrink-0 text-icon-strong-base" />
- <div class="text-12-regular text-text-base">{model()?.name ?? modelID()}</div>
- </div>
- <div class="text-12-regular text-text-weaker">
- {DateTime.fromMillis(info().time.created).toFormat("dd MMM yyyy, HH:mm")}
+ const title = () => (
+ <div class="flex flex-col gap-4">
+ <div class="h-8 flex gap-4 items-center justify-start self-stretch">
+ <div class="pl-[2.5px] pr-2 flex items-center gap-1.75 bg-surface-strong shadow-xs-border-base">
+ <Mark class="shrink-0 w-3 my-0.5" />
+ <div class="text-12-mono text-text-base">v{info().version}</div>
+ </div>
+ <div class="flex gap-2 items-center">
+ <ProviderIcon id={provider() as IconName} class="size-3.5 shrink-0 text-icon-strong-base" />
+ <div class="text-12-regular text-text-base">{model()?.name ?? modelID()}</div>
+ </div>
+ <div class="text-12-regular text-text-weaker">
+ {DateTime.fromMillis(info().time.created).toFormat("dd MMM yyyy, HH:mm")}
+ </div>
</div>
+ <div class="text-left text-16-medium text-text-strong">{info().title}</div>
</div>
- <div class="text-left text-16-medium text-text-strong">{info().title}</div>
- </div>
- )
+ )
- const turns = () => (
- <div class="relative mt-2 pt-6 pb-8 min-w-0 w-full h-full overflow-y-auto no-scrollbar">
- <div class="px-4">{title()}</div>
- <div class="flex flex-col gap-15 items-start justify-start mt-4">
- <For each={messages()}>
- {(message) => (
- <SessionTurn
- sessionID={data().sessionID}
- messageID={message.id}
- classes={{
- root: "min-w-0 w-full relative",
- content:
- "flex flex-col justify-between !overflow-visible [&_[data-slot=session-turn-message-header]]:top-[-32px]",
- container: "px-4",
- }}
- />
- )}
- </For>
- </div>
- <div class="px-4 flex items-center justify-center pt-20 pb-8 shrink-0">
- <Logo class="w-58.5 opacity-12" />
+ const turns = () => (
+ <div class="relative mt-2 pt-6 pb-8 min-w-0 w-full h-full overflow-y-auto no-scrollbar">
+ <div class="px-4">{title()}</div>
+ <div class="flex flex-col gap-15 items-start justify-start mt-4">
+ <For each={messages()}>
+ {(message) => (
+ <SessionTurn
+ sessionID={data().sessionID}
+ messageID={message.id}
+ classes={{
+ root: "min-w-0 w-full relative",
+ content:
+ "flex flex-col justify-between !overflow-visible [&_[data-slot=session-turn-message-header]]:top-[-32px]",
+ container: "px-4",
+ }}
+ />
+ )}
+ </For>
+ </div>
+ <div class="px-4 flex items-center justify-center pt-20 pb-8 shrink-0">
+ <Logo class="w-58.5 opacity-12" />
+ </div>
</div>
- </div>
- )
+ )
- const wide = createMemo(() => diffs().length === 0)
+ const wide = createMemo(() => diffs().length === 0)
- return (
- <div class="relative bg-background-stronger w-screen h-screen overflow-hidden flex flex-col">
- <header class="h-12 px-6 py-2 flex items-center justify-between self-stretch bg-background-base border-b border-border-weak-base">
- <div class="">
- <a href="https://opencode.ai">
- <Mark />
- </a>
- </div>
- <div class="flex gap-3 items-center">
- <IconButton
- as={"a"}
- href="https://github.com/sst/opencode"
- target="_blank"
- icon="github"
- variant="ghost"
- />
- <IconButton
- as={"a"}
- href="https://opencode.ai/discord"
- target="_blank"
- icon="discord"
- variant="ghost"
- />
- </div>
- </header>
- <div class="select-text flex flex-col flex-1 min-h-0">
- <div
- classList={{ "hidden w-full flex-1 min-h-0": true, "md:flex": wide(), "lg:flex": !wide() }}
- >
+ return (
+ <div class="relative bg-background-stronger w-screen h-screen overflow-hidden flex flex-col">
+ <header class="h-12 px-6 py-2 flex items-center justify-between self-stretch bg-background-base border-b border-border-weak-base">
+ <div class="">
+ <a href="https://opencode.ai">
+ <Mark />
+ </a>
+ </div>
+ <div class="flex gap-3 items-center">
+ <IconButton
+ as={"a"}
+ href="https://github.com/sst/opencode"
+ target="_blank"
+ icon="github"
+ variant="ghost"
+ />
+ <IconButton
+ as={"a"}
+ href="https://opencode.ai/discord"
+ target="_blank"
+ icon="discord"
+ variant="ghost"
+ />
+ </div>
+ </header>
+ <div class="select-text flex flex-col flex-1 min-h-0">
<div
- classList={{
- "@container relative shrink-0 pt-14 flex flex-col gap-10 min-h-0 w-full": true,
- "mx-auto max-w-146": !wide(),
- }}
+ classList={{ "hidden w-full flex-1 min-h-0": true, "md:flex": wide(), "lg:flex": !wide() }}
>
<div
classList={{
- "w-full flex justify-start items-start min-w-0": true,
- "max-w-146 mx-auto px-6": wide(),
- "pr-6 pl-18": !wide() && messages().length > 1,
- "px-6": !wide() && messages().length === 1,
+ "@container relative shrink-0 pt-14 flex flex-col gap-10 min-h-0 w-full": true,
+ "mx-auto max-w-146": !wide(),
}}
>
- {title()}
- </div>
- <div class="flex items-start justify-start h-full min-h-0">
- <SessionMessageRail
- messages={messages()}
- current={activeMessage()}
- onMessageSelect={setActiveMessage}
- wide={wide()}
- />
- <SessionTurn
- sessionID={data().sessionID}
- messageID={store.messageId ?? firstUserMessage()!.id!}
- classes={{
- root: "grow",
- content: "flex flex-col justify-between items-start",
- container:
- "w-full pb-20 " +
- (wide() ? "max-w-146 mx-auto px-6" : messages().length > 1 ? "pr-6 pl-18" : "px-6"),
+ <div
+ classList={{
+ "w-full flex justify-start items-start min-w-0": true,
+ "max-w-146 mx-auto px-6": wide(),
+ "pr-6 pl-18": !wide() && messages().length > 1,
+ "px-6": !wide() && messages().length === 1,
}}
>
- <div classList={{ "w-full flex items-center justify-center pb-8 shrink-0": true }}>
- <Logo class="w-58.5 opacity-12" />
- </div>
- </SessionTurn>
- </div>
- </div>
- <Show when={diffs().length > 0}>
- <DiffComponentProvider component={SSRDiff}>
- <div class="@container relative grow pt-14 flex-1 min-h-0 border-l border-border-weak-base">
- <SessionReview
- class="@4xl:hidden"
- diffs={diffs()}
- classes={{
- root: "pb-20",
- header: "px-6",
- container: "px-6",
- }}
+ {title()}
+ </div>
+ <div class="flex items-start justify-start h-full min-h-0">
+ <SessionMessageRail
+ messages={messages()}
+ current={activeMessage()}
+ onMessageSelect={setActiveMessage}
+ wide={wide()}
/>
- <SessionReview
- split
- class="hidden @4xl:flex"
- diffs={splitDiffs()}
+ <SessionTurn
+ sessionID={data().sessionID}
+ messageID={store.messageId ?? firstUserMessage()!.id!}
classes={{
- root: "pb-20",
- header: "px-6",
- container: "px-6",
+ root: "grow",
+ content: "flex flex-col justify-between items-start",
+ container:
+ "w-full pb-20 " +
+ (wide()
+ ? "max-w-146 mx-auto px-6"
+ : messages().length > 1
+ ? "pr-6 pl-18"
+ : "px-6"),
}}
- />
+ >
+ <div classList={{ "w-full flex items-center justify-center pb-8 shrink-0": true }}>
+ <Logo class="w-58.5 opacity-12" />
+ </div>
+ </SessionTurn>
</div>
- </DiffComponentProvider>
- </Show>
- </div>
- <Switch>
- <Match when={diffs().length > 0}>
- <Tabs classList={{ "md:hidden": wide(), "lg:hidden": !wide() }}>
- <Tabs.List>
- <Tabs.Trigger value="session" class="w-1/2" classes={{ button: "w-full" }}>
- Session
- </Tabs.Trigger>
- <Tabs.Trigger value="review" class="w-1/2 !border-r-0" classes={{ button: "w-full" }}>
- {diffs().length} Files Changed
- </Tabs.Trigger>
- </Tabs.List>
- <Tabs.Content value="session" class="!overflow-hidden">
- {turns()}
- </Tabs.Content>
- <Tabs.Content
- forceMount
- value="review"
- class="!overflow-hidden hidden data-[selected]:block"
- >
- <div class="relative h-full pt-8 overflow-y-auto no-scrollbar">
- <DiffComponentProvider component={SSRDiff}>
- <SessionReview
- diffs={diffs()}
- classes={{
- root: "pb-20",
- header: "px-4",
- container: "px-4",
- }}
- />
- </DiffComponentProvider>
- </div>
- </Tabs.Content>
- </Tabs>
- </Match>
- <Match when={true}>
- <div classList={{ "!overflow-hidden": true, "md:hidden": wide(), "lg:hidden": !wide() }}>
- {turns()}
</div>
- </Match>
- </Switch>
+ <Show when={diffs().length > 0}>
+ <DiffComponentProvider component={SSRDiff}>
+ <div class="@container relative grow pt-14 flex-1 min-h-0 border-l border-border-weak-base">
+ <SessionReview
+ class="@4xl:hidden"
+ diffs={diffs()}
+ classes={{
+ root: "pb-20",
+ header: "px-6",
+ container: "px-6",
+ }}
+ />
+ <SessionReview
+ split
+ class="hidden @4xl:flex"
+ diffs={splitDiffs()}
+ classes={{
+ root: "pb-20",
+ header: "px-6",
+ container: "px-6",
+ }}
+ />
+ </div>
+ </DiffComponentProvider>
+ </Show>
+ </div>
+ <Switch>
+ <Match when={diffs().length > 0}>
+ <Tabs classList={{ "md:hidden": wide(), "lg:hidden": !wide() }}>
+ <Tabs.List>
+ <Tabs.Trigger value="session" class="w-1/2" classes={{ button: "w-full" }}>
+ Session
+ </Tabs.Trigger>
+ <Tabs.Trigger value="review" class="w-1/2 !border-r-0" classes={{ button: "w-full" }}>
+ {diffs().length} Files Changed
+ </Tabs.Trigger>
+ </Tabs.List>
+ <Tabs.Content value="session" class="!overflow-hidden">
+ {turns()}
+ </Tabs.Content>
+ <Tabs.Content
+ forceMount
+ value="review"
+ class="!overflow-hidden hidden data-[selected]:block"
+ >
+ <div class="relative h-full pt-8 overflow-y-auto no-scrollbar">
+ <DiffComponentProvider component={SSRDiff}>
+ <SessionReview
+ diffs={diffs()}
+ classes={{
+ root: "pb-20",
+ header: "px-4",
+ container: "px-4",
+ }}
+ />
+ </DiffComponentProvider>
+ </div>
+ </Tabs.Content>
+ </Tabs>
+ </Match>
+ <Match when={true}>
+ <div classList={{ "!overflow-hidden": true, "md:hidden": wide(), "lg:hidden": !wide() }}>
+ {turns()}
+ </div>
+ </Match>
+ </Switch>
+ </div>
</div>
- </div>
- )
- })}
- </DataProvider>
- </DiffComponentProvider>
+ )
+ })}
+ </DataProvider>
+ </DiffComponentProvider>
+ </>
)
}}
</Show>
diff --git a/packages/enterprise/vite.config.ts b/packages/enterprise/vite.config.ts
index fb51d750c..11ca1729d 100644
--- a/packages/enterprise/vite.config.ts
+++ b/packages/enterprise/vite.config.ts
@@ -18,7 +18,14 @@ const nitroConfig: any = (() => {
})()
export default defineConfig({
- plugins: [tailwindcss(), solidStart() as PluginOption, nitro(nitroConfig)],
+ plugins: [
+ tailwindcss(),
+ solidStart() as PluginOption,
+ nitro({
+ ...nitroConfig,
+ baseURL: process.env.OPENCODE_BASE_URL,
+ }),
+ ],
server: {
host: "0.0.0.0",
allowedHosts: true,
diff --git a/packages/extensions/zed/extension.toml b/packages/extensions/zed/extension.toml
index 03a0df6f3..252470f54 100644
--- a/packages/extensions/zed/extension.toml
+++ b/packages/extensions/zed/extension.toml
@@ -1,7 +1,7 @@
id = "opencode"
name = "OpenCode"
description = "The open source coding agent."
-version = "1.0.143"
+version = "1.0.146"
schema_version = 1
authors = ["Anomaly"]
repository = "https://github.com/sst/opencode"
@@ -11,26 +11,26 @@ name = "OpenCode"
icon = "./icons/opencode.svg"
[agent_servers.opencode.targets.darwin-aarch64]
-archive = "https://github.com/sst/opencode/releases/download/v1.0.143/opencode-darwin-arm64.zip"
+archive = "https://github.com/sst/opencode/releases/download/v1.0.146/opencode-darwin-arm64.zip"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.darwin-x86_64]
-archive = "https://github.com/sst/opencode/releases/download/v1.0.143/opencode-darwin-x64.zip"
+archive = "https://github.com/sst/opencode/releases/download/v1.0.146/opencode-darwin-x64.zip"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.linux-aarch64]
-archive = "https://github.com/sst/opencode/releases/download/v1.0.143/opencode-linux-arm64.tar.gz"
+archive = "https://github.com/sst/opencode/releases/download/v1.0.146/opencode-linux-arm64.tar.gz"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.linux-x86_64]
-archive = "https://github.com/sst/opencode/releases/download/v1.0.143/opencode-linux-x64.tar.gz"
+archive = "https://github.com/sst/opencode/releases/download/v1.0.146/opencode-linux-x64.tar.gz"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.windows-x86_64]
-archive = "https://github.com/sst/opencode/releases/download/v1.0.143/opencode-windows-x64.zip"
+archive = "https://github.com/sst/opencode/releases/download/v1.0.146/opencode-windows-x64.zip"
cmd = "./opencode.exe"
args = ["acp"]
diff --git a/packages/function/package.json b/packages/function/package.json
index 756cedd40..769f96efc 100644
--- a/packages/function/package.json
+++ b/packages/function/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/function",
- "version": "1.0.143",
+ "version": "1.0.146",
"$schema": "https://json.schemastore.org/package.json",
"private": true,
"type": "module",
diff --git a/packages/opencode/package.json b/packages/opencode/package.json
index ae6df98c1..ec7365c42 100644
--- a/packages/opencode/package.json
+++ b/packages/opencode/package.json
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
- "version": "1.0.143",
+ "version": "1.0.146",
"name": "opencode",
"type": "module",
"private": true,
diff --git a/packages/opencode/src/bus/index.ts b/packages/opencode/src/bus/index.ts
index b6ab73e51..edb093f19 100644
--- a/packages/opencode/src/bus/index.ts
+++ b/packages/opencode/src/bus/index.ts
@@ -7,7 +7,13 @@ import { GlobalBus } from "./global"
export namespace Bus {
const log = Log.create({ service: "bus" })
type Subscription = (event: any) => void
- const disposedEventType = "server.instance.disposed"
+
+ export const InstanceDisposed = BusEvent.define(
+ "server.instance.disposed",
+ z.object({
+ directory: z.string(),
+ }),
+ )
const state = Instance.state(
() => {
@@ -21,7 +27,7 @@ export namespace Bus {
const wildcard = entry.subscriptions.get("*")
if (!wildcard) return
const event = {
- type: disposedEventType,
+ type: InstanceDisposed.type,
properties: {
directory: Instance.directory,
},
@@ -32,13 +38,6 @@ export namespace Bus {
},
)
- export const InstanceDisposed = BusEvent.define(
- disposedEventType,
- z.object({
- directory: z.string(),
- }),
- )
-
export async function publish<Definition extends BusEvent.Definition>(
def: Definition,
properties: z.output<Definition["properties"]>,
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
index 185c0a5c3..22e740afe 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
@@ -894,7 +894,7 @@ export function Session() {
<box marginTop={1}>
<For each={revert()!.diffFiles}>
{(file) => (
- <text>
+ <text fg={theme.text}>
{file.filename}
<Show when={file.additions > 0}>
<span style={{ fg: theme.diffAdded }}> +{file.additions}</span>
diff --git a/packages/opencode/src/project/instance.ts b/packages/opencode/src/project/instance.ts
index 4defefa51..5291995a3 100644
--- a/packages/opencode/src/project/instance.ts
+++ b/packages/opencode/src/project/instance.ts
@@ -3,6 +3,7 @@ import { Context } from "../util/context"
import { Project } from "./project"
import { State } from "./state"
import { iife } from "@/util/iife"
+import { GlobalBus } from "@/bus/global"
interface Context {
directory: string
@@ -52,6 +53,15 @@ export const Instance = {
Log.Default.info("disposing instance", { directory: Instance.directory })
await State.dispose(Instance.directory)
cache.delete(Instance.directory)
+ GlobalBus.emit("event", {
+ directory: Instance.directory,
+ payload: {
+ type: "server.instance.disposed",
+ properties: {
+ directory: Instance.directory,
+ },
+ },
+ })
},
async disposeAll() {
Log.Default.info("disposing all instances")
diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts
index 719c3516c..60ce2297b 100644
--- a/packages/opencode/src/provider/provider.ts
+++ b/packages/opencode/src/provider/provider.ts
@@ -318,6 +318,16 @@ export namespace Provider {
},
}
},
+ cerebras: async () => {
+ return {
+ autoload: false,
+ options: {
+ headers: {
+ "X-Cerebras-3rd-Party-Integration": "opencode",
+ },
+ },
+ }
+ },
}
export const Model = z
diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts
index 2ae31acf8..b589d6371 100644
--- a/packages/opencode/src/provider/transform.ts
+++ b/packages/opencode/src/provider/transform.ts
@@ -74,12 +74,17 @@ export namespace ProviderTransform {
return result
}
+ // TODO: rm later
+ const bugged =
+ (model.id === "kimi-k2-thinking" && model.providerID === "opencode") ||
+ (model.id === "moonshotai/Kimi-K2-Thinking" && model.providerID === "baseten")
if (
model.providerID === "deepseek" ||
model.api.id.toLowerCase().includes("deepseek") ||
(model.capabilities.interleaved &&
typeof model.capabilities.interleaved === "object" &&
- model.capabilities.interleaved.field === "reasoning_content")
+ model.capabilities.interleaved.field === "reasoning_content" &&
+ !bugged)
) {
return msgs.map((msg) => {
if (msg.role === "assistant" && Array.isArray(msg.content)) {
@@ -231,9 +236,11 @@ export namespace ProviderTransform {
if (model.api.npm === "@ai-sdk/google" || model.api.npm === "@ai-sdk/google-vertex") {
result["thinkingConfig"] = {
- thinkingLevel: "high",
includeThoughts: true,
}
+ if (model.api.id.includes("gemini-3")) {
+ result["thinkingConfig"]["thinkingLevel"] = "high"
+ }
}
if (model.api.id.includes("gpt-5") && !model.api.id.includes("gpt-5-chat")) {
diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts
index 677c6cf13..ac7077bf7 100644
--- a/packages/opencode/src/server/server.ts
+++ b/packages/opencode/src/server/server.ts
@@ -56,6 +56,7 @@ export namespace Server {
export const Event = {
Connected: BusEvent.define("server.connected", z.object({})),
+ Disposed: BusEvent.define("global.disposed", z.object({})),
}
const app = new Hono()
@@ -140,6 +141,35 @@ export namespace Server {
})
},
)
+ .post(
+ "/global/dispose",
+ describeRoute({
+ summary: "Dispose instance",
+ description: "Clean up and dispose all OpenCode instances, releasing all resources.",
+ operationId: "global.dispose",
+ responses: {
+ 200: {
+ description: "Global disposed",
+ content: {
+ "application/json": {
+ schema: resolver(z.boolean()),
+ },
+ },
+ },
+ },
+ }),
+ async (c) => {
+ await Instance.disposeAll()
+ GlobalBus.emit("event", {
+ directory: "global",
+ payload: {
+ type: Event.Disposed.type,
+ properties: {},
+ },
+ })
+ return c.json(true)
+ },
+ )
.use(async (c, next) => {
const directory = c.req.query("directory") ?? c.req.header("x-opencode-directory") ?? process.cwd()
return Instance.provide({
diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts
index 484a1a8a7..bf3135284 100644
--- a/packages/opencode/src/session/index.ts
+++ b/packages/opencode/src/session/index.ts
@@ -223,34 +223,13 @@ export namespace Session {
if (cfg.share === "disabled") {
throw new Error("Sharing is disabled in configuration")
}
-
- if (cfg.enterprise?.url) {
- const { ShareNext } = await import("@/share/share-next")
- const share = await ShareNext.create(id)
- await update(id, (draft) => {
- draft.share = {
- url: share.url,
- }
- })
- }
-
- const session = await get(id)
- if (session.share) return session.share
- const { Share } = await import("../share/share")
- const share = await Share.create(id)
+ const { ShareNext } = await import("@/share/share-next")
+ const share = await ShareNext.create(id)
await update(id, (draft) => {
draft.share = {
url: share.url,
}
})
- await Storage.write(["share", id], share)
- await Share.sync("session/info/" + id, session)
- for (const msg of await messages({ sessionID: id })) {
- await Share.sync("session/message/" + id + "/" + msg.info.id, msg.info)
- for (const part of msg.parts) {
- await Share.sync("session/part/" + id + "/" + msg.info.id + "/" + part.id, part)
- }
- }
return share
})
diff --git a/packages/opencode/src/share/share-next.ts b/packages/opencode/src/share/share-next.ts
index 5196aeb98..fea9c3bb9 100644
--- a/packages/opencode/src/share/share-next.ts
+++ b/packages/opencode/src/share/share-next.ts
@@ -11,9 +11,11 @@ import type * as SDK from "@opencode-ai/sdk/v2"
export namespace ShareNext {
const log = Log.create({ service: "share-next" })
+ async function url() {
+ return Config.get().then((x) => x.enterprise?.url ?? "https://opncd.ai")
+ }
+
export async function init() {
- const config = await Config.get()
- if (!config.enterprise) return
Bus.subscribe(Session.Event.Updated, async (evt) => {
await sync(evt.properties.info.id, [
{
@@ -62,8 +64,7 @@ export namespace ShareNext {
export async function create(sessionID: string) {
log.info("creating share", { sessionID })
- const url = await Config.get().then((x) => x.enterprise!.url)
- const result = await fetch(`${url}/api/share`, {
+ const result = await fetch(`${await url()}/api/share`, {
method: "POST",
headers: {
"Content-Type": "application/json",
@@ -126,11 +127,10 @@ export namespace ShareNext {
const queued = queue.get(sessionID)
if (!queued) return
queue.delete(sessionID)
- const url = await Config.get().then((x) => x.enterprise!.url)
const share = await get(sessionID)
if (!share) return
- await fetch(`${url}/api/share/${share.id}/sync`, {
+ await fetch(`${await url()}/api/share/${share.id}/sync`, {
method: "POST",
headers: {
"Content-Type": "application/json",
@@ -146,10 +146,9 @@ export namespace ShareNext {
export async function remove(sessionID: string) {
log.info("removing share", { sessionID })
- const url = await Config.get().then((x) => x.enterprise!.url)
const share = await get(sessionID)
if (!share) return
- await fetch(`${url}/api/share/${share.id}`, {
+ await fetch(`${await url()}/api/share/${share.id}`, {
method: "DELETE",
headers: {
"Content-Type": "application/json",
diff --git a/packages/opencode/src/tool/bash.txt b/packages/opencode/src/tool/bash.txt
index 2773d3b85..8eadc500b 100644
--- a/packages/opencode/src/tool/bash.txt
+++ b/packages/opencode/src/tool/bash.txt
@@ -20,8 +20,7 @@ Usage notes:
- The command argument is required.
- You can specify an optional timeout in milliseconds (up to 600000ms / 10 minutes).
If not specified, commands will timeout after 120000ms (2 minutes).
- - It is very helpful if you write a clear, concise description of what this command
- does in 5-10 words.
+ - The description argument is required. You must write a clear, concise description of what this command does in 5-10 words.
- If the output exceeds 30000 characters, output will be truncated before being
returned to you.
- You can use the `run_in_background` parameter to run the command in the background,
diff --git a/packages/plugin/package.json b/packages/plugin/package.json
index f036a7cb3..e0620e4ce 100644
--- a/packages/plugin/package.json
+++ b/packages/plugin/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/plugin",
- "version": "1.0.143",
+ "version": "1.0.146",
"type": "module",
"scripts": {
"typecheck": "tsgo --noEmit",
diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json
index f4bb68eb5..214be5dba 100644
--- a/packages/sdk/js/package.json
+++ b/packages/sdk/js/package.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/sdk",
- "version": "1.0.143",
+ "version": "1.0.146",
"type": "module",
"scripts": {
"typecheck": "tsgo --noEmit",
diff --git a/packages/sdk/js/src/v2/gen/sdk.gen.ts b/packages/sdk/js/src/v2/gen/sdk.gen.ts
index 368113085..90df76c22 100644
--- a/packages/sdk/js/src/v2/gen/sdk.gen.ts
+++ b/packages/sdk/js/src/v2/gen/sdk.gen.ts
@@ -28,6 +28,7 @@ import type {
FindSymbolsResponses,
FindTextResponses,
FormatterStatusResponses,
+ GlobalDisposeResponses,
GlobalEventResponses,
InstanceDisposeResponses,
LspStatusResponses,
@@ -193,6 +194,18 @@ export class Global extends HeyApiClient {
...options,
})
}
+
+ /**
+ * Dispose instance
+ *
+ * Clean up and dispose all OpenCode instances, releasing all resources.
+ */
+ public dispose<ThrowOnError extends boolean = false>(options?: Options<never, ThrowOnError>) {
+ return (options?.client ?? this.client).post<GlobalDisposeResponses, unknown, ThrowOnError>({
+ url: "/global/dispose",
+ ...options,
+ })
+ }
}
export class Project extends HeyApiClient {
diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts
index 716bae9f8..dade066c0 100644
--- a/packages/sdk/js/src/v2/gen/types.gen.ts
+++ b/packages/sdk/js/src/v2/gen/types.gen.ts
@@ -725,6 +725,13 @@ export type EventServerConnected = {
}
}
+export type EventGlobalDisposed = {
+ type: "global.disposed"
+ properties: {
+ [key: string]: unknown
+ }
+}
+
export type Event =
| EventInstallationUpdated
| EventInstallationUpdateAvailable
@@ -759,6 +766,7 @@ export type Event =
| EventPtyExited
| EventPtyDeleted
| EventServerConnected
+ | EventGlobalDisposed
export type GlobalEvent = {
directory: string
@@ -1700,6 +1708,22 @@ export type GlobalEventResponses = {
export type GlobalEventResponse = GlobalEventResponses[keyof GlobalEventResponses]
+export type GlobalDisposeData = {
+ body?: never
+ path?: never
+ query?: never
+ url: "/global/dispose"
+}
+
+export type GlobalDisposeResponses = {
+ /**
+ * Global disposed
+ */
+ 200: boolean
+}
+
+export type GlobalDisposeResponse = GlobalDisposeResponses[keyof GlobalDisposeResponses]
+
export type ProjectListData = {
body?: never
path?: never
diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json
index 20ea2be5d..93f8746e9 100644
--- a/packages/sdk/openapi.json
+++ b/packages/sdk/openapi.json
@@ -31,6 +31,31 @@
]
}
},
+ "/global/dispose": {
+ "post": {
+ "operationId": "global.dispose",
+ "summary": "Dispose instance",
+ "description": "Clean up and dispose all OpenCode instances, releasing all resources.",
+ "responses": {
+ "200": {
+ "description": "Global disposed",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ },
+ "x-codeSamples": [
+ {
+ "lang": "js",
+ "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.global.dispose({\n ...\n})"
+ }
+ ]
+ }
+ },
"/project": {
"get": {
"operationId": "project.list",
@@ -6810,6 +6835,20 @@
},
"required": ["type", "properties"]
},
+ "Event.global.disposed": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "const": "global.disposed"
+ },
+ "properties": {
+ "type": "object",
+ "properties": {}
+ }
+ },
+ "required": ["type", "properties"]
+ },
"Event": {
"anyOf": [
{
@@ -6910,6 +6949,9 @@
},
{
"$ref": "#/components/schemas/Event.server.connected"
+ },
+ {
+ "$ref": "#/components/schemas/Event.global.disposed"
}
]
},
diff --git a/packages/slack/package.json b/packages/slack/package.json
index 8ba4dd3c3..9c9d455e4 100644
--- a/packages/slack/package.json
+++ b/packages/slack/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/slack",
- "version": "1.0.143",
+ "version": "1.0.146",
"type": "module",
"scripts": {
"dev": "bun run src/index.ts",
diff --git a/packages/tauri/package.json b/packages/tauri/package.json
index 61b781ac6..0826de1e3 100644
--- a/packages/tauri/package.json
+++ b/packages/tauri/package.json
@@ -1,7 +1,7 @@
{
"name": "@opencode-ai/tauri",
"private": true,
- "version": "1.0.143",
+ "version": "1.0.146",
"type": "module",
"scripts": {
"typecheck": "tsgo -b",
diff --git a/packages/tauri/src-tauri/icons/128x128.png b/packages/tauri/src-tauri/icons/128x128.png
index 57d061b44..caf7b02eb 100644
--- a/packages/tauri/src-tauri/icons/128x128.png
+++ b/packages/tauri/src-tauri/icons/128x128.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/[email protected] b/packages/tauri/src-tauri/icons/[email protected]
index a87a4c3cc..47fe4c61e 100644
--- a/packages/tauri/src-tauri/icons/[email protected]
+++ b/packages/tauri/src-tauri/icons/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/32x32.png b/packages/tauri/src-tauri/icons/32x32.png
index 8383b4730..5868bcc93 100644
--- a/packages/tauri/src-tauri/icons/32x32.png
+++ b/packages/tauri/src-tauri/icons/32x32.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/64x64.png b/packages/tauri/src-tauri/icons/64x64.png
index ef3b81179..1ed7425d8 100644
--- a/packages/tauri/src-tauri/icons/64x64.png
+++ b/packages/tauri/src-tauri/icons/64x64.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/Square107x107Logo.png b/packages/tauri/src-tauri/icons/Square107x107Logo.png
index c80eb8909..1db249bf7 100644
--- a/packages/tauri/src-tauri/icons/Square107x107Logo.png
+++ b/packages/tauri/src-tauri/icons/Square107x107Logo.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/Square142x142Logo.png b/packages/tauri/src-tauri/icons/Square142x142Logo.png
index bb767ed97..1961c3408 100644
--- a/packages/tauri/src-tauri/icons/Square142x142Logo.png
+++ b/packages/tauri/src-tauri/icons/Square142x142Logo.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/Square150x150Logo.png b/packages/tauri/src-tauri/icons/Square150x150Logo.png
index 15cc8e0d2..abc507347 100644
--- a/packages/tauri/src-tauri/icons/Square150x150Logo.png
+++ b/packages/tauri/src-tauri/icons/Square150x150Logo.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/Square284x284Logo.png b/packages/tauri/src-tauri/icons/Square284x284Logo.png
index 5d78834e0..51e2a1b9f 100644
--- a/packages/tauri/src-tauri/icons/Square284x284Logo.png
+++ b/packages/tauri/src-tauri/icons/Square284x284Logo.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/Square30x30Logo.png b/packages/tauri/src-tauri/icons/Square30x30Logo.png
index f78bf4c5a..066a1fd0c 100644
--- a/packages/tauri/src-tauri/icons/Square30x30Logo.png
+++ b/packages/tauri/src-tauri/icons/Square30x30Logo.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/Square310x310Logo.png b/packages/tauri/src-tauri/icons/Square310x310Logo.png
index 2419f9209..2a85c8e95 100644
--- a/packages/tauri/src-tauri/icons/Square310x310Logo.png
+++ b/packages/tauri/src-tauri/icons/Square310x310Logo.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/Square44x44Logo.png b/packages/tauri/src-tauri/icons/Square44x44Logo.png
index 3f665e55a..c855b8063 100644
--- a/packages/tauri/src-tauri/icons/Square44x44Logo.png
+++ b/packages/tauri/src-tauri/icons/Square44x44Logo.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/Square71x71Logo.png b/packages/tauri/src-tauri/icons/Square71x71Logo.png
index f4d9d20d8..c8168f711 100644
--- a/packages/tauri/src-tauri/icons/Square71x71Logo.png
+++ b/packages/tauri/src-tauri/icons/Square71x71Logo.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/Square89x89Logo.png b/packages/tauri/src-tauri/icons/Square89x89Logo.png
index 07be723db..19ec1777d 100644
--- a/packages/tauri/src-tauri/icons/Square89x89Logo.png
+++ b/packages/tauri/src-tauri/icons/Square89x89Logo.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/StoreLogo.png b/packages/tauri/src-tauri/icons/StoreLogo.png
index 3e78e8d3e..3fd053d34 100644
--- a/packages/tauri/src-tauri/icons/StoreLogo.png
+++ b/packages/tauri/src-tauri/icons/StoreLogo.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png
index 6e500bb7e..4f3ea0e36 100644
--- a/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png
+++ b/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png
index 23b5818ac..7db80699b 100644
--- a/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png
+++ b/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png b/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png
index 69d1023ec..a54ebe652 100644
--- a/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png
+++ b/packages/tauri/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png
index e67031171..9337ccfa3 100644
--- a/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png
+++ b/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png
index d274f1c9d..0bfc1082e 100644
--- a/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png
+++ b/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png
index 167af3864..5b02ec732 100644
--- a/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png
+++ b/packages/tauri/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png b/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png
index 237b8fb29..322aeaeaa 100644
--- a/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png
+++ b/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png
index d6299e807..ca1e336cc 100644
--- a/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png
+++ b/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png b/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png
index 999e00638..f71110799 100644
--- a/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png
+++ b/packages/tauri/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png b/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png
index 262667374..287a6b500 100644
--- a/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png
+++ b/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png
index 4e04fbca4..9d3d06a86 100644
--- a/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png
+++ b/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png b/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png
index cda7c3e6d..d4b6fde1b 100644
--- a/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png
+++ b/packages/tauri/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png
index cb9d5ef52..bde8d7596 100644
--- a/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png
+++ b/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png
index 557ddef40..03df7809d 100644
--- a/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png
+++ b/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png
index df0abee51..62363be04 100644
--- a/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png
+++ b/packages/tauri/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/icon.icns b/packages/tauri/src-tauri/icons/icon.icns
index 0e47ddc16..be910ad5f 100644
--- a/packages/tauri/src-tauri/icons/icon.icns
+++ b/packages/tauri/src-tauri/icons/icon.icns
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/icon.ico b/packages/tauri/src-tauri/icons/icon.ico
index 7749a74b1..ff88d21e4 100644
--- a/packages/tauri/src-tauri/icons/icon.ico
+++ b/packages/tauri/src-tauri/icons/icon.ico
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/icon.png b/packages/tauri/src-tauri/icons/icon.png
index ae5fdabbe..0ecbb6d5f 100644
--- a/packages/tauri/src-tauri/icons/icon.png
+++ b/packages/tauri/src-tauri/icons/icon.png
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index 36d7ee388..eb137e164 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index 871f8e39d..aa76ab10b 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index 871f8e39d..aa76ab10b 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index 007046c4a..c58ea3d49 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index 288506f61..0eeb4d9bf 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index 013281df8..32601c70a 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index 013281df8..32601c70a 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index b042fbdda..a372c4a11 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index 871f8e39d..aa76ab10b 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index a78ec7334..e82ce2765 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index a78ec7334..e82ce2765 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index 9de8403a8..15ad59362 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index 348f719a1..2260671c0 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index 9de8403a8..15ad59362 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index b06c67dd8..5c66bd3b1 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index 903dc4d3e..a5b05f3b5 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index c2f796c30..9c0615d41 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/src-tauri/icons/ios/[email protected] b/packages/tauri/src-tauri/icons/ios/[email protected]
index fd49a44f3..6b792b36a 100644
--- a/packages/tauri/src-tauri/icons/ios/[email protected]
+++ b/packages/tauri/src-tauri/icons/ios/[email protected]
Binary files differ
diff --git a/packages/tauri/tsconfig.json b/packages/tauri/tsconfig.json
index b21529450..e7f5c5c27 100644
--- a/packages/tauri/tsconfig.json
+++ b/packages/tauri/tsconfig.json
@@ -1,7 +1,19 @@
{
- "extends": "../desktop/tsconfig.json",
"compilerOptions": {
- "outDir": "ts-dist"
+ "target": "ESNext",
+ "module": "ESNext",
+ "skipLibCheck": true,
+ "moduleResolution": "bundler",
+ "allowSyntheticDefaultImports": true,
+ "esModuleInterop": true,
+ "jsx": "preserve",
+ "jsxImportSource": "solid-js",
+ "allowJs": true,
+ "strict": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "emitDeclarationOnly": false,
+ "outDir": "node_modules/.ts-dist"
},
"references": [{ "path": "../desktop" }],
"include": ["src"]
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 3ac942cd2..277dcc9c5 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/ui",
- "version": "1.0.143",
+ "version": "1.0.146",
"type": "module",
"exports": {
"./*": "./src/components/*.tsx",
diff --git a/packages/util/package.json b/packages/util/package.json
index a077d701b..f6fc043fc 100644
--- a/packages/util/package.json
+++ b/packages/util/package.json
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/util",
- "version": "1.0.143",
+ "version": "1.0.146",
"private": true,
"type": "module",
"exports": {
diff --git a/packages/web/package.json b/packages/web/package.json
index c607be57a..48f734fec 100644
--- a/packages/web/package.json
+++ b/packages/web/package.json
@@ -1,7 +1,7 @@
{
"name": "@opencode-ai/web",
"type": "module",
- "version": "1.0.143",
+ "version": "1.0.146",
"scripts": {
"dev": "astro dev",
"dev:remote": "VITE_API_URL=https://api.opencode.ai astro dev",
diff --git a/packages/web/src/content/docs/sdk.mdx b/packages/web/src/content/docs/sdk.mdx
index ca20277be..4f9a2959f 100644
--- a/packages/web/src/content/docs/sdk.mdx
+++ b/packages/web/src/content/docs/sdk.mdx
@@ -37,13 +37,13 @@ This starts both a server and a client
#### Options
-| Option | Type | Description | Default |
-| --------------- | ---------- | -------------------------------- | ----------------------- |
-| `baseUrl` | `string` | URL of the server | `http://localhost:4096` |
-| `fetch` | `function` | Custom fetch implementation | `globalThis.fetch` |
-| `parseAs` | `string` | Response parsing method | `auto` |
-| `responseStyle` | `string` | Return style: `data` or `fields` | `fields` |
-| `throwOnError` | `boolean` | Throw errors instead of return | `false` |
+| Option | Type | Description | Default |
+| ---------- | ------------- | ------------------------------ | ----------- |
+| `hostname` | `string` | Server hostname | `127.0.0.1` |
+| `port` | `number` | Server port | `4096` |
+| `signal` | `AbortSignal` | Abort signal for cancellation | `undefined` |
+| `timeout` | `number` | Timeout in ms for server start | `5000` |
+| `config` | `Config` | Configuration object | `{}` |
---
@@ -81,13 +81,13 @@ const client = createOpencodeClient({
#### Options
-| Option | Type | Description | Default |
-| ---------- | ------------- | ------------------------------ | ----------- |
-| `hostname` | `string` | Server hostname | `127.0.0.1` |
-| `port` | `number` | Server port | `4096` |
-| `signal` | `AbortSignal` | Abort signal for cancellation | `undefined` |
-| `timeout` | `number` | Timeout in ms for server start | `5000` |
-| `config` | `Config` | Configuration object | `{}` |
+| Option | Type | Description | Default |
+| --------------- | ---------- | -------------------------------- | ----------------------- |
+| `baseUrl` | `string` | URL of the server | `http://localhost:4096` |
+| `fetch` | `function` | Custom fetch implementation | `globalThis.fetch` |
+| `parseAs` | `string` | Response parsing method | `auto` |
+| `responseStyle` | `string` | Return style: `data` or `fields` | `fields` |
+| `throwOnError` | `boolean` | Throw errors instead of return | `false` |
---
diff --git a/sdks/vscode/package.json b/sdks/vscode/package.json
index 4125cac60..67d703a15 100644
--- a/sdks/vscode/package.json
+++ b/sdks/vscode/package.json
@@ -2,7 +2,7 @@
"name": "opencode",
"displayName": "opencode",
"description": "opencode for VS Code",
- "version": "1.0.143",
+ "version": "1.0.146",
"publisher": "sst-dev",
"repository": {
"type": "git",