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": "正在探索",