diff --git a/STATS.md b/STATS.md index ba028e5a33..60bc9b7008 100644 --- a/STATS.md +++ b/STATS.md @@ -84,3 +84,4 @@ | 2025-09-17 | 351,117 (+8,508) | 260,970 (+5,706) | 612,087 (+14,214) | | 2025-09-18 | 358,717 (+7,600) | 266,922 (+5,952) | 625,639 (+13,552) | | 2025-09-19 | 365,401 (+6,684) | 271,859 (+4,937) | 637,260 (+11,621) | +| 2025-09-20 | 372,092 (+6,691) | 276,917 (+5,058) | 649,009 (+11,749) | diff --git a/bun.lock b/bun.lock index 514485a348..6b97124aa5 100644 --- a/bun.lock +++ b/bun.lock @@ -14,7 +14,7 @@ }, "packages/app": { "name": "@opencode/app", - "version": "0.10.2", + "version": "0.10.3", "dependencies": { "@kobalte/core": "0.13.11", "@opencode-ai/sdk": "workspace:*", @@ -61,7 +61,7 @@ }, "packages/console/core": { "name": "@opencode/console-core", - "version": "0.10.2", + "version": "0.10.3", "dependencies": { "@aws-sdk/client-sts": "3.782.0", "@opencode/console-resource": "workspace:*", @@ -78,7 +78,7 @@ }, "packages/console/function": { "name": "@opencode/console-function", - "version": "0.10.2", + "version": "0.10.3", "dependencies": { "@ai-sdk/anthropic": "2.0.0", "@ai-sdk/openai": "2.0.2", @@ -104,7 +104,7 @@ }, "packages/console/scripts": { "name": "@opencode/console-scripts", - "version": "0.10.2", + "version": "0.10.3", "dependencies": { "@opencode/console-core": "workspace:*", "tsx": "4.20.5", @@ -116,7 +116,7 @@ }, "packages/function": { "name": "@opencode/function", - "version": "0.10.2", + "version": "0.10.3", "dependencies": { "@octokit/auth-app": "8.0.1", "@octokit/rest": "22.0.0", @@ -131,7 +131,7 @@ }, "packages/opencode": { "name": "opencode", - "version": "0.10.2", + "version": "0.10.3", "bin": { "opencode": "./bin/opencode", }, @@ -189,7 +189,7 @@ }, "packages/plugin": { "name": "@opencode-ai/plugin", - "version": "0.10.2", + "version": "0.10.3", "dependencies": { "@opencode-ai/sdk": "workspace:*", "zod": "catalog:", @@ -201,7 +201,7 @@ }, "packages/sdk/js": { "name": "@opencode-ai/sdk", - "version": "0.10.2", + "version": "0.10.3", "dependencies": { "@hey-api/openapi-ts": "0.82.5", }, @@ -212,7 +212,7 @@ }, "packages/web": { "name": "@opencode/web", - "version": "0.10.2", + "version": "0.10.3", "dependencies": { "@astrojs/cloudflare": "12.6.3", "@astrojs/markdown-remark": "6.3.1", diff --git a/packages/app/package.json b/packages/app/package.json index 2c12734333..e4f95559f8 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode/app", - "version": "0.10.2", + "version": "0.10.3", "description": "", "type": "module", "scripts": { diff --git a/packages/console/app/package.json b/packages/console/app/package.json index bd6e19a804..df7b30720c 100644 --- a/packages/console/app/package.json +++ b/packages/console/app/package.json @@ -7,7 +7,7 @@ "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", "start": "vinxi start", - "version": "0.10.2" + "version": "0.10.3" }, "dependencies": { "@ibm/plex": "6.4.1", diff --git a/packages/console/app/src/routes/zen/handler.ts b/packages/console/app/src/routes/zen/handler.ts index a60abeb70c..09b5ca06ae 100644 --- a/packages/console/app/src/routes/zen/handler.ts +++ b/packages/console/app/src/routes/zen/handler.ts @@ -88,6 +88,7 @@ export async function handler( const authInfo = await authenticate() const modelInfo = validateModel(body.model, authInfo) const providerInfo = selectProvider(modelInfo, authInfo) + if (authInfo && !providerInfo.allowAnonymous) validateBilling(authInfo) logger.metric({ provider: providerInfo.id }) // Request to model provider @@ -250,33 +251,43 @@ export async function handler( }) const isFree = FREE_WORKSPACES.includes(data.workspaceID) - if (!isFree) { - if (!data.paymentMethodID) throw new CreditsError("No payment method") - if (data.balance <= 0) throw new CreditsError("Insufficient balance") - if ( - data.monthlyLimit && - data.monthlyUsage && - data.timeMonthlyUsageUpdated && - data.monthlyUsage >= centsToMicroCents(data.monthlyLimit * 100) - ) { - const now = new Date() - const currentYear = now.getUTCFullYear() - const currentMonth = now.getUTCMonth() - const dateYear = data.timeMonthlyUsageUpdated.getUTCFullYear() - const dateMonth = data.timeMonthlyUsageUpdated.getUTCMonth() - if (currentYear === dateYear && currentMonth === dateMonth) - throw new MonthlyLimitError(`You have reached your monthly spending limit of $${data.monthlyLimit}.`) - } - } return { apiKeyId: data.apiKey, workspaceID: data.workspaceID, dataShare: data.dataShare, + billing: { + paymentMethodID: data.paymentMethodID, + balance: data.balance, + monthlyLimit: data.monthlyLimit, + monthlyUsage: data.monthlyUsage, + timeMonthlyUsageUpdated: data.timeMonthlyUsageUpdated, + }, isFree, } } + function validateBilling(authInfo: Awaited>) { + if (!authInfo || authInfo.isFree) return + const billing = authInfo.billing + if (!billing.paymentMethodID) throw new CreditsError("No payment method") + if (billing.balance <= 0) throw new CreditsError("Insufficient balance") + if ( + billing.monthlyLimit && + billing.monthlyUsage && + billing.timeMonthlyUsageUpdated && + billing.monthlyUsage >= centsToMicroCents(billing.monthlyLimit * 100) + ) { + const now = new Date() + const currentYear = now.getUTCFullYear() + const currentMonth = now.getUTCMonth() + const dateYear = billing.timeMonthlyUsageUpdated.getUTCFullYear() + const dateMonth = billing.timeMonthlyUsageUpdated.getUTCMonth() + if (currentYear === dateYear && currentMonth === dateMonth) + throw new MonthlyLimitError(`You have reached your monthly spending limit of $${billing.monthlyLimit}.`) + } + } + function validateModel(reqModel: string, authInfo: Awaited>) { const json = JSON.parse(Resource.ZEN_MODELS.value) diff --git a/packages/console/core/package.json b/packages/console/core/package.json index 97fdfc204b..9c7a3adf87 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/console-core", - "version": "0.10.2", + "version": "0.10.3", "private": true, "type": "module", "dependencies": { diff --git a/packages/console/function/package.json b/packages/console/function/package.json index 16cd685a4c..6bcb3267d7 100644 --- a/packages/console/function/package.json +++ b/packages/console/function/package.json @@ -1,6 +1,6 @@ { "name": "@opencode/console-function", - "version": "0.10.2", + "version": "0.10.3", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/console/scripts/package.json b/packages/console/scripts/package.json index a0cfc9f249..02efee6a13 100644 --- a/packages/console/scripts/package.json +++ b/packages/console/scripts/package.json @@ -1,6 +1,6 @@ { "name": "@opencode/console-scripts", - "version": "0.10.2", + "version": "0.10.3", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/function/package.json b/packages/function/package.json index b00d3d91dc..cbc233ad47 100644 --- a/packages/function/package.json +++ b/packages/function/package.json @@ -1,6 +1,6 @@ { "name": "@opencode/function", - "version": "0.10.2", + "version": "0.10.3", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/opencode/package.json b/packages/opencode/package.json index 60134afe2f..4537bb9566 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "0.10.2", + "version": "0.10.3", "name": "opencode", "type": "module", "private": true, diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 86122e6f37..6d124b1e2e 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": "0.10.2", + "version": "0.10.3", "type": "module", "scripts": { "typecheck": "tsc --noEmit", diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index ee51cc0b7c..8814a3c605 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": "0.10.2", + "version": "0.10.3", "type": "module", "scripts": { "typecheck": "tsc --noEmit", diff --git a/packages/tui/internal/components/chat/messages.go b/packages/tui/internal/components/chat/messages.go index 0ef0169f20..6352dbc747 100644 --- a/packages/tui/internal/components/chat/messages.go +++ b/packages/tui/internal/components/chat/messages.go @@ -478,9 +478,6 @@ func (m *messagesComponent) renderView() tea.Cmd { } case opencode.AssistantMessage: - if casted.Summary { - continue - } if casted.ID == m.app.Session.Revert.MessageID { reverted = true revertedMessageCount = 1 diff --git a/packages/web/package.json b/packages/web/package.json index d20d76e261..ae60792bf6 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,7 +1,7 @@ { "name": "@opencode/web", "type": "module", - "version": "0.10.2", + "version": "0.10.3", "scripts": { "dev": "astro dev", "dev:remote": "VITE_API_URL=https://api.opencode.ai astro dev", diff --git a/packages/web/src/content/docs/themes.mdx b/packages/web/src/content/docs/themes.mdx index 3defceaeae..0a2a62517e 100644 --- a/packages/web/src/content/docs/themes.mdx +++ b/packages/web/src/content/docs/themes.mdx @@ -25,18 +25,18 @@ Without truecolor support, themes may appear with reduced color accuracy or fall opencode comes with several built-in themes. -| Name | Description | -| ------------ | ------------------------------------------ | -| `system` | Adapts to your terminal's background color | -| `tokyonight` | Based on the Tokyonight theme | -| `everforest` | Based on the Everforest theme | -| `ayu` | Based on the Ayu dark theme | -| `catppuccin` | Based on the Catppuccin theme | -| `gruvbox` | Based on the Gruvbox theme | -| `kanagawa` | Based on the Kanagawa theme | -| `nord` | Based on the Nord theme | -| `matrix` | Hacker-style green on black theme | -| `one-dark` | Based on the Atom One Dark theme | +| Name | Description | +| ------------ | ---------------------------------------------------------------------------- | +| `system` | Adapts to your terminal's background color | +| `tokyonight` | Based on the [Tokyonight](https://github.com/folke/tokyonight.nvim) theme | +| `everforest` | Based on the [Everforest](https://github.com/sainnhe/everforest) theme | +| `ayu` | Based on the [Ayu](https://github.com/ayu-theme) dark theme | +| `catppuccin` | Based on the [Catppuccin](https://github.com/catppuccin) theme | +| `gruvbox` | Based on the [Gruvbox](https://github.com/morhetz/gruvbox) theme | +| `kanagawa` | Based on the [Kanagawa](https://github.com/rebelot/kanagawa.nvim) theme | +| `nord` | Based on the [Nord](https://github.com/nordtheme/nord) theme | +| `matrix` | Hacker-style green on black theme | +| `one-dark` | Based on the [Atom One](https://github.com/Th3Whit3Wolf/one-nvim) Dark theme | And more, we are constantly adding new themes. diff --git a/packages/web/src/content/docs/zen.mdx b/packages/web/src/content/docs/zen.mdx index b43801b5a5..461751f394 100644 --- a/packages/web/src/content/docs/zen.mdx +++ b/packages/web/src/content/docs/zen.mdx @@ -81,7 +81,8 @@ We support a pay-as-you-go model. Below are the prices **per 1M tokens**. | Model | Input | Output | Cached Read | Cached Write | | ------------------------------- | ------ | ------ | ----------- | ------------ | | Qwen3 Coder 480B | $0.45 | $1.50 | - | - | -| Grok Code Fast 1 | Free | Free | Free | - | +| Grok Code Fast 1 | Free | Free | - | - | +| Code Supernova | Free | Free | - | - | | Claude Sonnet 4 (≤ 200K tokens) | $3.00 | $15.00 | $0.30 | $3.75 | | Claude Sonnet 4 (> 200K tokens) | $6.00 | $22.50 | $0.60 | $7.50 | | Claude Haiku 3.5 | $0.80 | $4.00 | $0.08 | $1.00 | @@ -93,7 +94,10 @@ We support a pay-as-you-go model. Below are the prices **per 1M tokens**. Credit card fees are passed along at cost; we don’t charge anything beyond that. ::: -Grok Code Fast 1 is currently free on opencode for a limited time. The xAI team is using this time to collect feedback and improve Grok Code. +The free models: + +- Grok Code Fast 1 is currently free on opencode for a limited time. The xAI team is using this time to collect feedback and improve Grok Code. +- Code Supernova is a stealth model that's free on opencode for a limited time. The team is using this time to collect feedback and improve the model. :::tip Subscription plans and a free tier are coming soon. @@ -108,6 +112,8 @@ Subscription plans and a free tier are coming soon. All our models are hosted in the US. Our providers follow a zero-retention policy and do not use your data for model training, with the following exceptions: - Grok Code Fast 1: During its free period, collected data may be used to improve Grok Code. +- Code Supernova: During its free period, collected data may be used to improve + the model. - OpenAI APIs: Requests are retained for 30 days in accordance with [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). - Anthropic APIs: Requests are retained for 30 days in accordance with [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). diff --git a/sdks/vscode/package.json b/sdks/vscode/package.json index 262435494f..f063af26a7 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": "0.10.2", + "version": "0.10.3", "publisher": "sst-dev", "repository": { "type": "git",