feat(quota): add OpenCode Go usage tracking (#2155)
* feat(quota): add OpenCode Go usage tracking * fix(quota): align OpenCode Go VS Code parsing
This commit is contained in:
committed by
GitHub
parent
b4f50e0a01
commit
3d90eddcaf
@@ -0,0 +1,110 @@
|
||||
import React from 'react';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { Input } from '@/components/ui/input';
|
||||
import { toast } from '@/components/ui';
|
||||
import { useI18n } from '@/lib/i18n';
|
||||
import { runtimeFetch } from '@/lib/runtime-fetch';
|
||||
|
||||
interface CredentialStatus {
|
||||
configured: boolean;
|
||||
workspaceId?: string;
|
||||
authCookieMasked?: string;
|
||||
}
|
||||
|
||||
export const OpenCodeGoCredentials: React.FC = () => {
|
||||
const { t } = useI18n();
|
||||
const [status, setStatus] = React.useState<CredentialStatus | null>(null);
|
||||
const [workspaceId, setWorkspaceId] = React.useState('');
|
||||
const [authCookie, setAuthCookie] = React.useState('');
|
||||
const [busy, setBusy] = React.useState<'save' | 'validate' | 'delete' | null>(null);
|
||||
const workspaceInputRef = React.useRef<HTMLInputElement>(null);
|
||||
const cookieInputRef = React.useRef<HTMLInputElement>(null);
|
||||
|
||||
React.useEffect(() => {
|
||||
const loadStatus = async () => {
|
||||
try {
|
||||
const response = await runtimeFetch('/api/quota/credentials/opencode-go');
|
||||
if (!response.ok) throw new Error('load failed');
|
||||
const next = await response.json() as CredentialStatus;
|
||||
setStatus(next);
|
||||
setWorkspaceId(next.workspaceId ?? '');
|
||||
} catch {
|
||||
setStatus({ configured: false });
|
||||
}
|
||||
};
|
||||
void loadStatus();
|
||||
}, []);
|
||||
|
||||
const save = async () => {
|
||||
const submittedWorkspaceId = workspaceInputRef.current?.value.trim() ?? workspaceId.trim();
|
||||
const submittedAuthCookie = cookieInputRef.current?.value.trim() ?? authCookie.trim();
|
||||
setBusy('save');
|
||||
try {
|
||||
const response = await runtimeFetch('/api/quota/credentials/opencode-go', {
|
||||
method: 'PUT',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ workspaceId: submittedWorkspaceId, authCookie: submittedAuthCookie }),
|
||||
});
|
||||
const payload = await response.json().catch(() => null);
|
||||
if (!response.ok) throw new Error(payload?.error);
|
||||
setStatus(payload);
|
||||
setAuthCookie('');
|
||||
toast.success(t('settings.providers.page.openCodeGo.saved'));
|
||||
} catch (error) {
|
||||
const message = error instanceof Error ? error.message : '';
|
||||
toast.error(message || t('settings.providers.page.openCodeGo.saveFailed'));
|
||||
} finally { setBusy(null); }
|
||||
};
|
||||
|
||||
const validate = async () => {
|
||||
setBusy('validate');
|
||||
try {
|
||||
const response = await runtimeFetch('/api/quota/credentials/opencode-go/validate', { method: 'POST' });
|
||||
const payload = await response.json().catch(() => null);
|
||||
if (!response.ok) throw new Error(payload?.error || t('settings.providers.page.openCodeGo.invalid'));
|
||||
toast.success(t('settings.providers.page.openCodeGo.valid'));
|
||||
} catch (error) {
|
||||
const message = error instanceof Error ? error.message : '';
|
||||
toast.error(message || t('settings.providers.page.openCodeGo.invalid'));
|
||||
} finally { setBusy(null); }
|
||||
};
|
||||
|
||||
const remove = async () => {
|
||||
setBusy('delete');
|
||||
try {
|
||||
const response = await runtimeFetch('/api/quota/credentials/opencode-go', { method: 'DELETE' });
|
||||
if (!response.ok) throw new Error('delete failed');
|
||||
setStatus({ configured: false });
|
||||
setWorkspaceId('');
|
||||
setAuthCookie('');
|
||||
toast.success(t('settings.providers.page.openCodeGo.deleted'));
|
||||
} catch {
|
||||
toast.error(t('settings.providers.page.openCodeGo.deleteFailed'));
|
||||
} finally { setBusy(null); }
|
||||
};
|
||||
|
||||
return (
|
||||
<div data-settings-item="providers.opencode-go-credentials" className="mb-8">
|
||||
<div className="mb-1 px-1">
|
||||
<h3 className="typography-ui-header font-medium text-foreground">{t('settings.providers.page.openCodeGo.title')}</h3>
|
||||
<p className="typography-meta text-muted-foreground">{t('settings.providers.page.openCodeGo.description')}</p>
|
||||
</div>
|
||||
<section className="space-y-3 px-2 pb-2 pt-0">
|
||||
<label className="block typography-ui-label text-foreground">
|
||||
{t('settings.providers.page.openCodeGo.workspaceId')}
|
||||
<Input ref={workspaceInputRef} className="mt-1 h-7 font-mono text-xs" value={workspaceId} onChange={(event) => setWorkspaceId(event.target.value)} placeholder="wrk_..." />
|
||||
</label>
|
||||
<label className="block typography-ui-label text-foreground">
|
||||
{t('settings.providers.page.openCodeGo.authCookie')}
|
||||
<Input ref={cookieInputRef} className="mt-1 h-7 font-mono text-xs" type="password" autoComplete="off" value={authCookie} onChange={(event) => setAuthCookie(event.target.value)} placeholder={status?.authCookieMasked ?? 'auth=...'} />
|
||||
</label>
|
||||
<p className="typography-meta text-muted-foreground">{t('settings.providers.page.openCodeGo.help')}</p>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
<Button size="xs" onClick={save} disabled={Boolean(busy)}>{status?.configured ? t('settings.providers.page.openCodeGo.replace') : t('settings.providers.page.openCodeGo.save')}</Button>
|
||||
{status?.configured && <Button variant="outline" size="xs" onClick={validate} disabled={Boolean(busy)}>{t('settings.providers.page.openCodeGo.validate')}</Button>}
|
||||
{status?.configured && <Button variant="destructive" size="xs" onClick={remove} disabled={Boolean(busy)}>{t('settings.providers.page.openCodeGo.delete')}</Button>}
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -24,6 +24,7 @@ import { getCurrentIntlLocale, useI18n } from '@/lib/i18n';
|
||||
import { runtimeFetch } from '@/lib/runtime-fetch';
|
||||
import { opencodeClient } from '@/lib/opencode/client';
|
||||
import { shouldLoadAvailableProviders } from './providerAvailability';
|
||||
import { OpenCodeGoCredentials } from './OpenCodeGoCredentials';
|
||||
|
||||
const formatCompactNumber = (value: number) => new Intl.NumberFormat(getCurrentIntlLocale(), {
|
||||
notation: 'compact',
|
||||
@@ -946,6 +947,8 @@ export const ProvidersPage: React.FC = () => {
|
||||
</section>
|
||||
</div>
|
||||
|
||||
{(selectedProvider.id === 'opencode' || selectedProvider.id === 'opencode-go') && <OpenCodeGoCredentials />}
|
||||
|
||||
{/* Connection Details */}
|
||||
<div data-settings-item="providers.connection-details" className="mb-8">
|
||||
<div className="mb-1 px-1">
|
||||
|
||||
@@ -1,4 +1,19 @@
|
||||
export const settingsDict = {
|
||||
'settings.providers.page.openCodeGo.title': 'OpenCode Go usage tracking',
|
||||
'settings.providers.page.openCodeGo.description': 'Connect the OpenCode Go dashboard to show rolling, weekly, and monthly quota.',
|
||||
'settings.providers.page.openCodeGo.workspaceId': 'Workspace ID',
|
||||
'settings.providers.page.openCodeGo.authCookie': 'Auth cookie',
|
||||
'settings.providers.page.openCodeGo.help': 'Copy the workspace ID from the dashboard URL and the auth cookie from your browser developer tools. OpenChamber never scans browser cookie storage.',
|
||||
'settings.providers.page.openCodeGo.save': 'Save and validate',
|
||||
'settings.providers.page.openCodeGo.replace': 'Replace',
|
||||
'settings.providers.page.openCodeGo.validate': 'Validate',
|
||||
'settings.providers.page.openCodeGo.delete': 'Delete',
|
||||
'settings.providers.page.openCodeGo.saved': 'OpenCode Go credentials saved.',
|
||||
'settings.providers.page.openCodeGo.saveFailed': 'Could not validate OpenCode Go credentials.',
|
||||
'settings.providers.page.openCodeGo.valid': 'OpenCode Go credentials are valid.',
|
||||
'settings.providers.page.openCodeGo.invalid': 'OpenCode Go credentials are invalid or expired.',
|
||||
'settings.providers.page.openCodeGo.deleted': 'OpenCode Go credentials deleted.',
|
||||
'settings.providers.page.openCodeGo.deleteFailed': 'Could not delete OpenCode Go credentials.',
|
||||
'settings.appearance.language.label': 'Language',
|
||||
'settings.appearance.language.description': 'Choose the interface language.',
|
||||
'settings.appearance.language.select': 'Select language',
|
||||
|
||||
@@ -1,4 +1,19 @@
|
||||
export const settingsDict = {
|
||||
'settings.providers.page.openCodeGo.title': 'Seguimiento de uso de OpenCode Go',
|
||||
'settings.providers.page.openCodeGo.description': 'Conecta el panel de OpenCode Go para ver las cuotas móvil, semanal y mensual.',
|
||||
'settings.providers.page.openCodeGo.workspaceId': 'ID del espacio de trabajo',
|
||||
'settings.providers.page.openCodeGo.authCookie': 'Cookie de autenticación',
|
||||
'settings.providers.page.openCodeGo.help': 'Copia el ID desde la URL del panel y la cookie auth desde las herramientas del navegador. OpenChamber nunca examina las cookies del navegador.',
|
||||
'settings.providers.page.openCodeGo.save': 'Guardar y validar',
|
||||
'settings.providers.page.openCodeGo.replace': 'Reemplazar',
|
||||
'settings.providers.page.openCodeGo.validate': 'Validar',
|
||||
'settings.providers.page.openCodeGo.delete': 'Eliminar',
|
||||
'settings.providers.page.openCodeGo.saved': 'Credenciales de OpenCode Go guardadas.',
|
||||
'settings.providers.page.openCodeGo.saveFailed': 'No se pudieron validar las credenciales de OpenCode Go.',
|
||||
'settings.providers.page.openCodeGo.valid': 'Las credenciales de OpenCode Go son válidas.',
|
||||
'settings.providers.page.openCodeGo.invalid': 'Las credenciales de OpenCode Go no son válidas o han caducado.',
|
||||
'settings.providers.page.openCodeGo.deleted': 'Credenciales de OpenCode Go eliminadas.',
|
||||
'settings.providers.page.openCodeGo.deleteFailed': 'No se pudieron eliminar las credenciales de OpenCode Go.',
|
||||
"settings.appearance.language.label": "Idioma",
|
||||
"settings.appearance.language.description": "Elige el idioma de la interfaz.",
|
||||
"settings.appearance.language.select": "Seleccionar idioma",
|
||||
|
||||
@@ -1,4 +1,19 @@
|
||||
export const settingsDict = {
|
||||
'settings.providers.page.openCodeGo.title': 'Suivi de l’utilisation d’OpenCode Go',
|
||||
'settings.providers.page.openCodeGo.description': 'Connectez le tableau de bord OpenCode Go pour afficher les quotas glissant, hebdomadaire et mensuel.',
|
||||
'settings.providers.page.openCodeGo.workspaceId': 'ID de l’espace de travail',
|
||||
'settings.providers.page.openCodeGo.authCookie': 'Cookie d’authentification',
|
||||
'settings.providers.page.openCodeGo.help': 'Copiez l’ID depuis l’URL du tableau de bord et le cookie auth depuis les outils du navigateur. OpenChamber n’analyse jamais les cookies du navigateur.',
|
||||
'settings.providers.page.openCodeGo.save': 'Enregistrer et valider',
|
||||
'settings.providers.page.openCodeGo.replace': 'Remplacer',
|
||||
'settings.providers.page.openCodeGo.validate': 'Valider',
|
||||
'settings.providers.page.openCodeGo.delete': 'Supprimer',
|
||||
'settings.providers.page.openCodeGo.saved': 'Identifiants OpenCode Go enregistrés.',
|
||||
'settings.providers.page.openCodeGo.saveFailed': 'Impossible de valider les identifiants OpenCode Go.',
|
||||
'settings.providers.page.openCodeGo.valid': 'Les identifiants OpenCode Go sont valides.',
|
||||
'settings.providers.page.openCodeGo.invalid': 'Les identifiants OpenCode Go sont invalides ou expirés.',
|
||||
'settings.providers.page.openCodeGo.deleted': 'Identifiants OpenCode Go supprimés.',
|
||||
'settings.providers.page.openCodeGo.deleteFailed': 'Impossible de supprimer les identifiants OpenCode Go.',
|
||||
'settings.appearance.language.label': 'Langue',
|
||||
'settings.appearance.language.description': 'Choisissez la langue de l\'interface.',
|
||||
'settings.appearance.language.select': 'Sélectionnez la langue',
|
||||
|
||||
@@ -1,4 +1,19 @@
|
||||
export const settingsDict = {
|
||||
'settings.providers.page.openCodeGo.title': 'OpenCode Go 使用量追跡',
|
||||
'settings.providers.page.openCodeGo.description': 'OpenCode Go ダッシュボードを接続して、ローリング、週間、月間のクォータを表示します。',
|
||||
'settings.providers.page.openCodeGo.workspaceId': 'ワークスペース ID',
|
||||
'settings.providers.page.openCodeGo.authCookie': '認証 Cookie',
|
||||
'settings.providers.page.openCodeGo.help': 'ダッシュボード URL からワークスペース ID を、ブラウザーの開発者ツールから auth Cookie をコピーしてください。OpenChamber がブラウザーの Cookie を走査することはありません。',
|
||||
'settings.providers.page.openCodeGo.save': '保存して検証',
|
||||
'settings.providers.page.openCodeGo.replace': '置換',
|
||||
'settings.providers.page.openCodeGo.validate': '検証',
|
||||
'settings.providers.page.openCodeGo.delete': '削除',
|
||||
'settings.providers.page.openCodeGo.saved': 'OpenCode Go の認証情報を保存しました。',
|
||||
'settings.providers.page.openCodeGo.saveFailed': 'OpenCode Go の認証情報を検証できませんでした。',
|
||||
'settings.providers.page.openCodeGo.valid': 'OpenCode Go の認証情報は有効です。',
|
||||
'settings.providers.page.openCodeGo.invalid': 'OpenCode Go の認証情報が無効または期限切れです。',
|
||||
'settings.providers.page.openCodeGo.deleted': 'OpenCode Go の認証情報を削除しました。',
|
||||
'settings.providers.page.openCodeGo.deleteFailed': 'OpenCode Go の認証情報を削除できませんでした。',
|
||||
'settings.appearance.language.label': '言語',
|
||||
'settings.appearance.language.description': 'インターフェース言語を選択します。',
|
||||
'settings.appearance.language.select': '言語を選択',
|
||||
|
||||
@@ -1,4 +1,19 @@
|
||||
export const settingsDict = {
|
||||
'settings.providers.page.openCodeGo.title': 'OpenCode Go 사용량 추적',
|
||||
'settings.providers.page.openCodeGo.description': 'OpenCode Go 대시보드를 연결하여 롤링, 주간 및 월간 할당량을 표시합니다.',
|
||||
'settings.providers.page.openCodeGo.workspaceId': '워크스페이스 ID',
|
||||
'settings.providers.page.openCodeGo.authCookie': '인증 쿠키',
|
||||
'settings.providers.page.openCodeGo.help': '대시보드 URL에서 워크스페이스 ID를, 브라우저 개발자 도구에서 auth 쿠키를 복사하세요. OpenChamber는 브라우저 쿠키 저장소를 검색하지 않습니다.',
|
||||
'settings.providers.page.openCodeGo.save': '저장 및 검증',
|
||||
'settings.providers.page.openCodeGo.replace': '교체',
|
||||
'settings.providers.page.openCodeGo.validate': '검증',
|
||||
'settings.providers.page.openCodeGo.delete': '삭제',
|
||||
'settings.providers.page.openCodeGo.saved': 'OpenCode Go 인증 정보를 저장했습니다.',
|
||||
'settings.providers.page.openCodeGo.saveFailed': 'OpenCode Go 인증 정보를 검증할 수 없습니다.',
|
||||
'settings.providers.page.openCodeGo.valid': 'OpenCode Go 인증 정보가 유효합니다.',
|
||||
'settings.providers.page.openCodeGo.invalid': 'OpenCode Go 인증 정보가 유효하지 않거나 만료되었습니다.',
|
||||
'settings.providers.page.openCodeGo.deleted': 'OpenCode Go 인증 정보를 삭제했습니다.',
|
||||
'settings.providers.page.openCodeGo.deleteFailed': 'OpenCode Go 인증 정보를 삭제할 수 없습니다.',
|
||||
'settings.appearance.language.label': '언어',
|
||||
'settings.appearance.language.description': '인터페이스 언어를 선택하세요.',
|
||||
'settings.appearance.language.select': '언어 선택',
|
||||
|
||||
@@ -1,4 +1,19 @@
|
||||
export const settingsDict = {
|
||||
'settings.providers.page.openCodeGo.title': 'Śledzenie użycia OpenCode Go',
|
||||
'settings.providers.page.openCodeGo.description': 'Połącz panel OpenCode Go, aby wyświetlać limity kroczące, tygodniowe i miesięczne.',
|
||||
'settings.providers.page.openCodeGo.workspaceId': 'ID przestrzeni roboczej',
|
||||
'settings.providers.page.openCodeGo.authCookie': 'Plik cookie uwierzytelniania',
|
||||
'settings.providers.page.openCodeGo.help': 'Skopiuj ID z adresu panelu i cookie auth z narzędzi deweloperskich przeglądarki. OpenChamber nigdy nie skanuje plików cookie przeglądarki.',
|
||||
'settings.providers.page.openCodeGo.save': 'Zapisz i sprawdź',
|
||||
'settings.providers.page.openCodeGo.replace': 'Zastąp',
|
||||
'settings.providers.page.openCodeGo.validate': 'Sprawdź',
|
||||
'settings.providers.page.openCodeGo.delete': 'Usuń',
|
||||
'settings.providers.page.openCodeGo.saved': 'Dane OpenCode Go zostały zapisane.',
|
||||
'settings.providers.page.openCodeGo.saveFailed': 'Nie udało się sprawdzić danych OpenCode Go.',
|
||||
'settings.providers.page.openCodeGo.valid': 'Dane OpenCode Go są prawidłowe.',
|
||||
'settings.providers.page.openCodeGo.invalid': 'Dane OpenCode Go są nieprawidłowe lub wygasły.',
|
||||
'settings.providers.page.openCodeGo.deleted': 'Dane OpenCode Go zostały usunięte.',
|
||||
'settings.providers.page.openCodeGo.deleteFailed': 'Nie udało się usunąć danych OpenCode Go.',
|
||||
'settings.appearance.language.label': 'Język',
|
||||
'settings.appearance.language.description': 'Wybierz język interfejsu.',
|
||||
'settings.agents.modelSelector.actions.addToFavorites': 'Dodaj do ulubionych',
|
||||
|
||||
@@ -1,4 +1,19 @@
|
||||
export const settingsDict = {
|
||||
'settings.providers.page.openCodeGo.title': 'Monitoramento de uso do OpenCode Go',
|
||||
'settings.providers.page.openCodeGo.description': 'Conecte o painel do OpenCode Go para exibir as cotas móvel, semanal e mensal.',
|
||||
'settings.providers.page.openCodeGo.workspaceId': 'ID do workspace',
|
||||
'settings.providers.page.openCodeGo.authCookie': 'Cookie de autenticação',
|
||||
'settings.providers.page.openCodeGo.help': 'Copie o ID da URL do painel e o cookie auth das ferramentas do navegador. O OpenChamber nunca examina os cookies do navegador.',
|
||||
'settings.providers.page.openCodeGo.save': 'Salvar e validar',
|
||||
'settings.providers.page.openCodeGo.replace': 'Substituir',
|
||||
'settings.providers.page.openCodeGo.validate': 'Validar',
|
||||
'settings.providers.page.openCodeGo.delete': 'Excluir',
|
||||
'settings.providers.page.openCodeGo.saved': 'Credenciais do OpenCode Go salvas.',
|
||||
'settings.providers.page.openCodeGo.saveFailed': 'Não foi possível validar as credenciais do OpenCode Go.',
|
||||
'settings.providers.page.openCodeGo.valid': 'As credenciais do OpenCode Go são válidas.',
|
||||
'settings.providers.page.openCodeGo.invalid': 'As credenciais do OpenCode Go são inválidas ou expiraram.',
|
||||
'settings.providers.page.openCodeGo.deleted': 'Credenciais do OpenCode Go excluídas.',
|
||||
'settings.providers.page.openCodeGo.deleteFailed': 'Não foi possível excluir as credenciais do OpenCode Go.',
|
||||
"settings.appearance.language.label": "Idioma",
|
||||
"settings.appearance.language.description": "Escolha o idioma da interface.",
|
||||
"settings.appearance.language.select": "Selecionar idioma",
|
||||
|
||||
@@ -1,4 +1,19 @@
|
||||
export const settingsDict = {
|
||||
'settings.providers.page.openCodeGo.title': 'Відстеження використання OpenCode Go',
|
||||
'settings.providers.page.openCodeGo.description': 'Підключіть панель OpenCode Go, щоб бачити ковзну, тижневу та місячну квоту.',
|
||||
'settings.providers.page.openCodeGo.workspaceId': 'ID робочого простору',
|
||||
'settings.providers.page.openCodeGo.authCookie': 'Cookie авторизації',
|
||||
'settings.providers.page.openCodeGo.help': 'Скопіюйте ID робочого простору з URL панелі, а cookie auth з інструментів розробника браузера. OpenChamber ніколи не сканує сховище cookie браузера.',
|
||||
'settings.providers.page.openCodeGo.save': 'Зберегти й перевірити',
|
||||
'settings.providers.page.openCodeGo.replace': 'Замінити',
|
||||
'settings.providers.page.openCodeGo.validate': 'Перевірити',
|
||||
'settings.providers.page.openCodeGo.delete': 'Видалити',
|
||||
'settings.providers.page.openCodeGo.saved': 'Дані OpenCode Go збережено.',
|
||||
'settings.providers.page.openCodeGo.saveFailed': 'Не вдалося перевірити дані OpenCode Go.',
|
||||
'settings.providers.page.openCodeGo.valid': 'Дані OpenCode Go дійсні.',
|
||||
'settings.providers.page.openCodeGo.invalid': 'Дані OpenCode Go недійсні або протерміновані.',
|
||||
'settings.providers.page.openCodeGo.deleted': 'Дані OpenCode Go видалено.',
|
||||
'settings.providers.page.openCodeGo.deleteFailed': 'Не вдалося видалити дані OpenCode Go.',
|
||||
"settings.appearance.language.label": "Мова",
|
||||
"settings.appearance.language.description": "Виберіть мову інтерфейсу.",
|
||||
"settings.appearance.language.select": "Виберіть мову",
|
||||
|
||||
@@ -1,4 +1,19 @@
|
||||
export const settingsDict = {
|
||||
'settings.providers.page.openCodeGo.title': 'OpenCode Go 用量跟踪',
|
||||
'settings.providers.page.openCodeGo.description': '连接 OpenCode Go 控制面板以显示滚动、每周和每月配额。',
|
||||
'settings.providers.page.openCodeGo.workspaceId': '工作区 ID',
|
||||
'settings.providers.page.openCodeGo.authCookie': '身份验证 Cookie',
|
||||
'settings.providers.page.openCodeGo.help': '从控制面板网址复制工作区 ID,并从浏览器开发者工具复制 auth Cookie。OpenChamber 绝不会扫描浏览器 Cookie 存储。',
|
||||
'settings.providers.page.openCodeGo.save': '保存并验证',
|
||||
'settings.providers.page.openCodeGo.replace': '替换',
|
||||
'settings.providers.page.openCodeGo.validate': '验证',
|
||||
'settings.providers.page.openCodeGo.delete': '删除',
|
||||
'settings.providers.page.openCodeGo.saved': '已保存 OpenCode Go 凭据。',
|
||||
'settings.providers.page.openCodeGo.saveFailed': '无法验证 OpenCode Go 凭据。',
|
||||
'settings.providers.page.openCodeGo.valid': 'OpenCode Go 凭据有效。',
|
||||
'settings.providers.page.openCodeGo.invalid': 'OpenCode Go 凭据无效或已过期。',
|
||||
'settings.providers.page.openCodeGo.deleted': '已删除 OpenCode Go 凭据。',
|
||||
'settings.providers.page.openCodeGo.deleteFailed': '无法删除 OpenCode Go 凭据。',
|
||||
'settings.appearance.language.label': '语言',
|
||||
'settings.appearance.language.description': '选择界面语言。',
|
||||
'settings.appearance.language.select': '选择语言',
|
||||
|
||||
@@ -1,4 +1,19 @@
|
||||
export const settingsDict = {
|
||||
'settings.providers.page.openCodeGo.title': 'OpenCode Go 用量追蹤',
|
||||
'settings.providers.page.openCodeGo.description': '連接 OpenCode Go 控制面板以顯示滾動、每週和每月配額。',
|
||||
'settings.providers.page.openCodeGo.workspaceId': '工作區 ID',
|
||||
'settings.providers.page.openCodeGo.authCookie': '驗證 Cookie',
|
||||
'settings.providers.page.openCodeGo.help': '從控制面板網址複製工作區 ID,並從瀏覽器開發者工具複製 auth Cookie。OpenChamber 絕不會掃描瀏覽器 Cookie 儲存空間。',
|
||||
'settings.providers.page.openCodeGo.save': '儲存並驗證',
|
||||
'settings.providers.page.openCodeGo.replace': '取代',
|
||||
'settings.providers.page.openCodeGo.validate': '驗證',
|
||||
'settings.providers.page.openCodeGo.delete': '刪除',
|
||||
'settings.providers.page.openCodeGo.saved': '已儲存 OpenCode Go 憑證。',
|
||||
'settings.providers.page.openCodeGo.saveFailed': '無法驗證 OpenCode Go 憑證。',
|
||||
'settings.providers.page.openCodeGo.valid': 'OpenCode Go 憑證有效。',
|
||||
'settings.providers.page.openCodeGo.invalid': 'OpenCode Go 憑證無效或已過期。',
|
||||
'settings.providers.page.openCodeGo.deleted': '已刪除 OpenCode Go 憑證。',
|
||||
'settings.providers.page.openCodeGo.deleteFailed': '無法刪除 OpenCode Go 憑證。',
|
||||
'settings.appearance.language.label': '語言',
|
||||
'settings.appearance.language.description': '選擇介面語言。',
|
||||
'settings.appearance.language.select': '選擇語言',
|
||||
|
||||
@@ -20,4 +20,5 @@ export const QUOTA_PROVIDERS: QuotaProviderMeta[] = [
|
||||
{ id: 'minimax-coding-plan', name: 'MiniMax Coding Plan (minimax.io)' },
|
||||
{ id: 'ollama-cloud', name: 'Ollama Cloud' },
|
||||
{ id: 'wafer', name: 'Wafer.ai' },
|
||||
{ id: 'opencode-go', name: 'OpenCode Go' },
|
||||
];
|
||||
|
||||
@@ -14,7 +14,8 @@ export type QuotaProviderId =
|
||||
| 'minimax-coding-plan'
|
||||
| 'minimax-cn-coding-plan'
|
||||
| 'ollama-cloud'
|
||||
| 'wafer';
|
||||
| 'wafer'
|
||||
| 'opencode-go';
|
||||
|
||||
export interface UsageWindow {
|
||||
usedPercent: number | null;
|
||||
|
||||
Reference in New Issue
Block a user