From f5573281cacd7b91af4573af4111fa601f336f9d Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" Date: Sun, 19 Jul 2026 07:46:36 +0000 Subject: [PATCH 1/6] chore: generate --- packages/web/src/content/docs/ar/go.mdx | 2 +- packages/web/src/content/docs/bs/go.mdx | 2 +- packages/web/src/content/docs/da/go.mdx | 2 +- packages/web/src/content/docs/de/go.mdx | 2 +- packages/web/src/content/docs/es/go.mdx | 2 +- packages/web/src/content/docs/fr/go.mdx | 2 +- packages/web/src/content/docs/it/go.mdx | 2 +- packages/web/src/content/docs/ja/go.mdx | 2 +- packages/web/src/content/docs/ko/go.mdx | 2 +- packages/web/src/content/docs/nb/go.mdx | 2 +- packages/web/src/content/docs/pl/go.mdx | 2 +- packages/web/src/content/docs/pt-br/go.mdx | 2 +- packages/web/src/content/docs/ru/go.mdx | 2 +- packages/web/src/content/docs/th/go.mdx | 2 +- packages/web/src/content/docs/tr/go.mdx | 2 +- packages/web/src/content/docs/zh-cn/go.mdx | 2 +- packages/web/src/content/docs/zh-tw/go.mdx | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/web/src/content/docs/ar/go.mdx b/packages/web/src/content/docs/ar/go.mdx index cc5a81f108..0597f3adf1 100644 --- a/packages/web/src/content/docs/ar/go.mdx +++ b/packages/web/src/content/docs/ar/go.mdx @@ -86,7 +86,7 @@ OpenCode Go هو اشتراك منخفض التكلفة — **$5 للشهر ال | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | diff --git a/packages/web/src/content/docs/bs/go.mdx b/packages/web/src/content/docs/bs/go.mdx index 1a61470e33..26b5575a01 100644 --- a/packages/web/src/content/docs/bs/go.mdx +++ b/packages/web/src/content/docs/bs/go.mdx @@ -96,7 +96,7 @@ Tabela ispod pruža procijenjeni broj zahtjeva na osnovu tipičnih obrazaca kori | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | diff --git a/packages/web/src/content/docs/da/go.mdx b/packages/web/src/content/docs/da/go.mdx index 44a5cd2993..280891deee 100644 --- a/packages/web/src/content/docs/da/go.mdx +++ b/packages/web/src/content/docs/da/go.mdx @@ -96,7 +96,7 @@ Tabellen nedenfor giver et estimeret antal anmodninger baseret på typiske Go-fo | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | diff --git a/packages/web/src/content/docs/de/go.mdx b/packages/web/src/content/docs/de/go.mdx index 95af7f78a9..2bb3f0b742 100644 --- a/packages/web/src/content/docs/de/go.mdx +++ b/packages/web/src/content/docs/de/go.mdx @@ -88,7 +88,7 @@ Die folgende Tabelle zeigt eine geschätzte Anzahl von Anfragen basierend auf ty | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | diff --git a/packages/web/src/content/docs/es/go.mdx b/packages/web/src/content/docs/es/go.mdx index 579d9117ee..4aa1ca46e3 100644 --- a/packages/web/src/content/docs/es/go.mdx +++ b/packages/web/src/content/docs/es/go.mdx @@ -96,7 +96,7 @@ La siguiente tabla proporciona una cantidad estimada de peticiones basada en los | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | diff --git a/packages/web/src/content/docs/fr/go.mdx b/packages/web/src/content/docs/fr/go.mdx index 1ee3e5906e..95849616b0 100644 --- a/packages/web/src/content/docs/fr/go.mdx +++ b/packages/web/src/content/docs/fr/go.mdx @@ -86,7 +86,7 @@ Le tableau ci-dessous fournit une estimation du nombre de requêtes basée sur d | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | diff --git a/packages/web/src/content/docs/it/go.mdx b/packages/web/src/content/docs/it/go.mdx index 9c944e26b0..65369e1e86 100644 --- a/packages/web/src/content/docs/it/go.mdx +++ b/packages/web/src/content/docs/it/go.mdx @@ -94,7 +94,7 @@ La tabella seguente fornisce una stima del conteggio delle richieste in base a p | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | diff --git a/packages/web/src/content/docs/ja/go.mdx b/packages/web/src/content/docs/ja/go.mdx index f4df2b653b..8bb9139e83 100644 --- a/packages/web/src/content/docs/ja/go.mdx +++ b/packages/web/src/content/docs/ja/go.mdx @@ -86,7 +86,7 @@ OpenCode Goには以下の制限が含まれています: | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | diff --git a/packages/web/src/content/docs/ko/go.mdx b/packages/web/src/content/docs/ko/go.mdx index 61b89254a2..02f88d2828 100644 --- a/packages/web/src/content/docs/ko/go.mdx +++ b/packages/web/src/content/docs/ko/go.mdx @@ -86,7 +86,7 @@ OpenCode Go에는 다음과 같은 한도가 포함됩니다. | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | diff --git a/packages/web/src/content/docs/nb/go.mdx b/packages/web/src/content/docs/nb/go.mdx index edb7ba95c2..60be1cc7bb 100644 --- a/packages/web/src/content/docs/nb/go.mdx +++ b/packages/web/src/content/docs/nb/go.mdx @@ -96,7 +96,7 @@ Tabellen nedenfor gir et estimert antall forespørsler basert på typiske bruksm | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | diff --git a/packages/web/src/content/docs/pl/go.mdx b/packages/web/src/content/docs/pl/go.mdx index 4160be7200..4a867bf0e7 100644 --- a/packages/web/src/content/docs/pl/go.mdx +++ b/packages/web/src/content/docs/pl/go.mdx @@ -90,7 +90,7 @@ Poniższa tabela przedstawia szacunkową liczbę żądań na podstawie typowych | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | diff --git a/packages/web/src/content/docs/pt-br/go.mdx b/packages/web/src/content/docs/pt-br/go.mdx index 3cb54dfa7c..96c1addfcc 100644 --- a/packages/web/src/content/docs/pt-br/go.mdx +++ b/packages/web/src/content/docs/pt-br/go.mdx @@ -96,7 +96,7 @@ A tabela abaixo fornece uma contagem estimada de requisições com base nos padr | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | diff --git a/packages/web/src/content/docs/ru/go.mdx b/packages/web/src/content/docs/ru/go.mdx index 25fbde0f61..62305fbdb6 100644 --- a/packages/web/src/content/docs/ru/go.mdx +++ b/packages/web/src/content/docs/ru/go.mdx @@ -96,7 +96,7 @@ OpenCode Go включает следующие лимиты: | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | diff --git a/packages/web/src/content/docs/th/go.mdx b/packages/web/src/content/docs/th/go.mdx index 270929027e..36036426da 100644 --- a/packages/web/src/content/docs/th/go.mdx +++ b/packages/web/src/content/docs/th/go.mdx @@ -86,7 +86,7 @@ OpenCode Go มีขีดจำกัดดังต่อไปนี้: | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | diff --git a/packages/web/src/content/docs/tr/go.mdx b/packages/web/src/content/docs/tr/go.mdx index a799afa28d..e24ead2959 100644 --- a/packages/web/src/content/docs/tr/go.mdx +++ b/packages/web/src/content/docs/tr/go.mdx @@ -86,7 +86,7 @@ Aşağıdaki tablo, tipik Go kullanım modellerine dayalı tahmini bir istek say | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | diff --git a/packages/web/src/content/docs/zh-cn/go.mdx b/packages/web/src/content/docs/zh-cn/go.mdx index debb8b9882..604b910159 100644 --- a/packages/web/src/content/docs/zh-cn/go.mdx +++ b/packages/web/src/content/docs/zh-cn/go.mdx @@ -86,7 +86,7 @@ OpenCode Go 包含以下限制: | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | diff --git a/packages/web/src/content/docs/zh-tw/go.mdx b/packages/web/src/content/docs/zh-tw/go.mdx index a4d5222d95..6434504a3e 100644 --- a/packages/web/src/content/docs/zh-tw/go.mdx +++ b/packages/web/src/content/docs/zh-tw/go.mdx @@ -86,7 +86,7 @@ OpenCode Go 包含以下限制: | Grok 4.5 | 120 | 300 | 600 | | GLM-5.2 | 880 | 2,150 | 4,300 | | GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K3 | 110 | 250 | 490 | +| Kimi K3 | 110 | 250 | 490 | | Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | | Kimi K2.6 | 1,150 | 2,880 | 5,750 | | MiMo-V2.5 | 30,100 | 75,200 | 150,400 | From 78587c141bbac2c60b33c277359ba635b3410750 Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" <219766164+opencode-agent[bot]@users.noreply.github.com> Date: Sun, 19 Jul 2026 13:00:57 +0000 Subject: [PATCH 2/6] fix(app): restore question pager segments (#37575) Co-authored-by: Jay <53023+jayair@users.noreply.github.com> --- packages/session-ui/src/components/message-part.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/session-ui/src/components/message-part.css b/packages/session-ui/src/components/message-part.css index 2063507241..f4e8f68981 100644 --- a/packages/session-ui/src/components/message-part.css +++ b/packages/session-ui/src/components/message-part.css @@ -891,7 +891,7 @@ width: 16px; height: 2px; border-radius: 999px; - background-color: var(--icon-weak-base); + background-color: var(--v2-icon-icon-muted); transition: background-color 0.2s ease; } From 67caf894e0843ee370e72839e8265e483233479b Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" <219766164+opencode-agent[bot]@users.noreply.github.com> Date: Sun, 19 Jul 2026 10:41:48 -0500 Subject: [PATCH 3/6] fix(opencode): increase OpenAI header timeout (#37770) Co-authored-by: Aiden Cline --- packages/opencode/src/provider/provider.ts | 2 +- packages/opencode/test/provider/header-timeout.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 5ac916e412..a0ab5eb347 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -32,7 +32,7 @@ import { ModelStatus } from "./model-status" import { RuntimeFlags } from "@/effect/runtime-flags" import { ProviderError } from "./error" -const OPENAI_HEADER_TIMEOUT_DEFAULT = 10_000 +const OPENAI_HEADER_TIMEOUT_DEFAULT = 300_000 function wrapSSE(res: Response, ms: number, ctl: AbortController) { if (typeof ms !== "number" || ms <= 0) return res diff --git a/packages/opencode/test/provider/header-timeout.test.ts b/packages/opencode/test/provider/header-timeout.test.ts index 1bd27b5cdd..fc5ab04e10 100644 --- a/packages/opencode/test/provider/header-timeout.test.ts +++ b/packages/opencode/test/provider/header-timeout.test.ts @@ -162,7 +162,7 @@ it.live("OpenAI API auth gets default headerTimeout", () => Effect.gen(function* () { const provider = yield* Provider.Service const openai = yield* provider.getProvider(ProviderV2.ID.openai) - expect(openai.options.headerTimeout).toBe(10_000) + expect(openai.options.headerTimeout).toBe(300_000) }), ) }), From 7985c2066a8f38c48a7d8fefbafcbab96ffa3117 Mon Sep 17 00:00:00 2001 From: Rahul A Mistry <149420892+ProdigyRahul@users.noreply.github.com> Date: Mon, 20 Jul 2026 05:52:38 +0530 Subject: [PATCH 4/6] fix(app): show keybind tooltips on prompt input controls (#37824) --- .../app/src/components/prompt-input-v2.tsx | 4 + .../src/v2/components/prompt-input/index.tsx | 88 +++++++++++-------- .../v2/components/prompt-input/interaction.ts | 1 + 3 files changed, 54 insertions(+), 39 deletions(-) diff --git a/packages/app/src/components/prompt-input-v2.tsx b/packages/app/src/components/prompt-input-v2.tsx index d42a786b0d..921d8ff45c 100644 --- a/packages/app/src/components/prompt-input-v2.tsx +++ b/packages/app/src/components/prompt-input-v2.tsx @@ -60,6 +60,8 @@ export function PromptInputV2Composer(props: PromptInputV2ComposerProps) { controller={props.controller} borderUnderlay={props.borderUnderlay} class={props.class} + attachKeybind={command.keybindParts("file.attach")} + attachShortcut={command.keybind("file.attach")} modelControl={ props.controls.agents.options.map((name) => ({ id: name, label: name })), current: () => props.controls.agents.current, onSelect: props.controls.agents.select, + keybind: () => command.keybindParts("agent.cycle"), } : undefined, variant: { options: () => variants().map((value) => ({ id: value, label: value })), current: () => props.controls.model.selection.variant.current() ?? "default", onSelect: (value) => props.controls.model.selection.variant.set(value === "default" ? undefined : value), + keybind: () => command.keybindParts("model.variant.cycle"), }, submit: { stopping, diff --git a/packages/session-ui/src/v2/components/prompt-input/index.tsx b/packages/session-ui/src/v2/components/prompt-input/index.tsx index 30206cba26..c9b71dd4a4 100644 --- a/packages/session-ui/src/v2/components/prompt-input/index.tsx +++ b/packages/session-ui/src/v2/components/prompt-input/index.tsx @@ -39,6 +39,8 @@ export type PromptInputV2Props = { borderUnderlay?: boolean class?: string modelControl?: JSX.Element + attachKeybind?: string[] + attachShortcut?: string } export function PromptInputV2(props: PromptInputV2Props) { @@ -197,9 +199,9 @@ export function PromptInputV2(props: PromptInputV2Props) { {(control) => ( 1}> - + )} @@ -512,7 +518,7 @@ function PromptInputV2ConfiguredSelect(props: { return ( void }) { return ( - - - {props.currentIcon} - - {props.options.find((option) => option.id === props.current)?.label ?? props.current} - - - - - - - - - - {(option) => ( - - {option.label} - - )} - - - - - + + {props.title} + + + } + > + + + {props.currentIcon} + + {props.options.find((option) => option.id === props.current)?.label ?? props.current} + + + + + + + + + + {(option) => ( + + {option.label} + + )} + + + + + + ) } @@ -688,8 +703,3 @@ function PromptInputV2SuggestionIcon(props: { item: PromptInputV2Suggestion }) { /> ) } - -function keybindTitle(label: string, keybind?: string[]) { - if (!keybind?.length) return label - return `${label} (${keybind.join("+")})` -} diff --git a/packages/session-ui/src/v2/components/prompt-input/interaction.ts b/packages/session-ui/src/v2/components/prompt-input/interaction.ts index a003c081be..989ebcac20 100644 --- a/packages/session-ui/src/v2/components/prompt-input/interaction.ts +++ b/packages/session-ui/src/v2/components/prompt-input/interaction.ts @@ -23,6 +23,7 @@ export type PromptInputV2SelectControl = { options: Accessor current: Accessor onSelect: (id: string) => void + keybind?: Accessor } export type PromptInputV2ViewConfig = { From ba4b8e21f4ecd70f30b8dc24458f56a4fe84eca5 Mon Sep 17 00:00:00 2001 From: David Hill <1879069+iamdavidhill@users.noreply.github.com> Date: Mon, 20 Jul 2026 03:22:48 +0100 Subject: [PATCH 5/6] feat(app): toggle debug tools from dev badge (#36689) Co-authored-by: LukeParkerDev <10430890+Hona@users.noreply.github.com> --- packages/app/src/components/titlebar.tsx | 27 ++++++++++++++++++------ packages/app/src/pages/layout-new.tsx | 13 ++++++++++-- packages/app/src/pages/layout.tsx | 12 +++++++++-- 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/packages/app/src/components/titlebar.tsx b/packages/app/src/components/titlebar.tsx index 1a2a8a81b6..4578656107 100644 --- a/packages/app/src/components/titlebar.tsx +++ b/packages/app/src/components/titlebar.tsx @@ -67,7 +67,7 @@ export function useTitlebarRightMount() { return mount } -export function Titlebar(props: { update?: TitlebarUpdate }) { +export function Titlebar(props: { update?: TitlebarUpdate; debugTools?: { visible: boolean; toggle: () => void } }) { const layout = useLayout() const platform = usePlatform() const command = useCommand() @@ -462,7 +462,7 @@ export function Titlebar(props: { update?: TitlebarUpdate }) { "md:pl-4": !mac(), }} > - + @@ -660,9 +660,9 @@ export function Titlebar(props: { update?: TitlebarUpdate }) {
-
+ @@ -747,12 +747,27 @@ function TitlebarUpdateIconButton(props: { state: TitlebarUpdatePillState }) { ) } -function ChannelIndicator() { +function ChannelIndicator(props: { debugTools?: { visible: boolean; toggle: () => void } }) { + const channel = import.meta.env.VITE_OPENCODE_CHANNEL + if (channel === "dev" && props.debugTools) { + return ( + + ) + } + return ( <> - {["beta", "dev"].includes(import.meta.env.VITE_OPENCODE_CHANNEL) && ( + {["beta", "dev"].includes(channel) && (
- {import.meta.env.VITE_OPENCODE_CHANNEL.toUpperCase()} + {channel.toUpperCase()}
)} diff --git a/packages/app/src/pages/layout-new.tsx b/packages/app/src/pages/layout-new.tsx index fd0df68d27..c6fed8f6d5 100644 --- a/packages/app/src/pages/layout-new.tsx +++ b/packages/app/src/pages/layout-new.tsx @@ -1,4 +1,5 @@ import { createEffect, Suspense, type ParentProps } from "solid-js" +import { createStore } from "solid-js/store" import { useNavigate } from "@solidjs/router" import { DebugBar } from "@/components/debug-bar" import { TabsInfoPopup } from "@/components/help-button" @@ -11,6 +12,7 @@ export default function NewLayout(props: ParentProps) { const platform = usePlatform() const navigate = useNavigate() setNavigate(navigate) + const [state, setState] = createStore({ debugTools: true }) createEffect(() => setV2Toast(true)) @@ -32,11 +34,18 @@ export default function NewLayout(props: ParentProps) { "padding-bottom": "env(safe-area-inset-bottom, 0px)", }} > - + setState("debugTools", (value) => !value) } + : undefined + } + />
{props.children}
- {import.meta.env.DEV && } + {import.meta.env.DEV && state.debugTools && } diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index 545eee827a..812a479b20 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -156,6 +156,7 @@ export default function LegacyLayout(props: ParentProps) { sizing: false, peek: undefined as string | undefined, peeked: false, + debugTools: true, }) const updateVersion = () => { @@ -2248,7 +2249,14 @@ export default function LegacyLayout(props: ParentProps) { return (
{autoselecting() ?? ""} - + setState("debugTools", (value) => !value) } + : undefined + } + /> @@ -2393,7 +2401,7 @@ export default function LegacyLayout(props: ParentProps) {
- {import.meta.env.DEV && import.meta.env.VITE_DISABLE_DEBUG_BAR !== "1" && } + {import.meta.env.DEV && import.meta.env.VITE_DISABLE_DEBUG_BAR !== "1" && state.debugTools && } From 2a097f3af70542ec596814c99d997ff2c8562682 Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" <219766164+opencode-agent[bot]@users.noreply.github.com> Date: Sun, 19 Jul 2026 22:15:21 -0500 Subject: [PATCH 6/6] fix(llm): expand context overflow patterns (#37840) Co-authored-by: Aiden Cline --- packages/llm/src/provider-error.ts | 12 ++++++++++- packages/llm/test/provider-error.test.ts | 26 ++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/packages/llm/src/provider-error.ts b/packages/llm/src/provider-error.ts index 321bd7927e..f8b8a5c013 100644 --- a/packages/llm/src/provider-error.ts +++ b/packages/llm/src/provider-error.ts @@ -3,13 +3,17 @@ import { LLMError, ProviderErrorEvent } from "./schema" const patterns = [ /prompt is too long/i, + /request_too_large/i, /input is too long for requested model/i, /exceeds the context window/i, + /exceeds (?:the )?(?:model'?s )?maximum context length(?: of [\d,]+ tokens?|\s*\([\d,]+\))/i, /input token count.*exceeds the maximum/i, /tokens in request more than max tokens allowed/i, /maximum prompt length is \d+/i, /reduce the length of the messages/i, /maximum context length is \d+ tokens/i, + /exceeds (?:the )?maximum allowed input length of [\d,]+ tokens?/i, + /input \(\d+ tokens\) is longer than the model'?s context length \(\d+ tokens\)/i, /exceeds the limit of \d+/i, /exceeds the available context size/i, /greater than the context length/i, @@ -21,11 +25,17 @@ const patterns = [ /input length.*exceeds.*context length/i, /prompt too long; exceeded (?:max )?context length/i, /too large for model with \d+ maximum context length/i, + /prompt has [\d,]+ tokens?, but the configured context size is [\d,]+ tokens?/i, /model_context_window_exceeded/i, + /too many tokens/i, + /token limit exceeded/i, ] +const exclusions = [/^(throttling error|service unavailable):/i, /rate limit/i, /too many requests/i] + export const isContextOverflow = (message: string) => - patterns.some((pattern) => pattern.test(message)) || /^4(00|13)\s*(status code)?\s*\(no body\)/i.test(message) + !exclusions.some((pattern) => pattern.test(message)) && + (patterns.some((pattern) => pattern.test(message)) || /^4(00|13)\s*(status code)?\s*\(no body\)/i.test(message)) export const isContextOverflowFailure = (failure: unknown) => failure instanceof LLMError diff --git a/packages/llm/test/provider-error.test.ts b/packages/llm/test/provider-error.test.ts index 3622c89454..c418596964 100644 --- a/packages/llm/test/provider-error.test.ts +++ b/packages/llm/test/provider-error.test.ts @@ -2,7 +2,29 @@ import { describe, expect, test } from "bun:test" import { isContextOverflow } from "../src" describe("provider error classification", () => { - test("classifies Z.AI GLM token limit messages as context overflow", () => { - expect(isContextOverflow("tokens in request more than max tokens allowed")).toBe(true) + test("classifies provider token limit messages as context overflow", () => { + const messages = [ + "tokens in request more than max tokens allowed", + '{"error":{"type":"request_too_large","message":"Request exceeds the maximum size"}}', + "Requested token count exceeds the model's maximum context length of 131072 tokens.", + "Input length (265330) exceeds model's maximum context length (262144).", + "Input length 131393 exceeds the maximum allowed input length of 131040 tokens.", + "The input (516368 tokens) is longer than the model's context length (262144 tokens).", + "Prompt has 5,958,968 tokens, but the configured context size is 256,000 tokens", + "Too many tokens", + "Token limit exceeded", + ] + + expect(messages.every(isContextOverflow)).toBe(true) + }) + + test("does not classify rate limits as context overflow", () => { + const messages = [ + "Throttling error: Too many tokens, please wait before trying again.", + "Rate limit exceeded, please retry after 30 seconds.", + "Too many requests. Please slow down.", + ] + + expect(messages.some(isContextOverflow)).toBe(false) }) })