From f80f3e33ec29973c3f3a0653b509e58ecb83e031 Mon Sep 17 00:00:00 2001
From: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
Date: Mon, 18 May 2026 15:20:08 +0800
Subject: [PATCH] desktop: add free limit + go usage exceeded dialogs to match
tui (#27677)
---
.../src/components/dialog-usage-exceeded.tsx | 44 ++++++++
packages/app/src/pages/session.tsx | 3 +
.../pages/session/usage-exceeded-dialogs.tsx | 102 ++++++++++++++++++
packages/ui/src/context/dialog.tsx | 3 +-
packages/ui/src/i18n/ar.ts | 7 ++
packages/ui/src/i18n/br.ts | 7 ++
packages/ui/src/i18n/bs.ts | 7 ++
packages/ui/src/i18n/da.ts | 7 ++
packages/ui/src/i18n/de.ts | 7 ++
packages/ui/src/i18n/en.ts | 7 ++
packages/ui/src/i18n/es.ts | 7 ++
packages/ui/src/i18n/fr.ts | 7 ++
packages/ui/src/i18n/ja.ts | 7 ++
packages/ui/src/i18n/ko.ts | 7 ++
packages/ui/src/i18n/no.ts | 7 ++
packages/ui/src/i18n/pl.ts | 7 ++
packages/ui/src/i18n/ru.ts | 7 ++
packages/ui/src/i18n/th.ts | 7 ++
packages/ui/src/i18n/tr.ts | 7 ++
packages/ui/src/i18n/zh.ts | 7 ++
packages/ui/src/i18n/zht.ts | 7 ++
21 files changed, 270 insertions(+), 1 deletion(-)
create mode 100644 packages/app/src/components/dialog-usage-exceeded.tsx
create mode 100644 packages/app/src/pages/session/usage-exceeded-dialogs.tsx
diff --git a/packages/app/src/components/dialog-usage-exceeded.tsx b/packages/app/src/components/dialog-usage-exceeded.tsx
new file mode 100644
index 0000000000..e428d4c2bb
--- /dev/null
+++ b/packages/app/src/components/dialog-usage-exceeded.tsx
@@ -0,0 +1,44 @@
+import { usePlatform } from "@/context/platform"
+import { Button } from "@opencode-ai/ui/button"
+import { useDialog } from "@opencode-ai/ui/context/dialog"
+import { Dialog } from "@opencode-ai/ui/dialog"
+import { JSX } from "solid-js"
+
+export type DialogGoUpsellProps = {
+ title: string
+ description: JSX.Element
+ link?: string
+ actionLabel: string
+ onClose?: (dontShowAgain?: boolean) => void
+}
+
+export function DialogUsageExceeded(props: DialogGoUpsellProps) {
+ const dialog = useDialog()
+ const platform = usePlatform()
+
+ const runAction = () => {
+ if (props.link) platform.openLink(props.link)
+ props.onClose?.()
+ dialog.close()
+ }
+
+ const dismiss = () => {
+ props.onClose?.(true)
+ dialog.close()
+ }
+
+ return (
+
+ )
+}
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx
index f5da21a609..5e93ff5bca 100644
--- a/packages/app/src/pages/session.tsx
+++ b/packages/app/src/pages/session.tsx
@@ -64,6 +64,7 @@ import { Persist, persisted } from "@/utils/persist"
import { extractPromptFromParts } from "@/utils/prompt"
import { same } from "@/utils/same"
import { formatServerError } from "@/utils/server-errors"
+import { useUsageExceededDialogs } from "./session/usage-exceeded-dialogs"
const emptyUserMessages: UserMessage[] = []
type FollowupItem = FollowupDraft & { id: string }
@@ -1645,6 +1646,8 @@ export default function Page() {
if (fillFrame !== undefined) cancelAnimationFrame(fillFrame)
})
+ useUsageExceededDialogs()
+
return (
{sessionSync() ?? ""}
diff --git a/packages/app/src/pages/session/usage-exceeded-dialogs.tsx b/packages/app/src/pages/session/usage-exceeded-dialogs.tsx
new file mode 100644
index 0000000000..5354410f48
--- /dev/null
+++ b/packages/app/src/pages/session/usage-exceeded-dialogs.tsx
@@ -0,0 +1,102 @@
+import { useSDK } from "@/context/sdk"
+import { Persist, persisted } from "@/utils/persist"
+import { SessionStatus } from "@opencode-ai/sdk/v2"
+import { onCleanup } from "solid-js"
+import { createStore } from "solid-js/store"
+import { useSessionLayout } from "./session-layout"
+import { useDialog } from "@opencode-ai/ui/context"
+import { DialogUsageExceeded } from "@/components/dialog-usage-exceeded"
+import { useI18n } from "@opencode-ai/ui/context"
+
+const GO_UPSELL_FREE_TIER_LAST_SEEN_AT = "go_upsell_last_seen_at"
+const GO_UPSELL_FREE_TIER_DONT_SHOW = "go_upsell_dont_show"
+const GO_UPSELL_ACCOUNT_RATE_LIMIT_LAST_SEEN_AT = "go_upsell_account_rate_limit_last_seen_at"
+const GO_UPSELL_ACCOUNT_RATE_LIMIT_DONT_SHOW = "go_upsell_account_rate_limit_dont_show"
+const GO_UPSELL_WINDOW = 86_400_000 // 24 hrs
+const GO_UPSELL_PROVIDERS = new Set(["opencode", "opencode-go"])
+
+function goUpsellKeys(status: SessionStatus) {
+ if (status.type !== "retry" || !status.action) return
+ const { action } = status
+ if (!GO_UPSELL_PROVIDERS.has(action.provider)) return
+ if (action.reason === "free_tier_limit") {
+ return {
+ lastSeenAt: GO_UPSELL_FREE_TIER_LAST_SEEN_AT,
+ dontShow: GO_UPSELL_FREE_TIER_DONT_SHOW,
+ } as const
+ }
+ if (action.reason === "account_rate_limit") {
+ return {
+ lastSeenAt: GO_UPSELL_ACCOUNT_RATE_LIMIT_LAST_SEEN_AT,
+ dontShow: GO_UPSELL_ACCOUNT_RATE_LIMIT_DONT_SHOW,
+ } as const
+ }
+}
+
+export function useUsageExceededDialogs() {
+ const sdk = useSDK()
+ const dialog = useDialog()
+ const { params } = useSessionLayout()
+ const { t, locale } = useI18n()
+ const isEnglish = () => locale() === "en"
+
+ const [goUpsellState, setGoUpsellState] = persisted(
+ Persist.global("go-upsell"),
+ createStore({
+ [GO_UPSELL_FREE_TIER_LAST_SEEN_AT]: null as null | number,
+ [GO_UPSELL_FREE_TIER_DONT_SHOW]: null as null | number,
+ [GO_UPSELL_ACCOUNT_RATE_LIMIT_LAST_SEEN_AT]: null as null | number,
+ [GO_UPSELL_ACCOUNT_RATE_LIMIT_DONT_SHOW]: null as null | number,
+ }),
+ )
+
+ onCleanup(
+ sdk.event.on("session.status", (evt) => {
+ if (evt.properties.sessionID !== params.id) return
+ if (evt.properties.status.type !== "retry") return
+ const { action } = evt.properties.status
+ if (!action) return
+ if (dialog.active) return
+
+ const keys = goUpsellKeys(evt.properties.status)
+ if (!keys) return
+
+ const seen = goUpsellState[keys.lastSeenAt]
+ if (seen && Date.now() - seen < GO_UPSELL_WINDOW) return
+ if (goUpsellState[keys.dontShow]) return
+
+ if (action.reason === "free_tier_limit") {
+ dialog.show(() => (
+ {
+ setGoUpsellState(keys.lastSeenAt, Date.now())
+ if (dontShowAgain) setGoUpsellState(keys.dontShow, Date.now())
+ else {
+ void import("../../components/dialog-connect-provider").then((x) =>
+ dialog.show(() => ),
+ )
+ }
+ }}
+ />
+ ))
+ } else if (action.reason === "account_rate_limit") {
+ dialog.show(() => (
+ {
+ setGoUpsellState(keys.lastSeenAt, Date.now())
+ if (dontShowAgain) setGoUpsellState(keys.dontShow, Date.now())
+ }}
+ />
+ ))
+ }
+ }),
+ )
+}
diff --git a/packages/ui/src/context/dialog.tsx b/packages/ui/src/context/dialog.tsx
index c1c56212b5..6c9b4c0d77 100644
--- a/packages/ui/src/context/dialog.tsx
+++ b/packages/ui/src/context/dialog.tsx
@@ -10,6 +10,7 @@ import {
runWithOwner,
useContext,
type JSX,
+ startTransition,
} from "solid-js"
import { Dialog as Kobalte } from "@kobalte/core/dialog"
import { makeEventListener } from "@solid-primitives/event-listener"
@@ -154,7 +155,7 @@ export function useDialog() {
},
show(element: DialogElement, onClose?: () => void) {
const base = ctx.active?.owner ?? owner
- ctx.show(element, base, onClose)
+ return startTransition(() => ctx.show(element, base, onClose))
},
close() {
ctx.close()
diff --git a/packages/ui/src/i18n/ar.ts b/packages/ui/src/i18n/ar.ts
index eaed411949..b882013025 100644
--- a/packages/ui/src/i18n/ar.ts
+++ b/packages/ui/src/i18n/ar.ts
@@ -46,6 +46,13 @@ export const dict = {
"ui.sessionTurn.error.freeUsageExceeded": "تم تجاوز حد الاستخدام المجاني",
"ui.sessionTurn.error.addCredits": "إضافة رصيد",
+ "dialog.usageExceeded.freeTier.title": "تم الوصول إلى الحد المجاني",
+ "dialog.usageExceeded.freeTier.description": "اشترك في OpenCode Go للحصول على وصول موثوق إلى أفضل النماذج مفتوحة المصدر، ابتداءً من $5/شهر.",
+ "dialog.usageExceeded.freeTier.actionLabel": "اشترك",
+ "dialog.usageExceeded.accountRateLimit.title": "تم الوصول إلى حد Go",
+ "dialog.usageExceeded.accountRateLimit.description": "تم الوصول إلى حد الاستخدام. لمتابعة استخدام هذا النموذج الآن، قم بتفعيل الاستخدام من رصيدك المتاح",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "فتح الإعدادات",
+
"ui.sessionTurn.status.delegating": "تفويض العمل",
"ui.sessionTurn.status.planning": "تخطيط الخطوات التالية",
"ui.sessionTurn.status.gatheringContext": "استكشاف",
diff --git a/packages/ui/src/i18n/br.ts b/packages/ui/src/i18n/br.ts
index 2fd24f37fa..e5db31f351 100644
--- a/packages/ui/src/i18n/br.ts
+++ b/packages/ui/src/i18n/br.ts
@@ -46,6 +46,13 @@ export const dict = {
"ui.sessionTurn.error.freeUsageExceeded": "Limite de uso gratuito excedido",
"ui.sessionTurn.error.addCredits": "Adicionar créditos",
+ "dialog.usageExceeded.freeTier.title": "Limite gratuito atingido",
+ "dialog.usageExceeded.freeTier.description": "Assine o OpenCode Go para ter acesso confiável aos melhores modelos open-source, a partir de $5/mês.",
+ "dialog.usageExceeded.freeTier.actionLabel": "Assinar",
+ "dialog.usageExceeded.accountRateLimit.title": "Limite do Go atingido",
+ "dialog.usageExceeded.accountRateLimit.description": "Limite de uso atingido. Para continuar usando este modelo agora, ative o uso a partir do seu saldo disponível",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "Abrir configurações",
+
"ui.sessionTurn.status.delegating": "Delegando trabalho",
"ui.sessionTurn.status.planning": "Planejando próximos passos",
"ui.sessionTurn.status.gatheringContext": "Explorando",
diff --git a/packages/ui/src/i18n/bs.ts b/packages/ui/src/i18n/bs.ts
index 3dc21b837d..9c3d239d6d 100644
--- a/packages/ui/src/i18n/bs.ts
+++ b/packages/ui/src/i18n/bs.ts
@@ -50,6 +50,13 @@ export const dict = {
"ui.sessionTurn.error.freeUsageExceeded": "Besplatna upotreba premašena",
"ui.sessionTurn.error.addCredits": "Dodaj kredite",
+ "dialog.usageExceeded.freeTier.title": "Dostignut besplatan limit",
+ "dialog.usageExceeded.freeTier.description": "Pretplatite se na OpenCode Go za pouzdan pristup najboljim open-source modelima, počevši od $5/mjesec.",
+ "dialog.usageExceeded.freeTier.actionLabel": "Pretplati se",
+ "dialog.usageExceeded.accountRateLimit.title": "Dostignut Go limit",
+ "dialog.usageExceeded.accountRateLimit.description": "Dostignut je limit korištenja. Da nastavite koristiti ovaj model sada, omogućite korištenje iz vašeg dostupnog stanja",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "Otvori postavke",
+
"ui.sessionTurn.status.delegating": "Delegiranje posla",
"ui.sessionTurn.status.planning": "Planiranje sljedećih koraka",
"ui.sessionTurn.status.gatheringContext": "Istraživanje",
diff --git a/packages/ui/src/i18n/da.ts b/packages/ui/src/i18n/da.ts
index 1d4f848c19..cc1b20631d 100644
--- a/packages/ui/src/i18n/da.ts
+++ b/packages/ui/src/i18n/da.ts
@@ -45,6 +45,13 @@ export const dict = {
"ui.sessionTurn.error.freeUsageExceeded": "Gratis forbrug overskredet",
"ui.sessionTurn.error.addCredits": "Tilføj kreditter",
+ "dialog.usageExceeded.freeTier.title": "Gratis grænse nået",
+ "dialog.usageExceeded.freeTier.description": "Abonnér på OpenCode Go for pålidelig adgang til de bedste open source-modeller, fra $5/måned.",
+ "dialog.usageExceeded.freeTier.actionLabel": "Abonnér",
+ "dialog.usageExceeded.accountRateLimit.title": "Go-grænse nået",
+ "dialog.usageExceeded.accountRateLimit.description": "Forbrugsgrænse nået. For at fortsætte med at bruge denne model nu, aktivér forbrug fra din tilgængelige saldo",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "Åbn indstillinger",
+
"ui.sessionTurn.status.delegating": "Delegerer arbejde",
"ui.sessionTurn.status.planning": "Planlægger næste trin",
"ui.sessionTurn.status.gatheringContext": "Udforsker",
diff --git a/packages/ui/src/i18n/de.ts b/packages/ui/src/i18n/de.ts
index dd841cd000..97929b2a3e 100644
--- a/packages/ui/src/i18n/de.ts
+++ b/packages/ui/src/i18n/de.ts
@@ -51,6 +51,13 @@ export const dict = {
"ui.sessionTurn.error.freeUsageExceeded": "Kostenloses Nutzungslimit überschritten",
"ui.sessionTurn.error.addCredits": "Guthaben aufladen",
+ "dialog.usageExceeded.freeTier.title": "Kostenloses Limit erreicht",
+ "dialog.usageExceeded.freeTier.description": "Abonniere OpenCode Go für zuverlässigen Zugriff auf die besten Open-Source-Modelle, ab $5/Monat.",
+ "dialog.usageExceeded.freeTier.actionLabel": "Abonnieren",
+ "dialog.usageExceeded.accountRateLimit.title": "Go-Limit erreicht",
+ "dialog.usageExceeded.accountRateLimit.description": "Nutzungslimit erreicht. Um dieses Modell jetzt weiter zu nutzen, aktiviere die Nutzung über dein verfügbares Guthaben",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "Einstellungen öffnen",
+
"ui.sessionTurn.status.delegating": "Arbeit delegieren",
"ui.sessionTurn.status.planning": "Nächste Schritte planen",
"ui.sessionTurn.status.gatheringContext": "Erkunden",
diff --git a/packages/ui/src/i18n/en.ts b/packages/ui/src/i18n/en.ts
index d0d25bad9f..cc067168cc 100644
--- a/packages/ui/src/i18n/en.ts
+++ b/packages/ui/src/i18n/en.ts
@@ -53,6 +53,13 @@ export const dict: Record = {
"ui.sessionTurn.error.freeUsageExceeded": "Free usage exceeded",
"ui.sessionTurn.error.addCredits": "Add credits",
+ "dialog.usageExceeded.freeTier.title": "Free limit reached",
+ "dialog.usageExceeded.freeTier.description": "Subscribe to OpenCode Go for reliable access to the best open-source models, starting at $5/month.",
+ "dialog.usageExceeded.freeTier.actionLabel": "Subscribe",
+ "dialog.usageExceeded.accountRateLimit.title": "Go limit reached",
+ "dialog.usageExceeded.accountRateLimit.description": "Usage limit reached. To continue using this model now, enable usage from your available balance",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "Open settings",
+
"ui.sessionTurn.status.delegating": "Delegating work",
"ui.sessionTurn.status.planning": "Planning next steps",
"ui.sessionTurn.status.gatheringContext": "Exploring",
diff --git a/packages/ui/src/i18n/es.ts b/packages/ui/src/i18n/es.ts
index 83d48b300d..ffd9759caf 100644
--- a/packages/ui/src/i18n/es.ts
+++ b/packages/ui/src/i18n/es.ts
@@ -46,6 +46,13 @@ export const dict = {
"ui.sessionTurn.error.freeUsageExceeded": "Límite de uso gratuito excedido",
"ui.sessionTurn.error.addCredits": "Añadir créditos",
+ "dialog.usageExceeded.freeTier.title": "Límite gratuito alcanzado",
+ "dialog.usageExceeded.freeTier.description": "Suscríbete a OpenCode Go para acceso fiable a los mejores modelos de código abierto, desde $5/mes.",
+ "dialog.usageExceeded.freeTier.actionLabel": "Suscribirse",
+ "dialog.usageExceeded.accountRateLimit.title": "Límite de Go alcanzado",
+ "dialog.usageExceeded.accountRateLimit.description": "Límite de uso alcanzado. Para seguir usando este modelo ahora, habilita el uso desde tu saldo disponible",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "Abrir configuración",
+
"ui.sessionTurn.status.delegating": "Delegando trabajo",
"ui.sessionTurn.status.planning": "Planificando siguientes pasos",
"ui.sessionTurn.status.gatheringContext": "Explorando",
diff --git a/packages/ui/src/i18n/fr.ts b/packages/ui/src/i18n/fr.ts
index 9a4da7e75d..4f6e66129a 100644
--- a/packages/ui/src/i18n/fr.ts
+++ b/packages/ui/src/i18n/fr.ts
@@ -46,6 +46,13 @@ export const dict = {
"ui.sessionTurn.error.freeUsageExceeded": "Limite d'utilisation gratuite dépassée",
"ui.sessionTurn.error.addCredits": "Ajouter des crédits",
+ "dialog.usageExceeded.freeTier.title": "Limite gratuite atteinte",
+ "dialog.usageExceeded.freeTier.description": "Abonnez-vous à OpenCode Go pour un accès fiable aux meilleurs modèles open source, à partir de $5/mois.",
+ "dialog.usageExceeded.freeTier.actionLabel": "S'abonner",
+ "dialog.usageExceeded.accountRateLimit.title": "Limite Go atteinte",
+ "dialog.usageExceeded.accountRateLimit.description": "Limite d'utilisation atteinte. Pour continuer à utiliser ce modèle maintenant, activez l'utilisation depuis votre solde disponible",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "Ouvrir les paramètres",
+
"ui.sessionTurn.status.delegating": "Délégation du travail",
"ui.sessionTurn.status.planning": "Planification des prochaines étapes",
"ui.sessionTurn.status.gatheringContext": "Exploration",
diff --git a/packages/ui/src/i18n/ja.ts b/packages/ui/src/i18n/ja.ts
index b6501c13e1..2f28d6f424 100644
--- a/packages/ui/src/i18n/ja.ts
+++ b/packages/ui/src/i18n/ja.ts
@@ -45,6 +45,13 @@ export const dict = {
"ui.sessionTurn.error.freeUsageExceeded": "無料使用制限に達しました",
"ui.sessionTurn.error.addCredits": "クレジットを追加",
+ "dialog.usageExceeded.freeTier.title": "無料制限に達しました",
+ "dialog.usageExceeded.freeTier.description": "OpenCode Go にサブスクライブして、最高のオープンソースモデルに安定してアクセスできます。月額 $5 から。",
+ "dialog.usageExceeded.freeTier.actionLabel": "サブスクライブ",
+ "dialog.usageExceeded.accountRateLimit.title": "Go の制限に達しました",
+ "dialog.usageExceeded.accountRateLimit.description": "使用制限に達しました。今すぐこのモデルを使い続けるには、利用可能な残高からの使用を有効にしてください",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "設定を開く",
+
"ui.sessionTurn.status.delegating": "作業を委任中",
"ui.sessionTurn.status.planning": "次のステップを計画中",
"ui.sessionTurn.status.gatheringContext": "探索中",
diff --git a/packages/ui/src/i18n/ko.ts b/packages/ui/src/i18n/ko.ts
index ba1c258264..fb50e0a2c6 100644
--- a/packages/ui/src/i18n/ko.ts
+++ b/packages/ui/src/i18n/ko.ts
@@ -46,6 +46,13 @@ export const dict = {
"ui.sessionTurn.error.freeUsageExceeded": "무료 사용량 초과",
"ui.sessionTurn.error.addCredits": "크레딧 추가",
+ "dialog.usageExceeded.freeTier.title": "무료 한도에 도달했습니다",
+ "dialog.usageExceeded.freeTier.description": "OpenCode Go를 구독하여 최고의 오픈 소스 모델에 안정적으로 액세스하세요. 월 $5부터 시작합니다.",
+ "dialog.usageExceeded.freeTier.actionLabel": "구독",
+ "dialog.usageExceeded.accountRateLimit.title": "Go 한도에 도달했습니다",
+ "dialog.usageExceeded.accountRateLimit.description": "사용량 한도에 도달했습니다. 지금 이 모델을 계속 사용하려면 사용 가능한 잔액에서 사용을 활성화하세요",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "설정 열기",
+
"ui.sessionTurn.status.delegating": "작업 위임 중",
"ui.sessionTurn.status.planning": "다음 단계 계획 중",
"ui.sessionTurn.status.gatheringContext": "탐색 중",
diff --git a/packages/ui/src/i18n/no.ts b/packages/ui/src/i18n/no.ts
index 91c424e74d..39fc811d48 100644
--- a/packages/ui/src/i18n/no.ts
+++ b/packages/ui/src/i18n/no.ts
@@ -49,6 +49,13 @@ export const dict: Record = {
"ui.sessionTurn.error.freeUsageExceeded": "Gratis bruk overskredet",
"ui.sessionTurn.error.addCredits": "Legg til kreditt",
+ "dialog.usageExceeded.freeTier.title": "Gratis grense nådd",
+ "dialog.usageExceeded.freeTier.description": "Abonner på OpenCode Go for pålitelig tilgang til de beste åpen kildekode-modellene, fra $5/måned.",
+ "dialog.usageExceeded.freeTier.actionLabel": "Abonner",
+ "dialog.usageExceeded.accountRateLimit.title": "Go-grense nådd",
+ "dialog.usageExceeded.accountRateLimit.description": "Bruksgrense nådd. For å fortsette å bruke denne modellen nå, aktiver bruk fra din tilgjengelige saldo",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "Åpne innstillinger",
+
"ui.sessionTurn.status.delegating": "Delegerer arbeid",
"ui.sessionTurn.status.planning": "Planlegger neste trinn",
"ui.sessionTurn.status.gatheringContext": "Utforsker",
diff --git a/packages/ui/src/i18n/pl.ts b/packages/ui/src/i18n/pl.ts
index aeba784e54..9459058c05 100644
--- a/packages/ui/src/i18n/pl.ts
+++ b/packages/ui/src/i18n/pl.ts
@@ -45,6 +45,13 @@ export const dict = {
"ui.sessionTurn.error.freeUsageExceeded": "Przekroczono limit darmowego użytkowania",
"ui.sessionTurn.error.addCredits": "Dodaj kredyty",
+ "dialog.usageExceeded.freeTier.title": "Osiągnięto limit darmowy",
+ "dialog.usageExceeded.freeTier.description": "Subskrybuj OpenCode Go, aby uzyskać niezawodny dostęp do najlepszych modeli open source, od $5/miesiąc.",
+ "dialog.usageExceeded.freeTier.actionLabel": "Subskrybuj",
+ "dialog.usageExceeded.accountRateLimit.title": "Osiągnięto limit Go",
+ "dialog.usageExceeded.accountRateLimit.description": "Osiągnięto limit użycia. Aby kontynuować korzystanie z tego modelu teraz, włącz użycie z dostępnego salda",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "Otwórz ustawienia",
+
"ui.sessionTurn.status.delegating": "Delegowanie pracy",
"ui.sessionTurn.status.planning": "Planowanie kolejnych kroków",
"ui.sessionTurn.status.gatheringContext": "Eksplorowanie",
diff --git a/packages/ui/src/i18n/ru.ts b/packages/ui/src/i18n/ru.ts
index c97c76dd76..56d73a94b0 100644
--- a/packages/ui/src/i18n/ru.ts
+++ b/packages/ui/src/i18n/ru.ts
@@ -45,6 +45,13 @@ export const dict = {
"ui.sessionTurn.error.freeUsageExceeded": "Лимит бесплатного использования превышен",
"ui.sessionTurn.error.addCredits": "Добавить кредиты",
+ "dialog.usageExceeded.freeTier.title": "Достигнут бесплатный лимит",
+ "dialog.usageExceeded.freeTier.description": "Подпишитесь на OpenCode Go для надёжного доступа к лучшим моделям с открытым исходным кодом, от $5/месяц.",
+ "dialog.usageExceeded.freeTier.actionLabel": "Подписаться",
+ "dialog.usageExceeded.accountRateLimit.title": "Достигнут лимит Go",
+ "dialog.usageExceeded.accountRateLimit.description": "Достигнут лимит использования. Чтобы продолжить использовать эту модель сейчас, включите использование из доступного баланса",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "Открыть настройки",
+
"ui.sessionTurn.status.delegating": "Делегирование работы",
"ui.sessionTurn.status.planning": "Планирование следующих шагов",
"ui.sessionTurn.status.gatheringContext": "Исследование",
diff --git a/packages/ui/src/i18n/th.ts b/packages/ui/src/i18n/th.ts
index 775a583027..73f80a20aa 100644
--- a/packages/ui/src/i18n/th.ts
+++ b/packages/ui/src/i18n/th.ts
@@ -47,6 +47,13 @@ export const dict = {
"ui.sessionTurn.error.freeUsageExceeded": "เกินขีดจำกัดการใช้งานฟรี",
"ui.sessionTurn.error.addCredits": "เพิ่มเครดิต",
+ "dialog.usageExceeded.freeTier.title": "ถึงขีดจำกัดฟรีแล้ว",
+ "dialog.usageExceeded.freeTier.description": "สมัครสมาชิก OpenCode Go เพื่อการเข้าถึงโมเดลโอเพนซอร์สที่ดีที่สุดอย่างเชื่อถือได้ เริ่มต้นที่ $5/เดือน",
+ "dialog.usageExceeded.freeTier.actionLabel": "สมัครสมาชิก",
+ "dialog.usageExceeded.accountRateLimit.title": "ถึงขีดจำกัดของ Go แล้ว",
+ "dialog.usageExceeded.accountRateLimit.description": "ถึงขีดจำกัดการใช้งานแล้ว หากต้องการใช้โมเดลนี้ต่อในตอนนี้ ให้เปิดใช้งานจากยอดคงเหลือที่มี",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "เปิดการตั้งค่า",
+
"ui.sessionTurn.status.delegating": "มอบหมายงาน",
"ui.sessionTurn.status.planning": "วางแผนขั้นตอนถัดไป",
"ui.sessionTurn.status.gatheringContext": "กำลังสำรวจ",
diff --git a/packages/ui/src/i18n/tr.ts b/packages/ui/src/i18n/tr.ts
index faad574d85..5af1f21594 100644
--- a/packages/ui/src/i18n/tr.ts
+++ b/packages/ui/src/i18n/tr.ts
@@ -52,6 +52,13 @@ export const dict = {
"ui.sessionTurn.error.freeUsageExceeded": "Ücretsiz kullanım aşıldı",
"ui.sessionTurn.error.addCredits": "Kredi ekle",
+ "dialog.usageExceeded.freeTier.title": "Ücretsiz sınıra ulaşıldı",
+ "dialog.usageExceeded.freeTier.description": "En iyi açık kaynak modellere güvenilir erişim için OpenCode Go'ya abone olun. Aylık $5'tan başlar.",
+ "dialog.usageExceeded.freeTier.actionLabel": "Abone ol",
+ "dialog.usageExceeded.accountRateLimit.title": "Go sınırına ulaşıldı",
+ "dialog.usageExceeded.accountRateLimit.description": "Kullanım sınırına ulaşıldı. Bu modeli şimdi kullanmaya devam etmek için mevcut bakiyenizden kullanımı etkinleştirin",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "Ayarları aç",
+
"ui.sessionTurn.status.delegating": "Görev devrediliyor",
"ui.sessionTurn.status.planning": "Sonraki adımlar planlanıyor",
"ui.sessionTurn.status.gatheringContext": "Keşfediliyor",
diff --git a/packages/ui/src/i18n/zh.ts b/packages/ui/src/i18n/zh.ts
index b31b18e3d3..14b4ca069e 100644
--- a/packages/ui/src/i18n/zh.ts
+++ b/packages/ui/src/i18n/zh.ts
@@ -50,6 +50,13 @@ export const dict = {
"ui.sessionTurn.error.freeUsageExceeded": "免费使用额度已用完",
"ui.sessionTurn.error.addCredits": "添加积分",
+ "dialog.usageExceeded.freeTier.title": "免费额度已用完",
+ "dialog.usageExceeded.freeTier.description": "订阅 OpenCode Go,可靠地使用最佳开源模型,每月 $5 起。",
+ "dialog.usageExceeded.freeTier.actionLabel": "订阅",
+ "dialog.usageExceeded.accountRateLimit.title": "Go 额度已用完",
+ "dialog.usageExceeded.accountRateLimit.description": "使用额度已达上限。如需现在继续使用此模型,请从可用余额中启用使用",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "打开设置",
+
"ui.sessionTurn.status.delegating": "正在委派工作",
"ui.sessionTurn.status.planning": "正在规划下一步",
"ui.sessionTurn.status.gatheringContext": "正在探索",
diff --git a/packages/ui/src/i18n/zht.ts b/packages/ui/src/i18n/zht.ts
index 75add8ce33..e17ddfe705 100644
--- a/packages/ui/src/i18n/zht.ts
+++ b/packages/ui/src/i18n/zht.ts
@@ -50,6 +50,13 @@ export const dict = {
"ui.sessionTurn.error.freeUsageExceeded": "免費使用額度已用完",
"ui.sessionTurn.error.addCredits": "新增點數",
+ "dialog.usageExceeded.freeTier.title": "已達免費額度上限",
+ "dialog.usageExceeded.freeTier.description": "訂閱 OpenCode Go,可靠地使用最佳開源模型,每月 $5 起。",
+ "dialog.usageExceeded.freeTier.actionLabel": "訂閱",
+ "dialog.usageExceeded.accountRateLimit.title": "已達 Go 額度上限",
+ "dialog.usageExceeded.accountRateLimit.description": "已達使用額度上限。若要現在繼續使用此模型,請從可用餘額中啟用使用",
+ "dialog.usageExceeded.accountRateLimit.actionLabel": "開啟設定",
+
"ui.sessionTurn.status.delegating": "正在委派工作",
"ui.sessionTurn.status.planning": "正在規劃下一步",
"ui.sessionTurn.status.gatheringContext": "正在探索",