diff --git a/bun.lock b/bun.lock index 84b406039f..1652adb3ee 100644 --- a/bun.lock +++ b/bun.lock @@ -241,7 +241,7 @@ "@opencode-ai/script": "workspace:*", "@opencode-ai/sdk": "workspace:*", "@opencode-ai/util": "workspace:*", - "@openrouter/ai-sdk-provider": "1.2.8", + "@openrouter/ai-sdk-provider": "1.5.2", "@opentui/core": "0.1.60", "@opentui/solid": "0.1.60", "@parcel/watcher": "2.5.1", @@ -1141,7 +1141,7 @@ "@opencode-ai/web": ["@opencode-ai/web@workspace:packages/web"], - "@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@1.2.8", "", { "dependencies": { "@openrouter/sdk": "^0.1.8" }, "peerDependencies": { "ai": "^5.0.0", "zod": "^3.24.1 || ^v4" } }, "sha512-pQT8AzZBKg9f4bkt4doF486ZlhK0XjKkevrLkiqYgfh1Jplovieu28nK4Y+xy3sF18/mxjqh9/2y6jh01qzLrA=="], + "@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@1.5.2", "", { "dependencies": { "@openrouter/sdk": "^0.1.27" }, "peerDependencies": { "@toon-format/toon": "^2.0.0", "ai": "^5.0.0", "zod": "^3.24.1 || ^v4" }, "optionalPeers": ["@toon-format/toon"] }, "sha512-3Th0vmJ9pjnwcPc2H1f59Mb0LFvwaREZAScfOQIpUxAHjZ7ZawVKDP27qgsteZPmMYqccNMy4r4Y3kgUnNcKAg=="], "@openrouter/sdk": ["@openrouter/sdk@0.1.27", "", { "dependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RH//L10bSmc81q25zAZudiI4kNkLgxF2E+WU42vghp3N6TEvZ6F0jK7uT3tOxkEn91gzmMw9YVmDENy7SJsajQ=="], diff --git a/nix/hashes.json b/nix/hashes.json index a6a28f5a71..a9117fa856 100644 --- a/nix/hashes.json +++ b/nix/hashes.json @@ -1,3 +1,3 @@ { - "nodeModules": "sha256-pwjePZClFKDhDr5xrTNCBlO0xTwxLQYiQYaIEd0FdQQ=" + "nodeModules": "sha256-JT8J+Nd2kk0x46BcyotmBbM39tuKOW7VzXfOV3R3sqQ=" } diff --git a/packages/console/app/src/routes/zen/util/handler.ts b/packages/console/app/src/routes/zen/util/handler.ts index e34704f98e..7d7767b8df 100644 --- a/packages/console/app/src/routes/zen/util/handler.ts +++ b/packages/console/app/src/routes/zen/util/handler.ts @@ -588,7 +588,7 @@ export async function handler( tx .update(KeyTable) .set({ timeUsed: sql`now()` }) - .where(eq(KeyTable.id, authInfo.apiKeyId)), + .where(and(eq(KeyTable.workspaceID, authInfo.workspaceID), eq(KeyTable.id, authInfo.apiKeyId))), ) } diff --git a/packages/opencode/package.json b/packages/opencode/package.json index 302d8fc9f3..ae6df98c18 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -70,7 +70,7 @@ "@opencode-ai/script": "workspace:*", "@opencode-ai/sdk": "workspace:*", "@opencode-ai/util": "workspace:*", - "@openrouter/ai-sdk-provider": "1.2.8", + "@openrouter/ai-sdk-provider": "1.5.2", "@opentui/core": "0.1.60", "@opentui/solid": "0.1.60", "@parcel/watcher": "2.5.1", diff --git a/packages/opencode/src/cli/cmd/tui/context/theme/orng.json b/packages/opencode/src/cli/cmd/tui/context/theme/orng.json index 407016ac5b..1228f102f3 100644 --- a/packages/opencode/src/cli/cmd/tui/context/theme/orng.json +++ b/packages/opencode/src/cli/cmd/tui/context/theme/orng.json @@ -17,7 +17,7 @@ "darkAccent": "#FFF7F1", "darkRed": "#e06c75", "darkOrange": "#EC5B2B", - "darkGreen": "#7fd88f", + "darkBlue": "#6ba1e6", "darkCyan": "#56b6c2", "darkYellow": "#e5c07b", "lightStep1": "#ffffff", @@ -36,7 +36,7 @@ "lightAccent": "#c94d24", "lightRed": "#d1383d", "lightOrange": "#EC5B2B", - "lightGreen": "#3d9a57", + "lightBlue": "#0062d1", "lightCyan": "#318795", "lightYellow": "#b0851f" }, @@ -62,8 +62,8 @@ "light": "lightOrange" }, "success": { - "dark": "darkGreen", - "light": "lightGreen" + "dark": "darkBlue", + "light": "lightBlue" }, "info": { "dark": "darkCyan", @@ -102,8 +102,8 @@ "light": "lightStep6" }, "diffAdded": { - "dark": "#4fd6be", - "light": "#1e725c" + "dark": "#6ba1e6", + "light": "#0062d1" }, "diffRemoved": { "dark": "#c53b53", @@ -118,16 +118,16 @@ "light": "#7086b5" }, "diffHighlightAdded": { - "dark": "#b8db87", - "light": "#4db380" + "dark": "#6ba1e6", + "light": "#0062d1" }, "diffHighlightRemoved": { "dark": "#e26a75", "light": "#f52a65" }, "diffAddedBg": { - "dark": "#20303b", - "light": "#d5e5d5" + "dark": "#1a2a3d", + "light": "#e0edfa" }, "diffRemovedBg": { "dark": "#37222c", @@ -142,8 +142,8 @@ "light": "lightStep3" }, "diffAddedLineNumberBg": { - "dark": "#1b2b34", - "light": "#c5d5c5" + "dark": "#162535", + "light": "#d0e5f5" }, "diffRemovedLineNumberBg": { "dark": "#2d1f26", @@ -166,8 +166,8 @@ "light": "lightCyan" }, "markdownCode": { - "dark": "darkGreen", - "light": "lightGreen" + "dark": "darkBlue", + "light": "lightBlue" }, "markdownBlockQuote": { "dark": "#FFF7F1", @@ -222,8 +222,8 @@ "light": "lightRed" }, "syntaxString": { - "dark": "darkGreen", - "light": "lightGreen" + "dark": "darkBlue", + "light": "lightBlue" }, "syntaxNumber": { "dark": "#FFF7F1", diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/footer.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/footer.tsx index e889373e6f..69082c870b 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/footer.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/footer.tsx @@ -10,7 +10,7 @@ export function Footer() { const { theme } = useTheme() const sync = useSync() const route = useRoute() - const mcp = createMemo(() => Object.keys(sync.data.mcp)) + const mcp = createMemo(() => Object.values(sync.data.mcp).filter((x) => x.status === "connected").length) const mcpError = createMemo(() => Object.values(sync.data.mcp).some((x) => x.status === "failed")) const lsp = createMemo(() => Object.keys(sync.data.lsp)) const permissions = createMemo(() => { @@ -66,7 +66,7 @@ export function Footer() { {lsp().length} LSP - + @@ -76,7 +76,7 @@ export function Footer() { - {mcp().length} MCP + {mcp()} MCP /status diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index f4c8890ac2..7cf64ff4cf 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -227,11 +227,12 @@ export namespace ProviderTransform { result["promptCacheKey"] = sessionID } - if ( - model.providerID === "google" || - (model.providerID.startsWith("opencode") && model.api.id.includes("gemini-3")) - ) { + if (model.api.npm === "@openrouter/ai-sdk-provider" && model.api.id.includes("gemini-3")) { + result["reasoning"] = { effort: "high" } + } + if (model.api.npm === "@ai-sdk/google" || model.api.npm === "@ai-sdk/google-vertex") { result["thinkingConfig"] = { + thinkingLevel: "high", includeThoughts: true, } } diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts index e1e3367c6b..6af1b49032 100644 --- a/packages/opencode/src/server/server.ts +++ b/packages/opencode/src/server/server.ts @@ -1460,12 +1460,15 @@ export namespace Server { } } - const providers = mapValues(filteredProviders, (x) => Provider.fromModelsDevProvider(x)) - const connected = await Provider.list().then((x) => Object.keys(x)) + const connected = await Provider.list() + const providers = Object.assign( + mapValues(filteredProviders, (x) => Provider.fromModelsDevProvider(x)), + connected, + ) return c.json({ all: Object.values(providers), default: mapValues(providers, (item) => Provider.sort(Object.values(item.models))[0].id), - connected, + connected: Object.keys(connected), }) }, ) diff --git a/packages/web/src/content/docs/ecosystem.mdx b/packages/web/src/content/docs/ecosystem.mdx index c73d53fe2e..845ac63330 100644 --- a/packages/web/src/content/docs/ecosystem.mdx +++ b/packages/web/src/content/docs/ecosystem.mdx @@ -15,12 +15,15 @@ You can also check out [awesome-opencode](https://github.com/awesome-opencode/aw ## Plugins -| Name | Description | -| ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -| [opencode-skills](https://github.com/malhashemi/opencode-skills) | Manage and organize OpenCode skills and capabilities | -| [opencode-openai-codex-auth](https://github.com/numman-ali/opencode-openai-codex-auth) | Use your ChatGPT Plus/Pro subscription instead of API credits | -| [opencode-gemini-auth](https://github.com/jenslys/opencode-gemini-auth) | Use your existing Gemini plan instead of API billing | -| [opencode-dynamic-context-pruning](https://github.com/Tarquinen/opencode-dynamic-context-pruning) | Optimize token usage by pruning obsolete tool outputs | +| Name | Description | +| ------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | +| [opencode-skills](https://github.com/malhashemi/opencode-skills) | Manage and organize OpenCode skills and capabilities | +| [opencode-type-inject](https://github.com/nick-vi/opencode-type-inject) | Auto-inject TypeScript/Svelte types into file reads with lookup tools | +| [opencode-openai-codex-auth](https://github.com/numman-ali/opencode-openai-codex-auth) | Use your ChatGPT Plus/Pro subscription instead of API credits | +| [opencode-gemini-auth](https://github.com/jenslys/opencode-gemini-auth) | Use your existing Gemini plan instead of API billing | +| [opencode-antigravity-auth](https://github.com/NoeFabris/opencode-antigravity-auth) | Use Antigravity's free models instead of API billing | +| [opencode-dynamic-context-pruning](https://github.com/Tarquinen/opencode-dynamic-context-pruning) | Optimize token usage by pruning obsolete tool outputs | +| [opencode-wakatime](https://github.com/angristan/opencode-wakatime) | Track OpenCode usage with Wakatime | ---