Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
38e10eb
fix(opencode): ignore unknown config fields (#41312)
opencode-agent[bot] Aug 8, 2026
0bff28d
fix(stats): fall back after full sync failure (#41411)
opencode-agent[bot] Aug 9, 2026
d90532a
sync release versions for v1.18.16
Aug 10, 2026
941e71d
fix(app): use current default model (#38603)
Brendonovich Aug 10, 2026
550d1ff
fix(i18n): use widely recognized developer terminology (#41532)
opencode-agent[bot] Aug 10, 2026
b9f3b38
fix(session): route all Muse family models to the Meta system prompt …
mreso Aug 10, 2026
3a90639
fix(ui): correct OC-2 weak icon color (#41504)
OpeOginni Aug 10, 2026
5d95348
fix(provider): scope DeepSeek V4 Flash sampling defaults (#41620)
opencode-agent[bot] Aug 11, 2026
d62e500
chore: build beta from v2 (#41627)
Hona Aug 11, 2026
d041eee
chore: use DeepSeek for beta conflicts (#41669)
opencode-agent[bot] Aug 11, 2026
9fdd482
docs(zen): add Nemotron 3.5 Lightning (#41750)
MrMushrooooom Aug 11, 2026
0d927ba
chore: generate
opencode-agent[bot] Aug 11, 2026
6afef2f
fix(console): update blocked account message (#41819)
opencode-agent[bot] Aug 11, 2026
36b2053
docs(zen): add Hy3 Free (#41814)
MrMushrooooom Aug 11, 2026
2b8a596
feat(console): add go usage endpoint (#16513)
peculiarnewbie Aug 11, 2026
561afb4
fix(opencode): detect Copilot PDF input support (#41522)
stevenao Aug 11, 2026
d470434
refactor(console): simplify go usage response
vimtor Aug 11, 2026
c789868
fix(opencode): cap session retries with jitter (#41939)
rekram1-node Aug 12, 2026
1f94d8a
docs(zen): remove expired free models (#41943)
MrMushrooooom Aug 12, 2026
46a14e6
feat(stats): query r2 data catalog
adamdotdevin Aug 12, 2026
d92d1e6
docs(zen): add Grok 4.6
fwang Aug 12, 2026
8571a92
fix(provider): add Merge Gateway reasoning variants (#41867)
MatthewFeroz Aug 12, 2026
ca3df21
docs: fix broken DigitalOcean and Daytona links (#42048)
skyzhao1223 Aug 12, 2026
959c8bd
docs: fix provider display name and PAT typos (#42034)
skyzhao1223 Aug 12, 2026
7e0353c
fix(stats): correct r2 daily totals
adamdotdevin Aug 12, 2026
284187a
fix(ci): authenticate pulumi downloads
adamdotdevin Aug 12, 2026
6d3ae4d
chore: generate
opencode-agent[bot] Aug 12, 2026
df09c3e
update ds v4 pro
fwang Aug 12, 2026
069165e
Merge branch 'dev' of github.com:anomalyco/opencode into dev
fwang Aug 12, 2026
521906f
docs(go): clarify DeepSeek ZDR coverage (#42085)
opencode-agent[bot] Aug 12, 2026
999be62
chore: generate
opencode-agent[bot] Aug 12, 2026
39fb919
chore: add neriousy to team members (#42107)
opencode-agent[bot] Aug 12, 2026
dab2637
fix(compaction): adjust instructions and structure to be more clear t…
rekram1-node Aug 12, 2026
37fe5c8
sync release versions for v1.18.17
Aug 12, 2026
502310f
fix(xai): pass through reasoning effort (#42160)
opencode-agent[bot] Aug 12, 2026
beeabe2
fix(mistral): pass through reasoning effort (#42164)
opencode-agent[bot] Aug 12, 2026
6fea419
fix(groq): pass through reasoning effort (#42166)
opencode-agent[bot] Aug 12, 2026
91df883
fix(opencode): select Kimi prompt by provider (#42161)
opencode-agent[bot] Aug 12, 2026
14b37df
chore: update nix node_modules hashes
opencode-agent[bot] Aug 12, 2026
cc4b456
sync release versions for v1.18.18
Aug 13, 2026
864889a
docs: remove Ling 3.0 Tiny free model (#42314)
MrMushrooooom Aug 13, 2026
62387f3
fix(skills): Update global config path in documentation (#42337)
TechyAditya Aug 13, 2026
ab7cbc8
chore: generate
opencode-agent[bot] Aug 13, 2026
6c035e1
fix(core): preserve unicode in grep previews (#42356)
kitlangton Aug 13, 2026
c7af47f
update grok endpoint
fwang Aug 13, 2026
d0c2b41
docs(go): use responses API for Grok 4.5 (#42373)
MrMushrooooom Aug 13, 2026
f06e949
feat(go): add Gemini 3.7 Flash (#42390)
MrMushrooooom Aug 13, 2026
3e25e80
chore: generate
opencode-agent[bot] Aug 13, 2026
2449581
fix(go): remove Gemini 3.7 Flash (#42393)
MrMushrooooom Aug 13, 2026
8a55ba7
chore: generate
opencode-agent[bot] Aug 13, 2026
d8bf792
fix(opencode): preserve v1 database compatibility (#42444)
thdxr Aug 14, 2026
0e34745
docs: sort Gemini 3.7 before 3.6 (#42473)
opencode-agent[bot] Aug 14, 2026
6d63500
chore(deps): update ai-gateway-provider to 3.2.0 (#42488)
rekram1-node Aug 14, 2026
722e717
chore: update nix node_modules hashes
opencode-agent[bot] Aug 14, 2026
886fd98
docs(zen): add Muse Spark 1.2 (#42508)
MrMushrooooom Aug 14, 2026
92d29ba
chore: generate
opencode-agent[bot] Aug 14, 2026
e23586a
feat(go): add GLM 5.3 (#42518)
MrMushrooooom Aug 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/TEAM_MEMBERS
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ kitlangton
kommander
ludvigrask
MrMushrooooom
neriousy
nexxeln
R44VC0RP
rekram1-node
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ jobs:

- run: bun sst deploy --stage=${{ github.ref_name }}
env:
GITHUB_TOKEN: ${{ github.token }}
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
PLANETSCALE_SERVICE_TOKEN_NAME: ${{ secrets.PLANETSCALE_SERVICE_TOKEN_NAME }}
PLANETSCALE_SERVICE_TOKEN: ${{ secrets.PLANETSCALE_SERVICE_TOKEN }}
Expand Down
2 changes: 1 addition & 1 deletion .opencode/tool/github-triage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { tool } from "@opencode-ai/plugin"
const TEAM = {
tui: ["kommander", "simonklee"],
desktop_web: ["Hona", "Brendonovich"],
core: ["jlongster", "rekram1-node", "nexxeln", "kitlangton"],
core: ["jlongster", "rekram1-node", "neriousy", "nexxeln", "kitlangton"],
inference: ["fwang", "MrMushrooooom", "starptech"],
windows: ["Hona"],
} as const
Expand Down
179 changes: 117 additions & 62 deletions bun.lock

Large diffs are not rendered by default.

14 changes: 13 additions & 1 deletion infra/stats.ts
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,16 @@ const statsSyncConfig = new sst.Linkable("StatsSyncConfig", {
},
})

const r2SqlAuthToken = new sst.Secret("R2SqlAuthToken")
const r2Sql = new sst.Linkable("R2Sql", {
properties: {
accountId: "15d29c8639fd3733b1b5486a2acfd968",
bucket: `platform-${$app.stage}-lake`,
namespace: "inference",
table: "generation",
},
})

export const statSync = new sst.aws.Service("StatsSyncService", {
cluster: lakeCluster,
architecture: "arm64",
Expand All @@ -193,7 +203,9 @@ export const statSync = new sst.aws.Service("StatsSyncService", {
dockerfile: "packages/stats/server/Dockerfile",
},
command: ["bun", "src/stat-sync.ts"],
link: [database, inferenceEvent, statsSyncConfig],
// Keep the legacy Athena link and IAM permissions during the first R2-backed
// release so reverting the application code remains a one-deploy rollback.
link: [database, inferenceEvent, r2Sql, r2SqlAuthToken, statsSyncConfig],
permissions: lakeQueryPermissions,
scaling: {
min: 1,
Expand Down
8 changes: 4 additions & 4 deletions nix/hashes.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"nodeModules": {
"x86_64-linux": "sha256-uduwrM143NDSc+tXsi4lVVfoMll2a3BDHRUjuO7GB68=",
"aarch64-linux": "sha256-6DUda78XdXY6DP86lIUkweSjys3iG4Y4mo1PiaNuXbg=",
"aarch64-darwin": "sha256-AkJwfLULLZVwwz+XU1QcFUZoIS7oVPCn+n/MXEaxrqE=",
"x86_64-darwin": "sha256-hAxKGdiITTxQ2uujQt6prNjo3NxGAMMeo+9HlMWK6GU="
"x86_64-linux": "sha256-kDCnJMnaK/Jq7ckcpPB7Vl9v98EMSdcehZAtf8jNjTs=",
"aarch64-linux": "sha256-0aR+OJGXS5HMlXbe/BHybjIRvdNJJw6gjW+jr6Dk7Pk=",
"aarch64-darwin": "sha256-loLrV6xiorhwS/N2hlpiKSKX172Qxy+auNiPzFBhQSc=",
"x86_64-darwin": "sha256-PNEpQBLAz8M274bSyTpp0jofETn2L+D0uBiJHUV7nB0="
}
}
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@
"@modelcontextprotocol/sdk@1.29.0": "patches/@modelcontextprotocol%2Fsdk@1.29.0.patch",
"effect@4.0.0-beta.83": "patches/effect@4.0.0-beta.83.patch",
"@tanstack/virtual-core@3.17.3": "patches/@tanstack%2Fvirtual-core@3.17.3.patch",
"@ai-sdk/openai-compatible@2.0.41": "patches/@ai-sdk%2Fopenai-compatible@2.0.41.patch"
"@ai-sdk/openai-compatible@2.0.41": "patches/@ai-sdk%2Fopenai-compatible@2.0.41.patch",
"@ai-sdk/groq@3.0.31": "patches/@ai-sdk%2Fgroq@3.0.31.patch"
}
}
2 changes: 1 addition & 1 deletion packages/app/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/app",
"version": "1.18.15",
"version": "1.18.18",
"description": "",
"type": "module",
"exports": {
Expand Down
5 changes: 5 additions & 0 deletions packages/app/src/context/global-sync/utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ describe("normalizeProviderList", () => {
)

expect(result.connected).toEqual(["openai"])
expect(result.defaultModel).toEqual({ providerID: "openai", modelID: "gpt-5" })
expect(result.default).toEqual({ openai: "gpt-5" })
expect(result.all.get("openai")?.models["gpt-old"]).toBeUndefined()
expect(result.all.get("openai")?.models["gpt-5"]).toMatchObject({
Expand All @@ -113,6 +114,10 @@ describe("normalizeProviderList", () => {
variants: { high: {} },
})
})

test("preserves an empty current default", () => {
expect(normalizeProviderList([] as ProviderListOutput["data"], [], null).defaultModel).toBeNull()
})
})

describe("directoryKey", () => {
Expand Down
1 change: 1 addition & 0 deletions packages/app/src/context/global-sync/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ export function normalizeProviderList(
return {
all,
connected: providers.map((provider) => provider.id),
defaultModel: defaultModel ? { providerID: defaultModel.providerID, modelID: defaultModel.id } : null,
default: Object.fromEntries(
providers.flatMap((provider) => {
const model =
Expand Down
7 changes: 3 additions & 4 deletions packages/app/src/context/local.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { createStore } from "solid-js/store"
import { useModels } from "@/context/models"
import { useSettings } from "@/context/settings"
import { useProviders } from "@/hooks/use-providers"
import { resolveDefaultModel } from "@/hooks/provider-catalog"
import { Persist, persisted } from "@/utils/persist"
import { hasCustomAgent, resolveAgent } from "./local-agent"
import { cycleModelVariant, getConfiguredAgentVariant, resolveModelVariant } from "./model-variant"
Expand Down Expand Up @@ -149,10 +150,8 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
})

const configuredModel = () => {
const configured = sync().data.config.model
if (!configured) return
const [providerID, modelID] = configured.split("/")
const model = { providerID, modelID }
const model = resolveDefaultModel(providers.defaultModel(), sync().data.config.model)
if (!model) return
if (validModel(model)) return model
}

Expand Down
20 changes: 19 additions & 1 deletion packages/app/src/hooks/provider-catalog.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { expect, test } from "bun:test"
import type { NormalizedProviderListResponse } from "@opencode-ai/session-ui/context"
import { selectProviderCatalog } from "./provider-catalog"
import { resolveDefaultModel, selectProviderCatalog } from "./provider-catalog"

const catalog = (id: string): NormalizedProviderListResponse => ({
all: new Map([[id, { id, name: id, source: "api", env: [], options: {}, models: {} }]]),
Expand Down Expand Up @@ -57,3 +57,21 @@ test("falls back to the global catalog for route consumers", () => {
}),
).toBe(global)
})

test("uses the current server default model", () => {
expect(resolveDefaultModel({ providerID: "openai", modelID: "gpt-5" }, "anthropic/claude")).toEqual({
providerID: "openai",
modelID: "gpt-5",
})
})

test("does not use legacy config when the current server has no default", () => {
expect(resolveDefaultModel(null, "anthropic/claude")).toBeUndefined()
})

test("uses config for legacy servers", () => {
expect(resolveDefaultModel(undefined, "anthropic/claude")).toEqual({
providerID: "anthropic",
modelID: "claude",
})
})
10 changes: 10 additions & 0 deletions packages/app/src/hooks/provider-catalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,13 @@ export function selectProviderCatalog(input: ProviderCatalogInput) {
if (input.explicit) return emptyProviderCatalog
return input.global
}

export function resolveDefaultModel(
current: NormalizedProviderListResponse["defaultModel"],
legacy: string | undefined,
) {
if (current !== undefined) return current ?? undefined
if (!legacy) return undefined
const [providerID, modelID] = legacy.split("/")
return { providerID, modelID }
}
1 change: 1 addition & 0 deletions packages/app/src/hooks/use-providers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ export function useProviders(directory: Accessor<string | undefined>) {
return {
all: () => providers().all,
default: () => providers().default,
defaultModel: () => providers().defaultModel,
popular: () =>
pipe(
providers().all,
Expand Down
14 changes: 7 additions & 7 deletions packages/app/src/i18n/zh.ts
Original file line number Diff line number Diff line change
Expand Up @@ -583,7 +583,7 @@ export const dict = {
"dialog.usageExceeded.dontShowAgain": "不再显示",

"context.breakdown.title": "上下文细分",
"context.breakdown.note": "输入词元的大致细分。“其他”包含工具定义和开销。",
"context.breakdown.note": "输入 token 的大致细分。“其他”包含工具定义和开销。",
"context.breakdown.system": "系统",
"context.breakdown.user": "用户",
"context.breakdown.assistant": "助手",
Expand All @@ -598,18 +598,18 @@ export const dict = {
"context.stats.provider": "提供商",
"context.stats.model": "模型",
"context.stats.limit": "上下文限制",
"context.stats.totalTokens": "词元总数",
"context.stats.totalTokens": "总 token",
"context.stats.usage": "使用率",
"context.stats.inputTokens": "输入词元",
"context.stats.outputTokens": "输出词元",
"context.stats.reasoningTokens": "推理词元",
"context.stats.cacheTokens": "缓存词元(读/写)",
"context.stats.inputTokens": "输入 token",
"context.stats.outputTokens": "输出 token",
"context.stats.reasoningTokens": "推理 token",
"context.stats.cacheTokens": "缓存 token(读/写)",
"context.stats.userMessages": "用户消息",
"context.stats.assistantMessages": "助手消息",
"context.stats.totalCost": "总成本",
"context.stats.sessionCreated": "创建时间",
"context.stats.lastActivity": "最后活动",
"context.usage.tokens": "词元数",
"context.usage.tokens": "Token",
"context.usage.usage": "使用率",
"context.usage.cost": "成本",
"context.usage.clickToView": "点击查看上下文",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { usePrompt } from "@/context/prompt"
import { useSDK } from "@/context/sdk"
import { useSync } from "@/context/sync"
import { useProviders } from "@/hooks/use-providers"
import { resolveDefaultModel } from "@/hooks/provider-catalog"

export function createPromptModelSelection(input: { agent: () => { model?: ModelKey; variant?: string } | undefined }) {
const sdk = useSDK()
Expand All @@ -21,10 +22,8 @@ export function createPromptModelSelection(input: { agent: () => { model?: Model
}

const configured = () => {
const value = sync().data.config.model
if (!value) return
const [providerID, modelID] = value.split("/")
const model = { providerID, modelID }
const model = resolveDefaultModel(providers.defaultModel(), sync().data.config.model)
if (!model) return
if (valid(model)) return model
}

Expand Down
2 changes: 1 addition & 1 deletion packages/cli/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/cli",
"version": "1.18.15",
"version": "1.18.18",
"type": "module",
"license": "MIT",
"bin": {
Expand Down
2 changes: 1 addition & 1 deletion packages/codemode/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/codemode",
"version": "1.18.15",
"version": "1.18.18",
"description": "Effect-native confined code execution over schema-described tools",
"private": true,
"type": "module",
Expand Down
2 changes: 1 addition & 1 deletion packages/console/app/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-app",
"version": "1.18.15",
"version": "1.18.18",
"type": "module",
"license": "MIT",
"scripts": {
Expand Down
3 changes: 2 additions & 1 deletion packages/console/app/src/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -373,7 +373,8 @@ export const dict = {
"zen.api.error.providerNotSupported": "Provider {{provider}} not supported",
"zen.api.error.missingApiKey": "Missing API key.",
"zen.api.error.invalidApiKey": "Invalid API key.",
"zen.api.error.requestBlockedByUpstreamProvider": "Request blocked by upstream provider.",
"zen.api.error.requestBlockedByUpstreamProvider":
"This account has found to be committing fraud or is in breach of terms of services and has been blocked. If you believe this is a mistake please send an email to help@anoma.ly.",
"zen.api.error.subscriptionQuotaExceeded": "Subscription quota exceeded. Retry in {{retryIn}}.",
"zen.api.error.goSubscriptionRollingLimitExceeded":
"5-hour usage limit reached. Resets in {{retryIn}}. To continue using this model now, enable usage from your available balance: {{consoleGoUrl}}",
Expand Down
1 change: 1 addition & 0 deletions packages/console/app/src/routes/go/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ const checkLoggedIn = query(async () => {
const models = [
{ name: "Grok 4.5", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention30" },
{ name: "GPT 5.6 Luna", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention30" },
{ name: "GLM-5.3", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "GLM-5.2", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "GLM-5.1", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
{ name: "Kimi K3", training: "go.faq.a5.notUsed", retention: "go.faq.a5.retention0" },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,7 @@ export function LiteSection(props: { lite: LiteSubscription | undefined }) {
<ul data-slot="promo-models">
<li>Grok 4.5</li>
<li>GPT 5.6 Luna</li>
<li>GLM-5.3</li>
<li>GLM-5.2</li>
<li>GLM-5.1</li>
<li>Kimi K3</li>
Expand Down
Loading
Loading