Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
- CLI: Claude Auto usage follows the active claude-swap account, matching cards and dashboard; explicit source/account selections retain their behavior, and adapter fallbacks identify their actual source and account (#4599). Thanks @postoso!
### Added

- Vercel: optionally show your personal AI Gateway budget using a separate Vercel access token and Team ID, with UTC reset times and a clear unconfigured state (#4621, #4623). Thanks @sf-jin-ku!
- Plugins: user plugins can declare a monochrome inline SVG icon (`icon.svg`, at most 8 KB, plain shapes only), drawn as a template image in the switcher and menu card; an SVG that fails validation falls back to the monogram (#4608). Thanks @shivanathd!
- Plugins: detail rows can declare normal, warning, or critical severity independently of progress, with system colors and warning symbols (#4602). Thanks @DamonYoungWork!

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ enum ProviderImplementationManifest {
FutureAGIProviderImplementation(),
PluginAPIKeyProviderImplementation(spec: DevPassProviderDescriptor.spec),
PluginAPIKeyProviderImplementation(spec: AtlasCloudProviderDescriptor.spec),
PluginAPIKeyProviderImplementation(spec: VercelProviderDescriptor.spec),
VercelProviderImplementation(),
PluginAPIKeyProviderImplementation(spec: LLMManProviderDescriptor.spec),
PluginAPIKeyProviderImplementation(spec: XKiroProviderDescriptor.spec),
PluginCookieProviderImplementation(spec: MuseAIProviderDescriptor.spec),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import CodexBarCore
import Foundation

struct VercelProviderImplementation: ProviderImplementation {
let id: UsageProvider = .vercel
private let base = PluginAPIKeyProviderImplementation(spec: VercelProviderDescriptor.spec)

@MainActor
func observeSettings(_ settings: SettingsStore) {
self.base.observeSettings(settings)
_ = settings.providerConfig(for: self.id)
}

@MainActor
func settingsFields(context: ProviderSettingsContext) -> [ProviderSettingsFieldDescriptor] {
var fields = self.base.settingsFields(context: context)
fields.insert(
ProviderSettingsFieldDescriptor(
id: "vercel-access-token",
title: "Vercel access token",
subtitle: "Optional. Shows your personal budget instead of team credits. "
+ "Saved in CodexBar's local config file. Or set VERCEL_ACCESS_TOKEN.",
kind: .secure,
placeholder: nil,
binding: context.providerConfigSecretBinding(key: "VERCEL_ACCESS_TOKEN", logField: "accessToken"),
actions: [.openURL(
id: "vercel-open-tokens",
title: "Open Vercel tokens",
url: URL(string: "https://vercel.com/account/settings/tokens"))],
isVisible: nil),
at: min(1, fields.count))
return fields
}
}
6 changes: 6 additions & 0 deletions Sources/CodexBar/Resources/ar.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -2205,6 +2205,10 @@
"Stored in ~/.codexbar/config.json. Create one at console.x.ai under Settings > Management Keys; inference API keys are not accepted." = "مخزنة في ~/.codexbar/config.json. أنشئ واحدًا على console.x.ai ضمن الإعدادات > مفاتيح الإدارة؛ لا يتم قبول مفاتيح الاستدلال API.";
"xai-..." = "xai-...";
"Team ID" = "فريق ID";
"Vercel access token" = "رمز وصول Vercel";
"Optional. Shows your personal budget instead of team credits. Saved in CodexBar's local config file. Or set VERCEL_ACCESS_TOKEN." = "اختياري. يعرض ميزانيتك الشخصية بدلاً من أرصدة الفريق. يُحفَظ في ملف الإعداد المحلي لـ CodexBar. أو عيّن VERCEL_ACCESS_TOKEN.";
"Open Vercel tokens" = "فتح رموز Vercel";
"Required with a Vercel access token. Or set VERCEL_TEAM_ID." = "مطلوب مع رمز وصول Vercel. أو عيّن VERCEL_TEAM_ID.";
"Required. Shown in the xAI Console URL and team settings." = "مطلوب. يظهر في وحدة التحكم xAI URL وإعدادات الفريق.";
"Sakana AI cost summary is not supported." = "ملخص تكلفة Sakana AI غير مدعوم.";
"Stored in ~/.codexbar/config.json. Copy the Sakana AI console Cookie request header." = "مخزنة في ~/.codexbar/config.json. انسخ رأس طلب وحدة التحكم Sakana AI Cookie.";
Expand Down Expand Up @@ -2695,3 +2699,5 @@
"Move up" = "نقل لأعلى";
"Move down" = "نقل لأسفل";
"Leave blank to keep the saved credential." = "اتركه فارغًا للاحتفاظ ببيانات الاعتماد المحفوظة.";

"No personal budget configured" = "لم يتم إعداد ميزانية شخصية";
6 changes: 6 additions & 0 deletions Sources/CodexBar/Resources/ca.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -2205,6 +2205,10 @@
"Stored in ~/.codexbar/config.json. Create one at console.x.ai under Settings > Management Keys; inference API keys are not accepted." = "Emmagatzemat a ~/.codexbar/config.json. Creeu-ne un a console.x.ai a Configuració > Claus de gestió; Les claus d'inferència API no s'accepten.";
"xai-..." = "xai-...";
"Team ID" = "Equip ID";
"Vercel access token" = "Testimoni d'accés de Vercel";
"Optional. Shows your personal budget instead of team credits. Saved in CodexBar's local config file. Or set VERCEL_ACCESS_TOKEN." = "Opcional. Mostra el vostre pressupost personal en lloc dels crèdits de l'equip. Es desa al fitxer de configuració local de CodexBar. O definiu VERCEL_ACCESS_TOKEN.";
"Open Vercel tokens" = "Obre els testimonis de Vercel";
"Required with a Vercel access token. Or set VERCEL_TEAM_ID." = "Obligatori amb un testimoni d'accés de Vercel. O definiu VERCEL_TEAM_ID.";
"Required. Shown in the xAI Console URL and team settings." = "Obligatori. Es mostra a la consola xAI URL i a la configuració de l'equip.";
"Sakana AI cost summary is not supported." = "El resum de costos Sakana AI no s'admet.";
"Stored in ~/.codexbar/config.json. Copy the Sakana AI console Cookie request header." = "Emmagatzemat a ~/.codexbar/config.json. Copieu la capçalera de sol·licitud de la consola Sakana AI Cookie.";
Expand Down Expand Up @@ -2693,3 +2697,5 @@
"Move up" = "Mou amunt";
"Move down" = "Mou avall";
"Leave blank to keep the saved credential." = "Deixeu-ho en blanc per conservar la credencial desada.";

"No personal budget configured" = "No hi ha cap pressupost personal configurat";
6 changes: 6 additions & 0 deletions Sources/CodexBar/Resources/de.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -2203,6 +2203,10 @@
"Stored in ~/.codexbar/config.json. Create one at console.x.ai under Settings > Management Keys; inference API keys are not accepted." = "Gespeichert in ~/.codexbar/config.json. Erstellen Sie einen unter console.x.ai unter Einstellungen > Verwaltungsschlüssel. Inferenzschlüssel API werden nicht akzeptiert.";
"xai-..." = "xai-...";
"Team ID" = "Team ID";
"Vercel access token" = "Vercel-Zugriffstoken";
"Optional. Shows your personal budget instead of team credits. Saved in CodexBar's local config file. Or set VERCEL_ACCESS_TOKEN." = "Optional. Zeigt Ihr persönliches Budget statt der Team-Guthaben. Wird in der lokalen Konfigurationsdatei von CodexBar gespeichert. Alternativ VERCEL_ACCESS_TOKEN setzen.";
"Open Vercel tokens" = "Vercel-Tokens öffnen";
"Required with a Vercel access token. Or set VERCEL_TEAM_ID." = "Zusammen mit einem Vercel-Zugriffstoken erforderlich. Alternativ VERCEL_TEAM_ID setzen.";
"Required. Shown in the xAI Console URL and team settings." = "Erforderlich. Wird in der xAI-Konsole URL und in den Teameinstellungen angezeigt.";
"Sakana AI cost summary is not supported." = "Die Kostenübersicht Sakana AI wird nicht unterstützt.";
"Stored in ~/.codexbar/config.json. Copy the Sakana AI console Cookie request header." = "Gespeichert in ~/.codexbar/config.json. Kopieren Sie den Anforderungsheader der Sakana AI-Konsole Cookie.";
Expand Down Expand Up @@ -2689,3 +2693,5 @@
"Move up" = "Nach oben";
"Move down" = "Nach unten";
"Leave blank to keep the saved credential." = "Leer lassen, um die gespeicherten Zugangsdaten beizubehalten.";

"No personal budget configured" = "Kein persönliches Budget konfiguriert";
6 changes: 6 additions & 0 deletions Sources/CodexBar/Resources/en.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -2205,6 +2205,10 @@
"Stored in ~/.codexbar/config.json. Create one at console.x.ai under Settings > Management Keys; inference API keys are not accepted." = "Stored in ~/.codexbar/config.json. Create one at console.x.ai under Settings > Management Keys; inference API keys are not accepted.";
"xai-..." = "xai-...";
"Team ID" = "Team ID";
"Vercel access token" = "Vercel access token";
"Optional. Shows your personal budget instead of team credits. Saved in CodexBar's local config file. Or set VERCEL_ACCESS_TOKEN." = "Optional. Shows your personal budget instead of team credits. Saved in CodexBar's local config file. Or set VERCEL_ACCESS_TOKEN.";
"Open Vercel tokens" = "Open Vercel tokens";
"Required with a Vercel access token. Or set VERCEL_TEAM_ID." = "Required with a Vercel access token. Or set VERCEL_TEAM_ID.";
"Required. Shown in the xAI Console URL and team settings." = "Required. Shown in the xAI Console URL and team settings.";
"Sakana AI cost summary is not supported." = "Sakana AI cost summary is not supported.";
"Stored in ~/.codexbar/config.json. Copy the Sakana AI console Cookie request header." = "Stored in ~/.codexbar/config.json. Copy the Sakana AI console Cookie request header.";
Expand Down Expand Up @@ -2696,3 +2700,5 @@
"Move up" = "Move up";
"Move down" = "Move down";
"Leave blank to keep the saved credential." = "Leave blank to keep the saved credential.";

"No personal budget configured" = "No personal budget configured";
6 changes: 6 additions & 0 deletions Sources/CodexBar/Resources/es.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -2199,6 +2199,10 @@
"Stored in ~/.codexbar/config.json. Create one at console.x.ai under Settings > Management Keys; inference API keys are not accepted." = "Almacenado en ~/.codexbar/config.json. Cree uno en console.x.ai en Configuración > Claves de administración; No se aceptan claves de inferencia API.";
"xai-..." = "xai-...";
"Team ID" = "Equipo ID";
"Vercel access token" = "Token de acceso de Vercel";
"Optional. Shows your personal budget instead of team credits. Saved in CodexBar's local config file. Or set VERCEL_ACCESS_TOKEN." = "Opcional. Muestra tu presupuesto personal en lugar de los créditos del equipo. Se guarda en el archivo de configuración local de CodexBar. O configura VERCEL_ACCESS_TOKEN.";
"Open Vercel tokens" = "Abrir tokens de Vercel";
"Required with a Vercel access token. Or set VERCEL_TEAM_ID." = "Obligatorio con un token de acceso de Vercel. O configura VERCEL_TEAM_ID.";
"Required. Shown in the xAI Console URL and team settings." = "Requerido. Se muestra en la consola xAI URL y en la configuración del equipo.";
"Sakana AI cost summary is not supported." = "No se admite el resumen de costos Sakana AI.";
"Stored in ~/.codexbar/config.json. Copy the Sakana AI console Cookie request header." = "Almacenado en ~/.codexbar/config.json. Copie el encabezado de solicitud Cookie de la consola Sakana AI.";
Expand Down Expand Up @@ -2689,3 +2693,5 @@
"Move up" = "Subir";
"Move down" = "Bajar";
"Leave blank to keep the saved credential." = "Déjalo en blanco para conservar la credencial guardada.";

"No personal budget configured" = "No hay ningún presupuesto personal configurado";
6 changes: 6 additions & 0 deletions Sources/CodexBar/Resources/fa.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -2205,6 +2205,10 @@
"Stored in ~/.codexbar/config.json. Create one at console.x.ai under Settings > Management Keys; inference API keys are not accepted." = "ذخیره شده در ~/.codexbar/config.json. یکی را در console.x.ai در زیر تنظیمات > کلیدهای مدیریت ایجاد کنید. کلیدهای استنتاج API پذیرفته نمی شوند.";
"xai-..." = "xai-...";
"Team ID" = "تیم ID";
"Vercel access token" = "توکن دسترسی Vercel";
"Optional. Shows your personal budget instead of team credits. Saved in CodexBar's local config file. Or set VERCEL_ACCESS_TOKEN." = "اختیاری. به‌جای اعتبار تیم، بودجهٔ شخصی شما را نشان می‌دهد. در فایل پیکربندی محلی CodexBar ذخیره می‌شود. یا VERCEL_ACCESS_TOKEN را تنظیم کنید.";
"Open Vercel tokens" = "باز کردن توکن‌های Vercel";
"Required with a Vercel access token. Or set VERCEL_TEAM_ID." = "همراه با توکن دسترسی Vercel لازم است. یا VERCEL_TEAM_ID را تنظیم کنید.";
"Required. Shown in the xAI Console URL and team settings." = "مورد نیاز. در کنسول xAI URL و تنظیمات تیم نشان داده شده است.";
"Sakana AI cost summary is not supported." = "خلاصه هزینه Sakana AI پشتیبانی نمی شود.";
"Stored in ~/.codexbar/config.json. Copy the Sakana AI console Cookie request header." = "ذخیره شده در ~/.codexbar/config.json. هدر درخواست کنسول Sakana AI Cookie را کپی کنید.";
Expand Down Expand Up @@ -2695,3 +2699,5 @@
"Move up" = "انتقال به بالا";
"Move down" = "انتقال به پایین";
"Leave blank to keep the saved credential." = "برای حفظ اطلاعات ورود ذخیره‌شده، خالی بگذارید.";

"No personal budget configured" = "بودجهٔ شخصی تنظیم نشده است";
6 changes: 6 additions & 0 deletions Sources/CodexBar/Resources/fr.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -2200,6 +2200,10 @@
"Stored in ~/.codexbar/config.json. Create one at console.x.ai under Settings > Management Keys; inference API keys are not accepted." = "Stocké dans ~/.codexbar/config.json. Créez-en un sur console.x.ai sous Paramètres > Clés de gestion ; Les clés d'inférence API ne sont pas acceptées.";
"xai-..." = "xai-...";
"Team ID" = "Équipe ID";
"Vercel access token" = "Jeton d'accès Vercel";
"Optional. Shows your personal budget instead of team credits. Saved in CodexBar's local config file. Or set VERCEL_ACCESS_TOKEN." = "Facultatif. Affiche votre budget personnel au lieu des crédits de l'équipe. Enregistré dans le fichier de configuration local de CodexBar. Ou définissez VERCEL_ACCESS_TOKEN.";
"Open Vercel tokens" = "Ouvrir les jetons Vercel";
"Required with a Vercel access token. Or set VERCEL_TEAM_ID." = "Requis avec un jeton d'accès Vercel. Ou définissez VERCEL_TEAM_ID.";
"Required. Shown in the xAI Console URL and team settings." = "Obligatoire. Affiché dans la console xAI URL et les paramètres d'équipe.";
"Sakana AI cost summary is not supported." = "Le récapitulatif des coûts Sakana AI n’est pas pris en charge.";
"Stored in ~/.codexbar/config.json. Copy the Sakana AI console Cookie request header." = "Stocké dans ~/.codexbar/config.json. Copiez l'en-tête de requête Cookie de la console Sakana AI.";
Expand Down Expand Up @@ -2690,3 +2694,5 @@
"Move up" = "Monter";
"Move down" = "Descendre";
"Leave blank to keep the saved credential." = "Laissez ce champ vide pour conserver les identifiants enregistrés.";

"No personal budget configured" = "Aucun budget personnel configuré";
6 changes: 6 additions & 0 deletions Sources/CodexBar/Resources/gl.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -2200,6 +2200,10 @@
"Stored in ~/.codexbar/config.json. Create one at console.x.ai under Settings > Management Keys; inference API keys are not accepted." = "Almacenado en ~/.codexbar/config.json. Crea un en console.x.ai en Configuración > Teclas de xestión; As chaves de inferencia API non se aceptan.";
"xai-..." = "xai-...";
"Team ID" = "Equipo ID";
"Vercel access token" = "Token de acceso de Vercel";
"Optional. Shows your personal budget instead of team credits. Saved in CodexBar's local config file. Or set VERCEL_ACCESS_TOKEN." = "Opcional. Mostra o teu orzamento persoal en lugar dos créditos do equipo. Gárdase no ficheiro de configuración local de CodexBar. Ou define VERCEL_ACCESS_TOKEN.";
"Open Vercel tokens" = "Abrir os tokens de Vercel";
"Required with a Vercel access token. Or set VERCEL_TEAM_ID." = "Obrigatorio cun token de acceso de Vercel. Ou define VERCEL_TEAM_ID.";
"Required. Shown in the xAI Console URL and team settings." = "Obrigatorio. Móstrase na consola xAI URL e na configuración do equipo.";
"Sakana AI cost summary is not supported." = "O resumo de custos Sakana AI non é compatible.";
"Stored in ~/.codexbar/config.json. Copy the Sakana AI console Cookie request header." = "Almacenado en ~/.codexbar/config.json. Copie a cabeceira da solicitude da consola Sakana AI Cookie.";
Expand Down Expand Up @@ -2690,3 +2694,5 @@
"Move up" = "Mover arriba";
"Move down" = "Mover abaixo";
"Leave blank to keep the saved credential." = "Déixao en branco para conservar a credencial gardada.";

"No personal budget configured" = "Non hai ningún orzamento persoal configurado";
6 changes: 6 additions & 0 deletions Sources/CodexBar/Resources/id.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -2205,6 +2205,10 @@
"Stored in ~/.codexbar/config.json. Create one at console.x.ai under Settings > Management Keys; inference API keys are not accepted." = "Disimpan di ~/.codexbar/config.json. Buat satu di console.x.ai di bawah Pengaturan > Kunci Manajemen; kesimpulan kunci API tidak diterima.";
"xai-..." = "xai-...";
"Team ID" = "Tim ID";
"Vercel access token" = "Token akses Vercel";
"Optional. Shows your personal budget instead of team credits. Saved in CodexBar's local config file. Or set VERCEL_ACCESS_TOKEN." = "Opsional. Menampilkan anggaran pribadi Anda, bukan kredit tim. Disimpan di file konfigurasi lokal CodexBar. Atau atur VERCEL_ACCESS_TOKEN.";
"Open Vercel tokens" = "Buka token Vercel";
"Required with a Vercel access token. Or set VERCEL_TEAM_ID." = "Wajib bersama token akses Vercel. Atau atur VERCEL_TEAM_ID.";
"Required. Shown in the xAI Console URL and team settings." = "Diperlukan. Ditampilkan di Konsol xAI URL dan pengaturan tim.";
"Sakana AI cost summary is not supported." = "Ringkasan biaya Sakana AI tidak didukung.";
"Stored in ~/.codexbar/config.json. Copy the Sakana AI console Cookie request header." = "Disimpan di ~/.codexbar/config.json. Salin header permintaan Sakana AI konsol Cookie.";
Expand Down Expand Up @@ -2693,3 +2697,5 @@
"Move up" = "Pindah ke atas";
"Move down" = "Pindah ke bawah";
"Leave blank to keep the saved credential." = "Biarkan kosong untuk mempertahankan kredensial tersimpan.";

"No personal budget configured" = "Belum ada anggaran pribadi yang dikonfigurasi";
6 changes: 6 additions & 0 deletions Sources/CodexBar/Resources/it.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -2205,6 +2205,10 @@
"Stored in ~/.codexbar/config.json. Create one at console.x.ai under Settings > Management Keys; inference API keys are not accepted." = "Memorizzato in ~/.codexbar/config.json. Creane uno su console.x.ai in Impostazioni > Chiavi di gestione; le chiavi di inferenza API non sono accettate.";
"xai-..." = "xai-...";
"Team ID" = "Squadra ID";
"Vercel access token" = "Token di accesso Vercel";
"Optional. Shows your personal budget instead of team credits. Saved in CodexBar's local config file. Or set VERCEL_ACCESS_TOKEN." = "Facoltativo. Mostra il tuo budget personale anziché i crediti del team. Salvato nel file di configurazione locale di CodexBar. Oppure imposta VERCEL_ACCESS_TOKEN.";
"Open Vercel tokens" = "Apri i token Vercel";
"Required with a Vercel access token. Or set VERCEL_TEAM_ID." = "Obbligatorio con un token di accesso Vercel. Oppure imposta VERCEL_TEAM_ID.";
"Required. Shown in the xAI Console URL and team settings." = "Obbligatorio. Visualizzato nella console xAI URL e nelle impostazioni del team.";
"Sakana AI cost summary is not supported." = "Il riepilogo dei costi Sakana AI non è supportato.";
"Stored in ~/.codexbar/config.json. Copy the Sakana AI console Cookie request header." = "Memorizzato in ~/.codexbar/config.json. Copia l'intestazione della richiesta Cookie della console Sakana AI.";
Expand Down Expand Up @@ -2695,3 +2699,5 @@
"Move up" = "Sposta su";
"Move down" = "Sposta giù";
"Leave blank to keep the saved credential." = "Lascia vuoto per mantenere la credenziale salvata.";

"No personal budget configured" = "Nessun budget personale configurato";
Loading
Loading