feat: switch OpenCode Go usage to API
OpenCode Go now reads quota usage with a bearer API key from OpenCode auth.json Removes the old workspace ID and browser cookie credential flow Deletes legacy OpenCode Go credential files during upgrade
This commit is contained in:
@@ -5,8 +5,8 @@ import { toast } from '@/components/ui';
|
||||
import { useI18n } from '@/lib/i18n';
|
||||
import { runtimeFetch } from '@/lib/runtime-fetch';
|
||||
|
||||
type ProviderId = 'opencode-go' | 'ollama-cloud' | 'cursor';
|
||||
type Status = { configured: boolean; workspaceId?: string; secretMasked?: string };
|
||||
type ProviderId = 'ollama-cloud' | 'cursor';
|
||||
type Status = { configured: boolean; secretMasked?: string };
|
||||
|
||||
export const QuotaCredentials: React.FC<{ providerId: ProviderId; providerName: string }> = ({ providerId, providerName }) => {
|
||||
const { t } = useI18n();
|
||||
@@ -17,7 +17,7 @@ export const QuotaCredentials: React.FC<{ providerId: ProviderId; providerName:
|
||||
React.useEffect(() => { void runtimeFetch(route).then(async (response) => {
|
||||
if (!response.ok) throw new Error();
|
||||
const next = await response.json() as Status;
|
||||
setStatus(next); setValues(next.workspaceId ? { workspaceId: next.workspaceId } : {});
|
||||
setStatus(next); setValues({});
|
||||
}).catch(() => setStatus({ configured: false })); }, [route]);
|
||||
const request = async (path: string, method: string, body?: object) => {
|
||||
setBusy(true);
|
||||
@@ -26,17 +26,15 @@ export const QuotaCredentials: React.FC<{ providerId: ProviderId; providerName:
|
||||
const payload = await response.json().catch(() => null);
|
||||
if (!response.ok) throw new Error(payload?.error);
|
||||
if (payload?.configured !== undefined) setStatus(payload);
|
||||
setValues((current) => current.workspaceId ? { workspaceId: current.workspaceId } : {} as Record<string, string>);
|
||||
setValues({});
|
||||
toast.success(t('settings.providers.page.quotaCredentials.saved', { provider: providerName }));
|
||||
} catch (error) { toast.error(error instanceof Error && error.message ? error.message : t('settings.providers.page.openCodeGo.saveFailed')); }
|
||||
finally { setBusy(false); }
|
||||
};
|
||||
const field = (name: string, label: string, placeholder: string) => <label className="block typography-ui-label text-foreground">{label}<Input className="mt-1 h-7 font-mono text-xs" type={name === 'workspaceId' ? 'text' : 'password'} autoComplete="off" value={values[name] ?? ''} onChange={(event) => setValues((current) => ({ ...current, [name]: event.target.value }))} placeholder={status?.secretMasked ?? placeholder} /></label>;
|
||||
const field = (name: string, label: string, placeholder: string) => <label className="block typography-ui-label text-foreground">{label}<Input className="mt-1 h-7 font-mono text-xs" type="password" autoComplete="off" value={values[name] ?? ''} onChange={(event) => setValues((current) => ({ ...current, [name]: event.target.value }))} placeholder={status?.secretMasked ?? placeholder} /></label>;
|
||||
return <div data-settings-item={`usage.${providerId}-credentials`} className="mb-8">
|
||||
<div className="mb-1 px-1"><h3 className="typography-ui-header font-medium text-foreground">{providerName}</h3></div>
|
||||
<section className="space-y-3 px-2 pb-2 pt-0">
|
||||
{providerId === 'opencode-go' && field('workspaceId', t('settings.providers.page.openCodeGo.workspaceId'), 'wrk_...')}
|
||||
{providerId === 'opencode-go' && field('authCookie', t('settings.providers.page.openCodeGo.authCookie'), 'auth=...')}
|
||||
{providerId === 'ollama-cloud' && field('cookie', t('settings.providers.page.openCodeGo.authCookie'), 'session=...')}
|
||||
{providerId === 'cursor' && field('accessToken', t('settings.providers.page.quotaCredentials.accessToken'), t('settings.providers.page.quotaCredentials.tokenPlaceholder'))}
|
||||
{providerId === 'cursor' && field('refreshToken', t('settings.providers.page.quotaCredentials.refreshToken'), t('settings.providers.page.quotaCredentials.tokenPlaceholder'))}
|
||||
|
||||
@@ -80,7 +80,7 @@ export const UsagePage: React.FC = () => {
|
||||
? selectedResult.error
|
||||
: null;
|
||||
const showInDropdown = selectedProviderId ? dropdownProviderIds.includes(selectedProviderId) : false;
|
||||
const hasCredentialsForm = selectedProviderId === 'opencode-go' || selectedProviderId === 'ollama-cloud' || selectedProviderId === 'cursor';
|
||||
const hasCredentialsForm = selectedProviderId === 'ollama-cloud' || selectedProviderId === 'cursor';
|
||||
const handleDropdownToggle = React.useCallback((enabled: boolean) => {
|
||||
if (!selectedProviderId) {
|
||||
return;
|
||||
@@ -199,7 +199,7 @@ export const UsagePage: React.FC = () => {
|
||||
</div>
|
||||
)}
|
||||
|
||||
{(selectedProviderId === 'opencode-go' || selectedProviderId === 'ollama-cloud' || selectedProviderId === 'cursor') && (
|
||||
{(selectedProviderId === 'ollama-cloud' || selectedProviderId === 'cursor') && (
|
||||
<QuotaCredentials providerId={selectedProviderId} providerName={providerName} />
|
||||
)}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ export const settingsDict = {
|
||||
'settings.providers.page.openCodeGo.description': 'Verbinden Sie das OpenCode Go Dashboard, um rollierenden, wöchentlichen und monatlichen Verbrauch anzuzeigen.',
|
||||
'settings.providers.page.openCodeGo.workspaceId': 'Workspace-ID',
|
||||
'settings.providers.page.openCodeGo.authCookie': 'Auth-Cookie',
|
||||
'settings.providers.page.openCodeGo.apiKey': 'API-Schlüssel',
|
||||
'settings.providers.page.openCodeGo.help': 'Kopieren Sie die Workspace-ID aus der Dashboard-URL und den Auth-Cookie aus den Browser-Entwicklertools. OpenChamber liest niemals den Browser-Cookie-Speicher aus.',
|
||||
'settings.providers.page.openCodeGo.save': 'Speichern und validieren',
|
||||
'settings.providers.page.openCodeGo.replace': 'Ersetzen',
|
||||
|
||||
@@ -3,6 +3,7 @@ export const settingsDict = {
|
||||
'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.apiKey': 'API key',
|
||||
'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',
|
||||
|
||||
@@ -3,6 +3,7 @@ export const settingsDict = {
|
||||
'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.apiKey': 'Clave API',
|
||||
'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',
|
||||
|
||||
@@ -3,6 +3,7 @@ export const settingsDict = {
|
||||
'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.apiKey': 'Clé API',
|
||||
'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',
|
||||
|
||||
@@ -3,6 +3,7 @@ export const settingsDict = {
|
||||
'settings.providers.page.openCodeGo.description': 'OpenCode Go ダッシュボードを接続して、ローリング、週間、月間のクォータを表示します。',
|
||||
'settings.providers.page.openCodeGo.workspaceId': 'ワークスペース ID',
|
||||
'settings.providers.page.openCodeGo.authCookie': '認証 Cookie',
|
||||
'settings.providers.page.openCodeGo.apiKey': 'API キー',
|
||||
'settings.providers.page.openCodeGo.help': 'ダッシュボード URL からワークスペース ID を、ブラウザーの開発者ツールから auth Cookie をコピーしてください。OpenChamber がブラウザーの Cookie を走査することはありません。',
|
||||
'settings.providers.page.openCodeGo.save': '保存して検証',
|
||||
'settings.providers.page.openCodeGo.replace': '置換',
|
||||
|
||||
@@ -3,6 +3,7 @@ export const settingsDict = {
|
||||
'settings.providers.page.openCodeGo.description': 'OpenCode Go 대시보드를 연결하여 롤링, 주간 및 월간 할당량을 표시합니다.',
|
||||
'settings.providers.page.openCodeGo.workspaceId': '워크스페이스 ID',
|
||||
'settings.providers.page.openCodeGo.authCookie': '인증 쿠키',
|
||||
'settings.providers.page.openCodeGo.apiKey': 'API 키',
|
||||
'settings.providers.page.openCodeGo.help': '대시보드 URL에서 워크스페이스 ID를, 브라우저 개발자 도구에서 auth 쿠키를 복사하세요. OpenChamber는 브라우저 쿠키 저장소를 검색하지 않습니다.',
|
||||
'settings.providers.page.openCodeGo.save': '저장 및 검증',
|
||||
'settings.providers.page.openCodeGo.replace': '교체',
|
||||
|
||||
@@ -3,6 +3,7 @@ export const settingsDict = {
|
||||
'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.apiKey': 'Klucz API',
|
||||
'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',
|
||||
|
||||
@@ -3,6 +3,7 @@ export const settingsDict = {
|
||||
'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.apiKey': 'Chave de API',
|
||||
'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',
|
||||
|
||||
@@ -3,6 +3,7 @@ export const settingsDict = {
|
||||
'settings.providers.page.openCodeGo.description': 'Підключіть панель OpenCode Go, щоб бачити ковзну, тижневу та місячну квоту.',
|
||||
'settings.providers.page.openCodeGo.workspaceId': 'ID робочого простору',
|
||||
'settings.providers.page.openCodeGo.authCookie': 'Cookie авторизації',
|
||||
'settings.providers.page.openCodeGo.apiKey': 'Ключ API',
|
||||
'settings.providers.page.openCodeGo.help': 'Скопіюйте ID робочого простору з URL панелі, а cookie auth з інструментів розробника браузера. OpenChamber ніколи не сканує сховище cookie браузера.',
|
||||
'settings.providers.page.openCodeGo.save': 'Зберегти й перевірити',
|
||||
'settings.providers.page.openCodeGo.replace': 'Замінити',
|
||||
|
||||
@@ -3,6 +3,7 @@ export const settingsDict = {
|
||||
'settings.providers.page.openCodeGo.description': '连接 OpenCode Go 控制面板以显示滚动、每周和每月配额。',
|
||||
'settings.providers.page.openCodeGo.workspaceId': '工作区 ID',
|
||||
'settings.providers.page.openCodeGo.authCookie': '身份验证 Cookie',
|
||||
'settings.providers.page.openCodeGo.apiKey': 'API 密钥',
|
||||
'settings.providers.page.openCodeGo.help': '从控制面板网址复制工作区 ID,并从浏览器开发者工具复制 auth Cookie。OpenChamber 绝不会扫描浏览器 Cookie 存储。',
|
||||
'settings.providers.page.openCodeGo.save': '保存并验证',
|
||||
'settings.providers.page.openCodeGo.replace': '替换',
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
'settings.providers.page.openCodeGo.description': '連接 OpenCode Go 控制面板以顯示滾動、每週和每月配額。',
|
||||
'settings.providers.page.openCodeGo.workspaceId': '工作區 ID',
|
||||
'settings.providers.page.openCodeGo.authCookie': '驗證 Cookie',
|
||||
'settings.providers.page.openCodeGo.apiKey': 'API 金鑰',
|
||||
'settings.providers.page.openCodeGo.help': '從控制面板網址複製工作區 ID,並從瀏覽器開發者工具複製 auth Cookie。OpenChamber 絕不會掃描瀏覽器 Cookie 儲存空間。',
|
||||
'settings.providers.page.openCodeGo.save': '儲存並驗證',
|
||||
'settings.providers.page.openCodeGo.replace': '取代',
|
||||
|
||||
Reference in New Issue
Block a user